alchemy 0.35.1 → 0.37.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/bin/alchemy.mjs +45102 -45100
  2. package/bin/alchemy.ts +1 -1
  3. package/bin/create-alchemy.ts +10 -4
  4. package/lib/cloudflare/bundle/bundle-worker.js +1 -1
  5. package/lib/cloudflare/bundle/bundle-worker.js.map +1 -1
  6. package/lib/cloudflare/d1-database.d.ts.map +1 -1
  7. package/lib/cloudflare/d1-database.js +0 -3
  8. package/lib/cloudflare/d1-database.js.map +1 -1
  9. package/lib/cloudflare/do-state-store/internal.d.ts.map +1 -1
  10. package/lib/cloudflare/do-state-store/internal.js +35 -28
  11. package/lib/cloudflare/do-state-store/internal.js.map +1 -1
  12. package/lib/cloudflare/website.d.ts.map +1 -1
  13. package/lib/cloudflare/website.js +28 -13
  14. package/lib/cloudflare/website.js.map +1 -1
  15. package/lib/cloudflare/worker-metadata.d.ts +8 -5
  16. package/lib/cloudflare/worker-metadata.d.ts.map +1 -1
  17. package/lib/cloudflare/worker-metadata.js +48 -11
  18. package/lib/cloudflare/worker-metadata.js.map +1 -1
  19. package/lib/cloudflare/worker.d.ts +18 -12
  20. package/lib/cloudflare/worker.d.ts.map +1 -1
  21. package/lib/cloudflare/worker.js +74 -68
  22. package/lib/cloudflare/worker.js.map +1 -1
  23. package/lib/docker/api.d.ts +185 -0
  24. package/lib/docker/api.d.ts.map +1 -0
  25. package/lib/docker/api.js +288 -0
  26. package/lib/docker/api.js.map +1 -0
  27. package/lib/docker/container.d.ts +147 -0
  28. package/lib/docker/container.d.ts.map +1 -0
  29. package/lib/docker/container.js +109 -0
  30. package/lib/docker/container.js.map +1 -0
  31. package/lib/docker/image.d.ts +92 -0
  32. package/lib/docker/image.d.ts.map +1 -0
  33. package/lib/docker/image.js +92 -0
  34. package/lib/docker/image.js.map +1 -0
  35. package/lib/docker/index.d.ts +7 -0
  36. package/lib/docker/index.d.ts.map +1 -0
  37. package/lib/docker/index.js +7 -0
  38. package/lib/docker/index.js.map +1 -0
  39. package/lib/docker/network.d.ts +62 -0
  40. package/lib/docker/network.d.ts.map +1 -0
  41. package/lib/docker/network.js +49 -0
  42. package/lib/docker/network.js.map +1 -0
  43. package/lib/docker/remote-image.d.ts +45 -0
  44. package/lib/docker/remote-image.d.ts.map +1 -0
  45. package/lib/docker/remote-image.js +36 -0
  46. package/lib/docker/remote-image.js.map +1 -0
  47. package/lib/docker/volume.d.ts +83 -0
  48. package/lib/docker/volume.d.ts.map +1 -0
  49. package/lib/docker/volume.js +76 -0
  50. package/lib/docker/volume.js.map +1 -0
  51. package/lib/os/exec.d.ts +19 -1
  52. package/lib/os/exec.d.ts.map +1 -1
  53. package/lib/os/exec.js +28 -4
  54. package/lib/os/exec.js.map +1 -1
  55. package/lib/stripe/price.d.ts +24 -0
  56. package/lib/stripe/price.d.ts.map +1 -1
  57. package/lib/stripe/price.js +30 -0
  58. package/lib/stripe/price.js.map +1 -1
  59. package/lib/util/cli.d.ts.map +1 -1
  60. package/lib/util/cli.js +1 -1
  61. package/lib/util/cli.js.map +1 -1
  62. package/package.json +5 -1
  63. package/src/cloudflare/bundle/bundle-worker.ts +1 -1
  64. package/src/cloudflare/d1-database.ts +0 -4
  65. package/src/cloudflare/do-state-store/internal.ts +45 -29
  66. package/src/cloudflare/website.ts +40 -16
  67. package/src/cloudflare/worker-metadata.ts +101 -19
  68. package/src/cloudflare/worker.ts +104 -148
  69. package/src/docker/api.ts +365 -0
  70. package/src/docker/container.ts +267 -0
  71. package/src/docker/image.ts +200 -0
  72. package/src/docker/index.ts +6 -0
  73. package/src/docker/network.ts +101 -0
  74. package/src/docker/remote-image.ts +83 -0
  75. package/src/docker/volume.ts +154 -0
  76. package/src/os/exec.ts +48 -6
  77. package/src/stripe/price.ts +47 -1
  78. package/src/util/cli.ts +1 -3
@@ -0,0 +1,109 @@
1
+ import { Resource } from "../resource.js";
2
+ import { DockerApi } from "./api.js";
3
+ /**
4
+ * Create and manage a Docker Container
5
+ *
6
+ * @example
7
+ * // Create a simple Nginx container
8
+ * const webContainer = await Container("web", {
9
+ * image: "nginx:latest",
10
+ * ports: [
11
+ * { external: 8080, internal: 80 }
12
+ * ],
13
+ * start: true
14
+ * });
15
+ *
16
+ * @example
17
+ * // Create a container with environment variables and volume mounts
18
+ * const appContainer = await Container("app", {
19
+ * image: customImage, // Using an Alchemy RemoteImage resource
20
+ * environment: {
21
+ * NODE_ENV: "production",
22
+ * API_KEY: "secret-key"
23
+ * },
24
+ * volumes: [
25
+ * { hostPath: "./data", containerPath: "/app/data" }
26
+ * ],
27
+ * ports: [
28
+ * { external: 3000, internal: 3000 }
29
+ * ],
30
+ * restart: "always",
31
+ * start: true
32
+ * });
33
+ */
34
+ export const Container = Resource("docker::Container", async function (id, props) {
35
+ // Initialize Docker API client
36
+ const api = new DockerApi();
37
+ // Get image reference
38
+ const imageRef = typeof props.image === "string" ? props.image : props.image.imageRef;
39
+ // Use provided name or generate one based on resource ID
40
+ const containerName = props.name || `alchemy-${id.replace(/[^a-zA-Z0-9_.-]/g, "-")}`;
41
+ // Handle delete phase
42
+ if (this.phase === "delete") {
43
+ if (this.output?.id) {
44
+ // Stop container if running
45
+ await api.stopContainer(this.output.id);
46
+ // Remove container
47
+ await api.removeContainer(this.output.id, true);
48
+ }
49
+ // Return destroyed state
50
+ return this.destroy();
51
+ }
52
+ else {
53
+ let containerState = "created";
54
+ if (this.phase === "update") {
55
+ // Check if container already exists (for update)
56
+ const containerExists = await api.containerExists(containerName);
57
+ if (containerExists) {
58
+ // Remove existing container for update
59
+ await api.removeContainer(containerName, true);
60
+ }
61
+ }
62
+ // Prepare port mappings
63
+ const portMappings = {};
64
+ if (props.ports) {
65
+ for (const port of props.ports) {
66
+ const protocol = port.protocol || "tcp";
67
+ portMappings[`${port.external}`] = `${port.internal}/${protocol}`;
68
+ }
69
+ }
70
+ // Prepare volume mappings
71
+ const volumeMappings = {};
72
+ if (props.volumes) {
73
+ for (const volume of props.volumes) {
74
+ const readOnlyFlag = volume.readOnly ? ":ro" : "";
75
+ volumeMappings[volume.hostPath] =
76
+ `${volume.containerPath}${readOnlyFlag}`;
77
+ }
78
+ }
79
+ // Create new container
80
+ const containerId = await api.createContainer(imageRef, containerName, {
81
+ ports: portMappings,
82
+ env: props.environment,
83
+ volumes: volumeMappings,
84
+ cmd: props.command,
85
+ });
86
+ // Connect to networks if specified
87
+ if (props.networks) {
88
+ for (const network of props.networks) {
89
+ const networkId = typeof network === "string" ? network : network.name;
90
+ await api.connectNetwork(containerId, networkId, {
91
+ aliases: network.aliases,
92
+ });
93
+ }
94
+ }
95
+ // Start container if requested
96
+ if (props.start) {
97
+ await api.startContainer(containerId);
98
+ containerState = "running";
99
+ }
100
+ // Return the resource using this() to construct output
101
+ return this({
102
+ ...props,
103
+ id: containerId,
104
+ state: containerState,
105
+ createdAt: Date.now(),
106
+ });
107
+ }
108
+ });
109
+ //# sourceMappingURL=container.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container.js","sourceRoot":"","sources":["../../src/docker/container.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ import type { Context } from "../context.ts";
2
+ import { Resource } from "../resource.ts";
3
+ /**
4
+ * Options for building a Docker image
5
+ */
6
+ export interface DockerBuildOptions {
7
+ /**
8
+ * Path to the build context directory
9
+ */
10
+ context: string;
11
+ /**
12
+ * Path to the Dockerfile, relative to context
13
+ */
14
+ dockerfile?: string;
15
+ /**
16
+ * Target build platform (e.g., linux/amd64)
17
+ */
18
+ platform?: string;
19
+ /**
20
+ * Build arguments as key-value pairs
21
+ */
22
+ buildArgs?: Record<string, string>;
23
+ /**
24
+ * Target build stage in multi-stage builds
25
+ */
26
+ target?: string;
27
+ /**
28
+ * List of images to use for cache
29
+ */
30
+ cacheFrom?: string[];
31
+ }
32
+ /**
33
+ * Properties for creating a Docker image
34
+ */
35
+ export interface ImageProps {
36
+ /**
37
+ * Repository name for the image (e.g., "username/image")
38
+ */
39
+ name: string;
40
+ /**
41
+ * Tag for the image (e.g., "latest")
42
+ */
43
+ tag?: string;
44
+ /**
45
+ * Build configuration
46
+ */
47
+ build: DockerBuildOptions;
48
+ /**
49
+ * Whether to skip pushing the image to registry
50
+ */
51
+ skipPush?: boolean;
52
+ }
53
+ /**
54
+ * Docker Image resource
55
+ */
56
+ export interface Image extends Resource<"docker::Image">, ImageProps {
57
+ /**
58
+ * Full image reference (name:tag)
59
+ */
60
+ imageRef: string;
61
+ /**
62
+ * Image ID
63
+ */
64
+ imageId?: string;
65
+ /**
66
+ * Repository digest if pushed
67
+ */
68
+ repoDigest?: string;
69
+ /**
70
+ * Time when the image was built
71
+ */
72
+ builtAt: number;
73
+ }
74
+ /**
75
+ * Build and manage a Docker image from a Dockerfile
76
+ *
77
+ * @example
78
+ * // Build a Docker image from a Dockerfile
79
+ * const appImage = await Image("app-image", {
80
+ * name: "myapp",
81
+ * tag: "latest",
82
+ * build: {
83
+ * context: "./app",
84
+ * dockerfile: "Dockerfile",
85
+ * buildArgs: {
86
+ * NODE_ENV: "production"
87
+ * }
88
+ * }
89
+ * });
90
+ */
91
+ export declare const Image: (((this: any, id: string, props?: {}) => never) & (new (_: never) => never)) | ((this: Context<Image>, _id: string, props: ImageProps) => Promise<Image>);
92
+ //# sourceMappingURL=image.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../src/docker/image.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG1C;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEnC;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,KAAK,EAAE,kBAAkB,CAAC;IAE1B;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,KAAM,SAAQ,QAAQ,CAAC,eAAe,CAAC,EAAE,UAAU;IAClE;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,KAAK,yFAGR,OAAO,CAAC,KAAK,CAAC,OACf,MAAM,SACJ,UAAU,KAChB,OAAO,CAAC,KAAK,CAAC,CAqFlB,CAAC"}
@@ -0,0 +1,92 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { Resource } from "../resource.js";
4
+ import { DockerApi } from "./api.js";
5
+ /**
6
+ * Build and manage a Docker image from a Dockerfile
7
+ *
8
+ * @example
9
+ * // Build a Docker image from a Dockerfile
10
+ * const appImage = await Image("app-image", {
11
+ * name: "myapp",
12
+ * tag: "latest",
13
+ * build: {
14
+ * context: "./app",
15
+ * dockerfile: "Dockerfile",
16
+ * buildArgs: {
17
+ * NODE_ENV: "production"
18
+ * }
19
+ * }
20
+ * });
21
+ */
22
+ export const Image = Resource("docker::Image", async function (_id, props) {
23
+ // Initialize Docker API client
24
+ const api = new DockerApi();
25
+ if (this.phase === "delete") {
26
+ // No action needed for delete as Docker images aren't automatically removed
27
+ // This is intentional as other resources might depend on the same image
28
+ return this.destroy();
29
+ }
30
+ else {
31
+ // Normalize properties
32
+ const tag = props.tag || "latest";
33
+ const imageRef = `${props.name}:${tag}`;
34
+ // Validate build context
35
+ const { context } = props.build;
36
+ await fs.access(context);
37
+ // Determine Dockerfile path
38
+ const dockerfile = props.build.dockerfile || "Dockerfile";
39
+ const dockerfilePath = path.join(context, dockerfile);
40
+ await fs.access(dockerfilePath);
41
+ // Prepare build options
42
+ const buildOptions = props.build.buildArgs || {};
43
+ // Add platform if specified
44
+ let buildArgs = ["build", "-t", imageRef];
45
+ if (props.build.platform) {
46
+ buildArgs.push("--platform", props.build.platform);
47
+ }
48
+ // Add target if specified
49
+ if (props.build.target) {
50
+ buildArgs.push("--target", props.build.target);
51
+ }
52
+ // Add cache sources if specified
53
+ if (props.build.cacheFrom && props.build.cacheFrom.length > 0) {
54
+ for (const cacheSource of props.build.cacheFrom) {
55
+ buildArgs.push("--cache-from", cacheSource);
56
+ }
57
+ }
58
+ // Add build arguments
59
+ for (const [key, value] of Object.entries(buildOptions)) {
60
+ buildArgs.push("--build-arg", `${key}="${value}"`);
61
+ }
62
+ // Add dockerfile if not the default
63
+ if (props.build.dockerfile && props.build.dockerfile !== "Dockerfile") {
64
+ buildArgs.push("-f", props.build.dockerfile);
65
+ }
66
+ // Add context path
67
+ buildArgs.push(props.build.context);
68
+ // Execute build command
69
+ console.log(`Building Docker image: ${imageRef}`);
70
+ const { stdout } = await api.exec(buildArgs);
71
+ // Extract image ID from build output if available
72
+ const imageIdMatch = /Successfully built ([a-f0-9]+)/.exec(stdout);
73
+ const imageId = imageIdMatch ? imageIdMatch[1] : undefined;
74
+ console.log(`Successfully built Docker image: ${imageRef}`);
75
+ // Handle push if required
76
+ let repoDigest;
77
+ if (!props.skipPush) {
78
+ console.log(`Pushing Docker image: ${imageRef}`);
79
+ // TODO: Implement push once API supports it
80
+ console.warn("Image pushing is not yet implemented");
81
+ }
82
+ // Return the resource using this() to construct output
83
+ return this({
84
+ ...props,
85
+ imageRef,
86
+ imageId,
87
+ repoDigest,
88
+ builtAt: Date.now(),
89
+ });
90
+ }
91
+ });
92
+ //# sourceMappingURL=image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.js","sourceRoot":"","sources":["../../src/docker/image.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export * from "./api.ts";
2
+ export * from "./remote-image.ts";
3
+ export * from "./container.ts";
4
+ export * from "./network.ts";
5
+ export * from "./volume.ts";
6
+ export * from "./image.ts";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/docker/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,7 @@
1
+ export * from "./api.js";
2
+ export * from "./remote-image.js";
3
+ export * from "./container.js";
4
+ export * from "./network.js";
5
+ export * from "./volume.js";
6
+ export * from "./image.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/docker/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,62 @@
1
+ import type { Context } from "../context.ts";
2
+ import { Resource } from "../resource.ts";
3
+ /**
4
+ * Properties for creating a Docker network
5
+ */
6
+ export interface NetworkProps {
7
+ /**
8
+ * Network name
9
+ */
10
+ name: string;
11
+ /**
12
+ * Network driver to use
13
+ * @default "bridge"
14
+ */
15
+ driver?: "bridge" | "host" | "none" | "overlay" | "macvlan" | (string & {});
16
+ /**
17
+ * Enable IPv6 on the network
18
+ * @default false
19
+ */
20
+ enableIPv6?: boolean;
21
+ /**
22
+ * Network-scoped alias for containers
23
+ */
24
+ labels?: Record<string, string>;
25
+ }
26
+ /**
27
+ * Docker Network resource
28
+ */
29
+ export interface Network extends Resource<"docker::Network">, NetworkProps {
30
+ /**
31
+ * Network ID
32
+ */
33
+ id: string;
34
+ /**
35
+ * Time when the network was created
36
+ */
37
+ createdAt: number;
38
+ }
39
+ /**
40
+ * Create and manage a Docker Network
41
+ *
42
+ * @see https://docs.docker.com/engine/network/
43
+ *
44
+ * @example
45
+ * // Create a simple bridge network
46
+ * const appNetwork = await Network("app-network", {
47
+ * name: "app-network"
48
+ * });
49
+ *
50
+ * @example
51
+ * // Create a custom network with driver
52
+ * const overlayNetwork = await Network("overlay-network", {
53
+ * name: "overlay-network",
54
+ * driver: "overlay",
55
+ * enableIPv6: true,
56
+ * labels: {
57
+ * "com.example.description": "Network for application services"
58
+ * }
59
+ * });
60
+ */
61
+ export declare const Network: (((this: any, id: string, props?: {}) => never) & (new (_: never) => never)) | ((this: Context<Network>, _id: string, props: NetworkProps) => Promise<Network>);
62
+ //# sourceMappingURL=network.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../../src/docker/network.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG1C;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,MAAM,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;IAE5E;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,OAAQ,SAAQ,QAAQ,CAAC,iBAAiB,CAAC,EAAE,YAAY;IACxE;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,OAAO,yFAGV,OAAO,CAAC,OAAO,CAAC,OACjB,MAAM,SACJ,YAAY,KAClB,OAAO,CAAC,OAAO,CAAC,CA0BpB,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { Resource } from "../resource.js";
2
+ import { DockerApi } from "./api.js";
3
+ /**
4
+ * Create and manage a Docker Network
5
+ *
6
+ * @see https://docs.docker.com/engine/network/
7
+ *
8
+ * @example
9
+ * // Create a simple bridge network
10
+ * const appNetwork = await Network("app-network", {
11
+ * name: "app-network"
12
+ * });
13
+ *
14
+ * @example
15
+ * // Create a custom network with driver
16
+ * const overlayNetwork = await Network("overlay-network", {
17
+ * name: "overlay-network",
18
+ * driver: "overlay",
19
+ * enableIPv6: true,
20
+ * labels: {
21
+ * "com.example.description": "Network for application services"
22
+ * }
23
+ * });
24
+ */
25
+ export const Network = Resource("docker::Network", async function (_id, props) {
26
+ // Initialize Docker API client
27
+ const api = new DockerApi();
28
+ // Handle delete phase
29
+ if (this.phase === "delete") {
30
+ if (this.output?.id) {
31
+ // Remove network
32
+ await api.removeNetwork(this.output.id);
33
+ }
34
+ // Return destroyed state
35
+ return this.destroy();
36
+ }
37
+ else {
38
+ // Create the network
39
+ props.driver = props.driver || "bridge";
40
+ const networkId = await api.createNetwork(props.name, props.driver);
41
+ // Return the resource using this() to construct output
42
+ return this({
43
+ ...props,
44
+ id: networkId,
45
+ createdAt: Date.now(),
46
+ });
47
+ }
48
+ });
49
+ //# sourceMappingURL=network.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network.js","sourceRoot":"","sources":["../../src/docker/network.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AA4CrC;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAC7B,iBAAiB,EACjB,KAAK,WAEH,GAAW,EACX,KAAmB;IAEnB,+BAA+B;IAC/B,MAAM,GAAG,GAAG,IAAI,SAAS,EAAE,CAAC;IAE5B,sBAAsB;IACtB,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5B,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC;YACpB,iBAAiB;YACjB,MAAM,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC1C,CAAC;QAED,yBAAyB;QACzB,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;SAAM,CAAC;QACN,qBAAqB;QACrB,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,QAAQ,CAAC;QACxC,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAEpE,uDAAuD;QACvD,OAAO,IAAI,CAAC;YACV,GAAG,KAAK;YACR,EAAE,EAAE,SAAS;YACb,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CACF,CAAC"}
@@ -0,0 +1,45 @@
1
+ import type { Context } from "../context.ts";
2
+ import { Resource } from "../resource.ts";
3
+ /**
4
+ * Properties for creating a Docker image
5
+ */
6
+ export interface RemoteImageProps {
7
+ /**
8
+ * Docker image name (e.g., "nginx")
9
+ */
10
+ name: string;
11
+ /**
12
+ * Tag for the image (e.g., "latest" or "1.19-alpine")
13
+ */
14
+ tag?: string;
15
+ /**
16
+ * Always attempt to pull the image, even if it exists locally
17
+ */
18
+ alwaysPull?: boolean;
19
+ }
20
+ /**
21
+ * Docker Remote Image resource
22
+ */
23
+ export interface RemoteImage extends Resource<"docker::RemoteImage">, RemoteImageProps {
24
+ /**
25
+ * Full image reference (name:tag)
26
+ */
27
+ imageRef: string;
28
+ /**
29
+ * Time when the image was created or pulled
30
+ */
31
+ createdAt: number;
32
+ }
33
+ /**
34
+ * Create or reference a Docker Remote Image
35
+ *
36
+ * @example
37
+ * // Pull the nginx image
38
+ * const nginxImage = await RemoteImage("nginx", {
39
+ * name: "nginx",
40
+ * tag: "latest"
41
+ * });
42
+ *
43
+ */
44
+ export declare const RemoteImage: (((this: any, id: string, props?: {}) => never) & (new (_: never) => never)) | ((this: Context<RemoteImage>, _id: string, props: RemoteImageProps) => Promise<RemoteImage>);
45
+ //# sourceMappingURL=remote-image.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-image.d.ts","sourceRoot":"","sources":["../../src/docker/remote-image.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG1C;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,WACf,SAAQ,QAAQ,CAAC,qBAAqB,CAAC,EACrC,gBAAgB;IAClB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,WAAW,yFAGd,OAAO,CAAC,WAAW,CAAC,OACrB,MAAM,SACJ,gBAAgB,KACtB,OAAO,CAAC,WAAW,CAAC,CAwBxB,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { Resource } from "../resource.js";
2
+ import { DockerApi } from "./api.js";
3
+ /**
4
+ * Create or reference a Docker Remote Image
5
+ *
6
+ * @example
7
+ * // Pull the nginx image
8
+ * const nginxImage = await RemoteImage("nginx", {
9
+ * name: "nginx",
10
+ * tag: "latest"
11
+ * });
12
+ *
13
+ */
14
+ export const RemoteImage = Resource("docker::RemoteImage", async function (_id, props) {
15
+ // Initialize Docker API client
16
+ const api = new DockerApi();
17
+ if (this.phase === "delete") {
18
+ // No action needed for delete as Docker images aren't automatically removed
19
+ // This is intentional as other resources might depend on the same image
20
+ return this.destroy();
21
+ }
22
+ else {
23
+ // Normalize properties
24
+ const tag = props.tag || "latest";
25
+ const imageRef = `${props.name}:${tag}`;
26
+ // Pull image
27
+ await api.pullImage(imageRef);
28
+ // Return the resource using this() to construct output
29
+ return this({
30
+ ...props,
31
+ imageRef,
32
+ createdAt: Date.now(),
33
+ });
34
+ }
35
+ });
36
+ //# sourceMappingURL=remote-image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-image.js","sourceRoot":"","sources":["../../src/docker/remote-image.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAuCrC;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,QAAQ,CACjC,qBAAqB,EACrB,KAAK,WAEH,GAAW,EACX,KAAuB;IAEvB,+BAA+B;IAC/B,MAAM,GAAG,GAAG,IAAI,SAAS,EAAE,CAAC;IAE5B,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5B,4EAA4E;QAC5E,wEAAwE;QACxE,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;SAAM,CAAC;QACN,uBAAuB;QACvB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,QAAQ,CAAC;QAClC,MAAM,QAAQ,GAAG,GAAG,KAAK,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;QAExC,aAAa;QACb,MAAM,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAE9B,uDAAuD;QACvD,OAAO,IAAI,CAAC;YACV,GAAG,KAAK;YACR,QAAQ;YACR,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CACF,CAAC"}
@@ -0,0 +1,83 @@
1
+ import type { Context } from "../context.ts";
2
+ import { Resource } from "../resource.ts";
3
+ /**
4
+ * Interface for volume label
5
+ */
6
+ export interface VolumeLabel {
7
+ /**
8
+ * Label name
9
+ */
10
+ name: string;
11
+ /**
12
+ * Label value
13
+ */
14
+ value: string;
15
+ }
16
+ /**
17
+ * Properties for creating a Docker volume
18
+ */
19
+ export interface VolumeProps {
20
+ /**
21
+ * Volume name
22
+ */
23
+ name: string;
24
+ /**
25
+ * Volume driver to use
26
+ * @default "local"
27
+ */
28
+ driver?: string;
29
+ /**
30
+ * Driver-specific options
31
+ */
32
+ driverOpts?: Record<string, string>;
33
+ /**
34
+ * Custom metadata labels for the volume
35
+ */
36
+ labels?: VolumeLabel[] | Record<string, string>;
37
+ }
38
+ /**
39
+ * Docker Volume resource
40
+ */
41
+ export interface Volume extends Resource<"docker::Volume">, VolumeProps {
42
+ /**
43
+ * Volume ID (same as name for Docker volumes)
44
+ */
45
+ id: string;
46
+ /**
47
+ * Volume mountpoint path on the host
48
+ */
49
+ mountpoint?: string;
50
+ /**
51
+ * Time when the volume was created
52
+ */
53
+ createdAt: number;
54
+ }
55
+ /**
56
+ * Create and manage a Docker Volume
57
+ *
58
+ * @see https://docs.docker.com/engine/reference/commandline/volume/
59
+ *
60
+ * @example
61
+ * // Create a simple Docker volume
62
+ * const dataVolume = await Volume("data-volume", {
63
+ * name: "data-volume"
64
+ * });
65
+ *
66
+ * @example
67
+ * // Create a Docker volume with custom driver and options
68
+ * const dbVolume = await Volume("db-data", {
69
+ * name: "db-data",
70
+ * driver: "local",
71
+ * driverOpts: {
72
+ * "type": "nfs",
73
+ * "o": "addr=10.0.0.1,rw",
74
+ * "device": ":/path/to/dir"
75
+ * },
76
+ * labels: [
77
+ * { name: "com.example.usage", value: "database-storage" },
78
+ * { name: "com.example.backup", value: "weekly" }
79
+ * ]
80
+ * });
81
+ */
82
+ export declare const Volume: (((this: any, id: string, props?: {}) => never) & (new (_: never) => never)) | ((this: Context<Volume>, _id: string, props: VolumeProps) => Promise<Volume>);
83
+ //# sourceMappingURL=volume.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"volume.d.ts","sourceRoot":"","sources":["../../src/docker/volume.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG1C;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEpC;;OAEG;IACH,MAAM,CAAC,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjD;AAED;;GAEG;AACH,MAAM,WAAW,MAAO,SAAQ,QAAQ,CAAC,gBAAgB,CAAC,EAAE,WAAW;IACrE;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,MAAM,yFAGT,OAAO,CAAC,MAAM,CAAC,OAChB,MAAM,SACJ,WAAW,KACjB,OAAO,CAAC,MAAM,CAAC,CAuDnB,CAAC"}