@alchemy.run/docker 2.0.0-beta.85 → 2.0.0-beta.86

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/README.md +16 -0
  2. package/lib/Bootstrap.d.ts.map +1 -1
  3. package/lib/Bootstrap.js +2 -1
  4. package/lib/Bootstrap.js.map +1 -1
  5. package/lib/BuildCache.d.ts +87 -0
  6. package/lib/BuildCache.d.ts.map +1 -0
  7. package/lib/BuildCache.js +39 -0
  8. package/lib/BuildCache.js.map +1 -0
  9. package/lib/BuildHash.d.ts +9 -1
  10. package/lib/BuildHash.d.ts.map +1 -1
  11. package/lib/BuildHash.js +51 -19
  12. package/lib/BuildHash.js.map +1 -1
  13. package/lib/BuildPlan.d.ts +202 -0
  14. package/lib/BuildPlan.d.ts.map +1 -0
  15. package/lib/BuildPlan.js +514 -0
  16. package/lib/BuildPlan.js.map +1 -0
  17. package/lib/Container.d.ts +24 -1
  18. package/lib/Container.d.ts.map +1 -1
  19. package/lib/Container.js +14 -0
  20. package/lib/Container.js.map +1 -1
  21. package/lib/Context.d.ts +20 -1
  22. package/lib/Context.d.ts.map +1 -1
  23. package/lib/Context.js +15 -0
  24. package/lib/Context.js.map +1 -1
  25. package/lib/Docker.d.ts +33 -0
  26. package/lib/Docker.d.ts.map +1 -1
  27. package/lib/Docker.js +23 -2
  28. package/lib/Docker.js.map +1 -1
  29. package/lib/Dockerfile.d.ts +0 -2
  30. package/lib/Dockerfile.d.ts.map +1 -1
  31. package/lib/Dockerfile.js.map +1 -1
  32. package/lib/DockerfileParser.d.ts +125 -0
  33. package/lib/DockerfileParser.d.ts.map +1 -0
  34. package/lib/DockerfileParser.js +1040 -0
  35. package/lib/DockerfileParser.js.map +1 -0
  36. package/lib/HealthcheckCommand.d.ts.map +1 -1
  37. package/lib/HealthcheckCommand.js.map +1 -1
  38. package/lib/Image.d.ts +40 -12
  39. package/lib/Image.d.ts.map +1 -1
  40. package/lib/Image.js +41 -9
  41. package/lib/Image.js.map +1 -1
  42. package/lib/ImageArchive.d.ts +41 -0
  43. package/lib/ImageArchive.d.ts.map +1 -0
  44. package/lib/ImageArchive.js +54 -0
  45. package/lib/ImageArchive.js.map +1 -0
  46. package/lib/ImageSource.d.ts +100 -11
  47. package/lib/ImageSource.d.ts.map +1 -1
  48. package/lib/ImageSource.js +219 -73
  49. package/lib/ImageSource.js.map +1 -1
  50. package/lib/Network.d.ts +175 -3
  51. package/lib/Network.d.ts.map +1 -1
  52. package/lib/Network.js +296 -8
  53. package/lib/Network.js.map +1 -1
  54. package/lib/Providers.d.ts.map +1 -1
  55. package/lib/Providers.js.map +1 -1
  56. package/lib/Registry.d.ts.map +1 -1
  57. package/lib/Registry.js.map +1 -1
  58. package/lib/RegistryError.d.ts.map +1 -1
  59. package/lib/RegistryError.js.map +1 -1
  60. package/lib/RemoteImage.d.ts.map +1 -1
  61. package/lib/RemoteImage.js.map +1 -1
  62. package/lib/Service.d.ts.map +1 -1
  63. package/lib/Service.js.map +1 -1
  64. package/lib/ServiceImage.d.ts.map +1 -1
  65. package/lib/ServiceImage.js.map +1 -1
  66. package/lib/ShellWord.d.ts +28 -0
  67. package/lib/ShellWord.d.ts.map +1 -0
  68. package/lib/ShellWord.js +301 -0
  69. package/lib/ShellWord.js.map +1 -0
  70. package/lib/Swarm.d.ts.map +1 -1
  71. package/lib/Swarm.js.map +1 -1
  72. package/lib/Volume.d.ts +24 -1
  73. package/lib/Volume.d.ts.map +1 -1
  74. package/lib/Volume.js +16 -0
  75. package/lib/Volume.js.map +1 -1
  76. package/lib/index.d.ts.map +1 -1
  77. package/lib/index.js.map +1 -1
  78. package/package.json +9 -9
  79. package/src/Bootstrap.ts +2 -0
  80. package/src/BuildCache.ts +111 -0
  81. package/src/BuildHash.ts +73 -24
  82. package/src/BuildPlan.ts +758 -0
  83. package/src/Container.ts +31 -1
  84. package/src/Context.ts +27 -1
  85. package/src/Docker.ts +56 -2
  86. package/src/Dockerfile.ts +0 -2
  87. package/src/DockerfileParser.ts +1152 -0
  88. package/src/Image.ts +45 -14
  89. package/src/ImageArchive.ts +77 -0
  90. package/src/ImageSource.ts +322 -103
  91. package/src/Network.ts +432 -10
  92. package/src/ShellWord.ts +326 -0
  93. package/src/Volume.ts +33 -1
@@ -0,0 +1,514 @@
1
+ import * as crypto from "node:crypto";
2
+ import { normalizeRelativePath, walkIgnoring } from "alchemy/Util/Ignore";
3
+ import { sha256Object } from "alchemy/Util/sha256";
4
+ import * as Data from "effect/Data";
5
+ import * as Effect from "effect/Effect";
6
+ import * as FileSystem from "effect/FileSystem";
7
+ import * as Path from "effect/Path";
8
+ import * as Result from "effect/Result";
9
+ import * as Stream from "effect/Stream";
10
+ import { selectDockerBuildContext } from "./BuildHash.js";
11
+ import { Docker } from "./Docker.js";
12
+ import { isInlineDockerfile } from "./Dockerfile.js";
13
+ import * as DockerfileParser from "./DockerfileParser.js";
14
+ import { bundleMainProgram, } from "./ImageSource.js";
15
+ import { publishedRepoDigest } from "./Registry.js";
16
+ /** The Dockerfile uses something the target builder cannot build. */
17
+ export class UnsupportedDockerfile extends Data.TaggedError("UnsupportedDockerfile") {
18
+ }
19
+ /** The image source cannot be planned (a missing file, an unresolved input, an inline Dockerfile that copies from a context). */
20
+ export class BuildPlanError extends Data.TaggedError("BuildPlanError") {
21
+ }
22
+ /** The context directory a plan's bundled `main` files live under. */
23
+ export const BUNDLE_DIR = "__alchemy__";
24
+ /** Default base for a `main` program with no environment: Docker Hub's bun image. */
25
+ export const DEFAULT_MAIN_BASE = "oven/bun:1";
26
+ const isRemoteSource = (source) => /^(https?:\/\/|git@)/.test(source);
27
+ const isHeredocSource = (source) => source.startsWith("<<");
28
+ /** Sources that read from the build context (not another stage, a URL, or a heredoc). */
29
+ const contextSources = (instruction) => instruction.flags.some((flag) => flag.name === "from")
30
+ ? []
31
+ : instruction.sources.filter((source) => !isRemoteSource(source) && !isHeredocSource(source));
32
+ // ---------------------------------------------------------------------------
33
+ // COPY source matching (Go filepath.Match per segment, plus `**`)
34
+ // ---------------------------------------------------------------------------
35
+ const segmentPattern = (segment) => new RegExp(`^${segment
36
+ .replace(/[.+^${}()|\\]/g, "\\$&")
37
+ .replace(/\[!/g, "[^")
38
+ .replace(/\*/g, "[^/]*")
39
+ .replace(/\?/g, "[^/]")}$`);
40
+ const compileSource = (source) => {
41
+ const cleaned = normalizeRelativePath(source).replace(/^\/+/, "").replace(/\/+$/, "");
42
+ const segments = cleaned.split("/").filter((segment) => segment.length > 0 && segment !== ".");
43
+ return {
44
+ all: segments.length === 0,
45
+ segments,
46
+ matchers: segments.map((segment) => (segment === "**" ? "**" : segmentPattern(segment))),
47
+ };
48
+ };
49
+ const matchSegments = (path, matchers) => {
50
+ if (matchers.length === 0)
51
+ return path.length === 0;
52
+ const [head, ...rest] = matchers;
53
+ if (head === "**") {
54
+ for (let skip = 0; skip <= path.length; skip++) {
55
+ if (matchSegments(path.slice(skip), rest))
56
+ return true;
57
+ }
58
+ return false;
59
+ }
60
+ return path.length > 0 && head.test(path[0]) && matchSegments(path.slice(1), rest);
61
+ };
62
+ /** The pattern names `path` or one of its directories (a directory copies its contents). */
63
+ const covers = (pattern, path) => {
64
+ if (pattern.all)
65
+ return true;
66
+ const segments = path.split("/");
67
+ for (let length = 1; length <= segments.length; length++) {
68
+ if (matchSegments(segments.slice(0, length), pattern.matchers))
69
+ return true;
70
+ }
71
+ return false;
72
+ };
73
+ /** A directory a walk must descend into: covered, or on the way to a match. */
74
+ const reaches = (pattern, directory) => {
75
+ if (covers(pattern, directory))
76
+ return true;
77
+ const segments = directory.split("/");
78
+ for (let index = 0; index < segments.length; index++) {
79
+ const matcher = pattern.matchers[index];
80
+ if (matcher === undefined)
81
+ return false;
82
+ if (matcher === "**")
83
+ return true;
84
+ if (!matcher.test(segments[index]))
85
+ return false;
86
+ }
87
+ return true;
88
+ };
89
+ /** The context files one `COPY`/`ADD` reads. */
90
+ export const filesFor = (plan, instruction) => {
91
+ const patterns = contextSources(instruction).map(compileSource);
92
+ return plan.files.filter((file) => patterns.some((pattern) => covers(pattern, file.path)));
93
+ };
94
+ // ---------------------------------------------------------------------------
95
+ // planning
96
+ // ---------------------------------------------------------------------------
97
+ const hashFile = Effect.fn(function* (absolutePath) {
98
+ const fs = yield* FileSystem.FileSystem;
99
+ const hasher = yield* Effect.sync(() => crypto.createHash("sha256"));
100
+ yield* fs.stream(absolutePath).pipe(Stream.runForEach((chunk) => Effect.sync(() => {
101
+ hasher.update(chunk);
102
+ })));
103
+ return yield* Effect.sync(() => hasher.digest("hex"));
104
+ });
105
+ const hashBytes = (bytes) => Effect.sync(() => crypto.createHash("sha256").update(bytes).digest("hex"));
106
+ /** Walk only the directories some source can reach, and keep what `.dockerignore` keeps. */
107
+ const collectContextFiles = Effect.fn(function* (options) {
108
+ if (options.sources.length === 0)
109
+ return [];
110
+ const fs = yield* FileSystem.FileSystem;
111
+ const path = yield* Path.Path;
112
+ const selection = yield* selectDockerBuildContext({
113
+ context: options.context,
114
+ dockerfile: options.dockerfile,
115
+ });
116
+ const patterns = options.sources.map(compileSource);
117
+ const entries = yield* walkIgnoring({
118
+ list: Effect.fn(function* (relativeDirectory) {
119
+ const directory = path.join(selection.context, relativeDirectory);
120
+ const names = yield* fs.readDirectory(directory);
121
+ const children = yield* Effect.forEach(names, (name) => Effect.gen(function* () {
122
+ const fullPath = path.join(directory, name);
123
+ const childPath = relativeDirectory.length === 0 ? name : `${relativeDirectory}/${name}`;
124
+ if (Result.isSuccess(yield* Effect.result(fs.readLink(fullPath)))) {
125
+ return { name, childPath, type: "SymbolicLink" };
126
+ }
127
+ const info = yield* fs.stat(fullPath);
128
+ const type = info.type === "File" || info.type === "Directory" ? info.type : "Other";
129
+ return { name, childPath, type };
130
+ }));
131
+ return children.filter((child) => child.type !== "Directory" ||
132
+ patterns.some((pattern) => reaches(pattern, child.childPath)));
133
+ }),
134
+ });
135
+ const files = [];
136
+ for (const entry of entries) {
137
+ if (entry.type !== "File" && entry.type !== "SymbolicLink")
138
+ continue;
139
+ if (!selection.includes(entry.path))
140
+ continue;
141
+ if (!patterns.some((pattern) => covers(pattern, entry.path)))
142
+ continue;
143
+ const absolutePath = path.join(selection.context, entry.path);
144
+ // Docker copies a symlink's target into the image when the link is named directly.
145
+ const info = yield* fs.stat(absolutePath);
146
+ if (info.type !== "File")
147
+ continue;
148
+ files.push({
149
+ path: entry.path,
150
+ mode: info.mode & 0o7777,
151
+ size: Number(info.size),
152
+ sha256: yield* hashFile(absolutePath),
153
+ source: { _tag: "Path", absolutePath },
154
+ });
155
+ }
156
+ return files;
157
+ });
158
+ const unsupported = (target, violations) => new UnsupportedDockerfile({
159
+ target,
160
+ violations,
161
+ message: [
162
+ `${target} cannot build this Dockerfile:`,
163
+ ...violations.map((violation) => violation.line > 0
164
+ ? ` line ${violation.line}: ${violation.instruction}: ${violation.reason}`
165
+ : ` ${violation.instruction}: ${violation.reason}`),
166
+ ].join("\n"),
167
+ });
168
+ /** Check a parsed Dockerfile against a builder's capabilities. */
169
+ export const check = (dockerfile, capabilities, platform) => {
170
+ const violations = [];
171
+ const warnings = [];
172
+ if (capabilities.platforms !== undefined && !capabilities.platforms.includes(platform)) {
173
+ violations.push({
174
+ line: 0,
175
+ instruction: "platform",
176
+ reason: `${platform} is not supported (supported: ${capabilities.platforms.join(", ")})`,
177
+ });
178
+ }
179
+ if (capabilities.platforms !== undefined) {
180
+ for (const stage of dockerfile.stages) {
181
+ const pinned = stage.flags.find((flag) => flag.name === "platform")?.value;
182
+ // `$BUILDPLATFORM`-style values resolve at build time, to the builder's own platform.
183
+ if (pinned === undefined || pinned.includes("$"))
184
+ continue;
185
+ if (!capabilities.platforms.includes(pinned)) {
186
+ violations.push({
187
+ line: stage.line,
188
+ instruction: "FROM --platform",
189
+ reason: `${pinned} is not supported (supported: ${capabilities.platforms.join(", ")})`,
190
+ });
191
+ }
192
+ }
193
+ }
194
+ if (capabilities.multiStage === false && dockerfile.stages.length > 1) {
195
+ for (const stage of dockerfile.stages.slice(1)) {
196
+ violations.push({
197
+ line: stage.line,
198
+ instruction: "FROM",
199
+ reason: "multi-stage builds are not supported",
200
+ });
201
+ }
202
+ }
203
+ for (const stage of dockerfile.stages) {
204
+ for (const instruction of stage.instructions) {
205
+ const status = capabilities.instructions?.[instruction._tag];
206
+ if (status === "unsupported") {
207
+ violations.push({
208
+ line: instruction.line,
209
+ instruction: instruction._tag,
210
+ reason: "not supported",
211
+ });
212
+ }
213
+ else if (status === "ignored") {
214
+ warnings.push(`${capabilities.target} ignores ${instruction._tag}${instruction.line > 0 ? ` (line ${instruction.line})` : ""}`);
215
+ }
216
+ if (instruction._tag === "COPY" || instruction._tag === "ADD") {
217
+ if (capabilities.multiStage === false &&
218
+ instruction.flags.some((flag) => flag.name === "from")) {
219
+ violations.push({
220
+ line: instruction.line,
221
+ instruction: `${instruction._tag} --from`,
222
+ reason: "multi-stage builds are not supported",
223
+ });
224
+ }
225
+ if (capabilities.remoteAdd === false && instruction.sources.some(isRemoteSource)) {
226
+ violations.push({
227
+ line: instruction.line,
228
+ instruction: instruction._tag,
229
+ reason: "remote sources are not supported",
230
+ });
231
+ }
232
+ }
233
+ if ((instruction._tag === "RUN" || instruction._tag === "COPY" || instruction._tag === "ADD") &&
234
+ capabilities.heredocs === false &&
235
+ instruction.heredocs.length > 0) {
236
+ violations.push({
237
+ line: instruction.line,
238
+ instruction: `${instruction._tag} <<`,
239
+ reason: "heredocs are not supported",
240
+ });
241
+ }
242
+ if (instruction._tag === "RUN" &&
243
+ capabilities.runMounts === false &&
244
+ instruction.flags.some((flag) => flag.name === "mount")) {
245
+ violations.push({
246
+ line: instruction.line,
247
+ instruction: "RUN --mount",
248
+ reason: "build mounts are not supported",
249
+ });
250
+ }
251
+ else if (instruction._tag === "RUN" &&
252
+ capabilities.secrets === false &&
253
+ instruction.flags.some((flag) => flag.name === "mount" && /(^|,)type=secret(,|$)/.test(flag.value ?? ""))) {
254
+ violations.push({
255
+ line: instruction.line,
256
+ instruction: "RUN --mount=type=secret",
257
+ reason: "build secrets are not supported",
258
+ });
259
+ }
260
+ }
261
+ }
262
+ return { violations, warnings };
263
+ };
264
+ /** The generated layer that runs a bundled `main`: shared by every builder. */
265
+ const mainLayer = (port) => [
266
+ `WORKDIR /app`,
267
+ `COPY ${BUNDLE_DIR}/ /app/`,
268
+ ...(port === undefined ? [] : [`ENV PORT=${String(port)}`]),
269
+ `ENTRYPOINT ["bun", "/app/index.mjs"]`,
270
+ ].join("\n");
271
+ /** Synthesized instructions carry line 0: they are not in the user's Dockerfile. */
272
+ const synthesized = (instruction) => ({ ...instruction, line: 0 });
273
+ /** Append generated instructions to the final stage. */
274
+ const appendToFinalStage = Effect.fn(function* (dockerfile, lines) {
275
+ const layer = yield* DockerfileParser.parse(`FROM scratch\n${lines}\n`);
276
+ const stages = [...dockerfile.stages];
277
+ const final = stages.at(-1);
278
+ stages[stages.length - 1] = {
279
+ ...final,
280
+ instructions: [...final.instructions, ...layer.stages[0].instructions.map(synthesized)],
281
+ };
282
+ return { ...dockerfile, stages };
283
+ });
284
+ /**
285
+ * Write build argument values into the `ARG` defaults that declare them, for
286
+ * builders that take no build arguments. Values are quoted so they are used
287
+ * as given, the way `--build-arg` passes them (no `$` expansion).
288
+ */
289
+ const bakeArgs = (dockerfile, args) => {
290
+ const escape = dockerfile.directives.escape ?? "\\";
291
+ // A baked value is literal, so `$` is escaped too; a default that was
292
+ // already there keeps its `$` references.
293
+ const quote = (value, literal) => `"${Array.from(value, (char) => char === escape || char === '"' || (literal && char === "$") ? `${escape}${char}` : char).join("")}"`;
294
+ const bake = (instruction) => {
295
+ if (instruction._tag !== "ARG" || !instruction.vars.some(([name]) => name in args)) {
296
+ return instruction;
297
+ }
298
+ const vars = instruction.vars.map(([name, value]) => name in args ? [name, args[name]] : [name, value]);
299
+ const raw = `ARG ${vars
300
+ .map(([name, value]) => value === undefined ? name : `${name}=${quote(value, name in args)}`)
301
+ .join(" ")}`;
302
+ return { ...instruction, vars, raw };
303
+ };
304
+ return {
305
+ ...dockerfile,
306
+ globalArgs: dockerfile.globalArgs.map(bake),
307
+ stages: dockerfile.stages.map((stage) => ({
308
+ ...stage,
309
+ instructions: stage.instructions.map(bake),
310
+ })),
311
+ };
312
+ };
313
+ /**
314
+ * Resolve an image source into a {@link BuildPlan} for one builder.
315
+ */
316
+ export const plan = Effect.fn(function* (source, options) {
317
+ const fs = yield* FileSystem.FileSystem;
318
+ const path = yield* Path.Path;
319
+ const platform = options.platform ?? "linux/amd64";
320
+ const main = "main" in source ? source : undefined;
321
+ const image = "image" in source ? source.image : undefined;
322
+ const dockerfileProp = "dockerfile" in source ? source.dockerfile : undefined;
323
+ const contextProp = "context" in source ? source.context : undefined;
324
+ const build = main === undefined ? source.build : undefined;
325
+ // 1. The environment's Dockerfile text, and where its context lives.
326
+ let text;
327
+ let context;
328
+ if (dockerfileProp !== undefined && isInlineDockerfile(dockerfileProp)) {
329
+ if (typeof dockerfileProp.content !== "string") {
330
+ return yield* new BuildPlanError({
331
+ message: "inline dockerfile content is not resolved yet",
332
+ });
333
+ }
334
+ text = dockerfileProp.content;
335
+ }
336
+ else if (dockerfileProp !== undefined || contextProp !== undefined) {
337
+ const contextDir = path.resolve(contextProp ?? ".");
338
+ const dockerfile = dockerfileProp !== undefined
339
+ ? path.resolve(dockerfileProp)
340
+ : path.join(contextDir, "Dockerfile");
341
+ text = yield* fs
342
+ .readFileString(dockerfile)
343
+ .pipe(Effect.mapError((cause) => new BuildPlanError({ message: `cannot read ${dockerfile}`, cause })));
344
+ context = { context: contextDir, dockerfile };
345
+ }
346
+ else if (image !== undefined) {
347
+ text = `FROM ${image}\n`;
348
+ }
349
+ else if (main !== undefined) {
350
+ text = `FROM ${DEFAULT_MAIN_BASE}\n`;
351
+ }
352
+ else {
353
+ return yield* new BuildPlanError({
354
+ message: "an image source needs `image`, `dockerfile`, `context`, or `main`",
355
+ });
356
+ }
357
+ let dockerfile = yield* DockerfileParser.parse(text);
358
+ // 2. Install lines from the host's bindings, then a bundled `main`, become
359
+ // generated layers on the final stage.
360
+ if (options.install !== undefined && options.install.length > 0) {
361
+ dockerfile = yield* appendToFinalStage(dockerfile, options.install.join("\n"));
362
+ }
363
+ const files = [];
364
+ if (main !== undefined) {
365
+ const bundled = yield* bundleMainProgram({
366
+ source: main,
367
+ isExternal: options.bootstrap === undefined,
368
+ bootstrap: options.bootstrap ?? ((importPath) => importPath),
369
+ });
370
+ for (const file of bundled.files) {
371
+ files.push({
372
+ path: `${BUNDLE_DIR}/${normalizeRelativePath(file.path)}`,
373
+ mode: 0o644,
374
+ size: file.content.byteLength,
375
+ sha256: yield* hashBytes(file.content),
376
+ source: { _tag: "Bytes", bytes: file.content },
377
+ });
378
+ }
379
+ dockerfile = yield* appendToFinalStage(dockerfile, mainLayer(options.port));
380
+ }
381
+ // 3. Context files every COPY/ADD reaches.
382
+ const sources = dockerfile.stages.flatMap((stage) => stage.instructions.flatMap((instruction) => (instruction._tag === "COPY" || instruction._tag === "ADD") && instruction.line > 0
383
+ ? contextSources(instruction)
384
+ : []));
385
+ if (sources.length > 0) {
386
+ if (context === undefined) {
387
+ return yield* new BuildPlanError({
388
+ message: `an inline dockerfile cannot COPY from a build context (${sources.join(", ")}); use \`context\` + a Dockerfile path`,
389
+ });
390
+ }
391
+ files.push(...(yield* collectContextFiles({ ...context, sources })));
392
+ }
393
+ files.sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0));
394
+ // 4. What the builder can do.
395
+ const secrets = build?.secrets ?? {};
396
+ const { violations, warnings } = check(dockerfile, options.capabilities, platform);
397
+ if (options.capabilities.secrets === false && Object.keys(secrets).length > 0) {
398
+ violations.push({
399
+ line: 0,
400
+ instruction: "build.secrets",
401
+ reason: "build secrets are not supported",
402
+ });
403
+ }
404
+ if (violations.length > 0) {
405
+ return yield* unsupported(options.capabilities.target, violations);
406
+ }
407
+ // 5. A builder that takes no build arguments gets them as `ARG` defaults.
408
+ let args = build?.args ?? {};
409
+ if (options.capabilities.buildArgs === false && Object.keys(args).length > 0) {
410
+ dockerfile = bakeArgs(dockerfile, args);
411
+ args = {};
412
+ }
413
+ const final = dockerfile.stages.at(-1);
414
+ const hash = (yield* sha256Object({
415
+ platform,
416
+ dockerfile: DockerfileParser.render(dockerfile),
417
+ files: files.map((file) => [file.path, file.mode, file.sha256]),
418
+ args,
419
+ secrets: Object.keys(secrets).sort(),
420
+ pull: options.pull?.server,
421
+ })).slice(0, 32);
422
+ return {
423
+ hash,
424
+ platform,
425
+ dockerfile,
426
+ base: final.image,
427
+ pull: options.pull,
428
+ instructions: final.instructions,
429
+ files,
430
+ args,
431
+ secrets,
432
+ warnings,
433
+ };
434
+ });
435
+ /** A context file's contents. */
436
+ export const readContextFile = Effect.fn(function* (file) {
437
+ if (file.source._tag === "Bytes")
438
+ return file.source.bytes;
439
+ const fs = yield* FileSystem.FileSystem;
440
+ return yield* fs.readFile(file.source.absolutePath);
441
+ });
442
+ /** The plan as Dockerfile text. */
443
+ export const render = (plan) => DockerfileParser.render(plan.dockerfile);
444
+ /** The plan as one entry per instruction (for APIs that take a list of Dockerfile commands). */
445
+ export const renderLines = (plan) => DockerfileParser.renderLines(plan.dockerfile);
446
+ /**
447
+ * The argv the image starts with, from the final stage's `ENTRYPOINT` and
448
+ * `CMD` (Docker's rules: a shell-form `ENTRYPOINT` ignores `CMD`).
449
+ * `undefined` when the final stage sets neither (the base image's applies).
450
+ */
451
+ export const startCommand = (plan) => {
452
+ const entrypoint = plan.instructions.findLast((instruction) => instruction._tag === "ENTRYPOINT");
453
+ const cmd = plan.instructions.findLast((instruction) => instruction._tag === "CMD");
454
+ const argv = (instruction) => instruction === undefined || !("command" in instruction)
455
+ ? undefined
456
+ : instruction.command.form === "exec"
457
+ ? instruction.command.argv
458
+ : ["/bin/sh", "-c", instruction.command.script];
459
+ if (entrypoint !== undefined && "command" in entrypoint) {
460
+ return entrypoint.command.form === "shell"
461
+ ? argv(entrypoint)
462
+ : [...entrypoint.command.argv, ...(argv(cmd) ?? [])];
463
+ }
464
+ return argv(cmd);
465
+ };
466
+ /**
467
+ * Check Dockerfile text against a builder's capabilities, without reading a
468
+ * build context or bundling anything: usable where there is no filesystem
469
+ * (a Worker creating images at run time). Returns the warnings.
470
+ */
471
+ export const checkContent = Effect.fn(function* (text, options) {
472
+ const dockerfile = yield* DockerfileParser.parse(text);
473
+ const { violations, warnings } = check(dockerfile, options.capabilities, options.platform ?? "linux/amd64");
474
+ if (violations.length > 0) {
475
+ return yield* unsupported(options.capabilities.target, violations);
476
+ }
477
+ return warnings;
478
+ });
479
+ /**
480
+ * Build a plan with the local Docker engine and push it, for platforms that
481
+ * only pull images (Archil). Tagged with the plan's hash, so an unchanged
482
+ * plan pushes the same tag. Returns the pushed reference, `repository@digest`
483
+ * when the registry reports a digest, else `repository:hash`.
484
+ */
485
+ export const push = Effect.fn(function* (plan, target) {
486
+ const docker = yield* Docker;
487
+ const fs = yield* FileSystem.FileSystem;
488
+ const path = yield* Path.Path;
489
+ const context = yield* fs.makeTempDirectoryScoped({ prefix: "alchemy-build-plan-" });
490
+ yield* Effect.forEach(plan.files, Effect.fn(function* (file) {
491
+ const fullPath = path.join(context, file.path);
492
+ yield* fs.makeDirectory(path.dirname(fullPath), { recursive: true });
493
+ yield* fs.writeFile(fullPath, yield* readContextFile(file));
494
+ yield* fs.chmod(fullPath, file.mode);
495
+ }), { concurrency: 16 });
496
+ const dockerfile = path.join(context, "Dockerfile.alchemy");
497
+ yield* fs.writeFileString(dockerfile, render(plan));
498
+ const ref = `${target.repository}:${plan.hash}`;
499
+ const output = yield* docker.image.build({
500
+ context,
501
+ file: dockerfile,
502
+ tag: ref,
503
+ platform: plan.platform,
504
+ "build-arg": { ...plan.args },
505
+ secrets: { ...plan.secrets },
506
+ credentials: plan.pull,
507
+ }, undefined, target.push);
508
+ // buildx `--push` exports straight from BuildKit, so the image may not be
509
+ // in the local store to inspect.
510
+ const inspected = yield* Effect.result(docker.image.inspect(ref));
511
+ const pinned = publishedRepoDigest(ref, output, Result.isSuccess(inspected) ? inspected.success.RepoDigests : undefined);
512
+ return { imageRef: pinned ?? ref };
513
+ });
514
+ //# sourceMappingURL=BuildPlan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BuildPlan.js","sources":["../src/BuildPlan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAsB,MAAM,qBAAqB,CAAC;AAC9F,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,IAAI,MAAM,aAAa,CAAC;AACpC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,IAAI,MAAM,aAAa,CAAC;AAEpC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,KAAK,gBAAgB,MAAM,uBAAuB,CAAC;AAO1D,OAAO,EACL,iBAAiB,GAIlB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,mBAAmB,EAAsB,MAAM,eAAe,CAAC;AA6FxE,qEAAqE;AACrE,MAAM,OAAO,qBAAsB,SAAQ,IAAI,CAAC,WAAW,CAAC,uBAAuB,CAIjF;CAAG;AAEL,iIAAiI;AACjI,MAAM,OAAO,cAAe,SAAQ,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAGnE;CAAG;AAEL,sEAAsE;AACtE,MAAM,CAAC,MAAM,UAAU,GAAG,aAAa,CAAC;AAExC,qFAAqF;AACrF,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAAC;AAwB9C,MAAM,cAAc,GAAG,CAAC,MAAc,EAAE,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC9E,MAAM,eAAe,GAAG,CAAC,MAAc,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AAEpE,yFAAyF;AACzF,MAAM,cAAc,GAAG,CAAC,WAA4B,EAAY,EAAE,CAChE,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC;IACpD,CAAC,CAAC,EAAE;IACJ,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;AAElG,8EAA8E;AAC9E,kEAAkE;AAClE,8EAA8E;AAE9E,MAAM,cAAc,GAAG,CAAC,OAAe,EAAE,EAAE,CACzC,IAAI,MAAM,CACR,IAAI,OAAO;KACR,OAAO,CAAC,gBAAgB,EAAE,MAAM,CAAC;KACjC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC;KACrB,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC;KACvB,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAC7B,CAAC;AAQJ,MAAM,aAAa,GAAG,CAAC,MAAc,EAAiB,EAAE;IACtD,MAAM,OAAO,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACtF,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,KAAK,GAAG,CAAC,CAAC;IAC/F,OAAO;QACL,GAAG,EAAE,QAAQ,CAAC,MAAM,KAAK,CAAC;QAC1B,QAAQ;QACR,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;KACzF,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CACpB,IAA2B,EAC3B,QAAsC,EAC7B,EAAE;IACX,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC;IACpD,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,QAAQ,CAAC;IACjC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;YAC/C,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;QACzD,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AACvF,CAAC,CAAC;AAEF,4FAA4F;AAC5F,MAAM,MAAM,GAAG,CAAC,OAAsB,EAAE,IAAY,EAAE,EAAE;IACtD,IAAI,OAAO,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,IAAI,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;QACzD,IAAI,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAC;IAC9E,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,+EAA+E;AAC/E,MAAM,OAAO,GAAG,CAAC,OAAsB,EAAE,SAAiB,EAAE,EAAE;IAC5D,IAAI,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5C,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACtC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QACrD,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QACxC,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAClC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAE,CAAC;YAAE,OAAO,KAAK,CAAC;IACpD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,gDAAgD;AAChD,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,IAAe,EAAE,WAA4B,EAAiB,EAAE;IACvF,MAAM,QAAQ,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAChE,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC7F,CAAC,CAAC;AAEF,8EAA8E;AAC9E,WAAW;AACX,8EAA8E;AAE9E,MAAM,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,YAAoB;IACxD,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC;IACxC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;IACrE,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CACjC,MAAM,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,EAAE,CAC1B,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;QACf,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC,CAAC,CACH,CACF,CAAC;IACF,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AACxD,CAAC,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,CAAC,KAAiB,EAAE,EAAE,CACtC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AAE7E,4FAA4F;AAC5F,MAAM,mBAAmB,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,OAIhD;IACC,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC5C,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC;IACxC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9B,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,wBAAwB,CAAC;QAChD,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,UAAU,EAAE,OAAO,CAAC,UAAU;KAC/B,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAEpD,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC;QAClC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,iBAAyB;YAClD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;YAClE,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;YACjD,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CACrD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;gBAC5C,MAAM,SAAS,GAAG,iBAAiB,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,iBAAiB,IAAI,IAAI,EAAE,CAAC;gBACzF,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;oBAClE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,cAA+B,EAAE,CAAC;gBACpE,CAAC;gBACD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACtC,MAAM,IAAI,GACR,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;gBAC1E,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;YACnC,CAAC,CAAC,CACH,CAAC;YACF,OAAO,QAAQ,CAAC,MAAM,CACpB,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,IAAI,KAAK,WAAW;gBAC1B,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAChE,CAAC;QACJ,CAAC,CAAC;KACH,CAAC,CAAC;IAEH,MAAM,KAAK,GAAkB,EAAE,CAAC;IAChC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc;YAAE,SAAS;QACrE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,SAAS;QAC9C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAAE,SAAS;QACvE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9D,mFAAmF;QACnF,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC1C,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;YAAE,SAAS;QACnC,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,IAAI,CAAC,IAAI,GAAG,MAAM;YACxB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;YACvB,MAAM,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC;YACrC,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE;SACvC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC,CAAC;AAEH,MAAM,WAAW,GAAG,CAAC,MAAc,EAAE,UAAoC,EAAE,EAAE,CAC3E,IAAI,qBAAqB,CAAC;IACxB,MAAM;IACN,UAAU;IACV,OAAO,EAAE;QACP,GAAG,MAAM,gCAAgC;QACzC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAC9B,SAAS,CAAC,IAAI,GAAG,CAAC;YAChB,CAAC,CAAC,UAAU,SAAS,CAAC,IAAI,KAAK,SAAS,CAAC,WAAW,KAAK,SAAS,CAAC,MAAM,EAAE;YAC3E,CAAC,CAAC,KAAK,SAAS,CAAC,WAAW,KAAK,SAAS,CAAC,MAAM,EAAE,CACtD;KACF,CAAC,IAAI,CAAC,IAAI,CAAC;CACb,CAAC,CAAC;AAEL,kEAAkE;AAClE,MAAM,CAAC,MAAM,KAAK,GAAG,CACnB,UAA4B,EAC5B,YAA0B,EAC1B,QAAgB,EACiC,EAAE;IACnD,MAAM,UAAU,GAAgB,EAAE,CAAC;IACnC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,YAAY,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvF,UAAU,CAAC,IAAI,CAAC;YACd,IAAI,EAAE,CAAC;YACP,WAAW,EAAE,UAAU;YACvB,MAAM,EAAE,GAAG,QAAQ,iCAAiC,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;SACzF,CAAC,CAAC;IACL,CAAC;IACD,IAAI,YAAY,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACzC,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;YACtC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,EAAE,KAAK,CAAC;YAC3E,sFAAsF;YACtF,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAAE,SAAS;YAC3D,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC7C,UAAU,CAAC,IAAI,CAAC;oBACd,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,WAAW,EAAE,iBAAiB;oBAC9B,MAAM,EAAE,GAAG,MAAM,iCAAiC,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;iBACvF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,YAAY,CAAC,UAAU,KAAK,KAAK,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtE,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/C,UAAU,CAAC,IAAI,CAAC;gBACd,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,WAAW,EAAE,MAAM;gBACnB,MAAM,EAAE,sCAAsC;aAC/C,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;QACtC,KAAK,MAAM,WAAW,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;YAC7C,MAAM,MAAM,GAAG,YAAY,CAAC,YAAY,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YAC7D,IAAI,MAAM,KAAK,aAAa,EAAE,CAAC;gBAC7B,UAAU,CAAC,IAAI,CAAC;oBACd,IAAI,EAAE,WAAW,CAAC,IAAI;oBACtB,WAAW,EAAE,WAAW,CAAC,IAAI;oBAC7B,MAAM,EAAE,eAAe;iBACxB,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBAChC,QAAQ,CAAC,IAAI,CACX,GAAG,YAAY,CAAC,MAAM,YAAY,WAAW,CAAC,IAAI,GAAG,WAAW,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,WAAW,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACjH,CAAC;YACJ,CAAC;YACD,IAAI,WAAW,CAAC,IAAI,KAAK,MAAM,IAAI,WAAW,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;gBAC9D,IACE,YAAY,CAAC,UAAU,KAAK,KAAK;oBACjC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,EACtD,CAAC;oBACD,UAAU,CAAC,IAAI,CAAC;wBACd,IAAI,EAAE,WAAW,CAAC,IAAI;wBACtB,WAAW,EAAE,GAAG,WAAW,CAAC,IAAI,SAAS;wBACzC,MAAM,EAAE,sCAAsC;qBAC/C,CAAC,CAAC;gBACL,CAAC;gBACD,IAAI,YAAY,CAAC,SAAS,KAAK,KAAK,IAAI,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;oBACjF,UAAU,CAAC,IAAI,CAAC;wBACd,IAAI,EAAE,WAAW,CAAC,IAAI;wBACtB,WAAW,EAAE,WAAW,CAAC,IAAI;wBAC7B,MAAM,EAAE,kCAAkC;qBAC3C,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YACD,IACE,CAAC,WAAW,CAAC,IAAI,KAAK,KAAK,IAAI,WAAW,CAAC,IAAI,KAAK,MAAM,IAAI,WAAW,CAAC,IAAI,KAAK,KAAK,CAAC;gBACzF,YAAY,CAAC,QAAQ,KAAK,KAAK;gBAC/B,WAAW,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAC/B,CAAC;gBACD,UAAU,CAAC,IAAI,CAAC;oBACd,IAAI,EAAE,WAAW,CAAC,IAAI;oBACtB,WAAW,EAAE,GAAG,WAAW,CAAC,IAAI,KAAK;oBACrC,MAAM,EAAE,4BAA4B;iBACrC,CAAC,CAAC;YACL,CAAC;YACD,IACE,WAAW,CAAC,IAAI,KAAK,KAAK;gBAC1B,YAAY,CAAC,SAAS,KAAK,KAAK;gBAChC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,EACvD,CAAC;gBACD,UAAU,CAAC,IAAI,CAAC;oBACd,IAAI,EAAE,WAAW,CAAC,IAAI;oBACtB,WAAW,EAAE,aAAa;oBAC1B,MAAM,EAAE,gCAAgC;iBACzC,CAAC,CAAC;YACL,CAAC;iBAAM,IACL,WAAW,CAAC,IAAI,KAAK,KAAK;gBAC1B,YAAY,CAAC,OAAO,KAAK,KAAK;gBAC9B,WAAW,CAAC,KAAK,CAAC,IAAI,CACpB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAClF,EACD,CAAC;gBACD,UAAU,CAAC,IAAI,CAAC;oBACd,IAAI,EAAE,WAAW,CAAC,IAAI;oBACtB,WAAW,EAAE,yBAAyB;oBACtC,MAAM,EAAE,iCAAiC;iBAC1C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;AAClC,CAAC,CAAC;AAEF,+EAA+E;AAC/E,MAAM,SAAS,GAAG,CAAC,IAAwB,EAAE,EAAE,CAC7C;IACE,cAAc;IACd,QAAQ,UAAU,SAAS;IAC3B,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3D,sCAAsC;CACvC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEf,oFAAoF;AACpF,MAAM,WAAW,GAAG,CAAC,WAAwB,EAAe,EAAE,CAAC,CAAC,EAAE,GAAG,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;AAE7F,wDAAwD;AACxD,MAAM,kBAAkB,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,UAA4B,EAAE,KAAa;IACzF,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,iBAAiB,KAAK,IAAI,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC;IAC7B,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG;QAC1B,GAAG,KAAK;QACR,YAAY,EAAE,CAAC,GAAG,KAAK,CAAC,YAAY,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;KACzF,CAAC;IACF,OAAO,EAAE,GAAG,UAAU,EAAE,MAAM,EAA6B,CAAC;AAC9D,CAAC,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,QAAQ,GAAG,CACf,UAA4B,EAC5B,IAAsC,EACpB,EAAE;IACpB,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,MAAM,IAAI,IAAI,CAAC;IACpD,sEAAsE;IACtE,0CAA0C;IAC1C,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,OAAgB,EAAE,EAAE,CAChD,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAC7B,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CACzF,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC;IAChB,MAAM,IAAI,GAAG,CAAwB,WAAc,EAAK,EAAE;QACxD,IAAI,WAAW,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;YACnF,OAAO,WAAW,CAAC;QACrB,CAAC;QACD,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAClD,IAAI,IAAI,IAAI,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAW,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,KAAK,CAAW,CACxE,CAAC;QACF,MAAM,GAAG,GAAG,OAAO,IAAI;aACpB,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CACrB,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,IAAI,IAAI,IAAI,CAAC,EAAE,CACrE;aACA,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACf,OAAO,EAAE,GAAG,WAAW,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;IACvC,CAAC,CAAC;IACF,OAAO;QACL,GAAG,UAAU;QACb,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;QAC3C,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACxC,GAAG,KAAK;YACR,YAAY,EAAE,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;SAC3C,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAwB,EAAE,OAAoB;IACrF,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC;IACxC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9B,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,aAAa,CAAC;IACnD,MAAM,IAAI,GAAG,MAAM,IAAI,MAAM,CAAC,CAAC,CAAE,MAA6B,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3E,MAAM,KAAK,GAAG,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3D,MAAM,cAAc,GAAG,YAAY,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9E,MAAM,WAAW,GAAG,SAAS,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IACrE,MAAM,KAAK,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAE,MAAgC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAEvF,qEAAqE;IACrE,IAAI,IAAY,CAAC;IACjB,IAAI,OAA4D,CAAC;IACjE,IAAI,cAAc,KAAK,SAAS,IAAI,kBAAkB,CAAC,cAAc,CAAC,EAAE,CAAC;QACvE,IAAI,OAAO,cAAc,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC/C,OAAO,KAAK,CAAC,CAAC,IAAI,cAAc,CAAC;gBAC/B,OAAO,EAAE,+CAA+C;aACzD,CAAC,CAAC;QACL,CAAC;QACD,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC;IAChC,CAAC;SAAM,IAAI,cAAc,KAAK,SAAS,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QACrE,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,GAAG,CAAC,CAAC;QACpD,MAAM,UAAU,GACd,cAAc,KAAK,SAAS;YAC1B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC;YAC9B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QAC1C,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE;aACb,cAAc,CAAC,UAAU,CAAC;aAC1B,IAAI,CACH,MAAM,CAAC,QAAQ,CACb,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,cAAc,CAAC,EAAE,OAAO,EAAE,eAAe,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,CAC/E,CACF,CAAC;QACJ,OAAO,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;IAChD,CAAC;SAAM,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,IAAI,GAAG,QAAQ,KAAK,IAAI,CAAC;IAC3B,CAAC;SAAM,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QAC9B,IAAI,GAAG,QAAQ,iBAAiB,IAAI,CAAC;IACvC,CAAC;SAAM,CAAC;QACN,OAAO,KAAK,CAAC,CAAC,IAAI,cAAc,CAAC;YAC/B,OAAO,EAAE,mEAAmE;SAC7E,CAAC,CAAC;IACL,CAAC;IAED,IAAI,UAAU,GAAG,KAAK,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAErD,2EAA2E;IAC3E,0CAA0C;IAC1C,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChE,UAAU,GAAG,KAAK,CAAC,CAAC,kBAAkB,CAAC,UAAU,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACjF,CAAC;IACD,MAAM,KAAK,GAAkB,EAAE,CAAC;IAChC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,iBAAiB,CAAC;YACvC,MAAM,EAAE,IAAI;YACZ,UAAU,EAAE,OAAO,CAAC,SAAS,KAAK,SAAS;YAC3C,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC;SAC7D,CAAC,CAAC;QACH,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,GAAG,UAAU,IAAI,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBACzD,IAAI,EAAE,KAAK;gBACX,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU;gBAC7B,MAAM,EAAE,KAAK,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;gBACtC,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE;aAC/C,CAAC,CAAC;QACL,CAAC;QACD,UAAU,GAAG,KAAK,CAAC,CAAC,kBAAkB,CAAC,UAAU,EAAE,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED,2CAA2C;IAC3C,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAClD,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE,CACzC,CAAC,WAAW,CAAC,IAAI,KAAK,MAAM,IAAI,WAAW,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,WAAW,CAAC,IAAI,GAAG,CAAC;QACjF,CAAC,CAAC,cAAc,CAAC,WAAW,CAAC;QAC7B,CAAC,CAAC,EAAE,CACP,CACF,CAAC;IACF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC,CAAC,IAAI,cAAc,CAAC;gBAC/B,OAAO,EAAE,0DAA0D,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,wCAAwC;aAC9H,CAAC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,mBAAmB,CAAC,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEvE,8BAA8B;IAC9B,MAAM,OAAO,GAAG,KAAK,EAAE,OAAO,IAAI,EAAE,CAAC;IACrC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IACnF,IAAI,OAAO,CAAC,YAAY,CAAC,OAAO,KAAK,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9E,UAAU,CAAC,IAAI,CAAC;YACd,IAAI,EAAE,CAAC;YACP,WAAW,EAAE,eAAe;YAC5B,MAAM,EAAE,iCAAiC;SAC1C,CAAC,CAAC;IACL,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACrE,CAAC;IAED,0EAA0E;IAC1E,IAAI,IAAI,GAAG,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC;IAC7B,IAAI,OAAO,CAAC,YAAY,CAAC,SAAS,KAAK,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7E,UAAU,GAAG,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACxC,IAAI,GAAG,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC;IACxC,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC;QAChC,QAAQ;QACR,UAAU,EAAE,gBAAgB,CAAC,MAAM,CAAC,UAAU,CAAC;QAC/C,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/D,IAAI;QACJ,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE;QACpC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM;KAC3B,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEjB,OAAO;QACL,IAAI;QACJ,QAAQ;QACR,UAAU;QACV,IAAI,EAAE,KAAK,CAAC,KAAK;QACjB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,KAAK;QACL,IAAI;QACJ,OAAO;QACP,QAAQ;KACW,CAAC;AACxB,CAAC,CAAC,CAAC;AAEH,iCAAiC;AACjC,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAiB;IACnE,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;IAC3D,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC;IACxC,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;AACtD,CAAC,CAAC,CAAC;AAEH,mCAAmC;AACnC,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,IAAe,EAAU,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AAE5F,gGAAgG;AAChG,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAAe,EAAY,EAAE,CACvD,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AAEhD;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAe,EAAqC,EAAE;IACjF,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;IAClG,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;IACpF,MAAM,IAAI,GAAG,CAAC,WAAoC,EAAE,EAAE,CACpD,WAAW,KAAK,SAAS,IAAI,CAAC,CAAC,SAAS,IAAI,WAAW,CAAC;QACtD,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM;YACnC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI;YAC1B,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACtD,IAAI,UAAU,KAAK,SAAS,IAAI,SAAS,IAAI,UAAU,EAAE,CAAC;QACxD,OAAO,UAAU,CAAC,OAAO,CAAC,IAAI,KAAK,OAAO;YACxC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;YAClB,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;AACnB,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAC7C,IAAY,EACZ,OAAuD;IAEvD,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACvD,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,KAAK,CACpC,UAAU,EACV,OAAO,CAAC,YAAY,EACpB,OAAO,CAAC,QAAQ,IAAI,aAAa,CAClC,CAAC;IACF,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC,CAAC;AAUH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAe,EAAE,MAAkB;IAC1E,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC;IAC7B,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC;IACxC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,uBAAuB,CAAC,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC,CAAC;IACrF,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CACnB,IAAI,CAAC,KAAK,EACV,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAI;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,KAAK,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrE,KAAK,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5D,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC,CAAC,EACF,EAAE,WAAW,EAAE,EAAE,EAAE,CACpB,CAAC;IACF,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;IAC5D,KAAK,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IACpD,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;IAChD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CACtC;QACE,OAAO;QACP,IAAI,EAAE,UAAU;QAChB,GAAG,EAAE,GAAG;QACR,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,WAAW,EAAE,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE;QAC7B,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE;QAC5B,WAAW,EAAE,IAAI,CAAC,IAAI;KACvB,EACD,SAAS,EACT,MAAM,CAAC,IAAI,CACZ,CAAC;IACF,0EAA0E;IAC1E,iCAAiC;IACjC,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IAClE,MAAM,MAAM,GAAG,mBAAmB,CAChC,GAAG,EACH,MAAM,EACN,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CACxE,CAAC;IACF,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,EAAE,CAAC;AACrC,CAAC,CAAC,CAAC"}
@@ -222,7 +222,20 @@ export interface Container extends Resource<"Docker.Container", ContainerProps,
222
222
  capAdd?: string[];
223
223
  /** Configured host devices, when reported by Docker. */
224
224
  devices?: Container.DeviceMapping[];
225
- }, never, Providers> {
225
+ }, never, Providers, ContainerLookup> {
226
+ }
227
+ /**
228
+ * Props for {@link Container.lookup}: find a container this stack
229
+ * doesn't manage by its name.
230
+ */
231
+ export interface ContainerLookup {
232
+ /** Container name. */
233
+ name: string;
234
+ /**
235
+ * Docker context the engine is reached through.
236
+ * @default the current context
237
+ */
238
+ context?: string;
226
239
  }
227
240
  /**
228
241
  * A Docker container managed through the active Docker context.
@@ -422,6 +435,16 @@ export interface Container extends Resource<"Docker.Container", ContainerProps,
422
435
  * });
423
436
  * ```
424
437
  *
438
+ * ### Looking up an existing container
439
+ * `Container.lookup` references a container Alchemy doesn't manage (created with
440
+ * the Docker CLI, Compose or another stack). It is read during plan/deploy,
441
+ * never created, updated or removed.
442
+ *
443
+ * **Example:** Reference an existing container
444
+ * ```typescript
445
+ * const db = Docker.Container.lookup({ name: "postgres" });
446
+ * ```
447
+ *
425
448
  * @resource
426
449
  * @product Container
427
450
  */
@@ -1 +1 @@
1
- {"version":3,"file":"Container.d.ts","sourceRoot":"","sources":["../src/Container.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Container.d.ts","sources":["../src/Container.ts"],"names":[],"mappings":"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"}
package/lib/Container.js CHANGED
@@ -213,6 +213,16 @@ const CREATE_CONFIG_HASH_LABEL = "alchemy::container-config";
213
213
  * });
214
214
  * ```
215
215
  *
216
+ * ### Looking up an existing container
217
+ * `Container.lookup` references a container Alchemy doesn't manage (created with
218
+ * the Docker CLI, Compose or another stack). It is read during plan/deploy,
219
+ * never created, updated or removed.
220
+ *
221
+ * **Example:** Reference an existing container
222
+ * ```typescript
223
+ * const db = Docker.Container.lookup({ name: "postgres" });
224
+ * ```
225
+ *
216
226
  * @resource
217
227
  * @product Container
218
228
  */
@@ -297,6 +307,10 @@ export const ContainerProvider = () => Provider.effect(Container, Effect.gen(fun
297
307
  const remove = (name, context) => docker.container.stop(name, context).pipe(Effect.andThen(docker.container.remove(name, true, context)), Effect.catchReason("PlatformError", "NotFound", () => Effect.void));
298
308
  return Container.Provider.of({
299
309
  list: () => Effect.succeed([]),
310
+ lookup: Effect.fn(function* ({ name, context }) {
311
+ const info = yield* inspect(name, context);
312
+ return info ? toContainerAttributes(info, info.Config.Image) : undefined;
313
+ }),
300
314
  read: Effect.fn(function* ({ id, instanceId, olds, output }) {
301
315
  const context = dockerContextName(olds.context);
302
316
  const name = yield* dockerPhysicalName(id, olds, instanceId);