@alchemy.run/docker 0.0.0-stage → 2.0.0-beta.84

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 (98) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +50 -2
  3. package/lib/Bootstrap.d.ts +7 -0
  4. package/lib/Bootstrap.d.ts.map +1 -0
  5. package/lib/Bootstrap.js +25 -0
  6. package/lib/Bootstrap.js.map +1 -0
  7. package/lib/BuildHash.d.ts +47 -0
  8. package/lib/BuildHash.d.ts.map +1 -0
  9. package/lib/BuildHash.js +165 -0
  10. package/lib/BuildHash.js.map +1 -0
  11. package/lib/Container.d.ts +352 -0
  12. package/lib/Container.d.ts.map +1 -0
  13. package/lib/Container.js +531 -0
  14. package/lib/Container.js.map +1 -0
  15. package/lib/Context.d.ts +86 -0
  16. package/lib/Context.d.ts.map +1 -0
  17. package/lib/Context.js +146 -0
  18. package/lib/Context.js.map +1 -0
  19. package/lib/Docker.d.ts +448 -0
  20. package/lib/Docker.d.ts.map +1 -0
  21. package/lib/Docker.js +416 -0
  22. package/lib/Docker.js.map +1 -0
  23. package/lib/Dockerfile.d.ts +72 -0
  24. package/lib/Dockerfile.d.ts.map +1 -0
  25. package/lib/Dockerfile.js +12 -0
  26. package/lib/Dockerfile.js.map +1 -0
  27. package/lib/HealthcheckCommand.d.ts +17 -0
  28. package/lib/HealthcheckCommand.d.ts.map +1 -0
  29. package/lib/HealthcheckCommand.js +33 -0
  30. package/lib/HealthcheckCommand.js.map +1 -0
  31. package/lib/Image.d.ts +151 -0
  32. package/lib/Image.d.ts.map +1 -0
  33. package/lib/Image.js +192 -0
  34. package/lib/Image.js.map +1 -0
  35. package/lib/ImageSource.d.ts +234 -0
  36. package/lib/ImageSource.d.ts.map +1 -0
  37. package/lib/ImageSource.js +469 -0
  38. package/lib/ImageSource.js.map +1 -0
  39. package/lib/Network.d.ts +70 -0
  40. package/lib/Network.d.ts.map +1 -0
  41. package/lib/Network.js +111 -0
  42. package/lib/Network.js.map +1 -0
  43. package/lib/Providers.d.ts +21 -0
  44. package/lib/Providers.d.ts.map +1 -0
  45. package/lib/Providers.js +26 -0
  46. package/lib/Providers.js.map +1 -0
  47. package/lib/Registry.d.ts +47 -0
  48. package/lib/Registry.d.ts.map +1 -0
  49. package/lib/Registry.js +67 -0
  50. package/lib/Registry.js.map +1 -0
  51. package/lib/RegistryError.d.ts +21 -0
  52. package/lib/RegistryError.d.ts.map +1 -0
  53. package/lib/RegistryError.js +28 -0
  54. package/lib/RegistryError.js.map +1 -0
  55. package/lib/RemoteImage.d.ts +118 -0
  56. package/lib/RemoteImage.d.ts.map +1 -0
  57. package/lib/RemoteImage.js +164 -0
  58. package/lib/RemoteImage.js.map +1 -0
  59. package/lib/Service.d.ts +478 -0
  60. package/lib/Service.d.ts.map +1 -0
  61. package/lib/Service.js +588 -0
  62. package/lib/Service.js.map +1 -0
  63. package/lib/ServiceImage.d.ts +78 -0
  64. package/lib/ServiceImage.d.ts.map +1 -0
  65. package/lib/ServiceImage.js +162 -0
  66. package/lib/ServiceImage.js.map +1 -0
  67. package/lib/Swarm.d.ts +119 -0
  68. package/lib/Swarm.d.ts.map +1 -0
  69. package/lib/Swarm.js +148 -0
  70. package/lib/Swarm.js.map +1 -0
  71. package/lib/Volume.d.ts +94 -0
  72. package/lib/Volume.d.ts.map +1 -0
  73. package/lib/Volume.js +133 -0
  74. package/lib/Volume.js.map +1 -0
  75. package/lib/index.d.ts +14 -0
  76. package/lib/index.d.ts.map +1 -0
  77. package/lib/index.js +13 -0
  78. package/lib/index.js.map +1 -0
  79. package/package.json +72 -3
  80. package/src/Bootstrap.ts +51 -0
  81. package/src/BuildHash.ts +255 -0
  82. package/src/Container.ts +792 -0
  83. package/src/Context.ts +215 -0
  84. package/src/Docker.ts +1079 -0
  85. package/src/Dockerfile.ts +81 -0
  86. package/src/HealthcheckCommand.ts +35 -0
  87. package/src/Image.ts +293 -0
  88. package/src/ImageSource.ts +769 -0
  89. package/src/Network.ts +169 -0
  90. package/src/Providers.ts +46 -0
  91. package/src/Registry.ts +91 -0
  92. package/src/RegistryError.ts +48 -0
  93. package/src/RemoteImage.ts +255 -0
  94. package/src/Service.ts +1080 -0
  95. package/src/ServiceImage.ts +252 -0
  96. package/src/Swarm.ts +221 -0
  97. package/src/Volume.ts +193 -0
  98. package/src/index.ts +17 -0
@@ -0,0 +1,469 @@
1
+ import { AlchemyContext } from "alchemy/AlchemyContext";
2
+ import * as Bundle from "alchemy/Bundle/Bundle";
3
+ import { findCwdForBundle, getStableContextDir, resolveMainPath } from "alchemy/Bundle/TempRoot";
4
+ import { hashDirectory } from "alchemy/Command/Memo";
5
+ import { sha256Object } from "alchemy/Util/sha256";
6
+ import * as Effect from "effect/Effect";
7
+ import * as FileSystem from "effect/FileSystem";
8
+ import * as Path from "effect/Path";
9
+ import * as Schedule from "effect/Schedule";
10
+ import { Docker } from "./Docker.js";
11
+ import { isInlineDockerfile } from "./Dockerfile.js";
12
+ /**
13
+ * Which image source a props bag declares. `main` always wins (the other
14
+ * fields then describe its ENVIRONMENT); without `main`, `image` is the
15
+ * mirrored-verbatim source and any `context`/`dockerfile` (path or inline)
16
+ * is an external docker build.
17
+ */
18
+ export const imageSourceKind = (source) => source.main !== undefined
19
+ ? "main"
20
+ : source.image !== undefined
21
+ ? "image"
22
+ : source.context !== undefined || source.dockerfile !== undefined
23
+ ? "context"
24
+ : undefined;
25
+ /**
26
+ * Validate environment-source exclusivity. Dies (plan-time defect) on
27
+ * `image`+`dockerfile`, `image`+`context`, or inline-`dockerfile`+`context`.
28
+ */
29
+ export const validateImageSource = (id, source) => {
30
+ if (source.image !== undefined && source.dockerfile !== undefined) {
31
+ return Effect.die(new Error(`'${id}': 'image' and 'dockerfile' are both set — declare exactly one environment source (an 'image' ref, or a Dockerfile)`));
32
+ }
33
+ if (source.image !== undefined && source.context !== undefined) {
34
+ return Effect.die(new Error(`'${id}': 'image' and 'context' are both set — declare exactly one environment source`));
35
+ }
36
+ if (source.dockerfile !== undefined &&
37
+ isInlineDockerfile(source.dockerfile) &&
38
+ source.context !== undefined) {
39
+ return Effect.die(new Error(`'${id}': inline 'dockerfile' content builds with no context — use a path dockerfile with 'context', or drop 'context'`));
40
+ }
41
+ return Effect.void;
42
+ };
43
+ /**
44
+ * Resolve the Dockerfile path for a `context` source: always relative to the
45
+ * cwd (absolute paths pass through), defaulting to `${context}/Dockerfile`.
46
+ */
47
+ const resolveContextPaths = Effect.fn(function* (source) {
48
+ const fs = yield* FileSystem.FileSystem;
49
+ const path = yield* Path.Path;
50
+ const context = path.resolve(source.context ?? ".");
51
+ const dockerfile = source.dockerfile
52
+ ? path.resolve(source.dockerfile)
53
+ : path.join(context, "Dockerfile");
54
+ if (!(yield* fs.exists(context))) {
55
+ return yield* Effect.die(new Error(`Docker build context does not exist: ${context}`));
56
+ }
57
+ if (!(yield* fs.exists(dockerfile))) {
58
+ return yield* Effect.die(new Error(`Dockerfile does not exist: ${dockerfile}`));
59
+ }
60
+ return { context, dockerfile };
61
+ });
62
+ /**
63
+ * Content hash for the sources whose identity is computable WITHOUT running
64
+ * a bundler:
65
+ *
66
+ * - `context` — hash of the build-context directory + Dockerfile content +
67
+ * platform.
68
+ * - `image` — hash of the image reference + platform (re-mirror only when
69
+ * the ref changes).
70
+ * - `main` — `undefined`: the hash comes from the bundle output, so it is
71
+ * only known inside `resolve`.
72
+ *
73
+ * Providers use this in `diff` to surface content drift (files changed under
74
+ * an unchanged `context` path) as an update.
75
+ */
76
+ export const computeStaticSourceHash = Effect.fn(function* (source, platform) {
77
+ const kind = imageSourceKind(source);
78
+ if (kind === "image") {
79
+ return (yield* sha256Object({
80
+ image: source.image,
81
+ platform: platform ?? "linux/amd64",
82
+ })).slice(0, 16);
83
+ }
84
+ if (kind === "context") {
85
+ if (source.dockerfile !== undefined && isInlineDockerfile(source.dockerfile)) {
86
+ // Inline content builds with no context; an unresolved (Output)
87
+ // content can't be hashed at plan time — defer to reconcile.
88
+ if (typeof source.dockerfile.content !== "string")
89
+ return undefined;
90
+ return (yield* sha256Object({
91
+ dockerfile: source.dockerfile.content,
92
+ platform: platform ?? "linux/amd64",
93
+ })).slice(0, 16);
94
+ }
95
+ const fs = yield* FileSystem.FileSystem;
96
+ const { context, dockerfile } = yield* resolveContextPaths({
97
+ context: source.context,
98
+ dockerfile: source.dockerfile,
99
+ });
100
+ const contextHash = yield* hashDirectory({ cwd: context });
101
+ const dockerfileContent = yield* fs.readFileString(dockerfile);
102
+ return (yield* sha256Object({
103
+ contextHash,
104
+ dockerfile: dockerfileContent,
105
+ platform: platform ?? "linux/amd64",
106
+ })).slice(0, 16);
107
+ }
108
+ return undefined;
109
+ });
110
+ /**
111
+ * Init-time constructor for the image-source resolver. Resolves the services
112
+ * that are only available at provider-layer construction (Docker, the
113
+ * `.alchemy` directory, the rolldown virtual-entry plugin) and returns
114
+ * `resolve` (build/mirror + push to an {@link ImageRegistryTarget}), `hash`,
115
+ * and `watchMain`.
116
+ */
117
+ export const makeContainerImageSource = Effect.gen(function* () {
118
+ const docker = yield* Docker;
119
+ const { dotAlchemy } = yield* AlchemyContext;
120
+ const virtualEntryPlugin = yield* Bundle.virtualEntryPlugin;
121
+ /**
122
+ * The exact rolldown input/output options `bundleProgram` hands to
123
+ * `Bundle.build` — shared with {@link watchMain} so a dev watcher's
124
+ * `Bundle.watch` observes the identical module graph.
125
+ */
126
+ const mainBundleOptions = (source, entry, cwd, plugins) => ({
127
+ inputOptions: {
128
+ ...source.build?.input,
129
+ input: entry,
130
+ cwd,
131
+ platform: "node",
132
+ // The container runs on `bun`; keep `bun`/`bun:*` external (the
133
+ // runtime provides them) and resolve the `bun` export condition
134
+ // so `@effect/platform-bun` picks its Bun implementations.
135
+ external: [
136
+ "bun",
137
+ "bun:*",
138
+ ...(source.build?.input?.external ?? []),
139
+ ],
140
+ resolve: {
141
+ conditionNames: [...Bundle.BUN_CONDITION_NAMES],
142
+ ...source.build?.input?.resolve,
143
+ },
144
+ plugins: [source.build?.input?.plugins, plugins],
145
+ },
146
+ outputOptions: {
147
+ ...source.build?.output,
148
+ format: "esm",
149
+ sourcemap: source.build?.output?.sourcemap ?? false,
150
+ minify: source.build?.output?.minify ?? false,
151
+ entryFileNames: "index.mjs",
152
+ },
153
+ });
154
+ /** Bundle the Effect program behind a `main` source. */
155
+ const bundleProgram = Effect.fn(function* (options) {
156
+ const { source } = options;
157
+ const realMain = yield* resolveMainPath(source.main);
158
+ const cwd = yield* findCwdForBundle(realMain);
159
+ const buildBundle = Effect.fn(function* (entry, plugins) {
160
+ const opts = mainBundleOptions(source, entry, cwd, plugins);
161
+ return yield* Bundle.build(opts.inputOptions, opts.outputOptions, source.build);
162
+ });
163
+ const bundleOutput = options.isExternal
164
+ ? yield* buildBundle(realMain)
165
+ : yield* buildBundle(realMain, virtualEntryPlugin(options.bootstrap));
166
+ // Return every emitted file (entry + shared chunks). Dynamic imports in
167
+ // the Bun HTTP server / AWS SDK split into chunks; dropping any of them
168
+ // crashes the container with `Cannot find module './chunk-XXX.js'`.
169
+ const files = bundleOutput.files.map((file) => ({
170
+ path: file.path,
171
+ content: typeof file.content === "string" ? new TextEncoder().encode(file.content) : file.content,
172
+ }));
173
+ return { files, hash: bundleOutput.hash };
174
+ });
175
+ /**
176
+ * Bundle a `main` source and compute its content-addressed code hash.
177
+ *
178
+ * The hash covers the FULL image identity: the bundle output (which
179
+ * includes the generated bootstrap entry, so bootstrap-template changes
180
+ * invalidate it), the generated Dockerfile, and the target platform.
181
+ * `resolve` and `hash` share this so the plan-time diff hash and the
182
+ * pushed image tag always agree.
183
+ */
184
+ const computeMainCodeHash = Effect.fn(function* (options) {
185
+ const bundled = yield* bundleProgram({
186
+ source: options.source,
187
+ isExternal: options.isExternal,
188
+ bootstrap: options.bootstrap,
189
+ });
190
+ // A path-`dockerfile` environment is built as a separate local stage in
191
+ // `resolve`; hash its identity (context files + Dockerfile content)
192
+ // explicitly since the generated Dockerfile only references the local
193
+ // env tag. Inline environments flow through the generated Dockerfile
194
+ // text itself; `image` environments through its FROM line.
195
+ const df = options.source.dockerfile;
196
+ const isPathEnv = df !== undefined && !isInlineDockerfile(df);
197
+ let envIdentity = {};
198
+ if (isPathEnv) {
199
+ const fs = yield* FileSystem.FileSystem;
200
+ const { context, dockerfile } = yield* resolveContextPaths({
201
+ context: options.source.context,
202
+ dockerfile: df,
203
+ });
204
+ envIdentity = {
205
+ envContextHash: yield* hashDirectory({ cwd: context }),
206
+ envDockerfile: yield* fs.readFileString(dockerfile),
207
+ };
208
+ }
209
+ const dockerfile = generateDockerfile(options.source, options.port, isPathEnv ? "<env>" : undefined);
210
+ const codeHash = (yield* sha256Object({
211
+ bundleHash: bundled.hash,
212
+ dockerfile,
213
+ platform: options.platform,
214
+ ...envIdentity,
215
+ })).slice(0, 16);
216
+ return { bundled, dockerfile, codeHash };
217
+ });
218
+ /**
219
+ * Generated Dockerfile for a bundled `main` program. The environment
220
+ * preamble is, in order of precedence: `envFrom` (a locally-built
221
+ * environment tag from a path-`dockerfile` two-stage build), inline
222
+ * `dockerfile` content (already resolved), the `image` ref, or the
223
+ * default bun base (`oven/bun` is Docker-Hub only — there is no
224
+ * `docker/library/bun` and no `public.ecr.aws/oven/bun`).
225
+ */
226
+ const generateDockerfile = (source, port, envFrom) => {
227
+ const preamble = envFrom !== undefined
228
+ ? `FROM ${envFrom}`
229
+ : source.dockerfile !== undefined && isInlineDockerfile(source.dockerfile)
230
+ ? String(source.dockerfile.content).trimEnd()
231
+ : `FROM ${source.image ?? "oven/bun:1"}`;
232
+ const lines = [
233
+ preamble,
234
+ `WORKDIR /app`,
235
+ `COPY index.mjs /app/index.mjs`,
236
+ // Copy any additional rolldown chunks (`chunk-XXX.js`,
237
+ // `BunServices-YYY.js`, …). Non-trivial bundles always emit at
238
+ // least one; minimal bundles emit none and the COPY no-ops.
239
+ `COPY *.js /app/`,
240
+ ];
241
+ if (port !== undefined) {
242
+ lines.push(`ENV PORT=${String(port)}`, `EXPOSE ${String(port)}`);
243
+ }
244
+ lines.push(`ENTRYPOINT ["bun", "/app/index.mjs"]`);
245
+ return `${lines.join("\n")}\n`;
246
+ };
247
+ /**
248
+ * Build (or mirror) and push an image to `target`, pushing with the
249
+ * target's credentials or — when it has none — the build machine's own
250
+ * Docker login.
251
+ */
252
+ const push = (imageUri, credentials, platform) => (credentials === undefined
253
+ ? docker.run([
254
+ "image",
255
+ "push",
256
+ ...(platform !== undefined ? ["--platform", platform] : []),
257
+ imageUri,
258
+ ])
259
+ : docker.image.push(imageUri, credentials, platform)).pipe(
260
+ // Pushes are idempotent; transient registry-transport failures
261
+ // (Docker Desktop's embedded proxy timing out under load, registry
262
+ // 503s, credential helper contention) resolve on a bounded re-attempt.
263
+ Effect.retry({
264
+ while: () => true,
265
+ schedule: Schedule.exponential("2 seconds"),
266
+ times: 3,
267
+ }));
268
+ const buildAndPush = Effect.fnUntraced(function* (target, options) {
269
+ const credentials = yield* target.credentials;
270
+ yield* docker.image.build({
271
+ tag: options.imageUri,
272
+ context: options.context,
273
+ file: options.dockerfile,
274
+ platform: options.platform,
275
+ });
276
+ yield* push(options.imageUri, credentials, options.platform);
277
+ return options.imageUri;
278
+ });
279
+ /**
280
+ * Resolve the image for a props bag: resolve the target repository,
281
+ * compute the content-addressed tag, then build/mirror + push only when
282
+ * that exact tag is not already in the registry (crash-safe convergence).
283
+ */
284
+ const resolve = Effect.fnUntraced(function* (options, target) {
285
+ const { id, source, session } = options;
286
+ const platform = options.platform ?? "linux/amd64";
287
+ const kind = imageSourceKind(source);
288
+ if (kind === undefined) {
289
+ return yield* Effect.die(new Error(`'${id}' must declare exactly one image source: 'main' (bundled Effect program), 'context' (Dockerfile build), or 'image' (registry reference)`));
290
+ }
291
+ yield* validateImageSource(id, source);
292
+ const repositoryUri = yield* target.repositoryUri;
293
+ if (kind === "main") {
294
+ // Bundle → hash → (skip if pushed) → materialize generated Dockerfile
295
+ // → build + push.
296
+ const df = source.dockerfile;
297
+ if (df !== undefined && isInlineDockerfile(df) && typeof df.content !== "string") {
298
+ return yield* Effect.die(new Error(`'${id}': inline dockerfile content did not resolve to a string — Outputs in Dockerfile.inline must be resolvable at deploy time`));
299
+ }
300
+ yield* session.note(`Bundling ${id} program...`);
301
+ const { bundled, dockerfile, codeHash } = yield* computeMainCodeHash({
302
+ source: source,
303
+ isExternal: options.isExternal,
304
+ bootstrap: options.bootstrap,
305
+ port: options.port,
306
+ platform,
307
+ });
308
+ const imageUri = `${repositoryUri}:${codeHash}`;
309
+ if (yield* target.hasTag(codeHash)) {
310
+ return { imageUri, repositoryUri, codeHash };
311
+ }
312
+ // A path-`dockerfile` environment builds first as a local stage in the
313
+ // USER's context (so its COPYs resolve), then the generated Dockerfile
314
+ // FROMs the local tag and layers the bundle on top.
315
+ let envFrom;
316
+ if (df !== undefined && !isInlineDockerfile(df)) {
317
+ const env = yield* resolveContextPaths({
318
+ context: source.context,
319
+ dockerfile: df,
320
+ });
321
+ envFrom = `alchemy-env-${id.toLowerCase()}:${codeHash}`;
322
+ yield* session.note(`Building environment image for ${id}...`);
323
+ yield* docker.image.build({
324
+ context: env.context,
325
+ file: env.dockerfile,
326
+ tag: envFrom,
327
+ platform,
328
+ });
329
+ }
330
+ const finalDockerfile = envFrom === undefined
331
+ ? dockerfile
332
+ : generateDockerfile(source, options.port, envFrom);
333
+ const realMain = yield* resolveMainPath(source.main);
334
+ const contextDir = yield* getStableContextDir(realMain, dotAlchemy, `${id}-image`);
335
+ yield* docker.materialize({
336
+ context: contextDir,
337
+ dockerfile: finalDockerfile,
338
+ // Entry chunk becomes `index.mjs`; all other chunks keep their
339
+ // emitted `*.js` names so the entry's relative imports resolve.
340
+ files: bundled.files.map((file, index) => ({
341
+ path: index === 0 ? "index.mjs" : file.path,
342
+ content: file.content,
343
+ })),
344
+ });
345
+ yield* session.note(`Building container image ${imageUri}...`);
346
+ yield* buildAndPush(target, {
347
+ imageUri,
348
+ context: contextDir,
349
+ platform,
350
+ });
351
+ yield* session.note(`Pushed ${imageUri}`);
352
+ return { imageUri, repositoryUri, codeHash };
353
+ }
354
+ if (kind === "image") {
355
+ // Mirror: pull → tag → push. Content-addressed on the image ref, so
356
+ // an already-mirrored ref is a no-op.
357
+ const ref = source.image;
358
+ const codeHash = (yield* computeStaticSourceHash(source, platform));
359
+ const imageUri = `${repositoryUri}:${codeHash}`;
360
+ if (yield* target.hasTag(codeHash)) {
361
+ return { imageUri, repositoryUri, codeHash };
362
+ }
363
+ yield* session.note(`Pulling container image ${ref}...`);
364
+ // A registry pull can wedge indefinitely under Docker Hub throttling /
365
+ // credential-helper contention — bound it so a stuck pull fails the
366
+ // deploy loudly instead of hanging the plan.
367
+ yield* docker.image.pull(ref, platform).pipe(Effect.timeout("4 minutes"));
368
+ yield* docker.image.tag(ref, imageUri);
369
+ yield* session.note(`Pushing mirrored image ${imageUri}...`);
370
+ const credentials = yield* target.credentials;
371
+ // Pin the platform on push: with the containerd image store a bare
372
+ // push of a multi-arch tag sends every locally-present variant — a
373
+ // stale other-arch variant in the local cache would reach the
374
+ // registry and the container would crash with `exec format error`.
375
+ yield* push(imageUri, credentials, platform);
376
+ yield* session.note(`Pushed ${imageUri}`);
377
+ return { imageUri, repositoryUri, codeHash };
378
+ }
379
+ // kind === "context": docker build the user's Dockerfile — from a path
380
+ // (in their context) or from inline content (empty stable context).
381
+ const externalDf = source.dockerfile;
382
+ if (externalDf !== undefined && isInlineDockerfile(externalDf)) {
383
+ if (typeof externalDf.content !== "string") {
384
+ return yield* Effect.die(new Error(`'${id}': inline dockerfile content did not resolve to a string — Outputs in Dockerfile.inline must be resolvable at deploy time`));
385
+ }
386
+ const codeHash = (yield* computeStaticSourceHash(source, platform));
387
+ const imageUri = `${repositoryUri}:${codeHash}`;
388
+ if (yield* target.hasTag(codeHash)) {
389
+ return { imageUri, repositoryUri, codeHash };
390
+ }
391
+ const contextDir = yield* getStableContextDir(dotAlchemy, dotAlchemy, `${id}-image`);
392
+ yield* docker.materialize({
393
+ context: contextDir,
394
+ dockerfile: externalDf.content,
395
+ files: [],
396
+ });
397
+ yield* session.note(`Building container image ${imageUri}...`);
398
+ yield* buildAndPush(target, {
399
+ imageUri,
400
+ context: contextDir,
401
+ platform,
402
+ });
403
+ yield* session.note(`Pushed ${imageUri}`);
404
+ return { imageUri, repositoryUri, codeHash };
405
+ }
406
+ const { context, dockerfile } = yield* resolveContextPaths({
407
+ context: source.context,
408
+ dockerfile: externalDf,
409
+ });
410
+ const codeHash = (yield* computeStaticSourceHash(source, platform));
411
+ const imageUri = `${repositoryUri}:${codeHash}`;
412
+ if (yield* target.hasTag(codeHash)) {
413
+ return { imageUri, repositoryUri, codeHash };
414
+ }
415
+ yield* session.note(`Building container image ${imageUri}...`);
416
+ yield* buildAndPush(target, {
417
+ imageUri,
418
+ context,
419
+ dockerfile,
420
+ platform,
421
+ });
422
+ yield* session.note(`Pushed ${imageUri}`);
423
+ return { imageUri, repositoryUri, codeHash };
424
+ });
425
+ /**
426
+ * Content hash for ANY source kind without building or pushing an image.
427
+ *
428
+ * For `main` sources this runs the bundler (bootstrap entry included) so
429
+ * the hash reflects the exact image `resolve` would push — bootstrap
430
+ * template changes and user-code edits both surface as drift. Providers
431
+ * call this from `diff` and compare against `output.code.hash`; static
432
+ * sources (`context` / `image`) delegate to
433
+ * {@link computeStaticSourceHash}.
434
+ */
435
+ const hash = Effect.fn(function* (options) {
436
+ const platform = options.platform ?? "linux/amd64";
437
+ if (imageSourceKind(options.source) === "main") {
438
+ // Unresolved inline environment content (an Output) can't be hashed
439
+ // at plan time — return undefined so the diff defers to reconcile.
440
+ const df = options.source.dockerfile;
441
+ if (df !== undefined && isInlineDockerfile(df) && typeof df.content !== "string") {
442
+ return undefined;
443
+ }
444
+ const { codeHash } = yield* computeMainCodeHash({
445
+ source: options.source,
446
+ isExternal: options.isExternal,
447
+ bootstrap: options.bootstrap,
448
+ port: options.port,
449
+ platform,
450
+ });
451
+ return codeHash;
452
+ }
453
+ return yield* computeStaticSourceHash(options.source, platform);
454
+ });
455
+ /**
456
+ * The rolldown watch plan for a `main` source — the exact input/output
457
+ * options `resolve` bundles with, reusable verbatim with `Bundle.watch`
458
+ * so a dev watcher observes the identical module graph and rebuild
459
+ * triggers.
460
+ */
461
+ const watchMain = Effect.fn(function* (options) {
462
+ const realMain = yield* resolveMainPath(options.source.main);
463
+ const cwd = yield* findCwdForBundle(realMain);
464
+ const opts = mainBundleOptions(options.source, realMain, cwd, options.isExternal ? undefined : virtualEntryPlugin(options.bootstrap));
465
+ return { ...opts, extra: options.source.build };
466
+ });
467
+ return { resolve, hash, watchMain };
468
+ });
469
+ //# sourceMappingURL=ImageSource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageSource.js","sourceRoot":"","sources":["../src/ImageSource.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ import * as Provider from "alchemy/Provider";
2
+ import { Resource } from "alchemy/Resource";
3
+ import { Docker } from "./Docker.ts";
4
+ import type { Providers } from "./Providers.ts";
5
+ export interface NetworkProps {
6
+ /**
7
+ * Docker network name.
8
+ *
9
+ * @default Generated from stack, stage, logical id, and instance id.
10
+ */
11
+ name?: string;
12
+ /** Network driver. @default "bridge" */
13
+ driver?: "bridge" | "host" | "none" | "overlay" | "macvlan" | (string & {});
14
+ /** Enable IPv6 on the network. @default false */
15
+ enableIPv6?: boolean;
16
+ /** Network labels. */
17
+ labels?: Record<string, string>;
18
+ /**
19
+ * The engine the network is created on: a Docker context name, a
20
+ * `Docker.Context` resource, or a `Docker.Swarm` — overlay networks
21
+ * require a swarm manager, and passing the swarm orders the network after
22
+ * the swarm is initialized.
23
+ */
24
+ context?: Docker.EngineRef;
25
+ }
26
+ export interface Network extends Resource<"Docker.Network", NetworkProps, {
27
+ /** Docker network ID. */
28
+ id: string;
29
+ /** Docker network name. */
30
+ name: string;
31
+ /** Network driver. */
32
+ driver: string;
33
+ /** Whether IPv6 is enabled. */
34
+ enableIPv6: boolean;
35
+ /** Labels reported by Docker. */
36
+ labels: Record<string, string>;
37
+ /** Creation timestamp in milliseconds since epoch. */
38
+ createdAt: number;
39
+ }, never, Providers> {
40
+ }
41
+ /**
42
+ * A Docker network managed through the active Docker context.
43
+ *
44
+ * Existing same-name networks are treated as foreign unless the engine is
45
+ * explicitly allowed to adopt them with `--adopt` or `adopt(true)`.
46
+ *
47
+ *
48
+ * ### Creating Networks
49
+ * **Example:** Basic bridge network
50
+ * ```typescript
51
+ * const network = yield* Docker.Network("app-network", {
52
+ * name: "app-network",
53
+ * });
54
+ * ```
55
+ *
56
+ * ### Adoption
57
+ * **Example:** Adopt a pre-existing network
58
+ * ```typescript
59
+ * const network = yield* Docker.Network("app-network", {
60
+ * name: "shared-app-network",
61
+ * }).pipe(adopt(true));
62
+ * ```
63
+ *
64
+ * @resource
65
+ * @product Network
66
+ */
67
+ export declare const Network: import("alchemy/Resource").ResourceClass<Network>;
68
+ export declare const NetworkProvider: () => import("effect/Layer").Layer<Provider.Provider<Network>, never, Docker | import("alchemy/Stack").Stack | import("alchemy/Stage").Stage>;
69
+ export declare const toNetworkAttributes: (info: Docker.Network) => Network["Attributes"];
70
+ //# sourceMappingURL=Network.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Network.d.ts","sourceRoot":"","sources":["../src/Network.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAI5C,OAAO,EAAE,MAAM,EAA+C,MAAM,aAAa,CAAC;AAClF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,MAAM,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;IAC5E,iDAAiD;IACjD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,sBAAsB;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC;CAC5B;AAED,MAAM,WAAW,OAAQ,SAAQ,QAAQ,CACvC,gBAAgB,EAChB,YAAY,EACZ;IACE,yBAAyB;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,sBAAsB;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,UAAU,EAAE,OAAO,CAAC;IACpB,iCAAiC;IACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,sDAAsD;IACtD,SAAS,EAAE,MAAM,CAAC;CACnB,EACD,KAAK,EACL,SAAS,CACV;CAAG;AAEJ;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,eAAO,MAAM,OAAO,mDAAsC,CAAC;AAE3D,eAAO,MAAM,eAAe,+IAoEzB,CAAC;AAYJ,eAAO,MAAM,mBAAmB,SAAU,MAAM,CAAC,OAAO,KAAG,OAAO,CAAC,YAAY,CAO7E,CAAC"}