typekro 0.27.1 → 0.28.1

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 (188) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/core/containers/build.d.ts +2 -46
  3. package/dist/core/containers/build.d.ts.map +1 -1
  4. package/dist/core/containers/build.js +219 -134
  5. package/dist/core/containers/build.js.map +1 -1
  6. package/dist/core/containers/errors.d.ts +4 -0
  7. package/dist/core/containers/errors.d.ts.map +1 -1
  8. package/dist/core/containers/errors.js +14 -1
  9. package/dist/core/containers/errors.js.map +1 -1
  10. package/dist/core/containers/exec.d.ts +6 -23
  11. package/dist/core/containers/exec.d.ts.map +1 -1
  12. package/dist/core/containers/exec.js +94 -78
  13. package/dist/core/containers/exec.js.map +1 -1
  14. package/dist/core/containers/image.d.ts +11 -7
  15. package/dist/core/containers/image.d.ts.map +1 -1
  16. package/dist/core/containers/image.js +102 -13
  17. package/dist/core/containers/image.js.map +1 -1
  18. package/dist/core/containers/index.d.ts +5 -1
  19. package/dist/core/containers/index.d.ts.map +1 -1
  20. package/dist/core/containers/index.js +3 -0
  21. package/dist/core/containers/index.js.map +1 -1
  22. package/dist/core/containers/registries/credentials.d.ts +30 -0
  23. package/dist/core/containers/registries/credentials.d.ts.map +1 -0
  24. package/dist/core/containers/registries/credentials.js +87 -0
  25. package/dist/core/containers/registries/credentials.js.map +1 -0
  26. package/dist/core/containers/registries/docker-session.d.ts +14 -0
  27. package/dist/core/containers/registries/docker-session.d.ts.map +1 -0
  28. package/dist/core/containers/registries/docker-session.js +164 -0
  29. package/dist/core/containers/registries/docker-session.js.map +1 -0
  30. package/dist/core/containers/registries/ecr.d.ts +2 -3
  31. package/dist/core/containers/registries/ecr.d.ts.map +1 -1
  32. package/dist/core/containers/registries/ecr.js +13 -22
  33. package/dist/core/containers/registries/ecr.js.map +1 -1
  34. package/dist/core/containers/registries/harbor.d.ts +7 -0
  35. package/dist/core/containers/registries/harbor.d.ts.map +1 -0
  36. package/dist/core/containers/registries/harbor.js +9 -0
  37. package/dist/core/containers/registries/harbor.js.map +1 -0
  38. package/dist/core/containers/registries/index.d.ts.map +1 -1
  39. package/dist/core/containers/registries/index.js +5 -0
  40. package/dist/core/containers/registries/index.js.map +1 -1
  41. package/dist/core/containers/registries/oci.d.ts +13 -0
  42. package/dist/core/containers/registries/oci.d.ts.map +1 -0
  43. package/dist/core/containers/registries/oci.js +68 -0
  44. package/dist/core/containers/registries/oci.js.map +1 -0
  45. package/dist/core/containers/registries/orbstack.d.ts +2 -3
  46. package/dist/core/containers/registries/orbstack.d.ts.map +1 -1
  47. package/dist/core/containers/registries/orbstack.js +8 -8
  48. package/dist/core/containers/registries/orbstack.js.map +1 -1
  49. package/dist/core/containers/registries/types.d.ts +75 -49
  50. package/dist/core/containers/registries/types.d.ts.map +1 -1
  51. package/dist/core/containers/registries/types.js +1 -9
  52. package/dist/core/containers/registries/types.js.map +1 -1
  53. package/dist/core/deployment/direct-factory.d.ts.map +1 -1
  54. package/dist/core/deployment/direct-factory.js +15 -8
  55. package/dist/core/deployment/direct-factory.js.map +1 -1
  56. package/dist/core/deployment/engine.d.ts.map +1 -1
  57. package/dist/core/deployment/engine.js +46 -5
  58. package/dist/core/deployment/engine.js.map +1 -1
  59. package/dist/core/deployment/kro-factory.d.ts +7 -7
  60. package/dist/core/deployment/kro-factory.d.ts.map +1 -1
  61. package/dist/core/deployment/kro-factory.js +148 -60
  62. package/dist/core/deployment/kro-factory.js.map +1 -1
  63. package/dist/core/deployment/kro-instance-safety.d.ts +7 -0
  64. package/dist/core/deployment/kro-instance-safety.d.ts.map +1 -1
  65. package/dist/core/deployment/kro-instance-safety.js +15 -0
  66. package/dist/core/deployment/kro-instance-safety.js.map +1 -1
  67. package/dist/core/deployment/kro-namespace-teardown.d.ts +7 -5
  68. package/dist/core/deployment/kro-namespace-teardown.d.ts.map +1 -1
  69. package/dist/core/deployment/kro-namespace-teardown.js +29 -10
  70. package/dist/core/deployment/kro-namespace-teardown.js.map +1 -1
  71. package/dist/core/deployment/kro-readiness.d.ts +1 -0
  72. package/dist/core/deployment/kro-readiness.d.ts.map +1 -1
  73. package/dist/core/deployment/kro-readiness.js +52 -6
  74. package/dist/core/deployment/kro-readiness.js.map +1 -1
  75. package/dist/core/deployment/poll-timeout.d.ts +45 -0
  76. package/dist/core/deployment/poll-timeout.d.ts.map +1 -0
  77. package/dist/core/deployment/poll-timeout.js +67 -0
  78. package/dist/core/deployment/poll-timeout.js.map +1 -0
  79. package/dist/core/deployment/readiness.d.ts.map +1 -1
  80. package/dist/core/deployment/readiness.js +30 -21
  81. package/dist/core/deployment/readiness.js.map +1 -1
  82. package/dist/core/deployment/rollback-manager.d.ts +13 -0
  83. package/dist/core/deployment/rollback-manager.d.ts.map +1 -1
  84. package/dist/core/deployment/rollback-manager.js +8 -0
  85. package/dist/core/deployment/rollback-manager.js.map +1 -1
  86. package/dist/core/serialization/core.js +3 -1
  87. package/dist/core/serialization/core.js.map +1 -1
  88. package/dist/core/serialization/schema.d.ts +2 -2
  89. package/dist/core/serialization/schema.d.ts.map +1 -1
  90. package/dist/core/serialization/schema.js +57 -4
  91. package/dist/core/serialization/schema.js.map +1 -1
  92. package/dist/core/types/serialization.d.ts +9 -0
  93. package/dist/core/types/serialization.d.ts.map +1 -1
  94. package/dist/factories/harbor/compositions/harbor-installation.d.ts +610 -0
  95. package/dist/factories/harbor/compositions/harbor-installation.d.ts.map +1 -0
  96. package/dist/factories/harbor/compositions/harbor-installation.js +348 -0
  97. package/dist/factories/harbor/compositions/harbor-installation.js.map +1 -0
  98. package/dist/factories/harbor/compositions/index.d.ts +2 -0
  99. package/dist/factories/harbor/compositions/index.d.ts.map +1 -0
  100. package/dist/factories/harbor/compositions/index.js +2 -0
  101. package/dist/factories/harbor/compositions/index.js.map +1 -0
  102. package/dist/factories/harbor/index.d.ts +7 -0
  103. package/dist/factories/harbor/index.d.ts.map +1 -0
  104. package/dist/factories/harbor/index.js +7 -0
  105. package/dist/factories/harbor/index.js.map +1 -0
  106. package/dist/factories/harbor/provider/harbor-api.d.ts +123 -0
  107. package/dist/factories/harbor/provider/harbor-api.d.ts.map +1 -0
  108. package/dist/factories/harbor/provider/harbor-api.js +595 -0
  109. package/dist/factories/harbor/provider/harbor-api.js.map +1 -0
  110. package/dist/factories/harbor/provider/index.d.ts +4 -0
  111. package/dist/factories/harbor/provider/index.d.ts.map +1 -0
  112. package/dist/factories/harbor/provider/index.js +4 -0
  113. package/dist/factories/harbor/provider/index.js.map +1 -0
  114. package/dist/factories/harbor/provider/kubernetes-secret-store.d.ts +12 -0
  115. package/dist/factories/harbor/provider/kubernetes-secret-store.d.ts.map +1 -0
  116. package/dist/factories/harbor/provider/kubernetes-secret-store.js +81 -0
  117. package/dist/factories/harbor/provider/kubernetes-secret-store.js.map +1 -0
  118. package/dist/factories/harbor/provider/rook-s3-binding.d.ts +30 -0
  119. package/dist/factories/harbor/provider/rook-s3-binding.d.ts.map +1 -0
  120. package/dist/factories/harbor/provider/rook-s3-binding.js +74 -0
  121. package/dist/factories/harbor/provider/rook-s3-binding.js.map +1 -0
  122. package/dist/factories/harbor/resources/helm.d.ts +12 -0
  123. package/dist/factories/harbor/resources/helm.d.ts.map +1 -0
  124. package/dist/factories/harbor/resources/helm.js +46 -0
  125. package/dist/factories/harbor/resources/helm.js.map +1 -0
  126. package/dist/factories/harbor/resources/index.d.ts +2 -0
  127. package/dist/factories/harbor/resources/index.d.ts.map +1 -0
  128. package/dist/factories/harbor/resources/index.js +2 -0
  129. package/dist/factories/harbor/resources/index.js.map +1 -0
  130. package/dist/factories/harbor/types.d.ts +319 -0
  131. package/dist/factories/harbor/types.d.ts.map +1 -0
  132. package/dist/factories/harbor/types.js +252 -0
  133. package/dist/factories/harbor/types.js.map +1 -0
  134. package/dist/factories/harbor/utils/helm-values-mapper.d.ts +8 -0
  135. package/dist/factories/harbor/utils/helm-values-mapper.d.ts.map +1 -0
  136. package/dist/factories/harbor/utils/helm-values-mapper.js +322 -0
  137. package/dist/factories/harbor/utils/helm-values-mapper.js.map +1 -0
  138. package/dist/factories/harbor/utils/index.d.ts +2 -0
  139. package/dist/factories/harbor/utils/index.d.ts.map +1 -0
  140. package/dist/factories/harbor/utils/index.js +2 -0
  141. package/dist/factories/harbor/utils/index.js.map +1 -0
  142. package/dist/factories/helm/helm-release.d.ts +10 -0
  143. package/dist/factories/helm/helm-release.d.ts.map +1 -1
  144. package/dist/factories/helm/helm-release.js +30 -2
  145. package/dist/factories/helm/helm-release.js.map +1 -1
  146. package/dist/factories/helm/readiness-evaluators.d.ts.map +1 -1
  147. package/dist/factories/helm/readiness-evaluators.js +26 -1
  148. package/dist/factories/helm/readiness-evaluators.js.map +1 -1
  149. package/dist/factories/helm/types.d.ts +5 -0
  150. package/dist/factories/helm/types.d.ts.map +1 -1
  151. package/dist/factories/index.d.ts +1 -0
  152. package/dist/factories/index.d.ts.map +1 -1
  153. package/dist/factories/index.js +4 -0
  154. package/dist/factories/index.js.map +1 -1
  155. package/dist/factories/kubernetes/networking/network-policy.d.ts.map +1 -1
  156. package/dist/factories/kubernetes/networking/network-policy.js +34 -1
  157. package/dist/factories/kubernetes/networking/network-policy.js.map +1 -1
  158. package/dist/factories/rook/compositions/index.d.ts +1 -0
  159. package/dist/factories/rook/compositions/index.d.ts.map +1 -1
  160. package/dist/factories/rook/compositions/index.js +1 -0
  161. package/dist/factories/rook/compositions/index.js.map +1 -1
  162. package/dist/factories/rook/compositions/rook-ceph-operator-installation.d.ts +2 -0
  163. package/dist/factories/rook/compositions/rook-ceph-operator-installation.d.ts.map +1 -1
  164. package/dist/factories/rook/compositions/rook-ceph-operator-installation.js +17 -0
  165. package/dist/factories/rook/compositions/rook-ceph-operator-installation.js.map +1 -1
  166. package/dist/factories/rook/compositions/rook-ceph-platform.d.ts +181 -0
  167. package/dist/factories/rook/compositions/rook-ceph-platform.d.ts.map +1 -0
  168. package/dist/factories/rook/compositions/rook-ceph-platform.js +388 -0
  169. package/dist/factories/rook/compositions/rook-ceph-platform.js.map +1 -0
  170. package/dist/factories/rook/resources/bucket-storage-class.d.ts.map +1 -1
  171. package/dist/factories/rook/resources/bucket-storage-class.js +4 -1
  172. package/dist/factories/rook/resources/bucket-storage-class.js.map +1 -1
  173. package/dist/factories/rook/resources/ceph-object-store.d.ts.map +1 -1
  174. package/dist/factories/rook/resources/ceph-object-store.js +2 -0
  175. package/dist/factories/rook/resources/ceph-object-store.js.map +1 -1
  176. package/dist/factories/rook/resources/helm.d.ts +4 -0
  177. package/dist/factories/rook/resources/helm.d.ts.map +1 -1
  178. package/dist/factories/rook/resources/helm.js +22 -0
  179. package/dist/factories/rook/resources/helm.js.map +1 -1
  180. package/dist/factories/rook/types.d.ts +180 -1
  181. package/dist/factories/rook/types.d.ts.map +1 -1
  182. package/dist/factories/rook/types.js +93 -2
  183. package/dist/factories/rook/types.js.map +1 -1
  184. package/dist/factories/rook/utils/helm-values-mapper.d.ts +34 -1
  185. package/dist/factories/rook/utils/helm-values-mapper.d.ts.map +1 -1
  186. package/dist/factories/rook/utils/helm-values-mapper.js +207 -0
  187. package/dist/factories/rook/utils/helm-values-mapper.js.map +1 -1
  188. package/package.json +6 -1
@@ -1,50 +1,6 @@
1
- /**
2
- * Container Build Utility
3
- *
4
- * Builds a Docker image from a Dockerfile and optionally pushes it to a
5
- * container registry. Returns the full image URI for use in K8s deployments.
6
- *
7
- * @example
8
- * ```typescript
9
- * import { buildContainer } from 'typekro/containers';
10
- *
11
- * // Local Orbstack (no push needed)
12
- * const result = await buildContainer({
13
- * context: './apps/my-app',
14
- * imageName: 'my-app',
15
- * registry: { type: 'orbstack' },
16
- * });
17
- *
18
- * // AWS ECR (auto-creates repo, pushes)
19
- * const result = await buildContainer({
20
- * context: './apps/my-app',
21
- * imageName: 'my-app',
22
- * tag: 'content-hash',
23
- * platform: 'linux/amd64',
24
- * registry: { type: 'ecr', region: 'us-west-2' },
25
- * });
26
- *
27
- * // Use the image URI in a TypeKro composition
28
- * await factory.deploy({
29
- * app: { image: result.imageUri, port: 3000 },
30
- * });
31
- * ```
32
- */
33
1
  import type { ContainerBuildOptions, ContainerBuildResult } from './registries/types.js';
34
- /**
35
- * Build a Docker image and optionally push it to a container registry.
36
- *
37
- * Docker's own layer cache handles memoization — if nothing in the build
38
- * context changed, the build returns near-instantly.
39
- */
2
+ /** Build, publish, and registry-verify a container image. */
40
3
  export declare function buildContainer(options: ContainerBuildOptions): Promise<ContainerBuildResult>;
41
- /**
42
- * Compute a content-based hash of the build context for deterministic tagging.
43
- * Exported for direct unit testing without Docker.
44
- *
45
- * Hashes the Dockerfile content plus all file contents in the context,
46
- * respecting .dockerignore if present. Files are streamed (not loaded into
47
- * memory) and hashed in sorted order for determinism.
48
- */
4
+ /** Compute a deterministic build-context digest using only Node-compatible APIs. */
49
5
  export declare function computeContentHash(contextPath: string, dockerfilePath: string): Promise<string>;
50
6
  //# sourceMappingURL=build.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/core/containers/build.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AASH,OAAO,KAAK,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAIzF;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA6FlG;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiErG"}
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/core/containers/build.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,qBAAqB,EACrB,oBAAoB,EAErB,MAAM,uBAAuB,CAAC;AA2I/B,6DAA6D;AAC7D,wBAAsB,cAAc,CAClC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,oBAAoB,CAAC,CAqI/B;AAED,oFAAoF;AACpF,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC,CAmCjB"}
@@ -1,174 +1,259 @@
1
- /**
2
- * Container Build Utility
3
- *
4
- * Builds a Docker image from a Dockerfile and optionally pushes it to a
5
- * container registry. Returns the full image URI for use in K8s deployments.
6
- *
7
- * @example
8
- * ```typescript
9
- * import { buildContainer } from 'typekro/containers';
10
- *
11
- * // Local Orbstack (no push needed)
12
- * const result = await buildContainer({
13
- * context: './apps/my-app',
14
- * imageName: 'my-app',
15
- * registry: { type: 'orbstack' },
16
- * });
17
- *
18
- * // AWS ECR (auto-creates repo, pushes)
19
- * const result = await buildContainer({
20
- * context: './apps/my-app',
21
- * imageName: 'my-app',
22
- * tag: 'content-hash',
23
- * platform: 'linux/amd64',
24
- * registry: { type: 'ecr', region: 'us-west-2' },
25
- * });
26
- *
27
- * // Use the image URI in a TypeKro composition
28
- * await factory.deploy({
29
- * app: { image: result.imageUri, port: 3000 },
30
- * });
31
- * ```
32
- */
33
- import { existsSync } from 'node:fs';
34
- import { readdir } from 'node:fs/promises';
35
- import { resolve, join } from 'node:path';
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ import { createReadStream, existsSync } from 'node:fs';
3
+ import { mkdtemp, readFile, readdir, rm } from 'node:fs/promises';
4
+ import { tmpdir } from 'node:os';
5
+ import { join, resolve } from 'node:path';
36
6
  import { getComponentLogger } from '../logging/index.js';
37
7
  import { ContainerBuildError } from './errors.js';
38
8
  import { checkDockerAvailable, execDocker, validateBuildArgs } from './exec.js';
39
9
  import { resolveRegistry } from './registries/index.js';
40
10
  const logger = getComponentLogger('container-build');
41
- /**
42
- * Build a Docker image and optionally push it to a container registry.
43
- *
44
- * Docker's own layer cache handles memoization if nothing in the build
45
- * context changed, the build returns near-instantly.
46
- */
11
+ const DIGEST_PATTERN = /^sha256:[a-f0-9]{64}$/;
12
+ function resolvePlatforms(options) {
13
+ if (options.platform && options.platforms) {
14
+ throw new ContainerBuildError('Specify either platform or platforms, not both.', 'INVALID_PLATFORM');
15
+ }
16
+ const platforms = options.platforms
17
+ ? [...new Set(options.platforms)]
18
+ : options.platform
19
+ ? [options.platform]
20
+ : [];
21
+ for (const platform of platforms) {
22
+ if (!/^linux\/[a-z0-9_]+(?:\/[a-z0-9_]+)?$/.test(platform)) {
23
+ throw new ContainerBuildError(`Invalid container platform: "${platform}".`, 'INVALID_PLATFORM', ['Use an OCI platform such as linux/amd64 or linux/arm64.']);
24
+ }
25
+ }
26
+ return platforms;
27
+ }
28
+ function repositoryFromTaggedUri(uri) {
29
+ const colon = uri.lastIndexOf(':');
30
+ const slash = uri.lastIndexOf('/');
31
+ return colon > slash ? uri.slice(0, colon) : uri;
32
+ }
33
+ function digestFromInspectOutput(output) {
34
+ const trimmed = output.trim();
35
+ let candidate = trimmed;
36
+ try {
37
+ const parsed = JSON.parse(trimmed);
38
+ if (typeof parsed === 'string')
39
+ candidate = parsed;
40
+ }
41
+ catch {
42
+ // Buildx versions may return an unquoted digest despite the JSON format request.
43
+ }
44
+ if (!DIGEST_PATTERN.test(candidate)) {
45
+ throw ContainerBuildError.digestVerificationFailed(`expected sha256 manifest digest, received "${candidate.slice(0, 160)}"`);
46
+ }
47
+ return candidate;
48
+ }
49
+ async function createBuildxBuilder(session, timeout, signal) {
50
+ const name = `typekro-${randomUUID().slice(0, 12)}`;
51
+ await execDocker([
52
+ 'buildx',
53
+ 'create',
54
+ '--name',
55
+ name,
56
+ '--driver',
57
+ 'docker-container',
58
+ ...(session.buildkitConfigPath ? ['--buildkitd-config', session.buildkitConfigPath] : []),
59
+ '--bootstrap',
60
+ ], {
61
+ quiet: true,
62
+ timeout,
63
+ ...(session.environment ? { environment: session.environment } : {}),
64
+ ...(signal ? { signal } : {}),
65
+ });
66
+ return name;
67
+ }
68
+ async function removeBuildxBuilder(name, session, timeout) {
69
+ await execDocker(['buildx', 'rm', '--force', name], {
70
+ quiet: true,
71
+ timeout: Math.min(timeout, 30_000),
72
+ ...(session.environment ? { environment: session.environment } : {}),
73
+ }).catch((error) => {
74
+ logger.warn('Failed to remove temporary Buildx builder', {
75
+ builder: name,
76
+ error: error instanceof Error ? error.message : String(error),
77
+ });
78
+ });
79
+ }
80
+ async function verifyPublishedDigest(taggedImageUri, metadataPath, session, builder, timeout, signal) {
81
+ const inspected = await execDocker([
82
+ 'buildx',
83
+ 'imagetools',
84
+ 'inspect',
85
+ taggedImageUri,
86
+ ...(builder ? ['--builder', builder] : []),
87
+ '--format',
88
+ '{{json .Manifest.Digest}}',
89
+ ], {
90
+ quiet: true,
91
+ timeout,
92
+ ...(session.environment ? { environment: session.environment } : {}),
93
+ ...(signal ? { signal } : {}),
94
+ });
95
+ const digest = digestFromInspectOutput(inspected.stdout);
96
+ try {
97
+ const metadata = JSON.parse(await readFile(metadataPath, 'utf8'));
98
+ const pushedDigest = metadata['containerimage.digest'];
99
+ if (typeof pushedDigest === 'string' && pushedDigest !== digest) {
100
+ throw ContainerBuildError.digestVerificationFailed(`BuildKit reported ${pushedDigest}, registry returned ${digest}`);
101
+ }
102
+ }
103
+ catch (error) {
104
+ if (error instanceof ContainerBuildError)
105
+ throw error;
106
+ logger.debug('Buildx metadata did not contain a comparable digest', {
107
+ error: error instanceof Error ? error.message : String(error),
108
+ });
109
+ }
110
+ return digest;
111
+ }
112
+ /** Build, publish, and registry-verify a container image. */
47
113
  export async function buildContainer(options) {
48
- const startTime = Date.now();
49
- const { context, dockerfile = 'Dockerfile', imageName, platform, buildArgs, target, quiet = false, timeout = 300_000, extraDockerArgs = [], registry: registryConfig, } = options;
50
- // Validate inputs
114
+ const startedAt = Date.now();
115
+ const { context, dockerfile = 'Dockerfile', imageName, buildArgs, target, quiet = false, progress = 'auto', timeout = 300_000, signal, extraDockerArgs = [], } = options;
51
116
  const contextPath = resolve(context);
52
117
  if (!existsSync(contextPath)) {
53
- throw new ContainerBuildError(`Build context directory not found: ${contextPath}`, 'INVALID_CONTEXT', ['Check the context path is correct.', `Directory: ${contextPath}`]);
118
+ throw new ContainerBuildError(`Build context directory not found: ${contextPath}`, 'INVALID_CONTEXT');
54
119
  }
55
120
  const dockerfilePath = join(contextPath, dockerfile);
56
121
  if (!existsSync(dockerfilePath)) {
57
- throw new ContainerBuildError(`Dockerfile not found: ${dockerfilePath}`, 'INVALID_DOCKERFILE', [`Expected Dockerfile at: ${dockerfilePath}`, 'Set the dockerfile option if using a non-default name.']);
122
+ throw new ContainerBuildError(`Dockerfile not found: ${dockerfilePath}`, 'INVALID_DOCKERFILE');
58
123
  }
59
- // Validate image name — must be a valid Docker/OCI image reference.
60
- // Must start and end with alphanumeric, no trailing dots/slashes/hyphens.
61
124
  if (!/^[a-z0-9]([a-z0-9._/-]*[a-z0-9])?$/.test(imageName)) {
62
- throw new ContainerBuildError(`Invalid image name: "${imageName}". Must be lowercase alphanumeric, may contain dots/hyphens/underscores/slashes, must not start or end with a separator.`, 'INVALID_IMAGE_NAME', ['Image names must match: /^[a-z0-9]([a-z0-9._/-]*[a-z0-9])?$/']);
125
+ throw new ContainerBuildError(`Invalid image name: "${imageName}".`, 'INVALID_IMAGE_NAME');
63
126
  }
64
- if (buildArgs) {
127
+ if (buildArgs)
65
128
  validateBuildArgs(buildArgs);
66
- }
67
- // Resolve tag
129
+ const platforms = resolvePlatforms(options);
68
130
  let tag = options.tag ?? 'latest';
69
- if (tag === 'content-hash') {
131
+ if (tag === 'content-hash')
70
132
  tag = await computeContentHash(contextPath, dockerfilePath);
133
+ await checkDockerAvailable(signal);
134
+ const registry = resolveRegistry(options.registry);
135
+ const taggedImageUri = await registry.resolveImageUri(imageName, tag);
136
+ logger.info('Building container image', {
137
+ taggedImageUri,
138
+ platforms: platforms.length ? platforms : ['native'],
139
+ });
140
+ let session;
141
+ let builder;
142
+ const metadataDirectory = await mkdtemp(join(tmpdir(), 'typekro-build-'));
143
+ const metadataPath = join(metadataDirectory, 'metadata.json');
144
+ try {
145
+ session = await registry.prepare(imageName, timeout, signal);
146
+ if (!session.remote && platforms.length > 1) {
147
+ throw new ContainerBuildError('Multi-platform images must be published to a remote registry.', 'MULTI_PLATFORM_REQUIRES_REGISTRY');
148
+ }
149
+ const buildArgFlags = buildArgs
150
+ ? Object.entries(buildArgs).flatMap(([key, value]) => ['--build-arg', `${key}=${value}`])
151
+ : [];
152
+ const common = [
153
+ '-t',
154
+ taggedImageUri,
155
+ '-f',
156
+ dockerfilePath,
157
+ ...(platforms.length ? ['--platform', platforms.join(',')] : []),
158
+ ...(target ? ['--target', target] : []),
159
+ ...buildArgFlags,
160
+ ...extraDockerArgs,
161
+ contextPath,
162
+ ];
163
+ if (session.remote) {
164
+ if (session.buildkitConfigPath || platforms.length > 1) {
165
+ builder = await createBuildxBuilder(session, timeout, signal);
166
+ }
167
+ await execDocker([
168
+ 'buildx',
169
+ 'build',
170
+ ...(builder ? ['--builder', builder] : []),
171
+ '--push',
172
+ '--metadata-file',
173
+ metadataPath,
174
+ ...(quiet ? ['--quiet'] : ['--progress', progress]),
175
+ ...common,
176
+ ], {
177
+ quiet,
178
+ timeout,
179
+ ...(session.environment ? { environment: session.environment } : {}),
180
+ ...(signal ? { signal } : {}),
181
+ });
182
+ const digest = await verifyPublishedDigest(taggedImageUri, metadataPath, session, builder, timeout, signal);
183
+ const repository = repositoryFromTaggedUri(taggedImageUri);
184
+ const imageUri = `${repository}@${digest}`;
185
+ const duration = Date.now() - startedAt;
186
+ logger.info('Container build published', { imageUri, taggedImageUri, duration });
187
+ return {
188
+ imageUri,
189
+ taggedImageUri,
190
+ repository,
191
+ tag,
192
+ digest,
193
+ duration,
194
+ pushed: true,
195
+ platforms,
196
+ };
197
+ }
198
+ await execDocker(['build', ...common], {
199
+ quiet,
200
+ timeout,
201
+ ...(signal ? { signal } : {}),
202
+ });
203
+ const duration = Date.now() - startedAt;
204
+ return {
205
+ imageUri: taggedImageUri,
206
+ taggedImageUri,
207
+ repository: repositoryFromTaggedUri(taggedImageUri),
208
+ tag,
209
+ duration,
210
+ pushed: false,
211
+ platforms,
212
+ };
213
+ }
214
+ finally {
215
+ if (builder && session)
216
+ await removeBuildxBuilder(builder, session, timeout);
217
+ if (session)
218
+ await session.cleanup();
219
+ await rm(metadataDirectory, { recursive: true, force: true });
71
220
  }
72
- logger.info('Building container image', { imageName, tag, context: contextPath, registry: registryConfig.type });
73
- // Check Docker availability
74
- await checkDockerAvailable();
75
- // Resolve registry handler
76
- const registry = resolveRegistry(registryConfig);
77
- // Resolve full image URI
78
- const imageUri = await registry.resolveImageUri(imageName, tag);
79
- // Authenticate with registry (no-op for local registries)
80
- await registry.authenticate();
81
- // Build the image
82
- const buildArgFlags = buildArgs
83
- ? Object.entries(buildArgs).flatMap(([k, v]) => ['--build-arg', `${k}=${v}`])
84
- : [];
85
- const dockerBuildArgs = [
86
- 'build',
87
- '-t', imageUri,
88
- '-f', dockerfilePath,
89
- ...(platform ? ['--platform', platform] : []),
90
- ...(target ? ['--target', target] : []),
91
- ...buildArgFlags,
92
- ...extraDockerArgs,
93
- contextPath,
94
- ];
95
- await execDocker(dockerBuildArgs, { quiet, timeout });
96
- // Push to registry — handler returns whether it actually pushed
97
- const pushed = await registry.push(imageUri, imageName);
98
- const duration = Date.now() - startTime;
99
- logger.info('Container build complete', { imageUri, tag, duration, pushed });
100
- return { imageUri, tag, duration, pushed };
101
221
  }
102
- /**
103
- * Compute a content-based hash of the build context for deterministic tagging.
104
- * Exported for direct unit testing without Docker.
105
- *
106
- * Hashes the Dockerfile content plus all file contents in the context,
107
- * respecting .dockerignore if present. Files are streamed (not loaded into
108
- * memory) and hashed in sorted order for determinism.
109
- */
222
+ /** Compute a deterministic build-context digest using only Node-compatible APIs. */
110
223
  export async function computeContentHash(contextPath, dockerfilePath) {
111
- const hasher = new Bun.CryptoHasher('sha256');
112
- // Hash the Dockerfile content (streamed for memory efficiency)
113
- for await (const chunk of Bun.file(dockerfilePath).stream()) {
224
+ const hasher = createHash('sha256');
225
+ for await (const chunk of createReadStream(dockerfilePath))
114
226
  hasher.update(chunk);
115
- }
116
- // Parse .dockerignore if present — same format as .gitignore
117
227
  const ignore = (await import('ignore')).default;
118
- const ig = ignore();
119
- // Always exclude .git and node_modules (Docker does this implicitly)
120
- ig.add(['.git', 'node_modules']);
228
+ const ignored = ignore().add(['.git', 'node_modules']);
121
229
  const dockerignorePath = join(contextPath, '.dockerignore');
122
- if (existsSync(dockerignorePath)) {
123
- const patterns = await Bun.file(dockerignorePath).text();
124
- ig.add(patterns);
125
- }
126
- // Collect files, excluding .dockerignore matches.
127
- // Use a recursive directory walker that skips ignored DIRECTORIES
128
- // upfront (e.g., node_modules/, .git/) instead of Bun.Glob which
129
- // enumerates all files before filtering — critical for repos with
130
- // multi-GB node_modules.
230
+ if (existsSync(dockerignorePath))
231
+ ignored.add(await readFile(dockerignorePath, 'utf8'));
131
232
  const files = [];
132
- // `dir` is relative to contextPath; `prefix` is the slash-joined
133
- // path used for ignore matching and file collection. readdir always
134
- // receives an absolute path via join(contextPath, dir).
135
- const walkDir = async (dir, prefix) => {
136
- const entries = await readdir(join(contextPath, dir), { withFileTypes: true });
233
+ const walk = async (directory, prefix) => {
234
+ const entries = await readdir(join(contextPath, directory), { withFileTypes: true });
137
235
  for (const entry of entries) {
138
236
  const relativePath = prefix ? `${prefix}/${entry.name}` : entry.name;
139
- // Check ignore BEFORE descending this is the perf optimization
140
- // that avoids traversing node_modules/ entirely.
141
- if (ig.ignores(relativePath + (entry.isDirectory() ? '/' : '')))
237
+ if (ignored.ignores(relativePath + (entry.isDirectory() ? '/' : '')))
142
238
  continue;
143
- if (entry.isDirectory()) {
144
- await walkDir(join(dir, entry.name), relativePath);
145
- }
146
- else if (entry.isFile()) {
147
- // Only include regular files — skip symlinks, sockets, etc.
239
+ if (entry.isDirectory())
240
+ await walk(join(directory, entry.name), relativePath);
241
+ else if (entry.isFile())
148
242
  files.push(relativePath);
149
- }
150
243
  }
151
244
  };
152
- await walkDir('', '');
245
+ await walk('', '');
153
246
  files.sort();
154
247
  for (const file of files) {
155
248
  hasher.update(file);
156
249
  try {
157
- const stream = Bun.file(join(contextPath, file)).stream();
158
- for await (const chunk of stream) {
250
+ for await (const chunk of createReadStream(join(contextPath, file)))
159
251
  hasher.update(chunk);
160
- }
161
252
  }
162
- catch (err) {
163
- // Skip unreadable files (broken symlinks, permission errors).
164
- // Log at debug so build hash inconsistencies can be diagnosed.
165
- logger.debug('Skipping unreadable file during content hash', {
166
- file,
167
- error: err instanceof Error ? err.message : String(err),
168
- });
253
+ catch (error) {
254
+ throw new ContainerBuildError(`Build context file cannot be hashed: ${file}: ${error instanceof Error ? error.message : String(error)}`, 'INVALID_CONTEXT', ['Make every included build-context file readable or exclude it through .dockerignore.'], error instanceof Error ? error : undefined);
169
255
  }
170
256
  }
171
- const hash = hasher.digest('hex');
172
- return `sha-${hash.slice(0, 12)}`;
257
+ return `sha-${hasher.digest('hex').slice(0, 12)}`;
173
258
  }
174
259
  //# sourceMappingURL=build.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/core/containers/build.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/core/containers/build.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,10 @@ export declare class ContainerBuildError extends TypeKroError {
7
7
  constructor(message: string, code: string, suggestions?: string[], cause?: Error);
8
8
  static dockerNotAvailable(detail?: string): ContainerBuildError;
9
9
  static buildFailed(exitCode: number, stderr: string): ContainerBuildError;
10
+ static commandFailed(exitCode: number, args: readonly string[], stderr: string): ContainerBuildError;
11
+ static timeout(timeout: number, operation: string): ContainerBuildError;
12
+ static cancelled(): ContainerBuildError;
13
+ static digestVerificationFailed(detail: string): ContainerBuildError;
10
14
  static pushFailed(imageUri: string, cause: Error): ContainerBuildError;
11
15
  static ecrAuthFailed(cause: Error): ContainerBuildError;
12
16
  static registryNotSupported(type: string): ContainerBuildError;
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/core/containers/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,qBAAa,mBAAoB,SAAQ,YAAY;aAIjC,WAAW,EAAE,MAAM,EAAE;gBAFrC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACI,WAAW,GAAE,MAAM,EAAO,EAC1C,KAAK,CAAC,EAAE,KAAK;IAMf,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,mBAAmB;IAY/D,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,mBAAmB;IAYzE,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,mBAAmB;IAatE,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,mBAAmB;IAcvD,MAAM,CAAC,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB;CAU/D"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/core/containers/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,qBAAa,mBAAoB,SAAQ,YAAY;aAIjC,WAAW,EAAE,MAAM,EAAE;gBAFrC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACI,WAAW,GAAE,MAAM,EAAO,EAC1C,KAAK,CAAC,EAAE,KAAK;IAMf,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,mBAAmB;IAY/D,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,mBAAmB;IAYzE,MAAM,CAAC,aAAa,CAClB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,MAAM,EAAE,MAAM,GACb,mBAAmB;IAStB,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,mBAAmB;IAQvE,MAAM,CAAC,SAAS,IAAI,mBAAmB;IAIvC,MAAM,CAAC,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,mBAAmB;IAQpE,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,mBAAmB;IAatE,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,mBAAmB;IAcvD,MAAM,CAAC,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB;CAU/D"}
@@ -23,6 +23,19 @@ export class ContainerBuildError extends TypeKroError {
23
23
  "Run 'docker build' manually to see the full output.",
24
24
  ]);
25
25
  }
26
+ static commandFailed(exitCode, args, stderr) {
27
+ const operation = args.slice(0, 2).join(' ');
28
+ return new ContainerBuildError(`Docker ${operation} failed with exit code ${exitCode}:\n${stderr.slice(0, 2_000)}`, 'DOCKER_COMMAND_FAILED', ['Review the redacted Docker diagnostics and registry/build configuration.']);
29
+ }
30
+ static timeout(timeout, operation) {
31
+ return new ContainerBuildError(`Container operation timed out after ${timeout}ms: ${operation}`, 'BUILD_TIMEOUT', ['Increase the timeout or inspect registry and builder connectivity.']);
32
+ }
33
+ static cancelled() {
34
+ return new ContainerBuildError('Container operation was cancelled.', 'BUILD_CANCELLED');
35
+ }
36
+ static digestVerificationFailed(detail) {
37
+ return new ContainerBuildError(`Registry manifest digest verification failed: ${detail}`, 'DIGEST_VERIFICATION_FAILED', ['Verify registry availability, credentials, and that the pushed tag was not mutated.']);
38
+ }
26
39
  static pushFailed(imageUri, cause) {
27
40
  return new ContainerBuildError(`Failed to push ${imageUri}: ${cause.message}`, 'PUSH_FAILED', [
28
41
  'Verify registry credentials are valid.',
@@ -40,7 +53,7 @@ export class ContainerBuildError extends TypeKroError {
40
53
  }
41
54
  static registryNotSupported(type) {
42
55
  return new ContainerBuildError(`Registry type '${type}' is not yet implemented.`, 'REGISTRY_NOT_SUPPORTED', [
43
- 'Supported registries: orbstack, ecr.',
56
+ 'Supported registries: orbstack, ecr, oci (including Harbor).',
44
57
  'GCR and ACR support is planned — contributions welcome.',
45
58
  ]);
46
59
  }
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/core/containers/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,OAAO,mBAAoB,SAAQ,YAAY;IAIjC;IAHlB,YACE,OAAe,EACf,IAAY,EACI,cAAwB,EAAE,EAC1C,KAAa;QAEb,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAHrD,gBAAW,GAAX,WAAW,CAAe;QAI1C,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;IAED,MAAM,CAAC,kBAAkB,CAAC,MAAe;QACvC,OAAO,IAAI,mBAAmB,CAC5B,0BAA0B,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EACvD,sBAAsB,EACtB;YACE,gCAAgC;YAChC,sDAAsD;YACtD,qEAAqE;SACtE,CACF,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,QAAgB,EAAE,MAAc;QACjD,OAAO,IAAI,mBAAmB,CAC5B,sCAAsC,QAAQ,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAC1E,cAAc,EACd;YACE,yCAAyC;YACzC,uDAAuD;YACvD,qDAAqD;SACtD,CACF,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,QAAgB,EAAE,KAAY;QAC9C,OAAO,IAAI,mBAAmB,CAC5B,kBAAkB,QAAQ,KAAK,KAAK,CAAC,OAAO,EAAE,EAC9C,aAAa,EACb;YACE,wCAAwC;YACxC,gEAAgE;YAChE,oBAAoB,QAAQ,yBAAyB;SACtD,EACD,KAAK,CACN,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,aAAa,CAAC,KAAY;QAC/B,OAAO,IAAI,mBAAmB,CAC5B,8BAA8B,KAAK,CAAC,OAAO,EAAE,EAC7C,iBAAiB,EACjB;YACE,qDAAqD;YACrD,sDAAsD;YACtD,kDAAkD;YAClD,+DAA+D;SAChE,EACD,KAAK,CACN,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,oBAAoB,CAAC,IAAY;QACtC,OAAO,IAAI,mBAAmB,CAC5B,kBAAkB,IAAI,2BAA2B,EACjD,wBAAwB,EACxB;YACE,sCAAsC;YACtC,yDAAyD;SAC1D,CACF,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/core/containers/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,OAAO,mBAAoB,SAAQ,YAAY;IAIjC;IAHlB,YACE,OAAe,EACf,IAAY,EACI,cAAwB,EAAE,EAC1C,KAAa;QAEb,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAHrD,gBAAW,GAAX,WAAW,CAAe;QAI1C,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;IAED,MAAM,CAAC,kBAAkB,CAAC,MAAe;QACvC,OAAO,IAAI,mBAAmB,CAC5B,0BAA0B,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EACvD,sBAAsB,EACtB;YACE,gCAAgC;YAChC,sDAAsD;YACtD,qEAAqE;SACtE,CACF,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,QAAgB,EAAE,MAAc;QACjD,OAAO,IAAI,mBAAmB,CAC5B,sCAAsC,QAAQ,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAC1E,cAAc,EACd;YACE,yCAAyC;YACzC,uDAAuD;YACvD,qDAAqD;SACtD,CACF,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,aAAa,CAClB,QAAgB,EAChB,IAAuB,EACvB,MAAc;QAEd,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7C,OAAO,IAAI,mBAAmB,CAC5B,UAAU,SAAS,0BAA0B,QAAQ,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EACnF,uBAAuB,EACvB,CAAC,0EAA0E,CAAC,CAC7E,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,OAAe,EAAE,SAAiB;QAC/C,OAAO,IAAI,mBAAmB,CAC5B,uCAAuC,OAAO,OAAO,SAAS,EAAE,EAChE,eAAe,EACf,CAAC,oEAAoE,CAAC,CACvE,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,SAAS;QACd,OAAO,IAAI,mBAAmB,CAAC,oCAAoC,EAAE,iBAAiB,CAAC,CAAC;IAC1F,CAAC;IAED,MAAM,CAAC,wBAAwB,CAAC,MAAc;QAC5C,OAAO,IAAI,mBAAmB,CAC5B,iDAAiD,MAAM,EAAE,EACzD,4BAA4B,EAC5B,CAAC,qFAAqF,CAAC,CACxF,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,QAAgB,EAAE,KAAY;QAC9C,OAAO,IAAI,mBAAmB,CAC5B,kBAAkB,QAAQ,KAAK,KAAK,CAAC,OAAO,EAAE,EAC9C,aAAa,EACb;YACE,wCAAwC;YACxC,gEAAgE;YAChE,oBAAoB,QAAQ,yBAAyB;SACtD,EACD,KAAK,CACN,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,aAAa,CAAC,KAAY;QAC/B,OAAO,IAAI,mBAAmB,CAC5B,8BAA8B,KAAK,CAAC,OAAO,EAAE,EAC7C,iBAAiB,EACjB;YACE,qDAAqD;YACrD,sDAAsD;YACtD,kDAAkD;YAClD,+DAA+D;SAChE,EACD,KAAK,CACN,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,oBAAoB,CAAC,IAAY;QACtC,OAAO,IAAI,mBAAmB,CAC5B,kBAAkB,IAAI,2BAA2B,EACjD,wBAAwB,EACxB;YACE,8DAA8D;YAC9D,yDAAyD;SAC1D,CACF,CAAC;IACJ,CAAC;CACF"}
@@ -1,36 +1,19 @@
1
- /**
2
- * Docker CLI Execution Helper
3
- *
4
- * Wraps Bun.spawn for Docker commands with streaming output,
5
- * timeout support, and actionable error messages.
6
- */
7
1
  export interface ExecDockerOptions {
8
- /** Pipe this string to stdin (used for docker login --password-stdin). */
9
2
  stdin?: string;
10
- /** Suppress stdout streaming (only log on error). */
11
3
  quiet?: boolean;
12
- /** Timeout in milliseconds. */
13
4
  timeout?: number;
5
+ signal?: AbortSignal;
6
+ environment?: Readonly<Record<string, string>>;
7
+ /** Additional exact values to redact from errors and diagnostics. */
8
+ sensitiveValues?: readonly string[];
14
9
  }
15
10
  export interface ExecDockerResult {
16
11
  exitCode: number;
17
12
  stdout: string;
18
13
  stderr: string;
19
14
  }
20
- /**
21
- * Validate that build arg keys are safe Docker ARG names.
22
- * Prevents flag injection via malicious keys like "--platform".
23
- */
24
15
  export declare function validateBuildArgs(buildArgs: Record<string, string>): void;
25
- /**
26
- * Execute a Docker CLI command.
27
- *
28
- * Streams output to the logger in real-time unless `quiet` is set.
29
- * Throws ContainerBuildError on non-zero exit or timeout.
30
- */
16
+ /** Execute Docker through a Node-compatible process boundary with timeout and cancellation. */
31
17
  export declare function execDocker(args: string[], options?: ExecDockerOptions): Promise<ExecDockerResult>;
32
- /**
33
- * Check if Docker is available and the daemon is running.
34
- */
35
- export declare function checkDockerAvailable(): Promise<void>;
18
+ export declare function checkDockerAvailable(signal?: AbortSignal): Promise<void>;
36
19
  //# sourceMappingURL=exec.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../../src/core/containers/exec.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,MAAM,WAAW,iBAAiB;IAChC,0EAA0E;IAC1E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,+BAA+B;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAiBzE;AAED;;;;;GAKG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,gBAAgB,CAAC,CAkE3B;AAED;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAuB1D"}
1
+ {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../../src/core/containers/exec.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/C,qEAAqE;IACrE,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAiBzE;AA0BD,+FAA+F;AAC/F,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,gBAAgB,CAAC,CA8E3B;AAED,wBAAsB,oBAAoB,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAc9E"}