control-freak-ide/server/nodejs/lib/build/fs/write.js
plastic-hub-dev-node-saturn 538369cff7 latest
2021-05-12 18:35:18 +02:00

95 lines
3.4 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const pathUtil = require("path");
const fs = require("fs");
const fs_1 = require("fs");
const Q = require('q');
const mkdirp = require("mkdirp");
const imports_1 = require("./imports");
const validate_1 = require("./utils/validate");
// Temporary file extensions used for atomic file overwriting.
const newExt = '.__new__';
function validateInput(methodName, path, data, options) {
const methodSignature = methodName + '(path, data, [options])';
validate_1.validateArgument(methodSignature, 'path', path, ['string']);
validate_1.validateArgument(methodSignature, 'data', data, ['string', 'buffer', 'object', 'array']);
validate_1.validateOptions(methodSignature, 'options', options, {
atomic: ['boolean'],
jsonIndent: ['number'],
progress: ['function']
});
}
exports.validateInput = validateInput;
;
const toJson = (data, jsonIndent) => {
if (typeof data === 'object'
&& !Buffer.isBuffer(data)
&& data !== null) {
return imports_1.json.serialize(data, null, typeof jsonIndent !== 'number' ? 2 : jsonIndent);
}
return data;
};
// ---------------------------------------------------------
// SYNC
// ---------------------------------------------------------
const _writeFileSync = (path, data, options) => {
try {
fs_1.writeFileSync(path, data, options);
}
catch (err) {
if (err.code === 'ENOENT') {
// Means parent directory doesn't exist, so create it and try again.
mkdirp.sync(pathUtil.dirname(path));
fs.writeFileSync(path, data, options);
}
else {
throw err;
}
}
};
const writeAtomicSync = (path, data, options) => {
return imports_1.file.write_atomic(path + newExt, data, options, function () { });
};
function sync(path, data, options) {
const opts = options || {};
const processedData = toJson(data, opts.jsonIndent);
const writeStrategy = opts.atomic ? writeAtomicSync : _writeFileSync;
writeStrategy(path, processedData, { mode: opts.mode });
}
exports.sync = sync;
;
// ---------------------------------------------------------
// ASYNC
// ---------------------------------------------------------
const promisedWriteFile = Q.denodeify(fs.writeFile);
const promisedMkdirp = Q.denodeify(mkdirp);
const promisedAtomic = Q.denodeify(writeAtomicSync);
function writeFileAsync(path, data, options) {
return new Promise((resolve, reject) => {
promisedWriteFile(path, data, options)
.then(resolve)
.catch((err) => {
// First attempt to write a file ended with error.
// Check if this is not due to nonexistent parent directory.
if (err.code === 'ENOENT') {
// Parent directory doesn't exist, so create it and try again.
promisedMkdirp(pathUtil.dirname(path))
.then(() => promisedWriteFile(path, data, options))
.then(resolve, reject);
}
else {
// Nope, some other error, throw it.
reject(err);
}
});
});
}
;
function async(path, data, options) {
const opts = options || {};
const processedData = toJson(data, opts.jsonIndent);
return (opts.atomic ? promisedAtomic : writeFileAsync)(path, processedData, { mode: opts.mode });
}
exports.async = async;
;
//# sourceMappingURL=write.js.map