@eudiplo/cli 7.2.0-main.c776046 → 7.2.0-main.fb5d4cb

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 (158) hide show
  1. package/README.md +21 -0
  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/config/editor/action.d.ts +3 -0
  11. package/dist/commands/config/editor/action.d.ts.map +1 -0
  12. package/dist/commands/config/editor/action.js +112 -0
  13. package/dist/commands/config/editor/action.js.map +1 -0
  14. package/dist/commands/config/editor/index.d.ts +5 -0
  15. package/dist/commands/config/editor/index.d.ts.map +1 -0
  16. package/dist/commands/config/editor/index.js +20 -0
  17. package/dist/commands/config/editor/index.js.map +1 -0
  18. package/dist/commands/config/index.d.ts.map +1 -1
  19. package/dist/commands/config/index.js +6 -0
  20. package/dist/commands/config/index.js.map +1 -1
  21. package/dist/commands/config/portability/action.d.ts +5 -0
  22. package/dist/commands/config/portability/action.d.ts.map +1 -0
  23. package/dist/commands/config/portability/action.js +164 -0
  24. package/dist/commands/config/portability/action.js.map +1 -0
  25. package/dist/commands/config/portability/index.d.ts +5 -0
  26. package/dist/commands/config/portability/index.d.ts.map +1 -0
  27. package/dist/commands/config/portability/index.js +44 -0
  28. package/dist/commands/config/portability/index.js.map +1 -0
  29. package/dist/commands/config/portability/migrations.d.ts +24 -0
  30. package/dist/commands/config/portability/migrations.d.ts.map +1 -0
  31. package/dist/commands/config/portability/migrations.js +95 -0
  32. package/dist/commands/config/portability/migrations.js.map +1 -0
  33. package/dist/commands/config/portability/migrations.spec.d.ts +2 -0
  34. package/dist/commands/config/portability/migrations.spec.d.ts.map +1 -0
  35. package/dist/commands/config/portability/migrations.spec.js +32 -0
  36. package/dist/commands/config/portability/migrations.spec.js.map +1 -0
  37. package/dist/commands/config/tenant/action.d.ts.map +1 -1
  38. package/dist/commands/config/tenant/action.js +7 -4
  39. package/dist/commands/config/tenant/action.js.map +1 -1
  40. package/dist/commands/config/tenant/index.d.ts.map +1 -1
  41. package/dist/commands/config/tenant/index.js.map +1 -1
  42. package/dist/commands/config/validate/action.d.ts.map +1 -1
  43. package/dist/commands/config/validate/action.js +3 -1
  44. package/dist/commands/config/validate/action.js.map +1 -1
  45. package/dist/commands/config/validate/registry.d.ts +1 -0
  46. package/dist/commands/config/validate/registry.d.ts.map +1 -1
  47. package/dist/commands/config/validate/registry.js +1 -1
  48. package/dist/commands/config/validate/registry.js.map +1 -1
  49. package/dist/commands/config/validate/registry.json +11 -22
  50. package/dist/commands/config/validate/report.d.ts.map +1 -1
  51. package/dist/commands/config/validate/report.js +6 -1
  52. package/dist/commands/config/validate/report.js.map +1 -1
  53. package/dist/commands/config/validate/schemas.d.ts +1 -0
  54. package/dist/commands/config/validate/schemas.d.ts.map +1 -1
  55. package/dist/commands/config/validate/schemas.js +16 -5
  56. package/dist/commands/config/validate/schemas.js.map +1 -1
  57. package/dist/commands/config/validate/types.d.ts.map +1 -1
  58. package/dist/commands/config/validate/validator.d.ts.map +1 -1
  59. package/dist/commands/config/validate/validator.js +13 -5
  60. package/dist/commands/config/validate/validator.js.map +1 -1
  61. package/dist/commands/demo/action.d.ts.map +1 -1
  62. package/dist/commands/demo/action.js +2 -1
  63. package/dist/commands/demo/action.js.map +1 -1
  64. package/dist/commands/demo/index.d.ts.map +1 -1
  65. package/dist/commands/demo/index.js.map +1 -1
  66. package/dist/commands/deployment/action.d.ts.map +1 -1
  67. package/dist/commands/deployment/action.js +10 -3
  68. package/dist/commands/deployment/action.js.map +1 -1
  69. package/dist/commands/deployment/index.d.ts.map +1 -1
  70. package/dist/commands/deployment/index.js.map +1 -1
  71. package/dist/commands/doctor/action.d.ts.map +1 -1
  72. package/dist/commands/doctor/action.js +1 -1
  73. package/dist/commands/doctor/action.js.map +1 -1
  74. package/dist/commands/init/action.d.ts.map +1 -1
  75. package/dist/commands/init/action.js +19 -6
  76. package/dist/commands/init/action.js.map +1 -1
  77. package/dist/commands/init/index.d.ts.map +1 -1
  78. package/dist/commands/init/index.js.map +1 -1
  79. package/dist/commands/instance/action.d.ts.map +1 -1
  80. package/dist/commands/instance/action.js.map +1 -1
  81. package/dist/commands/shared.d.ts.map +1 -1
  82. package/dist/commands/shared.js +4 -1
  83. package/dist/commands/shared.js.map +1 -1
  84. package/dist/commands/status/action.d.ts.map +1 -1
  85. package/dist/commands/status/action.js.map +1 -1
  86. package/dist/commands/version/action.d.ts.map +1 -1
  87. package/dist/commands/version/action.js +3 -1
  88. package/dist/commands/version/action.js.map +1 -1
  89. package/dist/index.js +0 -0
  90. package/dist/runtime.d.ts +2 -0
  91. package/dist/runtime.d.ts.map +1 -1
  92. package/dist/runtime.js +3 -1
  93. package/dist/runtime.js.map +1 -1
  94. package/dist/sea-assets.d.ts +4 -2
  95. package/dist/sea-assets.d.ts.map +1 -1
  96. package/dist/sea-assets.js +6 -3
  97. package/dist/sea-assets.js.map +1 -1
  98. package/dist/services/cli-config.d.ts.map +1 -1
  99. package/dist/services/cli-config.js +2 -1
  100. package/dist/services/cli-config.js.map +1 -1
  101. package/dist/services/compose-project.d.ts.map +1 -1
  102. package/dist/services/compose-project.js +14 -6
  103. package/dist/services/compose-project.js.map +1 -1
  104. package/dist/services/deployment-drivers.d.ts.map +1 -1
  105. package/dist/services/deployment-drivers.js +20 -6
  106. package/dist/services/deployment-drivers.js.map +1 -1
  107. package/dist/services/diagnostics.d.ts.map +1 -1
  108. package/dist/services/diagnostics.js +3 -1
  109. package/dist/services/diagnostics.js.map +1 -1
  110. package/dist/services/instance-selection.d.ts.map +1 -1
  111. package/dist/services/instance-selection.js.map +1 -1
  112. package/dist/services/project-directory.d.ts.map +1 -1
  113. package/dist/services/project-directory.js.map +1 -1
  114. package/dist/types.d.ts.map +1 -1
  115. package/package.json +5 -3
  116. package/templates/demo-config/issuance/issuance.json +20 -12
  117. package/templates/demo-config/key-chains/access.json +13 -2
  118. package/templates/demo-config/key-chains/attestation.json +15 -4
  119. package/templates/demo-config/key-chains/status-list.json +15 -4
  120. package/templates/demo-config/key-chains/trust-list.json +13 -2
  121. package/templates/demo-config/presentation/age-over-18.json +46 -53
  122. package/templates/demo-config/presentation/pid.json +44 -0
  123. package/templates/demo-config.manifest.json +1 -0
  124. package/templates/schemas/AttributeProviderAuth.schema.json +60 -0
  125. package/templates/schemas/AttributeProviderConfigFile.schema.json +37 -0
  126. package/templates/schemas/CertImportDto.schema.json +35 -0
  127. package/templates/schemas/ClientConfigFile.schema.json +37 -0
  128. package/templates/schemas/ConfigDocumentMetadata.schema.json +25 -0
  129. package/templates/schemas/CreateStatusListDto.schema.json +46 -0
  130. package/templates/schemas/CreateTenantDto.schema.json +116 -0
  131. package/templates/schemas/CredentialConfigFile.schema.json +37 -0
  132. package/templates/schemas/DCQL.schema.json +401 -0
  133. package/templates/schemas/EmbeddedDisclosurePolicy.schema.json +106 -0
  134. package/templates/schemas/ImportTenantDto.schema.json +69 -0
  135. package/templates/schemas/IssuanceConfigFile.schema.json +32 -0
  136. package/templates/schemas/KeyChainConfigFile.schema.json +101 -0
  137. package/templates/schemas/KeyChainCreateDto.schema.json +66 -0
  138. package/templates/schemas/KeyChainUpdateDto.schema.json +40 -0
  139. package/templates/schemas/KmsConfigFile.schema.json +37 -0
  140. package/templates/schemas/PresentationConfigFile.schema.json +32 -0
  141. package/templates/schemas/RegistrarConfigFile.schema.json +37 -0
  142. package/templates/schemas/RotationPolicyCreateDto.schema.json +28 -0
  143. package/templates/schemas/RotationPolicyUpdateDto.schema.json +25 -0
  144. package/templates/schemas/SessionStorageConfig.schema.json +24 -0
  145. package/templates/schemas/StatusListConfig.schema.json +51 -0
  146. package/templates/schemas/StatusListConfigFile.schema.json +37 -0
  147. package/templates/schemas/TransactionData.schema.json +24 -0
  148. package/templates/schemas/TrustListConfigFile.schema.json +37 -0
  149. package/templates/schemas/UpdateAttributeProviderDto.schema.json +93 -0
  150. package/templates/schemas/UpdateClientDto.schema.json +62 -0
  151. package/templates/schemas/UpdateStatusListConfigDto.schema.json +85 -0
  152. package/templates/schemas/UpdateStatusListDto.schema.json +33 -0
  153. package/templates/schemas/UpdateTenantDto.schema.json +96 -0
  154. package/templates/schemas/UpdateWebhookEndpointDto.schema.json +93 -0
  155. package/templates/schemas/VCT.schema.json +37 -0
  156. package/templates/schemas/WebhookConfig.schema.json +80 -0
  157. package/templates/schemas/WebhookEndpointConfigFile.schema.json +37 -0
  158. package/templates/schemas.manifest.json +34 -1
package/README.md CHANGED
@@ -252,6 +252,26 @@ when testing changes that require a different backend or client build:
252
252
  pnpm --filter @eudiplo/cli dev demo ./eudiplo-demo --image-tag main
253
253
  ```
254
254
 
255
+ Install the JSON Schemas bundled with the CLI into a VS Code workspace and
256
+ associate them with the local tenant configuration tree:
257
+
258
+ ```bash
259
+ eudiplo config editor setup . --config-directory ./config
260
+ ```
261
+
262
+ The command merges `.vscode/settings.json` without removing unrelated settings
263
+ or JSONC comments and can safely be rerun after a CLI upgrade.
264
+
265
+ List the complete command tree or render the same reference as Markdown:
266
+
267
+ ```bash
268
+ eudiplo commands
269
+ eudiplo commands --format markdown
270
+ ```
271
+
272
+ The documentation prebuild uses the Markdown renderer directly, keeping the
273
+ published command reference synchronized with Commander definitions.
274
+
255
275
  Use a new project directory or add `--force` when regenerating an existing
256
276
  project, because the CLI preserves managed environment files by default. The
257
277
  `version` command still reports the CLI package version, but that value is not
@@ -272,6 +292,7 @@ src/
272
292
  │ │ └── action.ts # instance persistence
273
293
  │ └── config/
274
294
  │ ├── index.ts # config group
295
+ │ ├── editor/ # VS Code schema setup command module
275
296
  │ ├── validate/ # validation command module
276
297
  │ └── tenant/ # tenant-config command module
277
298
  ├── services/
@@ -0,0 +1,4 @@
1
+ import { Command } from "commander";
2
+ import type { CommandContext } from "../../types.js";
3
+ export declare function createCommandsCommand(context: CommandContext, getProgram: () => Command): Command;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAMrD,wBAAgB,qBAAqB,CACjC,OAAO,EAAE,cAAc,EACvB,UAAU,EAAE,MAAM,OAAO,GAC1B,OAAO,CAaT"}
@@ -0,0 +1,13 @@
1
+ import { Command, Option } from "commander";
2
+ import { renderCommandReference, } from "./render.js";
3
+ export function createCommandsCommand(context, getProgram) {
4
+ return new Command("commands")
5
+ .description("List every available CLI command")
6
+ .addOption(new Option("--format <text|markdown>", "output format")
7
+ .choices(["text", "markdown"])
8
+ .default("text"))
9
+ .action((options) => {
10
+ context.stdout.write(renderCommandReference(getProgram(), options.format));
11
+ });
12
+ }
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAE5C,OAAO,EAEH,sBAAsB,GACzB,MAAM,aAAa,CAAC;AAErB,MAAM,UAAU,qBAAqB,CACjC,OAAuB,EACvB,UAAyB;IAEzB,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC;SACzB,WAAW,CAAC,kCAAkC,CAAC;SAC/C,SAAS,CACN,IAAI,MAAM,CAAC,0BAA0B,EAAE,eAAe,CAAC;SAClD,OAAO,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;SAC7B,OAAO,CAAC,MAAM,CAAC,CACvB;SACA,MAAM,CAAC,CAAC,OAA2C,EAAE,EAAE;QACpD,OAAO,CAAC,MAAM,CAAC,KAAK,CAChB,sBAAsB,CAAC,UAAU,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,CACvD,CAAC;IACN,CAAC,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Command } from "commander";
2
+ export type CommandReferenceFormat = "text" | "markdown";
3
+ export declare function renderCommandReference(program: Command, format: CommandReferenceFormat): string;
4
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../src/commands/commands/render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,UAAU,CAAC;AAEzD,wBAAgB,sBAAsB,CAClC,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,sBAAsB,GAC/B,MAAM,CAIR"}
@@ -0,0 +1,52 @@
1
+ export function renderCommandReference(program, format) {
2
+ return format === "markdown"
3
+ ? renderMarkdownReference(program)
4
+ : renderTextReference(program);
5
+ }
6
+ function renderTextReference(program) {
7
+ const commands = collectCommands(program).slice(1);
8
+ const rows = commands.map((command) => ({
9
+ invocation: usageLine(command),
10
+ description: command.description(),
11
+ }));
12
+ const invocationWidth = Math.max(...rows.map((row) => row.invocation.length));
13
+ const lines = rows.map((row) => ` ${row.invocation.padEnd(invocationWidth)} ${row.description}`.trimEnd());
14
+ return `Available commands:\n\n${lines.join("\n")}\n`;
15
+ }
16
+ function renderMarkdownReference(program) {
17
+ const sections = collectCommands(program).map((command, index) => {
18
+ const heading = index === 0
19
+ ? "# EUDIPLO CLI command reference"
20
+ : `## \`${commandPath(command)}\``;
21
+ const description = index === 0
22
+ ? "Generated from the CLI command definitions. Do not edit this page manually."
23
+ : command.description();
24
+ return `${heading}\n\n${description}\n\n\`\`\`text\n${command.helpInformation().trim()}\n\`\`\``;
25
+ });
26
+ return `${sections.join("\n\n")}\n`;
27
+ }
28
+ function collectCommands(program) {
29
+ const commands = [program];
30
+ for (const child of program.commands) {
31
+ if (child.name() === "help" ||
32
+ child._hidden === true) {
33
+ continue;
34
+ }
35
+ commands.push(...collectCommands(child));
36
+ }
37
+ return commands;
38
+ }
39
+ function usageLine(command) {
40
+ const firstLine = command.helpInformation().split("\n", 1)[0];
41
+ return firstLine.replace(/^Usage:\s*/, "");
42
+ }
43
+ function commandPath(command) {
44
+ const names = [];
45
+ let current = command;
46
+ while (current) {
47
+ names.unshift(current.name());
48
+ current = current.parent;
49
+ }
50
+ return names.join(" ");
51
+ }
52
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../../src/commands/commands/render.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CommandContext, ParsedArgs } from "../../../types.js";
2
+ export declare function setupVSCodeSchemaSupport(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/editor/action.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAapE,wBAAsB,wBAAwB,CAC1C,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,cAAc,GACxB,OAAO,CAAC,MAAM,CAAC,CA+CjB"}
@@ -0,0 +1,112 @@
1
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
2
+ import { isAbsolute, join, relative, resolve, sep } from "node:path";
3
+ import { applyEdits, modify, parse, printParseErrorCode, } from "jsonc-parser";
4
+ import { readStringFlag } from "../../../options.js";
5
+ import { TENANT_RESOURCE_REGISTRY } from "../validate/registry.js";
6
+ import { loadBundledConfigSchemaTexts } from "../validate/schemas.js";
7
+ const vscodeDirectoryName = ".vscode";
8
+ const managedSchemaDirectoryName = "eudiplo-schemas";
9
+ const managedSchemaUrlPrefix = `./${vscodeDirectoryName}/${managedSchemaDirectoryName}/`;
10
+ export async function setupVSCodeSchemaSupport(parsed, context) {
11
+ if (parsed.positionals.length > 1) {
12
+ throw new Error(`Unexpected argument: ${parsed.positionals[1]}`);
13
+ }
14
+ const workspacePath = resolve(context.cwd, parsed.positionals[0] ?? ".");
15
+ const configDirectoryFlag = readStringFlag(parsed.flags, "config-directory") ?? "config";
16
+ const configPath = isAbsolute(configDirectoryFlag)
17
+ ? resolve(configDirectoryFlag)
18
+ : resolve(workspacePath, configDirectoryFlag);
19
+ const configRelativePath = relative(workspacePath, configPath);
20
+ if (isOutsideWorkspace(configRelativePath)) {
21
+ throw new Error(`Config directory must be inside the VS Code workspace: ${configPath}`);
22
+ }
23
+ const vscodePath = join(workspacePath, vscodeDirectoryName);
24
+ const schemaDirectory = join(vscodePath, managedSchemaDirectoryName);
25
+ const settingsPath = join(vscodePath, "settings.json");
26
+ await mkdir(schemaDirectory, { recursive: true });
27
+ const schemaTexts = await loadBundledConfigSchemaTexts();
28
+ for (const [schemaFile, contents] of schemaTexts) {
29
+ await writeFile(join(schemaDirectory, schemaFile), contents, "utf8");
30
+ }
31
+ const associations = createSchemaAssociations(configRelativePath);
32
+ const settingsText = await readSettings(settingsPath);
33
+ const updatedSettings = mergeSchemaAssociations(settingsText, associations, settingsPath);
34
+ await writeFile(settingsPath, updatedSettings, "utf8");
35
+ context.stdout.write(`Configured VS Code JSON Schema support in ${settingsPath}.\n`);
36
+ context.stdout.write(`Installed ${schemaTexts.size} schemas in ${schemaDirectory}.\n`);
37
+ context.stdout.write(`Associated ${associations.length} config resource patterns under ${configPath}.\n`);
38
+ return 0;
39
+ }
40
+ function createSchemaAssociations(configRelativePath) {
41
+ const normalizedConfigPath = configRelativePath
42
+ .split(sep)
43
+ .join("/")
44
+ .replace(/^\/+|\/+$/g, "");
45
+ const workspacePrefix = normalizedConfigPath
46
+ ? `/${normalizedConfigPath}`
47
+ : "";
48
+ return TENANT_RESOURCE_REGISTRY.map((entry) => ({
49
+ fileMatch: Array.from(new Set(entry.fileMatch
50
+ .filter((pattern) => pattern.startsWith("/assets/config/"))
51
+ .map((pattern) => `${workspacePrefix}${pattern.slice("/assets/config".length)}`))),
52
+ url: `${managedSchemaUrlPrefix}${entry.schemaFile}`,
53
+ })).filter((entry) => entry.fileMatch.length > 0);
54
+ }
55
+ async function readSettings(settingsPath) {
56
+ try {
57
+ return await readFile(settingsPath, "utf8");
58
+ }
59
+ catch (error) {
60
+ if (isNodeError(error) && error.code === "ENOENT") {
61
+ return "{}\n";
62
+ }
63
+ throw error;
64
+ }
65
+ }
66
+ function mergeSchemaAssociations(settingsText, managedAssociations, settingsPath) {
67
+ const errors = [];
68
+ const settings = parse(settingsText, errors, {
69
+ allowTrailingComma: true,
70
+ disallowComments: false,
71
+ });
72
+ if (errors.length > 0) {
73
+ const first = errors[0];
74
+ throw new Error(`Cannot update ${settingsPath}: ${printParseErrorCode(first.error)} at offset ${first.offset}.`);
75
+ }
76
+ if (!isRecord(settings)) {
77
+ throw new Error(`Cannot update ${settingsPath}: the settings root must be an object.`);
78
+ }
79
+ const existingValue = settings["json.schemas"];
80
+ if (existingValue !== undefined && !Array.isArray(existingValue)) {
81
+ throw new Error(`Cannot update ${settingsPath}: "json.schemas" must be an array.`);
82
+ }
83
+ const unmanagedAssociations = (existingValue ?? []).filter((entry) => !isRecord(entry) ||
84
+ typeof entry.url !== "string" ||
85
+ !entry.url.startsWith(managedSchemaUrlPrefix));
86
+ const mergedAssociations = [
87
+ ...unmanagedAssociations,
88
+ ...managedAssociations,
89
+ ];
90
+ const eol = settingsText.includes("\r\n") ? "\r\n" : "\n";
91
+ const edits = modify(settingsText, ["json.schemas"], mergedAssociations, {
92
+ formattingOptions: {
93
+ insertSpaces: true,
94
+ tabSize: 2,
95
+ eol,
96
+ },
97
+ });
98
+ const updated = applyEdits(settingsText, edits);
99
+ return updated.endsWith(eol) ? updated : `${updated}${eol}`;
100
+ }
101
+ function isOutsideWorkspace(relativePath) {
102
+ return (relativePath === ".." ||
103
+ relativePath.startsWith(`..${sep}`) ||
104
+ isAbsolute(relativePath));
105
+ }
106
+ function isRecord(value) {
107
+ return typeof value === "object" && value !== null && !Array.isArray(value);
108
+ }
109
+ function isNodeError(error) {
110
+ return error instanceof Error && "code" in error;
111
+ }
112
+ //# sourceMappingURL=action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action.js","sourceRoot":"","sources":["../../../../src/commands/config/editor/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 createEditorCommand(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/editor/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAG/D,wBAAgB,mBAAmB,CAC/B,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE,WAAW,GACzB,OAAO,CA+BT"}
@@ -0,0 +1,20 @@
1
+ import { Command } from "commander";
2
+ import { parsedArgs } from "../../shared.js";
3
+ import { setupVSCodeSchemaSupport } from "./action.js";
4
+ export function createEditorCommand(context, setExitCode) {
5
+ const editor = new Command("editor")
6
+ .description("Configure editor support for local configuration files")
7
+ .helpCommand(true);
8
+ editor
9
+ .command("setup [workspace]")
10
+ .description("Install bundled JSON Schemas and configure VS Code")
11
+ .option("--config-directory <path>", "tenant config root relative to the workspace", "config")
12
+ .action(async (workspace, options) => {
13
+ setExitCode(await setupVSCodeSchemaSupport(parsedArgs("config", "editor-setup", workspace ? [workspace] : [], options), context));
14
+ });
15
+ editor.action(function showEditorHelp() {
16
+ this.outputHelp();
17
+ });
18
+ return editor;
19
+ }
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/config/editor/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,UAAU,EAAoB,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAEvD,MAAM,UAAU,mBAAmB,CAC/B,OAAuB,EACvB,WAAwB;IAExB,MAAM,MAAM,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;SAC/B,WAAW,CAAC,wDAAwD,CAAC;SACrE,WAAW,CAAC,IAAI,CAAC,CAAC;IAEvB,MAAM;SACD,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,oDAAoD,CAAC;SACjE,MAAM,CACH,2BAA2B,EAC3B,8CAA8C,EAC9C,QAAQ,CACX;SACA,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE;QACjC,WAAW,CACP,MAAM,wBAAwB,CAC1B,UAAU,CACN,QAAQ,EACR,cAAc,EACd,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,EAC5B,OAAO,CACV,EACD,OAAO,CACV,CACJ,CAAC;IACN,CAAC,CAAC,CAAC;IAEP,MAAM,CAAC,MAAM,CAAC,SAAS,cAAc;QACjC,IAAI,CAAC,UAAU,EAAE,CAAC;IACtB,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAClB,CAAC"}
@@ -1 +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;AAEpC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAgB,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAI9D,wBAAgB,mBAAmB,CAC/B,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE,WAAW,GACzB,OAAO,CAwBT"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAgB,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAM9D,wBAAgB,mBAAmB,CAC/B,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE,WAAW,GACzB,OAAO,CAmCT"}
@@ -1,6 +1,8 @@
1
1
  import { Command } from "commander";
2
2
  import { runConfigPath, runConfigShow } from "./action.js";
3
3
  import { loadCliState } from "../shared.js";
4
+ import { createEditorCommand } from "./editor/index.js";
5
+ import { createPortabilityCommands } from "./portability/index.js";
4
6
  import { createTenantCommand } from "./tenant/index.js";
5
7
  import { createValidateCommand } from "./validate/index.js";
6
8
  export function createConfigCommand(context, setExitCode) {
@@ -22,7 +24,11 @@ export function createConfigCommand(context, setExitCode) {
22
24
  setExitCode(runConfigShow(configPath, config, options.json === true, context));
23
25
  });
24
26
  config.addCommand(createValidateCommand(context, setExitCode));
27
+ config.addCommand(createEditorCommand(context, setExitCode));
25
28
  config.addCommand(createTenantCommand(context, setExitCode));
29
+ for (const command of createPortabilityCommands(context, setExitCode)) {
30
+ config.addCommand(command);
31
+ }
26
32
  config.action(function showConfigHelp() {
27
33
  this.outputHelp();
28
34
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE3D,OAAO,EAAE,YAAY,EAAoB,MAAM,cAAc,CAAC;AAC9D,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;SACD,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,uCAAuC,CAAC;SACpD,MAAM,CAAC,GAAG,EAAE;QACT,WAAW,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IACP,MAAM;SACD,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,sCAAsC,CAAC;SACnD,MAAM,CAAC,QAAQ,EAAE,sBAAsB,CAAC;SACxC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACtB,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;QAC3D,WAAW,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,KAAK,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IACP,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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE3D,OAAO,EAAE,YAAY,EAAoB,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACnE,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;SACD,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,uCAAuC,CAAC;SACpD,MAAM,CAAC,GAAG,EAAE;QACT,WAAW,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IACP,MAAM;SACD,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,sCAAsC,CAAC;SACnD,MAAM,CAAC,QAAQ,EAAE,sBAAsB,CAAC;SACxC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACtB,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;QAC3D,WAAW,CACP,aAAa,CACT,UAAU,EACV,MAAM,EACN,OAAO,CAAC,IAAI,KAAK,IAAI,EACrB,OAAO,CACV,CACJ,CAAC;IACN,CAAC,CAAC,CAAC;IACP,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,UAAU,CAAC,mBAAmB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;IAC7D,KAAK,MAAM,OAAO,IAAI,yBAAyB,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,CAAC;QACpE,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IACD,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,5 @@
1
+ import type { CliConfig, CommandContext, ParsedArgs } from "../../../types.js";
2
+ type Action = "export" | "plan" | "import" | "upgrade";
3
+ export declare function runPortabilityCommand(action: Action, config: CliConfig, parsed: ParsedArgs, context: CommandContext): Promise<number>;
4
+ export {};
5
+ //# sourceMappingURL=action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../../../src/commands/config/portability/action.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/E,KAAK,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEvD,wBAAsB,qBAAqB,CACvC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,cAAc,GACxB,OAAO,CAAC,MAAM,CAAC,CAuEjB"}
@@ -0,0 +1,164 @@
1
+ import { readFile, writeFile } from "node:fs/promises";
2
+ import { createHash } from "node:crypto";
3
+ import { basename, extname, isAbsolute, join } from "node:path";
4
+ import { strFromU8, strToU8, unzipSync, zipSync } from "fflate";
5
+ import { readStringFlag } from "../../../options.js";
6
+ import { resolveInstance } from "../../../services/instance-selection.js";
7
+ import { upgradeDocument } from "./migrations.js";
8
+ export async function runPortabilityCommand(action, config, parsed, context) {
9
+ if (action === "upgrade")
10
+ return upgradeFile(parsed, context);
11
+ const [, instance] = resolveInstance(config, parsed);
12
+ const token = readStringFlag(parsed.flags, "token") ?? context.env.EUDIPLO_TOKEN;
13
+ if (!token) {
14
+ throw new Error("An access token is required via --token or EUDIPLO_TOKEN.");
15
+ }
16
+ const authHeaders = {
17
+ authorization: `Bearer ${token}`,
18
+ };
19
+ const baseUrl = instance.url.replace(/\/$/, "");
20
+ if (action === "export") {
21
+ const output = resolvePath(readStringFlag(parsed.flags, "output") ??
22
+ "eudiplo-config-bundle.zip", context);
23
+ const format = extname(output).toLowerCase() === ".json" ? "json" : "zip";
24
+ const response = await context.fetch(`${baseUrl}/api/config-bundles/export?format=${format}`, { headers: authHeaders });
25
+ await assertOk(response);
26
+ const data = format === "zip"
27
+ ? Buffer.from(await response.arrayBuffer())
28
+ : `${JSON.stringify(await response.json(), null, 2)}\n`;
29
+ await writeFile(output, data, { mode: 0o600 });
30
+ context.stdout.write(`Exported configuration bundle to ${output}\n`);
31
+ return 0;
32
+ }
33
+ const file = parsed.positionals[0];
34
+ if (!file)
35
+ throw new Error(`Usage: eudiplo config ${action} <bundle>`);
36
+ const bundlePath = resolvePath(file, context);
37
+ const archive = extname(bundlePath).toLowerCase() === ".zip";
38
+ const mode = readStringFlag(parsed.flags, "mode") ?? "upsert";
39
+ const query = new URLSearchParams({ mode });
40
+ if (parsed.flags["confirm-replace"] === true) {
41
+ query.set("confirmReplace", "true");
42
+ }
43
+ let body;
44
+ let headers = authHeaders;
45
+ let endpoint = action;
46
+ if (archive) {
47
+ const form = new FormData();
48
+ form.set("bundle", new Blob([await readFile(bundlePath)], { type: "application/zip" }), basename(bundlePath));
49
+ body = form;
50
+ endpoint = `${action}/archive`;
51
+ }
52
+ else {
53
+ const bundle = JSON.parse(await readFile(bundlePath, "utf8"));
54
+ body = JSON.stringify(bundle);
55
+ headers = { ...headers, "content-type": "application/json" };
56
+ }
57
+ const response = await context.fetch(`${baseUrl}/api/config-bundles/${endpoint}?${query}`, { method: "POST", headers, body });
58
+ await assertOk(response);
59
+ const result = await response.json();
60
+ context.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
61
+ return result.applicable === false ? 1 : 0;
62
+ }
63
+ async function upgradeFile(parsed, context) {
64
+ const file = parsed.positionals[0];
65
+ if (!file)
66
+ throw new Error("Usage: eudiplo config upgrade <bundle-or-document>");
67
+ const inputPath = resolvePath(file, context);
68
+ if (extname(inputPath).toLowerCase() === ".zip") {
69
+ return upgradeArchive(inputPath, file, parsed, context);
70
+ }
71
+ const input = JSON.parse(await readFile(inputPath, "utf8"));
72
+ const results = Array.isArray(input.documents)
73
+ ? input.documents.map((document) => upgradeDocument(document))
74
+ : [upgradeDocument(input)];
75
+ const output = Array.isArray(input.documents)
76
+ ? upgradeJsonBundle(input, results)
77
+ : results[0].document;
78
+ const report = results.flatMap((result) => result.issues);
79
+ const outputPath = resolvePath(readStringFlag(parsed.flags, "output") ?? `${file}.upgraded.json`, context);
80
+ if (parsed.flags["dry-run"] !== true) {
81
+ await writeFile(outputPath, `${JSON.stringify(output, null, 2)}\n`, {
82
+ mode: 0o600,
83
+ });
84
+ context.stdout.write(`Wrote upgraded configuration to ${outputPath}\n`);
85
+ }
86
+ for (const result of results) {
87
+ for (const migration of result.migrations) {
88
+ context.stdout.write(`Applied ${migration}\n`);
89
+ }
90
+ }
91
+ for (const issue of report) {
92
+ context.stderr.write(`${issue.severity} ${issue.code} ${issue.path}: ${issue.message}\n`);
93
+ }
94
+ return report.some((issue) => issue.severity !== "warning") ? 1 : 0;
95
+ }
96
+ function upgradeJsonBundle(input, results) {
97
+ const documents = results.map((result) => result.document);
98
+ const resources = (input.manifest?.resources ?? []).map((resource) => {
99
+ const document = documents.find((candidate) => candidate.kind === resource.kind &&
100
+ candidate.metadata.id === resource.id);
101
+ if (!document)
102
+ return resource;
103
+ return {
104
+ ...resource,
105
+ apiVersion: document.apiVersion,
106
+ sha256: createHash("sha256")
107
+ .update(JSON.stringify(document))
108
+ .digest("hex"),
109
+ };
110
+ });
111
+ return {
112
+ ...input,
113
+ manifest: { ...input.manifest, resources },
114
+ documents,
115
+ };
116
+ }
117
+ async function upgradeArchive(inputPath, displayPath, parsed, context) {
118
+ const entries = unzipSync(new Uint8Array(await readFile(inputPath)));
119
+ const manifestBytes = entries["manifest.json"];
120
+ if (!manifestBytes)
121
+ throw new Error("Configuration ZIP has no manifest.json");
122
+ const manifest = JSON.parse(strFromU8(manifestBytes));
123
+ const reports = [];
124
+ for (const resource of manifest.resources ?? []) {
125
+ const bytes = entries[resource.path];
126
+ if (!bytes)
127
+ throw new Error(`Configuration ZIP is missing ${resource.path}`);
128
+ const result = upgradeDocument(JSON.parse(strFromU8(bytes)));
129
+ reports.push(result);
130
+ const output = strToU8(JSON.stringify(result.document));
131
+ entries[resource.path] = output;
132
+ resource.apiVersion = result.document.apiVersion;
133
+ resource.sha256 = createHash("sha256").update(output).digest("hex");
134
+ }
135
+ entries["manifest.json"] = strToU8(JSON.stringify(manifest, null, 2));
136
+ const outputPath = resolvePath(readStringFlag(parsed.flags, "output") ?? `${displayPath}.upgraded.zip`, context);
137
+ if (parsed.flags["dry-run"] !== true) {
138
+ await writeFile(outputPath, Buffer.from(zipSync(entries, { level: 6 })), {
139
+ mode: 0o600,
140
+ });
141
+ context.stdout.write(`Wrote upgraded configuration to ${outputPath}\n`);
142
+ }
143
+ for (const result of reports) {
144
+ for (const migration of result.migrations) {
145
+ context.stdout.write(`Applied ${migration}\n`);
146
+ }
147
+ for (const issue of result.issues) {
148
+ context.stderr.write(`${issue.severity} ${issue.code} ${issue.path}: ${issue.message}\n`);
149
+ }
150
+ }
151
+ return reports.some((result) => result.issues.some((issue) => issue.severity !== "warning"))
152
+ ? 1
153
+ : 0;
154
+ }
155
+ function resolvePath(value, context) {
156
+ return isAbsolute(value) ? value : join(context.cwd, value);
157
+ }
158
+ async function assertOk(response) {
159
+ if (response.ok)
160
+ return;
161
+ const body = await response.text();
162
+ throw new Error(`EUDIPLO API returned ${response.status}: ${body}`);
163
+ }
164
+ //# sourceMappingURL=action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action.js","sourceRoot":"","sources":["../../../../src/commands/config/portability/action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAE1E,OAAO,EAAE,eAAe,EAAyB,MAAM,iBAAiB,CAAC;AAIzE,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACvC,MAAc,EACd,MAAiB,EACjB,MAAkB,EAClB,OAAuB;IAEvB,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9D,MAAM,CAAC,EAAE,QAAQ,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrD,MAAM,KAAK,GACP,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IACvE,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACX,2DAA2D,CAC9D,CAAC;IACN,CAAC;IACD,MAAM,WAAW,GAAG;QAChB,aAAa,EAAE,UAAU,KAAK,EAAE;KACnC,CAAC;IACF,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAEhD,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACtB,MAAM,MAAM,GAAG,WAAW,CACtB,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC;YAClC,2BAA2B,EAC/B,OAAO,CACV,CAAC;QACF,MAAM,MAAM,GACR,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;QAC/D,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,KAAK,CAChC,GAAG,OAAO,qCAAqC,MAAM,EAAE,EACvD,EAAE,OAAO,EAAE,WAAW,EAAE,CAC3B,CAAC;QACF,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACzB,MAAM,IAAI,GACN,MAAM,KAAK,KAAK;YACZ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;YAC3C,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;QAChE,MAAM,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oCAAoC,MAAM,IAAI,CAAC,CAAC;QACrE,OAAO,CAAC,CAAC;IACb,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,MAAM,WAAW,CAAC,CAAC;IACvE,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC;IAC7D,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,QAAQ,CAAC;IAC9D,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,IAAI,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,KAAK,IAAI,EAAE,CAAC;QAC3C,KAAK,CAAC,GAAG,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IACD,IAAI,IAAc,CAAC;IACnB,IAAI,OAAO,GAA2B,WAAW,CAAC;IAClD,IAAI,QAAQ,GAAW,MAAM,CAAC;IAC9B,IAAI,OAAO,EAAE,CAAC;QACV,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,GAAG,CACJ,QAAQ,EACR,IAAI,IAAI,CAAC,CAAC,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,EACnE,QAAQ,CAAC,UAAU,CAAC,CACvB,CAAC;QACF,IAAI,GAAG,IAAI,CAAC;QACZ,QAAQ,GAAG,GAAG,MAAM,UAAU,CAAC;IACnC,CAAC;SAAM,CAAC;QACJ,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;QAC9D,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,GAAG,EAAE,GAAG,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;IACjE,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,KAAK,CAChC,GAAG,OAAO,uBAAuB,QAAQ,IAAI,KAAK,EAAE,EACpD,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CACpC,CAAC;IACF,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACzB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACrC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAC7D,OAAQ,MAAc,CAAC,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,KAAK,UAAU,WAAW,CACtB,MAAkB,EAClB,OAAuB;IAEvB,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,CAAC,IAAI;QACL,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IAC1E,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC7C,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;QAC9C,OAAO,cAAc,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5D,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5D,MAAM,OAAO,GAA8C,KAAK,CAAC,OAAO,CACpE,KAAK,CAAC,SAAS,CAClB;QACG,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAA0B,EAAE,EAAE,CAC/C,eAAe,CAAC,QAAQ,CAAC,CAC5B;QACH,CAAC,CAAC,CAAC,eAAe,CAAC,KAAyB,CAAC,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC;QACzC,CAAC,CAAC,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC;QACnC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1D,MAAM,UAAU,GAAG,WAAW,CAC1B,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,gBAAgB,EACjE,OAAO,CACV,CAAC;IACF,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC;QACnC,MAAM,SAAS,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;YAChE,IAAI,EAAE,KAAK;SACd,CAAC,CAAC;QACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,UAAU,IAAI,CAAC,CAAC;IAC5E,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC3B,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACxC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,SAAS,IAAI,CAAC,CAAC;QACnD,CAAC;IACL,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAChB,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,IAAI,CACtE,CAAC;IACN,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,iBAAiB,CACtB,KAAU,EACV,OAAkD;IAElD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC3D,MAAM,SAAS,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,QAAa,EAAE,EAAE;QACtE,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAC3B,CAAC,SAAS,EAAE,EAAE,CACV,SAAS,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI;YAChC,SAAS,CAAC,QAAQ,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE,CAC5C,CAAC;QACF,IAAI,CAAC,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAC/B,OAAO;YACH,GAAG,QAAQ;YACX,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC;iBACvB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;iBAChC,MAAM,CAAC,KAAK,CAAC;SACrB,CAAC;IACN,CAAC,CAAC,CAAC;IACH,OAAO;QACH,GAAG,KAAK;QACR,QAAQ,EAAE,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE;QAC1C,SAAS;KACZ,CAAC;AACN,CAAC;AAED,KAAK,UAAU,cAAc,CACzB,SAAiB,EACjB,WAAmB,EACnB,MAAkB,EAClB,OAAuB;IAEvB,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,UAAU,CAAC,MAAM,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACrE,MAAM,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC/C,IAAI,CAAC,aAAa;QACd,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC;IACtD,MAAM,OAAO,GAA8C,EAAE,CAAC;IAC9D,KAAK,MAAM,QAAQ,IAAI,QAAQ,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK;YACN,MAAM,IAAI,KAAK,CAAC,gCAAgC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QACrE,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrB,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;QAChC,QAAQ,CAAC,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;QACjD,QAAQ,CAAC,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACtE,MAAM,UAAU,GAAG,WAAW,CAC1B,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,GAAG,WAAW,eAAe,EACvE,OAAO,CACV,CAAC;IACF,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC;QACnC,MAAM,SAAS,CACX,UAAU,EACV,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,EAC3C;YACI,IAAI,EAAE,KAAK;SACd,CACJ,CAAC;QACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,UAAU,IAAI,CAAC,CAAC;IAC5E,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC3B,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACxC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,SAAS,IAAI,CAAC,CAAC;QACnD,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAChB,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,IAAI,CACtE,CAAC;QACN,CAAC;IACL,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAC3B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAC9D;QACG,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,CAAC,CAAC;AACZ,CAAC;AAED,SAAS,WAAW,CAAC,KAAa,EAAE,OAAuB;IACvD,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAChE,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,QAAkB;IACtC,IAAI,QAAQ,CAAC,EAAE;QAAE,OAAO;IACxB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnC,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;AACxE,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 createPortabilityCommands(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/portability/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,yBAAyB,CACrC,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE,WAAW,GACzB,OAAO,EAAE,CA4DX"}
@@ -0,0 +1,44 @@
1
+ import { Command, Option } from "commander";
2
+ import { loadCliState, parsedArgs } from "../../shared.js";
3
+ import { runPortabilityCommand } from "./action.js";
4
+ export function createPortabilityCommands(context, setExitCode) {
5
+ const remote = (name) => {
6
+ const command = new Command(name)
7
+ .description(name === "export"
8
+ ? "Export a tenant configuration bundle"
9
+ : `${name === "plan" ? "Plan" : "Apply"} a tenant configuration bundle`)
10
+ .option("--instance <name>", "select a configured instance")
11
+ .option("--token <token>", "management API access token");
12
+ if (name === "export") {
13
+ command.option("--output <path>", "output bundle path");
14
+ }
15
+ else {
16
+ command
17
+ .argument("<bundle>")
18
+ .addOption(new Option("--mode <mode>", "import mode")
19
+ .choices(["create", "upsert", "replace"])
20
+ .default("upsert"));
21
+ if (name === "import") {
22
+ command.option("--confirm-replace", "confirm deletion semantics for replace mode");
23
+ }
24
+ }
25
+ command.action(async (...args) => {
26
+ const options = args.at(-2);
27
+ const positionals = name === "export" ? [] : [String(args[0])];
28
+ const { config } = await loadCliState(context);
29
+ setExitCode(await runPortabilityCommand(name, config, parsedArgs("config", name, positionals, options), context));
30
+ });
31
+ return command;
32
+ };
33
+ const upgrade = new Command("upgrade")
34
+ .description("Upgrade a local configuration document or bundle")
35
+ .argument("<file>")
36
+ .option("--output <path>", "write upgraded JSON to this path")
37
+ .option("--dry-run", "report migrations without writing output")
38
+ .action(async (file, options) => {
39
+ const { config } = await loadCliState(context);
40
+ setExitCode(await runPortabilityCommand("upgrade", config, parsedArgs("config", "upgrade", [file], options), context));
41
+ });
42
+ return [remote("export"), remote("plan"), remote("import"), upgrade];
43
+ }
44
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/config/portability/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAE5C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAoB,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,UAAU,yBAAyB,CACrC,OAAuB,EACvB,WAAwB;IAExB,MAAM,MAAM,GAAG,CAAC,IAAkC,EAAE,EAAE;QAClD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;aAC5B,WAAW,CACR,IAAI,KAAK,QAAQ;YACb,CAAC,CAAC,sCAAsC;YACxC,CAAC,CAAC,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,gCAAgC,CAC9E;aACA,MAAM,CAAC,mBAAmB,EAAE,8BAA8B,CAAC;aAC3D,MAAM,CAAC,iBAAiB,EAAE,6BAA6B,CAAC,CAAC;QAC9D,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACpB,OAAO,CAAC,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACJ,OAAO;iBACF,QAAQ,CAAC,UAAU,CAAC;iBACpB,SAAS,CACN,IAAI,MAAM,CAAC,eAAe,EAAE,aAAa,CAAC;iBACrC,OAAO,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;iBACxC,OAAO,CAAC,QAAQ,CAAC,CACzB,CAAC;YACN,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACpB,OAAO,CAAC,MAAM,CACV,mBAAmB,EACnB,6CAA6C,CAChD,CAAC;YACN,CAAC;QACL,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,IAAW,EAAE,EAAE;YACpC,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAqC,CAAC;YAChE,MAAM,WAAW,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;YAC/C,WAAW,CACP,MAAM,qBAAqB,CACvB,IAAI,EACJ,MAAM,EACN,UAAU,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,EAChD,OAAO,CACV,CACJ,CAAC;QACN,CAAC,CAAC,CAAC;QACH,OAAO,OAAO,CAAC;IACnB,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;SACjC,WAAW,CAAC,kDAAkD,CAAC;SAC/D,QAAQ,CAAC,QAAQ,CAAC;SAClB,MAAM,CAAC,iBAAiB,EAAE,kCAAkC,CAAC;SAC7D,MAAM,CAAC,WAAW,EAAE,0CAA0C,CAAC;SAC/D,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;QAC5B,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;QAC/C,WAAW,CACP,MAAM,qBAAqB,CACvB,SAAS,EACT,MAAM,EACN,UAAU,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,EAChD,OAAO,CACV,CACJ,CAAC;IACN,CAAC,CAAC,CAAC;IACP,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;AACzE,CAAC"}
@@ -0,0 +1,24 @@
1
+ type Kind = "Tenant" | "Client" | "KmsConfig" | "KeyChain" | "RegistrarConfig" | "IssuanceConfig" | "CredentialConfig" | "PresentationConfig" | "AttributeProvider" | "WebhookEndpoint" | "TrustList" | "StatusList";
2
+ export interface PortableDocument {
3
+ apiVersion: string;
4
+ kind: Kind;
5
+ metadata: {
6
+ id: string;
7
+ generation?: number;
8
+ ownership?: string;
9
+ };
10
+ spec: Record<string, any>;
11
+ }
12
+ export interface UpgradeIssue {
13
+ severity: "warning" | "required-input" | "error";
14
+ code: string;
15
+ path: string;
16
+ message: string;
17
+ }
18
+ export declare function upgradeDocument(input: PortableDocument): {
19
+ document: PortableDocument;
20
+ migrations: string[];
21
+ issues: UpgradeIssue[];
22
+ };
23
+ export {};
24
+ //# sourceMappingURL=migrations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../../../src/commands/config/portability/migrations.ts"],"names":[],"mappings":"AAAA,KAAK,IAAI,GACH,QAAQ,GACR,QAAQ,GACR,WAAW,GACX,UAAU,GACV,iBAAiB,GACjB,gBAAgB,GAChB,kBAAkB,GAClB,oBAAoB,GACpB,mBAAmB,GACnB,iBAAiB,GACjB,WAAW,GACX,YAAY,CAAC;AAEnB,MAAM,WAAW,gBAAgB;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAClE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IACzB,QAAQ,EAAE,SAAS,GAAG,gBAAgB,GAAG,OAAO,CAAC;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACnB;AAiBD,wBAAgB,eAAe,CAAC,KAAK,EAAE,gBAAgB,GAAG;IACtD,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,EAAE,YAAY,EAAE,CAAC;CAC1B,CAgGA"}