@eudiplo/cli 7.1.1 → 7.2.0-main.20c3901

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 (268) hide show
  1. package/README.md +259 -15
  2. package/dist/commands/commands/index.d.ts +4 -0
  3. package/dist/commands/commands/index.d.ts.map +1 -0
  4. package/dist/commands/commands/index.js +13 -0
  5. package/dist/commands/commands/index.js.map +1 -0
  6. package/dist/commands/commands/render.d.ts +4 -0
  7. package/dist/commands/commands/render.d.ts.map +1 -0
  8. package/dist/commands/commands/render.js +52 -0
  9. package/dist/commands/commands/render.js.map +1 -0
  10. package/dist/commands/completion/action.d.ts +6 -0
  11. package/dist/commands/completion/action.d.ts.map +1 -0
  12. package/dist/commands/completion/action.js +133 -0
  13. package/dist/commands/completion/action.js.map +1 -0
  14. package/dist/commands/completion/index.d.ts +6 -0
  15. package/dist/commands/completion/index.d.ts.map +1 -0
  16. package/dist/commands/completion/index.js +23 -0
  17. package/dist/commands/completion/index.js.map +1 -0
  18. package/dist/commands/config/action.d.ts +4 -0
  19. package/dist/commands/config/action.d.ts.map +1 -0
  20. package/dist/commands/config/action.js +33 -0
  21. package/dist/commands/config/action.js.map +1 -0
  22. package/dist/commands/config/editor/action.d.ts +3 -0
  23. package/dist/commands/config/editor/action.d.ts.map +1 -0
  24. package/dist/commands/config/editor/action.js +112 -0
  25. package/dist/commands/config/editor/action.js.map +1 -0
  26. package/dist/commands/config/editor/index.d.ts +5 -0
  27. package/dist/commands/config/editor/index.d.ts.map +1 -0
  28. package/dist/commands/config/editor/index.js +20 -0
  29. package/dist/commands/config/editor/index.js.map +1 -0
  30. package/dist/commands/config/index.d.ts +5 -0
  31. package/dist/commands/config/index.d.ts.map +1 -0
  32. package/dist/commands/config/index.js +37 -0
  33. package/dist/commands/config/index.js.map +1 -0
  34. package/dist/commands/config/portability/action.d.ts +5 -0
  35. package/dist/commands/config/portability/action.d.ts.map +1 -0
  36. package/dist/commands/config/portability/action.js +164 -0
  37. package/dist/commands/config/portability/action.js.map +1 -0
  38. package/dist/commands/config/portability/index.d.ts +5 -0
  39. package/dist/commands/config/portability/index.d.ts.map +1 -0
  40. package/dist/commands/config/portability/index.js +44 -0
  41. package/dist/commands/config/portability/index.js.map +1 -0
  42. package/dist/commands/config/portability/migrations.d.ts +24 -0
  43. package/dist/commands/config/portability/migrations.d.ts.map +1 -0
  44. package/dist/commands/config/portability/migrations.js +95 -0
  45. package/dist/commands/config/portability/migrations.js.map +1 -0
  46. package/dist/commands/config/portability/migrations.spec.d.ts +2 -0
  47. package/dist/commands/config/portability/migrations.spec.d.ts.map +1 -0
  48. package/dist/commands/config/portability/migrations.spec.js +32 -0
  49. package/dist/commands/config/portability/migrations.spec.js.map +1 -0
  50. package/dist/commands/config/tenant/action.d.ts +3 -0
  51. package/dist/commands/config/tenant/action.d.ts.map +1 -0
  52. package/dist/commands/config/tenant/action.js +301 -0
  53. package/dist/commands/config/tenant/action.js.map +1 -0
  54. package/dist/commands/config/tenant/index.d.ts +5 -0
  55. package/dist/commands/config/tenant/index.d.ts.map +1 -0
  56. package/dist/commands/config/tenant/index.js +61 -0
  57. package/dist/commands/config/tenant/index.js.map +1 -0
  58. package/dist/commands/config/validate/action.d.ts +4 -0
  59. package/dist/commands/config/validate/action.d.ts.map +1 -0
  60. package/dist/commands/config/validate/action.js +47 -0
  61. package/dist/commands/config/validate/action.js.map +1 -0
  62. package/dist/commands/config/validate/index.d.ts +5 -0
  63. package/dist/commands/config/validate/index.d.ts.map +1 -0
  64. package/dist/commands/config/validate/index.js +18 -0
  65. package/dist/commands/config/validate/index.js.map +1 -0
  66. package/dist/commands/config/validate/registry.d.ts +6 -0
  67. package/dist/commands/config/validate/registry.d.ts.map +1 -0
  68. package/dist/{config-validate → commands/config/validate}/registry.js +2 -2
  69. package/dist/commands/config/validate/registry.js.map +1 -0
  70. package/dist/{config-validate → commands/config/validate}/registry.json +11 -22
  71. package/dist/commands/config/validate/report.d.ts.map +1 -0
  72. package/dist/{config-validate → commands/config/validate}/report.js +6 -1
  73. package/dist/commands/config/validate/report.js.map +1 -0
  74. package/dist/commands/config/validate/schemas.d.ts +3 -0
  75. package/dist/commands/config/validate/schemas.d.ts.map +1 -0
  76. package/dist/commands/config/validate/schemas.js +35 -0
  77. package/dist/commands/config/validate/schemas.js.map +1 -0
  78. package/dist/{config-validate → commands/config/validate}/types.d.ts +1 -1
  79. package/dist/commands/config/validate/types.d.ts.map +1 -0
  80. package/dist/commands/config/validate/types.js.map +1 -0
  81. package/dist/commands/config/validate/validator.d.ts.map +1 -0
  82. package/dist/{config-validate → commands/config/validate}/validator.js +17 -9
  83. package/dist/commands/config/validate/validator.js.map +1 -0
  84. package/dist/commands/demo/action.d.ts +3 -0
  85. package/dist/commands/demo/action.d.ts.map +1 -0
  86. package/dist/commands/demo/action.js +73 -0
  87. package/dist/commands/demo/action.js.map +1 -0
  88. package/dist/commands/demo/index.d.ts +5 -0
  89. package/dist/commands/demo/index.d.ts.map +1 -0
  90. package/dist/commands/demo/index.js +19 -0
  91. package/dist/commands/demo/index.js.map +1 -0
  92. package/dist/commands/deployment/action.d.ts +3 -0
  93. package/dist/commands/deployment/action.d.ts.map +1 -0
  94. package/dist/commands/deployment/action.js +23 -0
  95. package/dist/commands/deployment/action.js.map +1 -0
  96. package/dist/commands/deployment/index.d.ts +5 -0
  97. package/dist/commands/deployment/index.d.ts.map +1 -0
  98. package/dist/commands/deployment/index.js +19 -0
  99. package/dist/commands/deployment/index.js.map +1 -0
  100. package/dist/commands/doctor/action.d.ts +3 -0
  101. package/dist/commands/doctor/action.d.ts.map +1 -0
  102. package/dist/commands/doctor/action.js +12 -0
  103. package/dist/commands/doctor/action.js.map +1 -0
  104. package/dist/commands/doctor/index.d.ts +5 -0
  105. package/dist/commands/doctor/index.d.ts.map +1 -0
  106. package/dist/commands/doctor/index.js +13 -0
  107. package/dist/commands/doctor/index.js.map +1 -0
  108. package/dist/commands/init/action.d.ts +3 -0
  109. package/dist/commands/init/action.d.ts.map +1 -0
  110. package/dist/commands/init/action.js +255 -0
  111. package/dist/commands/init/action.js.map +1 -0
  112. package/dist/commands/init/index.d.ts +5 -0
  113. package/dist/commands/init/index.d.ts.map +1 -0
  114. package/dist/commands/init/index.js +35 -0
  115. package/dist/commands/init/index.js.map +1 -0
  116. package/dist/commands/instance/action.d.ts +7 -0
  117. package/dist/commands/instance/action.d.ts.map +1 -0
  118. package/dist/commands/instance/action.js +85 -0
  119. package/dist/commands/instance/action.js.map +1 -0
  120. package/dist/commands/instance/index.d.ts +5 -0
  121. package/dist/commands/instance/index.d.ts.map +1 -0
  122. package/dist/commands/instance/index.js +53 -0
  123. package/dist/commands/instance/index.js.map +1 -0
  124. package/dist/commands/shared.d.ts +14 -0
  125. package/dist/commands/shared.d.ts.map +1 -0
  126. package/dist/commands/shared.js +39 -0
  127. package/dist/commands/shared.js.map +1 -0
  128. package/dist/commands/status/action.d.ts +3 -0
  129. package/dist/commands/status/action.d.ts.map +1 -0
  130. package/dist/commands/status/action.js +13 -0
  131. package/dist/commands/status/action.js.map +1 -0
  132. package/dist/commands/status/index.d.ts +5 -0
  133. package/dist/commands/status/index.d.ts.map +1 -0
  134. package/dist/commands/status/index.js +13 -0
  135. package/dist/commands/status/index.js.map +1 -0
  136. package/dist/commands/version/action.d.ts +4 -0
  137. package/dist/commands/version/action.d.ts.map +1 -0
  138. package/dist/commands/version/action.js +70 -0
  139. package/dist/commands/version/action.js.map +1 -0
  140. package/dist/commands/version/index.d.ts +6 -0
  141. package/dist/commands/version/index.d.ts.map +1 -0
  142. package/dist/commands/version/index.js +12 -0
  143. package/dist/commands/version/index.js.map +1 -0
  144. package/dist/index.js +0 -0
  145. package/dist/options.d.ts +2 -0
  146. package/dist/options.d.ts.map +1 -0
  147. package/dist/options.js +5 -0
  148. package/dist/options.js.map +1 -0
  149. package/dist/runtime.d.ts +2 -0
  150. package/dist/runtime.d.ts.map +1 -1
  151. package/dist/runtime.js +61 -465
  152. package/dist/runtime.js.map +1 -1
  153. package/dist/sea-assets.d.ts +4 -2
  154. package/dist/sea-assets.d.ts.map +1 -1
  155. package/dist/sea-assets.js +6 -3
  156. package/dist/sea-assets.js.map +1 -1
  157. package/dist/{config.d.ts → services/cli-config.d.ts} +4 -2
  158. package/dist/services/cli-config.d.ts.map +1 -0
  159. package/dist/{config.js → services/cli-config.js} +30 -4
  160. package/dist/services/cli-config.js.map +1 -0
  161. package/dist/{compose-template.d.ts → services/compose-project.d.ts} +14 -4
  162. package/dist/services/compose-project.d.ts.map +1 -0
  163. package/dist/services/compose-project.js +189 -0
  164. package/dist/services/compose-project.js.map +1 -0
  165. package/dist/{drivers.d.ts → services/deployment-drivers.d.ts} +16 -3
  166. package/dist/services/deployment-drivers.d.ts.map +1 -0
  167. package/dist/services/deployment-drivers.js +288 -0
  168. package/dist/services/deployment-drivers.js.map +1 -0
  169. package/dist/services/deployment-target.d.ts +3 -0
  170. package/dist/services/deployment-target.d.ts.map +1 -0
  171. package/dist/services/deployment-target.js +7 -0
  172. package/dist/services/deployment-target.js.map +1 -0
  173. package/dist/{doctor.d.ts → services/diagnostics.d.ts} +2 -2
  174. package/dist/services/diagnostics.d.ts.map +1 -0
  175. package/dist/{doctor.js → services/diagnostics.js} +4 -2
  176. package/dist/services/diagnostics.js.map +1 -0
  177. package/dist/services/instance-selection.d.ts +3 -0
  178. package/dist/services/instance-selection.d.ts.map +1 -0
  179. package/dist/services/instance-selection.js +13 -0
  180. package/dist/services/instance-selection.js.map +1 -0
  181. package/dist/services/project-directory.d.ts +3 -0
  182. package/dist/services/project-directory.d.ts.map +1 -0
  183. package/dist/services/project-directory.js +14 -0
  184. package/dist/services/project-directory.js.map +1 -0
  185. package/dist/types.d.ts +4 -0
  186. package/dist/types.d.ts.map +1 -1
  187. package/package.json +7 -4
  188. package/templates/demo-config/issuance/issuance.json +20 -12
  189. package/templates/demo-config/key-chains/access.json +13 -2
  190. package/templates/demo-config/key-chains/attestation.json +15 -4
  191. package/templates/demo-config/key-chains/status-list.json +15 -4
  192. package/templates/demo-config/key-chains/trust-list.json +13 -2
  193. package/templates/demo-config/presentation/age-over-18.json +46 -53
  194. package/templates/demo-config/presentation/pid.json +44 -0
  195. package/templates/demo-config.manifest.json +1 -0
  196. package/templates/docker-compose.yml +5 -4
  197. package/templates/schemas/AttributeProviderAuth.schema.json +60 -0
  198. package/templates/schemas/AttributeProviderConfigFile.schema.json +37 -0
  199. package/templates/schemas/CertImportDto.schema.json +35 -0
  200. package/templates/schemas/ClientConfigFile.schema.json +37 -0
  201. package/templates/schemas/ConfigDocumentMetadata.schema.json +25 -0
  202. package/templates/schemas/CreateClientDto.schema.json +1 -0
  203. package/templates/schemas/CreateStatusListDto.schema.json +46 -0
  204. package/templates/schemas/CreateTenantDto.schema.json +116 -0
  205. package/templates/schemas/CredentialConfigCreate.schema.json +55 -0
  206. package/templates/schemas/CredentialConfigFile.schema.json +37 -0
  207. package/templates/schemas/DCQL.schema.json +401 -0
  208. package/templates/schemas/EmbeddedDisclosurePolicy.schema.json +106 -0
  209. package/templates/schemas/ImportTenantDto.schema.json +69 -0
  210. package/templates/schemas/IssuanceConfig.schema.json +26 -6
  211. package/templates/schemas/IssuanceConfigFile.schema.json +32 -0
  212. package/templates/schemas/KeyChainConfigFile.schema.json +101 -0
  213. package/templates/schemas/KeyChainCreateDto.schema.json +66 -0
  214. package/templates/schemas/KeyChainUpdateDto.schema.json +40 -0
  215. package/templates/schemas/KmsConfigFile.schema.json +37 -0
  216. package/templates/schemas/PresentationConfigFile.schema.json +32 -0
  217. package/templates/schemas/RegistrarConfigFile.schema.json +37 -0
  218. package/templates/schemas/RotationPolicyCreateDto.schema.json +28 -0
  219. package/templates/schemas/RotationPolicyUpdateDto.schema.json +25 -0
  220. package/templates/schemas/SessionStorageConfig.schema.json +24 -0
  221. package/templates/schemas/StatusListConfig.schema.json +51 -0
  222. package/templates/schemas/StatusListConfigFile.schema.json +37 -0
  223. package/templates/schemas/TransactionData.schema.json +24 -0
  224. package/templates/schemas/TrustListConfigFile.schema.json +37 -0
  225. package/templates/schemas/UpdateAttributeProviderDto.schema.json +93 -0
  226. package/templates/schemas/UpdateClientDto.schema.json +62 -0
  227. package/templates/schemas/UpdateStatusListConfigDto.schema.json +85 -0
  228. package/templates/schemas/UpdateStatusListDto.schema.json +33 -0
  229. package/templates/schemas/UpdateTenantDto.schema.json +96 -0
  230. package/templates/schemas/UpdateWebhookEndpointDto.schema.json +93 -0
  231. package/templates/schemas/VCT.schema.json +37 -0
  232. package/templates/schemas/WebhookConfig.schema.json +80 -0
  233. package/templates/schemas/WebhookEndpointConfigFile.schema.json +37 -0
  234. package/templates/schemas.manifest.json +34 -1
  235. package/dist/args.d.ts +0 -4
  236. package/dist/args.d.ts.map +0 -1
  237. package/dist/args.js +0 -46
  238. package/dist/args.js.map +0 -1
  239. package/dist/compose-template.d.ts.map +0 -1
  240. package/dist/compose-template.js +0 -105
  241. package/dist/compose-template.js.map +0 -1
  242. package/dist/config-validate/index.d.ts +0 -4
  243. package/dist/config-validate/index.d.ts.map +0 -1
  244. package/dist/config-validate/index.js +0 -4
  245. package/dist/config-validate/index.js.map +0 -1
  246. package/dist/config-validate/registry.d.ts +0 -5
  247. package/dist/config-validate/registry.d.ts.map +0 -1
  248. package/dist/config-validate/registry.js.map +0 -1
  249. package/dist/config-validate/report.d.ts.map +0 -1
  250. package/dist/config-validate/report.js.map +0 -1
  251. package/dist/config-validate/schemas.d.ts +0 -2
  252. package/dist/config-validate/schemas.d.ts.map +0 -1
  253. package/dist/config-validate/schemas.js +0 -24
  254. package/dist/config-validate/schemas.js.map +0 -1
  255. package/dist/config-validate/types.d.ts.map +0 -1
  256. package/dist/config-validate/types.js.map +0 -1
  257. package/dist/config-validate/validator.d.ts.map +0 -1
  258. package/dist/config-validate/validator.js.map +0 -1
  259. package/dist/config.d.ts.map +0 -1
  260. package/dist/config.js.map +0 -1
  261. package/dist/doctor.d.ts.map +0 -1
  262. package/dist/doctor.js.map +0 -1
  263. package/dist/drivers.d.ts.map +0 -1
  264. package/dist/drivers.js +0 -170
  265. package/dist/drivers.js.map +0 -1
  266. /package/dist/{config-validate → commands/config/validate}/report.d.ts +0 -0
  267. /package/dist/{config-validate → commands/config/validate}/types.js +0 -0
  268. /package/dist/{config-validate → commands/config/validate}/validator.d.ts +0 -0
@@ -1,5 +1,5 @@
1
1
  import { mkdir, readFile, writeFile } from "node:fs/promises";
2
- import { dirname, join, resolve } from "node:path";
2
+ import { dirname, isAbsolute, join, resolve } from "node:path";
3
3
  import { homedir } from "node:os";
4
4
  const emptyConfig = () => ({ instances: {} });
5
5
  export function resolveConfigPath(env) {
@@ -55,6 +55,26 @@ export function upsertInstance(config, name, instance) {
55
55
  },
56
56
  };
57
57
  }
58
+ export function setDefaultInstance(config, name) {
59
+ if (!Object.hasOwn(config.instances, name)) {
60
+ throw new Error(`Unknown instance: ${name}`);
61
+ }
62
+ return { ...config, defaultInstance: name };
63
+ }
64
+ export function removeInstance(config, name) {
65
+ if (!Object.hasOwn(config.instances, name)) {
66
+ throw new Error(`Unknown instance: ${name}`);
67
+ }
68
+ if (config.defaultInstance === name && Object.keys(config.instances).length > 1) {
69
+ throw new Error(`Cannot remove default instance ${name}. Select another with: eudiplo instance use <name>`);
70
+ }
71
+ const instances = { ...config.instances };
72
+ delete instances[name];
73
+ return {
74
+ defaultInstance: config.defaultInstance === name ? undefined : config.defaultInstance,
75
+ instances,
76
+ };
77
+ }
58
78
  function isRecord(value) {
59
79
  return typeof value === "object" && value !== null && !Array.isArray(value);
60
80
  }
@@ -82,25 +102,31 @@ function validateInstanceConfig(name, value) {
82
102
  }
83
103
  validateHttpUrl(value.url, `Instance ${name} url`);
84
104
  validateOptionalHttpUrl(value.clientUrl, `Instance ${name} clientUrl`);
105
+ if (typeof value.projectDirectory === "string" &&
106
+ !isAbsolute(value.projectDirectory)) {
107
+ throw new Error(`Instance ${name} projectDirectory must be absolute.`);
108
+ }
85
109
  return {
86
110
  target: value.target,
87
111
  url: value.url,
88
112
  clientUrl: optionalString(value.clientUrl),
89
113
  composeFile: optionalString(value.composeFile),
90
114
  composeFiles: optionalStringArray(value.composeFiles),
115
+ composeProfiles: optionalStringArray(value.composeProfiles, "composeProfiles"),
91
116
  envFile: optionalString(value.envFile),
92
117
  projectName: optionalString(value.projectName),
118
+ projectDirectory: optionalString(value.projectDirectory),
93
119
  };
94
120
  }
95
121
  function optionalString(value) {
96
122
  return typeof value === "string" ? value : undefined;
97
123
  }
98
- function optionalStringArray(value) {
124
+ function optionalStringArray(value, label = "composeFiles") {
99
125
  if (!Array.isArray(value)) {
100
126
  return undefined;
101
127
  }
102
128
  if (value.some((item) => typeof item !== "string")) {
103
- throw new Error("composeFiles must contain only strings.");
129
+ throw new Error(`${label} must contain only strings.`);
104
130
  }
105
131
  return value;
106
132
  }
@@ -120,4 +146,4 @@ function validateHttpUrl(value, label) {
120
146
  throw new Error(`${label} must be an absolute HTTP(S) URL.`);
121
147
  }
122
148
  }
123
- //# sourceMappingURL=config.js.map
149
+ //# sourceMappingURL=cli-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-config.js","sourceRoot":"","sources":["../../src/services/cli-config.ts"],"names":[],"mappings":"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"}
@@ -3,18 +3,28 @@ export declare const defaultComposeOverrideFileName = "eudiplo.compose.override.
3
3
  export declare const defaultEnvFileName = ".eudiplo.env";
4
4
  export declare const demoComposeFileName = "eudiplo.demo.compose.yaml";
5
5
  export declare const demoEnvFileName = ".eudiplo.demo.env";
6
- export declare const demoConfigDirectory = ".eudiplo/demo-config";
6
+ export declare const configDirectoryName = "config";
7
+ export declare const demoConfigDirectory = "config/demo";
7
8
  type ComposeMode = "standard" | "demo";
9
+ export type ComposeDatabase = "sqlite" | "postgres";
10
+ export type ComposeStorage = "local" | "s3";
11
+ export type ComposeKms = "db" | "vault";
8
12
  interface ComposeEnvOptions {
9
13
  mode: ComposeMode;
10
- cliVersion: string;
11
14
  imageTagOverride?: string;
15
+ database?: ComposeDatabase;
16
+ storage?: ComposeStorage;
17
+ kms?: ComposeKms;
18
+ publicUrl?: string;
19
+ authClientId?: string;
20
+ authClientSecret?: string;
12
21
  }
13
22
  export declare function createComposeEnv(options: ComposeEnvOptions): string;
14
- export declare function resolveImageTag(cliVersion: string, imageTagOverride?: string): string;
23
+ export declare function createGlobalKmsConfig(kms: ComposeKms): string;
24
+ export declare function resolveImageTag(imageTagOverride?: string): string;
15
25
  export declare function createComposeFile(): Promise<string>;
16
26
  export declare function createNoClientComposeOverride(): string;
17
27
  export declare function copyBundledDemoConfig(targetDirectory: string, force: boolean): Promise<void>;
18
28
  export declare function hasFiles(directory: string): Promise<boolean>;
19
29
  export {};
20
- //# sourceMappingURL=compose-template.d.ts.map
30
+ //# sourceMappingURL=compose-project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose-project.d.ts","sourceRoot":"","sources":["../../src/services/compose-project.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,sBAAsB,yBAAyB,CAAC;AAC7D,eAAO,MAAM,8BAA8B,kCAAkC,CAAC;AAC9E,eAAO,MAAM,kBAAkB,iBAAiB,CAAC;AACjD,eAAO,MAAM,mBAAmB,8BAA8B,CAAC;AAC/D,eAAO,MAAM,eAAe,sBAAsB,CAAC;AACnD,eAAO,MAAM,mBAAmB,WAAW,CAAC;AAE5C,eAAO,MAAM,mBAAmB,gBAA2C,CAAC;AAG5E,KAAK,WAAW,GAAG,UAAU,GAAG,MAAM,CAAC;AACvC,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,UAAU,CAAC;AACpD,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,IAAI,CAAC;AAC5C,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,OAAO,CAAC;AAExC,UAAU,iBAAiB;IACvB,IAAI,EAAE,WAAW,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAoCnE;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,CA2B7D;AA2DD,wBAAgB,eAAe,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,CAMjE;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CAKzD;AAED,wBAAgB,6BAA6B,IAAI,MAAM,CAOtD;AAED,wBAAsB,qBAAqB,CACvC,eAAe,EAAE,MAAM,EACvB,KAAK,EAAE,OAAO,GACf,OAAO,CAAC,IAAI,CAAC,CAoCf;AAED,wBAAsB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOlE"}
@@ -0,0 +1,189 @@
1
+ import { randomBytes } from "node:crypto";
2
+ import { cp, mkdir, readdir, readFile, rm, writeFile } from "node:fs/promises";
3
+ import { dirname, join } from "node:path";
4
+ import { readCliBinaryAsset, readCliTextAsset } from "../sea-assets.js";
5
+ export const defaultComposeFileName = "eudiplo.compose.yaml";
6
+ export const defaultComposeOverrideFileName = "eudiplo.compose.override.yaml";
7
+ export const defaultEnvFileName = ".eudiplo.env";
8
+ export const demoComposeFileName = "eudiplo.demo.compose.yaml";
9
+ export const demoEnvFileName = ".eudiplo.demo.env";
10
+ export const configDirectoryName = "config";
11
+ const demoTenantId = "demo";
12
+ export const demoConfigDirectory = `${configDirectoryName}/${demoTenantId}`;
13
+ const demoConfigManifestAssetKey = "templates/demo-config.manifest.json";
14
+ export function createComposeEnv(options) {
15
+ const imageTag = resolveImageTag(options.imageTagOverride);
16
+ const envFileName = options.mode === "demo" ? demoEnvFileName : defaultEnvFileName;
17
+ const database = options.mode === "demo" ? "sqlite" : (options.database ?? "sqlite");
18
+ const storage = options.mode === "demo" ? "local" : (options.storage ?? "local");
19
+ const kms = options.mode === "demo" ? "db" : (options.kms ?? "db");
20
+ const publicUrl = options.publicUrl ?? "http://localhost:3000";
21
+ const authClientId = options.authClientId ?? "root";
22
+ const authClientSecret = options.authClientSecret ?? "root";
23
+ const lines = [
24
+ `EUDIPLO_ENV_FILE=${envFileName}`,
25
+ `EUDIPLO_IMAGE=ghcr.io/openwallet-foundation/eudiplo:${imageTag}`,
26
+ `EUDIPLO_CLIENT_IMAGE=ghcr.io/openwallet-foundation/eudiplo-client:${imageTag}`,
27
+ ...(options.mode === "demo" ? ["EUDIPLO_BIND_ADDRESS=127.0.0.1"] : []),
28
+ `EUDIPLO_CONFIG_MOUNT=./${configDirectoryName}:/app/config`,
29
+ "CONFIG_FOLDER=/app/config",
30
+ "CONFIG_IMPORT_MODE=create",
31
+ `PUBLIC_URL=${escapeEnvValue(publicUrl)}`,
32
+ `MASTER_SECRET=${randomBytes(32).toString("base64")}`,
33
+ `AUTH_CLIENT_ID=${escapeEnvValue(authClientId)}`,
34
+ `AUTH_CLIENT_SECRET=${escapeEnvValue(authClientSecret)}`,
35
+ ];
36
+ lines.push("", ...databaseEnv(database), "", ...storageEnv(storage), "", ...kmsEnv(kms));
37
+ return `${lines.join("\n")}\n`;
38
+ }
39
+ export function createGlobalKmsConfig(kms) {
40
+ const providers = [
41
+ {
42
+ id: "db",
43
+ type: "db",
44
+ description: "Database-backed key provider",
45
+ },
46
+ ];
47
+ if (kms === "vault") {
48
+ providers.push({
49
+ id: "vault",
50
+ type: "vault",
51
+ description: "Local HashiCorp Vault",
52
+ vaultUrl: "${VAULT_ADDR}",
53
+ vaultToken: "${VAULT_TOKEN}",
54
+ });
55
+ }
56
+ return `${JSON.stringify({
57
+ defaultProvider: kms,
58
+ providers,
59
+ }, null, 4)}\n`;
60
+ }
61
+ function databaseEnv(database) {
62
+ if (database === "sqlite") {
63
+ return ["DB_TYPE=sqlite"];
64
+ }
65
+ return [
66
+ "DB_TYPE=postgres",
67
+ "DB_HOST=postgres",
68
+ "DB_PORT=5432",
69
+ "DB_USERNAME=eudiplo",
70
+ `DB_PASSWORD=${randomSecret()}`,
71
+ "DB_DATABASE=eudiplo",
72
+ ];
73
+ }
74
+ function storageEnv(storage) {
75
+ if (storage === "local") {
76
+ return ["STORAGE_DRIVER=local", "LOCAL_STORAGE_DIR=/app/uploads"];
77
+ }
78
+ const minioPassword = randomSecret();
79
+ return [
80
+ "STORAGE_DRIVER=s3",
81
+ "S3_ENDPOINT=http://minio:9000",
82
+ "S3_REGION=us-east-1",
83
+ "S3_ACCESS_KEY_ID=minioadmin",
84
+ `S3_SECRET_ACCESS_KEY=${minioPassword}`,
85
+ "S3_BUCKET=uploads",
86
+ "S3_FORCE_PATH_STYLE=true",
87
+ "MINIO_ROOT_USER=minioadmin",
88
+ `MINIO_ROOT_PASSWORD=${minioPassword}`,
89
+ ];
90
+ }
91
+ function kmsEnv(kms) {
92
+ if (kms === "db") {
93
+ return ["KM_TYPE=db"];
94
+ }
95
+ return [
96
+ "KM_TYPE=vault",
97
+ "VAULT_ADDR=http://vault:8200",
98
+ "VAULT_TOKEN=root",
99
+ ];
100
+ }
101
+ function randomSecret() {
102
+ return randomBytes(24).toString("base64url");
103
+ }
104
+ function escapeEnvValue(value) {
105
+ if (!/[\s#$'"\\]/.test(value)) {
106
+ return value;
107
+ }
108
+ return `'${value.replaceAll("\\", "\\\\").replaceAll("'", "\\'")}'`;
109
+ }
110
+ export function resolveImageTag(imageTagOverride) {
111
+ if (imageTagOverride && imageTagOverride.length > 0) {
112
+ return imageTagOverride;
113
+ }
114
+ return "latest";
115
+ }
116
+ export async function createComposeFile() {
117
+ return readCliTextAsset("templates/docker-compose.yml", new URL("../../templates/docker-compose.yml", import.meta.url));
118
+ }
119
+ export function createNoClientComposeOverride() {
120
+ return [
121
+ "services:",
122
+ " eudiplo-client:",
123
+ ' profiles: ["disabled"]',
124
+ "",
125
+ ].join("\n");
126
+ }
127
+ export async function copyBundledDemoConfig(targetDirectory, force) {
128
+ if (force) {
129
+ await rm(targetDirectory, { recursive: true, force: true });
130
+ }
131
+ const manifest = await readDemoConfigManifest();
132
+ if (manifest) {
133
+ await mkdir(targetDirectory, { recursive: true, mode: 0o700 });
134
+ for (const relativePath of manifest) {
135
+ const normalized = normalizeRelativePath(relativePath);
136
+ const destinationPath = join(targetDirectory, normalized);
137
+ await mkdir(dirname(destinationPath), {
138
+ recursive: true,
139
+ mode: 0o700,
140
+ });
141
+ const contents = await readCliBinaryAsset(`templates/demo-config/${normalized}`, new URL(`../../templates/demo-config/${normalized}`, import.meta.url));
142
+ await writeFile(destinationPath, contents, { mode: 0o600 });
143
+ }
144
+ return;
145
+ }
146
+ const fallbackDirectory = new URL("../../../../assets/config/demo/", import.meta.url);
147
+ await cp(fallbackDirectory, targetDirectory, {
148
+ recursive: true,
149
+ force,
150
+ errorOnExist: !force,
151
+ });
152
+ }
153
+ export async function hasFiles(directory) {
154
+ try {
155
+ const entries = await readdir(directory);
156
+ return entries.length > 0;
157
+ }
158
+ catch {
159
+ return false;
160
+ }
161
+ }
162
+ async function readDemoConfigManifest() {
163
+ try {
164
+ const manifestText = await readCliTextAsset(demoConfigManifestAssetKey, new URL("../../templates/demo-config.manifest.json", import.meta.url));
165
+ const parsed = JSON.parse(manifestText);
166
+ if (Array.isArray(parsed) &&
167
+ parsed.every((item) => typeof item === "string")) {
168
+ return parsed;
169
+ }
170
+ }
171
+ catch {
172
+ try {
173
+ const localManifest = await readFile(new URL("../../templates/demo-config.manifest.json", import.meta.url), "utf8");
174
+ const parsed = JSON.parse(localManifest);
175
+ if (Array.isArray(parsed) &&
176
+ parsed.every((item) => typeof item === "string")) {
177
+ return parsed;
178
+ }
179
+ }
180
+ catch {
181
+ return undefined;
182
+ }
183
+ }
184
+ return undefined;
185
+ }
186
+ function normalizeRelativePath(pathValue) {
187
+ return pathValue.replaceAll("\\", "/").replace(/^\/+/, "");
188
+ }
189
+ //# sourceMappingURL=compose-project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose-project.js","sourceRoot":"","sources":["../../src/services/compose-project.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,26 @@
1
- import type { DeploymentDriver, DeploymentTarget, InstanceConfig } from "./types.js";
1
+ import type { DeploymentDriver, DeploymentTarget, InstanceConfig } from "../types.js";
2
+ type ContainerRuntimeName = "docker" | "podman";
3
+ interface ComposeRuntime {
4
+ command: string;
5
+ name: ContainerRuntimeName;
6
+ }
2
7
  export declare const drivers: Record<DeploymentTarget, DeploymentDriver>;
3
8
  export declare function ensureComposeProject(cwd: string, options: {
4
9
  mode?: "standard" | "demo";
10
+ database?: "sqlite" | "postgres";
11
+ storage?: "local" | "s3";
12
+ kms?: "db" | "vault";
13
+ publicUrl?: string;
14
+ authClientId?: string;
15
+ authClientSecret?: string;
16
+ demoTenant?: boolean;
5
17
  noClient?: boolean;
6
18
  force?: boolean;
7
19
  reset?: boolean;
8
- cliVersion: string;
9
20
  imageTagOverride?: string;
10
21
  }): Promise<InstanceConfig>;
11
22
  export declare function demoProjectExists(cwd: string): Promise<boolean>;
12
23
  export declare function unsupportedCommand(command: string, target: DeploymentTarget): string;
13
- //# sourceMappingURL=drivers.d.ts.map
24
+ export declare function resolveComposeRuntime(env: NodeJS.ProcessEnv): Promise<ComposeRuntime | undefined>;
25
+ export {};
26
+ //# sourceMappingURL=deployment-drivers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployment-drivers.d.ts","sourceRoot":"","sources":["../../src/services/deployment-drivers.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EACR,gBAAgB,EAChB,gBAAgB,EAEhB,cAAc,EACjB,MAAM,aAAa,CAAC;AAErB,KAAK,oBAAoB,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEhD,UAAU,cAAc;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,oBAAoB,CAAC;CAC9B;AAED,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,gBAAgB,EAAE,gBAAgB,CAoC9D,CAAC;AAEF,wBAAsB,oBAAoB,CACtC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE;IACL,IAAI,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;IACjC,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACzB,GAAG,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC7B,GACF,OAAO,CAAC,cAAc,CAAC,CAqFzB;AAwCD,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOrE;AAaD,wBAAgB,kBAAkB,CAC9B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,gBAAgB,GACzB,MAAM,CAKR;AAgDD,wBAAsB,qBAAqB,CACvC,GAAG,EAAE,MAAM,CAAC,UAAU,GACvB,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAgBrC"}
@@ -0,0 +1,288 @@
1
+ import { access, mkdir, rm, stat, unlink, writeFile } from "node:fs/promises";
2
+ import { delimiter, join, resolve } from "node:path";
3
+ import { spawn } from "node:child_process";
4
+ import { copyBundledDemoConfig, createComposeFile, createComposeEnv, createGlobalKmsConfig, createNoClientComposeOverride, configDirectoryName, demoComposeFileName, demoConfigDirectory, demoEnvFileName, defaultComposeFileName, defaultComposeOverrideFileName, defaultEnvFileName, hasFiles, } from "./compose-project.js";
5
+ export const drivers = {
6
+ compose: {
7
+ target: "compose",
8
+ async diagnostics(instance, context) {
9
+ const messages = [];
10
+ const projectDirectory = instance.projectDirectory ?? context.cwd;
11
+ if (!(await resolveComposeRuntime(context.env))) {
12
+ messages.push("Docker or Podman was not found in a supported install location.");
13
+ }
14
+ for (const composeFile of getComposeFiles(instance)) {
15
+ try {
16
+ await access(resolve(projectDirectory, composeFile));
17
+ }
18
+ catch {
19
+ messages.push(`Compose file not found: ${composeFile}`);
20
+ }
21
+ }
22
+ return messages;
23
+ },
24
+ up(options) {
25
+ return runCompose(["up", "-d", ...options.args], options);
26
+ },
27
+ down(options) {
28
+ return runCompose(["down", ...options.args], options);
29
+ },
30
+ logs(options) {
31
+ return runCompose(["logs", "-f", ...options.args], options);
32
+ },
33
+ },
34
+ external: {
35
+ target: "external",
36
+ async diagnostics() {
37
+ return [];
38
+ },
39
+ },
40
+ };
41
+ export async function ensureComposeProject(cwd, options) {
42
+ await ensureProjectDirectory(cwd);
43
+ const mode = options.mode ?? "standard";
44
+ const composeFileName = mode === "demo" ? demoComposeFileName : defaultComposeFileName;
45
+ const envFileName = mode === "demo" ? demoEnvFileName : defaultEnvFileName;
46
+ const composePath = join(cwd, composeFileName);
47
+ const overridePath = join(cwd, defaultComposeOverrideFileName);
48
+ const envPath = join(cwd, envFileName);
49
+ const configPath = join(cwd, configDirectoryName);
50
+ const globalKmsPath = join(configPath, "kms.json");
51
+ await mkdir(configPath, { recursive: true, mode: 0o700 });
52
+ if (mode === "demo" && options.reset === true) {
53
+ await removeDemoProjectAssets(cwd);
54
+ }
55
+ if (!(await exists(composePath)) || options.force === true) {
56
+ await writeFile(composePath, await createComposeFile(), "utf8");
57
+ }
58
+ if (!(await exists(envPath)) || options.force === true) {
59
+ await writeFile(envPath, createComposeEnv({
60
+ mode,
61
+ imageTagOverride: options.imageTagOverride,
62
+ database: options.database,
63
+ storage: options.storage,
64
+ kms: options.kms,
65
+ publicUrl: options.publicUrl,
66
+ authClientId: options.authClientId,
67
+ authClientSecret: options.authClientSecret,
68
+ }), {
69
+ encoding: "utf8",
70
+ mode: 0o600,
71
+ });
72
+ }
73
+ if (!(await exists(globalKmsPath)) || options.force === true) {
74
+ await writeFile(globalKmsPath, createGlobalKmsConfig(options.kms ?? "db"), { encoding: "utf8", mode: 0o600 });
75
+ }
76
+ if (mode === "demo" || options.demoTenant === true) {
77
+ const demoConfigPath = join(cwd, demoConfigDirectory);
78
+ const hasExistingConfig = await hasFiles(demoConfigPath);
79
+ if (!hasExistingConfig ||
80
+ options.force === true ||
81
+ options.reset === true) {
82
+ await copyBundledDemoConfig(demoConfigPath, true);
83
+ }
84
+ }
85
+ if (options.noClient === true) {
86
+ await writeFile(overridePath, createNoClientComposeOverride(), "utf8");
87
+ }
88
+ else {
89
+ await removeIfExists(overridePath);
90
+ }
91
+ const composeFiles = [composeFileName];
92
+ if (options.noClient === true) {
93
+ composeFiles.push(defaultComposeOverrideFileName);
94
+ }
95
+ return {
96
+ target: "compose",
97
+ url: "http://localhost:3000",
98
+ clientUrl: options.noClient === true ? undefined : "http://localhost:4200",
99
+ composeFile: defaultComposeFileName,
100
+ composeFiles,
101
+ composeProfiles: composeProfiles(options),
102
+ envFile: envFileName,
103
+ projectName: mode === "demo" ? "eudiplo-demo" : "eudiplo",
104
+ projectDirectory: resolve(cwd),
105
+ };
106
+ }
107
+ async function ensureProjectDirectory(directory) {
108
+ try {
109
+ const entry = await stat(directory);
110
+ if (!entry.isDirectory()) {
111
+ throw new Error(`Project directory points to a file: ${directory}`);
112
+ }
113
+ }
114
+ catch (error) {
115
+ if (isNodeError(error) && error.code === "ENOENT") {
116
+ await mkdir(directory, { recursive: true, mode: 0o700 });
117
+ return;
118
+ }
119
+ throw error;
120
+ }
121
+ }
122
+ function composeProfiles(options) {
123
+ if (options.mode === "demo") {
124
+ return undefined;
125
+ }
126
+ const profiles = [];
127
+ if (options.database === "postgres") {
128
+ profiles.push("postgres");
129
+ }
130
+ if (options.storage === "s3") {
131
+ profiles.push("s3");
132
+ }
133
+ if (options.kms === "vault") {
134
+ profiles.push("vault");
135
+ }
136
+ return profiles.length > 0 ? profiles : undefined;
137
+ }
138
+ export async function demoProjectExists(cwd) {
139
+ return ((await exists(join(cwd, demoComposeFileName))) ||
140
+ (await exists(join(cwd, demoEnvFileName))) ||
141
+ (await exists(join(cwd, demoConfigDirectory))) ||
142
+ (await exists(join(cwd, ".eudiplo/demo-config"))));
143
+ }
144
+ async function removeDemoProjectAssets(cwd) {
145
+ await rm(join(cwd, demoComposeFileName), { force: true });
146
+ await rm(join(cwd, demoEnvFileName), { force: true });
147
+ await rm(join(cwd, defaultComposeOverrideFileName), { force: true });
148
+ await rm(join(cwd, demoConfigDirectory), { recursive: true, force: true });
149
+ await rm(join(cwd, ".eudiplo/demo-config"), {
150
+ recursive: true,
151
+ force: true,
152
+ });
153
+ }
154
+ export function unsupportedCommand(command, target) {
155
+ if (target === "external") {
156
+ return `${command} is not available for externally managed deployments`;
157
+ }
158
+ return `${command} is not available for ${target} deployments`;
159
+ }
160
+ async function runCompose(args, { instance, context }) {
161
+ const projectDirectory = instance.projectDirectory ?? context.cwd;
162
+ const composeArgs = ["compose"];
163
+ if (instance.envFile) {
164
+ composeArgs.push("--env-file", resolve(projectDirectory, instance.envFile));
165
+ }
166
+ for (const composeFile of getComposeFiles(instance)) {
167
+ composeArgs.push("-f", resolve(projectDirectory, composeFile));
168
+ }
169
+ for (const profile of instance.composeProfiles ?? []) {
170
+ composeArgs.push("--profile", profile);
171
+ }
172
+ if (instance.projectName) {
173
+ composeArgs.push("--project-name", instance.projectName);
174
+ }
175
+ composeArgs.push(...args);
176
+ const composeRuntime = await resolveComposeRuntime(context.env);
177
+ if (!composeRuntime) {
178
+ context.stderr.write("Docker or Podman was not found in a supported install location.\n");
179
+ return 1;
180
+ }
181
+ return new Promise((resolveProcess) => {
182
+ const child = spawn(composeRuntime.command, composeArgs, {
183
+ cwd: projectDirectory,
184
+ env: context.env,
185
+ stdio: "inherit",
186
+ });
187
+ child.on("error", (error) => {
188
+ context.stderr.write(`${error.message}\n`);
189
+ resolveProcess(1);
190
+ });
191
+ child.on("close", (code) => resolveProcess(code ?? 1));
192
+ });
193
+ }
194
+ export async function resolveComposeRuntime(env) {
195
+ const preferredRuntime = parsePreferredRuntime(env.EUDIPLO_CONTAINER_RUNTIME);
196
+ const candidates = preferredRuntime
197
+ ? [preferredRuntime]
198
+ : ["docker", "podman"];
199
+ for (const runtime of candidates) {
200
+ const command = await resolveRuntimeExecutable(runtime, env);
201
+ if (command) {
202
+ return { command, name: runtime };
203
+ }
204
+ }
205
+ return undefined;
206
+ }
207
+ function parsePreferredRuntime(value) {
208
+ if (!value) {
209
+ return undefined;
210
+ }
211
+ if (value === "docker" || value === "podman") {
212
+ return value;
213
+ }
214
+ throw new Error("EUDIPLO_CONTAINER_RUNTIME must be docker or podman.");
215
+ }
216
+ async function resolveRuntimeExecutable(runtime, env) {
217
+ for (const executablePath of runtimeExecutablePaths(runtime, env)) {
218
+ if (await exists(executablePath)) {
219
+ return executablePath;
220
+ }
221
+ }
222
+ return undefined;
223
+ }
224
+ function runtimeExecutablePaths(runtime, env) {
225
+ const pathCandidates = (env.PATH ?? "")
226
+ .split(delimiter)
227
+ .filter(Boolean)
228
+ .flatMap((pathEntry) => runtimePathCandidates(pathEntry, runtime, env));
229
+ if (process.platform === "win32") {
230
+ if (runtime === "docker") {
231
+ return [
232
+ String.raw `C:\Program Files\Docker\Docker\resources\bin\docker.exe`,
233
+ ...pathCandidates,
234
+ ];
235
+ }
236
+ return [
237
+ String.raw `C:\Program Files\RedHat\Podman\podman.exe`,
238
+ ...pathCandidates,
239
+ ];
240
+ }
241
+ return [
242
+ `/usr/local/bin/${runtime}`,
243
+ `/opt/homebrew/bin/${runtime}`,
244
+ `/usr/bin/${runtime}`,
245
+ ...pathCandidates,
246
+ ];
247
+ }
248
+ function runtimePathCandidates(pathEntry, runtime, env) {
249
+ if (process.platform !== "win32") {
250
+ return [join(pathEntry, runtime)];
251
+ }
252
+ const extensions = (env.PATHEXT ?? ".EXE;.CMD;.BAT;.COM")
253
+ .split(";")
254
+ .filter(Boolean);
255
+ return [
256
+ join(pathEntry, runtime),
257
+ ...extensions.map((ext) => join(pathEntry, `${runtime}${ext}`)),
258
+ ];
259
+ }
260
+ async function exists(path) {
261
+ try {
262
+ await access(path);
263
+ return true;
264
+ }
265
+ catch {
266
+ return false;
267
+ }
268
+ }
269
+ function isNodeError(error) {
270
+ return error instanceof Error && "code" in error;
271
+ }
272
+ function getComposeFiles(instance) {
273
+ return (instance.composeFiles ??
274
+ (instance.composeFile ? [instance.composeFile] : []));
275
+ }
276
+ async function removeIfExists(path) {
277
+ try {
278
+ await unlink(path);
279
+ }
280
+ catch (error) {
281
+ if (!(error instanceof Error) ||
282
+ !("code" in error) ||
283
+ error.code !== "ENOENT") {
284
+ throw error;
285
+ }
286
+ }
287
+ }
288
+ //# sourceMappingURL=deployment-drivers.js.map