@pie-players/pie-assessment-toolkit 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (194) hide show
  1. package/README.md +520 -0
  2. package/dist/attempt/TestSession.d.ts +90 -0
  3. package/dist/attempt/TestSession.d.ts.map +1 -0
  4. package/dist/attempt/TestSession.js +174 -0
  5. package/dist/attempt/TestSession.js.map +1 -0
  6. package/dist/core/TypedEventBus.d.ts +48 -0
  7. package/dist/core/TypedEventBus.d.ts.map +1 -0
  8. package/dist/core/TypedEventBus.js +63 -0
  9. package/dist/core/TypedEventBus.js.map +1 -0
  10. package/dist/index.d.ts +37 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +44 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/item-loader.d.ts +45 -0
  15. package/dist/item-loader.d.ts.map +1 -0
  16. package/dist/item-loader.js +62 -0
  17. package/dist/item-loader.js.map +1 -0
  18. package/dist/player/AssessmentPlayer.d.ts +388 -0
  19. package/dist/player/AssessmentPlayer.d.ts.map +1 -0
  20. package/dist/player/AssessmentPlayer.js +965 -0
  21. package/dist/player/AssessmentPlayer.js.map +1 -0
  22. package/dist/player/index.d.ts +17 -0
  23. package/dist/player/index.d.ts.map +1 -0
  24. package/dist/player/index.js +15 -0
  25. package/dist/player/index.js.map +1 -0
  26. package/dist/player/navigation-types.d.ts +63 -0
  27. package/dist/player/navigation-types.d.ts.map +1 -0
  28. package/dist/player/navigation-types.js +7 -0
  29. package/dist/player/navigation-types.js.map +1 -0
  30. package/dist/player/qti-navigation.d.ts +29 -0
  31. package/dist/player/qti-navigation.d.ts.map +1 -0
  32. package/dist/player/qti-navigation.js +160 -0
  33. package/dist/player/qti-navigation.js.map +1 -0
  34. package/dist/reference-layout/index.d.ts +19 -0
  35. package/dist/reference-layout/index.d.ts.map +1 -0
  36. package/dist/reference-layout/index.js +20 -0
  37. package/dist/reference-layout/index.js.map +1 -0
  38. package/dist/services/AccessibilityCatalogResolver.d.ts +141 -0
  39. package/dist/services/AccessibilityCatalogResolver.d.ts.map +1 -0
  40. package/dist/services/AccessibilityCatalogResolver.js +249 -0
  41. package/dist/services/AccessibilityCatalogResolver.js.map +1 -0
  42. package/dist/services/AssessmentAuthoringService.d.ts +60 -0
  43. package/dist/services/AssessmentAuthoringService.d.ts.map +1 -0
  44. package/dist/services/AssessmentAuthoringService.js +183 -0
  45. package/dist/services/AssessmentAuthoringService.js.map +1 -0
  46. package/dist/services/ContextVariableStore.d.ts +114 -0
  47. package/dist/services/ContextVariableStore.d.ts.map +1 -0
  48. package/dist/services/ContextVariableStore.js +207 -0
  49. package/dist/services/ContextVariableStore.js.map +1 -0
  50. package/dist/services/ElementToolStateStore.d.ts +125 -0
  51. package/dist/services/ElementToolStateStore.d.ts.map +1 -0
  52. package/dist/services/ElementToolStateStore.js +200 -0
  53. package/dist/services/ElementToolStateStore.js.map +1 -0
  54. package/dist/services/HighlightCoordinator.d.ts +179 -0
  55. package/dist/services/HighlightCoordinator.d.ts.map +1 -0
  56. package/dist/services/HighlightCoordinator.js +446 -0
  57. package/dist/services/HighlightCoordinator.js.map +1 -0
  58. package/dist/services/I18nService.d.ts +121 -0
  59. package/dist/services/I18nService.d.ts.map +1 -0
  60. package/dist/services/I18nService.js +276 -0
  61. package/dist/services/I18nService.js.map +1 -0
  62. package/dist/services/PNPMapper.d.ts +71 -0
  63. package/dist/services/PNPMapper.d.ts.map +1 -0
  64. package/dist/services/PNPMapper.js +98 -0
  65. package/dist/services/PNPMapper.js.map +1 -0
  66. package/dist/services/PNPToolResolver.d.ts +127 -0
  67. package/dist/services/PNPToolResolver.d.ts.map +1 -0
  68. package/dist/services/PNPToolResolver.js +222 -0
  69. package/dist/services/PNPToolResolver.js.map +1 -0
  70. package/dist/services/SSMLExtractor.d.ts +61 -0
  71. package/dist/services/SSMLExtractor.d.ts.map +1 -0
  72. package/dist/services/SSMLExtractor.js +181 -0
  73. package/dist/services/SSMLExtractor.js.map +1 -0
  74. package/dist/services/TTSService.d.ts +162 -0
  75. package/dist/services/TTSService.d.ts.map +1 -0
  76. package/dist/services/TTSService.js +465 -0
  77. package/dist/services/TTSService.js.map +1 -0
  78. package/dist/services/ThemeProvider.d.ts +95 -0
  79. package/dist/services/ThemeProvider.d.ts.map +1 -0
  80. package/dist/services/ThemeProvider.js +299 -0
  81. package/dist/services/ThemeProvider.js.map +1 -0
  82. package/dist/services/ToolConfigResolver.d.ts +162 -0
  83. package/dist/services/ToolConfigResolver.d.ts.map +1 -0
  84. package/dist/services/ToolConfigResolver.js +230 -0
  85. package/dist/services/ToolConfigResolver.js.map +1 -0
  86. package/dist/services/ToolCoordinator.d.ts +137 -0
  87. package/dist/services/ToolCoordinator.d.ts.map +1 -0
  88. package/dist/services/ToolCoordinator.js +318 -0
  89. package/dist/services/ToolCoordinator.js.map +1 -0
  90. package/dist/services/ToolkitCoordinator.d.ts +188 -0
  91. package/dist/services/ToolkitCoordinator.d.ts.map +1 -0
  92. package/dist/services/ToolkitCoordinator.js +252 -0
  93. package/dist/services/ToolkitCoordinator.js.map +1 -0
  94. package/dist/services/interfaces.d.ts +391 -0
  95. package/dist/services/interfaces.d.ts.map +1 -0
  96. package/dist/services/interfaces.js +12 -0
  97. package/dist/services/interfaces.js.map +1 -0
  98. package/dist/services/tool-providers/DesmosToolProvider.d.ts +103 -0
  99. package/dist/services/tool-providers/DesmosToolProvider.d.ts.map +1 -0
  100. package/dist/services/tool-providers/DesmosToolProvider.js +127 -0
  101. package/dist/services/tool-providers/DesmosToolProvider.js.map +1 -0
  102. package/dist/services/tool-providers/IToolProvider.d.ts +137 -0
  103. package/dist/services/tool-providers/IToolProvider.d.ts.map +1 -0
  104. package/dist/services/tool-providers/IToolProvider.js +13 -0
  105. package/dist/services/tool-providers/IToolProvider.js.map +1 -0
  106. package/dist/services/tool-providers/TIToolProvider.d.ts +107 -0
  107. package/dist/services/tool-providers/TIToolProvider.d.ts.map +1 -0
  108. package/dist/services/tool-providers/TIToolProvider.js +123 -0
  109. package/dist/services/tool-providers/TIToolProvider.js.map +1 -0
  110. package/dist/services/tool-providers/TTSToolProvider.d.ts +143 -0
  111. package/dist/services/tool-providers/TTSToolProvider.d.ts.map +1 -0
  112. package/dist/services/tool-providers/TTSToolProvider.js +168 -0
  113. package/dist/services/tool-providers/TTSToolProvider.js.map +1 -0
  114. package/dist/services/tool-providers/ToolProviderRegistry.d.ts +165 -0
  115. package/dist/services/tool-providers/ToolProviderRegistry.d.ts.map +1 -0
  116. package/dist/services/tool-providers/ToolProviderRegistry.js +240 -0
  117. package/dist/services/tool-providers/ToolProviderRegistry.js.map +1 -0
  118. package/dist/services/tool-providers/index.d.ts +18 -0
  119. package/dist/services/tool-providers/index.d.ts.map +1 -0
  120. package/dist/services/tool-providers/index.js +15 -0
  121. package/dist/services/tool-providers/index.js.map +1 -0
  122. package/dist/services/tts/browser-provider.d.ts +24 -0
  123. package/dist/services/tts/browser-provider.d.ts.map +1 -0
  124. package/dist/services/tts/browser-provider.js +177 -0
  125. package/dist/services/tts/browser-provider.js.map +1 -0
  126. package/dist/services/tts/provider-interface.d.ts +131 -0
  127. package/dist/services/tts/provider-interface.d.ts.map +1 -0
  128. package/dist/services/tts/provider-interface.js +10 -0
  129. package/dist/services/tts/provider-interface.js.map +1 -0
  130. package/dist/tools/calculators/desmos-provider.d.ts +54 -0
  131. package/dist/tools/calculators/desmos-provider.d.ts.map +1 -0
  132. package/dist/tools/calculators/desmos-provider.js +384 -0
  133. package/dist/tools/calculators/desmos-provider.js.map +1 -0
  134. package/dist/tools/calculators/mathjs-provider.d.ts +50 -0
  135. package/dist/tools/calculators/mathjs-provider.d.ts.map +1 -0
  136. package/dist/tools/calculators/mathjs-provider.js +660 -0
  137. package/dist/tools/calculators/mathjs-provider.js.map +1 -0
  138. package/dist/tools/calculators/ti-provider.d.ts +122 -0
  139. package/dist/tools/calculators/ti-provider.d.ts.map +1 -0
  140. package/dist/tools/calculators/ti-provider.js +587 -0
  141. package/dist/tools/calculators/ti-provider.js.map +1 -0
  142. package/dist/tools/client.d.ts +17 -0
  143. package/dist/tools/client.d.ts.map +1 -0
  144. package/dist/tools/client.js +26 -0
  145. package/dist/tools/client.js.map +1 -0
  146. package/dist/tools/index.d.ts +8 -0
  147. package/dist/tools/index.d.ts.map +1 -0
  148. package/dist/tools/index.js +10 -0
  149. package/dist/tools/index.js.map +1 -0
  150. package/dist/tools/library-loader.d.ts +63 -0
  151. package/dist/tools/library-loader.d.ts.map +1 -0
  152. package/dist/tools/library-loader.js +292 -0
  153. package/dist/tools/library-loader.js.map +1 -0
  154. package/dist/tools/response-discovery.d.ts +72 -0
  155. package/dist/tools/response-discovery.d.ts.map +1 -0
  156. package/dist/tools/response-discovery.js +183 -0
  157. package/dist/tools/response-discovery.js.map +1 -0
  158. package/dist/tools/tool-coordinator.d.ts +76 -0
  159. package/dist/tools/tool-coordinator.d.ts.map +1 -0
  160. package/dist/tools/tool-coordinator.js +197 -0
  161. package/dist/tools/tool-coordinator.js.map +1 -0
  162. package/dist/tools/types.d.ts +427 -0
  163. package/dist/tools/types.d.ts.map +1 -0
  164. package/dist/tools/types.js +13 -0
  165. package/dist/tools/types.js.map +1 -0
  166. package/dist/tools/variant-resolver.d.ts +48 -0
  167. package/dist/tools/variant-resolver.d.ts.map +1 -0
  168. package/dist/tools/variant-resolver.js +214 -0
  169. package/dist/tools/variant-resolver.js.map +1 -0
  170. package/dist/types/events.d.ts +157 -0
  171. package/dist/types/events.d.ts.map +1 -0
  172. package/dist/types/events.js +11 -0
  173. package/dist/types/events.js.map +1 -0
  174. package/dist/utils/logger.d.ts +7 -0
  175. package/dist/utils/logger.d.ts.map +1 -0
  176. package/dist/utils/logger.js +11 -0
  177. package/dist/utils/logger.js.map +1 -0
  178. package/package.json +71 -0
  179. package/src/README.md +626 -0
  180. package/src/components/QuestionToolBar.svelte +406 -0
  181. package/src/player/AssessmentLayout.svelte +68 -0
  182. package/src/player/README.md +154 -0
  183. package/src/reference-layout/README.md +135 -0
  184. package/src/reference-layout/ReferenceLayout.svelte +209 -0
  185. package/src/reference-layout/components/AssessmentContent.svelte +259 -0
  186. package/src/reference-layout/components/AssessmentFooter.svelte +89 -0
  187. package/src/reference-layout/components/AssessmentHeader.svelte +250 -0
  188. package/src/reference-layout/components/AssessmentNavigation.svelte +134 -0
  189. package/src/reference-layout/components/AssessmentToolsBar.svelte +176 -0
  190. package/src/reference-layout/components/ItemPanel.svelte +200 -0
  191. package/src/reference-layout/components/NotesPanel.svelte +179 -0
  192. package/src/reference-layout/components/PassagePanel.svelte +76 -0
  193. package/src/tools/README.md +616 -0
  194. package/src/tools/calculators/README.md +395 -0
@@ -0,0 +1,249 @@
1
+ /**
2
+ * Accessibility Catalog Resolver Service
3
+ *
4
+ * Manages QTI 3.0 accessibility catalogs at both assessment and item levels.
5
+ * Provides lookup and resolution services for alternative content representations.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * // Initialize with assessment-level catalogs
10
+ * const resolver = new AccessibilityCatalogResolver(assessment.accessibilityCatalogs);
11
+ *
12
+ * // Add item-level catalogs when rendering item
13
+ * resolver.addItemCatalogs(item.accessibilityCatalogs);
14
+ *
15
+ * // Resolve catalog by identifier
16
+ * const spokenContent = resolver.getAlternative('intro-passage', {
17
+ * type: 'spoken',
18
+ * language: 'en-US'
19
+ * });
20
+ *
21
+ * // Check if catalog exists
22
+ * if (resolver.hasCatalog('math-problem-1')) {
23
+ * const braille = resolver.getAlternative('math-problem-1', { type: 'braille' });
24
+ * }
25
+ * ```
26
+ */
27
+ export class AccessibilityCatalogResolver {
28
+ assessmentCatalogs = new Map();
29
+ itemCatalogs = new Map();
30
+ defaultLanguage = "en";
31
+ constructor(assessmentCatalogs, defaultLanguage = "en") {
32
+ this.defaultLanguage = defaultLanguage;
33
+ this.indexCatalogs(assessmentCatalogs ?? [], "assessment");
34
+ }
35
+ /**
36
+ * Set the default language for fallback resolution
37
+ */
38
+ setDefaultLanguage(language) {
39
+ this.defaultLanguage = language;
40
+ }
41
+ /**
42
+ * Get the default language
43
+ */
44
+ getDefaultLanguage() {
45
+ return this.defaultLanguage;
46
+ }
47
+ /**
48
+ * Index catalogs into the appropriate map
49
+ */
50
+ indexCatalogs(catalogs, source) {
51
+ const targetMap = source === "assessment" ? this.assessmentCatalogs : this.itemCatalogs;
52
+ for (const catalog of catalogs) {
53
+ targetMap.set(catalog.identifier, catalog);
54
+ }
55
+ }
56
+ /**
57
+ * Add item-level catalogs (called when rendering a new item)
58
+ */
59
+ addItemCatalogs(catalogs) {
60
+ if (!catalogs || catalogs.length === 0)
61
+ return;
62
+ this.indexCatalogs(catalogs, "item");
63
+ }
64
+ /**
65
+ * Clear item-level catalogs (called when leaving an item)
66
+ */
67
+ clearItemCatalogs() {
68
+ this.itemCatalogs.clear();
69
+ }
70
+ /**
71
+ * Check if a catalog exists (checks both assessment and item levels)
72
+ */
73
+ hasCatalog(catalogId) {
74
+ return (this.itemCatalogs.has(catalogId) || this.assessmentCatalogs.has(catalogId));
75
+ }
76
+ /**
77
+ * Get alternative content for a catalog identifier
78
+ *
79
+ * Priority: Item-level catalogs take precedence over assessment-level
80
+ */
81
+ getAlternative(catalogId, options) {
82
+ // Check item-level first (higher precedence)
83
+ const itemCatalog = this.itemCatalogs.get(catalogId);
84
+ if (itemCatalog) {
85
+ const card = this.findMatchingCard(itemCatalog, options);
86
+ if (card) {
87
+ return {
88
+ catalogId,
89
+ type: card.catalog,
90
+ language: card.language,
91
+ content: card.content,
92
+ source: "item",
93
+ };
94
+ }
95
+ }
96
+ // Fallback to assessment-level
97
+ const assessmentCatalog = this.assessmentCatalogs.get(catalogId);
98
+ if (assessmentCatalog) {
99
+ const card = this.findMatchingCard(assessmentCatalog, options);
100
+ if (card) {
101
+ return {
102
+ catalogId,
103
+ type: card.catalog,
104
+ language: card.language,
105
+ content: card.content,
106
+ source: "assessment",
107
+ };
108
+ }
109
+ }
110
+ return null;
111
+ }
112
+ /**
113
+ * Find a matching catalog card based on lookup options
114
+ */
115
+ findMatchingCard(catalog, options) {
116
+ const { type, language, useFallback = true } = options;
117
+ // Try exact match (type + language)
118
+ if (language) {
119
+ const exactMatch = catalog.cards.find((card) => card.catalog === type && card.language === language);
120
+ if (exactMatch)
121
+ return exactMatch;
122
+ }
123
+ // Try type match with default language (if fallback enabled)
124
+ if (useFallback) {
125
+ const defaultMatch = catalog.cards.find((card) => card.catalog === type && card.language === this.defaultLanguage);
126
+ if (defaultMatch)
127
+ return defaultMatch;
128
+ // Try type match without language constraint
129
+ const typeMatch = catalog.cards.find((card) => card.catalog === type);
130
+ if (typeMatch)
131
+ return typeMatch;
132
+ }
133
+ return null;
134
+ }
135
+ /**
136
+ * Get all available alternatives for a catalog identifier
137
+ */
138
+ getAllAlternatives(catalogId) {
139
+ const results = [];
140
+ // Add item-level alternatives
141
+ const itemCatalog = this.itemCatalogs.get(catalogId);
142
+ if (itemCatalog) {
143
+ for (const card of itemCatalog.cards) {
144
+ results.push({
145
+ catalogId,
146
+ type: card.catalog,
147
+ language: card.language,
148
+ content: card.content,
149
+ source: "item",
150
+ });
151
+ }
152
+ }
153
+ // Add assessment-level alternatives (if not already provided by item)
154
+ const assessmentCatalog = this.assessmentCatalogs.get(catalogId);
155
+ if (assessmentCatalog) {
156
+ for (const card of assessmentCatalog.cards) {
157
+ // Only add if not already provided by item catalog
158
+ const exists = results.some((r) => r.type === card.catalog && r.language === card.language);
159
+ if (!exists) {
160
+ results.push({
161
+ catalogId,
162
+ type: card.catalog,
163
+ language: card.language,
164
+ content: card.content,
165
+ source: "assessment",
166
+ });
167
+ }
168
+ }
169
+ }
170
+ return results;
171
+ }
172
+ /**
173
+ * Get all catalog identifiers available (both assessment and item)
174
+ */
175
+ getAllCatalogIds() {
176
+ const itemIds = Array.from(this.itemCatalogs.keys());
177
+ const assessmentIds = Array.from(this.assessmentCatalogs.keys());
178
+ // Combine and deduplicate
179
+ return Array.from(new Set([...itemIds, ...assessmentIds]));
180
+ }
181
+ /**
182
+ * Get statistics about available catalogs
183
+ */
184
+ getStatistics() {
185
+ const allTypes = new Set();
186
+ const allLanguages = new Set();
187
+ // Collect from assessment catalogs
188
+ for (const catalog of this.assessmentCatalogs.values()) {
189
+ for (const card of catalog.cards) {
190
+ allTypes.add(card.catalog);
191
+ if (card.language)
192
+ allLanguages.add(card.language);
193
+ }
194
+ }
195
+ // Collect from item catalogs
196
+ for (const catalog of this.itemCatalogs.values()) {
197
+ for (const card of catalog.cards) {
198
+ allTypes.add(card.catalog);
199
+ if (card.language)
200
+ allLanguages.add(card.language);
201
+ }
202
+ }
203
+ return {
204
+ totalCatalogs: this.assessmentCatalogs.size + this.itemCatalogs.size,
205
+ assessmentCatalogs: this.assessmentCatalogs.size,
206
+ itemCatalogs: this.itemCatalogs.size,
207
+ availableTypes: allTypes,
208
+ availableLanguages: allLanguages,
209
+ };
210
+ }
211
+ /**
212
+ * Check if a specific catalog type is available for a given catalog ID
213
+ */
214
+ hasAlternativeType(catalogId, type) {
215
+ const alternatives = this.getAllAlternatives(catalogId);
216
+ return alternatives.some((alt) => alt.type === type);
217
+ }
218
+ /**
219
+ * Get all catalog IDs that have a specific type of alternative
220
+ */
221
+ getCatalogsByType(type) {
222
+ const catalogIds = new Set();
223
+ for (const [id, catalog] of this.assessmentCatalogs.entries()) {
224
+ if (catalog.cards.some((card) => card.catalog === type)) {
225
+ catalogIds.add(id);
226
+ }
227
+ }
228
+ for (const [id, catalog] of this.itemCatalogs.entries()) {
229
+ if (catalog.cards.some((card) => card.catalog === type)) {
230
+ catalogIds.add(id);
231
+ }
232
+ }
233
+ return Array.from(catalogIds);
234
+ }
235
+ /**
236
+ * Reset all catalogs (both assessment and item)
237
+ */
238
+ reset() {
239
+ this.assessmentCatalogs.clear();
240
+ this.itemCatalogs.clear();
241
+ }
242
+ /**
243
+ * Destroy and cleanup
244
+ */
245
+ destroy() {
246
+ this.reset();
247
+ }
248
+ }
249
+ //# sourceMappingURL=AccessibilityCatalogResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AccessibilityCatalogResolver.js","sourceRoot":"","sources":["../../src/services/AccessibilityCatalogResolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import type { AssessmentAuthoringCallbacks, AssessmentEntity, AssessmentSection, QuestionEntity } from "@pie-players/pie-players-shared";
2
+ export declare class AssessmentAuthoringService {
3
+ private assessment;
4
+ private eventBus;
5
+ private callbacks;
6
+ constructor(assessment: AssessmentEntity, callbacks?: AssessmentAuthoringCallbacks);
7
+ /**
8
+ * Get the current assessment structure
9
+ */
10
+ getAssessment(): AssessmentEntity;
11
+ /**
12
+ * Subscribe to assessment updates
13
+ */
14
+ subscribe(listener: (assessment: AssessmentEntity) => void): () => void;
15
+ /**
16
+ * Add a question/item to the assessment
17
+ */
18
+ addItem(item: QuestionEntity, index?: number): void;
19
+ /**
20
+ * Remove an item from the assessment
21
+ */
22
+ removeItem(itemId: string): void;
23
+ /**
24
+ * Move an item from one position to another
25
+ */
26
+ moveItem(fromIndex: number, toIndex: number): void;
27
+ /**
28
+ * Update an item's properties
29
+ */
30
+ updateItem(itemId: string, updates: Partial<QuestionEntity>): void;
31
+ /**
32
+ * Reorder items to match the provided question IDs
33
+ */
34
+ reorderItems(newOrder: string[]): void;
35
+ /**
36
+ * Add a section to the assessment
37
+ */
38
+ addSection(section: AssessmentSection, index?: number): void;
39
+ /**
40
+ * Remove a section from the assessment
41
+ */
42
+ removeSection(sectionId: string): void;
43
+ /**
44
+ * Update a section's properties
45
+ */
46
+ updateSection(sectionId: string, updates: Partial<AssessmentSection>): void;
47
+ /**
48
+ * Add a question to a section
49
+ */
50
+ addQuestionToSection(sectionId: string, questionId: string, sort?: string): void;
51
+ /**
52
+ * Remove a question from a section
53
+ */
54
+ removeQuestionFromSection(sectionId: string, questionId: string): void;
55
+ /**
56
+ * Emit assessment update event
57
+ */
58
+ private emitUpdate;
59
+ }
60
+ //# sourceMappingURL=AssessmentAuthoringService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssessmentAuthoringService.d.ts","sourceRoot":"","sources":["../../src/services/AssessmentAuthoringService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,4BAA4B,EAC5B,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EAEd,MAAM,iCAAiC,CAAC;AAWzC,qBAAa,0BAA0B;IACtC,OAAO,CAAC,UAAU,CAAmB;IACrC,OAAO,CAAC,QAAQ,CAA2C;IAC3D,OAAO,CAAC,SAAS,CAA+B;gBAG/C,UAAU,EAAE,gBAAgB,EAC5B,SAAS,GAAE,4BAAiC;IAe7C;;OAEG;IACH,aAAa,IAAI,gBAAgB;IAIjC;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,CAAC,UAAU,EAAE,gBAAgB,KAAK,IAAI,GAAG,MAAM,IAAI;IAUvE;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAWnD;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAuBhC;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAoBlD;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI;IAelE;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI;IAYtC;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,iBAAiB,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAW5D;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAetC;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,IAAI;IAe3E;;OAEG;IACH,oBAAoB,CACnB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,MAAM,GACX,IAAI;IAcP;;OAEG;IACH,yBAAyB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAetE;;OAEG;IACH,OAAO,CAAC,UAAU;CAIlB"}
@@ -0,0 +1,183 @@
1
+ import { TypedEventBus } from "../core/TypedEventBus";
2
+ export class AssessmentAuthoringService {
3
+ assessment;
4
+ eventBus;
5
+ callbacks;
6
+ constructor(assessment, callbacks = {}) {
7
+ this.assessment = { ...assessment };
8
+ this.callbacks = callbacks;
9
+ this.eventBus = new TypedEventBus();
10
+ // Initialize structure if missing
11
+ if (!this.assessment.questions) {
12
+ this.assessment.questions = [];
13
+ }
14
+ if (!this.assessment.sections) {
15
+ this.assessment.sections = [];
16
+ }
17
+ }
18
+ /**
19
+ * Get the current assessment structure
20
+ */
21
+ getAssessment() {
22
+ return { ...this.assessment };
23
+ }
24
+ /**
25
+ * Subscribe to assessment updates
26
+ */
27
+ subscribe(listener) {
28
+ const wrappedListener = (event) => {
29
+ listener(event.detail);
30
+ };
31
+ this.eventBus.on("assessment-updated", wrappedListener);
32
+ return () => {
33
+ this.eventBus.off("assessment-updated", wrappedListener);
34
+ };
35
+ }
36
+ /**
37
+ * Add a question/item to the assessment
38
+ */
39
+ addItem(item, index) {
40
+ const questions = this.assessment.questions || [];
41
+ const targetIndex = index !== undefined ? index : questions.length;
42
+ questions.splice(targetIndex, 0, item);
43
+ this.assessment.questions = questions;
44
+ this.callbacks.onItemAdded?.(item, targetIndex);
45
+ this.emitUpdate();
46
+ }
47
+ /**
48
+ * Remove an item from the assessment
49
+ */
50
+ removeItem(itemId) {
51
+ const questions = this.assessment.questions || [];
52
+ const index = questions.findIndex((q) => q.id === itemId);
53
+ if (index === -1) {
54
+ return;
55
+ }
56
+ questions.splice(index, 1);
57
+ this.assessment.questions = questions;
58
+ // Also remove from sections
59
+ if (this.assessment.sections) {
60
+ this.assessment.sections = this.assessment.sections.map((section) => ({
61
+ ...section,
62
+ questions: section.questions.filter((ref) => ref.questionId !== itemId),
63
+ }));
64
+ }
65
+ this.callbacks.onItemRemoved?.(itemId, index);
66
+ this.emitUpdate();
67
+ }
68
+ /**
69
+ * Move an item from one position to another
70
+ */
71
+ moveItem(fromIndex, toIndex) {
72
+ const questions = this.assessment.questions || [];
73
+ if (fromIndex < 0 ||
74
+ fromIndex >= questions.length ||
75
+ toIndex < 0 ||
76
+ toIndex >= questions.length) {
77
+ return;
78
+ }
79
+ const [item] = questions.splice(fromIndex, 1);
80
+ questions.splice(toIndex, 0, item);
81
+ this.assessment.questions = questions;
82
+ this.callbacks.onItemMoved?.(fromIndex, toIndex);
83
+ this.emitUpdate();
84
+ }
85
+ /**
86
+ * Update an item's properties
87
+ */
88
+ updateItem(itemId, updates) {
89
+ const questions = this.assessment.questions || [];
90
+ const index = questions.findIndex((q) => q.id === itemId);
91
+ if (index === -1) {
92
+ return;
93
+ }
94
+ questions[index] = { ...questions[index], ...updates };
95
+ this.assessment.questions = questions;
96
+ this.callbacks.onItemUpdated?.(itemId, updates);
97
+ this.emitUpdate();
98
+ }
99
+ /**
100
+ * Reorder items to match the provided question IDs
101
+ */
102
+ reorderItems(newOrder) {
103
+ const questions = this.assessment.questions || [];
104
+ const questionMap = new Map(questions.map((q) => [q.id, q]));
105
+ const reordered = newOrder
106
+ .map((id) => questionMap.get(id))
107
+ .filter((q) => q !== undefined);
108
+ this.assessment.questions = reordered;
109
+ this.emitUpdate();
110
+ }
111
+ /**
112
+ * Add a section to the assessment
113
+ */
114
+ addSection(section, index) {
115
+ const sections = this.assessment.sections || [];
116
+ const targetIndex = index !== undefined ? index : sections.length;
117
+ sections.splice(targetIndex, 0, section);
118
+ this.assessment.sections = sections;
119
+ this.callbacks.onSectionAdded?.(section, targetIndex);
120
+ this.emitUpdate();
121
+ }
122
+ /**
123
+ * Remove a section from the assessment
124
+ */
125
+ removeSection(sectionId) {
126
+ const sections = this.assessment.sections || [];
127
+ const index = sections.findIndex((s) => s.id === sectionId);
128
+ if (index === -1) {
129
+ return;
130
+ }
131
+ sections.splice(index, 1);
132
+ this.assessment.sections = sections;
133
+ this.callbacks.onSectionRemoved?.(sectionId, index);
134
+ this.emitUpdate();
135
+ }
136
+ /**
137
+ * Update a section's properties
138
+ */
139
+ updateSection(sectionId, updates) {
140
+ const sections = this.assessment.sections || [];
141
+ const index = sections.findIndex((s) => s.id === sectionId);
142
+ if (index === -1) {
143
+ return;
144
+ }
145
+ sections[index] = { ...sections[index], ...updates };
146
+ this.assessment.sections = sections;
147
+ this.callbacks.onSectionUpdated?.(sectionId, updates);
148
+ this.emitUpdate();
149
+ }
150
+ /**
151
+ * Add a question to a section
152
+ */
153
+ addQuestionToSection(sectionId, questionId, sort) {
154
+ const sections = this.assessment.sections || [];
155
+ const section = sections.find((s) => s.id === sectionId);
156
+ if (!section) {
157
+ return;
158
+ }
159
+ const ref = { questionId, sort };
160
+ section.questions = [...(section.questions || []), ref];
161
+ this.emitUpdate();
162
+ }
163
+ /**
164
+ * Remove a question from a section
165
+ */
166
+ removeQuestionFromSection(sectionId, questionId) {
167
+ const sections = this.assessment.sections || [];
168
+ const section = sections.find((s) => s.id === sectionId);
169
+ if (!section) {
170
+ return;
171
+ }
172
+ section.questions = section.questions.filter((ref) => ref.questionId !== questionId);
173
+ this.emitUpdate();
174
+ }
175
+ /**
176
+ * Emit assessment update event
177
+ */
178
+ emitUpdate() {
179
+ this.callbacks.onAssessmentUpdated?.(this.assessment);
180
+ this.eventBus.emit("assessment-updated", this.assessment);
181
+ }
182
+ }
183
+ //# sourceMappingURL=AssessmentAuthoringService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssessmentAuthoringService.js","sourceRoot":"","sources":["../../src/services/AssessmentAuthoringService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Context Variable Store
3
+ *
4
+ * Standalone service for managing QTI 3.0 context variables.
5
+ * Context variables are global assessment-level variables that can be
6
+ * shared across items.
7
+ *
8
+ * Can be used independently by any assessment player without requiring
9
+ * the full AssessmentPlayer.
10
+ *
11
+ * Part of PIE Assessment Toolkit.
12
+ */
13
+ import type { ContextDeclaration } from "@pie-players/pie-players-shared/types";
14
+ /**
15
+ * Standalone service for managing QTI 3.0 context variables.
16
+ *
17
+ * Context variables are global assessment-level variables that can be
18
+ * shared across items. Can be used independently by any assessment player.
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * // Initialize with declarations
23
+ * const store = new ContextVariableStore(declarations);
24
+ *
25
+ * // Get/set variables
26
+ * const seed = store.get('RANDOM_SEED');
27
+ * store.set('DIFFICULTY_LEVEL', 'hard');
28
+ *
29
+ * // Pass to items
30
+ * const context = store.toObject();
31
+ * await renderItem(item, session, context);
32
+ *
33
+ * // Persist in session
34
+ * session.contextVariables = store.toObject();
35
+ * ```
36
+ */
37
+ export declare class ContextVariableStore {
38
+ private variables;
39
+ private declarations;
40
+ /**
41
+ * Initialize store with context declarations from assessment
42
+ *
43
+ * @param declarations QTI 3.0 context declarations
44
+ */
45
+ constructor(declarations?: ContextDeclaration[]);
46
+ /**
47
+ * Initialize context variables from declarations
48
+ *
49
+ * Sets each variable to its defaultValue or type-appropriate default.
50
+ */
51
+ initialize(declarations: ContextDeclaration[]): void;
52
+ /**
53
+ * Get context variable value
54
+ *
55
+ * @param identifier Variable identifier
56
+ * @returns Variable value or undefined if not found
57
+ */
58
+ get(identifier: string): any;
59
+ /**
60
+ * Set context variable value
61
+ *
62
+ * @param identifier Variable identifier
63
+ * @param value New value
64
+ */
65
+ set(identifier: string, value: any): void;
66
+ /**
67
+ * Check if variable exists
68
+ */
69
+ has(identifier: string): boolean;
70
+ /**
71
+ * Get all variable names
72
+ */
73
+ getIdentifiers(): string[];
74
+ /**
75
+ * Get all variables as object (for passing to PIE elements)
76
+ *
77
+ * @returns Plain object with all context variables
78
+ */
79
+ toObject(): Record<string, any>;
80
+ /**
81
+ * Load state from serialized object (for session restore)
82
+ *
83
+ * @param state Object containing context variable values
84
+ */
85
+ fromObject(state: Record<string, any>): void;
86
+ /**
87
+ * Clear all variables (reset to defaults)
88
+ */
89
+ reset(): void;
90
+ /**
91
+ * Get declaration for variable
92
+ *
93
+ * @param identifier Variable identifier
94
+ * @returns Declaration or undefined if not found
95
+ */
96
+ getDeclaration(identifier: string): ContextDeclaration | undefined;
97
+ /**
98
+ * Get all declarations
99
+ */
100
+ getDeclarations(): ContextDeclaration[];
101
+ /**
102
+ * Get default value for QTI base type
103
+ *
104
+ * @private
105
+ */
106
+ private getDefaultValueForType;
107
+ /**
108
+ * Validate value matches declared type (basic validation)
109
+ *
110
+ * @private
111
+ */
112
+ private validateValue;
113
+ }
114
+ //# sourceMappingURL=ContextVariableStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContextVariableStore.d.ts","sourceRoot":"","sources":["../../src/services/ContextVariableStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAEhF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,oBAAoB;IAChC,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,YAAY,CAA8C;IAElE;;;;OAIG;gBACS,YAAY,CAAC,EAAE,kBAAkB,EAAE;IAM/C;;;;OAIG;IACH,UAAU,CAAC,YAAY,EAAE,kBAAkB,EAAE,GAAG,IAAI;IAoBpD;;;;;OAKG;IACH,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,GAAG;IAI5B;;;;;OAKG;IACH,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI;IAiBzC;;OAEG;IACH,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAIhC;;OAEG;IACH,cAAc,IAAI,MAAM,EAAE;IAI1B;;;;OAIG;IACH,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAI/B;;;;OAIG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAM5C;;OAEG;IACH,KAAK,IAAI,IAAI;IAWb;;;;;OAKG;IACH,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS;IAIlE;;OAEG;IACH,eAAe,IAAI,kBAAkB,EAAE;IAIvC;;;;OAIG;IACH,OAAO,CAAC,sBAAsB;IAoC9B;;;;OAIG;IACH,OAAO,CAAC,aAAa;CAiCrB"}