@cdktn/bundler-local 0.0.0 → 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.
package/.jsii ADDED
@@ -0,0 +1,346 @@
1
+ {
2
+ "author": {
3
+ "name": "cdktn-io",
4
+ "organization": true,
5
+ "roles": [
6
+ "author"
7
+ ],
8
+ "url": "https://cdktn.io"
9
+ },
10
+ "dependencies": {
11
+ "cdktn": "^0.25.0",
12
+ "constructs": "^10.6.0"
13
+ },
14
+ "dependencyClosure": {
15
+ "cdktn": {
16
+ "submodules": {
17
+ "cdktn.testingMatchers": {}
18
+ },
19
+ "targets": {
20
+ "dotnet": {
21
+ "namespace": "Io.Cdktn",
22
+ "packageId": "Io.Cdktn"
23
+ },
24
+ "go": {
25
+ "moduleName": "github.com/open-constructs/cdk-terrain-go",
26
+ "packageName": "cdktn"
27
+ },
28
+ "java": {
29
+ "maven": {
30
+ "artifactId": "cdktn",
31
+ "groupId": "io.cdktn"
32
+ },
33
+ "package": "io.cdktn.cdktn"
34
+ },
35
+ "js": {
36
+ "npm": "cdktn"
37
+ },
38
+ "python": {
39
+ "distName": "cdktn",
40
+ "module": "cdktn"
41
+ }
42
+ }
43
+ },
44
+ "constructs": {
45
+ "targets": {
46
+ "dotnet": {
47
+ "namespace": "Constructs",
48
+ "packageId": "Constructs"
49
+ },
50
+ "go": {
51
+ "moduleName": "github.com/aws/constructs-go"
52
+ },
53
+ "java": {
54
+ "maven": {
55
+ "artifactId": "constructs",
56
+ "groupId": "software.constructs"
57
+ },
58
+ "package": "software.constructs"
59
+ },
60
+ "js": {
61
+ "npm": "constructs"
62
+ },
63
+ "python": {
64
+ "distName": "constructs",
65
+ "module": "constructs"
66
+ }
67
+ }
68
+ }
69
+ },
70
+ "description": "Host-process asset bundler for CDK Terrain",
71
+ "homepage": "https://github.com/cdktn-io/cdktn-bundlers.git",
72
+ "jsiiVersion": "6.0.20 (build 338bb97)",
73
+ "license": "MPL-2.0",
74
+ "metadata": {
75
+ "jsii": {
76
+ "pacmak": {
77
+ "hasDefaultInterfaces": true
78
+ }
79
+ },
80
+ "tscOutDir": "lib",
81
+ "tscRootDir": "src"
82
+ },
83
+ "name": "@cdktn/bundler-local",
84
+ "readme": {
85
+ "markdown": "# @cdktn/bundler-local\n\nHost-process asset bundler for [CDK Terrain](https://github.com/open-constructs/cdk-terrain).\n\n`LocalBundler` runs a build command directly on the machine performing the\nsynth and stages its output as a `TerraformAsset`. The required toolchain must\nalready be installed on the host; for an isolated, reproducible build use\n`@cdktn/bundler-docker` instead.\n\n## Usage\n\n```ts\nimport { TerraformAsset, AssetType } from \"cdktn\";\nimport { LocalBundler } from \"@cdktn/bundler-local\";\n\nnew TerraformAsset(this, \"asset\", {\n path: \"./src\",\n type: AssetType.DIRECTORY,\n bundler: new LocalBundler({\n command: [\"sh\", \"-c\", \"npm run build -- --out-dir \\\"$ASSET_OUTPUT_DIR\\\"\"],\n }),\n});\n```\n\nThe command is spawned directly, without a shell, so environment variable\nreferences like `$ASSET_OUTPUT_DIR` are only expanded if the command itself is a\nshell (`sh -c \"...\"` as above). Two variables are set for it:\n\n- `ASSET_INPUT_DIR` — the asset source (read-only).\n- `ASSET_OUTPUT_DIR` — a caller-owned directory the build writes its artifact into.\n\n### Windows\n\n`LocalBundler` resolves `npm`, `npx`, `pnpm`, and `.cmd`/`.bat` shims under\n`node_modules/.bin` the same way [`cross-spawn`][cross-spawn] does, so these\ncommands work on Windows without a shell. A bare name like `\"tsc\"` is only\nfound this way when the directory containing its shim (for example\n`node_modules/.bin`) is on `PATH`; otherwise pass a relative or absolute path\nto it instead.\n\nThe `sh -c \"...\"` form in the example above still needs `sh` on `PATH` (for\nexample through Git Bash or WSL), since Windows has no built-in shell of that\nname. A command that does not need a shell, such as a package.json script run\ndirectly (`[\"npm\", \"run\", \"build\"]`), works on Windows without that\ndependency.\n\nA script run directly (for example `[\"./build.js\"]`) relies on Windows file\nassociation, not on a shebang line, to pick an interpreter — pass the\ninterpreter explicitly instead (`[\"node\", \"build.js\"]`).\n\n[cross-spawn]: https://github.com/moxystudio/node-cross-spawn\n\n## License\n\nMozilla Public License 2.0\n"
86
+ },
87
+ "repository": {
88
+ "directory": "packages/local",
89
+ "type": "git",
90
+ "url": "https://github.com/cdktn-io/cdktn-bundlers.git"
91
+ },
92
+ "schema": "jsii/0.10.0",
93
+ "targets": {
94
+ "dotnet": {
95
+ "namespace": "Io.Cdktn.Bundler.Local",
96
+ "packageId": "Io.Cdktn.Bundler.Local"
97
+ },
98
+ "go": {
99
+ "moduleName": "github.com/cdktn-io/cdktn-bundlers-go",
100
+ "packageName": "bundlerlocal"
101
+ },
102
+ "java": {
103
+ "maven": {
104
+ "artifactId": "cdktn-bundler-local",
105
+ "groupId": "io.cdktn"
106
+ },
107
+ "package": "io.cdktn.bundler.local"
108
+ },
109
+ "js": {
110
+ "npm": "@cdktn/bundler-local"
111
+ },
112
+ "python": {
113
+ "distName": "cdktn-bundler-local",
114
+ "module": "cdktn_bundler_local"
115
+ }
116
+ },
117
+ "types": {
118
+ "@cdktn/bundler-local.LocalBundler": {
119
+ "assembly": "@cdktn/bundler-local",
120
+ "docs": {
121
+ "remarks": "The command is spawned with the asset source and a caller-owned output\ndirectory exposed through the `ASSET_INPUT_DIR` and `ASSET_OUTPUT_DIR`\nenvironment variables. Unlike a container bundler, the build runs directly\non the machine performing the synth, so the required toolchain must already\nbe installed there.",
122
+ "summary": "Runs a build command on the host and stages its output as a CDK for Terraform asset."
123
+ },
124
+ "fqn": "@cdktn/bundler-local.LocalBundler",
125
+ "initializer": {
126
+ "locationInModule": {
127
+ "filename": "src/local-bundler.ts",
128
+ "line": 94
129
+ },
130
+ "parameters": [
131
+ {
132
+ "name": "props",
133
+ "type": {
134
+ "fqn": "@cdktn/bundler-local.LocalBundlerProps"
135
+ }
136
+ }
137
+ ]
138
+ },
139
+ "interfaces": [
140
+ "cdktn.IAssetBundler"
141
+ ],
142
+ "kind": "class",
143
+ "locationInModule": {
144
+ "filename": "src/local-bundler.ts",
145
+ "line": 85
146
+ },
147
+ "methods": [
148
+ {
149
+ "docs": {
150
+ "remarks": "Implementations write into `options.outputDir` and never write back to\n`options.source`. The returned path must exist and match its declared\nshape, or staging rejects it.\n\nA bundler that cannot run in this environment returns\n`BundleResult.declined()` so a {@link ChainBundler} can fall through to\nthe next; a thrown error is a hard failure, not a decline.",
151
+ "summary": "Produce the artifact and return a {@link BundleResult} describing it."
152
+ },
153
+ "locationInModule": {
154
+ "filename": "src/local-bundler.ts",
155
+ "line": 130
156
+ },
157
+ "name": "bundle",
158
+ "overrides": "cdktn.IAssetBundler",
159
+ "parameters": [
160
+ {
161
+ "name": "options",
162
+ "type": {
163
+ "fqn": "cdktn.BundleOptions"
164
+ }
165
+ }
166
+ ],
167
+ "returns": {
168
+ "type": {
169
+ "fqn": "cdktn.BundleResult"
170
+ }
171
+ }
172
+ }
173
+ ],
174
+ "name": "LocalBundler",
175
+ "properties": [
176
+ {
177
+ "docs": {
178
+ "remarks": "The source tree alone cannot see the build, so swapping a `node:18` base\nimage for `node:20` would otherwise leave identity unchanged. Under\n`SOURCE` hashing this is the only channel by which the build reaches\nidentity, so it must serialize every input that can move the output, or a\nchanged build silently reuses a stale artifact. {@link BundlerKey} builds\none from an ordered set of parts.\n\nMirrors {@link IIgnoreStrategy.cacheKey}: omit it when the build cannot be\nsummarized as a string, and fall back to `extraHash`.",
179
+ "summary": "A value identifying the build, folded into the asset hash."
180
+ },
181
+ "immutable": true,
182
+ "locationInModule": {
183
+ "filename": "src/local-bundler.ts",
184
+ "line": 86
185
+ },
186
+ "name": "bundlerKey",
187
+ "optional": true,
188
+ "overrides": "cdktn.IAssetBundler",
189
+ "type": {
190
+ "primitive": "string"
191
+ }
192
+ },
193
+ {
194
+ "docs": {
195
+ "remarks": "A file-producing bundler (`BundleResult.file`) staged with\n`AssetType.FILE` would otherwise take the source path's basename, which is\na directory name when the source is a directory. Declaring the name here\nlets the artifact reflect what the bundler produces. It is static\nconfiguration, needed at construction before a deferred `SOURCE` build\nruns, not the file's runtime name.\n\nValid only for a file-producing bundler: setting it with a directory\npackaging (anything but `AssetType.FILE`) is rejected at construction.",
196
+ "summary": "The name a single-file artifact is staged under (e.g. `archive.zip`)."
197
+ },
198
+ "immutable": true,
199
+ "locationInModule": {
200
+ "filename": "src/local-bundler.ts",
201
+ "line": 87
202
+ },
203
+ "name": "outputFileName",
204
+ "optional": true,
205
+ "overrides": "cdktn.IAssetBundler",
206
+ "type": {
207
+ "primitive": "string"
208
+ }
209
+ }
210
+ ],
211
+ "symbolId": "src/local-bundler:LocalBundler"
212
+ },
213
+ "@cdktn/bundler-local.LocalBundlerProps": {
214
+ "assembly": "@cdktn/bundler-local",
215
+ "datatype": true,
216
+ "docs": {
217
+ "summary": "Configuration for {@link LocalBundler}."
218
+ },
219
+ "fqn": "@cdktn/bundler-local.LocalBundlerProps",
220
+ "kind": "interface",
221
+ "locationInModule": {
222
+ "filename": "src/local-bundler.ts",
223
+ "line": 19
224
+ },
225
+ "name": "LocalBundlerProps",
226
+ "properties": [
227
+ {
228
+ "abstract": true,
229
+ "docs": {
230
+ "remarks": "The first element is the program; the rest are its arguments. The command\nruns with `ASSET_INPUT_DIR` set to the source and `ASSET_OUTPUT_DIR` set\nto the output directory, and it is expected to write the built artifact\ninto `ASSET_OUTPUT_DIR`.",
231
+ "summary": "The command to run on the host, as an argv array."
232
+ },
233
+ "immutable": true,
234
+ "locationInModule": {
235
+ "filename": "src/local-bundler.ts",
236
+ "line": 28
237
+ },
238
+ "name": "command",
239
+ "type": {
240
+ "collection": {
241
+ "elementtype": {
242
+ "primitive": "string"
243
+ },
244
+ "kind": "array"
245
+ }
246
+ }
247
+ },
248
+ {
249
+ "abstract": true,
250
+ "docs": {
251
+ "default": "- only the caller's environment plus `ASSET_INPUT_DIR` and\n`ASSET_OUTPUT_DIR`",
252
+ "summary": "Environment variables to set for the command."
253
+ },
254
+ "immutable": true,
255
+ "locationInModule": {
256
+ "filename": "src/local-bundler.ts",
257
+ "line": 36
258
+ },
259
+ "name": "environment",
260
+ "optional": true,
261
+ "type": {
262
+ "collection": {
263
+ "elementtype": {
264
+ "primitive": "string"
265
+ },
266
+ "kind": "map"
267
+ }
268
+ }
269
+ },
270
+ {
271
+ "abstract": true,
272
+ "docs": {
273
+ "default": "- nothing extra is folded in",
274
+ "summary": "Extra content folded into the bundler key so a change to it invalidates the asset hash even when the source and command are unchanged."
275
+ },
276
+ "immutable": true,
277
+ "locationInModule": {
278
+ "filename": "src/local-bundler.ts",
279
+ "line": 61
280
+ },
281
+ "name": "extraHash",
282
+ "optional": true,
283
+ "type": {
284
+ "primitive": "string"
285
+ }
286
+ },
287
+ {
288
+ "abstract": true,
289
+ "docs": {
290
+ "default": "- the basename of the asset source path",
291
+ "remarks": "Only meaningful when the result is a single file staged as\n`AssetType.FILE`. Without it, a file produced from a directory source is\nstaged under the source directory's basename.",
292
+ "summary": "The file name to stage a single-file artifact under."
293
+ },
294
+ "immutable": true,
295
+ "locationInModule": {
296
+ "filename": "src/local-bundler.ts",
297
+ "line": 72
298
+ },
299
+ "name": "outputFileName",
300
+ "optional": true,
301
+ "type": {
302
+ "primitive": "string"
303
+ }
304
+ },
305
+ {
306
+ "abstract": true,
307
+ "docs": {
308
+ "default": "- `FILE` when `outputFileName` is set, otherwise `DIRECTORY`",
309
+ "remarks": "`DIRECTORY` stages the output directory. `FILE` requires the command to\nwrite exactly one file and stages that file.",
310
+ "summary": "The shape of the artifact the command writes to `ASSET_OUTPUT_DIR`."
311
+ },
312
+ "immutable": true,
313
+ "locationInModule": {
314
+ "filename": "src/local-bundler.ts",
315
+ "line": 53
316
+ },
317
+ "name": "outputType",
318
+ "optional": true,
319
+ "type": {
320
+ "fqn": "cdktn.BundleOutputType"
321
+ }
322
+ },
323
+ {
324
+ "abstract": true,
325
+ "docs": {
326
+ "default": "- the asset source directory, or its parent for a file source",
327
+ "summary": "The working directory the command runs in."
328
+ },
329
+ "immutable": true,
330
+ "locationInModule": {
331
+ "filename": "src/local-bundler.ts",
332
+ "line": 43
333
+ },
334
+ "name": "workingDirectory",
335
+ "optional": true,
336
+ "type": {
337
+ "primitive": "string"
338
+ }
339
+ }
340
+ ],
341
+ "symbolId": "src/local-bundler:LocalBundlerProps"
342
+ }
343
+ },
344
+ "version": "0.1.0",
345
+ "fingerprint": "Q7EtMMHSRw4iZSdcMFvvOvmWxQpTLuyvz87GCTEN13A="
346
+ }
package/README.md CHANGED
@@ -1,3 +1,55 @@
1
1
  # @cdktn/bundler-local
2
2
 
3
- Placeholder (0.0.0) that registers this package name so npm trusted publishing can be configured. Real releases are published from https://github.com/cdktn-io/cdktn-bundlers.
3
+ Host-process asset bundler for [CDK Terrain](https://github.com/open-constructs/cdk-terrain).
4
+
5
+ `LocalBundler` runs a build command directly on the machine performing the
6
+ synth and stages its output as a `TerraformAsset`. The required toolchain must
7
+ already be installed on the host; for an isolated, reproducible build use
8
+ `@cdktn/bundler-docker` instead.
9
+
10
+ ## Usage
11
+
12
+ ```ts
13
+ import { TerraformAsset, AssetType } from "cdktn";
14
+ import { LocalBundler } from "@cdktn/bundler-local";
15
+
16
+ new TerraformAsset(this, "asset", {
17
+ path: "./src",
18
+ type: AssetType.DIRECTORY,
19
+ bundler: new LocalBundler({
20
+ command: ["sh", "-c", "npm run build -- --out-dir \"$ASSET_OUTPUT_DIR\""],
21
+ }),
22
+ });
23
+ ```
24
+
25
+ The command is spawned directly, without a shell, so environment variable
26
+ references like `$ASSET_OUTPUT_DIR` are only expanded if the command itself is a
27
+ shell (`sh -c "..."` as above). Two variables are set for it:
28
+
29
+ - `ASSET_INPUT_DIR` — the asset source (read-only).
30
+ - `ASSET_OUTPUT_DIR` — a caller-owned directory the build writes its artifact into.
31
+
32
+ ### Windows
33
+
34
+ `LocalBundler` resolves `npm`, `npx`, `pnpm`, and `.cmd`/`.bat` shims under
35
+ `node_modules/.bin` the same way [`cross-spawn`][cross-spawn] does, so these
36
+ commands work on Windows without a shell. A bare name like `"tsc"` is only
37
+ found this way when the directory containing its shim (for example
38
+ `node_modules/.bin`) is on `PATH`; otherwise pass a relative or absolute path
39
+ to it instead.
40
+
41
+ The `sh -c "..."` form in the example above still needs `sh` on `PATH` (for
42
+ example through Git Bash or WSL), since Windows has no built-in shell of that
43
+ name. A command that does not need a shell, such as a package.json script run
44
+ directly (`["npm", "run", "build"]`), works on Windows without that
45
+ dependency.
46
+
47
+ A script run directly (for example `["./build.js"]`) relies on Windows file
48
+ association, not on a shebang line, to pick an interpreter — pass the
49
+ interpreter explicitly instead (`["node", "build.js"]`).
50
+
51
+ [cross-spawn]: https://github.com/moxystudio/node-cross-spawn
52
+
53
+ ## License
54
+
55
+ Mozilla Public License 2.0
package/lib/index.d.ts ADDED
@@ -0,0 +1 @@
1
+ export * from "./local-bundler";
package/lib/index.js ADDED
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ // Copyright (c) cdktn-io
3
+ // SPDX-License-Identifier: MPL-2.0
4
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
5
+ if (k2 === undefined) k2 = k;
6
+ var desc = Object.getOwnPropertyDescriptor(m, k);
7
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
8
+ desc = { enumerable: true, get: function() { return m[k]; } };
9
+ }
10
+ Object.defineProperty(o, k2, desc);
11
+ }) : (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ o[k2] = m[k];
14
+ }));
15
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
17
+ };
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ __exportStar(require("./local-bundler"), exports);
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHlCQUF5QjtBQUN6QixtQ0FBbUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFbkMsa0RBQWdDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSBjZGt0bi1pb1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcblxuZXhwb3J0ICogZnJvbSBcIi4vbG9jYWwtYnVuZGxlclwiO1xuIl19
@@ -0,0 +1,76 @@
1
+ import { BundleOptions, BundleOutputType, BundleResult, IAssetBundler } from "cdktn";
2
+ /**
3
+ * Configuration for {@link LocalBundler}.
4
+ */
5
+ export interface LocalBundlerProps {
6
+ /**
7
+ * The command to run on the host, as an argv array.
8
+ *
9
+ * The first element is the program; the rest are its arguments. The command
10
+ * runs with `ASSET_INPUT_DIR` set to the source and `ASSET_OUTPUT_DIR` set
11
+ * to the output directory, and it is expected to write the built artifact
12
+ * into `ASSET_OUTPUT_DIR`.
13
+ */
14
+ readonly command: string[];
15
+ /**
16
+ * Environment variables to set for the command.
17
+ *
18
+ * @default - only the caller's environment plus `ASSET_INPUT_DIR` and
19
+ * `ASSET_OUTPUT_DIR`
20
+ */
21
+ readonly environment?: {
22
+ [key: string]: string;
23
+ };
24
+ /**
25
+ * The working directory the command runs in.
26
+ *
27
+ * @default - the asset source directory, or its parent for a file source
28
+ */
29
+ readonly workingDirectory?: string;
30
+ /**
31
+ * The shape of the artifact the command writes to `ASSET_OUTPUT_DIR`.
32
+ *
33
+ * `DIRECTORY` stages the output directory. `FILE` requires the command to
34
+ * write exactly one file and stages that file.
35
+ *
36
+ * @default - `FILE` when `outputFileName` is set, otherwise `DIRECTORY`
37
+ */
38
+ readonly outputType?: BundleOutputType;
39
+ /**
40
+ * Extra content folded into the bundler key so a change to it invalidates
41
+ * the asset hash even when the source and command are unchanged.
42
+ *
43
+ * @default - nothing extra is folded in
44
+ */
45
+ readonly extraHash?: string;
46
+ /**
47
+ * The file name to stage a single-file artifact under.
48
+ *
49
+ * Only meaningful when the result is a single file staged as
50
+ * `AssetType.FILE`. Without it, a file produced from a directory source is
51
+ * staged under the source directory's basename.
52
+ *
53
+ * @default - the basename of the asset source path
54
+ */
55
+ readonly outputFileName?: string;
56
+ }
57
+ /**
58
+ * Runs a build command on the host and stages its output as a CDK for
59
+ * Terraform asset.
60
+ *
61
+ * The command is spawned with the asset source and a caller-owned output
62
+ * directory exposed through the `ASSET_INPUT_DIR` and `ASSET_OUTPUT_DIR`
63
+ * environment variables. Unlike a container bundler, the build runs directly
64
+ * on the machine performing the synth, so the required toolchain must already
65
+ * be installed there.
66
+ */
67
+ export declare class LocalBundler implements IAssetBundler {
68
+ readonly bundlerKey?: string;
69
+ readonly outputFileName?: string;
70
+ private readonly command;
71
+ private readonly environment?;
72
+ private readonly workingDirectory?;
73
+ private readonly outputType;
74
+ constructor(props: LocalBundlerProps);
75
+ bundle(options: BundleOptions): BundleResult;
76
+ }
@@ -0,0 +1,170 @@
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
+ exports.LocalBundler = void 0;
37
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
38
+ // Copyright (c) cdktn-io
39
+ // SPDX-License-Identifier: MPL-2.0
40
+ const crypto_1 = require("crypto");
41
+ const fs_1 = require("fs");
42
+ const path = __importStar(require("path"));
43
+ const cdktn_1 = require("cdktn");
44
+ const windows_spawn_1 = require("./windows-spawn");
45
+ /**
46
+ * Runs a build command on the host and stages its output as a CDK for
47
+ * Terraform asset.
48
+ *
49
+ * The command is spawned with the asset source and a caller-owned output
50
+ * directory exposed through the `ASSET_INPUT_DIR` and `ASSET_OUTPUT_DIR`
51
+ * environment variables. Unlike a container bundler, the build runs directly
52
+ * on the machine performing the synth, so the required toolchain must already
53
+ * be installed there.
54
+ */
55
+ class LocalBundler {
56
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@cdktn/bundler-local.LocalBundler", version: "0.1.0" };
57
+ bundlerKey;
58
+ outputFileName;
59
+ command;
60
+ environment;
61
+ workingDirectory;
62
+ outputType;
63
+ constructor(props) {
64
+ this.command = props.command;
65
+ this.environment = props.environment;
66
+ this.workingDirectory = props.workingDirectory;
67
+ this.outputType =
68
+ props.outputType ??
69
+ (props.outputFileName
70
+ ? cdktn_1.BundleOutputType.FILE
71
+ : cdktn_1.BundleOutputType.DIRECTORY);
72
+ this.outputFileName = props.outputFileName;
73
+ // The source tree cannot observe the build, so every input that can move
74
+ // the output has to reach identity through the key: command, working
75
+ // directory, environment and the declared output shape. Each segment is
76
+ // labelled so a value in one field can never serialise to the same string
77
+ // as a value in another (e.g. an environment entry vs. an extraHash).
78
+ let key = cdktn_1.BundlerKey.of("local")
79
+ .add(`cmd=${JSON.stringify(this.command)}`)
80
+ .add(`out=${this.outputType}`)
81
+ .add(`cwd=${this.workingDirectory ?? ""}`);
82
+ if (this.environment) {
83
+ key = key.add(...Object.keys(this.environment)
84
+ .sort()
85
+ .map((k) => `env=${k}=${this.environment[k]}`));
86
+ }
87
+ if (props.extraHash) {
88
+ key = key.add(`extra=${props.extraHash}`);
89
+ }
90
+ this.bundlerKey = `local::${(0, crypto_1.createHash)("sha256")
91
+ .update(key.toString())
92
+ .digest("hex")
93
+ .slice(0, 16)}`;
94
+ }
95
+ bundle(options) {
96
+ const { source, outputDir } = options;
97
+ const [program, ...args] = this.command;
98
+ const cwd = this.workingDirectory ??
99
+ ((0, fs_1.existsSync)(source) && (0, fs_1.statSync)(source).isFile()
100
+ ? path.dirname(source)
101
+ : source);
102
+ // Node reports ENOENT for a missing cwd too, which would otherwise be
103
+ // mistaken for a missing program and silently decline.
104
+ if (!(0, fs_1.existsSync)(cwd) || !(0, fs_1.statSync)(cwd).isDirectory()) {
105
+ throw new Error(`Local bundling working directory does not exist: ${cwd}`);
106
+ }
107
+ const result = (0, windows_spawn_1.spawnSyncCrossPlatform)(program, args, {
108
+ cwd,
109
+ // Stream the build's output straight through instead of capturing it:
110
+ // capturing is bounded by spawnSync's 1 MiB maxBuffer, which SIGTERMs a
111
+ // verbose build (e.g. `npm ci`) with ENOBUFS, and hides output until the
112
+ // build exits.
113
+ stdio: ["ignore", process.stderr, "inherit"],
114
+ env: {
115
+ ...process.env,
116
+ ...this.environment,
117
+ ASSET_INPUT_DIR: source,
118
+ ASSET_OUTPUT_DIR: outputDir,
119
+ },
120
+ });
121
+ if (result.error) {
122
+ // A missing toolchain is not a hard failure: declining lets a
123
+ // ChainBundler fall through to its next bundler (the local-then-Docker
124
+ // case the ChainBundler docs describe). Any other spawn error is real.
125
+ if (isSpawnUnavailable(result.error)) {
126
+ return cdktn_1.BundleResult.declined();
127
+ }
128
+ throw result.error;
129
+ }
130
+ if (result.status !== 0) {
131
+ const reason = result.signal != null
132
+ ? `signal ${result.signal}`
133
+ : `status ${result.status}`;
134
+ throw new Error(`Local bundling exited with ${reason} (${program} ${args.join(" ")})`);
135
+ }
136
+ if (!(0, fs_1.existsSync)(outputDir)) {
137
+ throw new Error(`Local bundling did not create the output directory ${outputDir}`);
138
+ }
139
+ if (this.outputType === cdktn_1.BundleOutputType.DIRECTORY) {
140
+ return cdktn_1.BundleResult.directory(outputDir);
141
+ }
142
+ return cdktn_1.BundleResult.file(determineBundledArtifact(outputDir));
143
+ }
144
+ }
145
+ exports.LocalBundler = LocalBundler;
146
+ /**
147
+ * Whether a spawn error means the command could not be run at all.
148
+ *
149
+ * These signal an absent or non-executable toolchain, which a chain of
150
+ * bundlers should be allowed to skip past rather than fail on.
151
+ */
152
+ function isSpawnUnavailable(error) {
153
+ return error.code === "ENOENT" || error.code === "EACCES";
154
+ }
155
+ /**
156
+ * Resolves the single file produced for `BundleOutputType.FILE` inside an
157
+ * output directory.
158
+ */
159
+ function determineBundledArtifact(outputDir) {
160
+ // Require exactly one file. Picking the first of several in readdir order
161
+ // would stage a different artifact depending on the filesystem (e.g.
162
+ // bundle.zip vs. its sibling bundle.zip.sha256).
163
+ const files = (0, fs_1.readdirSync)(outputDir).filter((entry) => (0, fs_1.statSync)(path.join(outputDir, entry)).isFile());
164
+ if (files.length !== 1) {
165
+ throw new Error(`Bundling output directory must contain exactly one file for ` +
166
+ `output type ${cdktn_1.BundleOutputType.FILE}, found ${files.length}: ${outputDir}`);
167
+ }
168
+ return path.join(outputDir, files[0]);
169
+ }
170
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWwtYnVuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9sb2NhbC1idW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx5QkFBeUI7QUFDekIsbUNBQW1DO0FBRW5DLG1DQUFvQztBQUNwQywyQkFBdUQ7QUFDdkQsMkNBQTZCO0FBQzdCLGlDQU1lO0FBQ2YsbURBQXlEO0FBNkR6RDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFhLFlBQVk7O0lBQ1AsVUFBVSxDQUFVO0lBQ3BCLGNBQWMsQ0FBVTtJQUV2QixPQUFPLENBQVc7SUFDbEIsV0FBVyxDQUE2QjtJQUN4QyxnQkFBZ0IsQ0FBVTtJQUMxQixVQUFVLENBQW1CO0lBRTlDLFlBQVksS0FBd0I7UUFDbEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQzdCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztRQUNyQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDO1FBQy9DLElBQUksQ0FBQyxVQUFVO1lBQ2IsS0FBSyxDQUFDLFVBQVU7Z0JBQ2hCLENBQUMsS0FBSyxDQUFDLGNBQWM7b0JBQ25CLENBQUMsQ0FBQyx3QkFBZ0IsQ0FBQyxJQUFJO29CQUN2QixDQUFDLENBQUMsd0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDO1FBRTNDLHlFQUF5RTtRQUN6RSxxRUFBcUU7UUFDckUsd0VBQXdFO1FBQ3hFLDBFQUEwRTtRQUMxRSxzRUFBc0U7UUFDdEUsSUFBSSxHQUFHLEdBQUcsa0JBQVUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDO2FBQzdCLEdBQUcsQ0FBQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8s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Qy9DLENBQUM7SUFDRixJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FDYiw4REFBOEQ7WUFDNUQsZUFBZSx3QkFBZ0IsQ0FBQyxJQUFJLFdBQVcsS0FBSyxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FDOUUsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIGNka3RuLWlvXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTVBMLTIuMFxuXG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSBcImNyeXB0b1wiO1xuaW1wb3J0IHsgZXhpc3RzU3luYywgcmVhZGRpclN5bmMsIHN0YXRTeW5jIH0gZnJvbSBcImZzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQge1xuICBCdW5kbGVPcHRpb25zLFxuICBCdW5kbGVPdXRwdXRUeXBlLFxuICBCdW5kbGVSZXN1bHQsXG4gIEJ1bmRsZXJLZXksXG4gIElBc3NldEJ1bmRsZXIsXG59IGZyb20gXCJjZGt0blwiO1xuaW1wb3J0IHsgc3Bhd25TeW5jQ3Jvc3NQbGF0Zm9ybSB9IGZyb20gXCIuL3dpbmRvd3Mtc3Bhd25cIjtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciB7QGxpbmsgTG9jYWxCdW5kbGVyfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2NhbEJ1bmRsZXJQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgY29tbWFuZCB0byBydW4gb24gdGhlIGhvc3QsIGFzIGFuIGFyZ3YgYXJyYXkuXG4gICAqXG4gICAqIFRoZSBmaXJzdCBlbGVtZW50IGlzIHRoZSBwcm9ncmFtOyB0aGUgcmVzdCBhcmUgaXRzIGFyZ3VtZW50cy4gVGhlIGNvbW1hbmRcbiAgICogcnVucyB3aXRoIGBBU1NFVF9JTlBVVF9ESVJgIHNldCB0byB0aGUgc291cmNlIGFuZCBgQVNTRVRfT1VUUFVUX0RJUmAgc2V0XG4gICAqIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LCBhbmQgaXQgaXMgZXhwZWN0ZWQgdG8gd3JpdGUgdGhlIGJ1aWx0IGFydGlmYWN0XG4gICAqIGludG8gYEFTU0VUX09VVFBVVF9ESVJgLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEVudmlyb25tZW50IHZhcmlhYmxlcyB0byBzZXQgZm9yIHRoZSBjb21tYW5kLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG9ubHkgdGhlIGNhbGxlcidzIGVudmlyb25tZW50IHBsdXMgYEFTU0VUX0lOUFVUX0RJUmAgYW5kXG4gICAqIGBBU1NFVF9PVVRQVVRfRElSYFxuICAgKi9cbiAgcmVhZG9ubHkgZW52aXJvbm1lbnQ/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBUaGUgd29ya2luZyBkaXJlY3RvcnkgdGhlIGNvbW1hbmQgcnVucyBpbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgYXNzZXQgc291cmNlIGRpcmVjdG9yeSwgb3IgaXRzIHBhcmVudCBmb3IgYSBmaWxlIHNvdXJjZVxuICAgKi9cbiAgcmVhZG9ubHkgd29ya2luZ0RpcmVjdG9yeT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNoYXBlIG9mIHRoZSBhcnRpZmFjdCB0aGUgY29tbWFuZCB3cml0ZXMgdG8gYEFTU0VUX09VVFBVVF9ESVJgLlxuICAgKlxuICAgKiBgRElSRUNUT1JZYCBzdGFnZXMgdGhlIG91dHB1dCBkaXJlY3RvcnkuIGBGSUxFYCByZXF1aXJlcyB0aGUgY29tbWFuZCB0b1xuICAgKiB3cml0ZSBleGFjdGx5IG9uZSBmaWxlIGFuZCBzdGFnZXMgdGhhdCBmaWxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGBGSUxFYCB3aGVuIGBvdXRwdXRGaWxlTmFtZWAgaXMgc2V0LCBvdGhlcndpc2UgYERJUkVDVE9SWWBcbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dFR5cGU/OiBCdW5kbGVPdXRwdXRUeXBlO1xuXG4gIC8qKlxuICAgKiBFeHRyYSBjb250ZW50IGZvbGRlZCBpbnRvIHRoZSBidW5kbGVyIGtleSBzbyBhIGNoYW5nZSB0byBpdCBpbnZhbGlkYXRlc1xuICAgKiB0aGUgYXNzZXQgaGFzaCBldmVuIHdoZW4gdGhlIHNvdXJjZSBhbmQgY29tbWFuZCBhcmUgdW5jaGFuZ2VkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vdGhpbmcgZXh0cmEgaXMgZm9sZGVkIGluXG4gICAqL1xuICByZWFkb25seSBleHRyYUhhc2g/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmaWxlIG5hbWUgdG8gc3RhZ2UgYSBzaW5nbGUtZmlsZSBhcnRpZmFjdCB1bmRlci5cbiAgICpcbiAgICogT25seSBtZWFuaW5nZnVsIHdoZW4gdGhlIHJlc3VsdCBpcyBhIHNpbmdsZSBmaWxlIHN0YWdlZCBhc1xuICAgKiBgQXNzZXRUeXBlLkZJTEVgLiBXaXRob3V0IGl0LCBhIGZpbGUgcHJvZHVjZWQgZnJvbSBhIGRpcmVjdG9yeSBzb3VyY2UgaXNcbiAgICogc3RhZ2VkIHVuZGVyIHRoZSBzb3VyY2UgZGlyZWN0b3J5J3MgYmFzZW5hbWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIGJhc2VuYW1lIG9mIHRoZSBhc3NldCBzb3VyY2UgcGF0aFxuICAgKi9cbiAgcmVhZG9ubHkgb3V0cHV0RmlsZU5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUnVucyBhIGJ1aWxkIGNvbW1hbmQgb24gdGhlIGhvc3QgYW5kIHN0YWdlcyBpdHMgb3V0cHV0IGFzIGEgQ0RLIGZvclxuICogVGVycmFmb3JtIGFzc2V0LlxuICpcbiAqIFRoZSBjb21tYW5kIGlzIHNwYXduZWQgd2l0aCB0aGUgYXNzZXQgc291cmNlIGFuZCBhIGNhbGxlci1vd25lZCBvdXRwdXRcbiAqIGRpcmVjdG9yeSBleHBvc2VkIHRocm91Z2ggdGhlIGBBU1NFVF9JTlBVVF9ESVJgIGFuZCBgQVNTRVRfT1VUUFVUX0RJUmBcbiAqIGVudmlyb25tZW50IHZhcmlhYmxlcy4gVW5saWtlIGEgY29udGFpbmVyIGJ1bmRsZXIsIHRoZSBidWlsZCBydW5zIGRpcmVjdGx5XG4gKiBvbiB0aGUgbWFjaGluZSBwZXJmb3JtaW5nIHRoZSBzeW50aCwgc28gdGhlIHJlcXVpcmVkIHRvb2xjaGFpbiBtdXN0IGFscmVhZHlcbiAqIGJlIGluc3RhbGxlZCB0aGVyZS5cbiAqL1xuZXhwb3J0IGNsYXNzIExvY2FsQnVuZGxlciBpbXBsZW1lbnRzIElBc3NldEJ1bmRsZXIge1xuICBwdWJsaWMgcmVhZG9ubHkgYnVuZGxlcktleT86IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IG91dHB1dEZpbGVOYW1lPzogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nW107XG4gIHByaXZhdGUgcmVhZG9ubHkgZW52aXJvbm1lbnQ/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuICBwcml2YXRlIHJlYWRvbmx5IHdvcmtpbmdEaXJlY3Rvcnk/OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgb3V0cHV0VHlwZTogQnVuZGxlT3V0cHV0VHlwZTtcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogTG9jYWxCdW5kbGVyUHJvcHMpIHtcbiAgICB0aGlzLmNvbW1hbmQgPSBwcm9wcy5jb21tYW5kO1xuICAgIHRoaXMuZW52aXJvbm1lbnQgPSBwcm9wcy5lbnZpcm9ubWVudDtcbiAgICB0aGlzLndvcmtpbmdEaXJlY3RvcnkgPSBwcm9wcy53b3JraW5nRGlyZWN0b3J5O1xuICAgIHRoaXMub3V0cHV0VHlwZSA9XG4gICAgICBwcm9wcy5vdXRwdXRUeXBlID8/XG4gICAgICAocHJvcHMub3V0cHV0RmlsZU5hbWVcbiAgICAgICAgPyBCdW5kbGVPdXRwdXRUeXBlLkZJTEVcbiAgICAgICAgOiBCdW5kbGVPdXRwdXRUeXBlLkRJUkVDVE9SWSk7XG4gICAgdGhpcy5vdXRwdXRGaWxlTmFtZSA9IHByb3BzLm91dHB1dEZpbGVOYW1lO1xuXG4gICAgLy8gVGhlIHNvdXJjZSB0cmVlIGNhbm5vdCBvYnNlcnZlIHRoZSBidWlsZCwgc28gZXZlcnkgaW5wdXQgdGhhdCBjYW4gbW92ZVxuICAgIC8vIHRoZSBvdXRwdXQgaGFzIHRvIHJlYWNoIGlkZW50aXR5IHRocm91Z2ggdGhlIGtleTogY29tbWFuZCwgd29ya2luZ1xuICAgIC8vIGRpcmVjdG9yeSwgZW52aXJvbm1lbnQgYW5kIHRoZSBkZWNsYXJlZCBvdXRwdXQgc2hhcGUuIEVhY2ggc2VnbWVudCBpc1xuICAgIC8vIGxhYmVsbGVkIHNvIGEgdmFsdWUgaW4gb25lIGZpZWxkIGNhbiBuZXZlciBzZXJpYWxpc2UgdG8gdGhlIHNhbWUgc3RyaW5nXG4gICAgLy8gYXMgYSB2YWx1ZSBpbiBhbm90aGVyIChlLmcuIGFuIGVudmlyb25tZW50IGVudHJ5IHZzLiBhbiBleHRyYUhhc2gpLlxuICAgIGxldCBrZXkgPSBCdW5kbGVyS2V5Lm9mKFwibG9jYWxcIilcbiAgICAgIC5hZGQoYGNtZD0ke0pTT04uc3RyaW5naWZ5KHRoaXMuY29tbWFuZCl9YClcbiAgICAgIC5hZGQoYG91dD0ke3RoaXMub3V0cHV0VHlwZX1gKVxuICAgICAgLmFkZChgY3dkPSR7dGhpcy53b3JraW5nRGlyZWN0b3J5ID8/IFwiXCJ9YCk7XG4gICAgaWYgKHRoaXMuZW52aXJvbm1lbnQpIHtcbiAgICAgIGtleSA9IGtleS5hZGQoXG4gICAgICAgIC4uLk9iamVjdC5rZXlzKHRoaXMuZW52aXJvbm1lbnQpXG4gICAgICAgICAgLnNvcnQoKVxuICAgICAgICAgIC5tYXAoKGspID0+IGBlbnY9JHtrfT0ke3RoaXMuZW52aXJvbm1lbnQhW2tdfWApLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHByb3BzLmV4dHJhSGFzaCkge1xuICAgICAga2V5ID0ga2V5LmFkZChgZXh0cmE9JHtwcm9wcy5leHRyYUhhc2h9YCk7XG4gICAgfVxuICAgIHRoaXMuYnVuZGxlcktleSA9IGBsb2NhbDo6JHtjcmVhdGVIYXNoKFwic2hhMjU2XCIpXG4gICAgICAudXBkYXRlKGtleS50b1N0cmluZygpKVxuICAgICAgLmRpZ2VzdChcImhleFwiKVxuICAgICAgLnNsaWNlKDAsIDE2KX1gO1xuICB9XG5cbiAgcHVibGljIGJ1bmRsZShvcHRpb25zOiBCdW5kbGVPcHRpb25zKTogQnVuZGxlUmVzdWx0IHtcbiAgICBjb25zdCB7IHNvdXJjZSwgb3V0cHV0RGlyIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IFtwcm9ncmFtLCAuLi5hcmdzXSA9IHRoaXMuY29tbWFuZDtcbiAgICBjb25zdCBjd2QgPVxuICAgICAgdGhpcy53b3JraW5nRGlyZWN0b3J5ID8/XG4gICAgICAoZXhpc3RzU3luYyhzb3VyY2UpICYmIHN0YXRTeW5jKHNvdXJjZSkuaXNGaWxlKClcbiAgICAgICAgPyBwYXRoLmRpcm5hbWUoc291cmNlKVxuICAgICAgICA6IHNvdXJjZSk7XG5cbiAgICAvLyBOb2RlIHJlcG9ydHMgRU5PRU5UIGZvciBhIG1pc3NpbmcgY3dkIHRvbywgd2hpY2ggd291bGQgb3RoZXJ3aXNlIGJlXG4gICAgLy8gbWlzdGFrZW4gZm9yIGEgbWlzc2luZyBwcm9ncmFtIGFuZCBzaWxlbnRseSBkZWNsaW5lLlxuICAgIGlmICghZXhpc3RzU3luYyhjd2QpIHx8ICFzdGF0U3luYyhjd2QpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYExvY2FsIGJ1bmRsaW5nIHdvcmtpbmcgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0OiAke2N3ZH1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBzcGF3blN5bmNDcm9zc1BsYXRmb3JtKHByb2dyYW0sIGFyZ3MsIHtcbiAgICAgIGN3ZCxcbiAgICAgIC8vIFN0cmVhbSB0aGUgYnVpbGQncyBvdXRwdXQgc3RyYWlnaHQgdGhyb3VnaCBpbnN0ZWFkIG9mIGNhcHR1cmluZyBpdDpcbiAgICAgIC8vIGNhcHR1cmluZyBpcyBib3VuZGVkIGJ5IHNwYXduU3luYydzIDEgTWlCIG1heEJ1ZmZlciwgd2hpY2ggU0lHVEVSTXMgYVxuICAgICAgLy8gdmVyYm9zZSBidWlsZCAoZS5nLiBgbnBtIGNpYCkgd2l0aCBFTk9CVUZTLCBhbmQgaGlkZXMgb3V0cHV0IHVudGlsIHRoZVxuICAgICAgLy8gYnVpbGQgZXhpdHMuXG4gICAgICBzdGRpbzogW1wiaWdub3JlXCIsIHByb2Nlc3Muc3RkZXJyLCBcImluaGVyaXRcIl0sXG4gICAgICBlbnY6IHtcbiAgICAgICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgICAgIC4uLnRoaXMuZW52aXJvbm1lbnQsXG4gICAgICAgIEFTU0VUX0lOUFVUX0RJUjogc291cmNlLFxuICAgICAgICBBU1NFVF9PVVRQVVRfRElSOiBvdXRwdXREaXIsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgaWYgKHJlc3VsdC5lcnJvcikge1xuICAgICAgLy8gQSBtaXNzaW5nIHRvb2xjaGFpbiBpcyBub3QgYSBoYXJkIGZhaWx1cmU6IGRlY2xpbmluZyBsZXRzIGFcbiAgICAgIC8vIENoYWluQnVuZGxlciBmYWxsIHRocm91Z2ggdG8gaXRzIG5leHQgYnVuZGxlciAodGhlIGxvY2FsLXRoZW4tRG9ja2VyXG4gICAgICAvLyBjYXNlIHRoZSBDaGFpbkJ1bmRsZXIgZG9jcyBkZXNjcmliZSkuIEFueSBvdGhlciBzcGF3biBlcnJvciBpcyByZWFsLlxuICAgICAgaWYgKGlzU3Bhd25VbmF2YWlsYWJsZShyZXN1bHQuZXJyb3IpKSB7XG4gICAgICAgIHJldHVybiBCdW5kbGVSZXN1bHQuZGVjbGluZWQoKTtcbiAgICAgIH1cbiAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICB9XG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgIT09IDApIHtcbiAgICAgIGNvbnN0IHJlYXNvbiA9XG4gICAgICAgIHJlc3VsdC5zaWduYWwgIT0gbnVsbFxuICAgICAgICAgID8gYHNpZ25hbCAke3Jlc3VsdC5zaWduYWx9YFxuICAgICAgICAgIDogYHN0YXR1cyAke3Jlc3VsdC5zdGF0dXN9YDtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYExvY2FsIGJ1bmRsaW5nIGV4aXRlZCB3aXRoICR7cmVhc29ufSAoJHtwcm9ncmFtfSAke2FyZ3Muam9pbihcIiBcIil9KWAsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIWV4aXN0c1N5bmMob3V0cHV0RGlyKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTG9jYWwgYnVuZGxpbmcgZGlkIG5vdCBjcmVhdGUgdGhlIG91dHB1dCBkaXJlY3RvcnkgJHtvdXRwdXREaXJ9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3V0cHV0VHlwZSA9PT0gQnVuZGxlT3V0cHV0VHlwZS5ESVJFQ1RPUlkpIHtcbiAgICAgIHJldHVybiBCdW5kbGVSZXN1bHQuZGlyZWN0b3J5KG91dHB1dERpcik7XG4gICAgfVxuICAgIHJldHVybiBCdW5kbGVSZXN1bHQuZmlsZShkZXRlcm1pbmVCdW5kbGVkQXJ0aWZhY3Qob3V0cHV0RGlyKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgc3Bhd24gZXJyb3IgbWVhbnMgdGhlIGNvbW1hbmQgY291bGQgbm90IGJlIHJ1biBhdCBhbGwuXG4gKlxuICogVGhlc2Ugc2lnbmFsIGFuIGFic2VudCBvciBub24tZXhlY3V0YWJsZSB0b29sY2hhaW4sIHdoaWNoIGEgY2hhaW4gb2ZcbiAqIGJ1bmRsZXJzIHNob3VsZCBiZSBhbGxvd2VkIHRvIHNraXAgcGFzdCByYXRoZXIgdGhhbiBmYWlsIG9uLlxuICovXG5mdW5jdGlvbiBpc1NwYXduVW5hdmFpbGFibGUoZXJyb3I6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbik6IGJvb2xlYW4ge1xuICByZXR1cm4gZXJyb3IuY29kZSA9PT0gXCJFTk9FTlRcIiB8fCBlcnJvci5jb2RlID09PSBcIkVBQ0NFU1wiO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBzaW5nbGUgZmlsZSBwcm9kdWNlZCBmb3IgYEJ1bmRsZU91dHB1dFR5cGUuRklMRWAgaW5zaWRlIGFuXG4gKiBvdXRwdXQgZGlyZWN0b3J5LlxuICovXG5mdW5jdGlvbiBkZXRlcm1pbmVCdW5kbGVkQXJ0aWZhY3Qob3V0cHV0RGlyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBSZXF1aXJlIGV4YWN0bHkgb25lIGZpbGUuIFBpY2tpbmcgdGhlIGZpcnN0IG9mIHNldmVyYWwgaW4gcmVhZGRpciBvcmRlclxuICAvLyB3b3VsZCBzdGFnZSBhIGRpZmZlcmVudCBhcnRpZmFjdCBkZXBlbmRpbmcgb24gdGhlIGZpbGVzeXN0ZW0gKGUuZy5cbiAgLy8gYnVuZGxlLnppcCB2cy4gaXRzIHNpYmxpbmcgYnVuZGxlLnppcC5zaGEyNTYpLlxuICBjb25zdCBmaWxlcyA9IHJlYWRkaXJTeW5jKG91dHB1dERpcikuZmlsdGVyKChlbnRyeSkgPT5cbiAgICBzdGF0U3luYyhwYXRoLmpvaW4ob3V0cHV0RGlyLCBlbnRyeSkpLmlzRmlsZSgpLFxuICApO1xuICBpZiAoZmlsZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEJ1bmRsaW5nIG91dHB1dCBkaXJlY3RvcnkgbXVzdCBjb250YWluIGV4YWN0bHkgb25lIGZpbGUgZm9yIGAgK1xuICAgICAgICBgb3V0cHV0IHR5cGUgJHtCdW5kbGVPdXRwdXRUeXBlLkZJTEV9LCBmb3VuZCAke2ZpbGVzLmxlbmd0aH06ICR7b3V0cHV0RGlyfWAsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcGF0aC5qb2luKG91dHB1dERpciwgZmlsZXNbMF0pO1xufVxuIl19
@@ -0,0 +1,9 @@
1
+ import { SpawnSyncOptions, SpawnSyncReturns } from "child_process";
2
+ /**
3
+ * `spawnSync` that resolves Windows `.cmd`/`.bat` shims (as created for
4
+ * `npm`, `npx`, `pnpm`, and everything under `node_modules/.bin`) through
5
+ * `cmd.exe` the way a shell would, so they run without the caller having to
6
+ * invoke a shell itself. A thin pass-through to `child_process.spawnSync`
7
+ * on every other platform.
8
+ */
9
+ export declare function spawnSyncCrossPlatform(command: string, args: string[], options: SpawnSyncOptions): SpawnSyncReturns<string | Buffer>;
@@ -0,0 +1,190 @@
1
+ "use strict";
2
+ // Copyright (c) cdktn-io
3
+ // SPDX-License-Identifier: MPL-2.0
4
+ //
5
+ // The Windows command resolution and cmd.exe escaping below is adapted from
6
+ // cross-spawn (https://github.com/moxystudio/node-cross-spawn), vendored
7
+ // here instead of taken as an npm dependency: packing it through
8
+ // jsii-pacmak's `npm pack` step pulls in a dependency resolved via pnpm's
9
+ // symlinked store, which reliably triggers an npm packing bug ("Exit
10
+ // handler never called!") in this project's CI. A plain source file has no
11
+ // node_modules involved in packing.
12
+ //
13
+ // cross-spawn is MIT licensed:
14
+ //
15
+ // The MIT License (MIT)
16
+ //
17
+ // Copyright (c) 2018 Made With MOXY Lda <hello@moxy.studio>
18
+ //
19
+ // Permission is hereby granted, free of charge, to any person obtaining a
20
+ // copy of this software and associated documentation files (the
21
+ // "Software"), to deal in the Software without restriction, including
22
+ // without limitation the rights to use, copy, modify, merge, publish,
23
+ // distribute, sublicense, and/or sell copies of the Software, and to
24
+ // permit persons to whom the Software is furnished to do so, subject to
25
+ // the following conditions:
26
+ //
27
+ // The above copyright notice and this permission notice shall be included
28
+ // in all copies or substantial portions of the Software.
29
+ //
30
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
31
+ // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
32
+ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
33
+ // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
34
+ // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
35
+ // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
36
+ // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
37
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
38
+ if (k2 === undefined) k2 = k;
39
+ var desc = Object.getOwnPropertyDescriptor(m, k);
40
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
41
+ desc = { enumerable: true, get: function() { return m[k]; } };
42
+ }
43
+ Object.defineProperty(o, k2, desc);
44
+ }) : (function(o, m, k, k2) {
45
+ if (k2 === undefined) k2 = k;
46
+ o[k2] = m[k];
47
+ }));
48
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
49
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
50
+ }) : function(o, v) {
51
+ o["default"] = v;
52
+ });
53
+ var __importStar = (this && this.__importStar) || (function () {
54
+ var ownKeys = function(o) {
55
+ ownKeys = Object.getOwnPropertyNames || function (o) {
56
+ var ar = [];
57
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
58
+ return ar;
59
+ };
60
+ return ownKeys(o);
61
+ };
62
+ return function (mod) {
63
+ if (mod && mod.__esModule) return mod;
64
+ var result = {};
65
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
66
+ __setModuleDefault(result, mod);
67
+ return result;
68
+ };
69
+ })();
70
+ Object.defineProperty(exports, "__esModule", { value: true });
71
+ exports.spawnSyncCrossPlatform = spawnSyncCrossPlatform;
72
+ const child_process_1 = require("child_process");
73
+ const fs_1 = require("fs");
74
+ const path = __importStar(require("path"));
75
+ const isWin = process.platform === "win32";
76
+ const isNativeExecutableRegExp = /\.(?:com|exe)$/i;
77
+ const isBatchFileRegExp = /\.(?:cmd|bat)$/i;
78
+ const metaCharsRegExp = /([()\][%!^"`<>&|;, *?])/g;
79
+ /**
80
+ * Looks up an environment variable case-insensitively, as Windows itself
81
+ * does, and as the env passed to the spawned process (not this process's
82
+ * own `process.env`) should be read.
83
+ */
84
+ function envValue(env, name) {
85
+ const key = Object.keys(env)
86
+ .reverse()
87
+ .find((k) => k.toUpperCase() === name.toUpperCase());
88
+ return key ? env[key] : undefined;
89
+ }
90
+ function windowsPathExtCandidates(command, env) {
91
+ const pathExtExe = envValue(env, "PATHEXT") || ".EXE;.CMD;.BAT;.COM";
92
+ const exts = pathExtExe.split(";");
93
+ return command.includes(".") && exts[0] !== "" ? ["", ...exts] : exts;
94
+ }
95
+ function fileExists(file) {
96
+ try {
97
+ const stat = (0, fs_1.statSync)(file);
98
+ return stat.isFile() || stat.isSymbolicLink();
99
+ }
100
+ catch {
101
+ return false;
102
+ }
103
+ }
104
+ /**
105
+ * Resolves a command to a file on disk the way Windows itself resolves it:
106
+ * a command containing a path separator is resolved against `cwd` (the
107
+ * spawned process's working directory, not this process's); a bare command
108
+ * name is resolved against `cwd` first, then each `PATH` entry; each is
109
+ * tried with every `PATHEXT` extension in turn.
110
+ */
111
+ function resolveOnWindows(command, cwd, env) {
112
+ const hasSlash = /[\\/]/.test(command);
113
+ const dirs = hasSlash
114
+ ? [cwd]
115
+ : [cwd, ...(envValue(env, "PATH") ?? "").split(path.delimiter)];
116
+ for (const dir of dirs) {
117
+ const candidate = path.resolve(cwd, dir, command);
118
+ for (const ext of windowsPathExtCandidates(command, env)) {
119
+ const full = candidate + ext;
120
+ if (fileExists(full)) {
121
+ return full;
122
+ }
123
+ }
124
+ }
125
+ return undefined;
126
+ }
127
+ function escapeCommand(arg) {
128
+ return arg.replace(metaCharsRegExp, "^$1");
129
+ }
130
+ /**
131
+ * Escapes a single command-line argument for cmd.exe. Ported verbatim from
132
+ * cross-spawn (see https://qntm.org/cmd for the algorithm this implements)
133
+ * since getting Windows command-line escaping wrong is a real security
134
+ * issue (e.g. CVE-2024-27980), not just a correctness one.
135
+ */
136
+ function escapeArgument(arg, doubleEscapeMetaChars) {
137
+ let escaped = `${arg}`;
138
+ escaped = escaped.replace(/(?=(\\+?)?)\1"/g, '$1$1\\"');
139
+ escaped = escaped.replace(/(?=(\\+?)?)\1$/, "$1$1");
140
+ escaped = `"${escaped}"`;
141
+ escaped = escaped.replace(metaCharsRegExp, "^$1");
142
+ if (doubleEscapeMetaChars) {
143
+ escaped = escaped.replace(metaCharsRegExp, "^$1");
144
+ }
145
+ return escaped;
146
+ }
147
+ /**
148
+ * `spawnSync` that resolves Windows `.cmd`/`.bat` shims (as created for
149
+ * `npm`, `npx`, `pnpm`, and everything under `node_modules/.bin`) through
150
+ * `cmd.exe` the way a shell would, so they run without the caller having to
151
+ * invoke a shell itself. A thin pass-through to `child_process.spawnSync`
152
+ * on every other platform.
153
+ */
154
+ function spawnSyncCrossPlatform(command, args, options) {
155
+ if (!isWin) {
156
+ return (0, child_process_1.spawnSync)(command, args, options);
157
+ }
158
+ // Absolute, so resolveOnWindows doesn't apply a relative cwd twice.
159
+ const cwd = path.resolve(typeof options.cwd === "string" ? options.cwd : process.cwd());
160
+ const env = options.env ?? process.env;
161
+ const file = resolveOnWindows(command, cwd, env);
162
+ const needsShell = !file || !isNativeExecutableRegExp.test(file);
163
+ let resolvedCommand = command;
164
+ let resolvedArgs = args;
165
+ let windowsVerbatimArguments;
166
+ if (needsShell) {
167
+ // A batch file re-parses the arguments it forwards, so meta chars need
168
+ // escaping twice.
169
+ const needsDoubleEscape = !!file && isBatchFileRegExp.test(file);
170
+ const escapedCommand = escapeCommand(path.normalize(command));
171
+ const escapedArgs = args.map((arg) => escapeArgument(arg, needsDoubleEscape));
172
+ const shellCommand = [escapedCommand, ...escapedArgs].join(" ");
173
+ resolvedCommand = process.env.ComSpec || "cmd.exe";
174
+ resolvedArgs = ["/d", "/s", "/c", `"${shellCommand}"`];
175
+ windowsVerbatimArguments = true;
176
+ }
177
+ const result = (0, child_process_1.spawnSync)(resolvedCommand, resolvedArgs, {
178
+ ...options,
179
+ windowsVerbatimArguments,
180
+ });
181
+ // cmd.exe reports "command not recognized" as a plain exit code 1, which
182
+ // would otherwise be mistaken for the command having run and failed.
183
+ if (!result.error && result.status === 1 && !file) {
184
+ result.error = Object.assign(new Error(`spawnSync ${command} ENOENT`), {
185
+ code: "ENOENT",
186
+ });
187
+ }
188
+ return result;
189
+ }
190
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2luZG93cy1zcGF3bi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy93aW5kb3dzLXNwYXduLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSx5QkFBeUI7QUFDekIsbUNBQW1DO0FBQ25DLEVBQUU7QUFDRiw0RUFBNEU7QUFDNUUseUVBQXlFO0FBQ3pFLGlFQUFpRTtBQUNqRSwwRUFBMEU7QUFDMUUscUVBQXFFO0FBQ3JFLDJFQUEyRTtBQUMzRSxvQ0FBb0M7QUFDcEMsRUFBRTtBQUNGLCtCQUErQjtBQUMvQixFQUFFO0FBQ0YsMEJBQTBCO0FBQzFCLEVBQUU7QUFDRiw4REFBOEQ7QUFDOUQsRUFBRTtBQUNGLDRFQUE0RTtBQUM1RSxrRUFBa0U7QUFDbEUsd0VBQXdFO0FBQ3hFLHdFQUF3RTtBQUN4RSx1RUFBdUU7QUFDdkUsMEVBQTBFO0FBQzFFLDhCQUE4QjtBQUM5QixFQUFFO0FBQ0YsNEVBQTRFO0FBQzVFLDJEQUEyRDtBQUMzRCxFQUFFO0FBQ0YsNEVBQTRFO0FBQzVFLCtEQUErRDtBQUMvRCwyRUFBMkU7QUFDM0UseUVBQXlFO0FBQ3pFLHlFQUF5RTtBQUN6RSxzRUFBc0U7QUFDdEUsMkRBQTJEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXNHM0Qsd0RBa0RDO0FBdEpELGlEQUE4RTtBQUM5RSwyQkFBOEI7QUFDOUIsMkNBQTZCO0FBRTdCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxRQUFRLEtBQUssT0FBTyxDQUFDO0FBQzNDLE1BQU0sd0JBQXdCLEdBQUcsaUJBQWlCLENBQUM7QUFDbkQsTUFBTSxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQztBQUM1QyxNQUFNLGVBQWUsR0FBRywwQkFBMEIsQ0FBQztBQUVuRDs7OztHQUlHO0FBQ0gsU0FBUyxRQUFRLENBQ2YsR0FBc0IsRUFDdEIsSUFBWTtJQUVaLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1NBQ3pCLE9B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QUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUM5RCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FDbkMsY0FBYyxDQUFDLEdBQUcsRUFBRSxpQkFBaUIsQ0FBQyxDQUN2QyxDQUFDO1FBQ0YsTUFBTSxZQUFZLEdBQUcsQ0FBQyxjQUFjLEVBQUUsR0FBRyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFaEUsZUFBZSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxJQUFJLFNBQVMsQ0FBQztRQUNuRCxZQUFZLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7UUFDdkQsd0JBQXdCLEdBQUcsSUFBSSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBRyxJQUFBLHlCQUFTLEVBQUMsZUFBZSxFQUFFLFlBQVksRUFBRTtRQUN0RCxHQUFHLE9BQU87UUFDVix3QkFBd0I7S0FDekIsQ0FBQyxDQUFDO0lBRUgseUVBQXlFO0lBQ3pFLHFFQUFxRTtJQUNyRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xELE1BQU0sQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxhQUFhLE9BQU8sU0FBUyxDQUFDLEVBQUU7WUFDckUsSUFBSSxFQUFFLFFBQVE7U0FDZixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgY2RrdG4taW9cbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG4vL1xuLy8gVGhlIFdpbmRvd3MgY29tbWFuZCByZXNvbHV0aW9uIGFuZCBjbWQuZXhlIGVzY2FwaW5nIGJlbG93IGlzIGFkYXB0ZWQgZnJvbVxuLy8gY3Jvc3Mtc3Bhd24gKGh0dHBzOi8vZ2l0aHViLmNvbS9tb3h5c3R1ZGlvL25vZGUtY3Jvc3Mtc3Bhd24pLCB2ZW5kb3JlZFxuLy8gaGVyZSBpbnN0ZWFkIG9mIHRha2VuIGFzIGFuIG5wbSBkZXBlbmRlbmN5OiBwYWNraW5nIGl0IHRocm91Z2hcbi8vIGpzaWktcGFjbWFrJ3MgYG5wbSBwYWNrYCBzdGVwIHB1bGxzIGluIGEgZGVwZW5kZW5jeSByZXNvbHZlZCB2aWEgcG5wbSdzXG4vLyBzeW1saW5rZWQgc3RvcmUsIHdoaWNoIHJlbGlhYmx5IHRyaWdnZXJzIGFuIG5wbSBwYWNraW5nIGJ1ZyAoXCJFeGl0XG4vLyBoYW5kbGVyIG5ldmVyIGNhbGxlZCFcIikgaW4gdGhpcyBwcm9qZWN0J3MgQ0kuIEEgcGxhaW4gc291cmNlIGZpbGUgaGFzIG5vXG4vLyBub2RlX21vZHVsZXMgaW52b2x2ZWQgaW4gcGFja2luZy5cbi8vXG4vLyBjcm9zcy1zcGF3biBpcyBNSVQgbGljZW5zZWQ6XG4vL1xuLy8gICBUaGUgTUlUIExpY2Vuc2UgKE1JVClcbi8vXG4vLyAgIENvcHlyaWdodCAoYykgMjAxOCBNYWRlIFdpdGggTU9YWSBMZGEgPGhlbGxvQG1veHkuc3R1ZGlvPlxuLy9cbi8vICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vICAgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gICBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vICAgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gICBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG9cbi8vICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvXG4vLyAgIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyAgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gICBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC5cbi8vICAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTllcbi8vICAgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCxcbi8vICAgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEVcbi8vICAgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCB7IHNwYXduU3luYywgU3Bhd25TeW5jT3B0aW9ucywgU3Bhd25TeW5jUmV0dXJucyB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBzdGF0U3luYyB9IGZyb20gXCJmc1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5jb25zdCBpc1dpbiA9IHByb2Nlc3MucGxhdGZvcm0gPT09IFwid2luMzJcIjtcbmNvbnN0IGlzTmF0aXZlRXhlY3V0YWJsZVJlZ0V4cCA9IC9cXC4oPzpjb218ZXhlKSQvaTtcbmNvbnN0IGlzQmF0Y2hGaWxlUmVnRXhwID0gL1xcLig/OmNtZHxiYXQpJC9pO1xuY29uc3QgbWV0YUNoYXJzUmVnRXhwID0gLyhbKClcXF1bJSFeXCJgPD4mfDssICo/XSkvZztcblxuLyoqXG4gKiBMb29rcyB1cCBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBjYXNlLWluc2Vuc2l0aXZlbHksIGFzIFdpbmRvd3MgaXRzZWxmXG4gKiBkb2VzLCBhbmQgYXMgdGhlIGVudiBwYXNzZWQgdG8gdGhlIHNwYXduZWQgcHJvY2VzcyAobm90IHRoaXMgcHJvY2VzcydzXG4gKiBvd24gYHByb2Nlc3MuZW52YCkgc2hvdWxkIGJlIHJlYWQuXG4gKi9cbmZ1bmN0aW9uIGVudlZhbHVlKFxuICBlbnY6IE5vZGVKUy5Qcm9jZXNzRW52LFxuICBuYW1lOiBzdHJpbmcsXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBrZXkgPSBPYmplY3Qua2V5cyhlbnYpXG4gICAgLnJldmVyc2UoKVxuICAgIC5maW5kKChrKSA9PiBrLnRvVXBwZXJDYXNlKCkgPT09IG5hbWUudG9VcHBlckNhc2UoKSk7XG4gIHJldHVybiBrZXkgPyBlbnZba2V5XSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gd2luZG93c1BhdGhFeHRDYW5kaWRhdGVzKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIGVudjogTm9kZUpTLlByb2Nlc3NFbnYsXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHBhdGhFeHRFeGUgPSBlbnZWYWx1ZShlbnYsIFwiUEFUSEVYVFwiKSB8fCBcIi5FWEU7LkNNRDsuQkFUOy5DT01cIjtcbiAgY29uc3QgZXh0cyA9IHBhdGhFeHRFeGUuc3BsaXQoXCI7XCIpO1xuICByZXR1cm4gY29tbWFuZC5pbmNsdWRlcyhcIi5cIikgJiYgZXh0c1swXSAhPT0gXCJcIiA/IFtcIlwiLCAuLi5leHRzXSA6IGV4dHM7XG59XG5cbmZ1bmN0aW9uIGZpbGVFeGlzdHMoZmlsZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IHN0YXRTeW5jKGZpbGUpO1xuICAgIHJldHVybiBzdGF0LmlzRmlsZSgpIHx8IHN0YXQuaXNTeW1ib2xpY0xpbmsoKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgYSBjb21tYW5kIHRvIGEgZmlsZSBvbiBkaXNrIHRoZSB3YXkgV2luZG93cyBpdHNlbGYgcmVzb2x2ZXMgaXQ6XG4gKiBhIGNvbW1hbmQgY29udGFpbmluZyBhIHBhdGggc2VwYXJhdG9yIGlzIHJlc29sdmVkIGFnYWluc3QgYGN3ZGAgKHRoZVxuICogc3Bhd25lZCBwcm9jZXNzJ3Mgd29ya2luZyBkaXJlY3RvcnksIG5vdCB0aGlzIHByb2Nlc3Mncyk7IGEgYmFyZSBjb21tYW5kXG4gKiBuYW1lIGlzIHJlc29sdmVkIGFnYWluc3QgYGN3ZGAgZmlyc3QsIHRoZW4gZWFjaCBgUEFUSGAgZW50cnk7IGVhY2ggaXNcbiAqIHRyaWVkIHdpdGggZXZlcnkgYFBBVEhFWFRgIGV4dGVuc2lvbiBpbiB0dXJuLlxuICovXG5mdW5jdGlvbiByZXNvbHZlT25XaW5kb3dzKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIGN3ZDogc3RyaW5nLFxuICBlbnY6IE5vZGVKUy5Qcm9jZXNzRW52LFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgaGFzU2xhc2ggPSAvW1xcXFwvXS8udGVzdChjb21tYW5kKTtcbiAgY29uc3QgZGlycyA9IGhhc1NsYXNoXG4gICAgPyBbY3dkXVxuICAgIDogW2N3ZCwgLi4uKGVudlZhbHVlKGVudiwgXCJQQVRIXCIpID8/IFwiXCIpLnNwbGl0KHBhdGguZGVsaW1pdGVyKV07XG5cbiAgZm9yIChjb25zdCBkaXIgb2YgZGlycykge1xuICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHBhdGgucmVzb2x2ZShjd2QsIGRpciwgY29tbWFuZCk7XG4gICAgZm9yIChjb25zdCBleHQgb2Ygd2luZG93c1BhdGhFeHRDYW5kaWRhdGVzKGNvbW1hbmQsIGVudikpIHtcbiAgICAgIGNvbnN0IGZ1bGwgPSBjYW5kaWRhdGUgKyBleHQ7XG4gICAgICBpZiAoZmlsZUV4aXN0cyhmdWxsKSkge1xuICAgICAgICByZXR1cm4gZnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZXNjYXBlQ29tbWFuZChhcmc6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBhcmcucmVwbGFjZShtZXRhQ2hhcnNSZWdFeHAsIFwiXiQxXCIpO1xufVxuXG4vKipcbiAqIEVzY2FwZXMgYSBzaW5nbGUgY29tbWFuZC1saW5lIGFyZ3VtZW50IGZvciBjbWQuZXhlLiBQb3J0ZWQgdmVyYmF0aW0gZnJvbVxuICogY3Jvc3Mtc3Bhd24gKHNlZSBodHRwczovL3FudG0ub3JnL2NtZCBmb3IgdGhlIGFsZ29yaXRobSB0aGlzIGltcGxlbWVudHMpXG4gKiBzaW5jZSBnZXR0aW5nIFdpbmRvd3MgY29tbWFuZC1saW5lIGVzY2FwaW5nIHdyb25nIGlzIGEgcmVhbCBzZWN1cml0eVxuICogaXNzdWUgKGUuZy4gQ1ZFLTIwMjQtMjc5ODApLCBub3QganVzdCBhIGNvcnJlY3RuZXNzIG9uZS5cbiAqL1xuZnVuY3Rpb24gZXNjYXBlQXJndW1lbnQoYXJnOiBzdHJpbmcsIGRvdWJsZUVzY2FwZU1ldGFDaGFyczogYm9vbGVhbik6IHN0cmluZyB7XG4gIGxldCBlc2NhcGVkID0gYCR7YXJnfWA7XG4gIGVzY2FwZWQgPSBlc2NhcGVkLnJlcGxhY2UoLyg/PShcXFxcKz8pPylcXDFcIi9nLCAnJDEkMVxcXFxcIicpO1xuICBlc2NhcGVkID0gZXNjYXBlZC5yZXBsYWNlKC8oPz0oXFxcXCs/KT8pXFwxJC8sIFwiJDEkMVwiKTtcbiAgZXNjYXBlZCA9IGBcIiR7ZXNjYXBlZH1cImA7XG4gIGVzY2FwZWQgPSBlc2NhcGVkLnJlcGxhY2UobWV0YUNoYXJzUmVnRXhwLCBcIl4kMVwiKTtcbiAgaWYgKGRvdWJsZUVzY2FwZU1ldGFDaGFycykge1xuICAgIGVzY2FwZWQgPSBlc2NhcGVkLnJlcGxhY2UobWV0YUNoYXJzUmVnRXhwLCBcIl4kMVwiKTtcbiAgfVxuICByZXR1cm4gZXNjYXBlZDtcbn1cblxuLyoqXG4gKiBgc3Bhd25TeW5jYCB0aGF0IHJlc29sdmVzIFdpbmRvd3MgYC5jbWRgL2AuYmF0YCBzaGltcyAoYXMgY3JlYXRlZCBmb3JcbiAqIGBucG1gLCBgbnB4YCwgYHBucG1gLCBhbmQgZXZlcnl0aGluZyB1bmRlciBgbm9kZV9tb2R1bGVzLy5iaW5gKSB0aHJvdWdoXG4gKiBgY21kLmV4ZWAgdGhlIHdheSBhIHNoZWxsIHdvdWxkLCBzbyB0aGV5IHJ1biB3aXRob3V0IHRoZSBjYWxsZXIgaGF2aW5nIHRvXG4gKiBpbnZva2UgYSBzaGVsbCBpdHNlbGYuIEEgdGhpbiBwYXNzLXRocm91Z2ggdG8gYGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jYFxuICogb24gZXZlcnkgb3RoZXIgcGxhdGZvcm0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGF3blN5bmNDcm9zc1BsYXRmb3JtKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIGFyZ3M6IHN0cmluZ1tdLFxuICBvcHRpb25zOiBTcGF3blN5bmNPcHRpb25zLFxuKTogU3Bhd25TeW5jUmV0dXJuczxzdHJpbmcgfCBCdWZmZXI+IHtcbiAgaWYgKCFpc1dpbikge1xuICAgIHJldHVybiBzcGF3blN5bmMoY29tbWFuZCwgYXJncywgb3B0aW9ucyk7XG4gIH1cblxuICAvLyBBYnNvbHV0ZSwgc28gcmVzb2x2ZU9uV2luZG93cyBkb2Vzbid0IGFwcGx5IGEgcmVsYXRpdmUgY3dkIHR3aWNlLlxuICBjb25zdCBjd2QgPSBwYXRoLnJlc29sdmUoXG4gICAgdHlwZW9mIG9wdGlvbnMuY3dkID09PSBcInN0cmluZ1wiID8gb3B0aW9ucy5jd2QgOiBwcm9jZXNzLmN3ZCgpLFxuICApO1xuICBjb25zdCBlbnYgPSBvcHRpb25zLmVudiA/PyBwcm9jZXNzLmVudjtcbiAgY29uc3QgZmlsZSA9IHJlc29sdmVPbldpbmRvd3MoY29tbWFuZCwgY3dkLCBlbnYpO1xuICBjb25zdCBuZWVkc1NoZWxsID0gIWZpbGUgfHwgIWlzTmF0aXZlRXhlY3V0YWJsZVJlZ0V4cC50ZXN0KGZpbGUpO1xuXG4gIGxldCByZXNvbHZlZENvbW1hbmQgPSBjb21tYW5kO1xuICBsZXQgcmVzb2x2ZWRBcmdzID0gYXJncztcbiAgbGV0IHdpbmRvd3NWZXJiYXRpbUFyZ3VtZW50czogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICBpZiAobmVlZHNTaGVsbCkge1xuICAgIC8vIEEgYmF0Y2ggZmlsZSByZS1wYXJzZXMgdGhlIGFyZ3VtZW50cyBpdCBmb3J3YXJkcywgc28gbWV0YSBjaGFycyBuZWVkXG4gICAgLy8gZXNjYXBpbmcgdHdpY2UuXG4gICAgY29uc3QgbmVlZHNEb3VibGVFc2NhcGUgPSAhIWZpbGUgJiYgaXNCYXRjaEZpbGVSZWdFeHAudGVzdChmaWxlKTtcbiAgICBjb25zdCBlc2NhcGVkQ29tbWFuZCA9IGVzY2FwZUNvbW1hbmQocGF0aC5ub3JtYWxpemUoY29tbWFuZCkpO1xuICAgIGNvbnN0IGVzY2FwZWRBcmdzID0gYXJncy5tYXAoKGFyZykgPT5cbiAgICAgIGVzY2FwZUFyZ3VtZW50KGFyZywgbmVlZHNEb3VibGVFc2NhcGUpLFxuICAgICk7XG4gICAgY29uc3Qgc2hlbGxDb21tYW5kID0gW2VzY2FwZWRDb21tYW5kLCAuLi5lc2NhcGVkQXJnc10uam9pbihcIiBcIik7XG5cbiAgICByZXNvbHZlZENvbW1hbmQgPSBwcm9jZXNzLmVudi5Db21TcGVjIHx8IFwiY21kLmV4ZVwiO1xuICAgIHJlc29sdmVkQXJncyA9IFtcIi9kXCIsIFwiL3NcIiwgXCIvY1wiLCBgXCIke3NoZWxsQ29tbWFuZH1cImBdO1xuICAgIHdpbmRvd3NWZXJiYXRpbUFyZ3VtZW50cyA9IHRydWU7XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBzcGF3blN5bmMocmVzb2x2ZWRDb21tYW5kLCByZXNvbHZlZEFyZ3MsIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIHdpbmRvd3NWZXJiYXRpbUFyZ3VtZW50cyxcbiAgfSk7XG5cbiAgLy8gY21kLmV4ZSByZXBvcnRzIFwiY29tbWFuZCBub3QgcmVjb2duaXplZFwiIGFzIGEgcGxhaW4gZXhpdCBjb2RlIDEsIHdoaWNoXG4gIC8vIHdvdWxkIG90aGVyd2lzZSBiZSBtaXN0YWtlbiBmb3IgdGhlIGNvbW1hbmQgaGF2aW5nIHJ1biBhbmQgZmFpbGVkLlxuICBpZiAoIXJlc3VsdC5lcnJvciAmJiByZXN1bHQuc3RhdHVzID09PSAxICYmICFmaWxlKSB7XG4gICAgcmVzdWx0LmVycm9yID0gT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoYHNwYXduU3luYyAke2NvbW1hbmR9IEVOT0VOVGApLCB7XG4gICAgICBjb2RlOiBcIkVOT0VOVFwiLFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiJdfQ==
package/package.json CHANGED
@@ -1,12 +1,70 @@
1
1
  {
2
2
  "name": "@cdktn/bundler-local",
3
- "version": "0.0.0",
4
- "description": "Placeholder to register npm trusted publishing. Real releases come from cdktn-io/cdktn-bundlers.",
3
+ "version": "0.1.0",
4
+ "description": "Host-process asset bundler for CDK Terrain",
5
5
  "license": "MPL-2.0",
6
+ "author": {
7
+ "name": "cdktn-io",
8
+ "url": "https://cdktn.io",
9
+ "organization": true
10
+ },
6
11
  "repository": {
7
12
  "type": "git",
8
13
  "url": "https://github.com/cdktn-io/cdktn-bundlers.git",
9
14
  "directory": "packages/local"
10
15
  },
11
- "publishConfig": { "access": "public" }
16
+ "main": "lib/index.js",
17
+ "types": "lib/index.d.ts",
18
+ "files": [
19
+ "lib/**/*.js",
20
+ "lib/**/*.d.ts",
21
+ ".jsii"
22
+ ],
23
+ "scripts": {
24
+ "build": "jsii",
25
+ "package": "jsii-pacmak",
26
+ "test": "jest"
27
+ },
28
+ "peerDependencies": {
29
+ "cdktn": "^0.25.0",
30
+ "constructs": "^10.6.0"
31
+ },
32
+ "devDependencies": {
33
+ "cdktn": "0.25.0",
34
+ "constructs": "10.8.1",
35
+ "jest": "30.5.2",
36
+ "ts-jest": "29.4.15",
37
+ "@types/jest": "30.0.0"
38
+ },
39
+ "jsii": {
40
+ "outdir": "dist",
41
+ "tsc": {
42
+ "outDir": "lib",
43
+ "rootDir": "src"
44
+ },
45
+ "excludeTypescript": [
46
+ "src/**/__tests__/**"
47
+ ],
48
+ "targets": {
49
+ "python": {
50
+ "distName": "cdktn-bundler-local",
51
+ "module": "cdktn_bundler_local"
52
+ },
53
+ "java": {
54
+ "package": "io.cdktn.bundler.local",
55
+ "maven": {
56
+ "groupId": "io.cdktn",
57
+ "artifactId": "cdktn-bundler-local"
58
+ }
59
+ },
60
+ "dotnet": {
61
+ "namespace": "Io.Cdktn.Bundler.Local",
62
+ "packageId": "Io.Cdktn.Bundler.Local"
63
+ },
64
+ "go": {
65
+ "moduleName": "github.com/cdktn-io/cdktn-bundlers-go",
66
+ "packageName": "bundlerlocal"
67
+ }
68
+ }
69
+ }
12
70
  }