141 lines
11 KiB
JavaScript
141 lines
11 KiB
JavaScript
import * as fs from 'fs';
|
|
import { normalizeFileMode } from './utils/mode.js';
|
|
import { validateArgument, validateOptions } from './utils/validate.js';
|
|
import { sync as writeSync, async as writeASync } from './write.js';
|
|
import { ErrNotFile } from './errors.js';
|
|
import { EError } from './interfaces.js';
|
|
const promisedStat = fs.promises.stat;
|
|
const promisedChmod = fs.promises.chmod;
|
|
export function validateInput(methodName, path, options) {
|
|
const methodSignature = methodName + '(path, [criteria])';
|
|
validateArgument(methodSignature, 'path', path, ['string']);
|
|
validateOptions(methodSignature, 'criteria', options, {
|
|
content: ['string', 'buffer', 'object', 'array'],
|
|
jsonIndent: ['number'],
|
|
mode: ['string', 'number']
|
|
});
|
|
}
|
|
export function defaults(passedCriteria) {
|
|
const criteria = passedCriteria || {};
|
|
if (criteria.mode !== undefined) {
|
|
criteria.mode = normalizeFileMode(criteria.mode);
|
|
}
|
|
return criteria;
|
|
}
|
|
// ---------------------------------------------------------
|
|
// Sync
|
|
// ---------------------------------------------------------
|
|
const isFile = (path) => {
|
|
let stat;
|
|
try {
|
|
stat = fs.statSync(path);
|
|
}
|
|
catch (err) {
|
|
// Detection if path exists
|
|
if (err.code !== EError.NOEXISTS) {
|
|
throw err;
|
|
}
|
|
}
|
|
if (stat && !stat.isFile()) {
|
|
throw ErrNotFile(path);
|
|
}
|
|
return stat;
|
|
};
|
|
const checkContent = function (path, mode, options) {
|
|
if (options.content !== undefined) {
|
|
writeSync(path, options.content, {
|
|
mode: mode,
|
|
jsonIndent: options.jsonIndent
|
|
});
|
|
return true;
|
|
}
|
|
return false;
|
|
};
|
|
const checkMode = function (path, mode, options) {
|
|
if (options.mode !== undefined && options.mode !== mode) {
|
|
fs.chmodSync(path, options.mode);
|
|
}
|
|
};
|
|
const accept = (path, stat, options) => {
|
|
const mode = normalizeFileMode(stat.mode);
|
|
if (!checkContent(path, mode, options)) {
|
|
checkMode(path, mode, options);
|
|
}
|
|
};
|
|
const touch = (path, options) => {
|
|
const content = options.content !== undefined ? options.content : '';
|
|
writeSync(path, content, {
|
|
mode: options.mode,
|
|
jsonIndent: options.jsonIndent
|
|
});
|
|
};
|
|
export function sync(path, options) {
|
|
options = defaults(options);
|
|
const stat = isFile(path);
|
|
if (stat !== undefined) {
|
|
accept(path, stat, options);
|
|
}
|
|
else {
|
|
touch(path, options);
|
|
}
|
|
}
|
|
// ---------------------------------------------------------
|
|
// Async
|
|
// ---------------------------------------------------------
|
|
function isFileAsync(path) {
|
|
return new Promise((resolve, reject) => {
|
|
promisedStat(path)
|
|
.then((stat) => {
|
|
if ((stat).isFile()) {
|
|
resolve(stat);
|
|
}
|
|
else {
|
|
reject(ErrNotFile(path));
|
|
}
|
|
})
|
|
.catch((err) => (err.code === EError.NOEXISTS ? resolve(undefined) : reject(err)));
|
|
});
|
|
}
|
|
const checkModeAsync = (path, mode, options) => {
|
|
if (options.mode !== undefined && options.mode !== mode) {
|
|
return promisedChmod(path, options.mode);
|
|
}
|
|
return undefined;
|
|
};
|
|
const checkContentAsync = (path, mode, options) => {
|
|
return new Promise((resolve, reject) => {
|
|
if (options.content !== undefined) {
|
|
writeASync(path, options.content, {
|
|
mode: mode,
|
|
jsonIndent: options.jsonIndent
|
|
}).then(() => resolve(true)).catch(reject);
|
|
}
|
|
else {
|
|
resolve(false);
|
|
}
|
|
});
|
|
};
|
|
const writeAsync = async (path, stat, options) => {
|
|
const mode = normalizeFileMode(stat.mode);
|
|
return checkContentAsync(path, mode, options);
|
|
};
|
|
const touchAsync = (path, options) => {
|
|
return writeASync(path, options.content !== undefined ? options.content : '', {
|
|
mode: options.mode,
|
|
jsonIndent: options.jsonIndent
|
|
});
|
|
};
|
|
export async function async(path, options) {
|
|
return new Promise((resolve, reject) => {
|
|
options = defaults(options);
|
|
isFileAsync(path)
|
|
.then((stat) => {
|
|
if (stat !== undefined) {
|
|
return writeAsync(path, stat, options);
|
|
}
|
|
return touchAsync(path, options);
|
|
})
|
|
.then(resolve, reject);
|
|
});
|
|
}
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9maWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBR3pCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsSUFBSSxJQUFJLFNBQVMsRUFBRSxLQUFLLElBQUksVUFBVSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDekMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXpDLE1BQU0sWUFBWSxHQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO0FBQ3ZDLE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO0FBUXhDLE1BQU0sVUFBVSxhQUFhLENBQUMsVUFBa0IsRUFBRSxJQUFZLEVBQUUsT0FBa0I7SUFDakYsTUFBTSxlQUFlLEdBQUcsVUFBVSxHQUFHLG9CQUFvQixDQUFDO0lBQzFELGdCQUFnQixDQUFDLGVBQWUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUM1RCxlQUFlLENBQUMsZUFBZSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUU7UUFDckQsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDO1FBQ2hELFVBQVUsRUFBRSxDQUFDLFFBQVEsQ0FBQztRQUN0QixJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDO0tBQzFCLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLFVBQVUsUUFBUSxDQUFDLGNBQStCO0lBQ3ZE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
|