@selfage/bundler_cli
Version:
CLI for bundling and running bundled frontend or backend TypeScript files.
152 lines • 22.3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.bundleForNode = bundleForNode;
exports.bundleForNodeReturnAssetFiles = bundleForNodeReturnAssetFiles;
exports.bundleForBrowser = bundleForBrowser;
exports.bundleForBrowserReturnAssetFiles = bundleForBrowserReturnAssetFiles;
exports.bundle = bundle;
const browserifyConstructor = require("browserify");
const fs = require("fs");
const path = require("path");
const stream = require("stream");
const UglifyJS = require("uglify-js");
const file_extension_stripper_1 = require("./file_extension_stripper");
const files_copier_1 = require("./files_copier");
const get_stream_1 = require("./get_stream");
const compiler_1 = require("@selfage/cli/build/compiler");
// Export as a commonjs module.
let TEMP_DECLARATION_FILE_CONTENT_TEMPLATE = `
declare module "*{ext}" {
let path: string;
export = path;
}
`;
let ASSET_EXT_DECLARATION_FILE = `selfage_asset_exts_declaration.d.ts`;
async function bundleForNode(sourceFile, outputFile, fromDir = ".", toDir = fromDir, options) {
let assetFiles = await bundleForNodeReturnAssetFiles(sourceFile, outputFile, options);
if (path.posix.normalize(fromDir) === path.posix.normalize(toDir)) {
return;
}
await (0, files_copier_1.copyFilesToDir)([(0, file_extension_stripper_1.stripFileExtension)(outputFile) + ".js", ...assetFiles], fromDir, toDir);
}
async function bundleForNodeReturnAssetFiles(sourceFile, outputFile, options) {
let baseDir = path.posix.dirname(outputFile);
return await bundle(sourceFile, outputFile, baseDir, true, false, options);
}
async function bundleForBrowser(sourceFile, outputFile, baseDir = ".", outDir = baseDir, options) {
let assetFiles = await bundleForBrowserReturnAssetFiles(sourceFile, outputFile, baseDir, options);
if (path.posix.normalize(baseDir) === path.posix.normalize(outDir)) {
return;
}
await (0, files_copier_1.copyFilesToDir)([(0, file_extension_stripper_1.stripFileExtension)(outputFile) + ".js", ...assetFiles], baseDir, outDir);
}
async function bundleForBrowserReturnAssetFiles(sourceFile, outputFile, baseDir = ".", options) {
return bundle(sourceFile, outputFile, baseDir, false, true, options);
}
async function bundle(sourceFile, outputFile, baseDir, inNode, bundleExternal, options = {}) {
let assetExts;
if (options.assetExts) {
assetExts = options.assetExts;
}
else {
let packageJsonFile = options.packageJsonFile ?? "./package.json";
assetExts = JSON.parse((await fs.promises.readFile(packageJsonFile)).toString()).assetExts;
}
if (!assetExts) {
await (0, compiler_1.compile)(sourceFile, options.tsconfigFile, options.extraFiles);
}
else {
await compileWithAssets(sourceFile, assetExts, options.extraFiles, options.tsconfigFile);
}
try {
await fs.promises.stat(baseDir);
}
catch (e) {
e.message = "Base directory needs to be a valid directory. " + e.message;
throw e;
}
let entriesToBeBrowserified = new Array();
if (options.inlineJs) {
entriesToBeBrowserified.push(...options.inlineJs.map((jsCode) => {
return stream.Readable.from([jsCode]);
}));
}
if (options.extraFiles) {
// If exists, put them before the main file such that variables will be
// defined and functions will be called before executing the main file.
for (let extraFile of options.extraFiles) {
entriesToBeBrowserified.push(path.posix.relative(baseDir, (0, file_extension_stripper_1.stripFileExtension)(extraFile) + ".js"));
}
}
entriesToBeBrowserified.push(path.posix.relative(baseDir, (0, file_extension_stripper_1.stripFileExtension)(sourceFile) + ".js"));
let browserifyHandler = browserifyConstructor(entriesToBeBrowserified, {
node: inNode,
bundleExternal: bundleExternal,
basedir: baseDir,
debug: options.debug,
});
let outputAssetFiles = new Array();
browserifyHandler.transform((file) => {
if (assetExts && assetExts.includes(path.posix.extname(file))) {
return new AssetTransformer(file, outputAssetFiles);
}
else {
return new stream.PassThrough();
}
});
let bundledCode = await (0, get_stream_1.getStream)(browserifyHandler.bundle());
let outputCode;
if (options.skipMinify) {
outputCode = bundledCode;
}
else {
let minifyOptions = {};
if (options.debug) {
minifyOptions.sourceMap = {
content: "inline",
includeSources: true,
url: "inline",
};
}
let minifiedRes = UglifyJS.minify(bundledCode, minifyOptions);
if (minifiedRes.error) {
throw minifiedRes.error;
}
outputCode = minifiedRes.code;
}
await fs.promises.mkdir(path.posix.dirname(outputFile), {
recursive: true,
});
await fs.promises.writeFile((0, file_extension_stripper_1.stripFileExtension)(outputFile) + ".js", outputCode);
return outputAssetFiles;
}
async function compileWithAssets(sourceFile, assetExts, extraFiles = [], tsconfigFile) {
let tempFileContent = new Array();
for (let ext of assetExts) {
tempFileContent.push(TEMP_DECLARATION_FILE_CONTENT_TEMPLATE.replace("{ext}", ext));
}
await fs.promises.writeFile(ASSET_EXT_DECLARATION_FILE, tempFileContent.join(""));
await (0, compiler_1.compile)(sourceFile, tsconfigFile, [
ASSET_EXT_DECLARATION_FILE,
...extraFiles,
]);
}
class AssetTransformer extends stream.Transform {
constructor(absoluteFile, outputAssetFilePaths) {
super({
transform: (chunk, encoding, callback) => {
callback();
},
flush: (callback) => {
let relativePath = path.posix.relative(".", this.absoluteFile);
this.outputAssetFilePaths.push(relativePath);
callback(undefined,
// __filename will be transformed later by Browserify.
`module.exports = __filename;`);
},
});
this.absoluteFile = absoluteFile;
this.outputAssetFilePaths = outputAssetFilePaths;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImJ1bmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUE4QkEsc0NBcUJDO0FBRUQsc0VBT0M7QUFFRCw0Q0FzQkM7QUFFRCw0RUFPQztBQUVELHdCQWtHQztBQWpNRCxvREFBcUQ7QUFDckQseUJBQTBCO0FBQzFCLDZCQUE4QjtBQUM5QixpQ0FBa0M7QUFDbEMsc0NBQXVDO0FBQ3ZDLHVFQUErRDtBQUMvRCxpREFBZ0Q7QUFDaEQsNkNBQXlDO0FBQ3pDLDBEQUFzRDtBQUV0RCwrQkFBK0I7QUFDL0IsSUFBSSxzQ0FBc0MsR0FBRzs7Ozs7Q0FLNUMsQ0FBQztBQUVGLElBQUksMEJBQTBCLEdBQUcscUNBQXFDLENBQUM7QUFZaEUsS0FBSyxVQUFVLGFBQWEsQ0FDakMsVUFBa0IsRUFDbEIsVUFBa0IsRUFDbEIsT0FBTyxHQUFHLEdBQUcsRUFDYixLQUFLLEdBQUcsT0FBTyxFQUNmLE9BQTZCO0lBRTdCLElBQUksVUFBVSxHQUFHLE1BQU0sNkJBQTZCLENBQ2xELFVBQVUsRUFDVixVQUFVLEVBQ1YsT0FBTyxDQUNSLENBQUM7SUFFRixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbEUsT0FBTztJQUNULENBQUM7SUFDRCxNQUFNLElBQUEsNkJBQWMsRUFDbEIsQ0FBQyxJQUFBLDRDQUFrQixFQUFDLFVBQVUsQ0FBQyxHQUFHLEtBQUssRUFBRSxHQUFHLFVBQVUsQ0FBQyxFQUN2RCxPQUFPLEVBQ1AsS0FBSyxDQUNOLENBQUM7QUFDSixDQUFDO0FBRU0sS0FBSyxVQUFVLDZCQUE2QixDQUNqRCxVQUFrQixFQUNsQixVQUFrQixFQUNsQixPQUE2QjtJQUU3QixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFV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LEtBQUssSUFBSSxHQUFHLElBQUksU0FBUyxFQUFFLENBQUM7UUFDMUIsZUFBZSxDQUFDLElBQUksQ0FDbEIsc0NBQXNDLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FDN0QsQ0FBQztJQUNKLENBQUM7SUFDRCxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUN6QiwwQkFBMEIsRUFDMUIsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FDekIsQ0FBQztJQUNGLE1BQU0sSUFBQSxrQkFBTyxFQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUU7UUFDdEMsMEJBQTBCO1FBQzFCLEdBQUcsVUFBVTtLQUNkLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxNQUFNLGdCQUFpQixTQUFRLE1BQU0sQ0FBQyxTQUFTO0lBQzdDLFlBQ1UsWUFBb0IsRUFDcEIsb0JBQW1DO1FBRTNDLEtBQUssQ0FBQztZQUNKLFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEVBQUU7Z0JBQ3ZDLFFBQVEsRUFBRSxDQUFDO1lBQ2IsQ0FBQztZQUNELEtBQUssRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFO2dCQUNsQixJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUMvRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUM3QyxRQUFRLENBQ04sU0FBUztnQkFDVCxzREFBc0Q7Z0JBQ3RELDhCQUE4QixDQUMvQixDQUFDO1lBQ0osQ0FBQztTQUNGLENBQUMsQ0FBQztRQWhCSyxpQkFBWSxHQUFaLFlBQVksQ0FBUTtRQUNwQix5QkFBb0IsR0FBcEIsb0JBQW9CLENBQWU7SUFnQjdDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBicm93c2VyaWZ5Q29uc3RydWN0b3IgPSByZXF1aXJlKFwiYnJvd3NlcmlmeVwiKTtcbmltcG9ydCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcbmltcG9ydCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG5pbXBvcnQgc3RyZWFtID0gcmVxdWlyZShcInN0cmVhbVwiKTtcbmltcG9ydCBVZ2xpZnlKUyA9IHJlcXVpcmUoXCJ1Z2xpZnktanNcIik7XG5pbXBvcnQgeyBzdHJpcEZpbGVFeHRlbnNpb24gfSBmcm9tIFwiLi9maWxlX2V4dGVuc2lvbl9zdHJpcHBlclwiO1xuaW1wb3J0IHsgY29weUZpbGVzVG9EaXIgfSBmcm9tIFwiLi9maWxlc19jb3BpZXJcIjtcbmltcG9ydCB7IGdldFN0cmVhbSB9IGZyb20gXCIuL2dldF9zdHJlYW1cIjtcbmltcG9ydCB7IGNvbXBpbGUgfSBmcm9tIFwiQHNlbGZhZ2UvY2xpL2J1aWxkL2NvbXBpbGVyXCI7XG5cbi8vIEV4cG9ydCBhcyBhIGNvbW1vbmpzIG1vZHVsZS5cbmxldCBURU1QX0RFQ0xBUkFUSU9OX0ZJTEVfQ09OVEVOVF9URU1QTEFURSA9IGBcbmRlY2xhcmUgbW9kdWxlIFwiKntleHR9XCIge1xuICAgbGV0IHBhdGg6IHN0cmluZztcbiAgIGV4cG9ydCA9IHBhdGg7XG59XG5gO1xuXG5sZXQgQVNTRVRfRVhUX0RFQ0xBUkFUSU9OX0ZJTEUgPSBgc2VsZmFnZV9hc3NldF9leHRzX2RlY2xhcmF0aW9uLmQudHNgO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbW1vbkJ1bmRsZU9wdGlvbnMge1xuICB0c2NvbmZpZ0ZpbGU/OiBzdHJpbmc7XG4gIGV4dHJhRmlsZXM/OiBBcnJheTxzdHJpbmc+O1xuICBpbmxpbmVKcz86IEFycmF5PHN0cmluZz47XG4gIGFzc2V0RXh0cz86IEFycmF5PHN0cmluZz47XG4gIHBhY2thZ2VKc29uRmlsZT86IHN0cmluZztcbiAgc2tpcE1pbmlmeT86IGJvb2xlYW47XG4gIGRlYnVnPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1bmRsZUZvck5vZGUoXG4gIHNvdXJjZUZpbGU6IHN0cmluZyxcbiAgb3V0cHV0RmlsZTogc3RyaW5nLFxuICBmcm9tRGlyID0gXCIuXCIsXG4gIHRvRGlyID0gZnJvbURpcixcbiAgb3B0aW9ucz86IENvbW1vbkJ1bmRsZU9wdGlvbnMsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgbGV0IGFzc2V0RmlsZXMgPSBhd2FpdCBidW5kbGVGb3JOb2RlUmV0dXJuQXNzZXRGaWxlcyhcbiAgICBzb3VyY2VGaWxlLFxuICAgIG91dHB1dEZpbGUsXG4gICAgb3B0aW9ucyxcbiAgKTtcblxuICBpZiAocGF0aC5wb3NpeC5ub3JtYWxpemUoZnJvbURpcikgPT09IHBhdGgucG9zaXgubm9ybWFsaXplKHRvRGlyKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBhd2FpdCBjb3B5RmlsZXNUb0RpcihcbiAgICBbc3RyaXBGaWxlRXh0ZW5zaW9uKG91dHB1dEZpbGUpICsgXCIuanNcIiwgLi4uYXNzZXRGaWxlc10sXG4gICAgZnJvbURpcixcbiAgICB0b0RpcixcbiAgKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1bmRsZUZvck5vZGVSZXR1cm5Bc3NldEZpbGVzKFxuICBzb3VyY2VGaWxlOiBzdHJpbmcsXG4gIG91dHB1dEZpbGU6IHN0cmluZyxcbiAgb3B0aW9ucz86IENvbW1vbkJ1bmRsZU9wdGlvbnMsXG4pOiBQcm9taXNlPEFycmF5PHN0cmluZz4+IHtcbiAgbGV0IGJhc2VEaXIgPSBwYXRoLnBvc2l4LmRpcm5hbWUob3V0cHV0RmlsZSk7XG4gIHJldHVybiBhd2FpdCBidW5kbGUoc291cmNlRmlsZSwgb3V0cHV0RmlsZSwgYmFzZURpciwgdHJ1ZSwgZmFsc2UsIG9wdGlvbnMpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVuZGxlRm9yQnJvd3NlcihcbiAgc291cmNlRmlsZTogc3RyaW5nLFxuICBvdXRwdXRGaWxlOiBzdHJpbmcsXG4gIGJhc2VEaXIgPSBcIi5cIixcbiAgb3V0RGlyID0gYmFzZURpcixcbiAgb3B0aW9ucz86IENvbW1vbkJ1bmRsZU9wdGlvbnMsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgbGV0IGFzc2V0RmlsZXMgPSBhd2FpdCBidW5kbGVGb3JCcm93c2VyUmV0dXJuQXNzZXRGaWxlcyhcbiAgICBzb3VyY2VGaWxlLFxuICAgIG91dHB1dEZpbGUsXG4gICAgYmFzZURpcixcbiAgICBvcHRpb25zLFxuICApO1xuXG4gIGlmIChwYXRoLnBvc2l4Lm5vcm1hbGl6ZShiYXNlRGlyKSA9PT0gcGF0aC5wb3NpeC5ub3JtYWxpemUob3V0RGlyKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBhd2FpdCBjb3B5RmlsZXNUb0RpcihcbiAgICBbc3RyaXBGaWxlRXh0ZW5zaW9uKG91dHB1dEZpbGUpICsgXCIuanNcIiwgLi4uYXNzZXRGaWxlc10sXG4gICAgYmFzZURpcixcbiAgICBvdXREaXIsXG4gICk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidW5kbGVGb3JCcm93c2VyUmV0dXJuQXNzZXRGaWxlcyhcbiAgc291cmNlRmlsZTogc3RyaW5nLFxuICBvdXRwdXRGaWxlOiBzdHJpbmcsXG4gIGJhc2VEaXIgPSBcIi5cIixcbiAgb3B0aW9ucz86IENvbW1vbkJ1bmRsZU9wdGlvbnMsXG4pOiBQcm9taXNlPEFycmF5PHN0cmluZz4+IHtcbiAgcmV0dXJuIGJ1bmRsZShzb3VyY2VGaWxlLCBvdXRwdXRGaWxlLCBiYXNlRGlyLCBmYWxzZSwgdHJ1ZSwgb3B0aW9ucyk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidW5kbGUoXG4gIHNvdXJjZUZpbGU6IHN0cmluZyxcbiAgb3V0cHV0RmlsZTogc3RyaW5nLFxuICBiYXNlRGlyOiBzdHJpbmcsXG4gIGluTm9kZTogYm9vbGVhbixcbiAgYnVuZGxlRXh0ZXJuYWw6IGJvb2xlYW4sXG4gIG9wdGlvbnM6IENvbW1vbkJ1bmRsZU9wdGlvbnMgPSB7fSxcbik6IFByb21pc2U8QXJyYXk8c3RyaW5nPj4ge1xuICBsZXQgYXNzZXRFeHRzOiBBcnJheTxzdHJpbmc+O1xuICBpZiAob3B0aW9ucy5hc3NldEV4dHMpIHtcbiAgICBhc3NldEV4dHMgPSBvcHRpb25zLmFzc2V0RXh0cztcbiAgfSBlbHNlIHtcbiAgICBsZXQgcGFja2FnZUpzb25GaWxlID0gb3B0aW9ucy5wYWNrYWdlSnNvbkZpbGUgPz8gXCIuL3BhY2thZ2UuanNvblwiO1xuICAgIGFzc2V0RXh0cyA9IEpTT04ucGFyc2UoXG4gICAgICAoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGFja2FnZUpzb25GaWxlKSkudG9TdHJpbmcoKSxcbiAgICApLmFzc2V0RXh0cztcbiAgfVxuXG4gIGlmICghYXNzZXRFeHRzKSB7XG4gICAgYXdhaXQgY29tcGlsZShzb3VyY2VGaWxlLCBvcHRpb25zLnRzY29uZmlnRmlsZSwgb3B0aW9ucy5leHRyYUZpbGVzKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBjb21waWxlV2l0aEFzc2V0cyhcbiAgICAgIHNvdXJjZUZpbGUsXG4gICAgICBhc3NldEV4dHMsXG4gICAgICBvcHRpb25zLmV4dHJhRmlsZXMsXG4gICAgICBvcHRpb25zLnRzY29uZmlnRmlsZSxcbiAgICApO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KGJhc2VEaXIpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgZS5tZXNzYWdlID0gXCJCYXNlIGRpcmVjdG9yeSBuZWVkcyB0byBiZSBhIHZhbGlkIGRpcmVjdG9yeS4gXCIgKyBlLm1lc3NhZ2U7XG4gICAgdGhyb3cgZTtcbiAgfVxuICBsZXQgZW50cmllc1RvQmVCcm93c2VyaWZpZWQgPSBuZXcgQXJyYXk8c3RyaW5nIHwgc3RyZWFtLlJlYWRhYmxlPigpO1xuICBpZiAob3B0aW9ucy5pbmxpbmVKcykge1xuICAgIGVudHJpZXNUb0JlQnJvd3NlcmlmaWVkLnB1c2goXG4gICAgICAuLi5vcHRpb25zLmlubGluZUpzLm1hcCgoanNDb2RlKSA9PiB7XG4gICAgICAgIHJldHVybiBzdHJlYW0uUmVhZGFibGUuZnJvbShbanNDb2RlXSk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG4gIGlmIChvcHRpb25zLmV4dHJhRmlsZXMpIHtcbiAgICAvLyBJZiBleGlzdHMsIHB1dCB0aGVtIGJlZm9yZSB0aGUgbWFpbiBmaWxlIHN1Y2ggdGhhdCB2YXJpYWJsZXMgd2lsbCBiZVxuICAgIC8vIGRlZmluZWQgYW5kIGZ1bmN0aW9ucyB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgZXhlY3V0aW5nIHRoZSBtYWluIGZpbGUuXG4gICAgZm9yIChsZXQgZXh0cmFGaWxlIG9mIG9wdGlvbnMuZXh0cmFGaWxlcykge1xuICAgICAgZW50cmllc1RvQmVCcm93c2VyaWZpZWQucHVzaChcbiAgICAgICAgcGF0aC5wb3NpeC5yZWxhdGl2ZShiYXNlRGlyLCBzdHJpcEZpbGVFeHRlbnNpb24oZXh0cmFGaWxlKSArIFwiLmpzXCIpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgZW50cmllc1RvQmVCcm93c2VyaWZpZWQucHVzaChcbiAgICBwYXRoLnBvc2l4LnJlbGF0aXZlKGJhc2VEaXIsIHN0cmlwRmlsZUV4dGVuc2lvbihzb3VyY2VGaWxlKSArIFwiLmpzXCIpLFxuICApO1xuICBsZXQgYnJvd3NlcmlmeUhhbmRsZXIgPSBicm93c2VyaWZ5Q29uc3RydWN0b3IoZW50cmllc1RvQmVCcm93c2VyaWZpZWQsIHtcbiAgICBub2RlOiBpbk5vZGUsXG4gICAgYnVuZGxlRXh0ZXJuYWw6IGJ1bmRsZUV4dGVybmFsLFxuICAgIGJhc2VkaXI6IGJhc2VEaXIsXG4gICAgZGVidWc6IG9wdGlvbnMuZGVidWcsXG4gIH0pO1xuICBsZXQgb3V0cHV0QXNzZXRGaWxlcyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gIGJyb3dzZXJpZnlIYW5kbGVyLnRyYW5zZm9ybSgoZmlsZSkgPT4ge1xuICAgIGlmIChhc3NldEV4dHMgJiYgYXNzZXRFeHRzLmluY2x1ZGVzKHBhdGgucG9zaXguZXh0bmFtZShmaWxlKSkpIHtcbiAgICAgIHJldHVybiBuZXcgQXNzZXRUcmFuc2Zvcm1lcihmaWxlLCBvdXRwdXRBc3NldEZpbGVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBzdHJlYW0uUGFzc1Rocm91Z2goKTtcbiAgICB9XG4gIH0pO1xuICBsZXQgYnVuZGxlZENvZGUgPSBhd2FpdCBnZXRTdHJlYW0oYnJvd3NlcmlmeUhhbmRsZXIuYnVuZGxlKCkpO1xuXG4gIGxldCBvdXRwdXRDb2RlOiBzdHJpbmc7XG4gIGlmIChvcHRpb25zLnNraXBNaW5pZnkpIHtcbiAgICBvdXRwdXRDb2RlID0gYnVuZGxlZENvZGU7XG4gIH0gZWxzZSB7XG4gICAgbGV0IG1pbmlmeU9wdGlvbnM6IFVnbGlmeUpTLk1pbmlmeU9wdGlvbnMgPSB7fTtcbiAgICBpZiAob3B0aW9ucy5kZWJ1Zykge1xuICAgICAgbWluaWZ5T3B0aW9ucy5zb3VyY2VNYXAgPSB7XG4gICAgICAgIGNvbnRlbnQ6IFwiaW5saW5lXCIsXG4gICAgICAgIGluY2x1ZGVTb3VyY2VzOiB0cnVlLFxuICAgICAgICB1cmw6IFwiaW5saW5lXCIsXG4gICAgICB9O1xuICAgIH1cbiAgICBsZXQgbWluaWZpZWRSZXMgPSBVZ2xpZnlKUy5taW5pZnkoYnVuZGxlZENvZGUsIG1pbmlmeU9wdGlvbnMpO1xuICAgIGlmIChtaW5pZmllZFJlcy5lcnJvcikge1xuICAgICAgdGhyb3cgbWluaWZpZWRSZXMuZXJyb3I7XG4gICAgfVxuICAgIG91dHB1dENvZGUgPSBtaW5pZmllZFJlcy5jb2RlO1xuICB9XG5cbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5wb3NpeC5kaXJuYW1lKG91dHB1dEZpbGUpLCB7XG4gICAgcmVjdXJzaXZlOiB0cnVlLFxuICB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKFxuICAgIHN0cmlwRmlsZUV4dGVuc2lvbihvdXRwdXRGaWxlKSArIFwiLmpzXCIsXG4gICAgb3V0cHV0Q29kZSxcbiAgKTtcbiAgcmV0dXJuIG91dHB1dEFzc2V0RmlsZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbXBpbGVXaXRoQXNzZXRzKFxuICBzb3VyY2VGaWxlOiBzdHJpbmcsXG4gIGFzc2V0RXh0czogQXJyYXk8c3RyaW5nPixcbiAgZXh0cmFGaWxlczogQXJyYXk8c3RyaW5nPiA9IFtdLFxuICB0c2NvbmZpZ0ZpbGU/OiBzdHJpbmcsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgbGV0IHRlbXBGaWxlQ29udGVudCA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gIGZvciAobGV0IGV4dCBvZiBhc3NldEV4dHMpIHtcbiAgICB0ZW1wRmlsZUNvbnRlbnQucHVzaChcbiAgICAgIFRFTVBfREVDTEFSQVRJT05fRklMRV9DT05URU5UX1RFTVBMQVRFLnJlcGxhY2UoXCJ7ZXh0fVwiLCBleHQpLFxuICAgICk7XG4gIH1cbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKFxuICAgIEFTU0VUX0VYVF9ERUNMQVJBVElPTl9GSUxFLFxuICAgIHRlbXBGaWxlQ29udGVudC5qb2luKFwiXCIpLFxuICApO1xuICBhd2FpdCBjb21waWxlKHNvdXJjZUZpbGUsIHRzY29uZmlnRmlsZSwgW1xuICAgIEFTU0VUX0VYVF9ERUNMQVJBVElPTl9GSUxFLFxuICAgIC4uLmV4dHJhRmlsZXMsXG4gIF0pO1xufVxuXG5jbGFzcyBBc3NldFRyYW5zZm9ybWVyIGV4dGVuZHMgc3RyZWFtLlRyYW5zZm9ybSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGFic29sdXRlRmlsZTogc3RyaW5nLFxuICAgIHByaXZhdGUgb3V0cHV0QXNzZXRGaWxlUGF0aHM6IEFycmF5PHN0cmluZz4sXG4gICkge1xuICAgIHN1cGVyKHtcbiAgICAgIHRyYW5zZm9ybTogKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spID0+IHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH0sXG4gICAgICBmbHVzaDogKGNhbGxiYWNrKSA9PiB7XG4gICAgICAgIGxldCByZWxhdGl2ZVBhdGggPSBwYXRoLnBvc2l4LnJlbGF0aXZlKFwiLlwiLCB0aGlzLmFic29sdXRlRmlsZSk7XG4gICAgICAgIHRoaXMub3V0cHV0QXNzZXRGaWxlUGF0aHMucHVzaChyZWxhdGl2ZVBhdGgpO1xuICAgICAgICBjYWxsYmFjayhcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgLy8gX19maWxlbmFtZSB3aWxsIGJlIHRyYW5zZm9ybWVkIGxhdGVyIGJ5IEJyb3dzZXJpZnkuXG4gICAgICAgICAgYG1vZHVsZS5leHBvcnRzID0gX19maWxlbmFtZTtgLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuIl19