@aws-cdk/toolkit-lib 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +16 -0
  3. package/README.md +432 -0
  4. package/build-info.json +4 -0
  5. package/db.json.gz +0 -0
  6. package/lib/actions/deploy/index.d.ts +178 -0
  7. package/lib/actions/deploy/index.js +78 -0
  8. package/lib/actions/deploy/private/deploy-options.d.ts +78 -0
  9. package/lib/actions/deploy/private/deploy-options.js +3 -0
  10. package/lib/actions/deploy/private/helpers.d.ts +15 -0
  11. package/lib/actions/deploy/private/helpers.js +41 -0
  12. package/lib/actions/deploy/private/index.d.ts +2 -0
  13. package/lib/actions/deploy/private/index.js +19 -0
  14. package/lib/actions/destroy/index.d.ts +17 -0
  15. package/lib/actions/destroy/index.js +3 -0
  16. package/lib/actions/diff/index.d.ts +83 -0
  17. package/lib/actions/diff/index.js +45 -0
  18. package/lib/actions/diff/private/helpers.d.ts +7 -0
  19. package/lib/actions/diff/private/helpers.js +20 -0
  20. package/lib/actions/diff/private/index.d.ts +1 -0
  21. package/lib/actions/diff/private/index.js +18 -0
  22. package/lib/actions/import/index.d.ts +21 -0
  23. package/lib/actions/import/index.js +3 -0
  24. package/lib/actions/index.d.ts +6 -0
  25. package/lib/actions/index.js +23 -0
  26. package/lib/actions/list/index.d.ts +7 -0
  27. package/lib/actions/list/index.js +3 -0
  28. package/lib/actions/rollback/index.d.ts +39 -0
  29. package/lib/actions/rollback/index.js +3 -0
  30. package/lib/actions/synth/index.d.ts +12 -0
  31. package/lib/actions/synth/index.js +3 -0
  32. package/lib/actions/watch/index.d.ts +35 -0
  33. package/lib/actions/watch/index.js +3 -0
  34. package/lib/actions/watch/private/helpers.d.ts +4 -0
  35. package/lib/actions/watch/private/helpers.js +8 -0
  36. package/lib/actions/watch/private/index.d.ts +1 -0
  37. package/lib/actions/watch/private/index.js +18 -0
  38. package/lib/api/aws-auth/index.d.ts +1 -0
  39. package/lib/api/aws-auth/index.js +18 -0
  40. package/lib/api/aws-auth/types.d.ts +32 -0
  41. package/lib/api/aws-auth/types.js +3 -0
  42. package/lib/api/aws-cdk.d.ts +25 -0
  43. package/lib/api/aws-cdk.js +9329 -0
  44. package/lib/api/aws-cdk.js.map +7 -0
  45. package/lib/api/cloud-assembly/index.d.ts +3 -0
  46. package/lib/api/cloud-assembly/index.js +20 -0
  47. package/lib/api/cloud-assembly/private/cached-source.d.ts +15 -0
  48. package/lib/api/cloud-assembly/private/cached-source.js +25 -0
  49. package/lib/api/cloud-assembly/private/context-aware-source.d.ts +45 -0
  50. package/lib/api/cloud-assembly/private/context-aware-source.js +89 -0
  51. package/lib/api/cloud-assembly/private/exec.d.ts +13 -0
  52. package/lib/api/cloud-assembly/private/exec.js +56 -0
  53. package/lib/api/cloud-assembly/private/identity-source.d.ts +10 -0
  54. package/lib/api/cloud-assembly/private/identity-source.js +17 -0
  55. package/lib/api/cloud-assembly/private/index.d.ts +8 -0
  56. package/lib/api/cloud-assembly/private/index.js +25 -0
  57. package/lib/api/cloud-assembly/private/prepare-source.d.ts +52 -0
  58. package/lib/api/cloud-assembly/private/prepare-source.js +166 -0
  59. package/lib/api/cloud-assembly/private/source-builder.d.ts +29 -0
  60. package/lib/api/cloud-assembly/private/source-builder.js +121 -0
  61. package/lib/api/cloud-assembly/private/stack-assembly.d.ts +30 -0
  62. package/lib/api/cloud-assembly/private/stack-assembly.js +94 -0
  63. package/lib/api/cloud-assembly/private/stack-selectors.d.ts +2 -0
  64. package/lib/api/cloud-assembly/private/stack-selectors.js +8 -0
  65. package/lib/api/cloud-assembly/source-builder.d.ts +113 -0
  66. package/lib/api/cloud-assembly/source-builder.js +3 -0
  67. package/lib/api/cloud-assembly/stack-selector.d.ts +81 -0
  68. package/lib/api/cloud-assembly/stack-selector.js +64 -0
  69. package/lib/api/cloud-assembly/types.d.ts +7 -0
  70. package/lib/api/cloud-assembly/types.js +3 -0
  71. package/lib/api/errors.d.ts +44 -0
  72. package/lib/api/errors.js +82 -0
  73. package/lib/api/io/index.d.ts +2 -0
  74. package/lib/api/io/index.js +19 -0
  75. package/lib/api/io/io-host.d.ts +15 -0
  76. package/lib/api/io/io-host.js +3 -0
  77. package/lib/api/io/io-message.d.ts +59 -0
  78. package/lib/api/io/io-message.js +3 -0
  79. package/lib/api/io/private/codes.d.ts +37 -0
  80. package/lib/api/io/private/codes.js +48 -0
  81. package/lib/api/io/private/index.d.ts +6 -0
  82. package/lib/api/io/private/index.js +23 -0
  83. package/lib/api/io/private/level-priority.d.ts +11 -0
  84. package/lib/api/io/private/level-priority.js +33 -0
  85. package/lib/api/io/private/logger.d.ts +40 -0
  86. package/lib/api/io/private/logger.js +211 -0
  87. package/lib/api/io/private/messages.d.ts +64 -0
  88. package/lib/api/io/private/messages.js +159 -0
  89. package/lib/api/io/private/timer.d.ts +29 -0
  90. package/lib/api/io/private/timer.js +54 -0
  91. package/lib/api/io/private/types.d.ts +25 -0
  92. package/lib/api/io/private/types.js +3 -0
  93. package/lib/index.d.ts +6 -0
  94. package/lib/index.js +25 -0
  95. package/lib/index_bg.wasm +0 -0
  96. package/lib/toolkit/index.d.ts +1 -0
  97. package/lib/toolkit/index.js +18 -0
  98. package/lib/toolkit/private/index.d.ts +9 -0
  99. package/lib/toolkit/private/index.js +3 -0
  100. package/lib/toolkit/toolkit.d.ts +142 -0
  101. package/lib/toolkit/toolkit.js +644 -0
  102. package/package.json +147 -0
@@ -0,0 +1,3 @@
1
+ export * from './source-builder';
2
+ export * from './stack-selector';
3
+ export * from './types';
@@ -0,0 +1,20 @@
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./source-builder"), exports);
18
+ __exportStar(require("./stack-selector"), exports);
19
+ __exportStar(require("./types"), exports);
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsbURBQWlDO0FBQ2pDLG1EQUFpQztBQUNqQywwQ0FBd0IiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3NvdXJjZS1idWlsZGVyJztcbmV4cG9ydCAqIGZyb20gJy4vc3RhY2stc2VsZWN0b3InO1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcyc7XG5cbiJdfQ==
@@ -0,0 +1,15 @@
1
+ import { CloudAssembly } from '@aws-cdk/cx-api';
2
+ import { ICloudAssemblySource } from '../types';
3
+ /**
4
+ * A CloudAssemblySource that is caching its result once produced.
5
+ *
6
+ * Most Toolkit interactions should use a cached source.
7
+ * Not caching is relevant when the source changes frequently
8
+ * and it is to expensive to predict if the source has changed.
9
+ */
10
+ export declare class CachedCloudAssemblySource implements ICloudAssemblySource {
11
+ private source;
12
+ private cloudAssembly;
13
+ constructor(source: ICloudAssemblySource);
14
+ produce(): Promise<CloudAssembly>;
15
+ }
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CachedCloudAssemblySource = void 0;
4
+ /**
5
+ * A CloudAssemblySource that is caching its result once produced.
6
+ *
7
+ * Most Toolkit interactions should use a cached source.
8
+ * Not caching is relevant when the source changes frequently
9
+ * and it is to expensive to predict if the source has changed.
10
+ */
11
+ class CachedCloudAssemblySource {
12
+ source;
13
+ cloudAssembly;
14
+ constructor(source) {
15
+ this.source = source;
16
+ }
17
+ async produce() {
18
+ if (!this.cloudAssembly) {
19
+ this.cloudAssembly = await this.source.produce();
20
+ }
21
+ return this.cloudAssembly;
22
+ }
23
+ }
24
+ exports.CachedCloudAssemblySource = CachedCloudAssemblySource;
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGVkLXNvdXJjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNhY2hlZC1zb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBR0E7Ozs7OztHQU1HO0FBQ0gsTUFBYSx5QkFBeUI7SUFDNUIsTUFBTSxDQUF1QjtJQUM3QixhQUFhLENBQTRCO0lBRWpELFlBQW1CLE1BQTRCO1FBQzdDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFTSxLQUFLLENBQUMsT0FBTztRQUNsQixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ25ELENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztDQUNGO0FBZEQsOERBY0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDbG91ZEFzc2VtYmx5IH0gZnJvbSAnQGF3cy1jZGsvY3gtYXBpJztcbmltcG9ydCB7IElDbG91ZEFzc2VtYmx5U291cmNlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG4vKipcbiAqIEEgQ2xvdWRBc3NlbWJseVNvdXJjZSB0aGF0IGlzIGNhY2hpbmcgaXRzIHJlc3VsdCBvbmNlIHByb2R1Y2VkLlxuICpcbiAqIE1vc3QgVG9vbGtpdCBpbnRlcmFjdGlvbnMgc2hvdWxkIHVzZSBhIGNhY2hlZCBzb3VyY2UuXG4gKiBOb3QgY2FjaGluZyBpcyByZWxldmFudCB3aGVuIHRoZSBzb3VyY2UgY2hhbmdlcyBmcmVxdWVudGx5XG4gKiBhbmQgaXQgaXMgdG8gZXhwZW5zaXZlIHRvIHByZWRpY3QgaWYgdGhlIHNvdXJjZSBoYXMgY2hhbmdlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIENhY2hlZENsb3VkQXNzZW1ibHlTb3VyY2UgaW1wbGVtZW50cyBJQ2xvdWRBc3NlbWJseVNvdXJjZSB7XG4gIHByaXZhdGUgc291cmNlOiBJQ2xvdWRBc3NlbWJseVNvdXJjZTtcbiAgcHJpdmF0ZSBjbG91ZEFzc2VtYmx5OiBDbG91ZEFzc2VtYmx5IHwgdW5kZWZpbmVkO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihzb3VyY2U6IElDbG91ZEFzc2VtYmx5U291cmNlKSB7XG4gICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcHJvZHVjZSgpOiBQcm9taXNlPENsb3VkQXNzZW1ibHk+IHtcbiAgICBpZiAoIXRoaXMuY2xvdWRBc3NlbWJseSkge1xuICAgICAgdGhpcy5jbG91ZEFzc2VtYmx5ID0gYXdhaXQgdGhpcy5zb3VyY2UucHJvZHVjZSgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jbG91ZEFzc2VtYmx5O1xuICB9XG59XG4iXX0=
@@ -0,0 +1,45 @@
1
+ import * as cxapi from '@aws-cdk/cx-api';
2
+ import { ToolkitServices } from '../../../toolkit/private';
3
+ import { type Context } from '../../aws-cdk';
4
+ import { ICloudAssemblySource } from '../types';
5
+ export interface ContextAwareCloudAssemblyProps {
6
+ /**
7
+ * AWS object (used by contextprovider)
8
+ * @deprecated context should be moved to the toolkit itself
9
+ */
10
+ readonly services: ToolkitServices;
11
+ /**
12
+ * Application context
13
+ */
14
+ readonly context: Context;
15
+ /**
16
+ * The file used to store application context in (relative to cwd).
17
+ *
18
+ * @default "cdk.context.json"
19
+ */
20
+ readonly contextFile?: string;
21
+ /**
22
+ * Enable context lookups.
23
+ *
24
+ * Producing a `cxapi.CloudAssembly` will fail if this is disabled and context lookups need to be performed.
25
+ *
26
+ * @default true
27
+ */
28
+ readonly lookups?: boolean;
29
+ }
30
+ /**
31
+ * Represent the Cloud Executable and the synthesis we can do on it
32
+ */
33
+ export declare class ContextAwareCloudAssembly implements ICloudAssemblySource {
34
+ private readonly source;
35
+ private readonly props;
36
+ private canLookup;
37
+ private context;
38
+ private contextFile;
39
+ private ioHost;
40
+ constructor(source: ICloudAssemblySource, props: ContextAwareCloudAssemblyProps);
41
+ /**
42
+ * Produce a Cloud Assembly, i.e. a set of stacks
43
+ */
44
+ produce(): Promise<cxapi.CloudAssembly>;
45
+ }
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ContextAwareCloudAssembly = void 0;
4
+ const aws_cdk_1 = require("../../aws-cdk");
5
+ const errors_1 = require("../../errors");
6
+ const private_1 = require("../../io/private");
7
+ /**
8
+ * Represent the Cloud Executable and the synthesis we can do on it
9
+ */
10
+ class ContextAwareCloudAssembly {
11
+ source;
12
+ props;
13
+ canLookup;
14
+ context;
15
+ contextFile;
16
+ ioHost;
17
+ constructor(source, props) {
18
+ this.source = source;
19
+ this.props = props;
20
+ this.canLookup = props.lookups ?? true;
21
+ this.context = props.context;
22
+ this.contextFile = props.contextFile ?? aws_cdk_1.PROJECT_CONTEXT; // @todo new feature not needed right now
23
+ this.ioHost = props.services.ioHost;
24
+ }
25
+ /**
26
+ * Produce a Cloud Assembly, i.e. a set of stacks
27
+ */
28
+ async produce() {
29
+ // We may need to run the cloud assembly source multiple times in order to satisfy all missing context
30
+ // (When the source producer runs, it will tell us about context it wants to use
31
+ // but it missing. We'll then look up the context and run the executable again, and
32
+ // again, until it doesn't complain anymore or we've stopped making progress).
33
+ let previouslyMissingKeys;
34
+ while (true) {
35
+ const assembly = await this.source.produce();
36
+ if (assembly.manifest.missing && assembly.manifest.missing.length > 0) {
37
+ const missingKeys = missingContextKeys(assembly.manifest.missing);
38
+ if (!this.canLookup) {
39
+ throw new errors_1.ToolkitError('Context lookups have been disabled. '
40
+ + 'Make sure all necessary context is already in \'cdk.context.json\' by running \'cdk synth\' on a machine with sufficient AWS credentials and committing the result. '
41
+ + `Missing context keys: '${Array.from(missingKeys).join(', ')}'`);
42
+ }
43
+ let tryLookup = true;
44
+ if (previouslyMissingKeys && equalSets(missingKeys, previouslyMissingKeys)) {
45
+ await this.ioHost.notify((0, private_1.debug)('Not making progress trying to resolve environmental context. Giving up.'));
46
+ tryLookup = false;
47
+ }
48
+ previouslyMissingKeys = missingKeys;
49
+ if (tryLookup) {
50
+ await this.ioHost.notify((0, private_1.debug)('Some context information is missing. Fetching...', 'CDK_ASSEMBLY_I0241', {
51
+ missingKeys: Array.from(missingKeys),
52
+ }));
53
+ await aws_cdk_1.contextproviders.provideContextValues(assembly.manifest.missing, this.context, this.props.services.sdkProvider);
54
+ // Cache the new context to disk
55
+ await this.ioHost.notify((0, private_1.debug)(`Writing updated context to ${this.contextFile}...`, 'CDK_ASSEMBLY_I0042', {
56
+ contextFile: this.contextFile,
57
+ context: this.context.all,
58
+ }));
59
+ await this.context.save(this.contextFile);
60
+ // Execute again
61
+ continue;
62
+ }
63
+ }
64
+ return assembly;
65
+ }
66
+ }
67
+ }
68
+ exports.ContextAwareCloudAssembly = ContextAwareCloudAssembly;
69
+ /**
70
+ * Return all keys of missing context items
71
+ */
72
+ function missingContextKeys(missing) {
73
+ return new Set((missing || []).map(m => m.key));
74
+ }
75
+ /**
76
+ * Are two sets equal to each other
77
+ */
78
+ function equalSets(a, b) {
79
+ if (a.size !== b.size) {
80
+ return false;
81
+ }
82
+ for (const x of a) {
83
+ if (!b.has(x)) {
84
+ return false;
85
+ }
86
+ }
87
+ return true;
88
+ }
89
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1hd2FyZS1zb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjb250ZXh0LWF3YXJlLXNvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQSwyQ0FBZ0Y7QUFDaEYseUNBQTRDO0FBQzVDLDhDQUE0RDtBQWdDNUQ7O0dBRUc7QUFDSCxNQUFhLHlCQUF5QjtJQU1QO0lBQStDO0lBTHBFLFNBQVMsQ0FBVTtJQUNuQixPQUFPLENBQVU7SUFDakIsV0FBVyxDQUFTO0lBQ3BCLE1BQU0sQ0FBb0I7SUFFbEMsWUFBNkIsTUFBNEIsRUFBbUIsS0FBcUM7UUFBcEYsV0FBTSxHQUFOLE1BQU0sQ0FBc0I7UUFBbUIsVUFBSyxHQUFMLEtBQUssQ0FBZ0M7UUFDL0csSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQztRQUN2QyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDN0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsV0FBVyxJQUFJLHlCQUFlLENBQUMsQ0FBQyx5Q0FBeUM7UUFDbEcsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztJQUN0QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsT0FBTztRQUNsQixzR0FBc0c7UUFDdEcsZ0ZBQWdGO1FBQ2hGLG1GQUFtRjtRQUNuRiw4RUFBOEU7UUFDOUUsSUFBSSxxQkFBOEMsQ0FBQztRQUNuRCxPQUFPLElBQUksRUFBRSxDQUFDO1lBQ1osTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBRTdDLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN0RSxNQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUVsRSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUNwQixNQUFNLElBQUkscUJBQVksQ0FDcEIsc0NBQXNDOzBCQUNwQyxzS0FBc0s7MEJBQ3RLLDBCQUEwQixLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3ZFLENBQUM7Z0JBRUQsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDO2dCQUNyQixJQUFJLHFCQUFxQixJQUFJLFNBQVMsQ0FBQyxXQUFXLEVBQUUscUJBQXFCLENBQUMsRUFBRSxDQUFDO29CQUMzRSxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUEsZUFBSyxFQUFDLHlFQUF5RSxDQUFDLENBQUMsQ0FBQztvQkFDM0csU0FBUyxHQUFHLEtBQUssQ0FBQztnQkFDcEIsQ0FBQztnQkFFRCxxQkFBcUIsR0FBRyxXQUFXLENBQUM7Z0JBRXBDLElBQUksU0FBUyxFQUFFLENBQUM7b0JBQ2QsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFBLGVBQUssRUFBQyxrREFBa0QsRUFBRSxvQkFBb0IsRUFBRTt3QkFDdkcsV0FBVyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO3FCQUNyQyxDQUFDLENBQUMsQ0FBQztvQkFDSixNQUFNLDBCQUFnQixDQUFDLG9CQUFvQixDQUN6QyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFDekIsSUFBSSxDQUFDLE9BQU8sRUFDWixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQ2hDLENBQUM7b0JBRUYsZ0NBQWdDO29CQUNoQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUEsZUFBSyxFQUFDLDhCQUE4QixJQUFJLENBQUMsV0FBVyxLQUFLLEVBQUUsb0JBQW9CLEVBQUU7d0JBQ3hHLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVzt3QkFDN0IsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRztxQkFDMUIsQ0FBQyxDQUFDLENBQUM7b0JBQ0osTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBRTFDLGdCQUFnQjtvQkFDaEIsU0FBUztnQkFDWCxDQUFDO1lBQ0gsQ0FBQztZQUVELE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFwRUQsOERBb0VDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLGtCQUFrQixDQUFDLE9BQTBCO0lBQ3BELE9BQU8sSUFBSSxHQUFHLENBQUMsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDbEQsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxTQUFTLENBQUksQ0FBUyxFQUFFLENBQVM7SUFDeEMsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0QixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDRCxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDZCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBNaXNzaW5nQ29udGV4dCB9IGZyb20gJ0Bhd3MtY2RrL2Nsb3VkLWFzc2VtYmx5LXNjaGVtYSc7XG5pbXBvcnQgKiBhcyBjeGFwaSBmcm9tICdAYXdzLWNkay9jeC1hcGknO1xuaW1wb3J0IHsgVG9vbGtpdFNlcnZpY2VzIH0gZnJvbSAnLi4vLi4vLi4vdG9vbGtpdC9wcml2YXRlJztcbmltcG9ydCB7IHR5cGUgQ29udGV4dCwgY29udGV4dHByb3ZpZGVycywgUFJPSkVDVF9DT05URVhUIH0gZnJvbSAnLi4vLi4vYXdzLWNkayc7XG5pbXBvcnQgeyBUb29sa2l0RXJyb3IgfSBmcm9tICcuLi8uLi9lcnJvcnMnO1xuaW1wb3J0IHsgQWN0aW9uQXdhcmVJb0hvc3QsIGRlYnVnIH0gZnJvbSAnLi4vLi4vaW8vcHJpdmF0ZSc7XG5pbXBvcnQgeyBJQ2xvdWRBc3NlbWJseVNvdXJjZSB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBDb250ZXh0QXdhcmVDbG91ZEFzc2VtYmx5UHJvcHMge1xuICAvKipcbiAgICogQVdTIG9iamVjdCAodXNlZCBieSBjb250ZXh0cHJvdmlkZXIpXG4gICAqIEBkZXByZWNhdGVkIGNvbnRleHQgc2hvdWxkIGJlIG1vdmVkIHRvIHRoZSB0b29sa2l0IGl0c2VsZlxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZXM6IFRvb2xraXRTZXJ2aWNlcztcblxuICAvKipcbiAgICogQXBwbGljYXRpb24gY29udGV4dFxuICAgKi9cbiAgcmVhZG9ubHkgY29udGV4dDogQ29udGV4dDtcblxuICAvKipcbiAgICogVGhlIGZpbGUgdXNlZCB0byBzdG9yZSBhcHBsaWNhdGlvbiBjb250ZXh0IGluIChyZWxhdGl2ZSB0byBjd2QpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBcImNkay5jb250ZXh0Lmpzb25cIlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGV4dEZpbGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBjb250ZXh0IGxvb2t1cHMuXG4gICAqXG4gICAqIFByb2R1Y2luZyBhIGBjeGFwaS5DbG91ZEFzc2VtYmx5YCB3aWxsIGZhaWwgaWYgdGhpcyBpcyBkaXNhYmxlZCBhbmQgY29udGV4dCBsb29rdXBzIG5lZWQgdG8gYmUgcGVyZm9ybWVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBsb29rdXBzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnQgdGhlIENsb3VkIEV4ZWN1dGFibGUgYW5kIHRoZSBzeW50aGVzaXMgd2UgY2FuIGRvIG9uIGl0XG4gKi9cbmV4cG9ydCBjbGFzcyBDb250ZXh0QXdhcmVDbG91ZEFzc2VtYmx5IGltcGxlbWVudHMgSUNsb3VkQXNzZW1ibHlTb3VyY2Uge1xuICBwcml2YXRlIGNhbkxvb2t1cDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBjb250ZXh0OiBDb250ZXh0O1xuICBwcml2YXRlIGNvbnRleHRGaWxlOiBzdHJpbmc7XG4gIHByaXZhdGUgaW9Ib3N0OiBBY3Rpb25Bd2FyZUlvSG9zdDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHNvdXJjZTogSUNsb3VkQXNzZW1ibHlTb3VyY2UsIHByaXZhdGUgcmVhZG9ubHkgcHJvcHM6IENvbnRleHRBd2FyZUNsb3VkQXNzZW1ibHlQcm9wcykge1xuICAgIHRoaXMuY2FuTG9va3VwID0gcHJvcHMubG9va3VwcyA/PyB0cnVlO1xuICAgIHRoaXMuY29udGV4dCA9IHByb3BzLmNvbnRleHQ7XG4gICAgdGhpcy5jb250ZXh0RmlsZSA9IHByb3BzLmNvbnRleHRGaWxlID8/IFBST0pFQ1RfQ09OVEVYVDsgLy8gQHRvZG8gbmV3IGZlYXR1cmUgbm90IG5lZWRlZCByaWdodCBub3dcbiAgICB0aGlzLmlvSG9zdCA9IHByb3BzLnNlcnZpY2VzLmlvSG9zdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9kdWNlIGEgQ2xvdWQgQXNzZW1ibHksIGkuZS4gYSBzZXQgb2Ygc3RhY2tzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcHJvZHVjZSgpOiBQcm9taXNlPGN4YXBpLkNsb3VkQXNzZW1ibHk+IHtcbiAgICAvLyBXZSBtYXkgbmVlZCB0byBydW4gdGhlIGNsb3VkIGFzc2VtYmx5IHNvdXJjZSBtdWx0aXBsZSB0aW1lcyBpbiBvcmRlciB0byBzYXRpc2Z5IGFsbCBtaXNzaW5nIGNvbnRleHRcbiAgICAvLyAoV2hlbiB0aGUgc291cmNlIHByb2R1Y2VyIHJ1bnMsIGl0IHdpbGwgdGVsbCB1cyBhYm91dCBjb250ZXh0IGl0IHdhbnRzIHRvIHVzZVxuICAgIC8vIGJ1dCBpdCBtaXNzaW5nLiBXZSdsbCB0aGVuIGxvb2sgdXAgdGhlIGNvbnRleHQgYW5kIHJ1biB0aGUgZXhlY3V0YWJsZSBhZ2FpbiwgYW5kXG4gICAgLy8gYWdhaW4sIHVudGlsIGl0IGRvZXNuJ3QgY29tcGxhaW4gYW55bW9yZSBvciB3ZSd2ZSBzdG9wcGVkIG1ha2luZyBwcm9ncmVzcykuXG4gICAgbGV0IHByZXZpb3VzbHlNaXNzaW5nS2V5czogU2V0PHN0cmluZz4gfCB1bmRlZmluZWQ7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IGFzc2VtYmx5ID0gYXdhaXQgdGhpcy5zb3VyY2UucHJvZHVjZSgpO1xuXG4gICAgICBpZiAoYXNzZW1ibHkubWFuaWZlc3QubWlzc2luZyAmJiBhc3NlbWJseS5tYW5pZmVzdC5taXNzaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgbWlzc2luZ0tleXMgPSBtaXNzaW5nQ29udGV4dEtleXMoYXNzZW1ibHkubWFuaWZlc3QubWlzc2luZyk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmNhbkxvb2t1cCkge1xuICAgICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoXG4gICAgICAgICAgICAnQ29udGV4dCBsb29rdXBzIGhhdmUgYmVlbiBkaXNhYmxlZC4gJ1xuICAgICAgICAgICAgKyAnTWFrZSBzdXJlIGFsbCBuZWNlc3NhcnkgY29udGV4dCBpcyBhbHJlYWR5IGluIFxcJ2Nkay5jb250ZXh0Lmpzb25cXCcgYnkgcnVubmluZyBcXCdjZGsgc3ludGhcXCcgb24gYSBtYWNoaW5lIHdpdGggc3VmZmljaWVudCBBV1MgY3JlZGVudGlhbHMgYW5kIGNvbW1pdHRpbmcgdGhlIHJlc3VsdC4gJ1xuICAgICAgICAgICAgKyBgTWlzc2luZyBjb250ZXh0IGtleXM6ICcke0FycmF5LmZyb20obWlzc2luZ0tleXMpLmpvaW4oJywgJyl9J2ApO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHRyeUxvb2t1cCA9IHRydWU7XG4gICAgICAgIGlmIChwcmV2aW91c2x5TWlzc2luZ0tleXMgJiYgZXF1YWxTZXRzKG1pc3NpbmdLZXlzLCBwcmV2aW91c2x5TWlzc2luZ0tleXMpKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5pb0hvc3Qubm90aWZ5KGRlYnVnKCdOb3QgbWFraW5nIHByb2dyZXNzIHRyeWluZyB0byByZXNvbHZlIGVudmlyb25tZW50YWwgY29udGV4dC4gR2l2aW5nIHVwLicpKTtcbiAgICAgICAgICB0cnlMb29rdXAgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZpb3VzbHlNaXNzaW5nS2V5cyA9IG1pc3NpbmdLZXlzO1xuXG4gICAgICAgIGlmICh0cnlMb29rdXApIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmlvSG9zdC5ub3RpZnkoZGVidWcoJ1NvbWUgY29udGV4dCBpbmZvcm1hdGlvbiBpcyBtaXNzaW5nLiBGZXRjaGluZy4uLicsICdDREtfQVNTRU1CTFlfSTAyNDEnLCB7XG4gICAgICAgICAgICBtaXNzaW5nS2V5czogQXJyYXkuZnJvbShtaXNzaW5nS2V5cyksXG4gICAgICAgICAgfSkpO1xuICAgICAgICAgIGF3YWl0IGNvbnRleHRwcm92aWRlcnMucHJvdmlkZUNvbnRleHRWYWx1ZXMoXG4gICAgICAgICAgICBhc3NlbWJseS5tYW5pZmVzdC5taXNzaW5nLFxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LFxuICAgICAgICAgICAgdGhpcy5wcm9wcy5zZXJ2aWNlcy5zZGtQcm92aWRlcixcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gQ2FjaGUgdGhlIG5ldyBjb250ZXh0IHRvIGRpc2tcbiAgICAgICAgICBhd2FpdCB0aGlzLmlvSG9zdC5ub3RpZnkoZGVidWcoYFdyaXRpbmcgdXBkYXRlZCBjb250ZXh0IHRvICR7dGhpcy5jb250ZXh0RmlsZX0uLi5gLCAnQ0RLX0FTU0VNQkxZX0kwMDQyJywge1xuICAgICAgICAgICAgY29udGV4dEZpbGU6IHRoaXMuY29udGV4dEZpbGUsXG4gICAgICAgICAgICBjb250ZXh0OiB0aGlzLmNvbnRleHQuYWxsLFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLmNvbnRleHQuc2F2ZSh0aGlzLmNvbnRleHRGaWxlKTtcblxuICAgICAgICAgIC8vIEV4ZWN1dGUgYWdhaW5cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXNzZW1ibHk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUmV0dXJuIGFsbCBrZXlzIG9mIG1pc3NpbmcgY29udGV4dCBpdGVtc1xuICovXG5mdW5jdGlvbiBtaXNzaW5nQ29udGV4dEtleXMobWlzc2luZz86IE1pc3NpbmdDb250ZXh0W10pOiBTZXQ8c3RyaW5nPiB7XG4gIHJldHVybiBuZXcgU2V0KChtaXNzaW5nIHx8IFtdKS5tYXAobSA9PiBtLmtleSkpO1xufVxuXG4vKipcbiAqIEFyZSB0d28gc2V0cyBlcXVhbCB0byBlYWNoIG90aGVyXG4gKi9cbmZ1bmN0aW9uIGVxdWFsU2V0czxBPihhOiBTZXQ8QT4sIGI6IFNldDxBPikge1xuICBpZiAoYS5zaXplICE9PSBiLnNpemUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZm9yIChjb25zdCB4IG9mIGEpIHtcbiAgICBpZiAoIWIuaGFzKHgpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuIl19
@@ -0,0 +1,13 @@
1
+ type EventPublisher = (event: 'open' | 'data_stdout' | 'data_stderr' | 'close', line: string) => void;
2
+ interface ExecOptions {
3
+ eventPublisher?: EventPublisher;
4
+ extraEnv?: {
5
+ [key: string]: string | undefined;
6
+ };
7
+ cwd?: string;
8
+ }
9
+ /**
10
+ * Execute a command and args in a child process
11
+ */
12
+ export declare function execInChildProcess(commandAndArgs: string, options?: ExecOptions): Promise<void>;
13
+ export {};
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.execInChildProcess = execInChildProcess;
4
+ const child_process = require("node:child_process");
5
+ const split2 = require("split2");
6
+ const errors_1 = require("../../errors");
7
+ /**
8
+ * Execute a command and args in a child process
9
+ */
10
+ async function execInChildProcess(commandAndArgs, options = {}) {
11
+ return new Promise((ok, fail) => {
12
+ // We use a slightly lower-level interface to:
13
+ //
14
+ // - Pass arguments in an array instead of a string, to get around a
15
+ // number of quoting issues introduced by the intermediate shell layer
16
+ // (which would be different between Linux and Windows).
17
+ //
18
+ // - We have to capture any output to stdout and stderr sp we can pass it on to the IoHost
19
+ // To ensure messages get to the user fast, we will emit every full line we receive.
20
+ const proc = child_process.spawn(commandAndArgs, {
21
+ stdio: ['ignore', 'pipe', 'pipe'],
22
+ detached: false,
23
+ shell: true,
24
+ cwd: options.cwd,
25
+ env: {
26
+ ...process.env,
27
+ ...(options.extraEnv ?? {}),
28
+ },
29
+ });
30
+ const eventPublisher = options.eventPublisher ?? ((type, line) => {
31
+ switch (type) {
32
+ case 'data_stdout':
33
+ process.stdout.write(line);
34
+ return;
35
+ case 'data_stderr':
36
+ process.stderr.write(line);
37
+ return;
38
+ case 'open':
39
+ case 'close':
40
+ return;
41
+ }
42
+ });
43
+ proc.stdout.pipe(split2()).on('data', (line) => eventPublisher('data_stdout', line));
44
+ proc.stderr.pipe(split2()).on('data', (line) => eventPublisher('data_stderr', line));
45
+ proc.on('error', fail);
46
+ proc.on('exit', code => {
47
+ if (code === 0) {
48
+ return ok();
49
+ }
50
+ else {
51
+ return fail(new errors_1.ToolkitError(`Subprocess exited with error ${code}`));
52
+ }
53
+ });
54
+ });
55
+ }
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImV4ZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFlQSxnREErQ0M7QUE5REQsb0RBQW9EO0FBQ3BELGlDQUFpQztBQUNqQyx5Q0FBNEM7QUFVNUM7O0dBRUc7QUFDSSxLQUFLLFVBQVUsa0JBQWtCLENBQUMsY0FBc0IsRUFBRSxVQUF1QixFQUFFO0lBQ3hGLE9BQU8sSUFBSSxPQUFPLENBQU8sQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUU7UUFDcEMsOENBQThDO1FBQzlDLEVBQUU7UUFDRixvRUFBb0U7UUFDcEUsd0VBQXdFO1FBQ3hFLDBEQUEwRDtRQUMxRCxFQUFFO1FBQ0YsMEZBQTBGO1FBQzFGLHNGQUFzRjtRQUN0RixNQUFNLElBQUksR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRTtZQUMvQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQztZQUNqQyxRQUFRLEVBQUUsS0FBSztZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHO1lBQ2hCLEdBQUcsRUFBRTtnQkFDSCxHQUFHLE9BQU8sQ0FBQyxHQUFHO2dCQUNkLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQzthQUM1QjtTQUNGLENBQUMsQ0FBQztRQUVILE1BQU0sY0FBYyxHQUFtQixPQUFPLENBQUMsY0FBYyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFDL0UsUUFBUSxJQUFJLEVBQUUsQ0FBQztnQkFDYixLQUFLLGFBQWE7b0JBQ2hCLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUMzQixPQUFPO2dCQUNULEtBQUssYUFBYTtvQkFDaEIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzNCLE9BQU87Z0JBQ1QsS0FBSyxNQUFNLENBQUM7Z0JBQ1osS0FBSyxPQUFPO29CQUNWLE9BQU87WUFDWCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNyRixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUVyRixJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUV2QixJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsRUFBRTtZQUNyQixJQUFJLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDZixPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQ2QsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE9BQU8sSUFBSSxDQUFDLElBQUkscUJBQVksQ0FBQyxnQ0FBZ0MsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3hFLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNoaWxkX3Byb2Nlc3MgZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCAqIGFzIHNwbGl0MiBmcm9tICdzcGxpdDInO1xuaW1wb3J0IHsgVG9vbGtpdEVycm9yIH0gZnJvbSAnLi4vLi4vZXJyb3JzJztcblxudHlwZSBFdmVudFB1Ymxpc2hlciA9IChldmVudDogJ29wZW4nIHwgJ2RhdGFfc3Rkb3V0JyB8ICdkYXRhX3N0ZGVycicgfCAnY2xvc2UnLCBsaW5lOiBzdHJpbmcpID0+IHZvaWQ7XG5cbmludGVyZmFjZSBFeGVjT3B0aW9ucyB7XG4gIGV2ZW50UHVibGlzaGVyPzogRXZlbnRQdWJsaXNoZXI7XG4gIGV4dHJhRW52PzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCB1bmRlZmluZWQgfTtcbiAgY3dkPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEV4ZWN1dGUgYSBjb21tYW5kIGFuZCBhcmdzIGluIGEgY2hpbGQgcHJvY2Vzc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY0luQ2hpbGRQcm9jZXNzKGNvbW1hbmRBbmRBcmdzOiBzdHJpbmcsIG9wdGlvbnM6IEV4ZWNPcHRpb25zID0ge30pIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChvaywgZmFpbCkgPT4ge1xuICAgIC8vIFdlIHVzZSBhIHNsaWdodGx5IGxvd2VyLWxldmVsIGludGVyZmFjZSB0bzpcbiAgICAvL1xuICAgIC8vIC0gUGFzcyBhcmd1bWVudHMgaW4gYW4gYXJyYXkgaW5zdGVhZCBvZiBhIHN0cmluZywgdG8gZ2V0IGFyb3VuZCBhXG4gICAgLy8gICBudW1iZXIgb2YgcXVvdGluZyBpc3N1ZXMgaW50cm9kdWNlZCBieSB0aGUgaW50ZXJtZWRpYXRlIHNoZWxsIGxheWVyXG4gICAgLy8gICAod2hpY2ggd291bGQgYmUgZGlmZmVyZW50IGJldHdlZW4gTGludXggYW5kIFdpbmRvd3MpLlxuICAgIC8vXG4gICAgLy8gLSBXZSBoYXZlIHRvIGNhcHR1cmUgYW55IG91dHB1dCB0byBzdGRvdXQgYW5kIHN0ZGVyciBzcCB3ZSBjYW4gcGFzcyBpdCBvbiB0byB0aGUgSW9Ib3N0XG4gICAgLy8gICBUbyBlbnN1cmUgbWVzc2FnZXMgZ2V0IHRvIHRoZSB1c2VyIGZhc3QsIHdlIHdpbGwgZW1pdCBldmVyeSBmdWxsIGxpbmUgd2UgcmVjZWl2ZS5cbiAgICBjb25zdCBwcm9jID0gY2hpbGRfcHJvY2Vzcy5zcGF3bihjb21tYW5kQW5kQXJncywge1xuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddLFxuICAgICAgZGV0YWNoZWQ6IGZhbHNlLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBjd2Q6IG9wdGlvbnMuY3dkLFxuICAgICAgZW52OiB7XG4gICAgICAgIC4uLnByb2Nlc3MuZW52LFxuICAgICAgICAuLi4ob3B0aW9ucy5leHRyYUVudiA/PyB7fSksXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgZXZlbnRQdWJsaXNoZXI6IEV2ZW50UHVibGlzaGVyID0gb3B0aW9ucy5ldmVudFB1Ymxpc2hlciA/PyAoKHR5cGUsIGxpbmUpID0+IHtcbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlICdkYXRhX3N0ZG91dCc6XG4gICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUobGluZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjYXNlICdkYXRhX3N0ZGVycic6XG4gICAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUobGluZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjYXNlICdvcGVuJzpcbiAgICAgICAgY2FzZSAnY2xvc2UnOlxuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBwcm9jLnN0ZG91dC5waXBlKHNwbGl0MigpKS5vbignZGF0YScsIChsaW5lKSA9PiBldmVudFB1Ymxpc2hlcignZGF0YV9zdGRvdXQnLCBsaW5lKSk7XG4gICAgcHJvYy5zdGRlcnIucGlwZShzcGxpdDIoKSkub24oJ2RhdGEnLCAobGluZSkgPT4gZXZlbnRQdWJsaXNoZXIoJ2RhdGFfc3RkZXJyJywgbGluZSkpO1xuXG4gICAgcHJvYy5vbignZXJyb3InLCBmYWlsKTtcblxuICAgIHByb2Mub24oJ2V4aXQnLCBjb2RlID0+IHtcbiAgICAgIGlmIChjb2RlID09PSAwKSB7XG4gICAgICAgIHJldHVybiBvaygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhaWwobmV3IFRvb2xraXRFcnJvcihgU3VicHJvY2VzcyBleGl0ZWQgd2l0aCBlcnJvciAke2NvZGV9YCkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cbiJdfQ==
@@ -0,0 +1,10 @@
1
+ import type * as cxapi from '@aws-cdk/cx-api';
2
+ import { ICloudAssemblySource } from '../types';
3
+ /**
4
+ * A CloudAssemblySource that is representing a already existing and produced CloudAssembly.
5
+ */
6
+ export declare class IdentityCloudAssemblySource implements ICloudAssemblySource {
7
+ private readonly cloudAssembly;
8
+ constructor(cloudAssembly: cxapi.CloudAssembly);
9
+ produce(): Promise<cxapi.CloudAssembly>;
10
+ }
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IdentityCloudAssemblySource = void 0;
4
+ /**
5
+ * A CloudAssemblySource that is representing a already existing and produced CloudAssembly.
6
+ */
7
+ class IdentityCloudAssemblySource {
8
+ cloudAssembly;
9
+ constructor(cloudAssembly) {
10
+ this.cloudAssembly = cloudAssembly;
11
+ }
12
+ async produce() {
13
+ return this.cloudAssembly;
14
+ }
15
+ }
16
+ exports.IdentityCloudAssemblySource = IdentityCloudAssemblySource;
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlbnRpdHktc291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiaWRlbnRpdHktc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUdBOztHQUVHO0FBQ0gsTUFBYSwyQkFBMkI7SUFDRjtJQUFwQyxZQUFvQyxhQUFrQztRQUFsQyxrQkFBYSxHQUFiLGFBQWEsQ0FBcUI7SUFDdEUsQ0FBQztJQUVNLEtBQUssQ0FBQyxPQUFPO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0NBQ0Y7QUFQRCxrRUFPQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlICogYXMgY3hhcGkgZnJvbSAnQGF3cy1jZGsvY3gtYXBpJztcbmltcG9ydCB7IElDbG91ZEFzc2VtYmx5U291cmNlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG4vKipcbiAqIEEgQ2xvdWRBc3NlbWJseVNvdXJjZSB0aGF0IGlzIHJlcHJlc2VudGluZyBhIGFscmVhZHkgZXhpc3RpbmcgYW5kIHByb2R1Y2VkIENsb3VkQXNzZW1ibHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBJZGVudGl0eUNsb3VkQXNzZW1ibHlTb3VyY2UgaW1wbGVtZW50cyBJQ2xvdWRBc3NlbWJseVNvdXJjZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGNsb3VkQXNzZW1ibHk6IGN4YXBpLkNsb3VkQXNzZW1ibHkpIHtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBwcm9kdWNlKCk6IFByb21pc2U8Y3hhcGkuQ2xvdWRBc3NlbWJseT4ge1xuICAgIHJldHVybiB0aGlzLmNsb3VkQXNzZW1ibHk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,8 @@
1
+ export * from './context-aware-source';
2
+ export * from './cached-source';
3
+ export * from './identity-source';
4
+ export * from './stack-assembly';
5
+ export * from './exec';
6
+ export * from './prepare-source';
7
+ export * from './source-builder';
8
+ export * from './stack-selectors';
@@ -0,0 +1,25 @@
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./context-aware-source"), exports);
18
+ __exportStar(require("./cached-source"), exports);
19
+ __exportStar(require("./identity-source"), exports);
20
+ __exportStar(require("./stack-assembly"), exports);
21
+ __exportStar(require("./exec"), exports);
22
+ __exportStar(require("./prepare-source"), exports);
23
+ __exportStar(require("./source-builder"), exports);
24
+ __exportStar(require("./stack-selectors"), exports);
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEseURBQXVDO0FBQ3ZDLGtEQUFnQztBQUNoQyxvREFBa0M7QUFDbEMsbURBQWlDO0FBQ2pDLHlDQUF1QjtBQUN2QixtREFBaUM7QUFDakMsbURBQWlDO0FBQ2pDLG9EQUFrQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vY29udGV4dC1hd2FyZS1zb3VyY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9jYWNoZWQtc291cmNlJztcbmV4cG9ydCAqIGZyb20gJy4vaWRlbnRpdHktc291cmNlJztcbmV4cG9ydCAqIGZyb20gJy4vc3RhY2stYXNzZW1ibHknO1xuZXhwb3J0ICogZnJvbSAnLi9leGVjJztcbmV4cG9ydCAqIGZyb20gJy4vcHJlcGFyZS1zb3VyY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9zb3VyY2UtYnVpbGRlcic7XG5leHBvcnQgKiBmcm9tICcuL3N0YWNrLXNlbGVjdG9ycyc7XG4iXX0=
@@ -0,0 +1,52 @@
1
+ import * as cxapi from '@aws-cdk/cx-api';
2
+ import { ToolkitServices } from '../../../toolkit/private';
3
+ import { ActionAwareIoHost } from '../../io/private';
4
+ import type { AppSynthOptions } from '../source-builder';
5
+ export { guessExecutable } from '../../../api/aws-cdk';
6
+ type Env = {
7
+ [key: string]: string;
8
+ };
9
+ type Context = {
10
+ [key: string]: any;
11
+ };
12
+ /**
13
+ * Turn the given optional output directory into a fixed output directory
14
+ */
15
+ export declare function determineOutputDirectory(outdir?: string): string;
16
+ /**
17
+ * If we don't have region/account defined in context, we fall back to the default SDK behavior
18
+ * where region is retrieved from ~/.aws/config and account is based on default credentials provider
19
+ * chain and then STS is queried.
20
+ *
21
+ * This is done opportunistically: for example, if we can't access STS for some reason or the region
22
+ * is not configured, the context value will be 'null' and there could failures down the line. In
23
+ * some cases, synthesis does not require region/account information at all, so that might be perfectly
24
+ * fine in certain scenarios.
25
+ *
26
+ * @param context The context key/value bash.
27
+ */
28
+ export declare function prepareDefaultEnvironment(services: ToolkitServices, props?: {
29
+ outdir?: string;
30
+ }): Promise<Env>;
31
+ /**
32
+ * Run code from a different working directory
33
+ */
34
+ export declare function changeDir<T>(block: () => Promise<T>, workingDir?: string): Promise<T>;
35
+ /**
36
+ * Run code with additional environment variables
37
+ */
38
+ export declare function withEnv<T>(env: Env | undefined, block: () => Promise<T>): Promise<T>;
39
+ /**
40
+ * Run code with context setup inside the environment
41
+ */
42
+ export declare function withContext<T>(inputContext: Context, env: Env, synthOpts: AppSynthOptions | undefined, block: (env: Env, context: Context) => Promise<T>): Promise<T>;
43
+ /**
44
+ * Checks if a given assembly supports context overflow, warn otherwise.
45
+ *
46
+ * @param assembly the assembly to check
47
+ */
48
+ export declare function checkContextOverflowSupport(assembly: cxapi.CloudAssembly, ioHost: ActionAwareIoHost): Promise<void>;
49
+ /**
50
+ * Safely create an assembly from a cloud assembly directory
51
+ */
52
+ export declare function assemblyFromDirectory(assemblyDir: string, ioHost: ActionAwareIoHost): Promise<cxapi.CloudAssembly>;
@@ -0,0 +1,166 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.guessExecutable = void 0;
4
+ exports.determineOutputDirectory = determineOutputDirectory;
5
+ exports.prepareDefaultEnvironment = prepareDefaultEnvironment;
6
+ exports.changeDir = changeDir;
7
+ exports.withEnv = withEnv;
8
+ exports.withContext = withContext;
9
+ exports.checkContextOverflowSupport = checkContextOverflowSupport;
10
+ exports.assemblyFromDirectory = assemblyFromDirectory;
11
+ const os = require("node:os");
12
+ const path = require("node:path");
13
+ const cxschema = require("@aws-cdk/cloud-assembly-schema");
14
+ const cxapi = require("@aws-cdk/cx-api");
15
+ const fs = require("fs-extra");
16
+ const semver_1 = require("semver");
17
+ const aws_cdk_1 = require("../../../api/aws-cdk");
18
+ const errors_1 = require("../../errors");
19
+ const private_1 = require("../../io/private");
20
+ var aws_cdk_2 = require("../../../api/aws-cdk");
21
+ Object.defineProperty(exports, "guessExecutable", { enumerable: true, get: function () { return aws_cdk_2.guessExecutable; } });
22
+ /**
23
+ * Turn the given optional output directory into a fixed output directory
24
+ */
25
+ function determineOutputDirectory(outdir) {
26
+ return outdir ?? fs.mkdtempSync(path.join(fs.realpathSync(os.tmpdir()), 'cdk.out'));
27
+ }
28
+ /**
29
+ * If we don't have region/account defined in context, we fall back to the default SDK behavior
30
+ * where region is retrieved from ~/.aws/config and account is based on default credentials provider
31
+ * chain and then STS is queried.
32
+ *
33
+ * This is done opportunistically: for example, if we can't access STS for some reason or the region
34
+ * is not configured, the context value will be 'null' and there could failures down the line. In
35
+ * some cases, synthesis does not require region/account information at all, so that might be perfectly
36
+ * fine in certain scenarios.
37
+ *
38
+ * @param context The context key/value bash.
39
+ */
40
+ async function prepareDefaultEnvironment(services, props = {}) {
41
+ const logFn = (0, private_1.asLogger)(services.ioHost, 'ASSEMBLY').debug;
42
+ const env = await (0, aws_cdk_1.prepareDefaultEnvironment)(services.sdkProvider, logFn);
43
+ if (props.outdir) {
44
+ env[cxapi.OUTDIR_ENV] = props.outdir;
45
+ await logFn('outdir:', props.outdir);
46
+ }
47
+ // CLI version information
48
+ env[cxapi.CLI_ASM_VERSION_ENV] = cxschema.Manifest.version();
49
+ env[cxapi.CLI_VERSION_ENV] = (0, aws_cdk_1.versionNumber)();
50
+ await logFn('env:', env);
51
+ return env;
52
+ }
53
+ /**
54
+ * Run code from a different working directory
55
+ */
56
+ async function changeDir(block, workingDir) {
57
+ const originalWorkingDir = process.cwd();
58
+ try {
59
+ if (workingDir) {
60
+ process.chdir(workingDir);
61
+ }
62
+ return await block();
63
+ }
64
+ finally {
65
+ if (workingDir) {
66
+ process.chdir(originalWorkingDir);
67
+ }
68
+ }
69
+ }
70
+ /**
71
+ * Run code with additional environment variables
72
+ */
73
+ async function withEnv(env = {}, block) {
74
+ const originalEnv = process.env;
75
+ try {
76
+ process.env = {
77
+ ...originalEnv,
78
+ ...env,
79
+ };
80
+ return await block();
81
+ }
82
+ finally {
83
+ process.env = originalEnv;
84
+ }
85
+ }
86
+ /**
87
+ * Run code with context setup inside the environment
88
+ */
89
+ async function withContext(inputContext, env, synthOpts = {}, block) {
90
+ const context = await (0, aws_cdk_1.prepareContext)(synthOptsDefaults(synthOpts), inputContext, env);
91
+ let contextOverflowLocation = null;
92
+ try {
93
+ const envVariableSizeLimit = os.platform() === 'win32' ? 32760 : 131072;
94
+ const [smallContext, overflow] = (0, aws_cdk_1.splitBySize)(context, (0, aws_cdk_1.spaceAvailableForContext)(env, envVariableSizeLimit));
95
+ // Store the safe part in the environment variable
96
+ env[cxapi.CONTEXT_ENV] = JSON.stringify(smallContext);
97
+ // If there was any overflow, write it to a temporary file
98
+ if (Object.keys(overflow ?? {}).length > 0) {
99
+ const contextDir = fs.mkdtempSync(path.join(os.tmpdir(), 'cdk-context'));
100
+ contextOverflowLocation = path.join(contextDir, 'context-overflow.json');
101
+ fs.writeJSONSync(contextOverflowLocation, overflow);
102
+ env[cxapi.CONTEXT_OVERFLOW_LOCATION_ENV] = contextOverflowLocation;
103
+ }
104
+ // call the block code with new environment
105
+ return await block(env, context);
106
+ }
107
+ finally {
108
+ if (contextOverflowLocation) {
109
+ fs.removeSync(path.dirname(contextOverflowLocation));
110
+ }
111
+ }
112
+ }
113
+ /**
114
+ * Checks if a given assembly supports context overflow, warn otherwise.
115
+ *
116
+ * @param assembly the assembly to check
117
+ */
118
+ async function checkContextOverflowSupport(assembly, ioHost) {
119
+ const logFn = (0, private_1.asLogger)(ioHost, 'ASSEMBLY').warn;
120
+ const tree = (0, aws_cdk_1.loadTree)(assembly);
121
+ const frameworkDoesNotSupportContextOverflow = (0, aws_cdk_1.some)(tree, node => {
122
+ const fqn = node.constructInfo?.fqn;
123
+ const version = node.constructInfo?.version;
124
+ return (fqn === 'aws-cdk-lib.App' && version != null && (0, semver_1.lte)(version, '2.38.0')) // v2
125
+ || fqn === '@aws-cdk/core.App'; // v1
126
+ });
127
+ // We're dealing with an old version of the framework here. It is unaware of the temporary
128
+ // file, which means that it will ignore the context overflow.
129
+ if (frameworkDoesNotSupportContextOverflow) {
130
+ await logFn('Part of the context could not be sent to the application. Please update the AWS CDK library to the latest version.');
131
+ }
132
+ }
133
+ /**
134
+ * Safely create an assembly from a cloud assembly directory
135
+ */
136
+ async function assemblyFromDirectory(assemblyDir, ioHost) {
137
+ try {
138
+ const assembly = new cxapi.CloudAssembly(assemblyDir, {
139
+ // We sort as we deploy
140
+ topoSort: false,
141
+ });
142
+ await checkContextOverflowSupport(assembly, ioHost);
143
+ return assembly;
144
+ }
145
+ catch (err) {
146
+ if (err.message.includes(cxschema.VERSION_MISMATCH)) {
147
+ // this means the CLI version is too old.
148
+ // we instruct the user to upgrade.
149
+ const message = 'This AWS CDK Toolkit is not compatible with the AWS CDK library used by your application. Please upgrade to the latest version.';
150
+ await ioHost.notify((0, private_1.error)(message, 'CDK_ASSEMBLY_E1111', { error: err.message }));
151
+ throw new errors_1.ToolkitError(`${message}\n(${err.message}`);
152
+ }
153
+ throw err;
154
+ }
155
+ }
156
+ function synthOptsDefaults(synthOpts = {}) {
157
+ return new aws_cdk_1.Settings({
158
+ debug: false,
159
+ pathMetadata: true,
160
+ versionReporting: true,
161
+ assetMetadata: true,
162
+ assetStaging: true,
163
+ ...synthOpts,
164
+ }, true);
165
+ }
166
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlcGFyZS1zb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJwcmVwYXJlLXNvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFvQkEsNERBRUM7QUFjRCw4REFlQztBQUtELDhCQWFDO0FBS0QsMEJBWUM7QUFLRCxrQ0ErQkM7QUFPRCxrRUFlQztBQUtELHNEQWtCQztBQXZLRCw4QkFBOEI7QUFDOUIsa0NBQWtDO0FBQ2xDLDJEQUEyRDtBQUMzRCx5Q0FBeUM7QUFDekMsK0JBQStCO0FBQy9CLG1DQUE2QjtBQUM3QixrREFBK0s7QUFFL0sseUNBQTRDO0FBQzVDLDhDQUFzRTtBQUd0RSxnREFBdUQ7QUFBOUMsMEdBQUEsZUFBZSxPQUFBO0FBS3hCOztHQUVHO0FBQ0gsU0FBZ0Isd0JBQXdCLENBQUMsTUFBZTtJQUN0RCxPQUFPLE1BQU0sSUFBSSxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBQ3RGLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7R0FXRztBQUNJLEtBQUssVUFBVSx5QkFBeUIsQ0FBQyxRQUF5QixFQUFFLFFBQTZCLEVBQUU7SUFDeEcsTUFBTSxLQUFLLEdBQUcsSUFBQSxrQkFBUSxFQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQzFELE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBQSxtQ0FBVSxFQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFMUQsSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDakIsR0FBRyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQ3JDLE1BQU0sS0FBSyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsTUFBTSxD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QUFNLFFBQVEsR0FBRyxJQUFJLEtBQUssQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFO1lBQ3BELHVCQUF1QjtZQUN2QixRQUFRLEVBQUUsS0FBSztTQUNoQixDQUFDLENBQUM7UUFDSCxNQUFNLDJCQUEyQixDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNwRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBQUMsT0FBTyxHQUFRLEVBQUUsQ0FBQztRQUNsQixJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7WUFDcEQseUNBQXlDO1lBQ3pDLG1DQUFtQztZQUNuQyxNQUFNLE9BQU8sR0FBRyxpSUFBaUksQ0FBQztZQUNsSixNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBQSxlQUFLLEVBQUMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbEYsTUFBTSxJQUFJLHFCQUFZLENBQUMsR0FBRyxPQUFPLE1BQU0sR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUNELE1BQU0sR0FBRyxDQUFDO0lBQ1osQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLFlBQTZCLEVBQUU7SUFDeEQsT0FBTyxJQUFJLGtCQUFRLENBQUM7UUFDbEIsS0FBSyxFQUFFLEtBQUs7UUFDWixZQUFZLEVBQUUsSUFBSTtRQUNsQixnQkFBZ0IsRUFBRSxJQUFJO1FBQ3RCLGFBQWEsRUFBRSxJQUFJO1FBQ25CLFlBQVksRUFBRSxJQUFJO1FBQ2xCLEdBQUcsU0FBUztLQUNiLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDWCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgKiBhcyBjeHNjaGVtYSBmcm9tICdAYXdzLWNkay9jbG91ZC1hc3NlbWJseS1zY2hlbWEnO1xuaW1wb3J0ICogYXMgY3hhcGkgZnJvbSAnQGF3cy1jZGsvY3gtYXBpJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IGx0ZSB9IGZyb20gJ3NlbXZlcic7XG5pbXBvcnQgeyBwcmVwYXJlRGVmYXVsdEVudmlyb25tZW50IGFzIG9sZFByZXBhcmUsIHByZXBhcmVDb250ZXh0LCBzcGFjZUF2YWlsYWJsZUZvckNvbnRleHQsIFNldHRpbmdzLCBsb2FkVHJlZSwgc29tZSwgc3BsaXRCeVNpemUsIHZlcnNpb25OdW1iZXIgfSBmcm9tICcuLi8uLi8uLi9hcGkvYXdzLWNkayc7XG5pbXBvcnQgeyBUb29sa2l0U2VydmljZXMgfSBmcm9tICcuLi8uLi8uLi90b29sa2l0L3ByaXZhdGUnO1xuaW1wb3J0IHsgVG9vbGtpdEVycm9yIH0gZnJvbSAnLi4vLi4vZXJyb3JzJztcbmltcG9ydCB7IEFjdGlvbkF3YXJlSW9Ib3N0LCBhc0xvZ2dlciwgZXJyb3IgfSBmcm9tICcuLi8uLi9pby9wcml2YXRlJztcbmltcG9ydCB0eXBlIHsgQXBwU3ludGhPcHRpb25zIH0gZnJvbSAnLi4vc291cmNlLWJ1aWxkZXInO1xuXG5leHBvcnQgeyBndWVzc0V4ZWN1dGFibGUgfSBmcm9tICcuLi8uLi8uLi9hcGkvYXdzLWNkayc7XG5cbnR5cGUgRW52ID0geyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbnR5cGUgQ29udGV4dCA9IHsgW2tleTogc3RyaW5nXTogYW55IH07XG5cbi8qKlxuICogVHVybiB0aGUgZ2l2ZW4gb3B0aW9uYWwgb3V0cHV0IGRpcmVjdG9yeSBpbnRvIGEgZml4ZWQgb3V0cHV0IGRpcmVjdG9yeVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZXJtaW5lT3V0cHV0RGlyZWN0b3J5KG91dGRpcj86IHN0cmluZykge1xuICByZXR1cm4gb3V0ZGlyID8/IGZzLm1rZHRlbXBTeW5jKHBhdGguam9pbihmcy5yZWFscGF0aFN5bmMob3MudG1wZGlyKCkpLCAnY2RrLm91dCcpKTtcbn1cblxuLyoqXG4gKiBJZiB3ZSBkb24ndCBoYXZlIHJlZ2lvbi9hY2NvdW50IGRlZmluZWQgaW4gY29udGV4dCwgd2UgZmFsbCBiYWNrIHRvIHRoZSBkZWZhdWx0IFNESyBiZWhhdmlvclxuICogd2hlcmUgcmVnaW9uIGlzIHJldHJpZXZlZCBmcm9tIH4vLmF3cy9jb25maWcgYW5kIGFjY291bnQgaXMgYmFzZWQgb24gZGVmYXVsdCBjcmVkZW50aWFscyBwcm92aWRlclxuICogY2hhaW4gYW5kIHRoZW4gU1RTIGlzIHF1ZXJpZWQuXG4gKlxuICogVGhpcyBpcyBkb25lIG9wcG9ydHVuaXN0aWNhbGx5OiBmb3IgZXhhbXBsZSwgaWYgd2UgY2FuJ3QgYWNjZXNzIFNUUyBmb3Igc29tZSByZWFzb24gb3IgdGhlIHJlZ2lvblxuICogaXMgbm90IGNvbmZpZ3VyZWQsIHRoZSBjb250ZXh0IHZhbHVlIHdpbGwgYmUgJ251bGwnIGFuZCB0aGVyZSBjb3VsZCBmYWlsdXJlcyBkb3duIHRoZSBsaW5lLiBJblxuICogc29tZSBjYXNlcywgc3ludGhlc2lzIGRvZXMgbm90IHJlcXVpcmUgcmVnaW9uL2FjY291bnQgaW5mb3JtYXRpb24gYXQgYWxsLCBzbyB0aGF0IG1pZ2h0IGJlIHBlcmZlY3RseVxuICogZmluZSBpbiBjZXJ0YWluIHNjZW5hcmlvcy5cbiAqXG4gKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBrZXkvdmFsdWUgYmFzaC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByZXBhcmVEZWZhdWx0RW52aXJvbm1lbnQoc2VydmljZXM6IFRvb2xraXRTZXJ2aWNlcywgcHJvcHM6IHsgb3V0ZGlyPzogc3RyaW5nIH0gPSB7fSk6IFByb21pc2U8RW52PiB7XG4gIGNvbnN0IGxvZ0ZuID0gYXNMb2dnZXIoc2VydmljZXMuaW9Ib3N0LCAnQVNTRU1CTFknKS5kZWJ1ZztcbiAgY29uc3QgZW52ID0gYXdhaXQgb2xkUHJlcGFyZShzZXJ2aWNlcy5zZGtQcm92aWRlciwgbG9nRm4pO1xuXG4gIGlmIChwcm9wcy5vdXRkaXIpIHtcbiAgICBlbnZbY3hhcGkuT1VURElSX0VOVl0gPSBwcm9wcy5vdXRkaXI7XG4gICAgYXdhaXQgbG9nRm4oJ291dGRpcjonLCBwcm9wcy5vdXRkaXIpO1xuICB9XG5cbiAgLy8gQ0xJIHZlcnNpb24gaW5mb3JtYXRpb25cbiAgZW52W2N4YXBpLkNMSV9BU01fVkVSU0lPTl9FTlZdID0gY3hzY2hlbWEuTWFuaWZlc3QudmVyc2lvbigpO1xuICBlbnZbY3hhcGkuQ0xJX1ZFUlNJT05fRU5WXSA9IHZlcnNpb25OdW1iZXIoKTtcblxuICBhd2FpdCBsb2dGbignZW52OicsIGVudik7XG4gIHJldHVybiBlbnY7XG59XG5cbi8qKlxuICogUnVuIGNvZGUgZnJvbSBhIGRpZmZlcmVudCB3b3JraW5nIGRpcmVjdG9yeVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hhbmdlRGlyPFQ+KGJsb2NrOiAoKSA9PiBQcm9taXNlPFQ+LCB3b3JraW5nRGlyPzogc3RyaW5nKSB7XG4gIGNvbnN0IG9yaWdpbmFsV29ya2luZ0RpciA9IHByb2Nlc3MuY3dkKCk7XG4gIHRyeSB7XG4gICAgaWYgKHdvcmtpbmdEaXIpIHtcbiAgICAgIHByb2Nlc3MuY2hkaXIod29ya2luZ0Rpcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IGJsb2NrKCk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKHdvcmtpbmdEaXIpIHtcbiAgICAgIHByb2Nlc3MuY2hkaXIob3JpZ2luYWxXb3JraW5nRGlyKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSdW4gY29kZSB3aXRoIGFkZGl0aW9uYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoRW52PFQ+KGVudjogRW52ID0ge30sIGJsb2NrOiAoKSA9PiBQcm9taXNlPFQ+KSB7XG4gIGNvbnN0IG9yaWdpbmFsRW52ID0gcHJvY2Vzcy5lbnY7XG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5lbnYgPSB7XG4gICAgICAuLi5vcmlnaW5hbEVudixcbiAgICAgIC4uLmVudixcbiAgICB9O1xuXG4gICAgcmV0dXJuIGF3YWl0IGJsb2NrKCk7XG4gIH0gZmluYWxseSB7XG4gICAgcHJvY2Vzcy5lbnYgPSBvcmlnaW5hbEVudjtcbiAgfVxufVxuXG4vKipcbiAqIFJ1biBjb2RlIHdpdGggY29udGV4dCBzZXR1cCBpbnNpZGUgdGhlIGVudmlyb25tZW50XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoQ29udGV4dDxUPihcbiAgaW5wdXRDb250ZXh0OiBDb250ZXh0LFxuICBlbnY6IEVudixcbiAgc3ludGhPcHRzOiBBcHBTeW50aE9wdGlvbnMgPSB7fSxcbiAgYmxvY2s6IChlbnY6IEVudiwgY29udGV4dDogQ29udGV4dCkgPT4gUHJvbWlzZTxUPixcbikge1xuICBjb25zdCBjb250ZXh0ID0gYXdhaXQgcHJlcGFyZUNvbnRleHQoc3ludGhPcHRzRGVmYXVsdHMoc3ludGhPcHRzKSwgaW5wdXRDb250ZXh0LCBlbnYpO1xuICBsZXQgY29udGV4dE92ZXJmbG93TG9jYXRpb24gPSBudWxsO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgZW52VmFyaWFibGVTaXplTGltaXQgPSBvcy5wbGF0Zm9ybSgpID09PSAnd2luMzInID8gMzI3NjAgOiAxMzEwNzI7XG4gICAgY29uc3QgW3NtYWxsQ29udGV4dCwgb3ZlcmZsb3ddID0gc3BsaXRCeVNpemUoY29udGV4dCwgc3BhY2VBdmFpbGFibGVGb3JDb250ZXh0KGVudiwgZW52VmFyaWFibGVTaXplTGltaXQpKTtcblxuICAgIC8vIFN0b3JlIHRoZSBzYWZlIHBhcnQgaW4gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlXG4gICAgZW52W2N4YXBpLkNPTlRFWFRfRU5WXSA9IEpTT04uc3RyaW5naWZ5KHNtYWxsQ29udGV4dCk7XG5cbiAgICAvLyBJZiB0aGVyZSB3YXMgYW55IG92ZXJmbG93LCB3cml0ZSBpdCB0byBhIHRlbXBvcmFyeSBmaWxlXG4gICAgaWYgKE9iamVjdC5rZXlzKG92ZXJmbG93ID8/IHt9KS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjb250ZXh0RGlyID0gZnMubWtkdGVtcFN5bmMocGF0aC5qb2luKG9zLnRtcGRpcigpLCAnY2RrLWNvbnRleHQnKSk7XG4gICAgICBjb250ZXh0T3ZlcmZsb3dMb2NhdGlvbiA9IHBhdGguam9pbihjb250ZXh0RGlyLCAnY29udGV4dC1vdmVyZmxvdy5qc29uJyk7XG4gICAgICBmcy53cml0ZUpTT05TeW5jKGNvbnRleHRPdmVyZmxvd0xvY2F0aW9uLCBvdmVyZmxvdyk7XG4gICAgICBlbnZbY3hhcGkuQ09OVEVYVF9PVkVSRkxPV19MT0NBVElPTl9FTlZdID0gY29udGV4dE92ZXJmbG93TG9jYXRpb247XG4gICAgfVxuXG4gICAgLy8gY2FsbCB0aGUgYmxvY2sgY29kZSB3aXRoIG5ldyBlbnZpcm9ubWVudFxuICAgIHJldHVybiBhd2FpdCBibG9jayhlbnYsIGNvbnRleHQpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChjb250ZXh0T3ZlcmZsb3dMb2NhdGlvbikge1xuICAgICAgZnMucmVtb3ZlU3luYyhwYXRoLmRpcm5hbWUoY29udGV4dE92ZXJmbG93TG9jYXRpb24pKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBnaXZlbiBhc3NlbWJseSBzdXBwb3J0cyBjb250ZXh0IG92ZXJmbG93LCB3YXJuIG90aGVyd2lzZS5cbiAqXG4gKiBAcGFyYW0gYXNzZW1ibHkgdGhlIGFzc2VtYmx5IHRvIGNoZWNrXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjaGVja0NvbnRleHRPdmVyZmxvd1N1cHBvcnQoYXNzZW1ibHk6IGN4YXBpLkNsb3VkQXNzZW1ibHksIGlvSG9zdDogQWN0aW9uQXdhcmVJb0hvc3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgbG9nRm4gPSBhc0xvZ2dlcihpb0hvc3QsICdBU1NFTUJMWScpLndhcm47XG4gIGNvbnN0IHRyZWUgPSBsb2FkVHJlZShhc3NlbWJseSk7XG4gIGNvbnN0IGZyYW1ld29ya0RvZXNOb3RTdXBwb3J0Q29udGV4dE92ZXJmbG93ID0gc29tZSh0cmVlLCBub2RlID0+IHtcbiAgICBjb25zdCBmcW4gPSBub2RlLmNvbnN0cnVjdEluZm8/LmZxbjtcbiAgICBjb25zdCB2ZXJzaW9uID0gbm9kZS5jb25zdHJ1Y3RJbmZvPy52ZXJzaW9uO1xuICAgIHJldHVybiAoZnFuID09PSAnYXdzLWNkay1saWIuQXBwJyAmJiB2ZXJzaW9uICE9IG51bGwgJiYgbHRlKHZlcnNpb24sICcyLjM4LjAnKSkgLy8gdjJcbiAgICB8fCBmcW4gPT09ICdAYXdzLWNkay9jb3JlLkFwcCc7IC8vIHYxXG4gIH0pO1xuXG4gIC8vIFdlJ3JlIGRlYWxpbmcgd2l0aCBhbiBvbGQgdmVyc2lvbiBvZiB0aGUgZnJhbWV3b3JrIGhlcmUuIEl0IGlzIHVuYXdhcmUgb2YgdGhlIHRlbXBvcmFyeVxuICAvLyBmaWxlLCB3aGljaCBtZWFucyB0aGF0IGl0IHdpbGwgaWdub3JlIHRoZSBjb250ZXh0IG92ZXJmbG93LlxuICBpZiAoZnJhbWV3b3JrRG9lc05vdFN1cHBvcnRDb250ZXh0T3ZlcmZsb3cpIHtcbiAgICBhd2FpdCBsb2dGbignUGFydCBvZiB0aGUgY29udGV4dCBjb3VsZCBub3QgYmUgc2VudCB0byB0aGUgYXBwbGljYXRpb24uIFBsZWFzZSB1cGRhdGUgdGhlIEFXUyBDREsgbGlicmFyeSB0byB0aGUgbGF0ZXN0IHZlcnNpb24uJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBTYWZlbHkgY3JlYXRlIGFuIGFzc2VtYmx5IGZyb20gYSBjbG91ZCBhc3NlbWJseSBkaXJlY3RvcnlcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzc2VtYmx5RnJvbURpcmVjdG9yeShhc3NlbWJseURpcjogc3RyaW5nLCBpb0hvc3Q6IEFjdGlvbkF3YXJlSW9Ib3N0KSB7XG4gIHRyeSB7XG4gICAgY29uc3QgYXNzZW1ibHkgPSBuZXcgY3hhcGkuQ2xvdWRBc3NlbWJseShhc3NlbWJseURpciwge1xuICAgICAgLy8gV2Ugc29ydCBhcyB3ZSBkZXBsb3lcbiAgICAgIHRvcG9Tb3J0OiBmYWxzZSxcbiAgICB9KTtcbiAgICBhd2FpdCBjaGVja0NvbnRleHRPdmVyZmxvd1N1cHBvcnQoYXNzZW1ibHksIGlvSG9zdCk7XG4gICAgcmV0dXJuIGFzc2VtYmx5O1xuICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgIGlmIChlcnIubWVzc2FnZS5pbmNsdWRlcyhjeHNjaGVtYS5WRVJTSU9OX01JU01BVENIKSkge1xuICAgICAgLy8gdGhpcyBtZWFucyB0aGUgQ0xJIHZlcnNpb24gaXMgdG9vIG9sZC5cbiAgICAgIC8vIHdlIGluc3RydWN0IHRoZSB1c2VyIHRvIHVwZ3JhZGUuXG4gICAgICBjb25zdCBtZXNzYWdlID0gJ1RoaXMgQVdTIENESyBUb29sa2l0IGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIEFXUyBDREsgbGlicmFyeSB1c2VkIGJ5IHlvdXIgYXBwbGljYXRpb24uIFBsZWFzZSB1cGdyYWRlIHRvIHRoZSBsYXRlc3QgdmVyc2lvbi4nO1xuICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeShlcnJvcihtZXNzYWdlLCAnQ0RLX0FTU0VNQkxZX0UxMTExJywgeyBlcnJvcjogZXJyLm1lc3NhZ2UgfSkpO1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihgJHttZXNzYWdlfVxcbigke2Vyci5tZXNzYWdlfWApO1xuICAgIH1cbiAgICB0aHJvdyBlcnI7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3ludGhPcHRzRGVmYXVsdHMoc3ludGhPcHRzOiBBcHBTeW50aE9wdGlvbnMgPSB7fSk6IFNldHRpbmdzIHtcbiAgcmV0dXJuIG5ldyBTZXR0aW5ncyh7XG4gICAgZGVidWc6IGZhbHNlLFxuICAgIHBhdGhNZXRhZGF0YTogdHJ1ZSxcbiAgICB2ZXJzaW9uUmVwb3J0aW5nOiB0cnVlLFxuICAgIGFzc2V0TWV0YWRhdGE6IHRydWUsXG4gICAgYXNzZXRTdGFnaW5nOiB0cnVlLFxuICAgIC4uLnN5bnRoT3B0cyxcbiAgfSwgdHJ1ZSk7XG59XG4iXX0=