@twin.org/identity-cli 0.0.3-next.9 → 0.9.0-next.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/README.md +5 -5
  2. package/dist/es/cli.js +10 -1
  3. package/dist/es/cli.js.map +1 -1
  4. package/dist/es/commands/alsoKnownAsAdd.js +108 -0
  5. package/dist/es/commands/alsoKnownAsAdd.js.map +1 -0
  6. package/dist/es/commands/alsoKnownAsRemove.js +106 -0
  7. package/dist/es/commands/alsoKnownAsRemove.js.map +1 -0
  8. package/dist/es/commands/serviceAdd.js +4 -3
  9. package/dist/es/commands/serviceAdd.js.map +1 -1
  10. package/dist/es/commands/serviceRemove.js +3 -3
  11. package/dist/es/commands/serviceRemove.js.map +1 -1
  12. package/dist/es/commands/setupCommands.js +4 -6
  13. package/dist/es/commands/setupCommands.js.map +1 -1
  14. package/dist/es/commands/verifiableCredentialCreate.js +11 -8
  15. package/dist/es/commands/verifiableCredentialCreate.js.map +1 -1
  16. package/dist/es/commands/verifiableCredentialVerify.js +24 -5
  17. package/dist/es/commands/verifiableCredentialVerify.js.map +1 -1
  18. package/dist/es/commands/verifiablePresentationCreate.js +137 -0
  19. package/dist/es/commands/verifiablePresentationCreate.js.map +1 -0
  20. package/dist/es/commands/verifiablePresentationVerify.js +107 -0
  21. package/dist/es/commands/verifiablePresentationVerify.js.map +1 -0
  22. package/dist/es/commands/verificationMethodAdd.js +8 -8
  23. package/dist/es/commands/verificationMethodAdd.js.map +1 -1
  24. package/dist/es/index.js +2 -0
  25. package/dist/es/index.js.map +1 -1
  26. package/dist/locales/en.json +251 -39
  27. package/dist/types/commands/alsoKnownAsAdd.d.ts +30 -0
  28. package/dist/types/commands/alsoKnownAsRemove.d.ts +30 -0
  29. package/dist/types/commands/setupCommands.d.ts +2 -2
  30. package/dist/types/commands/verifiableCredentialCreate.d.ts +2 -2
  31. package/dist/types/commands/verifiableCredentialVerify.d.ts +3 -1
  32. package/dist/types/commands/verifiablePresentationCreate.d.ts +32 -0
  33. package/dist/types/commands/verifiablePresentationVerify.d.ts +24 -0
  34. package/dist/types/index.d.ts +2 -0
  35. package/docs/changelog.md +660 -117
  36. package/docs/reference/classes/CLI.md +1 -1
  37. package/docs/reference/functions/actionCommandVerifiablePresentationCreate.md +17 -0
  38. package/docs/reference/functions/actionCommandVerifiablePresentationVerify.md +17 -0
  39. package/docs/reference/functions/buildCommandVerifiablePresentationCreate.md +11 -0
  40. package/docs/reference/functions/buildCommandVerifiablePresentationVerify.md +11 -0
  41. package/docs/reference/index.md +4 -0
  42. package/docs/reference/variables/IdentityConnectorTypes.md +1 -1
  43. package/docs/reference/variables/IdentityResolverConnectorTypes.md +1 -1
  44. package/docs/{examples.md → usage.md} +23 -27
  45. package/locales/en.json +142 -2
  46. package/package.json +22 -22
@@ -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.id The id of the verification method to use for the credential.
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 id = CLIParam.stringValue("id", opts.id);
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"), id);
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(id);
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,9 +90,9 @@ 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, id, credentialId, jsonData, {
93
+ const verifiableCredential = await identityConnector.createVerifiableCredential(vmParts.id, verificationMethodId, credentialId, jsonData, {
94
94
  revocationIndex,
95
- expirationDate: Coerce.date(opts.expirationDate)
95
+ expirationDate: Coerce.dateTime(opts.expirationDate)
96
96
  });
97
97
  CLIDisplay.spinnerStop();
98
98
  if (opts.console) {
@@ -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, { verifiableCredentialJwt: verifiableCredential.jwt }, opts.mergeJson);
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.date(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
- .requiredOption(I18n.formatMessage("commands.verifiable-credential-verify.options.jwt.param"), I18n.formatMessage("commands.verifiable-credential-verify.options.jwt.description"));
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
- CLIDisplay.value(I18n.formatMessage("commands.verifiable-credential-verify.labels.jwt"), jwt);
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(jwt);
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"]}
@@ -0,0 +1,137 @@
1
+ // Copyright 2024 IOTA Stiftung.
2
+ // SPDX-License-Identifier: Apache-2.0.
3
+ import path from "node:path";
4
+ import { CLIDisplay, CLIOptions, CLIParam, CLIUtils } from "@twin.org/cli-core";
5
+ import { Coerce, GeneralError, I18n, Is } from "@twin.org/core";
6
+ import { DocumentHelper } from "@twin.org/identity-models";
7
+ import { VaultConnectorFactory, VaultKeyType } from "@twin.org/vault-models";
8
+ import { setupWalletConnector } from "@twin.org/wallet-cli";
9
+ import { WalletConnectorFactory } from "@twin.org/wallet-models";
10
+ import { Command, Option } from "commander";
11
+ import { setupIdentityConnector, setupVault } from "./setupCommands.js";
12
+ import { IdentityConnectorTypes } from "../models/identityConnectorTypes.js";
13
+ /**
14
+ * Build the verifiable presentation create command for the CLI.
15
+ * @returns The command.
16
+ */
17
+ export function buildCommandVerifiablePresentationCreate() {
18
+ const command = new Command();
19
+ command
20
+ .name("verifiable-presentation-create")
21
+ .summary(I18n.formatMessage("commands.verifiable-presentation-create.summary"))
22
+ .description(I18n.formatMessage("commands.verifiable-presentation-create.description"))
23
+ .requiredOption(I18n.formatMessage("commands.verifiable-presentation-create.options.verification-method-id.param"), I18n.formatMessage("commands.verifiable-presentation-create.options.verification-method-id.description"))
24
+ .requiredOption(I18n.formatMessage("commands.verifiable-presentation-create.options.private-key.param"), I18n.formatMessage("commands.verifiable-presentation-create.options.private-key.description"))
25
+ .option(I18n.formatMessage("commands.verifiable-presentation-create.options.presentation-id.param"), I18n.formatMessage("commands.verifiable-presentation-create.options.presentation-id.description"))
26
+ .option(I18n.formatMessage("commands.verifiable-presentation-create.options.jwt.param"), I18n.formatMessage("commands.verifiable-presentation-create.options.jwt.description"))
27
+ .option(I18n.formatMessage("commands.verifiable-presentation-create.options.json-ld.param"), I18n.formatMessage("commands.verifiable-presentation-create.options.json-ld.description"))
28
+ .option(I18n.formatMessage("commands.verifiable-presentation-create.options.expiration-date.param"), I18n.formatMessage("commands.verifiable-presentation-create.options.expiration-date.description"));
29
+ CLIOptions.output(command, {
30
+ noConsole: true,
31
+ json: true,
32
+ env: true,
33
+ mergeJson: true,
34
+ mergeEnv: true
35
+ });
36
+ command
37
+ .addOption(new Option(I18n.formatMessage("commands.common.options.connector.param"), I18n.formatMessage("commands.common.options.connector.description"))
38
+ .choices(Object.values(IdentityConnectorTypes))
39
+ .default(IdentityConnectorTypes.Iota))
40
+ .option(I18n.formatMessage("commands.common.options.node.param"), I18n.formatMessage("commands.common.options.node.description"), "!NODE_URL")
41
+ .option(I18n.formatMessage("commands.common.options.network.param"), I18n.formatMessage("commands.common.options.network.description"), "!NETWORK")
42
+ .action(actionCommandVerifiablePresentationCreate);
43
+ return command;
44
+ }
45
+ /**
46
+ * Action the verifiable presentation create command.
47
+ * @param opts The options for the command.
48
+ * @param opts.verificationMethodId The id of the verification method to use.
49
+ * @param opts.privateKey The private key for the verification method.
50
+ * @param opts.presentationId The optional id of the presentation.
51
+ * @param opts.jwt Comma-separated JWT credential strings to include.
52
+ * @param opts.jsonLd Comma-separated JSON-LD filenames to include.
53
+ * @param opts.expirationDate The expiration date for the presentation.
54
+ * @param opts.connector The connector to perform the operations with.
55
+ * @param opts.node The node URL.
56
+ * @param opts.network The network name.
57
+ */
58
+ export async function actionCommandVerifiablePresentationCreate(opts) {
59
+ const verificationMethodId = CLIParam.stringValue("verification-method-id", opts.verificationMethodId);
60
+ const privateKey = CLIParam.hexBase64("private-key", opts.privateKey);
61
+ const presentationId = Is.stringValue(opts.presentationId)
62
+ ? CLIParam.stringValue("presentation-id", opts.presentationId)
63
+ : undefined;
64
+ const nodeEndpoint = CLIParam.url("node", opts.node);
65
+ const network = opts.connector === IdentityConnectorTypes.Iota
66
+ ? CLIParam.stringValue("network", opts.network)
67
+ : undefined;
68
+ const jwtCredentials = (opts.jwt ?? "")
69
+ .split(",")
70
+ .map(j => j.trim())
71
+ .filter(Boolean);
72
+ const jsonLdFilenames = (opts.jsonLd ?? "")
73
+ .split(",")
74
+ .map(f => f.trim())
75
+ .filter(Boolean);
76
+ if (jwtCredentials.length === 0 && jsonLdFilenames.length === 0) {
77
+ throw new GeneralError("commands", "commands.verifiable-presentation-create.noCredentialsProvided");
78
+ }
79
+ CLIDisplay.value(I18n.formatMessage("commands.verifiable-presentation-create.labels.verificationMethodId"), verificationMethodId);
80
+ if (Is.stringValue(presentationId)) {
81
+ CLIDisplay.value(I18n.formatMessage("commands.verifiable-presentation-create.labels.presentationId"), presentationId);
82
+ }
83
+ if (jwtCredentials.length > 0) {
84
+ CLIDisplay.value(I18n.formatMessage("commands.verifiable-presentation-create.labels.jwt"), jwtCredentials.join(", "));
85
+ }
86
+ if (jsonLdFilenames.length > 0) {
87
+ CLIDisplay.value(I18n.formatMessage("commands.verifiable-presentation-create.labels.jsonLd"), jsonLdFilenames.join(", "));
88
+ }
89
+ CLIDisplay.value(I18n.formatMessage("commands.verifiable-presentation-create.labels.expirationDate"), opts.expirationDate);
90
+ CLIDisplay.value(I18n.formatMessage("commands.common.labels.node"), nodeEndpoint);
91
+ if (Is.stringValue(network)) {
92
+ CLIDisplay.value(I18n.formatMessage("commands.common.labels.network"), network);
93
+ }
94
+ CLIDisplay.break();
95
+ setupVault();
96
+ const vmParts = DocumentHelper.parseId(verificationMethodId);
97
+ const vaultConnector = VaultConnectorFactory.get("vault");
98
+ await vaultConnector.addKey(`${vmParts.id}/${vmParts.fragment}`, VaultKeyType.Ed25519, privateKey, new Uint8Array());
99
+ const walletConnector = setupWalletConnector({ nodeEndpoint, network }, opts.connector);
100
+ WalletConnectorFactory.register("wallet", () => walletConnector);
101
+ const identityConnector = setupIdentityConnector({ nodeEndpoint, network }, opts.connector);
102
+ CLIDisplay.task(I18n.formatMessage("commands.verifiable-presentation-create.progress.loadingCredentialData"));
103
+ CLIDisplay.break();
104
+ const verifiableCredentials = [...jwtCredentials];
105
+ for (const filename of jsonLdFilenames) {
106
+ const resolvedPath = path.resolve(filename);
107
+ const jsonData = await CLIUtils.readJsonFile(resolvedPath);
108
+ if (Is.undefined(jsonData)) {
109
+ throw new GeneralError("commands", "commands.verifiable-presentation-create.jsonLdFileNotFound");
110
+ }
111
+ verifiableCredentials.push(jsonData);
112
+ }
113
+ CLIDisplay.task(I18n.formatMessage("commands.verifiable-presentation-create.progress.creatingVerifiablePresentation"));
114
+ CLIDisplay.break();
115
+ CLIDisplay.spinnerStart();
116
+ const verifiablePresentation = await identityConnector.createVerifiablePresentation(vmParts.id, verificationMethodId, presentationId, undefined, undefined, verifiableCredentials, {
117
+ expirationDate: Coerce.dateTime(opts.expirationDate)
118
+ });
119
+ CLIDisplay.spinnerStop();
120
+ if (opts.console) {
121
+ CLIDisplay.section(I18n.formatMessage("commands.verifiable-presentation-create.labels.verifiablePresentation"));
122
+ CLIDisplay.write(verifiablePresentation.jwt);
123
+ CLIDisplay.break();
124
+ CLIDisplay.break();
125
+ }
126
+ if (Is.stringValue(opts?.json)) {
127
+ await CLIUtils.writeJsonFile(opts.json, {
128
+ verifiablePresentationJwt: verifiablePresentation.jwt,
129
+ verifiablePresentation: verifiablePresentation.verifiablePresentation
130
+ }, opts.mergeJson);
131
+ }
132
+ if (Is.stringValue(opts?.env)) {
133
+ await CLIUtils.writeEnvFile(opts.env, [`DID_VERIFIABLE_PRESENTATION_JWT="${verifiablePresentation.jwt}"`], opts.mergeEnv);
134
+ }
135
+ CLIDisplay.done();
136
+ }
137
+ //# sourceMappingURL=verifiablePresentationCreate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifiablePresentationCreate.js","sourceRoot":"","sources":["../../../src/commands/verifiablePresentationCreate.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 { DocumentHelper } from \"@twin.org/identity-models\";\nimport type { IDidVerifiableCredential } from \"@twin.org/standards-w3c-did\";\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 presentation create command for the CLI.\n * @returns The command.\n */\nexport function buildCommandVerifiablePresentationCreate(): Command {\n\tconst command = new Command();\n\tcommand\n\t\t.name(\"verifiable-presentation-create\")\n\t\t.summary(I18n.formatMessage(\"commands.verifiable-presentation-create.summary\"))\n\t\t.description(I18n.formatMessage(\"commands.verifiable-presentation-create.description\"))\n\t\t.requiredOption(\n\t\t\tI18n.formatMessage(\n\t\t\t\t\"commands.verifiable-presentation-create.options.verification-method-id.param\"\n\t\t\t),\n\t\t\tI18n.formatMessage(\n\t\t\t\t\"commands.verifiable-presentation-create.options.verification-method-id.description\"\n\t\t\t)\n\t\t)\n\t\t.requiredOption(\n\t\t\tI18n.formatMessage(\"commands.verifiable-presentation-create.options.private-key.param\"),\n\t\t\tI18n.formatMessage(\"commands.verifiable-presentation-create.options.private-key.description\")\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.verifiable-presentation-create.options.presentation-id.param\"),\n\t\t\tI18n.formatMessage(\n\t\t\t\t\"commands.verifiable-presentation-create.options.presentation-id.description\"\n\t\t\t)\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.verifiable-presentation-create.options.jwt.param\"),\n\t\t\tI18n.formatMessage(\"commands.verifiable-presentation-create.options.jwt.description\")\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.verifiable-presentation-create.options.json-ld.param\"),\n\t\t\tI18n.formatMessage(\"commands.verifiable-presentation-create.options.json-ld.description\")\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.verifiable-presentation-create.options.expiration-date.param\"),\n\t\t\tI18n.formatMessage(\n\t\t\t\t\"commands.verifiable-presentation-create.options.expiration-date.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(actionCommandVerifiablePresentationCreate);\n\n\treturn command;\n}\n\n/**\n * Action the verifiable presentation create command.\n * @param opts The options for the command.\n * @param opts.verificationMethodId The id of the verification method to use.\n * @param opts.privateKey The private key for the verification method.\n * @param opts.presentationId The optional id of the presentation.\n * @param opts.jwt Comma-separated JWT credential strings to include.\n * @param opts.jsonLd Comma-separated JSON-LD filenames to include.\n * @param opts.expirationDate The expiration date for the presentation.\n * @param opts.connector The connector to perform the operations with.\n * @param opts.node The node URL.\n * @param opts.network The network name.\n */\nexport async function actionCommandVerifiablePresentationCreate(\n\topts: {\n\t\tverificationMethodId: string;\n\t\tprivateKey: string;\n\t\tpresentationId?: string;\n\t\tjwt?: string;\n\t\tjsonLd?: string;\n\t\texpirationDate?: 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 presentationId: string | undefined = Is.stringValue(opts.presentationId)\n\t\t? CLIParam.stringValue(\"presentation-id\", opts.presentationId)\n\t\t: undefined;\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\tconst jwtCredentials = (opts.jwt ?? \"\")\n\t\t.split(\",\")\n\t\t.map(j => j.trim())\n\t\t.filter(Boolean);\n\tconst jsonLdFilenames = (opts.jsonLd ?? \"\")\n\t\t.split(\",\")\n\t\t.map(f => f.trim())\n\t\t.filter(Boolean);\n\n\tif (jwtCredentials.length === 0 && jsonLdFilenames.length === 0) {\n\t\tthrow new GeneralError(\n\t\t\t\"commands\",\n\t\t\t\"commands.verifiable-presentation-create.noCredentialsProvided\"\n\t\t);\n\t}\n\n\tCLIDisplay.value(\n\t\tI18n.formatMessage(\"commands.verifiable-presentation-create.labels.verificationMethodId\"),\n\t\tverificationMethodId\n\t);\n\tif (Is.stringValue(presentationId)) {\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"commands.verifiable-presentation-create.labels.presentationId\"),\n\t\t\tpresentationId\n\t\t);\n\t}\n\tif (jwtCredentials.length > 0) {\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"commands.verifiable-presentation-create.labels.jwt\"),\n\t\t\tjwtCredentials.join(\", \")\n\t\t);\n\t}\n\tif (jsonLdFilenames.length > 0) {\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"commands.verifiable-presentation-create.labels.jsonLd\"),\n\t\t\tjsonLdFilenames.join(\", \")\n\t\t);\n\t}\n\tCLIDisplay.value(\n\t\tI18n.formatMessage(\"commands.verifiable-presentation-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-presentation-create.progress.loadingCredentialData\")\n\t);\n\tCLIDisplay.break();\n\n\tconst verifiableCredentials: (string | IDidVerifiableCredential)[] = [...jwtCredentials];\n\n\tfor (const filename of jsonLdFilenames) {\n\t\tconst resolvedPath = path.resolve(filename);\n\t\tconst jsonData = await CLIUtils.readJsonFile<IDidVerifiableCredential>(resolvedPath);\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-presentation-create.jsonLdFileNotFound\"\n\t\t\t);\n\t\t}\n\t\tverifiableCredentials.push(jsonData);\n\t}\n\n\tCLIDisplay.task(\n\t\tI18n.formatMessage(\n\t\t\t\"commands.verifiable-presentation-create.progress.creatingVerifiablePresentation\"\n\t\t)\n\t);\n\tCLIDisplay.break();\n\n\tCLIDisplay.spinnerStart();\n\n\tconst verifiablePresentation = await identityConnector.createVerifiablePresentation(\n\t\tvmParts.id,\n\t\tverificationMethodId,\n\t\tpresentationId,\n\t\tundefined,\n\t\tundefined,\n\t\tverifiableCredentials,\n\t\t{\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-presentation-create.labels.verifiablePresentation\")\n\t\t);\n\t\tCLIDisplay.write(verifiablePresentation.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\tverifiablePresentationJwt: verifiablePresentation.jwt,\n\t\t\t\tverifiablePresentation: verifiablePresentation.verifiablePresentation\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_PRESENTATION_JWT=\"${verifiablePresentation.jwt}\"`],\n\t\t\topts.mergeEnv\n\t\t);\n\t}\n\n\tCLIDisplay.done();\n}\n"]}
@@ -0,0 +1,107 @@
1
+ // Copyright 2024 IOTA Stiftung.
2
+ // SPDX-License-Identifier: Apache-2.0.
3
+ import path from "node:path";
4
+ import { CLIDisplay, CLIOptions, CLIParam, CLIUtils } from "@twin.org/cli-core";
5
+ import { GeneralError, I18n, Is } from "@twin.org/core";
6
+ import { setupWalletConnector } from "@twin.org/wallet-cli";
7
+ import { WalletConnectorFactory } from "@twin.org/wallet-models";
8
+ import { Command, Option } from "commander";
9
+ import { setupIdentityConnector, setupVault } from "./setupCommands.js";
10
+ import { IdentityConnectorTypes } from "../models/identityConnectorTypes.js";
11
+ /**
12
+ * Build the verifiable presentation verify command for the CLI.
13
+ * @returns The command.
14
+ */
15
+ export function buildCommandVerifiablePresentationVerify() {
16
+ const command = new Command();
17
+ command
18
+ .name("verifiable-presentation-verify")
19
+ .summary(I18n.formatMessage("commands.verifiable-presentation-verify.summary"))
20
+ .description(I18n.formatMessage("commands.verifiable-presentation-verify.description"))
21
+ .option(I18n.formatMessage("commands.verifiable-presentation-verify.options.jwt.param"), I18n.formatMessage("commands.verifiable-presentation-verify.options.jwt.description"))
22
+ .option(I18n.formatMessage("commands.verifiable-presentation-verify.options.json-ld.param"), I18n.formatMessage("commands.verifiable-presentation-verify.options.json-ld.description"));
23
+ CLIOptions.output(command, {
24
+ noConsole: true,
25
+ json: true,
26
+ env: true,
27
+ mergeJson: true,
28
+ mergeEnv: true
29
+ });
30
+ command
31
+ .addOption(new Option(I18n.formatMessage("commands.common.options.connector.param"), I18n.formatMessage("commands.common.options.connector.description"))
32
+ .choices(Object.values(IdentityConnectorTypes))
33
+ .default(IdentityConnectorTypes.Iota))
34
+ .option(I18n.formatMessage("commands.common.options.node.param"), I18n.formatMessage("commands.common.options.node.description"), "!NODE_URL")
35
+ .option(I18n.formatMessage("commands.common.options.network.param"), I18n.formatMessage("commands.common.options.network.description"), "!NETWORK")
36
+ .action(actionCommandVerifiablePresentationVerify);
37
+ return command;
38
+ }
39
+ /**
40
+ * Action the verifiable presentation verify command.
41
+ * @param opts The options for the command.
42
+ * @param opts.jwt The JSON web token for the verifiable presentation.
43
+ * @param opts.jsonLd The filename of a JSON-LD verifiable presentation to verify.
44
+ * @param opts.connector The connector to perform the operations with.
45
+ * @param opts.node The node URL.
46
+ * @param opts.network The network name.
47
+ */
48
+ export async function actionCommandVerifiablePresentationVerify(opts) {
49
+ const nodeEndpoint = CLIParam.url("node", opts.node);
50
+ const network = opts.connector === IdentityConnectorTypes.Iota
51
+ ? CLIParam.stringValue("network", opts.network)
52
+ : undefined;
53
+ let presentation;
54
+ if (Is.stringValue(opts.jwt)) {
55
+ const jwt = CLIParam.stringValue("jwt", opts.jwt);
56
+ CLIDisplay.value(I18n.formatMessage("commands.verifiable-presentation-verify.labels.jwt"), jwt);
57
+ presentation = jwt;
58
+ }
59
+ else if (Is.stringValue(opts.jsonLd)) {
60
+ const jsonLdPath = path.resolve(CLIParam.stringValue("json-ld", opts.jsonLd));
61
+ CLIDisplay.value(I18n.formatMessage("commands.verifiable-presentation-verify.labels.jsonLd"), jsonLdPath);
62
+ const jsonData = await CLIUtils.readJsonFile(jsonLdPath);
63
+ if (Is.undefined(jsonData)) {
64
+ throw new GeneralError("commands", "commands.verifiable-presentation-verify.jsonLdFileNotFound");
65
+ }
66
+ presentation = jsonData;
67
+ }
68
+ else {
69
+ throw new GeneralError("commands", "commands.verifiable-presentation-verify.noPresentationProvided");
70
+ }
71
+ CLIDisplay.value(I18n.formatMessage("commands.common.labels.node"), nodeEndpoint);
72
+ if (Is.stringValue(network)) {
73
+ CLIDisplay.value(I18n.formatMessage("commands.common.labels.network"), network);
74
+ }
75
+ CLIDisplay.break();
76
+ setupVault();
77
+ const walletConnector = setupWalletConnector({ nodeEndpoint, network }, opts.connector);
78
+ WalletConnectorFactory.register("wallet", () => walletConnector);
79
+ const identityConnector = setupIdentityConnector({ nodeEndpoint, network }, opts.connector);
80
+ CLIDisplay.task(I18n.formatMessage("commands.verifiable-presentation-verify.progress.verifyingPresentation"));
81
+ CLIDisplay.break();
82
+ CLIDisplay.spinnerStart();
83
+ const verification = await identityConnector.checkVerifiablePresentation(presentation);
84
+ const isVerified = Is.notEmpty(verification.verifiablePresentation);
85
+ const isRevoked = verification.revoked;
86
+ CLIDisplay.spinnerStop();
87
+ if (opts.console) {
88
+ CLIDisplay.value(I18n.formatMessage("commands.verifiable-presentation-verify.labels.isVerified"), isVerified);
89
+ CLIDisplay.value(I18n.formatMessage("commands.verifiable-presentation-verify.labels.isRevoked"), isRevoked);
90
+ CLIDisplay.break();
91
+ }
92
+ if (Is.stringValue(opts?.json)) {
93
+ await CLIUtils.writeJsonFile(opts.json, {
94
+ isVerified,
95
+ isRevoked,
96
+ verifiablePresentation: verification.verifiablePresentation
97
+ }, opts.mergeJson);
98
+ }
99
+ if (Is.stringValue(opts?.env)) {
100
+ await CLIUtils.writeEnvFile(opts.env, [
101
+ `DID_VERIFIABLE_PRESENTATION_VERIFIED="${isVerified}"`,
102
+ `DID_VERIFIABLE_PRESENTATION_REVOKED="${isRevoked}"`
103
+ ], opts.mergeEnv);
104
+ }
105
+ CLIDisplay.done();
106
+ }
107
+ //# sourceMappingURL=verifiablePresentationVerify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifiablePresentationVerify.js","sourceRoot":"","sources":["../../../src/commands/verifiablePresentationVerify.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 { IDidVerifiablePresentation } 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 presentation verify command for the CLI.\n * @returns The command.\n */\nexport function buildCommandVerifiablePresentationVerify(): Command {\n\tconst command = new Command();\n\tcommand\n\t\t.name(\"verifiable-presentation-verify\")\n\t\t.summary(I18n.formatMessage(\"commands.verifiable-presentation-verify.summary\"))\n\t\t.description(I18n.formatMessage(\"commands.verifiable-presentation-verify.description\"))\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.verifiable-presentation-verify.options.jwt.param\"),\n\t\t\tI18n.formatMessage(\"commands.verifiable-presentation-verify.options.jwt.description\")\n\t\t)\n\t\t.option(\n\t\t\tI18n.formatMessage(\"commands.verifiable-presentation-verify.options.json-ld.param\"),\n\t\t\tI18n.formatMessage(\"commands.verifiable-presentation-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(actionCommandVerifiablePresentationVerify);\n\n\treturn command;\n}\n\n/**\n * Action the verifiable presentation verify command.\n * @param opts The options for the command.\n * @param opts.jwt The JSON web token for the verifiable presentation.\n * @param opts.jsonLd The filename of a JSON-LD verifiable presentation to verify.\n * @param opts.connector The connector to perform the operations with.\n * @param opts.node The node URL.\n * @param opts.network The network name.\n */\nexport async function actionCommandVerifiablePresentationVerify(\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 presentation: string | IDidVerifiablePresentation;\n\n\tif (Is.stringValue(opts.jwt)) {\n\t\tconst jwt = CLIParam.stringValue(\"jwt\", opts.jwt);\n\t\tCLIDisplay.value(I18n.formatMessage(\"commands.verifiable-presentation-verify.labels.jwt\"), jwt);\n\t\tpresentation = 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-presentation-verify.labels.jsonLd\"),\n\t\t\tjsonLdPath\n\t\t);\n\t\tconst jsonData = await CLIUtils.readJsonFile<IDidVerifiablePresentation>(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-presentation-verify.jsonLdFileNotFound\"\n\t\t\t);\n\t\t}\n\t\tpresentation = jsonData;\n\t} else {\n\t\tthrow new GeneralError(\n\t\t\t\"commands\",\n\t\t\t\"commands.verifiable-presentation-verify.noPresentationProvided\"\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-presentation-verify.progress.verifyingPresentation\")\n\t);\n\tCLIDisplay.break();\n\n\tCLIDisplay.spinnerStart();\n\n\tconst verification = await identityConnector.checkVerifiablePresentation(presentation);\n\n\tconst isVerified = Is.notEmpty(verification.verifiablePresentation);\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-presentation-verify.labels.isVerified\"),\n\t\t\tisVerified\n\t\t);\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"commands.verifiable-presentation-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(\n\t\t\topts.json,\n\t\t\t{\n\t\t\t\tisVerified,\n\t\t\t\tisRevoked,\n\t\t\t\tverifiablePresentation: verification.verifiablePresentation\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[\n\t\t\t\t`DID_VERIFIABLE_PRESENTATION_VERIFIED=\"${isVerified}\"`,\n\t\t\t\t`DID_VERIFIABLE_PRESENTATION_REVOKED=\"${isRevoked}\"`\n\t\t\t],\n\t\t\topts.mergeEnv\n\t\t);\n\t}\n\n\tCLIDisplay.done();\n}\n"]}
@@ -82,32 +82,32 @@ export async function actionCommandVerificationMethodAdd(opts) {
82
82
  CLIDisplay.break();
83
83
  setupVault();
84
84
  const vaultSeedId = "local-seed";
85
- const localIdentity = "local";
85
+ const vmParts = DocumentHelper.parseId(did);
86
86
  const vaultConnector = VaultConnectorFactory.get("vault");
87
- await vaultConnector.setSecret(`${localIdentity}/${vaultSeedId}`, Converter.bytesToBase64(seed));
87
+ await vaultConnector.setSecret(`${vmParts.id}/${vaultSeedId}`, Converter.bytesToBase64(seed));
88
88
  const walletConnector = setupWalletConnector({ nodeEndpoint, vaultSeedId, network }, opts.connector);
89
89
  WalletConnectorFactory.register("wallet", () => walletConnector);
90
90
  const identityConnector = setupIdentityConnector({ nodeEndpoint, network, addressIndex, vaultSeedId }, opts.connector);
91
91
  CLIDisplay.task(I18n.formatMessage("commands.verification-method-add.progress.addingVerificationMethod"));
92
92
  CLIDisplay.break();
93
93
  CLIDisplay.spinnerStart();
94
- const verificationMethod = await identityConnector.addVerificationMethod(localIdentity, did, type, opts?.id);
94
+ const verificationMethod = await identityConnector.addVerificationMethod(vmParts.id, did, type, opts?.id);
95
95
  CLIDisplay.spinnerStop();
96
96
  const keyParts = DocumentHelper.parseId(verificationMethod.id);
97
- const keyPair = await vaultConnector.getKey(`${localIdentity}/${keyParts.fragment}`);
98
- const privateKeyBase64Url = Converter.bytesToBase64Url(keyPair.privateKey);
97
+ const keyPair = await vaultConnector.getKey(`${vmParts.id}/${keyParts.fragment}`);
98
+ const privateKeyBase64Url = Converter.bytesToBase64Url(keyPair?.privateKey ?? new Uint8Array());
99
99
  const publicKeyBase64Url = Is.uint8Array(keyPair.publicKey)
100
100
  ? Converter.bytesToBase64Url(keyPair.publicKey)
101
101
  : "";
102
- const privateKeyBase64 = Converter.bytesToBase64(keyPair.privateKey);
102
+ const privateKeyBase64 = Converter.bytesToBase64(keyPair?.privateKey ?? new Uint8Array());
103
103
  const publicKeyBase64 = Is.uint8Array(keyPair.publicKey)
104
104
  ? Converter.bytesToBase64(keyPair.publicKey)
105
105
  : "";
106
- const privateKeyHex = Converter.bytesToHex(keyPair.privateKey, true);
106
+ const privateKeyHex = Converter.bytesToHex(keyPair?.privateKey ?? new Uint8Array(), true);
107
107
  const publicKeyHex = Is.uint8Array(keyPair.publicKey)
108
108
  ? Converter.bytesToHex(keyPair.publicKey, true)
109
109
  : "";
110
- const jwk = await Jwk.fromEd25519Private(keyPair.privateKey);
110
+ const jwk = await Jwk.fromEd25519Private(keyPair?.privateKey ?? new Uint8Array());
111
111
  const kid = await Jwk.generateKid(jwk);
112
112
  if (opts.console) {
113
113
  CLIDisplay.value(I18n.formatMessage("commands.verification-method-add.labels.verificationMethodId"), verificationMethod.id);