UNPKG

lib-tools

Version:

The lib-tools helps you simplify the build, bundle, test and npm packaging workflows for Typescript, JavaScript, Angular library projects and assets module projects.

432 lines 80.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.prepareScripts = void 0; const path = require("path"); const fs_extra_1 = require("fs-extra"); const typescript_1 = require("typescript"); const utils_1 = require("../utils"); const detect_ts_entry_name_1 = require("./detect-ts-entry-name"); const find_build_tsconfig_file_1 = require("./find-build-tsconfig-file"); const read_tsconfig_json_1 = require("./read-tsconfig-json"); const umd_ids_1 = require("./umd-ids"); const parse_ts_json_config_file_content_1 = require("./parse-ts-json-config-file-content"); const to_ts_script_target_1 = require("./to-ts-script-target"); const esmRegExp = /\/?f?esm?(5|20[1-2][0-9])\/?/i; let buildInExternals = null; async function prepareScripts(buildConfig) { var _a, _b; const workspaceRoot = buildConfig._workspaceRoot; const projectRoot = buildConfig._projectRoot; const projectName = buildConfig._projectName; const compilations = []; const bundles = []; let tsConfigPath = null; let tsConfigInfo = null; if (buildConfig.script && buildConfig.script.tsConfig) { tsConfigPath = path.resolve(projectRoot, buildConfig.script.tsConfig); if (!tsConfigPath) { throw new Error(`The tsConfig file ${tsConfigPath} doesn't exist. Please correct value in 'projects[${projectName}].tasks.build.script.tsConfig'.`); } } else if (buildConfig.script) { tsConfigPath = await find_build_tsconfig_file_1.findBuildTsconfigFile(projectRoot, workspaceRoot); } if (tsConfigPath) { const tsConfigJson = read_tsconfig_json_1.readTsconfigJson(tsConfigPath); const tsCompilerConfig = parse_ts_json_config_file_content_1.parseTsJsonConfigFileContent(tsConfigPath); tsConfigInfo = { tsConfigPath, tsConfigJson, tsCompilerConfig }; } let entryName = null; if (buildConfig.script && buildConfig.script.entry) { entryName = utils_1.normalizePath(buildConfig.script.entry).replace(/\.(ts|js)$/i, ''); } else if (tsConfigInfo) { entryName = await detect_ts_entry_name_1.detectTsEntryName(tsConfigInfo, buildConfig._packageNameWithoutScope); } const umdIds = {}; if ((_a = buildConfig.script) === null || _a === void 0 ? void 0 : _a.umdId) { umdIds[buildConfig._packageName] = (_b = buildConfig.script) === null || _b === void 0 ? void 0 : _b.umdId; } else { const normalizedValue = buildConfig._packageName.replace(/\//g, '.'); const umdId = utils_1.dashCaseToCamelCase(normalizedValue); umdIds[buildConfig._packageName] = umdId; } if (buildConfig.script && buildConfig.script.compilations) { if (!tsConfigPath || !tsConfigInfo) { throw new Error(`Typescript configuration file could not be detected automatically. Please set value manually in 'projects[${projectName}].tasks.build.script.tsConfig'.`); } if (!entryName) { throw new Error(`The entry file could not be detected automatically. Please set value manually in 'projects[${projectName}].tasks.build.script.entry'.`); } if (Array.isArray(buildConfig.script.compilations)) { for (const compilation of buildConfig.script.compilations) { const compilationInternal = toScriptCompilationOptionsInternal(compilation, entryName, tsConfigInfo, umdIds, buildConfig); compilations.push(compilationInternal); } } else if (buildConfig.script.compilations === 'auto') { if (tsConfigInfo.tsCompilerConfig.options.target == null || (tsConfigInfo.tsCompilerConfig.options.target && tsConfigInfo.tsCompilerConfig.options.target >= typescript_1.ScriptTarget.ES2015)) { let scriptTargetStr = 'ES2015'; if (tsConfigInfo.tsCompilerConfig.options.target && tsConfigInfo.tsCompilerConfig.options.target >= typescript_1.ScriptTarget.ESNext) { scriptTargetStr = 'ESNext'; } else if (tsConfigInfo.tsCompilerConfig.options.target) { scriptTargetStr = `ES${2013 + tsConfigInfo.tsCompilerConfig.options.target}`; } const esmScriptCompilation = toScriptCompilationOptionsInternal({ target: scriptTargetStr, declaration: true, esBundle: true, umdBundle: true }, entryName, tsConfigInfo, umdIds, buildConfig); compilations.push(esmScriptCompilation); } else { const esm5ScriptCompilation = toScriptCompilationOptionsInternal({ target: 'es5', declaration: false, esBundle: true, umdBundle: true }, entryName, tsConfigInfo, umdIds, buildConfig); compilations.push(esm5ScriptCompilation); } } } if (buildConfig.script && buildConfig.script.bundles) { if (!buildConfig._packageJsonEntryPoint.typings && entryName && tsConfigInfo && tsConfigInfo.tsCompilerConfig.options.declaration && buildConfig.script.entry && /\.tsx?$/i.test(buildConfig.script.entry)) { AddTypingsEntryPointToPackageJson(buildConfig, entryName); } for (const bundleOptions of buildConfig.script.bundles) { const bundleOptionsInternal = toScriptBundleOptionsInternal(bundleOptions, tsConfigInfo, umdIds, buildConfig); bundles.push(bundleOptionsInternal); } } let typescriptModulePath = null; if (buildConfig._nodeModulesPath && (await fs_extra_1.pathExists(path.resolve(buildConfig._nodeModulesPath, 'typescript', 'package.json')))) { typescriptModulePath = path.resolve(buildConfig._nodeModulesPath, 'typescript'); } umd_ids_1.addPredefinedUmdIds(umdIds); buildConfig._script = Object.assign(Object.assign({}, buildConfig.script), { _tsConfigInfo: tsConfigInfo, _entryName: entryName, _compilations: compilations, _bundles: bundles, _projectTypescriptModulePath: typescriptModulePath }); } exports.prepareScripts = prepareScripts; function toScriptCompilationOptionsInternal(compilationOptions, entryName, tsConfigInfo, umdIds, buildConfig) { const tsConfigPath = tsConfigInfo.tsConfigPath; const tsCompilerConfig = tsConfigInfo.tsCompilerConfig; const compilerOptions = tsCompilerConfig.options; // scriptTarget let scriptTarget = typescript_1.ScriptTarget.ES2015; if (compilationOptions.target) { scriptTarget = to_ts_script_target_1.toTsScriptTarget(compilationOptions.target); } else if (compilerOptions.target) { scriptTarget = compilerOptions.target; } // tsOutDir let tsOutDir; let customTsOutDir = null; if (compilationOptions.outDir) { tsOutDir = path.resolve(buildConfig._outputPath, compilationOptions.outDir); customTsOutDir = tsOutDir; } else { if (compilerOptions.outDir) { tsOutDir = path.isAbsolute(compilerOptions.outDir) ? path.resolve(compilerOptions.outDir) : path.resolve(path.dirname(tsConfigPath), compilerOptions.outDir); } else { tsOutDir = buildConfig._outputPath; customTsOutDir = tsOutDir; } } if (compilerOptions.rootDir && !utils_1.isSamePaths(compilerOptions.rootDir, path.dirname(tsConfigPath))) { const relSubDir = utils_1.isInFolder(compilerOptions.rootDir, path.dirname(tsConfigPath)) ? utils_1.normalizePath(path.relative(compilerOptions.rootDir, path.dirname(tsConfigPath))) : utils_1.normalizePath(path.relative(path.dirname(tsConfigPath), compilerOptions.rootDir)); tsOutDir = path.resolve(tsOutDir, relSubDir); } const bundles = []; if (compilationOptions.esBundle || compilationOptions.umdBundle || compilationOptions.cjsBundle) { const sourceMap = compilerOptions.sourceMap ? true : false; const entryFilePath = path.resolve(tsOutDir, `${entryName}.js`); const defaultOutputFileName = buildConfig._packageNameWithoutScope.replace(/\//gm, '-'); const globalsAndExternals = getExternalsAndGlobals(buildConfig.script || {}, {}, buildConfig._packageJson, umdIds); if (compilationOptions.esBundle) { const bundleOptions = typeof compilationOptions.esBundle === 'object' ? compilationOptions.esBundle : {}; const defaultOutputFileNameWithExt = `${defaultOutputFileName}.js`; let bundleOutFilePath; if (bundleOptions.outputFile) { if (bundleOptions.outputFile.endsWith('/')) { bundleOutFilePath = path.resolve(buildConfig._outputPath, bundleOptions.outputFile, defaultOutputFileNameWithExt); } else { bundleOutFilePath = path.resolve(buildConfig._outputPath, bundleOptions.outputFile); } } else { let fesmFolderName; const m = esmRegExp.exec(compilationOptions.outDir || ''); if (m != null && m.length === 2) { const esmVersion = m[1]; fesmFolderName = `fesm${esmVersion}`; } else { const targetSuffix = scriptTarget >= typescript_1.ScriptTarget.ES2015 ? '2015' : '5'; fesmFolderName = `fesm${targetSuffix}`; } bundleOutFilePath = path.resolve(buildConfig._outputPath, fesmFolderName, defaultOutputFileNameWithExt); } let ecma; if (scriptTarget >= typescript_1.ScriptTarget.ESNext) { ecma = 2020; } else if (scriptTarget >= typescript_1.ScriptTarget.ES2015) { ecma = (2013 + scriptTarget); } else if (scriptTarget >= typescript_1.ScriptTarget.ES5) { ecma = 5; } const bundleOptionsInternal = Object.assign(Object.assign({ moduleFormat: 'es', sourceMap, minify: false }, bundleOptions), { _entryFilePath: entryFilePath, _outputFilePath: bundleOutFilePath, _externals: globalsAndExternals.externals, _globals: globalsAndExternals.globals, _ecma: ecma, _umdId: umdIds[buildConfig._packageName] }); bundles.push(bundleOptionsInternal); } if (compilationOptions.umdBundle) { const bundleOptions = typeof compilationOptions.umdBundle === 'object' ? compilationOptions.umdBundle : {}; const defaultOutputFileNameWithExt = `${defaultOutputFileName}.umd.js`; let bundleOutFilePath; if (bundleOptions.outputFile) { if (bundleOptions.outputFile.endsWith('/')) { bundleOutFilePath = path.resolve(buildConfig._outputPath, bundleOptions.outputFile, defaultOutputFileNameWithExt); } else { bundleOutFilePath = path.resolve(buildConfig._outputPath, bundleOptions.outputFile); } } else { bundleOutFilePath = path.resolve(buildConfig._outputPath, 'bundles', defaultOutputFileNameWithExt); } const bundleOptionsInternal = Object.assign(Object.assign({ moduleFormat: 'umd', sourceMap, minify: true }, bundleOptions), { _entryFilePath: entryFilePath, _outputFilePath: bundleOutFilePath, _externals: globalsAndExternals.externals, _globals: globalsAndExternals.globals, _umdId: umdIds[buildConfig._packageName] }); bundles.push(bundleOptionsInternal); } if (compilationOptions.cjsBundle) { const bundleOptions = typeof compilationOptions.cjsBundle === 'object' ? compilationOptions.cjsBundle : {}; const defaultOutputFileNameWithExt = `${defaultOutputFileName}.cjs.js`; let bundleOutFilePath; if (bundleOptions.outputFile) { if (bundleOptions.outputFile.endsWith('/')) { bundleOutFilePath = path.resolve(buildConfig._outputPath, bundleOptions.outputFile, defaultOutputFileNameWithExt); } else { bundleOutFilePath = path.resolve(buildConfig._outputPath, bundleOptions.outputFile); } } else { bundleOutFilePath = path.resolve(buildConfig._outputPath, 'bundles', defaultOutputFileNameWithExt); } const bundleOptionsInternal = Object.assign(Object.assign({ moduleFormat: 'cjs', sourceMap, minify: true }, bundleOptions), { _entryFilePath: entryFilePath, _outputFilePath: bundleOutFilePath, _externals: globalsAndExternals.externals, _globals: globalsAndExternals.globals, _umdId: umdIds[buildConfig._packageName] }); bundles.push(bundleOptionsInternal); } } const scriptOptions = buildConfig.script || {}; const addToPackageJson = scriptOptions.addToPackageJson !== false ? true : false; // declaration let declaration = true; if (compilationOptions.declaration != null) { declaration = compilationOptions.declaration; } // Add entry points to package.json if (addToPackageJson) { if (declaration) { AddTypingsEntryPointToPackageJson(buildConfig, entryName); } if (!compilationOptions.deleteNonBundleOutputs) { const jsEntryFile = utils_1.normalizePath(`${path.relative(buildConfig._packageJsonOutDir, path.resolve(tsOutDir, entryName))}.js`); if (compilerOptions.module && compilerOptions.module >= typescript_1.ModuleKind.ES2015 && scriptTarget >= typescript_1.ScriptTarget.ES2015) { buildConfig._packageJsonEntryPoint.es2015 = jsEntryFile; buildConfig._packageJsonEntryPoint.esm2015 = jsEntryFile; if (buildConfig._packageJsonLastModuleEntryScriptTarget == null || scriptTarget >= buildConfig._packageJsonLastModuleEntryScriptTarget) { buildConfig._packageJsonEntryPoint.module = jsEntryFile; buildConfig._packageJsonLastModuleEntryScriptTarget = scriptTarget; } } else if (compilerOptions.module && compilerOptions.module >= typescript_1.ModuleKind.ES2015 && scriptTarget === typescript_1.ScriptTarget.ES5) { buildConfig._packageJsonEntryPoint.esm5 = jsEntryFile; if (buildConfig._packageJsonLastModuleEntryScriptTarget == null || scriptTarget >= buildConfig._packageJsonLastModuleEntryScriptTarget) { buildConfig._packageJsonEntryPoint.module = jsEntryFile; buildConfig._packageJsonLastModuleEntryScriptTarget = scriptTarget; } } else if (compilerOptions.module === typescript_1.ModuleKind.UMD || compilerOptions.module === typescript_1.ModuleKind.CommonJS) { buildConfig._packageJsonEntryPoint.main = jsEntryFile; } } for (const bundleOptions of bundles) { const entryFileForBundle = utils_1.normalizePath(path.relative(buildConfig._packageJsonOutDir, bundleOptions._outputFilePath)); addBundleEntryPointsToPackageJson(buildConfig, bundleOptions.moduleFormat, entryFileForBundle, scriptTarget, compilerOptions.module); } } return Object.assign(Object.assign({}, compilationOptions), { _tsConfigInfo: tsConfigInfo, _entryName: entryName, _scriptTarget: scriptTarget, _declaration: declaration, _tsOutDirRootResolved: tsOutDir, _customTsOutDir: customTsOutDir, _bundles: bundles }); } function toScriptBundleOptionsInternal(bundleOptions, tsConfigInfo, umdIds, buildConfig) { const scriptOptions = buildConfig.script || {}; if (!scriptOptions.entry) { throw new Error(`The entry file could not be detected automatically. Please set value manually in 'projects[${buildConfig._projectName}].tasks.build.script.entry'.`); } const projectRoot = buildConfig._projectRoot; const entryFilePath = path.resolve(projectRoot, scriptOptions.entry); let bundleOutFilePath; const defaultOuputFileName = `${path.basename(entryFilePath)}.js`; if (bundleOptions.outputFile) { if (!/\.js$/i.test(bundleOptions.outputFile)) { bundleOutFilePath = path.resolve(buildConfig._outputPath, bundleOptions.outputFile, defaultOuputFileName); } else { bundleOutFilePath = path.resolve(buildConfig._outputPath, bundleOptions.outputFile); } } else { bundleOutFilePath = path.resolve(buildConfig._outputPath, defaultOuputFileName); } // Add entry points to package.json if (scriptOptions.addToPackageJson !== false) { const entryFileForBundle = utils_1.normalizePath(path.relative(buildConfig._packageJsonOutDir, bundleOutFilePath)); const compilerOptions = tsConfigInfo === null || tsConfigInfo === void 0 ? void 0 : tsConfigInfo.tsCompilerConfig.options; addBundleEntryPointsToPackageJson(buildConfig, bundleOptions.moduleFormat, entryFileForBundle, compilerOptions === null || compilerOptions === void 0 ? void 0 : compilerOptions.target, compilerOptions === null || compilerOptions === void 0 ? void 0 : compilerOptions.module); } const globalsAndExternals = getExternalsAndGlobals(scriptOptions, bundleOptions, buildConfig._packageJson, umdIds); let ecma; if (tsConfigInfo && tsConfigInfo.tsCompilerConfig.options.target) { const scriptTarget = tsConfigInfo.tsCompilerConfig.options.target; if (scriptTarget >= typescript_1.ScriptTarget.ESNext) { ecma = 2020; } else if (scriptTarget >= typescript_1.ScriptTarget.ES2015) { ecma = (2013 + scriptTarget); } else if (scriptTarget >= typescript_1.ScriptTarget.ES5) { ecma = 5; } } return Object.assign(Object.assign({}, bundleOptions), { _entryFilePath: entryFilePath, _outputFilePath: bundleOutFilePath, _externals: globalsAndExternals.externals, _globals: globalsAndExternals.globals, _ecma: ecma, _umdId: umdIds[buildConfig._packageName] }); } function getExternalsAndGlobals(scriptOptions, bundleOptions, packageJson, umdIds) { let globals = {}; if (scriptOptions.externals) { globals = Object.assign(Object.assign({}, globals), scriptOptions.externals); } if (bundleOptions.externals) { globals = Object.assign(Object.assign({}, globals), bundleOptions.externals); } const externals = Object.keys(globals); if (bundleOptions.moduleFormat === 'cjs') { if (buildInExternals == null) { // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-var-requires buildInExternals = require('builtins')(); } buildInExternals .filter((e) => !externals.includes(e)) .forEach((e) => { externals.push(e); }); } let dependenciesAsExternals = true; if (bundleOptions.dependenciesAsExternals != null) { dependenciesAsExternals = bundleOptions.dependenciesAsExternals; } else if (scriptOptions.dependenciesAsExternals != null) { dependenciesAsExternals = scriptOptions.dependenciesAsExternals; } if (dependenciesAsExternals && packageJson.dependencies) { Object.keys(packageJson.dependencies) .filter((e) => !externals.includes(e)) .forEach((e) => { externals.push(e); if (!globals[e]) { const globalVar = umd_ids_1.getUmdGlobalVariable(e, umdIds); if (globalVar) { globals[e] = globalVar; } } }); } let peerDependenciesAsExternals = true; if (bundleOptions.peerDependenciesAsExternals != null) { peerDependenciesAsExternals = bundleOptions.peerDependenciesAsExternals; } else if (scriptOptions.peerDependenciesAsExternals != null) { peerDependenciesAsExternals = scriptOptions.peerDependenciesAsExternals; } if (peerDependenciesAsExternals && packageJson.peerDependencies) { Object.keys(packageJson.peerDependencies) .filter((e) => !externals.includes(e)) .forEach((e) => { externals.push(e); if (!globals[e]) { const globalVar = umd_ids_1.getUmdGlobalVariable(e, umdIds); if (globalVar) { globals[e] = globalVar; } } }); } if (externals.includes('rxjs') && !externals.includes('rxjs/operators')) { globals['rxjs/operators'] = 'rxjs.operators'; externals.push('rxjs/operators'); } return { externals, globals }; } function addBundleEntryPointsToPackageJson(buildConfig, moduleFormat, jsEntryFile, scriptTarget, moduleKind) { if (moduleFormat === 'es') { if (moduleKind && moduleKind >= typescript_1.ModuleKind.ES2015 && scriptTarget && scriptTarget >= typescript_1.ScriptTarget.ES2015) { buildConfig._packageJsonEntryPoint.fesm2015 = jsEntryFile; buildConfig._packageJsonEntryPoint.es2015 = jsEntryFile; if (buildConfig._packageJsonLastModuleEntryScriptTarget == null || scriptTarget >= buildConfig._packageJsonLastModuleEntryScriptTarget) { buildConfig._packageJsonEntryPoint.module = jsEntryFile; buildConfig._packageJsonLastModuleEntryScriptTarget = scriptTarget; } } else if (moduleKind && moduleKind >= typescript_1.ModuleKind.ES2015 && scriptTarget && scriptTarget === typescript_1.ScriptTarget.ES5) { buildConfig._packageJsonEntryPoint.fesm5 = jsEntryFile; if (buildConfig._packageJsonLastModuleEntryScriptTarget == null || scriptTarget >= buildConfig._packageJsonLastModuleEntryScriptTarget) { buildConfig._packageJsonEntryPoint.module = jsEntryFile; buildConfig._packageJsonLastModuleEntryScriptTarget = scriptTarget; } } } else { buildConfig._packageJsonEntryPoint.main = jsEntryFile; } } function AddTypingsEntryPointToPackageJson(buildConfig, entryName) { if (buildConfig._nestedPackage) { buildConfig._packageJsonEntryPoint.typings = utils_1.normalizePath(path.relative(buildConfig._packageJsonOutDir, path.join(buildConfig._outputPath, `${entryName}.d.ts`))); } else { buildConfig._packageJsonEntryPoint.typings = `${entryName}.d.ts`; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlcGFyZS1zY3JpcHRzLmpzIiwic291cmNlUm9vdCI6Ii4vIiwic291cmNlcyI6WyJoZWxwZXJzL3ByZXBhcmUtc2NyaXB0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBNkI7QUFFN0IsdUNBQXNDO0FBQ3RDLDJDQUFzRDtBQWV0RCxvQ0FBdUY7QUFFdkYsaUVBQTJEO0FBQzNELHlFQUFtRTtBQUNuRSw2REFBd0Q7QUFDeEQsdUNBQXNFO0FBQ3RFLDJGQUFtRjtBQUNuRiwrREFBeUQ7QUFFekQsTUFBTSxTQUFTLEdBQUcsK0JBQStCLENBQUM7QUFFbEQsSUFBSSxnQkFBZ0IsR0FBb0IsSUFBSSxDQUFDO0FBRXRDLEtBQUssVUFBVSxjQUFjLENBQUMsV0FBZ0M7O0lBQ2pFLE1BQU0sYUFBYSxHQUFHLFdBQVcsQ0FBQyxjQUFjLENBQUM7SUFDakQsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFDLFlBQVksQ0FBQztJQUM3QyxNQUFNLFdBQVcsR0FBRyxXQUFXLENBQUMsWUFBWSxDQUFDO0lBQzdDLE1BQU0sWUFBWSxHQUF1QyxFQUFFLENBQUM7SUFDNUQsTUFBTSxPQUFPLEdBQWtDLEVBQUUsQ0FBQztJQUNsRCxJQUFJLFlBQVksR0FBa0IsSUFBSSxDQUFDO0lBQ3ZDLElBQUksWUFBWSxHQUF3QixJQUFJLENBQUM7SUFFN0MsSUFBSSxXQUFXLENBQUMsTUFBTSxJQUFJLFdBQVcsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFO1FBQ25ELFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3RFLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDZixNQUFNLElBQUksS0FBSyxDQUNYLHFCQUFxQixZQUFZLHFEQUFxRCxXQUFXLGlDQUFpQyxDQUNySSxDQUFDO1NBQ0w7S0FDSjtTQUFNLElBQUksV0FBVyxDQUFDLE1BQU0sRUFBRTtRQUMzQixZQUFZLEdBQUcsTUFB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R0FBRyxXQUFXLENBQUM7Z0JBQ3hELFdBQVcsQ0FBQyx1Q0FBdUMsR0FBRyxZQUFZLENBQUM7YUFDdEU7U0FDSjtLQUNKO1NBQU07UUFDSCxXQUFXLENBQUMsc0JBQXNCLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQztLQUN6RDtBQUNMLENBQUM7QUFFRCxTQUFTLGlDQUFpQyxDQUFDLFdBQWdDLEVBQUUsU0FBaUI7SUFDMUYsSUFBSSxXQUFXLENBQUMsY0FBYyxFQUFFO1FBQzVCLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLEdBQUcscUJBQWEsQ0FDdEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLEdBQUcsU0FBUyxPQUFPLENBQUMsQ0FBQyxDQUN6RyxDQUFDO0tBQ0w7U0FBTTtRQUNILFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLEdBQUcsR0FBRyxTQUFTLE9BQU8sQ0FBQztLQUNwRTtBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQgeyBwYXRoRXhpc3RzIH0gZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgTW9kdWxlS2luZCwgU2NyaXB0VGFyZ2V0IH0gZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7XG4gICAgQnVpbGRDb25maWdJbnRlcm5hbCxcbiAgICBFY21hTnVtYmVyLFxuICAgIFBhY2thZ2VKc29uTGlrZSxcbiAgICBTY3JpcHRCdW5kbGVNb2R1bGVLaW5kLFxuICAgIFNjcmlwdEJ1bmRsZU9wdGlvbnMsXG4gICAgU2NyaXB0QnVuZGxlT3B0aW9uc0ludGVybmFsLFxuICAgIFNjcmlwdENvbXBpbGF0aW9uT3B0aW9ucyxcbiAgICBTY3JpcHRDb21waWxhdGlvbk9wdGlvbnNJbnRlcm5hbCxcbiAgICBTY3JpcHRPcHRpb25zLFxuICAgIFNjcmlwdFRhcmdldFN0cmluZyxcbiAgICBUc0NvbmZpZ0luZm9cbn0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IGRhc2hDYXNlVG9DYW1lbENhc2UsIGlzSW5Gb2xkZXIsIGlzU2FtZVBhdGhzLCBub3JtYWxpemVQYXRoIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5pbXBvcnQgeyBkZXRlY3RUc0VudHJ5TmFtZSB9IGZyb20gJy4vZGV0ZWN0LXRzLWVudHJ5LW5hbWUnO1xuaW1wb3J0IHsgZmluZEJ1aWxkVHNjb25maWdGaWxlIH0gZnJvbSAnLi9maW5kLWJ1aWxkLXRzY29uZmlnLWZpbGUnO1xuaW1wb3J0IHsgcmVhZFRzY29uZmlnSnNvbiB9IGZyb20gJy4vcmVhZC10c2NvbmZpZy1qc29uJztcbmltcG9ydCB7IGFkZFByZWRlZmluZWRVbWRJZHMsIGdldFVtZEdsb2JhbFZhcmlhYmxlIH0gZnJvbSAnLi91bWQtaWRzJztcbmltcG9ydCB7IHBhcnNlVHNKc29uQ29uZmlnRmlsZUNvbnRlbnQgfSBmcm9tICcuL3BhcnNlLXRzLWpzb24tY29uZmlnLWZpbGUtY29udGVudCc7XG5pbXBvcnQgeyB0b1RzU2NyaXB0VGFyZ2V0IH0gZnJvbSAnLi90by10cy1zY3JpcHQtdGFyZ2V0JztcblxuY29uc3QgZXNtUmVnRXhwID0gL1xcLz9mP2VzbT8oNXwyMFsxLTJdWzAtOV0pXFwvPy9pO1xuXG5sZXQgYnVpbGRJbkV4dGVybmFsczogc3RyaW5nW10gfCBudWxsID0gbnVsbDtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByZXBhcmVTY3JpcHRzKGJ1aWxkQ29uZmlnOiBCdWlsZENvbmZpZ0ludGVybmFsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgd29ya3NwYWNlUm9vdCA9IGJ1aWxkQ29uZmlnLl93b3Jrc3BhY2VSb290O1xuICAgIGNvbnN0IHByb2plY3RSb290ID0gYnVpbGRDb25maWcuX3Byb2plY3RSb290O1xuICAgIGNvbnN0IHByb2plY3ROYW1lID0gYnVpbGRDb25maWcuX3Byb2plY3ROYW1lO1xuICAgIGNvbnN0IGNvbXBpbGF0aW9uczogU2NyaXB0Q29tcGlsYXRpb25PcHRpb25zSW50ZXJuYWxbXSA9IFtdO1xuICAgIGNvbnN0IGJ1bmRsZXM6IFNjcmlwdEJ1bmRsZU9wdGlvbnNJbnRlcm5hbFtdID0gW107XG4gICAgbGV0IHRzQ29uZmlnUGF0aDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IHRzQ29uZmlnSW5mbzogVHNDb25maWdJbmZvIHwgbnVsbCA9IG51bGw7XG5cbiAgICBpZiAoYnVpbGRDb25maWcuc2NyaXB0ICYmIGJ1aWxkQ29uZmlnLnNjcmlwdC50c0NvbmZpZykge1xuICAgICAgICB0c0NvbmZpZ1BhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdFJvb3QsIGJ1aWxkQ29uZmlnLnNjcmlwdC50c0NvbmZpZyk7XG4gICAgICAgIGlmICghdHNDb25maWdQYXRoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYFRoZSB0c0NvbmZpZyBmaWxlICR7dHNDb25maWdQYXRofSBkb2Vzbid0IGV4aXN0LiBQbGVhc2UgY29ycmVjdCB2YWx1ZSBpbiAncHJvamVjdHNbJHtwcm9qZWN0TmFtZX1dLnRhc2tzLmJ1aWxkLnNjcmlwdC50c0NvbmZpZycuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYnVpbGRDb25maWcuc2NyaXB0KSB7XG4gICAgICAgIHRzQ29uZmlnUGF0aCA9IGF3YWl0IGZpbmRCdWlsZFRzY29uZmlnRmlsZShwcm9qZWN0Um9vdCwgd29ya3NwYWNlUm9vdCk7XG4gICAgfVxuXG4gICAgaWYgKHRzQ29uZmlnUGF0aCkge1xuICAgICAgICBjb25zdCB0c0NvbmZpZ0pzb24gPSByZWFkVHNjb25maWdKc29uKHRzQ29uZmlnUGF0aCk7XG4gICAgICAgIGNvbnN0IHRzQ29tcGlsZXJDb25maWcgPSBwYXJzZVRzSnNvbkNvbmZpZ0ZpbGVDb250ZW50KHRzQ29uZmlnUGF0aCk7XG4gICAgICAgIHRzQ29uZmlnSW5mbyA9IHtcbiAgICAgICAgICAgIHRzQ29uZmlnUGF0aCxcbiAgICAgICAgICAgIHRzQ29uZmlnSnNvbixcbiAgICAgICAgICAgIHRzQ29tcGlsZXJDb25maWdcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBsZXQgZW50cnlOYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBpZiAoYnVpbGRDb25maWcuc2NyaXB0ICYmIGJ1aWxkQ29uZmlnLnNjcmlwdC5lbnRyeSkge1xuICAgICAgICBlbnRyeU5hbWUgPSBub3JtYWxpemVQYXRoKGJ1aWxkQ29uZmlnLnNjcmlwdC5lbnRyeSkucmVwbGFjZSgvXFwuKHRzfGpzKSQvaSwgJycpO1xuICAgIH0gZWxzZSBpZiAodHNDb25maWdJbmZvKSB7XG4gICAgICAgIGVudHJ5TmFtZSA9IGF3YWl0IGRldGVjdFRzRW50cnlOYW1lKHRzQ29uZmlnSW5mbywgYnVpbGRDb25maWcuX3BhY2thZ2VOYW1lV2l0aG91dFNjb3BlKTtcbiAgICB9XG5cbiAgICBjb25zdCB1bWRJZHM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgICBpZiAoYnVpbGRDb25maWcuc2NyaXB0Py51bWRJZCkge1xuICAgICAgICB1bWRJZHNbYnVpbGRDb25maWcuX3BhY2thZ2VOYW1lXSA9IGJ1aWxkQ29uZmlnLnNjcmlwdD8udW1kSWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFZhbHVlID0gYnVpbGRDb25maWcuX3BhY2thZ2VOYW1lLnJlcGxhY2UoL1xcLy9nLCAnLicpO1xuICAgICAgICBjb25zdCB1bWRJZCA9IGRhc2hDYXNlVG9DYW1lbENhc2Uobm9ybWFsaXplZFZhbHVlKTtcbiAgICAgICAgdW1kSWRzW2J1aWxkQ29uZmlnLl9wYWNrYWdlTmFtZV0gPSB1bWRJZDtcbiAgICB9XG5cbiAgICBpZiAoYnVpbGRDb25maWcuc2NyaXB0ICYmIGJ1aWxkQ29uZmlnLnNjcmlwdC5jb21waWxhdGlvbnMpIHtcbiAgICAgICAgaWYgKCF0c0NvbmZpZ1BhdGggfHwgIXRzQ29uZmlnSW5mbykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBUeXBlc2NyaXB0IGNvbmZpZ3VyYXRpb24gZmlsZSBjb3VsZCBub3QgYmUgZGV0ZWN0ZWQgYXV0b21hdGljYWxseS4gUGxlYXNlIHNldCB2YWx1ZSBtYW51YWxseSBpbiAncHJvamVjdHNbJHtwcm9qZWN0TmFtZX1dLnRhc2tzLmJ1aWxkLnNjcmlwdC50c0NvbmZpZycuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZW50cnlOYW1lKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYFRoZSBlbnRyeSBmaWxlIGNvdWxkIG5vdCBiZSBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5LiBQbGVhc2Ugc2V0IHZhbHVlIG1hbnVhbGx5IGluICdwcm9qZWN0c1s