@pie-players/pie-players-shared 0.3.29 → 0.3.31
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/{src → dist}/components/PieItemPlayer.svelte +156 -88
- package/dist/i18n/translations/en/tools.json +1 -1
- package/{src → dist}/i18n/use-i18n-standalone.svelte.ts +1 -0
- package/{src → dist}/i18n/use-i18n.svelte.ts +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/loader-config.d.ts +25 -0
- package/dist/loader-config.d.ts.map +1 -1
- package/dist/loader-config.js +5 -0
- package/dist/loader-config.js.map +1 -1
- package/dist/loaders/ElementLoader.d.ts +6 -34
- package/dist/loaders/ElementLoader.d.ts.map +1 -1
- package/dist/loaders/ElementLoader.js +21 -9
- package/dist/loaders/ElementLoader.js.map +1 -1
- package/dist/loaders/element-loader-types.d.ts +91 -0
- package/dist/loaders/element-loader-types.d.ts.map +1 -0
- package/dist/loaders/element-loader-types.js +26 -0
- package/dist/loaders/element-loader-types.js.map +1 -0
- package/dist/loaders/element-loader.d.ts +92 -0
- package/dist/loaders/element-loader.d.ts.map +1 -0
- package/dist/loaders/element-loader.js +391 -0
- package/dist/loaders/element-loader.js.map +1 -0
- package/dist/loaders/esm-adapter.d.ts +40 -0
- package/dist/loaders/esm-adapter.d.ts.map +1 -0
- package/dist/loaders/esm-adapter.js +274 -0
- package/dist/loaders/esm-adapter.js.map +1 -0
- package/dist/loaders/iife-adapter.d.ts +86 -0
- package/dist/loaders/iife-adapter.d.ts.map +1 -0
- package/dist/loaders/iife-adapter.js +365 -0
- package/dist/loaders/iife-adapter.js.map +1 -0
- package/dist/loaders/index.d.ts +30 -17
- package/dist/loaders/index.d.ts.map +1 -1
- package/dist/loaders/index.js +26 -14
- package/dist/loaders/index.js.map +1 -1
- package/dist/pie/config.d.ts.map +1 -1
- package/dist/pie/config.js +12 -5
- package/dist/pie/config.js.map +1 -1
- package/dist/pie/index.d.ts +6 -4
- package/dist/pie/index.d.ts.map +1 -1
- package/dist/pie/index.js +8 -2
- package/dist/pie/index.js.map +1 -1
- package/dist/pie/initialization.d.ts +26 -1
- package/dist/pie/initialization.d.ts.map +1 -1
- package/dist/pie/initialization.js +72 -15
- package/dist/pie/initialization.js.map +1 -1
- package/dist/pie/instrumentation-event-map.d.ts.map +1 -1
- package/dist/pie/instrumentation-event-map.js +27 -16
- package/dist/pie/instrumentation-event-map.js.map +1 -1
- package/dist/pie/overrides.d.ts +9 -0
- package/dist/pie/overrides.d.ts.map +1 -1
- package/dist/pie/overrides.js +36 -0
- package/dist/pie/overrides.js.map +1 -1
- package/dist/pie/resource-monitor.d.ts +17 -0
- package/dist/pie/resource-monitor.d.ts.map +1 -1
- package/dist/pie/resource-monitor.js +284 -81
- package/dist/pie/resource-monitor.js.map +1 -1
- package/dist/pie/stage-tracker.d.ts +51 -0
- package/dist/pie/stage-tracker.d.ts.map +1 -0
- package/dist/pie/stage-tracker.js +106 -0
- package/dist/pie/stage-tracker.js.map +1 -0
- package/dist/pie/stages.d.ts +75 -0
- package/dist/pie/stages.d.ts.map +1 -0
- package/dist/pie/stages.js +58 -0
- package/dist/pie/stages.js.map +1 -0
- package/dist/pie/updates.d.ts.map +1 -1
- package/dist/pie/updates.js +65 -2
- package/dist/pie/updates.js.map +1 -1
- package/dist/pie/use-resource-monitor.svelte.d.ts.map +1 -1
- package/dist/pie/use-resource-monitor.svelte.js +88 -75
- package/dist/pie/use-resource-monitor.svelte.js.map +1 -1
- package/dist/security/index.d.ts +5 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +5 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/sanitize-item-markup.d.ts +46 -0
- package/dist/security/sanitize-item-markup.d.ts.map +1 -0
- package/dist/security/sanitize-item-markup.js +174 -0
- package/dist/security/sanitize-item-markup.js.map +1 -0
- package/dist/security/sanitize-svg-icon.d.ts +15 -0
- package/dist/security/sanitize-svg-icon.d.ts.map +1 -0
- package/dist/security/sanitize-svg-icon.js +89 -0
- package/dist/security/sanitize-svg-icon.js.map +1 -0
- package/dist/security/validate-style-url.d.ts +28 -0
- package/dist/security/validate-style-url.d.ts.map +1 -0
- package/dist/security/validate-style-url.js +58 -0
- package/dist/security/validate-style-url.js.map +1 -0
- package/dist/security/wrap-overwide-images.d.ts +31 -0
- package/dist/security/wrap-overwide-images.d.ts.map +1 -0
- package/dist/security/wrap-overwide-images.js +92 -0
- package/dist/security/wrap-overwide-images.js.map +1 -0
- package/dist/server/npm-registry.d.ts +8 -0
- package/dist/server/npm-registry.d.ts.map +1 -0
- package/dist/server/npm-registry.js +60 -0
- package/dist/server/npm-registry.js.map +1 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/ui/first-focusable.d.ts +21 -0
- package/dist/ui/first-focusable.d.ts.map +1 -0
- package/dist/ui/first-focusable.js +73 -0
- package/dist/ui/first-focusable.js.map +1 -0
- package/dist/ui/focus-trap.d.ts.map +1 -1
- package/dist/ui/focus-trap.js +2 -13
- package/dist/ui/focus-trap.js.map +1 -1
- package/dist/ui/use-promise.svelte.ts +109 -0
- package/package.json +49 -34
- package/dist/i18n/scripts/check-coverage.d.ts +0 -16
- package/dist/i18n/scripts/check-coverage.d.ts.map +0 -1
- package/dist/i18n/scripts/check-coverage.js +0 -262
- package/dist/i18n/scripts/check-coverage.js.map +0 -1
- package/dist/i18n/scripts/scan-hardcoded.d.ts +0 -16
- package/dist/i18n/scripts/scan-hardcoded.d.ts.map +0 -1
- package/dist/i18n/scripts/scan-hardcoded.js +0 -266
- package/dist/i18n/scripts/scan-hardcoded.js.map +0 -1
- package/dist/i18n/use-i18n-standalone.svelte.d.ts +0 -87
- package/dist/i18n/use-i18n-standalone.svelte.d.ts.map +0 -1
- package/dist/i18n/use-i18n-standalone.svelte.js +0 -151
- package/dist/i18n/use-i18n-standalone.svelte.js.map +0 -1
- package/dist/i18n/use-i18n.svelte.d.ts +0 -67
- package/dist/i18n/use-i18n.svelte.d.ts.map +0 -1
- package/dist/i18n/use-i18n.svelte.js +0 -144
- package/dist/i18n/use-i18n.svelte.js.map +0 -1
- package/dist/instrumentation/providers/DataDogInstrumentationProvider.d.ts +0 -170
- package/dist/instrumentation/providers/DataDogInstrumentationProvider.d.ts.map +0 -1
- package/dist/instrumentation/providers/DataDogInstrumentationProvider.js +0 -183
- package/dist/instrumentation/providers/DataDogInstrumentationProvider.js.map +0 -1
- package/dist/loaders/EsmElementLoader.d.ts +0 -69
- package/dist/loaders/EsmElementLoader.d.ts.map +0 -1
- package/dist/loaders/EsmElementLoader.js +0 -72
- package/dist/loaders/EsmElementLoader.js.map +0 -1
- package/dist/loaders/IifeElementLoader.d.ts +0 -61
- package/dist/loaders/IifeElementLoader.d.ts.map +0 -1
- package/dist/loaders/IifeElementLoader.js +0 -63
- package/dist/loaders/IifeElementLoader.js.map +0 -1
- package/dist/pie/esm-loader.d.ts +0 -104
- package/dist/pie/esm-loader.d.ts.map +0 -1
- package/dist/pie/esm-loader.js +0 -358
- package/dist/pie/esm-loader.js.map +0 -1
- package/dist/pie/iife-loader.d.ts +0 -81
- package/dist/pie/iife-loader.d.ts.map +0 -1
- package/dist/pie/iife-loader.js +0 -425
- package/dist/pie/iife-loader.js.map +0 -1
- package/dist/theming/css-variables.d.ts +0 -7
- package/dist/theming/css-variables.d.ts.map +0 -1
- package/dist/theming/css-variables.js +0 -43
- package/dist/theming/css-variables.js.map +0 -1
- package/dist/theming/index.d.ts +0 -4
- package/dist/theming/index.d.ts.map +0 -1
- package/dist/theming/index.js +0 -3
- package/dist/theming/index.js.map +0 -1
- package/dist/theming/presets.d.ts +0 -7
- package/dist/theming/presets.d.ts.map +0 -1
- package/dist/theming/presets.js +0 -146
- package/dist/theming/presets.js.map +0 -1
- package/dist/theming/types.d.ts +0 -5
- package/dist/theming/types.d.ts.map +0 -1
- package/dist/theming/types.js +0 -2
- package/dist/theming/types.js.map +0 -1
- package/dist/types/custom-elements.d.ts +0 -158
- package/dist/types/custom-elements.d.ts.map +0 -1
- package/dist/types/custom-elements.js +0 -8
- package/dist/types/custom-elements.js.map +0 -1
- package/dist/types/search.d.ts +0 -105
- package/dist/types/search.d.ts.map +0 -1
- package/dist/types/search.js +0 -12
- package/dist/types/search.js.map +0 -1
- package/dist/types/transform.d.ts +0 -48
- package/dist/types/transform.d.ts.map +0 -1
- package/dist/types/transform.js +0 -21
- package/dist/types/transform.js.map +0 -1
- package/src/i18n/README.md +0 -223
- package/src/i18n/index.ts +0 -26
- package/src/i18n/loader.ts +0 -156
- package/src/i18n/scripts/check-coverage.ts +0 -345
- package/src/i18n/scripts/scan-hardcoded.ts +0 -342
- package/src/i18n/simple-i18n.ts +0 -236
- package/src/i18n/translations/ar/common.json +0 -36
- package/src/i18n/translations/ar/toolkit.json +0 -48
- package/src/i18n/translations/ar/tools.json +0 -103
- package/src/i18n/translations/en/common.json +0 -36
- package/src/i18n/translations/en/toolkit.json +0 -48
- package/src/i18n/translations/en/tools.json +0 -103
- package/src/i18n/translations/es/common.json +0 -36
- package/src/i18n/translations/es/toolkit.json +0 -48
- package/src/i18n/translations/es/tools.json +0 -103
- package/src/i18n/translations/zh/common.json +0 -36
- package/src/i18n/translations/zh/toolkit.json +0 -48
- package/src/i18n/translations/zh/tools.json +0 -103
- package/src/i18n/types.ts +0 -66
- /package/{src → dist}/components/PiePreviewLayout.svelte +0 -0
- /package/{src → dist}/components/PiePreviewToggle.svelte +0 -0
- /package/{src → dist}/components/PieSpinner.svelte +0 -0
- /package/{src → dist}/components/ToolSettingsButton.svelte +0 -0
- /package/{src → dist}/components/ToolSettingsPanel.svelte +0 -0
- /package/{src → dist}/components/index.ts +0 -0
|
@@ -8,8 +8,14 @@
|
|
|
8
8
|
-->
|
|
9
9
|
<script lang="ts">
|
|
10
10
|
import { onDestroy, tick, untrack } from "svelte";
|
|
11
|
+
import { isInstrumentationProvider } from "../instrumentation/provider-guards.js";
|
|
11
12
|
import type { LoaderConfig } from "../loader-config.js";
|
|
12
13
|
import { DEFAULT_LOADER_CONFIG } from "../loader-config.js";
|
|
14
|
+
import {
|
|
15
|
+
buildAuthoringAllowList,
|
|
16
|
+
createDefaultItemMarkupSanitizer,
|
|
17
|
+
type ItemMarkupSanitizer,
|
|
18
|
+
} from "../security/index.js";
|
|
13
19
|
import {
|
|
14
20
|
AssetEventManager,
|
|
15
21
|
createDefaultImageDeleteHandler,
|
|
@@ -24,6 +30,7 @@
|
|
|
24
30
|
} from "../pie/correct-response-env.js";
|
|
25
31
|
import { initializePiesFromLoadedBundle } from "../pie/initialization.js";
|
|
26
32
|
import { createPieLogger, isGlobalDebugEnabled } from "../pie/logger.js";
|
|
33
|
+
import { resolveInstrumentationProvider } from "../pie/instrumentation-provider-resolution.js";
|
|
27
34
|
import { findPieController } from "../pie/scoring.js";
|
|
28
35
|
import type { AuthoringEnv } from "../pie/types.js";
|
|
29
36
|
import { BundleType } from "../pie/types.js";
|
|
@@ -37,16 +44,6 @@
|
|
|
37
44
|
SoundHandler,
|
|
38
45
|
} from "../types/index.js";
|
|
39
46
|
|
|
40
|
-
type RetrySuccessDetail = {
|
|
41
|
-
url?: string;
|
|
42
|
-
resourceType?: string;
|
|
43
|
-
duration?: number;
|
|
44
|
-
size?: number;
|
|
45
|
-
retryCount?: number;
|
|
46
|
-
maxRetries?: number;
|
|
47
|
-
error?: string;
|
|
48
|
-
};
|
|
49
|
-
|
|
50
47
|
// Create logger (respects global debug flag - pass function for dynamic checking)
|
|
51
48
|
const logger = createPieLogger("pie-item-player", () =>
|
|
52
49
|
isGlobalDebugEnabled()
|
|
@@ -68,6 +65,9 @@
|
|
|
68
65
|
mode = "view" as "view" | "author",
|
|
69
66
|
configuration = {} as Record<string, any>,
|
|
70
67
|
authoringBackend = "demo" as "demo" | "required",
|
|
68
|
+
// Security: sanitize markup before {@html} injection unless the host opts out.
|
|
69
|
+
trustMarkup = false,
|
|
70
|
+
sanitizeMarkup,
|
|
71
71
|
// Asset handler callbacks
|
|
72
72
|
onInsertImage,
|
|
73
73
|
onDeleteImage,
|
|
@@ -93,6 +93,9 @@
|
|
|
93
93
|
mode?: "view" | "author";
|
|
94
94
|
configuration?: Record<string, any>;
|
|
95
95
|
authoringBackend?: "demo" | "required";
|
|
96
|
+
// Markup-trust controls
|
|
97
|
+
trustMarkup?: boolean;
|
|
98
|
+
sanitizeMarkup?: ItemMarkupSanitizer;
|
|
96
99
|
// Asset handlers
|
|
97
100
|
onInsertImage?: (handler: ImageHandler) => void;
|
|
98
101
|
onDeleteImage?: (src: string, done: (err?: Error) => void) => void;
|
|
@@ -112,6 +115,7 @@
|
|
|
112
115
|
let assetEventManager: AssetEventManager | null = $state(null);
|
|
113
116
|
let authoringBlockedError: string | null = $state(null);
|
|
114
117
|
let lastReportedAuthoringError: string | null = $state(null);
|
|
118
|
+
let runtimePlayerError: string | null = $state(null);
|
|
115
119
|
|
|
116
120
|
// Transform markup for authoring mode (append -config suffix)
|
|
117
121
|
function transformMarkupForAuthoring(
|
|
@@ -130,29 +134,103 @@
|
|
|
130
134
|
return result;
|
|
131
135
|
}
|
|
132
136
|
|
|
137
|
+
// Custom-element allow-list derived from the item/passage `elements` maps.
|
|
138
|
+
// Includes both the raw tag names and their authoring-mode `-config`
|
|
139
|
+
// rewrites so `transformMarkupForAuthoring` output still passes the
|
|
140
|
+
// sanitizer.
|
|
141
|
+
const itemAllowList = $derived.by<string[]>(() => {
|
|
142
|
+
const elements = itemConfig?.elements ?? {};
|
|
143
|
+
return buildAuthoringAllowList(Object.keys(elements));
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
const passageAllowList = $derived.by<string[]>(() => {
|
|
147
|
+
const elements = passageConfig?.elements ?? {};
|
|
148
|
+
return buildAuthoringAllowList(Object.keys(elements));
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
function applySanitizer(markup: string, allowList: string[]): string {
|
|
152
|
+
if (!markup) return "";
|
|
153
|
+
if (trustMarkup) return markup;
|
|
154
|
+
if (sanitizeMarkup) return sanitizeMarkup(markup);
|
|
155
|
+
const sanitizer = createDefaultItemMarkupSanitizer({
|
|
156
|
+
allowedCustomElements: allowList,
|
|
157
|
+
});
|
|
158
|
+
return sanitizer(markup);
|
|
159
|
+
}
|
|
160
|
+
|
|
133
161
|
// Get appropriate markup based on mode
|
|
134
162
|
const itemMarkup = $derived.by(() => {
|
|
135
163
|
if (!itemConfig?.markup) return "";
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
itemConfig.markup,
|
|
139
|
-
itemConfig.
|
|
140
|
-
|
|
141
|
-
}
|
|
142
|
-
return itemConfig.markup;
|
|
164
|
+
const raw =
|
|
165
|
+
mode === "author" && itemConfig.elements
|
|
166
|
+
? transformMarkupForAuthoring(itemConfig.markup, itemConfig.elements)
|
|
167
|
+
: itemConfig.markup;
|
|
168
|
+
return applySanitizer(raw, itemAllowList);
|
|
143
169
|
});
|
|
144
170
|
|
|
145
171
|
const passageMarkup = $derived.by(() => {
|
|
146
172
|
if (!passageConfig?.markup) return "";
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
173
|
+
const raw =
|
|
174
|
+
mode === "author" && passageConfig.elements
|
|
175
|
+
? transformMarkupForAuthoring(
|
|
176
|
+
passageConfig.markup,
|
|
177
|
+
passageConfig.elements
|
|
178
|
+
)
|
|
179
|
+
: passageConfig.markup;
|
|
180
|
+
return applySanitizer(raw, passageAllowList);
|
|
154
181
|
});
|
|
155
182
|
|
|
183
|
+
function normalizePlayerErrorDetail(
|
|
184
|
+
detail: unknown,
|
|
185
|
+
fallbackCode = "ITEM_PLAYER_RUNTIME_ERROR"
|
|
186
|
+
) {
|
|
187
|
+
if (detail && typeof detail === "object") {
|
|
188
|
+
const detailObject = detail as Record<string, unknown>;
|
|
189
|
+
const message =
|
|
190
|
+
typeof detailObject.message === "string" && detailObject.message.trim().length > 0
|
|
191
|
+
? detailObject.message
|
|
192
|
+
: "Unknown PIE runtime error";
|
|
193
|
+
const code =
|
|
194
|
+
typeof detailObject.code === "string" && detailObject.code.trim().length > 0
|
|
195
|
+
? detailObject.code
|
|
196
|
+
: fallbackCode;
|
|
197
|
+
return { ...detailObject, message, code };
|
|
198
|
+
}
|
|
199
|
+
const message =
|
|
200
|
+
typeof detail === "string" && detail.trim().length > 0
|
|
201
|
+
? detail
|
|
202
|
+
: "Unknown PIE runtime error";
|
|
203
|
+
return { code: fallbackCode, message };
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
function trackPlayerError(detail: Record<string, unknown>) {
|
|
207
|
+
const resolvedProvider = resolveInstrumentationProvider({
|
|
208
|
+
player: { loaderConfig },
|
|
209
|
+
component: "pie-item-player",
|
|
210
|
+
debug: isGlobalDebugEnabled(),
|
|
211
|
+
});
|
|
212
|
+
if (!isInstrumentationProvider(resolvedProvider) || !resolvedProvider.isReady()) return;
|
|
213
|
+
const message =
|
|
214
|
+
typeof detail.message === "string" ? detail.message : "Unknown PIE runtime error";
|
|
215
|
+
const code =
|
|
216
|
+
typeof detail.code === "string" && detail.code.length > 0
|
|
217
|
+
? detail.code
|
|
218
|
+
: "ITEM_PLAYER_RUNTIME_ERROR";
|
|
219
|
+
resolvedProvider.trackError(new Error(message), {
|
|
220
|
+
component: "pie-item-player",
|
|
221
|
+
errorType: code,
|
|
222
|
+
...detail,
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
function reportPlayerError(detail: unknown, fallbackCode = "ITEM_PLAYER_RUNTIME_ERROR") {
|
|
227
|
+
const normalizedDetail = normalizePlayerErrorDetail(detail, fallbackCode);
|
|
228
|
+
runtimePlayerError = normalizedDetail.message as string;
|
|
229
|
+
logger.error("[PieItemPlayer] Runtime error:", normalizedDetail);
|
|
230
|
+
trackPlayerError(normalizedDetail);
|
|
231
|
+
dispatch("player-error", normalizedDetail);
|
|
232
|
+
}
|
|
233
|
+
|
|
156
234
|
// Dispatch events (will add more as needed)
|
|
157
235
|
const dispatch = (type: string, detail?: any) => {
|
|
158
236
|
// Call callback prop if provided (Svelte 5 pattern)
|
|
@@ -185,8 +263,7 @@
|
|
|
185
263
|
function reportAuthoringErrorOnce(message: string) {
|
|
186
264
|
if (lastReportedAuthoringError === message) return;
|
|
187
265
|
lastReportedAuthoringError = message;
|
|
188
|
-
|
|
189
|
-
dispatch("player-error", {
|
|
266
|
+
reportPlayerError({
|
|
190
267
|
code: "AUTHORING_BACKEND_CONFIG_ERROR",
|
|
191
268
|
message,
|
|
192
269
|
});
|
|
@@ -381,46 +458,6 @@
|
|
|
381
458
|
// Root element reference for resource monitor
|
|
382
459
|
let rootElement: HTMLElement | null = $state(null);
|
|
383
460
|
|
|
384
|
-
function normalizeResourceUrl(url: string): string {
|
|
385
|
-
try {
|
|
386
|
-
const parsed = new URL(url, window.location.href);
|
|
387
|
-
parsed.searchParams.delete("retry");
|
|
388
|
-
parsed.searchParams.delete("t");
|
|
389
|
-
return parsed.toString();
|
|
390
|
-
} catch {
|
|
391
|
-
return url;
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
function dispatchMediaRetryReady(detail: RetrySuccessDetail) {
|
|
396
|
-
if (!rootElement) return;
|
|
397
|
-
if (!detail || (detail.resourceType !== "audio" && detail.resourceType !== "video")) {
|
|
398
|
-
return;
|
|
399
|
-
}
|
|
400
|
-
const url = typeof detail.url === "string" ? detail.url : "";
|
|
401
|
-
if (!url) return;
|
|
402
|
-
const normalizedTargetUrl = normalizeResourceUrl(url);
|
|
403
|
-
const selector = detail.resourceType === "audio" ? "audio[src]" : "video[src]";
|
|
404
|
-
const mediaElements = Array.from(
|
|
405
|
-
rootElement.querySelectorAll<HTMLAudioElement | HTMLVideoElement>(selector)
|
|
406
|
-
);
|
|
407
|
-
for (const mediaEl of mediaElements) {
|
|
408
|
-
const currentSrc = mediaEl.currentSrc || mediaEl.src;
|
|
409
|
-
if (!currentSrc) continue;
|
|
410
|
-
if (normalizeResourceUrl(currentSrc) !== normalizedTargetUrl) continue;
|
|
411
|
-
mediaEl.dispatchEvent(
|
|
412
|
-
new CustomEvent("pie-media-retry-ready", {
|
|
413
|
-
detail: {
|
|
414
|
-
...detail,
|
|
415
|
-
mediaTag: detail.resourceType,
|
|
416
|
-
},
|
|
417
|
-
bubbles: true,
|
|
418
|
-
composed: true,
|
|
419
|
-
})
|
|
420
|
-
);
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
|
|
424
461
|
// Resource monitor (handles initialization and cleanup automatically)
|
|
425
462
|
useResourceMonitor(
|
|
426
463
|
() => rootElement,
|
|
@@ -429,26 +466,6 @@
|
|
|
429
466
|
"pie-item-player"
|
|
430
467
|
);
|
|
431
468
|
|
|
432
|
-
// Bridge resource-monitor retry success events to media-level recovery hooks so
|
|
433
|
-
// item elements can clear local disabled/error UI without coupling to player internals.
|
|
434
|
-
$effect(() => {
|
|
435
|
-
if (!rootElement) return;
|
|
436
|
-
const handleRetrySuccess = (event: Event) => {
|
|
437
|
-
const customEvent = event as CustomEvent<RetrySuccessDetail>;
|
|
438
|
-
dispatchMediaRetryReady(customEvent.detail ?? {});
|
|
439
|
-
};
|
|
440
|
-
rootElement.addEventListener(
|
|
441
|
-
"pie-resource-retry-success",
|
|
442
|
-
handleRetrySuccess as EventListener
|
|
443
|
-
);
|
|
444
|
-
return () => {
|
|
445
|
-
rootElement?.removeEventListener(
|
|
446
|
-
"pie-resource-retry-success",
|
|
447
|
-
handleRetrySuccess as EventListener
|
|
448
|
-
);
|
|
449
|
-
};
|
|
450
|
-
});
|
|
451
|
-
|
|
452
469
|
// Initialize PIE elements AFTER markup is rendered (reactive pattern like PieItemPreview)
|
|
453
470
|
$effect(() => {
|
|
454
471
|
if (!itemConfig || initialized) return;
|
|
@@ -460,6 +477,7 @@
|
|
|
460
477
|
// Wait for DOM to update (markup to render)
|
|
461
478
|
tick().then(async () => {
|
|
462
479
|
try {
|
|
480
|
+
runtimePlayerError = null;
|
|
463
481
|
logger.debug("[PieItemPlayer] DOM ready, initializing PIE elements");
|
|
464
482
|
logger.debug("[PieItemPlayer] Config:", {
|
|
465
483
|
itemElements: Object.keys(itemConfig.elements || {}),
|
|
@@ -737,8 +755,14 @@
|
|
|
737
755
|
);
|
|
738
756
|
dispatch("load-complete");
|
|
739
757
|
} catch (e: any) {
|
|
740
|
-
|
|
741
|
-
|
|
758
|
+
reportPlayerError(
|
|
759
|
+
{
|
|
760
|
+
code: "ITEM_PLAYER_INITIALIZATION_ERROR",
|
|
761
|
+
message: e instanceof Error ? e.message : String(e),
|
|
762
|
+
cause: e instanceof Error ? e.stack || e.message : String(e),
|
|
763
|
+
},
|
|
764
|
+
"ITEM_PLAYER_INITIALIZATION_ERROR"
|
|
765
|
+
);
|
|
742
766
|
}
|
|
743
767
|
});
|
|
744
768
|
});
|
|
@@ -797,16 +821,60 @@
|
|
|
797
821
|
if (passageConfig) {
|
|
798
822
|
updatePieElements(passageConfig, session, env, rootElement ?? undefined);
|
|
799
823
|
}
|
|
824
|
+
} catch (e: any) {
|
|
825
|
+
reportPlayerError(
|
|
826
|
+
{
|
|
827
|
+
code: "ITEM_PLAYER_UPDATE_ERROR",
|
|
828
|
+
message: e instanceof Error ? e.message : String(e),
|
|
829
|
+
cause: e instanceof Error ? e.stack || e.message : String(e),
|
|
830
|
+
},
|
|
831
|
+
"ITEM_PLAYER_UPDATE_ERROR"
|
|
832
|
+
);
|
|
800
833
|
} finally {
|
|
801
834
|
isUpdating = false;
|
|
802
835
|
}
|
|
803
836
|
});
|
|
804
837
|
});
|
|
805
838
|
|
|
839
|
+
$effect(() => {
|
|
840
|
+
if (!rootElement) return;
|
|
841
|
+
const handleControllerError = (event: Event) => {
|
|
842
|
+
const customEvent = event as CustomEvent;
|
|
843
|
+
reportPlayerError(customEvent.detail, "PIE_CONTROLLER_RUNTIME_ERROR");
|
|
844
|
+
};
|
|
845
|
+
rootElement.addEventListener(
|
|
846
|
+
"pie-controller-error",
|
|
847
|
+
handleControllerError as EventListener
|
|
848
|
+
);
|
|
849
|
+
return () => {
|
|
850
|
+
rootElement?.removeEventListener(
|
|
851
|
+
"pie-controller-error",
|
|
852
|
+
handleControllerError as EventListener
|
|
853
|
+
);
|
|
854
|
+
};
|
|
855
|
+
});
|
|
856
|
+
|
|
806
857
|
// Note: Resource monitor cleanup is handled automatically by useResourceMonitor's onDestroy
|
|
807
858
|
</script>
|
|
808
859
|
|
|
809
860
|
<div class="pie-item-player" bind:this={rootElement}>
|
|
861
|
+
{#if runtimePlayerError}
|
|
862
|
+
<div
|
|
863
|
+
class="pie-player-error"
|
|
864
|
+
style="
|
|
865
|
+
padding: 20px;
|
|
866
|
+
margin: 20px 0;
|
|
867
|
+
border: 2px solid #d32f2f;
|
|
868
|
+
border-radius: 4px;
|
|
869
|
+
background-color: #ffebee;
|
|
870
|
+
color: #c62828;
|
|
871
|
+
font-family: sans-serif;
|
|
872
|
+
"
|
|
873
|
+
>
|
|
874
|
+
<h3 style="margin: 0 0 10px 0">Player Error</h3>
|
|
875
|
+
<p style="margin: 0">{runtimePlayerError}</p>
|
|
876
|
+
</div>
|
|
877
|
+
{/if}
|
|
810
878
|
{#if authoringBlockedError}
|
|
811
879
|
<div
|
|
812
880
|
class="pie-player-error"
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
},
|
|
44
44
|
"calculator": {
|
|
45
45
|
"title": "Calculator",
|
|
46
|
-
"aria_label": "Calculator tool -
|
|
46
|
+
"aria_label": "Calculator tool - Tab to reach title bar controls. On the title bar, Arrow keys move the window, Shift+Arrow resizes it, Home re-centers, and Escape closes.",
|
|
47
47
|
"settings": "Calculator settings",
|
|
48
48
|
"close": "Close calculator",
|
|
49
49
|
"settings_title": "Calculator Settings",
|
package/dist/index.d.ts
CHANGED
|
@@ -2,12 +2,14 @@ export * from "./config/profile.js";
|
|
|
2
2
|
export * from "./instrumentation/index.js";
|
|
3
3
|
export * from "./loader-config.js";
|
|
4
4
|
export * from "./player-strategy.js";
|
|
5
|
+
export * from "./security/index.js";
|
|
5
6
|
export * from "./loaders/index.js";
|
|
6
7
|
export * from "./object/index.js";
|
|
7
8
|
export * from "./pie/index.js";
|
|
8
9
|
export type { AssessmentEntity, AssessmentItemRef, AssessmentSection, ConfigEntity, Env, ItemConfig, ItemEntity, LegacyAssessmentSection, OutcomeResponse, PassageEntity, PieController, PieModel, QuestionEntity, RubricBlock, SectionQuestionRef, TestPart, } from "./types/index.js";
|
|
9
10
|
export { editorPostFix } from "./types/index.js";
|
|
10
11
|
export * from "./ui/focus-trap.js";
|
|
12
|
+
export * from "./ui/first-focusable.js";
|
|
11
13
|
export * from "./ui/debug-panel-persistence.js";
|
|
12
14
|
export * from "./ui/safe-storage.js";
|
|
13
15
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAElC,cAAc,gBAAgB,CAAC;AAC/B,YAAY,EACX,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,GAAG,EACH,UAAU,EACV,UAAU,EACV,uBAAuB,EACvB,eAAe,EACf,aAAa,EACb,aAAa,EACb,QAAQ,EACR,cAAc,EACd,WAAW,EACX,kBAAkB,EAClB,QAAQ,GACR,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,cAAc,oBAAoB,CAAC;AACnC,cAAc,iCAAiC,CAAC;AAChD,cAAc,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAElC,cAAc,gBAAgB,CAAC;AAC/B,YAAY,EACX,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,GAAG,EACH,UAAU,EACV,UAAU,EACV,uBAAuB,EACvB,eAAe,EACf,aAAa,EACb,aAAa,EACb,QAAQ,EACR,cAAc,EACd,WAAW,EACX,kBAAkB,EAClB,QAAQ,GACR,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iCAAiC,CAAC;AAChD,cAAc,sBAAsB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -2,12 +2,18 @@ export * from "./config/profile.js";
|
|
|
2
2
|
export * from "./instrumentation/index.js";
|
|
3
3
|
export * from "./loader-config.js";
|
|
4
4
|
export * from "./player-strategy.js";
|
|
5
|
+
export * from "./security/index.js";
|
|
5
6
|
export * from "./loaders/index.js";
|
|
6
7
|
export * from "./object/index.js";
|
|
7
8
|
// Barrel export for PIE runtime utilities
|
|
8
9
|
export * from "./pie/index.js";
|
|
9
10
|
export { editorPostFix } from "./types/index.js";
|
|
10
11
|
export * from "./ui/focus-trap.js";
|
|
12
|
+
export * from "./ui/first-focusable.js";
|
|
11
13
|
export * from "./ui/debug-panel-persistence.js";
|
|
12
14
|
export * from "./ui/safe-storage.js";
|
|
15
|
+
// use-promise is a Svelte 5 runes module and is shipped as raw source via
|
|
16
|
+
// the `./ui/use-promise` subpath export. It is not re-exported here because
|
|
17
|
+
// tsc cannot compile `.svelte.ts` runes correctly; the consumer's Svelte
|
|
18
|
+
// plugin processes it at consume time.
|
|
13
19
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,0CAA0C;AAC1C,cAAc,gBAAgB,CAAC;AAmB/B,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,cAAc,oBAAoB,CAAC;AACnC,cAAc,iCAAiC,CAAC;AAChD,cAAc,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,0CAA0C;AAC1C,cAAc,gBAAgB,CAAC;AAmB/B,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iCAAiC,CAAC;AAChD,cAAc,sBAAsB,CAAC;AACrC,0EAA0E;AAC1E,4EAA4E;AAC5E,yEAAyE;AACzE,uCAAuC"}
|
package/dist/loader-config.d.ts
CHANGED
|
@@ -4,6 +4,16 @@
|
|
|
4
4
|
* Mirrors the `LoaderConfig` used by PIEOneer's custom element tags.
|
|
5
5
|
*/
|
|
6
6
|
import type { InstrumentationProvider } from "./instrumentation/types.js";
|
|
7
|
+
export type IifeBundleRetryConfig = {
|
|
8
|
+
/**
|
|
9
|
+
* Delay in ms between IIFE bundle retry attempts.
|
|
10
|
+
*/
|
|
11
|
+
retryDelayMs?: number;
|
|
12
|
+
/**
|
|
13
|
+
* Total timeout in ms before IIFE bundle load retries fail permanently.
|
|
14
|
+
*/
|
|
15
|
+
timeoutMs?: number;
|
|
16
|
+
};
|
|
7
17
|
export type LoaderConfig = {
|
|
8
18
|
/**
|
|
9
19
|
* Enable tracking page actions/events.
|
|
@@ -47,11 +57,26 @@ export type LoaderConfig = {
|
|
|
47
57
|
* Initial delay in ms before first resource retry attempt (exponential backoff).
|
|
48
58
|
*/
|
|
49
59
|
resourceRetryDelay?: number;
|
|
60
|
+
/**
|
|
61
|
+
* Retry policy for IIFE bundle loads.
|
|
62
|
+
*
|
|
63
|
+
* Kept separate from resource retry settings so bundle-build polling can be tuned
|
|
64
|
+
* independently from media/resource retries.
|
|
65
|
+
*/
|
|
66
|
+
iifeBundleRetry?: IifeBundleRetryConfig;
|
|
67
|
+
};
|
|
68
|
+
export declare const DEFAULT_IIFE_BUNDLE_RETRY_CONFIG: {
|
|
69
|
+
readonly retryDelayMs: 3000;
|
|
70
|
+
readonly timeoutMs: 120000;
|
|
50
71
|
};
|
|
51
72
|
export declare const DEFAULT_LOADER_CONFIG: {
|
|
52
73
|
readonly trackPageActions: false;
|
|
53
74
|
readonly instrumentationProvider: undefined;
|
|
54
75
|
readonly maxResourceRetries: 3;
|
|
55
76
|
readonly resourceRetryDelay: 500;
|
|
77
|
+
readonly iifeBundleRetry: {
|
|
78
|
+
readonly retryDelayMs: 3000;
|
|
79
|
+
readonly timeoutMs: 120000;
|
|
80
|
+
};
|
|
56
81
|
};
|
|
57
82
|
//# sourceMappingURL=loader-config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader-config.d.ts","sourceRoot":"","sources":["../src/loader-config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAE1E,MAAM,MAAM,YAAY,GAAG;IAC1B;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,uBAAuB,CAAC,EAAE,uBAAuB,CAAC;IAElD;;OAEG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B;;OAEG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"loader-config.d.ts","sourceRoot":"","sources":["../src/loader-config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAE1E,MAAM,MAAM,qBAAqB,GAAG;IACnC;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IAC1B;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,uBAAuB,CAAC,EAAE,uBAAuB,CAAC;IAElD;;OAEG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B;;OAEG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B;;;;;OAKG;IACH,eAAe,CAAC,EAAE,qBAAqB,CAAC;CACxC,CAAC;AAEF,eAAO,MAAM,gCAAgC;;;CAGnC,CAAC;AAEX,eAAO,MAAM,qBAAqB;;;;;;;;;CAMxB,CAAC"}
|
package/dist/loader-config.js
CHANGED
|
@@ -3,10 +3,15 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Mirrors the `LoaderConfig` used by PIEOneer's custom element tags.
|
|
5
5
|
*/
|
|
6
|
+
export const DEFAULT_IIFE_BUNDLE_RETRY_CONFIG = {
|
|
7
|
+
retryDelayMs: 3000,
|
|
8
|
+
timeoutMs: 120000,
|
|
9
|
+
};
|
|
6
10
|
export const DEFAULT_LOADER_CONFIG = {
|
|
7
11
|
trackPageActions: false,
|
|
8
12
|
instrumentationProvider: undefined,
|
|
9
13
|
maxResourceRetries: 3,
|
|
10
14
|
resourceRetryDelay: 500,
|
|
15
|
+
iifeBundleRetry: DEFAULT_IIFE_BUNDLE_RETRY_CONFIG,
|
|
11
16
|
};
|
|
12
17
|
//# sourceMappingURL=loader-config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader-config.js","sourceRoot":"","sources":["../src/loader-config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"loader-config.js","sourceRoot":"","sources":["../src/loader-config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAwEH,MAAM,CAAC,MAAM,gCAAgC,GAAG;IAC/C,YAAY,EAAE,IAAI;IAClB,SAAS,EAAE,MAAM;CACR,CAAC;AAEX,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACpC,gBAAgB,EAAE,KAAK;IACvB,uBAAuB,EAAE,SAAS;IAClC,kBAAkB,EAAE,CAAC;IACrB,kBAAkB,EAAE,GAAG;IACvB,eAAe,EAAE,gCAAgC;CACxC,CAAC"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Element Loader
|
|
2
|
+
* Element Loader — element aggregation utilities.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* The deep `ElementLoader` primitive lives in `./element-loader.ts`. This
|
|
5
|
+
* module owns the shared `ElementMap` type and the `aggregateElements`
|
|
6
|
+
* helper that reduces many items' element declarations into a single
|
|
7
|
+
* deduplicated, version-aware map (used by the section-player to
|
|
8
|
+
* pre-warm in one shot).
|
|
7
9
|
*/
|
|
8
|
-
import type { BundleType } from "../pie/types.js";
|
|
9
10
|
import type { ItemEntity } from "../types/index.js";
|
|
10
11
|
/**
|
|
11
12
|
* Map of element tag names to their package versions
|
|
@@ -14,35 +15,6 @@ import type { ItemEntity } from "../types/index.js";
|
|
|
14
15
|
export type ElementMap = {
|
|
15
16
|
[tagName: string]: string;
|
|
16
17
|
};
|
|
17
|
-
/**
|
|
18
|
-
* Options for loading PIE elements
|
|
19
|
-
*/
|
|
20
|
-
export interface LoadOptions {
|
|
21
|
-
/** Bundle type to load (player or clientPlayer) */
|
|
22
|
-
bundleType?: BundleType;
|
|
23
|
-
/** Whether to load controllers (for client-side processing) */
|
|
24
|
-
needsControllers?: boolean;
|
|
25
|
-
/** View mode (ESM only) - delivery, author, or print */
|
|
26
|
-
view?: "delivery" | "author" | "print";
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Common interface for element loaders (IIFE and ESM)
|
|
30
|
-
*/
|
|
31
|
-
export interface ElementLoaderInterface {
|
|
32
|
-
/**
|
|
33
|
-
* Load elements directly from an element map
|
|
34
|
-
* @param elements - Map of element tag names to package versions
|
|
35
|
-
* @param options - Loading options
|
|
36
|
-
*/
|
|
37
|
-
loadElements(elements: ElementMap, options?: LoadOptions): Promise<void>;
|
|
38
|
-
/**
|
|
39
|
-
* Extract and load elements from items
|
|
40
|
-
* Automatically aggregates unique elements from all items
|
|
41
|
-
* @param items - Array of items to extract elements from
|
|
42
|
-
* @param options - Loading options
|
|
43
|
-
*/
|
|
44
|
-
loadFromItems(items: ItemEntity[], options?: LoadOptions): Promise<void>;
|
|
45
|
-
}
|
|
46
18
|
/**
|
|
47
19
|
* Aggregate unique elements from multiple items
|
|
48
20
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ElementLoader.d.ts","sourceRoot":"","sources":["../../src/loaders/ElementLoader.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ElementLoader.d.ts","sourceRoot":"","sources":["../../src/loaders/ElementLoader.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG;IAAE,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,CAAC;AAEvD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,UAAU,CAmEjE"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Element Loader
|
|
2
|
+
* Element Loader — element aggregation utilities.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* The deep `ElementLoader` primitive lives in `./element-loader.ts`. This
|
|
5
|
+
* module owns the shared `ElementMap` type and the `aggregateElements`
|
|
6
|
+
* helper that reduces many items' element declarations into a single
|
|
7
|
+
* deduplicated, version-aware map (used by the section-player to
|
|
8
|
+
* pre-warm in one shot).
|
|
7
9
|
*/
|
|
8
10
|
import { parsePackageName } from "../pie/utils.js";
|
|
9
11
|
/**
|
|
@@ -35,21 +37,31 @@ export function aggregateElements(items) {
|
|
|
35
37
|
const elementMap = {};
|
|
36
38
|
const seenOriginalTags = {};
|
|
37
39
|
const VERSION_DELIMITER = "--version-";
|
|
40
|
+
const TAG_VERSION_PATTERN = "[0-9A-Za-z-]+";
|
|
41
|
+
const encodeVersionForTag = (version) => version
|
|
42
|
+
.trim()
|
|
43
|
+
.replace(/[.+]/g, "-")
|
|
44
|
+
.replace(/[^0-9A-Za-z-]/g, "-")
|
|
45
|
+
.replace(/-{2,}/g, "-");
|
|
38
46
|
const parseTagName = (tagName) => {
|
|
39
|
-
const versionMatch = tagName.match(`${VERSION_DELIMITER}(
|
|
47
|
+
const versionMatch = tagName.match(new RegExp(`${VERSION_DELIMITER}(${TAG_VERSION_PATTERN})$`));
|
|
40
48
|
return versionMatch
|
|
41
49
|
? {
|
|
42
50
|
baseName: tagName.replace(`${VERSION_DELIMITER}${versionMatch[1]}`, ""),
|
|
43
|
-
|
|
51
|
+
existingEncodedVersion: versionMatch[1],
|
|
44
52
|
}
|
|
45
53
|
: { baseName: tagName };
|
|
46
54
|
};
|
|
47
55
|
const normalizeElementTag = (tagName, packageSpec) => {
|
|
48
|
-
const { baseName,
|
|
56
|
+
const { baseName, existingEncodedVersion } = parseTagName(tagName);
|
|
49
57
|
const { version } = parsePackageName(packageSpec);
|
|
50
|
-
if (!version
|
|
58
|
+
if (!version)
|
|
51
59
|
return tagName;
|
|
52
|
-
|
|
60
|
+
const targetEncodedVersion = encodeVersionForTag(version);
|
|
61
|
+
if (!targetEncodedVersion || existingEncodedVersion === targetEncodedVersion) {
|
|
62
|
+
return tagName;
|
|
63
|
+
}
|
|
64
|
+
return `${baseName}${VERSION_DELIMITER}${targetEncodedVersion}`;
|
|
53
65
|
};
|
|
54
66
|
items.forEach((item) => {
|
|
55
67
|
const itemElements = item.config?.elements || {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ElementLoader.js","sourceRoot":"","sources":["../../src/loaders/ElementLoader.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ElementLoader.js","sourceRoot":"","sources":["../../src/loaders/ElementLoader.ts"],"names":[],"mappings":"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"}
|