@sphereon/oid4vci-common 0.10.3 → 0.10.4-next.119

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/dist/events/index.d.ts +17 -0
  2. package/dist/events/index.d.ts.map +1 -0
  3. package/dist/events/index.js +21 -0
  4. package/dist/events/index.js.map +1 -0
  5. package/dist/experimental/holder-vci.d.ts +13 -0
  6. package/dist/experimental/holder-vci.d.ts.map +1 -0
  7. package/dist/experimental/holder-vci.js +9 -0
  8. package/dist/experimental/holder-vci.js.map +1 -0
  9. package/dist/functions/CredentialOfferUtil.d.ts +3 -3
  10. package/dist/functions/CredentialOfferUtil.d.ts.map +1 -1
  11. package/dist/functions/CredentialOfferUtil.js +71 -28
  12. package/dist/functions/CredentialOfferUtil.js.map +1 -1
  13. package/dist/functions/CredentialRequestUtil.d.ts +3 -3
  14. package/dist/functions/CredentialRequestUtil.d.ts.map +1 -1
  15. package/dist/functions/CredentialRequestUtil.js +13 -4
  16. package/dist/functions/CredentialRequestUtil.js.map +1 -1
  17. package/dist/functions/CredentialResponseUtil.d.ts +3 -1
  18. package/dist/functions/CredentialResponseUtil.d.ts.map +1 -1
  19. package/dist/functions/CredentialResponseUtil.js +1 -1
  20. package/dist/functions/CredentialResponseUtil.js.map +1 -1
  21. package/dist/functions/Encoding.d.ts +7 -6
  22. package/dist/functions/Encoding.d.ts.map +1 -1
  23. package/dist/functions/Encoding.js +9 -8
  24. package/dist/functions/Encoding.js.map +1 -1
  25. package/dist/functions/IssuerMetadataUtils.d.ts +19 -12
  26. package/dist/functions/IssuerMetadataUtils.d.ts.map +1 -1
  27. package/dist/functions/IssuerMetadataUtils.js +155 -88
  28. package/dist/functions/IssuerMetadataUtils.js.map +1 -1
  29. package/dist/functions/ProofUtil.d.ts +38 -0
  30. package/dist/functions/ProofUtil.d.ts.map +1 -0
  31. package/dist/functions/ProofUtil.js +141 -0
  32. package/dist/functions/ProofUtil.js.map +1 -0
  33. package/dist/functions/index.d.ts +1 -0
  34. package/dist/functions/index.d.ts.map +1 -1
  35. package/dist/functions/index.js +1 -0
  36. package/dist/functions/index.js.map +1 -1
  37. package/dist/index.d.ts +5 -0
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +6 -0
  40. package/dist/index.js.map +1 -1
  41. package/dist/types/Authorization.types.d.ts +26 -4
  42. package/dist/types/Authorization.types.d.ts.map +1 -1
  43. package/dist/types/Authorization.types.js +7 -1
  44. package/dist/types/Authorization.types.js.map +1 -1
  45. package/dist/types/CredentialIssuance.types.d.ts +17 -10
  46. package/dist/types/CredentialIssuance.types.d.ts.map +1 -1
  47. package/dist/types/CredentialIssuance.types.js.map +1 -1
  48. package/dist/types/Generic.types.d.ts +104 -17
  49. package/dist/types/Generic.types.d.ts.map +1 -1
  50. package/dist/types/Generic.types.js.map +1 -1
  51. package/dist/types/OpenID4VCIErrors.d.ts +1 -0
  52. package/dist/types/OpenID4VCIErrors.d.ts.map +1 -1
  53. package/dist/types/OpenID4VCIErrors.js +2 -1
  54. package/dist/types/OpenID4VCIErrors.js.map +1 -1
  55. package/dist/types/OpenID4VCIVersions.types.d.ts +1 -0
  56. package/dist/types/OpenID4VCIVersions.types.d.ts.map +1 -1
  57. package/dist/types/OpenID4VCIVersions.types.js +1 -0
  58. package/dist/types/OpenID4VCIVersions.types.js.map +1 -1
  59. package/dist/types/ServerMetadata.d.ts +0 -7
  60. package/dist/types/ServerMetadata.d.ts.map +1 -1
  61. package/dist/types/ServerMetadata.js.map +1 -1
  62. package/dist/types/StateManager.types.d.ts +1 -0
  63. package/dist/types/StateManager.types.d.ts.map +1 -1
  64. package/dist/types/StateManager.types.js.map +1 -1
  65. package/dist/types/index.d.ts +1 -0
  66. package/dist/types/index.d.ts.map +1 -1
  67. package/dist/types/index.js +1 -0
  68. package/dist/types/index.js.map +1 -1
  69. package/dist/types/v1_0_11.types.d.ts +35 -5
  70. package/dist/types/v1_0_11.types.d.ts.map +1 -1
  71. package/dist/types/v1_0_11.types.js.map +1 -1
  72. package/dist/types/v1_0_12.types.d.ts +30 -1
  73. package/dist/types/v1_0_12.types.d.ts.map +1 -1
  74. package/dist/types/v1_0_13.types.d.ts +120 -0
  75. package/dist/types/v1_0_13.types.d.ts.map +1 -0
  76. package/dist/types/v1_0_13.types.js +3 -0
  77. package/dist/types/v1_0_13.types.js.map +1 -0
  78. package/lib/__tests__/CredentialOfferUtil.spec.ts +25 -9
  79. package/lib/__tests__/IssuerMetadataUtils.spec.ts +38 -0
  80. package/lib/events/index.ts +20 -0
  81. package/lib/experimental/holder-vci.ts +19 -0
  82. package/lib/functions/CredentialOfferUtil.ts +78 -26
  83. package/lib/functions/CredentialRequestUtil.ts +23 -8
  84. package/lib/functions/CredentialResponseUtil.ts +4 -4
  85. package/lib/functions/Encoding.ts +10 -8
  86. package/lib/functions/IssuerMetadataUtils.ts +164 -93
  87. package/lib/functions/ProofUtil.ts +185 -0
  88. package/lib/functions/index.ts +1 -0
  89. package/lib/index.ts +7 -0
  90. package/lib/types/Authorization.types.ts +31 -4
  91. package/lib/types/CredentialIssuance.types.ts +26 -10
  92. package/lib/types/Generic.types.ts +150 -27
  93. package/lib/types/OpenID4VCIErrors.ts +1 -0
  94. package/lib/types/OpenID4VCIVersions.types.ts +1 -0
  95. package/lib/types/ServerMetadata.ts +0 -10
  96. package/lib/types/StateManager.types.ts +1 -0
  97. package/lib/types/index.ts +1 -0
  98. package/lib/types/v1_0_11.types.ts +41 -4
  99. package/lib/types/v1_0_12.types.ts +39 -1
  100. package/lib/types/v1_0_13.types.ts +158 -0
  101. package/package.json +3 -11
@@ -1,6 +1,7 @@
1
1
  import Debug from 'debug';
2
2
  import jwtDecode, { JwtPayload } from 'jwt-decode';
3
3
 
4
+ import { VCI_LOG_COMMON } from '../index';
4
5
  import {
5
6
  AssertedUniformCredentialOffer,
6
7
  AuthzFlowType,
@@ -9,6 +10,7 @@ import {
9
10
  CredentialOfferPayloadV1_0_08,
10
11
  CredentialOfferPayloadV1_0_09,
11
12
  CredentialOfferPayloadV1_0_11,
13
+ CredentialOfferPayloadV1_0_13,
12
14
  DefaultURISchemes,
13
15
  Grant,
14
16
  GrantTypes,
@@ -24,22 +26,22 @@ import { getJson } from './HttpUtils';
24
26
  const debug = Debug('sphereon:oid4vci:offer');
25
27
 
26
28
  export function determineSpecVersionFromURI(uri: string): OpenId4VCIVersion {
27
- let version: OpenId4VCIVersion = OpenId4VCIVersion.VER_UNKNOWN;
28
-
29
- version = determineSpecVersionFromScheme(uri, version);
30
- version = getVersionFromURIParam(uri, version, OpenId4VCIVersion.VER_1_0_08, 'initiate_issuance');
31
- version = getVersionFromURIParam(uri, version, OpenId4VCIVersion.VER_1_0_08, 'credential_type');
32
- version = getVersionFromURIParam(uri, version, OpenId4VCIVersion.VER_1_0_08, 'op_state');
29
+ let version = determineSpecVersionFromScheme(uri, OpenId4VCIVersion.VER_UNKNOWN) ?? OpenId4VCIVersion.VER_UNKNOWN;
30
+ version = getVersionFromURIParam(uri, version, [OpenId4VCIVersion.VER_1_0_08], 'initiate_issuance');
31
+ version = getVersionFromURIParam(uri, version, [OpenId4VCIVersion.VER_1_0_08], 'credential_type');
32
+ version = getVersionFromURIParam(uri, version, [OpenId4VCIVersion.VER_1_0_08], 'op_state');
33
33
 
34
34
  // version = getVersionFromURIParam(uri, version, OpenId4VCIVersion.VER_1_0_09, 'credentials');
35
35
  // version = getVersionFromURIParam(uri, version, OpenId4VCIVersion.VER_1_0_09, 'initiate_issuance_uri')
36
36
 
37
- version = getVersionFromURIParam(uri, version, OpenId4VCIVersion.VER_1_0_11, 'credential_offer_uri=');
38
- version = getVersionFromURIParam(uri, version, OpenId4VCIVersion.VER_1_0_11, 'credential_issuer');
39
- version = getVersionFromURIParam(uri, version, OpenId4VCIVersion.VER_1_0_11, 'grants');
37
+ // version = getVersionFromURIParam(uri, version, OpenId4VCIVersion.VER_1_0_11, 'credential_offer=');
38
+ version = getVersionFromURIParam(uri, version, [OpenId4VCIVersion.VER_1_0_11], 'credentials');
39
+ version = getVersionFromURIParam(uri, version, [OpenId4VCIVersion.VER_1_0_11], 'grants.user_pin_required');
40
40
 
41
+ version = getVersionFromURIParam(uri, version, [OpenId4VCIVersion.VER_1_0_13], 'credential_configuration_ids');
42
+ version = getVersionFromURIParam(uri, version, [OpenId4VCIVersion.VER_1_0_13], 'tx_code');
41
43
  if (version === OpenId4VCIVersion.VER_UNKNOWN) {
42
- version = OpenId4VCIVersion.VER_1_0_11;
44
+ version = OpenId4VCIVersion.VER_1_0_13;
43
45
  }
44
46
  return version;
45
47
  }
@@ -47,11 +49,19 @@ export function determineSpecVersionFromURI(uri: string): OpenId4VCIVersion {
47
49
  export function determineSpecVersionFromScheme(credentialOfferURI: string, openId4VCIVersion: OpenId4VCIVersion) {
48
50
  const scheme = getScheme(credentialOfferURI);
49
51
  if (credentialOfferURI.includes(DefaultURISchemes.INITIATE_ISSUANCE)) {
50
- return recordVersion(openId4VCIVersion, OpenId4VCIVersion.VER_1_0_08, scheme);
51
- } else if (credentialOfferURI.includes(DefaultURISchemes.CREDENTIAL_OFFER)) {
52
- return recordVersion(openId4VCIVersion, OpenId4VCIVersion.VER_1_0_11, scheme);
52
+ return recordVersion(openId4VCIVersion, [OpenId4VCIVersion.VER_1_0_08], scheme);
53
+ }
54
+ if (credentialOfferURI.includes('credential_offer_uri')) {
55
+ return undefined;
56
+ }
57
+ // todo: drop support for v1_0_8. version 11 and version 13 have the same scheme 'openid-credential-offer'
58
+ else if (credentialOfferURI.includes(DefaultURISchemes.CREDENTIAL_OFFER)) {
59
+ if (credentialOfferURI.includes('credentials:') || credentialOfferURI.includes('credentials%22')) {
60
+ return recordVersion(openId4VCIVersion, [OpenId4VCIVersion.VER_1_0_11], scheme);
61
+ }
62
+ return recordVersion(openId4VCIVersion, [OpenId4VCIVersion.VER_1_0_13], scheme);
53
63
  } else {
54
- return recordVersion(openId4VCIVersion, OpenId4VCIVersion.VER_UNKNOWN, scheme);
64
+ return recordVersion(openId4VCIVersion, [OpenId4VCIVersion.VER_UNKNOWN], scheme);
55
65
  }
56
66
  }
57
67
 
@@ -113,8 +123,11 @@ export const getStateFromCredentialOfferPayload = (credentialOffer: CredentialOf
113
123
  };
114
124
 
115
125
  export function determineSpecVersionFromOffer(offer: CredentialOfferPayload | CredentialOffer): OpenId4VCIVersion {
116
- if (isCredentialOfferV1_0_12(offer)) {
117
- return OpenId4VCIVersion.VER_1_0_12;
126
+ if (isCredentialOfferV1_0_13(offer)) {
127
+ return OpenId4VCIVersion.VER_1_0_13;
128
+ // We don't have full support for V12, so let's skip for now
129
+ /*} else if (isCredentialOfferV1_0_12(offer)) {
130
+ return OpenId4VCIVersion.VER_1_0_12;*/
118
131
  } else if (isCredentialOfferV1_0_11(offer)) {
119
132
  return OpenId4VCIVersion.VER_1_0_11;
120
133
  } else if (isCredentialOfferV1_0_09(offer)) {
@@ -185,6 +198,7 @@ function isCredentialOfferV1_0_11(offer: CredentialOfferPayload | CredentialOffe
185
198
  return 'credential_offer_uri' in offer;
186
199
  }
187
200
 
201
+ /*
188
202
  function isCredentialOfferV1_0_12(offer: CredentialOfferPayload | CredentialOffer): boolean {
189
203
  if (!offer) {
190
204
  return false;
@@ -199,6 +213,24 @@ function isCredentialOfferV1_0_12(offer: CredentialOfferPayload | CredentialOffe
199
213
  }
200
214
  return 'credential_offer_uri' in offer;
201
215
  }
216
+ */
217
+
218
+ function isCredentialOfferV1_0_13(offer: CredentialOfferPayload | CredentialOffer): boolean {
219
+ if (!offer) {
220
+ return false;
221
+ } else if (typeof offer === 'string' && (offer as string).startsWith('{')) {
222
+ offer = JSON.parse(offer);
223
+ }
224
+ if ('credential_issuer' in offer && 'credential_configuration_ids' in offer) {
225
+ // payload
226
+ return true;
227
+ }
228
+ if ('credential_offer' in offer && offer['credential_offer']) {
229
+ // offer, so check payload
230
+ return isCredentialOfferV1_0_13(offer['credential_offer']);
231
+ }
232
+ return 'credential_offer_uri' in offer;
233
+ }
202
234
 
203
235
  export async function toUniformCredentialOfferRequest(
204
236
  offer: CredentialOffer,
@@ -207,21 +239,29 @@ export async function toUniformCredentialOfferRequest(
207
239
  version?: OpenId4VCIVersion;
208
240
  },
209
241
  ): Promise<UniformCredentialOfferRequest> {
210
- const version = opts?.version ?? determineSpecVersionFromOffer(offer);
242
+ let version = opts?.version ?? determineSpecVersionFromOffer(offer);
211
243
  let originalCredentialOffer = offer.credential_offer;
212
244
  let credentialOfferURI: string | undefined;
213
245
  if ('credential_offer_uri' in offer && offer?.credential_offer_uri !== undefined) {
214
246
  credentialOfferURI = offer.credential_offer_uri;
247
+
215
248
  if (opts?.resolve || opts?.resolve === undefined) {
216
- originalCredentialOffer = (await resolveCredentialOfferURI(credentialOfferURI)) as CredentialOfferPayloadV1_0_11;
249
+ VCI_LOG_COMMON.log(`Credential offer contained a URI. Will use that to get the credential offer payload: ${credentialOfferURI}`);
250
+ originalCredentialOffer = (await resolveCredentialOfferURI(credentialOfferURI)) as
251
+ | CredentialOfferPayloadV1_0_09
252
+ | CredentialOfferPayloadV1_0_11
253
+ | CredentialOfferPayloadV1_0_13;
217
254
  } else if (!originalCredentialOffer) {
218
255
  throw Error(`Credential offer uri (${credentialOfferURI}) found, but resolution was explicitly disabled and credential_offer was supplied`);
219
256
  }
257
+ // We need to redetermine the version of the offer, as we only had the offer_uri until now
258
+ version = determineSpecVersionFromOffer(originalCredentialOffer);
259
+ VCI_LOG_COMMON.log(`Offer URI payload determined to be of version ${version}`);
220
260
  }
221
261
  if (!originalCredentialOffer) {
222
262
  throw Error('No credential offer available');
223
263
  }
224
- const payload = toUniformCredentialOfferPayload(originalCredentialOffer, opts);
264
+ const payload = toUniformCredentialOfferPayload(originalCredentialOffer, { ...opts, version });
225
265
  const supportedFlows = determineFlowType(payload, version);
226
266
  return {
227
267
  credential_offer: payload,
@@ -385,24 +425,36 @@ export function determineGrantTypes(
385
425
  return types;
386
426
  }
387
427
 
388
- function getVersionFromURIParam(credentialOfferURI: string, currentVersion: OpenId4VCIVersion, matchingVersion: OpenId4VCIVersion, param: string) {
428
+ function getVersionFromURIParam(
429
+ credentialOfferURI: string,
430
+ currentVersion: OpenId4VCIVersion,
431
+ matchingVersion: OpenId4VCIVersion[],
432
+ param: string,
433
+ allowUpgrade = true,
434
+ ) {
389
435
  if (credentialOfferURI.includes(param)) {
390
- return recordVersion(currentVersion, matchingVersion, param);
436
+ return recordVersion(currentVersion, matchingVersion, param, allowUpgrade);
391
437
  }
392
438
  return currentVersion;
393
439
  }
394
440
 
395
- function recordVersion(currentVersion: OpenId4VCIVersion, matchingVersion: OpenId4VCIVersion, key: string) {
396
- if (currentVersion === OpenId4VCIVersion.VER_UNKNOWN || matchingVersion === currentVersion) {
397
- return matchingVersion;
441
+ function recordVersion(currentVersion: OpenId4VCIVersion, matchingVersion: OpenId4VCIVersion[], key: string, allowUpgrade = true) {
442
+ matchingVersion = matchingVersion.sort().reverse();
443
+ if (currentVersion === OpenId4VCIVersion.VER_UNKNOWN) {
444
+ return matchingVersion[0];
445
+ } else if (matchingVersion.includes(currentVersion)) {
446
+ if (!allowUpgrade) {
447
+ return currentVersion;
448
+ }
449
+ return matchingVersion[0];
398
450
  }
399
451
 
400
452
  throw new Error(
401
- `Invalid param. Some keys have been used from version: ${currentVersion} version while '${key}' is used from version: ${matchingVersion}`,
453
+ `Invalid param. Some keys have been used from version: ${currentVersion} version while '${key}' is used from version: ${JSON.stringify(matchingVersion)}`,
402
454
  );
403
455
  }
404
456
 
405
- export function getTypesFromOffer(credentialOffer: UniformCredentialOfferPayload, opts?: { filterVerifiableCredential: boolean }) {
457
+ export function getTypesFromOfferV1_0_11(credentialOffer: CredentialOfferPayloadV1_0_11, opts?: { filterVerifiableCredential: boolean }) {
406
458
  const types = credentialOffer.credentials.reduce<string[]>((prev, curr) => {
407
459
  // FIXME returning the string value is wrong (as it's an id), but just matching the current behavior of this library
408
460
  // The credential_type (from draft 8) and the actual 'type' value in a VC (from draft 11) are mixed up
@@ -1,20 +1,31 @@
1
- import { CredentialRequestV1_0_08, CredentialRequestV1_0_11, OpenId4VCIVersion, UniformCredentialRequest } from '../types';
1
+ import {
2
+ CredentialRequest,
3
+ CredentialRequestV1_0_08,
4
+ CredentialRequestV1_0_11,
5
+ CredentialRequestV1_0_13,
6
+ OpenId4VCIVersion,
7
+ UniformCredentialRequest,
8
+ } from '../types';
2
9
 
3
10
  import { getFormatForVersion } from './FormatUtils';
4
11
 
5
- export function getTypesFromRequest(credentialRequest: UniformCredentialRequest, opts?: { filterVerifiableCredential: boolean }) {
12
+ export function getTypesFromRequest(credentialRequest: CredentialRequest, opts?: { filterVerifiableCredential: boolean }) {
6
13
  let types: string[] = [];
7
- if (credentialRequest.format === 'jwt_vc_json' || credentialRequest.format === 'jwt_vc') {
8
- types = credentialRequest.types;
14
+ if ('credential_identifier' in credentialRequest && credentialRequest.credential_identifier) {
15
+ throw Error(`Cannot get types from request when it contains a credential_identifier`);
16
+ } else if (credentialRequest.format === 'jwt_vc_json' || credentialRequest.format === 'jwt_vc') {
17
+ types = 'types' in credentialRequest ? credentialRequest.types : [];
9
18
  } else if (credentialRequest.format === 'jwt_vc_json-ld' || credentialRequest.format === 'ldp_vc') {
10
19
  types =
11
20
  'credential_definition' in credentialRequest && credentialRequest.credential_definition
12
21
  ? credentialRequest.credential_definition.types
13
22
  : // eslint-disable-next-line @typescript-eslint/ban-ts-comment
14
23
  // @ts-ignore
15
- credentialRequest.types;
24
+ 'types' in credentialRequest.types
25
+ ? (credentialRequest['types' as keyof CredentialRequest] as unknown as string[])
26
+ : [];
16
27
  } else if (credentialRequest.format === 'vc+sd-jwt') {
17
- types = [credentialRequest.vct];
28
+ types = 'vct' in credentialRequest ? [credentialRequest.vct as string] : [];
18
29
  }
19
30
 
20
31
  if (!types || types.length === 0) {
@@ -29,11 +40,15 @@ export function getTypesFromRequest(credentialRequest: UniformCredentialRequest,
29
40
  export function getCredentialRequestForVersion(
30
41
  credentialRequest: UniformCredentialRequest,
31
42
  version: OpenId4VCIVersion,
32
- ): UniformCredentialRequest | CredentialRequestV1_0_08 | CredentialRequestV1_0_11 {
43
+ ): UniformCredentialRequest | CredentialRequestV1_0_08 | CredentialRequestV1_0_11 | CredentialRequestV1_0_13 {
33
44
  if (version === OpenId4VCIVersion.VER_1_0_08) {
34
- const draft8Format = getFormatForVersion(credentialRequest.format, version);
45
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
46
+ const draft8Format = getFormatForVersion(credentialRequest.format!, version);
35
47
  const types = getTypesFromRequest(credentialRequest, { filterVerifiableCredential: true });
36
48
 
49
+ if (credentialRequest.credential_subject_issuance) {
50
+ throw Error('Experimental subject issuance is not supported for older versions of the spec');
51
+ }
37
52
  return {
38
53
  format: draft8Format,
39
54
  proof: credentialRequest.proof,
@@ -47,8 +47,8 @@ export async function acquireDeferredCredential({
47
47
  deferredCredentialIntervalInMS?: number;
48
48
  deferredCredentialAwait?: boolean;
49
49
  deferredCredentialEndpoint: string;
50
- }): Promise<OpenIDResponse<CredentialResponse>> {
51
- let credentialResponse: OpenIDResponse<CredentialResponse> = await acquireDeferredCredentialImpl({
50
+ }): Promise<OpenIDResponse<CredentialResponse> & { access_token: string }> {
51
+ let credentialResponse: OpenIDResponse<CredentialResponse> & { access_token: string } = await acquireDeferredCredentialImpl({
52
52
  bearerToken,
53
53
  transactionId,
54
54
  deferredCredentialEndpoint,
@@ -77,7 +77,7 @@ async function acquireDeferredCredentialImpl({
77
77
  bearerToken: string;
78
78
  transactionId?: string;
79
79
  deferredCredentialEndpoint: string;
80
- }): Promise<OpenIDResponse<CredentialResponse>> {
80
+ }): Promise<OpenIDResponse<CredentialResponse> & { access_token: string }> {
81
81
  const response: OpenIDResponse<CredentialResponse> = await post(
82
82
  deferredCredentialEndpoint,
83
83
  JSON.stringify(transactionId ? { transaction_id: transactionId } : ''),
@@ -86,5 +86,5 @@ async function acquireDeferredCredentialImpl({
86
86
  console.log(JSON.stringify(response, null, 2));
87
87
  assertNonFatalError(response);
88
88
 
89
- return response;
89
+ return { ...response, access_token: bearerToken };
90
90
  }
@@ -1,9 +1,9 @@
1
1
  import { BAD_PARAMS, DecodeURIAsJsonOpts, EncodeJsonAsURIOpts, JsonURIMode, OpenId4VCIVersion, SearchValue } from '../types';
2
2
 
3
3
  /**
4
- * @function encodeJsonAsURI encodes a Json object into a URI
5
- * @param json object
6
- * @param opts:
4
+ * @type {(json: {[s:string]: never} | ArrayLike<never> | string | object, opts?: EncodeJsonAsURIOpts)} encodes a Json object into a URI
5
+ * @param { {[s:string]: never} | ArrayLike<never> | string | object } json
6
+ * @param {EncodeJsonAsURIOpts} [opts] Option to encode json as uri
7
7
  * - urlTypeProperties: a list of properties of which the value is a URL
8
8
  * - arrayTypeProperties: a list of properties which are an array
9
9
  */
@@ -81,16 +81,18 @@ export function convertJsonToURI(
81
81
  }
82
82
 
83
83
  /**
84
- * @function decodeUriAsJson decodes a URI into a Json object
85
- * @param uri string
86
- * @param opts:
84
+ * @type {(uri: string, opts?: DecodeURIAsJsonOpts): unknown} convertURIToJsonObject converts an URI into a Json object decoding its properties
85
+ * @param {string} uri
86
+ * @param {DecodeURIAsJsonOpts} [opts]
87
87
  * - requiredProperties: the required properties
88
88
  * - arrayTypeProperties: properties that can show up more that once
89
+ * @returns JSON object
89
90
  */
90
91
  export function convertURIToJsonObject(uri: string, opts?: DecodeURIAsJsonOpts): unknown {
91
92
  if (!uri || (opts?.requiredProperties && !opts.requiredProperties?.every((p) => uri.includes(p)))) {
92
93
  throw new Error(BAD_PARAMS);
93
94
  }
95
+
94
96
  const uriComponents = getURIComponentsAsArray(uri, opts?.arrayTypeProperties);
95
97
  return decodeJsonProperties(uriComponents);
96
98
  }
@@ -128,8 +130,8 @@ function decodeJsonProperties(parts: string[] | string[][]): unknown {
128
130
 
129
131
  /**
130
132
  * @function get URI Components as Array
131
- * @param uri string
132
- * @param arrayTypes array of string containing array like keys
133
+ * @param {string} uri uri
134
+ * @param {string[]} [arrayTypes] array of string containing array like keys
133
135
  */
134
136
  function getURIComponentsAsArray(uri: string, arrayTypes?: string[]): string[] | string[][] {
135
137
  const parts = uri.includes('?') ? uri.split('?')[1] : uri.includes('://') ? uri.split('://')[1] : uri;