@twin.org/identity-cli 0.0.3-next.19 → 0.0.3-next.20
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/dist/es/cli.js +9 -1
- package/dist/es/cli.js.map +1 -1
- package/dist/es/commands/alsoKnownAsAdd.js +108 -0
- package/dist/es/commands/alsoKnownAsAdd.js.map +1 -0
- package/dist/es/commands/alsoKnownAsRemove.js +106 -0
- package/dist/es/commands/alsoKnownAsRemove.js.map +1 -0
- package/dist/es/commands/verifiableCredentialCreate.js +10 -7
- package/dist/es/commands/verifiableCredentialCreate.js.map +1 -1
- package/dist/es/commands/verifiableCredentialVerify.js +24 -5
- package/dist/es/commands/verifiableCredentialVerify.js.map +1 -1
- package/dist/es/commands/verifiablePresentationCreate.js +137 -0
- package/dist/es/commands/verifiablePresentationCreate.js.map +1 -0
- package/dist/es/commands/verifiablePresentationVerify.js +107 -0
- package/dist/es/commands/verifiablePresentationVerify.js.map +1 -0
- package/dist/es/index.js +2 -0
- package/dist/es/index.js.map +1 -1
- package/dist/locales/en.json +142 -2
- package/dist/types/commands/alsoKnownAsAdd.d.ts +30 -0
- package/dist/types/commands/alsoKnownAsRemove.d.ts +30 -0
- package/dist/types/commands/verifiableCredentialCreate.d.ts +2 -2
- package/dist/types/commands/verifiableCredentialVerify.d.ts +3 -1
- package/dist/types/commands/verifiablePresentationCreate.d.ts +32 -0
- package/dist/types/commands/verifiablePresentationVerify.d.ts +24 -0
- package/dist/types/index.d.ts +2 -0
- package/docs/changelog.md +15 -0
- package/docs/reference/functions/actionCommandVerifiablePresentationCreate.md +17 -0
- package/docs/reference/functions/actionCommandVerifiablePresentationVerify.md +17 -0
- package/docs/reference/functions/buildCommandVerifiablePresentationCreate.md +11 -0
- package/docs/reference/functions/buildCommandVerifiablePresentationVerify.md +11 -0
- package/docs/reference/index.md +4 -0
- package/locales/en.json +142 -2
- package/package.json +3 -3
package/dist/es/cli.js
CHANGED
|
@@ -5,6 +5,8 @@ import { fileURLToPath } from "node:url";
|
|
|
5
5
|
import { CLIBase } from "@twin.org/cli-core";
|
|
6
6
|
import { buildCommandAddress, buildCommandMnemonic } from "@twin.org/crypto-cli";
|
|
7
7
|
import { buildCommandFaucet, buildCommandTransfer } from "@twin.org/wallet-cli";
|
|
8
|
+
import { buildCommandAlsoKnownAsAdd } from "./commands/alsoKnownAsAdd.js";
|
|
9
|
+
import { buildCommandAlsoKnownAsRemove } from "./commands/alsoKnownAsRemove.js";
|
|
8
10
|
import { buildCommandIdentityCreate } from "./commands/identityCreate.js";
|
|
9
11
|
import { buildCommandIdentityResolve } from "./commands/identityResolve.js";
|
|
10
12
|
import { buildCommandProofCreate } from "./commands/proofCreate.js";
|
|
@@ -15,6 +17,8 @@ import { buildCommandVerifiableCredentialCreate } from "./commands/verifiableCre
|
|
|
15
17
|
import { buildCommandVerifiableCredentialRevoke } from "./commands/verifiableCredentialRevoke.js";
|
|
16
18
|
import { buildCommandVerifiableCredentialUnrevoke } from "./commands/verifiableCredentialUnrevoke.js";
|
|
17
19
|
import { buildCommandVerifiableCredentialVerify } from "./commands/verifiableCredentialVerify.js";
|
|
20
|
+
import { buildCommandVerifiablePresentationCreate } from "./commands/verifiablePresentationCreate.js";
|
|
21
|
+
import { buildCommandVerifiablePresentationVerify } from "./commands/verifiablePresentationVerify.js";
|
|
18
22
|
import { buildCommandVerificationMethodAdd } from "./commands/verificationMethodAdd.js";
|
|
19
23
|
import { buildCommandVerificationMethodRemove } from "./commands/verificationMethodRemove.js";
|
|
20
24
|
/**
|
|
@@ -33,7 +37,7 @@ export class CLI extends CLIBase {
|
|
|
33
37
|
return this.execute({
|
|
34
38
|
title: "TWIN Identity",
|
|
35
39
|
appName: "twin-identity",
|
|
36
|
-
version: "0.0.3-next.
|
|
40
|
+
version: "0.0.3-next.20", // x-release-please-version
|
|
37
41
|
icon: "🌍",
|
|
38
42
|
supportsEnvFiles: true,
|
|
39
43
|
overrideOutputWidth: options?.overrideOutputWidth,
|
|
@@ -57,7 +61,11 @@ export class CLI extends CLIBase {
|
|
|
57
61
|
buildCommandVerificationMethodRemove(),
|
|
58
62
|
buildCommandServiceAdd(),
|
|
59
63
|
buildCommandServiceRemove(),
|
|
64
|
+
buildCommandAlsoKnownAsAdd(),
|
|
65
|
+
buildCommandAlsoKnownAsRemove(),
|
|
60
66
|
buildCommandVerifiableCredentialCreate(),
|
|
67
|
+
buildCommandVerifiablePresentationCreate(),
|
|
68
|
+
buildCommandVerifiablePresentationVerify(),
|
|
61
69
|
buildCommandVerifiableCredentialVerify(),
|
|
62
70
|
buildCommandVerifiableCredentialRevoke(),
|
|
63
71
|
buildCommandVerifiableCredentialUnrevoke(),
|
package/dist/es/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC;AACvC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEhF,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,sCAAsC,EAAE,MAAM,0CAA0C,CAAC;AAClG,OAAO,EAAE,sCAAsC,EAAE,MAAM,0CAA0C,CAAC;AAClG,OAAO,EAAE,wCAAwC,EAAE,MAAM,4CAA4C,CAAC;AACtG,OAAO,EAAE,sCAAsC,EAAE,MAAM,0CAA0C,CAAC;AAClG,OAAO,EAAE,iCAAiC,EAAE,MAAM,qCAAqC,CAAC;AACxF,OAAO,EAAE,oCAAoC,EAAE,MAAM,wCAAwC,CAAC;AAE9F;;GAEG;AACH,MAAM,OAAO,GAAI,SAAQ,OAAO;IAC/B;;;;;;;OAOG;IACI,KAAK,CAAC,GAAG,CACf,IAAc,EACd,gBAAyB,EACzB,OAA0C;QAE1C,OAAO,IAAI,CAAC,OAAO,CAClB;YACC,KAAK,EAAE,eAAe;YACtB,OAAO,EAAE,eAAe;YACxB,OAAO,EAAE,eAAe,EAAE,2BAA2B;YACrD,IAAI,EAAE,IAAI;YACV,gBAAgB,EAAE,IAAI;YACtB,mBAAmB,EAAE,OAAO,EAAE,mBAAmB;YACjD,kBAAkB,EAAE,IAAI;SACxB,EACD,gBAAgB,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,EACzF,IAAI,CACJ,CAAC;IACH,CAAC;IAED;;;;OAIG;IACO,WAAW,CAAC,OAAgB;QACrC,OAAO;YACN,oBAAoB,EAAE;YACtB,mBAAmB,EAAE;YACrB,kBAAkB,EAAE;YACpB,oBAAoB,EAAE;YACtB,0BAA0B,EAAE;YAC5B,2BAA2B,EAAE;YAC7B,iCAAiC,EAAE;YACnC,oCAAoC,EAAE;YACtC,sBAAsB,EAAE;YACxB,yBAAyB,EAAE;YAC3B,sCAAsC,EAAE;YACxC,sCAAsC,EAAE;YACxC,sCAAsC,EAAE;YACxC,wCAAwC,EAAE;YAC1C,uBAAuB,EAAE;YACzB,uBAAuB,EAAE;SACzB,CAAC;IACH,CAAC;CACD","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { CLIBase } from \"@twin.org/cli-core\";\nimport { buildCommandAddress, buildCommandMnemonic } from \"@twin.org/crypto-cli\";\nimport { buildCommandFaucet, buildCommandTransfer } from \"@twin.org/wallet-cli\";\nimport type { Command } from \"commander\";\nimport { buildCommandIdentityCreate } from \"./commands/identityCreate.js\";\nimport { buildCommandIdentityResolve } from \"./commands/identityResolve.js\";\nimport { buildCommandProofCreate } from \"./commands/proofCreate.js\";\nimport { buildCommandProofVerify } from \"./commands/proofVerify.js\";\nimport { buildCommandServiceAdd } from \"./commands/serviceAdd.js\";\nimport { buildCommandServiceRemove } from \"./commands/serviceRemove.js\";\nimport { buildCommandVerifiableCredentialCreate } from \"./commands/verifiableCredentialCreate.js\";\nimport { buildCommandVerifiableCredentialRevoke } from \"./commands/verifiableCredentialRevoke.js\";\nimport { buildCommandVerifiableCredentialUnrevoke } from \"./commands/verifiableCredentialUnrevoke.js\";\nimport { buildCommandVerifiableCredentialVerify } from \"./commands/verifiableCredentialVerify.js\";\nimport { buildCommandVerificationMethodAdd } from \"./commands/verificationMethodAdd.js\";\nimport { buildCommandVerificationMethodRemove } from \"./commands/verificationMethodRemove.js\";\n\n/**\n * The main entry point for the CLI.\n */\nexport class CLI extends CLIBase {\n\t/**\n\t * Run the app.\n\t * @param argv The process arguments.\n\t * @param localesDirectory The directory for the locales, default to relative to the script.\n\t * @param options Additional options for the CLI.\n\t * @param options.overrideOutputWidth The override output width.\n\t * @returns The exit code.\n\t */\n\tpublic async run(\n\t\targv: string[],\n\t\tlocalesDirectory?: string,\n\t\toptions?: { overrideOutputWidth?: number }\n\t): Promise<number> {\n\t\treturn this.execute(\n\t\t\t{\n\t\t\t\ttitle: \"TWIN Identity\",\n\t\t\t\tappName: \"twin-identity\",\n\t\t\t\tversion: \"0.0.3-next.
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC;AACvC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEhF,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,sCAAsC,EAAE,MAAM,0CAA0C,CAAC;AAClG,OAAO,EAAE,sCAAsC,EAAE,MAAM,0CAA0C,CAAC;AAClG,OAAO,EAAE,wCAAwC,EAAE,MAAM,4CAA4C,CAAC;AACtG,OAAO,EAAE,sCAAsC,EAAE,MAAM,0CAA0C,CAAC;AAClG,OAAO,EAAE,wCAAwC,EAAE,MAAM,4CAA4C,CAAC;AACtG,OAAO,EAAE,wCAAwC,EAAE,MAAM,4CAA4C,CAAC;AACtG,OAAO,EAAE,iCAAiC,EAAE,MAAM,qCAAqC,CAAC;AACxF,OAAO,EAAE,oCAAoC,EAAE,MAAM,wCAAwC,CAAC;AAE9F;;GAEG;AACH,MAAM,OAAO,GAAI,SAAQ,OAAO;IAC/B;;;;;;;OAOG;IACI,KAAK,CAAC,GAAG,CACf,IAAc,EACd,gBAAyB,EACzB,OAA0C;QAE1C,OAAO,IAAI,CAAC,OAAO,CAClB;YACC,KAAK,EAAE,eAAe;YACtB,OAAO,EAAE,eAAe;YACxB,OAAO,EAAE,eAAe,EAAE,2BAA2B;YACrD,IAAI,EAAE,IAAI;YACV,gBAAgB,EAAE,IAAI;YACtB,mBAAmB,EAAE,OAAO,EAAE,mBAAmB;YACjD,kBAAkB,EAAE,IAAI;SACxB,EACD,gBAAgB,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,EACzF,IAAI,CACJ,CAAC;IACH,CAAC;IAED;;;;OAIG;IACO,WAAW,CAAC,OAAgB;QACrC,OAAO;YACN,oBAAoB,EAAE;YACtB,mBAAmB,EAAE;YACrB,kBAAkB,EAAE;YACpB,oBAAoB,EAAE;YACtB,0BAA0B,EAAE;YAC5B,2BAA2B,EAAE;YAC7B,iCAAiC,EAAE;YACnC,oCAAoC,EAAE;YACtC,sBAAsB,EAAE;YACxB,yBAAyB,EAAE;YAC3B,0BAA0B,EAAE;YAC5B,6BAA6B,EAAE;YAC/B,sCAAsC,EAAE;YACxC,wCAAwC,EAAE;YAC1C,wCAAwC,EAAE;YAC1C,sCAAsC,EAAE;YACxC,sCAAsC,EAAE;YACxC,wCAAwC,EAAE;YAC1C,uBAAuB,EAAE;YACzB,uBAAuB,EAAE;SACzB,CAAC;IACH,CAAC;CACD","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { CLIBase } from \"@twin.org/cli-core\";\nimport { buildCommandAddress, buildCommandMnemonic } from \"@twin.org/crypto-cli\";\nimport { buildCommandFaucet, buildCommandTransfer } from \"@twin.org/wallet-cli\";\nimport type { Command } from \"commander\";\nimport { buildCommandAlsoKnownAsAdd } from \"./commands/alsoKnownAsAdd.js\";\nimport { buildCommandAlsoKnownAsRemove } from \"./commands/alsoKnownAsRemove.js\";\nimport { buildCommandIdentityCreate } from \"./commands/identityCreate.js\";\nimport { buildCommandIdentityResolve } from \"./commands/identityResolve.js\";\nimport { buildCommandProofCreate } from \"./commands/proofCreate.js\";\nimport { buildCommandProofVerify } from \"./commands/proofVerify.js\";\nimport { buildCommandServiceAdd } from \"./commands/serviceAdd.js\";\nimport { buildCommandServiceRemove } from \"./commands/serviceRemove.js\";\nimport { buildCommandVerifiableCredentialCreate } from \"./commands/verifiableCredentialCreate.js\";\nimport { buildCommandVerifiableCredentialRevoke } from \"./commands/verifiableCredentialRevoke.js\";\nimport { buildCommandVerifiableCredentialUnrevoke } from \"./commands/verifiableCredentialUnrevoke.js\";\nimport { buildCommandVerifiableCredentialVerify } from \"./commands/verifiableCredentialVerify.js\";\nimport { buildCommandVerifiablePresentationCreate } from \"./commands/verifiablePresentationCreate.js\";\nimport { buildCommandVerifiablePresentationVerify } from \"./commands/verifiablePresentationVerify.js\";\nimport { buildCommandVerificationMethodAdd } from \"./commands/verificationMethodAdd.js\";\nimport { buildCommandVerificationMethodRemove } from \"./commands/verificationMethodRemove.js\";\n\n/**\n * The main entry point for the CLI.\n */\nexport class CLI extends CLIBase {\n\t/**\n\t * Run the app.\n\t * @param argv The process arguments.\n\t * @param localesDirectory The directory for the locales, default to relative to the script.\n\t * @param options Additional options for the CLI.\n\t * @param options.overrideOutputWidth The override output width.\n\t * @returns The exit code.\n\t */\n\tpublic async run(\n\t\targv: string[],\n\t\tlocalesDirectory?: string,\n\t\toptions?: { overrideOutputWidth?: number }\n\t): Promise<number> {\n\t\treturn this.execute(\n\t\t\t{\n\t\t\t\ttitle: \"TWIN Identity\",\n\t\t\t\tappName: \"twin-identity\",\n\t\t\t\tversion: \"0.0.3-next.20\", // x-release-please-version\n\t\t\t\ticon: \"🌍\",\n\t\t\t\tsupportsEnvFiles: true,\n\t\t\t\toverrideOutputWidth: options?.overrideOutputWidth,\n\t\t\t\tshowDevToolWarning: true\n\t\t\t},\n\t\t\tlocalesDirectory ?? path.join(path.dirname(fileURLToPath(import.meta.url)), \"../locales\"),\n\t\t\targv\n\t\t);\n\t}\n\n\t/**\n\t * Get the commands for the CLI.\n\t * @param program The main program to add the commands to.\n\t * @internal\n\t */\n\tprotected getCommands(program: Command): Command[] {\n\t\treturn [\n\t\t\tbuildCommandMnemonic(),\n\t\t\tbuildCommandAddress(),\n\t\t\tbuildCommandFaucet(),\n\t\t\tbuildCommandTransfer(),\n\t\t\tbuildCommandIdentityCreate(),\n\t\t\tbuildCommandIdentityResolve(),\n\t\t\tbuildCommandVerificationMethodAdd(),\n\t\t\tbuildCommandVerificationMethodRemove(),\n\t\t\tbuildCommandServiceAdd(),\n\t\t\tbuildCommandServiceRemove(),\n\t\t\tbuildCommandAlsoKnownAsAdd(),\n\t\t\tbuildCommandAlsoKnownAsRemove(),\n\t\t\tbuildCommandVerifiableCredentialCreate(),\n\t\t\tbuildCommandVerifiablePresentationCreate(),\n\t\t\tbuildCommandVerifiablePresentationVerify(),\n\t\t\tbuildCommandVerifiableCredentialVerify(),\n\t\t\tbuildCommandVerifiableCredentialRevoke(),\n\t\t\tbuildCommandVerifiableCredentialUnrevoke(),\n\t\t\tbuildCommandProofCreate(),\n\t\t\tbuildCommandProofVerify()\n\t\t];\n\t}\n}\n"]}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
// Copyright 2024 IOTA Stiftung.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0.
|
|
3
|
+
import { CLIDisplay, CLIOptions, CLIParam, CLIUtils } from "@twin.org/cli-core";
|
|
4
|
+
import { ArrayHelper, Converter, I18n, Is, StringHelper, Urn } from "@twin.org/core";
|
|
5
|
+
import { DocumentHelper } from "@twin.org/identity-models";
|
|
6
|
+
import { VaultConnectorFactory } from "@twin.org/vault-models";
|
|
7
|
+
import { setupWalletConnector } from "@twin.org/wallet-cli";
|
|
8
|
+
import { WalletConnectorFactory } from "@twin.org/wallet-models";
|
|
9
|
+
import { Command, Option } from "commander";
|
|
10
|
+
import { setupIdentityConnector, setupIdentityResolverConnector, setupVault } from "./setupCommands.js";
|
|
11
|
+
import { IdentityConnectorTypes } from "../models/identityConnectorTypes.js";
|
|
12
|
+
/**
|
|
13
|
+
* Build the alsoKnownAs add command for the CLI.
|
|
14
|
+
* @returns The command.
|
|
15
|
+
*/
|
|
16
|
+
export function buildCommandAlsoKnownAsAdd() {
|
|
17
|
+
const command = new Command();
|
|
18
|
+
command
|
|
19
|
+
.name("also-known-as-add")
|
|
20
|
+
.summary(I18n.formatMessage("commands.also-known-as-add.summary"))
|
|
21
|
+
.description(I18n.formatMessage("commands.also-known-as-add.description"))
|
|
22
|
+
.requiredOption(I18n.formatMessage("commands.also-known-as-add.options.seed.param"), I18n.formatMessage("commands.also-known-as-add.options.seed.description"))
|
|
23
|
+
.requiredOption(I18n.formatMessage("commands.also-known-as-add.options.did.param"), I18n.formatMessage("commands.also-known-as-add.options.did.description"))
|
|
24
|
+
.requiredOption(I18n.formatMessage("commands.also-known-as-add.options.alias.param"), I18n.formatMessage("commands.also-known-as-add.options.alias.description"))
|
|
25
|
+
.option(I18n.formatMessage("commands.also-known-as-add.options.addressIndex.param"), I18n.formatMessage("commands.also-known-as-add.options.addressIndex.description"), "0");
|
|
26
|
+
CLIOptions.output(command, {
|
|
27
|
+
noConsole: true,
|
|
28
|
+
json: true,
|
|
29
|
+
env: true,
|
|
30
|
+
mergeJson: true,
|
|
31
|
+
mergeEnv: true
|
|
32
|
+
});
|
|
33
|
+
command
|
|
34
|
+
.addOption(new Option(I18n.formatMessage("commands.common.options.connector.param"), I18n.formatMessage("commands.common.options.connector.description"))
|
|
35
|
+
.choices(Object.values(IdentityConnectorTypes))
|
|
36
|
+
.default(IdentityConnectorTypes.Iota))
|
|
37
|
+
.option(I18n.formatMessage("commands.common.options.node.param"), I18n.formatMessage("commands.common.options.node.description"), "!NODE_URL")
|
|
38
|
+
.option(I18n.formatMessage("commands.common.options.network.param"), I18n.formatMessage("commands.common.options.network.description"), "!NETWORK")
|
|
39
|
+
.option(I18n.formatMessage("commands.common.options.explorer.param"), I18n.formatMessage("commands.common.options.explorer.description"), "!EXPLORER_URL")
|
|
40
|
+
.action(actionCommandAlsoKnownAsAdd);
|
|
41
|
+
return command;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Action the alsoKnownAs add command.
|
|
45
|
+
* @param opts The options for the command.
|
|
46
|
+
* @param opts.seed The private key for the controller.
|
|
47
|
+
* @param opts.did The identity of the document to add to.
|
|
48
|
+
* @param opts.alias The alsoKnownAs value to add.
|
|
49
|
+
* @param opts.addressIndex The address index to use for key derivation (if applicable).
|
|
50
|
+
* @param opts.connector The connector to perform the operations with.
|
|
51
|
+
* @param opts.node The node URL.
|
|
52
|
+
* @param opts.network The network to use for connector.
|
|
53
|
+
* @param opts.explorer The explorer URL.
|
|
54
|
+
*/
|
|
55
|
+
export async function actionCommandAlsoKnownAsAdd(opts) {
|
|
56
|
+
const seed = CLIParam.hexBase64("seed", opts.seed);
|
|
57
|
+
const did = CLIParam.stringValue("did", opts.did);
|
|
58
|
+
const alias = CLIParam.stringValue("alias", opts.alias);
|
|
59
|
+
const addressIndex = CLIParam.integer("addressIndex", opts.addressIndex ?? "0", false, 0);
|
|
60
|
+
const nodeEndpoint = CLIParam.url("node", opts.node);
|
|
61
|
+
const network = opts.connector === IdentityConnectorTypes.Iota
|
|
62
|
+
? CLIParam.stringValue("network", opts.network)
|
|
63
|
+
: undefined;
|
|
64
|
+
const explorerEndpoint = CLIParam.url("explorer", opts.explorer);
|
|
65
|
+
CLIDisplay.value(I18n.formatMessage("commands.common.labels.did"), did);
|
|
66
|
+
CLIDisplay.value(I18n.formatMessage("commands.also-known-as-add.labels.alias"), alias);
|
|
67
|
+
CLIDisplay.value(I18n.formatMessage("commands.also-known-as-add.labels.addressIndex"), addressIndex);
|
|
68
|
+
CLIDisplay.value(I18n.formatMessage("commands.common.labels.node"), nodeEndpoint);
|
|
69
|
+
if (Is.stringValue(network)) {
|
|
70
|
+
CLIDisplay.value(I18n.formatMessage("commands.common.labels.network"), network);
|
|
71
|
+
}
|
|
72
|
+
CLIDisplay.value(I18n.formatMessage("commands.common.labels.explorer"), explorerEndpoint);
|
|
73
|
+
CLIDisplay.break();
|
|
74
|
+
setupVault();
|
|
75
|
+
const vaultSeedId = "local-seed";
|
|
76
|
+
const vmParts = DocumentHelper.parseId(did);
|
|
77
|
+
const vaultConnector = VaultConnectorFactory.get("vault");
|
|
78
|
+
await vaultConnector.setSecret(`${vmParts.id}/${vaultSeedId}`, Converter.bytesToBase64(seed));
|
|
79
|
+
const walletConnector = setupWalletConnector({ nodeEndpoint, vaultSeedId, network }, opts.connector);
|
|
80
|
+
WalletConnectorFactory.register("wallet", () => walletConnector);
|
|
81
|
+
const identityConnector = setupIdentityConnector({ nodeEndpoint, network, addressIndex, vaultSeedId }, opts.connector);
|
|
82
|
+
CLIDisplay.task(I18n.formatMessage("commands.also-known-as-add.progress.addingAlsoKnownAs"));
|
|
83
|
+
CLIDisplay.break();
|
|
84
|
+
CLIDisplay.spinnerStart();
|
|
85
|
+
await identityConnector.addAlsoKnownAs(vmParts.id, did, alias);
|
|
86
|
+
const identityResolverConnector = setupIdentityResolverConnector({ nodeEndpoint, network }, opts.connector);
|
|
87
|
+
// Retrieve the updated DID document to get the full alsoKnownAs array
|
|
88
|
+
const didDocument = await identityResolverConnector.resolveDocument(did);
|
|
89
|
+
const alsoKnownAs = ArrayHelper.fromObjectOrArray(didDocument.alsoKnownAs) ?? [];
|
|
90
|
+
CLIDisplay.spinnerStop();
|
|
91
|
+
if (Is.stringValue(opts?.json)) {
|
|
92
|
+
await CLIUtils.writeJsonFile(opts.json, {
|
|
93
|
+
alsoKnownAs
|
|
94
|
+
}, opts.mergeJson);
|
|
95
|
+
}
|
|
96
|
+
if (Is.stringValue(opts?.env)) {
|
|
97
|
+
await CLIUtils.writeEnvFile(opts.env, [`DID_ALSO_KNOWN_AS="${alsoKnownAs.join(",")}"`], opts.mergeEnv);
|
|
98
|
+
}
|
|
99
|
+
if (opts.connector === IdentityConnectorTypes.Iota) {
|
|
100
|
+
const didUrn = Urn.fromValidString(did);
|
|
101
|
+
const didParts = didUrn.parts();
|
|
102
|
+
const objectId = didParts[didParts.length - 1];
|
|
103
|
+
CLIDisplay.value(I18n.formatMessage("commands.common.labels.explore"), `${StringHelper.trimTrailingSlashes(explorerEndpoint)}/object/${objectId}?network=${network}`);
|
|
104
|
+
}
|
|
105
|
+
CLIDisplay.break();
|
|
106
|
+
CLIDisplay.done();
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=alsoKnownAsAdd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alsoKnownAsAdd.js","sourceRoot":"","sources":["../../../src/commands/alsoKnownAsAdd.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport {\n\tCLIDisplay,\n\tCLIOptions,\n\tCLIParam,\n\tCLIUtils,\n\ttype CliOutputOptions\n} from \"@twin.org/cli-core\";\nimport { ArrayHelper, Converter, I18n, Is, StringHelper, Urn } from \"@twin.org/core\";\nimport { DocumentHelper } from \"@twin.org/identity-models\";\nimport { VaultConnectorFactory } from \"@twin.org/vault-models\";\nimport { setupWalletConnector } from \"@twin.org/wallet-cli\";\nimport { WalletConnectorFactory } from \"@twin.org/wallet-models\";\nimport { Command, Option } from \"commander\";\nimport {\n\tsetupIdentityConnector,\n\tsetupIdentityResolverConnector,\n\tsetupVault\n} from \"./setupCommands.js\";\nimport { IdentityConnectorTypes } from \"../models/identityConnectorTypes.js\";\n\n/**\n * Build the alsoKnownAs add command for the CLI.\n * @returns The command.\n */\nexport function buildCommandAlsoKnownAsAdd(): Command {\n\tconst command = new Command();\n\tcommand\n\t\t.name(\"also-known-as-add\")\n\t\t.summary(I18n.formatMessage(\"commands.also-known-as-add.summary\"))\n\t\t.description(I18n.formatMessage(\"commands.also-known-as-add.description\"))\n\t\t.requiredOption(\n\t\t\tI18n.formatMessage(\"commands.also-known-as-add.options.seed.param\"),\n\t\t\tI18n.formatMessage(\"commands.also-known-as-add.options.seed.description\")\n\t\t)\n\t\t.requiredOption(\n\t\t\tI18n.formatMessage(\"commands.also-known-as-add.options.did.param\"),\n\t\t\tI18n.formatMessage(\"commands.also-known-as-add.options.did.description\")\n\t\t)\n\t\t.requiredOption(\n\t\t\tI18n.formatMessage(\"commands.also-known-as-add.options.alias.param\"),\n\t\t\tI18n.formatMessage(\"commands.also-known-as-add.options.alias.description\")\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.also-known-as-add.options.addressIndex.param\"),\n\t\t\tI18n.formatMessage(\"commands.also-known-as-add.options.addressIndex.description\"),\n\t\t\t\"0\"\n\t\t);\n\tCLIOptions.output(command, {\n\t\tnoConsole: true,\n\t\tjson: true,\n\t\tenv: true,\n\t\tmergeJson: true,\n\t\tmergeEnv: true\n\t});\n\n\tcommand\n\t\t.addOption(\n\t\t\tnew Option(\n\t\t\t\tI18n.formatMessage(\"commands.common.options.connector.param\"),\n\t\t\t\tI18n.formatMessage(\"commands.common.options.connector.description\")\n\t\t\t)\n\t\t\t\t.choices(Object.values(IdentityConnectorTypes))\n\t\t\t\t.default(IdentityConnectorTypes.Iota)\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.common.options.node.param\"),\n\t\t\tI18n.formatMessage(\"commands.common.options.node.description\"),\n\t\t\t\"!NODE_URL\"\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.common.options.network.param\"),\n\t\t\tI18n.formatMessage(\"commands.common.options.network.description\"),\n\t\t\t\"!NETWORK\"\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.common.options.explorer.param\"),\n\t\t\tI18n.formatMessage(\"commands.common.options.explorer.description\"),\n\t\t\t\"!EXPLORER_URL\"\n\t\t)\n\t\t.action(actionCommandAlsoKnownAsAdd);\n\n\treturn command;\n}\n\n/**\n * Action the alsoKnownAs add command.\n * @param opts The options for the command.\n * @param opts.seed The private key for the controller.\n * @param opts.did The identity of the document to add to.\n * @param opts.alias The alsoKnownAs value to add.\n * @param opts.addressIndex The address index to use for key derivation (if applicable).\n * @param opts.connector The connector to perform the operations with.\n * @param opts.node The node URL.\n * @param opts.network The network to use for connector.\n * @param opts.explorer The explorer URL.\n */\nexport async function actionCommandAlsoKnownAsAdd(\n\topts: {\n\t\tseed: string;\n\t\tdid: string;\n\t\talias: string;\n\t\taddressIndex?: string;\n\t\tconnector?: IdentityConnectorTypes;\n\t\tnode: string;\n\t\tnetwork?: string;\n\t\texplorer: string;\n\t} & CliOutputOptions\n): Promise<void> {\n\tconst seed: Uint8Array = CLIParam.hexBase64(\"seed\", opts.seed);\n\tconst did: string = CLIParam.stringValue(\"did\", opts.did);\n\tconst alias: string = CLIParam.stringValue(\"alias\", opts.alias);\n\tconst addressIndex: number = CLIParam.integer(\"addressIndex\", opts.addressIndex ?? \"0\", false, 0);\n\tconst nodeEndpoint: string = CLIParam.url(\"node\", opts.node);\n\tconst network: string | undefined =\n\t\topts.connector === IdentityConnectorTypes.Iota\n\t\t\t? CLIParam.stringValue(\"network\", opts.network)\n\t\t\t: undefined;\n\tconst explorerEndpoint: string = CLIParam.url(\"explorer\", opts.explorer);\n\n\tCLIDisplay.value(I18n.formatMessage(\"commands.common.labels.did\"), did);\n\tCLIDisplay.value(I18n.formatMessage(\"commands.also-known-as-add.labels.alias\"), alias);\n\tCLIDisplay.value(\n\t\tI18n.formatMessage(\"commands.also-known-as-add.labels.addressIndex\"),\n\t\taddressIndex\n\t);\n\tCLIDisplay.value(I18n.formatMessage(\"commands.common.labels.node\"), nodeEndpoint);\n\tif (Is.stringValue(network)) {\n\t\tCLIDisplay.value(I18n.formatMessage(\"commands.common.labels.network\"), network);\n\t}\n\tCLIDisplay.value(I18n.formatMessage(\"commands.common.labels.explorer\"), explorerEndpoint);\n\tCLIDisplay.break();\n\n\tsetupVault();\n\n\tconst vaultSeedId = \"local-seed\";\n\tconst vmParts = DocumentHelper.parseId(did);\n\n\tconst vaultConnector = VaultConnectorFactory.get(\"vault\");\n\tawait vaultConnector.setSecret(`${vmParts.id}/${vaultSeedId}`, Converter.bytesToBase64(seed));\n\n\tconst walletConnector = setupWalletConnector(\n\t\t{ nodeEndpoint, vaultSeedId, network },\n\t\topts.connector\n\t);\n\tWalletConnectorFactory.register(\"wallet\", () => walletConnector);\n\n\tconst identityConnector = setupIdentityConnector(\n\t\t{ nodeEndpoint, network, addressIndex, vaultSeedId },\n\t\topts.connector\n\t);\n\n\tCLIDisplay.task(I18n.formatMessage(\"commands.also-known-as-add.progress.addingAlsoKnownAs\"));\n\tCLIDisplay.break();\n\n\tCLIDisplay.spinnerStart();\n\n\tawait identityConnector.addAlsoKnownAs(vmParts.id, did, alias);\n\n\tconst identityResolverConnector = setupIdentityResolverConnector(\n\t\t{ nodeEndpoint, network },\n\t\topts.connector\n\t);\n\n\t// Retrieve the updated DID document to get the full alsoKnownAs array\n\tconst didDocument = await identityResolverConnector.resolveDocument(did);\n\tconst alsoKnownAs = ArrayHelper.fromObjectOrArray(didDocument.alsoKnownAs) ?? [];\n\n\tCLIDisplay.spinnerStop();\n\n\tif (Is.stringValue(opts?.json)) {\n\t\tawait CLIUtils.writeJsonFile(\n\t\t\topts.json,\n\t\t\t{\n\t\t\t\talsoKnownAs\n\t\t\t},\n\t\t\topts.mergeJson\n\t\t);\n\t}\n\tif (Is.stringValue(opts?.env)) {\n\t\tawait CLIUtils.writeEnvFile(\n\t\t\topts.env,\n\t\t\t[`DID_ALSO_KNOWN_AS=\"${alsoKnownAs.join(\",\")}\"`],\n\t\t\topts.mergeEnv\n\t\t);\n\t}\n\n\tif (opts.connector === IdentityConnectorTypes.Iota) {\n\t\tconst didUrn = Urn.fromValidString(did);\n\t\tconst didParts = didUrn.parts();\n\t\tconst objectId = didParts[didParts.length - 1];\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"commands.common.labels.explore\"),\n\t\t\t`${StringHelper.trimTrailingSlashes(explorerEndpoint)}/object/${objectId}?network=${network}`\n\t\t);\n\t}\n\n\tCLIDisplay.break();\n\n\tCLIDisplay.done();\n}\n"]}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
// Copyright 2024 IOTA Stiftung.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0.
|
|
3
|
+
import { CLIDisplay, CLIOptions, CLIParam, CLIUtils } from "@twin.org/cli-core";
|
|
4
|
+
import { ArrayHelper, Converter, I18n, Is, StringHelper, Urn } from "@twin.org/core";
|
|
5
|
+
import { DocumentHelper } from "@twin.org/identity-models";
|
|
6
|
+
import { VaultConnectorFactory } from "@twin.org/vault-models";
|
|
7
|
+
import { setupWalletConnector } from "@twin.org/wallet-cli";
|
|
8
|
+
import { WalletConnectorFactory } from "@twin.org/wallet-models";
|
|
9
|
+
import { Command, Option } from "commander";
|
|
10
|
+
import { setupIdentityConnector, setupIdentityResolverConnector, setupVault } from "./setupCommands.js";
|
|
11
|
+
import { IdentityConnectorTypes } from "../models/identityConnectorTypes.js";
|
|
12
|
+
/**
|
|
13
|
+
* Build the alsoKnownAs remove command for the CLI.
|
|
14
|
+
* @returns The command.
|
|
15
|
+
*/
|
|
16
|
+
export function buildCommandAlsoKnownAsRemove() {
|
|
17
|
+
const command = new Command();
|
|
18
|
+
command
|
|
19
|
+
.name("also-known-as-remove")
|
|
20
|
+
.summary(I18n.formatMessage("commands.also-known-as-remove.summary"))
|
|
21
|
+
.description(I18n.formatMessage("commands.also-known-as-remove.description"))
|
|
22
|
+
.requiredOption(I18n.formatMessage("commands.also-known-as-remove.options.seed.param"), I18n.formatMessage("commands.also-known-as-remove.options.seed.description"))
|
|
23
|
+
.requiredOption(I18n.formatMessage("commands.also-known-as-remove.options.did.param"), I18n.formatMessage("commands.also-known-as-remove.options.did.description"))
|
|
24
|
+
.requiredOption(I18n.formatMessage("commands.also-known-as-remove.options.alias.param"), I18n.formatMessage("commands.also-known-as-remove.options.alias.description"))
|
|
25
|
+
.option(I18n.formatMessage("commands.also-known-as-remove.options.addressIndex.param"), I18n.formatMessage("commands.also-known-as-remove.options.addressIndex.description"), "0");
|
|
26
|
+
CLIOptions.output(command, {
|
|
27
|
+
noConsole: true,
|
|
28
|
+
json: true,
|
|
29
|
+
env: true,
|
|
30
|
+
mergeJson: true,
|
|
31
|
+
mergeEnv: true
|
|
32
|
+
});
|
|
33
|
+
command
|
|
34
|
+
.addOption(new Option(I18n.formatMessage("commands.common.options.connector.param"), I18n.formatMessage("commands.common.options.connector.description"))
|
|
35
|
+
.choices(Object.values(IdentityConnectorTypes))
|
|
36
|
+
.default(IdentityConnectorTypes.Iota))
|
|
37
|
+
.option(I18n.formatMessage("commands.common.options.node.param"), I18n.formatMessage("commands.common.options.node.description"), "!NODE_URL")
|
|
38
|
+
.option(I18n.formatMessage("commands.common.options.network.param"), I18n.formatMessage("commands.common.options.network.description"), "!NETWORK")
|
|
39
|
+
.option(I18n.formatMessage("commands.common.options.explorer.param"), I18n.formatMessage("commands.common.options.explorer.description"), "!EXPLORER_URL")
|
|
40
|
+
.action(actionCommandAlsoKnownAsRemove);
|
|
41
|
+
return command;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Action the alsoKnownAs remove command.
|
|
45
|
+
* @param opts The options for the command.
|
|
46
|
+
* @param opts.seed The private key for the controller.
|
|
47
|
+
* @param opts.did The identity of the document to remove from.
|
|
48
|
+
* @param opts.alias The alsoKnownAs value to remove.
|
|
49
|
+
* @param opts.addressIndex The address index to use for key derivation (if applicable).
|
|
50
|
+
* @param opts.connector The connector to perform the operations with.
|
|
51
|
+
* @param opts.node The node URL.
|
|
52
|
+
* @param opts.network The network to use for connector.
|
|
53
|
+
* @param opts.explorer The explorer URL.
|
|
54
|
+
*/
|
|
55
|
+
export async function actionCommandAlsoKnownAsRemove(opts) {
|
|
56
|
+
const seed = CLIParam.hexBase64("seed", opts.seed);
|
|
57
|
+
const did = CLIParam.stringValue("did", opts.did);
|
|
58
|
+
const alias = CLIParam.stringValue("alias", opts.alias);
|
|
59
|
+
const addressIndex = CLIParam.integer("addressIndex", opts.addressIndex ?? "0", false, 0);
|
|
60
|
+
const nodeEndpoint = CLIParam.url("node", opts.node);
|
|
61
|
+
const network = opts.connector === IdentityConnectorTypes.Iota
|
|
62
|
+
? CLIParam.stringValue("network", opts.network)
|
|
63
|
+
: undefined;
|
|
64
|
+
const explorerEndpoint = CLIParam.url("explorer", opts.explorer);
|
|
65
|
+
CLIDisplay.value(I18n.formatMessage("commands.common.labels.did"), did);
|
|
66
|
+
CLIDisplay.value(I18n.formatMessage("commands.also-known-as-remove.labels.alias"), alias);
|
|
67
|
+
CLIDisplay.value(I18n.formatMessage("commands.also-known-as-remove.labels.addressIndex"), addressIndex);
|
|
68
|
+
CLIDisplay.value(I18n.formatMessage("commands.common.labels.node"), nodeEndpoint);
|
|
69
|
+
if (Is.stringValue(network)) {
|
|
70
|
+
CLIDisplay.value(I18n.formatMessage("commands.common.labels.network"), network);
|
|
71
|
+
}
|
|
72
|
+
CLIDisplay.value(I18n.formatMessage("commands.common.labels.explorer"), explorerEndpoint);
|
|
73
|
+
CLIDisplay.break();
|
|
74
|
+
setupVault();
|
|
75
|
+
const vaultSeedId = "local-seed";
|
|
76
|
+
const vmParts = DocumentHelper.parseId(did);
|
|
77
|
+
const vaultConnector = VaultConnectorFactory.get("vault");
|
|
78
|
+
await vaultConnector.setSecret(`${vmParts.id}/${vaultSeedId}`, Converter.bytesToBase64(seed));
|
|
79
|
+
const walletConnector = setupWalletConnector({ nodeEndpoint, vaultSeedId, network }, opts.connector);
|
|
80
|
+
WalletConnectorFactory.register("wallet", () => walletConnector);
|
|
81
|
+
const identityConnector = setupIdentityConnector({ nodeEndpoint, network, addressIndex, vaultSeedId }, opts.connector);
|
|
82
|
+
CLIDisplay.task(I18n.formatMessage("commands.also-known-as-remove.progress.removingAlsoKnownAs"));
|
|
83
|
+
CLIDisplay.break();
|
|
84
|
+
CLIDisplay.spinnerStart();
|
|
85
|
+
await identityConnector.removeAlsoKnownAs(vmParts.id, did, alias);
|
|
86
|
+
const identityResolverConnector = setupIdentityResolverConnector({ nodeEndpoint, network }, opts.connector);
|
|
87
|
+
// Retrieve the updated DID document to get the full alsoKnownAs array
|
|
88
|
+
const didDocument = await identityResolverConnector.resolveDocument(did);
|
|
89
|
+
const alsoKnownAs = ArrayHelper.fromObjectOrArray(didDocument.alsoKnownAs) ?? [];
|
|
90
|
+
CLIDisplay.spinnerStop();
|
|
91
|
+
if (Is.stringValue(opts?.json)) {
|
|
92
|
+
await CLIUtils.writeJsonFile(opts.json, { alsoKnownAs }, opts.mergeJson);
|
|
93
|
+
}
|
|
94
|
+
if (Is.stringValue(opts?.env)) {
|
|
95
|
+
await CLIUtils.writeEnvFile(opts.env, [`DID_ALSO_KNOWN_AS="${alsoKnownAs.join(",")}"`], opts.mergeEnv);
|
|
96
|
+
}
|
|
97
|
+
if (opts.connector === IdentityConnectorTypes.Iota) {
|
|
98
|
+
const didUrn = Urn.fromValidString(did);
|
|
99
|
+
const didParts = didUrn.parts();
|
|
100
|
+
const objectId = didParts[didParts.length - 1];
|
|
101
|
+
CLIDisplay.value(I18n.formatMessage("commands.common.labels.explore"), `${StringHelper.trimTrailingSlashes(explorerEndpoint)}/object/${objectId}?network=${network}`);
|
|
102
|
+
}
|
|
103
|
+
CLIDisplay.break();
|
|
104
|
+
CLIDisplay.done();
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=alsoKnownAsRemove.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alsoKnownAsRemove.js","sourceRoot":"","sources":["../../../src/commands/alsoKnownAsRemove.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport {\n\tCLIDisplay,\n\tCLIOptions,\n\tCLIParam,\n\tCLIUtils,\n\ttype CliOutputOptions\n} from \"@twin.org/cli-core\";\nimport { ArrayHelper, Converter, I18n, Is, StringHelper, Urn } from \"@twin.org/core\";\nimport { DocumentHelper } from \"@twin.org/identity-models\";\nimport { VaultConnectorFactory } from \"@twin.org/vault-models\";\nimport { setupWalletConnector } from \"@twin.org/wallet-cli\";\nimport { WalletConnectorFactory } from \"@twin.org/wallet-models\";\nimport { Command, Option } from \"commander\";\nimport {\n\tsetupIdentityConnector,\n\tsetupIdentityResolverConnector,\n\tsetupVault\n} from \"./setupCommands.js\";\nimport { IdentityConnectorTypes } from \"../models/identityConnectorTypes.js\";\n\n/**\n * Build the alsoKnownAs remove command for the CLI.\n * @returns The command.\n */\nexport function buildCommandAlsoKnownAsRemove(): Command {\n\tconst command = new Command();\n\tcommand\n\t\t.name(\"also-known-as-remove\")\n\t\t.summary(I18n.formatMessage(\"commands.also-known-as-remove.summary\"))\n\t\t.description(I18n.formatMessage(\"commands.also-known-as-remove.description\"))\n\t\t.requiredOption(\n\t\t\tI18n.formatMessage(\"commands.also-known-as-remove.options.seed.param\"),\n\t\t\tI18n.formatMessage(\"commands.also-known-as-remove.options.seed.description\")\n\t\t)\n\t\t.requiredOption(\n\t\t\tI18n.formatMessage(\"commands.also-known-as-remove.options.did.param\"),\n\t\t\tI18n.formatMessage(\"commands.also-known-as-remove.options.did.description\")\n\t\t)\n\t\t.requiredOption(\n\t\t\tI18n.formatMessage(\"commands.also-known-as-remove.options.alias.param\"),\n\t\t\tI18n.formatMessage(\"commands.also-known-as-remove.options.alias.description\")\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.also-known-as-remove.options.addressIndex.param\"),\n\t\t\tI18n.formatMessage(\"commands.also-known-as-remove.options.addressIndex.description\"),\n\t\t\t\"0\"\n\t\t);\n\tCLIOptions.output(command, {\n\t\tnoConsole: true,\n\t\tjson: true,\n\t\tenv: true,\n\t\tmergeJson: true,\n\t\tmergeEnv: true\n\t});\n\n\tcommand\n\t\t.addOption(\n\t\t\tnew Option(\n\t\t\t\tI18n.formatMessage(\"commands.common.options.connector.param\"),\n\t\t\t\tI18n.formatMessage(\"commands.common.options.connector.description\")\n\t\t\t)\n\t\t\t\t.choices(Object.values(IdentityConnectorTypes))\n\t\t\t\t.default(IdentityConnectorTypes.Iota)\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.common.options.node.param\"),\n\t\t\tI18n.formatMessage(\"commands.common.options.node.description\"),\n\t\t\t\"!NODE_URL\"\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.common.options.network.param\"),\n\t\t\tI18n.formatMessage(\"commands.common.options.network.description\"),\n\t\t\t\"!NETWORK\"\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.common.options.explorer.param\"),\n\t\t\tI18n.formatMessage(\"commands.common.options.explorer.description\"),\n\t\t\t\"!EXPLORER_URL\"\n\t\t)\n\t\t.action(actionCommandAlsoKnownAsRemove);\n\n\treturn command;\n}\n\n/**\n * Action the alsoKnownAs remove command.\n * @param opts The options for the command.\n * @param opts.seed The private key for the controller.\n * @param opts.did The identity of the document to remove from.\n * @param opts.alias The alsoKnownAs value to remove.\n * @param opts.addressIndex The address index to use for key derivation (if applicable).\n * @param opts.connector The connector to perform the operations with.\n * @param opts.node The node URL.\n * @param opts.network The network to use for connector.\n * @param opts.explorer The explorer URL.\n */\nexport async function actionCommandAlsoKnownAsRemove(\n\topts: {\n\t\tseed: string;\n\t\tdid: string;\n\t\talias: string;\n\t\taddressIndex?: string;\n\t\tconnector?: IdentityConnectorTypes;\n\t\tnode: string;\n\t\tnetwork?: string;\n\t\texplorer: string;\n\t} & CliOutputOptions\n): Promise<void> {\n\tconst seed: Uint8Array = CLIParam.hexBase64(\"seed\", opts.seed);\n\tconst did: string = CLIParam.stringValue(\"did\", opts.did);\n\tconst alias: string = CLIParam.stringValue(\"alias\", opts.alias);\n\tconst addressIndex: number = CLIParam.integer(\"addressIndex\", opts.addressIndex ?? \"0\", false, 0);\n\tconst nodeEndpoint: string = CLIParam.url(\"node\", opts.node);\n\tconst network: string | undefined =\n\t\topts.connector === IdentityConnectorTypes.Iota\n\t\t\t? CLIParam.stringValue(\"network\", opts.network)\n\t\t\t: undefined;\n\tconst explorerEndpoint: string = CLIParam.url(\"explorer\", opts.explorer);\n\n\tCLIDisplay.value(I18n.formatMessage(\"commands.common.labels.did\"), did);\n\tCLIDisplay.value(I18n.formatMessage(\"commands.also-known-as-remove.labels.alias\"), alias);\n\tCLIDisplay.value(\n\t\tI18n.formatMessage(\"commands.also-known-as-remove.labels.addressIndex\"),\n\t\taddressIndex\n\t);\n\tCLIDisplay.value(I18n.formatMessage(\"commands.common.labels.node\"), nodeEndpoint);\n\tif (Is.stringValue(network)) {\n\t\tCLIDisplay.value(I18n.formatMessage(\"commands.common.labels.network\"), network);\n\t}\n\tCLIDisplay.value(I18n.formatMessage(\"commands.common.labels.explorer\"), explorerEndpoint);\n\tCLIDisplay.break();\n\n\tsetupVault();\n\n\tconst vaultSeedId = \"local-seed\";\n\tconst vmParts = DocumentHelper.parseId(did);\n\n\tconst vaultConnector = VaultConnectorFactory.get(\"vault\");\n\tawait vaultConnector.setSecret(`${vmParts.id}/${vaultSeedId}`, Converter.bytesToBase64(seed));\n\n\tconst walletConnector = setupWalletConnector(\n\t\t{ nodeEndpoint, vaultSeedId, network },\n\t\topts.connector\n\t);\n\tWalletConnectorFactory.register(\"wallet\", () => walletConnector);\n\n\tconst identityConnector = setupIdentityConnector(\n\t\t{ nodeEndpoint, network, addressIndex, vaultSeedId },\n\t\topts.connector\n\t);\n\n\tCLIDisplay.task(I18n.formatMessage(\"commands.also-known-as-remove.progress.removingAlsoKnownAs\"));\n\tCLIDisplay.break();\n\n\tCLIDisplay.spinnerStart();\n\n\tawait identityConnector.removeAlsoKnownAs(vmParts.id, did, alias);\n\n\tconst identityResolverConnector = setupIdentityResolverConnector(\n\t\t{ nodeEndpoint, network },\n\t\topts.connector\n\t);\n\n\t// Retrieve the updated DID document to get the full alsoKnownAs array\n\tconst didDocument = await identityResolverConnector.resolveDocument(did);\n\tconst alsoKnownAs = ArrayHelper.fromObjectOrArray(didDocument.alsoKnownAs) ?? [];\n\n\tCLIDisplay.spinnerStop();\n\n\tif (Is.stringValue(opts?.json)) {\n\t\tawait CLIUtils.writeJsonFile(opts.json, { alsoKnownAs }, opts.mergeJson);\n\t}\n\tif (Is.stringValue(opts?.env)) {\n\t\tawait CLIUtils.writeEnvFile(\n\t\t\topts.env,\n\t\t\t[`DID_ALSO_KNOWN_AS=\"${alsoKnownAs.join(\",\")}\"`],\n\t\t\topts.mergeEnv\n\t\t);\n\t}\n\n\tif (opts.connector === IdentityConnectorTypes.Iota) {\n\t\tconst didUrn = Urn.fromValidString(did);\n\t\tconst didParts = didUrn.parts();\n\t\tconst objectId = didParts[didParts.length - 1];\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"commands.common.labels.explore\"),\n\t\t\t`${StringHelper.trimTrailingSlashes(explorerEndpoint)}/object/${objectId}?network=${network}`\n\t\t);\n\t}\n\n\tCLIDisplay.break();\n\n\tCLIDisplay.done();\n}\n"]}
|
|
@@ -20,7 +20,7 @@ export function buildCommandVerifiableCredentialCreate() {
|
|
|
20
20
|
.name("verifiable-credential-create")
|
|
21
21
|
.summary(I18n.formatMessage("commands.verifiable-credential-create.summary"))
|
|
22
22
|
.description(I18n.formatMessage("commands.verifiable-credential-create.description"))
|
|
23
|
-
.requiredOption(I18n.formatMessage("commands.verifiable-credential-create.options.id.param"), I18n.formatMessage("commands.verifiable-credential-create.options.id.description"))
|
|
23
|
+
.requiredOption(I18n.formatMessage("commands.verifiable-credential-create.options.verification-method-id.param"), I18n.formatMessage("commands.verifiable-credential-create.options.verification-method-id.description"))
|
|
24
24
|
.requiredOption(I18n.formatMessage("commands.verifiable-credential-create.options.private-key.param"), I18n.formatMessage("commands.verifiable-credential-create.options.private-key.description"))
|
|
25
25
|
.option(I18n.formatMessage("commands.verifiable-credential-create.options.credential-id.param"), I18n.formatMessage("commands.verifiable-credential-create.options.credential-id.description"))
|
|
26
26
|
.requiredOption(I18n.formatMessage("commands.verifiable-credential-create.options.subject-json.param"), I18n.formatMessage("commands.verifiable-credential-create.options.subject-json.description"))
|
|
@@ -45,7 +45,7 @@ export function buildCommandVerifiableCredentialCreate() {
|
|
|
45
45
|
/**
|
|
46
46
|
* Action the verifiable credential create command.
|
|
47
47
|
* @param opts The options for the command.
|
|
48
|
-
* @param opts.
|
|
48
|
+
* @param opts.verificationMethodId The id of the verification method to use for the credential.
|
|
49
49
|
* @param opts.privateKey The private key for the verification method.
|
|
50
50
|
* @param opts.credentialId The id of the credential.
|
|
51
51
|
* @param opts.subjectJson The JSON data for the subject.
|
|
@@ -55,7 +55,7 @@ export function buildCommandVerifiableCredentialCreate() {
|
|
|
55
55
|
* @param opts.node The node URL.
|
|
56
56
|
*/
|
|
57
57
|
export async function actionCommandVerifiableCredentialCreate(opts) {
|
|
58
|
-
const
|
|
58
|
+
const verificationMethodId = CLIParam.stringValue("verification-method-id", opts.verificationMethodId);
|
|
59
59
|
const privateKey = CLIParam.hexBase64("private-key", opts.privateKey);
|
|
60
60
|
const credentialId = CLIParam.stringValue("credential-id", opts.credentialId);
|
|
61
61
|
const subjectJson = path.resolve(CLIParam.stringValue("subject-json", opts.subjectJson));
|
|
@@ -64,7 +64,7 @@ export async function actionCommandVerifiableCredentialCreate(opts) {
|
|
|
64
64
|
const network = opts.connector === IdentityConnectorTypes.Iota
|
|
65
65
|
? CLIParam.stringValue("network", opts.network)
|
|
66
66
|
: undefined;
|
|
67
|
-
CLIDisplay.value(I18n.formatMessage("commands.verifiable-credential-create.labels.verificationMethodId"),
|
|
67
|
+
CLIDisplay.value(I18n.formatMessage("commands.verifiable-credential-create.labels.verificationMethodId"), verificationMethodId);
|
|
68
68
|
CLIDisplay.value(I18n.formatMessage("commands.verifiable-credential-create.labels.credentialId"), credentialId);
|
|
69
69
|
CLIDisplay.value(I18n.formatMessage("commands.verifiable-credential-create.labels.subjectJson"), subjectJson);
|
|
70
70
|
CLIDisplay.value(I18n.formatMessage("commands.verifiable-credential-create.labels.revocationIndex"), revocationIndex);
|
|
@@ -75,7 +75,7 @@ export async function actionCommandVerifiableCredentialCreate(opts) {
|
|
|
75
75
|
}
|
|
76
76
|
CLIDisplay.break();
|
|
77
77
|
setupVault();
|
|
78
|
-
const vmParts = DocumentHelper.parseId(
|
|
78
|
+
const vmParts = DocumentHelper.parseId(verificationMethodId);
|
|
79
79
|
const vaultConnector = VaultConnectorFactory.get("vault");
|
|
80
80
|
await vaultConnector.addKey(`${vmParts.id}/${vmParts.fragment}`, VaultKeyType.Ed25519, privateKey, new Uint8Array());
|
|
81
81
|
const walletConnector = setupWalletConnector({ nodeEndpoint, network }, opts.connector);
|
|
@@ -90,7 +90,7 @@ export async function actionCommandVerifiableCredentialCreate(opts) {
|
|
|
90
90
|
CLIDisplay.task(I18n.formatMessage("commands.verifiable-credential-create.progress.creatingVerifiableCredential"));
|
|
91
91
|
CLIDisplay.break();
|
|
92
92
|
CLIDisplay.spinnerStart();
|
|
93
|
-
const verifiableCredential = await identityConnector.createVerifiableCredential(vmParts.id,
|
|
93
|
+
const verifiableCredential = await identityConnector.createVerifiableCredential(vmParts.id, verificationMethodId, credentialId, jsonData, {
|
|
94
94
|
revocationIndex,
|
|
95
95
|
expirationDate: Coerce.dateTime(opts.expirationDate)
|
|
96
96
|
});
|
|
@@ -102,7 +102,10 @@ export async function actionCommandVerifiableCredentialCreate(opts) {
|
|
|
102
102
|
CLIDisplay.break();
|
|
103
103
|
}
|
|
104
104
|
if (Is.stringValue(opts?.json)) {
|
|
105
|
-
await CLIUtils.writeJsonFile(opts.json, {
|
|
105
|
+
await CLIUtils.writeJsonFile(opts.json, {
|
|
106
|
+
verifiableCredentialJwt: verifiableCredential.jwt,
|
|
107
|
+
verifiableCredential: verifiableCredential.verifiableCredential
|
|
108
|
+
}, opts.mergeJson);
|
|
106
109
|
}
|
|
107
110
|
if (Is.stringValue(opts?.env)) {
|
|
108
111
|
await CLIUtils.writeEnvFile(opts.env, [`DID_VERIFIABLE_CREDENTIAL_JWT="${verifiableCredential.jwt}"`], opts.mergeEnv);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verifiableCredentialCreate.js","sourceRoot":"","sources":["../../../src/commands/verifiableCredentialCreate.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport path from \"node:path\";\nimport {\n\tCLIDisplay,\n\tCLIOptions,\n\tCLIParam,\n\tCLIUtils,\n\ttype CliOutputOptions\n} from \"@twin.org/cli-core\";\nimport { Coerce, GeneralError, I18n, Is } from \"@twin.org/core\";\nimport type { IJsonLdNodeObject } from \"@twin.org/data-json-ld\";\nimport { DocumentHelper } from \"@twin.org/identity-models\";\nimport { VaultConnectorFactory, VaultKeyType } from \"@twin.org/vault-models\";\nimport { setupWalletConnector } from \"@twin.org/wallet-cli\";\nimport { WalletConnectorFactory } from \"@twin.org/wallet-models\";\nimport { Command, Option } from \"commander\";\nimport { setupIdentityConnector, setupVault } from \"./setupCommands.js\";\nimport { IdentityConnectorTypes } from \"../models/identityConnectorTypes.js\";\n\n/**\n * Build the verifiable credential create command for the CLI.\n * @returns The command.\n */\nexport function buildCommandVerifiableCredentialCreate(): Command {\n\tconst command = new Command();\n\tcommand\n\t\t.name(\"verifiable-credential-create\")\n\t\t.summary(I18n.formatMessage(\"commands.verifiable-credential-create.summary\"))\n\t\t.description(I18n.formatMessage(\"commands.verifiable-credential-create.description\"))\n\t\t.requiredOption(\n\t\t\tI18n.formatMessage(\"commands.verifiable-credential-create.options.id.param\"),\n\t\t\tI18n.formatMessage(\"commands.verifiable-credential-create.options.id.description\")\n\t\t)\n\t\t.requiredOption(\n\t\t\tI18n.formatMessage(\"commands.verifiable-credential-create.options.private-key.param\"),\n\t\t\tI18n.formatMessage(\"commands.verifiable-credential-create.options.private-key.description\")\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.verifiable-credential-create.options.credential-id.param\"),\n\t\t\tI18n.formatMessage(\"commands.verifiable-credential-create.options.credential-id.description\")\n\t\t)\n\t\t.requiredOption(\n\t\t\tI18n.formatMessage(\"commands.verifiable-credential-create.options.subject-json.param\"),\n\t\t\tI18n.formatMessage(\"commands.verifiable-credential-create.options.subject-json.description\")\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.verifiable-credential-create.options.expiration-date.param\"),\n\t\t\tI18n.formatMessage(\n\t\t\t\t\"commands.verifiable-credential-create.options.expiration-date.description\"\n\t\t\t)\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.verifiable-credential-create.options.revocation-index.param\"),\n\t\t\tI18n.formatMessage(\n\t\t\t\t\"commands.verifiable-credential-create.options.revocation-index.description\"\n\t\t\t)\n\t\t);\n\tCLIOptions.output(command, {\n\t\tnoConsole: true,\n\t\tjson: true,\n\t\tenv: true,\n\t\tmergeJson: true,\n\t\tmergeEnv: true\n\t});\n\n\tcommand\n\t\t.addOption(\n\t\t\tnew Option(\n\t\t\t\tI18n.formatMessage(\"commands.common.options.connector.param\"),\n\t\t\t\tI18n.formatMessage(\"commands.common.options.connector.description\")\n\t\t\t)\n\t\t\t\t.choices(Object.values(IdentityConnectorTypes))\n\t\t\t\t.default(IdentityConnectorTypes.Iota)\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.common.options.node.param\"),\n\t\t\tI18n.formatMessage(\"commands.common.options.node.description\"),\n\t\t\t\"!NODE_URL\"\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.common.options.network.param\"),\n\t\t\tI18n.formatMessage(\"commands.common.options.network.description\"),\n\t\t\t\"!NETWORK\"\n\t\t)\n\t\t.action(actionCommandVerifiableCredentialCreate);\n\n\treturn command;\n}\n\n/**\n * Action the verifiable credential create command.\n * @param opts The options for the command.\n * @param opts.id The id of the verification method to use for the credential.\n * @param opts.privateKey The private key for the verification method.\n * @param opts.credentialId The id of the credential.\n * @param opts.subjectJson The JSON data for the subject.\n * @param opts.expirationDate The expiration date for the credential.\n * @param opts.revocationIndex The revocation index for the credential.\n * @param opts.connector The connector to perform the operations with.\n * @param opts.node The node URL.\n */\nexport async function actionCommandVerifiableCredentialCreate(\n\topts: {\n\t\tid: string;\n\t\tprivateKey: string;\n\t\tcredentialId?: string;\n\t\tsubjectJson: string;\n\t\texpirationDate?: string;\n\t\trevocationIndex?: string;\n\t\tconnector?: IdentityConnectorTypes;\n\t\tnode: string;\n\t\tnetwork?: string;\n\t} & CliOutputOptions\n): Promise<void> {\n\tconst id: string = CLIParam.stringValue(\"id\", opts.id);\n\tconst privateKey: Uint8Array = CLIParam.hexBase64(\"private-key\", opts.privateKey);\n\tconst credentialId: string = CLIParam.stringValue(\"credential-id\", opts.credentialId);\n\tconst subjectJson: string = path.resolve(CLIParam.stringValue(\"subject-json\", opts.subjectJson));\n\tconst revocationIndex: number | undefined = Coerce.number(opts.revocationIndex);\n\tconst nodeEndpoint: string = CLIParam.url(\"node\", opts.node);\n\tconst network: string | undefined =\n\t\topts.connector === IdentityConnectorTypes.Iota\n\t\t\t? CLIParam.stringValue(\"network\", opts.network)\n\t\t\t: undefined;\n\n\tCLIDisplay.value(\n\t\tI18n.formatMessage(\"commands.verifiable-credential-create.labels.verificationMethodId\"),\n\t\tid\n\t);\n\tCLIDisplay.value(\n\t\tI18n.formatMessage(\"commands.verifiable-credential-create.labels.credentialId\"),\n\t\tcredentialId\n\t);\n\tCLIDisplay.value(\n\t\tI18n.formatMessage(\"commands.verifiable-credential-create.labels.subjectJson\"),\n\t\tsubjectJson\n\t);\n\tCLIDisplay.value(\n\t\tI18n.formatMessage(\"commands.verifiable-credential-create.labels.revocationIndex\"),\n\t\trevocationIndex\n\t);\n\tCLIDisplay.value(\n\t\tI18n.formatMessage(\"commands.verifiable-credential-create.labels.expirationDate\"),\n\t\topts.expirationDate\n\t);\n\tCLIDisplay.value(I18n.formatMessage(\"commands.common.labels.node\"), nodeEndpoint);\n\tif (Is.stringValue(network)) {\n\t\tCLIDisplay.value(I18n.formatMessage(\"commands.common.labels.network\"), network);\n\t}\n\tCLIDisplay.break();\n\n\tsetupVault();\n\n\tconst vmParts = DocumentHelper.parseId(id);\n\n\tconst vaultConnector = VaultConnectorFactory.get(\"vault\");\n\tawait vaultConnector.addKey(\n\t\t`${vmParts.id}/${vmParts.fragment}`,\n\t\tVaultKeyType.Ed25519,\n\t\tprivateKey,\n\t\tnew Uint8Array()\n\t);\n\n\tconst walletConnector = setupWalletConnector({ nodeEndpoint, network }, opts.connector);\n\tWalletConnectorFactory.register(\"wallet\", () => walletConnector);\n\n\tconst identityConnector = setupIdentityConnector({ nodeEndpoint, network }, opts.connector);\n\n\tCLIDisplay.task(\n\t\tI18n.formatMessage(\"commands.verifiable-credential-create.progress.loadingSubjectData\")\n\t);\n\tCLIDisplay.break();\n\n\tconst jsonData = await CLIUtils.readJsonFile<IJsonLdNodeObject>(subjectJson);\n\tif (Is.undefined(jsonData)) {\n\t\tthrow new GeneralError(\n\t\t\t\"commands\",\n\t\t\t\"commands.verifiable-credential-create.subjectJsonFileNotFound\"\n\t\t);\n\t}\n\n\tCLIDisplay.task(\n\t\tI18n.formatMessage(\n\t\t\t\"commands.verifiable-credential-create.progress.creatingVerifiableCredential\"\n\t\t)\n\t);\n\tCLIDisplay.break();\n\n\tCLIDisplay.spinnerStart();\n\n\tconst verifiableCredential = await identityConnector.createVerifiableCredential(\n\t\tvmParts.id,\n\t\tid,\n\t\tcredentialId,\n\t\tjsonData,\n\t\t{\n\t\t\trevocationIndex,\n\t\t\texpirationDate: Coerce.dateTime(opts.expirationDate)\n\t\t}\n\t);\n\n\tCLIDisplay.spinnerStop();\n\n\tif (opts.console) {\n\t\tCLIDisplay.section(\n\t\t\tI18n.formatMessage(\"commands.verifiable-credential-create.labels.verifiableCredential\")\n\t\t);\n\n\t\tCLIDisplay.write(verifiableCredential.jwt);\n\t\tCLIDisplay.break();\n\t\tCLIDisplay.break();\n\t}\n\n\tif (Is.stringValue(opts?.json)) {\n\t\tawait CLIUtils.writeJsonFile(\n\t\t\topts.json,\n\t\t\t{ verifiableCredentialJwt: verifiableCredential.jwt },\n\t\t\topts.mergeJson\n\t\t);\n\t}\n\tif (Is.stringValue(opts?.env)) {\n\t\tawait CLIUtils.writeEnvFile(\n\t\t\topts.env,\n\t\t\t[`DID_VERIFIABLE_CREDENTIAL_JWT=\"${verifiableCredential.jwt}\"`],\n\t\t\topts.mergeEnv\n\t\t);\n\t}\n\n\tCLIDisplay.done();\n}\n"]}
|
|
1
|
+
{"version":3,"file":"verifiableCredentialCreate.js","sourceRoot":"","sources":["../../../src/commands/verifiableCredentialCreate.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport path from \"node:path\";\nimport {\n\tCLIDisplay,\n\tCLIOptions,\n\tCLIParam,\n\tCLIUtils,\n\ttype CliOutputOptions\n} from \"@twin.org/cli-core\";\nimport { Coerce, GeneralError, I18n, Is } from \"@twin.org/core\";\nimport type { IJsonLdNodeObject } from \"@twin.org/data-json-ld\";\nimport { DocumentHelper } from \"@twin.org/identity-models\";\nimport { VaultConnectorFactory, VaultKeyType } from \"@twin.org/vault-models\";\nimport { setupWalletConnector } from \"@twin.org/wallet-cli\";\nimport { WalletConnectorFactory } from \"@twin.org/wallet-models\";\nimport { Command, Option } from \"commander\";\nimport { setupIdentityConnector, setupVault } from \"./setupCommands.js\";\nimport { IdentityConnectorTypes } from \"../models/identityConnectorTypes.js\";\n\n/**\n * Build the verifiable credential create command for the CLI.\n * @returns The command.\n */\nexport function buildCommandVerifiableCredentialCreate(): Command {\n\tconst command = new Command();\n\tcommand\n\t\t.name(\"verifiable-credential-create\")\n\t\t.summary(I18n.formatMessage(\"commands.verifiable-credential-create.summary\"))\n\t\t.description(I18n.formatMessage(\"commands.verifiable-credential-create.description\"))\n\t\t.requiredOption(\n\t\t\tI18n.formatMessage(\n\t\t\t\t\"commands.verifiable-credential-create.options.verification-method-id.param\"\n\t\t\t),\n\t\t\tI18n.formatMessage(\n\t\t\t\t\"commands.verifiable-credential-create.options.verification-method-id.description\"\n\t\t\t)\n\t\t)\n\t\t.requiredOption(\n\t\t\tI18n.formatMessage(\"commands.verifiable-credential-create.options.private-key.param\"),\n\t\t\tI18n.formatMessage(\"commands.verifiable-credential-create.options.private-key.description\")\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.verifiable-credential-create.options.credential-id.param\"),\n\t\t\tI18n.formatMessage(\"commands.verifiable-credential-create.options.credential-id.description\")\n\t\t)\n\t\t.requiredOption(\n\t\t\tI18n.formatMessage(\"commands.verifiable-credential-create.options.subject-json.param\"),\n\t\t\tI18n.formatMessage(\"commands.verifiable-credential-create.options.subject-json.description\")\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.verifiable-credential-create.options.expiration-date.param\"),\n\t\t\tI18n.formatMessage(\n\t\t\t\t\"commands.verifiable-credential-create.options.expiration-date.description\"\n\t\t\t)\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.verifiable-credential-create.options.revocation-index.param\"),\n\t\t\tI18n.formatMessage(\n\t\t\t\t\"commands.verifiable-credential-create.options.revocation-index.description\"\n\t\t\t)\n\t\t);\n\tCLIOptions.output(command, {\n\t\tnoConsole: true,\n\t\tjson: true,\n\t\tenv: true,\n\t\tmergeJson: true,\n\t\tmergeEnv: true\n\t});\n\n\tcommand\n\t\t.addOption(\n\t\t\tnew Option(\n\t\t\t\tI18n.formatMessage(\"commands.common.options.connector.param\"),\n\t\t\t\tI18n.formatMessage(\"commands.common.options.connector.description\")\n\t\t\t)\n\t\t\t\t.choices(Object.values(IdentityConnectorTypes))\n\t\t\t\t.default(IdentityConnectorTypes.Iota)\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.common.options.node.param\"),\n\t\t\tI18n.formatMessage(\"commands.common.options.node.description\"),\n\t\t\t\"!NODE_URL\"\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.common.options.network.param\"),\n\t\t\tI18n.formatMessage(\"commands.common.options.network.description\"),\n\t\t\t\"!NETWORK\"\n\t\t)\n\t\t.action(actionCommandVerifiableCredentialCreate);\n\n\treturn command;\n}\n\n/**\n * Action the verifiable credential create command.\n * @param opts The options for the command.\n * @param opts.verificationMethodId The id of the verification method to use for the credential.\n * @param opts.privateKey The private key for the verification method.\n * @param opts.credentialId The id of the credential.\n * @param opts.subjectJson The JSON data for the subject.\n * @param opts.expirationDate The expiration date for the credential.\n * @param opts.revocationIndex The revocation index for the credential.\n * @param opts.connector The connector to perform the operations with.\n * @param opts.node The node URL.\n */\nexport async function actionCommandVerifiableCredentialCreate(\n\topts: {\n\t\tverificationMethodId: string;\n\t\tprivateKey: string;\n\t\tcredentialId?: string;\n\t\tsubjectJson: string;\n\t\texpirationDate?: string;\n\t\trevocationIndex?: string;\n\t\tconnector?: IdentityConnectorTypes;\n\t\tnode: string;\n\t\tnetwork?: string;\n\t} & CliOutputOptions\n): Promise<void> {\n\tconst verificationMethodId: string = CLIParam.stringValue(\n\t\t\"verification-method-id\",\n\t\topts.verificationMethodId\n\t);\n\tconst privateKey: Uint8Array = CLIParam.hexBase64(\"private-key\", opts.privateKey);\n\tconst credentialId: string = CLIParam.stringValue(\"credential-id\", opts.credentialId);\n\tconst subjectJson: string = path.resolve(CLIParam.stringValue(\"subject-json\", opts.subjectJson));\n\tconst revocationIndex: number | undefined = Coerce.number(opts.revocationIndex);\n\tconst nodeEndpoint: string = CLIParam.url(\"node\", opts.node);\n\tconst network: string | undefined =\n\t\topts.connector === IdentityConnectorTypes.Iota\n\t\t\t? CLIParam.stringValue(\"network\", opts.network)\n\t\t\t: undefined;\n\n\tCLIDisplay.value(\n\t\tI18n.formatMessage(\"commands.verifiable-credential-create.labels.verificationMethodId\"),\n\t\tverificationMethodId\n\t);\n\tCLIDisplay.value(\n\t\tI18n.formatMessage(\"commands.verifiable-credential-create.labels.credentialId\"),\n\t\tcredentialId\n\t);\n\tCLIDisplay.value(\n\t\tI18n.formatMessage(\"commands.verifiable-credential-create.labels.subjectJson\"),\n\t\tsubjectJson\n\t);\n\tCLIDisplay.value(\n\t\tI18n.formatMessage(\"commands.verifiable-credential-create.labels.revocationIndex\"),\n\t\trevocationIndex\n\t);\n\tCLIDisplay.value(\n\t\tI18n.formatMessage(\"commands.verifiable-credential-create.labels.expirationDate\"),\n\t\topts.expirationDate\n\t);\n\tCLIDisplay.value(I18n.formatMessage(\"commands.common.labels.node\"), nodeEndpoint);\n\tif (Is.stringValue(network)) {\n\t\tCLIDisplay.value(I18n.formatMessage(\"commands.common.labels.network\"), network);\n\t}\n\tCLIDisplay.break();\n\n\tsetupVault();\n\n\tconst vmParts = DocumentHelper.parseId(verificationMethodId);\n\n\tconst vaultConnector = VaultConnectorFactory.get(\"vault\");\n\tawait vaultConnector.addKey(\n\t\t`${vmParts.id}/${vmParts.fragment}`,\n\t\tVaultKeyType.Ed25519,\n\t\tprivateKey,\n\t\tnew Uint8Array()\n\t);\n\n\tconst walletConnector = setupWalletConnector({ nodeEndpoint, network }, opts.connector);\n\tWalletConnectorFactory.register(\"wallet\", () => walletConnector);\n\n\tconst identityConnector = setupIdentityConnector({ nodeEndpoint, network }, opts.connector);\n\n\tCLIDisplay.task(\n\t\tI18n.formatMessage(\"commands.verifiable-credential-create.progress.loadingSubjectData\")\n\t);\n\tCLIDisplay.break();\n\n\tconst jsonData = await CLIUtils.readJsonFile<IJsonLdNodeObject>(subjectJson);\n\tif (Is.undefined(jsonData)) {\n\t\tthrow new GeneralError(\n\t\t\t\"commands\",\n\t\t\t\"commands.verifiable-credential-create.subjectJsonFileNotFound\"\n\t\t);\n\t}\n\n\tCLIDisplay.task(\n\t\tI18n.formatMessage(\n\t\t\t\"commands.verifiable-credential-create.progress.creatingVerifiableCredential\"\n\t\t)\n\t);\n\tCLIDisplay.break();\n\n\tCLIDisplay.spinnerStart();\n\n\tconst verifiableCredential = await identityConnector.createVerifiableCredential(\n\t\tvmParts.id,\n\t\tverificationMethodId,\n\t\tcredentialId,\n\t\tjsonData,\n\t\t{\n\t\t\trevocationIndex,\n\t\t\texpirationDate: Coerce.dateTime(opts.expirationDate)\n\t\t}\n\t);\n\n\tCLIDisplay.spinnerStop();\n\n\tif (opts.console) {\n\t\tCLIDisplay.section(\n\t\t\tI18n.formatMessage(\"commands.verifiable-credential-create.labels.verifiableCredential\")\n\t\t);\n\n\t\tCLIDisplay.write(verifiableCredential.jwt);\n\t\tCLIDisplay.break();\n\t\tCLIDisplay.break();\n\t}\n\n\tif (Is.stringValue(opts?.json)) {\n\t\tawait CLIUtils.writeJsonFile(\n\t\t\topts.json,\n\t\t\t{\n\t\t\t\tverifiableCredentialJwt: verifiableCredential.jwt,\n\t\t\t\tverifiableCredential: verifiableCredential.verifiableCredential\n\t\t\t},\n\t\t\topts.mergeJson\n\t\t);\n\t}\n\tif (Is.stringValue(opts?.env)) {\n\t\tawait CLIUtils.writeEnvFile(\n\t\t\topts.env,\n\t\t\t[`DID_VERIFIABLE_CREDENTIAL_JWT=\"${verifiableCredential.jwt}\"`],\n\t\t\topts.mergeEnv\n\t\t);\n\t}\n\n\tCLIDisplay.done();\n}\n"]}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
// Copyright 2024 IOTA Stiftung.
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0.
|
|
3
|
+
import path from "node:path";
|
|
3
4
|
import { CLIDisplay, CLIOptions, CLIParam, CLIUtils } from "@twin.org/cli-core";
|
|
4
|
-
import { I18n, Is } from "@twin.org/core";
|
|
5
|
+
import { GeneralError, I18n, Is } from "@twin.org/core";
|
|
5
6
|
import { setupWalletConnector } from "@twin.org/wallet-cli";
|
|
6
7
|
import { WalletConnectorFactory } from "@twin.org/wallet-models";
|
|
7
8
|
import { Command, Option } from "commander";
|
|
@@ -17,7 +18,8 @@ export function buildCommandVerifiableCredentialVerify() {
|
|
|
17
18
|
.name("verifiable-credential-verify")
|
|
18
19
|
.summary(I18n.formatMessage("commands.verifiable-credential-verify.summary"))
|
|
19
20
|
.description(I18n.formatMessage("commands.verifiable-credential-verify.description"))
|
|
20
|
-
.
|
|
21
|
+
.option(I18n.formatMessage("commands.verifiable-credential-verify.options.jwt.param"), I18n.formatMessage("commands.verifiable-credential-verify.options.jwt.description"))
|
|
22
|
+
.option(I18n.formatMessage("commands.verifiable-credential-verify.options.json-ld.param"), I18n.formatMessage("commands.verifiable-credential-verify.options.json-ld.description"));
|
|
21
23
|
CLIOptions.output(command, {
|
|
22
24
|
noConsole: true,
|
|
23
25
|
json: true,
|
|
@@ -38,16 +40,33 @@ export function buildCommandVerifiableCredentialVerify() {
|
|
|
38
40
|
* Action the verifiable credential verify command.
|
|
39
41
|
* @param opts The options for the command.
|
|
40
42
|
* @param opts.jwt The JSON web token for the verifiable credential.
|
|
43
|
+
* @param opts.jsonLd The filename of a JSON-LD verifiable credential to verify.
|
|
41
44
|
* @param opts.connector The connector to perform the operations with.
|
|
42
45
|
* @param opts.node The node URL.
|
|
43
46
|
*/
|
|
44
47
|
export async function actionCommandVerifiableCredentialVerify(opts) {
|
|
45
|
-
const jwt = CLIParam.stringValue("jwt", opts.jwt);
|
|
46
48
|
const nodeEndpoint = CLIParam.url("node", opts.node);
|
|
47
49
|
const network = opts.connector === IdentityConnectorTypes.Iota
|
|
48
50
|
? CLIParam.stringValue("network", opts.network)
|
|
49
51
|
: undefined;
|
|
50
|
-
|
|
52
|
+
let credential;
|
|
53
|
+
if (Is.stringValue(opts.jwt)) {
|
|
54
|
+
const jwt = CLIParam.stringValue("jwt", opts.jwt);
|
|
55
|
+
CLIDisplay.value(I18n.formatMessage("commands.verifiable-credential-verify.labels.jwt"), jwt);
|
|
56
|
+
credential = jwt;
|
|
57
|
+
}
|
|
58
|
+
else if (Is.stringValue(opts.jsonLd)) {
|
|
59
|
+
const jsonLdPath = path.resolve(CLIParam.stringValue("json-ld", opts.jsonLd));
|
|
60
|
+
CLIDisplay.value(I18n.formatMessage("commands.verifiable-credential-verify.labels.jsonLd"), jsonLdPath);
|
|
61
|
+
const jsonData = await CLIUtils.readJsonFile(jsonLdPath);
|
|
62
|
+
if (Is.undefined(jsonData)) {
|
|
63
|
+
throw new GeneralError("commands", "commands.verifiable-credential-verify.jsonLdFileNotFound");
|
|
64
|
+
}
|
|
65
|
+
credential = jsonData;
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
throw new GeneralError("commands", "commands.verifiable-credential-verify.noCredentialProvided");
|
|
69
|
+
}
|
|
51
70
|
CLIDisplay.value(I18n.formatMessage("commands.common.labels.node"), nodeEndpoint);
|
|
52
71
|
if (Is.stringValue(network)) {
|
|
53
72
|
CLIDisplay.value(I18n.formatMessage("commands.common.labels.network"), network);
|
|
@@ -60,7 +79,7 @@ export async function actionCommandVerifiableCredentialVerify(opts) {
|
|
|
60
79
|
CLIDisplay.task(I18n.formatMessage("commands.verifiable-credential-verify.progress.verifyingCredential"));
|
|
61
80
|
CLIDisplay.break();
|
|
62
81
|
CLIDisplay.spinnerStart();
|
|
63
|
-
const verification = await identityConnector.checkVerifiableCredential(
|
|
82
|
+
const verification = await identityConnector.checkVerifiableCredential(credential);
|
|
64
83
|
const isVerified = Is.notEmpty(verification.verifiableCredential);
|
|
65
84
|
const isRevoked = verification.revoked;
|
|
66
85
|
CLIDisplay.spinnerStop();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verifiableCredentialVerify.js","sourceRoot":"","sources":["../../../src/commands/verifiableCredentialVerify.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport {\n\tCLIDisplay,\n\tCLIOptions,\n\tCLIParam,\n\tCLIUtils,\n\ttype CliOutputOptions\n} from \"@twin.org/cli-core\";\nimport { I18n, Is } from \"@twin.org/core\";\nimport { setupWalletConnector } from \"@twin.org/wallet-cli\";\nimport { WalletConnectorFactory } from \"@twin.org/wallet-models\";\nimport { Command, Option } from \"commander\";\nimport { setupIdentityConnector, setupVault } from \"./setupCommands.js\";\nimport { IdentityConnectorTypes } from \"../models/identityConnectorTypes.js\";\n\n/**\n * Build the verifiable credential verify command for the CLI.\n * @returns The command.\n */\nexport function buildCommandVerifiableCredentialVerify(): Command {\n\tconst command = new Command();\n\tcommand\n\t\t.name(\"verifiable-credential-verify\")\n\t\t.summary(I18n.formatMessage(\"commands.verifiable-credential-verify.summary\"))\n\t\t.description(I18n.formatMessage(\"commands.verifiable-credential-verify.description\"))\n\t\t.requiredOption(\n\t\t\tI18n.formatMessage(\"commands.verifiable-credential-verify.options.jwt.param\"),\n\t\t\tI18n.formatMessage(\"commands.verifiable-credential-verify.options.jwt.description\")\n\t\t);\n\tCLIOptions.output(command, {\n\t\tnoConsole: true,\n\t\tjson: true,\n\t\tenv: true,\n\t\tmergeJson: true,\n\t\tmergeEnv: true\n\t});\n\n\tcommand\n\t\t.addOption(\n\t\t\tnew Option(\n\t\t\t\tI18n.formatMessage(\"commands.common.options.connector.param\"),\n\t\t\t\tI18n.formatMessage(\"commands.common.options.connector.description\")\n\t\t\t)\n\t\t\t\t.choices(Object.values(IdentityConnectorTypes))\n\t\t\t\t.default(IdentityConnectorTypes.Iota)\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.common.options.node.param\"),\n\t\t\tI18n.formatMessage(\"commands.common.options.node.description\"),\n\t\t\t\"!NODE_URL\"\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.common.options.network.param\"),\n\t\t\tI18n.formatMessage(\"commands.common.options.network.description\"),\n\t\t\t\"!NETWORK\"\n\t\t)\n\t\t.action(actionCommandVerifiableCredentialVerify);\n\n\treturn command;\n}\n\n/**\n * Action the verifiable credential verify command.\n * @param opts The options for the command.\n * @param opts.jwt The JSON web token for the verifiable credential.\n * @param opts.connector The connector to perform the operations with.\n * @param opts.node The node URL.\n */\nexport async function actionCommandVerifiableCredentialVerify(\n\topts: {\n\t\tjwt: string;\n\t\tconnector?: IdentityConnectorTypes;\n\t\tnode: string;\n\t\tnetwork?: string;\n\t} & CliOutputOptions\n): Promise<void> {\n\tconst jwt: string = CLIParam.stringValue(\"jwt\", opts.jwt);\n\tconst nodeEndpoint: string = CLIParam.url(\"node\", opts.node);\n\tconst network: string | undefined =\n\t\topts.connector === IdentityConnectorTypes.Iota\n\t\t\t? CLIParam.stringValue(\"network\", opts.network)\n\t\t\t: undefined;\n\n\tCLIDisplay.value(I18n.formatMessage(\"commands.verifiable-credential-verify.labels.jwt\"), jwt);\n\tCLIDisplay.value(I18n.formatMessage(\"commands.common.labels.node\"), nodeEndpoint);\n\tif (Is.stringValue(network)) {\n\t\tCLIDisplay.value(I18n.formatMessage(\"commands.common.labels.network\"), network);\n\t}\n\tCLIDisplay.break();\n\n\tsetupVault();\n\n\tconst walletConnector = setupWalletConnector({ nodeEndpoint, network }, opts.connector);\n\tWalletConnectorFactory.register(\"wallet\", () => walletConnector);\n\n\tconst identityConnector = setupIdentityConnector({ nodeEndpoint, network }, opts.connector);\n\n\tCLIDisplay.task(\n\t\tI18n.formatMessage(\"commands.verifiable-credential-verify.progress.verifyingCredential\")\n\t);\n\tCLIDisplay.break();\n\n\tCLIDisplay.spinnerStart();\n\n\tconst verification = await identityConnector.checkVerifiableCredential(jwt);\n\n\tconst isVerified = Is.notEmpty(verification.verifiableCredential);\n\tconst isRevoked = verification.revoked;\n\n\tCLIDisplay.spinnerStop();\n\n\tif (opts.console) {\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"commands.verifiable-credential-verify.labels.isVerified\"),\n\t\t\tisVerified\n\t\t);\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"commands.verifiable-credential-verify.labels.isRevoked\"),\n\t\t\tisRevoked\n\t\t);\n\t\tCLIDisplay.break();\n\t}\n\n\tif (Is.stringValue(opts?.json)) {\n\t\tawait CLIUtils.writeJsonFile(opts.json, { isVerified, isRevoked }, opts.mergeJson);\n\t}\n\tif (Is.stringValue(opts?.env)) {\n\t\tawait CLIUtils.writeEnvFile(\n\t\t\topts.env,\n\t\t\t[\n\t\t\t\t`DID_VERIFIABLE_CREDENTIAL_VERIFIED=\"${isVerified}\"`,\n\t\t\t\t`DID_VERIFIABLE_CREDENTIAL_REVOKED=\"${isRevoked}\"`\n\t\t\t],\n\t\t\topts.mergeEnv\n\t\t);\n\t}\n\n\tCLIDisplay.done();\n}\n"]}
|
|
1
|
+
{"version":3,"file":"verifiableCredentialVerify.js","sourceRoot":"","sources":["../../../src/commands/verifiableCredentialVerify.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport path from \"node:path\";\nimport {\n\tCLIDisplay,\n\tCLIOptions,\n\tCLIParam,\n\tCLIUtils,\n\ttype CliOutputOptions\n} from \"@twin.org/cli-core\";\nimport { GeneralError, I18n, Is } from \"@twin.org/core\";\nimport type { IDidVerifiableCredential } from \"@twin.org/standards-w3c-did\";\nimport { setupWalletConnector } from \"@twin.org/wallet-cli\";\nimport { WalletConnectorFactory } from \"@twin.org/wallet-models\";\nimport { Command, Option } from \"commander\";\nimport { setupIdentityConnector, setupVault } from \"./setupCommands.js\";\nimport { IdentityConnectorTypes } from \"../models/identityConnectorTypes.js\";\n\n/**\n * Build the verifiable credential verify command for the CLI.\n * @returns The command.\n */\nexport function buildCommandVerifiableCredentialVerify(): Command {\n\tconst command = new Command();\n\tcommand\n\t\t.name(\"verifiable-credential-verify\")\n\t\t.summary(I18n.formatMessage(\"commands.verifiable-credential-verify.summary\"))\n\t\t.description(I18n.formatMessage(\"commands.verifiable-credential-verify.description\"))\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.verifiable-credential-verify.options.jwt.param\"),\n\t\t\tI18n.formatMessage(\"commands.verifiable-credential-verify.options.jwt.description\")\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.verifiable-credential-verify.options.json-ld.param\"),\n\t\t\tI18n.formatMessage(\"commands.verifiable-credential-verify.options.json-ld.description\")\n\t\t);\n\tCLIOptions.output(command, {\n\t\tnoConsole: true,\n\t\tjson: true,\n\t\tenv: true,\n\t\tmergeJson: true,\n\t\tmergeEnv: true\n\t});\n\n\tcommand\n\t\t.addOption(\n\t\t\tnew Option(\n\t\t\t\tI18n.formatMessage(\"commands.common.options.connector.param\"),\n\t\t\t\tI18n.formatMessage(\"commands.common.options.connector.description\")\n\t\t\t)\n\t\t\t\t.choices(Object.values(IdentityConnectorTypes))\n\t\t\t\t.default(IdentityConnectorTypes.Iota)\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.common.options.node.param\"),\n\t\t\tI18n.formatMessage(\"commands.common.options.node.description\"),\n\t\t\t\"!NODE_URL\"\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.common.options.network.param\"),\n\t\t\tI18n.formatMessage(\"commands.common.options.network.description\"),\n\t\t\t\"!NETWORK\"\n\t\t)\n\t\t.action(actionCommandVerifiableCredentialVerify);\n\n\treturn command;\n}\n\n/**\n * Action the verifiable credential verify command.\n * @param opts The options for the command.\n * @param opts.jwt The JSON web token for the verifiable credential.\n * @param opts.jsonLd The filename of a JSON-LD verifiable credential to verify.\n * @param opts.connector The connector to perform the operations with.\n * @param opts.node The node URL.\n */\nexport async function actionCommandVerifiableCredentialVerify(\n\topts: {\n\t\tjwt?: string;\n\t\tjsonLd?: string;\n\t\tconnector?: IdentityConnectorTypes;\n\t\tnode: string;\n\t\tnetwork?: string;\n\t} & CliOutputOptions\n): Promise<void> {\n\tconst nodeEndpoint: string = CLIParam.url(\"node\", opts.node);\n\tconst network: string | undefined =\n\t\topts.connector === IdentityConnectorTypes.Iota\n\t\t\t? CLIParam.stringValue(\"network\", opts.network)\n\t\t\t: undefined;\n\n\tlet credential: string | IDidVerifiableCredential;\n\n\tif (Is.stringValue(opts.jwt)) {\n\t\tconst jwt = CLIParam.stringValue(\"jwt\", opts.jwt);\n\t\tCLIDisplay.value(I18n.formatMessage(\"commands.verifiable-credential-verify.labels.jwt\"), jwt);\n\t\tcredential = jwt;\n\t} else if (Is.stringValue(opts.jsonLd)) {\n\t\tconst jsonLdPath = path.resolve(CLIParam.stringValue(\"json-ld\", opts.jsonLd));\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"commands.verifiable-credential-verify.labels.jsonLd\"),\n\t\t\tjsonLdPath\n\t\t);\n\t\tconst jsonData = await CLIUtils.readJsonFile<IDidVerifiableCredential>(jsonLdPath);\n\t\tif (Is.undefined(jsonData)) {\n\t\t\tthrow new GeneralError(\n\t\t\t\t\"commands\",\n\t\t\t\t\"commands.verifiable-credential-verify.jsonLdFileNotFound\"\n\t\t\t);\n\t\t}\n\t\tcredential = jsonData;\n\t} else {\n\t\tthrow new GeneralError(\n\t\t\t\"commands\",\n\t\t\t\"commands.verifiable-credential-verify.noCredentialProvided\"\n\t\t);\n\t}\n\n\tCLIDisplay.value(I18n.formatMessage(\"commands.common.labels.node\"), nodeEndpoint);\n\tif (Is.stringValue(network)) {\n\t\tCLIDisplay.value(I18n.formatMessage(\"commands.common.labels.network\"), network);\n\t}\n\tCLIDisplay.break();\n\n\tsetupVault();\n\n\tconst walletConnector = setupWalletConnector({ nodeEndpoint, network }, opts.connector);\n\tWalletConnectorFactory.register(\"wallet\", () => walletConnector);\n\n\tconst identityConnector = setupIdentityConnector({ nodeEndpoint, network }, opts.connector);\n\n\tCLIDisplay.task(\n\t\tI18n.formatMessage(\"commands.verifiable-credential-verify.progress.verifyingCredential\")\n\t);\n\tCLIDisplay.break();\n\n\tCLIDisplay.spinnerStart();\n\n\tconst verification = await identityConnector.checkVerifiableCredential(credential);\n\n\tconst isVerified = Is.notEmpty(verification.verifiableCredential);\n\tconst isRevoked = verification.revoked;\n\n\tCLIDisplay.spinnerStop();\n\n\tif (opts.console) {\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"commands.verifiable-credential-verify.labels.isVerified\"),\n\t\t\tisVerified\n\t\t);\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"commands.verifiable-credential-verify.labels.isRevoked\"),\n\t\t\tisRevoked\n\t\t);\n\t\tCLIDisplay.break();\n\t}\n\n\tif (Is.stringValue(opts?.json)) {\n\t\tawait CLIUtils.writeJsonFile(opts.json, { isVerified, isRevoked }, opts.mergeJson);\n\t}\n\tif (Is.stringValue(opts?.env)) {\n\t\tawait CLIUtils.writeEnvFile(\n\t\t\topts.env,\n\t\t\t[\n\t\t\t\t`DID_VERIFIABLE_CREDENTIAL_VERIFIED=\"${isVerified}\"`,\n\t\t\t\t`DID_VERIFIABLE_CREDENTIAL_REVOKED=\"${isRevoked}\"`\n\t\t\t],\n\t\t\topts.mergeEnv\n\t\t);\n\t}\n\n\tCLIDisplay.done();\n}\n"]}
|