| 'use strict' |
| |
| const u = require('universalify').fromCallback |
| const path = require('path') |
| const fs = require('graceful-fs') |
| const mkdir = require('../mkdirs') |
| |
| function createFile (file, callback) { |
| function makeFile () { |
| fs.writeFile(file, '', err => { |
| if (err) return callback(err) |
| callback() |
| }) |
| } |
| |
| fs.stat(file, (err, stats) => { // eslint-disable-line handle-callback-err |
| if (!err && stats.isFile()) return callback() |
| const dir = path.dirname(file) |
| fs.stat(dir, (err, stats) => { |
| if (err) { |
| // if the directory doesn't exist, make it |
| if (err.code === 'ENOENT') { |
| return mkdir.mkdirs(dir, err => { |
| if (err) return callback(err) |
| makeFile() |
| }) |
| } |
| return callback(err) |
| } |
| |
| if (stats.isDirectory()) makeFile() |
| else { |
| // parent is not a directory |
| // This is just to cause an internal ENOTDIR error to be thrown |
| fs.readdir(dir, err => { |
| if (err) return callback(err) |
| }) |
| } |
| }) |
| }) |
| } |
| |
| function createFileSync (file) { |
| let stats |
| try { |
| stats = fs.statSync(file) |
| } catch {} |
| if (stats && stats.isFile()) return |
| |
| const dir = path.dirname(file) |
| try { |
| if (!fs.statSync(dir).isDirectory()) { |
| // parent is not a directory |
| // This is just to cause an internal ENOTDIR error to be thrown |
| fs.readdirSync(dir) |
| } |
| } catch (err) { |
| // If the stat call above failed because the directory doesn't exist, create it |
| if (err && err.code === 'ENOENT') mkdir.mkdirsSync(dir) |
| else throw err |
| } |
| |
| fs.writeFileSync(file, '') |
| } |
| |
| module.exports = { |
| createFile: u(createFile), |
| createFileSync |
| } |