UNPKG

@dynatrace/devkit

Version:

The Dynatrace App Toolkit utilities for writing and testing migrations.

95 lines (94 loc) 3.31 kB
"use strict"; 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; } }