@cdktn/commons 0.25.0-pre.52 → 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.
Files changed (47) hide show
  1. package/build/config.d.ts +5 -0
  2. package/build/config.d.ts.map +1 -1
  3. package/build/config.js +26 -1
  4. package/build/config.test.js +23 -1
  5. package/build/construct-maker-target.d.ts +2 -0
  6. package/build/construct-maker-target.d.ts.map +1 -1
  7. package/build/construct-maker-target.js +3 -1
  8. package/build/debug.d.ts.map +1 -1
  9. package/build/debug.js +13 -15
  10. package/build/debug.test.js +9 -2
  11. package/build/errors.d.ts +3 -0
  12. package/build/errors.d.ts.map +1 -1
  13. package/build/errors.js +31 -23
  14. package/build/errors.test.d.ts +2 -0
  15. package/build/errors.test.d.ts.map +1 -0
  16. package/build/errors.test.js +24 -0
  17. package/build/identity.d.ts +3 -0
  18. package/build/identity.d.ts.map +1 -0
  19. package/build/identity.js +88 -0
  20. package/build/index.d.ts +3 -1
  21. package/build/index.d.ts.map +1 -1
  22. package/build/index.js +4 -2
  23. package/build/node-package-manager.d.ts +15 -0
  24. package/build/node-package-manager.d.ts.map +1 -0
  25. package/build/node-package-manager.js +88 -0
  26. package/build/node-package-manager.test.d.ts +2 -0
  27. package/build/node-package-manager.test.d.ts.map +1 -0
  28. package/build/node-package-manager.test.js +52 -0
  29. package/build/process-state.d.ts +2 -0
  30. package/build/process-state.d.ts.map +1 -0
  31. package/build/process-state.js +15 -0
  32. package/build/telemetry.d.ts +24 -0
  33. package/build/telemetry.d.ts.map +1 -0
  34. package/build/telemetry.js +721 -0
  35. package/build/telemetry.test.d.ts +2 -0
  36. package/build/telemetry.test.d.ts.map +1 -0
  37. package/build/telemetry.test.js +1501 -0
  38. package/build/terraform.d.ts +10 -1
  39. package/build/terraform.d.ts.map +1 -1
  40. package/build/terraform.js +43 -8
  41. package/build/terraform.test.d.ts +2 -0
  42. package/build/terraform.test.d.ts.map +1 -0
  43. package/build/terraform.test.js +136 -0
  44. package/package.json +3 -3
  45. package/build/checkpoint.d.ts +0 -19
  46. package/build/checkpoint.d.ts.map +0 -1
  47. package/build/checkpoint.js +0 -185
@@ -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 declare const terraformVersion: Promise<any>;
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
@@ -1 +1 @@
1
- {"version":3,"file":"terraform.d.ts","sourceRoot":"","sources":["../src/terraform.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,mBAAmB,QACkB,CAAC;AAMnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACjE,YAAY,EACV,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAE/B,eAAO,MAAM,gBAAgB,cAQ1B,CAAC"}
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"}
@@ -1,18 +1,53 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.terraformVersion = exports.parseTerraformCliVersion = exports.terraformBinaryName = void 0;
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 validations_1 = require("cdktn/lib/validations");
14
- Object.defineProperty(exports, "parseTerraformCliVersion", { enumerable: true, get: function () { return validations_1.parseTerraformCliVersion; } });
15
- exports.terraformVersion = (0, util_1.exec)(exports.terraformBinaryName, ["version", "-json"], {})
16
- .then((versionString) => JSON.parse(versionString).terraform_version)
17
- .catch((err) => errors_1.Errors.Usage(`Unknown: Error loading terraform version ${err}`, err));
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVycmFmb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3RlcnJhZm9ybS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQkFBK0I7QUFDL0IsbUNBQW1DO0FBQ25DLHFDQUFrQztBQUNsQyxpQ0FBOEI7QUFFakIsUUFBQSxtQkFBbUIsR0FDOUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsSUFBSSxXQUFXLENBQUM7QUFFbkQsNkVBQTZFO0FBQzdFLDRFQUE0RTtBQUM1RSw0RUFBNEU7QUFDNUUseUVBQXlFO0FBQ3pFLHFEQUFpRTtBQUF4RCx1SEFBQSx3QkFBd0IsT0FBQTtBQU1wQixRQUFBLGdCQUFnQixHQUFHLElBQUEsV0FBSSxFQUNsQywyQkFBbUIsRUFDbkIsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLEVBQ3BCLEVBQUUsQ0FDSDtLQUNFLElBQUksQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQztLQUNwRSxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUNiLGVBQU0sQ0FBQyxLQUFLLENBQUMsNENBQTRDLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUNyRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluY1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbmltcG9ydCB7IEVycm9ycyB9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gXCIuL3V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHRlcnJhZm9ybUJpbmFyeU5hbWUgPVxuICBwcm9jZXNzLmVudi5URVJSQUZPUk1fQklOQVJZX05BTUUgfHwgXCJ0ZXJyYWZvcm1cIjtcblxuLy8gVGhlIFRlcnJhZm9ybSBDTEkgdmVyc2lvbiBwYXJzZXIgbGl2ZXMgaW4gdGhlIGNka3RuIHBhY2thZ2UgKGl0cyBjYW5vbmljYWxcbi8vIGhvbWUpLiBJdCBpcyBjb25zdW1lZCB2aWEgc3VicGF0aCBiZWNhdXNlIGl0cyBzdHJpbmctbGl0ZXJhbCB1bmlvbiByZXR1cm5cbi8vIHR5cGUgaXMgbm90IHBhcnQgb2YgY2RrdG4ncyBwdWJsaWMganNpaSBBUEkuIFJlLWV4cG9ydGVkIGhlcmUgc28gZXhpc3Rpbmdcbi8vIGNvbW1vbnMgY29uc3VtZXJzIChlLmcuIEBjZGt0bi9jbGktY29yZSkga2VlcCBhIHNpbmdsZSBpbXBvcnQgc3VyZmFjZS5cbmV4cG9ydCB7IHBhcnNlVGVycmFmb3JtQ2xpVmVyc2lvbiB9IGZyb20gXCJjZGt0bi9saWIvdmFsaWRhdGlvbnNcIjtcbmV4cG9ydCB0eXBlIHtcbiAgVGVycmFmb3JtQ2xpVmVyc2lvbixcbiAgVGVycmFmb3JtQ2xpTmFtZSxcbn0gZnJvbSBcImNka3RuL2xpYi92YWxpZGF0aW9uc1wiO1xuXG5leHBvcnQgY29uc3QgdGVycmFmb3JtVmVyc2lvbiA9IGV4ZWMoXG4gIHRlcnJhZm9ybUJpbmFyeU5hbWUsXG4gIFtcInZlcnNpb25cIiwgXCItanNvblwiXSxcbiAge30sXG4pXG4gIC50aGVuKCh2ZXJzaW9uU3RyaW5nKSA9PiBKU09OLnBhcnNlKHZlcnNpb25TdHJpbmcpLnRlcnJhZm9ybV92ZXJzaW9uKVxuICAuY2F0Y2goKGVycikgPT5cbiAgICBFcnJvcnMuVXNhZ2UoYFVua25vd246IEVycm9yIGxvYWRpbmcgdGVycmFmb3JtIHZlcnNpb24gJHtlcnJ9YCwgZXJyKSxcbiAgKTtcbiJdfQ==
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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=terraform.test.d.ts.map
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVycmFmb3JtLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdGVycmFmb3JtLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQkFBK0I7QUFDL0IsbUNBQW1DO0FBQ25DLDZDQUErQjtBQUMvQix1Q0FBeUI7QUFDekIsMkNBQTZCO0FBQzdCLDJDQUE0RDtBQUU1RCw2RUFBNkU7QUFDN0UsMEVBQTBFO0FBQzFFLDJDQUEyQztBQUMzQyxTQUFTLFNBQVMsQ0FBQyxNQUFjO0lBQy9CLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUM7SUFDbkQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsR0FBRyxNQUFNLENBQUM7SUFDM0MsSUFBSSxDQUFDO1FBQ0gsSUFBSSxTQUF1QyxDQUFDO1FBQzVDLElBQUksTUFBcUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRTtZQUN2QixTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUM5QyxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sRUFBRSxHQUFHLFNBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTyxFQUFFLENBQUM7SUFDNUMsQ0FBQztZQUFTLENBQUM7UUFDVCxJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQUUsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDOztZQUNoRSxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixHQUFHLFFBQVEsQ0FBQztJQUNwRCxDQUFDO0FBQ0gsQ0FBQztBQUVELFFBQVEsQ0FBQyx3QkFBd0IsRUFBRSxHQUFHLEVBQUU7SUFDdEMsSUFBSSxVQUFrQixDQUFDO0lBQ3ZCLE1BQU0seUJB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O1FBQzNCLE1BQU0sTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ25FLHdFQUF3RTtRQUN4RSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsRCxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFVixFQUFFLENBQUMsbURBQW1ELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDakUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDbEQsRUFBRSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUscUJBQXFCLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNqRSxNQUFNLEVBQUUsWUFBWSxFQUFFLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTNDLE1BQU0sTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQ3JFLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIEhhc2hpQ29ycCwgSW5jXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTVBMLTIuMFxuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzLWV4dHJhXCI7XG5pbXBvcnQgKiBhcyBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IHNlZWRUZXJyYWZvcm1DbGlQcm9iZUZvclRlc3RzIH0gZnJvbSBcIi4vdGVycmFmb3JtXCI7XG5cbi8vIFRoZSBiaW5hcnkgbmFtZSBpcyByZWFkIGF0IGltcG9ydCwgc28gZXZlcnkgY2FzZSBsb2FkcyBhIGZyZXNoIG1vZHVsZSB3aXRoXG4vLyBURVJSQUZPUk1fQklOQVJZX05BTUUgcG9pbnRpbmcgYXQgYSBmaXh0dXJlIHNjcmlwdDsgdGhlIHByb2JlIGl0c2VsZiBpc1xuLy8gY2FjaGVkIG9uIGdsb2JhbFRoaXMgYW5kIHJlc2V0IHBlciB0ZXN0LlxuZnVuY3Rpb24gbG9hZFByb2JlKGJpbmFyeTogc3RyaW5nKSB7XG4gIGNvbnN0IG9yaWdpbmFsID0gcHJvY2Vzcy5lbnYuVEVSUkFGT1JNX0JJTkFSWV9OQU1FO1xuICBwcm9jZXNzLmVudi5URVJSQUZPUk1fQklOQVJZX05BTUUgPSBiaW5hcnk7XG4gIHRyeSB7XG4gICAgbGV0IHRlcnJhZm9ybTogdHlwZW9mIGltcG9ydChcIi4vdGVycmFmb3JtXCIpO1xuICAgIGxldCBzZW50cnk6IHR5cGVvZiBpbXBvcnQoXCJAc2VudHJ5L25vZGVcIik7XG4gICAgamVzdC5pc29sYXRlTW9kdWxlcygoKSA9PiB7XG4gICAgICB0ZXJyYWZvcm0gPSBqZXN0LnJlcXVpcmVBY3R1YWwoXCIuL3RlcnJhZm9ybVwiKTtcbiAgICAgIHNlbnRyeSA9IGplc3QucmVxdWlyZUFjdHVhbChcIkBzZW50cnkvbm9kZVwiKTtcbiAgICB9KTtcbiAgICByZXR1cm4geyAuLi50ZXJyYWZvcm0hLCBzZW50cnk6IHNlbnRyeSEgfTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAob3JpZ2luYWwgPT09IHVuZGVmaW5lZCkgZGVsZXRlIHByb2Nlc3MuZW52LlRFUlJBRk9STV9CSU5BUllfTkFNRTtcbiAgICBlbHNlIHByb2Nlc3MuZW52LlRFUlJBRk9STV9CSU5BUllfTkFNRSA9IG9yaWdpbmFsO1xuICB9XG59XG5cbmRlc2NyaWJlKFwidGVycmFmb3JtIGJpbmFyeSBwcm9iZVwiLCAoKSA9PiB7XG4gIGxldCBmaXh0dXJlRGlyOiBzdHJpbmc7XG4gIGNvbnN0IG9yaWdpbmFsQ2hlY2twb2ludERpc2FibGUgPSBwcm9jZXNzLmVudi5DSEVDS1BPSU5UX0RJU0FCTEU7XG5cbiAgLy8gYCMhL2Jpbi9zaGAgZml4dHVyZXMgYXJlIFBPU0lYLW9ubHkgKENJIHJ1bnMgb24gdWJ1bnR1KVxuICBmdW5jdGlvbiBmYWtlQmluYXJ5KG5hbWU6IHN0cmluZywgb3V0cHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGZpbGUgPSBwYXRoLmpvaW4oZml4dHVyZURpciwgbmFtZSk7XG4gICAgY29uc3QgY2FsbHMgPSBwYXRoLmpvaW4oZml4dHVyZURpciwgYCR7bmFtZX0uY2FsbHNgKTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgZmlsZSxcbiAgICAgIGAjIS9iaW4vc2hcXG5lY2hvIHggPj4gXCIke2NhbGxzfVwiXFxucHJpbnRmICclc1xcXFxuJyBcIiR7b3V0cHV0fVwiXFxuYCxcbiAgICAgIHsgbW9kZTogMG83NTUgfSxcbiAgICApO1xuICAgIHJldHVybiBmaWxlO1xuICB9XG5cbiAgZnVuY3Rpb24gc3Bhd25Db3VudChiaW5hcnk6IHN0cmluZyk6IG51bWJlciB7XG4gICAgY29uc3QgY2FsbHMgPSBgJHtiaW5hcnl9LmNhbGxzYDtcbiAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhjYWxscylcbiAgICAgID8gZnMucmVhZEZpbGVTeW5jKGNhbGxzLCBcInV0ZjhcIikudHJpbSgpLnNwbGl0KFwiXFxuXCIpLmxlbmd0aFxuICAgICAgOiAwO1xuICB9XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgZml4dHVyZURpciA9IGZzLm1rZHRlbXBTeW5jKHBhdGguam9pbihvcy50bXBkaXIoKSwgXCJjZGt0bi10Zi1wcm9iZS1cIikpO1xuICAgIHNlZWRUZXJyYWZvcm1DbGlQcm9iZUZvclRlc3RzKCk7XG4gICAgZGVsZXRlIHByb2Nlc3MuZW52LkNIRUNLUE9JTlRfRElTQUJMRTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICBmcy5yZW1vdmVTeW5jKGZpeHR1cmVEaXIpO1xuICAgIHNlZWRUZXJyYWZvcm1DbGlQcm9iZUZvclRlc3RzKCk7XG4gICAgaWYgKG9yaWdpbmFsQ2hlY2twb2ludERpc2FibGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVsZXRlIHByb2Nlc3MuZW52LkNIRUNLUE9JTlRfRElTQUJMRTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvY2Vzcy5lbnYuQ0hFQ0tQT0lOVF9ESVNBQkxFID0gb3JpZ2luYWxDaGVja3BvaW50RGlzYWJsZTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KFwic3Bhd25zIHBsYWluIGB2ZXJzaW9uYCBvbmNlIHBlciBwcm9jZXNzLCBvbiBmaXJzdCB1c2UsIGFjcm9zcyBtb2R1bGUgY29waWVzLCBhbmQgcGFyc2VzIGl0XCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBiaW5hcnkgPSBmYWtlQmluYXJ5KFxuICAgICAgXCJ0ZXJyYWZvcm1cIixcbiAgICAgIFwiVGVycmFmb3JtIHYxLjEyLjZcXG5vbiBkYXJ3aW5fYXJtNjRcXG5cXG5Zb3VyIHZlcnNpb24gb2YgVGVycmFmb3JtIGlzIG91dCBvZiBkYXRlIVwiLFxuICAgICk7XG4gICAgY29uc3QgZmlyc3QgPSBsb2FkUHJvYmUoYmluYXJ5KTtcbiAgICBjb25zdCBzZWNvbmQgPSBsb2FkUHJvYmUoYmluYXJ5KTtcbiAgICBleHBlY3Qoc3Bhd25Db3VudChiaW5hcnkpKS50b0JlKDApO1xuXG4gICAgY29uc3QgW3Byb2JlLCAsIHZlcnNpb25dID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgZmlyc3QudGVycmFmb3JtQ2xpKCksXG4gICAgICBzZWNvbmQudGVycmFmb3JtQ2xpKCksXG4gICAgICBmaXJzdC50ZXJyYWZvcm1WZXJzaW9uKCksXG4gICAgICBzZWNvbmQudGVycmFmb3JtVmVyc2lvbigpLFxuICAgIF0pO1xuICAgIGV4cGVjdChwcm9iZSkudG9FcXVhbCh7IG5hbWU6IFwidGVycmFmb3JtXCIsIHZlcnNpb246IFwiMS4xMi42XCIgfSk7XG4gICAgZXhwZWN0KHZlcnNpb24pLnRvQmUoXCIxLjEyLjZcIik7XG4gICAgYXdhaXQgZXhwZWN0KHNlY29uZC50ZXJyYWZvcm1DbGkoKSkucmVzb2x2ZXMudG9FcXVhbChwcm9iZSk7XG4gICAgZXhwZWN0KHNwYXduQ291bnQoYmluYXJ5KSkudG9CZSgxKTtcbiAgfSk7XG5cbiAgLy8gdGhlIHByb2JlIGlzIHNoYXJlZCBieSBldmVyeSBjb25zdW1lciBpbiB0aGUgcHJvY2VzczogYSByZWplY3Rpb24gd291bGRcbiAgLy8gc3VyZmFjZSBvbiBldmVyeSBjb21tYW5kLCBhbmQgYGNka3RuIGRlYnVnYCBwcmludHMgdGhlIHJlc29sdmVkIHZhbHVlXG4gIGl0KFwicmVzb2x2ZXMgdG8gbWlzc2luZyAobmV2ZXIgcmVqZWN0cykgYW5kIGNvdW50cyBubyBjbGkuZXJyb3Igd2hlbiB0aGUgYmluYXJ5IGNhbm5vdCBiZSBzcGF3bmVkXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IHRlcnJhZm9ybUNsaSwgdGVycmFmb3JtVmVyc2lvbiwgc2VudHJ5IH0gPSBsb2FkUHJvYmUoXG4gICAgICBwYXRoLmpvaW4oZml4dHVyZURpciwgXCJkb2VzLW5vdC1leGlzdFwiKSxcbiAgICApO1xuICAgIGNvbnN0IGNvdW50ID0gamVzdC5zcHlPbihzZW50cnkubWV0cmljcywgXCJjb3VudFwiKTtcblxuICAgIGF3YWl0IGV4cGVjdCh0ZXJyYWZvcm1DbGkoKSkucmVzb2x2ZXMudG9FcXVhbCh7IG5hbWU6IFwibWlzc2luZ1wiIH0pO1xuICAgIGF3YWl0IGV4cGVjdCh0ZXJyYWZvcm1WZXJzaW9uKCkpLnJlc29sdmVzLnRvQmVVbmRlZmluZWQoKTtcbiAgICBleHBlY3QoY291bnQpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xuXG4gIGl0KFwicmVzb2x2ZXMgdG8gdW5rbm93biB3aGVuIGB2ZXJzaW9uYCBvdXRsaXZlcyB0aGUgdGltZW91dFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYmluYXJ5ID0gcGF0aC5qb2luKGZpeHR1cmVEaXIsIFwidGVycmFmb3JtXCIpO1xuICAgIGZzLndyaXRlRmlsZVN5bmMoYmluYXJ5LCBcIiMhL2Jpbi9zaFxcbmV4ZWMgc2xlZXAgMTBcXG5cIiwgeyBtb2RlOiAwbzc1NSB9KTtcbiAgICBjb25zdCB7IHRlcnJhZm9ybUNsaSB9ID0gbG9hZFByb2JlKGJpbmFyeSk7XG5cbiAgICBjb25zdCBzdGFydGVkID0gRGF0ZS5ub3coKTtcbiAgICBhd2FpdCBleHBlY3QodGVycmFmb3JtQ2xpKCkpLnJlc29sdmVzLnRvRXF1YWwoeyBuYW1lOiBcInVua25vd25cIiB9KTtcbiAgICAvLyB3ZWxsIHVuZGVyIHRoZSBmaXh0dXJlJ3MgMTBzIHNsZWVwOiB0aGUgcHJvYmUgd2FzIGtpbGxlZCwgbm90IGF3YWl0ZWRcbiAgICBleHBlY3QoRGF0ZS5ub3coKSAtIHN0YXJ0ZWQpLnRvQmVMZXNzVGhhbig5MDAwKTtcbiAgfSwgMTUwMDApO1xuXG4gIGl0KFwicmVzb2x2ZXMgdG8gdW5rbm93biB3aGVuIGB2ZXJzaW9uYCBleGl0cyBub24temVyb1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYmluYXJ5ID0gcGF0aC5qb2luKGZpeHR1cmVEaXIsIFwidGVycmFmb3JtXCIpO1xuICAgIGZzLndyaXRlRmlsZVN5bmMoYmluYXJ5LCBcIiMhL2Jpbi9zaFxcbmV4aXQgMVxcblwiLCB7IG1vZGU6IDBvNzU1IH0pO1xuICAgIGNvbnN0IHsgdGVycmFmb3JtQ2xpIH0gPSBsb2FkUHJvYmUoYmluYXJ5KTtcblxuICAgIGF3YWl0IGV4cGVjdCh0ZXJyYWZvcm1DbGkoKSkucmVzb2x2ZXMudG9FcXVhbCh7IG5hbWU6IFwidW5rbm93blwiIH0pO1xuICB9KTtcbn0pO1xuIl19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cdktn/commons",
3
- "version": "0.25.0-pre.52",
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": "7.120.4",
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.52"
42
+ "cdktn": "0.25.0-pre.54"
43
43
  },
44
44
  "devDependencies": {
45
45
  "@types/node": "22.20.1",
@@ -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"}
@@ -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=