@toolpad/utils
Version:
Shared utilities used by Toolpad packages.
123 lines (122 loc) • 4.58 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.fileExists = fileExists;
exports.fileReplace = fileReplace;
exports.fileReplaceAll = fileReplaceAll;
exports.folderExists = folderExists;
exports.readJsonFile = readJsonFile;
exports.readMaybeDir = readMaybeDir;
exports.readMaybeFile = readMaybeFile;
exports.updateYamlFile = updateYamlFile;
exports.writeFileRecursive = writeFileRecursive;
var fs = _interopRequireWildcard(require("fs/promises"));
var path = _interopRequireWildcard(require("path"));
var yaml = _interopRequireWildcard(require("yaml"));
var _yamlDiffPatch = require("yaml-diff-patch");
var _prettier = _interopRequireDefault(require("prettier"));
var _errors = require("./errors");
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
/**
* Formats a yaml source with `prettier`.
*/
async function formatYaml(code, filePath) {
const readConfig = await _prettier.default.resolveConfig(filePath);
return _prettier.default.format(code, {
...readConfig,
parser: 'yaml'
});
}
/**
* Like `fs.readFile`, but for JSON files specifically. Will throw on malformed JSON.
*/
async function readJsonFile(filePath, reviver) {
const content = await fs.readFile(filePath, {
encoding: 'utf-8'
});
return JSON.parse(content, reviver);
}
async function readMaybeFile(filePath) {
try {
return await fs.readFile(filePath, {
encoding: 'utf-8'
});
} catch (rawError) {
const error = (0, _errors.errorFrom)(rawError);
if (error.code === 'ENOENT' || error.code === 'EISDIR') {
return null;
}
throw error;
}
}
async function readMaybeDir(dirPath) {
try {
return await fs.readdir(dirPath, {
withFileTypes: true
});
} catch (rawError) {
const error = (0, _errors.errorFrom)(rawError);
if (error.code === 'ENOENT' || error.code === 'ENOTDIR') {
return [];
}
throw error;
}
}
async function writeFileRecursive(filePath, content, options) {
await fs.mkdir(path.dirname(filePath), {
recursive: true
});
await fs.writeFile(filePath, content, options);
}
async function updateYamlFile(filePath, content, options) {
const oldContent = await readMaybeFile(filePath);
let newContent = oldContent ? (0, _yamlDiffPatch.yamlOverwrite)(oldContent, content) : yaml.stringify(content);
if (options?.schemaUrl) {
const yamlDoc = yaml.parseDocument(newContent);
yamlDoc.commentBefore = ` yaml-language-server: $schema=${options.schemaUrl}`;
newContent = yamlDoc.toString();
}
newContent = await formatYaml(newContent, filePath);
if (newContent !== oldContent) {
await writeFileRecursive(filePath, newContent);
}
}
async function fileExists(filepath) {
try {
const stat = await fs.stat(filepath);
return stat.isFile();
} catch (err) {
if ((0, _errors.errorFrom)(err).code === 'ENOENT') {
return false;
}
throw err;
}
}
async function folderExists(folderpath) {
try {
const stat = await fs.stat(folderpath);
return stat.isDirectory();
} catch (err) {
if ((0, _errors.errorFrom)(err).code === 'ENOENT') {
return false;
}
throw err;
}
}
async function fileReplace(filePath, searchValue, replaceValue) {
const queriesFileContent = await fs.readFile(filePath, {
encoding: 'utf-8'
});
const updatedFileContent = queriesFileContent.replace(searchValue, () => replaceValue);
await fs.writeFile(filePath, updatedFileContent);
}
async function fileReplaceAll(filePath, searchValue, replaceValue) {
const queriesFileContent = await fs.readFile(filePath, {
encoding: 'utf-8'
});
const updatedFileContent = queriesFileContent.replaceAll(searchValue, () => replaceValue);
await fs.writeFile(filePath, updatedFileContent);
}
;