@cdktn/cli-core 0.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -0
- package/ambient.d.ts +13 -0
- package/eslint.config.mjs +82 -0
- package/jest.config.js +20 -0
- package/package.json +139 -0
- package/src/lib/cdktf-config.d.ts +16 -0
- package/src/lib/cdktf-config.d.ts.map +1 -0
- package/src/lib/cdktf-config.js +108 -0
- package/src/lib/cdktf-project-io-handler.d.ts +20 -0
- package/src/lib/cdktf-project-io-handler.d.ts.map +1 -0
- package/src/lib/cdktf-project-io-handler.js +84 -0
- package/src/lib/cdktf-project.d.ts +111 -0
- package/src/lib/cdktf-project.d.ts.map +1 -0
- package/src/lib/cdktf-project.js +371 -0
- package/src/lib/cdktf-stack.d.ts +134 -0
- package/src/lib/cdktf-stack.d.ts.map +1 -0
- package/src/lib/cdktf-stack.js +386 -0
- package/src/lib/convert.d.ts +6 -0
- package/src/lib/convert.d.ts.map +1 -0
- package/src/lib/convert.js +51 -0
- package/src/lib/dependencies/cdktf-config-manager.d.ts +12 -0
- package/src/lib/dependencies/cdktf-config-manager.d.ts.map +1 -0
- package/src/lib/dependencies/cdktf-config-manager.js +36 -0
- package/src/lib/dependencies/dependency-manager.d.ts +95 -0
- package/src/lib/dependencies/dependency-manager.d.ts.map +1 -0
- package/src/lib/dependencies/dependency-manager.js +393 -0
- package/src/lib/dependencies/package-manager.d.ts +18 -0
- package/src/lib/dependencies/package-manager.d.ts.map +1 -0
- package/src/lib/dependencies/package-manager.js +581 -0
- package/src/lib/dependencies/prebuilt-providers.d.ts +23 -0
- package/src/lib/dependencies/prebuilt-providers.d.ts.map +1 -0
- package/src/lib/dependencies/prebuilt-providers.js +220 -0
- package/src/lib/dependencies/registry-api.d.ts +8 -0
- package/src/lib/dependencies/registry-api.d.ts.map +1 -0
- package/src/lib/dependencies/registry-api.js +77 -0
- package/src/lib/dependencies/version-constraints.d.ts +8 -0
- package/src/lib/dependencies/version-constraints.d.ts.map +1 -0
- package/src/lib/dependencies/version-constraints.js +95 -0
- package/src/lib/error-reporting.d.ts +10 -0
- package/src/lib/error-reporting.d.ts.map +1 -0
- package/src/lib/error-reporting.js +133 -0
- package/src/lib/errors.d.ts +6 -0
- package/src/lib/errors.d.ts.map +1 -0
- package/src/lib/errors.js +10 -0
- package/src/lib/execution-logs.d.ts +3 -0
- package/src/lib/execution-logs.d.ts.map +1 -0
- package/src/lib/execution-logs.js +47 -0
- package/src/lib/get.d.ts +25 -0
- package/src/lib/get.d.ts.map +1 -0
- package/src/lib/get.js +90 -0
- package/src/lib/helpers/stack-helpers.d.ts +16 -0
- package/src/lib/helpers/stack-helpers.d.ts.map +1 -0
- package/src/lib/helpers/stack-helpers.js +155 -0
- package/src/lib/index.d.ts +15 -0
- package/src/lib/index.d.ts.map +1 -0
- package/src/lib/index.js +44 -0
- package/src/lib/init.d.ts +37 -0
- package/src/lib/init.d.ts.map +1 -0
- package/src/lib/init.js +131 -0
- package/src/lib/local-provider-constraints.d.ts +28 -0
- package/src/lib/local-provider-constraints.d.ts.map +1 -0
- package/src/lib/local-provider-constraints.js +95 -0
- package/src/lib/local-provider-versions.d.ts +12 -0
- package/src/lib/local-provider-versions.d.ts.map +1 -0
- package/src/lib/local-provider-versions.js +73 -0
- package/src/lib/models/deploy-machine.d.ts +128 -0
- package/src/lib/models/deploy-machine.d.ts.map +1 -0
- package/src/lib/models/deploy-machine.js +280 -0
- package/src/lib/models/pty-process.d.ts +29 -0
- package/src/lib/models/pty-process.d.ts.map +1 -0
- package/src/lib/models/pty-process.js +132 -0
- package/src/lib/models/schema.d.ts +2307 -0
- package/src/lib/models/schema.d.ts.map +1 -0
- package/src/lib/models/schema.js +181 -0
- package/src/lib/models/terraform-cli.d.ts +72 -0
- package/src/lib/models/terraform-cli.d.ts.map +1 -0
- package/src/lib/models/terraform-cli.js +357 -0
- package/src/lib/models/terraform.d.ts +125 -0
- package/src/lib/models/terraform.d.ts.map +1 -0
- package/src/lib/models/terraform.js +72 -0
- package/src/lib/output.d.ts +23 -0
- package/src/lib/output.d.ts.map +1 -0
- package/src/lib/output.js +211 -0
- package/src/lib/provider-add.d.ts +15 -0
- package/src/lib/provider-add.d.ts.map +1 -0
- package/src/lib/provider-add.js +30 -0
- package/src/lib/server/terraform-logs.d.ts +2 -0
- package/src/lib/server/terraform-logs.d.ts.map +1 -0
- package/src/lib/server/terraform-logs.js +19 -0
- package/src/lib/synth-stack.d.ts +29 -0
- package/src/lib/synth-stack.d.ts.map +1 -0
- package/src/lib/synth-stack.js +251 -0
- package/src/lib/synth.d.ts +7 -0
- package/src/lib/synth.d.ts.map +1 -0
- package/src/lib/synth.js +67 -0
- package/src/lib/terraform-json.d.ts +1015 -0
- package/src/lib/terraform-json.d.ts.map +1 -0
- package/src/lib/terraform-json.js +82 -0
- package/src/lib/terraform-provider-lock.d.ts +25 -0
- package/src/lib/terraform-provider-lock.d.ts.map +1 -0
- package/src/lib/terraform-provider-lock.js +95 -0
- package/src/lib/watch.d.ts +16 -0
- package/src/lib/watch.d.ts.map +1 -0
- package/src/lib/watch.js +155 -0
- package/templates/csharp/.hooks.sscaff.js +63 -0
- package/templates/csharp/MainStack.cs +15 -0
- package/templates/csharp/MyTerraformStack.csproj +13 -0
- package/templates/csharp/Program.cs +17 -0
- package/templates/csharp/TestProgram.cs +42 -0
- package/templates/csharp/cdktf.json +11 -0
- package/templates/csharp/help +42 -0
- package/templates/csharp/{{}}.gitignore +345 -0
- package/templates/go/.hooks.sscaff.js +70 -0
- package/templates/go/cdktf.json +12 -0
- package/templates/go/go.mod +8 -0
- package/templates/go/help +32 -0
- package/templates/go/main.go +22 -0
- package/templates/go/main_test.go +42 -0
- package/templates/go/{{}}.gitignore +21 -0
- package/templates/java/.hooks.sscaff.js +64 -0
- package/templates/java/build.gradle +55 -0
- package/templates/java/cdktf.json +12 -0
- package/templates/java/gradle.properties +1 -0
- package/templates/java/gradlew +248 -0
- package/templates/java/gradlew.bat +92 -0
- package/templates/java/help +35 -0
- package/templates/java/settings.gradle +5 -0
- package/templates/java/src/main/java/com/mycompany/app/Main.java +16 -0
- package/templates/java/src/main/java/com/mycompany/app/MainStack.java +14 -0
- package/templates/java/src/test/java/com/company/app/MainTest.java +38 -0
- package/templates/java/{{}}.gitignore +14 -0
- package/templates/python/.hooks.sscaff.js +59 -0
- package/templates/python/Pipfile +7 -0
- package/templates/python/cdktf.json +12 -0
- package/templates/python/help +42 -0
- package/templates/python/main-test.py +26 -0
- package/templates/python/main.py +16 -0
- package/templates/python/{{}}.gitignore +7 -0
- package/templates/python-pip/.hooks.sscaff.js +63 -0
- package/templates/python-pip/cdktf.json +12 -0
- package/templates/python-pip/help +35 -0
- package/templates/python-pip/main-test.py +23 -0
- package/templates/python-pip/main.py +16 -0
- package/templates/python-pip/{{}}.gitignore +7 -0
- package/templates/typescript/.hooks.sscaff.js +78 -0
- package/templates/typescript/__tests__/main-test.ts +89 -0
- package/templates/typescript/cdktf.json +11 -0
- package/templates/typescript/help +51 -0
- package/templates/typescript/jest.config.js +187 -0
- package/templates/typescript/main.ts +14 -0
- package/templates/typescript/package.json +22 -0
- package/templates/typescript/setup.js +2 -0
- package/templates/typescript/tsconfig.json +35 -0
- package/templates/typescript/{{}}.gitignore +11 -0
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { Language, TerraformDependencyConstraint } from "@cdktn/commons";
|
|
2
|
+
export declare const DEFAULT_HOSTNAME = "registry.terraform.io";
|
|
3
|
+
export declare const DEFAULT_NAMESPACE = "hashicorp";
|
|
4
|
+
export declare class ProviderConstraint {
|
|
5
|
+
readonly version: string | undefined;
|
|
6
|
+
/**
|
|
7
|
+
* normalized source of the provider
|
|
8
|
+
* e.g. "registry.terraform.io/hashicorp/aws"
|
|
9
|
+
*/
|
|
10
|
+
readonly source: string;
|
|
11
|
+
constructor(source: string, version: string | undefined);
|
|
12
|
+
static fromConfigEntry(provider: string | TerraformDependencyConstraint): ProviderConstraint;
|
|
13
|
+
isFromTerraformRegistry(): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* the namespace of the provider
|
|
16
|
+
* e.g. "hashicorp" or "kreuzwerker"
|
|
17
|
+
*/
|
|
18
|
+
get namespace(): string;
|
|
19
|
+
/**
|
|
20
|
+
* the name of the provider
|
|
21
|
+
* e.g. "aws"
|
|
22
|
+
*/
|
|
23
|
+
get name(): string;
|
|
24
|
+
/**
|
|
25
|
+
* the hostname of the provider
|
|
26
|
+
* e.g. "registry.terraform.io"
|
|
27
|
+
*/
|
|
28
|
+
get hostname(): string;
|
|
29
|
+
/**
|
|
30
|
+
* returns a simplified provider name, dropping namespace and hostname
|
|
31
|
+
* if they match the defaults
|
|
32
|
+
*/
|
|
33
|
+
get simplifiedName(): string;
|
|
34
|
+
/**
|
|
35
|
+
* checks if the version constraint matches the given version
|
|
36
|
+
* @param version an actual version (e.g. "4.12.1")
|
|
37
|
+
* @returns true if the version is compatible with the constraint
|
|
38
|
+
*/
|
|
39
|
+
matchesVersion(version: string): boolean;
|
|
40
|
+
toString(): string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* manages dependencies of a CDKTN project (e.g. terraform providers)
|
|
44
|
+
*/
|
|
45
|
+
export declare class DependencyManager {
|
|
46
|
+
private readonly targetLanguage;
|
|
47
|
+
private cdktfVersion;
|
|
48
|
+
private readonly projectDirectory;
|
|
49
|
+
private packageManager;
|
|
50
|
+
constructor(targetLanguage: Language, cdktfVersion: string, projectDirectory: string);
|
|
51
|
+
addProvider(constraint: ProviderConstraint): Promise<{
|
|
52
|
+
addedLocalProvider: boolean;
|
|
53
|
+
}>;
|
|
54
|
+
upgradeProvider(constraint: ProviderConstraint): Promise<{
|
|
55
|
+
addedLocalProvider: boolean;
|
|
56
|
+
}>;
|
|
57
|
+
getCurrentlyInstalledVersion(constraint: ProviderConstraint): Promise<string | undefined>;
|
|
58
|
+
upgradePrebuiltProvider(constraint: ProviderConstraint, currentVersion: string): Promise<void>;
|
|
59
|
+
hasPrebuiltProvider(constraint: ProviderConstraint): Promise<boolean>;
|
|
60
|
+
private tryGetPackageName;
|
|
61
|
+
private tryGetLanguagePackageName;
|
|
62
|
+
getMatchingProviderVersion(constraint: ProviderConstraint): Promise<{
|
|
63
|
+
name: string;
|
|
64
|
+
version: string;
|
|
65
|
+
}>;
|
|
66
|
+
addPrebuiltProvider(constraint: ProviderConstraint, silent?: boolean): Promise<void>;
|
|
67
|
+
private getLanguageSpecificPackageVersion;
|
|
68
|
+
addLocalProvider(constraint: ProviderConstraint): Promise<void>;
|
|
69
|
+
/**
|
|
70
|
+
* Converts an NPM package name of a pre-built provider package to the name in the target language
|
|
71
|
+
*/
|
|
72
|
+
private convertPackageName;
|
|
73
|
+
/**
|
|
74
|
+
* Converts an NPM package name of a pre-built provider package to the name in the target language
|
|
75
|
+
*/
|
|
76
|
+
private convertPackageNameCdktf;
|
|
77
|
+
/**
|
|
78
|
+
* Converts an NPM package name of a pre-built provider package to the name in the target language
|
|
79
|
+
*/
|
|
80
|
+
private convertPackageNameCdktn;
|
|
81
|
+
/**
|
|
82
|
+
* Converts an package name of a pre-built provider package in target language to the name in npm
|
|
83
|
+
* Inverse of: `convertPackageName`
|
|
84
|
+
*/
|
|
85
|
+
private convertFromPackageNameToNpm;
|
|
86
|
+
allProviders(): Promise<{
|
|
87
|
+
local: {
|
|
88
|
+
providerName: string;
|
|
89
|
+
providerConstraint: string | undefined;
|
|
90
|
+
providerVersion: string | null;
|
|
91
|
+
}[];
|
|
92
|
+
prebuilt: any[];
|
|
93
|
+
}>;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=dependency-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-manager.d.ts","sourceRoot":"","sources":["dependency-manager.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,QAAQ,EAGR,6BAA6B,EAC9B,MAAM,gBAAgB,CAAC;AAkBxB,eAAO,MAAM,gBAAgB,0BAA0B,CAAC;AACxD,eAAO,MAAM,iBAAiB,cAAc,CAAC;AAc7C,qBAAa,kBAAkB;aAYX,OAAO,EAAE,MAAM,GAAG,SAAS;IAX7C;;;OAGG;IACH,SAAgB,MAAM,EAAE,MAAM,CAAC;gBAM7B,MAAM,EAAE,MAAM,EACE,OAAO,EAAE,MAAM,GAAG,SAAS;IAK7C,MAAM,CAAC,eAAe,CACpB,QAAQ,EAAE,MAAM,GAAG,6BAA6B,GAC/C,kBAAkB;IAgBd,uBAAuB,IAAI,OAAO;IAIzC;;;OAGG;IACH,IAAW,SAAS,IAAI,MAAM,CAE7B;IAED;;;OAGG;IACH,IAAW,IAAI,IAAI,MAAM,CAExB;IAED;;;OAGG;IACH,IAAW,QAAQ,IAAI,MAAM,CAE5B;IAED;;;OAGG;IACH,IAAW,cAAc,IAAI,MAAM,CAKlC;IAED;;;;OAIG;IACI,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAOxC,QAAQ;CAGhB;AAED;;GAEG;AACH,qBAAa,iBAAiB;IAI1B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IALnC,OAAO,CAAC,cAAc,CAAiB;gBAGpB,cAAc,EAAE,QAAQ,EACjC,YAAY,EAAE,MAAM,EACX,gBAAgB,EAAE,MAAM;IAQrC,WAAW,CACf,UAAU,EAAE,kBAAkB,GAC7B,OAAO,CAAC;QAAE,kBAAkB,EAAE,OAAO,CAAA;KAAE,CAAC;IAUrC,eAAe,CAAC,UAAU,EAAE,kBAAkB;;;IAkB9C,4BAA4B,CAAC,UAAU,EAAE,kBAAkB;IA2B3D,uBAAuB,CAC3B,UAAU,EAAE,kBAAkB,EAC9B,cAAc,EAAE,MAAM;IAkBlB,mBAAmB,CAAC,UAAU,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC;YAoC7D,iBAAiB;YAWjB,yBAAyB;IAajC,0BAA0B,CAAC,UAAU,EAAE,kBAAkB;;;;IAwBzD,mBAAmB,CAAC,UAAU,EAAE,kBAAkB,EAAE,MAAM,UAAQ;YAc1D,iCAAiC;IAgCzC,gBAAgB,CAAC,UAAU,EAAE,kBAAkB;IAuBrD;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAU1B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAwB/B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA2B/B;;;OAGG;IACH,OAAO,CAAC,2BAA2B;IAwCtB,YAAY;;;;;;;;CAoD1B"}
|
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.DependencyManager = exports.ProviderConstraint = exports.DEFAULT_NAMESPACE = exports.DEFAULT_HOSTNAME = void 0;
|
|
27
|
+
// Copyright (c) HashiCorp, Inc
|
|
28
|
+
// SPDX-License-Identifier: MPL-2.0
|
|
29
|
+
const commons_1 = require("@cdktn/commons");
|
|
30
|
+
const codemaker_1 = require("codemaker");
|
|
31
|
+
const cdktf_config_1 = require("../cdktf-config");
|
|
32
|
+
const cdktf_config_manager_1 = require("./cdktf-config-manager");
|
|
33
|
+
const package_manager_1 = require("./package-manager");
|
|
34
|
+
const prebuilt_providers_1 = require("./prebuilt-providers");
|
|
35
|
+
const registry_api_1 = require("./registry-api");
|
|
36
|
+
const version_constraints_1 = require("./version-constraints");
|
|
37
|
+
const semver = __importStar(require("semver"));
|
|
38
|
+
const local_provider_versions_1 = require("../local-provider-versions");
|
|
39
|
+
const local_provider_constraints_1 = require("../local-provider-constraints");
|
|
40
|
+
// ref: https://www.terraform.io/language/providers/requirements#source-addresses
|
|
41
|
+
exports.DEFAULT_HOSTNAME = "registry.terraform.io";
|
|
42
|
+
exports.DEFAULT_NAMESPACE = "hashicorp";
|
|
43
|
+
function normalizeProviderSource(source) {
|
|
44
|
+
// returns <HOSTNAME>/<NAMESPACE>/<TYPE>
|
|
45
|
+
const slashes = source.split("/").length - 1;
|
|
46
|
+
switch (slashes) {
|
|
47
|
+
case 0:
|
|
48
|
+
return `${exports.DEFAULT_HOSTNAME}/${exports.DEFAULT_NAMESPACE}/${source}`;
|
|
49
|
+
case 1:
|
|
50
|
+
return `${exports.DEFAULT_HOSTNAME}/${source}`;
|
|
51
|
+
default:
|
|
52
|
+
return source;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
class ProviderConstraint {
|
|
56
|
+
// TODO: add examples to cli command description (i.e. =,~>.> etc.)
|
|
57
|
+
// if no version constraint is specified, we assume the latest version
|
|
58
|
+
// if specific version is specified without e.g. =, we allow patch level increments (e.g. ~>2.12 for "2.12")
|
|
59
|
+
constructor(source, version) {
|
|
60
|
+
this.version = version;
|
|
61
|
+
this.source = normalizeProviderSource(source);
|
|
62
|
+
}
|
|
63
|
+
static fromConfigEntry(provider) {
|
|
64
|
+
if (typeof provider === "string") {
|
|
65
|
+
const [src, version] = provider.split("@");
|
|
66
|
+
return new ProviderConstraint(src.trim(), version ? version.trim() : undefined);
|
|
67
|
+
}
|
|
68
|
+
const src = (provider.namespace ? `${provider.namespace}/` : "") +
|
|
69
|
+
(provider.source || provider.name);
|
|
70
|
+
return new ProviderConstraint(src, provider.version);
|
|
71
|
+
}
|
|
72
|
+
isFromTerraformRegistry() {
|
|
73
|
+
return this.hostname === exports.DEFAULT_HOSTNAME;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* the namespace of the provider
|
|
77
|
+
* e.g. "hashicorp" or "kreuzwerker"
|
|
78
|
+
*/
|
|
79
|
+
get namespace() {
|
|
80
|
+
return this.source.split("/")[1];
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* the name of the provider
|
|
84
|
+
* e.g. "aws"
|
|
85
|
+
*/
|
|
86
|
+
get name() {
|
|
87
|
+
return this.source.split("/")[2];
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* the hostname of the provider
|
|
91
|
+
* e.g. "registry.terraform.io"
|
|
92
|
+
*/
|
|
93
|
+
get hostname() {
|
|
94
|
+
return this.source.split("/")[0];
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* returns a simplified provider name, dropping namespace and hostname
|
|
98
|
+
* if they match the defaults
|
|
99
|
+
*/
|
|
100
|
+
get simplifiedName() {
|
|
101
|
+
return this.source
|
|
102
|
+
.split("/")
|
|
103
|
+
.filter((part) => part !== exports.DEFAULT_HOSTNAME && part !== exports.DEFAULT_NAMESPACE)
|
|
104
|
+
.join("/");
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* checks if the version constraint matches the given version
|
|
108
|
+
* @param version an actual version (e.g. "4.12.1")
|
|
109
|
+
* @returns true if the version is compatible with the constraint
|
|
110
|
+
*/
|
|
111
|
+
matchesVersion(version) {
|
|
112
|
+
if (this.version) {
|
|
113
|
+
return (0, version_constraints_1.versionMatchesConstraint)(version, this.version);
|
|
114
|
+
}
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
toString() {
|
|
118
|
+
return `${this.source}${this.version ? `@${this.version}` : ""}`;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
exports.ProviderConstraint = ProviderConstraint;
|
|
122
|
+
/**
|
|
123
|
+
* manages dependencies of a CDKTN project (e.g. terraform providers)
|
|
124
|
+
*/
|
|
125
|
+
class DependencyManager {
|
|
126
|
+
constructor(targetLanguage, cdktfVersion, projectDirectory) {
|
|
127
|
+
this.targetLanguage = targetLanguage;
|
|
128
|
+
this.cdktfVersion = cdktfVersion;
|
|
129
|
+
this.projectDirectory = projectDirectory;
|
|
130
|
+
this.packageManager = package_manager_1.PackageManager.forLanguage(targetLanguage, this.projectDirectory);
|
|
131
|
+
}
|
|
132
|
+
async addProvider(constraint) {
|
|
133
|
+
if (await this.hasPrebuiltProvider(constraint)) {
|
|
134
|
+
await this.addPrebuiltProvider(constraint);
|
|
135
|
+
return { addedLocalProvider: false };
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
await this.addLocalProvider(constraint);
|
|
139
|
+
return { addedLocalProvider: true };
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
async upgradeProvider(constraint) {
|
|
143
|
+
console.log(`Upgrading ${constraint.simplifiedName}...`);
|
|
144
|
+
const cdktfJson = new cdktf_config_manager_1.CdktfConfigManager();
|
|
145
|
+
const prebuiltVersion = await this.getCurrentlyInstalledVersion(constraint);
|
|
146
|
+
if (prebuiltVersion) {
|
|
147
|
+
await this.upgradePrebuiltProvider(constraint, prebuiltVersion);
|
|
148
|
+
return { addedLocalProvider: false };
|
|
149
|
+
}
|
|
150
|
+
if (await cdktfJson.hasProvider(constraint)) {
|
|
151
|
+
await cdktfJson.updateProvider(constraint);
|
|
152
|
+
return { addedLocalProvider: true };
|
|
153
|
+
}
|
|
154
|
+
throw commons_1.Errors.Usage(`Trying to upgrade ${constraint.simplifiedName} but it is not installed, please use "cdktn provider add ${constraint.simplifiedName}" to add it.`);
|
|
155
|
+
}
|
|
156
|
+
async getCurrentlyInstalledVersion(constraint) {
|
|
157
|
+
var _a;
|
|
158
|
+
commons_1.logger.info(`Checking if ${constraint.simplifiedName} is installed...`);
|
|
159
|
+
const cdktfPackageName = await this.tryGetPackageName(constraint, false);
|
|
160
|
+
const cdktnPackageName = await this.tryGetPackageName(constraint, true);
|
|
161
|
+
if (!cdktfPackageName && !cdktnPackageName)
|
|
162
|
+
return; // not available as pre-built provider, so can't be installed as such
|
|
163
|
+
commons_1.logger.debug(`Expecting package ${cdktfPackageName} or ${cdktnPackageName} to be installed if provider is installed as pre-built one`);
|
|
164
|
+
let installedPackages;
|
|
165
|
+
try {
|
|
166
|
+
installedPackages = await this.packageManager.listProviderPackages();
|
|
167
|
+
}
|
|
168
|
+
catch (e) {
|
|
169
|
+
throw new Error(`Failed to list packages: ${e}`);
|
|
170
|
+
}
|
|
171
|
+
commons_1.logger.debug(`Installed packages found: ${JSON.stringify(installedPackages, null, 2)}`);
|
|
172
|
+
return (_a = installedPackages.find((pkg) => pkg.name === cdktfPackageName || pkg.name === cdktnPackageName)) === null || _a === void 0 ? void 0 : _a.version;
|
|
173
|
+
}
|
|
174
|
+
async upgradePrebuiltProvider(constraint, currentVersion) {
|
|
175
|
+
commons_1.logger.debug(`Searching for latest matching version of ${constraint.simplifiedName}`);
|
|
176
|
+
const { name, version } = await this.getMatchingProviderVersion(constraint);
|
|
177
|
+
commons_1.logger.debug(`Found package ${name}@${version}`);
|
|
178
|
+
if (version !== currentVersion) {
|
|
179
|
+
await this.packageManager.addPackage(name, version);
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
console.log(`The latest version of ${name} is already installed: ${version}`);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
async hasPrebuiltProvider(constraint) {
|
|
186
|
+
commons_1.logger.debug(`determining whether pre-built provider exists for ${constraint.source} with version constraint ${constraint.version} and cdktf version ${this.cdktfVersion}`);
|
|
187
|
+
commons_1.logger.info(`Checking whether pre-built provider exists for the following constraints:
|
|
188
|
+
provider: ${constraint.simplifiedName}
|
|
189
|
+
version : ${constraint.version || "latest"}
|
|
190
|
+
language: ${this.targetLanguage}
|
|
191
|
+
cdktf : ${this.cdktfVersion}
|
|
192
|
+
`);
|
|
193
|
+
if (this.targetLanguage === commons_1.Language.GO &&
|
|
194
|
+
semver.lt(this.cdktfVersion, "0.12.0")) {
|
|
195
|
+
commons_1.logger.info(`Before CDKTF 0.12.0 there were no pre-built providers published for Go.`);
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
const v = await (0, prebuilt_providers_1.getPrebuiltProviderVersions)(constraint, this.cdktfVersion);
|
|
199
|
+
const exists = v !== null;
|
|
200
|
+
if (exists) {
|
|
201
|
+
commons_1.logger.info(`Found pre-built provider.`);
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
commons_1.logger.info(`Pre-built provider does not exist for the given constraints.`);
|
|
205
|
+
}
|
|
206
|
+
return exists;
|
|
207
|
+
}
|
|
208
|
+
async tryGetPackageName(constraint, useCdktn) {
|
|
209
|
+
const npmPackageName = await (0, prebuilt_providers_1.getNpmPackageName)(constraint, useCdktn);
|
|
210
|
+
if (!npmPackageName)
|
|
211
|
+
return;
|
|
212
|
+
return this.tryGetLanguagePackageName(npmPackageName);
|
|
213
|
+
}
|
|
214
|
+
async tryGetLanguagePackageName(npmPackageName) {
|
|
215
|
+
const prebuiltProviderRepository = await (0, prebuilt_providers_1.getPrebuiltProviderRepositoryName)(npmPackageName);
|
|
216
|
+
return this.convertPackageName(npmPackageName, prebuiltProviderRepository, npmPackageName.startsWith("@cdktn"));
|
|
217
|
+
}
|
|
218
|
+
async getMatchingProviderVersion(constraint) {
|
|
219
|
+
const prebuiltProviderNpmVersions = await (0, prebuilt_providers_1.getPrebuiltProviderVersions)(constraint, this.cdktfVersion);
|
|
220
|
+
if (!prebuiltProviderNpmVersions) {
|
|
221
|
+
throw commons_1.Errors.Usage(`No pre-built provider found for ${constraint.source} with version constraint ${constraint.version} and cdktf version ${this.cdktfVersion}`);
|
|
222
|
+
}
|
|
223
|
+
const packageVersion = await this.getLanguageSpecificPackageVersion(prebuiltProviderNpmVersions);
|
|
224
|
+
if (!packageVersion) {
|
|
225
|
+
throw commons_1.Errors.Usage(`No pre-built provider found for ${constraint.source} with version constraint ${constraint.version} and cdktf version ${this.cdktfVersion} for language ${this.targetLanguage}.`);
|
|
226
|
+
}
|
|
227
|
+
return packageVersion;
|
|
228
|
+
}
|
|
229
|
+
async addPrebuiltProvider(constraint, silent = false) {
|
|
230
|
+
commons_1.logger.debug(`adding pre-built provider ${constraint.source} with version constraint ${constraint.version} for cdktf version ${this.cdktfVersion}`);
|
|
231
|
+
const { name, version } = await this.getMatchingProviderVersion(constraint);
|
|
232
|
+
await this.packageManager.addPackage(name, version, silent);
|
|
233
|
+
// TODO: more debug logs
|
|
234
|
+
}
|
|
235
|
+
// The version we use for npm might differ from other registries
|
|
236
|
+
// This happens mostly in cases where a provider update failed to publish to one of the registries
|
|
237
|
+
// In that case we use the latest version that was published successfully and works with the current cdktf release
|
|
238
|
+
async getLanguageSpecificPackageVersion(prebuiltProviderNpmVersions) {
|
|
239
|
+
commons_1.logger.debug("Found possibly matching versions (released on npm): ", prebuiltProviderNpmVersions);
|
|
240
|
+
commons_1.logger.debug("Searching through package manager to find latest available version for given language");
|
|
241
|
+
for (const { name, version } of prebuiltProviderNpmVersions) {
|
|
242
|
+
try {
|
|
243
|
+
const languagePackageName = await this.tryGetLanguagePackageName(name);
|
|
244
|
+
if (!languagePackageName)
|
|
245
|
+
continue;
|
|
246
|
+
const isAvailable = await this.packageManager.isNpmVersionAvailable(languagePackageName, version);
|
|
247
|
+
if (isAvailable) {
|
|
248
|
+
return { name: languagePackageName, version };
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
catch (err) {
|
|
252
|
+
commons_1.logger.info(`Could not find version ${version} for package ${name}: '${err}'. Skipping...`);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
return null;
|
|
256
|
+
}
|
|
257
|
+
async addLocalProvider(constraint) {
|
|
258
|
+
commons_1.logger.info(`Adding local provider ${constraint.source} with version constraint ${constraint.version} to cdktf.json`);
|
|
259
|
+
if (!constraint.version && constraint.isFromTerraformRegistry()) {
|
|
260
|
+
const v = await (0, registry_api_1.getLatestVersion)(constraint);
|
|
261
|
+
if (v) {
|
|
262
|
+
constraint = new ProviderConstraint(constraint.source,
|
|
263
|
+
// "1.3.2" -> "~> 1.3"
|
|
264
|
+
`~> ${v.split(".").slice(0, 2).join(".")}`);
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
throw commons_1.Errors.Usage(`Could not find a version for the provider '${constraint}' in the public registry. This could be due to a typo, please take a look at https://cdk.tf/registry-providers to find all supported providers.`);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
await new cdktf_config_manager_1.CdktfConfigManager().addProvider(constraint);
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Converts an NPM package name of a pre-built provider package to the name in the target language
|
|
274
|
+
*/
|
|
275
|
+
convertPackageName(name, repository, useCdktn) {
|
|
276
|
+
return useCdktn
|
|
277
|
+
? this.convertPackageNameCdktn(name, repository)
|
|
278
|
+
: this.convertPackageNameCdktf(name, repository);
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Converts an NPM package name of a pre-built provider package to the name in the target language
|
|
282
|
+
*/
|
|
283
|
+
convertPackageNameCdktf(name, repository) {
|
|
284
|
+
const providerName = name.replace("@cdktf/provider-", "");
|
|
285
|
+
switch (this.targetLanguage) {
|
|
286
|
+
case commons_1.Language.GO: // e.g. github.com/cdktf/cdktf-provider-opentelekomcloud-go/opentelekomcloud
|
|
287
|
+
if (repository) {
|
|
288
|
+
return `${repository}-go/${providerName}`;
|
|
289
|
+
}
|
|
290
|
+
return `github.com/cdktf/cdktf-provider-${providerName}-go/${providerName}`;
|
|
291
|
+
case commons_1.Language.TYPESCRIPT: // e.g. @cdktf/provider-random
|
|
292
|
+
return name; // already the correct name
|
|
293
|
+
case commons_1.Language.CSHARP: // e.g. HashiCorp.Cdktf.Providers.Opentelekomcloud
|
|
294
|
+
return `HashiCorp.Cdktf.Providers.` + (0, codemaker_1.toPascalCase)(providerName);
|
|
295
|
+
case commons_1.Language.JAVA: // e.g. com.hashicorp.opentelekomcloud
|
|
296
|
+
return `com.hashicorp.cdktf-provider-${providerName}`;
|
|
297
|
+
case commons_1.Language.PYTHON: // e.g. cdktf-cdktf-provider-opentelekomcloud
|
|
298
|
+
return `cdktf-cdktf-provider-${providerName}`;
|
|
299
|
+
default:
|
|
300
|
+
throw new Error(`converting package name for language ${this.targetLanguage} not implemented yet`);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Converts an NPM package name of a pre-built provider package to the name in the target language
|
|
305
|
+
*/
|
|
306
|
+
convertPackageNameCdktn(name, repository) {
|
|
307
|
+
const providerName = name.replace("@cdktn/provider-", "");
|
|
308
|
+
switch (this.targetLanguage) {
|
|
309
|
+
case commons_1.Language.GO: // e.g. github.com/cdktf/cdktf-provider-opentelekomcloud-go/opentelekomcloud
|
|
310
|
+
if (repository) {
|
|
311
|
+
return `${repository}-go/${providerName}`;
|
|
312
|
+
}
|
|
313
|
+
return `github.com/cdktn-io/cdktn-provider-${providerName}-go/${providerName}`;
|
|
314
|
+
case commons_1.Language.TYPESCRIPT: // e.g. @cdktf/provider-random
|
|
315
|
+
return name; // already the correct name
|
|
316
|
+
case commons_1.Language.CSHARP: // e.g. HashiCorp.Cdktf.Providers.Opentelekomcloud
|
|
317
|
+
return `Io.Cdktn.Providers.` + (0, codemaker_1.toPascalCase)(providerName);
|
|
318
|
+
case commons_1.Language.JAVA: // e.g. com.hashicorp.opentelekomcloud
|
|
319
|
+
return `io.cdktn.cdktn-provider-${providerName}`;
|
|
320
|
+
case commons_1.Language.PYTHON: // e.g. cdktf-cdktf-provider-opentelekomcloud
|
|
321
|
+
return `cdktn-provider-${providerName}`;
|
|
322
|
+
default:
|
|
323
|
+
throw new Error(`converting package name for language ${this.targetLanguage} not implemented yet`);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Converts an package name of a pre-built provider package in target language to the name in npm
|
|
328
|
+
* Inverse of: `convertPackageName`
|
|
329
|
+
*/
|
|
330
|
+
convertFromPackageNameToNpm(name) {
|
|
331
|
+
const regexes = {
|
|
332
|
+
[commons_1.Language.GO]: /github.com\/(?:cdktf|hashicorp|cdktn-io)\/cdkt([fn])-provider-(.+)-go\//i,
|
|
333
|
+
[commons_1.Language.TYPESCRIPT]: /(.+)/i,
|
|
334
|
+
[commons_1.Language.CSHARP]: /(?:HashiCorp|Io)\.Cdkt([fn])\.Providers\.(.+)/i,
|
|
335
|
+
[commons_1.Language.JAVA]: /(?:com\.hashicorp|io\.cdktn)\.cdkt([fn])-provider-(.+)/i,
|
|
336
|
+
[commons_1.Language.PYTHON]: /(?:cdktf-)?cdkt([fn])-provider-(.+)/i,
|
|
337
|
+
};
|
|
338
|
+
const regex = regexes[this.targetLanguage];
|
|
339
|
+
if (!regex) {
|
|
340
|
+
throw commons_1.Errors.Usage("Language not supported for pre-built providers");
|
|
341
|
+
}
|
|
342
|
+
const match = regex.exec(name);
|
|
343
|
+
if (!match) {
|
|
344
|
+
throw new Error(`Package name is not in expected format: ${name}`);
|
|
345
|
+
}
|
|
346
|
+
const npmPackagePrefix = `@cdkt${match[1]}/provider-`;
|
|
347
|
+
switch (this.targetLanguage) {
|
|
348
|
+
case commons_1.Language.GO: // e.g. github.com/cdktf/cdktf-provider-opentelekomcloud-go/opentelekomcloud
|
|
349
|
+
return npmPackagePrefix + match[2];
|
|
350
|
+
case commons_1.Language.TYPESCRIPT: // e.g. @cdktf/provider-random
|
|
351
|
+
return match[1]; // already the correct name
|
|
352
|
+
case commons_1.Language.CSHARP: // e.g. HashiCorp.Cdktf.Providers.Opentelekomcloud
|
|
353
|
+
return npmPackagePrefix + (0, codemaker_1.toSnakeCase)(match[2]);
|
|
354
|
+
case commons_1.Language.JAVA: // e.g. com.hashicorp.opentelekomcloud
|
|
355
|
+
return npmPackagePrefix + match[2];
|
|
356
|
+
case commons_1.Language.PYTHON: // e.g. cdktf-cdktf-provider-opentelekomcloud
|
|
357
|
+
return npmPackagePrefix + match[2];
|
|
358
|
+
default:
|
|
359
|
+
throw new Error(`converting package name for language ${this.targetLanguage} not implemented yet`);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
async allProviders() {
|
|
363
|
+
const cdktfJson = cdktf_config_1.CdktfConfig.read();
|
|
364
|
+
const localVersions = new local_provider_versions_1.LocalProviderVersions();
|
|
365
|
+
const localProviderConfigs = cdktfJson.terraformProviders;
|
|
366
|
+
const prebuiltProviderConfigs = await this.packageManager.listProviderPackages();
|
|
367
|
+
const prebuiltProvidersInfo = await Promise.all(prebuiltProviderConfigs.map(async (prebuiltProviderConfig) => {
|
|
368
|
+
const packageName = this.convertFromPackageNameToNpm(prebuiltProviderConfig.name);
|
|
369
|
+
const providerInformation = await (0, prebuilt_providers_1.getPrebuiltProviderVersionInformation)(packageName, prebuiltProviderConfig.version);
|
|
370
|
+
return {
|
|
371
|
+
...providerInformation,
|
|
372
|
+
packageName: prebuiltProviderConfig.name,
|
|
373
|
+
};
|
|
374
|
+
}));
|
|
375
|
+
const constraints = new local_provider_constraints_1.LocalProviderConstraints();
|
|
376
|
+
const localProvidersInfo = await Promise.all(localProviderConfigs.map(async (localProviderConfig) => {
|
|
377
|
+
const constraint = ProviderConstraint.fromConfigEntry(localProviderConfig);
|
|
378
|
+
const version = await localVersions.versionForProvider(constraint.simplifiedName);
|
|
379
|
+
const constraintValue = await constraints.constraintForProvider(constraint.simplifiedName);
|
|
380
|
+
return {
|
|
381
|
+
providerName: constraint.simplifiedName,
|
|
382
|
+
providerConstraint: constraintValue || constraint.version,
|
|
383
|
+
providerVersion: version,
|
|
384
|
+
};
|
|
385
|
+
}));
|
|
386
|
+
return {
|
|
387
|
+
local: localProvidersInfo,
|
|
388
|
+
prebuilt: prebuiltProvidersInfo,
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
exports.DependencyManager = DependencyManager;
|
|
393
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwZW5kZW5jeS1tYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGVwZW5kZW5jeS1tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsK0JBQStCO0FBQy9CLG1DQUFtQztBQUNuQyw0Q0FLd0I7QUFDeEIseUNBQXNEO0FBQ3RELGtEQUE4QztBQUM5QyxpRUFBNEQ7QUFDNUQsdURBQW1EO0FBQ25ELDZEQUs4QjtBQUM5QixpREFBa0Q7QUFDbEQsK0RBQWlFO0FBQ2pFLCtDQUFpQztBQUNqQyx3RUFBbUU7QUFDbkUsOEVBQXlFO0FBRXpFLGlGQUFpRjtBQUNwRSxRQUFBLGdCQUFnQixHQUFHLHVCQUF1QixDQUFDO0FBQzNDLFFBQUEsaUJBQWlCLEdBQUcsV0FBVyxDQUFDO0FBQzdDLFNBQVMsdUJBQXVCLENBQUMsTUFBYztJQUM3Qyx3Q0FBd0M7SUFDeEMsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQzdDLFFBQVEsT0FBTyxFQUFFLENBQUM7UUFDaEIsS0FBSyxDQUFDO1lBQ0osT0FBTyxHQUFHLHdCQUFnQixJQUFJLHlCQUFpQixJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzlELEtBQUssQ0FBQztZQUNKLE9BQU8sR0FBRyx3QkFBZ0IsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUN6QztZQUNFLE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBYSxrQkFBa0I7SUFPN0IsbUVBQW1FO0lBQ25FLHNFQUFzRTtJQUN0RSw0R0FBNEc7SUFDNUcsWUFDRSxNQUFjLEVBQ0UsT0FBMkI7UUFBM0IsWUFBTyxHQUFQLE9BQU8sQ0FBb0I7UUFFM0MsSUFBSSxDQUFDLE1BQU0sR0FBRyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsTUFBTSxDQUFD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Q0FBQyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsRUFBRTtZQUNyRCxNQUFNLFVBQVUsR0FDZCxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUMxRCxNQUFNLE9BQU8sR0FBRyxNQUFNLGFBQWEsQ0FBQyxrQkFBa0IsQ0FDcEQsVUFBVSxDQUFDLGNBQWMsQ0FDMUIsQ0FBQztZQUNGLE1BQU0sZUFBZSxHQUFHLE1BQU0sV0FBVyxDQUFDLHFCQUFxQixDQUM3RCxVQUFVLENBQUMsY0FBYyxDQUMxQixDQUFDO1lBRUYsT0FBTztnQkFDTCxZQUFZLEVBQUUsVUFBVSxDQUFDLGNBQWM7Z0JBQ3ZDLGtCQUFrQixFQUFFLGVBQWUsSUFBSSxVQUFVLENBQUMsT0FBTztnQkFDekQsZUFBZSxFQUFFLE9BQU87YUFDekIsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUNILENBQUM7UUFFRixPQUFPO1lBQ0wsS0FBSyxFQUFFLGtCQUFrQjtZQUN6QixRQUFRLEVBQUUscUJBQXFCO1NBQ2hDLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUExWkQsOENBMFpDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluY1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbmltcG9ydCB7XG4gIExhbmd1YWdlLFxuICBFcnJvcnMsXG4gIGxvZ2dlcixcbiAgVGVycmFmb3JtRGVwZW5kZW5jeUNvbnN0cmFpbnQsXG59IGZyb20gXCJAY2RrdG4vY29tbW9uc1wiO1xuaW1wb3J0IHsgdG9QYXNjYWxDYXNlLCB0b1NuYWtlQ2FzZSB9IGZyb20gXCJjb2RlbWFrZXJcIjtcbmltcG9ydCB7IENka3RmQ29uZmlnIH0gZnJvbSBcIi4uL2Nka3RmLWNvbmZpZ1wiO1xuaW1wb3J0IHsgQ2RrdGZDb25maWdNYW5hZ2VyIH0gZnJvbSBcIi4vY2RrdGYtY29uZmlnLW1hbmFnZXJcIjtcbmltcG9ydCB7IFBhY2thZ2VNYW5hZ2VyIH0gZnJvbSBcIi4vcGFja2FnZS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBnZXROcG1QYWNrYWdlTmFtZSxcbiAgZ2V0UHJlYnVpbHRQcm92aWRlclJlcG9zaXRvcnlOYW1lLFxuICBnZXRQcmVidWlsdFByb3ZpZGVyVmVyc2lvbkluZm9ybWF0aW9uLFxuICBnZXRQcmVidWlsdFByb3ZpZGVyVmVyc2lvbnMsXG59IGZyb20gXCIuL3ByZWJ1aWx0LXByb3ZpZGVyc1wiO1xuaW1wb3J0IHsgZ2V0TGF0ZXN0VmVyc2lvbiB9IGZyb20gXCIuL3JlZ2lzdHJ5LWFwaVwiO1xuaW1wb3J0IHsgdmVyc2lvbk1hdGNoZXNDb25zdHJhaW50IH0gZnJvbSBcIi4vdmVyc2lvbi1jb25zdHJhaW50c1wiO1xuaW1wb3J0ICogYXMgc2VtdmVyIGZyb20gXCJzZW12ZXJcIjtcbmltcG9ydCB7IExvY2FsUHJvdmlkZXJWZXJzaW9ucyB9IGZyb20gXCIuLi9sb2NhbC1wcm92aWRlci12ZXJzaW9uc1wiO1xuaW1wb3J0IHsgTG9jYWxQcm92aWRlckNvbnN0cmFpbnRzIH0gZnJvbSBcIi4uL2xvY2FsLXByb3ZpZGVyLWNvbnN0cmFpbnRzXCI7XG5cbi8vIHJlZjogaHR0cHM6Ly93d3cudGVycmFmb3JtLmlvL2xhbmd1YWdlL3Byb3ZpZGVycy9yZXF1aXJlbWVudHMjc291cmNlLWFkZHJlc3Nlc1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfSE9TVE5BTUUgPSBcInJlZ2lzdHJ5LnRlcnJhZm9ybS5pb1wiO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTkFNRVNQQUNFID0gXCJoYXNoaWNvcnBcIjtcbmZ1bmN0aW9uIG5vcm1hbGl6ZVByb3ZpZGVyU291cmNlKHNvdXJjZTogc3RyaW5nKSB7XG4gIC8vIHJldHVybnMgPEhPU1ROQU1FPi88TkFNRVNQQUNFPi88VFlQRT5cbiAgY29uc3Qgc2xhc2hlcyA9IHNvdXJjZS5zcGxpdChcIi9cIikubGVuZ3RoIC0gMTtcbiAgc3dpdGNoIChzbGFzaGVzKSB7XG4gICAgY2FzZSAwOlxuICAgICAgcmV0dXJuIGAke0RFRkFVTFRfSE9TVE5BTUV9LyR7REVGQVVMVF9OQU1FU1BBQ0V9LyR7c291cmNlfWA7XG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIGAke0RFRkFVTFRfSE9TVE5BTUV9LyR7c291cmNlfWA7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBzb3VyY2U7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFByb3ZpZGVyQ29uc3RyYWludCB7XG4gIC8qKlxuICAgKiBub3JtYWxpemVkIHNvdXJjZSBvZiB0aGUgcHJvdmlkZXJcbiAgICogZS5nLiBcInJlZ2lzdHJ5LnRlcnJhZm9ybS5pby9oYXNoaWNvcnAvYXdzXCJcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzb3VyY2U6IHN0cmluZztcblxuICAvLyBUT0RPOiBhZGQgZXhhbXBsZXMgdG8gY2xpIGNvbW1hbmQgZGVzY3JpcHRpb24gKGkuZS4gPSx+Pi4+IGV0Yy4pXG4gIC8vIGlmIG5vIHZlcnNpb24gY29uc3RyYWludCBpcyBzcGVjaWZpZWQsIHdlIGFzc3VtZSB0aGUgbGF0ZXN0IHZlcnNpb25cbiAgLy8gaWYgc3BlY2lmaWMgdmVyc2lvbiBpcyBzcGVjaWZpZWQgd2l0aG91dCBlLmcuID0sIHdlIGFsbG93IHBhdGNoIGxldmVsIGluY3JlbWVudHMgKGUuZy4gfj4yLjEyIGZvciBcIjIuMTJcIilcbiAgY29uc3RydWN0b3IoXG4gICAgc291cmNlOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgKSB7XG4gICAgdGhpcy5zb3VyY2UgPSBub3JtYWxpemVQcm92aWRlclNvdXJjZShzb3VyY2UpO1xuICB9XG5cbiAgc3RhdGljIGZyb21Db25maWdFbnRyeShcbiAgICBwcm92aWRlcjogc3RyaW5nIHwgVGVycmFmb3JtRGVwZW5kZW5jeUNvbnN0cmFpbnQsXG4gICk6IFByb3ZpZGVyQ29uc3RyYWludCB7XG4gICAgaWYgKHR5cGVvZiBwcm92aWRlciA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgY29uc3QgW3NyYywgdmVyc2lvbl0gPSBwcm92aWRlci5zcGxpdChcIkBcIik7XG4gICAgICByZXR1cm4gbmV3IFByb3ZpZGVyQ29uc3RyYWludChcbiAgICAgICAgc3JjLnRyaW0oKSxcbiAgICAgICAgdmVyc2lvbiA/IHZlcnNpb24udHJpbSgpIDogdW5kZWZpbmVkLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBzcmMgPVxuICAgICAgKHByb3ZpZGVyLm5hbWVzcGFjZSA/IGAke3Byb3ZpZGVyLm5hbWVzcGFjZX0vYCA6IFwiXCIpICtcbiAgICAgIChwcm92aWRlci5zb3VyY2UgfHwgcHJvdmlkZXIubmFtZSk7XG5cbiAgICByZXR1cm4gbmV3IFByb3ZpZGVyQ29uc3RyYWludChzcmMsIHByb3ZpZGVyLnZlcnNpb24pO1xuICB9XG5cbiAgcHVibGljIGlzRnJvbVRlcnJhZm9ybVJlZ2lzdHJ5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhvc3RuYW1lID09PSBERUZBVUxUX0hPU1ROQU1FO1xuICB9XG5cbiAgLyoqXG4gICAqIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIHByb3ZpZGVyXG4gICAqIGUuZy4gXCJoYXNoaWNvcnBcIiBvciBcImtyZXV6d2Vya2VyXCJcbiAgICovXG4gIHB1YmxpYyBnZXQgbmFtZXNwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc291cmNlLnNwbGl0KFwiL1wiKVsxXTtcbiAgfVxuXG4gIC8qKlxuICAgKiB0aGUgbmFtZSBvZiB0aGUgcHJvdmlkZXJcbiAgICogZS5nLiBcImF3c1wiXG4gICAqL1xuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zb3VyY2Uuc3BsaXQoXCIvXCIpWzJdO1xuICB9XG5cbiAgLyoqXG4gICAqIHRoZSBob3N0bmFtZSBvZiB0aGUgcHJvdmlkZXJcbiAgICogZS5nLiBcInJlZ2lzdHJ5LnRlcnJhZm9ybS5pb1wiXG4gICAqL1xuICBwdWJsaWMgZ2V0IGhvc3RuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc291cmNlLnNwbGl0KFwiL1wiKVswXTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm5zIGEgc2ltcGxpZmllZCBwcm92aWRlciBuYW1lLCBkcm9wcGluZyBuYW1lc3BhY2UgYW5kIGhvc3RuYW1lXG4gICAqIGlmIHRoZXkgbWF0Y2ggdGhlIGRlZmF1bHRzXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNpbXBsaWZpZWROYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc291cmNlXG4gICAgICAuc3BsaXQoXCIvXCIpXG4gICAgICAuZmlsdGVyKChwYXJ0KSA9PiBwYXJ0ICE9PSBERUZBVUxUX0hPU1ROQU1FICYmIHBhcnQgIT09IERFRkFVTFRfTkFNRVNQQUNFKVxuICAgICAgLmpvaW4oXCIvXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIGNoZWNrcyBpZiB0aGUgdmVyc2lvbiBjb25zdHJhaW50IG1hdGNoZXMgdGhlIGdpdmVuIHZlcnNpb25cbiAgICogQHBhcmFtIHZlcnNpb24gYW4gYWN0dWFsIHZlcnNpb24gKGUuZy4gXCI0LjEyLjFcIilcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgdmVyc2lvbiBpcyBjb21wYXRpYmxlIHdpdGggdGhlIGNvbnN0cmFpbnRcbiAgICovXG4gIHB1YmxpYyBtYXRjaGVzVmVyc2lvbih2ZXJzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy52ZXJzaW9uKSB7XG4gICAgICByZXR1cm4gdmVyc2lvbk1hdGNoZXNDb25zdHJhaW50KHZlcnNpb24sIHRoaXMudmVyc2lvbik7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiBgJHt0aGlzLnNvdXJjZX0ke3RoaXMudmVyc2lvbiA/IGBAJHt0aGlzLnZlcnNpb259YCA6IFwiXCJ9YDtcbiAgfVxufVxuXG4vKipcbiAqIG1hbmFnZXMgZGVwZW5kZW5jaWVzIG9mIGEgQ0RLVE4gcHJvamVjdCAoZS5nLiB0ZXJyYWZvcm0gcHJvdmlkZXJzKVxuICovXG5leHBvcnQgY2xhc3MgRGVwZW5kZW5jeU1hbmFnZXIge1xuICBwcml2YXRlIHBhY2thZ2VNYW5hZ2VyOiBQYWNrYWdlTWFuYWdlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRhcmdldExhbmd1YWdlOiBMYW5ndWFnZSxcbiAgICBwcml2YXRlIGNka3RmVmVyc2lvbjogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJvamVjdERpcmVjdG9yeTogc3RyaW5nLFxuICApIHtcbiAgICB0aGlzLnBhY2thZ2VNYW5hZ2VyID0gUGFja2FnZU1hbmFnZXIuZm9yTGFuZ3VhZ2UoXG4gICAgICB0YXJnZXRMYW5ndWFnZSxcbiAgICAgIHRoaXMucHJvamVjdERpcmVjdG9yeSxcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgYWRkUHJvdmlkZXIoXG4gICAgY29uc3RyYWludDogUHJvdmlkZXJDb25zdHJhaW50LFxuICApOiBQcm9taXNlPHsgYWRkZWRMb2NhbFByb3ZpZGVyOiBib29sZWFuIH0+IHtcbiAgICBpZiAoYXdhaXQgdGhpcy5oYXNQcmVidWlsdFByb3ZpZGVyKGNvbnN0cmFpbnQpKSB7XG4gICAgICBhd2FpdCB0aGlzLmFkZFByZWJ1aWx0UHJvdmlkZXIoY29uc3RyYWludCk7XG4gICAgICByZXR1cm4geyBhZGRlZExvY2FsUHJvdmlkZXI6IGZhbHNlIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRkTG9jYWxQcm92aWRlcihjb25zdHJhaW50KTtcbiAgICAgIHJldHVybiB7IGFkZGVkTG9jYWxQcm92aWRlcjogdHJ1ZSB9O1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHVwZ3JhZGVQcm92aWRlcihjb25zdHJhaW50OiBQcm92aWRlckNvbnN0cmFpbnQpIHtcbiAgICBjb25zb2xlLmxvZyhgVXBncmFkaW5nICR7Y29uc3RyYWludC5zaW1wbGlmaWVkTmFtZX0uLi5gKTtcbiAgICBjb25zdCBjZGt0Zkpzb24gPSBuZXcgQ2RrdGZDb25maWdNYW5hZ2VyKCk7XG4gICAgY29uc3QgcHJlYnVpbHRWZXJzaW9uID0gYXdhaXQgdGhpcy5nZXRDdXJyZW50bHlJbnN0YWxsZWRWZXJzaW9uKGNvbnN0cmFpbnQpO1xuICAgIGlmIChwcmVidWlsdFZlcnNpb24pIHtcbiAgICAgIGF3YWl0IHRoaXMudXBncmFkZVByZWJ1aWx0UHJvdmlkZXIoY29uc3RyYWludCwgcHJlYnVpbHRWZXJzaW9uKTtcbiAgICAgIHJldHVybiB7IGFkZGVkTG9jYWxQcm92aWRlcjogZmFsc2UgfTtcbiAgICB9XG4gICAgaWYgKGF3YWl0IGNka3RmSnNvbi5oYXNQcm92aWRlcihjb25zdHJhaW50KSkge1xuICAgICAgYXdhaXQgY2RrdGZKc29uLnVwZGF0ZVByb3ZpZGVyKGNvbnN0cmFpbnQpO1xuICAgICAgcmV0dXJuIHsgYWRkZWRMb2NhbFByb3ZpZGVyOiB0cnVlIH07XG4gICAgfVxuXG4gICAgdGhyb3cgRXJyb3JzLlVzYWdlKFxuICAgICAgYFRyeWluZyB0byB1cGdyYWRlICR7Y29uc3RyYWludC5zaW1wbGlmaWVkTmFtZX0gYnV0IGl0IGlzIG5vdCBpbnN0YWxsZWQsIHBsZWFzZSB1c2UgXCJjZGt0biBwcm92aWRlciBhZGQgJHtjb25zdHJhaW50LnNpbXBsaWZpZWROYW1lfVwiIHRvIGFkZCBpdC5gLFxuICAgICk7XG4gIH1cblxuICBhc3luYyBnZXRDdXJyZW50bHlJbnN0YWxsZWRWZXJzaW9uKGNvbnN0cmFpbnQ6IFByb3ZpZGVyQ29uc3RyYWludCkge1xuICAgIGxvZ2dlci5pbmZvKGBDaGVja2luZyBpZiAke2NvbnN0cmFpbnQuc2ltcGxpZmllZE5hbWV9IGlzIGluc3RhbGxlZC4uLmApO1xuICAgIGNvbnN0IGNka3RmUGFja2FnZU5hbWUgPSBhd2FpdCB0aGlzLnRyeUdldFBhY2thZ2VOYW1lKGNvbnN0cmFpbnQsIGZhbHNlKTtcbiAgICBjb25zdCBjZGt0blBhY2thZ2VOYW1lID0gYXdhaXQgdGhpcy50cnlHZXRQYWNrYWdlTmFtZShjb25zdHJhaW50LCB0cnVlKTtcblxuICAgIGlmICghY2RrdGZQYWNrYWdlTmFtZSAmJiAhY2RrdG5QYWNrYWdlTmFtZSkgcmV0dXJuOyAvLyBub3QgYXZhaWxhYmxlIGFzIHByZS1idWlsdCBwcm92aWRlciwgc28gY2FuJ3QgYmUgaW5zdGFsbGVkIGFzIHN1Y2hcblxuICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgIGBFeHBlY3RpbmcgcGFja2FnZSAke2Nka3RmUGFja2FnZU5hbWV9IG9yICR7Y2RrdG5QYWNrYWdlTmFtZX0gdG8gYmUgaW5zdGFsbGVkIGlmIHByb3ZpZGVyIGlzIGluc3RhbGxlZCBhcyBwcmUtYnVpbHQgb25lYCxcbiAgICApO1xuXG4gICAgbGV0IGluc3RhbGxlZFBhY2thZ2VzO1xuICAgIHRyeSB7XG4gICAgICBpbnN0YWxsZWRQYWNrYWdlcyA9IGF3YWl0IHRoaXMucGFja2FnZU1hbmFnZXIubGlzdFByb3ZpZGVyUGFja2FnZXMoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBsaXN0IHBhY2thZ2VzOiAke2V9YCk7XG4gICAgfVxuXG4gICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgYEluc3RhbGxlZCBwYWNrYWdlcyBmb3VuZDogJHtKU09OLnN0cmluZ2lmeShpbnN0YWxsZWRQYWNrYWdlcywgbnVsbCwgMil9YCxcbiAgICApO1xuXG4gICAgcmV0dXJuIGluc3RhbGxlZFBhY2thZ2VzLmZpbmQoXG4gICAgICAocGtnKSA9PiBwa2cubmFtZSA9PT0gY2RrdGZQYWNrYWdlTmFtZSB8fCBwa2cubmFtZSA9PT0gY2RrdG5QYWNrYWdlTmFtZSxcbiAgICApPy52ZXJzaW9uO1xuICB9XG5cbiAgYXN5bmMgdXBncmFkZVByZWJ1aWx0UHJvdmlkZXIoXG4gICAgY29uc3RyYWludDogUHJvdmlkZXJDb25zdHJhaW50LFxuICAgIGN1cnJlbnRWZXJzaW9uOiBzdHJpbmcsXG4gICkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgIGBTZWFyY2hpbmcgZm9yIGxhdGVzdCBtYXRjaGluZyB2ZXJzaW9uIG9mICR7Y29uc3RyYWludC5zaW1wbGlmaWVkTmFtZX1gLFxuICAgICk7XG5cbiAgICBjb25zdCB7IG5hbWUsIHZlcnNpb24gfSA9IGF3YWl0IHRoaXMuZ2V0TWF0Y2hpbmdQcm92aWRlclZlcnNpb24oY29uc3RyYWludCk7XG5cbiAgICBsb2dnZXIuZGVidWcoYEZvdW5kIHBhY2thZ2UgJHtuYW1lfUAke3ZlcnNpb259YCk7XG4gICAgaWYgKHZlcnNpb24gIT09IGN1cnJlbnRWZXJzaW9uKSB7XG4gICAgICBhd2FpdCB0aGlzLnBhY2thZ2VNYW5hZ2VyLmFkZFBhY2thZ2UobmFtZSwgdmVyc2lvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgVGhlIGxhdGVzdCB2ZXJzaW9uIG9mICR7bmFtZX0gaXMgYWxyZWFkeSBpbnN0YWxsZWQ6ICR7dmVyc2lvbn1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBoYXNQcmVidWlsdFByb3ZpZGVyKGNvbnN0cmFpbnQ6IFByb3ZpZGVyQ29uc3RyYWludCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgIGBkZXRlcm1pbmluZyB3aGV0aGVyIHByZS1idWlsdCBwcm92aWRlciBleGlzdHMgZm9yICR7Y29uc3RyYWludC5zb3VyY2V9IHdpdGggdmVyc2lvbiBjb25zdHJhaW50ICR7Y29uc3RyYWludC52ZXJzaW9ufSBhbmQgY2RrdGYgdmVyc2lvbiAke3RoaXMuY2RrdGZWZXJzaW9ufWAsXG4gICAgKTtcblxuICAgIGxvZ2dlci5pbmZvKGBDaGVja2luZyB3aGV0aGVyIHByZS1idWlsdCBwcm92aWRlciBleGlzdHMgZm9yIHRoZSBmb2xsb3dpbmcgY29uc3RyYWludHM6XG4gIHByb3ZpZGVyOiAke2NvbnN0cmFpbnQuc2ltcGxpZmllZE5hbWV9XG4gIHZlcnNpb24gOiAke2NvbnN0cmFpbnQudmVyc2lvbiB8fCBcImxhdGVzdFwifVxuICBsYW5ndWFnZTogJHt0aGlzLnRhcmdldExhbmd1YWdlfVxuICBjZGt0ZiAgIDogJHt0aGlzLmNka3RmVmVyc2lvbn1cbmApO1xuXG4gICAgaWYgKFxuICAgICAgdGhpcy50YXJnZXRMYW5ndWFnZSA9PT0gTGFuZ3VhZ2UuR08gJiZcbiAgICAgIHNlbXZlci5sdCh0aGlzLmNka3RmVmVyc2lvbiwgXCIwLjEyLjBcIilcbiAgICApIHtcbiAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICBgQmVmb3JlIENES1RGIDAuMTIuMCB0aGVyZSB3ZXJlIG5vIHByZS1idWlsdCBwcm92aWRlcnMgcHVibGlzaGVkIGZvciBHby5gLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB2ID0gYXdhaXQgZ2V0UHJlYnVpbHRQcm92aWRlclZlcnNpb25zKGNvbnN0cmFpbnQsIHRoaXMuY2RrdGZWZXJzaW9uKTtcbiAgICBjb25zdCBleGlzdHMgPSB2ICE9PSBudWxsO1xuXG4gICAgaWYgKGV4aXN0cykge1xuICAgICAgbG9nZ2VyLmluZm8oYEZvdW5kIHByZS1idWlsdCBwcm92aWRlci5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgIGBQcmUtYnVpbHQgcHJvdmlkZXIgZG9lcyBub3QgZXhpc3QgZm9yIHRoZSBnaXZlbiBjb25zdHJhaW50cy5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXhpc3RzO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB0cnlHZXRQYWNrYWdlTmFtZShcbiAgICBjb25zdHJhaW50OiBQcm92aWRlckNvbnN0cmFpbnQsXG4gICAgdXNlQ2RrdG46IGJvb2xlYW4sXG4gICk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgbnBtUGFja2FnZU5hbWUgPSBhd2FpdCBnZXROcG1QYWNrYWdlTmFtZShjb25zdHJhaW50LCB1c2VDZGt0bik7XG5cbiAgICBpZiAoIW5wbVBhY2thZ2VOYW1lKSByZXR1cm47XG5cbiAgICByZXR1cm4gdGhpcy50cnlHZXRMYW5ndWFnZVBhY2thZ2VOYW1lKG5wbVBhY2thZ2VOYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdHJ5R2V0TGFuZ3VhZ2VQYWNrYWdlTmFtZShcbiAgICBucG1QYWNrYWdlTmFtZTogc3RyaW5nLFxuICApOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHByZWJ1aWx0UHJvdmlkZXJSZXBvc2l0b3J5ID1cbiAgICAgIGF3YWl0IGdldFByZWJ1aWx0UHJvdmlkZXJSZXBvc2l0b3J5TmFtZShucG1QYWNrYWdlTmFtZSk7XG5cbiAgICByZXR1cm4gdGhpcy5jb252ZXJ0UGFja2FnZU5hbWUoXG4gICAgICBucG1QYWNrYWdlTmFtZSxcbiAgICAgIHByZWJ1aWx0UHJvdmlkZXJSZXBvc2l0b3J5LFxuICAgICAgbnBtUGFja2FnZU5hbWUuc3RhcnRzV2l0aChcIkBjZGt0blwiKSxcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgZ2V0TWF0Y2hpbmdQcm92aWRlclZlcnNpb24oY29uc3RyYWludDogUHJvdmlkZXJDb25zdHJhaW50KSB7XG4gICAgY29uc3QgcHJlYnVpbHRQcm92aWRlck5wbVZlcnNpb25zID0gYXdhaXQgZ2V0UHJlYnVpbHRQcm92aWRlclZlcnNpb25zKFxuICAgICAgY29uc3RyYWludCxcbiAgICAgIHRoaXMuY2RrdGZWZXJzaW9uLFxuICAgICk7XG4gICAgaWYgKCFwcmVidWlsdFByb3ZpZGVyTnBtVmVyc2lvbnMpIHtcbiAgICAgIHRocm93IEVycm9ycy5Vc2FnZShcbiAgICAgICAgYE5vIHByZS1idWlsdCBwcm92aWRlciBmb3VuZCBmb3IgJHtjb25zdHJhaW50LnNvdXJjZX0gd2l0aCB2ZXJzaW9uIGNvbnN0cmFpbnQgJHtjb25zdHJhaW50LnZlcnNpb259IGFuZCBjZGt0ZiB2ZXJzaW9uICR7dGhpcy5jZGt0ZlZlcnNpb259YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFja2FnZVZlcnNpb24gPSBhd2FpdCB0aGlzLmdldExhbmd1YWdlU3BlY2lmaWNQYWNrYWdlVmVyc2lvbihcbiAgICAgIHByZWJ1aWx0UHJvdmlkZXJOcG1WZXJzaW9ucyxcbiAgICApO1xuXG4gICAgaWYgKCFwYWNrYWdlVmVyc2lvbikge1xuICAgICAgdGhyb3cgRXJyb3JzLlVzYWdlKFxuICAgICAgICBgTm8gcHJlLWJ1aWx0IHByb3ZpZGVyIGZvdW5kIGZvciAke2NvbnN0cmFpbnQuc291cmNlfSB3aXRoIHZlcnNpb24gY29uc3RyYWludCAke2NvbnN0cmFpbnQudmVyc2lvbn0gYW5kIGNka3RmIHZlcnNpb24gJHt0aGlzLmNka3RmVmVyc2lvbn0gZm9yIGxhbmd1YWdlICR7dGhpcy50YXJnZXRMYW5ndWFnZX0uYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhY2thZ2VWZXJzaW9uO1xuICB9XG5cbiAgYXN5bmMgYWRkUHJlYnVpbHRQcm92aWRlcihjb25zdHJhaW50OiBQcm92aWRlckNvbnN0cmFpbnQsIHNpbGVudCA9IGZhbHNlKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgYGFkZGluZyBwcmUtYnVpbHQgcHJvdmlkZXIgJHtjb25zdHJhaW50LnNvdXJjZX0gd2l0aCB2ZXJzaW9uIGNvbnN0cmFpbnQgJHtjb25zdHJhaW50LnZlcnNpb259IGZvciBjZGt0ZiB2ZXJzaW9uICR7dGhpcy5jZGt0ZlZlcnNpb259YCxcbiAgICApO1xuXG4gICAgY29uc3QgeyBuYW1lLCB2ZXJzaW9uIH0gPSBhd2FpdCB0aGlzLmdldE1hdGNoaW5nUHJvdmlkZXJWZXJzaW9uKGNvbnN0cmFpbnQpO1xuICAgIGF3YWl0IHRoaXMucGFja2FnZU1hbmFnZXIuYWRkUGFja2FnZShuYW1lLCB2ZXJzaW9uLCBzaWxlbnQpO1xuXG4gICAgLy8gVE9ETzogbW9yZSBkZWJ1ZyBsb2dzXG4gIH1cblxuICAvLyBUaGUgdmVyc2lvbiB3ZSB1c2UgZm9yIG5wbSBtaWdodCBkaWZmZXIgZnJvbSBvdGhlciByZWdpc3RyaWVzXG4gIC8vIFRoaXMgaGFwcGVucyBtb3N0bHkgaW4gY2FzZXMgd2hlcmUgYSBwcm92aWRlciB1cGRhdGUgZmFpbGVkIHRvIHB1Ymxpc2ggdG8gb25lIG9mIHRoZSByZWdpc3RyaWVzXG4gIC8vIEluIHRoYXQgY2FzZSB3ZSB1c2UgdGhlIGxhdGVzdCB2ZXJzaW9uIHRoYXQgd2FzIHB1Ymxpc2hlZCBzdWNjZXNzZnVsbHkgYW5kIHdvcmtzIHdpdGggdGhlIGN1cnJlbnQgY2RrdGYgcmVsZWFzZVxuICBwcml2YXRlIGFzeW5jIGdldExhbmd1YWdlU3BlY2lmaWNQYWNrYWdlVmVyc2lvbihcbiAgICBwcmVidWlsdFByb3ZpZGVyTnBtVmVyc2lvbnM6IHsgbmFtZTogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmcgfVtdLFxuICApOiBQcm9taXNlPHsgbmFtZTogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmcgfSB8IG51bGw+IHtcbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICBcIkZvdW5kIHBvc3NpYmx5IG1hdGNoaW5nIHZlcnNpb25zIChyZWxlYXNlZCBvbiBucG0pOiBcIixcbiAgICAgIHByZWJ1aWx0UHJvdmlkZXJOcG1WZXJzaW9ucyxcbiAgICApO1xuICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgIFwiU2VhcmNoaW5nIHRocm91Z2ggcGFja2FnZSBtYW5hZ2VyIHRvIGZpbmQgbGF0ZXN0IGF2YWlsYWJsZSB2ZXJzaW9uIGZvciBnaXZlbiBsYW5ndWFnZVwiLFxuICAgICk7XG5cbiAgICBmb3IgKGNvbnN0IHsgbmFtZSwgdmVyc2lvbiB9IG9mIHByZWJ1aWx0UHJvdmlkZXJOcG1WZXJzaW9ucykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbGFuZ3VhZ2VQYWNrYWdlTmFtZSA9IGF3YWl0IHRoaXMudHJ5R2V0TGFuZ3VhZ2VQYWNrYWdlTmFtZShuYW1lKTtcbiAgICAgICAgaWYgKCFsYW5ndWFnZVBhY2thZ2VOYW1lKSBjb250aW51ZTtcblxuICAgICAgICBjb25zdCBpc0F2YWlsYWJsZSA9IGF3YWl0IHRoaXMucGFja2FnZU1hbmFnZXIuaXNOcG1WZXJzaW9uQXZhaWxhYmxlKFxuICAgICAgICAgIGxhbmd1YWdlUGFja2FnZU5hbWUsXG4gICAgICAgICAgdmVyc2lvbixcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGlzQXZhaWxhYmxlKSB7XG4gICAgICAgICAgcmV0dXJuIHsgbmFtZTogbGFuZ3VhZ2VQYWNrYWdlTmFtZSwgdmVyc2lvbiB9O1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgYENvdWxkIG5vdCBmaW5kIHZlcnNpb24gJHt2ZXJzaW9ufSBmb3IgcGFja2FnZSAke25hbWV9OiAnJHtlcnJ9Jy4gU2tpcHBpbmcuLi5gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGFzeW5jIGFkZExvY2FsUHJvdmlkZXIoY29uc3RyYWludDogUHJvdmlkZXJDb25zdHJhaW50KSB7XG4gICAgbG9nZ2VyLmluZm8oXG4gICAgICBgQWRkaW5nIGxvY2FsIHByb3ZpZGVyICR7Y29uc3RyYWludC5zb3VyY2V9IHdpdGggdmVyc2lvbiBjb25zdHJhaW50ICR7Y29uc3RyYWludC52ZXJzaW9ufSB0byBjZGt0Zi5qc29uYCxcbiAgICApO1xuXG4gICAgaWYgKCFjb25zdHJhaW50LnZlcnNpb24gJiYgY29uc3RyYWludC5pc0Zyb21UZXJyYWZvcm1SZWdpc3RyeSgpKSB7XG4gICAgICBjb25zdCB2ID0gYXdhaXQgZ2V0TGF0ZXN0VmVyc2lvbihjb25zdHJhaW50KTtcbiAgICAgIGlmICh2KSB7XG4gICAgICAgIGNvbnN0cmFpbnQgPSBuZXcgUHJvdmlkZXJDb25zdHJhaW50KFxuICAgICAgICAgIGNvbnN0cmFpbnQuc291cmNlLFxuICAgICAgICAgIC8vIFwiMS4zLjJcIiAtPiBcIn4+IDEuM1wiXG4gICAgICAgICAgYH4+ICR7di5zcGxpdChcIi5cIikuc2xpY2UoMCwgMikuam9pbihcIi5cIil9YCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IEVycm9ycy5Vc2FnZShcbiAgICAgICAgICBgQ291bGQgbm90IGZpbmQgYSB2ZXJzaW9uIGZvciB0aGUgcHJvdmlkZXIgJyR7Y29uc3RyYWludH0nIGluIHRoZSBwdWJsaWMgcmVnaXN0cnkuIFRoaXMgY291bGQgYmUgZHVlIHRvIGEgdHlwbywgcGxlYXNlIHRha2UgYSBsb29rIGF0IGh0dHBzOi8vY2RrLnRmL3JlZ2lzdHJ5LXByb3ZpZGVycyB0byBmaW5kIGFsbCBzdXBwb3J0ZWQgcHJvdmlkZXJzLmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgbmV3IENka3RmQ29uZmlnTWFuYWdlcigpLmFkZFByb3ZpZGVyKGNvbnN0cmFpbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGFuIE5QTSBwYWNrYWdlIG5hbWUgb2YgYSBwcmUtYnVpbHQgcHJvdmlkZXIgcGFja2FnZSB0byB0aGUgbmFtZSBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlXG4gICAqL1xuICBwcml2YXRlIGNvbnZlcnRQYWNrYWdlTmFtZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcmVwb3NpdG9yeTogc3RyaW5nLFxuICAgIHVzZUNka3RuOiBib29sZWFuLFxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB1c2VDZGt0blxuICAgICAgPyB0aGlzLmNvbnZlcnRQYWNrYWdlTmFtZUNka3RuKG5hbWUsIHJlcG9zaXRvcnkpXG4gICAgICA6IHRoaXMuY29udmVydFBhY2thZ2VOYW1lQ2RrdGYobmFtZSwgcmVwb3NpdG9yeSk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYW4gTlBNIHBhY2thZ2UgbmFtZSBvZiBhIHByZS1idWlsdCBwcm92aWRlciBwYWNrYWdlIHRvIHRoZSBuYW1lIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2VcbiAgICovXG4gIHByaXZhdGUgY29udmVydFBhY2thZ2VOYW1lQ2RrdGYobmFtZTogc3RyaW5nLCByZXBvc2l0b3J5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHByb3ZpZGVyTmFtZSA9IG5hbWUucmVwbGFjZShcIkBjZGt0Zi9wcm92aWRlci1cIiwgXCJcIik7XG4gICAgc3dpdGNoICh0aGlzLnRhcmdldExhbmd1YWdlKSB7XG4gICAgICBjYXNlIExhbmd1YWdlLkdPOiAvLyBlLmcuIGdpdGh1Yi5jb20vY2RrdGYvY2RrdGYtcHJvdmlkZXItb3BlbnRlbGVrb21jbG91ZC1nby9vcGVudGVsZWtvbWNsb3VkXG4gICAgICAgIGlmIChyZXBvc2l0b3J5KSB7XG4gICAgICAgICAgcmV0dXJuIGAke3JlcG9zaXRvcnl9LWdvLyR7cHJvdmlkZXJOYW1lfWA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYGdpdGh1Yi5jb20vY2RrdGYvY2RrdGYtcHJvdmlkZXItJHtwcm92aWRlck5hbWV9LWdvLyR7cHJvdmlkZXJOYW1lfWA7XG4gICAgICBjYXNlIExhbmd1YWdlLlRZUEVTQ1JJUFQ6IC8vIGUuZy4gQGNka3RmL3Byb3ZpZGVyLXJhbmRvbVxuICAgICAgICByZXR1cm4gbmFtZTsgLy8gYWxyZWFkeSB0aGUgY29ycmVjdCBuYW1lXG4gICAgICBjYXNlIExhbmd1YWdlLkNTSEFSUDogLy8gZS5nLiBIYXNoaUNvcnAuQ2RrdGYuUHJvdmlkZXJzLk9wZW50ZWxla29tY2xvdWRcbiAgICAgICAgcmV0dXJuIGBIYXNoaUNvcnAuQ2RrdGYuUHJvdmlkZXJzLmAgKyB0b1Bhc2NhbENhc2UocHJvdmlkZXJOYW1lKTtcbiAgICAgIGNhc2UgTGFuZ3VhZ2UuSkFWQTogLy8gZS5nLiBjb20uaGFzaGljb3JwLm9wZW50ZWxla29tY2xvdWRcbiAgICAgICAgcmV0dXJuIGBjb20uaGFzaGljb3JwLmNka3RmLXByb3ZpZGVyLSR7cHJvdmlkZXJOYW1lfWA7XG4gICAgICBjYXNlIExhbmd1YWdlLlBZVEhPTjogLy8gZS5nLiBjZGt0Zi1jZGt0Zi1wcm92aWRlci1vcGVudGVsZWtvbWNsb3VkXG4gICAgICAgIHJldHVybiBgY2RrdGYtY2RrdGYtcHJvdmlkZXItJHtwcm92aWRlck5hbWV9YDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgY29udmVydGluZyBwYWNrYWdlIG5hbWUgZm9yIGxhbmd1YWdlICR7dGhpcy50YXJnZXRMYW5ndWFnZX0gbm90IGltcGxlbWVudGVkIHlldGAsXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGFuIE5QTSBwYWNrYWdlIG5hbWUgb2YgYSBwcmUtYnVpbHQgcHJvdmlkZXIgcGFja2FnZSB0byB0aGUgbmFtZSBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlXG4gICAqL1xuICBwcml2YXRlIGNvbnZlcnRQYWNrYWdlTmFtZUNka3RuKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICByZXBvc2l0b3J5OiBzdHJpbmcsXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcHJvdmlkZXJOYW1lID0gbmFtZS5yZXBsYWNlKFwiQGNka3RuL3Byb3ZpZGVyLVwiLCBcIlwiKTtcbiAgICBzd2l0Y2ggKHRoaXMudGFyZ2V0TGFuZ3VhZ2UpIHtcbiAgICAgIGNhc2UgTGFuZ3VhZ2UuR086IC8vIGUuZy4gZ2l0aHViLmNvbS9jZGt0Zi9jZGt0Zi1wcm92aWRlci1vcGVudGVsZWtvbWNsb3VkLWdvL29wZW50ZWxla29tY2xvdWRcbiAgICAgICAgaWYgKHJlcG9zaXRvcnkpIHtcbiAgICAgICAgICByZXR1cm4gYCR7cmVwb3NpdG9yeX0tZ28vJHtwcm92aWRlck5hbWV9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBgZ2l0aHViLmNvbS9jZGt0bi1pby9jZGt0bi1wcm92aWRlci0ke3Byb3ZpZGVyTmFtZX0tZ28vJHtwcm92aWRlck5hbWV9YDtcbiAgICAgIGNhc2UgTGFuZ3VhZ2UuVFlQRVNDUklQVDogLy8gZS5nLiBAY2RrdGYvcHJvdmlkZXItcmFuZG9tXG4gICAgICAgIHJldHVybiBuYW1lOyAvLyBhbHJlYWR5IHRoZSBjb3JyZWN0IG5hbWVcbiAgICAgIGNhc2UgTGFuZ3VhZ2UuQ1NIQVJQOiAvLyBlLmcuIEhhc2hpQ29ycC5DZGt0Zi5Qcm92aWRlcnMuT3BlbnRlbGVrb21jbG91ZFxuICAgICAgICByZXR1cm4gYElvLkNka3RuLlByb3ZpZGVycy5gICsgdG9QYXNjYWxDYXNlKHByb3ZpZGVyTmFtZSk7XG4gICAgICBjYXNlIExhbmd1YWdlLkpBVkE6IC8vIGUuZy4gY29tLmhhc2hpY29ycC5vcGVudGVsZWtvbWNsb3VkXG4gICAgICAgIHJldHVybiBgaW8uY2RrdG4uY2RrdG4tcHJvdmlkZXItJHtwcm92aWRlck5hbWV9YDtcbiAgICAgIGNhc2UgTGFuZ3VhZ2UuUFlUSE9OOiAvLyBlLmcuIGNka3RmLWNka3RmLXByb3ZpZGVyLW9wZW50ZWxla29tY2xvdWRcbiAgICAgICAgcmV0dXJuIGBjZGt0bi1wcm92aWRlci0ke3Byb3ZpZGVyTmFtZX1gO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBjb252ZXJ0aW5nIHBhY2thZ2UgbmFtZSBmb3IgbGFuZ3VhZ2UgJHt0aGlzLnRhcmdldExhbmd1YWdlfSBub3QgaW1wbGVtZW50ZWQgeWV0YCxcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYW4gcGFja2FnZSBuYW1lIG9mIGEgcHJlLWJ1aWx0IHByb3ZpZGVyIHBhY2thZ2UgaW4gdGFyZ2V0IGxhbmd1YWdlIHRvIHRoZSBuYW1lIGluIG5wbVxuICAgKiBJbnZlcnNlIG9mOiBgY29udmVydFBhY2thZ2VOYW1lYFxuICAgKi9cbiAgcHJpdmF0ZSBjb252ZXJ0RnJvbVBhY2thZ2VOYW1lVG9OcG0obmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCByZWdleGVzID0ge1xuICAgICAgW0xhbmd1YWdlLkdPXTpcbiAgICAgICAgL2dpdGh1Yi5jb21cXC8oPzpjZGt0ZnxoYXNoaWNvcnB8Y2RrdG4taW8pXFwvY2RrdChbZm5dKS1wcm92aWRlci0oLispLWdvXFwvL2ksXG4gICAgICBbTGFuZ3VhZ2UuVFlQRVNDUklQVF06IC8oLispL2ksXG4gICAgICBbTGFuZ3VhZ2UuQ1NIQVJQXTogLyg/Okhhc2hpQ29ycHxJbylcXC5DZGt0KFtmbl0pXFwuUHJvdmlkZXJzXFwuKC4rKS9pLFxuICAgICAgW0xhbmd1YWdlLkpBVkFdOlxuICAgICAgICAvKD86Y29tXFwuaGFzaGljb3JwfGlvXFwuY2RrdG4pXFwuY2RrdChbZm5dKS1wcm92aWRlci0oLispL2ksXG4gICAgICBbTGFuZ3VhZ2UuUFlUSE9OXTogLyg/OmNka3RmLSk/Y2RrdChbZm5dKS1wcm92aWRlci0oLispL2ksXG4gICAgfTtcbiAgICBjb25zdCByZWdleCA9IHJlZ2V4ZXNbdGhpcy50YXJnZXRMYW5ndWFnZV07XG4gICAgaWYgKCFyZWdleCkge1xuICAgICAgdGhyb3cgRXJyb3JzLlVzYWdlKFwiTGFuZ3VhZ2Ugbm90IHN1cHBvcnRlZCBmb3IgcHJlLWJ1aWx0IHByb3ZpZGVyc1wiKTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXRjaCA9IHJlZ2V4LmV4ZWMobmFtZSk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYWNrYWdlIG5hbWUgaXMgbm90IGluIGV4cGVjdGVkIGZvcm1hdDogJHtuYW1lfWApO1xuICAgIH1cblxuICAgIGNvbnN0IG5wbVBhY2thZ2VQcmVmaXggPSBgQGNka3Qke21hdGNoWzFdfS9wcm92aWRlci1gO1xuXG4gICAgc3dpdGNoICh0aGlzLnRhcmdldExhbmd1YWdlKSB7XG4gICAgICBjYXNlIExhbmd1YWdlLkdPOiAvLyBlLmcuIGdpdGh1Yi5jb20vY2RrdGYvY2RrdGYtcHJvdmlkZXItb3BlbnRlbGVrb21jbG91ZC1nby9vcGVudGVsZWtvbWNsb3VkXG4gICAgICAgIHJldHVybiBucG1QYWNrYWdlUHJlZml4ICsgbWF0Y2hbMl07XG4gICAgICBjYXNlIExhbmd1YWdlLlRZUEVTQ1JJUFQ6IC8vIGUuZy4gQGNka3RmL3Byb3ZpZGVyLXJhbmRvbVxuICAgICAgICByZXR1cm4gbWF0Y2hbMV07IC8vIGFscmVhZHkgdGhlIGNvcnJlY3QgbmFtZVxuICAgICAgY2FzZSBMYW5ndWFnZS5DU0hBUlA6IC8vIGUuZy4gSGFzaGlDb3JwLkNka3RmLlByb3ZpZGVycy5PcGVudGVsZWtvbWNsb3VkXG4gICAgICAgIHJldHVybiBucG1QYWNrYWdlUHJlZml4ICsgdG9TbmFrZUNhc2UobWF0Y2hbMl0pO1xuICAgICAgY2FzZSBMYW5ndWFnZS5KQVZBOiAvLyBlLmcuIGNvbS5oYXNoaWNvcnAub3BlbnRlbGVrb21jbG91ZFxuICAgICAgICByZXR1cm4gbnBtUGFja2FnZVByZWZpeCArIG1hdGNoWzJdO1xuICAgICAgY2FzZSBMYW5ndWFnZS5QWVRIT046IC8vIGUuZy4gY2RrdGYtY2RrdGYtcHJvdmlkZXItb3BlbnRlbGVrb21jbG91ZFxuICAgICAgICByZXR1cm4gbnBtUGFja2FnZVByZWZpeCArIG1hdGNoWzJdO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBjb252ZXJ0aW5nIHBhY2thZ2UgbmFtZSBmb3IgbGFuZ3VhZ2UgJHt0aGlzLnRhcmdldExhbmd1YWdlfSBub3QgaW1wbGVtZW50ZWQgeWV0YCxcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgYWxsUHJvdmlkZXJzKCkge1xuICAgIGNvbnN0IGNka3RmSnNvbiA9IENka3RmQ29uZmlnLnJlYWQoKTtcbiAgICBjb25zdCBsb2NhbFZlcnNpb25zID0gbmV3IExvY2FsUHJvdmlkZXJWZXJzaW9ucygpO1xuXG4gICAgY29uc3QgbG9jYWxQcm92aWRlckNvbmZpZ3MgPSBjZGt0Zkpzb24udGVycmFmb3JtUHJvdmlkZXJzO1xuICAgIGNvbnN0IHByZWJ1aWx0UHJvdmlkZXJDb25maWdzID1cbiAgICAgIGF3YWl0IHRoaXMucGFja2FnZU1hbmFnZXIubGlzdFByb3ZpZGVyUGFja2FnZXMoKTtcblxuICAgIGNvbnN0IHByZWJ1aWx0UHJvdmlkZXJzSW5mbyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgcHJlYnVpbHRQcm92aWRlckNvbmZpZ3MubWFwKGFzeW5jIChwcmVidWlsdFByb3ZpZGVyQ29uZmlnKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VOYW1lID0gdGhpcy5jb252ZXJ0RnJvbVBhY2thZ2VOYW1lVG9OcG0oXG4gICAgICAgICAgcHJlYnVpbHRQcm92aWRlckNvbmZpZy5uYW1lLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHByb3ZpZGVySW5mb3JtYXRpb24gPSBhd2FpdCBnZXRQcmVidWlsdFByb3ZpZGVyVmVyc2lvbkluZm9ybWF0aW9uKFxuICAgICAgICAgIHBhY2thZ2VOYW1lLFxuICAgICAgICAgIHByZWJ1aWx0UHJvdmlkZXJDb25maWcudmVyc2lvbixcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnByb3ZpZGVySW5mb3JtYXRpb24sXG4gICAgICAgICAgcGFja2FnZU5hbWU6IHByZWJ1aWx0UHJvdmlkZXJDb25maWcubmFtZSxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBjb25zdCBjb25zdHJhaW50cyA9IG5ldyBMb2NhbFByb3ZpZGVyQ29uc3RyYWludHMoKTtcblxuICAgIGNvbnN0IGxvY2FsUHJvdmlkZXJzSW5mbyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbG9jYWxQcm92aWRlckNvbmZpZ3MubWFwKGFzeW5jIChsb2NhbFByb3ZpZGVyQ29uZmlnKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnN0cmFpbnQgPVxuICAgICAgICAgIFByb3ZpZGVyQ29uc3RyYWludC5mcm9tQ29uZmlnRW50cnkobG9jYWxQcm92aWRlckNvbmZpZyk7XG4gICAgICAgIGNvbnN0IHZlcnNpb24gPSBhd2FpdCBsb2NhbFZlcnNpb25zLnZlcnNpb25Gb3JQcm92aWRlcihcbiAgICAgICAgICBjb25zdHJhaW50LnNpbXBsaWZpZWROYW1lLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBjb25zdHJhaW50VmFsdWUgPSBhd2FpdCBjb25zdHJhaW50cy5jb25zdHJhaW50Rm9yUHJvdmlkZXIoXG4gICAgICAgICAgY29uc3RyYWludC5zaW1wbGlmaWVkTmFtZSxcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHByb3ZpZGVyTmFtZTogY29uc3RyYWludC5zaW1wbGlmaWVkTmFtZSxcbiAgICAgICAgICBwcm92aWRlckNvbnN0cmFpbnQ6IGNvbnN0cmFpbnRWYWx1ZSB8fCBjb25zdHJhaW50LnZlcnNpb24sXG4gICAgICAgICAgcHJvdmlkZXJWZXJzaW9uOiB2ZXJzaW9uLFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBsb2NhbDogbG9jYWxQcm92aWRlcnNJbmZvLFxuICAgICAgcHJlYnVpbHQ6IHByZWJ1aWx0UHJvdmlkZXJzSW5mbyxcbiAgICB9O1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Language } from "@cdktn/commons";
|
|
2
|
+
/**
|
|
3
|
+
* manages installing, updating, and removing dependencies
|
|
4
|
+
* in the package system used by the target language of a CDKTN
|
|
5
|
+
* project
|
|
6
|
+
*/
|
|
7
|
+
export declare abstract class PackageManager {
|
|
8
|
+
protected readonly workingDirectory: string;
|
|
9
|
+
constructor(workingDirectory: string);
|
|
10
|
+
static forLanguage(language: Language, workingDirectory: string): PackageManager;
|
|
11
|
+
abstract addPackage(packageName: string, packageVersion?: string, silent?: boolean): Promise<void>;
|
|
12
|
+
abstract isNpmVersionAvailable(packageName: string, packageVersion: string): Promise<boolean>;
|
|
13
|
+
abstract listProviderPackages(): Promise<{
|
|
14
|
+
name: string;
|
|
15
|
+
version: string;
|
|
16
|
+
}[]>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=package-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["package-manager.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,QAAQ,EAOT,MAAM,gBAAgB,CAAC;AA+ExB;;;;GAIG;AACH,8BAAsB,cAAc;IACtB,SAAS,CAAC,QAAQ,CAAC,gBAAgB,EAAE,MAAM;gBAAxB,gBAAgB,EAAE,MAAM;WAEzC,WAAW,CACvB,QAAQ,EAAE,QAAQ,EAClB,gBAAgB,EAAE,MAAM,GACvB,cAAc;aAoBD,UAAU,CACxB,WAAW,EAAE,MAAM,EACnB,cAAc,CAAC,EAAE,MAAM,EACvB,MAAM,CAAC,EAAE,OAAO,GACf,OAAO,CAAC,IAAI,CAAC;aAGA,qBAAqB,CACnC,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,OAAO,CAAC;aAEH,oBAAoB,IAAI,OAAO,CAC7C;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CACpC;CACF"}
|