UNPKG

@aws/pdk

Version:

All documentation is located at: https://aws.github.io/aws-pdk

209 lines 26.1 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.MonorepoPythonProject = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); /*! Copyright [Amazon.com](http://amazon.com/), Inc. or its affiliates. All Rights Reserved. SPDX-License-Identifier: Apache-2.0 */ const projen_1 = require("projen"); const javascript_1 = require("projen/lib/javascript"); const python_1 = require("projen/lib/python"); const nx_configurator_1 = require("../../components/nx-configurator"); const nx_project_1 = require("../../components/nx-project"); const projen_dependency_1 = require("../../components/projen-dependency"); const utils_1 = require("../../utils"); /** * This project type will bootstrap a NX based monorepo with support for polygot * builds, build caching, dependency graph visualization and much more. * * @pjid monorepo-py */ class MonorepoPythonProject extends python_1.PythonProject { constructor(options) { super({ ...options, sample: false, poetry: true, pytest: options.pytest ?? false, version: options.version ?? "0.0.0", authorName: options.authorName ?? "pdkuser", authorEmail: options.authorEmail ?? "user@pdk.com", projenrcPythonOptions: { ...options.projenrcPythonOptions, projenVersion: options.projenrcPythonOptions?.projenVersion ?? projen_dependency_1.DEFAULT_PROJEN_VERSION, }, }); this.projenVersion = options.projenrcPythonOptions?.projenVersion ?? projen_dependency_1.DEFAULT_PROJEN_VERSION; // Remove dependency on typescript package which projen incorrectly adds to initial .projenrc.py // See: https://github.com/projen/projen/issues/2475 this.deps.removeDependency("@aws/pdk"); this.addDevDependency("aws_pdk@^0"); this.nxConfigurator = new nx_configurator_1.NxConfigurator(this, { defaultReleaseBranch: options.defaultReleaseBranch ?? "main", licenseOptions: options.licenseOptions, }); // Setup python NX plugin this.nx.plugins.push("@nxlv/python"); this.installTask = this.nxConfigurator.ensureNxInstallTask({ "@nxlv/python": "^18", }); // Map tasks to nx run-many this.nxConfigurator._overrideNxBuildTask(this.buildTask, { target: "build" }, { force: true }); this.nxConfigurator._overrideNxBuildTask(this.preCompileTask, { target: "pre-compile", }); this.nxConfigurator._overrideNxBuildTask(this.compileTask, { target: "compile", }); this.nxConfigurator._overrideNxBuildTask(this.postCompileTask, { target: "post-compile", }); this.nxConfigurator._overrideNxBuildTask(this.testTask, { target: "test", }); this.nxConfigurator._overrideNxBuildTask(this.packageTask, { target: "package", }); } /** * @inheritdoc */ get nx() { return this.nxConfigurator.nx; } /** * @inheritdoc */ execNxRunManyCommand(options) { return this.nxConfigurator.execNxRunManyCommand(options); } /** * @inheritdoc */ composeNxRunManyCommand(options) { return this.nxConfigurator.composeNxRunManyCommand(options); } /** * @inheritdoc */ addNxRunManyTask(name, options) { return this.nxConfigurator.addNxRunManyTask(name, options); } /** * @inheritdoc */ addImplicitDependency(dependent, dependee) { this.nxConfigurator.addImplicitDependency(dependent, dependee); } /** * @inheritdoc */ addJavaDependency(dependent, dependee) { this.nxConfigurator.addJavaDependency(dependent, dependee); } /** * @inheritdoc */ addPythonPoetryDependency(dependent, dependee) { this.nxConfigurator.addPythonPoetryDependency(dependent, dependee); } addUpgradeDepsTask() { const upgradeDepsTask = new projen_1.Task("upgrade-deps", { description: "Upgrade dependencies in the monorepo", }); this.nxConfigurator._overrideNxBuildTask(upgradeDepsTask, { target: "upgrade", }); // Spawn the install task for python projects since this will update the lockfile to the latest versions satisfying // the pyproject.toml file // TODO: remove in favour of the "upgrade" task if ever implemented for python upgradeDepsTask.spawn(this.depsManager.installTask); this.nxConfigurator._configurePythonSubprojectUpgradeDeps(this, upgradeDepsTask); } /** * @inheritdoc */ preSynthesize() { // Calling before super() to ensure proper pre-synth of NxProject component and its nested components this.nxConfigurator.preSynthesize(); this.addUpgradeDepsTask(); super.preSynthesize(); (0, projen_dependency_1.syncProjenVersions)(this.subprojects, this.projenVersion); } /** * @inheritDoc */ synth() { this.validateSubProjects(); this.installPythonSubprojects(); this.nxConfigurator.synth(); super.synth(); } /** * @inheritdoc * * NOTE: Be sure to ensure the VIRTUAL_ENV is unset during postSynthesize as the individual poetry envs will only be created if a existing VIRTUAL_ENV cannot be found. */ postSynthesize() { const vEnv = process.env.VIRTUAL_ENV; process.env.VIRTUAL_ENV = ""; super.postSynthesize(); process.env.VIRTUAL_ENV = vEnv; } /** * Ensures all python subprojects have their install target called after the monorepo install task. */ installPythonSubprojects() { const installProjects = this.subprojects.filter((project) => isPythonProject(project)); if (installProjects.length > 0) { const nxRunManyInstall = this.composeNxRunManyCommand({ target: "install", projects: installProjects.map((project) => project.name), parallel: 1, }); this.installTask.exec(utils_1.NodePackageUtils.command.exec(javascript_1.NodePackageManager.NPM, ...nxRunManyInstall)); // Ensure that install-py follows dependency order installProjects.forEach((p) => { nx_project_1.NxProject.ensure(p).setTarget("install", { dependsOn: ["^install"], }); }); } } /** * Ensures subprojects don't have a default task and that all Python subpackages are configured to use Poetry. */ validateSubProjects() { this.subprojects.forEach((subProject) => { // Disable default task on subprojects as this isn't supported in a monorepo subProject.defaultTask?.reset(); if (isPythonProject(subProject) && !isPoetryConfigured(subProject)) { throw new Error(`${subProject.name} must use poetry to manage dependencies when using NXMonorepoPythonProject`); } }); } } exports.MonorepoPythonProject = MonorepoPythonProject; _a = JSII_RTTI_SYMBOL_1; MonorepoPythonProject[_a] = { fqn: "@aws/pdk.monorepo.MonorepoPythonProject", version: "0.26.14" }; /** * Determines if the passed in project is of type PythonProject. * * @param project Project instance. * @returns true if the project instance is of type PythonProject. */ function isPythonProject(project) { return utils_1.ProjectUtils.isNamedInstanceOf(project, python_1.PythonProject); } /** * Determines if the passed in project uses Poetry. * * @param project PythonProject instance. * @returns true if the project uses Poetry. */ function isPoetryConfigured(project) { return (project.components.find((c) => utils_1.ProjectUtils.isNamedInstanceOf(c, python_1.Poetry)) !== undefined); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ub3JlcG8tcHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtb25vcmVwby1weS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBO3NDQUNzQztBQUN0QyxtQ0FBdUM7QUFFdkMsc0RBQTJEO0FBQzNELDhDQUEwRDtBQUUxRCxzRUFJMEM7QUFDMUMsNERBQXdEO0FBRXhELDBFQUc0QztBQUU1Qyx1Q0FBNkQ7QUFnQjdEOzs7OztHQUtHO0FBQ0gsTUFBYSxxQkFDWCxTQUFRLHNCQUFhO0lBV3JCLFlBQVksT0FBcUM7UUFDL0MsS0FBSyxDQUFDO1lBQ0osR0FBRyxPQUFPO1lBQ1YsTUFBTSxFQUFFLEtBQUs7WUFDYixNQUFNLEVBQUUsSUFBSTtZQUNaLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxJQUFJLEtBQUs7WUFDL0IsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPLElBQUksT0FBTztZQUNuQyxVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVUsSUFBSSxTQUFTO1lBQzNDLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVyxJQUFJLGNBQWM7WUFDbEQscUJBQXFCLEVBQUU7Z0JBQ3JCLEdBQUcsT0FBTyxDQUFDLHFCQUFxQjtnQkFDaEMsYUFBYSxFQUNYLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxhQUFhO29CQUM1QywwQ0FBc0I7YUFDekI7U0FDRixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsYUFBYTtZQUNoQixPQUFPLENBQUMscUJBQXFCLEVBQUUsYUFBYSxJQUFJLDBDQUFzQixDQUFDO1FBRXpFLGdHQUFnRztRQUNoRyxvREFBb0Q7UUFDcEQsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUV2QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFcEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLGdDQUFjLENBQUMsSUFBSSxFQUFFO1lBQzdDLG9CQUFvQixFQUFFLE9BQU8s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R0FLRztBQUNILFNBQVMsZUFBZSxDQUFDLE9BQVk7SUFDbkMsT0FBTyxvQkFBWSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxzQkFBYSxDQUFDLENBQUM7QUFDaEUsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxrQkFBa0IsQ0FBQyxPQUFzQjtJQUNoRCxPQUFPLENBQ0wsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUM1QixvQkFBWSxDQUFDLGlCQUFpQixDQUFDLENBQUMsRUFBRSxlQUFNLENBQUMsQ0FDMUMsS0FBSyxTQUFTLENBQ2hCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyohIENvcHlyaWdodCBbQW1hem9uLmNvbV0oaHR0cDovL2FtYXpvbi5jb20vKSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wICovXG5pbXBvcnQgeyBQcm9qZWN0LCBUYXNrIH0gZnJvbSBcInByb2plblwiO1xuaW1wb3J0IHsgSmF2YVByb2plY3QgfSBmcm9tIFwicHJvamVuL2xpYi9qYXZhXCI7XG5pbXBvcnQgeyBOb2RlUGFja2FnZU1hbmFnZXIgfSBmcm9tIFwicHJvamVuL2xpYi9qYXZhc2NyaXB0XCI7XG5pbXBvcnQgeyBQb2V0cnksIFB5dGhvblByb2plY3QgfSBmcm9tIFwicHJvamVuL2xpYi9weXRob25cIjtcbmltcG9ydCB7IFB5dGhvblByb2plY3RPcHRpb25zIH0gZnJvbSBcIi4vcHl0aG9uLXByb2plY3Qtb3B0aW9uc1wiO1xuaW1wb3J0IHtcbiAgSU54UHJvamVjdENvcmUsXG4gIExpY2Vuc2VPcHRpb25zLFxuICBOeENvbmZpZ3VyYXRvcixcbn0gZnJvbSBcIi4uLy4uL2NvbXBvbmVudHMvbngtY29uZmlndXJhdG9yXCI7XG5pbXBvcnQgeyBOeFByb2plY3QgfSBmcm9tIFwiLi4vLi4vY29tcG9uZW50cy9ueC1wcm9qZWN0XCI7XG5pbXBvcnQgeyBOeFdvcmtzcGFjZSB9IGZyb20gXCIuLi8uLi9jb21wb25lbnRzL254LXdvcmtzcGFjZVwiO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9QUk9KRU5fVkVSU0lPTixcbiAgc3luY1Byb2plblZlcnNpb25zLFxufSBmcm9tIFwiLi4vLi4vY29tcG9uZW50cy9wcm9qZW4tZGVwZW5kZW5jeVwiO1xuaW1wb3J0IHsgTnggfSBmcm9tIFwiLi4vLi4vbngtdHlwZXNcIjtcbmltcG9ydCB7IE5vZGVQYWNrYWdlVXRpbHMsIFByb2plY3RVdGlscyB9IGZyb20gXCIuLi8uLi91dGlsc1wiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIE54TW9ub3JlcG9QeXRob25Qcm9qZWN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vbm9yZXBvUHl0aG9uUHJvamVjdE9wdGlvbnMgZXh0ZW5kcyBQeXRob25Qcm9qZWN0T3B0aW9ucyB7XG4gIHJlYWRvbmx5IGRlZmF1bHRSZWxlYXNlQnJhbmNoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IGxpY2Vuc2UgdG8gYXBwbHkgdG8gYWxsIFBESyBtYW5hZ2VkIHBhY2thZ2VzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBBcGFjaGUtMi4wXG4gICAqL1xuICByZWFkb25seSBsaWNlbnNlT3B0aW9ucz86IExpY2Vuc2VPcHRpb25zO1xufVxuXG4vKipcbiAqIFRoaXMgcHJvamVjdCB0eXBlIHdpbGwgYm9vdHN0cmFwIGEgTlggYmFzZWQgbW9ub3JlcG8gd2l0aCBzdXBwb3J0IGZvciBwb2x5Z290XG4gKiBidWlsZHMsIGJ1aWxkIGNhY2hpbmcsIGRlcGVuZGVuY3kgZ3JhcGggdmlzdWFsaXphdGlvbiBhbmQgbXVjaCBtb3JlLlxuICpcbiAqIEBwamlkIG1vbm9yZXBvLXB5XG4gKi9cbmV4cG9ydCBjbGFzcyBNb25vcmVwb1B5dGhvblByb2plY3RcbiAgZXh0ZW5kcyBQeXRob25Qcm9qZWN0XG4gIGltcGxlbWVudHMgSU54UHJvamVjdENvcmVcbntcbiAgcHVibGljIHJlYWRvbmx5IG54Q29uZmlndXJhdG9yOiBOeENvbmZpZ3VyYXRvcjtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnN0YWxsVGFzazogVGFzaztcblxuICAvKipcbiAgICogVmVyc2lvbiBvZiBwcm9qZW4gdXNlZCBieSB0aGUgbW9ub3JlcG8gYW5kIGl0cyBzdWJwcm9qZWN0c1xuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwcm9qZW5WZXJzaW9uOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogTW9ub3JlcG9QeXRob25Qcm9qZWN0T3B0aW9ucykge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBzYW1wbGU6IGZhbHNlLFxuICAgICAgcG9ldHJ5OiB0cnVlLFxuICAgICAgcHl0ZXN0OiBvcHRpb25zLnB5dGVzdCA/PyBmYWxzZSxcbiAgICAgIHZlcnNpb246IG9wdGlvbnMudmVyc2lvbiA/PyBcIjAuMC4wXCIsXG4gICAgICBhdXRob3JOYW1lOiBvcHRpb25zLmF1dGhvck5hbWUgPz8gXCJwZGt1c2VyXCIsXG4gICAgICBhdXRob3JFbWFpbDogb3B0aW9ucy5hdXRob3JFbWFpbCA/PyBcInVzZXJAcGRrLmNvbVwiLFxuICAgICAgcHJvamVucmNQeXRob25PcHRpb25zOiB7XG4gICAgICAgIC4uLm9wdGlvbnMucHJvamVucmNQeXRob25PcHRpb25zLFxuICAgICAgICBwcm9qZW5WZXJzaW9uOlxuICAgICAgICAgIG9wdGlvbnMucHJvamVucmNQeXRob25PcHRpb25zPy5wcm9qZW5WZXJzaW9uID8/XG4gICAgICAgICAgREVGQVVMVF9QUk9KRU5fVkVSU0lPTixcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdGhpcy5wcm9qZW5WZXJzaW9uID1cbiAgICAgIG9wdGlvbnMucHJvamVucmNQeXRob25PcHRpb25zPy5wcm9qZW5WZXJzaW9uID8/IERFRkFVTFRfUFJPSkVOX1ZFUlNJT047XG5cbiAgICAvLyBSZW1vdmUgZGVwZW5kZW5jeSBvbiB0eXBlc2NyaXB0IHBhY2thZ2Ugd2hpY2ggcHJvamVuIGluY29ycmVjdGx5IGFkZHMgdG8gaW5pdGlhbCAucHJvamVucmMucHlcbiAgICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9wcm9qZW4vcHJvamVuL2lzc3Vlcy8yNDc1XG4gICAgdGhpcy5kZXBzLnJlbW92ZURlcGVuZGVuY3koXCJAYXdzL3Bka1wiKTtcblxuICAgIHRoaXMuYWRkRGV2RGVwZW5kZW5jeShcImF3c19wZGtAXjBcIik7XG5cbiAgICB0aGlzLm54Q29uZmlndXJhdG9yID0gbmV3IE54Q29uZmlndXJhdG9yKHRoaXMsIHtcbiAgICAgIGRlZmF1bHRSZWxlYXNlQnJhbmNoOiBvcHRpb25zLmRlZmF1bHRSZWxlYXNlQnJhbmNoID8/IFwibWFpblwiLFxuICAgICAgbGljZW5zZU9wdGlvbnM6IG9wdGlvbnMubGljZW5zZU9wdGlvbnMsXG4gICAgfSk7XG5cbiAgICAvLyBTZXR1cCBweXRob24gTlggcGx1Z2luXG4gICAgdGhpcy5ueC5wbHVnaW5zLnB1c2goXCJAbnhsdi9weXRob25cIik7XG4gICAgdGhpcy5pbnN0YWxsVGFzayA9IHRoaXMubnhDb25maWd1cmF0b3IuZW5zdXJlTnhJbnN0YWxsVGFzayh7XG4gICAgICBcIkBueGx2L3B5dGhvblwiOiBcIl4xOFwiLFxuICAgIH0pO1xuXG4gICAgLy8gTWFwIHRhc2tzIHRvIG54IHJ1bi1tYW55XG4gICAgdGhpcy5ueENvbmZpZ3VyYXRvci5fb3ZlcnJpZGVOeEJ1aWxkVGFzayhcbiAgICAgIHRoaXMuYnVpbGRUYXNrLFxuICAgICAgeyB0YXJnZXQ6IFwiYnVpbGRcIiB9LFxuICAgICAgeyBmb3JjZTogdHJ1ZSB9XG4gICAgKTtcblxuICAgIHRoaXMubnhDb25maWd1cmF0b3IuX292ZXJyaWRlTnhCdWlsZFRhc2sodGhpcy5wcmVDb21waWxlVGFzaywge1xuICAgICAgdGFyZ2V0OiBcInByZS1jb21waWxlXCIsXG4gICAgfSk7XG5cbiAgICB0aGlzLm54Q29uZmlndXJhdG9yLl9vdmVycmlkZU54QnVpbGRUYXNrKHRoaXMuY29tcGlsZVRhc2ssIHtcbiAgICAgIHRhcmdldDogXCJjb21waWxlXCIsXG4gICAgfSk7XG5cbiAgICB0aGlzLm54Q29uZmlndXJhdG9yLl9vdmVycmlkZU54QnVpbGRUYXNrKHRoaXMucG9zdENvbXBpbGVUYXNrLCB7XG4gICAgICB0YXJnZXQ6IFwicG9zdC1jb21waWxlXCIsXG4gICAgfSk7XG5cbiAgICB0aGlzLm54Q29uZmlndXJhdG9yLl9vdmVycmlkZU54QnVpbGRUYXNrKHRoaXMudGVzdFRhc2ssIHtcbiAgICAgIHRhcmdldDogXCJ0ZXN0XCIsXG4gICAgfSk7XG5cbiAgICB0aGlzLm54Q29uZmlndXJhdG9yLl9vdmVycmlkZU54QnVpbGRUYXNrKHRoaXMucGFja2FnZVRhc2ssIHtcbiAgICAgIHRhcmdldDogXCJwYWNrYWdlXCIsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXRkb2NcbiAgICovXG4gIHB1YmxpYyBnZXQgbngoKTogTnhXb3Jrc3BhY2Uge1xuICAgIHJldHVybiB0aGlzLm54Q29uZmlndXJhdG9yLm54O1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0ZG9jXG4gICAqL1xuICBwdWJsaWMgZXhlY054UnVuTWFueUNvbW1hbmQob3B0aW9uczogTnguUnVuTWFueU9wdGlvbnMpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm54Q29uZmlndXJhdG9yLmV4ZWNOeFJ1bk1hbnlDb21tYW5kKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0ZG9jXG4gICAqL1xuICBwdWJsaWMgY29tcG9zZU54UnVuTWFueUNvbW1hbmQob3B0aW9uczogTnguUnVuTWFueU9wdGlvbnMpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMubnhDb25maWd1cmF0b3IuY29tcG9zZU54UnVuTWFueUNvbW1hbmQob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXRkb2NcbiAgICovXG4gIHB1YmxpYyBhZGROeFJ1bk1hbnlUYXNrKG5hbWU6IHN0cmluZywgb3B0aW9uczogTnguUnVuTWFueU9wdGlvbnMpOiBUYXNrIHtcbiAgICByZXR1cm4gdGhpcy5ueENvbmZpZ3VyYXRvci5hZGROeFJ1bk1hbnlUYXNrKG5hbWUsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0ZG9jXG4gICAqL1xuICBwdWJsaWMgYWRkSW1wbGljaXREZXBlbmRlbmN5KFxuICAgIGRlcGVuZGVudDogUHJvamVjdCxcbiAgICBkZXBlbmRlZTogc3RyaW5nIHwgUHJvamVjdFxuICApOiB2b2lkIHtcbiAgICB0aGlzLm54Q29uZmlndXJhdG9yLmFkZEltcGxpY2l0RGVwZW5kZW5jeShkZXBlbmRlbnQsIGRlcGVuZGVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdGRvY1xuICAgKi9cbiAgcHVibGljIGFkZEphdmFEZXBlbmRlbmN5KFxuICAgIGRlcGVuZGVudDogSmF2YVByb2plY3QsXG4gICAgZGVwZW5kZWU6IEphdmFQcm9qZWN0XG4gICk6IHZvaWQge1xuICAgIHRoaXMubnhDb25maWd1cmF0b3IuYWRkSmF2YURlcGVuZGVuY3koZGVwZW5kZW50LCBkZXBlbmRlZSk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXRkb2NcbiAgICovXG4gIHB1YmxpYyBhZGRQeXRob25Qb2V0cnlEZXBlbmRlbmN5KFxuICAgIGRlcGVuZGVudDogUHl0aG9uUHJvamVjdCxcbiAgICBkZXBlbmRlZTogUHl0aG9uUHJvamVjdFxuICApOiB2b2lkIHtcbiAgICB0aGlzLm54Q29uZmlndXJhdG9yLmFkZFB5dGhvblBvZXRyeURlcGVuZGVuY3koZGVwZW5kZW50LCBkZXBlbmRlZSk7XG4gIH1cblxuICBwcml2YXRlIGFkZFVwZ3JhZGVEZXBzVGFzaygpIHtcbiAgICBjb25zdCB1cGdyYWRlRGVwc1Rhc2sgPSBuZXcgVGFzayhcInVwZ3JhZGUtZGVwc1wiLCB7XG4gICAgICBkZXNjcmlwdGlvbjogXCJVcGdyYWRlIGRlcGVuZGVuY2llcyBpbiB0aGUgbW9ub3JlcG9cIixcbiAgICB9KTtcbiAgICB0aGlzLm54Q29uZmlndXJhdG9yLl9vdmVycmlkZU54QnVpbGRUYXNrKHVwZ3JhZGVEZXBzVGFzaywge1xuICAgICAgdGFyZ2V0OiBcInVwZ3JhZGVcIixcbiAgICB9KTtcbiAgICAvLyBTcGF3biB0aGUgaW5zdGFsbCB0YXNrIGZvciBweXRob24gcHJvamVjdHMgc2luY2UgdGhpcyB3aWxsIHVwZGF0ZSB0aGUgbG9ja2ZpbGUgdG8gdGhlIGxhdGVzdCB2ZXJzaW9ucyBzYXRpc2Z5aW5nXG4gICAgLy8gdGhlIHB5cHJvamVjdC50b21sIGZpbGVcbiAgICAvLyBUT0RPOiByZW1vdmUgaW4gZmF2b3VyIG9mIHRoZSBcInVwZ3JhZGVcIiB0YXNrIGlmIGV2ZXIgaW1wbGVtZW50ZWQgZm9yIHB5dGhvblxuICAgIHVwZ3JhZGVEZXBzVGFzay5zcGF3bigodGhpcy5kZXBzTWFuYWdlciBhcyBQb2V0cnkpLmluc3RhbGxUYXNrKTtcbiAgICB0aGlzLm54Q29uZmlndXJhdG9yLl9jb25maWd1cmVQeXRob25TdWJwcm9qZWN0VXBncmFkZURlcHMoXG4gICAgICB0aGlzLFxuICAgICAgdXBncmFkZURlcHNUYXNrXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdGRvY1xuICAgKi9cbiAgcHJlU3ludGhlc2l6ZSgpOiB2b2lkIHtcbiAgICAvLyBDYWxsaW5nIGJlZm9yZSBzdXBlcigpIHRvIGVuc3VyZSBwcm9wZXIgcHJlLXN5bnRoIG9mIE54UHJvamVjdCBjb21wb25lbnQgYW5kIGl0cyBuZXN0ZWQgY29tcG9uZW50c1xuICAgIHRoaXMubnhDb25maWd1cmF0b3IucHJlU3ludGhlc2l6ZSgpO1xuXG4gICAgdGhpcy5hZGRVcGdyYWRlRGVwc1Rhc2soKTtcblxuICAgIHN1cGVyLnByZVN5bnRoZXNpemUoKTtcblxuICAgIHN5bmNQcm9qZW5WZXJzaW9ucyh0aGlzLnN1YnByb2plY3RzLCB0aGlzLnByb2plblZlcnNpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBzeW50aCgpIHtcbiAgICB0aGlzLnZhbGlkYXRlU3ViUHJvamVjdHMoKTtcbiAgICB0aGlzLmluc3RhbGxQeXRob25TdWJwcm9qZWN0cygpO1xuICAgIHRoaXMubnhDb25maWd1cmF0b3Iuc3ludGgoKTtcblxuICAgIHN1cGVyLnN5bnRoKCk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXRkb2NcbiAgICpcbiAgICogTk9URTogQmUgc3VyZSB0byBlbnN1cmUgdGhlIFZJUlRVQUxfRU5WIGlzIHVuc2V0IGR1cmluZyBwb3N0U3ludGhlc2l6ZSBhcyB0aGUgaW5kaXZpZHVhbCBwb2V0cnkgZW52cyB3aWxsIG9ubHkgYmUgY3JlYXRlZCBpZiBhIGV4aXN0aW5nIFZJUlRVQUxfRU5WIGNhbm5vdCBiZSBmb3VuZC5cbiAgICovXG4gIHBvc3RTeW50aGVzaXplKCk6IHZvaWQge1xuICAgIGNvbnN0IHZFbnYgPSBwcm9jZXNzLmVudi5WSVJUVUFMX0VOVjtcbiAgICBwcm9jZXNzLmVudi5WSVJUVUFMX0VOViA9IFwiXCI7XG4gICAgc3VwZXIucG9zdFN5bnRoZXNpemUoKTtcbiAgICBwcm9jZXNzLmVudi5WSVJUVUFMX0VOViA9IHZFbnY7XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlcyBhbGwgcHl0aG9uIHN1YnByb2plY3RzIGhhdmUgdGhlaXIgaW5zdGFsbCB0YXJnZXQgY2FsbGVkIGFmdGVyIHRoZSBtb25vcmVwbyBpbnN0YWxsIHRhc2suXG4gICAqL1xuICBwcml2YXRlIGluc3RhbGxQeXRob25TdWJwcm9qZWN0cygpIHtcbiAgICBjb25zdCBpbnN0YWxsUHJvamVjdHMgPSB0aGlzLnN1YnByb2plY3RzLmZpbHRlcigocHJvamVjdCkgPT5cbiAgICAgIGlzUHl0aG9uUHJvamVjdChwcm9qZWN0KVxuICAgICk7XG5cbiAgICBpZiAoaW5zdGFsbFByb2plY3RzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG54UnVuTWFueUluc3RhbGwgPSB0aGlzLmNvbXBvc2VOeFJ1bk1hbnlDb21tYW5kKHtcbiAgICAgICAgdGFyZ2V0OiBcImluc3RhbGxcIixcbiAgICAgICAgcHJvamVjdHM6IGluc3RhbGxQcm9qZWN0cy5tYXAoKHByb2plY3QpID0+IHByb2plY3QubmFtZSksXG4gICAgICAgIHBhcmFsbGVsOiAxLFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuaW5zdGFsbFRhc2suZXhlYyhcbiAgICAgICAgTm9kZVBhY2thZ2VVdGlscy5jb21tYW5kLmV4ZWMoXG4gICAgICAgICAgTm9kZVBhY2thZ2VNYW5hZ2VyLk5QTSxcbiAgICAgICAgICAuLi5ueFJ1bk1hbnlJbnN0YWxsXG4gICAgICAgIClcbiAgICAgICk7XG5cbiAgICAgIC8vIEVuc3VyZSB0aGF0IGluc3RhbGwtcHkgZm9sbG93cyBkZXBlbmRlbmN5IG9yZGVyXG4gICAgICBpbnN0YWxsUHJvamVjdHMuZm9yRWFjaCgocCkgPT4ge1xuICAgICAgICBOeFByb2plY3QuZW5zdXJlKHApLnNldFRhcmdldChcImluc3RhbGxcIiwge1xuICAgICAgICAgIGRlcGVuZHNPbjogW1wiXmluc3RhbGxcIl0sXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgc3VicHJvamVjdHMgZG9uJ3QgaGF2ZSBhIGRlZmF1bHQgdGFzayBhbmQgdGhhdCBhbGwgUHl0aG9uIHN1YnBhY2thZ2VzIGFyZSBjb25maWd1cmVkIHRvIHVzZSBQb2V0cnkuXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlU3ViUHJvamVjdHMoKSB7XG4gICAgdGhpcy5zdWJwcm9qZWN0cy5mb3JFYWNoKChzdWJQcm9qZWN0OiBhbnkpID0+IHtcbiAgICAgIC8vIERpc2FibGUgZGVmYXVsdCB0YXNrIG9uIHN1YnByb2plY3RzIGFzIHRoaXMgaXNuJ3Qgc3VwcG9ydGVkIGluIGEgbW9ub3JlcG9cbiAgICAgIHN1YlByb2plY3QuZGVmYXVsdFRhc2s/LnJlc2V0KCk7XG5cbiAgICAgIGlmIChpc1B5dGhvblByb2plY3Qoc3ViUHJvamVjdCkgJiYgIWlzUG9ldHJ5Q29uZmlndXJlZChzdWJQcm9qZWN0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYCR7c3ViUHJvamVjdC5uYW1lfSBtdXN0IHVzZSBwb2V0cnkgdG8gbWFuYWdlIGRlcGVuZGVuY2llcyB3aGVuIHVzaW5nIE5YTW9ub3JlcG9QeXRob25Qcm9qZWN0YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgcGFzc2VkIGluIHByb2plY3QgaXMgb2YgdHlwZSBQeXRob25Qcm9qZWN0LlxuICpcbiAqIEBwYXJhbSBwcm9qZWN0IFByb2plY3QgaW5zdGFuY2UuXG4gKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBwcm9qZWN0IGluc3RhbmNlIGlzIG9mIHR5cGUgUHl0aG9uUHJvamVjdC5cbiAqL1xuZnVuY3Rpb24gaXNQeXRob25Qcm9qZWN0KHByb2plY3Q6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gUHJvamVjdFV0aWxzLmlzTmFtZWRJbnN0YW5jZU9mKHByb2plY3QsIFB5dGhvblByb2plY3QpO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIHBhc3NlZCBpbiBwcm9qZWN0IHVzZXMgUG9ldHJ5LlxuICpcbiAqIEBwYXJhbSBwcm9qZWN0IFB5dGhvblByb2plY3QgaW5zdGFuY2UuXG4gKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBwcm9qZWN0IHVzZXMgUG9ldHJ5LlxuICovXG5mdW5jdGlvbiBpc1BvZXRyeUNvbmZpZ3VyZWQocHJvamVjdDogUHl0aG9uUHJvamVjdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIHByb2plY3QuY29tcG9uZW50cy5maW5kKChjKSA9PlxuICAgICAgUHJvamVjdFV0aWxzLmlzTmFtZWRJbnN0YW5jZU9mKGMsIFBvZXRyeSlcbiAgICApICE9PSB1bmRlZmluZWRcbiAgKTtcbn1cbiJdfQ==