1 | 'use strict'
|
2 |
|
3 | const u = require('universalify').fromCallback
|
4 | const path = require('path')
|
5 | const fs = require('graceful-fs')
|
6 | const mkdir = require('../mkdirs')
|
7 |
|
8 | function createFile (file, callback) {
|
9 | function makeFile () {
|
10 | fs.writeFile(file, '', err => {
|
11 | if (err) return callback(err)
|
12 | callback()
|
13 | })
|
14 | }
|
15 |
|
16 | fs.stat(file, (err, stats) => {
|
17 | if (!err && stats.isFile()) return callback()
|
18 | const dir = path.dirname(file)
|
19 | fs.stat(dir, (err, stats) => {
|
20 | if (err) {
|
21 |
|
22 | if (err.code === 'ENOENT') {
|
23 | return mkdir.mkdirs(dir, err => {
|
24 | if (err) return callback(err)
|
25 | makeFile()
|
26 | })
|
27 | }
|
28 | return callback(err)
|
29 | }
|
30 |
|
31 | if (stats.isDirectory()) makeFile()
|
32 | else {
|
33 |
|
34 |
|
35 | fs.readdir(dir, err => {
|
36 | if (err) return callback(err)
|
37 | })
|
38 | }
|
39 | })
|
40 | })
|
41 | }
|
42 |
|
43 | function createFileSync (file) {
|
44 | let stats
|
45 | try {
|
46 | stats = fs.statSync(file)
|
47 | } catch {}
|
48 | if (stats && stats.isFile()) return
|
49 |
|
50 | const dir = path.dirname(file)
|
51 | try {
|
52 | if (!fs.statSync(dir).isDirectory()) {
|
53 |
|
54 |
|
55 | fs.readdirSync(dir)
|
56 | }
|
57 | } catch (err) {
|
58 |
|
59 | if (err && err.code === 'ENOENT') mkdir.mkdirsSync(dir)
|
60 | else throw err
|
61 | }
|
62 |
|
63 | fs.writeFileSync(file, '')
|
64 | }
|
65 |
|
66 | module.exports = {
|
67 | createFile: u(createFile),
|
68 | createFileSync
|
69 | }
|