UNPKG

@selfage/bundler_cli

Version:

CLI for bundling and running bundled frontend or backend TypeScript files.

149 lines 21.9 kB
"use strict"; 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=