2025-04-02 06:50:39 -04:00

71 lines
1.7 KiB
JavaScript

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