@conform-ed/contracts 0.0.3
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/.turbo/turbo-build.log +2 -0
- package/.turbo/turbo-format.log +6 -0
- package/.turbo/turbo-lint.log +4 -0
- package/.turbo/turbo-test.log +196 -0
- package/.turbo/turbo-typecheck.log +2 -0
- package/README.md +52 -0
- package/caliper-v1_2-zod-templates.md +123 -0
- package/case-v1_1-zod-templates.md +290 -0
- package/cat-v1_0-zod-templates.md +73 -0
- package/cc-v1_3-zod-templates.md +531 -0
- package/cc-v1_4-zod-templates.md +247 -0
- package/clr-v2_0-zod-templates.md +117 -0
- package/cmi5-v1_0-zod-templates.md +9 -0
- package/lti-zod-templates.md +11 -0
- package/oneroster-v1_2-zod-templates.md +76 -0
- package/open-badges-v3_0-zod-templates.md +66 -0
- package/package.json +42 -0
- package/qti-v2_1-zod-templates.md +45 -0
- package/qti-v2_2-zod-templates.md +32 -0
- package/qti-v3_0_1-zod-templates.md +421 -0
- package/src/adapter.ts +83 -0
- package/src/caliper/v1_2/caliper_v1p2_bootcamp_schema.ts +781 -0
- package/src/caliper/v1_2/index.ts +37 -0
- package/src/caliper/v1_2/shared.ts +122 -0
- package/src/caliper/v1_2/textual_requirements.ts +219 -0
- package/src/case/v1_1/case_v1p1_cfassociation_jsonschema1.ts +1 -0
- package/src/case/v1_1/case_v1p1_cfassociationgrouping_jsonschema1.ts +1 -0
- package/src/case/v1_1/case_v1p1_cfassociationset_jsonschema1.ts +1 -0
- package/src/case/v1_1/case_v1p1_cfconceptset_jsonschema1.ts +1 -0
- package/src/case/v1_1/case_v1p1_cfdocument_jsonschema1.ts +1 -0
- package/src/case/v1_1/case_v1p1_cfdocumentset_jsonschema1.ts +1 -0
- package/src/case/v1_1/case_v1p1_cfitem_jsonschema1.ts +1 -0
- package/src/case/v1_1/case_v1p1_cfitemtypeset_jsonschema1.ts +1 -0
- package/src/case/v1_1/case_v1p1_cflicense_jsonschema1.ts +1 -0
- package/src/case/v1_1/case_v1p1_cfpackage_jsonschema1.ts +1 -0
- package/src/case/v1_1/case_v1p1_cfrubric_jsonschema1.ts +1 -0
- package/src/case/v1_1/case_v1p1_cfsubjectset_jsonschema1.ts +1 -0
- package/src/case/v1_1/case_v1p1_imsx_statusinfo_jsonschema1.ts +1 -0
- package/src/case/v1_1/case_v1p1_openapi3_restbinding_schema.ts +113 -0
- package/src/case/v1_1/index.ts +95 -0
- package/src/case/v1_1/shared.ts +384 -0
- package/src/cat/v1_0/cat_v1p0_restbinding_operations_schema.ts +75 -0
- package/src/cat/v1_0/index.ts +124 -0
- package/src/cat/v1_0/shared.ts +345 -0
- package/src/clr/v2_0/clr_v2p0_achievementcredential_schema.ts +16 -0
- package/src/clr/v2_0/clr_v2p0_clrcredential_schema.ts +9 -0
- package/src/clr/v2_0/clr_v2p0_endorsementcredential_schema.ts +11 -0
- package/src/clr/v2_0/clr_v2p0_getclrcredentialsresponse_schema.ts +1 -0
- package/src/clr/v2_0/clr_v2p0_imsx_statusinfo_schema.ts +8 -0
- package/src/clr/v2_0/clr_v2p0_profile_schema.ts +9 -0
- package/src/clr/v2_0/index.ts +22 -0
- package/src/clr/v2_0/shared.ts +206 -0
- package/src/cmi5/index.ts +3 -0
- package/src/cmi5/v1_0/index.ts +134 -0
- package/src/common-cartridge/v1_3/ccv1p3_imsccauth_v1p3.ts +26 -0
- package/src/common-cartridge/v1_3/ccv1p3_imscp_v1p2_v1p0.ts +352 -0
- package/src/common-cartridge/v1_3/ccv1p3_imscsmd_v1p0.ts +35 -0
- package/src/common-cartridge/v1_3/ccv1p3_imsdt_v1p3.ts +33 -0
- package/src/common-cartridge/v1_3/ccv1p3_imswl_v1p3.ts +23 -0
- package/src/common-cartridge/v1_3/ccv1p3_lomccltilink_v1p0.ts +14 -0
- package/src/common-cartridge/v1_3/ccv1p3_lommanifest_v1p0.ts +14 -0
- package/src/common-cartridge/v1_3/ccv1p3_lomresource_v1p0.ts +14 -0
- package/src/common-cartridge/v1_3/ccv1p3_qtiasiv1p2p1_v1p0.ts +964 -0
- package/src/common-cartridge/v1_3/index.ts +41 -0
- package/src/common-cartridge/v1_3/lom-internal.ts +396 -0
- package/src/common-cartridge/v1_3/shared.ts +68 -0
- package/src/common-cartridge/v1_4/core/ccv1p4_imscp_v1p2_v1p0.ts +360 -0
- package/src/common-cartridge/v1_4/core/ccv1p4_lommanifest_v1p0.ts +14 -0
- package/src/common-cartridge/v1_4/core/ccv1p4_lomresource_v1p0.ts +14 -0
- package/src/common-cartridge/v1_4/extension/cc_extresource_assignmentv1p0_v1p0.ts +61 -0
- package/src/common-cartridge/v1_4/extension/ccv1p4_cpextensionv1p2_v1p0.ts +20 -0
- package/src/common-cartridge/v1_4/extension/ims_openvideov1p0_v1p0.ts +325 -0
- package/src/common-cartridge/v1_4/index.ts +104 -0
- package/src/common-cartridge/v1_4/k12/ccv1p4_imscp_v1p2_v1p0.ts +19 -0
- package/src/common-cartridge/v1_4/k12/ccv1p4_imscp_v1p2_v1p0_thin.ts +17 -0
- package/src/common-cartridge/v1_4/k12/ccv1p4_lommanifest_v1p0.ts +14 -0
- package/src/common-cartridge/v1_4/k12/ccv1p4_lomresource_v1p0.ts +14 -0
- package/src/common-cartridge/v1_4/lom-internal.ts +476 -0
- package/src/common-cartridge/v1_4/shared/ccv1p4_imsccauth_v1p4.ts +26 -0
- package/src/common-cartridge/v1_4/shared/ccv1p4_imscsmd_v1p1.ts +36 -0
- package/src/common-cartridge/v1_4/shared/ccv1p4_imsdt_v1p4.ts +33 -0
- package/src/common-cartridge/v1_4/shared/ccv1p4_imslticc_v1p4.ts +45 -0
- package/src/common-cartridge/v1_4/shared/ccv1p4_imswl_v1p4.ts +23 -0
- package/src/common-cartridge/v1_4/shared/ccv1p4_lomccltilink_v1p0.ts +14 -0
- package/src/common-cartridge/v1_4/shared/ccv1p4_qtiasiv1p2p1_v1p0.ts +964 -0
- package/src/common-cartridge/v1_4/shared/imsbasiclti_v1p0p1.ts +24 -0
- package/src/common-cartridge/v1_4/shared/imslticm_v1p0.ts +23 -0
- package/src/common-cartridge/v1_4/shared/imslticp_v1p0.ts +57 -0
- package/src/common-cartridge/v1_4/shared/lineitem_v1p0.ts +35 -0
- package/src/common-cartridge/v1_4/shared/resourcea11ymetadata-20210915.ts +110 -0
- package/src/common-cartridge/v1_4/shared.ts +68 -0
- package/src/common-cartridge/v1_4/thin/ccv1p4_imscp_v1p2_v1p0.ts +243 -0
- package/src/common-cartridge/v1_4/thin/ccv1p4_lommanifest_v1p0.ts +14 -0
- package/src/common-cartridge/v1_4/thin/ccv1p4_lomresource_v1p0.ts +14 -0
- package/src/common-cartridge/v1_4/vdex/imsmd_loose_v1p3p2.ts +13 -0
- package/src/common-cartridge/v1_4/vdex/imsvdex_v1p0.ts +124 -0
- package/src/config.ts +121 -0
- package/src/index.ts +32 -0
- package/src/lti/ags/v2_0/index.ts +97 -0
- package/src/lti/deep-linking/v2_0/index.ts +100 -0
- package/src/lti/index.ts +26 -0
- package/src/lti/nrps/v2_0/index.ts +69 -0
- package/src/lti/proctoring/v1_0/index.ts +131 -0
- package/src/lti/shared.ts +66 -0
- package/src/lti/v1_3/index.ts +84 -0
- package/src/oneroster/v1_2/index.ts +156 -0
- package/src/oneroster/v1_2/or_v1p2_csv_binding_schema.ts +427 -0
- package/src/oneroster/v1_2/or_v1p2_gradebook_restbinding_schema.ts +120 -0
- package/src/oneroster/v1_2/or_v1p2_gradebook_service_schema.ts +243 -0
- package/src/oneroster/v1_2/or_v1p2_resource_restbinding_schema.ts +24 -0
- package/src/oneroster/v1_2/or_v1p2_resource_service_schema.ts +47 -0
- package/src/oneroster/v1_2/or_v1p2_rostering_restbinding_schema.ts +84 -0
- package/src/oneroster/v1_2/or_v1p2_rostering_service_schema.ts +288 -0
- package/src/oneroster/v1_2/shared.ts +90 -0
- package/src/open-badges/v3_0/index.ts +20 -0
- package/src/open-badges/v3_0/ob_v3p0_achievementcredential_schema.ts +17 -0
- package/src/open-badges/v3_0/ob_v3p0_endorsementcredential_schema.ts +11 -0
- package/src/open-badges/v3_0/ob_v3p0_getopenbadgecredentialsresponse_schema.ts +1 -0
- package/src/open-badges/v3_0/ob_v3p0_imsx_statusinfo_schema.ts +8 -0
- package/src/open-badges/v3_0/ob_v3p0_profile_schema.ts +9 -0
- package/src/open-badges/v3_0/shared.ts +458 -0
- package/src/qti/v2-internal.ts +1683 -0
- package/src/qti/v2_1/apipv1p0_qtiextv2p1_v1p0.ts +3 -0
- package/src/qti/v2_1/imsqti_metadata_v2p1.ts +3 -0
- package/src/qti/v2_1/imsqti_result_v2p1.ts +3 -0
- package/src/qti/v2_1/imsqti_usagedata_v2p1.ts +3 -0
- package/src/qti/v2_1/imsqti_v2p1p2.ts +71 -0
- package/src/qti/v2_1/index.ts +53 -0
- package/src/qti/v2_1/qtiv2p1_imscpv1p2_v1p0.ts +3 -0
- package/src/qti/v2_1/schemas.ts +15 -0
- package/src/qti/v2_1/shared.ts +3 -0
- package/src/qti/v2_2/apipv1p0_qtiextv2p2_v1p0p1.ts +3 -0
- package/src/qti/v2_2/imsqti_metadata_v2p2.ts +3 -0
- package/src/qti/v2_2/imsqti_result_v2p2.ts +3 -0
- package/src/qti/v2_2/imsqti_usagedata_v2p2.ts +3 -0
- package/src/qti/v2_2/imsqti_v2p2p4.ts +76 -0
- package/src/qti/v2_2/imsqtiv2p2p4_html5_v1p0.ts +8 -0
- package/src/qti/v2_2/index.ts +59 -0
- package/src/qti/v2_2/qtiv2p2_csm_v2p2.ts +4 -0
- package/src/qti/v2_2/qtiv2p2_imscpv1p2_v1p0.ts +3 -0
- package/src/qti/v2_2/schemas.ts +19 -0
- package/src/qti/v2_2/shared.ts +3 -0
- package/src/qti/v3_0_1/assessment-internal.ts +1509 -0
- package/src/qti/v3_0_1/imsqti_asiv3p0p1_v1p0.ts +57 -0
- package/src/qti/v3_0_1/imsqti_itemv3p0p1_v1p0.ts +60 -0
- package/src/qti/v3_0_1/imsqti_metadatav3p0_v1p0.ts +73 -0
- package/src/qti/v3_0_1/imsqti_outcomev3p0p1_v1p0.ts +11 -0
- package/src/qti/v3_0_1/imsqti_responseprocessingv3p0p1_v1p0.ts +17 -0
- package/src/qti/v3_0_1/imsqti_resultv3p0_v1p0.ts +222 -0
- package/src/qti/v3_0_1/imsqti_sectionv3p0p1_v1p0.ts +15 -0
- package/src/qti/v3_0_1/imsqti_stimulusv3p0p1_v1p0.ts +15 -0
- package/src/qti/v3_0_1/imsqti_testv3p0p1_v1p0.ts +49 -0
- package/src/qti/v3_0_1/imsqti_usagedatav3p0_v1p0.ts +77 -0
- package/src/qti/v3_0_1/imsqtiv3p0_afa3p0pnp_v1p0.ts +269 -0
- package/src/qti/v3_0_1/index.ts +50 -0
- package/src/qti/v3_0_1/processing-internal.ts +667 -0
- package/src/qti/v3_0_1/shared.ts +146 -0
- package/src/qti/v3_0_1/variables-internal.ts +274 -0
- package/src/shared/imsx-status.ts +49 -0
- package/src/summary.ts +70 -0
- package/src/vc-data-model/v2_0/index.ts +27 -0
- package/src/vc-data-model/v2_0/shared.ts +206 -0
- package/src/xapi/index.ts +12 -0
- package/src/xapi/shared.ts +444 -0
- package/src/xapi/v1_0_3/index.ts +169 -0
- package/src/xapi/v2_0/index.ts +256 -0
- package/test/caliper-v1_2.test.ts +270 -0
- package/test/case-v1_1.test.ts +147 -0
- package/test/cat-v1_0.test.ts +338 -0
- package/test/cc-v1_4.test.ts +239 -0
- package/test/clr-v2_0.test.ts +225 -0
- package/test/cmi5-v1_0.test.ts +196 -0
- package/test/contracts.test.ts +125 -0
- package/test/fixtures/cmi5/extended-cmi5.xml +72 -0
- package/test/fixtures/cmi5/simple-cmi5.xml +26 -0
- package/test/lti.test.ts +146 -0
- package/test/oneroster-v1_2.test.ts +234 -0
- package/test/open-badges-v3_0.test.ts +144 -0
- package/test/qti-v2_1.test.ts +146 -0
- package/test/qti-v2_2.test.ts +154 -0
- package/test/qti-v3_0_1.test.ts +576 -0
- package/test/schema-examples.test.ts +101 -0
- package/test/vc-data-model-v2_0.test.ts +63 -0
- package/test/xapi.test.ts +384 -0
- package/tsconfig.json +7 -0
- package/vc-data-model-v2_0-zod-templates.md +43 -0
- package/xapi-zod-templates.md +95 -0
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
# Common Cartridge 1.4 candidate-final XSD bundle → Zod template notes
|
|
2
|
+
|
|
3
|
+
## Published specification
|
|
4
|
+
|
|
5
|
+
- Public implementation guide consulted for this port: `https://www.imsglobal.org/spec/cc/v1p4/impl/`
|
|
6
|
+
- Likely published-final landing page: `https://www.imsglobal.org/spec/cc/v1p4`
|
|
7
|
+
|
|
8
|
+
This note accompanies the split source under `packages/contracts/src/common-cartridge/v1_4/`.
|
|
9
|
+
|
|
10
|
+
The Common Cartridge 1.4 candidate-final bundle is materially broader than the existing 1.3 bundle: it includes multiple manifest profiles, additional shared resource schemas, imported LTI support schemas, extension schemas, and VDEX support files. This document records the choices made to keep the 1.4 port close to the existing `v1_3` style while still matching the shape of the real source set.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## 1. What was analyzed
|
|
15
|
+
|
|
16
|
+
The templates are based on the local source bundle under `tmp/cc/v1_4/`:
|
|
17
|
+
|
|
18
|
+
- `core/`
|
|
19
|
+
- `thin/`
|
|
20
|
+
- `k12/`
|
|
21
|
+
- `shared/`
|
|
22
|
+
- `extension/`
|
|
23
|
+
- `vdex/`
|
|
24
|
+
|
|
25
|
+
Representative entry-point XSDs:
|
|
26
|
+
|
|
27
|
+
- `core/ccv1p4_imscp_v1p2_v1p0.xsd`
|
|
28
|
+
- `thin/ccv1p4_imscp_v1p2_v1p0.xsd`
|
|
29
|
+
- `k12/ccv1p4_imscp_v1p2_v1p0.xsd`
|
|
30
|
+
- `k12/ccv1p4_imscp_v1p2_v1p0.xsd.thin`
|
|
31
|
+
- `shared/ccv1p4_imslticc_v1p4.xsd`
|
|
32
|
+
- `extension/cc_extresource_assignmentv1p0_v1p0.xsd`
|
|
33
|
+
- `extension/ims_openvideov1p0_v1p0.xsd`
|
|
34
|
+
- `vdex/imsvdex_v1p0.xsd`
|
|
35
|
+
|
|
36
|
+
The candidate final implementation guide at `https://www.imsglobal.org/spec/cc/v1p4/impl` was also consulted to confirm the intended profile split and the relationship between the standard, Thin CC, and K-12 variants.
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## 2. The main structural decision: mirror the source bundle layout
|
|
41
|
+
|
|
42
|
+
### Problem
|
|
43
|
+
|
|
44
|
+
Common Cartridge 1.3 fit comfortably in one flat implementation directory because the source bundle itself was flat. Common Cartridge 1.4 does not:
|
|
45
|
+
|
|
46
|
+
- `core`, `thin`, and `k12` reuse several of the same filenames
|
|
47
|
+
- the K-12 directory contains both a standard manifest XSD and a separate `.xsd.thin` variant
|
|
48
|
+
- the shared/extension/vdex areas introduce several new families that are not just minor renames of 1.3 files
|
|
49
|
+
|
|
50
|
+
Flattening all of that into a single directory would require invented file renames for source collisions.
|
|
51
|
+
|
|
52
|
+
### Decision
|
|
53
|
+
|
|
54
|
+
The port mirrors the source bundle under `src/common-cartridge/v1_4/`:
|
|
55
|
+
|
|
56
|
+
- `core/`
|
|
57
|
+
- `thin/`
|
|
58
|
+
- `k12/`
|
|
59
|
+
- `shared/`
|
|
60
|
+
- `extension/`
|
|
61
|
+
- `vdex/`
|
|
62
|
+
|
|
63
|
+
Shared helper modules remain at the version root:
|
|
64
|
+
|
|
65
|
+
- `shared.ts`
|
|
66
|
+
- `lom-internal.ts`
|
|
67
|
+
- `index.ts`
|
|
68
|
+
|
|
69
|
+
### Rationale
|
|
70
|
+
|
|
71
|
+
This preserves the strongest existing convention — one TypeScript module per source XSD — while making the 1.4 profile split obvious instead of hiding it behind ad hoc file renames.
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## 3. The package-surface decision: versioned namespaces at the root
|
|
76
|
+
|
|
77
|
+
### Problem
|
|
78
|
+
|
|
79
|
+
Once a second Common Cartridge version is exported from the package root, flat re-exports collide immediately:
|
|
80
|
+
|
|
81
|
+
- `CommonCartridgeManifestProfileDocumentSchema`
|
|
82
|
+
- `LomManifestDocumentSchema`
|
|
83
|
+
- `CurriculumStandardsMetadataSetSchema`
|
|
84
|
+
- and many more
|
|
85
|
+
|
|
86
|
+
### Decision
|
|
87
|
+
|
|
88
|
+
The package root now exports versioned namespaces for Common Cartridge:
|
|
89
|
+
|
|
90
|
+
- `CommonCartridgeV1_3`
|
|
91
|
+
- `CommonCartridgeV1_4`
|
|
92
|
+
|
|
93
|
+
The version barrel at `src/common-cartridge/v1_4/index.ts` still exports a flat surface **within the version**, because that remains convenient and collision-free inside a versioned namespace.
|
|
94
|
+
|
|
95
|
+
### Rationale
|
|
96
|
+
|
|
97
|
+
This is the least disruptive way to support side-by-side versions without renaming every existing schema export in `v1_3`.
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## 4. Profile handling decisions
|
|
102
|
+
|
|
103
|
+
## 4.1 Core manifest profile
|
|
104
|
+
|
|
105
|
+
The core manifest module stays very close to the 1.3 implementation:
|
|
106
|
+
|
|
107
|
+
- updated resource type enumeration for 1.4
|
|
108
|
+
- updated manifest schema labels and `schemaversion`
|
|
109
|
+
- updated QTI resource type strings from `imscc_xmlv1p3` to `imscc_xmlv1p4`
|
|
110
|
+
- existing Schematron-derived duplicate/dependency/item checks carried forward
|
|
111
|
+
|
|
112
|
+
The main 1.4 additions in the resource type vocabulary are:
|
|
113
|
+
|
|
114
|
+
- `imsov_xmlv1p0`
|
|
115
|
+
- `imsov_zipv1p0`
|
|
116
|
+
- `imsqti_zipv3p0`
|
|
117
|
+
|
|
118
|
+
## 4.2 Thin manifest profile
|
|
119
|
+
|
|
120
|
+
The Thin CC manifest genuinely differs structurally, so it has its own dedicated module rather than just a renamed alias:
|
|
121
|
+
|
|
122
|
+
- only `imsbasiclti_xmlv1p4` and `imswl_xmlv1p4` resource types are allowed
|
|
123
|
+
- dependency support is removed
|
|
124
|
+
- manifest-level authorizations are removed
|
|
125
|
+
- the resource body can carry embedded `cartridge_basiclti_link` or `webLink` XML
|
|
126
|
+
|
|
127
|
+
The Zod model therefore makes those embedded resource payloads explicit and validates that the inline XML matches the declared resource `type`.
|
|
128
|
+
|
|
129
|
+
## 4.3 K-12 manifest profiles
|
|
130
|
+
|
|
131
|
+
The provided K-12 packaging XSDs are the tricky part.
|
|
132
|
+
|
|
133
|
+
The local `k12/ccv1p4_imscp_v1p2_v1p0.xsd` is effectively the same packaging grammar as the core manifest, and `k12/ccv1p4_imscp_v1p2_v1p0.xsd.thin` is effectively the Thin CC grammar. The stricter K-12 rules in the local bundle live primarily in the standalone K-12 LOM profile XSDs, not in a materially different manifest grammar.
|
|
134
|
+
|
|
135
|
+
### Decision
|
|
136
|
+
|
|
137
|
+
The port treats the K-12 manifest modules as profile-specific aliases of the core and thin manifest schemas:
|
|
138
|
+
|
|
139
|
+
- `K12CommonCartridge...` aliases the core manifest surface
|
|
140
|
+
- `K12ThinCommonCartridge...` aliases the thin manifest surface
|
|
141
|
+
|
|
142
|
+
The standalone K-12 LOM schemas carry the extra K-12 metadata requirements.
|
|
143
|
+
|
|
144
|
+
### Rationale
|
|
145
|
+
|
|
146
|
+
This follows the actual local source set instead of inventing packaging constraints that are not expressed in the shipped `imscp` XSDs.
|
|
147
|
+
|
|
148
|
+
This is one of the places where a different choice would have been possible: we could have added extra K-12 manifest-level refinements based on prose expectations alone. The implementation deliberately did **not** do that because the local packaging XSDs do not wire those stricter LOM profiles into the manifest imports.
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## 5. LOM profile decisions
|
|
153
|
+
|
|
154
|
+
The shared `lom-internal.ts` still generates normalized LOM object schemas, but 1.4 adds more than one practical LOM profile:
|
|
155
|
+
|
|
156
|
+
- core manifest/resource
|
|
157
|
+
- Thin CC manifest/resource
|
|
158
|
+
- K-12 manifest/resource
|
|
159
|
+
- CC LTI link metadata
|
|
160
|
+
|
|
161
|
+
### Decision
|
|
162
|
+
|
|
163
|
+
- core and thin manifest/resource LOM profiles remain loose-value profiles
|
|
164
|
+
- K-12 manifest LOM adds required `general.keyword`
|
|
165
|
+
- K-12 resource LOM adds required:
|
|
166
|
+
- `general`
|
|
167
|
+
- `general.title`
|
|
168
|
+
- `general.keyword`
|
|
169
|
+
- at least one `educational`
|
|
170
|
+
- `educational.intendedEndUserRole`
|
|
171
|
+
- `educational.typicalAgeRange`
|
|
172
|
+
- LTI link metadata keeps the tighter vocabulary-checked profile carried forward from 1.3
|
|
173
|
+
|
|
174
|
+
### Rationale
|
|
175
|
+
|
|
176
|
+
This keeps the general LOM modeling approach unchanged while giving the K-12 standalone metadata documents the stricter rules that actually differ in the 1.4 bundle.
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## 6. Shared/additional schema decisions
|
|
181
|
+
|
|
182
|
+
## 6.1 `ccv1p4_imscsmd_v1p1.xsd`
|
|
183
|
+
|
|
184
|
+
This is the 1.3 curriculum-standards model with one meaningful additive change:
|
|
185
|
+
|
|
186
|
+
- `LabelledGUID.Type` adds optional `caseItemURI`
|
|
187
|
+
|
|
188
|
+
That was modeled directly.
|
|
189
|
+
|
|
190
|
+
## 6.2 LTI support schemas
|
|
191
|
+
|
|
192
|
+
Common Cartridge 1.4 bundles more of the LTI support stack locally:
|
|
193
|
+
|
|
194
|
+
- `imslticm_v1p0`
|
|
195
|
+
- `imslticp_v1p0`
|
|
196
|
+
- `imsbasiclti_v1p0p1`
|
|
197
|
+
- `ccv1p4_imslticc_v1p4`
|
|
198
|
+
|
|
199
|
+
These are modeled as normalized nested objects rather than generic XML trees so that Thin CC embedded resources and standalone LTI descriptors are usable directly.
|
|
200
|
+
|
|
201
|
+
## 6.3 Assignment, line item, and accessibility metadata
|
|
202
|
+
|
|
203
|
+
These three families map cleanly to plain objects:
|
|
204
|
+
|
|
205
|
+
- assignment extension
|
|
206
|
+
- AGS line item
|
|
207
|
+
- accessibility metadata
|
|
208
|
+
|
|
209
|
+
They are represented directly with only the obvious scalar/enum normalization.
|
|
210
|
+
|
|
211
|
+
## 6.4 VDEX support files
|
|
212
|
+
|
|
213
|
+
The 1.4 bundle includes:
|
|
214
|
+
|
|
215
|
+
- `imsmd_loose_v1p3p2.xsd`
|
|
216
|
+
- `imsvdex_v1p0.xsd`
|
|
217
|
+
|
|
218
|
+
`imsmd_loose` is modeled as a standalone loose LOM document. `imsvdex` is modeled as a normalized vocabulary tree with recursive `term` nodes and a small refinement to detect duplicate `termIdentifier` values.
|
|
219
|
+
|
|
220
|
+
## 6.5 Open Video
|
|
221
|
+
|
|
222
|
+
Open Video is the largest new schema family in the bundle.
|
|
223
|
+
|
|
224
|
+
### Decision
|
|
225
|
+
|
|
226
|
+
It is modeled as an explicit normalized object graph rather than collapsed to generic XML, but the semantic refinements stay intentionally focused:
|
|
227
|
+
|
|
228
|
+
- duplicate contributor IDs
|
|
229
|
+
- duplicate recorder IDs
|
|
230
|
+
- `stream.recorderID` must reference an existing recorder
|
|
231
|
+
|
|
232
|
+
### Rationale
|
|
233
|
+
|
|
234
|
+
This keeps the schema useful while avoiding a large amount of fragile hand-coded prose validation that would go beyond the level of rigor used elsewhere in the package.
|
|
235
|
+
|
|
236
|
+
---
|
|
237
|
+
|
|
238
|
+
## 7. Remaining approximations
|
|
239
|
+
|
|
240
|
+
The 1.4 port still makes a few deliberate approximations:
|
|
241
|
+
|
|
242
|
+
1. K-12 manifest modules alias the core/thin packaging grammars instead of inventing additional manifest-level metadata rules.
|
|
243
|
+
2. Open Video does not attempt to encode every prose-level invariant from the candidate final text.
|
|
244
|
+
3. Thin/resource embedded XML is normalized to explicit `cartridge_basiclti_link` / `webLink` object slots instead of preserving heterogeneous XML child order.
|
|
245
|
+
4. Remote include files such as the shared extension helper XSDs are still represented through the existing `XmlExtensionNode` / foreign-attribute pattern rather than being ported as literal helper ASTs.
|
|
246
|
+
|
|
247
|
+
These are intentional consistency choices, not omissions.
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# Comprehensive Learner Record 2.0 JSON schema bundle -> Zod template notes
|
|
2
|
+
|
|
3
|
+
## Published specification
|
|
4
|
+
|
|
5
|
+
- Main specification: `https://www.imsglobal.org/spec/clr/v2p0/`
|
|
6
|
+
- Main spec document: `https://www.imsglobal.org/spec/clr/v2p0/main/`
|
|
7
|
+
- JSON-LD context: `https://purl.imsglobal.org/spec/clr/v2p0/context-2.0.1.json`
|
|
8
|
+
- Published JSON schemas used for this port:
|
|
9
|
+
- `https://purl.imsglobal.org/spec/clr/v2p0/schema/json/clr_v2p0_clrcredential_schema.json`
|
|
10
|
+
- `https://purl.imsglobal.org/spec/clr/v2p0/schema/json/clr_v2p0_achievementcredential_schema.json`
|
|
11
|
+
- `https://purl.imsglobal.org/spec/clr/v2p0/schema/json/clr_v2p0_endorsementcredential_schema.json`
|
|
12
|
+
- `https://purl.imsglobal.org/spec/clr/v2p0/schema/json/clr_v2p0_getclrcredentialsresponse_schema.json`
|
|
13
|
+
- `https://purl.imsglobal.org/spec/clr/v2p0/schema/json/clr_v2p0_profile_schema.json`
|
|
14
|
+
- `https://purl.imsglobal.org/spec/clr/v2p0/schema/json/clr_v2p0_imsx_statusinfo_schema.json`
|
|
15
|
+
|
|
16
|
+
This note accompanies the versioned source under `packages/contracts/src/clr/v2_0/`.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 1. What was implemented
|
|
21
|
+
|
|
22
|
+
CLR 2.0 is not an XSD family like the QTI and Common Cartridge ports. The published source of truth here is the JSON Schema and JSON-LD credential model bundle.
|
|
23
|
+
|
|
24
|
+
The port therefore models the published JSON-schema entry points rather than inventing XML-style document wrappers:
|
|
25
|
+
|
|
26
|
+
- `ClrCredentialSchema`
|
|
27
|
+
- `AchievementCredentialSchema`
|
|
28
|
+
- `EndorsementCredentialSchema`
|
|
29
|
+
- `GetClrCredentialsResponseSchema`
|
|
30
|
+
- `ProfileSchema`
|
|
31
|
+
- `ImsxStatusInfoSchema`
|
|
32
|
+
|
|
33
|
+
The version barrel exports these as `ClrV2_0`, and `Clr20DerivedZodTemplates` collects the published entry points in one place.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## 2. Main structural choice: extract shared VC/credential primitives
|
|
38
|
+
|
|
39
|
+
CLR 2.0 clearly overlaps with the same broader digital-credential model family used by Open Badges 3.0:
|
|
40
|
+
|
|
41
|
+
- `AchievementCredential`
|
|
42
|
+
- `EndorsementCredential`
|
|
43
|
+
- `Profile`
|
|
44
|
+
- `Achievement`
|
|
45
|
+
- `Result`
|
|
46
|
+
- `Proof`
|
|
47
|
+
- and the surrounding verifiable-credential primitives
|
|
48
|
+
|
|
49
|
+
The implementation now uses a shared versioned layer for common primitives:
|
|
50
|
+
|
|
51
|
+
- `src/vc-data-model/v2_0/` for VC-level/shared primitives
|
|
52
|
+
- `src/open-badges/v3_0/shared.ts` for the shared OB/CLR credential model graph
|
|
53
|
+
|
|
54
|
+
CLR composes from that shared model and keeps only CLR-specific wrappers in `src/clr/v2_0/`.
|
|
55
|
+
|
|
56
|
+
### Rationale
|
|
57
|
+
|
|
58
|
+
- it removes duplicated credential-model logic between CLR and Open Badges
|
|
59
|
+
- it keeps VC/credential semantics aligned across both standards
|
|
60
|
+
- it still preserves versioned, explicit standard surfaces at the package boundary
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## 3. Main validation choice: prefer normative credential arrays over the JSON-LD compaction fallback
|
|
65
|
+
|
|
66
|
+
The published JSON Schema files are adapted for JSON-LD compaction, so several properties are more permissive than the underlying normative intent:
|
|
67
|
+
|
|
68
|
+
- credential `@context`
|
|
69
|
+
- credential `type`
|
|
70
|
+
- several single-or-array properties
|
|
71
|
+
|
|
72
|
+
For the Zod port, the repeated-value properties still accept either a single value or an array where that is useful for real payloads, but the key credential identity fields are intentionally made more semantic:
|
|
73
|
+
|
|
74
|
+
- `ClrCredential` requires a credential `type` array containing `VerifiableCredential` and `ClrCredential`
|
|
75
|
+
- `AchievementCredential` requires `VerifiableCredential` and one of `AchievementCredential` / `OpenBadgeCredential`
|
|
76
|
+
- `EndorsementCredential` requires `VerifiableCredential` and `EndorsementCredential`
|
|
77
|
+
- credential `@context` arrays are validated against the expected CLR / OB / VC ordering rather than accepting any arbitrary single context value
|
|
78
|
+
|
|
79
|
+
### Rationale
|
|
80
|
+
|
|
81
|
+
The published JSON Schema bundle under-enforces some of those rules in order to support JSON-LD compaction patterns. For this repo, the more useful default is to validate the portable, explicit credential shapes that implementers are most likely to exchange.
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## 4. Extensibility choice: preserve open object surfaces where the spec does
|
|
86
|
+
|
|
87
|
+
Most CLR credential-model objects are extensible in the published JSON Schema bundle.
|
|
88
|
+
|
|
89
|
+
The Zod port mirrors that with passthrough object schemas for the credential-model objects, while the stricter API-envelope schemas remain strict:
|
|
90
|
+
|
|
91
|
+
- passthrough for credential/profile/achievement-style objects
|
|
92
|
+
- strict for `GetClrCredentialsResponse`
|
|
93
|
+
- strict for `ImsxStatusInfo`
|
|
94
|
+
|
|
95
|
+
### Rationale
|
|
96
|
+
|
|
97
|
+
This keeps the CLR credential objects usable for real JSON-LD / extension-heavy payloads without silently tightening the spec into a closed-world model.
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## 5. Public surface and naming
|
|
102
|
+
|
|
103
|
+
The contracts package now exposes CLR 2.0 in the same style as the other standards:
|
|
104
|
+
|
|
105
|
+
- package-root namespace: `ClrV2_0`
|
|
106
|
+
- package subpath: `@conform-ed/contracts/clr/v2_0`
|
|
107
|
+
|
|
108
|
+
The source modules mirror the published schema artifact names where that remains useful:
|
|
109
|
+
|
|
110
|
+
- `clr_v2p0_clrcredential_schema.ts`
|
|
111
|
+
- `clr_v2p0_achievementcredential_schema.ts`
|
|
112
|
+
- `clr_v2p0_endorsementcredential_schema.ts`
|
|
113
|
+
- `clr_v2p0_profile_schema.ts`
|
|
114
|
+
- `clr_v2p0_getclrcredentialsresponse_schema.ts`
|
|
115
|
+
- `clr_v2p0_imsx_statusinfo_schema.ts`
|
|
116
|
+
|
|
117
|
+
with `shared.ts` holding the common credential-model pieces used across those entry points.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# cmi5 schema notes
|
|
2
|
+
|
|
3
|
+
The cmi5 contract bundle models the Quartz course-structure XML surface:
|
|
4
|
+
|
|
5
|
+
- `Cmi5V1_0.CourseStructureDocument` — combined courseStructure document and keyword extension
|
|
6
|
+
- `Cmi5V1_0.CourseStructure` — course, objectives, and recursive AU/block tree
|
|
7
|
+
- `Cmi5V1_0.KeywordExtension` — keyword dictionary used by the extension examples
|
|
8
|
+
|
|
9
|
+
This bundle intentionally covers the XML data model from the spec artifacts; runtime xAPI launch/state/statement behavior stays in the cmi5 apps.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# LTI schema notes
|
|
2
|
+
|
|
3
|
+
The LTI contract bundle is split by spec family:
|
|
4
|
+
|
|
5
|
+
- `LtiV1_3` — normalized LTI 1.3 core launch claims
|
|
6
|
+
- `LtiDeepLinkingV2_0` — deep linking request settings and response content items
|
|
7
|
+
- `LtiAgsV2_0` — assignment and grade services endpoint, line item, score, and result payloads
|
|
8
|
+
- `LtiNrpsV2_0` — names and roles service claim plus membership container
|
|
9
|
+
- `LtiProctoringV1_0` — proctoring launch messages and assessment-control payloads
|
|
10
|
+
|
|
11
|
+
The schemas use normalized camelCase field names so they are easy to use from the adapter reference app and runner fixtures.
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# OneRoster 1.2 JSON schema/OpenAPI bundle -> Zod template notes
|
|
2
|
+
|
|
3
|
+
## Published specification
|
|
4
|
+
|
|
5
|
+
- Main specification: `https://www.imsglobal.org/spec/oneroster/v1p2/`
|
|
6
|
+
- Rostering service information model: `https://www.imsglobal.org/spec/oneroster/v1p2/rostering/info`
|
|
7
|
+
- Rostering service REST binding: `https://www.imsglobal.org/spec/oneroster/v1p2/rostering/bind/rest`
|
|
8
|
+
- Rostering REST binding permalink: `https://www.imsglobal.org/spec/oneroster/v1p2/rostering-restbinding/`
|
|
9
|
+
- Gradebook service information model: `https://www.imsglobal.org/spec/oneroster/v1p2/gradebook/info`
|
|
10
|
+
- Gradebook service REST binding: `https://www.imsglobal.org/spec/oneroster/v1p2/gradebook/bind/rest`
|
|
11
|
+
- Gradebook REST binding permalink: `https://www.imsglobal.org/spec/oneroster/v1p2/gradebook-restbinding/`
|
|
12
|
+
- Resource service information model: `https://www.imsglobal.org/spec/oneroster/v1p2/resource/info`
|
|
13
|
+
- Resource service REST binding: `https://www.imsglobal.org/spec/oneroster/v1p2/resource/bind/rest`
|
|
14
|
+
- Resource REST binding permalink: `https://www.imsglobal.org/spec/oneroster/v1p2/resources-restbinding/`
|
|
15
|
+
- CSV binding: `https://www.imsglobal.org/spec/oneroster/v1p2/bind/csv/`
|
|
16
|
+
- OpenAPI 3 JSON sources used directly:
|
|
17
|
+
- `https://purl.imsglobal.org/spec/or/v1p2/schema/openapi/onerosterv1p2rostersservice_openapi3_v1p0.json`
|
|
18
|
+
- `https://purl.imsglobal.org/spec/or/v1p2/schema/openapi/onerosterv1p2gradebookservice_openapi3_v1p0.json`
|
|
19
|
+
- `https://purl.imsglobal.org/spec/or/v1p2/schema/openapi/onerosterv1p2resourcesservice_openapi3_v1p0.json`
|
|
20
|
+
|
|
21
|
+
This note accompanies `packages/contracts/src/oneroster/v1_2/`.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 1. What was implemented
|
|
26
|
+
|
|
27
|
+
This port models:
|
|
28
|
+
|
|
29
|
+
- rostering
|
|
30
|
+
- gradebook
|
|
31
|
+
- resource
|
|
32
|
+
- endpoint-specific REST binding operation payload contracts for all published operations
|
|
33
|
+
- CSV binding row/document/package contracts for the published CSV files
|
|
34
|
+
|
|
35
|
+
The public package surface is:
|
|
36
|
+
|
|
37
|
+
- root namespace: `OneRosterV1_2`
|
|
38
|
+
- subpath export: `@conform-ed/contracts/oneroster/v1_2`
|
|
39
|
+
|
|
40
|
+
The version barrel publishes the service schemas and `OneRoster12DerivedZodTemplates`.
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## 2. Structural choices
|
|
45
|
+
|
|
46
|
+
The implementation is split into:
|
|
47
|
+
|
|
48
|
+
- `shared.ts` for common primitives (`metadata`, status vocabularies, GUID refs, IMSX status envelope)
|
|
49
|
+
- `or_v1p2_rostering_service_schema.ts`
|
|
50
|
+
- `or_v1p2_gradebook_service_schema.ts`
|
|
51
|
+
- `or_v1p2_resource_service_schema.ts`
|
|
52
|
+
- `or_v1p2_rostering_restbinding_schema.ts`
|
|
53
|
+
- `or_v1p2_gradebook_restbinding_schema.ts`
|
|
54
|
+
- `or_v1p2_resource_restbinding_schema.ts`
|
|
55
|
+
- `or_v1p2_csv_binding_schema.ts`
|
|
56
|
+
|
|
57
|
+
This mirrors the OneRoster 1.2 service split and avoids duplicating shared shapes across services.
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## 3. Validation choices
|
|
62
|
+
|
|
63
|
+
- objects marked `additionalProperties: false` in the published OpenAPI schemas are modeled as strict Zod objects
|
|
64
|
+
- `MetadataDType` and `CredentialDType` stay open where the source model is open
|
|
65
|
+
- extensible vocabularies are modeled as:
|
|
66
|
+
- defined enum values
|
|
67
|
+
- plus `ext:*` custom values where the specification allows extension tokens
|
|
68
|
+
- date/date-time and URI fields use explicit ISO/URL validators
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## 4. CSV binding modeling choice
|
|
73
|
+
|
|
74
|
+
The CSV layer is modeled as raw row/document schemas (string cell values) keyed by published column headers, plus a package-level aggregate schema.
|
|
75
|
+
|
|
76
|
+
For manifest keys that appear in the spec with trailing `*` markers, the schema accepts both starred and unstarred variants and requires at least one to be present.
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Open Badges 3.0 JSON schema bundle -> Zod template notes
|
|
2
|
+
|
|
3
|
+
## Published specification
|
|
4
|
+
|
|
5
|
+
- Main specification: `https://www.imsglobal.org/spec/ob/v3p0/`
|
|
6
|
+
- Main spec document: `https://www.imsglobal.org/spec/ob/v3p0/main/`
|
|
7
|
+
- Implementation guide: `https://www.imsglobal.org/spec/ob/v3p0/impl/`
|
|
8
|
+
- JSON-LD context: `https://purl.imsglobal.org/spec/ob/v3p0/context-3.0.3.json`
|
|
9
|
+
- Published JSON schemas used for this port:
|
|
10
|
+
- `https://purl.imsglobal.org/spec/ob/v3p0/schema/json/ob_v3p0_achievementcredential_schema.json`
|
|
11
|
+
- `https://purl.imsglobal.org/spec/ob/v3p0/schema/json/ob_v3p0_endorsementcredential_schema.json`
|
|
12
|
+
- `https://purl.imsglobal.org/spec/ob/v3p0/schema/json/ob_v3p0_getopenbadgecredentialsresponse_schema.json`
|
|
13
|
+
- `https://purl.imsglobal.org/spec/ob/v3p0/schema/json/ob_v3p0_profile_schema.json`
|
|
14
|
+
- `https://purl.imsglobal.org/spec/ob/v3p0/schema/json/ob_v3p0_imsx_statusinfo_schema.json`
|
|
15
|
+
|
|
16
|
+
This note accompanies `packages/contracts/src/open-badges/v3_0/`.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 1. What was implemented
|
|
21
|
+
|
|
22
|
+
The Open Badges 3.0 port models the published JSON-schema entry points directly:
|
|
23
|
+
|
|
24
|
+
- `AchievementCredentialSchema` (`OpenBadgeCredentialSchema` alias)
|
|
25
|
+
- `EndorsementCredentialSchema`
|
|
26
|
+
- `GetOpenBadgeCredentialsResponseSchema`
|
|
27
|
+
- `ProfileSchema`
|
|
28
|
+
- `ImsxStatusInfoSchema`
|
|
29
|
+
|
|
30
|
+
The version barrel exports these as `OpenBadgesV3_0`, and `OpenBadges30DerivedZodTemplates` groups the top-level published entries.
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## 2. Shared-model choice
|
|
35
|
+
|
|
36
|
+
Open Badges 3.0 and CLR 2.0 reuse almost the same credential model graph (Achievement, Profile, EndorsementCredential, Result, Proof, and related primitives). Rather than duplicating those pieces again, this port centralizes the cross-standard primitives in:
|
|
37
|
+
|
|
38
|
+
- `src/vc-data-model/v2_0/` for VC-level/shared credential primitives
|
|
39
|
+
- `src/open-badges/v3_0/shared.ts` for OB-specific profile/achievement structures
|
|
40
|
+
|
|
41
|
+
CLR now composes from this same OB/VC model layer.
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## 3. Validation strictness choice
|
|
46
|
+
|
|
47
|
+
Like CLR, the OB 3.0 schemas are JSON-LD-compaction-friendly and permissive in places. The Zod port keeps extension-friendly object surfaces, but tightens core credential identity semantics:
|
|
48
|
+
|
|
49
|
+
- `AchievementCredential` requires `VerifiableCredential` plus one of `AchievementCredential` / `OpenBadgeCredential`
|
|
50
|
+
- `EndorsementCredential` requires `VerifiableCredential` plus `EndorsementCredential`
|
|
51
|
+
- `@context` ordering enforces expected OB 3.0 context prefixes while still allowing additional context entries
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## 4. Public surface and naming
|
|
56
|
+
|
|
57
|
+
- package-root namespace: `OpenBadgesV3_0`
|
|
58
|
+
- package subpath: `@conform-ed/contracts/open-badges/v3_0`
|
|
59
|
+
|
|
60
|
+
Source modules mirror the published artifact names:
|
|
61
|
+
|
|
62
|
+
- `ob_v3p0_achievementcredential_schema.ts`
|
|
63
|
+
- `ob_v3p0_endorsementcredential_schema.ts`
|
|
64
|
+
- `ob_v3p0_getopenbadgecredentialsresponse_schema.ts`
|
|
65
|
+
- `ob_v3p0_profile_schema.ts`
|
|
66
|
+
- `ob_v3p0_imsx_statusinfo_schema.ts`
|
package/package.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@conform-ed/contracts",
|
|
3
|
+
"version": "0.0.3",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"module": "src/index.ts",
|
|
6
|
+
"exports": {
|
|
7
|
+
".": "./src/index.ts",
|
|
8
|
+
"./caliper/v1_2": "./src/caliper/v1_2/index.ts",
|
|
9
|
+
"./case/v1_1": "./src/case/v1_1/index.ts",
|
|
10
|
+
"./cat/v1_0": "./src/cat/v1_0/index.ts",
|
|
11
|
+
"./clr/v2_0": "./src/clr/v2_0/index.ts",
|
|
12
|
+
"./common-cartridge/v1_3": "./src/common-cartridge/v1_3/index.ts",
|
|
13
|
+
"./common-cartridge/v1_4": "./src/common-cartridge/v1_4/index.ts",
|
|
14
|
+
"./cmi5": "./src/cmi5/index.ts",
|
|
15
|
+
"./cmi5/v1_0": "./src/cmi5/v1_0/index.ts",
|
|
16
|
+
"./xapi": "./src/xapi/index.ts",
|
|
17
|
+
"./xapi/v1_0_3": "./src/xapi/v1_0_3/index.ts",
|
|
18
|
+
"./xapi/v2_0": "./src/xapi/v2_0/index.ts",
|
|
19
|
+
"./lti": "./src/lti/index.ts",
|
|
20
|
+
"./lti/ags/v2_0": "./src/lti/ags/v2_0/index.ts",
|
|
21
|
+
"./lti/deep-linking/v2_0": "./src/lti/deep-linking/v2_0/index.ts",
|
|
22
|
+
"./lti/nrps/v2_0": "./src/lti/nrps/v2_0/index.ts",
|
|
23
|
+
"./lti/proctoring/v1_0": "./src/lti/proctoring/v1_0/index.ts",
|
|
24
|
+
"./lti/v1_3": "./src/lti/v1_3/index.ts",
|
|
25
|
+
"./open-badges/v3_0": "./src/open-badges/v3_0/index.ts",
|
|
26
|
+
"./oneroster/v1_2": "./src/oneroster/v1_2/index.ts",
|
|
27
|
+
"./qti/v2_1": "./src/qti/v2_1/index.ts",
|
|
28
|
+
"./qti/v2_2": "./src/qti/v2_2/index.ts",
|
|
29
|
+
"./qti/v3_0_1": "./src/qti/v3_0_1/index.ts",
|
|
30
|
+
"./vc-data-model/v2_0": "./src/vc-data-model/v2_0/index.ts"
|
|
31
|
+
},
|
|
32
|
+
"scripts": {
|
|
33
|
+
"build": "tsgo --noEmit",
|
|
34
|
+
"typecheck": "tsgo --noEmit",
|
|
35
|
+
"lint": "oxlint --config ../../.oxlintrc.jsonc .",
|
|
36
|
+
"format": "oxfmt --config ../../.oxfmtrc.jsonc --check .",
|
|
37
|
+
"test": "bun test"
|
|
38
|
+
},
|
|
39
|
+
"devDependencies": {
|
|
40
|
+
"fast-xml-parser": "^5.3.1"
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# QTI 2.1 Zod templates
|
|
2
|
+
|
|
3
|
+
## Published specification
|
|
4
|
+
|
|
5
|
+
- Overview: `https://www.imsglobal.org/question/qtiv2p1/imsqti_oviewv2p1.html`
|
|
6
|
+
- Assessment/item/test information model: `https://www.imsglobal.org/question/qtiv2p1/imsqti_infov2p1.html`
|
|
7
|
+
- Results Reporting v2.1: `https://www.imsglobal.org/question/qtiv2p1/imsqti_resultv2p1.html`
|
|
8
|
+
|
|
9
|
+
`tmp/qti/2.1/` ships a small bundle of entry-point XSDs plus imported helper trees (`metadata/`, `other/`). The implementation lives in `packages/contracts/src/qti/v2_1/` and follows the same normalized parsed-XML style as the existing QTI 3.0.1 port: arrays are pluralized, embedded XML extension points are normalized into explicit `extensions` / `foreignAttributes`, and public entry points are exposed as document schemas plus a version registry.
|
|
10
|
+
|
|
11
|
+
## Implementation shape
|
|
12
|
+
|
|
13
|
+
- `imsqti_v2p1p2.ts` covers the main assessment object family:
|
|
14
|
+
- `assessmentItem`
|
|
15
|
+
- `assessmentSection`
|
|
16
|
+
- `assessmentTest`
|
|
17
|
+
- declarations
|
|
18
|
+
- processing fragments
|
|
19
|
+
- item body / feedback / interaction nodes
|
|
20
|
+
- `imsqti_metadata_v2p1.ts` covers `qtiMetadata`
|
|
21
|
+
- `imsqti_result_v2p1.ts` covers `assessmentResult`
|
|
22
|
+
- `imsqti_usagedata_v2p1.ts` covers `usageData`
|
|
23
|
+
- `qtiv2p1_imscpv1p2_v1p0.ts` covers the QTI 2.1 content-package profile
|
|
24
|
+
- `apipv1p0_qtiextv2p1_v1p0.ts` covers the APIP accessibility extension surface used from items/feedback
|
|
25
|
+
|
|
26
|
+
## Key choices
|
|
27
|
+
|
|
28
|
+
1. QTI 2.1 and QTI 2.2 share one internal 2.x implementation core because the source domain model is structurally the same; the version directories only specialize the places where the bundles materially differ.
|
|
29
|
+
2. HTML / XHTML / MathML body content is normalized as generic recursive content nodes instead of one exported Zod schema per markup tag. The domain objects still stay explicit, but the huge markup vocabulary remains tractable.
|
|
30
|
+
3. APIP is modeled as a focused normalized accessibility surface rather than a full schema-for-schema transcription of every auxiliary APIP type. The item-facing accessibility structures are explicit; deeper companion-material payload details stay permissive.
|
|
31
|
+
4. The bundled MathML helper tree is incomplete locally. That does not block the port because those imported vocabularies are treated as generic normalized content subtrees rather than locally-resolved schema dependencies.
|
|
32
|
+
|
|
33
|
+
## QTI Results Reporting assessment (v2.1)
|
|
34
|
+
|
|
35
|
+
QTI Results Reporting is published as a distinct document set within the QTI family, but for implementation purposes in this repo it is already covered in the versioned QTI contract surface:
|
|
36
|
+
|
|
37
|
+
- `imsqti_result_v2p1.ts` exposes `QtiAssessmentResultDocumentSchema`
|
|
38
|
+
- `imsqti_usagedata_v2p1.ts` exposes `QtiUsageDataDocumentSchema`
|
|
39
|
+
- `src/qti/v2_1/index.ts` includes both under `Qti21DerivedZodTemplates`
|
|
40
|
+
|
|
41
|
+
Assessment outcome for v2.1:
|
|
42
|
+
|
|
43
|
+
1. It is a separate spec document family, but not a separate package requirement in this repo.
|
|
44
|
+
2. Current coverage is functionally in place for results (`assessmentResult`) and usage (`usageData`) document entry points.
|
|
45
|
+
3. No additional standalone `qti-results-reporting` package is required unless we later want a cross-version aggregate facade.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# QTI 2.2 Zod templates
|
|
2
|
+
|
|
3
|
+
## Published specification
|
|
4
|
+
|
|
5
|
+
- Overview: `https://www.imsglobal.org/question/qtiv2p2/imsqti_v2p2_oview.html`
|
|
6
|
+
|
|
7
|
+
`tmp/qti/2.2/` extends the 2.1 model with stimulus documents, HTML5 helper XSDs, curriculum standards metadata, richer APIP accessibility, and a larger QTI content-package profile. The implementation lives in `packages/contracts/src/qti/v2_2/` and keeps the same normalized public style as the rest of this package.
|
|
8
|
+
|
|
9
|
+
## Implementation shape
|
|
10
|
+
|
|
11
|
+
- `imsqti_v2p2p4.ts` covers the main assessment object family:
|
|
12
|
+
- `assessmentItem`
|
|
13
|
+
- `assessmentSection`
|
|
14
|
+
- `assessmentStimulus`
|
|
15
|
+
- `assessmentTest`
|
|
16
|
+
- declarations
|
|
17
|
+
- processing fragments
|
|
18
|
+
- item / stimulus body / feedback / interaction nodes
|
|
19
|
+
- `imsqtiv2p2p4_html5_v1p0.ts` exports the normalized HTML5-oriented content helpers used by the main schemas
|
|
20
|
+
- `imsqti_metadata_v2p2.ts` covers `qtiMetadata`
|
|
21
|
+
- `imsqti_result_v2p2.ts` covers `assessmentResult`
|
|
22
|
+
- `imsqti_usagedata_v2p2.ts` covers `usageData`
|
|
23
|
+
- `qtiv2p2_csm_v2p2.ts` covers curriculum standards metadata
|
|
24
|
+
- `qtiv2p2_imscpv1p2_v1p0.ts` covers the QTI 2.2 packaging profile
|
|
25
|
+
- `apipv1p0_qtiextv2p2_v1p0p1.ts` covers the APIP accessibility extension surface
|
|
26
|
+
|
|
27
|
+
## Key choices
|
|
28
|
+
|
|
29
|
+
1. QTI 2.2 reuses the shared 2.x internal implementation with version-specific switches for stimulus support, scoring-mode metadata, curriculum standards metadata, APIP supplemental accessibility, and packaging resource types.
|
|
30
|
+
2. The HTML5 XSD is represented by normalized generic content nodes instead of hundreds of exported per-tag schemas. This matches the practical role of those types in the source bundle: markup containers, not core assessment domain objects.
|
|
31
|
+
3. `assessmentStimulus` and `assessmentStimulusRef` are modeled explicitly because they are a real 2.2 domain addition, not merely more markup.
|
|
32
|
+
4. The local bundle is also missing the full imported MathML / SSML support trees. As with 2.1, that is treated as a content-vocabulary concern rather than a blocker for the QTI domain/object schemas.
|