@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 +346 -0
- package/README.md +53 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.js +20 -0
- package/lib/local-bundler.d.ts +76 -0
- package/lib/local-bundler.js +170 -0
- package/lib/windows-spawn.d.ts +9 -0
- package/lib/windows-spawn.js +190 -0
- package/package.json +61 -3
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
|
-
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWwtYnVuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9sb2NhbC1idW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx5QkFBeUI7QUFDekIsbUNBQW1DO0FBRW5DLG1DQUFvQztBQUNwQywyQkFBdUQ7QUFDdkQsMkNBQTZCO0FBQzdCLGlDQU1lO0FBQ2YsbURBQXlEO0FBNkR6RDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFhLFlBQVk7O0lBQ1AsVUFBVSxDQUFVO0lBQ3BCLGNBQWMsQ0FBVTtJQUV2QixPQUFPLENBQVc7SUFDbEIsV0FBVyxDQUE2QjtJQUN4QyxnQkFBZ0IsQ0FBVTtJQUMxQixVQUFVLENBQW1CO0lBRTlDLFlBQVksS0FBd0I7UUFDbEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQzdCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztRQUNyQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDO1FBQy9DLElBQUksQ0FBQyxVQUFVO1lBQ2IsS0FBSyxDQUFDLFVBQVU7Z0JBQ2hCLENBQUMsS0FBSyxDQUFDLGNBQWM7b0JBQ25CLENBQUMsQ0FBQyx3QkFBZ0IsQ0FBQyxJQUFJO29CQUN2QixDQUFDLENBQUMsd0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDO1FBRTNDLHlFQUF5RTtRQUN6RSxxRUFBcUU7UUFDckUsd0VBQXdFO1FBQ3hFLDBFQUEwRTtRQUMxRSxzRUFBc0U7UUFDdEUsSUFBSSxHQUFHLEdBQUcsa0JBQVUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDO2FBQzdCLEdBQUcsQ0FBQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7YUFDMUMsR0FBRyxDQUFDLE9BQU8sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2FBQzdCLEdBQUcsQ0FBQyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzdDLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUNYLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO2lCQUM3QixJQUFJLEVBQUU7aUJBQ04sR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FDbEQsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNwQixHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQzVDLENBQUM7UUFDRCxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsSUFBQSxtQkFBVSxFQUFDLFFBQVEsQ0FBQzthQUM3QyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO2FBQ3RCLE1BQU0sQ0FBQyxLQUFLLENBQUM7YUFDYixLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVNLE1BQU0sQ0FBQyxPQUFzQjtRQUNsQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLE9BQU8sQ0FBQztRQUN0QyxNQUFNLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUN4QyxNQUFNLEdBQUcsR0FDUCxJQUFJLENBQUMsZ0JBQWdCO1lBQ3JCLENBQUMsSUFBQSxlQUFVLEVBQUMsTUFBTSxDQUFDLElBQUksSUFBQSxhQUFRLEVBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFO2dCQUM5QyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7Z0JBQ3RCLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVkLHNFQUFzRTtRQUN0RSx1REFBdUQ7UUFDdkQsSUFBSSxDQUFDLElBQUEsZUFBVSxFQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBQSxhQUFRLEVBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztZQUNyRCxNQUFNLElBQUksS0FBSyxDQUNiLG9EQUFvRCxHQUFHLEVBQUUsQ0FDMUQsQ0FBQztRQUNKLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxJQUFBLHNDQUFzQixFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUU7WUFDbkQsR0FBRztZQUNILHNFQUFzRTtZQUN0RSx3RUFBd0U7WUFDeEUseUVBQXlFO1lBQ3pFLGVBQWU7WUFDZixLQUFLLEVBQUUsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUM7WUFDNUMsR0FBRyxFQUFFO2dCQUNILEdBQUcsT0FBTyxDQUFDLEdBQUc7Z0JBQ2QsR0FBRyxJQUFJLENBQUMsV0FBVztnQkFDbkIsZUFBZSxFQUFFLE1BQU07Z0JBQ3ZCLGdCQUFnQixFQUFFLFNBQVM7YUFDNUI7U0FDRixDQUFDLENBQUM7UUFFSCxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNqQiw4REFBOEQ7WUFDOUQsdUVBQXVFO1lBQ3ZFLHVFQUF1RTtZQUN2RSxJQUFJLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNyQyxPQUFPLG9CQUFZLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDakMsQ0FBQztZQUNELE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQztRQUNyQixDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sTUFBTSxHQUNWLE1BQU0sQ0FBQyxNQUFNLElBQUksSUFBSTtnQkFDbkIsQ0FBQyxDQUFDLFVBQVUsTUFBTSxDQUFDLE1BQU0sRUFBRTtnQkFDM0IsQ0FBQyxDQUFDLFVBQVUsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQ2IsOEJBQThCLE1BQU0sS0FBSyxPQUFPLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUN0RSxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksQ0FBQyxJQUFBLGVBQVUsRUFBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQzNCLE1BQU0sSUFBSSxLQUFLLENBQ2Isc0RBQXNELFNBQVMsRUFBRSxDQUNsRSxDQUFDO1FBQ0osQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyx3QkFBZ0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuRCxPQUFPLG9CQUFZLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNDLENBQUM7UUFDRCxPQUFPLG9CQUFZLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDaEUsQ0FBQzs7QUF6R0gsb0NBMEdDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLGtCQUFrQixDQUFDLEtBQTRCO0lBQ3RELE9BQU8sS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUM7QUFDNUQsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsd0JBQXdCLENBQUMsU0FBaUI7SUFDakQsMEVBQTBFO0lBQzFFLHFFQUFxRTtJQUNyRSxpREFBaUQ7SUFDakQsTUFBTSxLQUFLLEdBQUcsSUFBQSxnQkFBVyxFQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ3BELElBQUEsYUFBUSxFQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQy9DLENBQUM7SUFDRixJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FDYiw4REFBOEQ7WUFDNUQsZUFBZSx3QkFBZ0IsQ0FBQyxJQUFJLFdBQVcsS0FBSyxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FDOUUsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIGNka3RuLWlvXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTVBMLTIuMFxuXG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSBcImNyeXB0b1wiO1xuaW1wb3J0IHsgZXhpc3RzU3luYywgcmVhZGRpclN5bmMsIHN0YXRTeW5jIH0gZnJvbSBcImZzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQge1xuICBCdW5kbGVPcHRpb25zLFxuICBCdW5kbGVPdXRwdXRUeXBlLFxuICBCdW5kbGVSZXN1bHQsXG4gIEJ1bmRsZXJLZXksXG4gIElBc3NldEJ1bmRsZXIsXG59IGZyb20gXCJjZGt0blwiO1xuaW1wb3J0IHsgc3Bhd25TeW5jQ3Jvc3NQbGF0Zm9ybSB9IGZyb20gXCIuL3dpbmRvd3Mtc3Bhd25cIjtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciB7QGxpbmsgTG9jYWxCdW5kbGVyfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2NhbEJ1bmRsZXJQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgY29tbWFuZCB0byBydW4gb24gdGhlIGhvc3QsIGFzIGFuIGFyZ3YgYXJyYXkuXG4gICAqXG4gICAqIFRoZSBmaXJzdCBlbGVtZW50IGlzIHRoZSBwcm9ncmFtOyB0aGUgcmVzdCBhcmUgaXRzIGFyZ3VtZW50cy4gVGhlIGNvbW1hbmRcbiAgICogcnVucyB3aXRoIGBBU1NFVF9JTlBVVF9ESVJgIHNldCB0byB0aGUgc291cmNlIGFuZCBgQVNTRVRfT1VUUFVUX0RJUmAgc2V0XG4gICAqIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LCBhbmQgaXQgaXMgZXhwZWN0ZWQgdG8gd3JpdGUgdGhlIGJ1aWx0IGFydGlmYWN0XG4gICAqIGludG8gYEFTU0VUX09VVFBVVF9ESVJgLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEVudmlyb25tZW50IHZhcmlhYmxlcyB0byBzZXQgZm9yIHRoZSBjb21tYW5kLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG9ubHkgdGhlIGNhbGxlcidzIGVudmlyb25tZW50IHBsdXMgYEFTU0VUX0lOUFVUX0RJUmAgYW5kXG4gICAqIGBBU1NFVF9PVVRQVVRfRElSYFxuICAgKi9cbiAgcmVhZG9ubHkgZW52aXJvbm1lbnQ/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.
|
|
4
|
-
"description": "
|
|
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
|
-
"
|
|
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
|
}
|