@cdktn/cli-core 0.22.0-pre.2
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 +84 -0
- package/src/lib/dependencies/dependency-manager.d.ts.map +1 -0
- package/src/lib/dependencies/dependency-manager.js +365 -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 +574 -0
- package/src/lib/dependencies/prebuilt-providers.d.ts +18 -0
- package/src/lib/dependencies/prebuilt-providers.d.ts.map +1 -0
- package/src/lib/dependencies/prebuilt-providers.js +204 -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,84 @@
|
|
|
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 getPackageName;
|
|
62
|
+
getMatchingProviderVersion(constraint: ProviderConstraint): Promise<string>;
|
|
63
|
+
addPrebuiltProvider(constraint: ProviderConstraint, silent?: boolean): Promise<void>;
|
|
64
|
+
private getLanguageSpecificPackageVersion;
|
|
65
|
+
addLocalProvider(constraint: ProviderConstraint): Promise<void>;
|
|
66
|
+
/**
|
|
67
|
+
* Converts an NPM package name of a pre-built provider package to the name in the target language
|
|
68
|
+
*/
|
|
69
|
+
private convertPackageName;
|
|
70
|
+
/**
|
|
71
|
+
* Converts an package name of a pre-built provider package in target language to the name in npm
|
|
72
|
+
* Inverse of: `convertPackageName`
|
|
73
|
+
*/
|
|
74
|
+
private convertFromPackageNameToNpm;
|
|
75
|
+
allProviders(): Promise<{
|
|
76
|
+
local: {
|
|
77
|
+
providerName: string;
|
|
78
|
+
providerConstraint: string | undefined;
|
|
79
|
+
providerVersion: string | null;
|
|
80
|
+
}[];
|
|
81
|
+
prebuilt: any[];
|
|
82
|
+
}>;
|
|
83
|
+
}
|
|
84
|
+
//# 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;IAwB3D,uBAAuB,CAC3B,UAAU,EAAE,kBAAkB,EAC9B,cAAc,EAAE,MAAM;IAmBlB,mBAAmB,CAAC,UAAU,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC;YAoC7D,iBAAiB;YAajB,cAAc;IAYtB,0BAA0B,CAAC,UAAU,EAAE,kBAAkB;IA2BzD,mBAAmB,CAAC,UAAU,EAAE,kBAAkB,EAAE,MAAM,UAAQ;YAe1D,iCAAiC;IA8BzC,gBAAgB,CAAC,UAAU,EAAE,kBAAkB;IAuBrD;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAwB1B;;;OAGG;IACH,OAAO,CAAC,2BAA2B;IAsCtB,YAAY;;;;;;;;CAoD1B"}
|
|
@@ -0,0 +1,365 @@
|
|
|
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 "cdktf 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 packageName = await this.tryGetPackageName(constraint);
|
|
160
|
+
if (!packageName)
|
|
161
|
+
return; // not available as pre-built provider, so can't be installed as such
|
|
162
|
+
commons_1.logger.debug(`Expecting package ${packageName} to be installed if provider is installed as pre-built one`);
|
|
163
|
+
let installedPackages;
|
|
164
|
+
try {
|
|
165
|
+
installedPackages = await this.packageManager.listProviderPackages();
|
|
166
|
+
}
|
|
167
|
+
catch (e) {
|
|
168
|
+
throw new Error(`Failed to list packages: ${e}`);
|
|
169
|
+
}
|
|
170
|
+
commons_1.logger.debug(`Installed packages found: ${JSON.stringify(installedPackages, null, 2)}`);
|
|
171
|
+
return (_a = installedPackages.find((pkg) => pkg.name === packageName)) === null || _a === void 0 ? void 0 : _a.version;
|
|
172
|
+
}
|
|
173
|
+
async upgradePrebuiltProvider(constraint, currentVersion) {
|
|
174
|
+
commons_1.logger.debug(`Searching for latest matching version of ${constraint.simplifiedName}`);
|
|
175
|
+
const packageName = await this.getPackageName(constraint);
|
|
176
|
+
const packageVersion = await this.getMatchingProviderVersion(constraint);
|
|
177
|
+
commons_1.logger.debug(`Found package ${packageName}@${packageVersion}`);
|
|
178
|
+
if (packageVersion !== currentVersion) {
|
|
179
|
+
await this.packageManager.addPackage(packageName, packageVersion);
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
console.log(`The latest version of ${packageName} is already installed: ${packageVersion}`);
|
|
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) {
|
|
209
|
+
const npmPackageName = await (0, prebuilt_providers_1.getNpmPackageName)(constraint);
|
|
210
|
+
if (!npmPackageName)
|
|
211
|
+
return;
|
|
212
|
+
const prebuiltProviderRepository = await (0, prebuilt_providers_1.getPrebuiltProviderRepositoryName)(npmPackageName);
|
|
213
|
+
return this.convertPackageName(npmPackageName, prebuiltProviderRepository);
|
|
214
|
+
}
|
|
215
|
+
async getPackageName(constraint) {
|
|
216
|
+
const packageName = await this.tryGetPackageName(constraint);
|
|
217
|
+
if (!packageName) {
|
|
218
|
+
throw commons_1.Errors.Usage(`Could not find pre-built provider for ${constraint.source}`);
|
|
219
|
+
}
|
|
220
|
+
return packageName;
|
|
221
|
+
}
|
|
222
|
+
async getMatchingProviderVersion(constraint) {
|
|
223
|
+
const packageName = await this.getPackageName(constraint);
|
|
224
|
+
const prebuiltProviderNpmVersions = await (0, prebuilt_providers_1.getPrebuiltProviderVersions)(constraint, this.cdktfVersion);
|
|
225
|
+
if (!prebuiltProviderNpmVersions) {
|
|
226
|
+
throw commons_1.Errors.Usage(`No pre-built provider found for ${constraint.source} with version constraint ${constraint.version} and cdktf version ${this.cdktfVersion}`);
|
|
227
|
+
}
|
|
228
|
+
const packageVersion = await this.getLanguageSpecificPackageVersion(packageName, prebuiltProviderNpmVersions);
|
|
229
|
+
if (!packageVersion) {
|
|
230
|
+
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}.`);
|
|
231
|
+
}
|
|
232
|
+
return packageVersion;
|
|
233
|
+
}
|
|
234
|
+
async addPrebuiltProvider(constraint, silent = false) {
|
|
235
|
+
commons_1.logger.debug(`adding pre-built provider ${constraint.source} with version constraint ${constraint.version} for cdktf version ${this.cdktfVersion}`);
|
|
236
|
+
const packageName = await this.getPackageName(constraint);
|
|
237
|
+
const packageVersion = await this.getMatchingProviderVersion(constraint);
|
|
238
|
+
await this.packageManager.addPackage(packageName, packageVersion, silent);
|
|
239
|
+
// TODO: more debug logs
|
|
240
|
+
}
|
|
241
|
+
// The version we use for npm might differ from other registries
|
|
242
|
+
// This happens mostly in cases where a provider update failed to publish to one of the registries
|
|
243
|
+
// In that case we use the latest version that was published successfully and works with the current cdktf release
|
|
244
|
+
async getLanguageSpecificPackageVersion(packageName, prebuiltProviderNpmVersions) {
|
|
245
|
+
commons_1.logger.debug("Found possibly matching versions (released on npm): ", prebuiltProviderNpmVersions);
|
|
246
|
+
commons_1.logger.debug("Searching through package manager to find latest available version for given language");
|
|
247
|
+
for (const version of prebuiltProviderNpmVersions) {
|
|
248
|
+
try {
|
|
249
|
+
const isAvailable = await this.packageManager.isNpmVersionAvailable(packageName, version);
|
|
250
|
+
if (isAvailable) {
|
|
251
|
+
return version;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
catch (err) {
|
|
255
|
+
commons_1.logger.info(`Could not find version ${version} for package ${packageName}: '${err}'. Skipping...`);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
return null;
|
|
259
|
+
}
|
|
260
|
+
async addLocalProvider(constraint) {
|
|
261
|
+
commons_1.logger.info(`Adding local provider ${constraint.source} with version constraint ${constraint.version} to cdktf.json`);
|
|
262
|
+
if (!constraint.version && constraint.isFromTerraformRegistry()) {
|
|
263
|
+
const v = await (0, registry_api_1.getLatestVersion)(constraint);
|
|
264
|
+
if (v) {
|
|
265
|
+
constraint = new ProviderConstraint(constraint.source,
|
|
266
|
+
// "1.3.2" -> "~> 1.3"
|
|
267
|
+
`~> ${v.split(".").slice(0, 2).join(".")}`);
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
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.`);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
await new cdktf_config_manager_1.CdktfConfigManager().addProvider(constraint);
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Converts an NPM package name of a pre-built provider package to the name in the target language
|
|
277
|
+
*/
|
|
278
|
+
convertPackageName(name, repository) {
|
|
279
|
+
const providerName = name.replace("@cdktf/provider-", "");
|
|
280
|
+
switch (this.targetLanguage) {
|
|
281
|
+
case commons_1.Language.GO: // e.g. github.com/cdktf/cdktf-provider-opentelekomcloud-go/opentelekomcloud
|
|
282
|
+
if (repository) {
|
|
283
|
+
return `${repository}-go/${providerName}`;
|
|
284
|
+
}
|
|
285
|
+
return `github.com/cdktf/cdktf-provider-${providerName}-go/${providerName}`;
|
|
286
|
+
case commons_1.Language.TYPESCRIPT: // e.g. @cdktf/provider-random
|
|
287
|
+
return name; // already the correct name
|
|
288
|
+
case commons_1.Language.CSHARP: // e.g. HashiCorp.Cdktf.Providers.Opentelekomcloud
|
|
289
|
+
return `HashiCorp.Cdktf.Providers.` + (0, codemaker_1.toPascalCase)(providerName);
|
|
290
|
+
case commons_1.Language.JAVA: // e.g. com.hashicorp.opentelekomcloud
|
|
291
|
+
return `com.hashicorp.cdktf-provider-${providerName}`;
|
|
292
|
+
case commons_1.Language.PYTHON: // e.g. cdktf-cdktf-provider-opentelekomcloud
|
|
293
|
+
return `cdktf-cdktf-provider-${providerName}`;
|
|
294
|
+
default:
|
|
295
|
+
throw new Error(`converting package name for language ${this.targetLanguage} not implemented yet`);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Converts an package name of a pre-built provider package in target language to the name in npm
|
|
300
|
+
* Inverse of: `convertPackageName`
|
|
301
|
+
*/
|
|
302
|
+
convertFromPackageNameToNpm(name) {
|
|
303
|
+
const npmPackagePrefix = "@cdktf/provider-";
|
|
304
|
+
const regexes = {
|
|
305
|
+
[commons_1.Language.GO]: /github.com\/(?:cdktf|hashicorp)\/cdktf-provider-(.+)-go\//i,
|
|
306
|
+
[commons_1.Language.TYPESCRIPT]: /(.+)/i,
|
|
307
|
+
[commons_1.Language.CSHARP]: /HashiCorp\.Cdktf\.Providers\.(.+)/i,
|
|
308
|
+
[commons_1.Language.JAVA]: /com\.hashicorp\.cdktf-provider-(.+)/i,
|
|
309
|
+
[commons_1.Language.PYTHON]: /cdktf-cdktf-provider-(.+)/i,
|
|
310
|
+
};
|
|
311
|
+
const regex = regexes[this.targetLanguage];
|
|
312
|
+
if (!regex) {
|
|
313
|
+
throw commons_1.Errors.Usage("Language not supported for pre-built providers");
|
|
314
|
+
}
|
|
315
|
+
const match = regex.exec(name);
|
|
316
|
+
if (!match) {
|
|
317
|
+
throw new Error(`Package name is not in expected format: ${name}`);
|
|
318
|
+
}
|
|
319
|
+
switch (this.targetLanguage) {
|
|
320
|
+
case commons_1.Language.GO: // e.g. github.com/cdktf/cdktf-provider-opentelekomcloud-go/opentelekomcloud
|
|
321
|
+
return npmPackagePrefix + match[1];
|
|
322
|
+
case commons_1.Language.TYPESCRIPT: // e.g. @cdktf/provider-random
|
|
323
|
+
return match[1]; // already the correct name
|
|
324
|
+
case commons_1.Language.CSHARP: // e.g. HashiCorp.Cdktf.Providers.Opentelekomcloud
|
|
325
|
+
return npmPackagePrefix + (0, codemaker_1.toSnakeCase)(match[1]);
|
|
326
|
+
case commons_1.Language.JAVA: // e.g. com.hashicorp.opentelekomcloud
|
|
327
|
+
return npmPackagePrefix + match[1];
|
|
328
|
+
case commons_1.Language.PYTHON: // e.g. cdktf-cdktf-provider-opentelekomcloud
|
|
329
|
+
return npmPackagePrefix + match[1];
|
|
330
|
+
default:
|
|
331
|
+
throw new Error(`converting package name for language ${this.targetLanguage} not implemented yet`);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
async allProviders() {
|
|
335
|
+
const cdktfJson = cdktf_config_1.CdktfConfig.read();
|
|
336
|
+
const localVersions = new local_provider_versions_1.LocalProviderVersions();
|
|
337
|
+
const localProviderConfigs = cdktfJson.terraformProviders;
|
|
338
|
+
const prebuiltProviderConfigs = await this.packageManager.listProviderPackages();
|
|
339
|
+
const prebuiltProvidersInfo = await Promise.all(prebuiltProviderConfigs.map(async (prebuiltProviderConfig) => {
|
|
340
|
+
const packageName = this.convertFromPackageNameToNpm(prebuiltProviderConfig.name);
|
|
341
|
+
const providerInformation = await (0, prebuilt_providers_1.getPrebuiltProviderVersionInformation)(packageName, prebuiltProviderConfig.version);
|
|
342
|
+
return {
|
|
343
|
+
...providerInformation,
|
|
344
|
+
packageName: prebuiltProviderConfig.name,
|
|
345
|
+
};
|
|
346
|
+
}));
|
|
347
|
+
const constraints = new local_provider_constraints_1.LocalProviderConstraints();
|
|
348
|
+
const localProvidersInfo = await Promise.all(localProviderConfigs.map(async (localProviderConfig) => {
|
|
349
|
+
const constraint = ProviderConstraint.fromConfigEntry(localProviderConfig);
|
|
350
|
+
const version = await localVersions.versionForProvider(constraint.simplifiedName);
|
|
351
|
+
const constraintValue = await constraints.constraintForProvider(constraint.simplifiedName);
|
|
352
|
+
return {
|
|
353
|
+
providerName: constraint.simplifiedName,
|
|
354
|
+
providerConstraint: constraintValue || constraint.version,
|
|
355
|
+
providerVersion: version,
|
|
356
|
+
};
|
|
357
|
+
}));
|
|
358
|
+
return {
|
|
359
|
+
local: localProvidersInfo,
|
|
360
|
+
prebuilt: prebuiltProvidersInfo,
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
exports.DependencyManager = DependencyManager;
|
|
365
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwZW5kZW5jeS1tYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGVwZW5kZW5jeS1tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsK0JBQStCO0FBQy9CLG1DQUFtQztBQUNuQyw0Q0FLd0I7QUFDeEIseUNBQXNEO0FBQ3RELGtEQUE4QztBQUM5QyxpRUFBNEQ7QUFDNUQsdURBQW1EO0FBQ25ELDZEQUs4QjtBQUM5QixpREFBa0Q7QUFDbEQsK0RBQWlFO0FBQ2pFLCtDQUFpQztBQUNqQyx3RUFBbUU7QUFDbkUsOEVBQXlFO0FBRXpFLGlGQUFpRjtBQUNwRSxRQUFBLGdCQUFnQixHQUFHLHVCQUF1QixDQUFDO0FBQzNDLFFBQUEsaUJBQWlCLEdBQUcsV0FBVyxDQUFDO0FBQzdDLFNBQVMsdUJBQXVCLENBQUMsTUFBYztJQUM3Qyx3Q0FBd0M7SUFDeEMsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQzdDLFFBQVEsT0FBTyxFQUFFLENBQUM7UUFDaEIsS0FBSyxDQUFDO1lBQ0osT0FBTyxHQUFHLHdCQUFnQixJQUFJLHlCQUFpQixJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzlELEtBQUssQ0FBQztZQUNKLE9BQU8sR0FBRyx3QkFBZ0IsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUN6QztZQUNFLE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBYSxrQkFBa0I7SUFPN0IsbUVBQW1FO0lBQ25FLHNFQUFzRTtJQUN0RSw0R0FBNEc7SUFDNUcsWUFDRSxNQUFjLEVBQ0UsT0FBMkI7UUFBM0IsWUFBTyxHQUFQLE9BQU8sQ0FBb0I7UUFFM0MsSUFBSSxDQUFDLE1BQU0sR0FBRyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsTUFBTSxDQUFD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T0FBTyxHQUFHLE1BQU0sYUFBYSxDQUFDLGtCQUFrQixDQUNwRCxVQUFVLENBQUMsY0FBYyxDQUMxQixDQUFDO1lBQ0YsTUFBTSxlQUFlLEdBQUcsTUFBTSxXQUFXLENBQUMscUJBQXFCLENBQzdELFVBQVUsQ0FBQyxjQUFjLENBQzFCLENBQUM7WUFFRixPQUFPO2dCQUNMLFlBQVksRUFBRSxVQUFVLENBQUMsY0FBYztnQkFDdkMsa0JBQWtCLEVBQUUsZUFBZSxJQUFJLFVBQVUsQ0FBQyxPQUFPO2dCQUN6RCxlQUFlLEVBQUUsT0FBTzthQUN6QixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUVGLE9BQU87WUFDTCxLQUFLLEVBQUUsa0JBQWtCO1lBQ3pCLFFBQVEsRUFBRSxxQkFBcUI7U0FDaEMsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQTlXRCw4Q0E4V0MiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIEhhc2hpQ29ycCwgSW5jXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTVBMLTIuMFxuaW1wb3J0IHtcbiAgTGFuZ3VhZ2UsXG4gIEVycm9ycyxcbiAgbG9nZ2VyLFxuICBUZXJyYWZvcm1EZXBlbmRlbmN5Q29uc3RyYWludCxcbn0gZnJvbSBcIkBjZGt0bi9jb21tb25zXCI7XG5pbXBvcnQgeyB0b1Bhc2NhbENhc2UsIHRvU25ha2VDYXNlIH0gZnJvbSBcImNvZGVtYWtlclwiO1xuaW1wb3J0IHsgQ2RrdGZDb25maWcgfSBmcm9tIFwiLi4vY2RrdGYtY29uZmlnXCI7XG5pbXBvcnQgeyBDZGt0ZkNvbmZpZ01hbmFnZXIgfSBmcm9tIFwiLi9jZGt0Zi1jb25maWctbWFuYWdlclwiO1xuaW1wb3J0IHsgUGFja2FnZU1hbmFnZXIgfSBmcm9tIFwiLi9wYWNrYWdlLW1hbmFnZXJcIjtcbmltcG9ydCB7XG4gIGdldE5wbVBhY2thZ2VOYW1lLFxuICBnZXRQcmVidWlsdFByb3ZpZGVyUmVwb3NpdG9yeU5hbWUsXG4gIGdldFByZWJ1aWx0UHJvdmlkZXJWZXJzaW9uSW5mb3JtYXRpb24sXG4gIGdldFByZWJ1aWx0UHJvdmlkZXJWZXJzaW9ucyxcbn0gZnJvbSBcIi4vcHJlYnVpbHQtcHJvdmlkZXJzXCI7XG5pbXBvcnQgeyBnZXRMYXRlc3RWZXJzaW9uIH0gZnJvbSBcIi4vcmVnaXN0cnktYXBpXCI7XG5pbXBvcnQgeyB2ZXJzaW9uTWF0Y2hlc0NvbnN0cmFpbnQgfSBmcm9tIFwiLi92ZXJzaW9uLWNvbnN0cmFpbnRzXCI7XG5pbXBvcnQgKiBhcyBzZW12ZXIgZnJvbSBcInNlbXZlclwiO1xuaW1wb3J0IHsgTG9jYWxQcm92aWRlclZlcnNpb25zIH0gZnJvbSBcIi4uL2xvY2FsLXByb3ZpZGVyLXZlcnNpb25zXCI7XG5pbXBvcnQgeyBMb2NhbFByb3ZpZGVyQ29uc3RyYWludHMgfSBmcm9tIFwiLi4vbG9jYWwtcHJvdmlkZXItY29uc3RyYWludHNcIjtcblxuLy8gcmVmOiBodHRwczovL3d3dy50ZXJyYWZvcm0uaW8vbGFuZ3VhZ2UvcHJvdmlkZXJzL3JlcXVpcmVtZW50cyNzb3VyY2UtYWRkcmVzc2VzXG5leHBvcnQgY29uc3QgREVGQVVMVF9IT1NUTkFNRSA9IFwicmVnaXN0cnkudGVycmFmb3JtLmlvXCI7XG5leHBvcnQgY29uc3QgREVGQVVMVF9OQU1FU1BBQ0UgPSBcImhhc2hpY29ycFwiO1xuZnVuY3Rpb24gbm9ybWFsaXplUHJvdmlkZXJTb3VyY2Uoc291cmNlOiBzdHJpbmcpIHtcbiAgLy8gcmV0dXJucyA8SE9TVE5BTUU+LzxOQU1FU1BBQ0U+LzxUWVBFPlxuICBjb25zdCBzbGFzaGVzID0gc291cmNlLnNwbGl0KFwiL1wiKS5sZW5ndGggLSAxO1xuICBzd2l0Y2ggKHNsYXNoZXMpIHtcbiAgICBjYXNlIDA6XG4gICAgICByZXR1cm4gYCR7REVGQVVMVF9IT1NUTkFNRX0vJHtERUZBVUxUX05BTUVTUEFDRX0vJHtzb3VyY2V9YDtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gYCR7REVGQVVMVF9IT1NUTkFNRX0vJHtzb3VyY2V9YDtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUHJvdmlkZXJDb25zdHJhaW50IHtcbiAgLyoqXG4gICAqIG5vcm1hbGl6ZWQgc291cmNlIG9mIHRoZSBwcm92aWRlclxuICAgKiBlLmcuIFwicmVnaXN0cnkudGVycmFmb3JtLmlvL2hhc2hpY29ycC9hd3NcIlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNvdXJjZTogc3RyaW5nO1xuXG4gIC8vIFRPRE86IGFkZCBleGFtcGxlcyB0byBjbGkgY29tbWFuZCBkZXNjcmlwdGlvbiAoaS5lLiA9LH4+Lj4gZXRjLilcbiAgLy8gaWYgbm8gdmVyc2lvbiBjb25zdHJhaW50IGlzIHNwZWNpZmllZCwgd2UgYXNzdW1lIHRoZSBsYXRlc3QgdmVyc2lvblxuICAvLyBpZiBzcGVjaWZpYyB2ZXJzaW9uIGlzIHNwZWNpZmllZCB3aXRob3V0IGUuZy4gPSwgd2UgYWxsb3cgcGF0Y2ggbGV2ZWwgaW5jcmVtZW50cyAoZS5nLiB+PjIuMTIgZm9yIFwiMi4xMlwiKVxuICBjb25zdHJ1Y3RvcihcbiAgICBzb3VyY2U6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICApIHtcbiAgICB0aGlzLnNvdXJjZSA9IG5vcm1hbGl6ZVByb3ZpZGVyU291cmNlKHNvdXJjZSk7XG4gIH1cblxuICBzdGF0aWMgZnJvbUNvbmZpZ0VudHJ5KFxuICAgIHByb3ZpZGVyOiBzdHJpbmcgfCBUZXJyYWZvcm1EZXBlbmRlbmN5Q29uc3RyYWludCxcbiAgKTogUHJvdmlkZXJDb25zdHJhaW50IHtcbiAgICBpZiAodHlwZW9mIHByb3ZpZGVyID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBjb25zdCBbc3JjLCB2ZXJzaW9uXSA9IHByb3ZpZGVyLnNwbGl0KFwiQFwiKTtcbiAgICAgIHJldHVybiBuZXcgUHJvdmlkZXJDb25zdHJhaW50KFxuICAgICAgICBzcmMudHJpbSgpLFxuICAgICAgICB2ZXJzaW9uID8gdmVyc2lvbi50cmltKCkgOiB1bmRlZmluZWQsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHNyYyA9XG4gICAgICAocHJvdmlkZXIubmFtZXNwYWNlID8gYCR7cHJvdmlkZXIubmFtZXNwYWNlfS9gIDogXCJcIikgK1xuICAgICAgKHByb3ZpZGVyLnNvdXJjZSB8fCBwcm92aWRlci5uYW1lKTtcblxuICAgIHJldHVybiBuZXcgUHJvdmlkZXJDb25zdHJhaW50KHNyYywgcHJvdmlkZXIudmVyc2lvbik7XG4gIH1cblxuICBwdWJsaWMgaXNGcm9tVGVycmFmb3JtUmVnaXN0cnkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaG9zdG5hbWUgPT09IERFRkFVTFRfSE9TVE5BTUU7XG4gIH1cblxuICAvKipcbiAgICogdGhlIG5hbWVzcGFjZSBvZiB0aGUgcHJvdmlkZXJcbiAgICogZS5nLiBcImhhc2hpY29ycFwiIG9yIFwia3JldXp3ZXJrZXJcIlxuICAgKi9cbiAgcHVibGljIGdldCBuYW1lc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zb3VyY2Uuc3BsaXQoXCIvXCIpWzFdO1xuICB9XG5cbiAgLyoqXG4gICAqIHRoZSBuYW1lIG9mIHRoZSBwcm92aWRlclxuICAgKiBlLmcuIFwiYXdzXCJcbiAgICovXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnNvdXJjZS5zcGxpdChcIi9cIilbMl07XG4gIH1cblxuICAvKipcbiAgICogdGhlIGhvc3RuYW1lIG9mIHRoZSBwcm92aWRlclxuICAgKiBlLmcuIFwicmVnaXN0cnkudGVycmFmb3JtLmlvXCJcbiAgICovXG4gIHB1YmxpYyBnZXQgaG9zdG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zb3VyY2Uuc3BsaXQoXCIvXCIpWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIHJldHVybnMgYSBzaW1wbGlmaWVkIHByb3ZpZGVyIG5hbWUsIGRyb3BwaW5nIG5hbWVzcGFjZSBhbmQgaG9zdG5hbWVcbiAgICogaWYgdGhleSBtYXRjaCB0aGUgZGVmYXVsdHNcbiAgICovXG4gIHB1YmxpYyBnZXQgc2ltcGxpZmllZE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zb3VyY2VcbiAgICAgIC5zcGxpdChcIi9cIilcbiAgICAgIC5maWx0ZXIoKHBhcnQpID0+IHBhcnQgIT09IERFRkFVTFRfSE9TVE5BTUUgJiYgcGFydCAhPT0gREVGQVVMVF9OQU1FU1BBQ0UpXG4gICAgICAuam9pbihcIi9cIik7XG4gIH1cblxuICAvKipcbiAgICogY2hlY2tzIGlmIHRoZSB2ZXJzaW9uIGNvbnN0cmFpbnQgbWF0Y2hlcyB0aGUgZ2l2ZW4gdmVyc2lvblxuICAgKiBAcGFyYW0gdmVyc2lvbiBhbiBhY3R1YWwgdmVyc2lvbiAoZS5nLiBcIjQuMTIuMVwiKVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSB2ZXJzaW9uIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgY29uc3RyYWludFxuICAgKi9cbiAgcHVibGljIG1hdGNoZXNWZXJzaW9uKHZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnZlcnNpb24pIHtcbiAgICAgIHJldHVybiB2ZXJzaW9uTWF0Y2hlc0NvbnN0cmFpbnQodmVyc2lvbiwgdGhpcy52ZXJzaW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIGAke3RoaXMuc291cmNlfSR7dGhpcy52ZXJzaW9uID8gYEAke3RoaXMudmVyc2lvbn1gIDogXCJcIn1gO1xuICB9XG59XG5cbi8qKlxuICogbWFuYWdlcyBkZXBlbmRlbmNpZXMgb2YgYSBDREtUTiBwcm9qZWN0IChlLmcuIHRlcnJhZm9ybSBwcm92aWRlcnMpXG4gKi9cbmV4cG9ydCBjbGFzcyBEZXBlbmRlbmN5TWFuYWdlciB7XG4gIHByaXZhdGUgcGFja2FnZU1hbmFnZXI6IFBhY2thZ2VNYW5hZ2VyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdGFyZ2V0TGFuZ3VhZ2U6IExhbmd1YWdlLFxuICAgIHByaXZhdGUgY2RrdGZWZXJzaW9uOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBwcm9qZWN0RGlyZWN0b3J5OiBzdHJpbmcsXG4gICkge1xuICAgIHRoaXMucGFja2FnZU1hbmFnZXIgPSBQYWNrYWdlTWFuYWdlci5mb3JMYW5ndWFnZShcbiAgICAgIHRhcmdldExhbmd1YWdlLFxuICAgICAgdGhpcy5wcm9qZWN0RGlyZWN0b3J5LFxuICAgICk7XG4gIH1cblxuICBhc3luYyBhZGRQcm92aWRlcihcbiAgICBjb25zdHJhaW50OiBQcm92aWRlckNvbnN0cmFpbnQsXG4gICk6IFByb21pc2U8eyBhZGRlZExvY2FsUHJvdmlkZXI6IGJvb2xlYW4gfT4ge1xuICAgIGlmIChhd2FpdCB0aGlzLmhhc1ByZWJ1aWx0UHJvdmlkZXIoY29uc3RyYWludCkpIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRkUHJlYnVpbHRQcm92aWRlcihjb25zdHJhaW50KTtcbiAgICAgIHJldHVybiB7IGFkZGVkTG9jYWxQcm92aWRlcjogZmFsc2UgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy5hZGRMb2NhbFByb3ZpZGVyKGNvbnN0cmFpbnQpO1xuICAgICAgcmV0dXJuIHsgYWRkZWRMb2NhbFByb3ZpZGVyOiB0cnVlIH07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdXBncmFkZVByb3ZpZGVyKGNvbnN0cmFpbnQ6IFByb3ZpZGVyQ29uc3RyYWludCkge1xuICAgIGNvbnNvbGUubG9nKGBVcGdyYWRpbmcgJHtjb25zdHJhaW50LnNpbXBsaWZpZWROYW1lfS4uLmApO1xuICAgIGNvbnN0IGNka3RmSnNvbiA9IG5ldyBDZGt0ZkNvbmZpZ01hbmFnZXIoKTtcbiAgICBjb25zdCBwcmVidWlsdFZlcnNpb24gPSBhd2FpdCB0aGlzLmdldEN1cnJlbnRseUluc3RhbGxlZFZlcnNpb24oY29uc3RyYWludCk7XG4gICAgaWYgKHByZWJ1aWx0VmVyc2lvbikge1xuICAgICAgYXdhaXQgdGhpcy51cGdyYWRlUHJlYnVpbHRQcm92aWRlcihjb25zdHJhaW50LCBwcmVidWlsdFZlcnNpb24pO1xuICAgICAgcmV0dXJuIHsgYWRkZWRMb2NhbFByb3ZpZGVyOiBmYWxzZSB9O1xuICAgIH1cbiAgICBpZiAoYXdhaXQgY2RrdGZKc29uLmhhc1Byb3ZpZGVyKGNvbnN0cmFpbnQpKSB7XG4gICAgICBhd2FpdCBjZGt0Zkpzb24udXBkYXRlUHJvdmlkZXIoY29uc3RyYWludCk7XG4gICAgICByZXR1cm4geyBhZGRlZExvY2FsUHJvdmlkZXI6IHRydWUgfTtcbiAgICB9XG5cbiAgICB0aHJvdyBFcnJvcnMuVXNhZ2UoXG4gICAgICBgVHJ5aW5nIHRvIHVwZ3JhZGUgJHtjb25zdHJhaW50LnNpbXBsaWZpZWROYW1lfSBidXQgaXQgaXMgbm90IGluc3RhbGxlZCwgcGxlYXNlIHVzZSBcImNka3RmIHByb3ZpZGVyIGFkZCAke2NvbnN0cmFpbnQuc2ltcGxpZmllZE5hbWV9XCIgdG8gYWRkIGl0LmAsXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGdldEN1cnJlbnRseUluc3RhbGxlZFZlcnNpb24oY29uc3RyYWludDogUHJvdmlkZXJDb25zdHJhaW50KSB7XG4gICAgbG9nZ2VyLmluZm8oYENoZWNraW5nIGlmICR7Y29uc3RyYWludC5zaW1wbGlmaWVkTmFtZX0gaXMgaW5zdGFsbGVkLi4uYCk7XG4gICAgY29uc3QgcGFja2FnZU5hbWUgPSBhd2FpdCB0aGlzLnRyeUdldFBhY2thZ2VOYW1lKGNvbnN0cmFpbnQpO1xuXG4gICAgaWYgKCFwYWNrYWdlTmFtZSkgcmV0dXJuOyAvLyBub3QgYXZhaWxhYmxlIGFzIHByZS1idWlsdCBwcm92aWRlciwgc28gY2FuJ3QgYmUgaW5zdGFsbGVkIGFzIHN1Y2hcblxuICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgIGBFeHBlY3RpbmcgcGFja2FnZSAke3BhY2thZ2VOYW1lfSB0byBiZSBpbnN0YWxsZWQgaWYgcHJvdmlkZXIgaXMgaW5zdGFsbGVkIGFzIHByZS1idWlsdCBvbmVgLFxuICAgICk7XG5cbiAgICBsZXQgaW5zdGFsbGVkUGFja2FnZXM7XG4gICAgdHJ5IHtcbiAgICAgIGluc3RhbGxlZFBhY2thZ2VzID0gYXdhaXQgdGhpcy5wYWNrYWdlTWFuYWdlci5saXN0UHJvdmlkZXJQYWNrYWdlcygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGxpc3QgcGFja2FnZXM6ICR7ZX1gKTtcbiAgICB9XG5cbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICBgSW5zdGFsbGVkIHBhY2thZ2VzIGZvdW5kOiAke0pTT04uc3RyaW5naWZ5KGluc3RhbGxlZFBhY2thZ2VzLCBudWxsLCAyKX1gLFxuICAgICk7XG5cbiAgICByZXR1cm4gaW5zdGFsbGVkUGFja2FnZXMuZmluZCgocGtnKSA9PiBwa2cubmFtZSA9PT0gcGFja2FnZU5hbWUpPy52ZXJzaW9uO1xuICB9XG5cbiAgYXN5bmMgdXBncmFkZVByZWJ1aWx0UHJvdmlkZXIoXG4gICAgY29uc3RyYWludDogUHJvdmlkZXJDb25zdHJhaW50LFxuICAgIGN1cnJlbnRWZXJzaW9uOiBzdHJpbmcsXG4gICkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgIGBTZWFyY2hpbmcgZm9yIGxhdGVzdCBtYXRjaGluZyB2ZXJzaW9uIG9mICR7Y29uc3RyYWludC5zaW1wbGlmaWVkTmFtZX1gLFxuICAgICk7XG5cbiAgICBjb25zdCBwYWNrYWdlTmFtZSA9IGF3YWl0IHRoaXMuZ2V0UGFja2FnZU5hbWUoY29uc3RyYWludCk7XG4gICAgY29uc3QgcGFja2FnZVZlcnNpb24gPSBhd2FpdCB0aGlzLmdldE1hdGNoaW5nUHJvdmlkZXJWZXJzaW9uKGNvbnN0cmFpbnQpO1xuXG4gICAgbG9nZ2VyLmRlYnVnKGBGb3VuZCBwYWNrYWdlICR7cGFja2FnZU5hbWV9QCR7cGFja2FnZVZlcnNpb259YCk7XG4gICAgaWYgKHBhY2thZ2VWZXJzaW9uICE9PSBjdXJyZW50VmVyc2lvbikge1xuICAgICAgYXdhaXQgdGhpcy5wYWNrYWdlTWFuYWdlci5hZGRQYWNrYWdlKHBhY2thZ2VOYW1lLCBwYWNrYWdlVmVyc2lvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgVGhlIGxhdGVzdCB2ZXJzaW9uIG9mICR7cGFja2FnZU5hbWV9IGlzIGFscmVhZHkgaW5zdGFsbGVkOiAke3BhY2thZ2VWZXJzaW9ufWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGhhc1ByZWJ1aWx0UHJvdmlkZXIoY29uc3RyYWludDogUHJvdmlkZXJDb25zdHJhaW50KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgYGRldGVybWluaW5nIHdoZXRoZXIgcHJlLWJ1aWx0IHByb3ZpZGVyIGV4aXN0cyBmb3IgJHtjb25zdHJhaW50LnNvdXJjZX0gd2l0aCB2ZXJzaW9uIGNvbnN0cmFpbnQgJHtjb25zdHJhaW50LnZlcnNpb259IGFuZCBjZGt0ZiB2ZXJzaW9uICR7dGhpcy5jZGt0ZlZlcnNpb259YCxcbiAgICApO1xuXG4gICAgbG9nZ2VyLmluZm8oYENoZWNraW5nIHdoZXRoZXIgcHJlLWJ1aWx0IHByb3ZpZGVyIGV4aXN0cyBmb3IgdGhlIGZvbGxvd2luZyBjb25zdHJhaW50czpcbiAgcHJvdmlkZXI6ICR7Y29uc3RyYWludC5zaW1wbGlmaWVkTmFtZX1cbiAgdmVyc2lvbiA6ICR7Y29uc3RyYWludC52ZXJzaW9uIHx8IFwibGF0ZXN0XCJ9XG4gIGxhbmd1YWdlOiAke3RoaXMudGFyZ2V0TGFuZ3VhZ2V9XG4gIGNka3RmICAgOiAke3RoaXMuY2RrdGZWZXJzaW9ufVxuYCk7XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLnRhcmdldExhbmd1YWdlID09PSBMYW5ndWFnZS5HTyAmJlxuICAgICAgc2VtdmVyLmx0KHRoaXMuY2RrdGZWZXJzaW9uLCBcIjAuMTIuMFwiKVxuICAgICkge1xuICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgIGBCZWZvcmUgQ0RLVEYgMC4xMi4wIHRoZXJlIHdlcmUgbm8gcHJlLWJ1aWx0IHByb3ZpZGVycyBwdWJsaXNoZWQgZm9yIEdvLmAsXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHYgPSBhd2FpdCBnZXRQcmVidWlsdFByb3ZpZGVyVmVyc2lvbnMoY29uc3RyYWludCwgdGhpcy5jZGt0ZlZlcnNpb24pO1xuICAgIGNvbnN0IGV4aXN0cyA9IHYgIT09IG51bGw7XG5cbiAgICBpZiAoZXhpc3RzKSB7XG4gICAgICBsb2dnZXIuaW5mbyhgRm91bmQgcHJlLWJ1aWx0IHByb3ZpZGVyLmApO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgYFByZS1idWlsdCBwcm92aWRlciBkb2VzIG5vdCBleGlzdCBmb3IgdGhlIGdpdmVuIGNvbnN0cmFpbnRzLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBleGlzdHM7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHRyeUdldFBhY2thZ2VOYW1lKFxuICAgIGNvbnN0cmFpbnQ6IFByb3ZpZGVyQ29uc3RyYWludCxcbiAgKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBucG1QYWNrYWdlTmFtZSA9IGF3YWl0IGdldE5wbVBhY2thZ2VOYW1lKGNvbnN0cmFpbnQpO1xuXG4gICAgaWYgKCFucG1QYWNrYWdlTmFtZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgcHJlYnVpbHRQcm92aWRlclJlcG9zaXRvcnkgPVxuICAgICAgYXdhaXQgZ2V0UHJlYnVpbHRQcm92aWRlclJlcG9zaXRvcnlOYW1lKG5wbVBhY2thZ2VOYW1lKTtcblxuICAgIHJldHVybiB0aGlzLmNvbnZlcnRQYWNrYWdlTmFtZShucG1QYWNrYWdlTmFtZSwgcHJlYnVpbHRQcm92aWRlclJlcG9zaXRvcnkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRQYWNrYWdlTmFtZShcbiAgICBjb25zdHJhaW50OiBQcm92aWRlckNvbnN0cmFpbnQsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcGFja2FnZU5hbWUgPSBhd2FpdCB0aGlzLnRyeUdldFBhY2thZ2VOYW1lKGNvbnN0cmFpbnQpO1xuICAgIGlmICghcGFja2FnZU5hbWUpIHtcbiAgICAgIHRocm93IEVycm9ycy5Vc2FnZShcbiAgICAgICAgYENvdWxkIG5vdCBmaW5kIHByZS1idWlsdCBwcm92aWRlciBmb3IgJHtjb25zdHJhaW50LnNvdXJjZX1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhY2thZ2VOYW1lO1xuICB9XG5cbiAgYXN5bmMgZ2V0TWF0Y2hpbmdQcm92aWRlclZlcnNpb24oY29uc3RyYWludDogUHJvdmlkZXJDb25zdHJhaW50KSB7XG4gICAgY29uc3QgcGFja2FnZU5hbWUgPSBhd2FpdCB0aGlzLmdldFBhY2thZ2VOYW1lKGNvbnN0cmFpbnQpO1xuXG4gICAgY29uc3QgcHJlYnVpbHRQcm92aWRlck5wbVZlcnNpb25zID0gYXdhaXQgZ2V0UHJlYnVpbHRQcm92aWRlclZlcnNpb25zKFxuICAgICAgY29uc3RyYWludCxcbiAgICAgIHRoaXMuY2RrdGZWZXJzaW9uLFxuICAgICk7XG4gICAgaWYgKCFwcmVidWlsdFByb3ZpZGVyTnBtVmVyc2lvbnMpIHtcbiAgICAgIHRocm93IEVycm9ycy5Vc2FnZShcbiAgICAgICAgYE5vIHByZS1idWlsdCBwcm92aWRlciBmb3VuZCBmb3IgJHtjb25zdHJhaW50LnNvdXJjZX0gd2l0aCB2ZXJzaW9uIGNvbnN0cmFpbnQgJHtjb25zdHJhaW50LnZlcnNpb259IGFuZCBjZGt0ZiB2ZXJzaW9uICR7dGhpcy5jZGt0ZlZlcnNpb259YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFja2FnZVZlcnNpb24gPSBhd2FpdCB0aGlzLmdldExhbmd1YWdlU3BlY2lmaWNQYWNrYWdlVmVyc2lvbihcbiAgICAgIHBhY2thZ2VOYW1lLFxuICAgICAgcHJlYnVpbHRQcm92aWRlck5wbVZlcnNpb25zLFxuICAgICk7XG5cbiAgICBpZiAoIXBhY2thZ2VWZXJzaW9uKSB7XG4gICAgICB0aHJvdyBFcnJvcnMuVXNhZ2UoXG4gICAgICAgIGBObyBwcmUtYnVpbHQgcHJvdmlkZXIgZm91bmQgZm9yICR7Y29uc3RyYWludC5zb3VyY2V9IHdpdGggdmVyc2lvbiBjb25zdHJhaW50ICR7Y29uc3RyYWludC52ZXJzaW9ufSBhbmQgY2RrdGYgdmVyc2lvbiAke3RoaXMuY2RrdGZWZXJzaW9ufSBmb3IgbGFuZ3VhZ2UgJHt0aGlzLnRhcmdldExhbmd1YWdlfS5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFja2FnZVZlcnNpb247XG4gIH1cblxuICBhc3luYyBhZGRQcmVidWlsdFByb3ZpZGVyKGNvbnN0cmFpbnQ6IFByb3ZpZGVyQ29uc3RyYWludCwgc2lsZW50ID0gZmFsc2UpIHtcbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICBgYWRkaW5nIHByZS1idWlsdCBwcm92aWRlciAke2NvbnN0cmFpbnQuc291cmNlfSB3aXRoIHZlcnNpb24gY29uc3RyYWludCAke2NvbnN0cmFpbnQudmVyc2lvbn0gZm9yIGNka3RmIHZlcnNpb24gJHt0aGlzLmNka3RmVmVyc2lvbn1gLFxuICAgICk7XG5cbiAgICBjb25zdCBwYWNrYWdlTmFtZSA9IGF3YWl0IHRoaXMuZ2V0UGFja2FnZU5hbWUoY29uc3RyYWludCk7XG4gICAgY29uc3QgcGFja2FnZVZlcnNpb24gPSBhd2FpdCB0aGlzLmdldE1hdGNoaW5nUHJvdmlkZXJWZXJzaW9uKGNvbnN0cmFpbnQpO1xuICAgIGF3YWl0IHRoaXMucGFja2FnZU1hbmFnZXIuYWRkUGFja2FnZShwYWNrYWdlTmFtZSwgcGFja2FnZVZlcnNpb24sIHNpbGVudCk7XG5cbiAgICAvLyBUT0RPOiBtb3JlIGRlYnVnIGxvZ3NcbiAgfVxuXG4gIC8vIFRoZSB2ZXJzaW9uIHdlIHVzZSBmb3IgbnBtIG1pZ2h0IGRpZmZlciBmcm9tIG90aGVyIHJlZ2lzdHJpZXNcbiAgLy8gVGhpcyBoYXBwZW5zIG1vc3RseSBpbiBjYXNlcyB3aGVyZSBhIHByb3ZpZGVyIHVwZGF0ZSBmYWlsZWQgdG8gcHVibGlzaCB0byBvbmUgb2YgdGhlIHJlZ2lzdHJpZXNcbiAgLy8gSW4gdGhhdCBjYXNlIHdlIHVzZSB0aGUgbGF0ZXN0IHZlcnNpb24gdGhhdCB3YXMgcHVibGlzaGVkIHN1Y2Nlc3NmdWxseSBhbmQgd29ya3Mgd2l0aCB0aGUgY3VycmVudCBjZGt0ZiByZWxlYXNlXG4gIHByaXZhdGUgYXN5bmMgZ2V0TGFuZ3VhZ2VTcGVjaWZpY1BhY2thZ2VWZXJzaW9uKFxuICAgIHBhY2thZ2VOYW1lOiBzdHJpbmcsXG4gICAgcHJlYnVpbHRQcm92aWRlck5wbVZlcnNpb25zOiBzdHJpbmdbXSxcbiAgKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgXCJGb3VuZCBwb3NzaWJseSBtYXRjaGluZyB2ZXJzaW9ucyAocmVsZWFzZWQgb24gbnBtKTogXCIsXG4gICAgICBwcmVidWlsdFByb3ZpZGVyTnBtVmVyc2lvbnMsXG4gICAgKTtcbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICBcIlNlYXJjaGluZyB0aHJvdWdoIHBhY2thZ2UgbWFuYWdlciB0byBmaW5kIGxhdGVzdCBhdmFpbGFibGUgdmVyc2lvbiBmb3IgZ2l2ZW4gbGFuZ3VhZ2VcIixcbiAgICApO1xuXG4gICAgZm9yIChjb25zdCB2ZXJzaW9uIG9mIHByZWJ1aWx0UHJvdmlkZXJOcG1WZXJzaW9ucykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaXNBdmFpbGFibGUgPSBhd2FpdCB0aGlzLnBhY2thZ2VNYW5hZ2VyLmlzTnBtVmVyc2lvbkF2YWlsYWJsZShcbiAgICAgICAgICBwYWNrYWdlTmFtZSxcbiAgICAgICAgICB2ZXJzaW9uLFxuICAgICAgICApO1xuICAgICAgICBpZiAoaXNBdmFpbGFibGUpIHtcbiAgICAgICAgICByZXR1cm4gdmVyc2lvbjtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgIGBDb3VsZCBub3QgZmluZCB2ZXJzaW9uICR7dmVyc2lvbn0gZm9yIHBhY2thZ2UgJHtwYWNrYWdlTmFtZX06ICcke2Vycn0nLiBTa2lwcGluZy4uLmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgYXN5bmMgYWRkTG9jYWxQcm92aWRlcihjb25zdHJhaW50OiBQcm92aWRlckNvbnN0cmFpbnQpIHtcbiAgICBsb2dnZXIuaW5mbyhcbiAgICAgIGBBZGRpbmcgbG9jYWwgcHJvdmlkZXIgJHtjb25zdHJhaW50LnNvdXJjZX0gd2l0aCB2ZXJzaW9uIGNvbnN0cmFpbnQgJHtjb25zdHJhaW50LnZlcnNpb259IHRvIGNka3RmLmpzb25gLFxuICAgICk7XG5cbiAgICBpZiAoIWNvbnN0cmFpbnQudmVyc2lvbiAmJiBjb25zdHJhaW50LmlzRnJvbVRlcnJhZm9ybVJlZ2lzdHJ5KCkpIHtcbiAgICAgIGNvbnN0IHYgPSBhd2FpdCBnZXRMYXRlc3RWZXJzaW9uKGNvbnN0cmFpbnQpO1xuICAgICAgaWYgKHYpIHtcbiAgICAgICAgY29uc3RyYWludCA9IG5ldyBQcm92aWRlckNvbnN0cmFpbnQoXG4gICAgICAgICAgY29uc3RyYWludC5zb3VyY2UsXG4gICAgICAgICAgLy8gXCIxLjMuMlwiIC0+IFwifj4gMS4zXCJcbiAgICAgICAgICBgfj4gJHt2LnNwbGl0KFwiLlwiKS5zbGljZSgwLCAyKS5qb2luKFwiLlwiKX1gLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgRXJyb3JzLlVzYWdlKFxuICAgICAgICAgIGBDb3VsZCBub3QgZmluZCBhIHZlcnNpb24gZm9yIHRoZSBwcm92aWRlciAnJHtjb25zdHJhaW50fScgaW4gdGhlIHB1YmxpYyByZWdpc3RyeS4gVGhpcyBjb3VsZCBiZSBkdWUgdG8gYSB0eXBvLCBwbGVhc2UgdGFrZSBhIGxvb2sgYXQgaHR0cHM6Ly9jZGsudGYvcmVnaXN0cnktcHJvdmlkZXJzIHRvIGZpbmQgYWxsIHN1cHBvcnRlZCBwcm92aWRlcnMuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBuZXcgQ2RrdGZDb25maWdNYW5hZ2VyKCkuYWRkUHJvdmlkZXIoY29uc3RyYWludCk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYW4gTlBNIHBhY2thZ2UgbmFtZSBvZiBhIHByZS1idWlsdCBwcm92aWRlciBwYWNrYWdlIHRvIHRoZSBuYW1lIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2VcbiAgICovXG4gIHByaXZhdGUgY29udmVydFBhY2thZ2VOYW1lKG5hbWU6IHN0cmluZywgcmVwb3NpdG9yeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBwcm92aWRlck5hbWUgPSBuYW1lLnJlcGxhY2UoXCJAY2RrdGYvcHJvdmlkZXItXCIsIFwiXCIpO1xuICAgIHN3aXRjaCAodGhpcy50YXJnZXRMYW5ndWFnZSkge1xuICAgICAgY2FzZSBMYW5ndWFnZS5HTzogLy8gZS5nLiBnaXRodWIuY29tL2Nka3RmL2Nka3RmLXByb3ZpZGVyLW9wZW50ZWxla29tY2xvdWQtZ28vb3BlbnRlbGVrb21jbG91ZFxuICAgICAgICBpZiAocmVwb3NpdG9yeSkge1xuICAgICAgICAgIHJldHVybiBgJHtyZXBvc2l0b3J5fS1nby8ke3Byb3ZpZGVyTmFtZX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGBnaXRodWIuY29tL2Nka3RmL2Nka3RmLXByb3ZpZGVyLSR7cHJvdmlkZXJOYW1lfS1nby8ke3Byb3ZpZGVyTmFtZX1gO1xuICAgICAgY2FzZSBMYW5ndWFnZS5UWVBFU0NSSVBUOiAvLyBlLmcuIEBjZGt0Zi9wcm92aWRlci1yYW5kb21cbiAgICAgICAgcmV0dXJuIG5hbWU7IC8vIGFscmVhZHkgdGhlIGNvcnJlY3QgbmFtZVxuICAgICAgY2FzZSBMYW5ndWFnZS5DU0hBUlA6IC8vIGUuZy4gSGFzaGlDb3JwLkNka3RmLlByb3ZpZGVycy5PcGVudGVsZWtvbWNsb3VkXG4gICAgICAgIHJldHVybiBgSGFzaGlDb3JwLkNka3RmLlByb3ZpZGVycy5gICsgdG9QYXNjYWxDYXNlKHByb3ZpZGVyTmFtZSk7XG4gICAgICBjYXNlIExhbmd1YWdlLkpBVkE6IC8vIGUuZy4gY29tLmhhc2hpY29ycC5vcGVudGVsZWtvbWNsb3VkXG4gICAgICAgIHJldHVybiBgY29tLmhhc2hpY29ycC5jZGt0Zi1wcm92aWRlci0ke3Byb3ZpZGVyTmFtZX1gO1xuICAgICAgY2FzZSBMYW5ndWFnZS5QWVRIT046IC8vIGUuZy4gY2RrdGYtY2RrdGYtcHJvdmlkZXItb3BlbnRlbGVrb21jbG91ZFxuICAgICAgICByZXR1cm4gYGNka3RmLWNka3RmLXByb3ZpZGVyLSR7cHJvdmlkZXJOYW1lfWA7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYGNvbnZlcnRpbmcgcGFja2FnZSBuYW1lIGZvciBsYW5ndWFnZSAke3RoaXMudGFyZ2V0TGFuZ3VhZ2V9IG5vdCBpbXBsZW1lbnRlZCB5ZXRgLFxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhbiBwYWNrYWdlIG5hbWUgb2YgYSBwcmUtYnVpbHQgcHJvdmlkZXIgcGFja2FnZSBpbiB0YXJnZXQgbGFuZ3VhZ2UgdG8gdGhlIG5hbWUgaW4gbnBtXG4gICAqIEludmVyc2Ugb2Y6IGBjb252ZXJ0UGFja2FnZU5hbWVgXG4gICAqL1xuICBwcml2YXRlIGNvbnZlcnRGcm9tUGFja2FnZU5hbWVUb05wbShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5wbVBhY2thZ2VQcmVmaXggPSBcIkBjZGt0Zi9wcm92aWRlci1cIjtcbiAgICBjb25zdCByZWdleGVzID0ge1xuICAgICAgW0xhbmd1YWdlLkdPXTpcbiAgICAgICAgL2dpdGh1Yi5jb21cXC8oPzpjZGt0ZnxoYXNoaWNvcnApXFwvY2RrdGYtcHJvdmlkZXItKC4rKS1nb1xcLy9pLFxuICAgICAgW0xhbmd1YWdlLlRZUEVTQ1JJUFRdOiAvKC4rKS9pLFxuICAgICAgW0xhbmd1YWdlLkNTSEFSUF06IC9IYXNoaUNvcnBcXC5DZGt0ZlxcLlByb3ZpZGVyc1xcLiguKykvaSxcbiAgICAgIFtMYW5ndWFnZS5KQVZBXTogL2NvbVxcLmhhc2hpY29ycFxcLmNka3RmLXByb3ZpZGVyLSguKykvaSxcbiAgICAgIFtMYW5ndWFnZS5QWVRIT05dOiAvY2RrdGYtY2RrdGYtcHJvdmlkZXItKC4rKS9pLFxuICAgIH07XG4gICAgY29uc3QgcmVnZXggPSByZWdleGVzW3RoaXMudGFyZ2V0TGFuZ3VhZ2VdO1xuICAgIGlmICghcmVnZXgpIHtcbiAgICAgIHRocm93IEVycm9ycy5Vc2FnZShcIkxhbmd1YWdlIG5vdCBzdXBwb3J0ZWQgZm9yIHByZS1idWlsdCBwcm92aWRlcnNcIik7XG4gICAgfVxuXG4gICAgY29uc3QgbWF0Y2ggPSByZWdleC5leGVjKG5hbWUpO1xuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUGFja2FnZSBuYW1lIGlzIG5vdCBpbiBleHBlY3RlZCBmb3JtYXQ6ICR7bmFtZX1gKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRoaXMudGFyZ2V0TGFuZ3VhZ2UpIHtcbiAgICAgIGNhc2UgTGFuZ3VhZ2UuR086IC8vIGUuZy4gZ2l0aHViLmNvbS9jZGt0Zi9jZGt0Zi1wcm92aWRlci1vcGVudGVsZWtvbWNsb3VkLWdvL29wZW50ZWxla29tY2xvdWRcbiAgICAgICAgcmV0dXJuIG5wbVBhY2thZ2VQcmVmaXggKyBtYXRjaFsxXTtcbiAgICAgIGNhc2UgTGFuZ3VhZ2UuVFlQRVNDUklQVDogLy8gZS5nLiBAY2RrdGYvcHJvdmlkZXItcmFuZG9tXG4gICAgICAgIHJldHVybiBtYXRjaFsxXTsgLy8gYWxyZWFkeSB0aGUgY29ycmVjdCBuYW1lXG4gICAgICBjYXNlIExhbmd1YWdlLkNTSEFSUDogLy8gZS5nLiBIYXNoaUNvcnAuQ2RrdGYuUHJvdmlkZXJzLk9wZW50ZWxla29tY2xvdWRcbiAgICAgICAgcmV0dXJuIG5wbVBhY2thZ2VQcmVmaXggKyB0b1NuYWtlQ2FzZShtYXRjaFsxXSk7XG4gICAgICBjYXNlIExhbmd1YWdlLkpBVkE6IC8vIGUuZy4gY29tLmhhc2hpY29ycC5vcGVudGVsZWtvbWNsb3VkXG4gICAgICAgIHJldHVybiBucG1QYWNrYWdlUHJlZml4ICsgbWF0Y2hbMV07XG4gICAgICBjYXNlIExhbmd1YWdlLlBZVEhPTjogLy8gZS5nLiBjZGt0Zi1jZGt0Zi1wcm92aWRlci1vcGVudGVsZWtvbWNsb3VkXG4gICAgICAgIHJldHVybiBucG1QYWNrYWdlUHJlZml4ICsgbWF0Y2hbMV07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYGNvbnZlcnRpbmcgcGFja2FnZSBuYW1lIGZvciBsYW5ndWFnZSAke3RoaXMudGFyZ2V0TGFuZ3VhZ2V9IG5vdCBpbXBsZW1lbnRlZCB5ZXRgLFxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBhbGxQcm92aWRlcnMoKSB7XG4gICAgY29uc3QgY2RrdGZKc29uID0gQ2RrdGZDb25maWcucmVhZCgpO1xuICAgIGNvbnN0IGxvY2FsVmVyc2lvbnMgPSBuZXcgTG9jYWxQcm92aWRlclZlcnNpb25zKCk7XG5cbiAgICBjb25zdCBsb2NhbFByb3ZpZGVyQ29uZmlncyA9IGNka3RmSnNvbi50ZXJyYWZvcm1Qcm92aWRlcnM7XG4gICAgY29uc3QgcHJlYnVpbHRQcm92aWRlckNvbmZpZ3MgPVxuICAgICAgYXdhaXQgdGhpcy5wYWNrYWdlTWFuYWdlci5saXN0UHJvdmlkZXJQYWNrYWdlcygpO1xuXG4gICAgY29uc3QgcHJlYnVpbHRQcm92aWRlcnNJbmZvID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBwcmVidWlsdFByb3ZpZGVyQ29uZmlncy5tYXAoYXN5bmMgKHByZWJ1aWx0UHJvdmlkZXJDb25maWcpID0+IHtcbiAgICAgICAgY29uc3QgcGFja2FnZU5hbWUgPSB0aGlzLmNvbnZlcnRGcm9tUGFja2FnZU5hbWVUb05wbShcbiAgICAgICAgICBwcmVidWlsdFByb3ZpZGVyQ29uZmlnLm5hbWUsXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgcHJvdmlkZXJJbmZvcm1hdGlvbiA9IGF3YWl0IGdldFByZWJ1aWx0UHJvdmlkZXJWZXJzaW9uSW5mb3JtYXRpb24oXG4gICAgICAgICAgcGFja2FnZU5hbWUsXG4gICAgICAgICAgcHJlYnVpbHRQcm92aWRlckNvbmZpZy52ZXJzaW9uLFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ucHJvdmlkZXJJbmZvcm1hdGlvbixcbiAgICAgICAgICBwYWNrYWdlTmFtZTogcHJlYnVpbHRQcm92aWRlckNvbmZpZy5uYW1lLFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIGNvbnN0IGNvbnN0cmFpbnRzID0gbmV3IExvY2FsUHJvdmlkZXJDb25zdHJhaW50cygpO1xuXG4gICAgY29uc3QgbG9jYWxQcm92aWRlcnNJbmZvID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBsb2NhbFByb3ZpZGVyQ29uZmlncy5tYXAoYXN5bmMgKGxvY2FsUHJvdmlkZXJDb25maWcpID0+IHtcbiAgICAgICAgY29uc3QgY29uc3RyYWludCA9XG4gICAgICAgICAgUHJvdmlkZXJDb25zdHJhaW50LmZyb21Db25maWdFbnRyeShsb2NhbFByb3ZpZGVyQ29uZmlnKTtcbiAgICAgICAgY29uc3QgdmVyc2lvbiA9IGF3YWl0IGxvY2FsVmVyc2lvbnMudmVyc2lvbkZvclByb3ZpZGVyKFxuICAgICAgICAgIGNvbnN0cmFpbnQuc2ltcGxpZmllZE5hbWUsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGNvbnN0cmFpbnRWYWx1ZSA9IGF3YWl0IGNvbnN0cmFpbnRzLmNvbnN0cmFpbnRGb3JQcm92aWRlcihcbiAgICAgICAgICBjb25zdHJhaW50LnNpbXBsaWZpZWROYW1lLFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcHJvdmlkZXJOYW1lOiBjb25zdHJhaW50LnNpbXBsaWZpZWROYW1lLFxuICAgICAgICAgIHByb3ZpZGVyQ29uc3RyYWludDogY29uc3RyYWludFZhbHVlIHx8IGNvbnN0cmFpbnQudmVyc2lvbixcbiAgICAgICAgICBwcm92aWRlclZlcnNpb246IHZlcnNpb24sXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxvY2FsOiBsb2NhbFByb3ZpZGVyc0luZm8sXG4gICAgICBwcmVidWlsdDogcHJlYnVpbHRQcm92aWRlcnNJbmZvLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
|
|
@@ -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"}
|