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) => { // eslint-disable-line handle-callback-err
|
---|
17 | if (!err && stats.isFile()) return callback()
|
---|
18 | const dir = path.dirname(file)
|
---|
19 | fs.stat(dir, (err, stats) => {
|
---|
20 | if (err) {
|
---|
21 | // if the directory doesn't exist, make it
|
---|
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 | // parent is not a directory
|
---|
34 | // This is just to cause an internal ENOTDIR error to be thrown
|
---|
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 | // parent is not a directory
|
---|
54 | // This is just to cause an internal ENOTDIR error to be thrown
|
---|
55 | fs.readdirSync(dir)
|
---|
56 | }
|
---|
57 | } catch (err) {
|
---|
58 | // If the stat call above failed because the directory doesn't exist, create it
|
---|
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 | }
|
---|