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.
148 lines • 22.3 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.detectWorkflowConfig = void 0;
const path = require("path");
const util_1 = require("util");
const fs_extra_1 = require("fs-extra");
const glob = require("glob");
const globAsync = util_1.promisify(glob);
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 find_test_index_file_1 = require("./find-test-index-file");
const find_test_tsconfig_file_1 = require("./find-test-tsconfig-file");
const find_karma_config_file_1 = require("./find-karma-config-file");
const parse_ts_json_config_file_content_1 = require("./parse-ts-json-config-file-content");
const read_tsconfig_json_1 = require("./read-tsconfig-json");
const read_package_json_1 = require("./read-package-json");
const read_workflow_config_1 = require("./read-workflow-config");
async function detectWorkflowConfig(taskName) {
const foundPackageJsonPaths = await globAsync('*(src|modules|packages|projects|libs|samples|examples|demos)/**/package.json', {
cwd: process.cwd(),
dot: false,
absolute: true,
ignore: ['**/lib-tools/package.json', '**/node_modules/**/package.json', '**/dist/**/package.json']
});
if (!foundPackageJsonPaths.length) {
return null;
}
const projects = [];
for (const packageJsonPath of foundPackageJsonPaths) {
const workflowConfigPath = path.resolve(path.dirname(packageJsonPath), 'workflow.json');
if (await fs_extra_1.pathExists(workflowConfigPath)) {
const workflowConfig = await read_workflow_config_1.readWorkflowConfig(workflowConfigPath);
const workspaceRoot = path.dirname(workflowConfigPath);
const keys = Object.keys(workflowConfig.projects);
for (const key of keys) {
const project = workflowConfig.projects[key];
if (project.root && path.isAbsolute(project.root)) {
throw new Error(`Invalid configuration. The 'projects[${key}].root' must be relative path.`);
}
const projectRoot = path.resolve(workspaceRoot, project.root || '');
const projectInternal = Object.assign(Object.assign({}, project), { _workspaceRoot: workspaceRoot, _config: workflowConfigPath, _projectRoot: projectRoot, _projectName: key });
projects.push(projectInternal);
}
}
else {
const packageJson = await read_package_json_1.readPackageJson(packageJsonPath);
const packageName = packageJson.name;
if (!packageName) {
continue;
}
let packageNameWithoutScope = packageName;
const slashIndex = packageName.indexOf('/');
if (slashIndex > -1 && packageName.startsWith('@')) {
packageNameWithoutScope = packageName.substr(slashIndex + 1);
}
const projectName = packageNameWithoutScope.replace(/\//g, '-');
const workspaceRoot = process.cwd();
const projectRoot = path.dirname(packageJsonPath);
if (taskName === 'build') {
const buildConfig = await detectBuildConfig(workspaceRoot, projectRoot, packageNameWithoutScope);
if (buildConfig != null) {
const projectInternal = {
_config: 'auto',
_workspaceRoot: workspaceRoot,
_projectRoot: projectRoot,
_projectName: projectName,
root: utils_1.normalizePath(path.relative(workspaceRoot, projectRoot)),
tasks: {
build: buildConfig
}
};
projects.push(projectInternal);
}
}
else if (taskName === 'test') {
const testConfig = await detectTestConfig(workspaceRoot, projectRoot);
if (testConfig != null) {
const projectInternal = {
_config: 'auto',
_workspaceRoot: workspaceRoot,
_projectRoot: projectRoot,
_projectName: projectName,
root: utils_1.normalizePath(path.relative(workspaceRoot, projectRoot)),
tasks: {
test: testConfig
}
};
projects.push(projectInternal);
}
}
}
}
if (!projects.length) {
return null;
}
const projectMap = {};
for (const project of projects) {
projectMap[project._projectName] = project;
}
return {
projects: projectMap
};
}
exports.detectWorkflowConfig = detectWorkflowConfig;
async function detectBuildConfig(workspaceRoot, projectRoot, packageNameWithoutScope) {
const tsConfigPath = await find_build_tsconfig_file_1.findBuildTsconfigFile(projectRoot, workspaceRoot);
if (!tsConfigPath) {
return null;
}
const tsConfigJson = read_tsconfig_json_1.readTsconfigJson(tsConfigPath);
const tsCompilerConfig = parse_ts_json_config_file_content_1.parseTsJsonConfigFileContent(tsConfigPath);
const tsConfigInfo = {
tsConfigPath,
tsConfigJson,
tsCompilerConfig
};
const entryName = await detect_ts_entry_name_1.detectTsEntryName(tsConfigInfo, packageNameWithoutScope);
if (!entryName) {
return null;
}
return {
script: {
compilations: 'auto'
}
};
}
async function detectTestConfig(workspaceRoot, projectRoot) {
const tsConfigPath = await find_test_tsconfig_file_1.findTestTsconfigFile(projectRoot, workspaceRoot);
const testIndexFile = await find_test_index_file_1.findTestIndexFile(projectRoot, workspaceRoot, tsConfigPath);
const karmaConfigFilePath = await find_karma_config_file_1.findKarmaConfigFile(projectRoot, workspaceRoot);
if (!karmaConfigFilePath && !testIndexFile) {
return null;
}
return {
tsConfig: tsConfigPath ? path.relative(projectRoot, tsConfigPath) : undefined,
testIndexFile: testIndexFile ? path.relative(projectRoot, testIndexFile) : undefined,
karmaConfig: karmaConfigFilePath ? path.relative(projectRoot, karmaConfigFilePath) : undefined,
codeCoverageExclude: ['**/test.ts', '**/index.ts', '**/public_api.ts'],
envOverrides: {
ci: {
browsers: ['ChromeHeadlessCI'],
reporters: ['junit', 'coverage']
}
}
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0ZWN0LXdvcmtmbG93LWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIuLyIsInNvdXJjZXMiOlsiaGVscGVycy9kZXRlY3Qtd29ya2Zsb3ctY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZCQUE2QjtBQUM3QiwrQkFBaUM7QUFFakMsdUNBQXNDO0FBQ3RDLDZCQUE2QjtBQUU3QixNQUFNLFNBQVMsR0FBRyxnQkFBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBR2xDLG9DQUF5QztBQUV6QyxpRUFBMkQ7QUFDM0QseUVBQW1FO0FBQ25FLGlFQUEyRDtBQUMzRCx1RUFBaUU7QUFDakUscUVBQStEO0FBQy9ELDJGQUFtRjtBQUNuRiw2REFBd0Q7QUFDeEQsMkRBQXNEO0FBQ3RELGlFQUE0RDtBQUVyRCxLQUFLLFVBQVUsb0JBQW9CLENBQUMsUUFBMEI7SUFDakUsTUFBTSxxQkFBcUIsR0FBRyxNQUFNLFNBQVMsQ0FDekMsOEVBQThFLEVBQzlFO1FBQ0ksR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHLEVBQUU7UUFDbEIsR0FBRyxFQUFFLEtBQUs7UUFDVixRQUFRLEVBQUUsSUFBSTtRQUNkLE1BQU0sRUFBRSxDQUFDLDJCQUEyQixFQUFFLGlDQUFpQyxFQUFFLHlCQUF5QixDQUFDO0tBQ3RHLENBQ0osQ0FBQztJQUVGLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLEVBQUU7UUFDL0IsT0FBTyxJQUFJLENBQUM7S0FDZjtJQUVELE1BQU0sUUFBUSxHQUE0QixFQUFFLENBQUM7SUFFN0MsS0FBSyxNQUFNLGVBQWUsSUFBSSxxQkFBcUIsRUFBRTtRQUNqRCxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUN4RixJQUFJLE1BQU0scUJBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFO1lBQ3RDLE1BQU0sY0FBYyxHQUFHLE1BQU0seUNB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S0FDSixDQUFDO0FBQ04sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBwcm9taXNpZnkgfSBmcm9tICd1dGlsJztcblxuaW1wb3J0IHsgcGF0aEV4aXN0cyB9IGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCAqIGFzIGdsb2IgZnJvbSAnZ2xvYic7XG5cbmNvbnN0IGdsb2JBc3luYyA9IHByb21pc2lmeShnbG9iKTtcblxuaW1wb3J0IHsgQnVpbGRDb25maWcsIFByb2plY3RDb25maWdJbnRlcm5hbCwgVGVzdENvbmZpZywgVHNDb25maWdJbmZvLCBXb3JrZmxvd0NvbmZpZ0ludGVybmFsIH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IG5vcm1hbGl6ZVBhdGggfSBmcm9tICcuLi91dGlscyc7XG5cbmltcG9ydCB7IGRldGVjdFRzRW50cnlOYW1lIH0gZnJvbSAnLi9kZXRlY3QtdHMtZW50cnktbmFtZSc7XG5pbXBvcnQgeyBmaW5kQnVpbGRUc2NvbmZpZ0ZpbGUgfSBmcm9tICcuL2ZpbmQtYnVpbGQtdHNjb25maWctZmlsZSc7XG5pbXBvcnQgeyBmaW5kVGVzdEluZGV4RmlsZSB9IGZyb20gJy4vZmluZC10ZXN0LWluZGV4LWZpbGUnO1xuaW1wb3J0IHsgZmluZFRlc3RUc2NvbmZpZ0ZpbGUgfSBmcm9tICcuL2ZpbmQtdGVzdC10c2NvbmZpZy1maWxlJztcbmltcG9ydCB7IGZpbmRLYXJtYUNvbmZpZ0ZpbGUgfSBmcm9tICcuL2ZpbmQta2FybWEtY29uZmlnLWZpbGUnO1xuaW1wb3J0IHsgcGFyc2VUc0pzb25Db25maWdGaWxlQ29udGVudCB9IGZyb20gJy4vcGFyc2UtdHMtanNvbi1jb25maWctZmlsZS1jb250ZW50JztcbmltcG9ydCB7IHJlYWRUc2NvbmZpZ0pzb24gfSBmcm9tICcuL3JlYWQtdHNjb25maWctanNvbic7XG5pbXBvcnQgeyByZWFkUGFja2FnZUpzb24gfSBmcm9tICcuL3JlYWQtcGFja2FnZS1qc29uJztcbmltcG9ydCB7IHJlYWRXb3JrZmxvd0NvbmZpZyB9IGZyb20gJy4vcmVhZC13b3JrZmxvdy1jb25maWcnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGV0ZWN0V29ya2Zsb3dDb25maWcodGFza05hbWU6ICdidWlsZCcgfCAndGVzdCcpOiBQcm9taXNlPFdvcmtmbG93Q29uZmlnSW50ZXJuYWwgfCBudWxsPiB7XG4gICAgY29uc3QgZm91bmRQYWNrYWdlSnNvblBhdGhzID0gYXdhaXQgZ2xvYkFzeW5jKFxuICAgICAgICAnKihzcmN8bW9kdWxlc3xwYWNrYWdlc3xwcm9qZWN0c3xsaWJzfHNhbXBsZXN8ZXhhbXBsZXN8ZGVtb3MpLyoqL3BhY2thZ2UuanNvbicsXG4gICAgICAgIHtcbiAgICAgICAgICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICAgIGRvdDogZmFsc2UsXG4gICAgICAgICAgICBhYnNvbHV0ZTogdHJ1ZSxcbiAgICAgICAgICAgIGlnbm9yZTogWycqKi9saWItdG9vbHMvcGFja2FnZS5qc29uJywgJyoqL25vZGVfbW9kdWxlcy8qKi9wYWNrYWdlLmpzb24nLCAnKiovZGlzdC8qKi9wYWNrYWdlLmpzb24nXVxuICAgICAgICB9XG4gICAgKTtcblxuICAgIGlmICghZm91bmRQYWNrYWdlSnNvblBhdGhzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9qZWN0czogUHJvamVjdENvbmZpZ0ludGVybmFsW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgcGFja2FnZUpzb25QYXRoIG9mIGZvdW5kUGFja2FnZUpzb25QYXRocykge1xuICAgICAgICBjb25zdCB3b3JrZmxvd0NvbmZpZ1BhdGggPSBwYXRoLnJlc29sdmUocGF0aC5kaXJuYW1lKHBhY2thZ2VKc29uUGF0aCksICd3b3JrZmxvdy5qc29uJyk7XG4gICAgICAgIGlmIChhd2FpdCBwYXRoRXhpc3RzKHdvcmtmbG93Q29uZmlnUGF0aCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHdvcmtmbG93Q29uZmlnID0gYXdhaXQgcmVhZFdvcmtmbG93Q29uZmlnKHdvcmtmbG93Q29uZmlnUGF0aCk7XG4gICAgICAgICAgICBjb25zdCB3b3Jrc3BhY2VSb290ID0gcGF0aC5kaXJuYW1lKHdvcmtmbG93Q29uZmlnUGF0aCk7XG4gICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMod29ya2Zsb3dDb25maWcucHJvamVjdHMpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb2plY3QgPSB3b3JrZmxvd0NvbmZpZy5wcm9qZWN0c1trZXldO1xuXG4gICAgICAgICAgICAgICAgaWYgKHByb2plY3Qucm9vdCAmJiBwYXRoLmlzQWJzb2x1dGUocHJvamVjdC5yb290KSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY29uZmlndXJhdGlvbi4gVGhlICdwcm9qZWN0c1ske2tleX1dLnJvb3QnIG11c3QgYmUgcmVsYXRpdmUgcGF0aC5gKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwcm9qZWN0Um9vdCA9IHBhdGgucmVzb2x2ZSh3b3Jrc3BhY2VSb290LCBwcm9qZWN0LnJvb3QgfHwgJycpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb2plY3RJbnRlcm5hbDogUHJvamVjdENvbmZpZ0ludGVybmFsID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi5wcm9qZWN0LFxuICAgICAgICAgICAgICAgICAgICBfd29ya3NwYWNlUm9vdDogd29ya3NwYWNlUm9vdCxcbiAgICAgICAgICAgICAgICAgICAgX2NvbmZpZzogd29ya2Zsb3dDb25maWdQYXRoLFxuICAgICAgICAgICAgICAgICAgICBfcHJvamVjdFJvb3Q6IHByb2plY3RSb290LFxuICAgICAgICAgICAgICAgICAgICBfcHJvamVjdE5hbWU6IGtleVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBwcm9qZWN0cy5wdXNoKHByb2plY3RJbnRlcm5hbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbihwYWNrYWdlSnNvblBhdGgpO1xuICAgICAgICAgICAgY29uc3QgcGFja2FnZU5hbWUgPSBwYWNrYWdlSnNvbi5uYW1lO1xuICAgICAgICAgICAgaWYgKCFwYWNrYWdlTmFtZSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgcGFja2FnZU5hbWVXaXRob3V0U2NvcGUgPSBwYWNrYWdlTmFtZTtcbiAgICAgICAgICAgIGNvbnN0IHNsYXNoSW5kZXggPSBwYWNrYWdlTmFtZS5pbmRleE9mKCcvJyk7XG4gICAgICAgICAgICBpZiAoc2xhc2hJbmRleCA+IC0xICYmIHBhY2thZ2VOYW1lLnN0YXJ0c1dpdGgoJ0AnKSkge1xuICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lV2l0aG91dFNjb3BlID0gcGFja2FnZU5hbWUuc3Vic3RyKHNsYXNoSW5kZXggKyAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHByb2plY3ROYW1lID0gcGFja2FnZU5hbWVXaXRob3V0U2NvcGUucmVwbGFjZSgvXFwvL2csICctJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHdvcmtzcGFjZVJvb3QgPSBwcm9jZXNzLmN3ZCgpO1xuICAgICAgICAgICAgY29uc3QgcHJvamVjdFJvb3QgPSBwYXRoLmRpcm5hbWUocGFja2FnZUpzb25QYXRoKTtcblxuICAgICAgICAgICAgaWYgKHRhc2tOYW1lID09PSAnYnVpbGQnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYnVpbGRDb25maWcgPSBhd2FpdCBkZXRlY3RCdWlsZENvbmZpZyh3b3Jrc3BhY2VSb290LCBwcm9qZWN0Um9vdCwgcGFja2FnZU5hbWVXaXRob3V0U2NvcGUpO1xuICAgICAgICAgICAgICAgIGlmIChidWlsZENvbmZpZyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb2plY3RJbnRlcm5hbDogUHJvamVjdENvbmZpZ0ludGVybmFsID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgX2NvbmZpZzogJ2F1dG8nLFxuICAgICAgICAgICAgICAgICAgICAgICAgX3dvcmtzcGFjZVJvb3Q6IHdvcmtzcGFjZVJvb3QsXG4gICAgICAgICAgICAgICAgICAgICAgICBfcHJvamVjdFJvb3Q6IHByb2plY3RSb290LFxuICAgICAgICAgICAgICAgICAgICAgICAgX3Byb2plY3ROYW1lOiBwcm9qZWN0TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvb3Q6IG5vcm1hbGl6ZVBhdGgocGF0aC5yZWxhdGl2ZSh3b3Jrc3BhY2VSb290LCBwcm9qZWN0Um9vdCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFza3M6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZDogYnVpbGRDb25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICBwcm9qZWN0cy5wdXNoKHByb2plY3RJbnRlcm5hbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0YXNrTmFtZSA9PT0gJ3Rlc3QnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGVzdENvbmZpZyA9IGF3YWl0IGRldGVjdFRlc3RDb25maWcod29ya3NwYWNlUm9vdCwgcHJvamVjdFJvb3QpO1xuICAgICAgICAgICAgICAgIGlmICh0ZXN0Q29uZmlnICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvamVjdEludGVybmFsOiBQcm9qZWN0Q29uZmlnSW50ZXJuYWwgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfY29uZmlnOiAnYXV0bycsXG4gICAgICAgICAgICAgICAgICAgICAgICBfd29ya3NwYWNlUm9vdDogd29ya3NwYWNlUm9vdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIF9wcm9qZWN0Um9vdDogcHJvamVjdFJvb3QsXG4gICAgICAgICAgICAgICAgICAgICAgICBfcHJvamVjdE5hbWU6IHByb2plY3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgcm9vdDogbm9ybWFsaXplUGF0aChwYXRoLnJlbGF0aXZlKHdvcmtzcGFjZVJvb3QsIHByb2plY3RSb290KSksXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXNrczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Q6IHRlc3RDb25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICBwcm9qZWN0cy5wdXNoKHByb2plY3RJbnRlcm5hbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFwcm9qZWN0cy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvamVjdE1hcDogeyBba2V5OiBzdHJpbmddOiBQcm9qZWN0Q29uZmlnSW50ZXJuYWwgfSA9IHt9O1xuICAgIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuICAgICAgICBwcm9qZWN0TWFwW3Byb2plY3QuX3Byb2plY3ROYW1lXSA9IHByb2plY3Q7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgcHJvamVjdHM6IHByb2plY3RNYXBcbiAgICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBkZXRlY3RCdWlsZENvbmZpZyhcbiAgICB3b3Jrc3BhY2VSb290OiBzdHJpbmcsXG4gICAgcHJvamVjdFJvb3Q6IHN0cmluZyxcbiAgICBwYWNrYWdlTmFtZVdpdGhvdXRTY29wZTogc3RyaW5nXG4pOiBQcm9taXNlPEJ1aWxkQ29uZmlnIHwgbnVsbD4ge1xuICAgIGNvbnN0IHRzQ29uZmlnUGF0aCA9IGF3YWl0IGZpbmRCdWlsZFRzY29uZmlnRmlsZShwcm9qZWN0Um9vdCwgd29ya3NwYWNlUm9vdCk7XG4gICAgaWYgKCF0c0NvbmZpZ1BhdGgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgdHNDb25maWdKc29uID0gcmVhZFRzY29uZmlnSnNvbih0c0NvbmZpZ1BhdGgpO1xuICAgIGNvbnN0IHRzQ29tcGlsZXJDb25maWcgPSBwYXJzZVRzSnNvbkNvbmZpZ0ZpbGVDb250ZW50KHRzQ29uZmlnUGF0aCk7XG4gICAgY29uc3QgdHNDb25maWdJbmZvOiBUc0NvbmZpZ0luZm8gPSB7XG4gICAgICAgIHRzQ29uZmlnUGF0aCxcbiAgICAgICAgdHNDb25maWdKc29uLFxuICAgICAgICB0c0NvbXBpbGVyQ29uZmlnXG4gICAgfTtcblxuICAgIGNvbnN0IGVudHJ5TmFtZSA9IGF3YWl0IGRldGVjdFRzRW50cnlOYW1lKHRzQ29uZmlnSW5mbywgcGFja2FnZU5hbWVXaXRob3V0U2NvcGUpO1xuICAgIGlmICghZW50cnlOYW1lKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIHNjcmlwdDoge1xuICAgICAgICAgICAgY29tcGlsYXRpb25zOiAnYXV0bydcbiAgICAgICAgfVxuICAgIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRldGVjdFRlc3RDb25maWcod29ya3NwYWNlUm9vdDogc3RyaW5nLCBwcm9qZWN0Um9vdDogc3RyaW5nKTogUHJvbWlzZTxUZXN0Q29uZmlnIHwgbnVsbD4ge1xuICAgIGNvbnN0IHRzQ29uZmlnUGF0aCA9IGF3YWl0IGZpbmRUZXN0VHNjb25maWdGaWxlKHByb2plY3RSb290LCB3b3Jrc3BhY2VSb290KTtcbiAgICBjb25zdCB0ZXN0SW5kZXhGaWxlID0gYXdhaXQgZmluZFRlc3RJbmRleEZpbGUocHJvamVjdFJvb3QsIHdvcmtzcGFjZVJvb3QsIHRzQ29uZmlnUGF0aCk7XG5cbiAgICBjb25zdCBrYXJtYUNvbmZpZ0ZpbGVQYXRoID0gYXdhaXQgZmluZEthcm1hQ29uZmlnRmlsZShwcm9qZWN0Um9vdCwgd29ya3NwYWNlUm9vdCk7XG5cbiAgICBpZiAoIWthcm1hQ29uZmlnRmlsZVBhdGggJiYgIXRlc3RJbmRleEZpbGUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHNDb25maWc6IHRzQ29uZmlnUGF0aCA/IHBhdGgucmVsYXRpdmUocHJvamVjdFJvb3QsIHRzQ29uZmlnUGF0aCkgOiB1bmRlZmluZWQsXG4gICAgICAgIHRlc3RJbmRleEZpbGU6IHRlc3RJbmRleEZpbGUgPyBwYXRoLnJlbGF0aXZlKHByb2plY3RSb290LCB0ZXN0SW5kZXhGaWxlKSA6IHVuZGVmaW5lZCxcbiAgICAgICAga2FybWFDb25maWc6IGthcm1hQ29uZmlnRmlsZVBhdGggPyBwYXRoLnJlbGF0aXZlKHByb2plY3RSb290LCBrYXJtYUNvbmZpZ0ZpbGVQYXRoKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgY29kZUNvdmVyYWdlRXhjbHVkZTogWycqKi90ZXN0LnRzJywgJyoqL2luZGV4LnRzJywgJyoqL3B1YmxpY19hcGkudHMnXSxcbiAgICAgICAgZW52T3ZlcnJpZGVzOiB7XG4gICAgICAgICAgICBjaToge1xuICAgICAgICAgICAgICAgIGJyb3dzZXJzOiBbJ0Nocm9tZUhlYWRsZXNzQ0knXSxcbiAgICAgICAgICAgICAgICByZXBvcnRlcnM6IFsnanVuaXQnLCAnY292ZXJhZ2UnXVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbn1cbiJdfQ==