@eudiplo/cli 7.1.1 → 7.2.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 (171) hide show
  1. package/README.md +190 -10
  2. package/dist/commands/config/index.d.ts +5 -0
  3. package/dist/commands/config/index.d.ts.map +1 -0
  4. package/dist/commands/config/index.js +15 -0
  5. package/dist/commands/config/index.js.map +1 -0
  6. package/dist/commands/config/tenant/action.d.ts +3 -0
  7. package/dist/commands/config/tenant/action.d.ts.map +1 -0
  8. package/dist/commands/config/tenant/action.js +298 -0
  9. package/dist/commands/config/tenant/action.js.map +1 -0
  10. package/dist/commands/config/tenant/index.d.ts +5 -0
  11. package/dist/commands/config/tenant/index.d.ts.map +1 -0
  12. package/dist/commands/config/tenant/index.js +61 -0
  13. package/dist/commands/config/tenant/index.js.map +1 -0
  14. package/dist/commands/config/validate/action.d.ts +4 -0
  15. package/dist/commands/config/validate/action.d.ts.map +1 -0
  16. package/dist/commands/config/validate/action.js +45 -0
  17. package/dist/commands/config/validate/action.js.map +1 -0
  18. package/dist/commands/config/validate/index.d.ts +5 -0
  19. package/dist/commands/config/validate/index.d.ts.map +1 -0
  20. package/dist/commands/config/validate/index.js +18 -0
  21. package/dist/commands/config/validate/index.js.map +1 -0
  22. package/dist/{config-validate → commands/config/validate}/registry.d.ts +1 -1
  23. package/dist/commands/config/validate/registry.d.ts.map +1 -0
  24. package/dist/{config-validate → commands/config/validate}/registry.js +1 -1
  25. package/dist/commands/config/validate/registry.js.map +1 -0
  26. package/dist/commands/config/validate/report.d.ts.map +1 -0
  27. package/dist/commands/config/validate/report.js.map +1 -0
  28. package/dist/commands/config/validate/schemas.d.ts.map +1 -0
  29. package/dist/{config-validate → commands/config/validate}/schemas.js +3 -3
  30. package/dist/commands/config/validate/schemas.js.map +1 -0
  31. package/dist/{config-validate → commands/config/validate}/types.d.ts +1 -1
  32. package/dist/commands/config/validate/types.d.ts.map +1 -0
  33. package/dist/commands/config/validate/types.js.map +1 -0
  34. package/dist/commands/config/validate/validator.d.ts.map +1 -0
  35. package/dist/{config-validate → commands/config/validate}/validator.js +4 -4
  36. package/dist/commands/config/validate/validator.js.map +1 -0
  37. package/dist/commands/demo/action.d.ts +3 -0
  38. package/dist/commands/demo/action.d.ts.map +1 -0
  39. package/dist/commands/demo/action.js +72 -0
  40. package/dist/commands/demo/action.js.map +1 -0
  41. package/dist/commands/demo/index.d.ts +5 -0
  42. package/dist/commands/demo/index.d.ts.map +1 -0
  43. package/dist/commands/demo/index.js +19 -0
  44. package/dist/commands/demo/index.js.map +1 -0
  45. package/dist/commands/deployment/action.d.ts +3 -0
  46. package/dist/commands/deployment/action.d.ts.map +1 -0
  47. package/dist/commands/deployment/action.js +16 -0
  48. package/dist/commands/deployment/action.js.map +1 -0
  49. package/dist/commands/deployment/index.d.ts +5 -0
  50. package/dist/commands/deployment/index.d.ts.map +1 -0
  51. package/dist/commands/deployment/index.js +19 -0
  52. package/dist/commands/deployment/index.js.map +1 -0
  53. package/dist/commands/doctor/action.d.ts +3 -0
  54. package/dist/commands/doctor/action.d.ts.map +1 -0
  55. package/dist/commands/doctor/action.js +12 -0
  56. package/dist/commands/doctor/action.js.map +1 -0
  57. package/dist/commands/doctor/index.d.ts +5 -0
  58. package/dist/commands/doctor/index.d.ts.map +1 -0
  59. package/dist/commands/doctor/index.js +13 -0
  60. package/dist/commands/doctor/index.js.map +1 -0
  61. package/dist/commands/init/action.d.ts +3 -0
  62. package/dist/commands/init/action.d.ts.map +1 -0
  63. package/dist/commands/init/action.js +242 -0
  64. package/dist/commands/init/action.js.map +1 -0
  65. package/dist/commands/init/index.d.ts +5 -0
  66. package/dist/commands/init/index.d.ts.map +1 -0
  67. package/dist/commands/init/index.js +35 -0
  68. package/dist/commands/init/index.js.map +1 -0
  69. package/dist/commands/instance/action.d.ts +3 -0
  70. package/dist/commands/instance/action.d.ts.map +1 -0
  71. package/dist/commands/instance/action.js +20 -0
  72. package/dist/commands/instance/action.js.map +1 -0
  73. package/dist/commands/instance/index.d.ts +5 -0
  74. package/dist/commands/instance/index.d.ts.map +1 -0
  75. package/dist/commands/instance/index.js +23 -0
  76. package/dist/commands/instance/index.js.map +1 -0
  77. package/dist/commands/shared.d.ts +14 -0
  78. package/dist/commands/shared.d.ts.map +1 -0
  79. package/dist/commands/shared.js +36 -0
  80. package/dist/commands/shared.js.map +1 -0
  81. package/dist/commands/status/action.d.ts +3 -0
  82. package/dist/commands/status/action.d.ts.map +1 -0
  83. package/dist/commands/status/action.js +13 -0
  84. package/dist/commands/status/action.js.map +1 -0
  85. package/dist/commands/status/index.d.ts +5 -0
  86. package/dist/commands/status/index.d.ts.map +1 -0
  87. package/dist/commands/status/index.js +13 -0
  88. package/dist/commands/status/index.js.map +1 -0
  89. package/dist/commands/version/action.d.ts +4 -0
  90. package/dist/commands/version/action.d.ts.map +1 -0
  91. package/dist/commands/version/action.js +68 -0
  92. package/dist/commands/version/action.js.map +1 -0
  93. package/dist/commands/version/index.d.ts +6 -0
  94. package/dist/commands/version/index.d.ts.map +1 -0
  95. package/dist/commands/version/index.js +12 -0
  96. package/dist/commands/version/index.js.map +1 -0
  97. package/dist/options.d.ts +2 -0
  98. package/dist/options.d.ts.map +1 -0
  99. package/dist/options.js +5 -0
  100. package/dist/options.js.map +1 -0
  101. package/dist/runtime.d.ts.map +1 -1
  102. package/dist/runtime.js +54 -465
  103. package/dist/runtime.js.map +1 -1
  104. package/dist/{config.d.ts → services/cli-config.d.ts} +2 -2
  105. package/dist/services/cli-config.d.ts.map +1 -0
  106. package/dist/{config.js → services/cli-config.js} +9 -4
  107. package/dist/services/cli-config.js.map +1 -0
  108. package/dist/{compose-template.d.ts → services/compose-project.d.ts} +14 -4
  109. package/dist/services/compose-project.d.ts.map +1 -0
  110. package/dist/services/compose-project.js +181 -0
  111. package/dist/services/compose-project.js.map +1 -0
  112. package/dist/{drivers.d.ts → services/deployment-drivers.d.ts} +9 -3
  113. package/dist/services/deployment-drivers.d.ts.map +1 -0
  114. package/dist/{drivers.js → services/deployment-drivers.js} +66 -11
  115. package/dist/services/deployment-drivers.js.map +1 -0
  116. package/dist/services/deployment-target.d.ts +3 -0
  117. package/dist/services/deployment-target.d.ts.map +1 -0
  118. package/dist/services/deployment-target.js +7 -0
  119. package/dist/services/deployment-target.js.map +1 -0
  120. package/dist/{doctor.d.ts → services/diagnostics.d.ts} +2 -2
  121. package/dist/services/diagnostics.d.ts.map +1 -0
  122. package/dist/{doctor.js → services/diagnostics.js} +1 -1
  123. package/dist/services/diagnostics.js.map +1 -0
  124. package/dist/services/instance-selection.d.ts +3 -0
  125. package/dist/services/instance-selection.d.ts.map +1 -0
  126. package/dist/services/instance-selection.js +13 -0
  127. package/dist/services/instance-selection.js.map +1 -0
  128. package/dist/services/project-directory.d.ts +3 -0
  129. package/dist/services/project-directory.d.ts.map +1 -0
  130. package/dist/services/project-directory.js +14 -0
  131. package/dist/services/project-directory.js.map +1 -0
  132. package/dist/types.d.ts +4 -0
  133. package/dist/types.d.ts.map +1 -1
  134. package/package.json +5 -4
  135. package/templates/docker-compose.yml +5 -4
  136. package/templates/schemas/CreateClientDto.schema.json +1 -0
  137. package/templates/schemas/CredentialConfigCreate.schema.json +55 -0
  138. package/templates/schemas/IssuanceConfig.schema.json +26 -6
  139. package/dist/args.d.ts +0 -4
  140. package/dist/args.d.ts.map +0 -1
  141. package/dist/args.js +0 -46
  142. package/dist/args.js.map +0 -1
  143. package/dist/compose-template.d.ts.map +0 -1
  144. package/dist/compose-template.js +0 -105
  145. package/dist/compose-template.js.map +0 -1
  146. package/dist/config-validate/index.d.ts +0 -4
  147. package/dist/config-validate/index.d.ts.map +0 -1
  148. package/dist/config-validate/index.js +0 -4
  149. package/dist/config-validate/index.js.map +0 -1
  150. package/dist/config-validate/registry.d.ts.map +0 -1
  151. package/dist/config-validate/registry.js.map +0 -1
  152. package/dist/config-validate/report.d.ts.map +0 -1
  153. package/dist/config-validate/report.js.map +0 -1
  154. package/dist/config-validate/schemas.d.ts.map +0 -1
  155. package/dist/config-validate/schemas.js.map +0 -1
  156. package/dist/config-validate/types.d.ts.map +0 -1
  157. package/dist/config-validate/types.js.map +0 -1
  158. package/dist/config-validate/validator.d.ts.map +0 -1
  159. package/dist/config-validate/validator.js.map +0 -1
  160. package/dist/config.d.ts.map +0 -1
  161. package/dist/config.js.map +0 -1
  162. package/dist/doctor.d.ts.map +0 -1
  163. package/dist/doctor.js.map +0 -1
  164. package/dist/drivers.d.ts.map +0 -1
  165. package/dist/drivers.js.map +0 -1
  166. /package/dist/{config-validate → commands/config/validate}/registry.json +0 -0
  167. /package/dist/{config-validate → commands/config/validate}/report.d.ts +0 -0
  168. /package/dist/{config-validate → commands/config/validate}/report.js +0 -0
  169. /package/dist/{config-validate → commands/config/validate}/schemas.d.ts +0 -0
  170. /package/dist/{config-validate → commands/config/validate}/types.js +0 -0
  171. /package/dist/{config-validate → commands/config/validate}/validator.d.ts +0 -0
@@ -0,0 +1,242 @@
1
+ import { randomBytes } from "node:crypto";
2
+ import { readStringFlag } from "../../options.js";
3
+ import { saveConfig, upsertInstance } from "../../services/cli-config.js";
4
+ import { drivers, ensureComposeProject } from "../../services/deployment-drivers.js";
5
+ import { parseTarget } from "../../services/deployment-target.js";
6
+ import { resolveProjectDirectory } from "../../services/project-directory.js";
7
+ import { createPrompter } from "../shared.js";
8
+ export async function runInit(configPath, config, parsed, context) {
9
+ const target = parseTarget(readStringFlag(parsed.flags, "target") ?? "compose");
10
+ const name = readStringFlag(parsed.flags, "instance") ?? "local";
11
+ const url = readStringFlag(parsed.flags, "url");
12
+ const useDemoMode = parsed.flags.demo === true;
13
+ const force = parsed.flags.force === true;
14
+ const imageTagOverride = readStringFlag(parsed.flags, "image-tag") ?? context.env.EUDIPLO_IMAGE_TAG;
15
+ if (target === "compose") {
16
+ const shouldPrompt = shouldOpenWizard(parsed, context);
17
+ const prompter = createPrompter(context);
18
+ let projectDirectory;
19
+ let initOptions;
20
+ try {
21
+ const directoryAnswer = shouldPrompt && !hasProjectDirectory(parsed)
22
+ ? await prompter.ask("Project directory [./]: ")
23
+ : undefined;
24
+ projectDirectory = resolveProjectDirectory(parsed, context, directoryAnswer?.trim() || undefined);
25
+ initOptions = useDemoMode
26
+ ? demoInitOptions(parsed)
27
+ : await resolveComposeInitOptions(parsed, prompter, shouldPrompt);
28
+ }
29
+ finally {
30
+ prompter.close();
31
+ }
32
+ const instance = await ensureComposeProject(projectDirectory, {
33
+ mode: useDemoMode ? "demo" : "standard",
34
+ ...initOptions,
35
+ force,
36
+ imageTagOverride,
37
+ });
38
+ const nextConfig = upsertInstance(config, name, {
39
+ ...instance,
40
+ url: url ?? initOptions.publicUrl,
41
+ });
42
+ await saveConfig(configPath, nextConfig);
43
+ context.stdout.write(`Initialized compose instance ${name}.\n`);
44
+ context.stdout.write(`Configuration: database=${initOptions.database}, storage=${initOptions.storage}, kms=${initOptions.kms}, client=${initOptions.noClient ? "disabled" : "enabled"}, demo-tenant=${initOptions.demoTenant ? "included" : "disabled"}\n`);
45
+ context.stdout.write(`Project directory: ${projectDirectory}\n`);
46
+ context.stdout.write(`Environment: ${projectDirectory}/${instance.envFile}\n`);
47
+ context.stdout.write(`Auth client ID: ${initOptions.authClientId}\n`);
48
+ context.stdout.write("Auth client secret: saved in the environment file\n");
49
+ if (initOptions.demoTenant && initOptions.kms === "vault") {
50
+ context.stdout.write("Note: bundled demo private keys explicitly use the db provider; Vault remains the default for new keys.\n");
51
+ }
52
+ if (initOptions.start) {
53
+ context.stdout.write("Starting EUDIPLO with Docker Compose...\n");
54
+ return ((await drivers.compose.up?.({
55
+ instanceName: name,
56
+ instance: nextConfig.instances[name],
57
+ args: [],
58
+ context,
59
+ })) ?? 1);
60
+ }
61
+ context.stdout.write("Run npx @eudiplo/cli up to start it.\n");
62
+ return 0;
63
+ }
64
+ if (parsed.subject || readStringFlag(parsed.flags, "directory")) {
65
+ throw new Error("Project directories are available only for compose instances.");
66
+ }
67
+ if (!url) {
68
+ throw new Error("External instances require --url.");
69
+ }
70
+ const nextConfig = upsertInstance(config, name, { target, url });
71
+ await saveConfig(configPath, nextConfig);
72
+ context.stdout.write(`Initialized external instance ${name}.\n`);
73
+ return 0;
74
+ }
75
+ function demoInitOptions(parsed) {
76
+ if (parsed.flags.client === true && parsed.flags["no-client"] === true) {
77
+ throw new Error("Use either --client or --no-client, not both.");
78
+ }
79
+ return {
80
+ database: "sqlite",
81
+ storage: "local",
82
+ kms: "db",
83
+ publicUrl: "http://localhost:3000",
84
+ authClientId: "root",
85
+ authClientSecret: "root",
86
+ demoTenant: true,
87
+ noClient: parsed.flags["no-client"] === true,
88
+ start: parsed.flags.start === true,
89
+ };
90
+ }
91
+ async function resolveComposeInitOptions(parsed, prompter, shouldPrompt) {
92
+ if (parsed.flags.client === true && parsed.flags["no-client"] === true) {
93
+ throw new Error("Use either --client or --no-client, not both.");
94
+ }
95
+ if (parsed.flags["demo-tenant"] === true &&
96
+ parsed.flags["no-demo-tenant"] === true) {
97
+ throw new Error("Use either --demo-tenant or --no-demo-tenant, not both.");
98
+ }
99
+ const presetFlag = readChoiceFlag(parsed, "preset", ["minimal", "standard", "full"]);
100
+ let database = readChoiceFlag(parsed, "database", ["sqlite", "postgres"]);
101
+ let storage = readChoiceFlag(parsed, "storage", ["local", "s3"]);
102
+ let kms = readChoiceFlag(parsed, "kms", ["db", "vault"]);
103
+ let publicUrl = readStringFlag(parsed.flags, "public-url");
104
+ let authClientId = readStringFlag(parsed.flags, "auth-client-id");
105
+ let authClientSecret = readStringFlag(parsed.flags, "auth-client-secret");
106
+ let demoTenant = parsed.flags["demo-tenant"] === true ? true : undefined;
107
+ if (parsed.flags["no-demo-tenant"] === true) {
108
+ demoTenant = false;
109
+ }
110
+ let noClient = parsed.flags["no-client"] === true ? true : undefined;
111
+ if (parsed.flags.client === true) {
112
+ noClient = false;
113
+ }
114
+ let start = parsed.flags.start === true ? true : undefined;
115
+ const hasComponentFlag = database !== undefined || storage !== undefined || kms !== undefined;
116
+ let preset = presetFlag;
117
+ if (shouldPrompt && !preset && !hasComponentFlag) {
118
+ const answer = (await prompter.ask("Deployment preset (minimal/standard/full/custom) [minimal]: "))
119
+ .trim()
120
+ .toLowerCase();
121
+ if (answer && answer !== "custom") {
122
+ preset = parseChoice(answer, "preset", ["minimal", "standard", "full"]);
123
+ }
124
+ }
125
+ const presetOptions = presetValues(preset ?? "minimal");
126
+ if (shouldPrompt && !preset) {
127
+ database ??= await promptChoice(prompter.ask, "Database", ["sqlite", "postgres"], "sqlite");
128
+ storage ??= await promptChoice(prompter.ask, "Storage", ["local", "s3"], "local");
129
+ kms ??= await promptChoice(prompter.ask, "Key management", ["db", "vault"], "db");
130
+ }
131
+ database ??= presetOptions.database;
132
+ storage ??= presetOptions.storage;
133
+ kms ??= presetOptions.kms;
134
+ if (shouldPrompt && demoTenant === undefined) {
135
+ demoTenant = await promptBoolean(prompter.ask, "Add the bundled demo tenant? Its private keys use the db provider.", false);
136
+ }
137
+ demoTenant ??= false;
138
+ if (shouldPrompt && !publicUrl) {
139
+ publicUrl = await promptWithDefault(prompter.ask, "Public URL", "http://localhost:3000");
140
+ }
141
+ publicUrl ??= "http://localhost:3000";
142
+ if (shouldPrompt && !authClientId) {
143
+ authClientId = await promptWithDefault(prompter.ask, "Auth client ID", "root");
144
+ }
145
+ authClientId ??= "root";
146
+ if (shouldPrompt && !authClientSecret) {
147
+ const answer = await prompter.ask("Auth client secret (leave blank to generate): ");
148
+ authClientSecret = answer.trim() || undefined;
149
+ }
150
+ authClientSecret ??= randomBytes(24).toString("base64url");
151
+ if (shouldPrompt && noClient === undefined) {
152
+ noClient = !(await promptBoolean(prompter.ask, "Include the web client?", true));
153
+ }
154
+ noClient ??= false;
155
+ if (shouldPrompt && start === undefined) {
156
+ start = await promptBoolean(prompter.ask, "Start the deployment now?", true);
157
+ }
158
+ start ??= false;
159
+ validateHttpUrl(publicUrl, "Public URL");
160
+ validateEnvInput(publicUrl, "Public URL");
161
+ validateEnvInput(authClientId, "Auth client ID");
162
+ validateEnvInput(authClientSecret, "Auth client secret");
163
+ return {
164
+ database,
165
+ storage,
166
+ kms,
167
+ publicUrl,
168
+ authClientId,
169
+ authClientSecret,
170
+ demoTenant,
171
+ noClient,
172
+ start,
173
+ };
174
+ }
175
+ function shouldOpenWizard(parsed, context) {
176
+ return (context.interactive === true &&
177
+ parsed.flags.yes !== true &&
178
+ parsed.flags["no-interactive"] !== true);
179
+ }
180
+ function hasProjectDirectory(parsed) {
181
+ return Boolean(parsed.subject || readStringFlag(parsed.flags, "directory"));
182
+ }
183
+ function presetValues(preset) {
184
+ if (preset === "standard") {
185
+ return { database: "postgres", storage: "s3", kms: "db" };
186
+ }
187
+ if (preset === "full") {
188
+ return { database: "postgres", storage: "s3", kms: "vault" };
189
+ }
190
+ return { database: "sqlite", storage: "local", kms: "db" };
191
+ }
192
+ function readChoiceFlag(parsed, name, values) {
193
+ const value = readStringFlag(parsed.flags, name);
194
+ return value ? parseChoice(value, name, values) : undefined;
195
+ }
196
+ function parseChoice(value, name, values) {
197
+ if (values.includes(value)) {
198
+ return value;
199
+ }
200
+ throw new Error(`Unsupported --${name} value: ${value}. Use ${values.join(" or ")}.`);
201
+ }
202
+ async function promptChoice(prompt, label, values, defaultValue) {
203
+ const answer = (await prompt(`${label} (${values.join("/")}) [${defaultValue}]: `))
204
+ .trim()
205
+ .toLowerCase();
206
+ return answer ? parseChoice(answer, label.toLowerCase(), values) : defaultValue;
207
+ }
208
+ async function promptWithDefault(prompt, label, defaultValue) {
209
+ const answer = (await prompt(`${label} [${defaultValue}]: `)).trim();
210
+ return answer || defaultValue;
211
+ }
212
+ async function promptBoolean(prompt, label, defaultValue) {
213
+ const suffix = defaultValue ? "Y/n" : "y/N";
214
+ const answer = (await prompt(`${label} [${suffix}]: `)).trim().toLowerCase();
215
+ if (!answer) {
216
+ return defaultValue;
217
+ }
218
+ if (answer === "y" || answer === "yes") {
219
+ return true;
220
+ }
221
+ if (answer === "n" || answer === "no") {
222
+ return false;
223
+ }
224
+ throw new Error(`Answer ${label.toLowerCase()} with yes or no.`);
225
+ }
226
+ function validateHttpUrl(value, label) {
227
+ try {
228
+ const url = new URL(value);
229
+ if (url.protocol !== "http:" && url.protocol !== "https:") {
230
+ throw new Error("Unsupported URL protocol.");
231
+ }
232
+ }
233
+ catch {
234
+ throw new Error(`${label} must be an absolute HTTP(S) URL.`);
235
+ }
236
+ }
237
+ function validateEnvInput(value, label) {
238
+ if (!value || /[\r\n]/.test(value)) {
239
+ throw new Error(`${label} must be non-empty and cannot contain line breaks.`);
240
+ }
241
+ }
242
+ //# sourceMappingURL=action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action.js","sourceRoot":"","sources":["../../../src/commands/init/action.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { Command } from "commander";
2
+ import type { CommandContext } from "../../types.js";
3
+ import { type SetExitCode } from "../shared.js";
4
+ export declare function createInitCommand(context: CommandContext, setExitCode: SetExitCode): Command;
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/init/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAA4B,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAG1E,wBAAgB,iBAAiB,CAC7B,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE,WAAW,GACzB,OAAO,CAqCT"}
@@ -0,0 +1,35 @@
1
+ import { Command, Option } from "commander";
2
+ import { loadCliState, parsedArgs } from "../shared.js";
3
+ import { runInit } from "./action.js";
4
+ export function createInitCommand(context, setExitCode) {
5
+ return new Command("init")
6
+ .description("Configure a local deployment")
7
+ .argument("[directory]", "project directory")
8
+ .option("--directory <path>", "set the project directory")
9
+ .option("--target <compose|external>", "deployment target")
10
+ .option("--instance <name>", "instance name", "local")
11
+ .option("--preset <minimal|standard|full>", "deployment preset")
12
+ .option("--database <sqlite|postgres>", "database")
13
+ .option("--storage <local|s3>", "storage")
14
+ .option("--kms <db|vault>", "key management")
15
+ .option("--public-url <url>", "public EUDIPLO URL")
16
+ .option("--auth-client-id <id>", "authentication client ID")
17
+ .option("--auth-client-secret <secret>", "authentication client secret")
18
+ .option("--demo-tenant", "include the bundled demo tenant")
19
+ .option("--no-demo-tenant", "do not include the bundled demo tenant")
20
+ .option("--client", "include the web client")
21
+ .option("--no-client", "omit the web client")
22
+ .addOption(new Option("--interactive").hideHelp())
23
+ .option("--no-interactive", "disable the setup wizard")
24
+ .option("--start", "start the deployment after initialization")
25
+ .option("--yes", "accept defaults without opening the wizard")
26
+ .option("--image-tag <tag>", "override the backend and client image tag")
27
+ .option("--demo", "generate demo-compatible assets without starting them")
28
+ .option("--force", "replace CLI-managed files")
29
+ .option("--url <url>", "override the instance API URL")
30
+ .action(async (directory, options) => {
31
+ const { configPath, config } = await loadCliState(context);
32
+ setExitCode(await runInit(configPath, config, parsedArgs("init", directory, [], options), context));
33
+ });
34
+ }
35
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/init/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAE5C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAoB,MAAM,cAAc,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,UAAU,iBAAiB,CAC7B,OAAuB,EACvB,WAAwB;IAExB,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;SACrB,WAAW,CAAC,8BAA8B,CAAC;SAC3C,QAAQ,CAAC,aAAa,EAAE,mBAAmB,CAAC;SAC5C,MAAM,CAAC,oBAAoB,EAAE,2BAA2B,CAAC;SACzD,MAAM,CAAC,6BAA6B,EAAE,mBAAmB,CAAC;SAC1D,MAAM,CAAC,mBAAmB,EAAE,eAAe,EAAE,OAAO,CAAC;SACrD,MAAM,CAAC,kCAAkC,EAAE,mBAAmB,CAAC;SAC/D,MAAM,CAAC,8BAA8B,EAAE,UAAU,CAAC;SAClD,MAAM,CAAC,sBAAsB,EAAE,SAAS,CAAC;SACzC,MAAM,CAAC,kBAAkB,EAAE,gBAAgB,CAAC;SAC5C,MAAM,CAAC,oBAAoB,EAAE,oBAAoB,CAAC;SAClD,MAAM,CAAC,uBAAuB,EAAE,0BAA0B,CAAC;SAC3D,MAAM,CAAC,+BAA+B,EAAE,8BAA8B,CAAC;SACvE,MAAM,CAAC,eAAe,EAAE,iCAAiC,CAAC;SAC1D,MAAM,CAAC,kBAAkB,EAAE,wCAAwC,CAAC;SACpE,MAAM,CAAC,UAAU,EAAE,wBAAwB,CAAC;SAC5C,MAAM,CAAC,aAAa,EAAE,qBAAqB,CAAC;SAC5C,SAAS,CAAC,IAAI,MAAM,CAAC,eAAe,CAAC,CAAC,QAAQ,EAAE,CAAC;SACjD,MAAM,CAAC,kBAAkB,EAAE,0BAA0B,CAAC;SACtD,MAAM,CAAC,SAAS,EAAE,2CAA2C,CAAC;SAC9D,MAAM,CAAC,OAAO,EAAE,4CAA4C,CAAC;SAC7D,MAAM,CAAC,mBAAmB,EAAE,2CAA2C,CAAC;SACxE,MAAM,CAAC,QAAQ,EAAE,uDAAuD,CAAC;SACzE,MAAM,CAAC,SAAS,EAAE,2BAA2B,CAAC;SAC9C,MAAM,CAAC,aAAa,EAAE,+BAA+B,CAAC;SACtD,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE;QACjC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;QAC3D,WAAW,CACP,MAAM,OAAO,CACT,UAAU,EACV,MAAM,EACN,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,CAAC,EAC1C,OAAO,CACV,CACJ,CAAC;IACN,CAAC,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CliConfig, CommandContext, ParsedArgs } from "../../types.js";
2
+ export declare function runInstanceAdd(configPath: string, config: CliConfig, parsed: ParsedArgs, context: CommandContext): Promise<number>;
3
+ //# sourceMappingURL=action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../../src/commands/instance/action.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5E,wBAAsB,cAAc,CAChC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,cAAc,GACxB,OAAO,CAAC,MAAM,CAAC,CAiBjB"}
@@ -0,0 +1,20 @@
1
+ import { readStringFlag } from "../../options.js";
2
+ import { saveConfig, upsertInstance } from "../../services/cli-config.js";
3
+ import { parseTarget } from "../../services/deployment-target.js";
4
+ export async function runInstanceAdd(configPath, config, parsed, context) {
5
+ const name = parsed.positionals[0];
6
+ if (!name) {
7
+ throw new Error("Instance name is required.");
8
+ }
9
+ const url = readStringFlag(parsed.flags, "url");
10
+ if (!url) {
11
+ throw new Error("--url is required.");
12
+ }
13
+ const target = parseTarget(readStringFlag(parsed.flags, "target") ?? "external");
14
+ const clientUrl = readStringFlag(parsed.flags, "client-url");
15
+ const nextConfig = upsertInstance(config, name, { target, url, clientUrl });
16
+ await saveConfig(configPath, nextConfig);
17
+ context.stdout.write(`Added ${target} instance ${name}.\n`);
18
+ return 0;
19
+ }
20
+ //# sourceMappingURL=action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action.js","sourceRoot":"","sources":["../../../src/commands/instance/action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAGlE,MAAM,CAAC,KAAK,UAAU,cAAc,CAChC,UAAkB,EAClB,MAAiB,EACjB,MAAkB,EAClB,OAAuB;IAEvB,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,GAAG,GAAG,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAChD,IAAI,CAAC,GAAG,EAAE,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,MAAM,GAAG,WAAW,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,UAAU,CAAC,CAAC;IACjF,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IAC7D,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;IAC5E,MAAM,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACzC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,MAAM,aAAa,IAAI,KAAK,CAAC,CAAC;IAC5D,OAAO,CAAC,CAAC;AACb,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { Command } from "commander";
2
+ import type { CommandContext } from "../../types.js";
3
+ import { type SetExitCode } from "../shared.js";
4
+ export declare function createInstanceCommand(context: CommandContext, setExitCode: SetExitCode): Command;
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/instance/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAA4B,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAG1E,wBAAgB,qBAAqB,CACjC,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE,WAAW,GACzB,OAAO,CAyBT"}
@@ -0,0 +1,23 @@
1
+ import { Command } from "commander";
2
+ import { loadCliState, parsedArgs } from "../shared.js";
3
+ import { runInstanceAdd } from "./action.js";
4
+ export function createInstanceCommand(context, setExitCode) {
5
+ const instance = new Command("instance")
6
+ .description("Manage configured EUDIPLO instances")
7
+ .helpCommand(true);
8
+ instance
9
+ .command("add <name>")
10
+ .description("Register an existing EUDIPLO deployment")
11
+ .requiredOption("--url <url>", "EUDIPLO API URL")
12
+ .option("--target <compose|external>", "deployment target", "external")
13
+ .option("--client-url <url>", "optional web client URL")
14
+ .action(async (name, options) => {
15
+ const { configPath, config } = await loadCliState(context);
16
+ setExitCode(await runInstanceAdd(configPath, config, parsedArgs("instance", "add", [name], options), context));
17
+ });
18
+ instance.action(function showInstanceHelp() {
19
+ this.outputHelp();
20
+ });
21
+ return instance;
22
+ }
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/instance/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAoB,MAAM,cAAc,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,UAAU,qBAAqB,CACjC,OAAuB,EACvB,WAAwB;IAExB,MAAM,QAAQ,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;SACnC,WAAW,CAAC,qCAAqC,CAAC;SAClD,WAAW,CAAC,IAAI,CAAC,CAAC;IACvB,QAAQ;SACH,OAAO,CAAC,YAAY,CAAC;SACrB,WAAW,CAAC,yCAAyC,CAAC;SACtD,cAAc,CAAC,aAAa,EAAE,iBAAiB,CAAC;SAChD,MAAM,CAAC,6BAA6B,EAAE,mBAAmB,EAAE,UAAU,CAAC;SACtE,MAAM,CAAC,oBAAoB,EAAE,yBAAyB,CAAC;SACvD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;QAC5B,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;QAC3D,WAAW,CACP,MAAM,cAAc,CAChB,UAAU,EACV,MAAM,EACN,UAAU,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,EAC9C,OAAO,CACV,CACJ,CAAC;IACN,CAAC,CAAC,CAAC;IACP,QAAQ,CAAC,MAAM,CAAC,SAAS,gBAAgB;QACrC,IAAI,CAAC,UAAU,EAAE,CAAC;IACtB,CAAC,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC;AACpB,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { OptionValues } from "commander";
2
+ import type { CliConfig, CommandContext, ParsedArgs } from "../types.js";
3
+ export type SetExitCode = (exitCode: number) => void;
4
+ export interface Prompter {
5
+ ask(question: string): Promise<string>;
6
+ close(): void;
7
+ }
8
+ export declare function createPrompter(context: CommandContext): Prompter;
9
+ export declare function loadCliState(context: CommandContext): Promise<{
10
+ configPath: string;
11
+ config: CliConfig;
12
+ }>;
13
+ export declare function parsedArgs(command: string, subject: string | undefined, positionals: string[], options: OptionValues): ParsedArgs;
14
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/commands/shared.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE9C,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzE,MAAM,MAAM,WAAW,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;AAErD,MAAM,WAAW,QAAQ;IACrB,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACvC,KAAK,IAAI,IAAI,CAAC;CACjB;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,QAAQ,CAahE;AAED,wBAAsB,YAAY,CAC9B,OAAO,EAAE,cAAc,GACxB,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,CAAA;CAAE,CAAC,CAGpD;AAED,wBAAgB,UAAU,CACtB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,WAAW,EAAE,MAAM,EAAE,EACrB,OAAO,EAAE,YAAY,GACtB,UAAU,CAcZ"}
@@ -0,0 +1,36 @@
1
+ import { createInterface } from "node:readline/promises";
2
+ import { loadConfig, resolveConfigPath } from "../services/cli-config.js";
3
+ export function createPrompter(context) {
4
+ let promptInterface;
5
+ return {
6
+ ask: async (question) => {
7
+ if (context.prompt) {
8
+ return context.prompt(question);
9
+ }
10
+ promptInterface ??= createInterface({ input: process.stdin, output: process.stdout });
11
+ return promptInterface.question(question);
12
+ },
13
+ close: () => promptInterface?.close(),
14
+ };
15
+ }
16
+ export async function loadCliState(context) {
17
+ const configPath = resolveConfigPath(context.env);
18
+ return { configPath, config: await loadConfig(configPath) };
19
+ }
20
+ export function parsedArgs(command, subject, positionals, options) {
21
+ const flags = {};
22
+ for (const [name, value] of Object.entries(options)) {
23
+ if (value === undefined) {
24
+ continue;
25
+ }
26
+ const flagName = name.replace(/[A-Z]/g, (character) => `-${character.toLowerCase()}`);
27
+ if (value === false) {
28
+ flags[`no-${flagName}`] = true;
29
+ }
30
+ else if (typeof value === "string" || typeof value === "boolean") {
31
+ flags[flagName] = value;
32
+ }
33
+ }
34
+ return { command, subject, positionals, flags };
35
+ }
36
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/commands/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAU1E,MAAM,UAAU,cAAc,CAAC,OAAuB;IAClD,IAAI,eAA+D,CAAC;IAEpE,OAAO;QACH,GAAG,EAAE,KAAK,EAAE,QAAgB,EAAE,EAAE;YAC5B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACjB,OAAO,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACpC,CAAC;YACD,eAAe,KAAK,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YACtF,OAAO,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC9C,CAAC;QACD,KAAK,EAAE,GAAG,EAAE,CAAC,eAAe,EAAE,KAAK,EAAE;KACxC,CAAC;AACN,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAC9B,OAAuB;IAEvB,MAAM,UAAU,GAAG,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAClD,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,UAAU,CACtB,OAAe,EACf,OAA2B,EAC3B,WAAqB,EACrB,OAAqB;IAErB,MAAM,KAAK,GAAqC,EAAE,CAAC;IACnD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAClD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACtB,SAAS;QACb,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QACtF,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;YAClB,KAAK,CAAC,MAAM,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC;QACnC,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;YACjE,KAAK,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;QAC5B,CAAC;IACL,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;AACpD,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CliConfig, CommandContext, ParsedArgs } from "../../types.js";
2
+ export declare function runStatusCommand(config: CliConfig, parsed: ParsedArgs, context: CommandContext): Promise<number>;
3
+ //# sourceMappingURL=action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../../src/commands/status/action.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5E,wBAAsB,gBAAgB,CAClC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,cAAc,GACxB,OAAO,CAAC,MAAM,CAAC,CASjB"}
@@ -0,0 +1,13 @@
1
+ import { runDoctor } from "../../services/diagnostics.js";
2
+ import { resolveInstance } from "../../services/instance-selection.js";
3
+ export async function runStatusCommand(config, parsed, context) {
4
+ const [instanceName, instance] = resolveInstance(config, parsed);
5
+ const checks = await runDoctor(instance, context, []);
6
+ const health = checks.find((check) => check.name === "health endpoint");
7
+ context.stdout.write(`${instanceName} (${instance.target}) ${instance.url}\n`);
8
+ if (health) {
9
+ context.stdout.write(`${health.status.toUpperCase()} ${health.message}\n`);
10
+ }
11
+ return health?.status === "fail" ? 1 : 0;
12
+ }
13
+ //# sourceMappingURL=action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action.js","sourceRoot":"","sources":["../../../src/commands/status/action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAGvE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAClC,MAAiB,EACjB,MAAkB,EAClB,OAAuB;IAEvB,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjE,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,iBAAiB,CAAC,CAAC;IACxE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;IAC/E,IAAI,MAAM,EAAE,CAAC;QACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { Command } from "commander";
2
+ import type { CommandContext } from "../../types.js";
3
+ import { type SetExitCode } from "../shared.js";
4
+ export declare function createStatusCommand(context: CommandContext, setExitCode: SetExitCode): Command;
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/status/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAA4B,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAG1E,wBAAgB,mBAAmB,CAC/B,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE,WAAW,GACzB,OAAO,CAcT"}
@@ -0,0 +1,13 @@
1
+ import { Command } from "commander";
2
+ import { loadCliState, parsedArgs } from "../shared.js";
3
+ import { runStatusCommand } from "./action.js";
4
+ export function createStatusCommand(context, setExitCode) {
5
+ return new Command("status")
6
+ .description("Print the selected instance status")
7
+ .option("--instance <name>", "select a configured instance")
8
+ .action(async (options) => {
9
+ const { config } = await loadCliState(context);
10
+ setExitCode(await runStatusCommand(config, parsedArgs("status", undefined, [], options), context));
11
+ });
12
+ }
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/status/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAoB,MAAM,cAAc,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,UAAU,mBAAmB,CAC/B,OAAuB,EACvB,WAAwB;IAExB,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC;SACvB,WAAW,CAAC,oCAAoC,CAAC;SACjD,MAAM,CAAC,mBAAmB,EAAE,8BAA8B,CAAC;SAC3D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACtB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;QAC/C,WAAW,CACP,MAAM,gBAAgB,CAClB,MAAM,EACN,UAAU,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,CAAC,EAC5C,OAAO,CACV,CACJ,CAAC;IACN,CAAC,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { CommandContext } from "../../types.js";
2
+ export declare function versionText(): string;
3
+ export declare function versionStatusText(context: CommandContext): Promise<string>;
4
+ //# sourceMappingURL=action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../../src/commands/version/action.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGrD,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAoBhF"}
@@ -0,0 +1,68 @@
1
+ import { isSea } from "node:sea";
2
+ import packageJson from "../../../package.json" with { type: "json" };
3
+ export function versionText() {
4
+ return `${packageJson.name} ${packageJson.version}`;
5
+ }
6
+ export async function versionStatusText(context) {
7
+ const currentVersion = packageJson.version;
8
+ const lines = [versionText()];
9
+ try {
10
+ const latestVersion = await fetchLatestVersion(context);
11
+ lines.push(`latest ${latestVersion}`);
12
+ const comparison = compareSemver(currentVersion, latestVersion);
13
+ if (comparison < 0) {
14
+ lines.push(`update available: ${updateCommand(context)}`);
15
+ }
16
+ else if (comparison === 0) {
17
+ lines.push("up to date");
18
+ }
19
+ else {
20
+ lines.push("newer than the latest published version");
21
+ }
22
+ }
23
+ catch (error) {
24
+ lines.push(`latest unavailable: ${error instanceof Error ? error.message : String(error)}`);
25
+ }
26
+ return lines.join("\n");
27
+ }
28
+ function updateCommand(context) {
29
+ const installationMethod = context.installationMethod ?? (isSea() ? "standalone" : "npm");
30
+ return installationMethod === "standalone"
31
+ ? "curl -fsSL https://eudiplo.dev/install.sh | bash"
32
+ : "npm install -g @eudiplo/cli@latest";
33
+ }
34
+ async function fetchLatestVersion(context) {
35
+ const response = await context.fetch(`https://registry.npmjs.org/${encodeURIComponent(packageJson.name)}/latest`);
36
+ if (!response.ok) {
37
+ throw new Error(`npm registry returned HTTP ${response.status}`);
38
+ }
39
+ const metadata = await response.json();
40
+ if (!isPackageMetadata(metadata)) {
41
+ throw new Error("npm registry response did not include a version");
42
+ }
43
+ return metadata.version;
44
+ }
45
+ function isPackageMetadata(value) {
46
+ return (typeof value === "object" &&
47
+ value !== null &&
48
+ "version" in value &&
49
+ typeof value.version === "string");
50
+ }
51
+ function compareSemver(left, right) {
52
+ const leftParts = parseSemver(left);
53
+ const rightParts = parseSemver(right);
54
+ for (let index = 0; index < leftParts.length; index += 1) {
55
+ if (leftParts[index] > rightParts[index]) {
56
+ return 1;
57
+ }
58
+ if (leftParts[index] < rightParts[index]) {
59
+ return -1;
60
+ }
61
+ }
62
+ return 0;
63
+ }
64
+ function parseSemver(version) {
65
+ const [major = "0", minor = "0", patch = "0"] = version.split("-", 1)[0].split(".");
66
+ return [Number(major) || 0, Number(minor) || 0, Number(patch) || 0];
67
+ }
68
+ //# sourceMappingURL=action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action.js","sourceRoot":"","sources":["../../../src/commands/version/action.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { Command } from "commander";
2
+ import type { CommandContext } from "../../types.js";
3
+ import type { SetExitCode } from "../shared.js";
4
+ export { versionText } from "./action.js";
5
+ export declare function createVersionCommand(context: CommandContext, setExitCode: SetExitCode): Command;
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/version/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,wBAAgB,oBAAoB,CAChC,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE,WAAW,GACzB,OAAO,CAOT"}
@@ -0,0 +1,12 @@
1
+ import { Command } from "commander";
2
+ import { versionStatusText } from "./action.js";
3
+ export { versionText } from "./action.js";
4
+ export function createVersionCommand(context, setExitCode) {
5
+ return new Command("version")
6
+ .description("Print the installed version and check for updates")
7
+ .action(async () => {
8
+ context.stdout.write(`${await versionStatusText(context)}\n`);
9
+ setExitCode(0);
10
+ });
11
+ }
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/version/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,UAAU,oBAAoB,CAChC,OAAuB,EACvB,WAAwB;IAExB,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC;SACxB,WAAW,CAAC,mDAAmD,CAAC;SAChE,MAAM,CAAC,KAAK,IAAI,EAAE;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC9D,WAAW,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC;AACX,CAAC"}