@learncard/credential-library 1.0.14 → 1.0.16

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.
@@ -60,6 +60,7 @@ __export(index_exports, {
60
60
  obv3OneedtechFull: () => obv3OneedtechFull,
61
61
  obv3PlugfestJff2: () => obv3PlugfestJff2,
62
62
  obv3ProfessionalCert: () => obv3ProfessionalCert,
63
+ obv3StandaloneFullCourse: () => obv3StandaloneFullCourse,
63
64
  obv3WithAlignment: () => obv3WithAlignment,
64
65
  obv3WithEndorsement: () => obv3WithEndorsement,
65
66
  prepareFixture: () => prepareFixture,
@@ -923,7 +924,8 @@ var obv3ProfessionalCert = {
923
924
  credential: {
924
925
  "@context": [
925
926
  "https://www.w3.org/ns/credentials/v2",
926
- "https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json"
927
+ "https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json",
928
+ "https://purl.imsglobal.org/spec/ob/v3p0/extensions.json"
927
929
  ],
928
930
  id: "urn:uuid:b34ca6cd-29d7-4b2f-9e99-4902fd84c5a1",
929
931
  type: ["VerifiableCredential", "OpenBadgeCredential"],
@@ -1242,6 +1244,197 @@ var obv3CourseCompletion = {
1242
1244
  }
1243
1245
  };
1244
1246
 
1247
+ // src/fixtures/obv3/standalone-full-course.ts
1248
+ var import_types12 = require("@learncard/types");
1249
+ var obv3StandaloneFullCourse = {
1250
+ id: "obv3/standalone-full-course",
1251
+ name: "Applied Data Ethics and Responsible AI Course Completion",
1252
+ description: "A standalone Open Badges v3 course credential with the academic metadata commonly present on a course nested inside a Comprehensive Learner Record.",
1253
+ spec: "obv3",
1254
+ profile: "course",
1255
+ features: ["image", "evidence", "alignment", "results", "source"],
1256
+ source: "synthetic",
1257
+ signed: false,
1258
+ validity: "valid",
1259
+ validator: import_types12.UnsignedAchievementCredentialValidator,
1260
+ tags: ["course", "standalone", "higher-education", "responsible-ai", "full-metadata"],
1261
+ credential: {
1262
+ "@context": [
1263
+ "https://www.w3.org/ns/credentials/v2",
1264
+ "https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json"
1265
+ ],
1266
+ id: "urn:uuid:7f1a9b36-91d2-4bd5-a7af-3d8d8e418101",
1267
+ type: ["VerifiableCredential", "AchievementCredential"],
1268
+ name: "Applied Data Ethics and Responsible AI",
1269
+ description: "Recognizes successful completion of a four-credit undergraduate course in ethical data practice and responsible artificial intelligence.",
1270
+ image: {
1271
+ id: "https://aster-ridge.example/credentials/images/data-ethics-course.png",
1272
+ type: "Image",
1273
+ caption: "Applied Data Ethics and Responsible AI course credential"
1274
+ },
1275
+ issuer: {
1276
+ id: "did:web:aster-ridge.example",
1277
+ type: ["Profile"],
1278
+ name: "Aster Ridge Institute",
1279
+ url: "https://aster-ridge.example",
1280
+ description: "A fictional higher education institution focused on technology and public impact.",
1281
+ email: "registrar@aster-ridge.example",
1282
+ image: {
1283
+ id: "https://aster-ridge.example/brand/institute-mark.png",
1284
+ type: "Image",
1285
+ caption: "Aster Ridge Institute mark"
1286
+ }
1287
+ },
1288
+ validFrom: "2026-05-22T16:00:00Z",
1289
+ credentialSubject: {
1290
+ id: "did:example:learner-ari-1087",
1291
+ type: ["AchievementSubject"],
1292
+ activityStartDate: "2026-01-12T08:00:00Z",
1293
+ activityEndDate: "2026-05-18T23:59:59Z",
1294
+ creditsEarned: 4,
1295
+ term: "Spring 2026",
1296
+ narrative: "The learner completed the course requirements, including a team audit of an automated decision system.",
1297
+ source: {
1298
+ id: "https://aster-ridge.example/offices/registrar",
1299
+ type: ["Profile"],
1300
+ name: "Aster Ridge Institute Registrar",
1301
+ url: "https://aster-ridge.example/offices/registrar"
1302
+ },
1303
+ achievement: {
1304
+ id: "https://aster-ridge.example/catalog/courses/DAI-318",
1305
+ type: ["Achievement"],
1306
+ achievementType: "Course",
1307
+ name: "Applied Data Ethics and Responsible AI",
1308
+ description: "An interdisciplinary course covering data governance, algorithmic accountability, bias assessment, privacy, transparency, and responsible deployment of artificial intelligence systems.",
1309
+ humanCode: "DAI-318",
1310
+ fieldOfStudy: "Data Science",
1311
+ creditsAvailable: 4,
1312
+ inLanguage: "en-US",
1313
+ version: "2026.1",
1314
+ criteria: {
1315
+ id: "https://aster-ridge.example/catalog/courses/DAI-318/criteria",
1316
+ narrative: "Complete all seminars and labs, earn at least 70 percent overall, and pass the final algorithmic impact assessment project."
1317
+ },
1318
+ image: {
1319
+ id: "https://aster-ridge.example/credentials/images/data-ethics-course.png",
1320
+ type: "Image",
1321
+ caption: "Applied Data Ethics and Responsible AI course credential"
1322
+ },
1323
+ creator: {
1324
+ id: "https://aster-ridge.example/schools/computing-and-society",
1325
+ type: ["Profile"],
1326
+ name: "School of Computing and Society",
1327
+ url: "https://aster-ridge.example/schools/computing-and-society",
1328
+ description: "The academic unit responsible for the course curriculum and assessment.",
1329
+ parentOrg: {
1330
+ id: "did:web:aster-ridge.example",
1331
+ type: ["Profile"],
1332
+ name: "Aster Ridge Institute"
1333
+ }
1334
+ },
1335
+ otherIdentifier: [
1336
+ {
1337
+ type: "IdentifierEntry",
1338
+ identifier: "ARI-DAI-318-2026-SP",
1339
+ identifierType: "identifier"
1340
+ }
1341
+ ],
1342
+ alignment: [
1343
+ {
1344
+ type: ["Alignment"],
1345
+ targetCode: "ARIDF-4.2",
1346
+ targetName: "Evaluate algorithmic bias and disparate impact",
1347
+ targetDescription: "Evaluate automated systems for bias, disparate impact, and limitations in representative data.",
1348
+ targetFramework: "Aster Ridge Data Responsibility Framework",
1349
+ targetType: "CFItem",
1350
+ targetUrl: "https://aster-ridge.example/frameworks/data-responsibility/items/4.2"
1351
+ },
1352
+ {
1353
+ type: ["Alignment"],
1354
+ targetCode: "ARIDF-6.1",
1355
+ targetName: "Design accountable data governance practices",
1356
+ targetDescription: "Design governance practices that document data provenance, consent, oversight, and recourse.",
1357
+ targetFramework: "Aster Ridge Data Responsibility Framework",
1358
+ targetType: "CFItem",
1359
+ targetUrl: "https://aster-ridge.example/frameworks/data-responsibility/items/6.1"
1360
+ }
1361
+ ],
1362
+ resultDescription: [
1363
+ {
1364
+ id: "urn:uuid:7f1a9b36-91d2-4bd5-a7af-3d8d8e418103",
1365
+ type: ["ResultDescription"],
1366
+ name: "Final Letter Grade",
1367
+ resultType: "LetterGrade",
1368
+ allowedValue: ["A", "A-", "B+", "B", "B-", "C+", "C", "D", "F"],
1369
+ requiredValue: "C"
1370
+ },
1371
+ {
1372
+ id: "urn:uuid:7f1a9b36-91d2-4bd5-a7af-3d8d8e418104",
1373
+ type: ["ResultDescription"],
1374
+ name: "Final Percentage",
1375
+ resultType: "Percent",
1376
+ valueMin: "0",
1377
+ valueMax: "100",
1378
+ requiredValue: "70"
1379
+ },
1380
+ {
1381
+ id: "urn:uuid:7f1a9b36-91d2-4bd5-a7af-3d8d8e418105",
1382
+ type: ["ResultDescription"],
1383
+ name: "Course Completion Status",
1384
+ resultType: "Status",
1385
+ allowedValue: [
1386
+ "Completed",
1387
+ "Enrolled",
1388
+ "Failed",
1389
+ "InProgress",
1390
+ "OnHold",
1391
+ "Withdrew"
1392
+ ]
1393
+ }
1394
+ ],
1395
+ tag: [
1396
+ "data-ethics",
1397
+ "responsible-ai",
1398
+ "algorithmic-accountability",
1399
+ "data-governance"
1400
+ ]
1401
+ },
1402
+ result: [
1403
+ {
1404
+ type: ["Result"],
1405
+ resultDescription: "urn:uuid:7f1a9b36-91d2-4bd5-a7af-3d8d8e418103",
1406
+ value: "A-"
1407
+ },
1408
+ {
1409
+ type: ["Result"],
1410
+ resultDescription: "urn:uuid:7f1a9b36-91d2-4bd5-a7af-3d8d8e418104",
1411
+ value: "92"
1412
+ },
1413
+ {
1414
+ type: ["Result"],
1415
+ resultDescription: "urn:uuid:7f1a9b36-91d2-4bd5-a7af-3d8d8e418105",
1416
+ status: "Completed"
1417
+ }
1418
+ ]
1419
+ },
1420
+ evidence: [
1421
+ {
1422
+ id: "https://aster-ridge.example/records/ari-1087/DAI-318",
1423
+ type: ["Evidence"],
1424
+ name: "Official Course Completion Record",
1425
+ description: "Registrar record confirming the learner earned four credits with a final grade of A-.",
1426
+ narrative: "Course requirements were completed during the Spring 2026 academic term."
1427
+ },
1428
+ {
1429
+ id: "https://aster-ridge.example/showcase/ari-1087/impact-assessment",
1430
+ type: ["Evidence"],
1431
+ name: "Algorithmic Impact Assessment",
1432
+ description: "Final project evaluating fairness, transparency, and governance controls for a fictional automated decision system."
1433
+ }
1434
+ ]
1435
+ }
1436
+ };
1437
+
1245
1438
  // src/fixtures/obv3/k12-diploma.ts
1246
1439
  var obv3K12Diploma = {
1247
1440
  id: "obv3/k12-diploma",
@@ -1343,7 +1536,8 @@ var obv3EndorsementCredential = {
1343
1536
  credential: {
1344
1537
  "@context": [
1345
1538
  "https://www.w3.org/ns/credentials/v2",
1346
- "https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json"
1539
+ "https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json",
1540
+ "https://purl.imsglobal.org/spec/ob/v3p0/extensions.json"
1347
1541
  ],
1348
1542
  id: "urn:uuid:a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d",
1349
1543
  type: ["VerifiableCredential", "EndorsementCredential"],
@@ -1382,7 +1576,7 @@ var obv3EndorsementCredential = {
1382
1576
  };
1383
1577
 
1384
1578
  // src/fixtures/clr/minimal.ts
1385
- var import_types12 = require("@learncard/types");
1579
+ var import_types13 = require("@learncard/types");
1386
1580
  var clrMinimal = {
1387
1581
  id: "clr/minimal",
1388
1582
  name: "Minimal CLR v2 Credential",
@@ -1393,7 +1587,7 @@ var clrMinimal = {
1393
1587
  source: "spec-example",
1394
1588
  signed: false,
1395
1589
  validity: "valid",
1396
- validator: import_types12.UnsignedClrCredentialValidator,
1590
+ validator: import_types13.UnsignedClrCredentialValidator,
1397
1591
  credential: {
1398
1592
  "@context": [
1399
1593
  "https://www.w3.org/ns/credentials/v2",
@@ -1432,7 +1626,7 @@ var clrMinimal = {
1432
1626
  };
1433
1627
 
1434
1628
  // src/fixtures/clr/multi-achievement.ts
1435
- var import_types13 = require("@learncard/types");
1629
+ var import_types14 = require("@learncard/types");
1436
1630
  var clrMultiAchievement = {
1437
1631
  id: "clr/multi-achievement",
1438
1632
  name: "CLR v2 with Multiple Achievements and Associations",
@@ -1443,7 +1637,7 @@ var clrMultiAchievement = {
1443
1637
  source: "synthetic",
1444
1638
  signed: false,
1445
1639
  validity: "valid",
1446
- validator: import_types13.UnsignedClrCredentialValidator,
1640
+ validator: import_types14.UnsignedClrCredentialValidator,
1447
1641
  tags: ["comprehensive"],
1448
1642
  credential: {
1449
1643
  "@context": [
@@ -1878,7 +2072,7 @@ var clrUniversityTranscript = {
1878
2072
  };
1879
2073
 
1880
2074
  // src/fixtures/boost/basic.ts
1881
- var import_types14 = require("@learncard/types");
2075
+ var import_types15 = require("@learncard/types");
1882
2076
  var boostBasic = {
1883
2077
  id: "boost/basic",
1884
2078
  name: "Basic LearnCard Boost",
@@ -1889,7 +2083,7 @@ var boostBasic = {
1889
2083
  source: "synthetic",
1890
2084
  signed: false,
1891
2085
  validity: "valid",
1892
- validator: import_types14.UnsignedAchievementCredentialValidator,
2086
+ validator: import_types15.UnsignedAchievementCredentialValidator,
1893
2087
  tags: ["learncard", "boost"],
1894
2088
  credential: {
1895
2089
  "@context": [
@@ -1925,7 +2119,7 @@ var boostBasic = {
1925
2119
  };
1926
2120
 
1927
2121
  // src/fixtures/boost/boost-id.ts
1928
- var import_types15 = require("@learncard/types");
2122
+ var import_types16 = require("@learncard/types");
1929
2123
  var boostId = {
1930
2124
  id: "boost/boost-id",
1931
2125
  name: "LearnCard Boost ID",
@@ -1936,7 +2130,7 @@ var boostId = {
1936
2130
  source: "synthetic",
1937
2131
  signed: false,
1938
2132
  validity: "valid",
1939
- validator: import_types15.UnsignedAchievementCredentialValidator,
2133
+ validator: import_types16.UnsignedAchievementCredentialValidator,
1940
2134
  tags: ["learncard", "boost", "id"],
1941
2135
  credential: {
1942
2136
  "@context": [
@@ -1981,7 +2175,7 @@ var boostId = {
1981
2175
  };
1982
2176
 
1983
2177
  // src/fixtures/boost/with-skills.ts
1984
- var import_types16 = require("@learncard/types");
2178
+ var import_types17 = require("@learncard/types");
1985
2179
  var boostWithSkills = {
1986
2180
  id: "boost/with-skills",
1987
2181
  name: "LearnCard Boost with Skills",
@@ -1992,7 +2186,7 @@ var boostWithSkills = {
1992
2186
  source: "synthetic",
1993
2187
  signed: false,
1994
2188
  validity: "valid",
1995
- validator: import_types16.UnsignedAchievementCredentialValidator,
2189
+ validator: import_types17.UnsignedAchievementCredentialValidator,
1996
2190
  tags: ["learncard", "boost", "skills"],
1997
2191
  credential: {
1998
2192
  "@context": [
@@ -2071,7 +2265,8 @@ var boostCommunityAward = {
2071
2265
  credential: {
2072
2266
  "@context": [
2073
2267
  "https://www.w3.org/ns/credentials/v2",
2074
- "https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json"
2268
+ "https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json",
2269
+ "https://ctx.learncard.com/boosts/1.0.3.json"
2075
2270
  ],
2076
2271
  id: "urn:uuid:d8c4f2a1-3b67-4e89-a1d0-5f9e7c2b8a43",
2077
2272
  type: ["VerifiableCredential", "OpenBadgeCredential", "BoostCredential"],
@@ -2160,7 +2355,8 @@ var boostDelegate = {
2160
2355
  credential: {
2161
2356
  "@context": [
2162
2357
  "https://www.w3.org/ns/credentials/v2",
2163
- "https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json"
2358
+ "https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json",
2359
+ "https://ctx.learncard.com/boosts/1.0.3.json"
2164
2360
  ],
2165
2361
  id: "urn:uuid:e7b3d1f4-9a26-4c58-b0d3-8f1e2c7a9b56",
2166
2362
  type: ["VerifiableCredential", "OpenBadgeCredential", "BoostCredential"],
@@ -2200,7 +2396,7 @@ var boostDelegate = {
2200
2396
  };
2201
2397
 
2202
2398
  // src/fixtures/invalid/missing-context.ts
2203
- var import_types17 = require("@learncard/types");
2399
+ var import_types18 = require("@learncard/types");
2204
2400
  var invalidMissingContext = {
2205
2401
  id: "invalid/missing-context",
2206
2402
  name: "Missing @context",
@@ -2211,7 +2407,7 @@ var invalidMissingContext = {
2211
2407
  source: "synthetic",
2212
2408
  signed: false,
2213
2409
  validity: "invalid",
2214
- validator: import_types17.UnsignedVCValidator,
2410
+ validator: import_types18.UnsignedVCValidator,
2215
2411
  tags: ["negative-test"],
2216
2412
  credential: {
2217
2413
  // Intentionally missing '@context'
@@ -2224,7 +2420,7 @@ var invalidMissingContext = {
2224
2420
  };
2225
2421
 
2226
2422
  // src/fixtures/invalid/empty-type.ts
2227
- var import_types18 = require("@learncard/types");
2423
+ var import_types19 = require("@learncard/types");
2228
2424
  var invalidEmptyType = {
2229
2425
  id: "invalid/empty-type",
2230
2426
  name: "Empty type Array",
@@ -2235,7 +2431,7 @@ var invalidEmptyType = {
2235
2431
  source: "synthetic",
2236
2432
  signed: false,
2237
2433
  validity: "invalid",
2238
- validator: import_types18.UnsignedVCValidator,
2434
+ validator: import_types19.UnsignedVCValidator,
2239
2435
  tags: ["negative-test"],
2240
2436
  credential: {
2241
2437
  "@context": ["https://www.w3.org/ns/credentials/v2"],
@@ -2248,7 +2444,7 @@ var invalidEmptyType = {
2248
2444
  };
2249
2445
 
2250
2446
  // src/fixtures/invalid/missing-issuer.ts
2251
- var import_types19 = require("@learncard/types");
2447
+ var import_types20 = require("@learncard/types");
2252
2448
  var invalidMissingIssuer = {
2253
2449
  id: "invalid/missing-issuer",
2254
2450
  name: "Missing Issuer",
@@ -2259,7 +2455,7 @@ var invalidMissingIssuer = {
2259
2455
  source: "synthetic",
2260
2456
  signed: false,
2261
2457
  validity: "invalid",
2262
- validator: import_types19.UnsignedVCValidator,
2458
+ validator: import_types20.UnsignedVCValidator,
2263
2459
  tags: ["negative-test"],
2264
2460
  credential: {
2265
2461
  "@context": ["https://www.w3.org/ns/credentials/v2"],
@@ -10922,7 +11118,9 @@ var clrWestbridgeFull = {
10922
11118
  "@context": [
10923
11119
  "https://www.w3.org/ns/credentials/v2",
10924
11120
  "https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json",
10925
- "https://purl.imsglobal.org/spec/clr/v2p0/context-2.0.1.json"
11121
+ "https://purl.imsglobal.org/spec/clr/v2p0/context.json",
11122
+ "https://purl.imsglobal.org/spec/ob/v3p0/extensions.json",
11123
+ { IssuerPolicy: "https://westbridge.edu/credentials#IssuerPolicy" }
10926
11124
  ],
10927
11125
  id: "urn:uuid:wb-clr-2025-jordan-reyes-001",
10928
11126
  type: ["VerifiableCredential", "ClrCredential"],
@@ -10993,6 +11191,13 @@ var clrWestbridgeFull = {
10993
11191
  }
10994
11192
  ],
10995
11193
  credentialSubject: {
11194
+ // CLR v2's ClrSubject scoped context omits the Open Badges identifier term.
11195
+ "@context": {
11196
+ identifier: {
11197
+ "@id": "https://purl.imsglobal.org/spec/vc/ob/vocab.html#identifier",
11198
+ "@container": "@set"
11199
+ }
11200
+ },
10996
11201
  id: "did:example:wb-student-2025-001",
10997
11202
  type: ["ClrSubject"],
10998
11203
  identifier: [
@@ -14134,6 +14339,7 @@ var ALL_FIXTURES = [
14134
14339
  obv3ProfessionalCert,
14135
14340
  obv3MicroCredential,
14136
14341
  obv3CourseCompletion,
14342
+ obv3StandaloneFullCourse,
14137
14343
  obv3K12Diploma,
14138
14344
  obv3EndorsementCredential,
14139
14345
  // CLR v2