UNPKG

1.71 kBJavaScriptView Raw
1'use strict'
2
3const u = require('universalify').fromCallback
4const path = require('path')
5const fs = require('graceful-fs')
6const mkdir = require('../mkdirs')
7
8function 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
43function 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
66module.exports = {
67 createFile: u(createFile),
68 createFileSync
69}