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.
104 lines • 20.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.applyProjectExtends = void 0;
const path = require("path");
const fs_extra_1 = require("fs-extra");
const read_workflow_config_1 = require("./read-workflow-config");
const to_workflow_config_internal_1 = require("./to-workflow-config-internal");
async function applyProjectExtends(projectConfig, projects = {}, configPath) {
if (!projectConfig.extends || !projectConfig.extends.trim().length) {
return;
}
let projectCollection = {};
if (Array.isArray(projects)) {
projects.forEach((project) => {
projectCollection[project._projectName] = project;
});
}
else {
projectCollection = projects;
}
await applyProjectExtendsInternal(projectConfig, projectCollection, configPath);
}
exports.applyProjectExtends = applyProjectExtends;
async function applyProjectExtendsInternal(projectConfig, projectCollection = {}, rootConfigPath) {
if (!projectConfig.extends) {
return;
}
const currentConfigFile = projectConfig._config === rootConfigPath ? path.parse(rootConfigPath).base : projectConfig._config;
const configErrorLocation = `projects[${projectConfig._projectName}].extends`;
let baseProjectConfig;
if (projectConfig.extends.startsWith('project:')) {
baseProjectConfig = getBaseProjectConfigFromProjectCollection(projectConfig, projectCollection, rootConfigPath);
}
else if (projectConfig.extends.startsWith('file:')) {
baseProjectConfig = await getBaseProjectConfigFromFile(projectConfig, rootConfigPath);
}
else {
throw new Error(`Error in extending project config. Invalid extends name, config location ${currentConfigFile} -> ${configErrorLocation}.`);
}
if (!baseProjectConfig) {
return;
}
const clonedBaseProject = JSON.parse(JSON.stringify(baseProjectConfig));
if (clonedBaseProject.extends) {
await applyProjectExtendsInternal(clonedBaseProject, projectCollection, rootConfigPath);
delete clonedBaseProject.extends;
}
const extendedConfig = Object.assign(Object.assign({}, clonedBaseProject), projectConfig);
Object.assign(projectConfig, extendedConfig);
}
function getBaseProjectConfigFromProjectCollection(projectConfig, projectCollection = {}, rootConfigPath) {
if (!projectConfig.extends) {
return null;
}
const currentConfigFile = projectConfig._config === rootConfigPath ? path.parse(rootConfigPath).base : projectConfig._config;
const configErrorLocation = `projects[${projectConfig._projectName}].extends`;
const projectNameToExtend = projectConfig.extends.substr('project:'.length).trim();
if (!projectNameToExtend) {
throw new Error(`Error in extending project config. Invalid extends name, config location ${currentConfigFile} -> ${configErrorLocation}.`);
}
const foundBaseProject = projectCollection[projectNameToExtend];
if (!foundBaseProject) {
throw new Error(`Error in extending project config. No base project config exists with name '${projectNameToExtend}', config location ${currentConfigFile} -> ${configErrorLocation}.`);
}
if (foundBaseProject._projectName === projectConfig._projectName) {
throw new Error(`Error in extending project config. Base project name must not be the same as current project name, config location ${currentConfigFile} -> ${configErrorLocation}.`);
}
return foundBaseProject;
}
async function getBaseProjectConfigFromFile(projectConfig, rootConfigPath) {
if (!projectConfig.extends) {
return null;
}
const currentConfigFile = projectConfig._config === rootConfigPath ? path.parse(rootConfigPath).base : projectConfig._config;
const configErrorLocation = `projects[${projectConfig._projectName}].extends`;
const parts = projectConfig.extends.split(':');
if (parts.length !== 3) {
throw new Error(`Error in extending project config. Invalid extends name, config location ${currentConfigFile} -> ${configErrorLocation}.`);
}
const extendsFilePath = path.isAbsolute(parts[1])
? path.resolve(parts[1])
: path.resolve(path.dirname(projectConfig._config || rootConfigPath), parts[1]);
if (!(await fs_extra_1.pathExists(extendsFilePath))) {
throw new Error(`Error in extending project config. No file exists at ${extendsFilePath}, config location ${currentConfigFile} -> ${configErrorLocation}.`);
}
try {
const projectNameToExtend = parts[2];
const workflowConfig = await read_workflow_config_1.readWorkflowConfig(extendsFilePath);
const foundBaseProject = workflowConfig.projects[projectNameToExtend];
if (!foundBaseProject) {
throw new Error(`Error in extending project config. No base project config exists with name '${projectNameToExtend}', config location ${currentConfigFile} -> ${configErrorLocation}.`);
}
const workflowConfigInternal = to_workflow_config_internal_1.toWorkflowConfigInternal(workflowConfig, extendsFilePath, projectConfig._workspaceRoot);
const foundBaseProjectInternal = workflowConfigInternal.projects[projectNameToExtend];
if (foundBaseProjectInternal._projectName === projectConfig._projectName) {
throw new Error(`Error in extending project config. Base project name must not be the same as current project name, config location ${currentConfigFile} -> ${configErrorLocation}.`);
}
return Object.assign(Object.assign({}, foundBaseProjectInternal), { _config: extendsFilePath, _workspaceRoot: projectConfig._workspaceRoot, _projectName: projectConfig._projectName, _projectRoot: projectConfig._projectRoot });
}
catch (err) {
throw new Error(`Error in extending project config, could not read file '${extendsFilePath}'. Config location ${currentConfigFile} -> ${configErrorLocation}.`);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbHktcHJvamVjdC1leHRlbmRzLmpzIiwic291cmNlUm9vdCI6Ii4vIiwic291cmNlcyI6WyJoZWxwZXJzL2FwcGx5LXByb2plY3QtZXh0ZW5kcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBNkI7QUFFN0IsdUNBQXNDO0FBSXRDLGlFQUE0RDtBQUM1RCwrRUFBeUU7QUFFbEUsS0FBSyxVQUFVLG1CQUFtQixDQUNyQyxhQUFvQyxFQUNwQyxXQUErRSxFQUFFLEVBQ2pGLFVBQWtCO0lBRWxCLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUU7UUFDaEUsT0FBTztLQUNWO0lBRUQsSUFBSSxpQkFBaUIsR0FBNkMsRUFBRSxDQUFDO0lBQ3JFLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRTtRQUN6QixRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDekIsaUJBQWlCLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxHQUFHLE9BQU8sQ0FBQztRQUN0RCxDQUFDLENBQUMsQ0FBQztLQUNOO1NBQU07UUFDSCxpQkFBaUIsR0FBRyxRQUFRLENBQUM7S0FDaEM7SUFFRCxNQUFNLDJCQUEyQixDQUFDLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUNwRixDQUFDO0FBbkJELGtEQW1CQztBQUVELEtBQUssVUFBVSwyQkFBMkIsQ0FDdEMsYUFBb0MsRUFDcEMsb0JBQThELEVBQUUsRUFDaEUsY0FBc0I7SUFFdEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUU7UUFDeEIsT0FBTztLQUNWO0lBRUQsTUFBTSxpQkFBaUIsR0FDbkIsYUFBYSxDQUFDLE9BQU8sS0FBSyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxD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RUFBRTtZQUNuQixNQUFNLElBQUksS0FBSyxDQUNYLCtFQUErRSxtQkFBbUIsc0JBQXNCLGlCQUFpQixPQUFPLG1CQUFtQixHQUFHLENBQ3pLLENBQUM7U0FDTDtRQUVELE1BQU0sc0JBQXNCLEdBQUcsc0RBQXdCLENBQ25ELGNBQWMsRUFDZCxlQUFlLEVBQ2YsYUFBYSxDQUFDLGNBQWMsQ0FDL0IsQ0FBQztRQUNGLE1BQU0sd0JBQXdCLEdBQUcsc0JBQXNCLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFFdEYsSUFBSSx3QkFBd0IsQ0FBQyxZQUFZLEtBQUssYUFBYSxDQUFDLFlBQVksRUFBRTtZQUN0RSxNQUFNLElBQUksS0FBSyxDQUNYLHNIQUFzSCxpQkFBaUIsT0FBTyxtQkFBbUIsR0FBRyxDQUN2SyxDQUFDO1NBQ0w7UUFFRCx1Q0FDTyx3QkFBd0IsS0FDM0IsT0FBTyxFQUFFLGVBQWUsRUFDeEIsY0FBYyxFQUFFLGFBQWEsQ0FBQyxjQUFjLEVBQzVDLFlBQVksRUFBRSxhQUFhLENBQUMsWUFBWSxFQUN4QyxZQUFZLEVBQUUsYUFBYSxDQUFDLFlBQVksSUFDMUM7S0FDTDtJQUFDLE9BQU8sR0FBRyxFQUFFO1FBQ1YsTUFBTSxJQUFJLEtBQUssQ0FDWCwyREFBMkQsZUFBZSxzQkFBc0IsaUJBQWlCLE9BQU8sbUJBQW1CLEdBQUcsQ0FDakosQ0FBQztLQUNMO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7IHBhdGhFeGlzdHMgfSBmcm9tICdmcy1leHRyYSc7XG5cbmltcG9ydCB7IFByb2plY3RDb25maWdJbnRlcm5hbCB9IGZyb20gJy4uL21vZGVscyc7XG5cbmltcG9ydCB7IHJlYWRXb3JrZmxvd0NvbmZpZyB9IGZyb20gJy4vcmVhZC13b3JrZmxvdy1jb25maWcnO1xuaW1wb3J0IHsgdG9Xb3JrZmxvd0NvbmZpZ0ludGVybmFsIH0gZnJvbSAnLi90by13b3JrZmxvdy1jb25maWctaW50ZXJuYWwnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXBwbHlQcm9qZWN0RXh0ZW5kcyhcbiAgICBwcm9qZWN0Q29uZmlnOiBQcm9qZWN0Q29uZmlnSW50ZXJuYWwsXG4gICAgcHJvamVjdHM6IHsgW2tleTogc3RyaW5nXTogUHJvamVjdENvbmZpZ0ludGVybmFsIH0gfCBQcm9qZWN0Q29uZmlnSW50ZXJuYWxbXSA9IHt9LFxuICAgIGNvbmZpZ1BhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFwcm9qZWN0Q29uZmlnLmV4dGVuZHMgfHwgIXByb2plY3RDb25maWcuZXh0ZW5kcy50cmltKCkubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgcHJvamVjdENvbGxlY3Rpb246IHsgW2tleTogc3RyaW5nXTogUHJvamVjdENvbmZpZ0ludGVybmFsIH0gPSB7fTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9qZWN0cykpIHtcbiAgICAgICAgcHJvamVjdHMuZm9yRWFjaCgocHJvamVjdCkgPT4ge1xuICAgICAgICAgICAgcHJvamVjdENvbGxlY3Rpb25bcHJvamVjdC5fcHJvamVjdE5hbWVdID0gcHJvamVjdDtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcHJvamVjdENvbGxlY3Rpb24gPSBwcm9qZWN0cztcbiAgICB9XG5cbiAgICBhd2FpdCBhcHBseVByb2plY3RFeHRlbmRzSW50ZXJuYWwocHJvamVjdENvbmZpZywgcHJvamVjdENvbGxlY3Rpb24sIGNvbmZpZ1BhdGgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBhcHBseVByb2plY3RFeHRlbmRzSW50ZXJuYWwoXG4gICAgcHJvamVjdENvbmZpZzogUHJvamVjdENvbmZpZ0ludGVybmFsLFxuICAgIHByb2plY3RDb2xsZWN0aW9uOiB7IFtrZXk6IHN0cmluZ106IFByb2plY3RDb25maWdJbnRlcm5hbCB9ID0ge30sXG4gICAgcm9vdENvbmZpZ1BhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFwcm9qZWN0Q29uZmlnLmV4dGVuZHMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRDb25maWdGaWxlID1cbiAgICAgICAgcHJvamVjdENvbmZpZy5fY29uZmlnID09PSByb290Q29uZmlnUGF0aCA/IHBhdGgucGFyc2Uocm9vdENvbmZpZ1BhdGgpLmJhc2UgOiBwcm9qZWN0Q29uZmlnLl9jb25maWc7XG4gICAgY29uc3QgY29uZmlnRXJyb3JMb2NhdGlvbiA9IGBwcm9qZWN0c1ske3Byb2plY3RDb25maWcuX3Byb2plY3ROYW1lfV0uZXh0ZW5kc2A7XG4gICAgbGV0IGJhc2VQcm9qZWN0Q29uZmlnOiBQcm9qZWN0Q29uZmlnSW50ZXJuYWwgfCBudWxsO1xuXG4gICAgaWYgKHByb2plY3RDb25maWcuZXh0ZW5kcy5zdGFydHNXaXRoKCdwcm9qZWN0OicpKSB7XG4gICAgICAgIGJhc2VQcm9qZWN0Q29uZmlnID0gZ2V0QmFzZVByb2plY3RDb25maWdGcm9tUHJvamVjdENvbGxlY3Rpb24ocHJvamVjdENvbmZpZywgcHJvamVjdENvbGxlY3Rpb24sIHJvb3RDb25maWdQYXRoKTtcbiAgICB9IGVsc2UgaWYgKHByb2plY3RDb25maWcuZXh0ZW5kcy5zdGFydHNXaXRoKCdmaWxlOicpKSB7XG4gICAgICAgIGJhc2VQcm9qZWN0Q29uZmlnID0gYXdhaXQgZ2V0QmFzZVByb2plY3RDb25maWdGcm9tRmlsZShwcm9qZWN0Q29uZmlnLCByb290Q29uZmlnUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEVycm9yIGluIGV4dGVuZGluZyBwcm9qZWN0IGNvbmZpZy4gSW52YWxpZCBleHRlbmRzIG5hbWUsIGNvbmZpZyBsb2NhdGlvbiAke2N1cnJlbnRDb25maWdGaWxlfSAtPiAke2NvbmZpZ0Vycm9yTG9jYXRpb259LmBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIWJhc2VQcm9qZWN0Q29uZmlnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjbG9uZWRCYXNlUHJvamVjdCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoYmFzZVByb2plY3RDb25maWcpKSBhcyBQcm9qZWN0Q29uZmlnSW50ZXJuYWw7XG4gICAgaWYgKGNsb25lZEJhc2VQcm9qZWN0LmV4dGVuZHMpIHtcbiAgICAgICAgYXdhaXQgYXBwbHlQcm9qZWN0RXh0ZW5kc0ludGVybmFsKGNsb25lZEJhc2VQcm9qZWN0LCBwcm9qZWN0Q29sbGVjdGlvbiwgcm9vdENvbmZpZ1BhdGgpO1xuXG4gICAgICAgIGRlbGV0ZSBjbG9uZWRCYXNlUHJvamVjdC5leHRlbmRzO1xuICAgIH1cblxuICAgIGNvbnN0IGV4dGVuZGVkQ29uZmlnID0geyAuLi5jbG9uZWRCYXNlUHJvamVjdCwgLi4ucHJvamVjdENvbmZpZyB9O1xuICAgIE9iamVjdC5hc3NpZ24ocHJvamVjdENvbmZpZywgZXh0ZW5kZWRDb25maWcpO1xufVxuXG5mdW5jdGlvbiBnZXRCYXNlUHJvamVjdENvbmZpZ0Zyb21Qcm9qZWN0Q29sbGVjdGlvbihcbiAgICBwcm9qZWN0Q29uZmlnOiBQcm9qZWN0Q29uZmlnSW50ZXJuYWwsXG4gICAgcHJvamVjdENvbGxlY3Rpb246IHsgW2tleTogc3RyaW5nXTogUHJvamVjdENvbmZpZ0ludGVybmFsIH0gPSB7fSxcbiAgICByb290Q29uZmlnUGF0aDogc3RyaW5nXG4pOiBQcm9qZWN0Q29uZmlnSW50ZXJuYWwgfCBudWxsIHtcbiAgICBpZiAoIXByb2plY3RDb25maWcuZXh0ZW5kcykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50Q29uZmlnRmlsZSA9XG4gICAgICAgIHByb2plY3RDb25maWcuX2NvbmZpZyA9PT0gcm9vdENvbmZpZ1BhdGggPyBwYXRoLnBhcnNlKHJvb3RDb25maWdQYXRoKS5iYXNlIDogcHJvamVjdENvbmZpZy5fY29uZmlnO1xuICAgIGNvbnN0IGNvbmZpZ0Vycm9yTG9jYXRpb24gPSBgcHJvamVjdHNbJHtwcm9qZWN0Q29uZmlnLl9wcm9qZWN0TmFtZX1dLmV4dGVuZHNgO1xuXG4gICAgY29uc3QgcHJvamVjdE5hbWVUb0V4dGVuZCA9IHByb2plY3RDb25maWcuZXh0ZW5kcy5zdWJzdHIoJ3Byb2plY3Q6Jy5sZW5ndGgpLnRyaW0oKTtcbiAgICBpZiAoIXByb2plY3ROYW1lVG9FeHRlbmQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEVycm9yIGluIGV4dGVuZGluZyBwcm9qZWN0IGNvbmZpZy4gSW52YWxpZCBleHRlbmRzIG5hbWUsIGNvbmZpZyBsb2NhdGlvbiAke2N1cnJlbnRDb25maWdGaWxlfSAtPiAke2NvbmZpZ0Vycm9yTG9jYXRpb259LmBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBmb3VuZEJhc2VQcm9qZWN0ID0gcHJvamVjdENvbGxlY3Rpb25bcHJvamVjdE5hbWVUb0V4dGVuZF07XG4gICAgaWYgKCFmb3VuZEJhc2VQcm9qZWN0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFcnJvciBpbiBleHRlbmRpbmcgcHJvamVjdCBjb25maWcuIE5vIGJhc2UgcHJvamVjdCBjb25maWcgZXhpc3RzIHdpdGggbmFtZSAnJHtwcm9qZWN0TmFtZVRvRXh0ZW5kfScsIGNvbmZpZyBsb2NhdGlvbiAke2N1cnJlbnRDb25maWdGaWxlfSAtPiAke2NvbmZpZ0Vycm9yTG9jYXRpb259LmBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoZm91bmRCYXNlUHJvamVjdC5fcHJvamVjdE5hbWUgPT09IHByb2plY3RDb25maWcuX3Byb2plY3ROYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFcnJvciBpbiBleHRlbmRpbmcgcHJvamVjdCBjb25maWcuIEJhc2UgcHJvamVjdCBuYW1lIG11c3Qgbm90IGJlIHRoZSBzYW1lIGFzIGN1cnJlbnQgcHJvamVjdCBuYW1lLCBjb25maWcgbG9jYXRpb24gJHtjdXJyZW50Q29uZmlnRmlsZX0gLT4gJHtjb25maWdFcnJvckxvY2F0aW9ufS5gXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZvdW5kQmFzZVByb2plY3Q7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEJhc2VQcm9qZWN0Q29uZmlnRnJvbUZpbGUoXG4gICAgcHJvamVjdENvbmZpZzogUHJvamVjdENvbmZpZ0ludGVybmFsLFxuICAgIHJvb3RDb25maWdQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8UHJvamVjdENvbmZpZ0ludGVybmFsIHwgbnVsbD4ge1xuICAgIGlmICghcHJvamVjdENvbmZpZy5leHRlbmRzKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRDb25maWdGaWxlID1cbiAgICAgICAgcHJvamVjdENvbmZpZy5fY29uZmlnID09PSByb290Q29uZmlnUGF0aCA/IHBhdGgucGFyc2Uocm9vdENvbmZpZ1BhdGgpLmJhc2UgOiBwcm9qZWN0Q29uZmlnLl9jb25maWc7XG4gICAgY29uc3QgY29uZmlnRXJyb3JMb2NhdGlvbiA9IGBwcm9qZWN0c1ske3Byb2plY3RDb25maWcuX3Byb2plY3ROYW1lfV0uZXh0ZW5kc2A7XG5cbiAgICBjb25zdCBwYXJ0cyA9IHByb2plY3RDb25maWcuZXh0ZW5kcy5zcGxpdCgnOicpO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEVycm9yIGluIGV4dGVuZGluZyBwcm9qZWN0IGNvbmZpZy4gSW52YWxpZCBleHRlbmRzIG5hbWUsIGNvbmZpZyBsb2NhdGlvbiAke2N1cnJlbnRDb25maWdGaWxlfSAtPiAke2NvbmZpZ0Vycm9yTG9jYXRpb259LmBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBleHRlbmRzRmlsZVBhdGggPSBwYXRoLmlzQWJzb2x1dGUocGFydHNbMV0pXG4gICAgICAgID8gcGF0aC5yZXNvbHZlKHBhcnRzWzFdKVxuICAgICAgICA6IHBhdGgucmVzb2x2ZShwYXRoLmRpcm5hbWUocHJvamVjdENvbmZpZy5fY29uZmlnIHx8IHJvb3RDb25maWdQYXRoKSwgcGFydHNbMV0pO1xuXG4gICAgaWYgKCEoYXdhaXQgcGF0aEV4aXN0cyhleHRlbmRzRmlsZVBhdGgpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXJyb3IgaW4gZXh0ZW5kaW5nIHByb2plY3QgY29uZmlnLiBObyBmaWxlIGV4aXN0cyBhdCAke2V4dGVuZHNGaWxlUGF0aH0sIGNvbmZpZyBsb2NhdGlvbiAke2N1cnJlbnRDb25maWdGaWxlfSAtPiAke2NvbmZpZ0Vycm9yTG9jYXRpb259LmBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICBjb25zdCBwcm9qZWN0TmFtZVRvRXh0ZW5kID0gcGFydHNbMl07XG4gICAgICAgIGNvbnN0IHdvcmtmbG93Q29uZmlnID0gYXdhaXQgcmVhZFdvcmtmbG93Q29uZmlnKGV4dGVuZHNGaWxlUGF0aCk7XG4gICAgICAgIGNvbnN0IGZvdW5kQmFzZVByb2plY3QgPSB3b3JrZmxvd0NvbmZpZy5wcm9qZWN0c1twcm9qZWN0TmFtZVRvRXh0ZW5kXTtcbiAgICAgICAgaWYgKCFmb3VuZEJhc2VQcm9qZWN0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYEVycm9yIGluIGV4dGVuZGluZyBwcm9qZWN0IGNvbmZpZy4gTm8gYmFzZSBwcm9qZWN0IGNvbmZpZyBleGlzdHMgd2l0aCBuYW1lICcke3Byb2plY3ROYW1lVG9FeHRlbmR9JywgY29uZmlnIGxvY2F0aW9uICR7Y3VycmVudENvbmZpZ0ZpbGV9IC0+ICR7Y29uZmlnRXJyb3JMb2NhdGlvbn0uYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHdvcmtmbG93Q29uZmlnSW50ZXJuYWwgPSB0b1dvcmtmbG93Q29uZmlnSW50ZXJuYWwoXG4gICAgICAgICAgICB3b3JrZmxvd0NvbmZpZyxcbiAgICAgICAgICAgIGV4dGVuZHNGaWxlUGF0aCxcbiAgICAgICAgICAgIHByb2plY3RDb25maWcuX3dvcmtzcGFjZVJvb3RcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZm91bmRCYXNlUHJvamVjdEludGVybmFsID0gd29ya2Zsb3dDb25maWdJbnRlcm5hbC5wcm9qZWN0c1twcm9qZWN0TmFtZVRvRXh0ZW5kXTtcblxuICAgICAgICBpZiAoZm91bmRCYXNlUHJvamVjdEludGVybmFsLl9wcm9qZWN0TmFtZSA9PT0gcHJvamVjdENvbmZpZy5fcHJvamVjdE5hbWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgRXJyb3IgaW4gZXh0ZW5kaW5nIHByb2plY3QgY29uZmlnLiBCYXNlIHByb2plY3QgbmFtZSBtdXN0IG5vdCBiZSB0aGUgc2FtZSBhcyBjdXJyZW50IHByb2plY3QgbmFtZSwgY29uZmlnIGxvY2F0aW9uICR7Y3VycmVudENvbmZpZ0ZpbGV9IC0+ICR7Y29uZmlnRXJyb3JMb2NhdGlvbn0uYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5mb3VuZEJhc2VQcm9qZWN0SW50ZXJuYWwsXG4gICAgICAgICAgICBfY29uZmlnOiBleHRlbmRzRmlsZVBhdGgsXG4gICAgICAgICAgICBfd29ya3NwYWNlUm9vdDogcHJvamVjdENvbmZpZy5fd29ya3NwYWNlUm9vdCxcbiAgICAgICAgICAgIF9wcm9qZWN0TmFtZTogcHJvamVjdENvbmZpZy5fcHJvamVjdE5hbWUsXG4gICAgICAgICAgICBfcHJvamVjdFJvb3Q6IHByb2plY3RDb25maWcuX3Byb2plY3RSb290XG4gICAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFcnJvciBpbiBleHRlbmRpbmcgcHJvamVjdCBjb25maWcsIGNvdWxkIG5vdCByZWFkIGZpbGUgJyR7ZXh0ZW5kc0ZpbGVQYXRofScuIENvbmZpZyBsb2NhdGlvbiAke2N1cnJlbnRDb25maWdGaWxlfSAtPiAke2NvbmZpZ0Vycm9yTG9jYXRpb259LmBcbiAgICAgICAgKTtcbiAgICB9XG59XG4iXX0=