@idos-network/credentials 1.2.0 → 1.5.0

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.
@@ -1,7 +1,6 @@
1
1
  import { AvailableIssuerType, CredentialFields, CredentialSubject, CredentialSubjectFaceId, VerifiableCredential, VerifiableCredentialSubject } from "../types/index.mjs";
2
2
  import * as vc from "@digitalbazaar/vc";
3
3
  import { JsonLDDocumentLoaderInstance } from "jsonld-document-loader";
4
-
5
4
  //#region src/builder/verifier.d.ts
6
5
  type VerifyCredentialResult = [boolean, Map<AvailableIssuerType, vc.VerifyCredentialResult>];
7
6
  declare function verifyCredential<K = VerifiableCredentialSubject>(credential: VerifiableCredential<K>, issuers: AvailableIssuerType[], customDocumentLoader?: JsonLDDocumentLoaderInstance): Promise<VerifyCredentialResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/builder/verifier.ts","../../src/builder/index.ts"],"mappings":";;;;;KAcY,sBAAA,aAAmC,GAAA,CAAI,mBAAA,EAAqB,EAAA,CAAG,sBAAA;AAAA,iBAErD,gBAAA,KAAqB,2BAAA,CAAA,CACzC,UAAA,EAAY,oBAAA,CAAqB,CAAA,GACjC,OAAA,EAAS,mBAAA,IACT,oBAAA,GAAuB,4BAAA,GACtB,OAAA,CAAQ,sBAAA;;;KCOC,UAAA,GAAa,oBAAA,CAAqB,2BAAA;AAAA,KAClC,gBAAA,GAAmB,oBAAA,CAAqB,uBAAA;AAAA,KAExC,iBAAA,mBAAoC,MAAA,KAC9C,MAAA,EAAQ,gBAAA,EACR,OAAA,EAAS,MAAA,EACT,MAAA,EAAQ,mBAAA,EACR,QAAA,eACG,OAAA,CAAQ,oBAAA,CAAqB,OAAA;AAAA,KAEtB,mBAAA,YACV,OAAA,EAAS,MAAA,EACT,QAAA,cAEG,MAAA;AAAA,cAyCQ,0BAAA,EAA4B,mBAAA,CAAoB,iBAAA;AAAA,cAgBhD,gCAAA,EAAkC,mBAAA,CAAoB,uBAAA;AAAA,cActD,eAAA,EAAiB,iBAAA,CAAkB,iBAAA,EAAmB,2BAAA;AAAA,cAKtD,qBAAA,EAAuB,iBAAA,CAAkB,uBAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/builder/verifier.ts","../../src/builder/index.ts"],"mappings":";;;;KAcY,mCAAmC,IAAI,qBAAqB,GAAG;iBAErD,iBAAiB,IAAI,6BACzC,YAAY,qBAAqB,IACjC,SAAS,uBACT,uBAAuB,+BACtB,QAAQ;;;KCOC,aAAa,qBAAqB;KAClC,mBAAmB,qBAAqB;KAExC,kBAAkB,QAAQ,UAAU,WAC9C,QAAQ,kBACR,SAAS,QACT,QAAQ,qBACR,uBACG,QAAQ,qBAAqB;KAEtB,oBAAoB,WAC9B,SAAS,QACT,sBAEG;cAyCQ,4BAA4B,oBAAoB;cAgBhD,kCAAkC,oBAAoB;cActD,iBAAiB,kBAAkB,mBAAmB;cAKtD,uBAAuB,kBAAkB"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["v1","idosCredentialsV1","ed25519Signature2020V1","idosCredentialSubjectV1","idosCredentialSubjectV2","idosCredentialSubjectFaceIdV1"],"sources":["../../assets/ed25519-signature-2020-v1.json","../../assets/idos-credential-subject-face-id-v1.json","../../assets/idos-credential-subject-v1.json","../../assets/idos-credential-subject-v2.json","../../assets/idos-credentials-v1.json","../../assets/v1.json","../../src/builder/loader.ts","../../src/builder/verifier.ts","../../src/builder/index.ts"],"sourcesContent":["","","","","","","import { type JsonLDDocumentLoaderInstance, JsonLdDocumentLoader } from \"jsonld-document-loader\";\n\nimport ed25519Signature2020V1 from \"../../assets/ed25519-signature-2020-v1.json\";\nimport idosCredentialSubjectFaceIdV1 from \"../../assets/idos-credential-subject-face-id-v1.json\";\nimport idosCredentialSubjectV1 from \"../../assets/idos-credential-subject-v1.json\";\nimport idosCredentialSubjectV2 from \"../../assets/idos-credential-subject-v2.json\";\nimport idosCredentialsV1 from \"../../assets/idos-credentials-v1.json\";\nimport v1 from \"../../assets/v1.json\";\n\nexport const CONTEXT_V1 = \"https://www.w3.org/2018/credentials/v1\";\nexport const CONTEXT_ED25519_SIGNATURE_2020_V1 = \"https://w3id.org/security/suites/ed25519-2020/v1\";\n\n// Check .github/workflow/pages.yml how those are deployed\nexport const CONTEXT_IDOS_CREDENTIAL_V1 =\n \"https://idos-network.github.io/idos-sdk-js/credentials/idos-credentials-v1.json\";\nexport const CONTEXT_IDOS_CREDENTIAL_V1_SUBJECT =\n \"https://idos-network.github.io/idos-sdk-js/credentials/idos-credential-subject-v1.json\";\nexport const CONTEXT_IDOS_CREDENTIAL_V2_SUBJECT =\n \"https://idos-network.github.io/idos-sdk-js/credentials/idos-credential-subject-v2.json\";\n\nexport const CONTEXT_IDOS_CREDENTIAL_V1_FACE_ID =\n \"https://idos-network.github.io/idos-sdk-js/credentials/idos-credential-subject-face-id-v1.json\";\n\n// Latest contexts for builder\nexport const CONTEXT_IDOS_CREDENTIAL: string = CONTEXT_IDOS_CREDENTIAL_V1;\nexport const CONTEXT_IDOS_CREDENTIAL_SUBJECT: string = CONTEXT_IDOS_CREDENTIAL_V2_SUBJECT;\nexport const CONTEXT_IDOS_SIGNATURE: string = CONTEXT_ED25519_SIGNATURE_2020_V1;\nexport const CONTEXT_IDOS_CREDENTIAL_FACE_ID: string = CONTEXT_IDOS_CREDENTIAL_V1_FACE_ID;\n\nexport function buildDocumentLoader(): JsonLDDocumentLoaderInstance {\n const loader = new JsonLdDocumentLoader();\n\n loader.addStatic(CONTEXT_V1, v1);\n loader.addStatic(CONTEXT_IDOS_CREDENTIAL_V1, idosCredentialsV1);\n loader.addStatic(CONTEXT_ED25519_SIGNATURE_2020_V1, ed25519Signature2020V1);\n\n // plus / basic + liveness credentials\n loader.addStatic(CONTEXT_IDOS_CREDENTIAL_V1_SUBJECT, idosCredentialSubjectV1);\n loader.addStatic(CONTEXT_IDOS_CREDENTIAL_V2_SUBJECT, idosCredentialSubjectV2);\n\n // PoP\n loader.addStatic(CONTEXT_IDOS_CREDENTIAL_V1_FACE_ID, idosCredentialSubjectFaceIdV1);\n\n // DEPRECATED: Those should be removed\n [\n \"1356fea6672d22deb07fedc5fa427478b2e1654c\",\n \"346f14468348e4f3dd00039c89ce9bb49d88777c\",\n \"1e8421744e037dfd7b0289cb39261c73ab6d643c\",\n \"0049d2e93f8913c42398372e2bb65d92bed38ac0\",\n ].forEach((hash) => {\n loader.addStatic(\n `https://raw.githubusercontent.com/idos-network/idos-sdk-js/${hash}/packages/%40credentials/assets/idos-credentials-v1.json`,\n idosCredentialsV1,\n );\n loader.addStatic(\n `https://raw.githubusercontent.com/idos-network/idos-sdk-js/${hash}/packages/%40credentials/assets/idos-credential-subject-v1.json`,\n idosCredentialSubjectV1,\n );\n });\n\n // DEPRECATED: Those should be removed\n [\"1bc3503f5302a7e42777076445d5b05fec8db429\"].forEach((hash) => {\n loader.addStatic(\n `https://raw.githubusercontent.com/idos-network/idos-sdk-js/${hash}/packages/issuer-sdk-js/assets/idos-credentials-v1.json`,\n idosCredentialsV1,\n );\n loader.addStatic(\n `https://raw.githubusercontent.com/idos-network/idos-sdk-js/${hash}/packages/issuer-sdk-js/assets/idos-credential-subject-v1.json`,\n idosCredentialSubjectV1,\n );\n });\n\n return loader.build();\n}\n\nexport const defaultDocumentLoader: JsonLDDocumentLoaderInstance = buildDocumentLoader();\n","import type { JsonLDDocumentLoaderInstance } from \"jsonld-document-loader\";\n\nimport { Ed25519Signature2020 } from \"@digitalbazaar/ed25519-signature-2020\";\nimport * as vc from \"@digitalbazaar/vc\";\n\nimport type {\n AvailableIssuerType,\n VerifiableCredential,\n VerifiableCredentialSubject,\n} from \"../types\";\n\nimport { issuerToKey } from \"../utils\";\nimport { defaultDocumentLoader } from \"./loader\";\n\nexport type VerifyCredentialResult = [boolean, Map<AvailableIssuerType, vc.VerifyCredentialResult>];\n\nexport async function verifyCredential<K = VerifiableCredentialSubject>(\n credential: VerifiableCredential<K>,\n issuers: AvailableIssuerType[],\n customDocumentLoader?: JsonLDDocumentLoaderInstance,\n): Promise<VerifyCredentialResult> {\n const resultsByIssuer: Map<AvailableIssuerType, vc.VerifyCredentialResult> = new Map();\n\n for (const issuer of issuers) {\n const publicKey = await issuerToKey(issuer);\n\n const vcVerifyingSuite = new Ed25519Signature2020({\n key: publicKey,\n verificationMethod: publicKey.id,\n });\n\n const controller = {\n \"@context\": \"https://w3id.org/security/v2\",\n id: publicKey.controller,\n assertionMethod: [publicKey.id],\n authentication: [publicKey.id],\n };\n\n // Verify the signature\n const verifyCredentialResult = await vc.verifyCredential<K>({\n credential: credential,\n suite: vcVerifyingSuite,\n controller,\n documentLoader: customDocumentLoader ?? defaultDocumentLoader,\n });\n\n resultsByIssuer.set(issuer, verifyCredentialResult);\n\n if (verifyCredentialResult.verified) {\n return [true, resultsByIssuer];\n }\n }\n\n return [false, resultsByIssuer];\n}\n","import { Ed25519Signature2020 } from \"@digitalbazaar/ed25519-signature-2020\";\nimport * as vc from \"@digitalbazaar/vc\";\n\nimport type { VerifyCredentialResult } from \"./verifier\";\n\nimport {\n type AvailableIssuerType,\n type CredentialFields,\n CredentialFieldsSchema,\n type CredentialSubject,\n type CredentialSubjectFaceId,\n CredentialSubjectFaceIdSchema,\n CredentialSubjectSchema,\n type VerifiableCredential,\n type VerifiableCredentialSubject,\n} from \"../types\";\nimport { convertValues, issuerToKey } from \"../utils\";\nimport {\n CONTEXT_IDOS_CREDENTIAL,\n CONTEXT_IDOS_CREDENTIAL_FACE_ID,\n CONTEXT_IDOS_CREDENTIAL_SUBJECT,\n CONTEXT_IDOS_SIGNATURE,\n CONTEXT_V1,\n defaultDocumentLoader,\n} from \"./loader\";\nimport { verifyCredential } from \"./verifier\";\n\nexport type Credential = VerifiableCredential<VerifiableCredentialSubject>;\nexport type FaceIdCredential = VerifiableCredential<CredentialSubjectFaceId>;\n\nexport type CredentialBuilder<TInput, TOutput = TInput> = (\n fields: CredentialFields,\n subject: TInput,\n issuer: AvailableIssuerType,\n validate?: boolean,\n) => Promise<VerifiableCredential<TOutput>>;\n\nexport type CredentialConverter<TInput> = (\n subject: TInput,\n validate: boolean,\n // oxlint-disable-next-line typescript/no-explicit-any -- any is needed here\n) => Record<string, any>;\n\nfunction genericCredentialBuilder<TInput, TOutput = TInput>(\n credentialConverter: CredentialConverter<TInput>,\n): CredentialBuilder<TInput, TOutput> {\n async function builder(\n fields: CredentialFields,\n subject: TInput,\n issuer: AvailableIssuerType,\n validate = true,\n ) {\n if (validate) {\n // This raises an z.ZodError exception if the fields are invalid\n CredentialFieldsSchema.parse(fields);\n }\n\n const credentialSubject = credentialConverter(subject, validate);\n\n const key = await issuerToKey(issuer);\n\n // Create credentials container\n const credential = {\n \"@context\": [CONTEXT_V1, CONTEXT_IDOS_CREDENTIAL, CONTEXT_IDOS_SIGNATURE],\n type: [\"VerifiableCredential\"],\n issuer: key.controller,\n ...convertValues(fields),\n credentialSubject,\n };\n\n const suite = new Ed25519Signature2020({ key });\n\n return vc.issue<TOutput>({\n credential,\n suite,\n documentLoader: defaultDocumentLoader,\n });\n }\n\n return builder;\n}\n\nexport const credentialSubjectConverter: CredentialConverter<CredentialSubject> = (\n subject,\n validate,\n) => {\n if (validate) {\n CredentialSubjectSchema.parse(subject);\n }\n\n const { residentialAddress, ...subjectData } = subject;\n return {\n \"@context\": CONTEXT_IDOS_CREDENTIAL_SUBJECT,\n ...convertValues(subjectData),\n ...(residentialAddress ? convertValues(residentialAddress, \"residentialAddress\") : {}),\n };\n};\n\nexport const credentialFaceIdSubjectConverter: CredentialConverter<CredentialSubjectFaceId> = (\n subject,\n validate,\n) => {\n if (validate) {\n CredentialSubjectFaceIdSchema.parse(subject);\n }\n\n return {\n \"@context\": CONTEXT_IDOS_CREDENTIAL_FACE_ID,\n ...convertValues(subject),\n };\n};\n\nexport const buildCredential: CredentialBuilder<CredentialSubject, VerifiableCredentialSubject> =\n genericCredentialBuilder<CredentialSubject, VerifiableCredentialSubject>(\n credentialSubjectConverter,\n );\n\nexport const buildFaceIdCredential: CredentialBuilder<CredentialSubjectFaceId> =\n genericCredentialBuilder<CredentialSubjectFaceId>(credentialFaceIdSubjectConverter);\n\nexport type { VerifyCredentialResult };\nexport { verifyCredential };\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["v1","idosCredentialsV1","ed25519Signature2020V1","idosCredentialSubjectV1","idosCredentialSubjectV2","idosCredentialSubjectFaceIdV1"],"sources":["../../assets/ed25519-signature-2020-v1.json","../../assets/idos-credential-subject-face-id-v1.json","../../assets/idos-credential-subject-v1.json","../../assets/idos-credential-subject-v2.json","../../assets/idos-credentials-v1.json","../../assets/v1.json","../../src/builder/loader.ts","../../src/builder/verifier.ts","../../src/builder/index.ts"],"sourcesContent":["","","","","","","import { type JsonLDDocumentLoaderInstance, JsonLdDocumentLoader } from \"jsonld-document-loader\";\n\nimport ed25519Signature2020V1 from \"../../assets/ed25519-signature-2020-v1.json\";\nimport idosCredentialSubjectFaceIdV1 from \"../../assets/idos-credential-subject-face-id-v1.json\";\nimport idosCredentialSubjectV1 from \"../../assets/idos-credential-subject-v1.json\";\nimport idosCredentialSubjectV2 from \"../../assets/idos-credential-subject-v2.json\";\nimport idosCredentialsV1 from \"../../assets/idos-credentials-v1.json\";\nimport v1 from \"../../assets/v1.json\";\n\nexport const CONTEXT_V1 = \"https://www.w3.org/2018/credentials/v1\";\nexport const CONTEXT_ED25519_SIGNATURE_2020_V1 = \"https://w3id.org/security/suites/ed25519-2020/v1\";\n\n// Check .github/workflow/pages.yml how those are deployed\nexport const CONTEXT_IDOS_CREDENTIAL_V1 =\n \"https://idos-network.github.io/idos-sdk-js/credentials/idos-credentials-v1.json\";\nexport const CONTEXT_IDOS_CREDENTIAL_V1_SUBJECT =\n \"https://idos-network.github.io/idos-sdk-js/credentials/idos-credential-subject-v1.json\";\nexport const CONTEXT_IDOS_CREDENTIAL_V2_SUBJECT =\n \"https://idos-network.github.io/idos-sdk-js/credentials/idos-credential-subject-v2.json\";\n\nexport const CONTEXT_IDOS_CREDENTIAL_V1_FACE_ID =\n \"https://idos-network.github.io/idos-sdk-js/credentials/idos-credential-subject-face-id-v1.json\";\n\n// Latest contexts for builder\nexport const CONTEXT_IDOS_CREDENTIAL: string = CONTEXT_IDOS_CREDENTIAL_V1;\nexport const CONTEXT_IDOS_CREDENTIAL_SUBJECT: string = CONTEXT_IDOS_CREDENTIAL_V2_SUBJECT;\nexport const CONTEXT_IDOS_SIGNATURE: string = CONTEXT_ED25519_SIGNATURE_2020_V1;\nexport const CONTEXT_IDOS_CREDENTIAL_FACE_ID: string = CONTEXT_IDOS_CREDENTIAL_V1_FACE_ID;\n\nexport function buildDocumentLoader(): JsonLDDocumentLoaderInstance {\n const loader = new JsonLdDocumentLoader();\n\n loader.addStatic(CONTEXT_V1, v1);\n loader.addStatic(CONTEXT_IDOS_CREDENTIAL_V1, idosCredentialsV1);\n loader.addStatic(CONTEXT_ED25519_SIGNATURE_2020_V1, ed25519Signature2020V1);\n\n // plus / basic + liveness credentials\n loader.addStatic(CONTEXT_IDOS_CREDENTIAL_V1_SUBJECT, idosCredentialSubjectV1);\n loader.addStatic(CONTEXT_IDOS_CREDENTIAL_V2_SUBJECT, idosCredentialSubjectV2);\n\n // PoP\n loader.addStatic(CONTEXT_IDOS_CREDENTIAL_V1_FACE_ID, idosCredentialSubjectFaceIdV1);\n\n // DEPRECATED: Those should be removed\n [\n \"1356fea6672d22deb07fedc5fa427478b2e1654c\",\n \"346f14468348e4f3dd00039c89ce9bb49d88777c\",\n \"1e8421744e037dfd7b0289cb39261c73ab6d643c\",\n \"0049d2e93f8913c42398372e2bb65d92bed38ac0\",\n ].forEach((hash) => {\n loader.addStatic(\n `https://raw.githubusercontent.com/idos-network/idos-sdk-js/${hash}/packages/%40credentials/assets/idos-credentials-v1.json`,\n idosCredentialsV1,\n );\n loader.addStatic(\n `https://raw.githubusercontent.com/idos-network/idos-sdk-js/${hash}/packages/%40credentials/assets/idos-credential-subject-v1.json`,\n idosCredentialSubjectV1,\n );\n });\n\n // DEPRECATED: Those should be removed\n [\"1bc3503f5302a7e42777076445d5b05fec8db429\"].forEach((hash) => {\n loader.addStatic(\n `https://raw.githubusercontent.com/idos-network/idos-sdk-js/${hash}/packages/issuer-sdk-js/assets/idos-credentials-v1.json`,\n idosCredentialsV1,\n );\n loader.addStatic(\n `https://raw.githubusercontent.com/idos-network/idos-sdk-js/${hash}/packages/issuer-sdk-js/assets/idos-credential-subject-v1.json`,\n idosCredentialSubjectV1,\n );\n });\n\n return loader.build();\n}\n\nexport const defaultDocumentLoader: JsonLDDocumentLoaderInstance = buildDocumentLoader();\n","import type { JsonLDDocumentLoaderInstance } from \"jsonld-document-loader\";\n\nimport { Ed25519Signature2020 } from \"@digitalbazaar/ed25519-signature-2020\";\nimport * as vc from \"@digitalbazaar/vc\";\n\nimport type {\n AvailableIssuerType,\n VerifiableCredential,\n VerifiableCredentialSubject,\n} from \"../types\";\n\nimport { issuerToKey } from \"../utils\";\nimport { defaultDocumentLoader } from \"./loader\";\n\nexport type VerifyCredentialResult = [boolean, Map<AvailableIssuerType, vc.VerifyCredentialResult>];\n\nexport async function verifyCredential<K = VerifiableCredentialSubject>(\n credential: VerifiableCredential<K>,\n issuers: AvailableIssuerType[],\n customDocumentLoader?: JsonLDDocumentLoaderInstance,\n): Promise<VerifyCredentialResult> {\n const resultsByIssuer: Map<AvailableIssuerType, vc.VerifyCredentialResult> = new Map();\n\n for (const issuer of issuers) {\n const publicKey = await issuerToKey(issuer);\n\n const vcVerifyingSuite = new Ed25519Signature2020({\n key: publicKey,\n verificationMethod: publicKey.id,\n });\n\n const controller = {\n \"@context\": \"https://w3id.org/security/v2\",\n id: publicKey.controller,\n assertionMethod: [publicKey.id],\n authentication: [publicKey.id],\n };\n\n // Verify the signature\n const verifyCredentialResult = await vc.verifyCredential<K>({\n credential: credential,\n suite: vcVerifyingSuite,\n controller,\n documentLoader: customDocumentLoader ?? defaultDocumentLoader,\n });\n\n resultsByIssuer.set(issuer, verifyCredentialResult);\n\n if (verifyCredentialResult.verified) {\n return [true, resultsByIssuer];\n }\n }\n\n return [false, resultsByIssuer];\n}\n","import { Ed25519Signature2020 } from \"@digitalbazaar/ed25519-signature-2020\";\nimport * as vc from \"@digitalbazaar/vc\";\n\nimport type { VerifyCredentialResult } from \"./verifier\";\n\nimport {\n type AvailableIssuerType,\n type CredentialFields,\n CredentialFieldsSchema,\n type CredentialSubject,\n type CredentialSubjectFaceId,\n CredentialSubjectFaceIdSchema,\n CredentialSubjectSchema,\n type VerifiableCredential,\n type VerifiableCredentialSubject,\n} from \"../types\";\nimport { convertValues, issuerToKey } from \"../utils\";\nimport {\n CONTEXT_IDOS_CREDENTIAL,\n CONTEXT_IDOS_CREDENTIAL_FACE_ID,\n CONTEXT_IDOS_CREDENTIAL_SUBJECT,\n CONTEXT_IDOS_SIGNATURE,\n CONTEXT_V1,\n defaultDocumentLoader,\n} from \"./loader\";\nimport { verifyCredential } from \"./verifier\";\n\nexport type Credential = VerifiableCredential<VerifiableCredentialSubject>;\nexport type FaceIdCredential = VerifiableCredential<CredentialSubjectFaceId>;\n\nexport type CredentialBuilder<TInput, TOutput = TInput> = (\n fields: CredentialFields,\n subject: TInput,\n issuer: AvailableIssuerType,\n validate?: boolean,\n) => Promise<VerifiableCredential<TOutput>>;\n\nexport type CredentialConverter<TInput> = (\n subject: TInput,\n validate: boolean,\n // oxlint-disable-next-line typescript/no-explicit-any -- any is needed here\n) => Record<string, any>;\n\nfunction genericCredentialBuilder<TInput, TOutput = TInput>(\n credentialConverter: CredentialConverter<TInput>,\n): CredentialBuilder<TInput, TOutput> {\n async function builder(\n fields: CredentialFields,\n subject: TInput,\n issuer: AvailableIssuerType,\n validate = true,\n ) {\n if (validate) {\n // This raises an z.ZodError exception if the fields are invalid\n CredentialFieldsSchema.parse(fields);\n }\n\n const credentialSubject = credentialConverter(subject, validate);\n\n const key = await issuerToKey(issuer);\n\n // Create credentials container\n const credential = {\n \"@context\": [CONTEXT_V1, CONTEXT_IDOS_CREDENTIAL, CONTEXT_IDOS_SIGNATURE],\n type: [\"VerifiableCredential\"],\n issuer: key.controller,\n ...convertValues(fields),\n credentialSubject,\n };\n\n const suite = new Ed25519Signature2020({ key });\n\n return vc.issue<TOutput>({\n credential,\n suite,\n documentLoader: defaultDocumentLoader,\n });\n }\n\n return builder;\n}\n\nexport const credentialSubjectConverter: CredentialConverter<CredentialSubject> = (\n subject,\n validate,\n) => {\n if (validate) {\n CredentialSubjectSchema.parse(subject);\n }\n\n const { residentialAddress, ...subjectData } = subject;\n return {\n \"@context\": CONTEXT_IDOS_CREDENTIAL_SUBJECT,\n ...convertValues(subjectData),\n ...(residentialAddress ? convertValues(residentialAddress, \"residentialAddress\") : {}),\n };\n};\n\nexport const credentialFaceIdSubjectConverter: CredentialConverter<CredentialSubjectFaceId> = (\n subject,\n validate,\n) => {\n if (validate) {\n CredentialSubjectFaceIdSchema.parse(subject);\n }\n\n return {\n \"@context\": CONTEXT_IDOS_CREDENTIAL_FACE_ID,\n ...convertValues(subject),\n };\n};\n\nexport const buildCredential: CredentialBuilder<CredentialSubject, VerifiableCredentialSubject> =\n genericCredentialBuilder<CredentialSubject, VerifiableCredentialSubject>(\n credentialSubjectConverter,\n );\n\nexport const buildFaceIdCredential: CredentialBuilder<CredentialSubjectFaceId> =\n genericCredentialBuilder<CredentialSubjectFaceId>(credentialFaceIdSubjectConverter);\n\nexport type { VerifyCredentialResult };\nexport { verifyCredential };\n"],"mappings":"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"}
package/dist/index.d.mts CHANGED
@@ -1 +1 @@
1
- export { };
1
+ export {}
@@ -1,6 +1,5 @@
1
1
  import { Ed25519VerificationKey2020, Ed25519VerificationKey2020Options } from "@digitalbazaar/ed25519-verification-key-2020";
2
2
  import * as z from "zod";
3
-
4
3
  //#region src/types/credentials.d.ts
5
4
  type idOSCredential = {
6
5
  id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/types/credentials.ts","../../src/types/issuers.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/types/credentials.ts","../../src/types/issuers.ts"],"mappings":";;;KAEY;EACV;EACA;EACA;EACA;EACA;EACA;EACA;;KAGU,2BAA2B,KAAK;EAC1C,KAAK;EACL;EACA;EACA;;cAIW,wBAAwB,EAAE;EACrC,IAAI,EAAE;EACN,OAAO,EAAE;EACT,QAAQ,EAAE,YAAY,EAAE;EACxB,YAAY,EAAE,YAAY,EAAE;EAC5B,gBAAgB,EAAE,YAAY,EAAE;;KAiBtB,mBAAmB,EAAE,aAAa;cAGjC,oCAAoC,EAAE;EACjD,QAAQ,EAAE;EACV,aAAa,EAAE,YAAY,EAAE;EAC7B,uBAAuB,EAAE,YAAY,EAAE;EACvC,QAAQ,EAAE,YAAY,EAAE;EACxB,MAAM,EAAE;EACR,YAAY,EAAE,YAAY,EAAE;EAC5B,SAAS,EAAE;EACX,eAAe,EAAE;EACjB,kBAAkB,EAAE,YAAY,EAAE;EAClC,WAAW,EAAE,QAAQ,OAAO;;KAiClB,+BAA+B,EAAE,aAAa;cAE7C,sBAAsB,EAAE;EACnC;EACA;EACA;EACA;EACA;EACA;EACA;;KAUU,iBAAiB,EAAE,aAAa;cAE/B,cAAc,EAAE;EAC3B;EACA;EACA;;KAEU,SAAS,EAAE,aAAa;cAGvB,yBAAyB,EAAE;EACtC,IAAI,EAAE;EAEN,WAAW,EAAE,YAAY,EAAE;EAC3B,YAAY,EAAE,YAAY,EAAE;EAC5B,KAAK,EAAE,YAAY,EAAE;EACrB,QAAQ,EAAE,mBAAmB;EAC7B,aAAa,EAAE,YAAY,EAAE;EAE7B,YAAY,EAAE,YAAY,EAAE;EAC5B,YAAY,EAAE,YAAY,EAAE;EAC5B,OAAO,EAAE,YAAY,EAAE;EACvB,aAAa,EAAE,YAAY,EAAE;EAC7B,aAAa,EAAE;EACf,cAAc,EAAE,YAAY,EAAE;EAC9B,mBAAmB,EAAE;EACrB,kBAAkB,EAAE;EACpB,uBAAuB;EACvB,uBAAuB,EAAE,YAAY,EAAE;EACvC,wBAAwB,EAAE,YAAY,EAAE;EACxC,qBAAqB,EAAE,QAAQ,OAAO;EACtC,oBAAoB,EAAE,YAAY,EAAE,QAAQ,OAAO;EACnD,YAAY,EAAE,QAAQ,OAAO;EAC7B,oBAAoB,EAAE,mBAAmB;;KAwE/B,oBAAoB,EAAE,aAAa;UAE9B,oCAAoC,KACnD;EASA;EAEA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EAEA;;UAMe;EACf;EACA;EACA;EACA;EACA;;cAGW,+BAA+B,EAAE;EAC5C,gBAAgB,EAAE;;KAKR,0BAA0B,EAAE,aAAa;UAEpC,oBAAoB;EACnC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,mBAAmB;EACnB;EACA,OAAO;;KAGG,qBAAqB,KAAK,oBAAoB;;;UCpRzC;EACf;EAGA;EAGA;;KAKU,sBACR,KAAK,6CACL,6BACA"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../src/types/credentials.ts"],"sourcesContent":["import * as z from \"zod\";\n\nexport type idOSCredential = {\n id: string;\n user_id: string;\n public_notes: string;\n content: string;\n encryptor_public_key: string;\n issuer_auth_public_key: string;\n original_id?: string | null;\n};\n\nexport type InsertableIDOSCredential = Omit<idOSCredential, \"id\" | \"original_id\"> & {\n id?: idOSCredential[\"id\"];\n content_hash?: string;\n public_notes_signature: string;\n broader_signature: string;\n};\n\n// https://github.com/colinhacks/zod/issues/3751\nexport const CredentialFieldsSchema: z.ZodObject<{\n id: z.ZodString;\n level: z.ZodString;\n issued: z.ZodOptional<z.ZodDate>;\n approvedAt: z.ZodOptional<z.ZodDate>;\n expirationDate: z.ZodOptional<z.ZodDate>;\n}> = z.object({\n id: z.string(),\n\n /* Level of KYC verification performed (e.g., basic, intermediate, advanced). */\n level: z.string(),\n\n /* @default Date.now() */\n issued: z.date().optional(),\n\n /* Date the credential was approved. */\n approvedAt: z.date().optional(),\n\n /* Date the credential was revoked. */\n expirationDate: z.date().optional(),\n});\n\nexport type CredentialFields = z.infer<typeof CredentialFieldsSchema>;\n\n// https://github.com/colinhacks/zod/issues/3751\nexport const CredentialResidentialAddressSchema: z.ZodObject<{\n street: z.ZodString;\n houseNumber: z.ZodOptional<z.ZodString>;\n additionalAddressInfo: z.ZodOptional<z.ZodString>;\n region: z.ZodOptional<z.ZodString>;\n city: z.ZodString;\n postalCode: z.ZodOptional<z.ZodString>;\n country: z.ZodString;\n proofCategory: z.ZodString;\n proofDateOfIssue: z.ZodOptional<z.ZodDate>;\n proofFile: z.ZodType<Buffer<ArrayBufferLike>>;\n}> = z.object({\n /* Street address. */\n street: z.string(),\n\n /* House number. */\n houseNumber: z.string().optional(),\n\n /* Additional address information (e.g., apartment number). */\n additionalAddressInfo: z.string().optional(),\n\n /* Region (e.g., state, province). */\n region: z.string().optional(),\n\n /* Locality (e.g., city, town). */\n city: z.string(),\n\n /* Postal code. */\n postalCode: z.string().optional(),\n\n /* Country (ISO 3166-1 alpha-2). */\n country: z.string().min(2).max(2),\n\n /* Residential Address Proof Category\tType of document provided to verify the address(e.g., utility bill, bank statement). */\n proofCategory: z.string(),\n\n /* Residential Address Proof Date Of Issue\tDate the address proof document was issued. */\n proofDateOfIssue: z.date().optional(),\n\n /* Residential Address Proof File or URL of the document provided as address proof. */\n proofFile: z.instanceof(Buffer),\n});\n\nexport type CredentialResidentialAddress = z.infer<typeof CredentialResidentialAddressSchema>;\n\nexport const IDDocumentTypeSchema: z.ZodEnum<{\n PASSPORT: \"PASSPORT\";\n DRIVERS: \"DRIVERS\";\n ID_CARD: \"ID_CARD\";\n VOTING_CARD: \"VOTING_CARD\";\n PAN_CARD: \"PAN_CARD\";\n INTERNAL_PASSPORT: \"INTERNAL_PASSPORT\";\n RESIDENCE_PERMIT: \"RESIDENCE_PERMIT\";\n}> = z.enum([\n \"PASSPORT\",\n \"DRIVERS\",\n \"ID_CARD\",\n \"VOTING_CARD\",\n \"PAN_CARD\",\n \"INTERNAL_PASSPORT\",\n \"RESIDENCE_PERMIT\",\n]);\nexport type IDDocumentType = z.infer<typeof IDDocumentTypeSchema>;\n\nexport const GenderSchema: z.ZodEnum<{\n M: \"M\";\n F: \"F\";\n OTHER: \"OTHER\";\n}> = z.enum([\"M\", \"F\", \"OTHER\"]);\nexport type Gender = z.infer<typeof GenderSchema>;\n\n// https://github.com/colinhacks/zod/issues/3751\nexport const CredentialSubjectSchema: z.ZodObject<{\n id: z.ZodString;\n // Indonesian and Indian did not always have first name\n firstName: z.ZodOptional<z.ZodString>;\n middleName: z.ZodOptional<z.ZodString>;\n ssn: z.ZodOptional<z.ZodString>;\n gender: z.ZodOptional<typeof GenderSchema>;\n nationality: z.ZodOptional<z.ZodString>;\n // Indonesian and Indian did not always have family name\n familyName: z.ZodOptional<z.ZodString>;\n maidenName: z.ZodOptional<z.ZodString>;\n email: z.ZodOptional<z.ZodEmail>;\n phoneNumber: z.ZodOptional<z.ZodString>;\n dateOfBirth: z.ZodDate;\n placeOfBirth: z.ZodOptional<z.ZodString>;\n idDocumentCountry: z.ZodString;\n idDocumentNumber: z.ZodString;\n idDocumentType: typeof IDDocumentTypeSchema;\n idDocumentDateOfIssue: z.ZodOptional<z.ZodDate>;\n idDocumentDateOfExpiry: z.ZodOptional<z.ZodDate>;\n idDocumentFrontFile: z.ZodType<Buffer<ArrayBufferLike>>;\n idDocumentBackFile: z.ZodOptional<z.ZodType<Buffer<ArrayBufferLike>>>;\n selfieFile: z.ZodType<Buffer<ArrayBufferLike>>;\n residentialAddress: z.ZodOptional<typeof CredentialResidentialAddressSchema>;\n}> = z\n .object({\n /* ID(unique credential)\tUnique identifier for the credential itself. */\n id: z.string(),\n\n /* First name. */\n firstName: z.string().optional(),\n\n /* Middle name. */\n middleName: z.string().optional(),\n\n /* Social-security-number (without dashes) */\n ssn: z.string().min(9).max(9).optional(),\n\n /* Nationality (ISO 3166-1 alpha-2). */\n nationality: z.string().min(2).max(2).optional(),\n\n /* Gender (M or F, empty if not provided). */\n gender: GenderSchema.optional(),\n\n /* Family name. */\n familyName: z.string().optional(),\n\n /* Maiden name. */\n maidenName: z.string().optional(),\n\n /* Date of birth. */\n dateOfBirth: z.date(),\n\n /* Place of birth. */\n placeOfBirth: z.string().optional(),\n\n /* Email. */\n email: z.email().optional(),\n\n /* Phone number. */\n phoneNumber: z.string().optional(),\n\n /* Country that issued the identity document (ISO 3166-1 alpha-2). */\n idDocumentCountry: z.string().min(2).max(2),\n\n /* ID Document Number\tUnique number on the identity document. */\n idDocumentNumber: z.string(),\n\n /* ID Document Type\tType of identity document(e.g., Passport, Driver's License, National ID). */\n idDocumentType: IDDocumentTypeSchema,\n\n /* ID Document Date of Issue\tDate the identity document was issued. */\n idDocumentDateOfIssue: z.date().optional(),\n\n /* ID Document Date of Expiry\tExpiration date of the identity document - if applicable. */\n idDocumentDateOfExpiry: z.date().optional(),\n\n /* ID Document Front File\tBuffer with file representing the front of the identity document. */\n idDocumentFrontFile: z.instanceof(Buffer),\n\n /* ID Document Back File\tBuffer with file representing the back of the identity document - if applicable. */\n idDocumentBackFile: z.instanceof(Buffer).optional(),\n\n /* (ID Document) Selfie File\tBuffer with selfie with the identity document for verification purposes. */\n selfieFile: z.instanceof(Buffer),\n\n /* Residential Address Full residential address of the individual - if applicable. */\n residentialAddress: CredentialResidentialAddressSchema.optional(),\n })\n .refine(\n // At least one of firstName or familyName must be present,\n (data) => data.firstName || data.familyName,\n { message: \"At least one of firstName or familyName must be provided\" },\n );\n\nexport type CredentialSubject = z.infer<typeof CredentialSubjectSchema>;\n\nexport interface VerifiableCredentialSubject extends Omit<\n CredentialSubject,\n | \"residentialAddress\"\n | \"idDocumentBackFile\"\n | \"idDocumentFrontFile\"\n | \"selfieFile\"\n | \"idDocumentDateOfIssue\"\n | \"idDocumentDateOfExpiry\"\n | \"dateOfBirth\"\n> {\n \"@context\": string;\n // Files are strings in verifiable credentials, but as an input they should be buffers\n idDocumentFrontFile?: string;\n idDocumentBackFile?: string;\n selfieFile?: string;\n // Dates are strings in verifiable credentials\n dateOfBirth?: string;\n idDocumentDateOfIssue?: string;\n idDocumentDateOfExpiry?: string;\n // This is the residential address flattened fields\n residentialAddressStreet?: string;\n residentialAddressHouseNumber?: string;\n residentialAddressAdditionalAddressInfo?: string;\n residentialAddressRegion?: string;\n residentialAddressCity?: string;\n residentialAddressPostalCode?: string;\n residentialAddressCountry?: string;\n residentialAddressProofCategory?: string;\n // Dates are strings in verifiable credentials\n residentialAddressProofDateOfIssue?: string;\n // Files are strings in verifiable credentials, but as an input they should be buffers\n residentialAddressProofFile?: string;\n}\n\n// TODO: This is a stub of the types for @digitalbazaar/vc\n// when they introduce TypeScript support we should remove this\n// The copy is here because `types.d.ts` file is not bundled.\nexport interface VerifiedCredentialsProof {\n type: string;\n created: string;\n verificationMethod: string;\n proofValue: string;\n proofPurpose: string;\n}\n\nexport const CredentialSubjectFaceIdSchema: z.ZodObject<{\n faceSignUserId: z.ZodString;\n}> = z.object({\n faceSignUserId: z.string(),\n});\n\nexport type CredentialSubjectFaceId = z.infer<typeof CredentialSubjectFaceIdSchema>;\n\nexport interface VerifiedCredentials<K> {\n \"@context\": string[];\n type: string[];\n issuer: string;\n id: string;\n level: string;\n issued: string;\n approvedAt: string;\n expirationDate: string;\n credentialSubject: K;\n issuanceDate: string;\n proof: VerifiedCredentialsProof;\n}\n\nexport type VerifiableCredential<K> = VerifiedCredentials<K>;\n"],"mappings":";;AAoBA,MAAa,yBAMR,EAAE,OAAO;CACZ,IAAI,EAAE,QAAQ;CAGd,OAAO,EAAE,QAAQ;CAGjB,QAAQ,EAAE,MAAM,CAAC,UAAU;CAG3B,YAAY,EAAE,MAAM,CAAC,UAAU;CAG/B,gBAAgB,EAAE,MAAM,CAAC,UAAU;CACpC,CAAC;AAKF,MAAa,qCAWR,EAAE,OAAO;CAEZ,QAAQ,EAAE,QAAQ;CAGlB,aAAa,EAAE,QAAQ,CAAC,UAAU;CAGlC,uBAAuB,EAAE,QAAQ,CAAC,UAAU;CAG5C,QAAQ,EAAE,QAAQ,CAAC,UAAU;CAG7B,MAAM,EAAE,QAAQ;CAGhB,YAAY,EAAE,QAAQ,CAAC,UAAU;CAGjC,SAAS,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE;CAGjC,eAAe,EAAE,QAAQ;CAGzB,kBAAkB,EAAE,MAAM,CAAC,UAAU;CAGrC,WAAW,EAAE,WAAW,OAAO;CAChC,CAAC;AAIF,MAAa,uBAQR,EAAE,KAAK;CACV;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAGF,MAAa,eAIR,EAAE,KAAK;CAAC;CAAK;CAAK;CAAQ,CAAC;AAIhC,MAAa,0BAwBR,EACF,OAAO;CAEN,IAAI,EAAE,QAAQ;CAGd,WAAW,EAAE,QAAQ,CAAC,UAAU;CAGhC,YAAY,EAAE,QAAQ,CAAC,UAAU;CAGjC,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,UAAU;CAGxC,aAAa,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,UAAU;CAGhD,QAAQ,aAAa,UAAU;CAG/B,YAAY,EAAE,QAAQ,CAAC,UAAU;CAGjC,YAAY,EAAE,QAAQ,CAAC,UAAU;CAGjC,aAAa,EAAE,MAAM;CAGrB,cAAc,EAAE,QAAQ,CAAC,UAAU;CAGnC,OAAO,EAAE,OAAO,CAAC,UAAU;CAG3B,aAAa,EAAE,QAAQ,CAAC,UAAU;CAGlC,mBAAmB,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE;CAG3C,kBAAkB,EAAE,QAAQ;CAG5B,gBAAgB;CAGhB,uBAAuB,EAAE,MAAM,CAAC,UAAU;CAG1C,wBAAwB,EAAE,MAAM,CAAC,UAAU;CAG3C,qBAAqB,EAAE,WAAW,OAAO;CAGzC,oBAAoB,EAAE,WAAW,OAAO,CAAC,UAAU;CAGnD,YAAY,EAAE,WAAW,OAAO;CAGhC,oBAAoB,mCAAmC,UAAU;CAClE,CAAC,CACD,QAEE,SAAS,KAAK,aAAa,KAAK,YACjC,EAAE,SAAS,4DAA4D,CACxE;AAiDH,MAAa,gCAER,EAAE,OAAO,EACZ,gBAAgB,EAAE,QAAQ,EAC3B,CAAC"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/types/credentials.ts"],"sourcesContent":["import * as z from \"zod\";\n\nexport type idOSCredential = {\n id: string;\n user_id: string;\n public_notes: string;\n content: string;\n encryptor_public_key: string;\n issuer_auth_public_key: string;\n original_id?: string | null;\n};\n\nexport type InsertableIDOSCredential = Omit<idOSCredential, \"id\" | \"original_id\"> & {\n id?: idOSCredential[\"id\"];\n content_hash?: string;\n public_notes_signature: string;\n broader_signature: string;\n};\n\n// https://github.com/colinhacks/zod/issues/3751\nexport const CredentialFieldsSchema: z.ZodObject<{\n id: z.ZodString;\n level: z.ZodString;\n issued: z.ZodOptional<z.ZodDate>;\n approvedAt: z.ZodOptional<z.ZodDate>;\n expirationDate: z.ZodOptional<z.ZodDate>;\n}> = z.object({\n id: z.string(),\n\n /* Level of KYC verification performed (e.g., basic, intermediate, advanced). */\n level: z.string(),\n\n /* @default Date.now() */\n issued: z.date().optional(),\n\n /* Date the credential was approved. */\n approvedAt: z.date().optional(),\n\n /* Date the credential was revoked. */\n expirationDate: z.date().optional(),\n});\n\nexport type CredentialFields = z.infer<typeof CredentialFieldsSchema>;\n\n// https://github.com/colinhacks/zod/issues/3751\nexport const CredentialResidentialAddressSchema: z.ZodObject<{\n street: z.ZodString;\n houseNumber: z.ZodOptional<z.ZodString>;\n additionalAddressInfo: z.ZodOptional<z.ZodString>;\n region: z.ZodOptional<z.ZodString>;\n city: z.ZodString;\n postalCode: z.ZodOptional<z.ZodString>;\n country: z.ZodString;\n proofCategory: z.ZodString;\n proofDateOfIssue: z.ZodOptional<z.ZodDate>;\n proofFile: z.ZodType<Buffer<ArrayBufferLike>>;\n}> = z.object({\n /* Street address. */\n street: z.string(),\n\n /* House number. */\n houseNumber: z.string().optional(),\n\n /* Additional address information (e.g., apartment number). */\n additionalAddressInfo: z.string().optional(),\n\n /* Region (e.g., state, province). */\n region: z.string().optional(),\n\n /* Locality (e.g., city, town). */\n city: z.string(),\n\n /* Postal code. */\n postalCode: z.string().optional(),\n\n /* Country (ISO 3166-1 alpha-2). */\n country: z.string().min(2).max(2),\n\n /* Residential Address Proof Category\tType of document provided to verify the address(e.g., utility bill, bank statement). */\n proofCategory: z.string(),\n\n /* Residential Address Proof Date Of Issue\tDate the address proof document was issued. */\n proofDateOfIssue: z.date().optional(),\n\n /* Residential Address Proof File or URL of the document provided as address proof. */\n proofFile: z.instanceof(Buffer),\n});\n\nexport type CredentialResidentialAddress = z.infer<typeof CredentialResidentialAddressSchema>;\n\nexport const IDDocumentTypeSchema: z.ZodEnum<{\n PASSPORT: \"PASSPORT\";\n DRIVERS: \"DRIVERS\";\n ID_CARD: \"ID_CARD\";\n VOTING_CARD: \"VOTING_CARD\";\n PAN_CARD: \"PAN_CARD\";\n INTERNAL_PASSPORT: \"INTERNAL_PASSPORT\";\n RESIDENCE_PERMIT: \"RESIDENCE_PERMIT\";\n}> = z.enum([\n \"PASSPORT\",\n \"DRIVERS\",\n \"ID_CARD\",\n \"VOTING_CARD\",\n \"PAN_CARD\",\n \"INTERNAL_PASSPORT\",\n \"RESIDENCE_PERMIT\",\n]);\nexport type IDDocumentType = z.infer<typeof IDDocumentTypeSchema>;\n\nexport const GenderSchema: z.ZodEnum<{\n M: \"M\";\n F: \"F\";\n OTHER: \"OTHER\";\n}> = z.enum([\"M\", \"F\", \"OTHER\"]);\nexport type Gender = z.infer<typeof GenderSchema>;\n\n// https://github.com/colinhacks/zod/issues/3751\nexport const CredentialSubjectSchema: z.ZodObject<{\n id: z.ZodString;\n // Indonesian and Indian did not always have first name\n firstName: z.ZodOptional<z.ZodString>;\n middleName: z.ZodOptional<z.ZodString>;\n ssn: z.ZodOptional<z.ZodString>;\n gender: z.ZodOptional<typeof GenderSchema>;\n nationality: z.ZodOptional<z.ZodString>;\n // Indonesian and Indian did not always have family name\n familyName: z.ZodOptional<z.ZodString>;\n maidenName: z.ZodOptional<z.ZodString>;\n email: z.ZodOptional<z.ZodEmail>;\n phoneNumber: z.ZodOptional<z.ZodString>;\n dateOfBirth: z.ZodDate;\n placeOfBirth: z.ZodOptional<z.ZodString>;\n idDocumentCountry: z.ZodString;\n idDocumentNumber: z.ZodString;\n idDocumentType: typeof IDDocumentTypeSchema;\n idDocumentDateOfIssue: z.ZodOptional<z.ZodDate>;\n idDocumentDateOfExpiry: z.ZodOptional<z.ZodDate>;\n idDocumentFrontFile: z.ZodType<Buffer<ArrayBufferLike>>;\n idDocumentBackFile: z.ZodOptional<z.ZodType<Buffer<ArrayBufferLike>>>;\n selfieFile: z.ZodType<Buffer<ArrayBufferLike>>;\n residentialAddress: z.ZodOptional<typeof CredentialResidentialAddressSchema>;\n}> = z\n .object({\n /* ID(unique credential)\tUnique identifier for the credential itself. */\n id: z.string(),\n\n /* First name. */\n firstName: z.string().optional(),\n\n /* Middle name. */\n middleName: z.string().optional(),\n\n /* Social-security-number (without dashes) */\n ssn: z.string().min(9).max(9).optional(),\n\n /* Nationality (ISO 3166-1 alpha-2). */\n nationality: z.string().min(2).max(2).optional(),\n\n /* Gender (M or F, empty if not provided). */\n gender: GenderSchema.optional(),\n\n /* Family name. */\n familyName: z.string().optional(),\n\n /* Maiden name. */\n maidenName: z.string().optional(),\n\n /* Date of birth. */\n dateOfBirth: z.date(),\n\n /* Place of birth. */\n placeOfBirth: z.string().optional(),\n\n /* Email. */\n email: z.email().optional(),\n\n /* Phone number. */\n phoneNumber: z.string().optional(),\n\n /* Country that issued the identity document (ISO 3166-1 alpha-2). */\n idDocumentCountry: z.string().min(2).max(2),\n\n /* ID Document Number\tUnique number on the identity document. */\n idDocumentNumber: z.string(),\n\n /* ID Document Type\tType of identity document(e.g., Passport, Driver's License, National ID). */\n idDocumentType: IDDocumentTypeSchema,\n\n /* ID Document Date of Issue\tDate the identity document was issued. */\n idDocumentDateOfIssue: z.date().optional(),\n\n /* ID Document Date of Expiry\tExpiration date of the identity document - if applicable. */\n idDocumentDateOfExpiry: z.date().optional(),\n\n /* ID Document Front File\tBuffer with file representing the front of the identity document. */\n idDocumentFrontFile: z.instanceof(Buffer),\n\n /* ID Document Back File\tBuffer with file representing the back of the identity document - if applicable. */\n idDocumentBackFile: z.instanceof(Buffer).optional(),\n\n /* (ID Document) Selfie File\tBuffer with selfie with the identity document for verification purposes. */\n selfieFile: z.instanceof(Buffer),\n\n /* Residential Address Full residential address of the individual - if applicable. */\n residentialAddress: CredentialResidentialAddressSchema.optional(),\n })\n .refine(\n // At least one of firstName or familyName must be present,\n (data) => data.firstName || data.familyName,\n { message: \"At least one of firstName or familyName must be provided\" },\n );\n\nexport type CredentialSubject = z.infer<typeof CredentialSubjectSchema>;\n\nexport interface VerifiableCredentialSubject extends Omit<\n CredentialSubject,\n | \"residentialAddress\"\n | \"idDocumentBackFile\"\n | \"idDocumentFrontFile\"\n | \"selfieFile\"\n | \"idDocumentDateOfIssue\"\n | \"idDocumentDateOfExpiry\"\n | \"dateOfBirth\"\n> {\n \"@context\": string;\n // Files are strings in verifiable credentials, but as an input they should be buffers\n idDocumentFrontFile?: string;\n idDocumentBackFile?: string;\n selfieFile?: string;\n // Dates are strings in verifiable credentials\n dateOfBirth?: string;\n idDocumentDateOfIssue?: string;\n idDocumentDateOfExpiry?: string;\n // This is the residential address flattened fields\n residentialAddressStreet?: string;\n residentialAddressHouseNumber?: string;\n residentialAddressAdditionalAddressInfo?: string;\n residentialAddressRegion?: string;\n residentialAddressCity?: string;\n residentialAddressPostalCode?: string;\n residentialAddressCountry?: string;\n residentialAddressProofCategory?: string;\n // Dates are strings in verifiable credentials\n residentialAddressProofDateOfIssue?: string;\n // Files are strings in verifiable credentials, but as an input they should be buffers\n residentialAddressProofFile?: string;\n}\n\n// TODO: This is a stub of the types for @digitalbazaar/vc\n// when they introduce TypeScript support we should remove this\n// The copy is here because `types.d.ts` file is not bundled.\nexport interface VerifiedCredentialsProof {\n type: string;\n created: string;\n verificationMethod: string;\n proofValue: string;\n proofPurpose: string;\n}\n\nexport const CredentialSubjectFaceIdSchema: z.ZodObject<{\n faceSignUserId: z.ZodString;\n}> = z.object({\n faceSignUserId: z.string(),\n});\n\nexport type CredentialSubjectFaceId = z.infer<typeof CredentialSubjectFaceIdSchema>;\n\nexport interface VerifiedCredentials<K> {\n \"@context\": string[];\n type: string[];\n issuer: string;\n id: string;\n level: string;\n issued: string;\n approvedAt: string;\n expirationDate: string;\n credentialSubject: K;\n issuanceDate: string;\n proof: VerifiedCredentialsProof;\n}\n\nexport type VerifiableCredential<K> = VerifiedCredentials<K>;\n"],"mappings":";;AAoBA,MAAa,yBAMR,EAAE,OAAO;CACZ,IAAI,EAAE,OAAO;CAGb,OAAO,EAAE,OAAO;CAGhB,QAAQ,EAAE,KAAK,CAAC,CAAC,SAAS;CAG1B,YAAY,EAAE,KAAK,CAAC,CAAC,SAAS;CAG9B,gBAAgB,EAAE,KAAK,CAAC,CAAC,SAAS;AACpC,CAAC;AAKD,MAAa,qCAWR,EAAE,OAAO;CAEZ,QAAQ,EAAE,OAAO;CAGjB,aAAa,EAAE,OAAO,CAAC,CAAC,SAAS;CAGjC,uBAAuB,EAAE,OAAO,CAAC,CAAC,SAAS;CAG3C,QAAQ,EAAE,OAAO,CAAC,CAAC,SAAS;CAG5B,MAAM,EAAE,OAAO;CAGf,YAAY,EAAE,OAAO,CAAC,CAAC,SAAS;CAGhC,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;CAGhC,eAAe,EAAE,OAAO;CAGxB,kBAAkB,EAAE,KAAK,CAAC,CAAC,SAAS;CAGpC,WAAW,EAAE,WAAW,MAAM;AAChC,CAAC;AAID,MAAa,uBAQR,EAAE,KAAK;CACV;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAGD,MAAa,eAIR,EAAE,KAAK;CAAC;CAAK;CAAK;AAAO,CAAC;AAI/B,MAAa,0BAwBR,EACF,OAAO;CAEN,IAAI,EAAE,OAAO;CAGb,WAAW,EAAE,OAAO,CAAC,CAAC,SAAS;CAG/B,YAAY,EAAE,OAAO,CAAC,CAAC,SAAS;CAGhC,KAAK,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;CAGvC,aAAa,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;CAG/C,QAAQ,aAAa,SAAS;CAG9B,YAAY,EAAE,OAAO,CAAC,CAAC,SAAS;CAGhC,YAAY,EAAE,OAAO,CAAC,CAAC,SAAS;CAGhC,aAAa,EAAE,KAAK;CAGpB,cAAc,EAAE,OAAO,CAAC,CAAC,SAAS;CAGlC,OAAO,EAAE,MAAM,CAAC,CAAC,SAAS;CAG1B,aAAa,EAAE,OAAO,CAAC,CAAC,SAAS;CAGjC,mBAAmB,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;CAG1C,kBAAkB,EAAE,OAAO;CAG3B,gBAAgB;CAGhB,uBAAuB,EAAE,KAAK,CAAC,CAAC,SAAS;CAGzC,wBAAwB,EAAE,KAAK,CAAC,CAAC,SAAS;CAG1C,qBAAqB,EAAE,WAAW,MAAM;CAGxC,oBAAoB,EAAE,WAAW,MAAM,CAAC,CAAC,SAAS;CAGlD,YAAY,EAAE,WAAW,MAAM;CAG/B,oBAAoB,mCAAmC,SAAS;AAClE,CAAC,CAAC,CACD,QAEE,SAAS,KAAK,aAAa,KAAK,YACjC,EAAE,SAAS,2DAA2D,CACxE;AAiDF,MAAa,gCAER,EAAE,OAAO,EACZ,gBAAgB,EAAE,OAAO,EAC3B,CAAC"}
@@ -1,9 +1,6 @@
1
1
  import { AvailableIssuerType, CredentialFields, CredentialResidentialAddress, CredentialSubject, CredentialSubjectFaceId, InsertableIDOSCredential } from "../types/index.mjs";
2
2
  import { Ed25519VerificationKey2020 } from "@digitalbazaar/ed25519-verification-key-2020";
3
-
4
3
  //#region src/utils/index.d.ts
5
- declare function fileToBase85(file: Buffer): string;
6
- declare function base85ToFile(data: string): Buffer | false;
7
4
  declare function capitalizeFirstLetter(str: string): string;
8
5
  declare function issuerToKey(issuer: AvailableIssuerType): Promise<Ed25519VerificationKey2020>;
9
6
  declare function convertValues<K extends CredentialFields | CredentialSubject | CredentialResidentialAddress | CredentialSubjectFaceId>(fields: K, prefix?: string): Record<string, unknown>;
@@ -19,15 +16,12 @@ declare function levelScore(level: string): number;
19
16
  declare function pickHighestMatchingLevel(levels: string[], requiredLevel: BaseLevel, requiredAddons: Addon[]): string | null;
20
17
  declare function highestMatchingCredential<K extends {
21
18
  public_notes: string;
22
- }>(credentials: K[], requiredLevel: BaseLevel, {
23
- addons: requiredAddons,
24
- publicNotesConstraint
25
- }: {
19
+ }>(credentials: K[], requiredLevel: BaseLevel, { addons: requiredAddons, publicNotesConstraint }: {
26
20
  addons?: Addon[];
27
21
  publicNotesConstraint?: Record<string, number | string>;
28
22
  }): K | undefined;
29
23
  declare function recordFilter(rec: Record<string, unknown>, pick: Record<string, unknown[]>, omit: Record<string, unknown[]>): boolean;
30
24
  declare function buildInsertableIDOSCredential(userId: string, publicNotes: string, content: string, encryptorPublicKey: string): InsertableIDOSCredential;
31
25
  //#endregion
32
- export { base85ToFile, buildInsertableIDOSCredential, capitalizeFirstLetter, convertValues, deriveLevel, fileToBase85, highestMatchingCredential, issuerToKey, levelScore, matchLevelOrHigher, parseLevel, pickHighestMatchingLevel, recordFilter };
26
+ export { buildInsertableIDOSCredential, capitalizeFirstLetter, convertValues, deriveLevel, highestMatchingCredential, issuerToKey, levelScore, matchLevelOrHigher, parseLevel, pickHighestMatchingLevel, recordFilter };
33
27
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/utils/index.ts"],"mappings":";;;;iBAiBgB,YAAA,CAAa,IAAA,EAAM,MAAA;AAAA,iBAInB,YAAA,CAAa,IAAA,WAAe,MAAA;AAAA,iBAI5B,qBAAA,CAAsB,GAAA;AAAA,iBAuBhB,WAAA,CACpB,MAAA,EAAQ,mBAAA,GACP,OAAA,CAAQ,0BAAA;AAAA,iBAkBK,aAAA,WAEV,gBAAA,GACA,iBAAA,GACA,4BAAA,GACA,uBAAA,CAAA,CACJ,MAAA,EAAQ,CAAA,EAAG,MAAA,YAAkB,MAAA;AAAA,KAqB1B,SAAA;AAAA,KACA,KAAA;AAAA,iBAEW,WAAA,CAAY,UAAA,EAAY,iBAAA;AAAA,iBAyBxB,UAAA,CAAW,KAAA;EACzB,IAAA,EAAM,SAAA;EACN,MAAA,EAAQ,KAAA;AAAA;AAAA,iBAMM,kBAAA,CACd,KAAA,EAAO,SAAA,EACP,cAAA,EAAgB,KAAA,IAChB,YAAA;AAAA,iBAYc,UAAA,CAAW,KAAA;AAAA,iBAaX,wBAAA,CACd,MAAA,YACA,aAAA,EAAe,SAAA,EACf,cAAA,EAAgB,KAAA;AAAA,iBAaF,yBAAA;EAAsC,YAAA;AAAA,EAAA,CACpD,WAAA,EAAa,CAAA,IACb,aAAA,EAAe,SAAA;EAEb,MAAA,EAAQ,cAAA;EACR;AAAA;EAEA,MAAA,GAAS,KAAA;EACT,qBAAA,GAAwB,MAAA;AAAA,IAEzB,CAAA;AAAA,iBAsCa,YAAA,CACd,GAAA,EAAK,MAAA,mBACL,IAAA,EAAM,MAAA,qBACN,IAAA,EAAM,MAAA;AAAA,iBAkBQ,6BAAA,CACd,MAAA,UACA,WAAA,UACA,OAAA,UACA,kBAAA,WACC,wBAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/utils/index.ts"],"mappings":";;;iBAsBgB,sBAAsB;iBAuBhB,YACpB,QAAQ,sBACP,QAAQ;iBAkBK,cACd,UACI,mBACA,oBACA,+BACA,yBACJ,QAAQ,GAAG,kBAAkB;KAqB1B;KACA;iBAEW,YAAY,YAAY;iBAyBxB,WAAW;EACzB,MAAM;EACN,QAAQ;;iBAMM,mBACd,OAAO,WACP,gBAAgB,SAChB;iBAYc,WAAW;iBAaX,yBACd,kBACA,eAAe,WACf,gBAAgB;iBAaF,0BAA0B;EAAY;GACpD,aAAa,KACb,eAAe,aAEb,QAAQ,gBACR;EAEA,SAAS;EACT,wBAAwB;IAEzB;iBAsCa,aACd,KAAK,yBACL,MAAM,2BACN,MAAM;iBAkBQ,8BACd,gBACA,qBACA,iBACA,6BACC"}
@@ -1,16 +1,9 @@
1
1
  import { Ed25519VerificationKey2020 } from "@digitalbazaar/ed25519-verification-key-2020";
2
- import { base64Decode, base64Encode, hexEncode, utf8Encode } from "@idos-network/utils/codecs";
3
- import * as base85 from "base85";
2
+ import { base64Decode, base64Encode, fileToBase85, hexEncode, utf8Encode } from "@idos-network/utils/codecs";
4
3
  import { every, get } from "es-toolkit/compat";
5
4
  import invariant from "tiny-invariant";
6
5
  import nacl from "tweetnacl";
7
6
  //#region src/utils/index.ts
8
- function fileToBase85(file) {
9
- return base85.encode(file, "ascii85");
10
- }
11
- function base85ToFile(data) {
12
- return base85.decode(data);
13
- }
14
7
  function capitalizeFirstLetter(str) {
15
8
  return str[0].toUpperCase() + str.slice(1);
16
9
  }
@@ -119,6 +112,6 @@ function buildInsertableIDOSCredential(userId, publicNotes, content, encryptorPu
119
112
  };
120
113
  }
121
114
  //#endregion
122
- export { base85ToFile, buildInsertableIDOSCredential, capitalizeFirstLetter, convertValues, deriveLevel, fileToBase85, highestMatchingCredential, issuerToKey, levelScore, matchLevelOrHigher, parseLevel, pickHighestMatchingLevel, recordFilter };
115
+ export { buildInsertableIDOSCredential, capitalizeFirstLetter, convertValues, deriveLevel, highestMatchingCredential, issuerToKey, levelScore, matchLevelOrHigher, parseLevel, pickHighestMatchingLevel, recordFilter };
123
116
 
124
117
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../src/utils/index.ts"],"sourcesContent":["import { Ed25519VerificationKey2020 } from \"@digitalbazaar/ed25519-verification-key-2020\";\nimport { base64Decode, base64Encode, hexEncode, utf8Encode } from \"@idos-network/utils/codecs\";\nimport * as base85 from \"base85\";\nimport { every, get } from \"es-toolkit/compat\";\nimport invariant from \"tiny-invariant\";\nimport nacl from \"tweetnacl\";\n\nimport type {\n AvailableIssuerType,\n CredentialFields,\n CredentialResidentialAddress,\n CredentialSubject,\n CredentialSubjectFaceId,\n CustomIssuerType,\n InsertableIDOSCredential,\n} from \"../types\";\n\nexport function fileToBase85(file: Buffer): string {\n return base85.encode(file, \"ascii85\");\n}\n\nexport function base85ToFile(data: string): Buffer | false {\n return base85.decode(data);\n}\n\nexport function capitalizeFirstLetter(str: string): string {\n return str[0].toUpperCase() + str.slice(1);\n}\n\nfunction isIssuerKey(issuer: AvailableIssuerType): issuer is Ed25519VerificationKey2020 {\n return (\n typeof issuer === \"object\" &&\n issuer !== null &&\n \"type\" in issuer &&\n \"id\" in issuer &&\n \"controller\" in issuer\n );\n}\n\nfunction isCustomIssuerType(issuer: AvailableIssuerType): issuer is CustomIssuerType {\n return (\n typeof issuer === \"object\" &&\n issuer !== null &&\n \"issuer\" in issuer &&\n \"publicKeyMultibase\" in issuer\n );\n}\n\nexport async function issuerToKey(\n issuer: AvailableIssuerType,\n): Promise<Ed25519VerificationKey2020> {\n if (isIssuerKey(issuer)) {\n return issuer;\n }\n\n if (isCustomIssuerType(issuer)) {\n return await Ed25519VerificationKey2020.from({\n id: `${issuer.issuer}/keys/1`,\n controller: `${issuer.issuer}/issuers/1`,\n publicKeyMultibase: issuer.publicKeyMultibase,\n privateKeyMultibase: issuer.privateKeyMultibase,\n type: \"Ed25519VerificationKey2020\",\n });\n }\n\n return await Ed25519VerificationKey2020.from({ ...issuer, type: \"Ed25519VerificationKey2020\" });\n}\n\nexport function convertValues<\n K extends\n | CredentialFields\n | CredentialSubject\n | CredentialResidentialAddress\n | CredentialSubjectFaceId,\n>(fields: K, prefix?: string): Record<string, unknown> {\n const acc: Record<string, unknown> = {};\n\n for (const key in fields) {\n if (Object.hasOwn(fields, key)) {\n const value = fields[key];\n const name = prefix ? `${prefix}${capitalizeFirstLetter(key)}` : key;\n if (value instanceof Date) {\n acc[name] = value.toISOString();\n } else if (value instanceof Buffer) {\n // Convert file to base85\n acc[name] = fileToBase85(value);\n } else {\n acc[name] = value;\n }\n }\n }\n\n return acc;\n}\n\ntype BaseLevel = \"basic\" | \"plus\";\ntype Addon = \"liveness\" | \"email\" | \"phoneNumber\";\n\nexport function deriveLevel(credential: CredentialSubject): string {\n let level: BaseLevel = \"basic\";\n\n // Address is a sign for plus+\n const address = credential.residentialAddress;\n if (address?.proofFile && address?.city && address?.proofCategory) {\n level = \"plus\";\n }\n\n const addons: Addon[] = [];\n if (credential.selfieFile) {\n addons.push(\"liveness\");\n }\n\n if (credential.email) {\n addons.push(\"email\");\n }\n\n if (credential.phoneNumber) {\n addons.push(\"phoneNumber\");\n }\n\n return [level, ...addons].join(\"+\");\n}\n\nexport function parseLevel(level: string): {\n base: BaseLevel;\n addons: Addon[];\n} {\n const [base, ...addons] = level.split(\"+\") as [BaseLevel, ...Addon[]];\n return { base, addons };\n}\n\nexport function matchLevelOrHigher(\n level: BaseLevel,\n requiredAddons: Addon[],\n currentLevel: string,\n): boolean {\n const { base: currentBaseLevel, addons: currentAddons } = parseLevel(currentLevel);\n\n // TODO: Consider pop+ or uniqueness+ scenarios\n if (level === \"plus\" && currentBaseLevel !== \"plus\") {\n return false;\n }\n\n return requiredAddons.every((addon) => currentAddons.includes(addon));\n}\n\nexport function levelScore(level: string): number {\n const { base, addons } = parseLevel(level);\n let score = 0;\n\n if (base === \"plus\") {\n score += 100;\n }\n\n score += addons.length * 10;\n\n return score;\n}\n\nexport function pickHighestMatchingLevel(\n levels: string[],\n requiredLevel: BaseLevel,\n requiredAddons: Addon[],\n): string | null {\n return (\n levels\n .filter((currentLevel) => matchLevelOrHigher(requiredLevel, requiredAddons, currentLevel))\n .sort((a, b) => {\n const aAddons = levelScore(a);\n const bAddons = levelScore(b);\n return bAddons - aAddons; // descending\n })[0] ?? null\n );\n}\n\nexport function highestMatchingCredential<K extends { public_notes: string }>(\n credentials: K[],\n requiredLevel: BaseLevel,\n {\n addons: requiredAddons = [],\n publicNotesConstraint = {},\n }: {\n addons?: Addon[];\n publicNotesConstraint?: Record<string, number | string>;\n },\n): K | undefined {\n const matchingCredentials = credentials\n .map((credential) => {\n const publicNotes = JSON.parse(credential.public_notes || \"{}\");\n return {\n credential,\n publicNotes,\n };\n })\n .filter(({ publicNotes }) => {\n const level = publicNotes.level;\n\n if (!level) {\n return false;\n }\n\n if (!matchLevelOrHigher(requiredLevel, requiredAddons, level)) {\n return false;\n }\n\n for (const key in publicNotesConstraint) {\n if (publicNotes[key] !== publicNotesConstraint[key]) {\n return false;\n }\n }\n\n return true;\n })\n .sort((a, b) => {\n const aLevel = a.publicNotes.level;\n const bLevel = b.publicNotes.level;\n return levelScore(bLevel) - levelScore(aLevel); // descending\n })\n .map(({ credential }) => credential);\n\n return matchingCredentials[0];\n}\n\nexport function recordFilter(\n rec: Record<string, unknown>,\n pick: Record<string, unknown[]>,\n omit: Record<string, unknown[]>,\n): boolean {\n const matchCriteria = (content: Record<string, unknown>, criteria: Record<string, unknown[]>) =>\n every(Object.entries(criteria), ([path, targetSet]) => targetSet.includes(get(content, path)));\n\n if (Object.keys(pick).length > 0 && !matchCriteria(rec, pick)) {\n // Fast fail on pick criteria\n return false;\n }\n\n if (Object.keys(omit).length > 0 && matchCriteria(rec, omit)) {\n // Fast fail on omit criteria\n return false;\n }\n\n return true;\n}\n\nexport function buildInsertableIDOSCredential(\n userId: string,\n publicNotes: string,\n content: string,\n encryptorPublicKey: string,\n): InsertableIDOSCredential {\n invariant(encryptorPublicKey, \"Missing `encryptorPublicKey`\");\n\n const ephemeralAuthenticationKeyPair = nacl.sign.keyPair();\n\n const publicNotesSignature = nacl.sign.detached(\n utf8Encode(publicNotes),\n ephemeralAuthenticationKeyPair.secretKey,\n );\n\n return {\n user_id: userId,\n content,\n\n public_notes: publicNotes,\n public_notes_signature: base64Encode(publicNotesSignature),\n\n broader_signature: base64Encode(\n nacl.sign.detached(\n Uint8Array.from([...publicNotesSignature, ...base64Decode(content)]),\n ephemeralAuthenticationKeyPair.secretKey,\n ),\n ),\n\n issuer_auth_public_key: hexEncode(ephemeralAuthenticationKeyPair.publicKey, true),\n encryptor_public_key: encryptorPublicKey,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/utils/index.ts"],"sourcesContent":["import { Ed25519VerificationKey2020 } from \"@digitalbazaar/ed25519-verification-key-2020\";\nimport {\n base64Decode,\n base64Encode,\n hexEncode,\n utf8Encode,\n fileToBase85,\n} from \"@idos-network/utils/codecs\";\nimport { every, get } from \"es-toolkit/compat\";\nimport invariant from \"tiny-invariant\";\nimport nacl from \"tweetnacl\";\n\nimport type {\n AvailableIssuerType,\n CredentialFields,\n CredentialResidentialAddress,\n CredentialSubject,\n CredentialSubjectFaceId,\n CustomIssuerType,\n InsertableIDOSCredential,\n} from \"../types\";\n\nexport function capitalizeFirstLetter(str: string): string {\n return str[0].toUpperCase() + str.slice(1);\n}\n\nfunction isIssuerKey(issuer: AvailableIssuerType): issuer is Ed25519VerificationKey2020 {\n return (\n typeof issuer === \"object\" &&\n issuer !== null &&\n \"type\" in issuer &&\n \"id\" in issuer &&\n \"controller\" in issuer\n );\n}\n\nfunction isCustomIssuerType(issuer: AvailableIssuerType): issuer is CustomIssuerType {\n return (\n typeof issuer === \"object\" &&\n issuer !== null &&\n \"issuer\" in issuer &&\n \"publicKeyMultibase\" in issuer\n );\n}\n\nexport async function issuerToKey(\n issuer: AvailableIssuerType,\n): Promise<Ed25519VerificationKey2020> {\n if (isIssuerKey(issuer)) {\n return issuer;\n }\n\n if (isCustomIssuerType(issuer)) {\n return await Ed25519VerificationKey2020.from({\n id: `${issuer.issuer}/keys/1`,\n controller: `${issuer.issuer}/issuers/1`,\n publicKeyMultibase: issuer.publicKeyMultibase,\n privateKeyMultibase: issuer.privateKeyMultibase,\n type: \"Ed25519VerificationKey2020\",\n });\n }\n\n return await Ed25519VerificationKey2020.from({ ...issuer, type: \"Ed25519VerificationKey2020\" });\n}\n\nexport function convertValues<\n K extends\n | CredentialFields\n | CredentialSubject\n | CredentialResidentialAddress\n | CredentialSubjectFaceId,\n>(fields: K, prefix?: string): Record<string, unknown> {\n const acc: Record<string, unknown> = {};\n\n for (const key in fields) {\n if (Object.hasOwn(fields, key)) {\n const value = fields[key];\n const name = prefix ? `${prefix}${capitalizeFirstLetter(key)}` : key;\n if (value instanceof Date) {\n acc[name] = value.toISOString();\n } else if (value instanceof Buffer) {\n // Convert file to base85\n acc[name] = fileToBase85(value);\n } else {\n acc[name] = value;\n }\n }\n }\n\n return acc;\n}\n\ntype BaseLevel = \"basic\" | \"plus\";\ntype Addon = \"liveness\" | \"email\" | \"phoneNumber\";\n\nexport function deriveLevel(credential: CredentialSubject): string {\n let level: BaseLevel = \"basic\";\n\n // Address is a sign for plus+\n const address = credential.residentialAddress;\n if (address?.proofFile && address?.city && address?.proofCategory) {\n level = \"plus\";\n }\n\n const addons: Addon[] = [];\n if (credential.selfieFile) {\n addons.push(\"liveness\");\n }\n\n if (credential.email) {\n addons.push(\"email\");\n }\n\n if (credential.phoneNumber) {\n addons.push(\"phoneNumber\");\n }\n\n return [level, ...addons].join(\"+\");\n}\n\nexport function parseLevel(level: string): {\n base: BaseLevel;\n addons: Addon[];\n} {\n const [base, ...addons] = level.split(\"+\") as [BaseLevel, ...Addon[]];\n return { base, addons };\n}\n\nexport function matchLevelOrHigher(\n level: BaseLevel,\n requiredAddons: Addon[],\n currentLevel: string,\n): boolean {\n const { base: currentBaseLevel, addons: currentAddons } = parseLevel(currentLevel);\n\n // TODO: Consider pop+ or uniqueness+ scenarios\n if (level === \"plus\" && currentBaseLevel !== \"plus\") {\n return false;\n }\n\n return requiredAddons.every((addon) => currentAddons.includes(addon));\n}\n\nexport function levelScore(level: string): number {\n const { base, addons } = parseLevel(level);\n let score = 0;\n\n if (base === \"plus\") {\n score += 100;\n }\n\n score += addons.length * 10;\n\n return score;\n}\n\nexport function pickHighestMatchingLevel(\n levels: string[],\n requiredLevel: BaseLevel,\n requiredAddons: Addon[],\n): string | null {\n return (\n levels\n .filter((currentLevel) => matchLevelOrHigher(requiredLevel, requiredAddons, currentLevel))\n .sort((a, b) => {\n const aAddons = levelScore(a);\n const bAddons = levelScore(b);\n return bAddons - aAddons; // descending\n })[0] ?? null\n );\n}\n\nexport function highestMatchingCredential<K extends { public_notes: string }>(\n credentials: K[],\n requiredLevel: BaseLevel,\n {\n addons: requiredAddons = [],\n publicNotesConstraint = {},\n }: {\n addons?: Addon[];\n publicNotesConstraint?: Record<string, number | string>;\n },\n): K | undefined {\n const matchingCredentials = credentials\n .map((credential) => {\n const publicNotes = JSON.parse(credential.public_notes || \"{}\");\n return {\n credential,\n publicNotes,\n };\n })\n .filter(({ publicNotes }) => {\n const level = publicNotes.level;\n\n if (!level) {\n return false;\n }\n\n if (!matchLevelOrHigher(requiredLevel, requiredAddons, level)) {\n return false;\n }\n\n for (const key in publicNotesConstraint) {\n if (publicNotes[key] !== publicNotesConstraint[key]) {\n return false;\n }\n }\n\n return true;\n })\n .sort((a, b) => {\n const aLevel = a.publicNotes.level;\n const bLevel = b.publicNotes.level;\n return levelScore(bLevel) - levelScore(aLevel); // descending\n })\n .map(({ credential }) => credential);\n\n return matchingCredentials[0];\n}\n\nexport function recordFilter(\n rec: Record<string, unknown>,\n pick: Record<string, unknown[]>,\n omit: Record<string, unknown[]>,\n): boolean {\n const matchCriteria = (content: Record<string, unknown>, criteria: Record<string, unknown[]>) =>\n every(Object.entries(criteria), ([path, targetSet]) => targetSet.includes(get(content, path)));\n\n if (Object.keys(pick).length > 0 && !matchCriteria(rec, pick)) {\n // Fast fail on pick criteria\n return false;\n }\n\n if (Object.keys(omit).length > 0 && matchCriteria(rec, omit)) {\n // Fast fail on omit criteria\n return false;\n }\n\n return true;\n}\n\nexport function buildInsertableIDOSCredential(\n userId: string,\n publicNotes: string,\n content: string,\n encryptorPublicKey: string,\n): InsertableIDOSCredential {\n invariant(encryptorPublicKey, \"Missing `encryptorPublicKey`\");\n\n const ephemeralAuthenticationKeyPair = nacl.sign.keyPair();\n\n const publicNotesSignature = nacl.sign.detached(\n utf8Encode(publicNotes),\n ephemeralAuthenticationKeyPair.secretKey,\n );\n\n return {\n user_id: userId,\n content,\n\n public_notes: publicNotes,\n public_notes_signature: base64Encode(publicNotesSignature),\n\n broader_signature: base64Encode(\n nacl.sign.detached(\n Uint8Array.from([...publicNotesSignature, ...base64Decode(content)]),\n ephemeralAuthenticationKeyPair.secretKey,\n ),\n ),\n\n issuer_auth_public_key: hexEncode(ephemeralAuthenticationKeyPair.publicKey, true),\n encryptor_public_key: encryptorPublicKey,\n };\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,10 +1,13 @@
1
1
  {
2
2
  "name": "@idos-network/credentials",
3
- "version": "1.2.0",
3
+ "version": "1.5.0",
4
4
  "description": "idOS Credentials JavaScript SDK",
5
5
  "homepage": "https://idos.network",
6
6
  "license": "MIT",
7
- "repository": "github:idos-network/idos-sdk-js",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "github:idos-network/idos-sdk-js"
10
+ },
8
11
  "files": [
9
12
  "assets/**/*",
10
13
  "dist/**/*",
@@ -40,24 +43,24 @@
40
43
  "dependencies": {
41
44
  "@digitalbazaar/ed25519-signature-2020": "^5.4.0",
42
45
  "@digitalbazaar/ed25519-verification-key-2020": "^4.2.0",
43
- "@digitalbazaar/vc": "^7.2.0",
44
- "base85": "^3.1.0",
45
- "es-toolkit": "^1.39.0",
46
+ "@digitalbazaar/vc": "^7.3.0",
47
+ "es-toolkit": "^1.50.0",
46
48
  "jsonld-document-loader": "^2.3.0",
47
49
  "tiny-invariant": "^1.3.3",
48
50
  "tweetnacl": "^1.0.3",
49
51
  "zod": "4.4.3",
50
- "@idos-network/utils": "1.2.0"
52
+ "@idos-network/utils": "1.5.0"
51
53
  },
52
54
  "devDependencies": {
53
- "@types/node": "25.6.2",
54
- "tsdown": "^0.22.0",
55
- "typescript": "^5.8.3",
56
- "vitest": "4.1.5",
55
+ "@types/node": "25.9.5",
56
+ "@vitest/coverage-v8": "4.1.10",
57
+ "tsdown": "^0.22.14",
58
+ "typescript": "^5.9.3",
59
+ "vitest": "4.1.10",
57
60
  "web-streams-polyfill": "3.3.3"
58
61
  },
59
62
  "peerDependencies": {
60
- "typescript": "^5.8.3"
63
+ "typescript": "^5.9.3"
61
64
  },
62
65
  "engines": {
63
66
  "node": ">=22.19.0"
@@ -68,6 +71,7 @@
68
71
  "publint": "pnpx publint --strict",
69
72
  "test": "vitest",
70
73
  "test:watch": "vitest --watch",
74
+ "coverage": "vitest run --coverage",
71
75
  "typecheck": "tsc --noEmit"
72
76
  }
73
77
  }
@@ -1,10 +1,10 @@
1
1
  import { Ed25519VerificationKey2020 } from "@digitalbazaar/ed25519-verification-key-2020";
2
+ import { fileToBase85 } from "@idos-network/utils/codecs";
2
3
  import crypto from "node:crypto";
3
4
  import { describe, expect, it } from "vitest";
4
5
  import { ZodError } from "zod";
5
6
 
6
7
  import { buildCredential, buildFaceIdCredential } from ".";
7
- import { fileToBase85 } from "../utils";
8
8
  import { verifyCredential } from "./verifier";
9
9
 
10
10
  describe("verifiableCredentials", () => {
@@ -1,6 +1,11 @@
1
1
  import { Ed25519VerificationKey2020 } from "@digitalbazaar/ed25519-verification-key-2020";
2
- import { base64Decode, base64Encode, hexEncode, utf8Encode } from "@idos-network/utils/codecs";
3
- import * as base85 from "base85";
2
+ import {
3
+ base64Decode,
4
+ base64Encode,
5
+ hexEncode,
6
+ utf8Encode,
7
+ fileToBase85,
8
+ } from "@idos-network/utils/codecs";
4
9
  import { every, get } from "es-toolkit/compat";
5
10
  import invariant from "tiny-invariant";
6
11
  import nacl from "tweetnacl";
@@ -15,14 +20,6 @@ import type {
15
20
  InsertableIDOSCredential,
16
21
  } from "../types";
17
22
 
18
- export function fileToBase85(file: Buffer): string {
19
- return base85.encode(file, "ascii85");
20
- }
21
-
22
- export function base85ToFile(data: string): Buffer | false {
23
- return base85.decode(data);
24
- }
25
-
26
23
  export function capitalizeFirstLetter(str: string): string {
27
24
  return str[0].toUpperCase() + str.slice(1);
28
25
  }