88 lines
6.9 KiB
JavaScript
88 lines
6.9 KiB
JavaScript
import { promises, readFileSync } from 'fs';
|
|
import { json } from './imports.js';
|
|
import { validateArgument } from './utils/validate.js';
|
|
const supportedReturnAs = ['utf8', 'buffer', 'json', 'jsonWithDates'];
|
|
export function validateInput(methodName, path, returnAs) {
|
|
const methodSignature = methodName + '(path, returnAs)';
|
|
validateArgument(methodSignature, 'path', path, ['string']);
|
|
validateArgument(methodSignature, 'returnAs', returnAs, ['string', 'undefined']);
|
|
if (returnAs && !supportedReturnAs.includes(returnAs)) {
|
|
throw new Error('Argument "returnAs" passed to ' + methodSignature
|
|
+ ' must have one of values: ' + supportedReturnAs.join(', '));
|
|
}
|
|
}
|
|
// Matches strings generated by Date.toJSON()
|
|
// which is called to serialize date to JSON.
|
|
const jsonDateParser = (key, value) => {
|
|
const reISO = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}\.\d*)(?:Z|(\+|-)([\d|:]*))?$/;
|
|
if (typeof value === 'string') {
|
|
if (reISO.test(value)) {
|
|
return new Date(value);
|
|
}
|
|
}
|
|
return value;
|
|
};
|
|
const ErrJson = (path, err) => {
|
|
const nicerError = new Error('JSON parsing failed while reading '
|
|
+ path + ' [' + err + ']');
|
|
nicerError.originalError = err;
|
|
return nicerError;
|
|
};
|
|
// ---------------------------------------------------------
|
|
// SYNC
|
|
// ---------------------------------------------------------
|
|
export function sync(path, returnAs) {
|
|
const retAs = returnAs || 'utf8';
|
|
let data;
|
|
try {
|
|
data = readFileSync(path, { encoding: retAs === 'buffer' ? null : 'utf8' });
|
|
}
|
|
catch (err) {
|
|
if (err.code === 'ENOENT') {
|
|
// If file doesn't exist return undefined instead of throwing.
|
|
return undefined;
|
|
}
|
|
// Otherwise rethrow the error
|
|
throw err;
|
|
}
|
|
try {
|
|
if (retAs === 'json') {
|
|
data = json.parse(data);
|
|
}
|
|
else if (retAs === 'jsonWithDates') {
|
|
data = json.parse(data, jsonDateParser);
|
|
}
|
|
}
|
|
catch (err) {
|
|
throw ErrJson(path, err);
|
|
}
|
|
return data;
|
|
}
|
|
// ---------------------------------------------------------
|
|
// ASYNC
|
|
// ---------------------------------------------------------
|
|
export function async(path, returnAs) {
|
|
return new Promise((resolve, reject) => {
|
|
const retAs = returnAs || 'utf8';
|
|
promises.readFile(path, { encoding: retAs === 'buffer' ? null : 'utf8' })
|
|
.then((data) => {
|
|
// Make final parsing of the data before returning.
|
|
try {
|
|
if (retAs === 'json') {
|
|
resolve(json.parse(data));
|
|
}
|
|
else if (retAs === 'jsonWithDates') {
|
|
resolve(json.parse(data, jsonDateParser));
|
|
}
|
|
else {
|
|
resolve(data);
|
|
}
|
|
}
|
|
catch (err) {
|
|
reject(ErrJson(path, err));
|
|
}
|
|
})
|
|
.catch((err) => (err.code === 'ENOENT' ? resolve(null) : reject(err)));
|
|
});
|
|
}
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9yZWFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBWSxRQUFRLEVBQUMsWUFBWSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBRXJELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFHdkQsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0FBR3RFLE1BQU0sVUFBVSxhQUFhLENBQUMsVUFBa0IsRUFBRSxJQUFZLEVBQUUsUUFBZ0I7SUFDL0UsTUFBTSxlQUFlLEdBQUcsVUFBVSxHQUFHLGtCQUFrQixDQUFDO0lBQ3hELGdCQUFnQixDQUFDLGVBQWUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUM1RCxnQkFBZ0IsQ0FBQyxlQUFlLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQ2pGLElBQUksUUFBUSxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDdkQsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsR0FBRyxlQUFlO2NBQy9ELDRCQUE0QixHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7QUFDRixDQUFDO0FBRUQsNkNBQTZDO0FBQzdDLDZDQUE2QztBQUM3QyxNQUFNLGNBQWMsR0FBRyxDQUFDLEdBQVcsRUFBRSxLQUFvQixFQUFRLEVBQUU7SUFDbEUsTUFBTSxLQUFLLEdBQUcsOEVBQThFLENBQUM7SUFDN0YsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FB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
|