@eudiplo/cli 7.1.1 → 7.2.0-main.5fdd9ce

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 (172) hide show
  1. package/README.md +215 -15
  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} +16 -3
  113. package/dist/services/deployment-drivers.d.ts.map +1 -0
  114. package/dist/services/deployment-drivers.js +274 -0
  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 +0 -170
  166. package/dist/drivers.js.map +0 -1
  167. /package/dist/{config-validate → commands/config/validate}/registry.json +0 -0
  168. /package/dist/{config-validate → commands/config/validate}/report.d.ts +0 -0
  169. /package/dist/{config-validate → commands/config/validate}/report.js +0 -0
  170. /package/dist/{config-validate → commands/config/validate}/schemas.d.ts +0 -0
  171. /package/dist/{config-validate → commands/config/validate}/types.js +0 -0
  172. /package/dist/{config-validate → commands/config/validate}/validator.d.ts +0 -0
package/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # EUDIPLO CLI
2
2
 
3
3
  The EUDIPLO CLI provides deployment-neutral commands for inspecting an EUDIPLO
4
- instance and deployment-driver commands for local Docker Compose demos.
4
+ instance and deployment-driver commands for local Compose demos.
5
5
 
6
6
  For installation, command reference, configuration validation, standalone
7
7
  releases, and local development, see the [CLI documentation](../../docs/getting-started/cli.md).
@@ -9,34 +9,36 @@ releases, and local development, see the [CLI documentation](../../docs/getting-
9
9
  ## Quick Start
10
10
 
11
11
  This package is the npm distribution of the **EUDIPLO CLI** and requires
12
- Node.js 22+.
12
+ Node.js 22.12+.
13
13
 
14
14
  For users who do not want a local Node.js dependency, use the standalone CLI
15
15
  installer instead: `curl -fsSL https://eudiplo.dev/install.sh | bash`
16
16
 
17
17
  ```bash
18
- npx @eudiplo/cli demo
18
+ npx @eudiplo/cli demo ./eudiplo-demo
19
19
  npx @eudiplo/cli instance add production --url https://eudiplo.example.com
20
20
  npx @eudiplo/cli doctor --instance production
21
21
  ```
22
22
 
23
23
  `demo` creates a local editable demo deployment, writes `.eudiplo.demo.env`,
24
- copies canonical demo configuration into `.eudiplo/demo-config`, and starts the
25
- `compose` driver.
24
+ copies canonical demo configuration into `config/demo`, and starts the
25
+ minimal `compose` stack. It always uses SQLite, local file storage,
26
+ database-backed key management, the backend, and the web client.
26
27
 
27
28
  - Backend image: `ghcr.io/openwallet-foundation/eudiplo:<tag>`
28
29
  - Client image: `ghcr.io/openwallet-foundation/eudiplo-client:<tag>`
29
30
 
30
- Tag selection defaults to the CLI version. For prerelease versions containing
31
- `-main.`, the CLI uses the `main` tag for both images. Use `--image-tag` (or
32
- `EUDIPLO_IMAGE_TAG`) to override.
31
+ Tag selection defaults to `latest` for both images. Use `--image-tag` (or
32
+ `EUDIPLO_IMAGE_TAG`) to select `main`, a release tag, or an immutable SHA tag.
33
33
 
34
34
  The generated demo config remains editable after creation. Existing files are
35
35
  preserved unless you pass `--force`.
36
36
 
37
37
  The standalone CLI and this npm package are two distributions of the same
38
38
  `eudiplo` command. The standalone CLI removes the Node.js requirement, but
39
- Docker and Docker Compose are still required for the demo deployment.
39
+ Docker and Docker Compose, or Podman and Podman Compose, are still required for
40
+ the demo deployment. Docker is preferred by default; set
41
+ `EUDIPLO_CONTAINER_RUNTIME=podman` to force Podman.
40
42
 
41
43
  ## Package and Binary Names
42
44
 
@@ -52,12 +54,34 @@ pnpm add -D @eudiplo/cli
52
54
  pnpm eudiplo status
53
55
  ```
54
56
 
57
+ ## Uninstall
58
+
59
+ Use the removal path that matches how the CLI was installed:
60
+
61
+ ```bash
62
+ # Standalone Linux/macOS installer
63
+ rm "${EUDIPLO_INSTALL_DIR:-$HOME/.local/bin}/eudiplo"
64
+
65
+ # npm global install
66
+ npm uninstall -g @eudiplo/cli
67
+
68
+ # project dependency
69
+ pnpm remove @eudiplo/cli
70
+ ```
71
+
72
+ The CLI stores instance metadata in `~/.eudiplo/config.json` by default. Remove
73
+ `~/.eudiplo` only if you also want to delete local CLI instance registrations.
74
+
55
75
  ## Compose Driver Commands
56
76
 
57
77
  Compose driver commands require a `compose` instance:
58
78
 
59
79
  ```bash
60
- eudiplo init --target compose
80
+ eudiplo init
81
+ eudiplo init ./eudiplo-minimal --preset minimal
82
+ eudiplo init ./eudiplo-standard --preset standard --start
83
+ eudiplo init --database postgres --storage local --kms vault
84
+ eudiplo init --preset standard --demo-tenant
61
85
  eudiplo init --target compose --demo
62
86
  eudiplo init --target compose --demo --image-tag main
63
87
  eudiplo init --target compose --no-client
@@ -67,14 +91,49 @@ eudiplo logs
67
91
  eudiplo demo --reset --force
68
92
  ```
69
93
 
70
- `init --target compose` writes a local `.eudiplo.env` using Compose defaults.
94
+ In an interactive terminal, `init` opens a wizard for the project directory,
95
+ preset, components, public URL, authentication, client, and startup choices.
96
+ For scripts and CI, the same values can be supplied with `--directory`,
97
+ `--preset`, `--database`, `--storage`, `--kms`, `--public-url`,
98
+ `--auth-client-id`, and `--auth-client-secret`. The directory can also be passed
99
+ positionally. When it is omitted, the wizard suggests `./`; non-interactive and
100
+ `--yes` runs use `./` automatically. Its absolute path is saved with the
101
+ instance, allowing later Compose commands to run from a different working
102
+ directory.
103
+
104
+ Interactive `demo` runs use the same directory prompt. Pass a positional
105
+ directory, `--directory`, or `--yes` to skip it.
106
+
107
+ `init --preset minimal` writes a local `.eudiplo.env` using SQLite and local
108
+ storage. `standard` provisions PostgreSQL and MinIO, while `full` additionally
109
+ provisions Vault. Arbitrary combinations are supported through the component
110
+ flags.
111
+
112
+ Every initialized project contains one mounted `config/` root. Global KMS
113
+ configuration is written to `config/kms.json`, while tenant configuration is
114
+ stored under `config/<tenant-id>/`. The demo tenant is excluded by default and
115
+ can be added with `--demo-tenant`.
116
+
71
117
  `init --target compose --demo` writes demo-specific assets (`.eudiplo.demo.env`
72
- and `.eudiplo/demo-config`) without starting Docker Compose. Add `--no-client`
118
+ and `config/demo`) without starting the Compose runtime. Add `--no-client`
73
119
  to generate a small Compose override that skips the web client container.
74
120
 
75
121
  `demo --reset --force` stops the managed demo stack, removes managed demo
76
122
  volumes, and recreates only CLI-managed demo assets.
77
123
 
124
+ ## Local Tenant Configuration Commands
125
+
126
+ ```bash
127
+ eudiplo config tenant list
128
+ eudiplo config tenant create acme --name "Acme GmbH"
129
+ eudiplo config tenant create sample --template demo
130
+ eudiplo config tenant remove acme --force
131
+ ```
132
+
133
+ The aliases `ls`, `new`, `rm`, and `delete` are also supported. These commands manage
134
+ local config-import folders only; removing a folder does not delete an already
135
+ imported tenant from a running EUDIPLO instance.
136
+
78
137
  If a driver-specific command is used with an unsupported target, the CLI exits
79
138
  with a clear error, for example:
80
139
 
@@ -142,6 +201,147 @@ running it:
142
201
  sha256sum -c SHA256SUMS.txt
143
202
  ```
144
203
 
145
- The standalone binary does not replace Docker or Docker Compose. You still need
146
- Docker to run the local deployment stack, but you do not need a local Node.js
147
- installation just to use the CLI itself.
204
+ The standalone binary does not replace Docker, Podman, or Compose. You still
205
+ need a container runtime to run the local deployment stack, but you do not need a
206
+ local Node.js installation just to use the CLI itself.
207
+
208
+ ## Developing and Extending the CLI
209
+
210
+ The CLI uses Commander and an injectable `CommandContext`. Command definitions
211
+ are organized under `src/commands`; `src/runtime.ts` only assembles the command
212
+ tree and connects Commander output and exit handling to the current context.
213
+
214
+ ### Running the CLI locally
215
+
216
+ Append CLI arguments directly after the `dev` script. `init` is a root command,
217
+ while `config` contains only configuration-related subcommands:
218
+
219
+ ```bash
220
+ pnpm --filter @eudiplo/cli dev init ./eudiplo-local --yes
221
+ pnpm --filter @eudiplo/cli dev config tenant list
222
+ ```
223
+
224
+ Generated Compose projects use `latest` by default and do not derive container
225
+ tags from `apps/cli/package.json`. Select `main` or an immutable SHA explicitly
226
+ when testing changes that require a different backend or client build:
227
+
228
+ ```bash
229
+ pnpm --filter @eudiplo/cli dev demo ./eudiplo-demo --image-tag main
230
+ ```
231
+
232
+ Use a new project directory or add `--force` when regenerating an existing
233
+ project, because the CLI preserves managed environment files by default. The
234
+ `version` command still reports the CLI package version, but that value is not
235
+ used for container image selection.
236
+
237
+ ```text
238
+ src/
239
+ ├── runtime.ts # creates the root Commander program
240
+ ├── commands/
241
+ │ ├── demo/
242
+ │ │ ├── index.ts # command registration and options
243
+ │ │ └── action.ts # demo workflow
244
+ │ ├── init/
245
+ │ │ ├── index.ts # command registration and wizard options
246
+ │ │ └── action.ts # initialization workflow
247
+ │ ├── instance/
248
+ │ │ ├── index.ts # command group and its subcommands
249
+ │ │ └── action.ts # instance persistence
250
+ │ └── config/
251
+ │ ├── index.ts # config group
252
+ │ ├── validate/ # validation command module
253
+ │ └── tenant/ # tenant-config command module
254
+ ├── services/
255
+ │ ├── cli-config.ts # persisted CLI instance configuration
256
+ │ ├── compose-project.ts # generated Compose assets
257
+ │ ├── deployment-drivers.ts # Compose and external drivers
258
+ │ └── diagnostics.ts # deployment health checks
259
+ └── types.ts # injectable context and shared CLI types
260
+ ```
261
+
262
+ ### Adding a root command
263
+
264
+ Create a directory for the command with `index.ts` as its public entrypoint and
265
+ `action.ts` for its workflow. Declare arguments, options, validation,
266
+ descriptions, and aliases in `index.ts` so generated help remains the source of
267
+ truth.
268
+
269
+ ```ts
270
+ // commands/example/index.ts
271
+ import { Command } from 'commander';
272
+ import type { CommandContext } from '../../types.js';
273
+ import type { SetExitCode } from '../shared.js';
274
+ import { runExample } from './action.js';
275
+
276
+ export function createExampleCommand(
277
+ context: CommandContext,
278
+ setExitCode: SetExitCode,
279
+ ): Command {
280
+ return new Command('example')
281
+ .description('Describe what the command does')
282
+ .requiredOption('--input <path>', 'input file')
283
+ .action(async (options) => {
284
+ setExitCode(await runExample(options.input, context));
285
+ });
286
+ }
287
+ ```
288
+
289
+ ```ts
290
+ // commands/example/action.ts
291
+ import type { CommandContext } from '../../types.js';
292
+
293
+ export async function runExample(
294
+ input: string,
295
+ context: CommandContext,
296
+ ): Promise<number> {
297
+ context.stdout.write(`Processing ${input}\n`);
298
+ return 0;
299
+ }
300
+ ```
301
+
302
+ Register the factory once in `createProgram` in `src/runtime.ts`. Do not add a
303
+ root dispatch switch or manually maintained help text.
304
+
305
+ ### Adding nested commands
306
+
307
+ Create a parent `Command`, add independently configured child modules with
308
+ `addCommand`, and return the parent from its factory. Each nested command gets
309
+ the same `index.ts` plus `action.ts` structure. `config/tenant` and
310
+ `config/validate` are the reference patterns.
311
+
312
+ Keep these boundaries when extending the command tree:
313
+
314
+ - A command module owns its registration, options, action, and command-specific
315
+ helpers.
316
+ - `services/` is only for infrastructure shared by multiple command modules,
317
+ such as config persistence, Compose generation, and instance selection.
318
+ - Load CLI state lazily inside actions that require it; help must work without a
319
+ valid local configuration.
320
+ - Write through `CommandContext.stdout` and `CommandContext.stderr`; do not call
321
+ `console.log` or `process.exit` from a command.
322
+ - Throw normal errors for operational failures. Let Commander handle unknown
323
+ options, required arguments, choices, aliases, and contextual help.
324
+ - Prefer a coherent command structure over preserving accidental parser
325
+ behavior. Document intentional breaking syntax changes in the user guides.
326
+
327
+ Runtime dependencies are welcome when they materially improve usability or
328
+ maintainability. They must support ESM, Node.js 22.12+, TypeScript, and the
329
+ single-executable bundle. Avoid dependencies that require spawning separate
330
+ subcommand executables, because the released CLI is also packaged as one SEA
331
+ binary.
332
+
333
+ ### Testing a command change
334
+
335
+ Exercise commands through `runCli(args, context)` so tests cover the real
336
+ Commander tree while keeping output, environment variables, prompts, and
337
+ network access injectable. Add coverage for successful execution, invalid
338
+ arguments or options, and the relevant help level.
339
+
340
+ Run the complete CLI verification before submitting a change:
341
+
342
+ ```bash
343
+ pnpm --filter @eudiplo/cli test
344
+ pnpm --filter @eudiplo/cli lint
345
+ pnpm --filter @eudiplo/cli build
346
+ pnpm --filter @eudiplo/cli build:sea:bundle
347
+ ```
@@ -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 createConfigCommand(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/config/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;AAIhD,wBAAgB,mBAAmB,CAC/B,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE,WAAW,GACzB,OAAO,CAUT"}
@@ -0,0 +1,15 @@
1
+ import { Command } from "commander";
2
+ import { createTenantCommand } from "./tenant/index.js";
3
+ import { createValidateCommand } from "./validate/index.js";
4
+ export function createConfigCommand(context, setExitCode) {
5
+ const config = new Command("config")
6
+ .description("Validate and manage local configuration")
7
+ .helpCommand(true);
8
+ config.addCommand(createValidateCommand(context, setExitCode));
9
+ config.addCommand(createTenantCommand(context, setExitCode));
10
+ config.action(function showConfigHelp() {
11
+ this.outputHelp();
12
+ });
13
+ return config;
14
+ }
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,MAAM,UAAU,mBAAmB,CAC/B,OAAuB,EACvB,WAAwB;IAExB,MAAM,MAAM,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;SAC/B,WAAW,CAAC,yCAAyC,CAAC;SACtD,WAAW,CAAC,IAAI,CAAC,CAAC;IACvB,MAAM,CAAC,UAAU,CAAC,qBAAqB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;IAC/D,MAAM,CAAC,UAAU,CAAC,mBAAmB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;IAC7D,MAAM,CAAC,MAAM,CAAC,SAAS,cAAc;QACjC,IAAI,CAAC,UAAU,EAAE,CAAC;IACtB,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAClB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CliConfig, CommandContext, ParsedArgs } from "../../../types.js";
2
+ export declare function tenantCommand(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/config/tenant/action.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAkB/E,wBAAsB,aAAa,CAC/B,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,cAAc,GACxB,OAAO,CAAC,MAAM,CAAC,CAiBjB"}
@@ -0,0 +1,298 @@
1
+ import { access, mkdir, readFile, readdir, rm, stat, writeFile } from "node:fs/promises";
2
+ import { join, resolve } from "node:path";
3
+ import { createInterface } from "node:readline/promises";
4
+ import { readStringFlag } from "../../../options.js";
5
+ import { configDirectoryName, copyBundledDemoConfig, } from "../../../services/compose-project.js";
6
+ import { validateTenantConfig } from "../validate/action.js";
7
+ const tenantDirectories = [
8
+ "clients",
9
+ "key-chains",
10
+ "certs",
11
+ "attribute-providers",
12
+ "webhook-endpoints",
13
+ "issuance/credentials",
14
+ "issuance/status-lists",
15
+ "presentation",
16
+ "trust-lists",
17
+ "images",
18
+ ];
19
+ export async function tenantCommand(config, parsed, context) {
20
+ const action = normalizeAction(parsed.subject);
21
+ const configRoot = resolveConfigRoot(config, parsed, context);
22
+ if (action === "list") {
23
+ if (parsed.positionals.length > 0) {
24
+ throw new Error(`Unexpected argument: ${parsed.positionals[0]}`);
25
+ }
26
+ return listTenants(configRoot, context);
27
+ }
28
+ if (action === "create") {
29
+ return createTenant(configRoot, parsed, context);
30
+ }
31
+ if (action === "validate") {
32
+ return validateTenant(configRoot, parsed, context);
33
+ }
34
+ return removeTenant(configRoot, parsed, context);
35
+ }
36
+ function normalizeAction(subject) {
37
+ if (subject === "list" || subject === "ls") {
38
+ return "list";
39
+ }
40
+ if (subject === "create" || subject === "new") {
41
+ return "create";
42
+ }
43
+ if (subject === "validate") {
44
+ return "validate";
45
+ }
46
+ if (subject === "remove" || subject === "rm" || subject === "delete") {
47
+ return "remove";
48
+ }
49
+ throw new Error("Usage: eudiplo config tenant <list|create|validate|remove> [tenant-id]");
50
+ }
51
+ async function validateTenant(configRoot, parsed, context) {
52
+ if (parsed.positionals.length > 1) {
53
+ throw new Error(`Unexpected argument: ${parsed.positionals[1]}`);
54
+ }
55
+ const tenantId = parsed.positionals[0];
56
+ const path = tenantId ? join(configRoot, tenantId) : configRoot;
57
+ return validateTenantConfig(tenantId ? "tenant" : "tenants", {
58
+ ...parsed,
59
+ positionals: [tenantId ? "tenant" : "tenants", path],
60
+ }, context);
61
+ }
62
+ function resolveConfigRoot(config, parsed, context) {
63
+ const explicitDirectory = readStringFlag(parsed.flags, "config-directory");
64
+ const instanceName = readStringFlag(parsed.flags, "instance");
65
+ if (explicitDirectory && instanceName) {
66
+ throw new Error("Use either --instance or --config-directory, not both.");
67
+ }
68
+ if (explicitDirectory) {
69
+ return resolve(context.cwd, explicitDirectory);
70
+ }
71
+ const selectedName = instanceName ?? config.defaultInstance;
72
+ if (!selectedName) {
73
+ throw new Error("No instance selected. Use --instance or --config-directory to locate the config root.");
74
+ }
75
+ const instance = config.instances[selectedName];
76
+ if (!instance) {
77
+ throw new Error(`Unknown instance: ${selectedName}`);
78
+ }
79
+ if (instance.target !== "compose") {
80
+ throw new Error("Local tenant configuration is available only for compose instances. Use --config-directory for an explicit config root.");
81
+ }
82
+ return join(instance.projectDirectory ?? context.cwd, configDirectoryName);
83
+ }
84
+ async function listTenants(configRoot, context) {
85
+ if (!(await exists(configRoot))) {
86
+ context.stdout.write(`No local tenant configurations in ${configRoot}.\n`);
87
+ return 0;
88
+ }
89
+ const entries = await readdir(configRoot, { withFileTypes: true });
90
+ const tenants = [];
91
+ for (const entry of entries) {
92
+ if (!entry.isDirectory()) {
93
+ continue;
94
+ }
95
+ const infoPath = join(configRoot, entry.name, "info.json");
96
+ if (!(await exists(infoPath))) {
97
+ continue;
98
+ }
99
+ tenants.push({ id: entry.name, name: await readTenantName(infoPath) });
100
+ }
101
+ tenants.sort((left, right) => left.id.localeCompare(right.id));
102
+ if (tenants.length === 0) {
103
+ context.stdout.write(`No local tenant configurations in ${configRoot}.\n`);
104
+ return 0;
105
+ }
106
+ context.stdout.write(`Local tenant configurations in ${configRoot}:\n`);
107
+ for (const tenant of tenants) {
108
+ context.stdout.write(`- ${tenant.id}${tenant.name ? ` (${tenant.name})` : ""}\n`);
109
+ }
110
+ return 0;
111
+ }
112
+ async function createTenant(configRoot, parsed, context) {
113
+ if (parsed.positionals.length > 1) {
114
+ throw new Error(`Unexpected argument: ${parsed.positionals[1]}`);
115
+ }
116
+ const prompter = createPrompter(context);
117
+ try {
118
+ let tenantId = parsed.positionals[0];
119
+ if (!tenantId && context.interactive === true) {
120
+ tenantId = (await prompter.ask("Tenant ID: ")).trim();
121
+ }
122
+ if (!tenantId) {
123
+ throw new Error("Tenant ID is required.");
124
+ }
125
+ validateTenantId(tenantId);
126
+ const template = parseTemplate(readStringFlag(parsed.flags, "template") ?? "empty");
127
+ const defaultName = template === "demo" ? "Demo Tenant" : tenantId;
128
+ const defaultDescription = template === "demo" ? "The demo tenant for the EUDI Wallet" : undefined;
129
+ let name = readStringFlag(parsed.flags, "name");
130
+ if (!name && context.interactive === true) {
131
+ name = await promptWithDefault(prompter.ask, "Display name", defaultName);
132
+ }
133
+ name ??= defaultName;
134
+ let description = readStringFlag(parsed.flags, "description");
135
+ if (description === undefined && context.interactive === true) {
136
+ description = await promptOptional(prompter.ask, "Description", defaultDescription);
137
+ }
138
+ description ??= defaultDescription;
139
+ const tenantPath = join(configRoot, tenantId);
140
+ await assertTenantTargetIsEmpty(tenantPath);
141
+ await mkdir(tenantPath, { recursive: true, mode: 0o700 });
142
+ if (template === "demo") {
143
+ await copyBundledDemoConfig(tenantPath, false);
144
+ }
145
+ await createTenantDirectories(tenantPath);
146
+ await writeTenantInfo(tenantPath, name, description);
147
+ context.stdout.write(`Created tenant configuration ${tenantId}.\n`);
148
+ context.stdout.write(`Directory: ${tenantPath}\n`);
149
+ if (template === "demo") {
150
+ context.stdout.write("Template: demo (bundled private keys use the db provider)\n");
151
+ }
152
+ context.stdout.write(`Validate with: eudiplo config validate tenant ${tenantPath}\n`);
153
+ return 0;
154
+ }
155
+ finally {
156
+ prompter.close();
157
+ }
158
+ }
159
+ async function removeTenant(configRoot, parsed, context) {
160
+ if (parsed.positionals.length > 1) {
161
+ throw new Error(`Unexpected argument: ${parsed.positionals[1]}`);
162
+ }
163
+ const tenantId = parsed.positionals[0];
164
+ if (!tenantId) {
165
+ throw new Error("Tenant ID is required.");
166
+ }
167
+ validateTenantId(tenantId);
168
+ const tenantPath = join(configRoot, tenantId);
169
+ if (!(await exists(join(tenantPath, "info.json")))) {
170
+ throw new Error(`Tenant configuration not found: ${tenantId}`);
171
+ }
172
+ if (parsed.flags.force !== true) {
173
+ if (context.interactive !== true) {
174
+ throw new Error("config tenant remove requires --force in non-interactive mode.");
175
+ }
176
+ const prompter = createPrompter(context);
177
+ try {
178
+ const confirmed = await promptBoolean(prompter.ask, `Remove local tenant configuration ${tenantId}?`, false);
179
+ if (!confirmed) {
180
+ context.stdout.write("Tenant removal cancelled.\n");
181
+ return 0;
182
+ }
183
+ }
184
+ finally {
185
+ prompter.close();
186
+ }
187
+ }
188
+ await rm(tenantPath, { recursive: true, force: false });
189
+ context.stdout.write(`Removed local tenant configuration ${tenantId}.\n`);
190
+ context.stdout.write("The tenant in a running EUDIPLO instance was not deleted.\n");
191
+ return 0;
192
+ }
193
+ async function createTenantDirectories(tenantPath) {
194
+ for (const relativeDirectory of tenantDirectories) {
195
+ const directory = join(tenantPath, relativeDirectory);
196
+ await mkdir(directory, { recursive: true, mode: 0o700 });
197
+ const keepFile = join(directory, ".gitkeep");
198
+ if (!(await exists(keepFile))) {
199
+ await writeFile(keepFile, "", { mode: 0o600 });
200
+ }
201
+ }
202
+ }
203
+ async function writeTenantInfo(tenantPath, name, description) {
204
+ const info = description ? { name, description } : { name };
205
+ await writeFile(join(tenantPath, "info.json"), `${JSON.stringify(info, null, 4)}\n`, {
206
+ encoding: "utf8",
207
+ mode: 0o600,
208
+ });
209
+ }
210
+ async function assertTenantTargetIsEmpty(tenantPath) {
211
+ try {
212
+ const entry = await stat(tenantPath);
213
+ if (!entry.isDirectory()) {
214
+ throw new Error(`Tenant path points to a file: ${tenantPath}`);
215
+ }
216
+ if ((await readdir(tenantPath)).length > 0) {
217
+ throw new Error(`Tenant configuration already exists: ${tenantPath}`);
218
+ }
219
+ }
220
+ catch (error) {
221
+ if (isNodeError(error) && error.code === "ENOENT") {
222
+ return;
223
+ }
224
+ throw error;
225
+ }
226
+ }
227
+ function validateTenantId(tenantId) {
228
+ if (!/^[a-z0-9](?:[a-z0-9_-]{0,62})$/.test(tenantId)) {
229
+ throw new Error("Tenant ID must use lowercase letters, numbers, hyphens, or underscores and be at most 63 characters.");
230
+ }
231
+ }
232
+ function parseTemplate(value) {
233
+ if (value === "empty" || value === "demo") {
234
+ return value;
235
+ }
236
+ throw new Error(`Unsupported --template value: ${value}. Use empty or demo.`);
237
+ }
238
+ async function readTenantName(infoPath) {
239
+ try {
240
+ const info = JSON.parse(await readFile(infoPath, "utf8"));
241
+ return typeof info.name === "string" ? info.name : undefined;
242
+ }
243
+ catch {
244
+ return undefined;
245
+ }
246
+ }
247
+ function createPrompter(context) {
248
+ let promptInterface;
249
+ return {
250
+ ask: async (question) => {
251
+ if (context.prompt) {
252
+ return context.prompt(question);
253
+ }
254
+ promptInterface ??= createInterface({
255
+ input: process.stdin,
256
+ output: process.stdout,
257
+ });
258
+ return promptInterface.question(question);
259
+ },
260
+ close: () => promptInterface?.close(),
261
+ };
262
+ }
263
+ async function promptWithDefault(prompt, label, defaultValue) {
264
+ const answer = (await prompt(`${label} [${defaultValue}]: `)).trim();
265
+ return answer || defaultValue;
266
+ }
267
+ async function promptOptional(prompt, label, defaultValue) {
268
+ const suffix = defaultValue ? ` [${defaultValue}]` : " (optional)";
269
+ const answer = (await prompt(`${label}${suffix}: `)).trim();
270
+ return answer || defaultValue;
271
+ }
272
+ async function promptBoolean(prompt, label, defaultValue) {
273
+ const suffix = defaultValue ? "Y/n" : "y/N";
274
+ const answer = (await prompt(`${label} [${suffix}]: `)).trim().toLowerCase();
275
+ if (!answer) {
276
+ return defaultValue;
277
+ }
278
+ if (answer === "y" || answer === "yes") {
279
+ return true;
280
+ }
281
+ if (answer === "n" || answer === "no") {
282
+ return false;
283
+ }
284
+ throw new Error(`Answer ${label.toLowerCase()} with yes or no.`);
285
+ }
286
+ async function exists(path) {
287
+ try {
288
+ await access(path);
289
+ return true;
290
+ }
291
+ catch {
292
+ return false;
293
+ }
294
+ }
295
+ function isNodeError(error) {
296
+ return error instanceof Error && "code" in error;
297
+ }
298
+ //# sourceMappingURL=action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action.js","sourceRoot":"","sources":["../../../../src/commands/config/tenant/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 createTenantCommand(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/config/tenant/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAA4B,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAG7E,wBAAgB,mBAAmB,CAC/B,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE,WAAW,GACzB,OAAO,CAyFT"}