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
JavaScript
"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