@dynatrace/devkit
Version:
The Dynatrace App Toolkit utilities for writing and testing migrations.
95 lines (94 loc) • 3.31 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.findFiles = findFiles;
exports.readFile = readFile;
exports.deleteFile = deleteFile;
exports.writeFile = writeFile;
exports.updateFile = updateFile;
exports.updateJson = updateJson;
exports.mergeFileMaps = mergeFileMaps;
const lodash_1 = require("lodash");
const micromatch_1 = require("micromatch");
const path_1 = require("path");
const file_mode_1 = require("./file-mode");
/** Find a file inside the file map */
function findFiles(fileMap, glob) {
return (0, micromatch_1.match)(Object.keys(fileMap), glob).reduce((prev, filepath) => ({
...prev,
[(0, path_1.join)(filepath)]: fileMap[(0, path_1.join)(filepath)],
}), {});
}
/** Helper function to read a file content */
function readFile(fileMap, filePath) {
const resolvedFilePath = (0, path_1.join)(filePath);
if (fileMap[resolvedFilePath]) {
return fileMap[resolvedFilePath].content.toString();
}
}
/** Helper function to delete a file */
function deleteFile(fileMap, filePath) {
const resolvedFilePath = (0, path_1.join)(filePath);
if (fileMap[resolvedFilePath]) {
fileMap[resolvedFilePath].mode = file_mode_1.FileMode.deleted;
}
return fileMap;
}
/** Helper function to write a file */
function writeFile(fileMap, filePath, content) {
const resolvedFilePath = (0, path_1.join)(filePath);
fileMap[resolvedFilePath] = {
content: Buffer.from(content),
mode: file_mode_1.FileMode.created,
filename: resolvedFilePath,
};
return fileMap;
}
/** Helper function to update a file */
function updateFile(fileMap, filePath, modify) {
const resolvedFilePath = (0, path_1.join)(filePath);
if (!fileMap[resolvedFilePath]) {
return fileMap;
}
fileMap[resolvedFilePath].content = Buffer.from(modify(fileMap[resolvedFilePath].content.toString()));
fileMap[resolvedFilePath].mode = file_mode_1.FileMode.updated;
return fileMap;
}
/** Helper function to update a json file */
function updateJson(fileMap, filePath, modify) {
const resolvedFilePath = (0, path_1.join)(filePath);
return updateFile(fileMap, resolvedFilePath, (content) => {
const json = JSON.parse(content);
return JSON.stringify(modify(json), null, 2);
});
}
/**
* Merges multiple file maps into one, overrides duplicate file maps,
* only json files are getting merged.
*/
function mergeFileMaps(...fileMaps) {
return fileMaps.reduce((map, cur) => {
const merged = { ...map };
Object.keys(cur).forEach((key) => {
if (key in merged && key.endsWith('.json')) {
merged[key] = {
content: Buffer.from(mergeJsonFiles(merged[key].content.toString(), cur[key].content.toString())),
mode: file_mode_1.FileMode.created,
};
return;
}
merged[key] = cur[key];
});
return merged;
}, {});
}
/** Merges two json files into one (used for combining package.json files) */
function mergeJsonFiles(a, b) {
try {
const jsonA = JSON.parse(a);
const jsonB = JSON.parse(b);
return JSON.stringify((0, lodash_1.merge)(jsonA, jsonB), null, 2);
}
catch {
return b;
}
}