'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, };