@learncard/credential-library 1.0.10 → 1.0.11
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 +104 -98
- package/package.json +49 -39
- package/src/__tests__/issuance.test.ts +51 -0
- package/src/__tests__/registry.test.ts +457 -0
- package/src/fixtures/boost/basic.ts +50 -0
- package/src/fixtures/boost/boost-id.ts +59 -0
- package/src/fixtures/boost/community-award.ts +96 -0
- package/src/fixtures/boost/delegate.ts +60 -0
- package/src/fixtures/boost/with-skills.ts +80 -0
- package/src/fixtures/clr/competency-aligned.ts +737 -0
- package/src/fixtures/clr/great-plains-full.ts +7841 -0
- package/src/fixtures/clr/minimal.ts +53 -0
- package/src/fixtures/clr/multi-achievement.ts +125 -0
- package/src/fixtures/clr/nd-student-transcript.ts +411 -0
- package/src/fixtures/clr/university-transcript.ts +328 -0
- package/src/fixtures/clr/westbridge-full.ts +2524 -0
- package/src/fixtures/index.ts +159 -0
- package/src/fixtures/invalid/empty-type.ts +27 -0
- package/src/fixtures/invalid/missing-context.ts +27 -0
- package/src/fixtures/invalid/missing-issuer.ts +27 -0
- package/src/fixtures/obv3/1edtech-full.ts +237 -0
- package/src/fixtures/obv3/course-completion.ts +82 -0
- package/src/fixtures/obv3/endorsement.ts +58 -0
- package/src/fixtures/obv3/full-badge.ts +121 -0
- package/src/fixtures/obv3/k12-diploma.ts +92 -0
- package/src/fixtures/obv3/micro-credential.ts +170 -0
- package/src/fixtures/obv3/minimal-badge.ts +40 -0
- package/src/fixtures/obv3/plugfest-jff2.ts +57 -0
- package/src/fixtures/obv3/professional-cert.ts +102 -0
- package/src/fixtures/obv3/with-alignment.ts +62 -0
- package/src/fixtures/obv3/with-endorsement.ts +62 -0
- package/src/fixtures/render-method/render-method-example.ts +45 -0
- package/src/fixtures/vc-v1/alumni-credential.ts +37 -0
- package/src/fixtures/vc-v1/basic.ts +27 -0
- package/src/fixtures/vc-v1/with-status.ts +44 -0
- package/src/fixtures/vc-v2/basic.ts +27 -0
- package/src/fixtures/vc-v2/digital-id.ts +78 -0
- package/src/fixtures/vc-v2/education-degree.ts +77 -0
- package/src/fixtures/vc-v2/employment-credential.ts +64 -0
- package/src/fixtures/vc-v2/license-credential.ts +79 -0
- package/src/fixtures/vc-v2/membership-credential.ts +62 -0
- package/src/fixtures/vc-v2/multiple-subjects.ts +39 -0
- package/src/fixtures/vc-v2/with-evidence.ts +50 -0
- package/src/index.ts +45 -0
- package/src/prepare.ts +212 -0
- package/src/registry.ts +209 -0
- package/src/types.ts +164 -0
|
@@ -0,0 +1,737 @@
|
|
|
1
|
+
import type { CredentialFixture } from '../../types';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* A focused CLR v2 transcript purpose-built to exercise the two competency-linking
|
|
5
|
+
* mechanisms in the spec, plus evidence at every level:
|
|
6
|
+
*
|
|
7
|
+
* 1. `achievement.alignment[]` — courses, the degree, and standalone competencies each
|
|
8
|
+
* align to external framework nodes (CFItem / ceasn:Competency / CTDL / CFRubric).
|
|
9
|
+
* 2. `association[]` — explicit edges tie each Competency credential to the course(s)
|
|
10
|
+
* that develop it (`isRelatedTo`) and tie courses to the degree (`isChildOf`), so the
|
|
11
|
+
* renderer can map competencies to their parent course/degree with no heuristics.
|
|
12
|
+
*
|
|
13
|
+
* Evidence is attached at three levels: top-level (whole transcript), per-course, and on
|
|
14
|
+
* the degree — to exercise the flat "all evidence" count and per-record grouping.
|
|
15
|
+
*/
|
|
16
|
+
export const clrCompetencyAligned: CredentialFixture = {
|
|
17
|
+
id: 'clr/competency-aligned',
|
|
18
|
+
name: 'Riverside College — Competency-Aligned Web Development Certificate',
|
|
19
|
+
description:
|
|
20
|
+
'A compact CLR v2 transcript that ties courses and a certificate to competency framework alignments, links competency credentials to their parent courses via associations, and carries evidence at the transcript, course, and program levels.',
|
|
21
|
+
spec: 'clr-v2',
|
|
22
|
+
profile: 'learner-record',
|
|
23
|
+
features: [
|
|
24
|
+
'results',
|
|
25
|
+
'evidence',
|
|
26
|
+
'alignment',
|
|
27
|
+
'image',
|
|
28
|
+
'associations',
|
|
29
|
+
'nested-credentials',
|
|
30
|
+
'status',
|
|
31
|
+
],
|
|
32
|
+
source: 'synthetic',
|
|
33
|
+
signed: false,
|
|
34
|
+
validity: 'valid',
|
|
35
|
+
tags: ['transcript', 'certificate', 'web-development', 'clr-v2', 'alignment', 'competencies'],
|
|
36
|
+
|
|
37
|
+
credential: {
|
|
38
|
+
'@context': [
|
|
39
|
+
'https://www.w3.org/ns/credentials/v2',
|
|
40
|
+
'https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json',
|
|
41
|
+
'https://purl.imsglobal.org/spec/clr/v2p0/context-2.0.1.json',
|
|
42
|
+
],
|
|
43
|
+
id: 'urn:uuid:rc-clr-2025-sam-okafor-001',
|
|
44
|
+
type: ['VerifiableCredential', 'ClrCredential'],
|
|
45
|
+
name: 'Web Development Certificate — Riverside College',
|
|
46
|
+
description:
|
|
47
|
+
'Competency-aligned certificate record for Samuel Okafor, documenting four courses, three demonstrated competencies, and the awarded Full-Stack Web Development certificate.',
|
|
48
|
+
image: {
|
|
49
|
+
id: 'https://www.rcc.edu/_resources/assets/icons/riverside-logo.svg',
|
|
50
|
+
type: 'Image',
|
|
51
|
+
caption: 'Riverside College official logo',
|
|
52
|
+
},
|
|
53
|
+
issuer: {
|
|
54
|
+
id: 'did:web:registrar.riverside.edu',
|
|
55
|
+
type: ['Profile'],
|
|
56
|
+
name: 'Riverside College — Office of the Registrar',
|
|
57
|
+
url: 'https://riverside.edu/registrar',
|
|
58
|
+
email: 'registrar@riverside.edu',
|
|
59
|
+
image: {
|
|
60
|
+
id: 'https://www.rcc.edu/_resources/assets/icons/riverside-logo.svg',
|
|
61
|
+
type: 'Image',
|
|
62
|
+
caption: 'Riverside City College official logo',
|
|
63
|
+
},
|
|
64
|
+
address: {
|
|
65
|
+
type: ['Address'],
|
|
66
|
+
streetAddress: '450 River Road',
|
|
67
|
+
addressLocality: 'Riverside',
|
|
68
|
+
addressRegion: 'CA',
|
|
69
|
+
postalCode: '92501',
|
|
70
|
+
addressCountry: 'USA',
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
validFrom: '2025-06-02T00:00:00Z',
|
|
74
|
+
awardedDate: '2025-05-30',
|
|
75
|
+
credentialStatus: {
|
|
76
|
+
id: 'https://registrar.riverside.edu/status/2025#7',
|
|
77
|
+
type: 'BitstringStatusListEntry',
|
|
78
|
+
statusPurpose: 'revocation',
|
|
79
|
+
statusListIndex: '7',
|
|
80
|
+
statusListCredential: 'https://registrar.riverside.edu/status/2025',
|
|
81
|
+
},
|
|
82
|
+
// Top-level evidence — belongs to the transcript as a whole.
|
|
83
|
+
evidence: [
|
|
84
|
+
{
|
|
85
|
+
id: 'https://registrar.riverside.edu/transcripts/t-rc-2025-001.pdf',
|
|
86
|
+
type: ['Evidence'],
|
|
87
|
+
name: 'Official Certificate Transcript',
|
|
88
|
+
description:
|
|
89
|
+
'Official sealed certificate transcript issued by the Office of the Registrar.',
|
|
90
|
+
genre: 'Document',
|
|
91
|
+
audience: 'Employer',
|
|
92
|
+
},
|
|
93
|
+
],
|
|
94
|
+
credentialSubject: {
|
|
95
|
+
id: 'did:example:rc-student-2025-001',
|
|
96
|
+
type: ['ClrSubject'],
|
|
97
|
+
identifier: [
|
|
98
|
+
{
|
|
99
|
+
type: 'IdentityObject',
|
|
100
|
+
identityHash: 'Samuel Okafor',
|
|
101
|
+
identityType: 'name',
|
|
102
|
+
hashed: false,
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
type: 'IdentityObject',
|
|
106
|
+
identityHash: 's.okafor@riverside.edu',
|
|
107
|
+
identityType: 'emailAddress',
|
|
108
|
+
hashed: false,
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
type: 'IdentityObject',
|
|
112
|
+
identityHash: 'RC-2023-0188',
|
|
113
|
+
identityType: 'studentId',
|
|
114
|
+
hashed: false,
|
|
115
|
+
},
|
|
116
|
+
],
|
|
117
|
+
verifiableCredential: [
|
|
118
|
+
// ── COURSE 1 ──────────────────────────────────────────────────────
|
|
119
|
+
{
|
|
120
|
+
'@context': [
|
|
121
|
+
'https://www.w3.org/ns/credentials/v2',
|
|
122
|
+
'https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json',
|
|
123
|
+
],
|
|
124
|
+
id: 'urn:uuid:rc-web101',
|
|
125
|
+
type: ['VerifiableCredential', 'AchievementCredential'],
|
|
126
|
+
name: 'WEB 101 — HTML, CSS & Accessibility',
|
|
127
|
+
issuer: {
|
|
128
|
+
id: 'did:web:registrar.riverside.edu',
|
|
129
|
+
type: ['Profile'],
|
|
130
|
+
name: 'Riverside College',
|
|
131
|
+
},
|
|
132
|
+
validFrom: '2024-09-20T00:00:00Z',
|
|
133
|
+
// Per-course evidence.
|
|
134
|
+
evidence: [
|
|
135
|
+
{
|
|
136
|
+
id: 'https://riverside.edu/portfolios/okafor/web101-landing-page.png',
|
|
137
|
+
type: ['Evidence'],
|
|
138
|
+
name: 'Accessible Landing Page',
|
|
139
|
+
description:
|
|
140
|
+
'Final project: a WCAG 2.1 AA-compliant responsive landing page.',
|
|
141
|
+
genre: 'Image',
|
|
142
|
+
audience: 'Faculty, Employer',
|
|
143
|
+
},
|
|
144
|
+
],
|
|
145
|
+
credentialSubject: {
|
|
146
|
+
id: 'did:example:rc-student-2025-001',
|
|
147
|
+
type: ['AchievementSubject'],
|
|
148
|
+
achievement: {
|
|
149
|
+
id: 'https://riverside.edu/courses/web101',
|
|
150
|
+
type: ['Achievement'],
|
|
151
|
+
achievementType: 'Course',
|
|
152
|
+
name: 'HTML, CSS & Accessibility',
|
|
153
|
+
description:
|
|
154
|
+
'Semantic HTML, modern CSS layout (flexbox, grid), responsive design, and building to WCAG accessibility standards.',
|
|
155
|
+
humanCode: 'WEB 101',
|
|
156
|
+
fieldOfStudy: 'Web Development',
|
|
157
|
+
inLanguage: 'en',
|
|
158
|
+
// Course → framework competency alignment.
|
|
159
|
+
alignment: [
|
|
160
|
+
{
|
|
161
|
+
type: ['Alignment'],
|
|
162
|
+
targetCode: 'WD.FRONT.1',
|
|
163
|
+
targetName: 'Front-End Fundamentals',
|
|
164
|
+
targetFramework: 'Riverside Web Dev Competency Framework',
|
|
165
|
+
targetType: 'CFItem',
|
|
166
|
+
targetUrl: 'https://riverside.edu/frameworks/wd/FRONT.1',
|
|
167
|
+
targetDescription:
|
|
168
|
+
'Builds accessible, responsive interfaces with semantic HTML and modern CSS.',
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
type: ['Alignment'],
|
|
172
|
+
targetCode: 'ceasn:accessibility-aware-design',
|
|
173
|
+
targetName: 'Accessibility-Aware Design',
|
|
174
|
+
targetFramework: 'Open Skills Network',
|
|
175
|
+
targetType: 'ceasn:Competency',
|
|
176
|
+
targetUrl:
|
|
177
|
+
'https://osn.example.org/competencies/accessibility-aware-design',
|
|
178
|
+
},
|
|
179
|
+
],
|
|
180
|
+
resultDescription: [
|
|
181
|
+
{
|
|
182
|
+
id: 'urn:uuid:rc-rd-letter',
|
|
183
|
+
type: ['ResultDescription'],
|
|
184
|
+
name: 'Letter Grade',
|
|
185
|
+
resultType: 'LetterGrade',
|
|
186
|
+
allowedValue: ['A', 'B', 'C', 'D', 'F'],
|
|
187
|
+
},
|
|
188
|
+
],
|
|
189
|
+
},
|
|
190
|
+
result: [
|
|
191
|
+
{
|
|
192
|
+
type: ['Result'],
|
|
193
|
+
value: 'A',
|
|
194
|
+
resultDescription: 'urn:uuid:rc-rd-letter',
|
|
195
|
+
},
|
|
196
|
+
],
|
|
197
|
+
creditsEarned: 3,
|
|
198
|
+
term: 'Fall 2024',
|
|
199
|
+
},
|
|
200
|
+
},
|
|
201
|
+
// ── COURSE 2 ──────────────────────────────────────────────────────
|
|
202
|
+
{
|
|
203
|
+
'@context': [
|
|
204
|
+
'https://www.w3.org/ns/credentials/v2',
|
|
205
|
+
'https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json',
|
|
206
|
+
],
|
|
207
|
+
id: 'urn:uuid:rc-web150',
|
|
208
|
+
type: ['VerifiableCredential', 'AchievementCredential'],
|
|
209
|
+
name: 'WEB 150 — JavaScript Programming',
|
|
210
|
+
issuer: {
|
|
211
|
+
id: 'did:web:registrar.riverside.edu',
|
|
212
|
+
type: ['Profile'],
|
|
213
|
+
name: 'Riverside College',
|
|
214
|
+
},
|
|
215
|
+
validFrom: '2024-12-18T00:00:00Z',
|
|
216
|
+
evidence: [
|
|
217
|
+
{
|
|
218
|
+
id: 'https://riverside.edu/portfolios/okafor/web150-todo-app.pdf',
|
|
219
|
+
type: ['Evidence'],
|
|
220
|
+
name: 'Interactive To-Do App Writeup',
|
|
221
|
+
description:
|
|
222
|
+
'Project report for a vanilla-JS task manager with localStorage persistence.',
|
|
223
|
+
genre: 'Document',
|
|
224
|
+
audience: 'Faculty',
|
|
225
|
+
},
|
|
226
|
+
],
|
|
227
|
+
credentialSubject: {
|
|
228
|
+
id: 'did:example:rc-student-2025-001',
|
|
229
|
+
type: ['AchievementSubject'],
|
|
230
|
+
achievement: {
|
|
231
|
+
id: 'https://riverside.edu/courses/web150',
|
|
232
|
+
type: ['Achievement'],
|
|
233
|
+
achievementType: 'Course',
|
|
234
|
+
name: 'JavaScript Programming',
|
|
235
|
+
description:
|
|
236
|
+
'Core JavaScript: types, functions, closures, the DOM, events, asynchronous patterns, and fetch.',
|
|
237
|
+
humanCode: 'WEB 150',
|
|
238
|
+
fieldOfStudy: 'Web Development',
|
|
239
|
+
inLanguage: 'en',
|
|
240
|
+
alignment: [
|
|
241
|
+
{
|
|
242
|
+
type: ['Alignment'],
|
|
243
|
+
targetCode: 'WD.PROG.1',
|
|
244
|
+
targetName: 'Client-Side Programming',
|
|
245
|
+
targetFramework: 'Riverside Web Dev Competency Framework',
|
|
246
|
+
targetType: 'CFItem',
|
|
247
|
+
targetUrl: 'https://riverside.edu/frameworks/wd/PROG.1',
|
|
248
|
+
targetDescription:
|
|
249
|
+
'Writes interactive client-side logic using modern JavaScript.',
|
|
250
|
+
},
|
|
251
|
+
],
|
|
252
|
+
resultDescription: [
|
|
253
|
+
{
|
|
254
|
+
id: 'urn:uuid:rc-rd-letter',
|
|
255
|
+
type: ['ResultDescription'],
|
|
256
|
+
name: 'Letter Grade',
|
|
257
|
+
resultType: 'LetterGrade',
|
|
258
|
+
allowedValue: ['A', 'B', 'C', 'D', 'F'],
|
|
259
|
+
},
|
|
260
|
+
],
|
|
261
|
+
},
|
|
262
|
+
result: [
|
|
263
|
+
{
|
|
264
|
+
type: ['Result'],
|
|
265
|
+
value: 'A-',
|
|
266
|
+
resultDescription: 'urn:uuid:rc-rd-letter',
|
|
267
|
+
},
|
|
268
|
+
],
|
|
269
|
+
creditsEarned: 4,
|
|
270
|
+
term: 'Fall 2024',
|
|
271
|
+
},
|
|
272
|
+
},
|
|
273
|
+
// ── COURSE 3 ──────────────────────────────────────────────────────
|
|
274
|
+
{
|
|
275
|
+
'@context': [
|
|
276
|
+
'https://www.w3.org/ns/credentials/v2',
|
|
277
|
+
'https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json',
|
|
278
|
+
],
|
|
279
|
+
id: 'urn:uuid:rc-web220',
|
|
280
|
+
type: ['VerifiableCredential', 'AchievementCredential'],
|
|
281
|
+
name: 'WEB 220 — React & Component Architecture',
|
|
282
|
+
issuer: {
|
|
283
|
+
id: 'did:web:registrar.riverside.edu',
|
|
284
|
+
type: ['Profile'],
|
|
285
|
+
name: 'Riverside College',
|
|
286
|
+
},
|
|
287
|
+
validFrom: '2025-05-14T00:00:00Z',
|
|
288
|
+
credentialSubject: {
|
|
289
|
+
id: 'did:example:rc-student-2025-001',
|
|
290
|
+
type: ['AchievementSubject'],
|
|
291
|
+
achievement: {
|
|
292
|
+
id: 'https://riverside.edu/courses/web220',
|
|
293
|
+
type: ['Achievement'],
|
|
294
|
+
achievementType: 'Course',
|
|
295
|
+
name: 'React & Component Architecture',
|
|
296
|
+
description:
|
|
297
|
+
'Building component-based UIs with React: hooks, state management, data fetching, and testing.',
|
|
298
|
+
humanCode: 'WEB 220',
|
|
299
|
+
fieldOfStudy: 'Web Development',
|
|
300
|
+
inLanguage: 'en',
|
|
301
|
+
alignment: [
|
|
302
|
+
{
|
|
303
|
+
type: ['Alignment'],
|
|
304
|
+
targetCode: 'WD.PROG.2',
|
|
305
|
+
targetName: 'Component-Based UI Engineering',
|
|
306
|
+
targetFramework: 'Riverside Web Dev Competency Framework',
|
|
307
|
+
targetType: 'CFItem',
|
|
308
|
+
targetUrl: 'https://riverside.edu/frameworks/wd/PROG.2',
|
|
309
|
+
},
|
|
310
|
+
],
|
|
311
|
+
resultDescription: [
|
|
312
|
+
{
|
|
313
|
+
id: 'urn:uuid:rc-rd-letter',
|
|
314
|
+
type: ['ResultDescription'],
|
|
315
|
+
name: 'Letter Grade',
|
|
316
|
+
resultType: 'LetterGrade',
|
|
317
|
+
allowedValue: ['A', 'B', 'C', 'D', 'F'],
|
|
318
|
+
},
|
|
319
|
+
],
|
|
320
|
+
},
|
|
321
|
+
result: [
|
|
322
|
+
{
|
|
323
|
+
type: ['Result'],
|
|
324
|
+
value: 'A',
|
|
325
|
+
resultDescription: 'urn:uuid:rc-rd-letter',
|
|
326
|
+
},
|
|
327
|
+
],
|
|
328
|
+
creditsEarned: 4,
|
|
329
|
+
term: 'Spring 2025',
|
|
330
|
+
},
|
|
331
|
+
},
|
|
332
|
+
// ── COURSE 4 ──────────────────────────────────────────────────────
|
|
333
|
+
{
|
|
334
|
+
'@context': [
|
|
335
|
+
'https://www.w3.org/ns/credentials/v2',
|
|
336
|
+
'https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json',
|
|
337
|
+
],
|
|
338
|
+
id: 'urn:uuid:rc-web240',
|
|
339
|
+
type: ['VerifiableCredential', 'AchievementCredential'],
|
|
340
|
+
name: 'WEB 240 — APIs & Backend Services',
|
|
341
|
+
issuer: {
|
|
342
|
+
id: 'did:web:registrar.riverside.edu',
|
|
343
|
+
type: ['Profile'],
|
|
344
|
+
name: 'Riverside College',
|
|
345
|
+
},
|
|
346
|
+
validFrom: '2025-05-14T00:00:00Z',
|
|
347
|
+
evidence: [
|
|
348
|
+
{
|
|
349
|
+
id: 'https://riverside.edu/portfolios/okafor/web240-api.pdf',
|
|
350
|
+
type: ['Evidence'],
|
|
351
|
+
name: 'REST API Design Document',
|
|
352
|
+
description:
|
|
353
|
+
'Design and implementation notes for a Node/Express REST API with auth.',
|
|
354
|
+
genre: 'Document',
|
|
355
|
+
audience: 'Faculty, Employer',
|
|
356
|
+
},
|
|
357
|
+
],
|
|
358
|
+
credentialSubject: {
|
|
359
|
+
id: 'did:example:rc-student-2025-001',
|
|
360
|
+
type: ['AchievementSubject'],
|
|
361
|
+
achievement: {
|
|
362
|
+
id: 'https://riverside.edu/courses/web240',
|
|
363
|
+
type: ['Achievement'],
|
|
364
|
+
achievementType: 'Course',
|
|
365
|
+
name: 'APIs & Backend Services',
|
|
366
|
+
description:
|
|
367
|
+
'Designing and building RESTful services with Node and Express, authentication, and persistence.',
|
|
368
|
+
humanCode: 'WEB 240',
|
|
369
|
+
fieldOfStudy: 'Web Development',
|
|
370
|
+
inLanguage: 'en',
|
|
371
|
+
alignment: [
|
|
372
|
+
{
|
|
373
|
+
type: ['Alignment'],
|
|
374
|
+
targetCode: 'WD.BACK.1',
|
|
375
|
+
targetName: 'Server-Side Services',
|
|
376
|
+
targetFramework: 'Riverside Web Dev Competency Framework',
|
|
377
|
+
targetType: 'CFItem',
|
|
378
|
+
targetUrl: 'https://riverside.edu/frameworks/wd/BACK.1',
|
|
379
|
+
},
|
|
380
|
+
],
|
|
381
|
+
resultDescription: [
|
|
382
|
+
{
|
|
383
|
+
id: 'urn:uuid:rc-rd-letter',
|
|
384
|
+
type: ['ResultDescription'],
|
|
385
|
+
name: 'Letter Grade',
|
|
386
|
+
resultType: 'LetterGrade',
|
|
387
|
+
allowedValue: ['A', 'B', 'C', 'D', 'F'],
|
|
388
|
+
},
|
|
389
|
+
],
|
|
390
|
+
},
|
|
391
|
+
result: [
|
|
392
|
+
{
|
|
393
|
+
type: ['Result'],
|
|
394
|
+
value: 'B+',
|
|
395
|
+
resultDescription: 'urn:uuid:rc-rd-letter',
|
|
396
|
+
},
|
|
397
|
+
],
|
|
398
|
+
creditsEarned: 4,
|
|
399
|
+
term: 'Spring 2025',
|
|
400
|
+
},
|
|
401
|
+
},
|
|
402
|
+
|
|
403
|
+
// ── CERTIFICATE (PROGRAM) ─────────────────────────────────────────
|
|
404
|
+
{
|
|
405
|
+
'@context': [
|
|
406
|
+
'https://www.w3.org/ns/credentials/v2',
|
|
407
|
+
'https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json',
|
|
408
|
+
],
|
|
409
|
+
id: 'urn:uuid:rc-cert-001',
|
|
410
|
+
type: ['VerifiableCredential', 'AchievementCredential'],
|
|
411
|
+
name: 'Full-Stack Web Development Certificate',
|
|
412
|
+
issuer: {
|
|
413
|
+
id: 'did:web:registrar.riverside.edu',
|
|
414
|
+
type: ['Profile'],
|
|
415
|
+
name: 'Riverside College',
|
|
416
|
+
},
|
|
417
|
+
validFrom: '2025-05-30T00:00:00Z',
|
|
418
|
+
// Program-level evidence.
|
|
419
|
+
evidence: [
|
|
420
|
+
{
|
|
421
|
+
id: 'https://riverside.edu/certificates/c-rc-2025-001.jpg',
|
|
422
|
+
type: ['Evidence'],
|
|
423
|
+
name: 'Certificate of Completion',
|
|
424
|
+
description:
|
|
425
|
+
'Full-Stack Web Development certificate awarded May 30, 2025.',
|
|
426
|
+
genre: 'Image',
|
|
427
|
+
audience: 'General',
|
|
428
|
+
},
|
|
429
|
+
],
|
|
430
|
+
credentialSubject: {
|
|
431
|
+
id: 'did:example:rc-student-2025-001',
|
|
432
|
+
type: ['AchievementSubject'],
|
|
433
|
+
achievement: {
|
|
434
|
+
id: 'https://riverside.edu/programs/fullstack-cert',
|
|
435
|
+
type: ['Achievement'],
|
|
436
|
+
achievementType: 'LearningProgram',
|
|
437
|
+
name: 'Full-Stack Web Development Certificate',
|
|
438
|
+
description:
|
|
439
|
+
'A professional certificate covering the full web stack: accessible front-ends, interactive JavaScript, React, and backend APIs.',
|
|
440
|
+
humanCode: 'CERT-FSWD',
|
|
441
|
+
fieldOfStudy: 'Web Development',
|
|
442
|
+
inLanguage: 'en',
|
|
443
|
+
// Program → framework alignment.
|
|
444
|
+
alignment: [
|
|
445
|
+
{
|
|
446
|
+
type: ['Alignment'],
|
|
447
|
+
targetCode: 'OND-WEBDEV',
|
|
448
|
+
targetName: 'O*NET Web Developers (15-1254.00)',
|
|
449
|
+
targetFramework: 'O*NET-SOC 2019',
|
|
450
|
+
targetType: 'CTDL',
|
|
451
|
+
targetUrl: 'https://www.onetonline.org/link/summary/15-1254.00',
|
|
452
|
+
targetDescription:
|
|
453
|
+
'Aligns to the O*NET occupational profile for Web Developers.',
|
|
454
|
+
},
|
|
455
|
+
],
|
|
456
|
+
resultDescription: [
|
|
457
|
+
{
|
|
458
|
+
id: 'urn:uuid:rc-rd-gpa',
|
|
459
|
+
type: ['ResultDescription'],
|
|
460
|
+
name: 'Certificate GPA',
|
|
461
|
+
resultType: 'GradePointAverage',
|
|
462
|
+
valueMin: '0.0',
|
|
463
|
+
valueMax: '4.0',
|
|
464
|
+
},
|
|
465
|
+
],
|
|
466
|
+
},
|
|
467
|
+
result: [
|
|
468
|
+
{
|
|
469
|
+
type: ['Result'],
|
|
470
|
+
value: 3.78,
|
|
471
|
+
resultDescription: 'urn:uuid:rc-rd-gpa',
|
|
472
|
+
},
|
|
473
|
+
],
|
|
474
|
+
},
|
|
475
|
+
},
|
|
476
|
+
|
|
477
|
+
// ── COMPETENCIES ──────────────────────────────────────────────────
|
|
478
|
+
{
|
|
479
|
+
'@context': [
|
|
480
|
+
'https://www.w3.org/ns/credentials/v2',
|
|
481
|
+
'https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json',
|
|
482
|
+
],
|
|
483
|
+
id: 'urn:uuid:rc-comp-frontend',
|
|
484
|
+
type: ['VerifiableCredential', 'AchievementCredential'],
|
|
485
|
+
name: 'Competency — Accessible Front-End Development',
|
|
486
|
+
issuer: {
|
|
487
|
+
id: 'did:web:registrar.riverside.edu',
|
|
488
|
+
type: ['Profile'],
|
|
489
|
+
name: 'Riverside College',
|
|
490
|
+
},
|
|
491
|
+
validFrom: '2025-05-30T00:00:00Z',
|
|
492
|
+
credentialSubject: {
|
|
493
|
+
id: 'did:example:rc-student-2025-001',
|
|
494
|
+
type: ['AchievementSubject'],
|
|
495
|
+
achievement: {
|
|
496
|
+
id: 'https://riverside.edu/competencies/accessible-frontend',
|
|
497
|
+
type: ['Achievement'],
|
|
498
|
+
achievementType: 'Competency',
|
|
499
|
+
name: 'Accessible Front-End Development',
|
|
500
|
+
description:
|
|
501
|
+
'Builds responsive, accessible user interfaces that meet WCAG 2.1 AA.',
|
|
502
|
+
fieldOfStudy: 'Web Development',
|
|
503
|
+
alignment: [
|
|
504
|
+
{
|
|
505
|
+
type: ['Alignment'],
|
|
506
|
+
targetCode: 'WD.FRONT.1',
|
|
507
|
+
targetName: 'Front-End Fundamentals',
|
|
508
|
+
targetFramework: 'Riverside Web Dev Competency Framework',
|
|
509
|
+
targetType: 'CFItem',
|
|
510
|
+
targetUrl: 'https://riverside.edu/frameworks/wd/FRONT.1',
|
|
511
|
+
},
|
|
512
|
+
],
|
|
513
|
+
resultDescription: [
|
|
514
|
+
{
|
|
515
|
+
id: 'urn:uuid:rc-rd-comp-level',
|
|
516
|
+
type: ['ResultDescription'],
|
|
517
|
+
name: 'Competency Level',
|
|
518
|
+
resultType: 'RubricCriterionLevel',
|
|
519
|
+
allowedValue: ['Developing', 'Proficient', 'Advanced'],
|
|
520
|
+
},
|
|
521
|
+
],
|
|
522
|
+
},
|
|
523
|
+
result: [
|
|
524
|
+
{
|
|
525
|
+
type: ['Result'],
|
|
526
|
+
value: 'Advanced',
|
|
527
|
+
resultDescription: 'urn:uuid:rc-rd-comp-level',
|
|
528
|
+
},
|
|
529
|
+
],
|
|
530
|
+
},
|
|
531
|
+
},
|
|
532
|
+
{
|
|
533
|
+
'@context': [
|
|
534
|
+
'https://www.w3.org/ns/credentials/v2',
|
|
535
|
+
'https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json',
|
|
536
|
+
],
|
|
537
|
+
id: 'urn:uuid:rc-comp-js',
|
|
538
|
+
type: ['VerifiableCredential', 'AchievementCredential'],
|
|
539
|
+
name: 'Competency — JavaScript Application Development',
|
|
540
|
+
issuer: {
|
|
541
|
+
id: 'did:web:registrar.riverside.edu',
|
|
542
|
+
type: ['Profile'],
|
|
543
|
+
name: 'Riverside College',
|
|
544
|
+
},
|
|
545
|
+
validFrom: '2025-05-30T00:00:00Z',
|
|
546
|
+
credentialSubject: {
|
|
547
|
+
id: 'did:example:rc-student-2025-001',
|
|
548
|
+
type: ['AchievementSubject'],
|
|
549
|
+
achievement: {
|
|
550
|
+
id: 'https://riverside.edu/competencies/javascript-apps',
|
|
551
|
+
type: ['Achievement'],
|
|
552
|
+
achievementType: 'Competency',
|
|
553
|
+
name: 'JavaScript Application Development',
|
|
554
|
+
description:
|
|
555
|
+
'Designs and builds interactive applications using JavaScript and React.',
|
|
556
|
+
fieldOfStudy: 'Web Development',
|
|
557
|
+
alignment: [
|
|
558
|
+
{
|
|
559
|
+
type: ['Alignment'],
|
|
560
|
+
targetCode: 'WD.PROG.2',
|
|
561
|
+
targetName: 'Component-Based UI Engineering',
|
|
562
|
+
targetFramework: 'Riverside Web Dev Competency Framework',
|
|
563
|
+
targetType: 'CFItem',
|
|
564
|
+
targetUrl: 'https://riverside.edu/frameworks/wd/PROG.2',
|
|
565
|
+
},
|
|
566
|
+
],
|
|
567
|
+
resultDescription: [
|
|
568
|
+
{
|
|
569
|
+
id: 'urn:uuid:rc-rd-comp-level',
|
|
570
|
+
type: ['ResultDescription'],
|
|
571
|
+
name: 'Competency Level',
|
|
572
|
+
resultType: 'RubricCriterionLevel',
|
|
573
|
+
allowedValue: ['Developing', 'Proficient', 'Advanced'],
|
|
574
|
+
},
|
|
575
|
+
],
|
|
576
|
+
},
|
|
577
|
+
result: [
|
|
578
|
+
{
|
|
579
|
+
type: ['Result'],
|
|
580
|
+
value: 'Proficient',
|
|
581
|
+
resultDescription: 'urn:uuid:rc-rd-comp-level',
|
|
582
|
+
},
|
|
583
|
+
],
|
|
584
|
+
},
|
|
585
|
+
},
|
|
586
|
+
{
|
|
587
|
+
'@context': [
|
|
588
|
+
'https://www.w3.org/ns/credentials/v2',
|
|
589
|
+
'https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json',
|
|
590
|
+
],
|
|
591
|
+
id: 'urn:uuid:rc-comp-backend',
|
|
592
|
+
type: ['VerifiableCredential', 'AchievementCredential'],
|
|
593
|
+
name: 'Competency — Backend API Development',
|
|
594
|
+
issuer: {
|
|
595
|
+
id: 'did:web:registrar.riverside.edu',
|
|
596
|
+
type: ['Profile'],
|
|
597
|
+
name: 'Riverside College',
|
|
598
|
+
},
|
|
599
|
+
validFrom: '2025-05-30T00:00:00Z',
|
|
600
|
+
credentialSubject: {
|
|
601
|
+
id: 'did:example:rc-student-2025-001',
|
|
602
|
+
type: ['AchievementSubject'],
|
|
603
|
+
achievement: {
|
|
604
|
+
id: 'https://riverside.edu/competencies/backend-apis',
|
|
605
|
+
type: ['Achievement'],
|
|
606
|
+
achievementType: 'Competency',
|
|
607
|
+
name: 'Backend API Development',
|
|
608
|
+
description:
|
|
609
|
+
'Designs and implements secure RESTful services and data persistence.',
|
|
610
|
+
fieldOfStudy: 'Web Development',
|
|
611
|
+
alignment: [
|
|
612
|
+
{
|
|
613
|
+
type: ['Alignment'],
|
|
614
|
+
targetCode: 'WD.BACK.1',
|
|
615
|
+
targetName: 'Server-Side Services',
|
|
616
|
+
targetFramework: 'Riverside Web Dev Competency Framework',
|
|
617
|
+
targetType: 'CFItem',
|
|
618
|
+
targetUrl: 'https://riverside.edu/frameworks/wd/BACK.1',
|
|
619
|
+
},
|
|
620
|
+
],
|
|
621
|
+
resultDescription: [
|
|
622
|
+
{
|
|
623
|
+
id: 'urn:uuid:rc-rd-comp-level',
|
|
624
|
+
type: ['ResultDescription'],
|
|
625
|
+
name: 'Competency Level',
|
|
626
|
+
resultType: 'RubricCriterionLevel',
|
|
627
|
+
allowedValue: ['Developing', 'Proficient', 'Advanced'],
|
|
628
|
+
},
|
|
629
|
+
],
|
|
630
|
+
},
|
|
631
|
+
result: [
|
|
632
|
+
{
|
|
633
|
+
type: ['Result'],
|
|
634
|
+
value: 'Proficient',
|
|
635
|
+
resultDescription: 'urn:uuid:rc-rd-comp-level',
|
|
636
|
+
},
|
|
637
|
+
],
|
|
638
|
+
},
|
|
639
|
+
},
|
|
640
|
+
],
|
|
641
|
+
|
|
642
|
+
association: [
|
|
643
|
+
// Courses are part of the certificate.
|
|
644
|
+
{
|
|
645
|
+
type: ['Association'],
|
|
646
|
+
associationType: 'isChildOf',
|
|
647
|
+
sourceId: 'urn:uuid:rc-web101',
|
|
648
|
+
targetId: 'urn:uuid:rc-cert-001',
|
|
649
|
+
},
|
|
650
|
+
{
|
|
651
|
+
type: ['Association'],
|
|
652
|
+
associationType: 'isChildOf',
|
|
653
|
+
sourceId: 'urn:uuid:rc-web150',
|
|
654
|
+
targetId: 'urn:uuid:rc-cert-001',
|
|
655
|
+
},
|
|
656
|
+
{
|
|
657
|
+
type: ['Association'],
|
|
658
|
+
associationType: 'isChildOf',
|
|
659
|
+
sourceId: 'urn:uuid:rc-web220',
|
|
660
|
+
targetId: 'urn:uuid:rc-cert-001',
|
|
661
|
+
},
|
|
662
|
+
{
|
|
663
|
+
type: ['Association'],
|
|
664
|
+
associationType: 'isChildOf',
|
|
665
|
+
sourceId: 'urn:uuid:rc-web240',
|
|
666
|
+
targetId: 'urn:uuid:rc-cert-001',
|
|
667
|
+
},
|
|
668
|
+
|
|
669
|
+
// Competencies are developed by specific courses (parent mapping).
|
|
670
|
+
{
|
|
671
|
+
type: ['Association'],
|
|
672
|
+
associationType: 'isRelatedTo',
|
|
673
|
+
sourceId: 'urn:uuid:rc-comp-frontend',
|
|
674
|
+
targetId: 'urn:uuid:rc-web101',
|
|
675
|
+
},
|
|
676
|
+
{
|
|
677
|
+
type: ['Association'],
|
|
678
|
+
associationType: 'isRelatedTo',
|
|
679
|
+
sourceId: 'urn:uuid:rc-comp-js',
|
|
680
|
+
targetId: 'urn:uuid:rc-web150',
|
|
681
|
+
},
|
|
682
|
+
{
|
|
683
|
+
type: ['Association'],
|
|
684
|
+
associationType: 'isRelatedTo',
|
|
685
|
+
sourceId: 'urn:uuid:rc-comp-js',
|
|
686
|
+
targetId: 'urn:uuid:rc-web220',
|
|
687
|
+
},
|
|
688
|
+
{
|
|
689
|
+
type: ['Association'],
|
|
690
|
+
associationType: 'isRelatedTo',
|
|
691
|
+
sourceId: 'urn:uuid:rc-comp-backend',
|
|
692
|
+
targetId: 'urn:uuid:rc-web240',
|
|
693
|
+
},
|
|
694
|
+
|
|
695
|
+
// Competencies also relate to the overall certificate.
|
|
696
|
+
{
|
|
697
|
+
type: ['Association'],
|
|
698
|
+
associationType: 'isRelatedTo',
|
|
699
|
+
sourceId: 'urn:uuid:rc-comp-frontend',
|
|
700
|
+
targetId: 'urn:uuid:rc-cert-001',
|
|
701
|
+
},
|
|
702
|
+
{
|
|
703
|
+
type: ['Association'],
|
|
704
|
+
associationType: 'isRelatedTo',
|
|
705
|
+
sourceId: 'urn:uuid:rc-comp-js',
|
|
706
|
+
targetId: 'urn:uuid:rc-cert-001',
|
|
707
|
+
},
|
|
708
|
+
{
|
|
709
|
+
type: ['Association'],
|
|
710
|
+
associationType: 'isRelatedTo',
|
|
711
|
+
sourceId: 'urn:uuid:rc-comp-backend',
|
|
712
|
+
targetId: 'urn:uuid:rc-cert-001',
|
|
713
|
+
},
|
|
714
|
+
|
|
715
|
+
// Course sequencing.
|
|
716
|
+
{
|
|
717
|
+
type: ['Association'],
|
|
718
|
+
associationType: 'precedes',
|
|
719
|
+
sourceId: 'urn:uuid:rc-web101',
|
|
720
|
+
targetId: 'urn:uuid:rc-web150',
|
|
721
|
+
},
|
|
722
|
+
{
|
|
723
|
+
type: ['Association'],
|
|
724
|
+
associationType: 'precedes',
|
|
725
|
+
sourceId: 'urn:uuid:rc-web150',
|
|
726
|
+
targetId: 'urn:uuid:rc-web220',
|
|
727
|
+
},
|
|
728
|
+
{
|
|
729
|
+
type: ['Association'],
|
|
730
|
+
associationType: 'precedes',
|
|
731
|
+
sourceId: 'urn:uuid:rc-web150',
|
|
732
|
+
targetId: 'urn:uuid:rc-web240',
|
|
733
|
+
},
|
|
734
|
+
],
|
|
735
|
+
},
|
|
736
|
+
},
|
|
737
|
+
};
|