@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.
- package/README.md +21 -0
- package/dist/commands/commands/index.d.ts +4 -0
- package/dist/commands/commands/index.d.ts.map +1 -0
- package/dist/commands/commands/index.js +13 -0
- package/dist/commands/commands/index.js.map +1 -0
- package/dist/commands/commands/render.d.ts +4 -0
- package/dist/commands/commands/render.d.ts.map +1 -0
- package/dist/commands/commands/render.js +52 -0
- package/dist/commands/commands/render.js.map +1 -0
- package/dist/commands/config/editor/action.d.ts +3 -0
- package/dist/commands/config/editor/action.d.ts.map +1 -0
- package/dist/commands/config/editor/action.js +112 -0
- package/dist/commands/config/editor/action.js.map +1 -0
- package/dist/commands/config/editor/index.d.ts +5 -0
- package/dist/commands/config/editor/index.d.ts.map +1 -0
- package/dist/commands/config/editor/index.js +20 -0
- package/dist/commands/config/editor/index.js.map +1 -0
- package/dist/commands/config/index.d.ts.map +1 -1
- package/dist/commands/config/index.js +6 -0
- package/dist/commands/config/index.js.map +1 -1
- package/dist/commands/config/portability/action.d.ts +5 -0
- package/dist/commands/config/portability/action.d.ts.map +1 -0
- package/dist/commands/config/portability/action.js +164 -0
- package/dist/commands/config/portability/action.js.map +1 -0
- package/dist/commands/config/portability/index.d.ts +5 -0
- package/dist/commands/config/portability/index.d.ts.map +1 -0
- package/dist/commands/config/portability/index.js +44 -0
- package/dist/commands/config/portability/index.js.map +1 -0
- package/dist/commands/config/portability/migrations.d.ts +24 -0
- package/dist/commands/config/portability/migrations.d.ts.map +1 -0
- package/dist/commands/config/portability/migrations.js +95 -0
- package/dist/commands/config/portability/migrations.js.map +1 -0
- package/dist/commands/config/portability/migrations.spec.d.ts +2 -0
- package/dist/commands/config/portability/migrations.spec.d.ts.map +1 -0
- package/dist/commands/config/portability/migrations.spec.js +32 -0
- package/dist/commands/config/portability/migrations.spec.js.map +1 -0
- package/dist/commands/config/tenant/action.d.ts.map +1 -1
- package/dist/commands/config/tenant/action.js +7 -4
- package/dist/commands/config/tenant/action.js.map +1 -1
- package/dist/commands/config/tenant/index.d.ts.map +1 -1
- package/dist/commands/config/tenant/index.js.map +1 -1
- package/dist/commands/config/validate/action.d.ts.map +1 -1
- package/dist/commands/config/validate/action.js +3 -1
- package/dist/commands/config/validate/action.js.map +1 -1
- package/dist/commands/config/validate/registry.d.ts +1 -0
- package/dist/commands/config/validate/registry.d.ts.map +1 -1
- package/dist/commands/config/validate/registry.js +1 -1
- package/dist/commands/config/validate/registry.js.map +1 -1
- package/dist/commands/config/validate/registry.json +11 -22
- package/dist/commands/config/validate/report.d.ts.map +1 -1
- package/dist/commands/config/validate/report.js +6 -1
- package/dist/commands/config/validate/report.js.map +1 -1
- package/dist/commands/config/validate/schemas.d.ts +1 -0
- package/dist/commands/config/validate/schemas.d.ts.map +1 -1
- package/dist/commands/config/validate/schemas.js +16 -5
- package/dist/commands/config/validate/schemas.js.map +1 -1
- package/dist/commands/config/validate/types.d.ts.map +1 -1
- package/dist/commands/config/validate/validator.d.ts.map +1 -1
- package/dist/commands/config/validate/validator.js +13 -5
- package/dist/commands/config/validate/validator.js.map +1 -1
- package/dist/commands/demo/action.d.ts.map +1 -1
- package/dist/commands/demo/action.js +2 -1
- package/dist/commands/demo/action.js.map +1 -1
- package/dist/commands/demo/index.d.ts.map +1 -1
- package/dist/commands/demo/index.js.map +1 -1
- package/dist/commands/deployment/action.d.ts.map +1 -1
- package/dist/commands/deployment/action.js +10 -3
- package/dist/commands/deployment/action.js.map +1 -1
- package/dist/commands/deployment/index.d.ts.map +1 -1
- package/dist/commands/deployment/index.js.map +1 -1
- package/dist/commands/doctor/action.d.ts.map +1 -1
- package/dist/commands/doctor/action.js +1 -1
- package/dist/commands/doctor/action.js.map +1 -1
- package/dist/commands/init/action.d.ts.map +1 -1
- package/dist/commands/init/action.js +19 -6
- package/dist/commands/init/action.js.map +1 -1
- package/dist/commands/init/index.d.ts.map +1 -1
- package/dist/commands/init/index.js.map +1 -1
- package/dist/commands/instance/action.d.ts.map +1 -1
- package/dist/commands/instance/action.js.map +1 -1
- package/dist/commands/shared.d.ts.map +1 -1
- package/dist/commands/shared.js +4 -1
- package/dist/commands/shared.js.map +1 -1
- package/dist/commands/status/action.d.ts.map +1 -1
- package/dist/commands/status/action.js.map +1 -1
- package/dist/commands/version/action.d.ts.map +1 -1
- package/dist/commands/version/action.js +3 -1
- package/dist/commands/version/action.js.map +1 -1
- package/dist/index.js +0 -0
- package/dist/runtime.d.ts +2 -0
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +3 -1
- package/dist/runtime.js.map +1 -1
- package/dist/sea-assets.d.ts +4 -2
- package/dist/sea-assets.d.ts.map +1 -1
- package/dist/sea-assets.js +6 -3
- package/dist/sea-assets.js.map +1 -1
- package/dist/services/cli-config.d.ts.map +1 -1
- package/dist/services/cli-config.js +2 -1
- package/dist/services/cli-config.js.map +1 -1
- package/dist/services/compose-project.d.ts.map +1 -1
- package/dist/services/compose-project.js +14 -6
- package/dist/services/compose-project.js.map +1 -1
- package/dist/services/deployment-drivers.d.ts.map +1 -1
- package/dist/services/deployment-drivers.js +20 -6
- package/dist/services/deployment-drivers.js.map +1 -1
- package/dist/services/diagnostics.d.ts.map +1 -1
- package/dist/services/diagnostics.js +3 -1
- package/dist/services/diagnostics.js.map +1 -1
- package/dist/services/instance-selection.d.ts.map +1 -1
- package/dist/services/instance-selection.js.map +1 -1
- package/dist/services/project-directory.d.ts.map +1 -1
- package/dist/services/project-directory.js.map +1 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +5 -3
- package/templates/demo-config/issuance/issuance.json +20 -12
- package/templates/demo-config/key-chains/access.json +13 -2
- package/templates/demo-config/key-chains/attestation.json +15 -4
- package/templates/demo-config/key-chains/status-list.json +15 -4
- package/templates/demo-config/key-chains/trust-list.json +13 -2
- package/templates/demo-config/presentation/age-over-18.json +46 -53
- package/templates/demo-config/presentation/pid.json +44 -0
- package/templates/demo-config.manifest.json +1 -0
- package/templates/schemas/AttributeProviderAuth.schema.json +60 -0
- package/templates/schemas/AttributeProviderConfigFile.schema.json +37 -0
- package/templates/schemas/CertImportDto.schema.json +35 -0
- package/templates/schemas/ClientConfigFile.schema.json +37 -0
- package/templates/schemas/ConfigDocumentMetadata.schema.json +25 -0
- package/templates/schemas/CreateStatusListDto.schema.json +46 -0
- package/templates/schemas/CreateTenantDto.schema.json +116 -0
- package/templates/schemas/CredentialConfigFile.schema.json +37 -0
- package/templates/schemas/DCQL.schema.json +401 -0
- package/templates/schemas/EmbeddedDisclosurePolicy.schema.json +106 -0
- package/templates/schemas/ImportTenantDto.schema.json +69 -0
- package/templates/schemas/IssuanceConfigFile.schema.json +32 -0
- package/templates/schemas/KeyChainConfigFile.schema.json +101 -0
- package/templates/schemas/KeyChainCreateDto.schema.json +66 -0
- package/templates/schemas/KeyChainUpdateDto.schema.json +40 -0
- package/templates/schemas/KmsConfigFile.schema.json +37 -0
- package/templates/schemas/PresentationConfigFile.schema.json +32 -0
- package/templates/schemas/RegistrarConfigFile.schema.json +37 -0
- package/templates/schemas/RotationPolicyCreateDto.schema.json +28 -0
- package/templates/schemas/RotationPolicyUpdateDto.schema.json +25 -0
- package/templates/schemas/SessionStorageConfig.schema.json +24 -0
- package/templates/schemas/StatusListConfig.schema.json +51 -0
- package/templates/schemas/StatusListConfigFile.schema.json +37 -0
- package/templates/schemas/TransactionData.schema.json +24 -0
- package/templates/schemas/TrustListConfigFile.schema.json +37 -0
- package/templates/schemas/UpdateAttributeProviderDto.schema.json +93 -0
- package/templates/schemas/UpdateClientDto.schema.json +62 -0
- package/templates/schemas/UpdateStatusListConfigDto.schema.json +85 -0
- package/templates/schemas/UpdateStatusListDto.schema.json +33 -0
- package/templates/schemas/UpdateTenantDto.schema.json +96 -0
- package/templates/schemas/UpdateWebhookEndpointDto.schema.json +93 -0
- package/templates/schemas/VCT.schema.json +37 -0
- package/templates/schemas/WebhookConfig.schema.json +80 -0
- package/templates/schemas/WebhookEndpointConfigFile.schema.json +37 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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;
|
|
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,
|
|
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":"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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 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"}
|