projen
Version:
CDK for software projects
109 lines • 15.3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.synthSnapshot = synthSnapshot;
exports.directorySnapshot = directorySnapshot;
const fs = require("fs");
const os = require("os");
const path = require("path");
const JSONC = require("comment-json");
const comment_json_1 = require("comment-json");
const glob = require("fast-glob");
const json_1 = require("../json");
/**
* Creates a snapshot of the files generated by a project. Ignores any non-text
* files so that the snapshots are human readable.
*/
function synthSnapshot(project, options = {}) {
// defensive: verify that "outdir" is actually in a temporary directory
if (!path.resolve(project.outdir).startsWith(os.tmpdir()) &&
!project.outdir.includes("project-temp-dir")) {
throw new Error("Trying to capture a snapshot of a project outside of tmpdir, which implies this test might corrupt an existing project");
}
const synthed = Symbol.for("synthed");
if (synthed in project) {
throw new Error("duplicate synth()");
}
project[synthed] = true;
const ENV_PROJEN_DISABLE_POST = process.env.PROJEN_DISABLE_POST;
try {
process.env.PROJEN_DISABLE_POST = "true";
project.synth();
const ignoreExts = ["png", "ico"];
return directorySnapshot(project.outdir, {
...options,
excludeGlobs: ignoreExts.map((ext) => `**/*.${ext}`),
supportJsonComments: project.files.some(
// At least one json file in project supports comments
(file) => file instanceof json_1.JsonFile && file.supportsComments),
});
}
finally {
fs.rmSync(project.outdir, { force: true, recursive: true });
// values assigned to process.env.XYZ are automatically converted to strings
if (ENV_PROJEN_DISABLE_POST === undefined) {
delete process.env.PROJEN_DISABLE_POST;
}
else {
process.env.PROJEN_DISABLE_POST = ENV_PROJEN_DISABLE_POST;
}
}
}
function isJsonLikeFile(filePath) {
const file = filePath.toLowerCase();
return (file.endsWith(".json") || file.endsWith(".json5") || file.endsWith(".jsonc"));
}
function directorySnapshot(root, options = {}) {
const output = {};
const files = glob.sync("**", {
ignore: [".git/**", ...(options.excludeGlobs ?? [])],
cwd: root,
onlyFiles: true,
followSymbolicLinks: false,
dot: true,
}); // returns relative file paths with POSIX separators
const parseJson = options.parseJson ?? true;
for (const file of files) {
const filePath = path.join(root, file);
let content;
if (!options.onlyFileNames) {
content = fs.readFileSync(filePath, "utf-8");
if (parseJson && isJsonLikeFile(filePath)) {
content = cleanCommentArrays(JSONC.parse(content, undefined, !options.supportJsonComments));
}
}
else {
content = true;
}
output[file] = content;
}
return output;
}
/**
* Converts type "CommentArray" back to regular JS "Array"
* if there are no comments stored in it.
* Prevents strict checks from failing.
*/
function cleanCommentArrays(obj) {
if (Array.isArray(obj) || isCommentArrayWithoutComments(obj)) {
return Array.from(obj).map(cleanCommentArrays);
}
if (obj instanceof Object) {
for (const p of Object.keys(obj)) {
if (isCommentArrayWithoutComments(obj[p])) {
obj[p] = Array.from(obj[p]).map(cleanCommentArrays);
}
else if (obj[p] instanceof Object) {
obj[p] = cleanCommentArrays(obj[p]);
}
}
}
return obj;
}
/**
* Checks if a "CommentArray" has no comments stored in it.
*/
function isCommentArrayWithoutComments(obj) {
return (obj instanceof comment_json_1.CommentArray &&
Object.getOwnPropertySymbols(obj).length === 0);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ludGguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbC9zeW50aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQThCQSxzQ0E0Q0M7QUFnQ0QsOENBbUNDO0FBN0lELHlCQUF5QjtBQUN6Qix5QkFBeUI7QUFDekIsNkJBQTZCO0FBQzdCLHNDQUFzQztBQUN0QywrQ0FBNEM7QUFDNUMsa0NBQWtDO0FBQ2xDLGtDQUFtQztBQW9CbkM7OztHQUdHO0FBQ0gsU0FBZ0IsYUFBYSxDQUMzQixPQUFnQixFQUNoQixVQUEyQixFQUFFO0lBRTdCLHVFQUF1RTtJQUN2RSxJQUNFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNyRCxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLEVBQzVDLENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUNiLHdIQUF3SCxDQUN6SCxDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdEMsSUFBSSxPQUFPLElBQUksT0FBTyxFQUFFLENBQUM7UUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFQSxPQUFlLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBRWpDLE1BQU0sdUJBQXVCLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQztJQUNoRSxJQUFJLENBQUM7UUFDSCxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixHQUFHLE1BQU0sQ0FBQztRQUN6QyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDaEIsTUFBTSxVQUFVLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFD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LENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM3RCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELElBQUksR0FBRyxZQUFZLE1BQU0sRUFBRSxDQUFDO1FBQzFCLEtBQUssTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2pDLElBQUksNkJBQTZCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDMUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDdEQsQ0FBQztpQkFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsWUFBWSxNQUFNLEVBQUUsQ0FBQztnQkFDcEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyw2QkFBNkIsQ0FBQyxHQUFRO0lBQzdDLE9BQU8sQ0FDTCxHQUFHLFlBQVksMkJBQVk7UUFDM0IsTUFBTSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQy9DLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgKiBhcyBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCAqIGFzIEpTT05DIGZyb20gXCJjb21tZW50LWpzb25cIjtcbmltcG9ydCB7IENvbW1lbnRBcnJheSB9IGZyb20gXCJjb21tZW50LWpzb25cIjtcbmltcG9ydCAqIGFzIGdsb2IgZnJvbSBcImZhc3QtZ2xvYlwiO1xuaW1wb3J0IHsgSnNvbkZpbGUgfSBmcm9tIFwiLi4vanNvblwiO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSBcIi4uL3Byb2plY3RcIjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUgU25hcHNob3Qgc3ludGhlc2lzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU25hcHNob3RPcHRpb25zIHtcbiAgLyoqXG4gICAqIFBhcnNlIC5qc29uIGZpbGVzIGFzIGEgSlMgb2JqZWN0IGZvciBpbXByb3ZlZCBpbnNwZWN0aW9uLlxuICAgKiBUaGlzIHdpbGwgZmFpbCBpZiB0aGUgY29udGVudHMgYXJlIGludmFsaWQgSlNPTi5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZSBwYXJzZSAuanNvbiBmaWxlcyBpbnRvIGFuIG9iamVjdFxuICAgKi9cbiAgcmVhZG9ubHkgcGFyc2VKc29uPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTeW50aE91dHB1dCB7XG4gIFtmaWxlUGF0aDogc3RyaW5nXTogYW55O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBzbmFwc2hvdCBvZiB0aGUgZmlsZXMgZ2VuZXJhdGVkIGJ5IGEgcHJvamVjdC4gSWdub3JlcyBhbnkgbm9uLXRleHRcbiAqIGZpbGVzIHNvIHRoYXQgdGhlIHNuYXBzaG90cyBhcmUgaHVtYW4gcmVhZGFibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzeW50aFNuYXBzaG90KFxuICBwcm9qZWN0OiBQcm9qZWN0LFxuICBvcHRpb25zOiBTbmFwc2hvdE9wdGlvbnMgPSB7fSxcbik6IFN5bnRoT3V0cHV0IHtcbiAgLy8gZGVmZW5zaXZlOiB2ZXJpZnkgdGhhdCBcIm91dGRpclwiIGlzIGFjdHVhbGx5IGluIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeVxuICBpZiAoXG4gICAgIXBhdGgucmVzb2x2ZShwcm9qZWN0Lm91dGRpcikuc3RhcnRzV2l0aChvcy50bXBkaXIoKSkgJiZcbiAgICAhcHJvamVjdC5vdXRkaXIuaW5jbHVkZXMoXCJwcm9qZWN0LXRlbXAtZGlyXCIpXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFwiVHJ5aW5nIHRvIGNhcHR1cmUgYSBzbmFwc2hvdCBvZiBhIHByb2plY3Qgb3V0c2lkZSBvZiB0bXBkaXIsIHdoaWNoIGltcGxpZXMgdGhpcyB0ZXN0IG1pZ2h0IGNvcnJ1cHQgYW4gZXhpc3RpbmcgcHJvamVjdFwiLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBzeW50aGVkID0gU3ltYm9sLmZvcihcInN5bnRoZWRcIik7XG4gIGlmIChzeW50aGVkIGluIHByb2plY3QpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJkdXBsaWNhdGUgc3ludGgoKVwiKTtcbiAgfVxuXG4gIChwcm9qZWN0IGFzIGFueSlbc3ludGhlZF0gPSB0cnVlO1xuXG4gIGNvbnN0IEVOVl9QUk9KRU5fRElTQUJMRV9QT1NUID0gcHJvY2Vzcy5lbnYuUFJPSkVOX0RJU0FCTEVfUE9TVDtcbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmVudi5QUk9KRU5fRElTQUJMRV9QT1NUID0gXCJ0cnVlXCI7XG4gICAgcHJvamVjdC5zeW50aCgpO1xuICAgIGNvbnN0IGlnbm9yZUV4dHMgPSBbXCJwbmdcIiwgXCJpY29cIl07XG4gICAgcmV0dXJuIGRpcmVjdG9yeVNuYXBzaG90KHByb2plY3Qub3V0ZGlyLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgZXhjbHVkZUdsb2JzOiBpZ25vcmVFeHRzLm1hcCgoZXh0KSA9PiBgKiovKi4ke2V4dH1gKSxcbiAgICAgIHN1cHBvcnRKc29uQ29tbWVudHM6IHByb2plY3QuZmlsZXMuc29tZShcbiAgICAgICAgLy8gQXQgbGVhc3Qgb25lIGpzb24gZmlsZSBpbiBwcm9qZWN0IHN1cHBvcnRzIGNvbW1lbnRzXG4gICAgICAgIChmaWxlKSA9PiBmaWxlIGluc3RhbmNlb2YgSnNvbkZpbGUgJiYgZmlsZS5zdXBwb3J0c0NvbW1lbnRzLFxuICAgICAgKSxcbiAgICB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBmcy5ybVN5bmMocHJvamVjdC5vdXRkaXIsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIHZhbHVlcyBhc3NpZ25lZCB0byBwcm9jZXNzLmVudi5YWVogYXJlIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIHRvIHN0cmluZ3NcbiAgICBpZiAoRU5WX1BST0pFTl9ESVNBQkxFX1BPU1QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVsZXRlIHByb2Nlc3MuZW52LlBST0pFTl9ESVNBQkxFX1BPU1Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3MuZW52LlBST0pFTl9ESVNBQkxFX1BPU1QgPSBFTlZfUFJPSkVOX0RJU0FCTEVfUE9TVDtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBEaXJlY3RvcnlTbmFwc2hvdE9wdGlvbnMgZXh0ZW5kcyBTbmFwc2hvdE9wdGlvbnMge1xuICAvKipcbiAgICogR2xvYnMgb2YgZmlsZXMgdG8gZXhjbHVkZS5cbiAgICogQGRlZmF1bHQgW10gaW5jbHVkZSBhbGwgZmlsZXNcbiAgICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGVHbG9icz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBPbmx5IHNuYXBzaG90IHRoZSBuYW1lcyBvZiBmaWxlcyBhbmQgbm90IHRoZWlyIGNvbnRlbnRzLlxuICAgKiBUaGUgdmFsdWUgZm9yIGEgcGF0aCB3aWxsIGJlIGB0cnVlYCBpZiBpdCBleGlzdHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlIGluY2x1ZGUgZmlsZSBjb250ZW50XG4gICAqL1xuICByZWFkb25seSBvbmx5RmlsZU5hbWVzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogUGFyc2VzIGZpbGVzIHdpdGggZGlmZmVyZW50IHBhcnNlciwgc3VwcG9ydGluZyBjb21tZW50c1xuICAgKiBpbnNpZGUgLmpzb24gZmlsZXMuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBzdXBwb3J0SnNvbkNvbW1lbnRzPzogYm9vbGVhbjtcbn1cblxuZnVuY3Rpb24gaXNKc29uTGlrZUZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBmaWxlID0gZmlsZVBhdGgudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIChcbiAgICBmaWxlLmVuZHNXaXRoKFwiLmpzb25cIikgfHwgZmlsZS5lbmRzV2l0aChcIi5qc29uNVwiKSB8fCBmaWxlLmVuZHNXaXRoKFwiLmpzb25jXCIpXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaXJlY3RvcnlTbmFwc2hvdChcbiAgcm9vdDogc3RyaW5nLFxuICBvcHRpb25zOiBEaXJlY3RvcnlTbmFwc2hvdE9wdGlvbnMgPSB7fSxcbikge1xuICBjb25zdCBvdXRwdXQ6IFN5bnRoT3V0cHV0ID0ge307XG5cbiAgY29uc3QgZmlsZXMgPSBnbG9iLnN5bmMoXCIqKlwiLCB7XG4gICAgaWdub3JlOiBbXCIuZ2l0LyoqXCIsIC4uLihvcHRpb25zLmV4Y2x1ZGVHbG9icyA/PyBbXSldLFxuICAgIGN3ZDogcm9vdCxcbiAgICBvbmx5RmlsZXM6IHRydWUsXG4gICAgZm9sbG93U3ltYm9saWNMaW5rczogZmFsc2UsXG4gICAgZG90OiB0cnVlLFxuICB9KTsgLy8gcmV0dXJucyByZWxhdGl2ZSBmaWxlIHBhdGhzIHdpdGggUE9TSVggc2VwYXJhdG9yc1xuXG4gIGNvbnN0IHBhcnNlSnNvbiA9IG9wdGlvbnMucGFyc2VKc29uID8/IHRydWU7XG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4ocm9vdCwgZmlsZSk7XG5cbiAgICBsZXQgY29udGVudDtcbiAgICBpZiAoIW9wdGlvbnMub25seUZpbGVOYW1lcykge1xuICAgICAgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgXCJ1dGYtOFwiKTtcbiAgICAgIGlmIChwYXJzZUpzb24gJiYgaXNKc29uTGlrZUZpbGUoZmlsZVBhdGgpKSB7XG4gICAgICAgIGNvbnRlbnQgPSBjbGVhbkNvbW1lbnRBcnJheXMoXG4gICAgICAgICAgSlNPTkMucGFyc2UoY29udGVudCwgdW5kZWZpbmVkLCAhb3B0aW9ucy5zdXBwb3J0SnNvbkNvbW1lbnRzKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29udGVudCA9IHRydWU7XG4gICAgfVxuXG4gICAgb3V0cHV0W2ZpbGVdID0gY29udGVudDtcbiAgfVxuXG4gIHJldHVybiBvdXRwdXQ7XG59XG5cbi8qKlxuICogQ29udmVydHMgdHlwZSBcIkNvbW1lbnRBcnJheVwiIGJhY2sgdG8gcmVndWxhciBKUyBcIkFycmF5XCJcbiAqIGlmIHRoZXJlIGFyZSBubyBjb21tZW50cyBzdG9yZWQgaW4gaXQuXG4gKiBQcmV2ZW50cyBzdHJpY3QgY2hlY2tzIGZyb20gZmFpbGluZy5cbiAqL1xuZnVuY3Rpb24gY2xlYW5Db21tZW50QXJyYXlzKG9iajogYW55KTogdHlwZW9mIG9iaiB7XG4gIGlmIChBcnJheS5pc0FycmF5KG9iaikgfHwgaXNDb21tZW50QXJyYXlXaXRob3V0Q29tbWVudHMob2JqKSkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKG9iaikubWFwKGNsZWFuQ29tbWVudEFycmF5cyk7XG4gIH1cblxuICBpZiAob2JqIGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgZm9yIChjb25zdCBwIG9mIE9iamVjdC5rZXlzKG9iaikpIHtcbiAgICAgIGlmIChpc0NvbW1lbnRBcnJheVdpdGhvdXRDb21tZW50cyhvYmpbcF0pKSB7XG4gICAgICAgIG9ialtwXSA9IEFycmF5LmZyb20ob2JqW3BdKS5tYXAoY2xlYW5Db21tZW50QXJyYXlzKTtcbiAgICAgIH0gZWxzZSBpZiAob2JqW3BdIGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgICAgIG9ialtwXSA9IGNsZWFuQ29tbWVudEFycmF5cyhvYmpbcF0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgXCJDb21tZW50QXJyYXlcIiBoYXMgbm8gY29tbWVudHMgc3RvcmVkIGluIGl0LlxuICovXG5mdW5jdGlvbiBpc0NvbW1lbnRBcnJheVdpdGhvdXRDb21tZW50cyhvYmo6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIG9iaiBpbnN0YW5jZW9mIENvbW1lbnRBcnJheSAmJlxuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqKS5sZW5ndGggPT09IDBcbiAgKTtcbn1cbiJdfQ==