@interop/wallet-core 0.50.0 → 0.52.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.
- package/README.md +7 -11
- package/dist/clientAnnex/credentialAnchoredGenesis.d.ts +17 -8
- package/dist/clientAnnex/credentialAnchoredGenesis.d.ts.map +1 -1
- package/dist/clientAnnex/credentialAnchoredGenesis.js +33 -12
- package/dist/clientAnnex/credentialAnchoredGenesis.js.map +1 -1
- package/dist/clientAnnex/forget.d.ts +18 -6
- package/dist/clientAnnex/forget.d.ts.map +1 -1
- package/dist/clientAnnex/forget.js +19 -6
- package/dist/clientAnnex/forget.js.map +1 -1
- package/dist/clientAnnex/forgetLast.d.ts +65 -28
- package/dist/clientAnnex/forgetLast.d.ts.map +1 -1
- package/dist/clientAnnex/forgetLast.js +78 -18
- package/dist/clientAnnex/forgetLast.js.map +1 -1
- package/dist/clientAnnex/gc.d.ts +3 -3
- package/dist/clientAnnex/gc.d.ts.map +1 -1
- package/dist/clientAnnex/gc.js +2 -2
- package/dist/clientAnnex/gc.js.map +1 -1
- package/dist/clientAnnex/index.d.ts +6 -6
- package/dist/clientAnnex/index.d.ts.map +1 -1
- package/dist/clientAnnex/index.js +5 -5
- package/dist/clientAnnex/index.js.map +1 -1
- package/dist/clientAnnex/ladder.d.ts +19 -11
- package/dist/clientAnnex/ladder.d.ts.map +1 -1
- package/dist/clientAnnex/ladder.js +77 -14
- package/dist/clientAnnex/ladder.js.map +1 -1
- package/dist/clientAnnex/ladderAnchored.d.ts +36 -7
- package/dist/clientAnnex/ladderAnchored.d.ts.map +1 -1
- package/dist/clientAnnex/ladderAnchored.js +80 -18
- package/dist/clientAnnex/ladderAnchored.js.map +1 -1
- package/dist/clientAnnex/log.d.ts +6 -6
- package/dist/clientAnnex/log.d.ts.map +1 -1
- package/dist/clientAnnex/log.js +8 -8
- package/dist/clientAnnex/log.js.map +1 -1
- package/dist/clientAnnex/recoveryLadderAnchored.d.ts +7 -7
- package/dist/clientAnnex/recoveryLadderAnchored.js +9 -9
- package/dist/clientAnnex/recoveryLadderAnchored.js.map +1 -1
- package/dist/clientAnnex/selfEnroll.d.ts +6 -4
- package/dist/clientAnnex/selfEnroll.d.ts.map +1 -1
- package/dist/clientAnnex/selfEnroll.js +19 -7
- package/dist/clientAnnex/selfEnroll.js.map +1 -1
- package/dist/clients/listing.d.ts +1 -1
- package/dist/clients/listing.d.ts.map +1 -1
- package/dist/clients/listing.js +1 -1
- package/dist/clients/listing.js.map +1 -1
- package/dist/clients/revocation.d.ts +1 -1
- package/dist/clients/rosterPolicy.d.ts +1 -1
- package/dist/clients/rosterPolicy.d.ts.map +1 -1
- package/dist/descriptors/acquire.js +1 -1
- package/dist/descriptors/logSource.d.ts +1 -2
- package/dist/descriptors/logSource.d.ts.map +1 -1
- package/dist/descriptors/logSource.js +2 -2
- package/dist/descriptors/logSource.js.map +1 -1
- package/dist/enrollment/enrollment.d.ts +1 -1
- package/dist/enrollment/enrollment.d.ts.map +1 -1
- package/dist/enrollment/enrollment.js +2 -1
- package/dist/enrollment/enrollment.js.map +1 -1
- package/dist/genesis/accountGenesis.d.ts +13 -1
- package/dist/genesis/accountGenesis.d.ts.map +1 -1
- package/dist/genesis/accountGenesis.js +1 -1
- package/dist/genesis/accountGenesis.js.map +1 -1
- package/dist/index.d.ts +1 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -3
- package/dist/index.js.map +1 -1
- package/dist/keyring/kdf.d.ts +6 -20
- package/dist/keyring/kdf.d.ts.map +1 -1
- package/dist/keyring/kdf.js +8 -5
- package/dist/keyring/kdf.js.map +1 -1
- package/dist/keyring/unlockSpace.js +1 -1
- package/dist/keys/rosterLogStore.d.ts +16 -14
- package/dist/keys/rosterLogStore.d.ts.map +1 -1
- package/dist/keys/rosterLogStore.js +149 -32
- package/dist/keys/rosterLogStore.js.map +1 -1
- package/dist/keys/rosterStore.d.ts +8 -7
- package/dist/keys/rosterStore.d.ts.map +1 -1
- package/dist/keys/rosterStore.js +6 -6
- package/dist/keys/rosterStore.js.map +1 -1
- package/dist/keys/spaceEpochs.d.ts +1 -1
- package/dist/keys/spaceEpochs.js +1 -1
- package/dist/keys/userKeyRoster.d.ts +3 -3
- package/dist/keys/userKeyRoster.d.ts.map +1 -1
- package/dist/keys/userKeyRoster.js +3 -3
- package/dist/keys/userKeyRoster.js.map +1 -1
- package/dist/recovery/index.d.ts +2 -2
- package/dist/recovery/index.js +2 -2
- package/dist/recovery/recoveryDelegation.js +1 -1
- package/dist/recovery/recoveryDelegation.js.map +1 -1
- package/dist/recovery/recoveryWebvh.d.ts +4 -4
- package/dist/recovery/recoveryWebvh.js +5 -5
- package/dist/request/appKey.d.ts +9 -3
- package/dist/request/appKey.d.ts.map +1 -1
- package/dist/request/appKey.js +13 -8
- package/dist/request/appKey.js.map +1 -1
- package/dist/request/classify.d.ts.map +1 -1
- package/dist/request/classify.js +13 -1
- package/dist/request/classify.js.map +1 -1
- package/dist/request/ephemeralExchange.d.ts +6 -1
- package/dist/request/ephemeralExchange.d.ts.map +1 -1
- package/dist/request/ephemeralExchange.js +6 -1
- package/dist/request/ephemeralExchange.js.map +1 -1
- package/dist/request/exchangeClient.d.ts +0 -23
- package/dist/request/exchangeClient.d.ts.map +1 -1
- package/dist/request/exchangeClient.js +30 -1
- package/dist/request/exchangeClient.js.map +1 -1
- package/dist/request/index.d.ts +4 -1
- package/dist/request/index.d.ts.map +1 -1
- package/dist/request/index.js +4 -1
- package/dist/request/index.js.map +1 -1
- package/dist/request/interactionRequest.d.ts +23 -0
- package/dist/request/interactionRequest.d.ts.map +1 -0
- package/dist/request/interactionRequest.js +46 -0
- package/dist/request/interactionRequest.js.map +1 -0
- package/dist/request/interactionUrl.d.ts +3 -14
- package/dist/request/interactionUrl.d.ts.map +1 -1
- package/dist/request/interactionUrl.js +20 -1
- package/dist/request/interactionUrl.js.map +1 -1
- package/dist/resourceLog/controller.d.ts +48 -49
- package/dist/resourceLog/controller.d.ts.map +1 -1
- package/dist/resourceLog/controller.js +40 -20
- package/dist/resourceLog/controller.js.map +1 -1
- package/dist/resourceLog/errors.d.ts +12 -78
- package/dist/resourceLog/errors.d.ts.map +1 -1
- package/dist/resourceLog/errors.js +12 -79
- package/dist/resourceLog/errors.js.map +1 -1
- package/dist/resourceLog/index.d.ts +17 -22
- package/dist/resourceLog/index.d.ts.map +1 -1
- package/dist/resourceLog/index.js +16 -21
- package/dist/resourceLog/index.js.map +1 -1
- package/dist/resourceLog/license.d.ts +27 -26
- package/dist/resourceLog/license.d.ts.map +1 -1
- package/dist/resourceLog/license.js +31 -30
- package/dist/resourceLog/license.js.map +1 -1
- package/dist/unlock/index.d.ts +6 -6
- package/dist/unlock/index.d.ts.map +1 -1
- package/dist/unlock/index.js +5 -5
- package/dist/unlock/retire.d.ts +29 -28
- package/dist/unlock/retire.d.ts.map +1 -1
- package/dist/unlock/retire.js +25 -16
- package/dist/unlock/retire.js.map +1 -1
- package/dist/unlock/standingClient.d.ts +1 -1
- package/dist/unlock/standingClient.js +3 -3
- package/dist/unlock/standingWebvh.d.ts +28 -10
- package/dist/unlock/standingWebvh.d.ts.map +1 -1
- package/dist/unlock/standingWebvh.js +75 -37
- package/dist/unlock/standingWebvh.js.map +1 -1
- package/dist/unlock/unlockRecord.js +1 -1
- package/dist/webvh/delegatedLogStore.d.ts +2 -2
- package/dist/webvh/delegatedLogStore.js +2 -2
- package/dist/webvh/didWeb.js +1 -1
- package/dist/webvh/didWeb.js.map +1 -1
- package/dist/webvh/didWebvh.d.ts +3 -3
- package/dist/webvh/didWebvh.d.ts.map +1 -1
- package/dist/webvh/didWebvh.js +5 -5
- package/dist/webvh/didWebvh.js.map +1 -1
- package/dist/webvh/listClients.js +1 -1
- package/dist/webvh/listClients.js.map +1 -1
- package/dist/webvh/verifyLog.d.ts +1 -1
- package/dist/webvh/verifyLog.d.ts.map +1 -1
- package/dist/webvh/verifyLog.js +1 -2
- package/dist/webvh/verifyLog.js.map +1 -1
- package/package.json +6 -10
- package/dist/display/alignment.d.ts +0 -55
- package/dist/display/alignment.d.ts.map +0 -1
- package/dist/display/alignment.js +0 -117
- package/dist/display/alignment.js.map +0 -1
- package/dist/display/credentialName.d.ts +0 -42
- package/dist/display/credentialName.d.ts.map +0 -1
- package/dist/display/credentialName.js +0 -106
- package/dist/display/credentialName.js.map +0 -1
- package/dist/display/displayFields.d.ts +0 -59
- package/dist/display/displayFields.d.ts.map +0 -1
- package/dist/display/displayFields.js +0 -136
- package/dist/display/displayFields.js.map +0 -1
- package/dist/display/evidence.d.ts +0 -50
- package/dist/display/evidence.d.ts.map +0 -1
- package/dist/display/evidence.js +0 -67
- package/dist/display/evidence.js.map +0 -1
- package/dist/display/image.d.ts +0 -18
- package/dist/display/image.d.ts.map +0 -1
- package/dist/display/image.js +0 -23
- package/dist/display/image.js.map +0 -1
- package/dist/display/index.d.ts +0 -38
- package/dist/display/index.d.ts.map +0 -1
- package/dist/display/index.js +0 -32
- package/dist/display/index.js.map +0 -1
- package/dist/display/issuer.d.ts +0 -105
- package/dist/display/issuer.d.ts.map +0 -1
- package/dist/display/issuer.js +0 -126
- package/dist/display/issuer.js.map +0 -1
- package/dist/display/obv3.d.ts +0 -82
- package/dist/display/obv3.d.ts.map +0 -1
- package/dist/display/obv3.js +0 -117
- package/dist/display/obv3.js.map +0 -1
- package/dist/display/parse.d.ts +0 -66
- package/dist/display/parse.d.ts.map +0 -1
- package/dist/display/parse.js +0 -104
- package/dist/display/parse.js.map +0 -1
- package/dist/display/subject.d.ts +0 -79
- package/dist/display/subject.d.ts.map +0 -1
- package/dist/display/subject.js +0 -124
- package/dist/display/subject.js.map +0 -1
- package/dist/display/text.d.ts +0 -53
- package/dist/display/text.d.ts.map +0 -1
- package/dist/display/text.js +0 -78
- package/dist/display/text.js.map +0 -1
- package/dist/display/types.d.ts +0 -55
- package/dist/display/types.d.ts.map +0 -1
- package/dist/display/types.js +0 -41
- package/dist/display/types.js.map +0 -1
- package/dist/display/validity.d.ts +0 -51
- package/dist/display/validity.d.ts.map +0 -1
- package/dist/display/validity.js +0 -51
- package/dist/display/validity.js.map +0 -1
- package/dist/display/verificationView.d.ts +0 -115
- package/dist/display/verificationView.d.ts.map +0 -1
- package/dist/display/verificationView.js +0 -199
- package/dist/display/verificationView.js.map +0 -1
- package/dist/resourceLog/append.d.ts +0 -112
- package/dist/resourceLog/append.d.ts.map +0 -1
- package/dist/resourceLog/append.js +0 -197
- package/dist/resourceLog/append.js.map +0 -1
- package/dist/resourceLog/entry.d.ts +0 -68
- package/dist/resourceLog/entry.d.ts.map +0 -1
- package/dist/resourceLog/entry.js +0 -167
- package/dist/resourceLog/entry.js.map +0 -1
- package/dist/resourceLog/pin.d.ts +0 -82
- package/dist/resourceLog/pin.d.ts.map +0 -1
- package/dist/resourceLog/pin.js +0 -57
- package/dist/resourceLog/pin.js.map +0 -1
- package/dist/resourceLog/seal.d.ts +0 -97
- package/dist/resourceLog/seal.d.ts.map +0 -1
- package/dist/resourceLog/seal.js +0 -113
- package/dist/resourceLog/seal.js.map +0 -1
- package/dist/resourceLog/verify.d.ts +0 -96
- package/dist/resourceLog/verify.d.ts.map +0 -1
- package/dist/resourceLog/verify.js +0 -474
- package/dist/resourceLog/verify.js.map +0 -1
- package/dist/resourceLog/vmFragment.d.ts +0 -33
- package/dist/resourceLog/vmFragment.d.ts.map +0 -1
- package/dist/resourceLog/vmFragment.js +0 -39
- package/dist/resourceLog/vmFragment.js.map +0 -1
package/dist/display/issuer.js
DELETED
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
import { typeArray } from '@interop/data-integrity-core/guards';
|
|
2
|
-
import { imageSourceFrom } from './image.js';
|
|
3
|
-
import { getSubject } from './subject.js';
|
|
4
|
-
import { asNonEmptyString } from './text.js';
|
|
5
|
-
/**
|
|
6
|
-
* Human-readable issuer string: the issuer object's `name`, else its `id`, else
|
|
7
|
-
* (for a string issuer) the DID string itself, else `'Unknown Issuer'`. Never
|
|
8
|
-
* returns `null`.
|
|
9
|
-
*
|
|
10
|
-
* @param credential {IVerifiableCredential}
|
|
11
|
-
* @returns {string}
|
|
12
|
-
*/
|
|
13
|
-
export function issuerName(credential) {
|
|
14
|
-
const { issuer } = credential;
|
|
15
|
-
if (typeof issuer === 'string') {
|
|
16
|
-
return issuer;
|
|
17
|
-
}
|
|
18
|
-
return issuer.name ?? issuer.id ?? 'Unknown Issuer';
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Maps a VC `issuer` to an all-string detail record (`id` / `name` / `url` /
|
|
22
|
-
* `image`), defaulting missing fields to `''`.
|
|
23
|
-
*
|
|
24
|
-
* @param issuer {IVerifiableCredential['issuer']}
|
|
25
|
-
* @returns {IssuerDetails}
|
|
26
|
-
*/
|
|
27
|
-
export function getIssuerDetails(issuer) {
|
|
28
|
-
if (typeof issuer === 'string') {
|
|
29
|
-
return { id: issuer, name: '', url: '', image: '' };
|
|
30
|
-
}
|
|
31
|
-
const imageRaw = issuer.image;
|
|
32
|
-
let image = '';
|
|
33
|
-
if (typeof imageRaw === 'string') {
|
|
34
|
-
image = imageRaw;
|
|
35
|
-
}
|
|
36
|
-
else if (imageRaw && typeof imageRaw === 'object' && 'id' in imageRaw) {
|
|
37
|
-
image = String(imageRaw.id ?? '');
|
|
38
|
-
}
|
|
39
|
-
return {
|
|
40
|
-
id: issuer.id ?? '',
|
|
41
|
-
name: issuer.name ?? '',
|
|
42
|
-
url: issuer.url ?? '',
|
|
43
|
-
image
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* The `credentialSubject.person.name` (SkillClaimCredential), used to override
|
|
48
|
-
* the issuer display name. `null` when absent or no credential is given.
|
|
49
|
-
*
|
|
50
|
-
* @param credential {IVerifiableCredential | undefined}
|
|
51
|
-
* @returns {string | null}
|
|
52
|
-
*/
|
|
53
|
-
export function personNameFromCredential(credential) {
|
|
54
|
-
if (!credential) {
|
|
55
|
-
return null;
|
|
56
|
-
}
|
|
57
|
-
const subject = getSubject(credential);
|
|
58
|
-
return (asNonEmptyString(subject?.person?.name) ?? null);
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Nullable issuer render fields derived from the VC `issuer` alone, with a
|
|
62
|
-
* SkillClaimCredential `person.name` override when a credential is supplied.
|
|
63
|
-
*
|
|
64
|
-
* @param issuer {IIssuerObject | string}
|
|
65
|
-
* @param credential {IVerifiableCredential | undefined}
|
|
66
|
-
* @returns {IssuerRenderInfo}
|
|
67
|
-
*/
|
|
68
|
-
export function issuerRenderInfoFrom(issuer, credential) {
|
|
69
|
-
const isSkillClaimCredential = credential
|
|
70
|
-
? typeArray(credential.type).includes('SkillClaimCredential')
|
|
71
|
-
: false;
|
|
72
|
-
const personName = isSkillClaimCredential
|
|
73
|
-
? personNameFromCredential(credential)
|
|
74
|
-
: null;
|
|
75
|
-
const issuerName = personName ?? (typeof issuer === 'string' ? issuer : issuer?.name) ?? null;
|
|
76
|
-
const issuerUrl = (typeof issuer === 'string' ? null : issuer?.url) ?? null;
|
|
77
|
-
const issuerId = typeof issuer === 'string' ? null : issuer?.id;
|
|
78
|
-
const issuerImage = typeof issuer === 'string'
|
|
79
|
-
? null
|
|
80
|
-
: imageSourceFrom(issuer.image);
|
|
81
|
-
return { issuerName, issuerUrl, issuerId, issuerImage };
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Like {@link issuerRenderInfoFrom} but overlays registry `federation_entity`
|
|
85
|
-
* metadata (organization name / homepage / logo) from the `registered_issuer`
|
|
86
|
-
* verification-log entry when the issuer matched the registry and there is no
|
|
87
|
-
* SkillClaimCredential person-name override.
|
|
88
|
-
*
|
|
89
|
-
* @param issuer {IIssuerObject | string}
|
|
90
|
-
* @param verifyResult {VerifyResultLike | undefined} verification result whose
|
|
91
|
-
* `log[]` may carry a `registered_issuer` match
|
|
92
|
-
* @param credential {IVerifiableCredential | undefined}
|
|
93
|
-
* @returns {IssuerRenderInfo}
|
|
94
|
-
*/
|
|
95
|
-
export function issuerRenderInfoWithVerification(issuer, verifyResult, credential) {
|
|
96
|
-
const isSkillClaimCredential = credential
|
|
97
|
-
? typeArray(credential.type).includes('SkillClaimCredential')
|
|
98
|
-
: false;
|
|
99
|
-
const personName = isSkillClaimCredential
|
|
100
|
-
? personNameFromCredential(credential)
|
|
101
|
-
: null;
|
|
102
|
-
const registeredIssuerLog = verifyResult?.log?.find(log => log.id === 'registered_issuer');
|
|
103
|
-
const matchingIssuer = registeredIssuerLog?.matchingIssuers?.[0];
|
|
104
|
-
if (matchingIssuer?.issuer?.federation_entity && !personName) {
|
|
105
|
-
const federationEntity = matchingIssuer.issuer.federation_entity;
|
|
106
|
-
return {
|
|
107
|
-
issuerName: federationEntity.organization_name ?? '',
|
|
108
|
-
issuerUrl: federationEntity.homepage_uri ?? '',
|
|
109
|
-
issuerId: typeof issuer === 'string' ? null : (issuer?.id ?? ''),
|
|
110
|
-
issuerImage: typeof issuer === 'object'
|
|
111
|
-
? imageSourceFrom(issuer.image)
|
|
112
|
-
: null
|
|
113
|
-
};
|
|
114
|
-
}
|
|
115
|
-
// Fallback to the plain issuer logic (or person name for SkillClaim).
|
|
116
|
-
const fallback = issuerRenderInfoFrom(issuer);
|
|
117
|
-
return {
|
|
118
|
-
issuerName: personName ?? fallback.issuerName ?? '',
|
|
119
|
-
issuerUrl: fallback.issuerUrl ?? '',
|
|
120
|
-
issuerId: fallback.issuerId ?? '',
|
|
121
|
-
issuerImage: matchingIssuer?.issuer?.federation_entity?.logo_uri ??
|
|
122
|
-
fallback.issuerImage ??
|
|
123
|
-
''
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
//# sourceMappingURL=issuer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"issuer.js","sourceRoot":"","sources":["../../src/display/issuer.ts"],"names":[],"mappings":"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"}
|
package/dist/display/obv3.d.ts
DELETED
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) 2026 Interop Alliance. All rights reserved.
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* Open Badges v3.0 subject helpers: normalizing the `achievement` / `skill`
|
|
6
|
-
* arrays and pulling out achievement images / types, the recipient name from an
|
|
7
|
-
* OBv3 `identifier`, and an image URL from an evidence list.
|
|
8
|
-
*
|
|
9
|
-
* Drift resolution: DCW open-coded the achievement/skill array handling inline
|
|
10
|
-
* inside its subject render mapper, while Freewallet had these as explicit,
|
|
11
|
-
* separately-tested helpers -- Freewallet's factored helpers win. DCW's
|
|
12
|
-
* standalone `extractNameFromOBV3Identifier` is kept verbatim (it has its own
|
|
13
|
-
* test and is used as a fallback branch by the subject render mapper).
|
|
14
|
-
*/
|
|
15
|
-
import type { IAchievement, ICredentialSubject, IOpenBadgeSubject } from '@interop/data-integrity-core';
|
|
16
|
-
/**
|
|
17
|
-
* The recipient display name carried in an OBv3 `identifier` entry: the
|
|
18
|
-
* `identityHash` of the first identifier that has one and is not marked
|
|
19
|
-
* `hashed: true`. Returns `undefined` when no such identifier is present.
|
|
20
|
-
*
|
|
21
|
-
* Note: unlike the name-guarded path in `extractIssuedTo`, this returns the
|
|
22
|
-
* hash of ANY identifier (regardless of `identityType`), matching DCW's
|
|
23
|
-
* historical behavior. Callers wanting only name-typed identifiers use
|
|
24
|
-
* `extractIssuedTo`.
|
|
25
|
-
*
|
|
26
|
-
* Non-object entries in the `identifier` array (a `null`, a bare string) are
|
|
27
|
-
* skipped rather than dereferenced.
|
|
28
|
-
*
|
|
29
|
-
* @param credentialSubject {IOpenBadgeSubject | ICredentialSubject}
|
|
30
|
-
* @returns {string | undefined}
|
|
31
|
-
*/
|
|
32
|
-
export declare function extractNameFromOBV3Identifier(credentialSubject: IOpenBadgeSubject | ICredentialSubject): string | undefined;
|
|
33
|
-
/**
|
|
34
|
-
* Normalizes a subject's `achievement` field to an array of records (a single
|
|
35
|
-
* achievement object is wrapped; a missing one yields `[]`). Non-object entries
|
|
36
|
-
* are dropped, so callers can read each achievement's fields directly.
|
|
37
|
-
*
|
|
38
|
-
* @param subject {Record<string, unknown>}
|
|
39
|
-
* @returns {Record<string, unknown>[]}
|
|
40
|
-
*/
|
|
41
|
-
export declare function achievementsList(subject: Record<string, unknown>): Record<string, unknown>[];
|
|
42
|
-
/**
|
|
43
|
-
* Normalizes a subject's `skill` field to an array of records (a single skill
|
|
44
|
-
* object is wrapped; a missing one yields `[]`). Non-object entries are
|
|
45
|
-
* dropped, so callers can read each skill's fields directly.
|
|
46
|
-
*
|
|
47
|
-
* @param subject {Record<string, unknown>}
|
|
48
|
-
* @returns {Record<string, unknown>[]}
|
|
49
|
-
*/
|
|
50
|
-
export declare function skillsList(subject: Record<string, unknown>): Record<string, unknown>[];
|
|
51
|
-
/**
|
|
52
|
-
* The image URL of the first skill in a list: an object image's `id`, or a
|
|
53
|
-
* string image, else `''`.
|
|
54
|
-
*
|
|
55
|
-
* @param skills {Record<string, unknown>[]}
|
|
56
|
-
* @returns {string}
|
|
57
|
-
*/
|
|
58
|
-
export declare function getSkillImage(skills: Record<string, unknown>[]): string;
|
|
59
|
-
/**
|
|
60
|
-
* The `id` (URL) of the first evidence item that looks like an image -- either
|
|
61
|
-
* its `id` or `name` ends in a known image extension -- else `''`.
|
|
62
|
-
*
|
|
63
|
-
* @param evidence {unknown[]}
|
|
64
|
-
* @returns {string}
|
|
65
|
-
*/
|
|
66
|
-
export declare function getEvidenceImage(evidence: unknown[]): string;
|
|
67
|
-
/**
|
|
68
|
-
* The achievement's image URL: a string image directly, or an object image's
|
|
69
|
-
* `id`, else `''`.
|
|
70
|
-
*
|
|
71
|
-
* @param primaryAchievement {IAchievement | undefined}
|
|
72
|
-
* @returns {string}
|
|
73
|
-
*/
|
|
74
|
-
export declare function getAchievementImage(primaryAchievement?: IAchievement): string;
|
|
75
|
-
/**
|
|
76
|
-
* The achievement's `achievementType` when it is a string, else `''`.
|
|
77
|
-
*
|
|
78
|
-
* @param primaryAchievement {IAchievement | undefined}
|
|
79
|
-
* @returns {string}
|
|
80
|
-
*/
|
|
81
|
-
export declare function getAchievementType(primaryAchievement?: IAchievement): string;
|
|
82
|
-
//# sourceMappingURL=obv3.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"obv3.d.ts","sourceRoot":"","sources":["../../src/display/obv3.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EACV,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,EAClB,MAAM,8BAA8B,CAAA;AAGrC;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,6BAA6B,CAC3C,iBAAiB,EAAE,iBAAiB,GAAG,kBAAkB,GACxD,MAAM,GAAG,SAAS,CAcpB;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAE3B;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAE3B;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,MAAM,CAUvE;AAID;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAa5D;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,kBAAkB,CAAC,EAAE,YAAY,GAAG,MAAM,CAQ7E;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,kBAAkB,CAAC,EAAE,YAAY,GAAG,MAAM,CAK5E"}
|
package/dist/display/obv3.js
DELETED
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
import { asRecord, getTrimmedString, recordList } from './text.js';
|
|
2
|
-
/**
|
|
3
|
-
* The recipient display name carried in an OBv3 `identifier` entry: the
|
|
4
|
-
* `identityHash` of the first identifier that has one and is not marked
|
|
5
|
-
* `hashed: true`. Returns `undefined` when no such identifier is present.
|
|
6
|
-
*
|
|
7
|
-
* Note: unlike the name-guarded path in `extractIssuedTo`, this returns the
|
|
8
|
-
* hash of ANY identifier (regardless of `identityType`), matching DCW's
|
|
9
|
-
* historical behavior. Callers wanting only name-typed identifiers use
|
|
10
|
-
* `extractIssuedTo`.
|
|
11
|
-
*
|
|
12
|
-
* Non-object entries in the `identifier` array (a `null`, a bare string) are
|
|
13
|
-
* skipped rather than dereferenced.
|
|
14
|
-
*
|
|
15
|
-
* @param credentialSubject {IOpenBadgeSubject | ICredentialSubject}
|
|
16
|
-
* @returns {string | undefined}
|
|
17
|
-
*/
|
|
18
|
-
export function extractNameFromOBV3Identifier(credentialSubject) {
|
|
19
|
-
if (!credentialSubject?.identifier) {
|
|
20
|
-
return undefined;
|
|
21
|
-
}
|
|
22
|
-
const identifiers = recordList(credentialSubject.identifier);
|
|
23
|
-
const identifierWithHash = identifiers.find(identifier => identifier.identityHash &&
|
|
24
|
-
(identifier.hashed === false || identifier.hashed === undefined));
|
|
25
|
-
return getTrimmedString(identifierWithHash?.identityHash) || undefined;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Normalizes a subject's `achievement` field to an array of records (a single
|
|
29
|
-
* achievement object is wrapped; a missing one yields `[]`). Non-object entries
|
|
30
|
-
* are dropped, so callers can read each achievement's fields directly.
|
|
31
|
-
*
|
|
32
|
-
* @param subject {Record<string, unknown>}
|
|
33
|
-
* @returns {Record<string, unknown>[]}
|
|
34
|
-
*/
|
|
35
|
-
export function achievementsList(subject) {
|
|
36
|
-
return recordList(subject?.achievement);
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Normalizes a subject's `skill` field to an array of records (a single skill
|
|
40
|
-
* object is wrapped; a missing one yields `[]`). Non-object entries are
|
|
41
|
-
* dropped, so callers can read each skill's fields directly.
|
|
42
|
-
*
|
|
43
|
-
* @param subject {Record<string, unknown>}
|
|
44
|
-
* @returns {Record<string, unknown>[]}
|
|
45
|
-
*/
|
|
46
|
-
export function skillsList(subject) {
|
|
47
|
-
return recordList(subject?.skill);
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* The image URL of the first skill in a list: an object image's `id`, or a
|
|
51
|
-
* string image, else `''`.
|
|
52
|
-
*
|
|
53
|
-
* @param skills {Record<string, unknown>[]}
|
|
54
|
-
* @returns {string}
|
|
55
|
-
*/
|
|
56
|
-
export function getSkillImage(skills) {
|
|
57
|
-
const first = skills[0];
|
|
58
|
-
if (!first) {
|
|
59
|
-
return '';
|
|
60
|
-
}
|
|
61
|
-
const image = asRecord(first.image);
|
|
62
|
-
if (image) {
|
|
63
|
-
return getTrimmedString(image.id);
|
|
64
|
-
}
|
|
65
|
-
return getTrimmedString(first.image);
|
|
66
|
-
}
|
|
67
|
-
const IMAGE_EXTENSION_RE = /\.(jpe?g|png|gif|webp|svg|avif)(\?|$)/i;
|
|
68
|
-
/**
|
|
69
|
-
* The `id` (URL) of the first evidence item that looks like an image -- either
|
|
70
|
-
* its `id` or `name` ends in a known image extension -- else `''`.
|
|
71
|
-
*
|
|
72
|
-
* @param evidence {unknown[]}
|
|
73
|
-
* @returns {string}
|
|
74
|
-
*/
|
|
75
|
-
export function getEvidenceImage(evidence) {
|
|
76
|
-
for (const ev of evidence) {
|
|
77
|
-
const item = asRecord(ev);
|
|
78
|
-
if (!item) {
|
|
79
|
-
continue;
|
|
80
|
-
}
|
|
81
|
-
const id = getTrimmedString(item.id);
|
|
82
|
-
const name = getTrimmedString(item.name);
|
|
83
|
-
if (id && (IMAGE_EXTENSION_RE.test(id) || IMAGE_EXTENSION_RE.test(name))) {
|
|
84
|
-
return id;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
return '';
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* The achievement's image URL: a string image directly, or an object image's
|
|
91
|
-
* `id`, else `''`.
|
|
92
|
-
*
|
|
93
|
-
* @param primaryAchievement {IAchievement | undefined}
|
|
94
|
-
* @returns {string}
|
|
95
|
-
*/
|
|
96
|
-
export function getAchievementImage(primaryAchievement) {
|
|
97
|
-
if (!primaryAchievement?.image) {
|
|
98
|
-
return '';
|
|
99
|
-
}
|
|
100
|
-
if (typeof primaryAchievement.image === 'string') {
|
|
101
|
-
return primaryAchievement.image;
|
|
102
|
-
}
|
|
103
|
-
return primaryAchievement.image.id ?? '';
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* The achievement's `achievementType` when it is a string, else `''`.
|
|
107
|
-
*
|
|
108
|
-
* @param primaryAchievement {IAchievement | undefined}
|
|
109
|
-
* @returns {string}
|
|
110
|
-
*/
|
|
111
|
-
export function getAchievementType(primaryAchievement) {
|
|
112
|
-
if (typeof primaryAchievement?.achievementType === 'string') {
|
|
113
|
-
return primaryAchievement.achievementType;
|
|
114
|
-
}
|
|
115
|
-
return '';
|
|
116
|
-
}
|
|
117
|
-
//# sourceMappingURL=obv3.js.map
|
package/dist/display/obv3.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"obv3.js","sourceRoot":"","sources":["../../src/display/obv3.ts"],"names":[],"mappings":"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"}
|
package/dist/display/parse.d.ts
DELETED
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) 2026 Interop Alliance. All rights reserved.
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* Credential input parsing: turning decoded JSON (or a raw user / QR string)
|
|
6
|
-
* into an array of Verifiable Credentials. File reading and network transport
|
|
7
|
-
* stay app-side -- `resolveCredentialsInput` takes an injected `fetchUrl` so the
|
|
8
|
-
* library never imports an HTTP client (DCW passes its `fetchWithTimeout`,
|
|
9
|
-
* Freewallet its CORS-proxy `fetchFromURL`).
|
|
10
|
-
*
|
|
11
|
-
* Drift resolution: `credentialsFromJSON` (Freewallet) and
|
|
12
|
-
* `extractCredentialsFrom` (DCW) both survive -- the former accepts an array /
|
|
13
|
-
* a bare VC / a VP wrapper from a JSON string, the latter routes an
|
|
14
|
-
* already-decoded object. Both now share the data-integrity-core shape guards
|
|
15
|
-
* instead of open-coding the `type` checks. Freewallet's
|
|
16
|
-
* `ResolveCredentialsInputError` code taxonomy is kept; DCW's
|
|
17
|
-
* `VPQR_UNSUPPORTED_MESSAGE` constant is exported for apps that surface it.
|
|
18
|
-
*/
|
|
19
|
-
import type { IVerifiableCredential, IVerifiablePresentation } from '@interop/data-integrity-core';
|
|
20
|
-
/**
|
|
21
|
-
* Message DCW surfaced for the (now unsupported) VPQR `VP1-` input.
|
|
22
|
-
*/
|
|
23
|
-
export declare const VPQR_UNSUPPORTED_MESSAGE = "VPQR encoded credentials are not supported.";
|
|
24
|
-
/**
|
|
25
|
-
* Coded failure of {@link resolveCredentialsInput}.
|
|
26
|
-
*/
|
|
27
|
-
export declare class ResolveCredentialsInputError extends Error {
|
|
28
|
-
readonly code: 'empty' | 'invalid_input' | 'none_found' | 'vpqr_unsupported';
|
|
29
|
-
constructor(code: 'empty' | 'invalid_input' | 'none_found' | 'vpqr_unsupported');
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Decodes one or more Verifiable Credentials from a JSON string: an array of
|
|
33
|
-
* VCs (non-credential entries filtered out), a Verifiable Presentation wrapping
|
|
34
|
-
* one or many credentials, or a single VC object. Throws when nothing decodes.
|
|
35
|
-
*
|
|
36
|
-
* @param text {string}
|
|
37
|
-
* @returns {IVerifiableCredential[]}
|
|
38
|
-
*/
|
|
39
|
-
export declare function credentialsFromJSON(text: string): IVerifiableCredential[];
|
|
40
|
-
/**
|
|
41
|
-
* Extracts the VCs from an already-decoded object: a bare VC becomes a
|
|
42
|
-
* single-element array, a VP yields its `verifiableCredential` (VC-vs-VP
|
|
43
|
-
* detection runs the VC check first), anything else yields `null`.
|
|
44
|
-
*
|
|
45
|
-
* @param obj {IVerifiableCredential | IVerifiablePresentation}
|
|
46
|
-
* @returns {IVerifiableCredential[] | null}
|
|
47
|
-
*/
|
|
48
|
-
export declare function extractCredentialsFrom(obj: IVerifiableCredential | IVerifiablePresentation): IVerifiableCredential[] | null;
|
|
49
|
-
/**
|
|
50
|
-
* Normalizes raw user / QR input into an array of VCs. A URL (http/https) is
|
|
51
|
-
* fetched via the injected `fetchUrl` and its body parsed; raw JSON / JSON-LD
|
|
52
|
-
* (`{` or `[`) is parsed directly; a `VP1-` (VPQR) prefix is detected but not
|
|
53
|
-
* supported. Throws a coded {@link ResolveCredentialsInputError} on each
|
|
54
|
-
* failure path.
|
|
55
|
-
*
|
|
56
|
-
* @param options {object}
|
|
57
|
-
* @param options.raw {string} the raw input text
|
|
58
|
-
* @param options.fetchUrl {(url: string) => Promise<string>} fetches a URL's
|
|
59
|
-
* body text (app-provided transport)
|
|
60
|
-
* @returns {Promise<IVerifiableCredential[]>}
|
|
61
|
-
*/
|
|
62
|
-
export declare function resolveCredentialsInput({ raw, fetchUrl }: {
|
|
63
|
-
raw: string;
|
|
64
|
-
fetchUrl: (url: string) => Promise<string>;
|
|
65
|
-
}): Promise<IVerifiableCredential[]>;
|
|
66
|
-
//# sourceMappingURL=parse.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../src/display/parse.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EACV,qBAAqB,EACrB,uBAAuB,EACxB,MAAM,8BAA8B,CAAA;AAMrC;;GAEG;AACH,eAAO,MAAM,wBAAwB,gDACU,CAAA;AAE/C;;GAEG;AACH,qBAAa,4BAA6B,SAAQ,KAAK;IACrD,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,eAAe,GAAG,YAAY,GAAG,kBAAkB,CAAA;gBAE1E,IAAI,EAAE,OAAO,GAAG,eAAe,GAAG,YAAY,GAAG,kBAAkB;CAMtE;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,qBAAqB,EAAE,CA0BzE;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,qBAAqB,GAAG,uBAAuB,GACnD,qBAAqB,EAAE,GAAG,IAAI,CAYhC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,uBAAuB,CAAC,EAC5C,GAAG,EACH,QAAQ,EACT,EAAE;IACD,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;CAC3C,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAwBnC"}
|
package/dist/display/parse.js
DELETED
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
import { isVerifiableCredential, isVerifiablePresentation } from '@interop/data-integrity-core/guards';
|
|
2
|
-
/**
|
|
3
|
-
* Message DCW surfaced for the (now unsupported) VPQR `VP1-` input.
|
|
4
|
-
*/
|
|
5
|
-
export const VPQR_UNSUPPORTED_MESSAGE = 'VPQR encoded credentials are not supported.';
|
|
6
|
-
/**
|
|
7
|
-
* Coded failure of {@link resolveCredentialsInput}.
|
|
8
|
-
*/
|
|
9
|
-
export class ResolveCredentialsInputError extends Error {
|
|
10
|
-
code;
|
|
11
|
-
constructor(code) {
|
|
12
|
-
super(code);
|
|
13
|
-
this.name = 'ResolveCredentialsInputError';
|
|
14
|
-
this.code = code;
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Decodes one or more Verifiable Credentials from a JSON string: an array of
|
|
19
|
-
* VCs (non-credential entries filtered out), a Verifiable Presentation wrapping
|
|
20
|
-
* one or many credentials, or a single VC object. Throws when nothing decodes.
|
|
21
|
-
*
|
|
22
|
-
* @param text {string}
|
|
23
|
-
* @returns {IVerifiableCredential[]}
|
|
24
|
-
*/
|
|
25
|
-
export function credentialsFromJSON(text) {
|
|
26
|
-
const data = JSON.parse(text);
|
|
27
|
-
if (Array.isArray(data)) {
|
|
28
|
-
const vcs = data.filter(item => isVerifiableCredential(item));
|
|
29
|
-
if (vcs.length > 0) {
|
|
30
|
-
return vcs;
|
|
31
|
-
}
|
|
32
|
-
throw new Error('Array did not contain any Verifiable Credentials.');
|
|
33
|
-
}
|
|
34
|
-
if (isVerifiablePresentation(data) &&
|
|
35
|
-
data &&
|
|
36
|
-
typeof data === 'object' &&
|
|
37
|
-
'verifiableCredential' in data) {
|
|
38
|
-
const wrapped = data.verifiableCredential;
|
|
39
|
-
return Array.isArray(wrapped) ? wrapped : [wrapped];
|
|
40
|
-
}
|
|
41
|
-
if (isVerifiableCredential(data)) {
|
|
42
|
-
return [data];
|
|
43
|
-
}
|
|
44
|
-
throw new Error('Could not decode Verifiable Credential(s) from the JSON.');
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Extracts the VCs from an already-decoded object: a bare VC becomes a
|
|
48
|
-
* single-element array, a VP yields its `verifiableCredential` (VC-vs-VP
|
|
49
|
-
* detection runs the VC check first), anything else yields `null`.
|
|
50
|
-
*
|
|
51
|
-
* @param obj {IVerifiableCredential | IVerifiablePresentation}
|
|
52
|
-
* @returns {IVerifiableCredential[] | null}
|
|
53
|
-
*/
|
|
54
|
-
export function extractCredentialsFrom(obj) {
|
|
55
|
-
if (isVerifiableCredential(obj)) {
|
|
56
|
-
return [obj];
|
|
57
|
-
}
|
|
58
|
-
if (isVerifiablePresentation(obj) && 'verifiableCredential' in obj) {
|
|
59
|
-
const verifiableCredential = obj.verifiableCredential;
|
|
60
|
-
if (Array.isArray(verifiableCredential)) {
|
|
61
|
-
return verifiableCredential;
|
|
62
|
-
}
|
|
63
|
-
return [verifiableCredential];
|
|
64
|
-
}
|
|
65
|
-
return null;
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Normalizes raw user / QR input into an array of VCs. A URL (http/https) is
|
|
69
|
-
* fetched via the injected `fetchUrl` and its body parsed; raw JSON / JSON-LD
|
|
70
|
-
* (`{` or `[`) is parsed directly; a `VP1-` (VPQR) prefix is detected but not
|
|
71
|
-
* supported. Throws a coded {@link ResolveCredentialsInputError} on each
|
|
72
|
-
* failure path.
|
|
73
|
-
*
|
|
74
|
-
* @param options {object}
|
|
75
|
-
* @param options.raw {string} the raw input text
|
|
76
|
-
* @param options.fetchUrl {(url: string) => Promise<string>} fetches a URL's
|
|
77
|
-
* body text (app-provided transport)
|
|
78
|
-
* @returns {Promise<IVerifiableCredential[]>}
|
|
79
|
-
*/
|
|
80
|
-
export async function resolveCredentialsInput({ raw, fetchUrl }) {
|
|
81
|
-
const trimmed = raw.trimStart();
|
|
82
|
-
if (!trimmed) {
|
|
83
|
-
throw new ResolveCredentialsInputError('empty');
|
|
84
|
-
}
|
|
85
|
-
let credentials;
|
|
86
|
-
if (trimmed.startsWith('http://') || trimmed.startsWith('https://')) {
|
|
87
|
-
const jsonText = await fetchUrl(trimmed.trim());
|
|
88
|
-
credentials = credentialsFromJSON(jsonText);
|
|
89
|
-
}
|
|
90
|
-
else if (trimmed.startsWith('{') || trimmed.startsWith('[')) {
|
|
91
|
-
credentials = credentialsFromJSON(trimmed);
|
|
92
|
-
}
|
|
93
|
-
else if (trimmed.startsWith('VP1-')) {
|
|
94
|
-
throw new ResolveCredentialsInputError('vpqr_unsupported');
|
|
95
|
-
}
|
|
96
|
-
else {
|
|
97
|
-
throw new ResolveCredentialsInputError('invalid_input');
|
|
98
|
-
}
|
|
99
|
-
if (credentials.length === 0) {
|
|
100
|
-
throw new ResolveCredentialsInputError('none_found');
|
|
101
|
-
}
|
|
102
|
-
return credentials;
|
|
103
|
-
}
|
|
104
|
-
//# sourceMappingURL=parse.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/display/parse.ts"],"names":[],"mappings":"AAsBA,OAAO,EACL,sBAAsB,EACtB,wBAAwB,EACzB,MAAM,qCAAqC,CAAA;AAE5C;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GACnC,6CAA6C,CAAA;AAE/C;;GAEG;AACH,MAAM,OAAO,4BAA6B,SAAQ,KAAK;IAC5C,IAAI,CAA+D;IAC5E,YACE,IAAmE;QAEnE,KAAK,CAAC,IAAI,CAAC,CAAA;QACX,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAA;QAC1C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;CACF;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAE7B,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAA;QAC7D,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnB,OAAO,GAAG,CAAA;QACZ,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAA;IACtE,CAAC;IAED,IACE,wBAAwB,CAAC,IAAI,CAAC;QAC9B,IAAI;QACJ,OAAO,IAAI,KAAK,QAAQ;QACxB,sBAAsB,IAAI,IAAI,EAC9B,CAAC;QACD,MAAM,OAAO,GAAI,IAAgC,CAAC,oBAAqB,CAAA;QACvE,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;IACrD,CAAC;IAED,IAAI,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,CAAA;IACf,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAA;AAC7E,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CACpC,GAAoD;IAEpD,IAAI,sBAAsB,CAAC,GAAG,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,CAAA;IACd,CAAC;IACD,IAAI,wBAAwB,CAAC,GAAG,CAAC,IAAI,sBAAsB,IAAI,GAAG,EAAE,CAAC;QACnE,MAAM,oBAAoB,GAAG,GAAG,CAAC,oBAAqB,CAAA;QACtD,IAAI,KAAK,CAAC,OAAO,CAAC,oBAAoB,CAAC,EAAE,CAAC;YACxC,OAAO,oBAAoB,CAAA;QAC7B,CAAC;QACD,OAAO,CAAC,oBAAoB,CAAC,CAAA;IAC/B,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,EAC5C,GAAG,EACH,QAAQ,EAIT;IACC,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,EAAE,CAAA;IAC/B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,4BAA4B,CAAC,OAAO,CAAC,CAAA;IACjD,CAAC;IAED,IAAI,WAAoC,CAAA;IAExC,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACpE,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;QAC/C,WAAW,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAA;IAC7C,CAAC;SAAM,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9D,WAAW,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAA;IAC5C,CAAC;SAAM,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,4BAA4B,CAAC,kBAAkB,CAAC,CAAA;IAC5D,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,4BAA4B,CAAC,eAAe,CAAC,CAAA;IACzD,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,4BAA4B,CAAC,YAAY,CAAC,CAAA;IACtD,CAAC;IAED,OAAO,WAAW,CAAA;AACpB,CAAC"}
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) 2026 Interop Alliance. All rights reserved.
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* Credential-subject readers: pulling the (first) subject out of a VC, deriving
|
|
6
|
-
* the recipient display name, and projecting the OBv3-flavored subject render
|
|
7
|
-
* fields.
|
|
8
|
-
*
|
|
9
|
-
* Drift resolution:
|
|
10
|
-
* - `getSubject` was identical in both apps -- take either.
|
|
11
|
-
* - Recipient-name resolution DIVERGED. Freewallet's `extractIssuedTo` +
|
|
12
|
-
* `resolvePersonFullName` win as the vc-level recipient resolver: they walk a
|
|
13
|
-
* deeper person/contact structure (`person.contact.fullName`, string
|
|
14
|
-
* `person.name`, `person.name.formattedName` / `.name`, `subject.name`) and
|
|
15
|
-
* guard the OBv3 identifier on `identityType === 'name'` (more correct than
|
|
16
|
-
* DCW's "any identityHash").
|
|
17
|
-
* - `credentialSubjectRenderInfo` keeps DCW's subject-level shape and field set
|
|
18
|
-
* (used by the OBv3 card renderer) but returns RAW `startDate` / `endDate`
|
|
19
|
-
* ISO strings instead of moment-formatted `startDateFmt` / `endDateFmt` (the
|
|
20
|
-
* raw-values seam); each app re-applies its own date formatting.
|
|
21
|
-
*/
|
|
22
|
-
import type { IAlignment, ICredentialSubject, IVerifiableCredential } from '@interop/data-integrity-core';
|
|
23
|
-
/**
|
|
24
|
-
* The subject render fields for the credential detail / card view. All dates
|
|
25
|
-
* are RAW ISO strings; the app formats them.
|
|
26
|
-
*/
|
|
27
|
-
export interface SubjectRenderInfo {
|
|
28
|
-
subjectName: string | null;
|
|
29
|
-
issuedTo: string | null;
|
|
30
|
-
degreeName: string | null;
|
|
31
|
-
description: string | null;
|
|
32
|
-
criteria: string | null;
|
|
33
|
-
numberOfCredits: string | null;
|
|
34
|
-
startDate: string | null;
|
|
35
|
-
endDate: string | null;
|
|
36
|
-
achievementImage: string | null;
|
|
37
|
-
achievementType: string | null;
|
|
38
|
-
alignment: IAlignment[] | undefined;
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* The (first) credential subject. Partially supports VCs with multiple
|
|
42
|
-
* `credentialSubject` entries by picking the first one.
|
|
43
|
-
*
|
|
44
|
-
* @param vc {IVerifiableCredential}
|
|
45
|
-
* @returns {ICredentialSubject}
|
|
46
|
-
*/
|
|
47
|
-
export declare function getSubject(vc: IVerifiableCredential): ICredentialSubject;
|
|
48
|
-
/**
|
|
49
|
-
* Resolves a display name from a subject's person / contact structure, in
|
|
50
|
-
* order: `person.contact.fullName`, a string `person.name`, an object
|
|
51
|
-
* `person.name.formattedName`, `person.name.name`, then `subject.name`.
|
|
52
|
-
* Returns `''` when none is present.
|
|
53
|
-
*
|
|
54
|
-
* @param subject {Record<string, unknown>}
|
|
55
|
-
* @returns {string}
|
|
56
|
-
*/
|
|
57
|
-
export declare function resolvePersonFullName(subject: Record<string, unknown>): string;
|
|
58
|
-
/**
|
|
59
|
-
* The recipient name a credential was issued to: the resolved person full name,
|
|
60
|
-
* else a name-typed OBv3 `identifier` hash, else the top-level credential
|
|
61
|
-
* `name`. Returns `''` when nothing resolves.
|
|
62
|
-
*
|
|
63
|
-
* @param verifiableCredential {IVerifiableCredential}
|
|
64
|
-
* @returns {string}
|
|
65
|
-
*/
|
|
66
|
-
export declare function extractIssuedTo(verifiableCredential: IVerifiableCredential): string;
|
|
67
|
-
/**
|
|
68
|
-
* Projects a credential subject to the render fields used by the OBv3 card /
|
|
69
|
-
* detail view. Dates are RAW ISO strings (see {@link SubjectRenderInfo}).
|
|
70
|
-
*
|
|
71
|
-
* Every field is read through a shape guard: a missing, primitive, or
|
|
72
|
-
* array-shaped subject (and a `degree` / `achievement` of any shape) renders
|
|
73
|
-
* the all-null fallback instead of throwing.
|
|
74
|
-
*
|
|
75
|
-
* @param credentialSubject {ICredentialSubject}
|
|
76
|
-
* @returns {SubjectRenderInfo}
|
|
77
|
-
*/
|
|
78
|
-
export declare function credentialSubjectRenderInfo(credentialSubject: ICredentialSubject): SubjectRenderInfo;
|
|
79
|
-
//# sourceMappingURL=subject.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"subject.d.ts","sourceRoot":"","sources":["../../src/display/subject.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,EAEV,UAAU,EACV,kBAAkB,EAClB,qBAAqB,EACtB,MAAM,8BAA8B,CAAA;AAKrC;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,SAAS,EAAE,UAAU,EAAE,GAAG,SAAS,CAAA;CACpC;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,qBAAqB,GAAG,kBAAkB,CAMxE;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,MAAM,CA4BR;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,oBAAoB,EAAE,qBAAqB,GAC1C,MAAM,CAyBR;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,2BAA2B,CACzC,iBAAiB,EAAE,kBAAkB,GACpC,iBAAiB,CA+CnB"}
|