@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.
- package/README.md +520 -0
- package/dist/attempt/TestSession.d.ts +90 -0
- package/dist/attempt/TestSession.d.ts.map +1 -0
- package/dist/attempt/TestSession.js +174 -0
- package/dist/attempt/TestSession.js.map +1 -0
- package/dist/core/TypedEventBus.d.ts +48 -0
- package/dist/core/TypedEventBus.d.ts.map +1 -0
- package/dist/core/TypedEventBus.js +63 -0
- package/dist/core/TypedEventBus.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +44 -0
- package/dist/index.js.map +1 -0
- package/dist/item-loader.d.ts +45 -0
- package/dist/item-loader.d.ts.map +1 -0
- package/dist/item-loader.js +62 -0
- package/dist/item-loader.js.map +1 -0
- package/dist/player/AssessmentPlayer.d.ts +388 -0
- package/dist/player/AssessmentPlayer.d.ts.map +1 -0
- package/dist/player/AssessmentPlayer.js +965 -0
- package/dist/player/AssessmentPlayer.js.map +1 -0
- package/dist/player/index.d.ts +17 -0
- package/dist/player/index.d.ts.map +1 -0
- package/dist/player/index.js +15 -0
- package/dist/player/index.js.map +1 -0
- package/dist/player/navigation-types.d.ts +63 -0
- package/dist/player/navigation-types.d.ts.map +1 -0
- package/dist/player/navigation-types.js +7 -0
- package/dist/player/navigation-types.js.map +1 -0
- package/dist/player/qti-navigation.d.ts +29 -0
- package/dist/player/qti-navigation.d.ts.map +1 -0
- package/dist/player/qti-navigation.js +160 -0
- package/dist/player/qti-navigation.js.map +1 -0
- package/dist/reference-layout/index.d.ts +19 -0
- package/dist/reference-layout/index.d.ts.map +1 -0
- package/dist/reference-layout/index.js +20 -0
- package/dist/reference-layout/index.js.map +1 -0
- package/dist/services/AccessibilityCatalogResolver.d.ts +141 -0
- package/dist/services/AccessibilityCatalogResolver.d.ts.map +1 -0
- package/dist/services/AccessibilityCatalogResolver.js +249 -0
- package/dist/services/AccessibilityCatalogResolver.js.map +1 -0
- package/dist/services/AssessmentAuthoringService.d.ts +60 -0
- package/dist/services/AssessmentAuthoringService.d.ts.map +1 -0
- package/dist/services/AssessmentAuthoringService.js +183 -0
- package/dist/services/AssessmentAuthoringService.js.map +1 -0
- package/dist/services/ContextVariableStore.d.ts +114 -0
- package/dist/services/ContextVariableStore.d.ts.map +1 -0
- package/dist/services/ContextVariableStore.js +207 -0
- package/dist/services/ContextVariableStore.js.map +1 -0
- package/dist/services/ElementToolStateStore.d.ts +125 -0
- package/dist/services/ElementToolStateStore.d.ts.map +1 -0
- package/dist/services/ElementToolStateStore.js +200 -0
- package/dist/services/ElementToolStateStore.js.map +1 -0
- package/dist/services/HighlightCoordinator.d.ts +179 -0
- package/dist/services/HighlightCoordinator.d.ts.map +1 -0
- package/dist/services/HighlightCoordinator.js +446 -0
- package/dist/services/HighlightCoordinator.js.map +1 -0
- package/dist/services/I18nService.d.ts +121 -0
- package/dist/services/I18nService.d.ts.map +1 -0
- package/dist/services/I18nService.js +276 -0
- package/dist/services/I18nService.js.map +1 -0
- package/dist/services/PNPMapper.d.ts +71 -0
- package/dist/services/PNPMapper.d.ts.map +1 -0
- package/dist/services/PNPMapper.js +98 -0
- package/dist/services/PNPMapper.js.map +1 -0
- package/dist/services/PNPToolResolver.d.ts +127 -0
- package/dist/services/PNPToolResolver.d.ts.map +1 -0
- package/dist/services/PNPToolResolver.js +222 -0
- package/dist/services/PNPToolResolver.js.map +1 -0
- package/dist/services/SSMLExtractor.d.ts +61 -0
- package/dist/services/SSMLExtractor.d.ts.map +1 -0
- package/dist/services/SSMLExtractor.js +181 -0
- package/dist/services/SSMLExtractor.js.map +1 -0
- package/dist/services/TTSService.d.ts +162 -0
- package/dist/services/TTSService.d.ts.map +1 -0
- package/dist/services/TTSService.js +465 -0
- package/dist/services/TTSService.js.map +1 -0
- package/dist/services/ThemeProvider.d.ts +95 -0
- package/dist/services/ThemeProvider.d.ts.map +1 -0
- package/dist/services/ThemeProvider.js +299 -0
- package/dist/services/ThemeProvider.js.map +1 -0
- package/dist/services/ToolConfigResolver.d.ts +162 -0
- package/dist/services/ToolConfigResolver.d.ts.map +1 -0
- package/dist/services/ToolConfigResolver.js +230 -0
- package/dist/services/ToolConfigResolver.js.map +1 -0
- package/dist/services/ToolCoordinator.d.ts +137 -0
- package/dist/services/ToolCoordinator.d.ts.map +1 -0
- package/dist/services/ToolCoordinator.js +318 -0
- package/dist/services/ToolCoordinator.js.map +1 -0
- package/dist/services/ToolkitCoordinator.d.ts +188 -0
- package/dist/services/ToolkitCoordinator.d.ts.map +1 -0
- package/dist/services/ToolkitCoordinator.js +252 -0
- package/dist/services/ToolkitCoordinator.js.map +1 -0
- package/dist/services/interfaces.d.ts +391 -0
- package/dist/services/interfaces.d.ts.map +1 -0
- package/dist/services/interfaces.js +12 -0
- package/dist/services/interfaces.js.map +1 -0
- package/dist/services/tool-providers/DesmosToolProvider.d.ts +103 -0
- package/dist/services/tool-providers/DesmosToolProvider.d.ts.map +1 -0
- package/dist/services/tool-providers/DesmosToolProvider.js +127 -0
- package/dist/services/tool-providers/DesmosToolProvider.js.map +1 -0
- package/dist/services/tool-providers/IToolProvider.d.ts +137 -0
- package/dist/services/tool-providers/IToolProvider.d.ts.map +1 -0
- package/dist/services/tool-providers/IToolProvider.js +13 -0
- package/dist/services/tool-providers/IToolProvider.js.map +1 -0
- package/dist/services/tool-providers/TIToolProvider.d.ts +107 -0
- package/dist/services/tool-providers/TIToolProvider.d.ts.map +1 -0
- package/dist/services/tool-providers/TIToolProvider.js +123 -0
- package/dist/services/tool-providers/TIToolProvider.js.map +1 -0
- package/dist/services/tool-providers/TTSToolProvider.d.ts +143 -0
- package/dist/services/tool-providers/TTSToolProvider.d.ts.map +1 -0
- package/dist/services/tool-providers/TTSToolProvider.js +168 -0
- package/dist/services/tool-providers/TTSToolProvider.js.map +1 -0
- package/dist/services/tool-providers/ToolProviderRegistry.d.ts +165 -0
- package/dist/services/tool-providers/ToolProviderRegistry.d.ts.map +1 -0
- package/dist/services/tool-providers/ToolProviderRegistry.js +240 -0
- package/dist/services/tool-providers/ToolProviderRegistry.js.map +1 -0
- package/dist/services/tool-providers/index.d.ts +18 -0
- package/dist/services/tool-providers/index.d.ts.map +1 -0
- package/dist/services/tool-providers/index.js +15 -0
- package/dist/services/tool-providers/index.js.map +1 -0
- package/dist/services/tts/browser-provider.d.ts +24 -0
- package/dist/services/tts/browser-provider.d.ts.map +1 -0
- package/dist/services/tts/browser-provider.js +177 -0
- package/dist/services/tts/browser-provider.js.map +1 -0
- package/dist/services/tts/provider-interface.d.ts +131 -0
- package/dist/services/tts/provider-interface.d.ts.map +1 -0
- package/dist/services/tts/provider-interface.js +10 -0
- package/dist/services/tts/provider-interface.js.map +1 -0
- package/dist/tools/calculators/desmos-provider.d.ts +54 -0
- package/dist/tools/calculators/desmos-provider.d.ts.map +1 -0
- package/dist/tools/calculators/desmos-provider.js +384 -0
- package/dist/tools/calculators/desmos-provider.js.map +1 -0
- package/dist/tools/calculators/mathjs-provider.d.ts +50 -0
- package/dist/tools/calculators/mathjs-provider.d.ts.map +1 -0
- package/dist/tools/calculators/mathjs-provider.js +660 -0
- package/dist/tools/calculators/mathjs-provider.js.map +1 -0
- package/dist/tools/calculators/ti-provider.d.ts +122 -0
- package/dist/tools/calculators/ti-provider.d.ts.map +1 -0
- package/dist/tools/calculators/ti-provider.js +587 -0
- package/dist/tools/calculators/ti-provider.js.map +1 -0
- package/dist/tools/client.d.ts +17 -0
- package/dist/tools/client.d.ts.map +1 -0
- package/dist/tools/client.js +26 -0
- package/dist/tools/client.js.map +1 -0
- package/dist/tools/index.d.ts +8 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +10 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/library-loader.d.ts +63 -0
- package/dist/tools/library-loader.d.ts.map +1 -0
- package/dist/tools/library-loader.js +292 -0
- package/dist/tools/library-loader.js.map +1 -0
- package/dist/tools/response-discovery.d.ts +72 -0
- package/dist/tools/response-discovery.d.ts.map +1 -0
- package/dist/tools/response-discovery.js +183 -0
- package/dist/tools/response-discovery.js.map +1 -0
- package/dist/tools/tool-coordinator.d.ts +76 -0
- package/dist/tools/tool-coordinator.d.ts.map +1 -0
- package/dist/tools/tool-coordinator.js +197 -0
- package/dist/tools/tool-coordinator.js.map +1 -0
- package/dist/tools/types.d.ts +427 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +13 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/variant-resolver.d.ts +48 -0
- package/dist/tools/variant-resolver.d.ts.map +1 -0
- package/dist/tools/variant-resolver.js +214 -0
- package/dist/tools/variant-resolver.js.map +1 -0
- package/dist/types/events.d.ts +157 -0
- package/dist/types/events.d.ts.map +1 -0
- package/dist/types/events.js +11 -0
- package/dist/types/events.js.map +1 -0
- package/dist/utils/logger.d.ts +7 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +11 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +71 -0
- package/src/README.md +626 -0
- package/src/components/QuestionToolBar.svelte +406 -0
- package/src/player/AssessmentLayout.svelte +68 -0
- package/src/player/README.md +154 -0
- package/src/reference-layout/README.md +135 -0
- package/src/reference-layout/ReferenceLayout.svelte +209 -0
- package/src/reference-layout/components/AssessmentContent.svelte +259 -0
- package/src/reference-layout/components/AssessmentFooter.svelte +89 -0
- package/src/reference-layout/components/AssessmentHeader.svelte +250 -0
- package/src/reference-layout/components/AssessmentNavigation.svelte +134 -0
- package/src/reference-layout/components/AssessmentToolsBar.svelte +176 -0
- package/src/reference-layout/components/ItemPanel.svelte +200 -0
- package/src/reference-layout/components/NotesPanel.svelte +179 -0
- package/src/reference-layout/components/PassagePanel.svelte +76 -0
- package/src/tools/README.md +616 -0
- package/src/tools/calculators/README.md +395 -0
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
const TEST_SESSION_VERSION = 1;
|
|
2
|
+
const STORAGE_PREFIX = "pieoneer:testSession:v1:";
|
|
3
|
+
const ANON_DEVICE_ID_KEY = "pieoneer:anonymousDeviceId:v1";
|
|
4
|
+
export function createMemoryStorage(initial = {}) {
|
|
5
|
+
const store = new Map(Object.entries(initial));
|
|
6
|
+
return {
|
|
7
|
+
getItem: (k) => (store.has(k) ? store.get(k) : null),
|
|
8
|
+
setItem: (k, v) => {
|
|
9
|
+
store.set(k, v);
|
|
10
|
+
},
|
|
11
|
+
removeItem: (k) => {
|
|
12
|
+
store.delete(k);
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export function getBrowserLocalStorage() {
|
|
17
|
+
try {
|
|
18
|
+
// eslint-disable-next-line no-undef
|
|
19
|
+
if (typeof window === "undefined")
|
|
20
|
+
return null;
|
|
21
|
+
// eslint-disable-next-line no-undef
|
|
22
|
+
if (!window.localStorage)
|
|
23
|
+
return null;
|
|
24
|
+
// eslint-disable-next-line no-undef
|
|
25
|
+
return window.localStorage;
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function nowIso() {
|
|
32
|
+
return new Date().toISOString();
|
|
33
|
+
}
|
|
34
|
+
// Lightweight, deterministic hash for IDs (no crypto dependency).
|
|
35
|
+
function fnv1a32Hex(input) {
|
|
36
|
+
let hash = 0x811c9dc5; // offset basis
|
|
37
|
+
for (let i = 0; i < input.length; i++) {
|
|
38
|
+
hash ^= input.charCodeAt(i);
|
|
39
|
+
// hash *= 16777619 (with 32-bit overflow)
|
|
40
|
+
hash =
|
|
41
|
+
(hash +
|
|
42
|
+
((hash << 1) +
|
|
43
|
+
(hash << 4) +
|
|
44
|
+
(hash << 7) +
|
|
45
|
+
(hash << 8) +
|
|
46
|
+
(hash << 24))) >>>
|
|
47
|
+
0;
|
|
48
|
+
}
|
|
49
|
+
return hash.toString(16).padStart(8, "0");
|
|
50
|
+
}
|
|
51
|
+
function randomId() {
|
|
52
|
+
const cryptoAny = globalThis?.crypto;
|
|
53
|
+
const uuid = cryptoAny?.randomUUID?.();
|
|
54
|
+
if (typeof uuid === "string" && uuid.length > 0) {
|
|
55
|
+
return uuid;
|
|
56
|
+
}
|
|
57
|
+
return `anon_${Math.random().toString(16).slice(2)}_${Date.now().toString(16)}`;
|
|
58
|
+
}
|
|
59
|
+
export function getOrCreateAnonymousDeviceId(storage) {
|
|
60
|
+
const existing = storage.getItem(ANON_DEVICE_ID_KEY);
|
|
61
|
+
if (existing)
|
|
62
|
+
return existing;
|
|
63
|
+
const created = randomId();
|
|
64
|
+
storage.setItem(ANON_DEVICE_ID_KEY, created);
|
|
65
|
+
return created;
|
|
66
|
+
}
|
|
67
|
+
export function createTestSessionIdentifier(args) {
|
|
68
|
+
const { assessmentId, assignmentId, userId, storage } = args;
|
|
69
|
+
if (!assessmentId) {
|
|
70
|
+
throw new Error("assessmentId is required to create a TestSession identifier");
|
|
71
|
+
}
|
|
72
|
+
const subject = userId || getOrCreateAnonymousDeviceId(storage);
|
|
73
|
+
const source = `v1|${assessmentId}|${assignmentId || ""}|${subject}`;
|
|
74
|
+
const seed = fnv1a32Hex(source);
|
|
75
|
+
return { testSessionIdentifier: `ts_v1_${seed}`, seed };
|
|
76
|
+
}
|
|
77
|
+
export function getTestSessionStorageKey(testSessionIdentifier) {
|
|
78
|
+
return `${STORAGE_PREFIX}${testSessionIdentifier}`;
|
|
79
|
+
}
|
|
80
|
+
export function loadTestSession(storage, testSessionIdentifier) {
|
|
81
|
+
const raw = storage.getItem(getTestSessionStorageKey(testSessionIdentifier));
|
|
82
|
+
if (!raw)
|
|
83
|
+
return null;
|
|
84
|
+
try {
|
|
85
|
+
const parsed = JSON.parse(raw);
|
|
86
|
+
if (!parsed || parsed.version !== TEST_SESSION_VERSION)
|
|
87
|
+
return null;
|
|
88
|
+
if (parsed.testSessionIdentifier !== testSessionIdentifier)
|
|
89
|
+
return null;
|
|
90
|
+
return parsed;
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
export function saveTestSession(storage, session) {
|
|
97
|
+
const updated = {
|
|
98
|
+
...session,
|
|
99
|
+
updatedAt: nowIso(),
|
|
100
|
+
};
|
|
101
|
+
storage.setItem(getTestSessionStorageKey(session.testSessionIdentifier), JSON.stringify(updated));
|
|
102
|
+
}
|
|
103
|
+
export function createNewTestSession(args) {
|
|
104
|
+
const startedAt = nowIso();
|
|
105
|
+
return {
|
|
106
|
+
version: TEST_SESSION_VERSION,
|
|
107
|
+
testSessionIdentifier: args.testSessionIdentifier,
|
|
108
|
+
assessmentId: args.assessmentId,
|
|
109
|
+
startedAt,
|
|
110
|
+
updatedAt: startedAt,
|
|
111
|
+
navigationState: {
|
|
112
|
+
currentItemIndex: -1,
|
|
113
|
+
visitedItemIdentifiers: [],
|
|
114
|
+
},
|
|
115
|
+
realization: {
|
|
116
|
+
seed: args.seed,
|
|
117
|
+
itemIdentifiers: args.itemIdentifiers,
|
|
118
|
+
},
|
|
119
|
+
itemSessions: {},
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
export function upsertVisitedItem(session, itemIdentifier) {
|
|
123
|
+
if (!itemIdentifier)
|
|
124
|
+
return session;
|
|
125
|
+
const visited = new Set(session.navigationState.visitedItemIdentifiers || []);
|
|
126
|
+
visited.add(itemIdentifier);
|
|
127
|
+
return {
|
|
128
|
+
...session,
|
|
129
|
+
navigationState: {
|
|
130
|
+
...session.navigationState,
|
|
131
|
+
visitedItemIdentifiers: Array.from(visited),
|
|
132
|
+
},
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
export function setCurrentPosition(session, args) {
|
|
136
|
+
return {
|
|
137
|
+
...session,
|
|
138
|
+
navigationState: {
|
|
139
|
+
...session.navigationState,
|
|
140
|
+
currentItemIndex: args.currentItemIndex,
|
|
141
|
+
currentSectionIdentifier: args.currentSectionIdentifier,
|
|
142
|
+
},
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
export function upsertItemSessionFromPieSessionChange(session, args) {
|
|
146
|
+
const { itemIdentifier, pieSessionId, isCompleted } = args;
|
|
147
|
+
if (!itemIdentifier || !pieSessionId)
|
|
148
|
+
return session;
|
|
149
|
+
const now = nowIso();
|
|
150
|
+
const existing = session.itemSessions[itemIdentifier];
|
|
151
|
+
const attemptCount = existing && existing.pieSessionId && existing.pieSessionId !== pieSessionId
|
|
152
|
+
? existing.attemptCount + 1
|
|
153
|
+
: existing
|
|
154
|
+
? existing.attemptCount
|
|
155
|
+
: 1;
|
|
156
|
+
const completed = !!(isCompleted ?? existing?.isCompleted);
|
|
157
|
+
const next = {
|
|
158
|
+
itemIdentifier,
|
|
159
|
+
pieSessionId,
|
|
160
|
+
attemptCount,
|
|
161
|
+
isCompleted: completed,
|
|
162
|
+
startedAt: existing?.startedAt || now,
|
|
163
|
+
updatedAt: now,
|
|
164
|
+
completedAt: completed ? existing?.completedAt || now : undefined,
|
|
165
|
+
};
|
|
166
|
+
return {
|
|
167
|
+
...session,
|
|
168
|
+
itemSessions: {
|
|
169
|
+
...session.itemSessions,
|
|
170
|
+
[itemIdentifier]: next,
|
|
171
|
+
},
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=TestSession.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TestSession.js","sourceRoot":"","sources":["../../src/attempt/TestSession.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypedEventBus
|
|
3
|
+
*
|
|
4
|
+
* Type-safe event bus built on native EventTarget.
|
|
5
|
+
* Provides zero-dependency, standards-based event communication
|
|
6
|
+
* between assessment components (items, tools, navigation, etc.).
|
|
7
|
+
*
|
|
8
|
+
* Features:
|
|
9
|
+
* - Type safety via TypeScript discriminated unions
|
|
10
|
+
* - Standard DOM CustomEvent with bubbles and composed
|
|
11
|
+
* - Framework-agnostic (works across shadow DOM boundaries)
|
|
12
|
+
* - No third-party dependencies
|
|
13
|
+
*
|
|
14
|
+
* Part of PIE Assessment Toolkit.
|
|
15
|
+
*/
|
|
16
|
+
export declare class TypedEventBus<EventMap extends Record<string, any>> extends EventTarget {
|
|
17
|
+
/**
|
|
18
|
+
* Emit a typed event
|
|
19
|
+
*
|
|
20
|
+
* @param type Event type (must be key of EventMap)
|
|
21
|
+
* @param detail Event payload
|
|
22
|
+
* @returns true if event was dispatched successfully
|
|
23
|
+
*/
|
|
24
|
+
emit<K extends keyof EventMap>(type: K, detail: EventMap[K]): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Listen for typed events
|
|
27
|
+
*
|
|
28
|
+
* @param type Event type to listen for
|
|
29
|
+
* @param listener Callback function receiving typed event
|
|
30
|
+
* @param options Standard addEventListener options
|
|
31
|
+
*/
|
|
32
|
+
on<K extends keyof EventMap>(type: K, listener: (event: CustomEvent<EventMap[K]>) => void, options?: AddEventListenerOptions): void;
|
|
33
|
+
/**
|
|
34
|
+
* Remove event listener
|
|
35
|
+
*
|
|
36
|
+
* @param type Event type
|
|
37
|
+
* @param listener Callback to remove
|
|
38
|
+
*/
|
|
39
|
+
off<K extends keyof EventMap>(type: K, listener: (event: CustomEvent<EventMap[K]>) => void): void;
|
|
40
|
+
/**
|
|
41
|
+
* Listen for event once (automatically removes listener after first trigger)
|
|
42
|
+
*
|
|
43
|
+
* @param type Event type to listen for
|
|
44
|
+
* @param listener Callback function
|
|
45
|
+
*/
|
|
46
|
+
once<K extends keyof EventMap>(type: K, listener: (event: CustomEvent<EventMap[K]>) => void): void;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=TypedEventBus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TypedEventBus.d.ts","sourceRoot":"","sources":["../../src/core/TypedEventBus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,qBAAa,aAAa,CACzB,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CACnC,SAAQ,WAAW;IACpB;;;;;;OAMG;IACH,IAAI,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO;IAUrE;;;;;;OAMG;IACH,EAAE,CAAC,CAAC,SAAS,MAAM,QAAQ,EAC1B,IAAI,EAAE,CAAC,EACP,QAAQ,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EACnD,OAAO,CAAC,EAAE,uBAAuB,GAC/B,IAAI;IAIP;;;;;OAKG;IACH,GAAG,CAAC,CAAC,SAAS,MAAM,QAAQ,EAC3B,IAAI,EAAE,CAAC,EACP,QAAQ,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,GACjD,IAAI;IAIP;;;;;OAKG;IACH,IAAI,CAAC,CAAC,SAAS,MAAM,QAAQ,EAC5B,IAAI,EAAE,CAAC,EACP,QAAQ,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,GACjD,IAAI;CAKP"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypedEventBus
|
|
3
|
+
*
|
|
4
|
+
* Type-safe event bus built on native EventTarget.
|
|
5
|
+
* Provides zero-dependency, standards-based event communication
|
|
6
|
+
* between assessment components (items, tools, navigation, etc.).
|
|
7
|
+
*
|
|
8
|
+
* Features:
|
|
9
|
+
* - Type safety via TypeScript discriminated unions
|
|
10
|
+
* - Standard DOM CustomEvent with bubbles and composed
|
|
11
|
+
* - Framework-agnostic (works across shadow DOM boundaries)
|
|
12
|
+
* - No third-party dependencies
|
|
13
|
+
*
|
|
14
|
+
* Part of PIE Assessment Toolkit.
|
|
15
|
+
*/
|
|
16
|
+
export class TypedEventBus extends EventTarget {
|
|
17
|
+
/**
|
|
18
|
+
* Emit a typed event
|
|
19
|
+
*
|
|
20
|
+
* @param type Event type (must be key of EventMap)
|
|
21
|
+
* @param detail Event payload
|
|
22
|
+
* @returns true if event was dispatched successfully
|
|
23
|
+
*/
|
|
24
|
+
emit(type, detail) {
|
|
25
|
+
const event = new CustomEvent(String(type), {
|
|
26
|
+
detail,
|
|
27
|
+
bubbles: true,
|
|
28
|
+
composed: true,
|
|
29
|
+
});
|
|
30
|
+
return this.dispatchEvent(event);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Listen for typed events
|
|
34
|
+
*
|
|
35
|
+
* @param type Event type to listen for
|
|
36
|
+
* @param listener Callback function receiving typed event
|
|
37
|
+
* @param options Standard addEventListener options
|
|
38
|
+
*/
|
|
39
|
+
on(type, listener, options) {
|
|
40
|
+
this.addEventListener(String(type), listener, options);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Remove event listener
|
|
44
|
+
*
|
|
45
|
+
* @param type Event type
|
|
46
|
+
* @param listener Callback to remove
|
|
47
|
+
*/
|
|
48
|
+
off(type, listener) {
|
|
49
|
+
this.removeEventListener(String(type), listener);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Listen for event once (automatically removes listener after first trigger)
|
|
53
|
+
*
|
|
54
|
+
* @param type Event type to listen for
|
|
55
|
+
* @param listener Callback function
|
|
56
|
+
*/
|
|
57
|
+
once(type, listener) {
|
|
58
|
+
this.addEventListener(String(type), listener, {
|
|
59
|
+
once: true,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=TypedEventBus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TypedEventBus.js","sourceRoot":"","sources":["../../src/core/TypedEventBus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,OAAO,aAEX,SAAQ,WAAW;IACpB;;;;;;OAMG;IACH,IAAI,CAA2B,IAAO,EAAE,MAAmB;QAC1D,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;YAC3C,MAAM;YACN,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;SACd,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IAED;;;;;;OAMG;IACH,EAAE,CACD,IAAO,EACP,QAAmD,EACnD,OAAiC;QAEjC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,QAAyB,EAAE,OAAO,CAAC,CAAC;IACzE,CAAC;IAED;;;;;OAKG;IACH,GAAG,CACF,IAAO,EACP,QAAmD;QAEnD,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,QAAyB,CAAC,CAAC;IACnE,CAAC;IAED;;;;;OAKG;IACH,IAAI,CACH,IAAO,EACP,QAAmD;QAEnD,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,QAAyB,EAAE;YAC9D,IAAI,EAAE,IAAI;SACV,CAAC,CAAC;IACJ,CAAC;CACD"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PIE Assessment Toolkit
|
|
3
|
+
*
|
|
4
|
+
* Independent, composable services for coordinating tools, accommodations,
|
|
5
|
+
* and item players in assessment applications.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
export { TypedEventBus } from "./core/TypedEventBus";
|
|
10
|
+
export type { IAccessibilityCatalogResolver, IElementToolStateStore, IHighlightCoordinator, II18nService, IThemeProvider, IToolCoordinator, IToolkitCoordinator, ITTSService, ToolState, } from "./services/interfaces";
|
|
11
|
+
export type { CatalogLookupOptions, CatalogStatistics, CatalogType, ResolvedCatalog, } from "./services/AccessibilityCatalogResolver";
|
|
12
|
+
export { AccessibilityCatalogResolver } from "./services/AccessibilityCatalogResolver";
|
|
13
|
+
export { AssessmentAuthoringService } from "./services/AssessmentAuthoringService";
|
|
14
|
+
export { ContextVariableStore } from "./services/ContextVariableStore";
|
|
15
|
+
export { ElementToolStateStore } from "./services/ElementToolStateStore";
|
|
16
|
+
export type { Annotation } from "./services/HighlightCoordinator";
|
|
17
|
+
export { HighlightColor, HighlightCoordinator, HighlightType, } from "./services/HighlightCoordinator";
|
|
18
|
+
export type { I18nConfig, PluralTranslation, TranslationBundle, } from "./services/I18nService";
|
|
19
|
+
export { I18nService } from "./services/I18nService";
|
|
20
|
+
export { getAllPNPSupports, isPNPSupportRegistered, mapPNPSupportToToolId, mapToolIdToPNPSupport, PIE_TOOL_TO_PNP_MAP, PNP_TO_PIE_TOOL_MAP, registerCustomPNPMapping, } from "./services/PNPMapper";
|
|
21
|
+
export type { ResolvedToolConfig } from "./services/PNPToolResolver";
|
|
22
|
+
export { PNPToolResolver } from "./services/PNPToolResolver";
|
|
23
|
+
export type { ExtractionResult } from "./services/SSMLExtractor";
|
|
24
|
+
export { SSMLExtractor } from "./services/SSMLExtractor";
|
|
25
|
+
export type { FontSize, ThemeConfig } from "./services/ThemeProvider";
|
|
26
|
+
export { ThemeProvider } from "./services/ThemeProvider";
|
|
27
|
+
export { ToolCoordinator, ZIndexLayer } from "./services/ToolCoordinator";
|
|
28
|
+
export type { AnswerEliminatorToolConfig, ToolConfig, ToolkitCoordinatorConfig, ToolkitServiceBundle, TTSToolConfig, } from "./services/ToolkitCoordinator";
|
|
29
|
+
export { ToolkitCoordinator } from "./services/ToolkitCoordinator";
|
|
30
|
+
export type { TTSConfig } from "./services/TTSService";
|
|
31
|
+
export { PlaybackState, TTSService } from "./services/TTSService";
|
|
32
|
+
export { BrowserTTSProvider } from "./services/tts/browser-provider";
|
|
33
|
+
export type { ITTSProvider, ITTSProviderImplementation, TTSFeature, TTSProviderCapabilities, } from "./services/tts/provider-interface";
|
|
34
|
+
export type { CreateLoadItemOptions, LoadItem, LoadItemOptions, } from "./item-loader";
|
|
35
|
+
export { createFetchItemLoader, createLoadItem, ItemLoadError, } from "./item-loader";
|
|
36
|
+
export type { AssessmentCompletedEvent, AssessmentPausedEvent, AssessmentResumedEvent, AssessmentStartedEvent, AssessmentToolkitEvents, CanNavigateChangedEvent, InteractionEvent, InteractionType, ItemChangedEvent, ItemMetadata, LoadCompleteEvent, LocaleChangedEvent, LocaleLoadingCompleteEvent, LocaleLoadingErrorEvent, LocaleLoadingStartEvent, NavigationRequestEvent, PlayerErrorEvent, SessionChangedEvent, StateRestoredEvent, StateSavedEvent, SyncFailedEvent, ToolActivatedEvent, ToolDeactivatedEvent, ToolStateChangedEvent, } from "./types/events";
|
|
37
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAMrD,YAAY,EACX,6BAA6B,EAC7B,sBAAsB,EACtB,qBAAqB,EACrB,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,WAAW,EACX,SAAS,GACT,MAAM,uBAAuB,CAAC;AAO/B,YAAY,EACX,oBAAoB,EACpB,iBAAiB,EACjB,WAAW,EACX,eAAe,GACf,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,4BAA4B,EAAE,MAAM,yCAAyC,CAAC;AACvF,OAAO,EAAE,0BAA0B,EAAE,MAAM,uCAAuC,CAAC;AAEnF,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAEvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAEzE,YAAY,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EACN,cAAc,EACd,oBAAoB,EACpB,aAAa,GACb,MAAM,iCAAiC,CAAC;AAEzC,YAAY,EACX,UAAU,EACV,iBAAiB,EACjB,iBAAiB,GACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,OAAO,EACN,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,EACnB,wBAAwB,GACxB,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,YAAY,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE1E,YAAY,EACX,0BAA0B,EAC1B,UAAU,EACV,wBAAwB,EACxB,oBAAoB,EACpB,aAAa,GACb,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAEnE,YAAY,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAErE,YAAY,EACX,YAAY,EACZ,0BAA0B,EAC1B,UAAU,EACV,uBAAuB,GACvB,MAAM,mCAAmC,CAAC;AAY3C,YAAY,EACX,qBAAqB,EACrB,QAAQ,EACR,eAAe,GACf,MAAM,eAAe,CAAC;AACvB,OAAO,EACN,qBAAqB,EACrB,cAAc,EACd,aAAa,GACb,MAAM,eAAe,CAAC;AAMvB,YAAY,EACX,wBAAwB,EACxB,qBAAqB,EACrB,sBAAsB,EACtB,sBAAsB,EAEtB,uBAAuB,EACvB,uBAAuB,EACvB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAClB,0BAA0B,EAC1B,uBAAuB,EACvB,uBAAuB,EACvB,sBAAsB,EACtB,gBAAgB,EAEhB,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,GACrB,MAAM,gBAAgB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PIE Assessment Toolkit
|
|
3
|
+
*
|
|
4
|
+
* Independent, composable services for coordinating tools, accommodations,
|
|
5
|
+
* and item players in assessment applications.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// Core Infrastructure
|
|
11
|
+
// ============================================================================
|
|
12
|
+
export { TypedEventBus } from "./core/TypedEventBus";
|
|
13
|
+
export { AccessibilityCatalogResolver } from "./services/AccessibilityCatalogResolver";
|
|
14
|
+
export { AssessmentAuthoringService } from "./services/AssessmentAuthoringService";
|
|
15
|
+
// Context Variable Store (QTI 3.0 Context Declarations)
|
|
16
|
+
export { ContextVariableStore } from "./services/ContextVariableStore";
|
|
17
|
+
// Element Tool State Store (Element-level ephemeral tool state)
|
|
18
|
+
export { ElementToolStateStore } from "./services/ElementToolStateStore";
|
|
19
|
+
export { HighlightColor, HighlightCoordinator, HighlightType, } from "./services/HighlightCoordinator";
|
|
20
|
+
export { I18nService } from "./services/I18nService";
|
|
21
|
+
// PNP Mapper
|
|
22
|
+
export { getAllPNPSupports, isPNPSupportRegistered, mapPNPSupportToToolId, mapToolIdToPNPSupport, PIE_TOOL_TO_PNP_MAP, PNP_TO_PIE_TOOL_MAP, registerCustomPNPMapping, } from "./services/PNPMapper";
|
|
23
|
+
export { PNPToolResolver } from "./services/PNPToolResolver";
|
|
24
|
+
export { SSMLExtractor } from "./services/SSMLExtractor";
|
|
25
|
+
export { ThemeProvider } from "./services/ThemeProvider";
|
|
26
|
+
// Tool Coordinator
|
|
27
|
+
export { ToolCoordinator, ZIndexLayer } from "./services/ToolCoordinator";
|
|
28
|
+
export { ToolkitCoordinator } from "./services/ToolkitCoordinator";
|
|
29
|
+
export { PlaybackState, TTSService } from "./services/TTSService";
|
|
30
|
+
export { BrowserTTSProvider } from "./services/tts/browser-provider";
|
|
31
|
+
export { createFetchItemLoader, createLoadItem, ItemLoadError, } from "./item-loader";
|
|
32
|
+
// ============================================================================
|
|
33
|
+
// Players (Optional Reference Implementations)
|
|
34
|
+
// ============================================================================
|
|
35
|
+
// Assessment Player - Full assessment with navigation
|
|
36
|
+
// Note: Assessment player is optional and not exported by default.
|
|
37
|
+
// Products can import from './player/AssessmentPlayer' if desired.
|
|
38
|
+
// Section Player - Use @pie-players/pie-section-player web component instead
|
|
39
|
+
// ============================================================================
|
|
40
|
+
// Shared Components
|
|
41
|
+
// ============================================================================
|
|
42
|
+
// QuestionToolBar is exported via package.json exports field
|
|
43
|
+
// Import using: import QuestionToolBar from '@pie-players/pie-assessment-toolkit/components/QuestionToolBar.svelte';
|
|
44
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,+EAA+E;AAC/E,sBAAsB;AACtB,+EAA+E;AAE/E,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AA6BrD,OAAO,EAAE,4BAA4B,EAAE,MAAM,yCAAyC,CAAC;AACvF,OAAO,EAAE,0BAA0B,EAAE,MAAM,uCAAuC,CAAC;AACnF,wDAAwD;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,gEAAgE;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAGzE,OAAO,EACN,cAAc,EACd,oBAAoB,EACpB,aAAa,GACb,MAAM,iCAAiC,CAAC;AAOzC,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,aAAa;AACb,OAAO,EACN,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,EACnB,wBAAwB,GACxB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAG7D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAGzD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,mBAAmB;AACnB,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAS1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAGnE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAwBrE,OAAO,EACN,qBAAqB,EACrB,cAAc,EACd,aAAa,GACb,MAAM,eAAe,CAAC;AAmCvB,+EAA+E;AAC/E,+CAA+C;AAC/C,+EAA+E;AAE/E,sDAAsD;AACtD,mEAAmE;AACnE,mEAAmE;AAEnE,6EAA6E;AAE7E,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E,6DAA6D;AAC7D,qHAAqH"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { ItemEntity } from "@pie-players/pie-players-shared";
|
|
2
|
+
export type LoadItemOptions = {
|
|
3
|
+
organizationId?: string | null;
|
|
4
|
+
};
|
|
5
|
+
export type LoadItem = (itemVId: string, opts?: LoadItemOptions) => Promise<ItemEntity>;
|
|
6
|
+
export declare class ItemLoadError extends Error {
|
|
7
|
+
readonly code: "ITEM_NOT_FOUND" | "NO_ITEM_BANK_OR_FETCH_CONFIG" | "FETCH_NOT_AVAILABLE" | "FETCH_FAILED";
|
|
8
|
+
constructor(code: ItemLoadError["code"], message: string);
|
|
9
|
+
}
|
|
10
|
+
export type CreateLoadItemOptions = {
|
|
11
|
+
/**
|
|
12
|
+
* Optional in-memory item bank. Keys are itemVId.
|
|
13
|
+
* This enables a no-backend default for demos/tests.
|
|
14
|
+
*/
|
|
15
|
+
itemBank?: Record<string, ItemEntity>;
|
|
16
|
+
/**
|
|
17
|
+
* Optional base URL for an item API. If set, `createLoadItem` will fetch when
|
|
18
|
+
* an item is not present in `itemBank`.
|
|
19
|
+
*
|
|
20
|
+
* Example: `https://host.example.com`
|
|
21
|
+
*/
|
|
22
|
+
fetchBaseUrl?: string;
|
|
23
|
+
/**
|
|
24
|
+
* Optional endpoint builder.
|
|
25
|
+
* Defaults to `/api/item/:itemVId` (and appends `?organizationId=...` if provided).
|
|
26
|
+
*/
|
|
27
|
+
itemEndpoint?: string | ((itemVId: string, opts?: LoadItemOptions) => string);
|
|
28
|
+
/**
|
|
29
|
+
* Custom fetch implementation (useful for tests or hosts).
|
|
30
|
+
* Defaults to `globalThis.fetch`.
|
|
31
|
+
*/
|
|
32
|
+
fetchImpl?: typeof fetch;
|
|
33
|
+
};
|
|
34
|
+
export declare function createFetchItemLoader(opts: {
|
|
35
|
+
baseUrl: string;
|
|
36
|
+
itemEndpoint?: CreateLoadItemOptions["itemEndpoint"];
|
|
37
|
+
fetchImpl?: typeof fetch;
|
|
38
|
+
}): LoadItem;
|
|
39
|
+
/**
|
|
40
|
+
* Client-resolvable default loader:
|
|
41
|
+
* - resolve from `itemBank` first (no backend required)
|
|
42
|
+
* - optionally fallback to fetch (encouraged backend hook)
|
|
43
|
+
*/
|
|
44
|
+
export declare function createLoadItem(opts: CreateLoadItemOptions): LoadItem;
|
|
45
|
+
//# sourceMappingURL=item-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"item-loader.d.ts","sourceRoot":"","sources":["../src/item-loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAElE,MAAM,MAAM,eAAe,GAAG;IAC7B,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,CACtB,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,eAAe,KAClB,OAAO,CAAC,UAAU,CAAC,CAAC;AAEzB,qBAAa,aAAc,SAAQ,KAAK;IACvC,QAAQ,CAAC,IAAI,EACV,gBAAgB,GAChB,8BAA8B,GAC9B,qBAAqB,GACrB,cAAc,CAAC;gBAEN,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM;CAKxD;AAED,MAAM,MAAM,qBAAqB,GAAG;IACnC;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAEtC;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,eAAe,KAAK,MAAM,CAAC,CAAC;IAE9E;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CACzB,CAAC;AASF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,qBAAqB,CAAC,cAAc,CAAC,CAAC;IACrD,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CACzB,GAAG,QAAQ,CA6BX;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,qBAAqB,GAAG,QAAQ,CAgCpE"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
export class ItemLoadError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
constructor(code, message) {
|
|
4
|
+
super(message);
|
|
5
|
+
this.name = "ItemLoadError";
|
|
6
|
+
this.code = code;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
function defaultItemEndpoint(itemVId, opts) {
|
|
10
|
+
const url = new URL(`/api/item/${itemVId}`, "https://placeholder.invalid");
|
|
11
|
+
if (opts?.organizationId)
|
|
12
|
+
url.searchParams.set("organizationId", opts.organizationId);
|
|
13
|
+
return url.pathname + url.search;
|
|
14
|
+
}
|
|
15
|
+
export function createFetchItemLoader(opts) {
|
|
16
|
+
const fetchImpl = opts.fetchImpl ?? globalThis.fetch;
|
|
17
|
+
if (!fetchImpl) {
|
|
18
|
+
throw new ItemLoadError("FETCH_NOT_AVAILABLE", "globalThis.fetch is not available in this environment");
|
|
19
|
+
}
|
|
20
|
+
return async (itemVId, loadOpts) => {
|
|
21
|
+
const endpointBuilder = typeof opts.itemEndpoint === "function"
|
|
22
|
+
? opts.itemEndpoint
|
|
23
|
+
: typeof opts.itemEndpoint === "string"
|
|
24
|
+
? () => opts.itemEndpoint
|
|
25
|
+
: defaultItemEndpoint;
|
|
26
|
+
const endpoint = endpointBuilder(itemVId, loadOpts);
|
|
27
|
+
const url = new URL(endpoint, opts.baseUrl);
|
|
28
|
+
const res = await fetchImpl(url.toString());
|
|
29
|
+
if (!res.ok) {
|
|
30
|
+
throw new ItemLoadError("FETCH_FAILED", `Failed to load item ${itemVId}: ${res.status} ${res.statusText}`);
|
|
31
|
+
}
|
|
32
|
+
return (await res.json());
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Client-resolvable default loader:
|
|
37
|
+
* - resolve from `itemBank` first (no backend required)
|
|
38
|
+
* - optionally fallback to fetch (encouraged backend hook)
|
|
39
|
+
*/
|
|
40
|
+
export function createLoadItem(opts) {
|
|
41
|
+
const itemBank = opts.itemBank;
|
|
42
|
+
const fetchBaseUrl = opts.fetchBaseUrl;
|
|
43
|
+
const fetchImpl = opts.fetchImpl ?? globalThis.fetch;
|
|
44
|
+
const fetchLoader = fetchBaseUrl && typeof fetchImpl === "function"
|
|
45
|
+
? createFetchItemLoader({
|
|
46
|
+
baseUrl: fetchBaseUrl,
|
|
47
|
+
itemEndpoint: opts.itemEndpoint,
|
|
48
|
+
fetchImpl,
|
|
49
|
+
})
|
|
50
|
+
: null;
|
|
51
|
+
return async (itemVId, loadOpts) => {
|
|
52
|
+
if (itemBank?.[itemVId])
|
|
53
|
+
return itemBank[itemVId];
|
|
54
|
+
if (fetchLoader)
|
|
55
|
+
return await fetchLoader(itemVId, loadOpts);
|
|
56
|
+
if (fetchBaseUrl && typeof fetchImpl !== "function") {
|
|
57
|
+
throw new ItemLoadError("FETCH_NOT_AVAILABLE", "fetchBaseUrl was provided but globalThis.fetch is not available");
|
|
58
|
+
}
|
|
59
|
+
throw new ItemLoadError("NO_ITEM_BANK_OR_FETCH_CONFIG", "No itemBank entry and no fetchBaseUrl configured for item loading");
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=item-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"item-loader.js","sourceRoot":"","sources":["../src/item-loader.ts"],"names":[],"mappings":"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"}
|