@selfage/bundler_cli
Version:
CLI for bundling and running bundled frontend or backend TypeScript files.
149 lines • 21.9 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.copyFiles)([(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.copyFiles)([(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.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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImJ1bmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUE4QkEsc0NBcUJDO0FBRUQsc0VBT0M7QUFFRCw0Q0FzQkM7QUFFRCw0RUFPQztBQUVELHdCQStGQztBQTlMRCxvREFBcUQ7QUFDckQseUJBQTBCO0FBQzFCLDZCQUE4QjtBQUM5QixpQ0FBa0M7QUFDbEMsc0NBQXVDO0FBQ3ZDLHVFQUErRDtBQUMvRCxpREFBMkM7QUFDM0MsNkNBQXlDO0FBQ3pDLDBEQUFzRDtBQUV0RCwrQkFBK0I7QUFDL0IsSUFBSSxzQ0FBc0MsR0FBRzs7Ozs7Q0FLNUMsQ0FBQztBQUVGLElBQUksMEJBQTBCLEdBQUcscUNBQXFDLENBQUM7QUFZaEUsS0FBSyxVQUFVLGFBQWEsQ0FDakMsVUFBa0IsRUFDbEIsVUFBa0IsRUFDbEIsT0FBTyxHQUFHLEdBQUcsRUFDYixLQUFLLEdBQUcsT0FBTyxFQUNmLE9BQTZCO0lBRTdCLElBQUksVUFBVSxHQUFHLE1BQU0sNkJBQTZCLENBQ2xELFVBQVUsRUFDVixVQUFVLEVBQ1YsT0FBTyxDQUNSLENBQUM7SUFFRixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbEUsT0FBTztJQUNULENBQUM7SUFDRCxNQUFNLElBQUEsd0JBQVMsRUFDYixDQUFDLElBQUEsNENBQWtCLEVBQUMsVUFBVSxDQUFDLEdBQUcsS0FBSyxFQUFFLEdBQUcsVUFBVSxDQUFDLEVBQ3ZELE9BQU8sRUFDUCxLQUFLLENBQ04sQ0FBQztBQUNKLENBQUM7QUFFTSxLQUFLLFVBQVUsNkJBQTZCLENBQ2pELFVBQWtCLEVBQ2xCLFVBQWtCLEVBQ2xCLE9BQTZCO0lBRTdCLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUs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QztJQUNELE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQ3pCLDBCQUEwQixFQUMxQixlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUN6QixDQUFDO0lBQ0YsTUFBTSxJQUFBLGtCQUFPLEVBQUMsVUFBVSxFQUFFLFlBQVksRUFBRTtRQUN0QywwQkFBMEI7UUFDMUIsR0FBRyxVQUFVO0tBQ2QsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELE1BQU0sZ0JBQWlCLFNBQVEsTUFBTSxDQUFDLFNBQVM7SUFDN0MsWUFDVSxZQUFvQixFQUNwQixvQkFBbUM7UUFFM0MsS0FBSyxDQUFDO1lBQ0osU0FBUyxFQUFFLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRTtnQkFDdkMsUUFBUSxFQUFFLENBQUM7WUFDYixDQUFDO1lBQ0QsS0FBSyxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUU7Z0JBQ2xCLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQy9ELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQzdDLFFBQVEsQ0FDTixTQUFTO2dCQUNULHNEQUFzRDtnQkFDdEQsOEJBQThCLENBQy9CLENBQUM7WUFDSixDQUFDO1NBQ0YsQ0FBQyxDQUFDO1FBaEJLLGlCQUFZLEdBQVosWUFBWSxDQUFRO1FBQ3BCLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBZTtJQWdCN0MsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGJyb3dzZXJpZnlDb25zdHJ1Y3RvciA9IHJlcXVpcmUoXCJicm93c2VyaWZ5XCIpO1xuaW1wb3J0IGZzID0gcmVxdWlyZShcImZzXCIpO1xuaW1wb3J0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcbmltcG9ydCBzdHJlYW0gPSByZXF1aXJlKFwic3RyZWFtXCIpO1xuaW1wb3J0IFVnbGlmeUpTID0gcmVxdWlyZShcInVnbGlmeS1qc1wiKTtcbmltcG9ydCB7IHN0cmlwRmlsZUV4dGVuc2lvbiB9IGZyb20gXCIuL2ZpbGVfZXh0ZW5zaW9uX3N0cmlwcGVyXCI7XG5pbXBvcnQgeyBjb3B5RmlsZXMgfSBmcm9tIFwiLi9maWxlc19jb3BpZXJcIjtcbmltcG9ydCB7IGdldFN0cmVhbSB9IGZyb20gXCIuL2dldF9zdHJlYW1cIjtcbmltcG9ydCB7IGNvbXBpbGUgfSBmcm9tIFwiQHNlbGZhZ2UvY2xpL2J1aWxkL2NvbXBpbGVyXCI7XG5cbi8vIEV4cG9ydCBhcyBhIGNvbW1vbmpzIG1vZHVsZS5cbmxldCBURU1QX0RFQ0xBUkFUSU9OX0ZJTEVfQ09OVEVOVF9URU1QTEFURSA9IGBcbmRlY2xhcmUgbW9kdWxlIFwiKntleHR9XCIge1xuICAgbGV0IHBhdGg6IHN0cmluZztcbiAgIGV4cG9ydCA9IHBhdGg7XG59XG5gO1xuXG5sZXQgQVNTRVRfRVhUX0RFQ0xBUkFUSU9OX0ZJTEUgPSBgc2VsZmFnZV9hc3NldF9leHRzX2RlY2xhcmF0aW9uLmQudHNgO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbW1vbkJ1bmRsZU9wdGlvbnMge1xuICB0c2NvbmZpZ0ZpbGU/OiBzdHJpbmc7XG4gIGV4dHJhRmlsZXM/OiBBcnJheTxzdHJpbmc+O1xuICBpbmxpbmVKcz86IEFycmF5PHN0cmluZz47XG4gIGFzc2V0RXh0cz86IEFycmF5PHN0cmluZz47XG4gIHBhY2thZ2VKc29uRmlsZT86IHN0cmluZztcbiAgc2tpcE1pbmlmeT86IGJvb2xlYW47XG4gIGRlYnVnPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1bmRsZUZvck5vZGUoXG4gIHNvdXJjZUZpbGU6IHN0cmluZyxcbiAgb3V0cHV0RmlsZTogc3RyaW5nLFxuICBmcm9tRGlyID0gXCIuXCIsXG4gIHRvRGlyID0gZnJvbURpcixcbiAgb3B0aW9ucz86IENvbW1vbkJ1bmRsZU9wdGlvbnMsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgbGV0IGFzc2V0RmlsZXMgPSBhd2FpdCBidW5kbGVGb3JOb2RlUmV0dXJuQXNzZXRGaWxlcyhcbiAgICBzb3VyY2VGaWxlLFxuICAgIG91dHB1dEZpbGUsXG4gICAgb3B0aW9ucyxcbiAgKTtcblxuICBpZiAocGF0aC5wb3NpeC5ub3JtYWxpemUoZnJvbURpcikgPT09IHBhdGgucG9zaXgubm9ybWFsaXplKHRvRGlyKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBhd2FpdCBjb3B5RmlsZXMoXG4gICAgW3N0cmlwRmlsZUV4dGVuc2lvbihvdXRwdXRGaWxlKSArIFwiLmpzXCIsIC4uLmFzc2V0RmlsZXNdLFxuICAgIGZyb21EaXIsXG4gICAgdG9EaXIsXG4gICk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidW5kbGVGb3JOb2RlUmV0dXJuQXNzZXRGaWxlcyhcbiAgc291cmNlRmlsZTogc3RyaW5nLFxuICBvdXRwdXRGaWxlOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiBDb21tb25CdW5kbGVPcHRpb25zLFxuKTogUHJvbWlzZTxBcnJheTxzdHJpbmc+PiB7XG4gIGxldCBiYXNlRGlyID0gcGF0aC5wb3NpeC5kaXJuYW1lKG91dHB1dEZpbGUpO1xuICByZXR1cm4gYXdhaXQgYnVuZGxlKHNvdXJjZUZpbGUsIG91dHB1dEZpbGUsIGJhc2VEaXIsIHRydWUsIGZhbHNlLCBvcHRpb25zKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1bmRsZUZvckJyb3dzZXIoXG4gIHNvdXJjZUZpbGU6IHN0cmluZyxcbiAgb3V0cHV0RmlsZTogc3RyaW5nLFxuICBiYXNlRGlyID0gXCIuXCIsXG4gIG91dERpciA9IGJhc2VEaXIsXG4gIG9wdGlvbnM/OiBDb21tb25CdW5kbGVPcHRpb25zLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGxldCBhc3NldEZpbGVzID0gYXdhaXQgYnVuZGxlRm9yQnJvd3NlclJldHVybkFzc2V0RmlsZXMoXG4gICAgc291cmNlRmlsZSxcbiAgICBvdXRwdXRGaWxlLFxuICAgIGJhc2VEaXIsXG4gICAgb3B0aW9ucyxcbiAgKTtcblxuICBpZiAocGF0aC5wb3NpeC5ub3JtYWxpemUoYmFzZURpcikgPT09IHBhdGgucG9zaXgubm9ybWFsaXplKG91dERpcikpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgYXdhaXQgY29weUZpbGVzKFxuICAgIFtzdHJpcEZpbGVFeHRlbnNpb24ob3V0cHV0RmlsZSkgKyBcIi5qc1wiLCAuLi5hc3NldEZpbGVzXSxcbiAgICBiYXNlRGlyLFxuICAgIG91dERpcixcbiAgKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1bmRsZUZvckJyb3dzZXJSZXR1cm5Bc3NldEZpbGVzKFxuICBzb3VyY2VGaWxlOiBzdHJpbmcsXG4gIG91dHB1dEZpbGU6IHN0cmluZyxcbiAgYmFzZURpciA9IFwiLlwiLFxuICBvcHRpb25zPzogQ29tbW9uQnVuZGxlT3B0aW9ucyxcbik6IFByb21pc2U8QXJyYXk8c3RyaW5nPj4ge1xuICByZXR1cm4gYnVuZGxlKHNvdXJjZUZpbGUsIG91dHB1dEZpbGUsIGJhc2VEaXIsIGZhbHNlLCB0cnVlLCBvcHRpb25zKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1bmRsZShcbiAgc291cmNlRmlsZTogc3RyaW5nLFxuICBvdXRwdXRGaWxlOiBzdHJpbmcsXG4gIGJhc2VEaXI6IHN0cmluZyxcbiAgaW5Ob2RlOiBib29sZWFuLFxuICBidW5kbGVFeHRlcm5hbDogYm9vbGVhbixcbiAgb3B0aW9uczogQ29tbW9uQnVuZGxlT3B0aW9ucyA9IHt9LFxuKTogUHJvbWlzZTxBcnJheTxzdHJpbmc+PiB7XG4gIGxldCBhc3NldEV4dHM6IEFycmF5PHN0cmluZz47XG4gIGlmIChvcHRpb25zLmFzc2V0RXh0cykge1xuICAgIGFzc2V0RXh0cyA9IG9wdGlvbnMuYXNzZXRFeHRzO1xuICB9IGVsc2Uge1xuICAgIGxldCBwYWNrYWdlSnNvbkZpbGUgPSBvcHRpb25zLnBhY2thZ2VKc29uRmlsZSA/PyBcIi4vcGFja2FnZS5qc29uXCI7XG4gICAgYXNzZXRFeHRzID0gSlNPTi5wYXJzZShcbiAgICAgIChhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYWNrYWdlSnNvbkZpbGUpKS50b1N0cmluZygpLFxuICAgICkuYXNzZXRFeHRzO1xuICB9XG5cbiAgaWYgKCFhc3NldEV4dHMpIHtcbiAgICBhd2FpdCBjb21waWxlKHNvdXJjZUZpbGUsIG9wdGlvbnMudHNjb25maWdGaWxlLCBvcHRpb25zLmV4dHJhRmlsZXMpO1xuICB9IGVsc2Uge1xuICAgIGF3YWl0IGNvbXBpbGVXaXRoQXNzZXRzKFxuICAgICAgc291cmNlRmlsZSxcbiAgICAgIGFzc2V0RXh0cyxcbiAgICAgIG9wdGlvbnMuZXh0cmFGaWxlcyxcbiAgICAgIG9wdGlvbnMudHNjb25maWdGaWxlLFxuICAgICk7XG4gIH1cblxuICB0cnkge1xuICAgIGF3YWl0IGZzLnByb21pc2VzLnN0YXQoYmFzZURpcik7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBlLm1lc3NhZ2UgPSBcIkJhc2UgZGlyZWN0b3J5IG5lZWRzIHRvIGJlIGEgdmFsaWQgZGlyZWN0b3J5LiBcIiArIGUubWVzc2FnZTtcbiAgICB0aHJvdyBlO1xuICB9XG4gIGxldCBlbnRyaWVzVG9CZUJyb3dzZXJpZmllZCA9IG5ldyBBcnJheTxzdHJpbmcgfCBzdHJlYW0uUmVhZGFibGU+KCk7XG4gIGlmIChvcHRpb25zLmlubGluZUpzKSB7XG4gICAgZW50cmllc1RvQmVCcm93c2VyaWZpZWQucHVzaChcbiAgICAgIC4uLm9wdGlvbnMuaW5saW5lSnMubWFwKChqc0NvZGUpID0+IHtcbiAgICAgICAgcmV0dXJuIHN0cmVhbS5SZWFkYWJsZS5mcm9tKFtqc0NvZGVdKTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cbiAgaWYgKG9wdGlvbnMuZXh0cmFGaWxlcykge1xuICAgIC8vIElmIGV4aXN0cywgcHV0IHRoZW0gYmVmb3JlIHRoZSBtYWluIGZpbGUgc3VjaCB0aGF0IHZhcmlhYmxlcyB3aWxsIGJlXG4gICAgLy8gZGVmaW5lZCBhbmQgZnVuY3Rpb25zIHdpbGwgYmUgY2FsbGVkIGJlZm9yZSBleGVjdXRpbmcgdGhlIG1haW4gZmlsZS5cbiAgICBmb3IgKGxldCBleHRyYUZpbGUgb2Ygb3B0aW9ucy5leHRyYUZpbGVzKSB7XG4gICAgICBlbnRyaWVzVG9CZUJyb3dzZXJpZmllZC5wdXNoKFxuICAgICAgICBwYXRoLnBvc2l4LnJlbGF0aXZlKGJhc2VEaXIsIHN0cmlwRmlsZUV4dGVuc2lvbihleHRyYUZpbGUpICsgXCIuanNcIiksXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBlbnRyaWVzVG9CZUJyb3dzZXJpZmllZC5wdXNoKFxuICAgIHBhdGgucG9zaXgucmVsYXRpdmUoYmFzZURpciwgc3RyaXBGaWxlRXh0ZW5zaW9uKHNvdXJjZUZpbGUpICsgXCIuanNcIiksXG4gICk7XG4gIGxldCBicm93c2VyaWZ5SGFuZGxlciA9IGJyb3dzZXJpZnlDb25zdHJ1Y3RvcihlbnRyaWVzVG9CZUJyb3dzZXJpZmllZCwge1xuICAgIG5vZGU6IGluTm9kZSxcbiAgICBidW5kbGVFeHRlcm5hbDogYnVuZGxlRXh0ZXJuYWwsXG4gICAgYmFzZWRpcjogYmFzZURpcixcbiAgICBkZWJ1Zzogb3B0aW9ucy5kZWJ1ZyxcbiAgfSk7XG4gIGxldCBvdXRwdXRBc3NldEZpbGVzID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgYnJvd3NlcmlmeUhhbmRsZXIudHJhbnNmb3JtKChmaWxlKSA9PiB7XG4gICAgaWYgKGFzc2V0RXh0cyAmJiBhc3NldEV4dHMuaW5jbHVkZXMocGF0aC5wb3NpeC5leHRuYW1lKGZpbGUpKSkge1xuICAgICAgcmV0dXJuIG5ldyBBc3NldFRyYW5zZm9ybWVyKGZpbGUsIG91dHB1dEFzc2V0RmlsZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IHN0cmVhbS5QYXNzVGhyb3VnaCgpO1xuICAgIH1cbiAgfSk7XG4gIGxldCBidW5kbGVkQ29kZSA9IGF3YWl0IGdldFN0cmVhbShicm93c2VyaWZ5SGFuZGxlci5idW5kbGUoKSk7XG5cbiAgbGV0IG91dHB1dENvZGU6IHN0cmluZztcbiAgaWYgKG9wdGlvbnMuc2tpcE1pbmlmeSkge1xuICAgIG91dHB1dENvZGUgPSBidW5kbGVkQ29kZTtcbiAgfSBlbHNlIHtcbiAgICBsZXQgbWluaWZ5T3B0aW9uczogVWdsaWZ5SlMuTWluaWZ5T3B0aW9ucyA9IHt9O1xuICAgIGlmIChvcHRpb25zLmRlYnVnKSB7XG4gICAgICBtaW5pZnlPcHRpb25zLnNvdXJjZU1hcCA9IHtcbiAgICAgICAgY29udGVudDogXCJpbmxpbmVcIixcbiAgICAgICAgaW5jbHVkZVNvdXJjZXM6IHRydWUsXG4gICAgICAgIHVybDogXCJpbmxpbmVcIixcbiAgICAgIH07XG4gICAgfVxuICAgIGxldCBtaW5pZmllZFJlcyA9IFVnbGlmeUpTLm1pbmlmeShidW5kbGVkQ29kZSwgbWluaWZ5T3B0aW9ucyk7XG4gICAgaWYgKG1pbmlmaWVkUmVzLmVycm9yKSB7XG4gICAgICB0aHJvdyBtaW5pZmllZFJlcy5lcnJvcjtcbiAgICB9XG4gICAgb3V0cHV0Q29kZSA9IG1pbmlmaWVkUmVzLmNvZGU7XG4gIH1cblxuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoXG4gICAgc3RyaXBGaWxlRXh0ZW5zaW9uKG91dHB1dEZpbGUpICsgXCIuanNcIixcbiAgICBvdXRwdXRDb2RlLFxuICApO1xuICByZXR1cm4gb3V0cHV0QXNzZXRGaWxlcztcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29tcGlsZVdpdGhBc3NldHMoXG4gIHNvdXJjZUZpbGU6IHN0cmluZyxcbiAgYXNzZXRFeHRzOiBBcnJheTxzdHJpbmc+LFxuICBleHRyYUZpbGVzOiBBcnJheTxzdHJpbmc+ID0gW10sXG4gIHRzY29uZmlnRmlsZT86IHN0cmluZyxcbik6IFByb21pc2U8dm9pZD4ge1xuICBsZXQgdGVtcEZpbGVDb250ZW50ID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgZm9yIChsZXQgZXh0IG9mIGFzc2V0RXh0cykge1xuICAgIHRlbXBGaWxlQ29udGVudC5wdXNoKFxuICAgICAgVEVNUF9ERUNMQVJBVElPTl9GSUxFX0NPTlRFTlRfVEVNUExBVEUucmVwbGFjZShcIntleHR9XCIsIGV4dCksXG4gICAgKTtcbiAgfVxuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoXG4gICAgQVNTRVRfRVhUX0RFQ0xBUkFUSU9OX0ZJTEUsXG4gICAgdGVtcEZpbGVDb250ZW50LmpvaW4oXCJcIiksXG4gICk7XG4gIGF3YWl0IGNvbXBpbGUoc291cmNlRmlsZSwgdHNjb25maWdGaWxlLCBbXG4gICAgQVNTRVRfRVhUX0RFQ0xBUkFUSU9OX0ZJTEUsXG4gICAgLi4uZXh0cmFGaWxlcyxcbiAgXSk7XG59XG5cbmNsYXNzIEFzc2V0VHJhbnNmb3JtZXIgZXh0ZW5kcyBzdHJlYW0uVHJhbnNmb3JtIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYWJzb2x1dGVGaWxlOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBvdXRwdXRBc3NldEZpbGVQYXRoczogQXJyYXk8c3RyaW5nPixcbiAgKSB7XG4gICAgc3VwZXIoe1xuICAgICAgdHJhbnNmb3JtOiAoY2h1bmssIGVuY29kaW5nLCBjYWxsYmFjaykgPT4ge1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgfSxcbiAgICAgIGZsdXNoOiAoY2FsbGJhY2spID0+IHtcbiAgICAgICAgbGV0IHJlbGF0aXZlUGF0aCA9IHBhdGgucG9zaXgucmVsYXRpdmUoXCIuXCIsIHRoaXMuYWJzb2x1dGVGaWxlKTtcbiAgICAgICAgdGhpcy5vdXRwdXRBc3NldEZpbGVQYXRocy5wdXNoKHJlbGF0aXZlUGF0aCk7XG4gICAgICAgIGNhbGxiYWNrKFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAvLyBfX2ZpbGVuYW1lIHdpbGwgYmUgdHJhbnNmb3JtZWQgbGF0ZXIgYnkgQnJvd3NlcmlmeS5cbiAgICAgICAgICBgbW9kdWxlLmV4cG9ydHMgPSBfX2ZpbGVuYW1lO2AsXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG4iXX0=