@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.
Files changed (187) hide show
  1. package/.turbo/turbo-build.log +2 -0
  2. package/.turbo/turbo-format.log +6 -0
  3. package/.turbo/turbo-lint.log +4 -0
  4. package/.turbo/turbo-test.log +196 -0
  5. package/.turbo/turbo-typecheck.log +2 -0
  6. package/README.md +52 -0
  7. package/caliper-v1_2-zod-templates.md +123 -0
  8. package/case-v1_1-zod-templates.md +290 -0
  9. package/cat-v1_0-zod-templates.md +73 -0
  10. package/cc-v1_3-zod-templates.md +531 -0
  11. package/cc-v1_4-zod-templates.md +247 -0
  12. package/clr-v2_0-zod-templates.md +117 -0
  13. package/cmi5-v1_0-zod-templates.md +9 -0
  14. package/lti-zod-templates.md +11 -0
  15. package/oneroster-v1_2-zod-templates.md +76 -0
  16. package/open-badges-v3_0-zod-templates.md +66 -0
  17. package/package.json +42 -0
  18. package/qti-v2_1-zod-templates.md +45 -0
  19. package/qti-v2_2-zod-templates.md +32 -0
  20. package/qti-v3_0_1-zod-templates.md +421 -0
  21. package/src/adapter.ts +83 -0
  22. package/src/caliper/v1_2/caliper_v1p2_bootcamp_schema.ts +781 -0
  23. package/src/caliper/v1_2/index.ts +37 -0
  24. package/src/caliper/v1_2/shared.ts +122 -0
  25. package/src/caliper/v1_2/textual_requirements.ts +219 -0
  26. package/src/case/v1_1/case_v1p1_cfassociation_jsonschema1.ts +1 -0
  27. package/src/case/v1_1/case_v1p1_cfassociationgrouping_jsonschema1.ts +1 -0
  28. package/src/case/v1_1/case_v1p1_cfassociationset_jsonschema1.ts +1 -0
  29. package/src/case/v1_1/case_v1p1_cfconceptset_jsonschema1.ts +1 -0
  30. package/src/case/v1_1/case_v1p1_cfdocument_jsonschema1.ts +1 -0
  31. package/src/case/v1_1/case_v1p1_cfdocumentset_jsonschema1.ts +1 -0
  32. package/src/case/v1_1/case_v1p1_cfitem_jsonschema1.ts +1 -0
  33. package/src/case/v1_1/case_v1p1_cfitemtypeset_jsonschema1.ts +1 -0
  34. package/src/case/v1_1/case_v1p1_cflicense_jsonschema1.ts +1 -0
  35. package/src/case/v1_1/case_v1p1_cfpackage_jsonschema1.ts +1 -0
  36. package/src/case/v1_1/case_v1p1_cfrubric_jsonschema1.ts +1 -0
  37. package/src/case/v1_1/case_v1p1_cfsubjectset_jsonschema1.ts +1 -0
  38. package/src/case/v1_1/case_v1p1_imsx_statusinfo_jsonschema1.ts +1 -0
  39. package/src/case/v1_1/case_v1p1_openapi3_restbinding_schema.ts +113 -0
  40. package/src/case/v1_1/index.ts +95 -0
  41. package/src/case/v1_1/shared.ts +384 -0
  42. package/src/cat/v1_0/cat_v1p0_restbinding_operations_schema.ts +75 -0
  43. package/src/cat/v1_0/index.ts +124 -0
  44. package/src/cat/v1_0/shared.ts +345 -0
  45. package/src/clr/v2_0/clr_v2p0_achievementcredential_schema.ts +16 -0
  46. package/src/clr/v2_0/clr_v2p0_clrcredential_schema.ts +9 -0
  47. package/src/clr/v2_0/clr_v2p0_endorsementcredential_schema.ts +11 -0
  48. package/src/clr/v2_0/clr_v2p0_getclrcredentialsresponse_schema.ts +1 -0
  49. package/src/clr/v2_0/clr_v2p0_imsx_statusinfo_schema.ts +8 -0
  50. package/src/clr/v2_0/clr_v2p0_profile_schema.ts +9 -0
  51. package/src/clr/v2_0/index.ts +22 -0
  52. package/src/clr/v2_0/shared.ts +206 -0
  53. package/src/cmi5/index.ts +3 -0
  54. package/src/cmi5/v1_0/index.ts +134 -0
  55. package/src/common-cartridge/v1_3/ccv1p3_imsccauth_v1p3.ts +26 -0
  56. package/src/common-cartridge/v1_3/ccv1p3_imscp_v1p2_v1p0.ts +352 -0
  57. package/src/common-cartridge/v1_3/ccv1p3_imscsmd_v1p0.ts +35 -0
  58. package/src/common-cartridge/v1_3/ccv1p3_imsdt_v1p3.ts +33 -0
  59. package/src/common-cartridge/v1_3/ccv1p3_imswl_v1p3.ts +23 -0
  60. package/src/common-cartridge/v1_3/ccv1p3_lomccltilink_v1p0.ts +14 -0
  61. package/src/common-cartridge/v1_3/ccv1p3_lommanifest_v1p0.ts +14 -0
  62. package/src/common-cartridge/v1_3/ccv1p3_lomresource_v1p0.ts +14 -0
  63. package/src/common-cartridge/v1_3/ccv1p3_qtiasiv1p2p1_v1p0.ts +964 -0
  64. package/src/common-cartridge/v1_3/index.ts +41 -0
  65. package/src/common-cartridge/v1_3/lom-internal.ts +396 -0
  66. package/src/common-cartridge/v1_3/shared.ts +68 -0
  67. package/src/common-cartridge/v1_4/core/ccv1p4_imscp_v1p2_v1p0.ts +360 -0
  68. package/src/common-cartridge/v1_4/core/ccv1p4_lommanifest_v1p0.ts +14 -0
  69. package/src/common-cartridge/v1_4/core/ccv1p4_lomresource_v1p0.ts +14 -0
  70. package/src/common-cartridge/v1_4/extension/cc_extresource_assignmentv1p0_v1p0.ts +61 -0
  71. package/src/common-cartridge/v1_4/extension/ccv1p4_cpextensionv1p2_v1p0.ts +20 -0
  72. package/src/common-cartridge/v1_4/extension/ims_openvideov1p0_v1p0.ts +325 -0
  73. package/src/common-cartridge/v1_4/index.ts +104 -0
  74. package/src/common-cartridge/v1_4/k12/ccv1p4_imscp_v1p2_v1p0.ts +19 -0
  75. package/src/common-cartridge/v1_4/k12/ccv1p4_imscp_v1p2_v1p0_thin.ts +17 -0
  76. package/src/common-cartridge/v1_4/k12/ccv1p4_lommanifest_v1p0.ts +14 -0
  77. package/src/common-cartridge/v1_4/k12/ccv1p4_lomresource_v1p0.ts +14 -0
  78. package/src/common-cartridge/v1_4/lom-internal.ts +476 -0
  79. package/src/common-cartridge/v1_4/shared/ccv1p4_imsccauth_v1p4.ts +26 -0
  80. package/src/common-cartridge/v1_4/shared/ccv1p4_imscsmd_v1p1.ts +36 -0
  81. package/src/common-cartridge/v1_4/shared/ccv1p4_imsdt_v1p4.ts +33 -0
  82. package/src/common-cartridge/v1_4/shared/ccv1p4_imslticc_v1p4.ts +45 -0
  83. package/src/common-cartridge/v1_4/shared/ccv1p4_imswl_v1p4.ts +23 -0
  84. package/src/common-cartridge/v1_4/shared/ccv1p4_lomccltilink_v1p0.ts +14 -0
  85. package/src/common-cartridge/v1_4/shared/ccv1p4_qtiasiv1p2p1_v1p0.ts +964 -0
  86. package/src/common-cartridge/v1_4/shared/imsbasiclti_v1p0p1.ts +24 -0
  87. package/src/common-cartridge/v1_4/shared/imslticm_v1p0.ts +23 -0
  88. package/src/common-cartridge/v1_4/shared/imslticp_v1p0.ts +57 -0
  89. package/src/common-cartridge/v1_4/shared/lineitem_v1p0.ts +35 -0
  90. package/src/common-cartridge/v1_4/shared/resourcea11ymetadata-20210915.ts +110 -0
  91. package/src/common-cartridge/v1_4/shared.ts +68 -0
  92. package/src/common-cartridge/v1_4/thin/ccv1p4_imscp_v1p2_v1p0.ts +243 -0
  93. package/src/common-cartridge/v1_4/thin/ccv1p4_lommanifest_v1p0.ts +14 -0
  94. package/src/common-cartridge/v1_4/thin/ccv1p4_lomresource_v1p0.ts +14 -0
  95. package/src/common-cartridge/v1_4/vdex/imsmd_loose_v1p3p2.ts +13 -0
  96. package/src/common-cartridge/v1_4/vdex/imsvdex_v1p0.ts +124 -0
  97. package/src/config.ts +121 -0
  98. package/src/index.ts +32 -0
  99. package/src/lti/ags/v2_0/index.ts +97 -0
  100. package/src/lti/deep-linking/v2_0/index.ts +100 -0
  101. package/src/lti/index.ts +26 -0
  102. package/src/lti/nrps/v2_0/index.ts +69 -0
  103. package/src/lti/proctoring/v1_0/index.ts +131 -0
  104. package/src/lti/shared.ts +66 -0
  105. package/src/lti/v1_3/index.ts +84 -0
  106. package/src/oneroster/v1_2/index.ts +156 -0
  107. package/src/oneroster/v1_2/or_v1p2_csv_binding_schema.ts +427 -0
  108. package/src/oneroster/v1_2/or_v1p2_gradebook_restbinding_schema.ts +120 -0
  109. package/src/oneroster/v1_2/or_v1p2_gradebook_service_schema.ts +243 -0
  110. package/src/oneroster/v1_2/or_v1p2_resource_restbinding_schema.ts +24 -0
  111. package/src/oneroster/v1_2/or_v1p2_resource_service_schema.ts +47 -0
  112. package/src/oneroster/v1_2/or_v1p2_rostering_restbinding_schema.ts +84 -0
  113. package/src/oneroster/v1_2/or_v1p2_rostering_service_schema.ts +288 -0
  114. package/src/oneroster/v1_2/shared.ts +90 -0
  115. package/src/open-badges/v3_0/index.ts +20 -0
  116. package/src/open-badges/v3_0/ob_v3p0_achievementcredential_schema.ts +17 -0
  117. package/src/open-badges/v3_0/ob_v3p0_endorsementcredential_schema.ts +11 -0
  118. package/src/open-badges/v3_0/ob_v3p0_getopenbadgecredentialsresponse_schema.ts +1 -0
  119. package/src/open-badges/v3_0/ob_v3p0_imsx_statusinfo_schema.ts +8 -0
  120. package/src/open-badges/v3_0/ob_v3p0_profile_schema.ts +9 -0
  121. package/src/open-badges/v3_0/shared.ts +458 -0
  122. package/src/qti/v2-internal.ts +1683 -0
  123. package/src/qti/v2_1/apipv1p0_qtiextv2p1_v1p0.ts +3 -0
  124. package/src/qti/v2_1/imsqti_metadata_v2p1.ts +3 -0
  125. package/src/qti/v2_1/imsqti_result_v2p1.ts +3 -0
  126. package/src/qti/v2_1/imsqti_usagedata_v2p1.ts +3 -0
  127. package/src/qti/v2_1/imsqti_v2p1p2.ts +71 -0
  128. package/src/qti/v2_1/index.ts +53 -0
  129. package/src/qti/v2_1/qtiv2p1_imscpv1p2_v1p0.ts +3 -0
  130. package/src/qti/v2_1/schemas.ts +15 -0
  131. package/src/qti/v2_1/shared.ts +3 -0
  132. package/src/qti/v2_2/apipv1p0_qtiextv2p2_v1p0p1.ts +3 -0
  133. package/src/qti/v2_2/imsqti_metadata_v2p2.ts +3 -0
  134. package/src/qti/v2_2/imsqti_result_v2p2.ts +3 -0
  135. package/src/qti/v2_2/imsqti_usagedata_v2p2.ts +3 -0
  136. package/src/qti/v2_2/imsqti_v2p2p4.ts +76 -0
  137. package/src/qti/v2_2/imsqtiv2p2p4_html5_v1p0.ts +8 -0
  138. package/src/qti/v2_2/index.ts +59 -0
  139. package/src/qti/v2_2/qtiv2p2_csm_v2p2.ts +4 -0
  140. package/src/qti/v2_2/qtiv2p2_imscpv1p2_v1p0.ts +3 -0
  141. package/src/qti/v2_2/schemas.ts +19 -0
  142. package/src/qti/v2_2/shared.ts +3 -0
  143. package/src/qti/v3_0_1/assessment-internal.ts +1509 -0
  144. package/src/qti/v3_0_1/imsqti_asiv3p0p1_v1p0.ts +57 -0
  145. package/src/qti/v3_0_1/imsqti_itemv3p0p1_v1p0.ts +60 -0
  146. package/src/qti/v3_0_1/imsqti_metadatav3p0_v1p0.ts +73 -0
  147. package/src/qti/v3_0_1/imsqti_outcomev3p0p1_v1p0.ts +11 -0
  148. package/src/qti/v3_0_1/imsqti_responseprocessingv3p0p1_v1p0.ts +17 -0
  149. package/src/qti/v3_0_1/imsqti_resultv3p0_v1p0.ts +222 -0
  150. package/src/qti/v3_0_1/imsqti_sectionv3p0p1_v1p0.ts +15 -0
  151. package/src/qti/v3_0_1/imsqti_stimulusv3p0p1_v1p0.ts +15 -0
  152. package/src/qti/v3_0_1/imsqti_testv3p0p1_v1p0.ts +49 -0
  153. package/src/qti/v3_0_1/imsqti_usagedatav3p0_v1p0.ts +77 -0
  154. package/src/qti/v3_0_1/imsqtiv3p0_afa3p0pnp_v1p0.ts +269 -0
  155. package/src/qti/v3_0_1/index.ts +50 -0
  156. package/src/qti/v3_0_1/processing-internal.ts +667 -0
  157. package/src/qti/v3_0_1/shared.ts +146 -0
  158. package/src/qti/v3_0_1/variables-internal.ts +274 -0
  159. package/src/shared/imsx-status.ts +49 -0
  160. package/src/summary.ts +70 -0
  161. package/src/vc-data-model/v2_0/index.ts +27 -0
  162. package/src/vc-data-model/v2_0/shared.ts +206 -0
  163. package/src/xapi/index.ts +12 -0
  164. package/src/xapi/shared.ts +444 -0
  165. package/src/xapi/v1_0_3/index.ts +169 -0
  166. package/src/xapi/v2_0/index.ts +256 -0
  167. package/test/caliper-v1_2.test.ts +270 -0
  168. package/test/case-v1_1.test.ts +147 -0
  169. package/test/cat-v1_0.test.ts +338 -0
  170. package/test/cc-v1_4.test.ts +239 -0
  171. package/test/clr-v2_0.test.ts +225 -0
  172. package/test/cmi5-v1_0.test.ts +196 -0
  173. package/test/contracts.test.ts +125 -0
  174. package/test/fixtures/cmi5/extended-cmi5.xml +72 -0
  175. package/test/fixtures/cmi5/simple-cmi5.xml +26 -0
  176. package/test/lti.test.ts +146 -0
  177. package/test/oneroster-v1_2.test.ts +234 -0
  178. package/test/open-badges-v3_0.test.ts +144 -0
  179. package/test/qti-v2_1.test.ts +146 -0
  180. package/test/qti-v2_2.test.ts +154 -0
  181. package/test/qti-v3_0_1.test.ts +576 -0
  182. package/test/schema-examples.test.ts +101 -0
  183. package/test/vc-data-model-v2_0.test.ts +63 -0
  184. package/test/xapi.test.ts +384 -0
  185. package/tsconfig.json +7 -0
  186. package/vc-data-model-v2_0-zod-templates.md +43 -0
  187. package/xapi-zod-templates.md +95 -0
@@ -0,0 +1,243 @@
1
+ import { z } from "zod";
2
+
3
+ import {
4
+ AcadSessionGuidRefSchema,
5
+ ClassGuidRefSchema,
6
+ CourseGuidRefSchema,
7
+ DateSchema,
8
+ DateTimeSchema,
9
+ EntityStatusSchema,
10
+ extensibleEnum,
11
+ guidReferenceSchema,
12
+ MetadataSchema,
13
+ OrgGuidRefSchema,
14
+ SourcedIdSchema,
15
+ strictObject,
16
+ TrueFalseStringSchema,
17
+ UserGuidRefSchema,
18
+ } from "./shared";
19
+
20
+ export const AssessmentLineItemGuidRefSchema = guidReferenceSchema("assessmentLineItem");
21
+ export const CategoryGuidRefSchema = guidReferenceSchema("category");
22
+ export const LineItemGuidRefSchema = guidReferenceSchema("lineItem");
23
+ export const ScoreScaleGuidRefSchema = guidReferenceSchema("scoreScale");
24
+
25
+ export const ScoreStatusSchema = extensibleEnum([
26
+ "exempt",
27
+ "fully graded",
28
+ "not submitted",
29
+ "partially graded",
30
+ "submitted",
31
+ ]);
32
+
33
+ export const LearningObjectiveSourceSchema = z.union([
34
+ z.string().regex(/^\/(?!case$)(?!unknown$)[a-z0-9]+$/u),
35
+ z.enum(["case", "unknown"]),
36
+ ]);
37
+
38
+ export const LearningObjectiveResultsSchema = strictObject({
39
+ learningObjectiveId: z.string(),
40
+ score: z.number().optional(),
41
+ textScore: z.string().optional(),
42
+ });
43
+
44
+ export const LearningObjectiveScoreSetSchema = strictObject({
45
+ source: LearningObjectiveSourceSchema,
46
+ learningObjectiveResults: z.array(LearningObjectiveResultsSchema).min(1),
47
+ });
48
+
49
+ export const LearningObjectiveSetSchema = strictObject({
50
+ source: LearningObjectiveSourceSchema,
51
+ learningObjectiveIds: z.array(z.string()).min(1),
52
+ });
53
+
54
+ export const CategorySchema = strictObject({
55
+ sourcedId: SourcedIdSchema,
56
+ status: EntityStatusSchema,
57
+ dateLastModified: DateTimeSchema,
58
+ metadata: MetadataSchema.optional(),
59
+ title: z.string(),
60
+ weight: z.number().optional(),
61
+ });
62
+
63
+ export const ScoreScaleValueSchema = strictObject({
64
+ itemValueLHS: z.string(),
65
+ itemValueRHS: z.string(),
66
+ });
67
+
68
+ export const ScoreScaleSchema = strictObject({
69
+ sourcedId: SourcedIdSchema,
70
+ status: EntityStatusSchema,
71
+ dateLastModified: DateTimeSchema,
72
+ metadata: MetadataSchema.optional(),
73
+ title: z.string(),
74
+ type: z.string(),
75
+ course: CourseGuidRefSchema.optional(),
76
+ class: ClassGuidRefSchema,
77
+ scoreScaleValue: z.array(ScoreScaleValueSchema).min(1),
78
+ });
79
+
80
+ export const LineItemSchema = strictObject({
81
+ sourcedId: SourcedIdSchema,
82
+ status: EntityStatusSchema,
83
+ dateLastModified: DateTimeSchema,
84
+ metadata: MetadataSchema.optional(),
85
+ title: z.string(),
86
+ description: z.string().optional(),
87
+ assignDate: DateTimeSchema,
88
+ dueDate: DateTimeSchema,
89
+ class: ClassGuidRefSchema,
90
+ school: OrgGuidRefSchema,
91
+ category: CategoryGuidRefSchema,
92
+ gradingPeriod: AcadSessionGuidRefSchema.optional(),
93
+ academicSession: AcadSessionGuidRefSchema.optional(),
94
+ scoreScale: ScoreScaleGuidRefSchema.optional(),
95
+ resultValueMin: z.number().optional(),
96
+ resultValueMax: z.number().optional(),
97
+ learningObjectiveSet: z.array(LearningObjectiveSetSchema).optional(),
98
+ });
99
+
100
+ export const ResultSchema = strictObject({
101
+ sourcedId: SourcedIdSchema,
102
+ status: EntityStatusSchema,
103
+ dateLastModified: DateTimeSchema,
104
+ metadata: MetadataSchema.optional(),
105
+ lineItem: LineItemGuidRefSchema,
106
+ student: UserGuidRefSchema,
107
+ class: ClassGuidRefSchema.optional(),
108
+ scoreScale: ScoreScaleGuidRefSchema.optional(),
109
+ scoreStatus: ScoreStatusSchema,
110
+ score: z.number().optional(),
111
+ textScore: z.string().optional(),
112
+ scoreDate: DateSchema,
113
+ comment: z.string().optional(),
114
+ learningObjectiveSet: z.array(LearningObjectiveScoreSetSchema).optional(),
115
+ inProgress: TrueFalseStringSchema.optional(),
116
+ incomplete: TrueFalseStringSchema.optional(),
117
+ late: TrueFalseStringSchema.optional(),
118
+ missing: TrueFalseStringSchema.optional(),
119
+ });
120
+
121
+ export const AssessmentLineItemSchema = strictObject({
122
+ sourcedId: SourcedIdSchema,
123
+ status: EntityStatusSchema,
124
+ dateLastModified: DateTimeSchema,
125
+ metadata: MetadataSchema.optional(),
126
+ title: z.string(),
127
+ description: z.string().optional(),
128
+ class: ClassGuidRefSchema.optional(),
129
+ parentAssessmentLineItem: AssessmentLineItemGuidRefSchema.optional(),
130
+ scoreScale: ScoreScaleGuidRefSchema.optional(),
131
+ resultValueMin: z.number().optional(),
132
+ resultValueMax: z.number().optional(),
133
+ learningObjectiveSet: z.array(LearningObjectiveSetSchema).optional(),
134
+ });
135
+
136
+ export const AssessmentResultSchema = strictObject({
137
+ sourcedId: SourcedIdSchema,
138
+ status: EntityStatusSchema,
139
+ dateLastModified: DateTimeSchema,
140
+ metadata: MetadataSchema.optional(),
141
+ assessmentLineItem: AssessmentLineItemGuidRefSchema,
142
+ student: UserGuidRefSchema,
143
+ score: z.number().optional(),
144
+ textScore: z.string().optional(),
145
+ scoreDate: DateSchema,
146
+ scoreScale: ScoreScaleGuidRefSchema.optional(),
147
+ scorePercentile: z.number().optional(),
148
+ scoreStatus: ScoreStatusSchema,
149
+ comment: z.string().optional(),
150
+ learningObjectiveSet: z.array(LearningObjectiveScoreSetSchema).optional(),
151
+ inProgress: TrueFalseStringSchema.optional(),
152
+ incomplete: TrueFalseStringSchema.optional(),
153
+ late: TrueFalseStringSchema.optional(),
154
+ missing: TrueFalseStringSchema.optional(),
155
+ });
156
+
157
+ export const GuidPairSchema = strictObject({
158
+ suppliedSourcedId: z.string(),
159
+ allocatedSourcedId: z.string(),
160
+ });
161
+
162
+ export const CategorySetSchema = strictObject({
163
+ categories: z.array(CategorySchema).optional(),
164
+ });
165
+
166
+ export const ScoreScaleSetSchema = strictObject({
167
+ scoreScales: z.array(ScoreScaleSchema).optional(),
168
+ });
169
+
170
+ export const LineItemSetSchema = strictObject({
171
+ lineItems: z.array(LineItemSchema).optional(),
172
+ });
173
+
174
+ export const ResultSetSchema = strictObject({
175
+ results: z.array(ResultSchema).optional(),
176
+ });
177
+
178
+ export const AssessmentLineItemSetSchema = strictObject({
179
+ assessmentLineItems: z.array(AssessmentLineItemSchema).optional(),
180
+ });
181
+
182
+ export const AssessmentResultSetSchema = strictObject({
183
+ assessmentResults: z.array(AssessmentResultSchema).optional(),
184
+ });
185
+
186
+ export const GuidPairSetSchema = strictObject({
187
+ sourcedIdPairs: z.array(GuidPairSchema).optional(),
188
+ });
189
+
190
+ export const SingleCategorySchema = strictObject({
191
+ category: CategorySchema,
192
+ });
193
+
194
+ export const SingleScoreScaleSchema = strictObject({
195
+ scoreScale: ScoreScaleSchema,
196
+ });
197
+
198
+ export const SingleLineItemSchema = strictObject({
199
+ lineItem: LineItemSchema,
200
+ });
201
+
202
+ export const SingleResultSchema = strictObject({
203
+ result: ResultSchema,
204
+ });
205
+
206
+ export const SingleAssessmentLineItemSchema = strictObject({
207
+ assessmentLineItem: AssessmentLineItemSchema,
208
+ });
209
+
210
+ export const SingleAssessmentResultSchema = strictObject({
211
+ assessmentResult: AssessmentResultSchema,
212
+ });
213
+ // Inferred types from exported Zod validators.
214
+ export type AssessmentLineItemGuidRef = z.infer<typeof AssessmentLineItemGuidRefSchema>;
215
+ export type CategoryGuidRef = z.infer<typeof CategoryGuidRefSchema>;
216
+ export type LineItemGuidRef = z.infer<typeof LineItemGuidRefSchema>;
217
+ export type ScoreScaleGuidRef = z.infer<typeof ScoreScaleGuidRefSchema>;
218
+ export type ScoreStatus = z.infer<typeof ScoreStatusSchema>;
219
+ export type LearningObjectiveSource = z.infer<typeof LearningObjectiveSourceSchema>;
220
+ export type LearningObjectiveResults = z.infer<typeof LearningObjectiveResultsSchema>;
221
+ export type LearningObjectiveScoreSet = z.infer<typeof LearningObjectiveScoreSetSchema>;
222
+ export type LearningObjectiveSet = z.infer<typeof LearningObjectiveSetSchema>;
223
+ export type Category = z.infer<typeof CategorySchema>;
224
+ export type ScoreScaleValue = z.infer<typeof ScoreScaleValueSchema>;
225
+ export type ScoreScale = z.infer<typeof ScoreScaleSchema>;
226
+ export type LineItem = z.infer<typeof LineItemSchema>;
227
+ export type Result = z.infer<typeof ResultSchema>;
228
+ export type AssessmentLineItem = z.infer<typeof AssessmentLineItemSchema>;
229
+ export type AssessmentResult = z.infer<typeof AssessmentResultSchema>;
230
+ export type GuidPair = z.infer<typeof GuidPairSchema>;
231
+ export type CategorySet = z.infer<typeof CategorySetSchema>;
232
+ export type ScoreScaleSet = z.infer<typeof ScoreScaleSetSchema>;
233
+ export type LineItemSet = z.infer<typeof LineItemSetSchema>;
234
+ export type ResultSet = z.infer<typeof ResultSetSchema>;
235
+ export type AssessmentLineItemSet = z.infer<typeof AssessmentLineItemSetSchema>;
236
+ export type AssessmentResultSet = z.infer<typeof AssessmentResultSetSchema>;
237
+ export type GuidPairSet = z.infer<typeof GuidPairSetSchema>;
238
+ export type SingleCategory = z.infer<typeof SingleCategorySchema>;
239
+ export type SingleScoreScale = z.infer<typeof SingleScoreScaleSchema>;
240
+ export type SingleLineItem = z.infer<typeof SingleLineItemSchema>;
241
+ export type SingleResult = z.infer<typeof SingleResultSchema>;
242
+ export type SingleAssessmentLineItem = z.infer<typeof SingleAssessmentLineItemSchema>;
243
+ export type SingleAssessmentResult = z.infer<typeof SingleAssessmentResultSchema>;
@@ -0,0 +1,24 @@
1
+ import { z } from "zod";
2
+
3
+ import { ResourceSetSchema, SingleResourceSchema } from "./or_v1p2_resource_service_schema";
4
+ import { ImsxStatusInfoSchema } from "./shared";
5
+
6
+ const EmptyPayloadSchema = z.undefined();
7
+
8
+ function resourceGetOperation(path: string, successResponsePayload: z.ZodTypeAny) {
9
+ return {
10
+ method: "GET",
11
+ path,
12
+ requestPayload: EmptyPayloadSchema,
13
+ successResponsePayload,
14
+ errorResponsePayload: ImsxStatusInfoSchema,
15
+ } as const;
16
+ }
17
+
18
+ export const ResourceRestBindingOperationSchemas = {
19
+ getResourcesForClass: resourceGetOperation("/classes/{classSourcedId}/resources", ResourceSetSchema),
20
+ getResourcesForCourse: resourceGetOperation("/courses/{courseSourcedId}/resources", ResourceSetSchema),
21
+ getAllResources: resourceGetOperation("/resources", ResourceSetSchema),
22
+ getResource: resourceGetOperation("/resources/{sourcedId}", SingleResourceSchema),
23
+ getResourcesForUser: resourceGetOperation("/users/{userSourcedId}/resources", ResourceSetSchema),
24
+ } as const;
@@ -0,0 +1,47 @@
1
+ import { z } from "zod";
2
+
3
+ import {
4
+ DateTimeSchema,
5
+ EntityStatusSchema,
6
+ extensibleEnum,
7
+ MetadataSchema,
8
+ SourcedIdSchema,
9
+ strictObject,
10
+ } from "./shared";
11
+
12
+ export const ResourceRoleSchema = extensibleEnum([
13
+ "administrator",
14
+ "aide",
15
+ "guardian",
16
+ "parent",
17
+ "proctor",
18
+ "relative",
19
+ "student",
20
+ "teacher",
21
+ ]);
22
+
23
+ export const ResourceSchema = strictObject({
24
+ sourcedId: SourcedIdSchema,
25
+ status: EntityStatusSchema,
26
+ dateLastModified: DateTimeSchema,
27
+ metadata: MetadataSchema.optional(),
28
+ title: z.string().optional(),
29
+ roles: z.array(ResourceRoleSchema).optional(),
30
+ importance: z.enum(["primary", "secondary"]).optional(),
31
+ vendorResourceId: z.string(),
32
+ vendorId: z.string().optional(),
33
+ applicationId: z.string().optional(),
34
+ });
35
+
36
+ export const ResourceSetSchema = strictObject({
37
+ resources: z.array(ResourceSchema).optional(),
38
+ });
39
+
40
+ export const SingleResourceSchema = strictObject({
41
+ resource: ResourceSchema,
42
+ });
43
+ // Inferred types from exported Zod validators.
44
+ export type ResourceRole = z.infer<typeof ResourceRoleSchema>;
45
+ export type Resource = z.infer<typeof ResourceSchema>;
46
+ export type ResourceSet = z.infer<typeof ResourceSetSchema>;
47
+ export type SingleResource = z.infer<typeof SingleResourceSchema>;
@@ -0,0 +1,84 @@
1
+ import { z } from "zod";
2
+
3
+ import {
4
+ AcademicSessionSetSchema,
5
+ ClassSetSchema,
6
+ CourseSetSchema,
7
+ DemographicsSetSchema,
8
+ EnrollmentSetSchema,
9
+ OrgSetSchema,
10
+ SingleAcademicSessionSchema,
11
+ SingleClassSchema,
12
+ SingleCourseSchema,
13
+ SingleDemographicsSchema,
14
+ SingleEnrollmentSchema,
15
+ SingleOrgSchema,
16
+ SingleUserSchema,
17
+ UserSetSchema,
18
+ } from "./or_v1p2_rostering_service_schema";
19
+ import { ImsxStatusInfoSchema } from "./shared";
20
+
21
+ const EmptyPayloadSchema = z.undefined();
22
+
23
+ function rosteringGetOperation(path: string, successResponsePayload: z.ZodTypeAny) {
24
+ return {
25
+ method: "GET",
26
+ path,
27
+ requestPayload: EmptyPayloadSchema,
28
+ successResponsePayload,
29
+ errorResponsePayload: ImsxStatusInfoSchema,
30
+ } as const;
31
+ }
32
+
33
+ export const RosteringRestBindingOperationSchemas = {
34
+ getAllAcademicSessions: rosteringGetOperation("/academicSessions", AcademicSessionSetSchema),
35
+ getAcademicSession: rosteringGetOperation("/academicSessions/{sourcedId}", SingleAcademicSessionSchema),
36
+ getAllClasses: rosteringGetOperation("/classes", ClassSetSchema),
37
+ getStudentsForClass: rosteringGetOperation("/classes/{classSourcedId}/students", UserSetSchema),
38
+ getTeachersForClass: rosteringGetOperation("/classes/{classSourcedId}/teachers", UserSetSchema),
39
+ getClass: rosteringGetOperation("/classes/{sourcedId}", SingleClassSchema),
40
+ getAllCourses: rosteringGetOperation("/courses", CourseSetSchema),
41
+ getClassesForCourse: rosteringGetOperation("/courses/{courseSourcedId}/classes", ClassSetSchema),
42
+ getCourse: rosteringGetOperation("/courses/{sourcedId}", SingleCourseSchema),
43
+ getAllDemographics: rosteringGetOperation("/demographics", DemographicsSetSchema),
44
+ getDemographics: rosteringGetOperation("/demographics/{sourcedId}", SingleDemographicsSchema),
45
+ getAllEnrollments: rosteringGetOperation("/enrollments", EnrollmentSetSchema),
46
+ getEnrollment: rosteringGetOperation("/enrollments/{sourcedId}", SingleEnrollmentSchema),
47
+ getAllGradingPeriods: rosteringGetOperation("/gradingPeriods", AcademicSessionSetSchema),
48
+ getGradingPeriod: rosteringGetOperation("/gradingPeriods/{sourcedId}", SingleAcademicSessionSchema),
49
+ getAllOrgs: rosteringGetOperation("/orgs", OrgSetSchema),
50
+ getOrg: rosteringGetOperation("/orgs/{sourcedId}", SingleOrgSchema),
51
+ getAllSchools: rosteringGetOperation("/schools", OrgSetSchema),
52
+ getClassesForSchool: rosteringGetOperation("/schools/{schoolSourcedId}/classes", ClassSetSchema),
53
+ getEnrollmentsForClassInSchool: rosteringGetOperation(
54
+ "/schools/{schoolSourcedId}/classes/{classSourcedId}/enrollments",
55
+ EnrollmentSetSchema,
56
+ ),
57
+ getStudentsForClassInSchool: rosteringGetOperation(
58
+ "/schools/{schoolSourcedId}/classes/{classSourcedId}/students",
59
+ UserSetSchema,
60
+ ),
61
+ getTeachersForClassInSchool: rosteringGetOperation(
62
+ "/schools/{schoolSourcedId}/classes/{classSourcedId}/teachers",
63
+ UserSetSchema,
64
+ ),
65
+ getCoursesForSchool: rosteringGetOperation("/schools/{schoolSourcedId}/courses", CourseSetSchema),
66
+ getEnrollmentsForSchool: rosteringGetOperation("/schools/{schoolSourcedId}/enrollments", EnrollmentSetSchema),
67
+ getStudentsForSchool: rosteringGetOperation("/schools/{schoolSourcedId}/students", UserSetSchema),
68
+ getTeachersForSchool: rosteringGetOperation("/schools/{schoolSourcedId}/teachers", UserSetSchema),
69
+ getTermsForSchool: rosteringGetOperation("/schools/{schoolSourcedId}/terms", AcademicSessionSetSchema),
70
+ getSchool: rosteringGetOperation("/schools/{sourcedId}", SingleOrgSchema),
71
+ getAllStudents: rosteringGetOperation("/students", UserSetSchema),
72
+ getStudent: rosteringGetOperation("/students/{sourcedId}", SingleUserSchema),
73
+ getClassesForStudent: rosteringGetOperation("/students/{studentSourcedId}/classes", ClassSetSchema),
74
+ getAllTeachers: rosteringGetOperation("/teachers", UserSetSchema),
75
+ getTeacher: rosteringGetOperation("/teachers/{sourcedId}", SingleUserSchema),
76
+ getClassesForTeacher: rosteringGetOperation("/teachers/{teacherSourcedId}/classes", ClassSetSchema),
77
+ getAllTerms: rosteringGetOperation("/terms", AcademicSessionSetSchema),
78
+ getTerm: rosteringGetOperation("/terms/{sourcedId}", SingleAcademicSessionSchema),
79
+ getClassesForTerm: rosteringGetOperation("/terms/{termSourcedId}/classes", ClassSetSchema),
80
+ getGradingPeriodsForTerm: rosteringGetOperation("/terms/{termSourcedId}/gradingPeriods", AcademicSessionSetSchema),
81
+ getAllUsers: rosteringGetOperation("/users", UserSetSchema),
82
+ getUser: rosteringGetOperation("/users/{sourcedId}", SingleUserSchema),
83
+ getClassesForUser: rosteringGetOperation("/users/{userSourcedId}/classes", ClassSetSchema),
84
+ } as const;
@@ -0,0 +1,288 @@
1
+ import { z } from "zod";
2
+
3
+ import {
4
+ AcadSessionGuidRefSchema,
5
+ ClassGuidRefSchema,
6
+ CourseGuidRefSchema,
7
+ DateSchema,
8
+ DateTimeSchema,
9
+ EntityStatusSchema,
10
+ extensibleEnum,
11
+ MetadataSchema,
12
+ OrgGuidRefSchema,
13
+ ResourceGuidRefSchema,
14
+ SourcedIdSchema,
15
+ strictObject,
16
+ TrueFalseStringSchema,
17
+ UrlSchema,
18
+ UserGuidRefSchema,
19
+ } from "./shared";
20
+
21
+ export const AcademicSessionTypeSchema = extensibleEnum(["gradingPeriod", "semester", "schoolYear", "term"]);
22
+ export const ClassTypeSchema = extensibleEnum(["homeroom", "scheduled"]);
23
+ export const DemographicsSexSchema = extensibleEnum(["male", "female", "unspecified", "other"]);
24
+ export const EnrollmentRoleSchema = extensibleEnum(["administrator", "proctor", "student", "teacher"]);
25
+ export const OrganizationTypeSchema = extensibleEnum([
26
+ "department",
27
+ "district",
28
+ "local",
29
+ "national",
30
+ "school",
31
+ "state",
32
+ ]);
33
+ export const UserOrganizationRoleSchema = extensibleEnum([
34
+ "aide",
35
+ "counselor",
36
+ "districtAdministrator",
37
+ "guardian",
38
+ "parent",
39
+ "principal",
40
+ "proctor",
41
+ "relative",
42
+ "siteAdministrator",
43
+ "student",
44
+ "systemAdministrator",
45
+ "teacher",
46
+ ]);
47
+
48
+ export const CredentialSchema = z
49
+ .object({
50
+ type: z.string(),
51
+ username: z.string(),
52
+ password: z.string().optional(),
53
+ })
54
+ .passthrough();
55
+
56
+ export const UserIdSchema = strictObject({
57
+ type: z.string(),
58
+ identifier: z.string(),
59
+ });
60
+
61
+ export const UserProfileSchema = strictObject({
62
+ profileId: UrlSchema,
63
+ profileType: z.string(),
64
+ vendorId: z.string(),
65
+ applicationId: z.string().optional(),
66
+ description: z.string().optional(),
67
+ credentials: z.array(CredentialSchema).optional(),
68
+ });
69
+
70
+ export const RoleSchema = strictObject({
71
+ roleType: z.enum(["primary", "secondary"]),
72
+ role: UserOrganizationRoleSchema,
73
+ org: OrgGuidRefSchema,
74
+ userProfile: UrlSchema.optional(),
75
+ beginDate: DateSchema.optional(),
76
+ endDate: DateSchema.optional(),
77
+ });
78
+
79
+ export const UserSchema = strictObject({
80
+ sourcedId: SourcedIdSchema,
81
+ status: EntityStatusSchema,
82
+ dateLastModified: DateTimeSchema,
83
+ metadata: MetadataSchema.optional(),
84
+ userMasterIdentifier: z.string().optional(),
85
+ username: z.string().optional(),
86
+ userIds: z.array(UserIdSchema).optional(),
87
+ enabledUser: TrueFalseStringSchema,
88
+ givenName: z.string(),
89
+ familyName: z.string(),
90
+ middleName: z.string().optional(),
91
+ preferredFirstName: z.string().optional(),
92
+ preferredMiddleName: z.string().optional(),
93
+ preferredLastName: z.string().optional(),
94
+ pronouns: z.string().optional(),
95
+ roles: z.array(RoleSchema).min(1),
96
+ userProfiles: z.array(UserProfileSchema).optional(),
97
+ primaryOrg: OrgGuidRefSchema.optional(),
98
+ identifier: z.string().optional(),
99
+ email: z.string().optional(),
100
+ sms: z.string().optional(),
101
+ phone: z.string().optional(),
102
+ agents: z.array(UserGuidRefSchema).optional(),
103
+ grades: z.array(z.string()).optional(),
104
+ password: z.string().optional(),
105
+ resources: z.array(ResourceGuidRefSchema).optional(),
106
+ });
107
+
108
+ export const OrgSchema = strictObject({
109
+ sourcedId: SourcedIdSchema,
110
+ status: EntityStatusSchema,
111
+ dateLastModified: DateTimeSchema,
112
+ metadata: MetadataSchema.optional(),
113
+ name: z.string(),
114
+ type: OrganizationTypeSchema,
115
+ identifier: z.string(),
116
+ parent: OrgGuidRefSchema.optional(),
117
+ children: z.array(OrgGuidRefSchema).optional(),
118
+ });
119
+
120
+ export const AcademicSessionSchema = strictObject({
121
+ sourcedId: SourcedIdSchema,
122
+ status: EntityStatusSchema,
123
+ dateLastModified: DateTimeSchema,
124
+ metadata: MetadataSchema.optional(),
125
+ title: z.string(),
126
+ startDate: DateSchema,
127
+ endDate: DateSchema,
128
+ type: AcademicSessionTypeSchema,
129
+ parent: AcadSessionGuidRefSchema.optional(),
130
+ children: z.array(AcadSessionGuidRefSchema).optional(),
131
+ schoolYear: z.string(),
132
+ });
133
+
134
+ export const CourseSchema = strictObject({
135
+ sourcedId: SourcedIdSchema,
136
+ status: EntityStatusSchema,
137
+ dateLastModified: DateTimeSchema,
138
+ metadata: MetadataSchema.optional(),
139
+ title: z.string(),
140
+ schoolYear: AcadSessionGuidRefSchema.optional(),
141
+ courseCode: z.string(),
142
+ grades: z.array(z.string()).optional(),
143
+ subjects: z.array(z.string()).optional(),
144
+ org: OrgGuidRefSchema.optional(),
145
+ subjectCodes: z.array(z.string()).optional(),
146
+ resources: z.array(ResourceGuidRefSchema).optional(),
147
+ });
148
+
149
+ export const ClassSchema = strictObject({
150
+ sourcedId: SourcedIdSchema,
151
+ status: EntityStatusSchema,
152
+ dateLastModified: DateTimeSchema,
153
+ metadata: MetadataSchema.optional(),
154
+ title: z.string(),
155
+ classCode: z.string().optional(),
156
+ classType: ClassTypeSchema.optional(),
157
+ location: z.string().optional(),
158
+ grades: z.array(z.string()).optional(),
159
+ subjects: z.array(z.string()).optional(),
160
+ course: CourseGuidRefSchema,
161
+ school: OrgGuidRefSchema,
162
+ terms: z.array(AcadSessionGuidRefSchema).min(1),
163
+ subjectCodes: z.array(z.string()).optional(),
164
+ periods: z.array(z.string()).optional(),
165
+ resources: z.array(ResourceGuidRefSchema).optional(),
166
+ });
167
+
168
+ export const DemographicsSchema = strictObject({
169
+ sourcedId: SourcedIdSchema,
170
+ status: EntityStatusSchema,
171
+ dateLastModified: DateTimeSchema,
172
+ metadata: MetadataSchema.optional(),
173
+ birthDate: DateSchema.optional(),
174
+ sex: DemographicsSexSchema.optional(),
175
+ americanIndianOrAlaskaNative: TrueFalseStringSchema.optional(),
176
+ asian: TrueFalseStringSchema.optional(),
177
+ blackOrAfricanAmerican: TrueFalseStringSchema.optional(),
178
+ nativeHawaiianOrOtherPacificIslander: TrueFalseStringSchema.optional(),
179
+ white: TrueFalseStringSchema.optional(),
180
+ demographicRaceTwoOrMoreRaces: TrueFalseStringSchema.optional(),
181
+ hispanicOrLatinoEthnicity: TrueFalseStringSchema.optional(),
182
+ countryOfBirthCode: z.string().optional(),
183
+ stateOfBirthAbbreviation: z.string().optional(),
184
+ cityOfBirth: z.string().optional(),
185
+ publicSchoolResidenceStatus: z.string().optional(),
186
+ });
187
+
188
+ export const EnrollmentSchema = strictObject({
189
+ sourcedId: SourcedIdSchema,
190
+ status: EntityStatusSchema,
191
+ dateLastModified: DateTimeSchema,
192
+ metadata: MetadataSchema.optional(),
193
+ user: UserGuidRefSchema,
194
+ class: ClassGuidRefSchema,
195
+ school: OrgGuidRefSchema,
196
+ role: EnrollmentRoleSchema,
197
+ primary: TrueFalseStringSchema.optional(),
198
+ beginDate: DateSchema.optional(),
199
+ endDate: DateSchema.optional(),
200
+ });
201
+
202
+ export const UserSetSchema = strictObject({
203
+ users: z.array(UserSchema).optional(),
204
+ });
205
+
206
+ export const OrgSetSchema = strictObject({
207
+ orgs: z.array(OrgSchema).optional(),
208
+ });
209
+
210
+ export const AcademicSessionSetSchema = strictObject({
211
+ academicSessions: z.array(AcademicSessionSchema).optional(),
212
+ });
213
+
214
+ export const CourseSetSchema = strictObject({
215
+ courses: z.array(CourseSchema).optional(),
216
+ });
217
+
218
+ export const ClassSetSchema = strictObject({
219
+ classes: z.array(ClassSchema).optional(),
220
+ });
221
+
222
+ export const DemographicsSetSchema = strictObject({
223
+ demographics: z.array(DemographicsSchema).optional(),
224
+ });
225
+
226
+ export const EnrollmentSetSchema = strictObject({
227
+ enrollments: z.array(EnrollmentSchema).optional(),
228
+ });
229
+
230
+ export const SingleUserSchema = strictObject({
231
+ user: UserSchema,
232
+ });
233
+
234
+ export const SingleOrgSchema = strictObject({
235
+ org: OrgSchema,
236
+ });
237
+
238
+ export const SingleAcademicSessionSchema = strictObject({
239
+ academicSession: AcademicSessionSchema,
240
+ });
241
+
242
+ export const SingleCourseSchema = strictObject({
243
+ course: CourseSchema,
244
+ });
245
+
246
+ export const SingleClassSchema = strictObject({
247
+ class: ClassSchema,
248
+ });
249
+
250
+ export const SingleDemographicsSchema = strictObject({
251
+ demographics: DemographicsSchema,
252
+ });
253
+
254
+ export const SingleEnrollmentSchema = strictObject({
255
+ enrollment: EnrollmentSchema,
256
+ });
257
+ // Inferred types from exported Zod validators.
258
+ export type AcademicSessionType = z.infer<typeof AcademicSessionTypeSchema>;
259
+ export type ClassType = z.infer<typeof ClassTypeSchema>;
260
+ export type DemographicsSex = z.infer<typeof DemographicsSexSchema>;
261
+ export type EnrollmentRole = z.infer<typeof EnrollmentRoleSchema>;
262
+ export type OrganizationType = z.infer<typeof OrganizationTypeSchema>;
263
+ export type UserOrganizationRole = z.infer<typeof UserOrganizationRoleSchema>;
264
+ export type Credential = z.infer<typeof CredentialSchema>;
265
+ export type UserId = z.infer<typeof UserIdSchema>;
266
+ export type UserProfile = z.infer<typeof UserProfileSchema>;
267
+ export type Role = z.infer<typeof RoleSchema>;
268
+ export type User = z.infer<typeof UserSchema>;
269
+ export type Org = z.infer<typeof OrgSchema>;
270
+ export type AcademicSession = z.infer<typeof AcademicSessionSchema>;
271
+ export type Course = z.infer<typeof CourseSchema>;
272
+ export type Class = z.infer<typeof ClassSchema>;
273
+ export type Demographics = z.infer<typeof DemographicsSchema>;
274
+ export type Enrollment = z.infer<typeof EnrollmentSchema>;
275
+ export type UserSet = z.infer<typeof UserSetSchema>;
276
+ export type OrgSet = z.infer<typeof OrgSetSchema>;
277
+ export type AcademicSessionSet = z.infer<typeof AcademicSessionSetSchema>;
278
+ export type CourseSet = z.infer<typeof CourseSetSchema>;
279
+ export type ClassSet = z.infer<typeof ClassSetSchema>;
280
+ export type DemographicsSet = z.infer<typeof DemographicsSetSchema>;
281
+ export type EnrollmentSet = z.infer<typeof EnrollmentSetSchema>;
282
+ export type SingleUser = z.infer<typeof SingleUserSchema>;
283
+ export type SingleOrg = z.infer<typeof SingleOrgSchema>;
284
+ export type SingleAcademicSession = z.infer<typeof SingleAcademicSessionSchema>;
285
+ export type SingleCourse = z.infer<typeof SingleCourseSchema>;
286
+ export type SingleClass = z.infer<typeof SingleClassSchema>;
287
+ export type SingleDemographics = z.infer<typeof SingleDemographicsSchema>;
288
+ export type SingleEnrollment = z.infer<typeof SingleEnrollmentSchema>;