UNPKG

@selfage/bundler_cli

Version:

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

152 lines 22.3 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.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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImJ1bmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUE4QkEsc0NBcUJDO0FBRUQsc0VBT0M7QUFFRCw0Q0FzQkM7QUFFRCw0RUFPQztBQUVELHdCQWtHQztBQWpNRCxvREFBcUQ7QUFDckQseUJBQTBCO0FBQzFCLDZCQUE4QjtBQUM5QixpQ0FBa0M7QUFDbEMsc0NBQXVDO0FBQ3ZDLHVFQUErRDtBQUMvRCxpREFBZ0Q7QUFDaEQsNkNBQXlDO0FBQ3pDLDBEQUFzRDtBQUV0RCwrQkFBK0I7QUFDL0IsSUFBSSxzQ0FBc0MsR0FBRzs7Ozs7Q0FLNUMsQ0FBQztBQUVGLElBQUksMEJBQTBCLEdBQUcscUNBQXFDLENBQUM7QUFZaEUsS0FBSyxVQUFVLGFBQWEsQ0FDakMsVUFBa0IsRUFDbEIsVUFBa0IsRUFDbEIsT0FBTyxHQUFHLEdBQUcsRUFDYixLQUFLLEdBQUcsT0FBTyxFQUNmLE9BQTZCO0lBRTdCLElBQUksVUFBVSxHQUFHLE1BQU0sNkJBQTZCLENBQ2xELFVBQVUsRUFDVixVQUFVLEVBQ1YsT0FBTyxDQUNSLENBQUM7SUFFRixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbEUsT0FBTztJQUNULENBQUM7SUFDRCxNQUFNLElBQUEsNkJBQWMsRUFDbEIsQ0FBQyxJQUFBLDRDQUFrQixFQUFDLFVBQVUsQ0FBQyxHQUFHLEtBQUssRUFBRSxHQUFHLFVBQVUsQ0FBQyxFQUN2RCxPQUFPLEVBQ1AsS0FBSyxDQUNOLENBQUM7QUFDSixDQUFDO0FBRU0sS0FBSyxVQUFVLDZCQUE2QixDQUNqRCxVQUFrQixFQUNsQixVQUFrQixFQUNsQixPQUE2QjtJQUU3QixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM3QyxPQUFPLE1BQU0sTUFBTSxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDN0UsQ0FBQztBQUVNLEtBQUssVUFBVSxnQkFBZ0IsQ0FDcEMsVUFBa0IsRUFDbEIsVUFBa0IsRUFDbEIsT0FBTyxHQUFHLEdBQUcsRUFDYixNQUFNLEdBQUcsT0FBTyxFQUNoQixPQUE2QjtJQUU3QixJQUFJLFVBQVUsR0FBRyxNQUFNLGdDQUFnQyxDQUNyRCxVQUFVLEVBQ1YsVUFBVSxFQUNWLE9BQU8sRUFDUCxPQUFPLENBQ1IsQ0FBQztJQUVGLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNuRSxPQUFPO0lBQ1QsQ0FBQztJQUNELE1BQU0sSUFBQSw2QkFBYyxFQUNsQixDQUFDLElBQUEsNENBQWtCLEVBQUMsVUFBVSxDQUFDLEdBQUcsS0FBSyxFQUFFLEdBQUcsVUFBVSxDQUFDLEVBQ3ZELE9BQU8sRUFDUCxNQUFNLENBQ1AsQ0FBQztBQUNKLENBQUM7QUFFTSxLQUFLLFVBQVUsZ0NBQWdDLENBQ3BELFVBQWtCLEVBQ2xCLFVBQWtCLEVBQ2xCLE9BQU8sR0FBRyxHQUFHLEVBQ2IsT0FBNkI7SUFFN0IsT0FBTyxNQUFNLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN2RSxDQUFDO0FBRU0sS0FBSyxVQUFVLE1BQU0sQ0FDMUIsVUFBa0IsRUFDbEIsVUFBa0IsRUFDbEIsT0FBZSxFQUNmLE1BQWUsRUFDZixjQUF1QixFQUN2QixVQUErQixFQUFFO0lBRWpDLElBQUksU0FBd0IsQ0FBQztJQUM3QixJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUN0QixTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQztJQUNoQyxDQUFDO1NBQU0sQ0FBQztRQUNOLElBQUksZUFBZSxHQUFHLE9BQU8sQ0FBQyxlQUFlLElBQUksZ0JBQWdCLENBQUM7UUFDbEUsU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQ3BCLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUN6RCxDQUFDLFNBQVMsQ0FBQztJQUNkLENBQUM7SUFFRCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDZixNQUFNLElBQUEsa0JBQU8sRUFBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDdEUsQ0FBQztTQUFNLENBQUM7UUFDTixNQUFNLGlCQUFpQixDQUNyQixVQUFVLEVBQ1YsU0FBUyxFQUNULE9BQU8sQ0FBQyxVQUFVLEVBQ2xCLE9BQU8sQ0FBQyxZQUFZLENBQ3JCLENBQUM7SUFDSixDQUFDO0lBRUQsSUFBSSxDQUFDO1FBQ0gsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNYLENBQUMsQ0FBQyxPQUFPLEdBQUcsZ0RBQWdELEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUN6RSxNQUFNLENBQUMsQ0FBQztJQUNWLENBQUM7SUFDRCxJQUFJLHVCQUF1QixHQUFHLElBQUksS0FBSyxFQUE0QixDQUFDO0lBQ3BFLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3JCLHVCQUF1QixDQUFDLElBQUksQ0FDMUIsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ2pDLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDdkIsdUVBQXVFO1FBQ3ZFLHVFQUF1RTtRQUN2RSxLQUFLLElBQUksU0FBUyxJQUFJLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN6Qyx1QkFBdUIsQ0FBQyxJQUFJLENBQzFCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxJQUFBLDRDQUFrQixFQUFDLFNBQVMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUNwRSxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFDRCx1QkFBdUIsQ0FBQyxJQUFJLENBQzFCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxJQUFBLDRDQUFrQixFQUFDLFVBQVUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUNyRSxDQUFDO0lBQ0YsSUFBSSxpQkFBaUIsR0FBRyxxQkFBcUIsQ0FBQyx1QkFBdUIsRUFBRTtRQUNyRSxJQUFJLEVBQUUsTUFBTTtRQUNaLGNBQWMsRUFBRSxjQUFjO1FBQzlCLE9BQU8sRUFBRSxPQUFPO1FBQ2hCLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztLQUNyQixDQUFDLENBQUM7SUFDSCxJQUFJLGdCQUFnQixHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7SUFDM0MsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDbkMsSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDOUQsT0FBTyxJQUFJLGdCQUFnQixDQUFDLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3RELENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxJQUFJLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNsQyxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDSCxJQUFJLFdBQVcsR0FBRyxNQUFNLElBQUEsc0JBQVMsRUFBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBRTlELElBQUksVUFBa0IsQ0FBQztJQUN2QixJQUFJLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN2QixVQUFVLEdBQUcsV0FBVyxDQUFDO0lBQzNCLENBQUM7U0FBTSxDQUFDO1FBQ04sSUFBSSxhQUFhLEdBQTJCLEVBQUUsQ0FBQztRQUMvQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNsQixhQUFhLENBQUMsU0FBUyxHQUFHO2dCQUN4QixPQUFPLEVBQUUsUUFBUTtnQkFDakIsY0FBYyxFQUFFLElBQUk7Z0JBQ3BCLEdBQUcsRUFBRSxRQUFRO2FBQ2QsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLFdBQVcsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUM5RCxJQUFJLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN0QixNQUFNLFdBQVcsQ0FBQyxLQUFLLENBQUM7UUFDMUIsQ0FBQztRQUNELFVBQVUsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFO1FBQ3RELFNBQVMsRUFBRSxJQUFJO0tBQ2hCLENBQUMsQ0FBQztJQUNILE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQ3pCLElBQUEsNENBQWtCLEVBQUMsVUFBVSxDQUFDLEdBQUcsS0FBSyxFQUN0QyxVQUFVLENBQ1gsQ0FBQztJQUNGLE9BQU8sZ0JBQWdCLENBQUM7QUFDMUIsQ0FBQztBQUVELEtBQUssVUFBVSxpQkFBaUIsQ0FDOUIsVUFBa0IsRUFDbEIsU0FBd0IsRUFDeEIsYUFBNEIsRUFBRSxFQUM5QixZQUFxQjtJQUVyQixJQUFJLGVBQWUsR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO0lBQzFDLEtBQUssSUFBSSxHQUFHLElBQUksU0FBUyxFQUFFLENBQUM7UUFDMUIsZUFBZSxDQUFDLElBQUksQ0FDbEIsc0NBQXNDLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FDN0QsQ0FBQztJQUNKLENBQUM7SUFDRCxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUN6QiwwQkFBMEIsRUFDMUIsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FDekIsQ0FBQztJQUNGLE1BQU0sSUFBQSxrQkFBTyxFQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUU7UUFDdEMsMEJBQTBCO1FBQzFCLEdBQUcsVUFBVTtLQUNkLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxNQUFNLGdCQUFpQixTQUFRLE1BQU0sQ0FBQyxTQUFTO0lBQzdDLFlBQ1UsWUFBb0IsRUFDcEIsb0JBQW1DO1FBRTNDLEtBQUssQ0FBQztZQUNKLFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEVBQUU7Z0JBQ3ZDLFFBQVEsRUFBRSxDQUFDO1lBQ2IsQ0FBQztZQUNELEtBQUssRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFO2dCQUNsQixJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUMvRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUM3QyxRQUFRLENBQ04sU0FBUztnQkFDVCxzREFBc0Q7Z0JBQ3RELDhCQUE4QixDQUMvQixDQUFDO1lBQ0osQ0FBQztTQUNGLENBQUMsQ0FBQztRQWhCSyxpQkFBWSxHQUFaLFlBQVksQ0FBUTtRQUNwQix5QkFBb0IsR0FBcEIsb0JBQW9CLENBQWU7SUFnQjdDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBicm93c2VyaWZ5Q29uc3RydWN0b3IgPSByZXF1aXJlKFwiYnJvd3NlcmlmeVwiKTtcbmltcG9ydCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcbmltcG9ydCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG5pbXBvcnQgc3RyZWFtID0gcmVxdWlyZShcInN0cmVhbVwiKTtcbmltcG9ydCBVZ2xpZnlKUyA9IHJlcXVpcmUoXCJ1Z2xpZnktanNcIik7XG5pbXBvcnQgeyBzdHJpcEZpbGVFeHRlbnNpb24gfSBmcm9tIFwiLi9maWxlX2V4dGVuc2lvbl9zdHJpcHBlclwiO1xuaW1wb3J0IHsgY29weUZpbGVzVG9EaXIgfSBmcm9tIFwiLi9maWxlc19jb3BpZXJcIjtcbmltcG9ydCB7IGdldFN0cmVhbSB9IGZyb20gXCIuL2dldF9zdHJlYW1cIjtcbmltcG9ydCB7IGNvbXBpbGUgfSBmcm9tIFwiQHNlbGZhZ2UvY2xpL2J1aWxkL2NvbXBpbGVyXCI7XG5cbi8vIEV4cG9ydCBhcyBhIGNvbW1vbmpzIG1vZHVsZS5cbmxldCBURU1QX0RFQ0xBUkFUSU9OX0ZJTEVfQ09OVEVOVF9URU1QTEFURSA9IGBcbmRlY2xhcmUgbW9kdWxlIFwiKntleHR9XCIge1xuICAgbGV0IHBhdGg6IHN0cmluZztcbiAgIGV4cG9ydCA9IHBhdGg7XG59XG5gO1xuXG5sZXQgQVNTRVRfRVhUX0RFQ0xBUkFUSU9OX0ZJTEUgPSBgc2VsZmFnZV9hc3NldF9leHRzX2RlY2xhcmF0aW9uLmQudHNgO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbW1vbkJ1bmRsZU9wdGlvbnMge1xuICB0c2NvbmZpZ0ZpbGU/OiBzdHJpbmc7XG4gIGV4dHJhRmlsZXM/OiBBcnJheTxzdHJpbmc+O1xuICBpbmxpbmVKcz86IEFycmF5PHN0cmluZz47XG4gIGFzc2V0RXh0cz86IEFycmF5PHN0cmluZz47XG4gIHBhY2thZ2VKc29uRmlsZT86IHN0cmluZztcbiAgc2tpcE1pbmlmeT86IGJvb2xlYW47XG4gIGRlYnVnPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1bmRsZUZvck5vZGUoXG4gIHNvdXJjZUZpbGU6IHN0cmluZyxcbiAgb3V0cHV0RmlsZTogc3RyaW5nLFxuICBmcm9tRGlyID0gXCIuXCIsXG4gIHRvRGlyID0gZnJvbURpcixcbiAgb3B0aW9ucz86IENvbW1vbkJ1bmRsZU9wdGlvbnMsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgbGV0IGFzc2V0RmlsZXMgPSBhd2FpdCBidW5kbGVGb3JOb2RlUmV0dXJuQXNzZXRGaWxlcyhcbiAgICBzb3VyY2VGaWxlLFxuICAgIG91dHB1dEZpbGUsXG4gICAgb3B0aW9ucyxcbiAgKTtcblxuICBpZiAocGF0aC5wb3NpeC5ub3JtYWxpemUoZnJvbURpcikgPT09IHBhdGgucG9zaXgubm9ybWFsaXplKHRvRGlyKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBhd2FpdCBjb3B5RmlsZXNUb0RpcihcbiAgICBbc3RyaXBGaWxlRXh0ZW5zaW9uKG91dHB1dEZpbGUpICsgXCIuanNcIiwgLi4uYXNzZXRGaWxlc10sXG4gICAgZnJvbURpcixcbiAgICB0b0RpcixcbiAgKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1bmRsZUZvck5vZGVSZXR1cm5Bc3NldEZpbGVzKFxuICBzb3VyY2VGaWxlOiBzdHJpbmcsXG4gIG91dHB1dEZpbGU6IHN0cmluZyxcbiAgb3B0aW9ucz86IENvbW1vbkJ1bmRsZU9wdGlvbnMsXG4pOiBQcm9taXNlPEFycmF5PHN0cmluZz4+IHtcbiAgbGV0IGJhc2VEaXIgPSBwYXRoLnBvc2l4LmRpcm5hbWUob3V0cHV0RmlsZSk7XG4gIHJldHVybiBhd2FpdCBidW5kbGUoc291cmNlRmlsZSwgb3V0cHV0RmlsZSwgYmFzZURpciwgdHJ1ZSwgZmFsc2UsIG9wdGlvbnMpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVuZGxlRm9yQnJvd3NlcihcbiAgc291cmNlRmlsZTogc3RyaW5nLFxuICBvdXRwdXRGaWxlOiBzdHJpbmcsXG4gIGJhc2VEaXIgPSBcIi5cIixcbiAgb3V0RGlyID0gYmFzZURpcixcbiAgb3B0aW9ucz86IENvbW1vbkJ1bmRsZU9wdGlvbnMsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgbGV0IGFzc2V0RmlsZXMgPSBhd2FpdCBidW5kbGVGb3JCcm93c2VyUmV0dXJuQXNzZXRGaWxlcyhcbiAgICBzb3VyY2VGaWxlLFxuICAgIG91dHB1dEZpbGUsXG4gICAgYmFzZURpcixcbiAgICBvcHRpb25zLFxuICApO1xuXG4gIGlmIChwYXRoLnBvc2l4Lm5vcm1hbGl6ZShiYXNlRGlyKSA9PT0gcGF0aC5wb3NpeC5ub3JtYWxpemUob3V0RGlyKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBhd2FpdCBjb3B5RmlsZXNUb0RpcihcbiAgICBbc3RyaXBGaWxlRXh0ZW5zaW9uKG91dHB1dEZpbGUpICsgXCIuanNcIiwgLi4uYXNzZXRGaWxlc10sXG4gICAgYmFzZURpcixcbiAgICBvdXREaXIsXG4gICk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidW5kbGVGb3JCcm93c2VyUmV0dXJuQXNzZXRGaWxlcyhcbiAgc291cmNlRmlsZTogc3RyaW5nLFxuICBvdXRwdXRGaWxlOiBzdHJpbmcsXG4gIGJhc2VEaXIgPSBcIi5cIixcbiAgb3B0aW9ucz86IENvbW1vbkJ1bmRsZU9wdGlvbnMsXG4pOiBQcm9taXNlPEFycmF5PHN0cmluZz4+IHtcbiAgcmV0dXJuIGJ1bmRsZShzb3VyY2VGaWxlLCBvdXRwdXRGaWxlLCBiYXNlRGlyLCBmYWxzZSwgdHJ1ZSwgb3B0aW9ucyk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidW5kbGUoXG4gIHNvdXJjZUZpbGU6IHN0cmluZyxcbiAgb3V0cHV0RmlsZTogc3RyaW5nLFxuICBiYXNlRGlyOiBzdHJpbmcsXG4gIGluTm9kZTogYm9vbGVhbixcbiAgYnVuZGxlRXh0ZXJuYWw6IGJvb2xlYW4sXG4gIG9wdGlvbnM6IENvbW1vbkJ1bmRsZU9wdGlvbnMgPSB7fSxcbik6IFByb21pc2U8QXJyYXk8c3RyaW5nPj4ge1xuICBsZXQgYXNzZXRFeHRzOiBBcnJheTxzdHJpbmc+O1xuICBpZiAob3B0aW9ucy5hc3NldEV4dHMpIHtcbiAgICBhc3NldEV4dHMgPSBvcHRpb25zLmFzc2V0RXh0cztcbiAgfSBlbHNlIHtcbiAgICBsZXQgcGFja2FnZUpzb25GaWxlID0gb3B0aW9ucy5wYWNrYWdlSnNvbkZpbGUgPz8gXCIuL3BhY2thZ2UuanNvblwiO1xuICAgIGFzc2V0RXh0cyA9IEpTT04ucGFyc2UoXG4gICAgICAoYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGFja2FnZUpzb25GaWxlKSkudG9TdHJpbmcoKSxcbiAgICApLmFzc2V0RXh0cztcbiAgfVxuXG4gIGlmICghYXNzZXRFeHRzKSB7XG4gICAgYXdhaXQgY29tcGlsZShzb3VyY2VGaWxlLCBvcHRpb25zLnRzY29uZmlnRmlsZSwgb3B0aW9ucy5leHRyYUZpbGVzKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBjb21waWxlV2l0aEFzc2V0cyhcbiAgICAgIHNvdXJjZUZpbGUsXG4gICAgICBhc3NldEV4dHMsXG4gICAgICBvcHRpb25zLmV4dHJhRmlsZXMsXG4gICAgICBvcHRpb25zLnRzY29uZmlnRmlsZSxcbiAgICApO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KGJhc2VEaXIpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgZS5tZXNzYWdlID0gXCJCYXNlIGRpcmVjdG9yeSBuZWVkcyB0byBiZSBhIHZhbGlkIGRpcmVjdG9yeS4gXCIgKyBlLm1lc3NhZ2U7XG4gICAgdGhyb3cgZTtcbiAgfVxuICBsZXQgZW50cmllc1RvQmVCcm93c2VyaWZpZWQgPSBuZXcgQXJyYXk8c3RyaW5nIHwgc3RyZWFtLlJlYWRhYmxlPigpO1xuICBpZiAob3B0aW9ucy5pbmxpbmVKcykge1xuICAgIGVudHJpZXNUb0JlQnJvd3NlcmlmaWVkLnB1c2goXG4gICAgICAuLi5vcHRpb25zLmlubGluZUpzLm1hcCgoanNDb2RlKSA9PiB7XG4gICAgICAgIHJldHVybiBzdHJlYW0uUmVhZGFibGUuZnJvbShbanNDb2RlXSk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG4gIGlmIChvcHRpb25zLmV4dHJhRmlsZXMpIHtcbiAgICAvLyBJZiBleGlzdHMsIHB1dCB0aGVtIGJlZm9yZSB0aGUgbWFpbiBmaWxlIHN1Y2ggdGhhdCB2YXJpYWJsZXMgd2lsbCBiZVxuICAgIC8vIGRlZmluZWQgYW5kIGZ1bmN0aW9ucyB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgZXhlY3V0aW5nIHRoZSBtYWluIGZpbGUuXG4gICAgZm9yIChsZXQgZXh0cmFGaWxlIG9mIG9wdGlvbnMuZXh0cmFGaWxlcykge1xuICAgICAgZW50cmllc1RvQmVCcm93c2VyaWZpZWQucHVzaChcbiAgICAgICAgcGF0aC5wb3NpeC5yZWxhdGl2ZShiYXNlRGlyLCBzdHJpcEZpbGVFeHRlbnNpb24oZXh0cmFGaWxlKSArIFwiLmpzXCIpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgZW50cmllc1RvQmVCcm93c2VyaWZpZWQucHVzaChcbiAgICBwYXRoLnBvc2l4LnJlbGF0aXZlKGJhc2VEaXIsIHN0cmlwRmlsZUV4dGVuc2lvbihzb3VyY2VGaWxlKSArIFwiLmpzXCIpLFxuICApO1xuICBsZXQgYnJvd3NlcmlmeUhhbmRsZXIgPSBicm93c2VyaWZ5Q29uc3RydWN0b3IoZW50cmllc1RvQmVCcm93c2VyaWZpZWQsIHtcbiAgICBub2RlOiBpbk5vZGUsXG4gICAgYnVuZGxlRXh0ZXJuYWw6IGJ1bmRsZUV4dGVybmFsLFxuICAgIGJhc2VkaXI6IGJhc2VEaXIsXG4gICAgZGVidWc6IG9wdGlvbnMuZGVidWcsXG4gIH0pO1xuICBsZXQgb3V0cHV0QXNzZXRGaWxlcyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gIGJyb3dzZXJpZnlIYW5kbGVyLnRyYW5zZm9ybSgoZmlsZSkgPT4ge1xuICAgIGlmIChhc3NldEV4dHMgJiYgYXNzZXRFeHRzLmluY2x1ZGVzKHBhdGgucG9zaXguZXh0bmFtZShmaWxlKSkpIHtcbiAgICAgIHJldHVybiBuZXcgQXNzZXRUcmFuc2Zvcm1lcihmaWxlLCBvdXRwdXRBc3NldEZpbGVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBzdHJlYW0uUGFzc1Rocm91Z2goKTtcbiAgICB9XG4gIH0pO1xuICBsZXQgYnVuZGxlZENvZGUgPSBhd2FpdCBnZXRTdHJlYW0oYnJvd3NlcmlmeUhhbmRsZXIuYnVuZGxlKCkpO1xuXG4gIGxldCBvdXRwdXRDb2RlOiBzdHJpbmc7XG4gIGlmIChvcHRpb25zLnNraXBNaW5pZnkpIHtcbiAgICBvdXRwdXRDb2RlID0gYnVuZGxlZENvZGU7XG4gIH0gZWxzZSB7XG4gICAgbGV0IG1pbmlmeU9wdGlvbnM6IFVnbGlmeUpTLk1pbmlmeU9wdGlvbnMgPSB7fTtcbiAgICBpZiAob3B0aW9ucy5kZWJ1Zykge1xuICAgICAgbWluaWZ5T3B0aW9ucy5zb3VyY2VNYXAgPSB7XG4gICAgICAgIGNvbnRlbnQ6IFwiaW5saW5lXCIsXG4gICAgICAgIGluY2x1ZGVTb3VyY2VzOiB0cnVlLFxuICAgICAgICB1cmw6IFwiaW5saW5lXCIsXG4gICAgICB9O1xuICAgIH1cbiAgICBsZXQgbWluaWZpZWRSZXMgPSBVZ2xpZnlKUy5taW5pZnkoYnVuZGxlZENvZGUsIG1pbmlmeU9wdGlvbnMpO1xuICAgIGlmIChtaW5pZmllZFJlcy5lcnJvcikge1xuICAgICAgdGhyb3cgbWluaWZpZWRSZXMuZXJyb3I7XG4gICAgfVxuICAgIG91dHB1dENvZGUgPSBtaW5pZmllZFJlcy5jb2RlO1xuICB9XG5cbiAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIocGF0aC5wb3NpeC5kaXJuYW1lKG91dHB1dEZpbGUpLCB7XG4gICAgcmVjdXJzaXZlOiB0cnVlLFxuICB9KTtcbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKFxuICAgIHN0cmlwRmlsZUV4dGVuc2lvbihvdXRwdXRGaWxlKSArIFwiLmpzXCIsXG4gICAgb3V0cHV0Q29kZSxcbiAgKTtcbiAgcmV0dXJuIG91dHB1dEFzc2V0RmlsZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbXBpbGVXaXRoQXNzZXRzKFxuICBzb3VyY2VGaWxlOiBzdHJpbmcsXG4gIGFzc2V0RXh0czogQXJyYXk8c3RyaW5nPixcbiAgZXh0cmFGaWxlczogQXJyYXk8c3RyaW5nPiA9IFtdLFxuICB0c2NvbmZpZ0ZpbGU/OiBzdHJpbmcsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgbGV0IHRlbXBGaWxlQ29udGVudCA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gIGZvciAobGV0IGV4dCBvZiBhc3NldEV4dHMpIHtcbiAgICB0ZW1wRmlsZUNvbnRlbnQucHVzaChcbiAgICAgIFRFTVBfREVDTEFSQVRJT05fRklMRV9DT05URU5UX1RFTVBMQVRFLnJlcGxhY2UoXCJ7ZXh0fVwiLCBleHQpLFxuICAgICk7XG4gIH1cbiAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKFxuICAgIEFTU0VUX0VYVF9ERUNMQVJBVElPTl9GSUxFLFxuICAgIHRlbXBGaWxlQ29udGVudC5qb2luKFwiXCIpLFxuICApO1xuICBhd2FpdCBjb21waWxlKHNvdXJjZUZpbGUsIHRzY29uZmlnRmlsZSwgW1xuICAgIEFTU0VUX0VYVF9ERUNMQVJBVElPTl9GSUxFLFxuICAgIC4uLmV4dHJhRmlsZXMsXG4gIF0pO1xufVxuXG5jbGFzcyBBc3NldFRyYW5zZm9ybWVyIGV4dGVuZHMgc3RyZWFtLlRyYW5zZm9ybSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGFic29sdXRlRmlsZTogc3RyaW5nLFxuICAgIHByaXZhdGUgb3V0cHV0QXNzZXRGaWxlUGF0aHM6IEFycmF5PHN0cmluZz4sXG4gICkge1xuICAgIHN1cGVyKHtcbiAgICAgIHRyYW5zZm9ybTogKGNodW5rLCBlbmNvZGluZywgY2FsbGJhY2spID0+IHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH0sXG4gICAgICBmbHVzaDogKGNhbGxiYWNrKSA9PiB7XG4gICAgICAgIGxldCByZWxhdGl2ZVBhdGggPSBwYXRoLnBvc2l4LnJlbGF0aXZlKFwiLlwiLCB0aGlzLmFic29sdXRlRmlsZSk7XG4gICAgICAgIHRoaXMub3V0cHV0QXNzZXRGaWxlUGF0aHMucHVzaChyZWxhdGl2ZVBhdGgpO1xuICAgICAgICBjYWxsYmFjayhcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgLy8gX19maWxlbmFtZSB3aWxsIGJlIHRyYW5zZm9ybWVkIGxhdGVyIGJ5IEJyb3dzZXJpZnkuXG4gICAgICAgICAgYG1vZHVsZS5leHBvcnRzID0gX19maWxlbmFtZTtgLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuIl19