@learncard/core 6.2.0 → 6.4.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.
@@ -36939,8 +36939,7 @@ __export(src_exports2, {
36939
36939
  getVCPlugin: () => getVCPlugin,
36940
36940
  getVpqrPlugin: () => getVpqrPlugin,
36941
36941
  initLearnCard: () => initLearnCard,
36942
- passwordToKey: () => passwordToKey,
36943
- seedToId: () => seedToId,
36942
+ walletFromApiUrl: () => walletFromApiUrl,
36944
36943
  walletFromKey: () => walletFromKey
36945
36944
  });
36946
36945
  module.exports = __toCommonJS(src_exports2);
@@ -36951,34 +36950,6 @@ var import_polyfill = require("abort-controller/polyfill");
36951
36950
  var import_isomorphic_webcrypto = __toESM(require("isomorphic-webcrypto"));
36952
36951
  if (typeof window === "undefined" && !globalThis.crypto)
36953
36952
  globalThis.crypto = import_isomorphic_webcrypto.default;
36954
- var crypto_default = import_isomorphic_webcrypto.default;
36955
-
36956
- // src/wallet/base/functions/passwordToKey.ts
36957
- var passwordToKey = /* @__PURE__ */ __name((password, salt = "salt", iterations = 1e5, digest2 = "SHA-256") => __async(void 0, null, function* () {
36958
- var saltBuffer = Buffer.from(salt);
36959
- var passphraseKey = Buffer.from(password);
36960
- return crypto_default.subtle.importKey("raw", passphraseKey, { name: "PBKDF2" }, false, [
36961
- "deriveBits",
36962
- "deriveKey"
36963
- ]).then(function(key2) {
36964
- return crypto_default.subtle.deriveKey({
36965
- name: "PBKDF2",
36966
- salt: saltBuffer,
36967
- iterations,
36968
- hash: digest2
36969
- }, key2, { name: "AES-CBC", length: 256 }, true, ["encrypt", "decrypt"]);
36970
- }).then((webKey) => {
36971
- return crypto_default.subtle.exportKey("raw", webKey);
36972
- }).then((buffer2) => {
36973
- return new Uint8Array(buffer2);
36974
- });
36975
- }), "passwordToKey");
36976
-
36977
- // src/wallet/base/functions/seedToId.ts
36978
- var seedToId = /* @__PURE__ */ __name((seed) => __async(void 0, null, function* () {
36979
- const buffer2 = yield crypto_default.subtle.digest("SHA-256", seed);
36980
- return `urn:digest:${Buffer.from(new Int8Array(buffer2)).toString("hex")}`;
36981
- }), "seedToId");
36982
36953
 
36983
36954
  // src/wallet/base/wallet.ts
36984
36955
  var addPluginToWallet = /* @__PURE__ */ __name((wallet, plugin) => __async(void 0, null, function* () {
@@ -39252,7 +39223,8 @@ var getCHAPIPlugin = /* @__PURE__ */ __name(() => __async(void 0, null, function
39252
39223
  return { success: false, reason: "did not auth" };
39253
39224
  const verification = yield wallet.pluginMethods.verifyPresentation(res.data, {
39254
39225
  challenge,
39255
- domain
39226
+ domain,
39227
+ proofPurpose: "authentication"
39256
39228
  });
39257
39229
  if (verification.warnings.length > 0 || verification.errors.length > 0) {
39258
39230
  return { success: false, reason: "auth failed verification" };
@@ -39261,7 +39233,7 @@ var getCHAPIPlugin = /* @__PURE__ */ __name(() => __async(void 0, null, function
39261
39233
  if (!Array.isArray(credential.credentialSubject)) {
39262
39234
  credential.credentialSubject.id = subject;
39263
39235
  }
39264
- const vp = yield wallet.pluginMethods.issuePresentation(yield wallet.pluginMethods.getTestVp(yield wallet.pluginMethods.issueCredential(credential)));
39236
+ const vp = yield wallet.pluginMethods.getTestVp(yield wallet.pluginMethods.issueCredential(credential));
39265
39237
  const success = yield wallet.pluginMethods.storePresentationViaChapi(vp);
39266
39238
  if (success)
39267
39239
  return { success: true };
@@ -42220,7 +42192,7 @@ var AlignmentValidator = mod.object({
42220
42192
  targetType: AlignmentTargetTypeValidator.optional(),
42221
42193
  targetUrl: mod.string()
42222
42194
  });
42223
- var AchievementTypeValidator = mod.enum([
42195
+ var KnownAchievementTypeValidator = mod.enum([
42224
42196
  "Achievement",
42225
42197
  "ApprenticeshipCertificate",
42226
42198
  "Assessment",
@@ -42252,7 +42224,8 @@ var AchievementTypeValidator = mod.enum([
42252
42224
  "MicroCredential",
42253
42225
  "ResearchDoctorate",
42254
42226
  "SecondarySchoolDiploma"
42255
- ]).or(mod.string());
42227
+ ]);
42228
+ var AchievementTypeValidator = KnownAchievementTypeValidator.or(mod.string());
42256
42229
  var CriteriaValidator = mod.object({ id: mod.string().optional(), narrative: mod.string().optional() }).catchall(mod.any());
42257
42230
  var EndorsementSubjectValidator = mod.object({
42258
42231
  id: mod.string(),
@@ -42411,6 +42384,13 @@ var IDXCredentialValidator = mod.object({
42411
42384
  id: mod.string(),
42412
42385
  title: mod.string(),
42413
42386
  storageType: StorageTypeValidator.optional()
42387
+ }).catchall(mod.any());
42388
+ var JWKValidator = mod.object({
42389
+ kty: mod.string(),
42390
+ crv: mod.string(),
42391
+ x: mod.string(),
42392
+ y: mod.string().optional(),
42393
+ d: mod.string()
42414
42394
  });
42415
42395
 
42416
42396
  // ../../node_modules/.pnpm/date-fns@2.28.0/node_modules/date-fns/esm/_lib/toInteger/index.js
@@ -60387,11 +60367,131 @@ var walletFromKey = /* @__PURE__ */ __name((_0, ..._1) => __async(void 0, [_0, .
60387
60367
  };
60388
60368
  }), "walletFromKey");
60389
60369
 
60370
+ // src/wallet/plugins/vc-api/helpers.ts
60371
+ var post = /* @__PURE__ */ __name((url, data) => __async(void 0, null, function* () {
60372
+ return fetch(url, {
60373
+ method: "POST",
60374
+ headers: { "Content-Type": "application/json" },
60375
+ body: JSON.stringify(data)
60376
+ });
60377
+ }), "post");
60378
+ var isSuccessful = /* @__PURE__ */ __name((status) => status.toString().startsWith("2"), "isSuccessful");
60379
+
60380
+ // src/wallet/plugins/vc-api/index.ts
60381
+ var getVCAPIPlugin = /* @__PURE__ */ __name((_0) => __async(void 0, [_0], function* ({
60382
+ url: _url,
60383
+ did: _did
60384
+ }) {
60385
+ const url = _url.endsWith("/") ? _url.slice(0, -1) : _url;
60386
+ let did = _did;
60387
+ if (!did) {
60388
+ const res = yield fetch(`${url}/did`);
60389
+ if (res.status === 200)
60390
+ did = yield res.text();
60391
+ }
60392
+ if (!did)
60393
+ throw new Error("Could not retrieve did from VC API! Please suppy a did.");
60394
+ return {
60395
+ pluginMethods: {
60396
+ getSubjectDid: () => did,
60397
+ issueCredential: (_wallet, credential, options) => __async(void 0, null, function* () {
60398
+ yield UnsignedVCValidator.parseAsync(credential);
60399
+ const response = yield post(`${url}/credentials/issue`, { credential, options });
60400
+ if (!isSuccessful(response.status)) {
60401
+ throw new Error(`API Error: ${response.status} ${response.statusText}`);
60402
+ }
60403
+ return VCValidator.parseAsync(yield response.json());
60404
+ }),
60405
+ verifyCredential: (_wallet, verifiableCredential, options) => __async(void 0, null, function* () {
60406
+ yield VCValidator.parseAsync(verifiableCredential);
60407
+ const response = yield post(`${url}/credentials/verify`, {
60408
+ verifiableCredential,
60409
+ options
60410
+ });
60411
+ if (!isSuccessful(response.status)) {
60412
+ throw new Error(`API Error: ${response.status} ${response.statusText}`);
60413
+ }
60414
+ return VerificationCheckValidator.parseAsync(yield response.json());
60415
+ }),
60416
+ issuePresentation: (_wallet, presentation, options) => __async(void 0, null, function* () {
60417
+ yield UnsignedVPValidator.parseAsync(presentation);
60418
+ const response = yield post(`${url}/presentations/issue`, {
60419
+ presentation,
60420
+ options
60421
+ });
60422
+ if (!isSuccessful(response.status)) {
60423
+ throw new Error(`API Error: ${response.status} ${response.statusText}`);
60424
+ }
60425
+ return VPValidator.parseAsync(yield response.json());
60426
+ }),
60427
+ verifyPresentation: (_wallet, verifiablePresentation, options) => __async(void 0, null, function* () {
60428
+ yield VPValidator.parseAsync(verifiablePresentation);
60429
+ const response = yield post(`${url}/presentations/verify`, {
60430
+ verifiablePresentation,
60431
+ options
60432
+ });
60433
+ if (!isSuccessful(response.status)) {
60434
+ throw new Error(`API Error: ${response.status} ${response.statusText}`);
60435
+ }
60436
+ return VerificationCheckValidator.parseAsync(yield response.json());
60437
+ }),
60438
+ getTestVc: (_wallet, subject = "did:example:d23dd687a7dc6787646f2eb98d0") => {
60439
+ return {
60440
+ "@context": ["https://www.w3.org/2018/credentials/v1"],
60441
+ id: "http://example.org/credentials/3731",
60442
+ type: ["VerifiableCredential"],
60443
+ issuer: did,
60444
+ issuanceDate: "2020-08-19T21:41:50Z",
60445
+ credentialSubject: { id: subject }
60446
+ };
60447
+ },
60448
+ getTestVp: (_wallet, _credential) => __async(void 0, null, function* () {
60449
+ const credential = _credential || (yield _wallet.pluginMethods.issueCredential(_wallet.pluginMethods.getTestVc()));
60450
+ return {
60451
+ "@context": ["https://www.w3.org/2018/credentials/v1"],
60452
+ type: ["VerifiablePresentation"],
60453
+ holder: did,
60454
+ verifiableCredential: credential
60455
+ };
60456
+ })
60457
+ }
60458
+ };
60459
+ }), "getVCAPIPlugin");
60460
+
60461
+ // src/wallet/initializers/apiWallet.ts
60462
+ var walletFromApiUrl = /* @__PURE__ */ __name((_0, _1, ..._2) => __async(void 0, [_0, _1, ..._2], function* (url, did, { defaultContents = [] } = {}) {
60463
+ const apiWallet = yield (yield generateWallet(defaultContents)).addPlugin(yield getVCAPIPlugin({ url, did }));
60464
+ const expirationWallet = yield apiWallet.addPlugin(ExpirationPlugin(apiWallet));
60465
+ const templateWallet = yield expirationWallet.addPlugin(getVCTemplatesPlugin());
60466
+ const wallet = yield templateWallet.addPlugin(yield getCHAPIPlugin());
60467
+ return {
60468
+ _wallet: wallet,
60469
+ did: (type = "key") => wallet.pluginMethods.getSubjectDid(type),
60470
+ newCredential: wallet.pluginMethods.newCredential,
60471
+ newPresentation: wallet.pluginMethods.newPresentation,
60472
+ issueCredential: wallet.pluginMethods.issueCredential,
60473
+ verifyCredential: verifyCredential2(wallet),
60474
+ issuePresentation: wallet.pluginMethods.issuePresentation,
60475
+ verifyPresentation: wallet.pluginMethods.verifyPresentation,
60476
+ getTestVc: wallet.pluginMethods.getTestVc,
60477
+ getTestVp: wallet.pluginMethods.getTestVp,
60478
+ installChapiHandler: wallet.pluginMethods.installChapiHandler,
60479
+ activateChapiHandler: wallet.pluginMethods.activateChapiHandler,
60480
+ receiveChapiEvent: wallet.pluginMethods.receiveChapiEvent,
60481
+ storePresentationViaChapi: wallet.pluginMethods.storePresentationViaChapi,
60482
+ storeCredentialViaChapiDidAuth: wallet.pluginMethods.storeCredentialViaChapiDidAuth
60483
+ };
60484
+ }), "walletFromApiUrl");
60485
+
60390
60486
  // src/wallet/init.ts
60391
60487
  function initLearnCard() {
60392
60488
  return __async(this, arguments, function* (config2 = {}) {
60489
+ if ("vcApi" in config2) {
60490
+ const _a = config2, { vcApi, did } = _a, apiConfig = __objRest(_a, ["vcApi", "did"]);
60491
+ return walletFromApiUrl(typeof vcApi === "string" ? vcApi : "https://bridge.learncard.com", vcApi === true ? "did:key:z6MkjSz4mYqcn7dePGuktJ5PxecMkXQQHWRg8Lm6okATyFVh" : did, apiConfig);
60492
+ }
60393
60493
  if ("seed" in config2) {
60394
- const _a = config2, { seed } = _a, keyConfig = __objRest(_a, ["seed"]);
60494
+ const _b = config2, { seed } = _b, keyConfig = __objRest(_b, ["seed"]);
60395
60495
  return walletFromKey(seed, keyConfig);
60396
60496
  }
60397
60497
  return emptyWallet(config2);