@cdktn/commons 0.25.0-pre.53 → 0.25.0-pre.54
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/build/config.d.ts +5 -0
- package/build/config.d.ts.map +1 -1
- package/build/config.js +26 -1
- package/build/config.test.js +23 -1
- package/build/construct-maker-target.d.ts +2 -0
- package/build/construct-maker-target.d.ts.map +1 -1
- package/build/construct-maker-target.js +3 -1
- package/build/debug.js +11 -11
- package/build/debug.test.js +9 -2
- package/build/errors.d.ts +3 -0
- package/build/errors.d.ts.map +1 -1
- package/build/errors.js +31 -23
- package/build/errors.test.d.ts +2 -0
- package/build/errors.test.d.ts.map +1 -0
- package/build/errors.test.js +24 -0
- package/build/identity.d.ts +3 -0
- package/build/identity.d.ts.map +1 -0
- package/build/identity.js +88 -0
- package/build/index.d.ts +2 -1
- package/build/index.d.ts.map +1 -1
- package/build/index.js +3 -2
- package/build/process-state.d.ts +2 -0
- package/build/process-state.d.ts.map +1 -0
- package/build/process-state.js +15 -0
- package/build/telemetry.d.ts +24 -0
- package/build/telemetry.d.ts.map +1 -0
- package/build/telemetry.js +721 -0
- package/build/telemetry.test.d.ts +2 -0
- package/build/telemetry.test.d.ts.map +1 -0
- package/build/telemetry.test.js +1501 -0
- package/build/terraform.d.ts +10 -1
- package/build/terraform.d.ts.map +1 -1
- package/build/terraform.js +43 -8
- package/build/terraform.test.d.ts +2 -0
- package/build/terraform.test.d.ts.map +1 -0
- package/build/terraform.test.js +136 -0
- package/package.json +3 -3
- package/build/checkpoint.d.ts +0 -19
- package/build/checkpoint.d.ts.map +0 -1
- package/build/checkpoint.js +0 -185
package/build/terraform.d.ts
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
|
+
import { TerraformCliName } from "cdktn/lib/validations";
|
|
1
2
|
export declare const terraformBinaryName: string;
|
|
2
3
|
export { parseTerraformCliVersion } from "cdktn/lib/validations";
|
|
3
4
|
export type { TerraformCliVersion, TerraformCliName, } from "cdktn/lib/validations";
|
|
4
|
-
export
|
|
5
|
+
export interface TerraformCliProbe {
|
|
6
|
+
readonly name: TerraformCliName | "missing";
|
|
7
|
+
readonly version?: string;
|
|
8
|
+
}
|
|
9
|
+
/** Test seam: seeds the raw `version` output, or clears it when omitted. */
|
|
10
|
+
export declare function seedTerraformCliProbeForTests(output?: Promise<string>): void;
|
|
11
|
+
/** Binary and version for usage telemetry; never rejects. */
|
|
12
|
+
export declare function terraformCli(): Promise<TerraformCliProbe>;
|
|
13
|
+
export declare function terraformVersion(): Promise<string | undefined>;
|
|
5
14
|
//# sourceMappingURL=terraform.d.ts.map
|
package/build/terraform.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terraform.d.ts","sourceRoot":"","sources":["../src/terraform.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"terraform.d.ts","sourceRoot":"","sources":["../src/terraform.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,gBAAgB,EACjB,MAAM,uBAAuB,CAAC;AAE/B,eAAO,MAAM,mBAAmB,QACkB,CAAC;AAMnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACjE,YAAY,EACV,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAI/B,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAC5C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAYD,4EAA4E;AAC5E,wBAAgB,6BAA6B,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAE5E;AAaD,6DAA6D;AAC7D,wBAAgB,YAAY,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAOzD;AAID,wBAAgB,gBAAgB,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAI9D"}
|
package/build/terraform.js
CHANGED
|
@@ -1,18 +1,53 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.parseTerraformCliVersion = exports.terraformBinaryName = void 0;
|
|
4
|
+
exports.seedTerraformCliProbeForTests = seedTerraformCliProbeForTests;
|
|
5
|
+
exports.terraformCli = terraformCli;
|
|
6
|
+
exports.terraformVersion = terraformVersion;
|
|
4
7
|
// Copyright (c) HashiCorp, Inc
|
|
5
8
|
// SPDX-License-Identifier: MPL-2.0
|
|
6
|
-
const errors_1 = require("./errors");
|
|
7
9
|
const util_1 = require("./util");
|
|
10
|
+
const process_state_1 = require("./process-state");
|
|
11
|
+
const validations_1 = require("cdktn/lib/validations");
|
|
8
12
|
exports.terraformBinaryName = process.env.TERRAFORM_BINARY_NAME || "terraform";
|
|
9
13
|
// The Terraform CLI version parser lives in the cdktn package (its canonical
|
|
10
14
|
// home). It is consumed via subpath because its string-literal union return
|
|
11
15
|
// type is not part of cdktn's public jsii API. Re-exported here so existing
|
|
12
16
|
// commons consumers (e.g. @cdktn/cli-core) keep a single import surface.
|
|
13
|
-
var
|
|
14
|
-
Object.defineProperty(exports, "parseTerraformCliVersion", { enumerable: true, get: function () { return
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
var validations_2 = require("cdktn/lib/validations");
|
|
18
|
+
Object.defineProperty(exports, "parseTerraformCliVersion", { enumerable: true, get: function () { return validations_2.parseTerraformCliVersion; } });
|
|
19
|
+
const PROBE_TIMEOUT_MS = 1500;
|
|
20
|
+
// The CLI bundle carries several copies of this module (two esbuild entries
|
|
21
|
+
// plus the commons build behind the external hcl2cdk); process state keeps it
|
|
22
|
+
// to one `version` spawn per process, started on first use.
|
|
23
|
+
const probe = (0, process_state_1.processState)("cdktn.terraformCli", () => ({}));
|
|
24
|
+
/** Test seam: seeds the raw `version` output, or clears it when omitted. */
|
|
25
|
+
function seedTerraformCliProbeForTests(output) {
|
|
26
|
+
probe.output = output;
|
|
27
|
+
}
|
|
28
|
+
function versionOutput() {
|
|
29
|
+
if (!probe.output) {
|
|
30
|
+
const output = (0, util_1.exec)(exports.terraformBinaryName, ["version"], {
|
|
31
|
+
timeout: PROBE_TIMEOUT_MS,
|
|
32
|
+
});
|
|
33
|
+
output.catch(() => undefined); // the consumers below handle rejection
|
|
34
|
+
probe.output = output;
|
|
35
|
+
}
|
|
36
|
+
return probe.output;
|
|
37
|
+
}
|
|
38
|
+
/** Binary and version for usage telemetry; never rejects. */
|
|
39
|
+
function terraformCli() {
|
|
40
|
+
return versionOutput()
|
|
41
|
+
.then((output) => (0, validations_1.parseTerraformCliVersion)(output))
|
|
42
|
+
.catch((err) => ({
|
|
43
|
+
name: (err === null || err === void 0 ? void 0 : err.code) === "ENOENT" ? "missing" : "unknown",
|
|
44
|
+
}));
|
|
45
|
+
}
|
|
46
|
+
// `undefined` when the probe fails: building an Errors.Usage here would
|
|
47
|
+
// count a phantom cli.error.
|
|
48
|
+
function terraformVersion() {
|
|
49
|
+
return versionOutput()
|
|
50
|
+
.then((output) => (0, validations_1.parseTerraformCliVersion)(output).version)
|
|
51
|
+
.catch(() => undefined);
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVycmFmb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3RlcnJhZm9ybS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUF3Q0Esc0VBRUM7QUFjRCxvQ0FPQztBQUlELDRDQUlDO0FBdkVELCtCQUErQjtBQUMvQixtQ0FBbUM7QUFDbkMsaUNBQThCO0FBQzlCLG1EQUErQztBQUMvQyx1REFHK0I7QUFFbEIsUUFBQSxtQkFBbUIsR0FDOUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsSUFBSSxXQUFXLENBQUM7QUFFbkQsNkVBQTZFO0FBQzdFLDRFQUE0RTtBQUM1RSw0RUFBNEU7QUFDNUUseUVBQXlFO0FBQ3pFLHFEQUFpRTtBQUF4RCx1SEFBQSx3QkFBd0IsT0FBQTtBQWFqQyxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQztBQUU5Qiw0RUFBNEU7QUFDNUUsOEVBQThFO0FBQzlFLDREQUE0RDtBQUM1RCxNQUFNLEtBQUssR0FBRyxJQUFBLDRCQUFZLEVBQ3hCLG9CQUFvQixFQUNwQixHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUNYLENBQUM7QUFFRiw0RUFBNEU7QUFDNUUsU0FBZ0IsNkJBQTZCLENBQUMsTUFBd0I7SUFDcEUsS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7QUFDeEIsQ0FBQztBQUVELFNBQVMsYUFBYTtJQUNwQixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2xCLE1BQU0sTUFBTSxHQUFHLElBQUEsV0FBSSxFQUFDLDJCQUFtQixFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDcEQsT0FBTyxFQUFFLGdCQUFnQjtTQUMxQixDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsdUNBQXVDO1FBQ3RFLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3hCLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUM7QUFDdEIsQ0FBQztBQUVELDZEQUE2RDtBQUM3RCxTQUFnQixZQUFZO0lBQzFCLE9BQU8sYUFBYSxFQUFFO1NBQ25CLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBQSxzQ0FBd0IsRUFBQyxNQUFNLENBQUMsQ0FBQztTQUNsRCxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDZixJQUFJLEVBQ0YsQ0FBQSxHQUFHLGFBQUgsR0FBRyx1QkFBSCxHQUFHLENBQUUsSUFBSSxNQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUUsU0FBbUIsQ0FBQyxDQUFDLENBQUUsU0FBbUI7S0FDdkUsQ0FBQyxDQUFDLENBQUM7QUFDUixDQUFDO0FBRUQsd0VBQXdFO0FBQ3hFLDZCQUE2QjtBQUM3QixTQUFnQixnQkFBZ0I7SUFDOUIsT0FBTyxhQUFhLEVBQUU7U0FDbkIsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFBLHNDQUF3QixFQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQztTQUMxRCxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDNUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgSGFzaGlDb3JwLCBJbmNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG5pbXBvcnQgeyBleGVjIH0gZnJvbSBcIi4vdXRpbFwiO1xuaW1wb3J0IHsgcHJvY2Vzc1N0YXRlIH0gZnJvbSBcIi4vcHJvY2Vzcy1zdGF0ZVwiO1xuaW1wb3J0IHtcbiAgcGFyc2VUZXJyYWZvcm1DbGlWZXJzaW9uLFxuICBUZXJyYWZvcm1DbGlOYW1lLFxufSBmcm9tIFwiY2RrdG4vbGliL3ZhbGlkYXRpb25zXCI7XG5cbmV4cG9ydCBjb25zdCB0ZXJyYWZvcm1CaW5hcnlOYW1lID1cbiAgcHJvY2Vzcy5lbnYuVEVSUkFGT1JNX0JJTkFSWV9OQU1FIHx8IFwidGVycmFmb3JtXCI7XG5cbi8vIFRoZSBUZXJyYWZvcm0gQ0xJIHZlcnNpb24gcGFyc2VyIGxpdmVzIGluIHRoZSBjZGt0biBwYWNrYWdlIChpdHMgY2Fub25pY2FsXG4vLyBob21lKS4gSXQgaXMgY29uc3VtZWQgdmlhIHN1YnBhdGggYmVjYXVzZSBpdHMgc3RyaW5nLWxpdGVyYWwgdW5pb24gcmV0dXJuXG4vLyB0eXBlIGlzIG5vdCBwYXJ0IG9mIGNka3RuJ3MgcHVibGljIGpzaWkgQVBJLiBSZS1leHBvcnRlZCBoZXJlIHNvIGV4aXN0aW5nXG4vLyBjb21tb25zIGNvbnN1bWVycyAoZS5nLiBAY2RrdG4vY2xpLWNvcmUpIGtlZXAgYSBzaW5nbGUgaW1wb3J0IHN1cmZhY2UuXG5leHBvcnQgeyBwYXJzZVRlcnJhZm9ybUNsaVZlcnNpb24gfSBmcm9tIFwiY2RrdG4vbGliL3ZhbGlkYXRpb25zXCI7XG5leHBvcnQgdHlwZSB7XG4gIFRlcnJhZm9ybUNsaVZlcnNpb24sXG4gIFRlcnJhZm9ybUNsaU5hbWUsXG59IGZyb20gXCJjZGt0bi9saWIvdmFsaWRhdGlvbnNcIjtcblxuLy8gYG1pc3NpbmdgOiB0aGUgYmluYXJ5IGNvdWxkIG5vdCBiZSBzcGF3bmVkOyBgdW5rbm93bmA6IGl0cyB2ZXJzaW9uIG91dHB1dFxuLy8gd2FzIG5vdCByZWNvZ25pemVkLCBvciBpdCBmYWlsZWQgb3IgdGltZWQgb3V0LlxuZXhwb3J0IGludGVyZmFjZSBUZXJyYWZvcm1DbGlQcm9iZSB7XG4gIHJlYWRvbmx5IG5hbWU6IFRlcnJhZm9ybUNsaU5hbWUgfCBcIm1pc3NpbmdcIjtcbiAgcmVhZG9ubHkgdmVyc2lvbj86IHN0cmluZztcbn1cblxuY29uc3QgUFJPQkVfVElNRU9VVF9NUyA9IDE1MDA7XG5cbi8vIFRoZSBDTEkgYnVuZGxlIGNhcnJpZXMgc2V2ZXJhbCBjb3BpZXMgb2YgdGhpcyBtb2R1bGUgKHR3byBlc2J1aWxkIGVudHJpZXNcbi8vIHBsdXMgdGhlIGNvbW1vbnMgYnVpbGQgYmVoaW5kIHRoZSBleHRlcm5hbCBoY2wyY2RrKTsgcHJvY2VzcyBzdGF0ZSBrZWVwcyBpdFxuLy8gdG8gb25lIGB2ZXJzaW9uYCBzcGF3biBwZXIgcHJvY2Vzcywgc3RhcnRlZCBvbiBmaXJzdCB1c2UuXG5jb25zdCBwcm9iZSA9IHByb2Nlc3NTdGF0ZTx7IG91dHB1dD86IFByb21pc2U8c3RyaW5nPiB9PihcbiAgXCJjZGt0bi50ZXJyYWZvcm1DbGlcIixcbiAgKCkgPT4gKHt9KSxcbik7XG5cbi8qKiBUZXN0IHNlYW06IHNlZWRzIHRoZSByYXcgYHZlcnNpb25gIG91dHB1dCwgb3IgY2xlYXJzIGl0IHdoZW4gb21pdHRlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWVkVGVycmFmb3JtQ2xpUHJvYmVGb3JUZXN0cyhvdXRwdXQ/OiBQcm9taXNlPHN0cmluZz4pOiB2b2lkIHtcbiAgcHJvYmUub3V0cHV0ID0gb3V0cHV0O1xufVxuXG5mdW5jdGlvbiB2ZXJzaW9uT3V0cHV0KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGlmICghcHJvYmUub3V0cHV0KSB7XG4gICAgY29uc3Qgb3V0cHV0ID0gZXhlYyh0ZXJyYWZvcm1CaW5hcnlOYW1lLCBbXCJ2ZXJzaW9uXCJdLCB7XG4gICAgICB0aW1lb3V0OiBQUk9CRV9USU1FT1VUX01TLFxuICAgIH0pO1xuICAgIG91dHB1dC5jYXRjaCgoKSA9PiB1bmRlZmluZWQpOyAvLyB0aGUgY29uc3VtZXJzIGJlbG93IGhhbmRsZSByZWplY3Rpb25cbiAgICBwcm9iZS5vdXRwdXQgPSBvdXRwdXQ7XG4gIH1cbiAgcmV0dXJuIHByb2JlLm91dHB1dDtcbn1cblxuLyoqIEJpbmFyeSBhbmQgdmVyc2lvbiBmb3IgdXNhZ2UgdGVsZW1ldHJ5OyBuZXZlciByZWplY3RzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlcnJhZm9ybUNsaSgpOiBQcm9taXNlPFRlcnJhZm9ybUNsaVByb2JlPiB7XG4gIHJldHVybiB2ZXJzaW9uT3V0cHV0KClcbiAgICAudGhlbigob3V0cHV0KSA9PiBwYXJzZVRlcnJhZm9ybUNsaVZlcnNpb24ob3V0cHV0KSlcbiAgICAuY2F0Y2goKGVycikgPT4gKHtcbiAgICAgIG5hbWU6XG4gICAgICAgIGVycj8uY29kZSA9PT0gXCJFTk9FTlRcIiA/IChcIm1pc3NpbmdcIiBhcyBjb25zdCkgOiAoXCJ1bmtub3duXCIgYXMgY29uc3QpLFxuICAgIH0pKTtcbn1cblxuLy8gYHVuZGVmaW5lZGAgd2hlbiB0aGUgcHJvYmUgZmFpbHM6IGJ1aWxkaW5nIGFuIEVycm9ycy5Vc2FnZSBoZXJlIHdvdWxkXG4vLyBjb3VudCBhIHBoYW50b20gY2xpLmVycm9yLlxuZXhwb3J0IGZ1bmN0aW9uIHRlcnJhZm9ybVZlcnNpb24oKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgcmV0dXJuIHZlcnNpb25PdXRwdXQoKVxuICAgIC50aGVuKChvdXRwdXQpID0+IHBhcnNlVGVycmFmb3JtQ2xpVmVyc2lvbihvdXRwdXQpLnZlcnNpb24pXG4gICAgLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG59XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terraform.test.d.ts","sourceRoot":"","sources":["../src/terraform.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,136 @@
|
|
|
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 () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
// Copyright (c) HashiCorp, Inc
|
|
37
|
+
// SPDX-License-Identifier: MPL-2.0
|
|
38
|
+
const fs = __importStar(require("fs-extra"));
|
|
39
|
+
const os = __importStar(require("os"));
|
|
40
|
+
const path = __importStar(require("path"));
|
|
41
|
+
const terraform_1 = require("./terraform");
|
|
42
|
+
// The binary name is read at import, so every case loads a fresh module with
|
|
43
|
+
// TERRAFORM_BINARY_NAME pointing at a fixture script; the probe itself is
|
|
44
|
+
// cached on globalThis and reset per test.
|
|
45
|
+
function loadProbe(binary) {
|
|
46
|
+
const original = process.env.TERRAFORM_BINARY_NAME;
|
|
47
|
+
process.env.TERRAFORM_BINARY_NAME = binary;
|
|
48
|
+
try {
|
|
49
|
+
let terraform;
|
|
50
|
+
let sentry;
|
|
51
|
+
jest.isolateModules(() => {
|
|
52
|
+
terraform = jest.requireActual("./terraform");
|
|
53
|
+
sentry = jest.requireActual("@sentry/node");
|
|
54
|
+
});
|
|
55
|
+
return { ...terraform, sentry: sentry };
|
|
56
|
+
}
|
|
57
|
+
finally {
|
|
58
|
+
if (original === undefined)
|
|
59
|
+
delete process.env.TERRAFORM_BINARY_NAME;
|
|
60
|
+
else
|
|
61
|
+
process.env.TERRAFORM_BINARY_NAME = original;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
describe("terraform binary probe", () => {
|
|
65
|
+
let fixtureDir;
|
|
66
|
+
const originalCheckpointDisable = process.env.CHECKPOINT_DISABLE;
|
|
67
|
+
// `#!/bin/sh` fixtures are POSIX-only (CI runs on ubuntu)
|
|
68
|
+
function fakeBinary(name, output) {
|
|
69
|
+
const file = path.join(fixtureDir, name);
|
|
70
|
+
const calls = path.join(fixtureDir, `${name}.calls`);
|
|
71
|
+
fs.writeFileSync(file, `#!/bin/sh\necho x >> "${calls}"\nprintf '%s\\n' "${output}"\n`, { mode: 0o755 });
|
|
72
|
+
return file;
|
|
73
|
+
}
|
|
74
|
+
function spawnCount(binary) {
|
|
75
|
+
const calls = `${binary}.calls`;
|
|
76
|
+
return fs.existsSync(calls)
|
|
77
|
+
? fs.readFileSync(calls, "utf8").trim().split("\n").length
|
|
78
|
+
: 0;
|
|
79
|
+
}
|
|
80
|
+
beforeEach(() => {
|
|
81
|
+
fixtureDir = fs.mkdtempSync(path.join(os.tmpdir(), "cdktn-tf-probe-"));
|
|
82
|
+
(0, terraform_1.seedTerraformCliProbeForTests)();
|
|
83
|
+
delete process.env.CHECKPOINT_DISABLE;
|
|
84
|
+
});
|
|
85
|
+
afterEach(() => {
|
|
86
|
+
fs.removeSync(fixtureDir);
|
|
87
|
+
(0, terraform_1.seedTerraformCliProbeForTests)();
|
|
88
|
+
if (originalCheckpointDisable === undefined) {
|
|
89
|
+
delete process.env.CHECKPOINT_DISABLE;
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
process.env.CHECKPOINT_DISABLE = originalCheckpointDisable;
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
it("spawns plain `version` once per process, on first use, across module copies, and parses it", async () => {
|
|
96
|
+
const binary = fakeBinary("terraform", "Terraform v1.12.6\non darwin_arm64\n\nYour version of Terraform is out of date!");
|
|
97
|
+
const first = loadProbe(binary);
|
|
98
|
+
const second = loadProbe(binary);
|
|
99
|
+
expect(spawnCount(binary)).toBe(0);
|
|
100
|
+
const [probe, , version] = await Promise.all([
|
|
101
|
+
first.terraformCli(),
|
|
102
|
+
second.terraformCli(),
|
|
103
|
+
first.terraformVersion(),
|
|
104
|
+
second.terraformVersion(),
|
|
105
|
+
]);
|
|
106
|
+
expect(probe).toEqual({ name: "terraform", version: "1.12.6" });
|
|
107
|
+
expect(version).toBe("1.12.6");
|
|
108
|
+
await expect(second.terraformCli()).resolves.toEqual(probe);
|
|
109
|
+
expect(spawnCount(binary)).toBe(1);
|
|
110
|
+
});
|
|
111
|
+
// the probe is shared by every consumer in the process: a rejection would
|
|
112
|
+
// surface on every command, and `cdktn debug` prints the resolved value
|
|
113
|
+
it("resolves to missing (never rejects) and counts no cli.error when the binary cannot be spawned", async () => {
|
|
114
|
+
const { terraformCli, terraformVersion, sentry } = loadProbe(path.join(fixtureDir, "does-not-exist"));
|
|
115
|
+
const count = jest.spyOn(sentry.metrics, "count");
|
|
116
|
+
await expect(terraformCli()).resolves.toEqual({ name: "missing" });
|
|
117
|
+
await expect(terraformVersion()).resolves.toBeUndefined();
|
|
118
|
+
expect(count).not.toHaveBeenCalled();
|
|
119
|
+
});
|
|
120
|
+
it("resolves to unknown when `version` outlives the timeout", async () => {
|
|
121
|
+
const binary = path.join(fixtureDir, "terraform");
|
|
122
|
+
fs.writeFileSync(binary, "#!/bin/sh\nexec sleep 10\n", { mode: 0o755 });
|
|
123
|
+
const { terraformCli } = loadProbe(binary);
|
|
124
|
+
const started = Date.now();
|
|
125
|
+
await expect(terraformCli()).resolves.toEqual({ name: "unknown" });
|
|
126
|
+
// well under the fixture's 10s sleep: the probe was killed, not awaited
|
|
127
|
+
expect(Date.now() - started).toBeLessThan(9000);
|
|
128
|
+
}, 15000);
|
|
129
|
+
it("resolves to unknown when `version` exits non-zero", async () => {
|
|
130
|
+
const binary = path.join(fixtureDir, "terraform");
|
|
131
|
+
fs.writeFileSync(binary, "#!/bin/sh\nexit 1\n", { mode: 0o755 });
|
|
132
|
+
const { terraformCli } = loadProbe(binary);
|
|
133
|
+
await expect(terraformCli()).resolves.toEqual({ name: "unknown" });
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVycmFmb3JtLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdGVycmFmb3JtLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQkFBK0I7QUFDL0IsbUNBQW1DO0FBQ25DLDZDQUErQjtBQUMvQix1Q0FBeUI7QUFDekIsMkNBQTZCO0FBQzdCLDJDQUE0RDtBQUU1RCw2RUFBNkU7QUFDN0UsMEVBQTBFO0FBQzFFLDJDQUEyQztBQUMzQyxTQUFTLFNBQVMsQ0FBQyxNQUFjO0lBQy9CLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUM7SUFDbkQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsR0FBRyxNQUFNLENBQUM7SUFDM0MsSUFBSSxDQUFDO1FBQ0gsSUFBSSxTQUF1QyxDQUFDO1FBQzVDLElBQUksTUFBcUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRTtZQUN2QixTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUM5QyxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sRUFBRSxHQUFHLFNBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTyxFQUFFLENBQUM7SUFDNUMsQ0FBQztZQUFTLENBQUM7UUFDVCxJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQUUsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDOztZQUNoRSxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixHQUFHLFFBQVEsQ0FBQztJQUNwRCxDQUFDO0FBQ0gsQ0FBQztBQUVELFFBQVEsQ0FBQyx3QkFBd0IsRUFBRSxHQUFHLEVBQUU7SUFDdEMsSUFBSSxVQUFrQixDQUFDO0lBQ3ZCLE1BQU0seUJBQXlCLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQztJQUVqRSwwREFBMEQ7SUFDMUQsU0FBUyxVQUFVLENBQUMsSUFBWSxFQUFFLE1BQWM7UUFDOUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDekMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsR0FBRyxJQUFJLFFBQVEsQ0FBQyxDQUFDO1FBQ3JELEVBQUUsQ0FBQyxhQUFhLENBQ2QsSUFBSSxFQUNKLHlCQUF5QixLQUFLLHNCQUFzQixNQUFNLEtBQUssRUFDL0QsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQ2hCLENBQUM7UUFDRixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxTQUFTLFVBQVUsQ0FBQyxNQUFjO1FBQ2hDLE1BQU0sS0FBSyxHQUFHLEdBQUcsTUFBTSxRQUFRLENBQUM7UUFDaEMsT0FBTyxFQUFFLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztZQUN6QixDQUFDLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU07WUFDMUQsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFRCxVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2QsVUFBVSxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO1FBQ3ZFLElBQUEseUNBQTZCLEdBQUUsQ0FBQztRQUNoQyxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUM7SUFDeEMsQ0FBQyxDQUFDLENBQUM7SUFFSCxTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ2IsRUFBRSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMxQixJQUFBLHlDQUE2QixHQUFFLENBQUM7UUFDaEMsSUFBSSx5QkFBeUIsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM1QyxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUM7UUFDeEMsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixHQUFHLHlCQUF5QixDQUFDO1FBQzdELENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw0RkFBNEYsRUFBRSxLQUFLLElBQUksRUFBRTtRQUMxRyxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQ3ZCLFdBQVcsRUFDWCxpRkFBaUYsQ0FDbEYsQ0FBQztRQUNGLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNoQyxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVuQyxNQUFNLENBQUMsS0FBSyxFQUFFLEFBQUQsRUFBRyxPQUFPLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDM0MsS0FBSyxDQUFDLFlBQVksRUFBRTtZQUNwQixNQUFNLENBQUMsWUFBWSxFQUFFO1lBQ3JCLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRTtZQUN4QixNQUFNLENBQUMsZ0JBQWdCLEVBQUU7U0FDMUIsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDaEUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMvQixNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVELE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckMsQ0FBQyxDQUFDLENBQUM7SUFFSCwwRUFBMEU7SUFDMUUsd0VBQXdFO0lBQ3hFLEVBQUUsQ0FBQywrRkFBK0YsRUFBRSxLQUFLLElBQUksRUFBRTtRQUM3RyxNQUFNLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxHQUFHLFNBQVMsQ0FDMUQsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsQ0FDeEMsQ0FBQztRQUNGLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUVsRCxNQUFNLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUNuRSxNQUFNLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzFELE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUN2QyxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyx5REFBeUQsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN2RSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNsRCxFQUFFLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSw0QkFBNEIsRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFM0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzNCLE1BQU0sTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ25FLHdFQUF3RTtRQUN4RSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsRCxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFVixFQUFFLENBQUMsbURBQW1ELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDakUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDbEQsRUFBRSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUscUJBQXFCLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNqRSxNQUFNLEVBQUUsWUFBWSxFQUFFLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTNDLE1BQU0sTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQ3JFLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIEhhc2hpQ29ycCwgSW5jXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTVBMLTIuMFxuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzLWV4dHJhXCI7XG5pbXBvcnQgKiBhcyBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IHNlZWRUZXJyYWZvcm1DbGlQcm9iZUZvclRlc3RzIH0gZnJvbSBcIi4vdGVycmFmb3JtXCI7XG5cbi8vIFRoZSBiaW5hcnkgbmFtZSBpcyByZWFkIGF0IGltcG9ydCwgc28gZXZlcnkgY2FzZSBsb2FkcyBhIGZyZXNoIG1vZHVsZSB3aXRoXG4vLyBURVJSQUZPUk1fQklOQVJZX05BTUUgcG9pbnRpbmcgYXQgYSBmaXh0dXJlIHNjcmlwdDsgdGhlIHByb2JlIGl0c2VsZiBpc1xuLy8gY2FjaGVkIG9uIGdsb2JhbFRoaXMgYW5kIHJlc2V0IHBlciB0ZXN0LlxuZnVuY3Rpb24gbG9hZFByb2JlKGJpbmFyeTogc3RyaW5nKSB7XG4gIGNvbnN0IG9yaWdpbmFsID0gcHJvY2Vzcy5lbnYuVEVSUkFGT1JNX0JJTkFSWV9OQU1FO1xuICBwcm9jZXNzLmVudi5URVJSQUZPUk1fQklOQVJZX05BTUUgPSBiaW5hcnk7XG4gIHRyeSB7XG4gICAgbGV0IHRlcnJhZm9ybTogdHlwZW9mIGltcG9ydChcIi4vdGVycmFmb3JtXCIpO1xuICAgIGxldCBzZW50cnk6IHR5cGVvZiBpbXBvcnQoXCJAc2VudHJ5L25vZGVcIik7XG4gICAgamVzdC5pc29sYXRlTW9kdWxlcygoKSA9PiB7XG4gICAgICB0ZXJyYWZvcm0gPSBqZXN0LnJlcXVpcmVBY3R1YWwoXCIuL3RlcnJhZm9ybVwiKTtcbiAgICAgIHNlbnRyeSA9IGplc3QucmVxdWlyZUFjdHVhbChcIkBzZW50cnkvbm9kZVwiKTtcbiAgICB9KTtcbiAgICByZXR1cm4geyAuLi50ZXJyYWZvcm0hLCBzZW50cnk6IHNlbnRyeSEgfTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAob3JpZ2luYWwgPT09IHVuZGVmaW5lZCkgZGVsZXRlIHByb2Nlc3MuZW52LlRFUlJBRk9STV9CSU5BUllfTkFNRTtcbiAgICBlbHNlIHByb2Nlc3MuZW52LlRFUlJBRk9STV9CSU5BUllfTkFNRSA9IG9yaWdpbmFsO1xuICB9XG59XG5cbmRlc2NyaWJlKFwidGVycmFmb3JtIGJpbmFyeSBwcm9iZVwiLCAoKSA9PiB7XG4gIGxldCBmaXh0dXJlRGlyOiBzdHJpbmc7XG4gIGNvbnN0IG9yaWdpbmFsQ2hlY2twb2ludERpc2FibGUgPSBwcm9jZXNzLmVudi5DSEVDS1BPSU5UX0RJU0FCTEU7XG5cbiAgLy8gYCMhL2Jpbi9zaGAgZml4dHVyZXMgYXJlIFBPU0lYLW9ubHkgKENJIHJ1bnMgb24gdWJ1bnR1KVxuICBmdW5jdGlvbiBmYWtlQmluYXJ5KG5hbWU6IHN0cmluZywgb3V0cHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGZpbGUgPSBwYXRoLmpvaW4oZml4dHVyZURpciwgbmFtZSk7XG4gICAgY29uc3QgY2FsbHMgPSBwYXRoLmpvaW4oZml4dHVyZURpciwgYCR7bmFtZX0uY2FsbHNgKTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgZmlsZSxcbiAgICAgIGAjIS9iaW4vc2hcXG5lY2hvIHggPj4gXCIke2NhbGxzfVwiXFxucHJpbnRmICclc1xcXFxuJyBcIiR7b3V0cHV0fVwiXFxuYCxcbiAgICAgIHsgbW9kZTogMG83NTUgfSxcbiAgICApO1xuICAgIHJldHVybiBmaWxlO1xuICB9XG5cbiAgZnVuY3Rpb24gc3Bhd25Db3VudChiaW5hcnk6IHN0cmluZyk6IG51bWJlciB7XG4gICAgY29uc3QgY2FsbHMgPSBgJHtiaW5hcnl9LmNhbGxzYDtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhjYWxscylcbiAgICAgID8gZnMucmVhZEZpbGVTeW5jKGNhbGxzLCBcInV0ZjhcIikudHJpbSgpLnNwbGl0KFwiXFxuXCIpLmxlbmd0aFxuICAgICAgOiAwO1xuICB9XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgZml4dHVyZURpciA9IGZzLm1rZHRlbXBTeW5jKHBhdGguam9pbihvcy50bXBkaXIoKSwgXCJjZGt0bi10Zi1wcm9iZS1cIikpO1xuICAgIHNlZWRUZXJyYWZvcm1DbGlQcm9iZUZvclRlc3RzKCk7XG4gICAgZGVsZXRlIHByb2Nlc3MuZW52LkNIRUNLUE9JTlRfRElTQUJMRTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICBmcy5yZW1vdmVTeW5jKGZpeHR1cmVEaXIpO1xuICAgIHNlZWRUZXJyYWZvcm1DbGlQcm9iZUZvclRlc3RzKCk7XG4gICAgaWYgKG9yaWdpbmFsQ2hlY2twb2ludERpc2FibGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVsZXRlIHByb2Nlc3MuZW52LkNIRUNLUE9JTlRfRElTQUJMRTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvY2Vzcy5lbnYuQ0hFQ0tQT0lOVF9ESVNBQkxFID0gb3JpZ2luYWxDaGVja3BvaW50RGlzYWJsZTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KFwic3Bhd25zIHBsYWluIGB2ZXJzaW9uYCBvbmNlIHBlciBwcm9jZXNzLCBvbiBmaXJzdCB1c2UsIGFjcm9zcyBtb2R1bGUgY29waWVzLCBhbmQgcGFyc2VzIGl0XCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBiaW5hcnkgPSBmYWtlQmluYXJ5KFxuICAgICAgXCJ0ZXJyYWZvcm1cIixcbiAgICAgIFwiVGVycmFmb3JtIHYxLjEyLjZcXG5vbiBkYXJ3aW5fYXJtNjRcXG5cXG5Zb3VyIHZlcnNpb24gb2YgVGVycmFmb3JtIGlzIG91dCBvZiBkYXRlIVwiLFxuICAgICk7XG4gICAgY29uc3QgZmlyc3QgPSBsb2FkUHJvYmUoYmluYXJ5KTtcbiAgICBjb25zdCBzZWNvbmQgPSBsb2FkUHJvYmUoYmluYXJ5KTtcbiAgICBleHBlY3Qoc3Bhd25Db3VudChiaW5hcnkpKS50b0JlKDApO1xuXG4gICAgY29uc3QgW3Byb2JlLCAsIHZlcnNpb25dID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZmlyc3QudGVycmFmb3JtQ2xpKCksXG4gICAgICBzZWNvbmQudGVycmFmb3JtQ2xpKCksXG4gICAgICBmaXJzdC50ZXJyYWZvcm1WZXJzaW9uKCksXG4gICAgICBzZWNvbmQudGVycmFmb3JtVmVyc2lvbigpLFxuICAgIF0pO1xuICAgIGV4cGVjdChwcm9iZSkudG9FcXVhbCh7IG5hbWU6IFwidGVycmFmb3JtXCIsIHZlcnNpb246IFwiMS4xMi42XCIgfSk7XG4gICAgZXhwZWN0KHZlcnNpb24pLnRvQmUoXCIxLjEyLjZcIik7XG4gICAgYXdhaXQgZXhwZWN0KHNlY29uZC50ZXJyYWZvcm1DbGkoKSkucmVzb2x2ZXMudG9FcXVhbChwcm9iZSk7XG4gICAgZXhwZWN0KHNwYXduQ291bnQoYmluYXJ5KSkudG9CZSgxKTtcbiAgfSk7XG5cbiAgLy8gdGhlIHByb2JlIGlzIHNoYXJlZCBieSBldmVyeSBjb25zdW1lciBpbiB0aGUgcHJvY2VzczogYSByZWplY3Rpb24gd291bGRcbiAgLy8gc3VyZmFjZSBvbiBldmVyeSBjb21tYW5kLCBhbmQgYGNka3RuIGRlYnVnYCBwcmludHMgdGhlIHJlc29sdmVkIHZhbHVlXG4gIGl0KFwicmVzb2x2ZXMgdG8gbWlzc2luZyAobmV2ZXIgcmVqZWN0cykgYW5kIGNvdW50cyBubyBjbGkuZXJyb3Igd2hlbiB0aGUgYmluYXJ5IGNhbm5vdCBiZSBzcGF3bmVkXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IHRlcnJhZm9ybUNsaSwgdGVycmFmb3JtVmVyc2lvbiwgc2VudHJ5IH0gPSBsb2FkUHJvYmUoXG4gICAgICBwYXRoLmpvaW4oZml4dHVyZURpciwgXCJkb2VzLW5vdC1leGlzdFwiKSxcbiAgICApO1xuICAgIGNvbnN0IGNvdW50ID0gamVzdC5zcHlPbihzZW50cnkubWV0cmljcywgXCJjb3VudFwiKTtcblxuICAgIGF3YWl0IGV4cGVjdCh0ZXJyYWZvcm1DbGkoKSkucmVzb2x2ZXMudG9FcXVhbCh7IG5hbWU6IFwibWlzc2luZ1wiIH0pO1xuICAgIGF3YWl0IGV4cGVjdCh0ZXJyYWZvcm1WZXJzaW9uKCkpLnJlc29sdmVzLnRvQmVVbmRlZmluZWQoKTtcbiAgICBleHBlY3QoY291bnQpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xuXG4gIGl0KFwicmVzb2x2ZXMgdG8gdW5rbm93biB3aGVuIGB2ZXJzaW9uYCBvdXRsaXZlcyB0aGUgdGltZW91dFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYmluYXJ5ID0gcGF0aC5qb2luKGZpeHR1cmVEaXIsIFwidGVycmFmb3JtXCIpO1xuICAgIGZzLndyaXRlRmlsZVN5bmMoYmluYXJ5LCBcIiMhL2Jpbi9zaFxcbmV4ZWMgc2xlZXAgMTBcXG5cIiwgeyBtb2RlOiAwbzc1NSB9KTtcbiAgICBjb25zdCB7IHRlcnJhZm9ybUNsaSB9ID0gbG9hZFByb2JlKGJpbmFyeSk7XG5cbiAgICBjb25zdCBzdGFydGVkID0gRGF0ZS5ub3coKTtcbiAgICBhd2FpdCBleHBlY3QodGVycmFmb3JtQ2xpKCkpLnJlc29sdmVzLnRvRXF1YWwoeyBuYW1lOiBcInVua25vd25cIiB9KTtcbiAgICAvLyB3ZWxsIHVuZGVyIHRoZSBmaXh0dXJlJ3MgMTBzIHNsZWVwOiB0aGUgcHJvYmUgd2FzIGtpbGxlZCwgbm90IGF3YWl0ZWRcbiAgICBleHBlY3QoRGF0ZS5ub3coKSAtIHN0YXJ0ZWQpLnRvQmVMZXNzVGhhbig5MDAwKTtcbiAgfSwgMTUwMDApO1xuXG4gIGl0KFwicmVzb2x2ZXMgdG8gdW5rbm93biB3aGVuIGB2ZXJzaW9uYCBleGl0cyBub24temVyb1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYmluYXJ5ID0gcGF0aC5qb2luKGZpeHR1cmVEaXIsIFwidGVycmFmb3JtXCIpO1xuICAgIGZzLndyaXRlRmlsZVN5bmMoYmluYXJ5LCBcIiMhL2Jpbi9zaFxcbmV4aXQgMVxcblwiLCB7IG1vZGU6IDBvNzU1IH0pO1xuICAgIGNvbnN0IHsgdGVycmFmb3JtQ2xpIH0gPSBsb2FkUHJvYmUoYmluYXJ5KTtcblxuICAgIGF3YWl0IGV4cGVjdCh0ZXJyYWZvcm1DbGkoKSkucmVzb2x2ZXMudG9FcXVhbCh7IG5hbWU6IFwidW5rbm93blwiIH0pO1xuICB9KTtcbn0pO1xuIl19
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cdktn/commons",
|
|
3
|
-
"version": "0.25.0-pre.
|
|
3
|
+
"version": "0.25.0-pre.54",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
],
|
|
30
30
|
"license": "MPL-2.0",
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@sentry/node": "
|
|
32
|
+
"@sentry/node": "10.73.0",
|
|
33
33
|
"ci-info": "4.4.0",
|
|
34
34
|
"codemaker": "1.140.0",
|
|
35
35
|
"cross-spawn": "7.0.6",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"semver": "7.8.5",
|
|
40
40
|
"strip-ansi": "6.0.1",
|
|
41
41
|
"validator": "13.15.35",
|
|
42
|
-
"cdktn": "0.25.0-pre.
|
|
42
|
+
"cdktn": "0.25.0-pre.54"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
45
|
"@types/node": "22.20.1",
|
package/build/checkpoint.d.ts
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
export interface ReportParams {
|
|
2
|
-
dateTime?: Date;
|
|
3
|
-
arch?: string;
|
|
4
|
-
os?: string;
|
|
5
|
-
payload: Record<string, any>;
|
|
6
|
-
product: string;
|
|
7
|
-
runID?: string;
|
|
8
|
-
version?: string;
|
|
9
|
-
command?: string;
|
|
10
|
-
language?: string;
|
|
11
|
-
userId?: string;
|
|
12
|
-
ci?: string;
|
|
13
|
-
projectId?: string;
|
|
14
|
-
}
|
|
15
|
-
export declare function sendTelemetry(command: string, payload: Record<string, any>): Promise<void>;
|
|
16
|
-
export declare function getProjectId(projectPath?: string): string;
|
|
17
|
-
export declare function getUserId(): string;
|
|
18
|
-
export declare function ReportRequest(reportParams: ReportParams): Promise<void>;
|
|
19
|
-
//# sourceMappingURL=checkpoint.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"checkpoint.d.ts","sourceRoot":"","sources":["../src/checkpoint.ts"],"names":[],"mappings":"AA2BA,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,IAAI,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAqCD,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,iBAgB7B;AAuCD,wBAAgB,YAAY,CAAC,WAAW,SAAgB,GAAG,MAAM,CAEhE;AAED,wBAAgB,SAAS,IAAI,MAAM,CAWlC;AAED,wBAAsB,aAAa,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAiD7E"}
|
package/build/checkpoint.js
DELETED
|
@@ -1,185 +0,0 @@
|
|
|
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 () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
-
};
|
|
38
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.sendTelemetry = sendTelemetry;
|
|
40
|
-
exports.getProjectId = getProjectId;
|
|
41
|
-
exports.getUserId = getUserId;
|
|
42
|
-
exports.ReportRequest = ReportRequest;
|
|
43
|
-
// Copyright (c) HashiCorp, Inc
|
|
44
|
-
// SPDX-License-Identifier: MPL-2.0
|
|
45
|
-
const https = __importStar(require("https"));
|
|
46
|
-
const url_1 = require("url");
|
|
47
|
-
const node_crypto_1 = require("node:crypto");
|
|
48
|
-
const os = __importStar(require("os"));
|
|
49
|
-
const ci_info_1 = __importDefault(require("ci-info"));
|
|
50
|
-
const logging_1 = require("./logging");
|
|
51
|
-
const path = __importStar(require("path"));
|
|
52
|
-
const fs = __importStar(require("fs-extra"));
|
|
53
|
-
const version_1 = require("./version");
|
|
54
|
-
const BASE_URL = `https://checkpoint-api.hashicorp.com/v1/`;
|
|
55
|
-
const VALID_STATUS_CODES = [200, 201];
|
|
56
|
-
const MAX_REQUEST_BODY_SIZE = 8192;
|
|
57
|
-
function homeDir() {
|
|
58
|
-
var _a;
|
|
59
|
-
return process.env.CDKTF_HOME
|
|
60
|
-
? path.resolve(process.env.CDKTF_HOME)
|
|
61
|
-
: path.join(((_a = os.userInfo().homedir) !== null && _a !== void 0 ? _a : os.homedir()).trim() || "/", ".cdktf");
|
|
62
|
-
}
|
|
63
|
-
async function post(url, data) {
|
|
64
|
-
return new Promise((ok, ko) => {
|
|
65
|
-
const req = https.request((0, url_1.format)(url), {
|
|
66
|
-
headers: {
|
|
67
|
-
Accept: "application/json",
|
|
68
|
-
"Content-Length": data.length,
|
|
69
|
-
"User-Agent": "OpenConstructs/cdktn-cli",
|
|
70
|
-
},
|
|
71
|
-
method: "POST",
|
|
72
|
-
}, (res) => {
|
|
73
|
-
if (res.statusCode) {
|
|
74
|
-
const statusCode = res.statusCode;
|
|
75
|
-
if (!VALID_STATUS_CODES.includes(statusCode)) {
|
|
76
|
-
return ko(new Error(res.statusMessage));
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
const data = new Array();
|
|
80
|
-
res.on("data", (chunk) => data.push(chunk));
|
|
81
|
-
res.on("error", (err) => ko(err));
|
|
82
|
-
res.on("end", () => {
|
|
83
|
-
return ok();
|
|
84
|
-
});
|
|
85
|
-
});
|
|
86
|
-
req.setTimeout(1000, () => ko(new Error("request timeout")));
|
|
87
|
-
req.write(data);
|
|
88
|
-
req.end();
|
|
89
|
-
req.on("error", (err) => ko(err));
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
async function sendTelemetry(command, payload) {
|
|
93
|
-
const reportParams = {
|
|
94
|
-
command,
|
|
95
|
-
product: "cdktn",
|
|
96
|
-
version: `${version_1.DISPLAY_VERSION}`,
|
|
97
|
-
dateTime: new Date(),
|
|
98
|
-
language: payload.language,
|
|
99
|
-
payload,
|
|
100
|
-
};
|
|
101
|
-
try {
|
|
102
|
-
await ReportRequest(reportParams);
|
|
103
|
-
}
|
|
104
|
-
catch (err) {
|
|
105
|
-
logging_1.logger.error(`Could not send telemetry data: ${err}`);
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
function getId(filePath, key, forceCreation = false, explanatoryComment) {
|
|
109
|
-
const _uuid = (0, node_crypto_1.randomUUID)(); // create a new UUID in case we don't find one
|
|
110
|
-
let jsonFile;
|
|
111
|
-
try {
|
|
112
|
-
jsonFile = JSON.parse(fs.readFileSync(filePath, "utf-8")); // we found the file
|
|
113
|
-
}
|
|
114
|
-
catch (_a) {
|
|
115
|
-
// we found no file, create one if we're forcing a creation
|
|
116
|
-
if (forceCreation) {
|
|
117
|
-
const _idFile = {}; // compose JSON id file in case we don't find one
|
|
118
|
-
if (explanatoryComment) {
|
|
119
|
-
_idFile["//"] = explanatoryComment.replace(/\n/g, " ");
|
|
120
|
-
}
|
|
121
|
-
_idFile[key] = _uuid;
|
|
122
|
-
fs.ensureDirSync(path.dirname(filePath));
|
|
123
|
-
fs.writeFileSync(filePath, JSON.stringify(_idFile, null, 2));
|
|
124
|
-
}
|
|
125
|
-
return _uuid;
|
|
126
|
-
}
|
|
127
|
-
if (jsonFile[key]) {
|
|
128
|
-
return jsonFile[key]; // we found an id
|
|
129
|
-
}
|
|
130
|
-
else {
|
|
131
|
-
// we found no id, we add it to the file for future use
|
|
132
|
-
fs.writeFileSync(filePath, JSON.stringify({ ...jsonFile, [key]: _uuid }, null, 2));
|
|
133
|
-
return _uuid;
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
function getProjectId(projectPath = process.cwd()) {
|
|
137
|
-
return getId(path.resolve(projectPath, "cdktf.json"), "projectId");
|
|
138
|
-
}
|
|
139
|
-
function getUserId() {
|
|
140
|
-
return getId(path.resolve(homeDir(), "config.json"), "userId", true, `This signature is a randomly generated UUID used to anonymously differentiate users in telemetry data order to inform product direction.
|
|
141
|
-
This signature is random, it is not based on any personally identifiable information.
|
|
142
|
-
To create a new signature, you can simply delete this file at any time.
|
|
143
|
-
See https://cdktn.io/docs/telemetry for more
|
|
144
|
-
information on how to disable it.`);
|
|
145
|
-
}
|
|
146
|
-
async function ReportRequest(reportParams) {
|
|
147
|
-
// we won't report when checkpoint is disabled.
|
|
148
|
-
// Check at runtime (not import time) to allow tests to modify the env var
|
|
149
|
-
if (process.env.CHECKPOINT_DISABLE) {
|
|
150
|
-
return;
|
|
151
|
-
}
|
|
152
|
-
if (!reportParams.runID) {
|
|
153
|
-
reportParams.runID = (0, node_crypto_1.randomUUID)();
|
|
154
|
-
}
|
|
155
|
-
if (!reportParams.dateTime) {
|
|
156
|
-
reportParams.dateTime = new Date();
|
|
157
|
-
}
|
|
158
|
-
if (!reportParams.arch) {
|
|
159
|
-
reportParams.arch = os.arch();
|
|
160
|
-
}
|
|
161
|
-
if (!reportParams.os) {
|
|
162
|
-
reportParams.os = os.platform();
|
|
163
|
-
}
|
|
164
|
-
const ci = ci_info_1.default.isCI ? ci_info_1.default.name || "unknown" : false;
|
|
165
|
-
if (!reportParams.userId && !ci) {
|
|
166
|
-
reportParams.userId = getUserId();
|
|
167
|
-
}
|
|
168
|
-
if (ci) {
|
|
169
|
-
reportParams.ci = ci;
|
|
170
|
-
}
|
|
171
|
-
reportParams.projectId = reportParams.projectId || getProjectId();
|
|
172
|
-
const postData = JSON.stringify(reportParams);
|
|
173
|
-
if (postData.length > MAX_REQUEST_BODY_SIZE) {
|
|
174
|
-
logging_1.logger.warn(`Skipped sending telemetry as the request body size was ${postData.length} bytes. The limit is ${MAX_REQUEST_BODY_SIZE} bytes`);
|
|
175
|
-
return;
|
|
176
|
-
}
|
|
177
|
-
try {
|
|
178
|
-
await post(`${BASE_URL}telemetry/${reportParams.product}`, postData);
|
|
179
|
-
}
|
|
180
|
-
catch (e) {
|
|
181
|
-
// Log errors writing to checkpoint
|
|
182
|
-
(0, logging_1.processLoggerError)(e.message);
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2twb2ludC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jaGVja3BvaW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNkVBLHNDQWtCQztBQXVDRCxvQ0FFQztBQUVELDhCQVdDO0FBRUQsc0NBaURDO0FBeE1ELCtCQUErQjtBQUMvQixtQ0FBbUM7QUFDbkMsNkNBQStCO0FBQy9CLDZCQUE2QjtBQUM3Qiw2Q0FBeUM7QUFDekMsdUNBQXlCO0FBQ3pCLHNEQUE2QjtBQUM3Qix1Q0FBdUQ7QUFDdkQsMkNBQTZCO0FBQzdCLDZDQUErQjtBQUMvQix1Q0FBNEM7QUFFNUMsTUFBTSxRQUFRLEdBQUcsMENBQTBDLENBQUM7QUFFNUQsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUV0QyxNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQztBQUVuQyxTQUFTLE9BQU87O0lBQ2QsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVU7UUFDM0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUM7UUFDdEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ1AsQ0FBQyxNQUFBLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLG1DQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEdBQUcsRUFDckQsUUFBUSxDQUNULENBQUM7QUFDUixDQUFDO0FBaUJELEtBQUssVUFBVSxJQUFJLENBQUMsR0FBVyxFQUFFLElBQVk7SUFDM0MsT0FBTyxJQUFJLE9BQU8sQ0FBTyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtRQUNsQyxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUN2QixJQUFBLFlBQU0sRUFBQyxHQUFHLENB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QUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUU5QyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcscUJBQXFCLEVBQUUsQ0FBQztRQUM1QyxnQkFBTSxDQUFDLElBQUksQ0FDVCwwREFBMEQsUUFBUSxDQUFDLE1BQU0sd0JBQXdCLHFCQUFxQixRQUFRLENBQy9ILENBQUM7UUFDRixPQUFPO0lBQ1QsQ0FBQztJQUVELElBQUksQ0FBQztRQUNILE1BQU0sSUFBSSxDQUFDLEdBQUcsUUFBUSxhQUFhLFlBQVksQ0FBQyxPQUFPLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztRQUNoQixtQ0FBbUM7UUFDbkMsSUFBQSw0QkFBa0IsRUFBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEMsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIEhhc2hpQ29ycCwgSW5jXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTVBMLTIuMFxuaW1wb3J0ICogYXMgaHR0cHMgZnJvbSBcImh0dHBzXCI7XG5pbXBvcnQgeyBmb3JtYXQgfSBmcm9tIFwidXJsXCI7XG5pbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQgKiBhcyBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCBjaUluZm8gZnJvbSBcImNpLWluZm9cIjtcbmltcG9ydCB7IGxvZ2dlciwgcHJvY2Vzc0xvZ2dlckVycm9yIH0gZnJvbSBcIi4vbG9nZ2luZ1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzLWV4dHJhXCI7XG5pbXBvcnQgeyBESVNQTEFZX1ZFUlNJT04gfSBmcm9tIFwiLi92ZXJzaW9uXCI7XG5cbmNvbnN0IEJBU0VfVVJMID0gYGh0dHBzOi8vY2hlY2twb2ludC1hcGkuaGFzaGljb3JwLmNvbS92MS9gO1xuXG5jb25zdCBWQUxJRF9TVEFUVVNfQ09ERVMgPSBbMjAwLCAyMDFdO1xuXG5jb25zdCBNQVhfUkVRVUVTVF9CT0RZX1NJWkUgPSA4MTkyO1xuXG5mdW5jdGlvbiBob21lRGlyKCkge1xuICByZXR1cm4gcHJvY2Vzcy5lbnYuQ0RLVEZfSE9NRVxuICAgID8gcGF0aC5yZXNvbHZlKHByb2Nlc3MuZW52LkNES1RGX0hPTUUpXG4gICAgOiBwYXRoLmpvaW4oXG4gICAgICAgIChvcy51c2VySW5mbygpLmhvbWVkaXIgPz8gb3MuaG9tZWRpcigpKS50cmltKCkgfHwgXCIvXCIsXG4gICAgICAgIFwiLmNka3RmXCIsXG4gICAgICApO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydFBhcmFtcyB7XG4gIGRhdGVUaW1lPzogRGF0ZTtcbiAgYXJjaD86IHN0cmluZztcbiAgb3M/OiBzdHJpbmc7XG4gIHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIHByb2R1Y3Q6IHN0cmluZztcbiAgcnVuSUQ/OiBzdHJpbmc7XG4gIHZlcnNpb24/OiBzdHJpbmc7XG4gIGNvbW1hbmQ/OiBzdHJpbmc7XG4gIGxhbmd1YWdlPzogc3RyaW5nO1xuICB1c2VySWQ/OiBzdHJpbmc7XG4gIGNpPzogc3RyaW5nO1xuICBwcm9qZWN0SWQ/OiBzdHJpbmc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHBvc3QodXJsOiBzdHJpbmcsIGRhdGE6IHN0cmluZykge1xuICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKG9rLCBrbykgPT4ge1xuICAgIGNvbnN0IHJlcSA9IGh0dHBzLnJlcXVlc3QoXG4gICAgICBmb3JtYXQodXJsKSxcbiAgICAgIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgXCJDb250ZW50LUxlbmd0aFwiOiBkYXRhLmxlbmd0aCxcbiAgICAgICAgICBcIlVzZXItQWdlbnRcIjogXCJPcGVuQ29uc3RydWN0cy9jZGt0bi1jbGlcIixcbiAgICAgICAgfSxcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIH0sXG4gICAgICAocmVzKSA9PiB7XG4gICAgICAgIGlmIChyZXMuc3RhdHVzQ29kZSkge1xuICAgICAgICAgIGNvbnN0IHN0YXR1c0NvZGUgPSByZXMuc3RhdHVzQ29kZTtcbiAgICAgICAgICBpZiAoIVZBTElEX1NUQVRVU19DT0RFUy5pbmNsdWRlcyhzdGF0dXNDb2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGtvKG5ldyBFcnJvcihyZXMuc3RhdHVzTWVzc2FnZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXRhID0gbmV3IEFycmF5PEJ1ZmZlcj4oKTtcbiAgICAgICAgcmVzLm9uKFwiZGF0YVwiLCAoY2h1bmspID0+IGRhdGEucHVzaChjaHVuaykpO1xuICAgICAgICByZXMub24oXCJlcnJvclwiLCAoZXJyKSA9PiBrbyhlcnIpKTtcbiAgICAgICAgcmVzLm9uKFwiZW5kXCIsICgpID0+IHtcbiAgICAgICAgICByZXR1cm4gb2soKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICByZXEuc2V0VGltZW91dCgxMDAwLCAoKSA9PiBrbyhuZXcgRXJyb3IoXCJyZXF1ZXN0IHRpbWVvdXRcIikpKTtcbiAgICByZXEud3JpdGUoZGF0YSk7XG4gICAgcmVxLmVuZCgpO1xuICAgIHJlcS5vbihcImVycm9yXCIsIChlcnIpID0+IGtvKGVycikpO1xuICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlbmRUZWxlbWV0cnkoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgcGF5bG9hZDogUmVjb3JkPHN0cmluZywgYW55Pixcbikge1xuICBjb25zdCByZXBvcnRQYXJhbXM6IFJlcG9ydFBhcmFtcyA9IHtcbiAgICBjb21tYW5kLFxuICAgIHByb2R1Y3Q6IFwiY2RrdG5cIixcbiAgICB2ZXJzaW9uOiBgJHtESVNQTEFZX1ZFUlNJT059YCxcbiAgICBkYXRlVGltZTogbmV3IERhdGUoKSxcbiAgICBsYW5ndWFnZTogcGF5bG9hZC5sYW5ndWFnZSxcbiAgICBwYXlsb2FkLFxuICB9O1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgUmVwb3J0UmVxdWVzdChyZXBvcnRQYXJhbXMpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIuZXJyb3IoYENvdWxkIG5vdCBzZW5kIHRlbGVtZXRyeSBkYXRhOiAke2Vycn1gKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRJZChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAga2V5OiBzdHJpbmcsXG4gIGZvcmNlQ3JlYXRpb24gPSBmYWxzZSxcbiAgZXhwbGFuYXRvcnlDb21tZW50Pzogc3RyaW5nLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgX3V1aWQgPSByYW5kb21VVUlEKCk7IC8vIGNyZWF0ZSBhIG5ldyBVVUlEIGluIGNhc2Ugd2UgZG9uJ3QgZmluZCBvbmVcblxuICBsZXQganNvbkZpbGU7XG4gIHRyeSB7XG4gICAganNvbkZpbGUgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgXCJ1dGYtOFwiKSk7IC8vIHdlIGZvdW5kIHRoZSBmaWxlXG4gIH0gY2F0Y2gge1xuICAgIC8vIHdlIGZvdW5kIG5vIGZpbGUsIGNyZWF0ZSBvbmUgaWYgd2UncmUgZm9yY2luZyBhIGNyZWF0aW9uXG4gICAgaWYgKGZvcmNlQ3JlYXRpb24pIHtcbiAgICAgIGNvbnN0IF9pZEZpbGUgPSB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+OyAvLyBjb21wb3NlIEpTT04gaWQgZmlsZSBpbiBjYXNlIHdlIGRvbid0IGZpbmQgb25lXG4gICAgICBpZiAoZXhwbGFuYXRvcnlDb21tZW50KSB7XG4gICAgICAgIF9pZEZpbGVbXCIvL1wiXSA9IGV4cGxhbmF0b3J5Q29tbWVudC5yZXBsYWNlKC9cXG4vZywgXCIgXCIpO1xuICAgICAgfVxuICAgICAgX2lkRmlsZVtrZXldID0gX3V1aWQ7XG4gICAgICBmcy5lbnN1cmVEaXJTeW5jKHBhdGguZGlybmFtZShmaWxlUGF0aCkpO1xuICAgICAgZnMud3JpdGVGaWxlU3luYyhmaWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkoX2lkRmlsZSwgbnVsbCwgMikpO1xuICAgIH1cbiAgICByZXR1cm4gX3V1aWQ7XG4gIH1cblxuICBpZiAoanNvbkZpbGVba2V5XSkge1xuICAgIHJldHVybiBqc29uRmlsZVtrZXldOyAvLyB3ZSBmb3VuZCBhbiBpZFxuICB9IGVsc2Uge1xuICAgIC8vIHdlIGZvdW5kIG5vIGlkLCB3ZSBhZGQgaXQgdG8gdGhlIGZpbGUgZm9yIGZ1dHVyZSB1c2VcbiAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgZmlsZVBhdGgsXG4gICAgICBKU09OLnN0cmluZ2lmeSh7IC4uLmpzb25GaWxlLCBba2V5XTogX3V1aWQgfSwgbnVsbCwgMiksXG4gICAgKTtcbiAgICByZXR1cm4gX3V1aWQ7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFByb2plY3RJZChwcm9qZWN0UGF0aCA9IHByb2Nlc3MuY3dkKCkpOiBzdHJpbmcge1xuICByZXR1cm4gZ2V0SWQocGF0aC5yZXNvbHZlKHByb2plY3RQYXRoLCBcImNka3RmLmpzb25cIiksIFwicHJvamVjdElkXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VXNlcklkKCk6IHN0cmluZyB7XG4gIHJldHVybiBnZXRJZChcbiAgICBwYXRoLnJlc29sdmUoaG9tZURpcigpLCBcImNvbmZpZy5qc29uXCIpLFxuICAgIFwidXNlcklkXCIsXG4gICAgdHJ1ZSxcbiAgICBgVGhpcyBzaWduYXR1cmUgaXMgYSByYW5kb21seSBnZW5lcmF0ZWQgVVVJRCB1c2VkIHRvIGFub255bW91c2x5IGRpZmZlcmVudGlhdGUgdXNlcnMgaW4gdGVsZW1ldHJ5IGRhdGEgb3JkZXIgdG8gaW5mb3JtIHByb2R1Y3QgZGlyZWN0aW9uLlxuVGhpcyBzaWduYXR1cmUgaXMgcmFuZG9tLCBpdCBpcyBub3QgYmFzZWQgb24gYW55IHBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLlxuVG8gY3JlYXRlIGEgbmV3IHNpZ25hdHVyZSwgeW91IGNhbiBzaW1wbHkgZGVsZXRlIHRoaXMgZmlsZSBhdCBhbnkgdGltZS5cblNlZSBodHRwczovL2Nka3RuLmlvL2RvY3MvdGVsZW1ldHJ5IGZvciBtb3JlXG5pbmZvcm1hdGlvbiBvbiBob3cgdG8gZGlzYWJsZSBpdC5gLFxuICApO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gUmVwb3J0UmVxdWVzdChyZXBvcnRQYXJhbXM6IFJlcG9ydFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAvLyB3ZSB3b24ndCByZXBvcnQgd2hlbiBjaGVja3BvaW50IGlzIGRpc2FibGVkLlxuICAvLyBDaGVjayBhdCBydW50aW1lIChub3QgaW1wb3J0IHRpbWUpIHRvIGFsbG93IHRlc3RzIHRvIG1vZGlmeSB0aGUgZW52IHZhclxuICBpZiAocHJvY2Vzcy5lbnYuQ0hFQ0tQT0lOVF9ESVNBQkxFKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCFyZXBvcnRQYXJhbXMucnVuSUQpIHtcbiAgICByZXBvcnRQYXJhbXMucnVuSUQgPSByYW5kb21VVUlEKCk7XG4gIH1cblxuICBpZiAoIXJlcG9ydFBhcmFtcy5kYXRlVGltZSkge1xuICAgIHJlcG9ydFBhcmFtcy5kYXRlVGltZSA9IG5ldyBEYXRlKCk7XG4gIH1cblxuICBpZiAoIXJlcG9ydFBhcmFtcy5hcmNoKSB7XG4gICAgcmVwb3J0UGFyYW1zLmFyY2ggPSBvcy5hcmNoKCk7XG4gIH1cblxuICBpZiAoIXJlcG9ydFBhcmFtcy5vcykge1xuICAgIHJlcG9ydFBhcmFtcy5vcyA9IG9zLnBsYXRmb3JtKCk7XG4gIH1cblxuICBjb25zdCBjaTogc3RyaW5nIHwgZmFsc2UgPSBjaUluZm8uaXNDSSA/IGNpSW5mby5uYW1lIHx8IFwidW5rbm93blwiIDogZmFsc2U7XG4gIGlmICghcmVwb3J0UGFyYW1zLnVzZXJJZCAmJiAhY2kpIHtcbiAgICByZXBvcnRQYXJhbXMudXNlcklkID0gZ2V0VXNlcklkKCk7XG4gIH1cblxuICBpZiAoY2kpIHtcbiAgICByZXBvcnRQYXJhbXMuY2kgPSBjaTtcbiAgfVxuXG4gIHJlcG9ydFBhcmFtcy5wcm9qZWN0SWQgPSByZXBvcnRQYXJhbXMucHJvamVjdElkIHx8IGdldFByb2plY3RJZCgpO1xuXG4gIGNvbnN0IHBvc3REYXRhID0gSlNPTi5zdHJpbmdpZnkocmVwb3J0UGFyYW1zKTtcblxuICBpZiAocG9zdERhdGEubGVuZ3RoID4gTUFYX1JFUVVFU1RfQk9EWV9TSVpFKSB7XG4gICAgbG9nZ2VyLndhcm4oXG4gICAgICBgU2tpcHBlZCBzZW5kaW5nIHRlbGVtZXRyeSBhcyB0aGUgcmVxdWVzdCBib2R5IHNpemUgd2FzICR7cG9zdERhdGEubGVuZ3RofSBieXRlcy4gVGhlIGxpbWl0IGlzICR7TUFYX1JFUVVFU1RfQk9EWV9TSVpFfSBieXRlc2AsXG4gICAgKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB0cnkge1xuICAgIGF3YWl0IHBvc3QoYCR7QkFTRV9VUkx9dGVsZW1ldHJ5LyR7cmVwb3J0UGFyYW1zLnByb2R1Y3R9YCwgcG9zdERhdGEpO1xuICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAvLyBMb2cgZXJyb3JzIHdyaXRpbmcgdG8gY2hlY2twb2ludFxuICAgIHByb2Nlc3NMb2dnZXJFcnJvcihlLm1lc3NhZ2UpO1xuICB9XG59XG4iXX0=
|