@pie-players/pie-players-shared 0.3.60 → 0.3.62

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 (147) hide show
  1. package/dist/config/profile.js +0 -1
  2. package/dist/i18n/index.js +0 -1
  3. package/dist/i18n/loader.js +0 -1
  4. package/dist/i18n/simple-i18n.js +0 -1
  5. package/dist/i18n/types.js +0 -1
  6. package/dist/index.d.ts +2 -0
  7. package/dist/index.js +2 -1
  8. package/dist/instrumentation/debug-panel-stream.js +0 -1
  9. package/dist/instrumentation/index.js +0 -1
  10. package/dist/instrumentation/provider-guards.js +0 -1
  11. package/dist/instrumentation/providers/BaseInstrumentationProvider.js +0 -1
  12. package/dist/instrumentation/providers/CompositeInstrumentationProvider.js +0 -1
  13. package/dist/instrumentation/providers/ConsoleInstrumentationProvider.js +0 -1
  14. package/dist/instrumentation/providers/DebugPanelInstrumentationProvider.js +0 -1
  15. package/dist/instrumentation/providers/NewRelicInstrumentationProvider.js +0 -1
  16. package/dist/instrumentation/providers/index.js +0 -1
  17. package/dist/instrumentation/types.js +0 -1
  18. package/dist/loader-config.js +0 -1
  19. package/dist/loaders/ElementLoader.js +0 -1
  20. package/dist/loaders/element-loader-types.js +0 -1
  21. package/dist/loaders/element-loader.js +0 -1
  22. package/dist/loaders/element-package-policy.js +0 -1
  23. package/dist/loaders/esm-adapter.js +0 -1
  24. package/dist/loaders/iife-adapter.js +0 -1
  25. package/dist/loaders/index.js +0 -1
  26. package/dist/object/index.js +0 -1
  27. package/dist/pie/asset-handler.js +0 -1
  28. package/dist/pie/authoring-tag.js +0 -1
  29. package/dist/pie/authoring.js +0 -1
  30. package/dist/pie/component-context.js +0 -1
  31. package/dist/pie/config.js +0 -1
  32. package/dist/pie/configure-initialization.js +0 -1
  33. package/dist/pie/correct-response-env.js +0 -1
  34. package/dist/pie/custom-element-define.js +0 -1
  35. package/dist/pie/index.js +0 -1
  36. package/dist/pie/initialization.js +0 -1
  37. package/dist/pie/instrumentation-event-bridge.js +0 -1
  38. package/dist/pie/instrumentation-event-map.js +0 -1
  39. package/dist/pie/instrumentation-provider-resolution.js +0 -1
  40. package/dist/pie/item-controller-storage.js +0 -1
  41. package/dist/pie/item-controller.js +0 -1
  42. package/dist/pie/item-session-contract.js +0 -1
  43. package/dist/pie/logger.js +0 -1
  44. package/dist/pie/math-rendering.js +0 -1
  45. package/dist/pie/overrides.js +0 -1
  46. package/dist/pie/player-initializer.js +0 -1
  47. package/dist/pie/registry.js +0 -1
  48. package/dist/pie/resource-monitor.js +0 -1
  49. package/dist/pie/scoring.js +0 -1
  50. package/dist/pie/stage-tracker.js +0 -1
  51. package/dist/pie/stages.js +0 -1
  52. package/dist/pie/tag-names.js +0 -1
  53. package/dist/pie/types.js +0 -1
  54. package/dist/pie/updates.js +0 -1
  55. package/dist/pie/utils.js +0 -1
  56. package/dist/pie/versioned-tag.js +0 -1
  57. package/dist/player-strategy.js +0 -1
  58. package/dist/security/index.js +0 -1
  59. package/dist/security/sanitize-item-markup.d.ts +11 -0
  60. package/dist/security/sanitize-item-markup.js +5 -3
  61. package/dist/security/sanitize-svg-icon.js +0 -1
  62. package/dist/security/validate-style-url.js +0 -1
  63. package/dist/security/wrap-model-rich-content.js +0 -1
  64. package/dist/security/wrap-overwide-images.js +0 -1
  65. package/dist/security/wrap-overwide-tables.js +0 -1
  66. package/dist/server/npm-registry.js +0 -1
  67. package/dist/types/index.js +0 -1
  68. package/dist/ui/content-styles.d.ts +73 -0
  69. package/dist/ui/content-styles.js +204 -0
  70. package/dist/ui/debug-panel-persistence.js +0 -1
  71. package/dist/ui/first-focusable.js +0 -1
  72. package/dist/ui/focus-trap.js +0 -1
  73. package/dist/ui/safe-storage.js +0 -1
  74. package/dist/ui/scope-css.d.ts +56 -0
  75. package/dist/ui/scope-css.js +310 -0
  76. package/dist/ui/zoom-compensation.js +0 -1
  77. package/package.json +9 -5
  78. package/dist/config/profile.js.map +0 -1
  79. package/dist/i18n/index.js.map +0 -1
  80. package/dist/i18n/loader.js.map +0 -1
  81. package/dist/i18n/simple-i18n.js.map +0 -1
  82. package/dist/i18n/types.js.map +0 -1
  83. package/dist/index.js.map +0 -1
  84. package/dist/instrumentation/debug-panel-stream.js.map +0 -1
  85. package/dist/instrumentation/index.js.map +0 -1
  86. package/dist/instrumentation/provider-guards.js.map +0 -1
  87. package/dist/instrumentation/providers/BaseInstrumentationProvider.js.map +0 -1
  88. package/dist/instrumentation/providers/CompositeInstrumentationProvider.js.map +0 -1
  89. package/dist/instrumentation/providers/ConsoleInstrumentationProvider.js.map +0 -1
  90. package/dist/instrumentation/providers/DebugPanelInstrumentationProvider.js.map +0 -1
  91. package/dist/instrumentation/providers/NewRelicInstrumentationProvider.js.map +0 -1
  92. package/dist/instrumentation/providers/index.js.map +0 -1
  93. package/dist/instrumentation/types.js.map +0 -1
  94. package/dist/loader-config.js.map +0 -1
  95. package/dist/loaders/ElementLoader.js.map +0 -1
  96. package/dist/loaders/element-loader-types.js.map +0 -1
  97. package/dist/loaders/element-loader.js.map +0 -1
  98. package/dist/loaders/element-package-policy.js.map +0 -1
  99. package/dist/loaders/esm-adapter.js.map +0 -1
  100. package/dist/loaders/iife-adapter.js.map +0 -1
  101. package/dist/loaders/index.js.map +0 -1
  102. package/dist/object/index.js.map +0 -1
  103. package/dist/pie/asset-handler.js.map +0 -1
  104. package/dist/pie/authoring-tag.js.map +0 -1
  105. package/dist/pie/authoring.js.map +0 -1
  106. package/dist/pie/component-context.js.map +0 -1
  107. package/dist/pie/config.js.map +0 -1
  108. package/dist/pie/configure-initialization.js.map +0 -1
  109. package/dist/pie/correct-response-env.js.map +0 -1
  110. package/dist/pie/custom-element-define.js.map +0 -1
  111. package/dist/pie/index.js.map +0 -1
  112. package/dist/pie/initialization.js.map +0 -1
  113. package/dist/pie/instrumentation-event-bridge.js.map +0 -1
  114. package/dist/pie/instrumentation-event-map.js.map +0 -1
  115. package/dist/pie/instrumentation-provider-resolution.js.map +0 -1
  116. package/dist/pie/item-controller-storage.js.map +0 -1
  117. package/dist/pie/item-controller.js.map +0 -1
  118. package/dist/pie/item-session-contract.js.map +0 -1
  119. package/dist/pie/logger.js.map +0 -1
  120. package/dist/pie/math-rendering.js.map +0 -1
  121. package/dist/pie/overrides.js.map +0 -1
  122. package/dist/pie/player-initializer.js.map +0 -1
  123. package/dist/pie/registry.js.map +0 -1
  124. package/dist/pie/resource-monitor.js.map +0 -1
  125. package/dist/pie/scoring.js.map +0 -1
  126. package/dist/pie/stage-tracker.js.map +0 -1
  127. package/dist/pie/stages.js.map +0 -1
  128. package/dist/pie/tag-names.js.map +0 -1
  129. package/dist/pie/types.js.map +0 -1
  130. package/dist/pie/updates.js.map +0 -1
  131. package/dist/pie/utils.js.map +0 -1
  132. package/dist/pie/versioned-tag.js.map +0 -1
  133. package/dist/player-strategy.js.map +0 -1
  134. package/dist/security/index.js.map +0 -1
  135. package/dist/security/sanitize-item-markup.js.map +0 -1
  136. package/dist/security/sanitize-svg-icon.js.map +0 -1
  137. package/dist/security/validate-style-url.js.map +0 -1
  138. package/dist/security/wrap-model-rich-content.js.map +0 -1
  139. package/dist/security/wrap-overwide-images.js.map +0 -1
  140. package/dist/security/wrap-overwide-tables.js.map +0 -1
  141. package/dist/server/npm-registry.js.map +0 -1
  142. package/dist/types/index.js.map +0 -1
  143. package/dist/ui/debug-panel-persistence.js.map +0 -1
  144. package/dist/ui/first-focusable.js.map +0 -1
  145. package/dist/ui/focus-trap.js.map +0 -1
  146. package/dist/ui/safe-storage.js.map +0 -1
  147. package/dist/ui/zoom-compensation.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/loaders/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,EACN,4BAA4B,EAC5B,yBAAyB,GACzB,MAAM,6BAA6B,CAAC;AAcrC,OAAO,EACN,cAAc,EACd,qBAAqB,EACrB,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,GAChB,MAAM,qBAAqB,CAAC;AAS7B,OAAO,EACN,cAAc,EACd,gBAAgB,EAChB,kBAAkB,GAClB,MAAM,kBAAkB,CAAC;AAK1B,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC","sourcesContent":["/**\n * PIE Element Loaders\n *\n * Deep `ElementLoader` primitive — the public entry point for registering\n * PIE custom elements at runtime. Exposes `ensureRegistered` (async) and\n * `assertRegistered` (sync) with a truthful promise contract: the returned\n * promise resolves iff every requested tag is actually in `customElements`.\n *\n * Backends (IIFE, ESM) are internal adapter modules; they implement the\n * `ElementLoaderBackend` interface and are wired via `{ backend: ... }`\n * options.\n *\n * @example\n * ```typescript\n * import {\n * ensureRegistered,\n * BundleType,\n * } from \"@pie-players/pie-players-shared/loaders\";\n *\n * await ensureRegistered(\n * { \"pie-multiple-choice\": \"@pie-element/multiple-choice@11.0.1\" },\n * {\n * backend: {\n * kind: \"iife\",\n * bundleHost: \"https://proxy.pie-api.com/bundles/\",\n * bundleType: BundleType.clientPlayer,\n * needsControllers: true,\n * },\n * },\n * );\n * ```\n */\n\nexport type { ElementMap } from \"./ElementLoader.js\";\nexport { aggregateElements } from \"./ElementLoader.js\";\nexport type { ElementPackagePolicy } from \"./element-package-policy.js\";\nexport {\n\tassertElementPackagesAllowed,\n\tElementPackagePolicyError,\n} from \"./element-package-policy.js\";\n\n// ElementLoader primitive — truthful-promise loader. The public entry point\n// for ensureRegistered / assertRegistered.\nexport type {\n\tBackendContext,\n\tBackendOption,\n\tElementLoaderBackend,\n\tElementTag,\n\tEnsureRegisteredOptions,\n\tEsmBackendConfig,\n\tIifeBackendConfig,\n\tRegistrationFailureReason,\n} from \"./element-loader.js\";\nexport {\n\tAdapterFailure,\n\tElementAssertionError,\n\tElementLoaderError,\n\tassertRegistered,\n\tensureRegistered,\n} from \"./element-loader.js\";\nexport type {\n\tBuiltInEsmCdnProviderName,\n\tEsmBackend,\n\tEsmCdnProvider,\n\tEsmCdnProviderName,\n\tEsmCdnProviderOption,\n\tViewConfig,\n} from \"./esm-adapter.js\";\nexport {\n\tBUILT_IN_VIEWS,\n\tcreateEsmBackend,\n\tmapEsmViewElements,\n} from \"./esm-adapter.js\";\nexport type {\n\tIifeBackend,\n\tIifeBundleRetryStatus,\n} from \"./iife-adapter.js\";\nexport { createIifeBackend, DEFAULT_BUNDLE_HOST } from \"./iife-adapter.js\";\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/object/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,iCAAiC,GAAG,CAChD,GAAG,OAAY,EACX,EAAE;IACN,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAClC,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;YACvB,IACC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC;gBACtB,GAAW,CAAC,GAAG,CAAC,KAAK,IAAI;gBACzB,GAAW,CAAC,GAAG,CAAC,KAAK,SAAS,EAC9B,CAAC;gBACD,GAAW,CAAC,GAAG,CAAC,GAAI,GAAW,CAAC,GAAG,CAAC,CAAC;YACvC,CAAC;QACF,CAAC;QACD,OAAO,GAAG,CAAC;IACZ,CAAC,EAAE,EAAO,CAAC,CAAC;AACb,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAI,KAAQ,EAAK,EAAE;IAC3C,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACjD,4CAA4C;QAC5C,OAAO,KAAK,CAAC;IACd,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,wCAAwC;QACxC,OAAO,KAAK,CAAC,GAAG,CAAC,SAAS,CAAM,CAAC;IAClC,CAAC;IACD,uDAAuD;IACvD,MAAM,IAAI,GAAG,EAAO,CAAC;IACrB,KAAK,MAAM,GAAG,IAAI,KAAY,EAAE,CAAC;QAChC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;YAC9B,IAAY,CAAC,GAAG,CAAC,GAAG,SAAS,CAAE,KAAa,CAAC,GAAG,CAAC,CAAC,CAAC;QACrD,CAAC;IACF,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC,CAAC","sourcesContent":["/**\n * A problem using the spread operator merging objects is that undefined properties may override\n * defined properties, which is often NOT what you want (e.g. when providing default values). This\n * function merges objects, but ignores properties that are null or undefined.\n * @param objects The objects to merge.\n */\nexport const mergeObjectsIgnoringNullUndefined = <T extends object>(\n\t...objects: T[]\n): T => {\n\treturn objects.reduce((acc, obj) => {\n\t\tfor (const key in obj) {\n\t\t\tif (\n\t\t\t\tObject.hasOwn(obj, key) &&\n\t\t\t\t(obj as any)[key] !== null &&\n\t\t\t\t(obj as any)[key] !== undefined\n\t\t\t) {\n\t\t\t\t(acc as any)[key] = (obj as any)[key];\n\t\t\t}\n\t\t}\n\t\treturn acc;\n\t}, {} as T);\n};\n\n/**\n * Deep clone an object.\n */\nexport const cloneDeep = <T>(value: T): T => {\n\tif (value === null || typeof value !== \"object\") {\n\t\t// Primitive value (or null), just return it\n\t\treturn value;\n\t}\n\tif (Array.isArray(value)) {\n\t\t// Array: clone each element recursively\n\t\treturn value.map(cloneDeep) as T;\n\t}\n\t// Object: create a new object and clone its properties\n\tconst copy = {} as T;\n\tfor (const key in value as any) {\n\t\tif (Object.hasOwn(value, key)) {\n\t\t\t(copy as any)[key] = cloneDeep((value as any)[key]);\n\t\t}\n\t}\n\treturn copy;\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"asset-handler.js","sourceRoot":"","sources":["../../src/pie/asset-handler.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Asset Handler Utilities\n *\n * Handles image and sound upload events for authoring mode.\n * Provides default DataURL-based implementation and event management.\n */\n\nimport {\n\tDeleteImageEvent,\n\tDeleteSoundEvent,\n\ttype ImageHandler,\n\tInsertImageEvent,\n\tInsertSoundEvent,\n\ttype SoundHandler,\n} from \"../types/index.js\";\nimport { createPieLogger, isGlobalDebugEnabled } from \"./logger.js\";\nimport type { AssetHandler } from \"./types.js\";\n\nconst logger = createPieLogger(\"asset-handler\", () => isGlobalDebugEnabled());\n\n/**\n * DataURL-based asset handler (default implementation)\n *\n * Converts uploaded files to base64 data URLs.\n * Suitable for demos and local development.\n */\nexport class DataURLAssetHandler implements AssetHandler {\n\tprivate cancelled = false;\n\tprivate fileReader: FileReader | null = null;\n\n\tconstructor(private onComplete: (src: string) => void) {}\n\n\tcancel(): void {\n\t\tthis.cancelled = true;\n\t\tif (this.fileReader) {\n\t\t\tthis.fileReader.abort();\n\t\t}\n\t\tlogger.debug(\"[DataURLAssetHandler] Upload cancelled\");\n\t}\n\n\tdone(err?: Error, src?: string): void {\n\t\tif (this.cancelled) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (err) {\n\t\t\tlogger.error(\"[DataURLAssetHandler] Error during upload:\", err);\n\t\t\t// Optionally notify user of error\n\t\t\treturn;\n\t\t}\n\n\t\tif (src) {\n\t\t\tlogger.debug(\n\t\t\t\t\"[DataURLAssetHandler] Upload complete, src:\",\n\t\t\t\tsrc.substring(0, 50) + \"...\",\n\t\t\t);\n\t\t\tthis.onComplete(src);\n\t\t}\n\t}\n\n\tfileChosen(file: File): void {\n\t\tif (this.cancelled) {\n\t\t\treturn;\n\t\t}\n\n\t\tlogger.debug(\n\t\t\t\"[DataURLAssetHandler] File chosen:\",\n\t\t\tfile.name,\n\t\t\tfile.type,\n\t\t\tfile.size,\n\t\t);\n\n\t\tthis.fileReader = new FileReader();\n\n\t\tthis.fileReader.onload = (e) => {\n\t\t\tconst dataUrl = e.target?.result as string;\n\t\t\tlogger.debug(\"[DataURLAssetHandler] File converted to data URL\");\n\t\t\tthis.done(undefined, dataUrl);\n\t\t};\n\n\t\tthis.fileReader.onerror = () => {\n\t\t\tlogger.error(\"[DataURLAssetHandler] FileReader error\");\n\t\t\tthis.done(new Error(\"Failed to read file\"));\n\t\t};\n\n\t\tthis.fileReader.onprogress = (e) => {\n\t\t\tif (e.lengthComputable) {\n\t\t\t\tconst percent = (e.loaded / e.total) * 100;\n\t\t\t\tthis.progress(percent, e.loaded, e.total);\n\t\t\t}\n\t\t};\n\n\t\tthis.fileReader.readAsDataURL(file);\n\t}\n\n\tprogress(percent: number, bytes: number, total: number): void {\n\t\tlogger.debug(\n\t\t\t`[DataURLAssetHandler] Progress: ${percent.toFixed(1)}% (${bytes}/${total} bytes)`,\n\t\t);\n\t\t// Could dispatch custom event here for progress UI\n\t}\n}\n\ntype UploadHandlerLike = {\n\tcancel?: () => void;\n\tdone?: (err?: Error, src?: string) => void;\n\tprogress?: (percent: number, bytes: number, total: number) => void;\n\tfileChosen?: (file: File) => void;\n\tisPasted?: boolean;\n\tgetChosenFile?: () => File;\n};\n\nfunction toError(value: unknown, fallback: string): Error {\n\tif (value instanceof Error) {\n\t\treturn value;\n\t}\n\treturn new Error(String(value ?? fallback));\n}\n\nfunction createOnceCompletion(\n\thandler: UploadHandlerLike,\n\tdataURLHandler: DataURLAssetHandler,\n) {\n\tlet settled = false;\n\tconst originalDone = handler.done;\n\tconst originalCancel = handler.cancel;\n\n\tconst done = (err?: Error, src?: string) => {\n\t\tif (settled) {\n\t\t\treturn;\n\t\t}\n\t\tsettled = true;\n\t\tif (err) {\n\t\t\ttry {\n\t\t\t\toriginalCancel?.();\n\t\t\t} catch (cancelError) {\n\t\t\t\tlogger.error(\"[asset-handler] cancel callback failed:\", cancelError);\n\t\t\t}\n\t\t\tdataURLHandler.cancel();\n\t\t}\n\t\ttry {\n\t\t\toriginalDone?.(err, src);\n\t\t} catch (doneError) {\n\t\t\tlogger.error(\"[asset-handler] done callback failed:\", doneError);\n\t\t}\n\t};\n\n\tconst cancel = () => {\n\t\tif (settled) {\n\t\t\treturn;\n\t\t}\n\t\tsettled = true;\n\t\ttry {\n\t\t\toriginalCancel?.();\n\t\t} catch (cancelError) {\n\t\t\tlogger.error(\"[asset-handler] cancel callback failed:\", cancelError);\n\t\t}\n\t\tdataURLHandler.cancel();\n\t};\n\n\thandler.done = done;\n\thandler.cancel = cancel;\n\n\treturn {\n\t\tdone,\n\t\tcancel,\n\t\tisSettled: () => settled,\n\t};\n}\n\nfunction pickFileWithDialogLifecycle(\n\taccept: string,\n\tonCancel: () => void,\n): Promise<File | null> {\n\treturn new Promise((resolve) => {\n\t\tconst input = document.createElement(\"input\");\n\t\tinput.type = \"file\";\n\t\tinput.accept = accept;\n\n\t\tlet resolved = false;\n\t\tlet changeHandled = false;\n\t\tlet dialogOpened = false;\n\n\t\tconst cleanup = () => {\n\t\t\tinput.onchange = null;\n\t\t\twindow.removeEventListener(\"focus\", onFocus);\n\t\t\tinput.removeEventListener(\"cancel\", onCancelEvent as EventListener);\n\t\t};\n\n\t\tconst finalize = (file: File | null) => {\n\t\t\tif (resolved) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresolved = true;\n\t\t\tcleanup();\n\t\t\tresolve(file);\n\t\t};\n\n\t\tconst onFocus = () => {\n\t\t\tif (!dialogOpened || changeHandled) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdialogOpened = false;\n\t\t\twindow.setTimeout(() => {\n\t\t\t\tif (changeHandled || resolved) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst file = input.files?.[0] ?? null;\n\t\t\t\tif (!file) {\n\t\t\t\t\tonCancel();\n\t\t\t\t}\n\t\t\t\tfinalize(file);\n\t\t\t}, 300);\n\t\t};\n\n\t\tconst onCancelEvent = () => {\n\t\t\tonCancel();\n\t\t\tfinalize(null);\n\t\t};\n\n\t\tinput.onchange = () => {\n\t\t\tchangeHandled = true;\n\t\t\tdialogOpened = false;\n\t\t\tfinalize(input.files?.[0] ?? null);\n\t\t};\n\n\t\tinput.addEventListener(\"cancel\", onCancelEvent as EventListener);\n\t\twindow.addEventListener(\"focus\", onFocus);\n\t\tdialogOpened = true;\n\t\tinput.click();\n\t});\n}\n\nfunction getPastedFile(handler: UploadHandlerLike): File | null {\n\tif (!handler.isPasted || typeof handler.getChosenFile !== \"function\") {\n\t\treturn null;\n\t}\n\ttry {\n\t\treturn handler.getChosenFile() ?? null;\n\t} catch (error) {\n\t\tlogger.error(\"[asset-handler] Failed to read pasted file\", error);\n\t\treturn null;\n\t}\n}\n\n/**\n * Asset Event Manager\n *\n * Manages asset-related event listeners for configure elements.\n * Handles InsertImageEvent, DeleteImageEvent, InsertSoundEvent, DeleteSoundEvent.\n */\nexport class AssetEventManager {\n\tprivate listeners: Array<{ type: string; handler: EventListener }> = [];\n\n\tconstructor(\n\t\tprivate element: HTMLElement,\n\t\tprivate onInsertImage?: (handler: ImageHandler) => void,\n\t\tprivate onDeleteImage?: (src: string, done: (err?: Error) => void) => void,\n\t\tprivate onInsertSound?: (handler: SoundHandler) => void,\n\t\tprivate onDeleteSound?: (src: string, done: (err?: Error) => void) => void,\n\t) {}\n\n\t/**\n\t * Attach event listeners\n\t */\n\tattach(): void {\n\t\tlogger.debug(\"[AssetEventManager] Attaching event listeners\");\n\n\t\t// Insert Image Event\n\t\tif (this.onInsertImage) {\n\t\t\tconst insertImageHandler = (e: Event) => {\n\t\t\t\tconst event = e as InsertImageEvent;\n\t\t\t\tlogger.debug(\"[AssetEventManager] InsertImageEvent received\");\n\t\t\t\tthis.onInsertImage!(event.detail);\n\t\t\t};\n\t\t\tthis.element.addEventListener(InsertImageEvent.TYPE, insertImageHandler);\n\t\t\tthis.listeners.push({\n\t\t\t\ttype: InsertImageEvent.TYPE,\n\t\t\t\thandler: insertImageHandler,\n\t\t\t});\n\t\t}\n\n\t\t// Delete Image Event\n\t\tif (this.onDeleteImage) {\n\t\t\tconst deleteImageHandler = (e: Event) => {\n\t\t\t\tconst event = e as DeleteImageEvent;\n\t\t\t\tlogger.debug(\n\t\t\t\t\t\"[AssetEventManager] DeleteImageEvent received, src:\",\n\t\t\t\t\tevent.detail.src,\n\t\t\t\t);\n\t\t\t\tthis.onDeleteImage!(event.detail.src, event.detail.done);\n\t\t\t};\n\t\t\tthis.element.addEventListener(DeleteImageEvent.TYPE, deleteImageHandler);\n\t\t\tthis.listeners.push({\n\t\t\t\ttype: DeleteImageEvent.TYPE,\n\t\t\t\thandler: deleteImageHandler,\n\t\t\t});\n\t\t}\n\n\t\t// Insert Sound Event\n\t\tif (this.onInsertSound) {\n\t\t\tconst insertSoundHandler = (e: Event) => {\n\t\t\t\tconst event = e as InsertSoundEvent;\n\t\t\t\tlogger.debug(\"[AssetEventManager] InsertSoundEvent received\");\n\t\t\t\tthis.onInsertSound!(event.detail);\n\t\t\t};\n\t\t\tthis.element.addEventListener(InsertSoundEvent.TYPE, insertSoundHandler);\n\t\t\tthis.listeners.push({\n\t\t\t\ttype: InsertSoundEvent.TYPE,\n\t\t\t\thandler: insertSoundHandler,\n\t\t\t});\n\t\t}\n\n\t\t// Delete Sound Event\n\t\tif (this.onDeleteSound) {\n\t\t\tconst deleteSoundHandler = (e: Event) => {\n\t\t\t\tconst event = e as DeleteSoundEvent;\n\t\t\t\tlogger.debug(\n\t\t\t\t\t\"[AssetEventManager] DeleteSoundEvent received, src:\",\n\t\t\t\t\tevent.detail.src,\n\t\t\t\t);\n\t\t\t\tthis.onDeleteSound!(event.detail.src, event.detail.done);\n\t\t\t};\n\t\t\tthis.element.addEventListener(DeleteSoundEvent.TYPE, deleteSoundHandler);\n\t\t\tthis.listeners.push({\n\t\t\t\ttype: DeleteSoundEvent.TYPE,\n\t\t\t\thandler: deleteSoundHandler,\n\t\t\t});\n\t\t}\n\n\t\tlogger.debug(\n\t\t\t\"[AssetEventManager] Attached\",\n\t\t\tthis.listeners.length,\n\t\t\t\"event listeners\",\n\t\t);\n\t}\n\n\t/**\n\t * Detach event listeners (cleanup)\n\t */\n\tdetach(): void {\n\t\tlogger.debug(\"[AssetEventManager] Detaching event listeners\");\n\n\t\tthis.listeners.forEach(({ type, handler }) => {\n\t\t\tthis.element.removeEventListener(type, handler);\n\t\t});\n\n\t\tthis.listeners = [];\n\t\tlogger.debug(\"[AssetEventManager] All event listeners detached\");\n\t}\n}\n\n/**\n * Create default image insert handler using DataURL conversion\n */\nexport function createDefaultImageInsertHandler(\n\tonComplete: (src: string) => void,\n): (handler: ImageHandler) => void {\n\treturn (handler: ImageHandler) => {\n\t\tlogger.debug(\"[createDefaultImageInsertHandler] Creating DataURL handler\");\n\n\t\tlet completion: ReturnType<typeof createOnceCompletion> | null = null;\n\t\tconst dataURLHandler = new DataURLAssetHandler((src) => {\n\t\t\tonComplete(src);\n\t\t\tcompletion?.done(undefined, src);\n\t\t});\n\t\tcompletion = createOnceCompletion(handler, dataURLHandler);\n\t\tconst finishCancelled = () => {\n\t\t\tcompletion?.done(new Error(\"Image selection cancelled\"));\n\t\t};\n\n\t\tconst handleChosenFile = (file: File | null) => {\n\t\t\tif (!file) {\n\t\t\t\tfinishCancelled();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\thandler.fileChosen(file);\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(\n\t\t\t\t\t\"[createDefaultImageInsertHandler] fileChosen failed\",\n\t\t\t\t\terror,\n\t\t\t\t);\n\t\t\t\tcompletion?.done(toError(error, \"Image fileChosen failed\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tdataURLHandler.fileChosen(file);\n\t\t\t} catch (error) {\n\t\t\t\tcompletion?.done(toError(error, \"Image upload failed\"));\n\t\t\t}\n\t\t};\n\n\t\tconst pastedFile = getPastedFile(handler);\n\t\tif (pastedFile) {\n\t\t\thandleChosenFile(pastedFile);\n\t\t\treturn;\n\t\t}\n\t\tif (handler.isPasted) {\n\t\t\tcompletion?.done(new Error(\"Pasted image is unavailable\"));\n\t\t\treturn;\n\t\t}\n\n\t\tvoid pickFileWithDialogLifecycle(\"image/*\", finishCancelled)\n\t\t\t.then((file) => {\n\t\t\t\tif (completion?.isSettled()) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\thandleChosenFile(file);\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tcompletion?.done(toError(error, \"Image selection failed\"));\n\t\t\t});\n\t};\n}\n\n/**\n * Create default sound insert handler using DataURL conversion\n */\nexport function createDefaultSoundInsertHandler(\n\tonComplete: (src: string) => void,\n): (handler: SoundHandler) => void {\n\treturn (handler: SoundHandler) => {\n\t\tlogger.debug(\"[createDefaultSoundInsertHandler] Creating DataURL handler\");\n\n\t\tlet completion: ReturnType<typeof createOnceCompletion> | null = null;\n\t\tconst dataURLHandler = new DataURLAssetHandler((src) => {\n\t\t\tonComplete(src);\n\t\t\tcompletion?.done(undefined, src);\n\t\t});\n\t\tconst handlerLike = handler as unknown as UploadHandlerLike;\n\t\tcompletion = createOnceCompletion(handlerLike, dataURLHandler);\n\t\tconst finishCancelled = () => {\n\t\t\tcompletion?.done(new Error(\"Sound selection cancelled\"));\n\t\t};\n\n\t\tconst handleChosenFile = (file: File | null) => {\n\t\t\tif (!file) {\n\t\t\t\tfinishCancelled();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Some handlers expose fileChosen as function, while others store file directly.\n\t\t\tconst maybeFileChosen = (handlerLike as any).fileChosen;\n\t\t\tif (typeof maybeFileChosen === \"function\") {\n\t\t\t\ttry {\n\t\t\t\t\tmaybeFileChosen(file);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger.error(\n\t\t\t\t\t\t\"[createDefaultSoundInsertHandler] fileChosen failed\",\n\t\t\t\t\t\terror,\n\t\t\t\t\t);\n\t\t\t\t\tcompletion?.done(toError(error, \"Sound fileChosen failed\"));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tdataURLHandler.fileChosen(file);\n\t\t\t} catch (error) {\n\t\t\t\tcompletion?.done(toError(error, \"Sound upload failed\"));\n\t\t\t}\n\t\t};\n\n\t\tconst pastedFile = getPastedFile(handlerLike);\n\t\tif (pastedFile) {\n\t\t\thandleChosenFile(pastedFile);\n\t\t\treturn;\n\t\t}\n\t\tif (handlerLike.isPasted) {\n\t\t\tcompletion?.done(new Error(\"Pasted sound is unavailable\"));\n\t\t\treturn;\n\t\t}\n\n\t\tvoid pickFileWithDialogLifecycle(\"audio/*\", finishCancelled)\n\t\t\t.then((file) => {\n\t\t\t\tif (completion?.isSettled()) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\thandleChosenFile(file);\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tcompletion?.done(toError(error, \"Sound selection failed\"));\n\t\t\t});\n\t};\n}\n\n/**\n * Create default image delete handler (no-op for DataURL)\n */\nexport function createDefaultImageDeleteHandler(): (\n\tsrc: string,\n\tdone: (err?: Error) => void,\n) => void {\n\treturn (src: string, done: (err?: Error) => void) => {\n\t\tlogger.debug(\n\t\t\t\"[createDefaultImageDeleteHandler] Delete requested for:\",\n\t\t\tsrc.substring(0, 50),\n\t\t);\n\t\t// For DataURL, no server-side deletion needed\n\t\tdone(); // Success\n\t};\n}\n\n/**\n * Create default sound delete handler (no-op for DataURL)\n */\nexport function createDefaultSoundDeleteHandler(): (\n\tsrc: string,\n\tdone: (err?: Error) => void,\n) => void {\n\treturn (src: string, done: (err?: Error) => void) => {\n\t\tlogger.debug(\n\t\t\t\"[createDefaultSoundDeleteHandler] Delete requested for:\",\n\t\t\tsrc.substring(0, 50),\n\t\t);\n\t\t// For DataURL, no server-side deletion needed\n\t\tdone(); // Success\n\t};\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"authoring-tag.js","sourceRoot":"","sources":["../../src/pie/authoring-tag.ts"],"names":[],"mappings":"AAAA,MAAM,YAAY,GAAG,CAAC,KAAa,EAAU,EAAE,CAC9C,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAE9C;;;;GAIG;AACH,MAAM,UAAU,2BAA2B,CAC1C,MAAc,EACd,QAAgC;IAEhC,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE;QAC1D,MAAM,QAAQ,GAAG,IAAI,MAAM,CAC1B,UAAU,YAAY,CAAC,UAAU,CAAC,uBAAuB,EACzD,GAAG,CACH,CAAC;QACF,OAAO,MAAM,CAAC,OAAO,CACpB,QAAQ,EACR,CAAC,MAAM,EAAE,OAAe,EAAE,EAAE,CAAC,GAAG,OAAO,GAAG,UAAU,SAAS,CAC7D,CAAC;IACH,CAAC,EAAE,MAAM,CAAC,CAAC;AACZ,CAAC","sourcesContent":["const escapeRegExp = (value: string): string =>\n\tvalue.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\n/**\n * Rewrite exact authored custom-element tags to their authoring-mode variants.\n * Tag names are escaped because valid custom-element names may contain regexp\n * metacharacters such as dots.\n */\nexport function transformMarkupForAuthoring(\n\tmarkup: string,\n\telements: Record<string, string>,\n): string {\n\treturn Object.keys(elements).reduce((result, elementTag) => {\n\t\tconst exactTag = new RegExp(\n\t\t\t`(<\\\\/?)${escapeRegExp(elementTag)}(?=[\\\\t\\\\n\\\\f\\\\r />])`,\n\t\t\t\"g\",\n\t\t);\n\t\treturn result.replace(\n\t\t\texactTag,\n\t\t\t(_match, opening: string) => `${opening}${elementTag}-config`,\n\t\t);\n\t}, markup);\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"authoring.js","sourceRoot":"","sources":["../../src/pie/authoring.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tConfigEntity,\n\tImageHandler,\n\tPieController,\n\tPieModel,\n\tSoundHandler,\n} from \"../types/index.js\";\nimport { AssetEventManager } from \"./asset-handler.js\";\nimport { createPieLogger, isGlobalDebugEnabled } from \"./logger.js\";\nimport { findPieController } from \"./scoring.js\";\nimport type { AuthoringEnv, ConfigureElement } from \"./types.js\";\nimport { parsePackageName } from \"./utils.js\";\n\nconst logger = createPieLogger(\"authoring\", () => isGlobalDebugEnabled());\n\ntype RecordValue = Record<string, any>;\n\nexport type InitializedConfigureModel = {\n\tid: string;\n\telement: string;\n\tconfigureTag: string;\n\tconfiguration: unknown;\n};\n\nexport type AuthoringValidationResult = {\n\thasErrors: boolean;\n\tvalidatedModels: Array<PieModel & { validation?: unknown }>;\n};\n\nexport type AuthoringMediaHandlers = {\n\tonInsertImage?: (handler: ImageHandler) => void;\n\tonDeleteImage?: (src: string, done: (err?: Error) => void) => void;\n\tonInsertSound?: (handler: SoundHandler) => void;\n\tonDeleteSound?: (src: string, done: (err?: Error) => void) => void;\n};\n\nfunction isRecord(value: unknown): value is RecordValue {\n\treturn !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction packageNameWithoutVersion(packageSpec: string): string {\n\ttry {\n\t\treturn parsePackageName(packageSpec).name;\n\t} catch {\n\t\treturn packageSpec;\n\t}\n}\n\nfunction packageBaseName(packageName: string): string {\n\tconst lastSegment = packageName.split(\"/\").pop();\n\treturn lastSegment || packageName;\n}\n\nfunction lookupOwn(source: unknown, keys: string[]): unknown {\n\tif (!isRecord(source)) return undefined;\n\tfor (const key of keys) {\n\t\tif (Object.hasOwn(source, key)) {\n\t\t\treturn source[key];\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction mergeConfiguration(\n\tdeliveryConfig: unknown,\n\tauthoringConfig: unknown,\n): unknown {\n\tif (authoringConfig === undefined) {\n\t\treturn deliveryConfig ?? {};\n\t}\n\tif (isRecord(deliveryConfig) && isRecord(authoringConfig)) {\n\t\treturn {\n\t\t\t...deliveryConfig,\n\t\t\t...authoringConfig,\n\t\t};\n\t}\n\treturn authoringConfig;\n}\n\nexport function resolveConfigureConfiguration(\n\tconfiguration: Record<string, any> | undefined,\n\telementTag: string,\n\tpackageSpec: string,\n): unknown {\n\tconst versionlessPackageName = packageNameWithoutVersion(packageSpec);\n\tconst basePackageName = packageBaseName(versionlessPackageName);\n\tconst deliveryConfig = lookupOwn(configuration, [\n\t\tpackageSpec,\n\t\tversionlessPackageName,\n\t\telementTag,\n\t]);\n\tconst authoringConfig = lookupOwn(configuration?.authoring, [\n\t\telementTag,\n\t\tpackageSpec,\n\t\tversionlessPackageName,\n\t\tbasePackageName,\n\t]);\n\treturn mergeConfiguration(deliveryConfig, authoringConfig);\n}\n\nfunction findModelForConfigureElement(\n\tmodels: PieModel[],\n\tconfigureElement: Element,\n): PieModel | undefined {\n\tconst modelId = configureElement.id;\n\tif (!modelId) return undefined;\n\treturn models.find((model) => model.id === modelId);\n}\n\nfunction queryConfigureElements(\n\tcontainer: Pick<ParentNode, \"querySelectorAll\">,\n\tconfigureTag: string,\n): Element[] {\n\treturn Array.from(container.querySelectorAll(configureTag));\n}\n\nexport function initializeAuthoringConfigures(\n\tconfig: ConfigEntity,\n\tconfiguration: Record<string, any> = {},\n\toptions: {\n\t\tenv: AuthoringEnv;\n\t\tcontainer?: Pick<ParentNode, \"querySelectorAll\">;\n\t},\n): InitializedConfigureModel[] {\n\tconst container = options.container ?? document;\n\tconst initializedModels: InitializedConfigureModel[] = [];\n\n\tlogger.debug(\"[initializeAuthoringConfigures] Starting initialization\");\n\tlogger.debug(\"[initializeAuthoringConfigures] Config:\", config);\n\tlogger.debug(\"[initializeAuthoringConfigures] Configuration:\", configuration);\n\tlogger.debug(\"[initializeAuthoringConfigures] Env:\", options.env);\n\n\tif (!config?.elements || !config?.models) {\n\t\tlogger.warn(\n\t\t\t\"[initializeAuthoringConfigures] Invalid config - missing elements or models\",\n\t\t);\n\t\treturn initializedModels;\n\t}\n\n\tfor (const [elementTag, packageSpec] of Object.entries(config.elements)) {\n\t\tconst configureTag = `${elementTag}-config`;\n\t\tconst elements = queryConfigureElements(container, configureTag);\n\n\t\tlogger.debug(\n\t\t\t`[initializeAuthoringConfigures] Found ${elements.length} ${configureTag} elements`,\n\t\t);\n\n\t\tfor (const element of elements) {\n\t\t\tconst model = findModelForConfigureElement(config.models, element);\n\n\t\t\tif (!model) {\n\t\t\t\tlogger.warn(\n\t\t\t\t\t`[initializeAuthoringConfigures] No model found for ${configureTag}#${element.id || \"(missing-id)\"}`,\n\t\t\t\t);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst configureElement = element as unknown as ConfigureElement;\n\t\t\tconst elementConfiguration = resolveConfigureConfiguration(\n\t\t\t\tconfiguration,\n\t\t\t\telementTag,\n\t\t\t\tString(packageSpec),\n\t\t\t);\n\n\t\t\tconfigureElement.model = model;\n\t\t\tconfigureElement.configuration = elementConfiguration;\n\n\t\t\tinitializedModels.push({\n\t\t\t\tid: model.id,\n\t\t\t\telement: model.element,\n\t\t\t\tconfigureTag,\n\t\t\t\tconfiguration: elementConfiguration,\n\t\t\t});\n\n\t\t\tlogger.debug(\n\t\t\t\t`[initializeAuthoringConfigures] Model and configuration set for ${configureTag}#${model.id}`,\n\t\t\t\telementConfiguration,\n\t\t\t);\n\t\t}\n\t}\n\n\tlogger.debug(\"[initializeAuthoringConfigures] Initialization complete\");\n\treturn initializedModels;\n}\n\nfunction resolveValidationController(\n\tconfigureElement: Element,\n): PieController | undefined {\n\treturn findPieController(configureElement.localName);\n}\n\nfunction hasValidationErrors(validation: unknown): boolean {\n\tif (!validation || typeof validation !== \"object\") return false;\n\tconst validationRecord = validation as Record<string, unknown>;\n\tif (validationRecord.hasErrors === true) return true;\n\tconst errors = validationRecord.errors;\n\treturn Array.isArray(errors) && errors.length > 0;\n}\n\nexport async function validateAuthoringModels(\n\tconfig: ConfigEntity,\n\tconfiguration: Record<string, any> = {},\n\toptions: { container?: Pick<ParentNode, \"querySelectorAll\"> } = {},\n): Promise<AuthoringValidationResult> {\n\tconst container = options.container ?? document;\n\tconst validatedModels: AuthoringValidationResult[\"validatedModels\"] = [];\n\n\tif (!config?.elements || !config?.models) {\n\t\treturn { hasErrors: false, validatedModels };\n\t}\n\n\tfor (const [elementTag, packageSpec] of Object.entries(config.elements)) {\n\t\tconst configureTag = `${elementTag}-config`;\n\t\tconst elements = queryConfigureElements(container, configureTag);\n\n\t\tfor (const element of elements) {\n\t\t\tconst model = findModelForConfigureElement(config.models, element);\n\t\t\tif (!model) continue;\n\n\t\t\tconst controller = resolveValidationController(element);\n\t\t\tconst elementConfiguration = resolveConfigureConfiguration(\n\t\t\t\tconfiguration,\n\t\t\t\telementTag,\n\t\t\t\tString(packageSpec),\n\t\t\t);\n\t\t\tconst validation =\n\t\t\t\ttypeof controller?.validate === \"function\"\n\t\t\t\t\t? await controller.validate(model, elementConfiguration as object)\n\t\t\t\t\t: undefined;\n\n\t\t\tvalidatedModels.push({\n\t\t\t\t...model,\n\t\t\t\t...(isRecord(validation) ? validation : {}),\n\t\t\t\tid: model.id,\n\t\t\t\telement: model.element,\n\t\t\t\tvalidation,\n\t\t\t});\n\t\t}\n\t}\n\n\treturn {\n\t\thasErrors: validatedModels.some((model) =>\n\t\t\thasValidationErrors(model.validation),\n\t\t),\n\t\tvalidatedModels,\n\t};\n}\n\nfunction toError(value: unknown): Error {\n\treturn value instanceof Error\n\t\t? value\n\t\t: new Error(String(value ?? \"Unknown authoring error\"));\n}\n\nexport function createAuthoringAssetEventManager(\n\trootElement: HTMLElement,\n\thandlers: AuthoringMediaHandlers,\n\tonHandlerError: (context: string, error: Error) => void,\n): AssetEventManager {\n\treturn new AssetEventManager(\n\t\trootElement,\n\t\thandlers.onInsertImage\n\t\t\t? (handler) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\thandlers.onInsertImage?.(handler);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconst err = toError(error);\n\t\t\t\t\t\tonHandlerError(\"onInsertImage\", err);\n\t\t\t\t\t\thandler.done(err);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t: undefined,\n\t\thandlers.onDeleteImage\n\t\t\t? (src, done) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\thandlers.onDeleteImage?.(src, done);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconst err = toError(error);\n\t\t\t\t\t\tonHandlerError(\"onDeleteImage\", err);\n\t\t\t\t\t\tdone(err);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t: undefined,\n\t\thandlers.onInsertSound\n\t\t\t? (handler) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\thandlers.onInsertSound?.(handler);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconst err = toError(error);\n\t\t\t\t\t\tonHandlerError(\"onInsertSound\", err);\n\t\t\t\t\t\thandler.done(err);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t: undefined,\n\t\thandlers.onDeleteSound\n\t\t\t? (src, done) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\thandlers.onDeleteSound?.(src, done);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconst err = toError(error);\n\t\t\t\t\t\tonHandlerError(\"onDeleteSound\", err);\n\t\t\t\t\t\tdone(err);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t: undefined,\n\t);\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"component-context.js","sourceRoot":"","sources":["../../src/pie/component-context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,8DAA8D;AAC9D,MAAM,gBAAgB,GAAuB,EAAE,CAAC;AAEhD;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAAyB;IAChE,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAE/B,OAAO,GAAG,EAAE;QACX,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;YAChB,gBAAgB,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACnC,CAAC;IACF,CAAC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B;IACzC,OAAO,gBAAgB,CAAC,MAAM,GAAG,CAAC;QACjC,CAAC,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC;QAC/C,CAAC,CAAC,IAAI,CAAC;AACT,CAAC","sourcesContent":["/**\n * Component context stack for PIE mini-players.\n *\n * Used to attribute resource load failures (fonts/images/etc.) to the currently\n * active mini-player component.\n */\n\nexport type ComponentContext = {\n\tcomponentName: string;\n\telementType?: string;\n\titemId?: string;\n\ttimestamp: number;\n};\n\n// Track active components (stack-based for nested components)\nconst activeComponents: ComponentContext[] = [];\n\n/**\n * Register a component as active (call when component mounts).\n * Returns a cleanup function to call when the component unmounts.\n */\nexport function registerActiveComponent(context: ComponentContext): () => void {\n\tactiveComponents.push(context);\n\n\treturn () => {\n\t\tconst index = activeComponents.indexOf(context);\n\t\tif (index > -1) {\n\t\t\tactiveComponents.splice(index, 1);\n\t\t}\n\t};\n}\n\n/**\n * Get the current active component context (top of the stack).\n */\nexport function getCurrentComponentContext(): ComponentContext | null {\n\treturn activeComponents.length > 0\n\t\t? activeComponents[activeComponents.length - 1]\n\t\t: null;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/pie/config.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * PIE Config Module\n *\n * Configuration entity manipulation utilities.\n */\n\nimport { cloneDeep } from \"../object/index.js\";\nimport type {\n\tConfigContainerEntity,\n\tConfigEntity,\n\tPieModel,\n} from \"../types/index.js\";\nimport { parsePackageName } from \"./utils.js\";\nimport {\n\tparseVersionedTagName,\n\ttoPackageVersionedTag,\n} from \"./versioned-tag.js\";\n\nexport type PieConfigContractValidationResult = {\n\tvalid: boolean;\n\terrors: string[];\n\twarnings: string[];\n};\n\nfunction collectMarkupElementTags(markup: string): Set<string> {\n\tconst tags = new Set<string>();\n\tconst tagRegex = /<\\/?([a-zA-Z][a-zA-Z0-9._-]*)(?=[\\t\\n\\f\\r />])/g;\n\tlet match: RegExpExecArray | null = null;\n\twhile ((match = tagRegex.exec(markup)) !== null) {\n\t\tconst tagName = String(match[1] || \"\").trim();\n\t\tif (!tagName) continue;\n\t\t// PIE custom elements use custom-element naming (must include a hyphen).\n\t\tif (tagName.includes(\"-\")) {\n\t\t\ttags.add(tagName);\n\t\t}\n\t}\n\treturn tags;\n}\n\nexport const validatePieConfigContract = (\n\tconfig: unknown,\n): PieConfigContractValidationResult => {\n\tconst errors: string[] = [];\n\tconst warnings: string[] = [];\n\tif (!config || typeof config !== \"object\" || Array.isArray(config)) {\n\t\treturn {\n\t\t\tvalid: false,\n\t\t\terrors: [\"Config must be an object.\"],\n\t\t\twarnings,\n\t\t};\n\t}\n\n\tconst cfg = config as Record<string, unknown>;\n\tconst markup = cfg.markup;\n\tconst elements = cfg.elements;\n\tconst models = cfg.models;\n\n\tif (typeof markup !== \"string\") {\n\t\terrors.push(\"`markup` must be a string.\");\n\t}\n\tif (!elements || typeof elements !== \"object\" || Array.isArray(elements)) {\n\t\terrors.push(\"`elements` must be an object.\");\n\t}\n\tif (!Array.isArray(models)) {\n\t\terrors.push(\"`models` must be an array.\");\n\t}\n\tif (errors.length > 0) {\n\t\treturn { valid: false, errors, warnings };\n\t}\n\n\tconst elementMap = elements as Record<string, unknown>;\n\tconst modelList = models as Array<Record<string, unknown>>;\n\tconst elementTags = Object.keys(elementMap);\n\n\tfor (const [tagName, packageSpec] of Object.entries(elementMap)) {\n\t\tif (typeof tagName !== \"string\" || tagName.trim().length === 0) {\n\t\t\terrors.push(\"`elements` contains an empty tag name.\");\n\t\t\tcontinue;\n\t\t}\n\t\tif (typeof packageSpec !== \"string\" || packageSpec.trim().length === 0) {\n\t\t\terrors.push(`Element \"${tagName}\" must map to a non-empty package spec.`);\n\t\t\tcontinue;\n\t\t}\n\t\ttry {\n\t\t\ttoPackageVersionedTag(tagName, packageSpec);\n\t\t} catch {\n\t\t\terrors.push(\n\t\t\t\t`Element \"${tagName}\" has invalid package spec \"${packageSpec}\".`,\n\t\t\t);\n\t\t}\n\t}\n\n\tconst modelElementTags = new Set<string>();\n\tfor (const [index, model] of modelList.entries()) {\n\t\tconst modelElement = model?.element;\n\t\tif (typeof modelElement !== \"string\" || modelElement.trim().length === 0) {\n\t\t\terrors.push(\n\t\t\t\t`Model at index ${index} is missing a valid \"element\" reference.`,\n\t\t\t);\n\t\t\tcontinue;\n\t\t}\n\t\tmodelElementTags.add(modelElement);\n\t\tif (!(modelElement in elementMap)) {\n\t\t\terrors.push(\n\t\t\t\t`Model element \"${modelElement}\" is not declared in \\`elements\\`.`,\n\t\t\t);\n\t\t}\n\t}\n\n\tconst markupElementTags = collectMarkupElementTags(markup as string);\n\tfor (const tagName of markupElementTags) {\n\t\tif (!(tagName in elementMap)) {\n\t\t\terrors.push(`Markup tag \"${tagName}\" is not declared in \\`elements\\`.`);\n\t\t}\n\t}\n\n\tconst referencedTags = new Set<string>([\n\t\t...modelElementTags,\n\t\t...markupElementTags,\n\t]);\n\tfor (const tagName of elementTags) {\n\t\tif (!referencedTags.has(tagName)) {\n\t\t\twarnings.push(\n\t\t\t\t`Element \"${tagName}\" is declared in \\`elements\\` but not referenced by models or markup.`,\n\t\t\t);\n\t\t}\n\t}\n\n\treturn {\n\t\tvalid: errors.length === 0,\n\t\terrors,\n\t\twarnings,\n\t};\n};\n\nexport const assertPieConfigContract = (config: unknown): void => {\n\tconst result = validatePieConfigContract(config);\n\tif (result.valid) return;\n\tthrow new Error(`Invalid PIE config contract: ${result.errors.join(\" | \")}`);\n};\n\n/**\n * Get all models for a given npm package\n */\nexport const modelsForPackage = (\n\tpieContent: ConfigEntity,\n\tnpmPackage: string,\n): PieModel[] => {\n\tif (pieContent && pieContent.models && pieContent.elements && npmPackage) {\n\t\tconst element = elementForPackage(pieContent, npmPackage);\n\t\treturn pieContent.models.filter((m) => {\n\t\t\treturn element === m.element;\n\t\t});\n\t} else {\n\t\treturn [];\n\t}\n};\n\n/**\n * Gets the element tag defined for a package.\n * @param pieContent the pie content\n * @param npmPackage npm package name\n */\nexport const elementForPackage = (\n\tpieContent: ConfigEntity,\n\tnpmPackage: string,\n): string => {\n\tconst elems =\n\t\tpieContent && pieContent.elements\n\t\t\t? Object.keys(pieContent.elements).filter((elTag) => {\n\t\t\t\t\tconst pkg = pieContent.elements[elTag];\n\t\t\t\t\treturn (\n\t\t\t\t\t\tparsePackageName(npmPackage).name === parsePackageName(pkg).name\n\t\t\t\t\t);\n\t\t\t\t})\n\t\t\t: [];\n\tif (elems.length > 1) {\n\t\tthrow new Error(\"invalid item format: multiple elements for package.\");\n\t} else {\n\t\treturn elems[0];\n\t}\n};\n\n/**\n * Modify the markup for a package that is present in elements/model but missing from markup,\n * like is the case for rubrics for instance. It does not change the input, but returns a deep\n * copy with the (potentially) modified markup.\n * @param config the pie content\n * @param npmPackage the npm package\n * @param template a callback function for modifying the markup\n */\nexport const addMarkupForPackage = (\n\tconfig: ConfigEntity,\n\tnpmPackage: string,\n\ttemplate: (id: string, tag: string, markup: string) => string,\n): ConfigEntity => {\n\tif (!config?.markup || !npmPackage) {\n\t\treturn config;\n\t}\n\tconst elem = elementForPackage(config, npmPackage);\n\tif (elem) {\n\t\tconst model = config.models.find((m) => m.element === elem);\n\t\tif (elem && model) {\n\t\t\tconst out = cloneDeep(config);\n\t\t\tconst match = out.markup.match(new RegExp(elem));\n\t\t\tif (!match) {\n\t\t\t\tconst id = model.id;\n\t\t\t\tif (id) {\n\t\t\t\t\tout.markup = template(id, elem, out.markup);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn out;\n\t\t}\n\t}\n\treturn config;\n};\n\n/**\n * Adds rubric html to markup if the item has a rubric and this is not included in the markup (which would be typical).\n */\nexport const addRubricIfNeeded = (content: ConfigEntity): ConfigEntity => {\n\treturn addMarkupForPackage(\n\t\tcloneDeep(content),\n\t\t\"@pie-element/rubric\",\n\t\t(id, tag, markup) => {\n\t\t\treturn `\n ${markup}\n <div style='width: 75%'>\n <${tag} id='${id}'></${tag}>\n </div>\n `;\n\t\t},\n\t);\n};\n\n/**\n * We make the web component name unique by using the version number because a\n * CustomElementRegistry definition cannot be removed, updated, or replaced. A\n * distinct versioned tag gives each loaded constructor its own effective runtime\n * namespace, allowing several versions of one PIE element to coexist. The same\n * transformation must be applied to the runtime markup and model references.\n */\nexport const makeUniqueTags = <T extends ConfigContainerEntity>(\n\tcontainer: T,\n): T => {\n\t// Create mapping of original to versioned names\n\tconst elementMappings = Object.entries(container.config.elements).reduce(\n\t\t(acc, [elName, pkg]) => {\n\t\t\tconst versionedName = toPackageVersionedTag(elName, pkg as string);\n\t\t\treturn {\n\t\t\t\t...acc,\n\t\t\t\t[elName]: {\n\t\t\t\t\tversionedName,\n\t\t\t\t\tpackage: pkg as string,\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\t{} as Record<string, { versionedName: string; package: string }>,\n\t);\n\t// Transform exact opening/closing tags only. Element names may contain\n\t// regexp-significant characters, and prefix tags (pie-foo/pie-foo-bar)\n\t// are separate authored-content contracts.\n\tconst escapeRegExp = (value: string): string =>\n\t\tvalue.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\tconst replaceMarkupTag = (\n\t\tmarkup: string,\n\t\toriginalName: string,\n\t\tversionedName: string,\n\t): string => {\n\t\tconst exactTag = new RegExp(\n\t\t\t`(<\\\\/?)${escapeRegExp(originalName)}(?=[\\\\t\\\\n\\\\f\\\\r />])`,\n\t\t\t\"g\",\n\t\t);\n\t\treturn markup.replace(\n\t\t\texactTag,\n\t\t\t(_match, opening: string) => `${opening}${versionedName}`,\n\t\t);\n\t};\n\n\tconst markup = Object.entries(elementMappings).reduce(\n\t\t(currentMarkup, [originalName, { versionedName }]) =>\n\t\t\toriginalName !== versionedName\n\t\t\t\t? replaceMarkupTag(currentMarkup, originalName, versionedName)\n\t\t\t\t: currentMarkup,\n\t\tcontainer.config.markup,\n\t);\n\n\t// Create new elements object\n\tconst elements: Record<string, string> = Object.values(\n\t\telementMappings,\n\t).reduce(\n\t\t(acc, { versionedName, package: pkg }) => ({\n\t\t\t...acc,\n\t\t\t[versionedName]: pkg,\n\t\t}),\n\t\t{} as Record<string, string>,\n\t);\n\n\t// Update the 'element' property in models to use the versioned name\n\tconst models = container.config.models.map((model) => {\n\t\tconst originalElement = model.element;\n\t\tconst mapping = elementMappings[originalElement];\n\n\t\t// If we have a mapping and the element name has changed, update it\n\t\tif (mapping && mapping.versionedName !== originalElement) {\n\t\t\treturn {\n\t\t\t\t...model,\n\t\t\t\telement: mapping.versionedName,\n\t\t\t};\n\t\t}\n\n\t\t// Check if the element is already directly referenced in the new elements object\n\t\tif (elements[originalElement]) {\n\t\t\treturn model;\n\t\t}\n\n\t\t// pie-item contract compatibility: makeUniqueTags historically repaired an\n\t\t// unversioned model reference when the element map contained a versioned tag.\n\t\t// Preserve only the unambiguous case; never guess between multiple versions.\n\t\tconst baseNameMatches = Object.entries(elementMappings).filter(([key]) => {\n\t\t\tconst { baseName, existingEncodedVersion } = parseVersionedTagName(key);\n\t\t\treturn (\n\t\t\t\texistingEncodedVersion !== undefined && baseName === originalElement\n\t\t\t);\n\t\t});\n\t\tif (baseNameMatches.length === 1) {\n\t\t\tconst [, { versionedName }] = baseNameMatches[0];\n\t\t\treturn {\n\t\t\t\t...model,\n\t\t\t\telement: versionedName,\n\t\t\t};\n\t\t}\n\n\t\t// Invalid or ambiguous undeclared model references stay untouched here;\n\t\t// validation owns the error.\n\t\treturn model;\n\t});\n\n\treturn {\n\t\t...container,\n\t\tconfig: {\n\t\t\t...container.config,\n\t\t\telements,\n\t\t\tmarkup,\n\t\t\tmodels,\n\t\t},\n\t};\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"configure-initialization.js","sourceRoot":"","sources":["../../src/pie/configure-initialization.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EACN,6BAA6B,GAE7B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,MAAM,MAAM,GAAG,eAAe,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,oBAAoB,EAAE,CAAC,CAAC;AAE/E;;;;;;;GAOG;AACH,MAAM,UAAU,oCAAoC,CACnD,MAAoB,EACpB,aAAkC,EAClC,OAGC;IAED,MAAM,CAAC,KAAK,CACX,gEAAgE,CAChE,CAAC;IAEF,IAAI,CAAC,MAAM,EAAE,QAAQ,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QAC1C,MAAM,CAAC,IAAI,CACV,oFAAoF,CACpF,CAAC;QACF,OAAO,EAAE,CAAC;IACX,CAAC;IAED,iFAAiF;IACjF,KAAK,WAAW,EAAE,CAAC;IAEnB,MAAM,iBAAiB,GAAG,6BAA6B,CACtD,MAAM,EACN,aAAa,EACb,OAAO,CACP,CAAC;IACF,MAAM,CAAC,KAAK,CACX,gEAAgE,CAChE,CAAC;IACF,OAAO,iBAAiB,CAAC;AAC1B,CAAC","sourcesContent":["/**\n * Configure Element Initialization\n *\n * Handles initialization of PIE configure elements (authoring mode).\n * Parallel to initialization.ts but for configure elements with -config suffix.\n */\n\nimport type { ConfigEntity } from \"../types/index.js\";\nimport {\n\tinitializeAuthoringConfigures,\n\ttype InitializedConfigureModel,\n} from \"./authoring.js\";\nimport { createPieLogger, isGlobalDebugEnabled } from \"./logger.js\";\nimport { pieRegistry } from \"./registry.js\";\nimport type { AuthoringEnv } from \"./types.js\";\n\nconst logger = createPieLogger(\"configure-init\", () => isGlobalDebugEnabled());\n\n/**\n * Initialize configure elements from loaded bundle\n *\n * This function:\n * 1. Finds all configure elements in the DOM (elements with -config suffix)\n * 2. Sets their model and configuration properties\n * 3. Attaches event listeners for model-updated events\n */\nexport function initializeConfiguresFromLoadedBundle(\n\tconfig: ConfigEntity,\n\tconfiguration: Record<string, any>,\n\toptions: {\n\t\tenv: AuthoringEnv;\n\t\tcontainer?: Pick<ParentNode, \"querySelectorAll\">;\n\t},\n): InitializedConfigureModel[] {\n\tlogger.debug(\n\t\t\"[initializeConfiguresFromLoadedBundle] Starting initialization\",\n\t);\n\n\tif (!config?.elements || !config?.models) {\n\t\tlogger.warn(\n\t\t\t\"[initializeConfiguresFromLoadedBundle] Invalid config - missing elements or models\",\n\t\t);\n\t\treturn [];\n\t}\n\n\t// Ensure the PIE registry is initialized (side effects register global helpers).\n\tvoid pieRegistry();\n\n\tconst initializedModels = initializeAuthoringConfigures(\n\t\tconfig,\n\t\tconfiguration,\n\t\toptions,\n\t);\n\tlogger.debug(\n\t\t\"[initializeConfiguresFromLoadedBundle] Initialization complete\",\n\t);\n\treturn initializedModels;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"correct-response-env.js","sourceRoot":"","sources":["../../src/pie/correct-response-env.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,GAAQ,EAAW,EAAE,CAChE,GAAG,CAAC,IAAI,KAAK,UAAU,CAAC;AAEzB,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,GAAQ,EAAO,EAAE,CAAC,CAAC;IACxD,GAAG,GAAG;IACN,IAAI,EAAE,YAAY;CAClB,CAAC,CAAC","sourcesContent":["import type { Env } from \"../types/index.js\";\n\nexport const canPopulateCorrectResponses = (env: Env): boolean =>\n\tenv.mode !== \"evaluate\";\n\nexport const getCorrectResponseEnv = (env: Env): Env => ({\n\t...env,\n\trole: \"instructor\",\n});\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"custom-element-define.js","sourceRoot":"","sources":["../../src/pie/custom-element-define.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAS1D,MAAM,sBAAsB,GAAG,CAAC,KAAc,EAAW,EAAE;IAC1D,IAAI,OAAO,YAAY,KAAK,WAAW,IAAI,KAAK,YAAY,YAAY,EAAE,CAAC;QAC1E,OAAO,CACN,KAAK,CAAC,IAAI,KAAK,mBAAmB;YAClC,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC,iBAAiB,CAC7C,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GACd,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK;QAC7D,CAAC,CAAC,MAAM,CAAE,KAA4B,CAAC,IAAI,CAAC;QAC5C,CAAC,CAAC,EAAE,CAAC;IACP,OAAO,SAAS,KAAK,mBAAmB,CAAC;AAC1C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACxC,OAAe,EACf,kBAA4C,EAC5C,OAAO,GAAG,oBAAoB,EACX,EAAE;IACrB,MAAM,YAAY,GAAG,wBAAwB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAChE,IAAI,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;QACtC,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;IAC7D,CAAC;IAED,IAAI,CAAC;QACJ,cAAc,CAAC,MAAM,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAC;QACxD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;IACrD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,EAAE,CAAC;YACpC,MAAM,KAAK,CAAC;QACb,CAAC;QAED,IAAI,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;YACtC,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;QAC7D,CAAC;QAED,MAAM,KAAK,CAAC;IACb,CAAC;AACF,CAAC,CAAC","sourcesContent":["import { validateCustomElementTag } from \"./tag-names.js\";\n\nexport type SafeDefineStatus = \"already-defined\" | \"defined\";\n\nexport type SafeDefineResult = {\n\tstatus: SafeDefineStatus;\n\ttagName: string;\n};\n\nconst isDuplicateDefineError = (error: unknown): boolean => {\n\tif (typeof DOMException !== \"undefined\" && error instanceof DOMException) {\n\t\treturn (\n\t\t\terror.name === \"NotSupportedError\" ||\n\t\t\terror.code === DOMException.NOT_SUPPORTED_ERR\n\t\t);\n\t}\n\n\tconst maybeName =\n\t\ttypeof error === \"object\" && error !== null && \"name\" in error\n\t\t\t? String((error as { name?: unknown }).name)\n\t\t\t: \"\";\n\treturn maybeName === \"NotSupportedError\";\n};\n\nexport const defineCustomElementSafely = (\n\ttagName: string,\n\telementConstructor: CustomElementConstructor,\n\tcontext = \"custom element tag\",\n): SafeDefineResult => {\n\tconst validTagName = validateCustomElementTag(tagName, context);\n\tif (customElements.get(validTagName)) {\n\t\treturn { status: \"already-defined\", tagName: validTagName };\n\t}\n\n\ttry {\n\t\tcustomElements.define(validTagName, elementConstructor);\n\t\treturn { status: \"defined\", tagName: validTagName };\n\t} catch (error) {\n\t\tif (!isDuplicateDefineError(error)) {\n\t\t\tthrow error;\n\t\t}\n\n\t\tif (customElements.get(validTagName)) {\n\t\t\treturn { status: \"already-defined\", tagName: validTagName };\n\t\t}\n\n\t\tthrow error;\n\t}\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pie/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,SAAS;AACT,OAAO,EACN,uBAAuB,EACvB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,yBAAyB,GACzB,MAAM,aAAa,CAAC;AACrB,2EAA2E;AAC3E,qEAAqE;AACrE,iBAAiB;AACjB,OAAO,EACN,8BAA8B,EAC9B,oBAAoB,EACpB,aAAa,EACb,uBAAuB,GACvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACN,gCAAgC,EAChC,6BAA6B,EAC7B,6BAA6B,EAC7B,uBAAuB,GACvB,MAAM,gBAAgB,CAAC;AAMxB,OAAO,EACN,uBAAuB,EACvB,UAAU,EACV,eAAe,GACf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gCAAgC,EAAE,MAAM,mCAAmC,CAAC;AAErF,OAAO,EAAE,8BAA8B,EAAE,MAAM,0CAA0C,CAAC;AAC1F,qEAAqE;AACrE,yDAAyD;AACzD,mEAAmE;AACnE,OAAO,EACN,MAAM,EACN,gBAAgB,EAChB,YAAY,GACZ,MAAM,aAAa,CAAC;AAQrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAKxD,OAAO,EACN,oCAAoC,EACpC,iCAAiC,EACjC,iCAAiC,GACjC,MAAM,gCAAgC,CAAC;AAIxC,OAAO,EACN,cAAc,EACd,6BAA6B,GAC7B,MAAM,sBAAsB,CAAC;AAM9B,OAAO,EACN,gBAAgB,EAChB,0BAA0B,GAC1B,MAAM,4BAA4B,CAAC;AAKpC,OAAO,EACN,wBAAwB,EACxB,gCAAgC,GAChC,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAOpE,OAAO,EACN,cAAc,EACd,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,aAAa,EACb,mBAAmB,GACnB,MAAM,yBAAyB,CAAC;AACjC,WAAW;AACX,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,UAAU;AACV,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAW/D,OAAO,EACN,UAAU,EACV,wBAAwB,EACxB,0BAA0B;AAC1B,0BAA0B;AAC1B,cAAc,EACd,sBAAsB,EACtB,MAAM,GACN,MAAM,YAAY,CAAC;AACpB,qBAAqB;AACrB,OAAO,EACN,yBAAyB,GAGzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACN,gBAAgB,EAChB,SAAS,EACT,wBAAwB,EACxB,eAAe,GACf,MAAM,gBAAgB,CAAC;AAExB,UAAU;AACV,OAAO,EACN,gBAAgB,EAChB,iBAAiB,EACjB,uBAAuB,GACvB,MAAM,cAAc,CAAC;AAGtB,OAAO,EACN,wBAAwB,EACxB,qBAAqB,EACrB,wCAAwC,EACxC,kBAAkB,EAClB,0BAA0B,EAC1B,mCAAmC,EACnC,4BAA4B,GAC5B,MAAM,gBAAgB,CAAC;AACxB,QAAQ;AACR,OAAO,EACN,gBAAgB,EAChB,wBAAwB,EACxB,uBAAuB,EACvB,gBAAgB,GAChB,MAAM,YAAY,CAAC","sourcesContent":["/**\n * PIE Utilities Index\n *\n * Barrel export for public PIE runtime utilities.\n * Public consumers should import from this aggregate. The only supported\n * deep `pie/*` subpath is `pie/tag-names` for tag helper reuse.\n *\n * - `pie` - PIE runtime utilities, interfaces, and helpers\n * - `pie/tag-names` - Custom element tag naming helpers\n */\n\n// Config\nexport {\n\tassertPieConfigContract,\n\taddMarkupForPackage,\n\taddRubricIfNeeded,\n\telementForPackage,\n\tmakeUniqueTags,\n\tmodelsForPackage,\n\tvalidatePieConfigContract,\n} from \"./config.js\";\n// Loaders — the deep `ElementLoader` primitive (async `ensureRegistered` /\n// sync `assertRegistered`) lives under `pie-players-shared/loaders`.\n// Initialization\nexport {\n\tinitializePiesFromLoadedBundle,\n\tloadBundleFromString,\n\tloadPieModule,\n\tloadPieModuleFromString,\n} from \"./initialization.js\";\nexport {\n\tcreateAuthoringAssetEventManager,\n\tinitializeAuthoringConfigures,\n\tresolveConfigureConfiguration,\n\tvalidateAuthoringModels,\n} from \"./authoring.js\";\nexport type {\n\tAuthoringMediaHandlers,\n\tAuthoringValidationResult,\n\tInitializedConfigureModel,\n} from \"./authoring.js\";\nexport {\n\tinitializeMathRendering,\n\trenderMath,\n\tsetMathRenderer,\n} from \"./math-rendering.js\";\nexport { attachInstrumentationEventBridge } from \"./instrumentation-event-bridge.js\";\nexport type { AttachInstrumentationEventBridgeArgs } from \"./instrumentation-event-bridge.js\";\nexport { resolveInstrumentationProvider } from \"./instrumentation-provider-resolution.js\";\n// Canonical stage vocabulary (M6). Both `<pie-section-player-*>` and\n// `<pie-assessment-toolkit>` share this primitive so the\n// `pie-stage-change` event family stays coherent across CE shapes.\nexport {\n\tSTAGES,\n\tapplicableStages,\n\tstageOrdinal,\n} from \"./stages.js\";\nexport type {\n\tLoadingCompleteDetail,\n\tStage,\n\tStageChangeDetail,\n\tStageSourceCe,\n\tStageStatus,\n} from \"./stages.js\";\nexport { createStageTracker } from \"./stage-tracker.js\";\nexport type {\n\tCreateStageTrackerOptions,\n\tStageTracker,\n} from \"./stage-tracker.js\";\nexport {\n\tASSESSMENT_INSTRUMENTATION_EVENT_MAP,\n\tSECTION_INSTRUMENTATION_EVENT_MAP,\n\tTOOLKIT_INSTRUMENTATION_EVENT_MAP,\n} from \"./instrumentation-event-map.js\";\nexport type { InstrumentationEventMapping } from \"./instrumentation-event-map.js\";\n// Item controller\nexport type { ItemControllerOptions } from \"./item-controller.js\";\nexport {\n\tItemController,\n\tnormalizeItemSessionContainer,\n} from \"./item-controller.js\";\nexport type {\n\tItemSessionContainer as CanonicalItemSessionContainer,\n\tItemSessionUpdateIntent,\n\tNormalizedItemSessionChange,\n} from \"./item-session-contract.js\";\nexport {\n\thasResponseValue,\n\tnormalizeItemSessionChange,\n} from \"./item-session-contract.js\";\nexport type {\n\tItemSessionContainer,\n\tItemSessionStorageStrategy,\n} from \"./item-controller-storage.js\";\nexport {\n\tMemoryItemSessionStorage,\n\tSessionStorageItemSessionStorage,\n} from \"./item-controller-storage.js\";\n// Logging\nexport type { PieLogger } from \"./logger.js\";\nexport { createPieLogger, isGlobalDebugEnabled } from \"./logger.js\";\n// Player bootstrap helpers (used by inline/preloaded players)\nexport type {\n\tItemData,\n\tPiePlayerConfig,\n\tPiePlayerElements,\n} from \"./player-initializer.js\";\nexport {\n\tbuildApiParams,\n\tbuildEventListenersMap,\n\tensurePiePlayerLoaded,\n\textractPassageMarkup,\n\tfetchItemData,\n\tinitializePiePlayer,\n} from \"./player-initializer.js\";\n// Registry\nexport { pieRegistry } from \"./registry.js\";\n// Scoring\nexport { findPieController, scorePieItem } from \"./scoring.js\";\n// Types and interfaces\nexport type {\n\tEntry,\n\tEventListeners,\n\tEventListenersMap,\n\tLoadPieElementsOptions,\n\tPieElement,\n\tPieRegistry,\n\tUpdatePieElementOptions,\n} from \"./types.js\";\nexport {\n\tBundleType,\n\tdefaultPieElementOptions,\n\tisCustomElementConstructor,\n\t// Type guards (functions)\n\tisPieAvailable,\n\tisPieRegistryAvailable,\n\tStatus,\n} from \"./types.js\";\n// Tag naming helpers\nexport {\n\tdefineCustomElementSafely,\n\ttype SafeDefineResult,\n\ttype SafeDefineStatus,\n} from \"./custom-element-define.js\";\nexport {\n\ttoPrintHashedTag,\n\ttoViewTag,\n\tvalidateCustomElementTag,\n\tVIEW_TAG_SUFFIX,\n} from \"./tag-names.js\";\nexport type { PieViewMode } from \"./tag-names.js\";\n// Updates\nexport {\n\tupdatePieElement,\n\tupdatePieElements,\n\tupdatePieElementWithRef,\n} from \"./updates.js\";\n// URL / element override helpers\nexport type { ElementOverrides } from \"./overrides.js\";\nexport {\n\taddOrUpdateOverrideInUrl,\n\tapplyElementOverrides,\n\tapplyElementVersionOverridesPreserveTags,\n\textractPackageInfo,\n\tformatElementOverrideParam,\n\tparseElementOverridesFromCurrentUrl,\n\tparseElementOverridesFromUrl,\n} from \"./overrides.js\";\n// Utils\nexport {\n\tfindOrAddSession,\n\tgetPackageWithoutVersion,\n\tgetPieElementBundlesUrl,\n\tparsePackageName,\n} from \"./utils.js\";\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"initialization.js","sourceRoot":"","sources":["../../src/pie/initialization.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * PIE Initialization Module\n *\n * Bundle loading and element initialization logic.\n * This is the core of the PIE player system.\n */\n\nimport { BUILDER_BUNDLE_URL } from \"../config/profile.js\";\nimport { mergeObjectsIgnoringNullUndefined } from \"../object/index.js\";\nimport { wrapModelRichContent } from \"../security/wrap-model-rich-content.js\";\nimport type { ConfigEntity, Env, PieModel } from \"../types/index.js\";\nimport { editorPostFix } from \"../types/index.js\";\nimport { createPieLogger, isGlobalDebugEnabled } from \"./logger.js\";\nimport { initializeMathRendering } from \"./math-rendering.js\";\nimport { pieRegistry } from \"./registry.js\";\nimport { findPieController } from \"./scoring.js\";\nimport { defineCustomElementSafely } from \"./custom-element-define.js\";\nimport { validateCustomElementTag } from \"./tag-names.js\";\nimport type {\n\tEventListeners,\n\tLoadPieElementsOptions,\n\tPieElement,\n\tPieRegistry,\n} from \"./types.js\";\nimport {\n\tBundleType,\n\tisCustomElementConstructor,\n\tisPieAvailable,\n\tStatus,\n} from \"./types.js\";\nimport { updatePieElement } from \"./updates.js\";\nimport {\n\tfindOrAddSession,\n\tgetPackageWithoutVersion,\n\tgetPieElementBundlesUrl,\n} from \"./utils.js\";\n\n// Create module-level logger (respects global debug flag - pass function for dynamic checking)\nconst logger = createPieLogger(\"pie-initialization\", () =>\n\tisGlobalDebugEnabled(),\n);\n\n// Default options for loading PIE elements\nconst defaultOptions: LoadPieElementsOptions = {\n\tbuildServiceBase: BUILDER_BUNDLE_URL,\n\tbundleType: BundleType.player, // Default to player.js (no controllers, server-processed models)\n\tenv: { mode: \"gather\", role: \"student\" },\n};\n\n// Add this to your window types\ndeclare global {\n\tinterface Window {\n\t\t_pieElementObserver?: MutationObserver;\n\t\t_pieCurrentContext?: {\n\t\t\tconfig: ConfigEntity;\n\t\t\tsession: any[];\n\t\t\tenv?: Env;\n\t\t\tcontainer?: Element | Document;\n\t\t};\n\t}\n}\n\n/**\n * Helper function to initialize a PIE element\n */\nconst initializePieElement = (\n\telement: PieElement,\n\toptions: {\n\t\tconfig: ConfigEntity;\n\t\tsession: any[];\n\t\tenv?: Env;\n\t\teventListeners?: EventListeners;\n\t},\n): void => {\n\tconst { config, session, env, eventListeners } = options;\n\tif ((element as any).__pieInitialized) {\n\t\treturn;\n\t}\n\tconst tagName = element.tagName.toLowerCase();\n\n\tlogger.debug(`[initializePieElement] Initializing ${tagName}#${element.id}`);\n\n\t// Find model for this element\n\tlet model = config?.models?.find((m) => m.id === element.id) as PieModel;\n\tif (!model) {\n\t\t// Only warn if this element is from a client-player.js bundle (where models are expected)\n\t\t// player.js bundles use server-processed models, so missing models are expected there\n\t\tconst registry = pieRegistry();\n\t\tconst registryEntry = registry[tagName];\n\n\t\tif (registryEntry && registryEntry.bundleType === BundleType.clientPlayer) {\n\t\t\tlogger.warn(\n\t\t\t\t`[initializePieElement] Model not found for PIE element ${tagName}#${element.id} (client-player.js bundle)`,\n\t\t\t);\n\t\t}\n\t\treturn;\n\t}\n\n\t// Set session (with element property for updateSession callback)\n\tconst elementSession = findOrAddSession(session, model.id, model.element);\n\telement.session = elementSession;\n\t(element as any).__pieInitialized = true;\n\tlogger.debug(\n\t\t`[initializePieElement] Session set for ${tagName}#${element.id}:`,\n\t\telementSession,\n\t);\n\n\t// Set model - use controller if available (client-player.js), or use server-processed model (player.js)\n\tconst controller = findPieController(tagName);\n\n\tif (!env) {\n\t\tlogger.error(\n\t\t\t`[initializePieElement] ❌ FATAL: No env provided for ${tagName}`,\n\t\t);\n\t\tthrow new Error(\n\t\t\t`No env provided for ${tagName}. PIE elements require an env object with mode and role.`,\n\t\t);\n\t}\n\n\tif (!controller) {\n\t\t// No controller available - using server-processed model (player.js bundle)\n\t\tlogger.debug(\n\t\t\t`[initializePieElement] ℹ️ No controller for ${tagName}, using server-processed model`,\n\t\t);\n\t\tlogger.debug(`[initializePieElement] Model already processed by server:`, {\n\t\t\tid: model.id,\n\t\t\telement: model.element,\n\t\t\thasCorrectResponse: \"correctResponse\" in model,\n\t\t\tmode: env.mode,\n\t\t\trole: env.role,\n\t\t});\n\n\t\t// Set model directly - server already processed it\n\t\telement.model = wrapModelRichContent(model);\n\t} else {\n\t\t// Controller available - run client-side processing (client-player.js bundle)\n\t\t// Note: updatePieElementWithRef handles controller invocation\n\t\tlogger.debug(\n\t\t\t`[initializePieElement] Controller found for ${tagName}, will invoke model() function`,\n\t\t);\n\t}\n\n\t// Add event listeners\n\tif (eventListeners) {\n\t\tObject.entries(eventListeners).forEach(([evt, fn]) => {\n\t\t\telement.addEventListener(evt as any, fn);\n\t\t});\n\t}\n};\n\nconst getEditorElementTagName = (elementTagName: string, pkg: string): string =>\n\tvalidateCustomElementTag(\n\t\telementTagName + editorPostFix,\n\t\t`editor element tag for ${pkg}`,\n\t);\n\nconst updateRegisteredElement = (\n\telementTagName: string,\n\tconfig: ConfigEntity,\n\tsession: any[],\n\toptions: LoadPieElementsOptions,\n\tomitEnv = false,\n): void => {\n\tupdatePieElement(elementTagName, {\n\t\tconfig,\n\t\tsession,\n\t\t...(omitEnv ? {} : { env: options.env }),\n\t\tcontainer: options.container,\n\t\t...(options.eventListeners?.[elementTagName] && {\n\t\t\teventListeners: options.eventListeners[elementTagName],\n\t\t}),\n\t});\n};\n\n/**\n * Shared element registration logic\n * Extracted from initializePiesFromLoadedBundle and loadPieModule to eliminate ~200 lines of duplication\n * Also fixes MutationObserver memory leak by storing latest config/session in window context\n *\n * `elementModule` may be `null`. In that case we cannot register *new*\n * tags (no element constructor source), but we can still update tags\n * that another loader (e.g. the section-player's IIFE adapter) has\n * already registered with `customElements`. This is the common case\n * when `pie-item-player` mounts inside `pie-section-player`: the\n * section player has already pre-warmed the bundle through the deep\n * `ElementLoader` primitive, so the `window.pie.default` bundle-global\n * path is not required for those tags.\n */\nconst registerPieElementsFromBundle = (\n\telementModule: any | null,\n\tconfig: ConfigEntity,\n\tsession: any[],\n\tregistry: PieRegistry,\n\toptions: LoadPieElementsOptions,\n): Promise<void>[] => {\n\tconst promises: Promise<void>[] = [];\n\tconst isNodeWithinContainer = (\n\t\tnode: Node,\n\t\tcontainer?: Element | Document,\n\t): boolean => {\n\t\tif (!container || container === document) return true;\n\t\treturn node instanceof Node && container.contains(node);\n\t};\n\n\tif (elementModule) {\n\t\tlogger.debug(\n\t\t\t\"[registerPieElementsFromBundle] Available packages in bundle:\",\n\t\t\tObject.keys(elementModule),\n\t\t);\n\t} else {\n\t\tlogger.debug(\n\t\t\t\"[registerPieElementsFromBundle] No bundle module supplied; will only update tags already registered with customElements.\",\n\t\t);\n\t}\n\tlogger.debug(\n\t\t\"[registerPieElementsFromBundle] config.elements:\",\n\t\tconfig.elements,\n\t);\n\n\t// Store latest config/session in window so MutationObserver can access current values\n\tif (typeof window !== \"undefined\") {\n\t\twindow._pieCurrentContext = {\n\t\t\tconfig,\n\t\t\tsession,\n\t\t\tenv: options.env,\n\t\t\tcontainer: options.container,\n\t\t};\n\t}\n\n\tObject.entries(config.elements).forEach(([elName, pkg]) => {\n\t\tconst elementTagName = validateCustomElementTag(\n\t\t\telName,\n\t\t\t`element tag in config.elements for ${String(pkg)}`,\n\t\t);\n\t\tlogger.debug(\n\t\t\t`[registerPieElementsFromBundle] Processing element: ${elementTagName} -> ${pkg}`,\n\t\t);\n\n\t\t// Fast path — the tag is already registered with customElements\n\t\t// (typically by the host's pre-warm pipeline). We can update its\n\t\t// session/model bindings without needing the bundle module at all.\n\t\t// This branch is also the one that runs when `elementModule` is\n\t\t// `null` because `window.pie` was missing.\n\t\tif (customElements.get(elementTagName)) {\n\t\t\tupdateRegisteredElement(elementTagName, config, session, options);\n\n\t\t\tif (options.bundleType === BundleType.editor) {\n\t\t\t\tconst editorElName = getEditorElementTagName(\n\t\t\t\t\telementTagName,\n\t\t\t\t\tString(pkg),\n\t\t\t\t);\n\t\t\t\tupdateRegisteredElement(editorElName, config, session, options, true);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// From here on we are in the \"register a new tag\" branch, which\n\t\t// requires a bundle module to read the element constructor from.\n\t\tif (!elementModule) {\n\t\t\t// A missing bundle module + an unregistered tag is *not*\n\t\t\t// always an error: in the section-player composition the\n\t\t\t// host's own `ElementLoader` may register this tag\n\t\t\t// out-of-band moments later, in which case `updatePieElement`\n\t\t\t// will pick it up on the next reactive pass via the\n\t\t\t// MutationObserver / `whenDefined` paths. Log at warn so the\n\t\t\t// transient miss is still visible during diagnostics without\n\t\t\t// printing a red stack trace for a routine timing condition.\n\t\t\tlogger.warn(\n\t\t\t\t`[registerPieElementsFromBundle] Skipping \"${elementTagName}\" — no bundle module available and the tag is not yet registered. Will bind on next update if the host's loader registers it.`,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst pkgStripped = getPackageWithoutVersion(pkg as string);\n\t\tlogger.debug(\n\t\t\t`[registerPieElementsFromBundle] Package without version: \"${pkgStripped}\"`,\n\t\t);\n\n\t\tconst elementData = elementModule[pkgStripped];\n\t\tlogger.debug(\n\t\t\t`[registerPieElementsFromBundle] elementData result:`,\n\t\t\telementData ? \"FOUND\" : \"UNDEFINED\",\n\t\t);\n\n\t\tif (!elementData) {\n\t\t\tlogger.error(\n\t\t\t\t`[registerPieElementsFromBundle] ❌ Package \"${pkgStripped}\" not found in bundle!`,\n\t\t\t);\n\t\t\tlogger.error(\n\t\t\t\t`[registerPieElementsFromBundle] Lookup key: \"${pkgStripped}\"`,\n\t\t\t);\n\t\t\tlogger.error(\n\t\t\t\t`[registerPieElementsFromBundle] Available packages:`,\n\t\t\t\tObject.keys(elementModule),\n\t\t\t);\n\t\t\tthrow new Error(\n\t\t\t\t`pie ${pkgStripped} not found in ${Object.keys(elementModule)}`,\n\t\t\t);\n\t\t}\n\n\t\tlogger.debug(\n\t\t\t`[registerPieElementsFromBundle] elementData for ${pkgStripped}:`,\n\t\t\t{\n\t\t\t\thasController: !!elementData.controller,\n\t\t\t\thasElement: !!elementData.Element,\n\t\t\t\thasConfig: !!elementData.config,\n\t\t\t\tcontrollerKeys: elementData.controller\n\t\t\t\t\t? Object.keys(elementData.controller)\n\t\t\t\t\t: [],\n\t\t\t\tbundleType: options.bundleType,\n\t\t\t},\n\t\t);\n\n\t\t// Validate controller presence based on bundle type\n\t\tif (!elementData.controller) {\n\t\t\tif (options.bundleType === BundleType.clientPlayer) {\n\t\t\t\tlogger.error(\n\t\t\t\t\t`[registerPieElementsFromBundle] ❌ CRITICAL: No controller found for ${pkgStripped}!`,\n\t\t\t\t);\n\t\t\t\tlogger.error(\n\t\t\t\t\t`[registerPieElementsFromBundle] Bundle type: ${options.bundleType} (controllers required)`,\n\t\t\t\t);\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`No controller found for ${pkgStripped}. client-player.js bundles MUST include controllers!`,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tlogger.debug(\n\t\t\t\t\t`[registerPieElementsFromBundle] ℹ️ No controller found for ${pkgStripped} - using server-processed models (player.js bundle)`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t{\n\t\t\t// Register the element in our registry\n\t\t\tlogger.debug(\n\t\t\t\t`[registerPieElementsFromBundle] Registering ${elName} in registry${\n\t\t\t\t\telementData.controller\n\t\t\t\t\t\t? \" with controller\"\n\t\t\t\t\t\t: \" (no controller - server-processed models)\"\n\t\t\t\t}`,\n\t\t\t);\n\t\t\tregistry[elementTagName] = {\n\t\t\t\tpackage: pkg as string,\n\t\t\t\tstatus: Status.loading,\n\t\t\t\ttagName: elementTagName,\n\t\t\t\tcontroller: elementData.controller || null,\n\t\t\t\tconfig: elementData.config,\n\t\t\t\tbundleType: options.bundleType,\n\t\t\t};\n\n\t\t\tif (isCustomElementConstructor(elementData.Element)) {\n\t\t\t\tdefineCustomElementSafely(\n\t\t\t\t\telementTagName,\n\t\t\t\t\telementData.Element,\n\t\t\t\t\t`element tag in config.elements for ${String(pkg)}`,\n\t\t\t\t);\n\n\t\t\t\t// Initialize existing elements\n\t\t\t\tconst searchRoot = options.container || document;\n\t\t\t\tconst elements = searchRoot.querySelectorAll(elementTagName);\n\t\t\t\tlogger.debug(\n\t\t\t\t\t`[registerPieElementsFromBundle] Found ${elements.length} elements for tag '${elementTagName}'`,\n\t\t\t\t);\n\n\t\t\t\telements.forEach((el) => {\n\t\t\t\t\tinitializePieElement(el as PieElement, {\n\t\t\t\t\t\tconfig,\n\t\t\t\t\t\tsession,\n\t\t\t\t\t\tenv: options.env,\n\t\t\t\t\t\teventListeners: options.eventListeners?.[elementTagName],\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\t// Update registry status\n\t\t\t\tregistry[elementTagName] = {\n\t\t\t\t\t...registry[elementTagName],\n\t\t\t\t\tstatus: Status.loaded,\n\t\t\t\t};\n\n\t\t\t\tpromises.push(\n\t\t\t\t\tcustomElements.whenDefined(elementTagName).then(() => {\n\t\t\t\t\t\tlogger.debug(\n\t\t\t\t\t\t\t\"[registerPieElementsFromBundle] defined custom PIE element: %s\",\n\t\t\t\t\t\t\telementTagName,\n\t\t\t\t\t\t);\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\t// Setup MutationObserver that uses current context (only once)\n\t\t\t\tif (!window._pieElementObserver) {\n\t\t\t\t\twindow._pieElementObserver = new MutationObserver((mutations) => {\n\t\t\t\t\t\t// Use current context from window instead of stale closure\n\t\t\t\t\t\tconst context = window._pieCurrentContext;\n\t\t\t\t\t\tif (!context) {\n\t\t\t\t\t\t\tlogger.warn(\"[MutationObserver] No current context available\");\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmutations.forEach((mutation) => {\n\t\t\t\t\t\t\tif (mutation.type === \"childList\") {\n\t\t\t\t\t\t\t\tmutation.addedNodes.forEach((node) => {\n\t\t\t\t\t\t\t\t\tif (node.nodeType === Node.ELEMENT_NODE) {\n\t\t\t\t\t\t\t\t\t\tif (!isNodeWithinContainer(node, context.container)) {\n\t\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tconst tagName = (node as Element).tagName.toLowerCase();\n\t\t\t\t\t\t\t\t\t\tif (registry[tagName]) {\n\t\t\t\t\t\t\t\t\t\t\tinitializePieElement(node as PieElement, {\n\t\t\t\t\t\t\t\t\t\t\t\tconfig: context.config,\n\t\t\t\t\t\t\t\t\t\t\t\tsession: context.session,\n\t\t\t\t\t\t\t\t\t\t\t\tenv: context.env,\n\t\t\t\t\t\t\t\t\t\t\t\teventListeners: options.eventListeners?.[tagName],\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Check children of added nodes\n\t\t\t\t\t\t\t\t\t\t(node as Element)\n\t\t\t\t\t\t\t\t\t\t\t.querySelectorAll(\"*\")\n\t\t\t\t\t\t\t\t\t\t\t.forEach((childNode) => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\t\t\t\t!isNodeWithinContainer(childNode, context.container)\n\t\t\t\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tconst childTagName = childNode.tagName.toLowerCase();\n\t\t\t\t\t\t\t\t\t\t\t\tif (registry[childTagName]) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tinitializePieElement(childNode as PieElement, {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconfig: context.config,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsession: context.session,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tenv: context.env,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\teventListeners:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\toptions.eventListeners?.[childTagName],\n\t\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\n\t\t\t\t\twindow._pieElementObserver.observe(document.body, {\n\t\t\t\t\t\tchildList: true,\n\t\t\t\t\t\tsubtree: true,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Handle editor elements if needed\n\t\t\t\tif (options.bundleType === BundleType.editor) {\n\t\t\t\t\tif (isCustomElementConstructor(elementData.Configure)) {\n\t\t\t\t\t\tconst editorElName = getEditorElementTagName(\n\t\t\t\t\t\t\telementTagName,\n\t\t\t\t\t\t\tString(pkg),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tdefineCustomElementSafely(\n\t\t\t\t\t\t\teditorElName,\n\t\t\t\t\t\t\telementData.Configure,\n\t\t\t\t\t\t\t`editor element tag for ${String(pkg)}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tpromises.push(\n\t\t\t\t\t\t\tcustomElements.whenDefined(editorElName).then(() => {\n\t\t\t\t\t\t\t\tlogger.debug(\n\t\t\t\t\t\t\t\t\t`[registerPieElementsFromBundle] defined custom PIE editor element: ${editorElName}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlogger.error(\n\t\t\t\t\t\t\t`[registerPieElementsFromBundle] pie.Configure for ${pkgStripped} is not a valid custom element constructor.`,\n\t\t\t\t\t\t\telementData.configure,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tlogger.error(\n\t\t\t\t\t`[registerPieElementsFromBundle] pie.Element for ${pkgStripped} is not a valid custom element constructor.`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t});\n\n\treturn promises;\n};\n\n/**\n * Initialize PIE elements from a bundle that may already be loaded.\n *\n * `window.pie` is the IIFE bundle-loading global populated by\n * `loadPieModule` / `loadBundleFromString`. When the host loaded the\n * bundle through the deep `ElementLoader` primitive instead — as\n * `pie-section-player` does — the global is irrelevant: the loader\n * registers tags directly with `customElements`, so this function only\n * needs to bind models/sessions to whatever is already registered.\n *\n * Behavior:\n * - `window.pie` available → register any new tags from the bundle and\n * update bindings for already-registered tags.\n * - `window.pie` missing → fall back to the update-only path. Tags that\n * are already registered get their model/session updated; tags that\n * are not yet registered are logged at `warn` and left alone — the\n * host's loader is expected to register them imminently, after which\n * the existing `MutationObserver` / `updatePieElements` flow binds\n * them on the next reactive pass.\n *\n * The original blanket `window.pie not found; was the bundle inlined\n * correctly?` error has been removed: in the section-player + item-player\n * composition it produced a confusing red stack trace for a routine\n * timing condition that the host already handles. Genuine failures\n * (bundle not loaded by *anyone*) still surface — every unregistered tag\n * gets its own warning, and `updatePieElements` later reports any tag\n * that never resolves.\n */\nexport const initializePiesFromLoadedBundle = (\n\tconfig: ConfigEntity,\n\tsession: any[],\n\topts: LoadPieElementsOptions = {},\n): void => {\n\tconst registry = pieRegistry();\n\tconst options = mergeObjectsIgnoringNullUndefined(defaultOptions, opts);\n\n\tif (isPieAvailable(window)) {\n\t\tlogger.debug(\"[initializePiesFromLoadedBundle] window.pie available\");\n\t\tconst elementModule = window.pie.default;\n\t\tregisterPieElementsFromBundle(\n\t\t\telementModule,\n\t\t\tconfig,\n\t\t\tsession,\n\t\t\tregistry,\n\t\t\toptions,\n\t\t);\n\t\treturn;\n\t}\n\n\tlogger.debug(\n\t\t\"[initializePiesFromLoadedBundle] window.pie not present; using update-only path. Already-registered tags will be bound now; missing tags are expected to be registered by the host's loader and will bind on the next update pass.\",\n\t);\n\tregisterPieElementsFromBundle(null, config, session, registry, options);\n};\n\n/**\n * Load a PIE bundle from a URL and initialize elements\n */\nexport const loadPieModule = async (\n\tconfig: ConfigEntity,\n\tsession: any[],\n\topts: LoadPieElementsOptions = {},\n): Promise<{\n\tsession: any[];\n}> => {\n\tif (!session) {\n\t\tthrow new Error(\"session is required\");\n\t}\n\n\t// Initialize math-rendering module (required by PIE elements)\n\tawait initializeMathRendering();\n\n\tconst registry = pieRegistry();\n\tconst options = mergeObjectsIgnoringNullUndefined(defaultOptions, opts);\n\tconst url = opts.bundleUrl || getPieElementBundlesUrl(config, options);\n\tconst script = document.createElement(\"script\");\n\tscript.src = url;\n\tscript.defer = true;\n\tscript.onerror = () => {\n\t\tthrow new Error(`failed to load script: ${url}`);\n\t};\n\n\tconst loadPromise = new Promise<void>((loadResolve) => {\n\t\tscript.addEventListener(\"load\", () => {\n\t\t\tlogger.debug(\"[loadPieModule] Script loaded from:\", url);\n\t\t\tif (isPieAvailable(window)) {\n\t\t\t\tlogger.debug(\"[loadPieModule] window.pie available\");\n\t\t\t\tconst elementModule = window.pie.default;\n\n\t\t\t\t// Use shared registration logic (returns array of promises)\n\t\t\t\tconst registrationPromises = registerPieElementsFromBundle(\n\t\t\t\t\telementModule,\n\t\t\t\t\tconfig,\n\t\t\t\t\tsession,\n\t\t\t\t\tregistry,\n\t\t\t\t\toptions,\n\t\t\t\t);\n\n\t\t\t\t// Wait for all element definitions to complete\n\t\t\t\tPromise.all(registrationPromises).then(() => loadResolve());\n\t\t\t} else {\n\t\t\t\tlogger.error(\n\t\t\t\t\t\"[loadPieModule] pie var not found; is %s a proper PIE IIFE module?\",\n\t\t\t\t\turl,\n\t\t\t\t);\n\t\t\t\tloadResolve();\n\t\t\t}\n\t\t});\n\t});\n\n\tdocument.head.appendChild(script);\n\tawait loadPromise;\n\treturn { session };\n};\n\n/**\n * Load a PIE bundle from a JavaScript string into window.pie (IIFE bundles only)\n * This only registers elements and controllers - does NOT initialize them.\n * For initialization, use initializePiesFromLoadedBundle after loading.\n */\nexport const loadBundleFromString = async (bundleJs: string): Promise<void> => {\n\tawait initializeMathRendering();\n\tawait withBlobBundleUrl(\n\t\tbundleJs,\n\t\t{ stripSourceMapComment: true },\n\t\tasync (bundleUrl) => {\n\t\t\t// Create a script tag to execute the bundle\n\t\t\tconst script = document.createElement(\"script\");\n\t\t\tscript.src = bundleUrl;\n\t\t\tscript.type = \"text/javascript\"; // IIFE bundles are standard JS\n\n\t\t\t// Wait for script to load\n\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\tscript.onload = () => resolve();\n\t\t\t\tscript.onerror = () => reject(new Error(\"Failed to load bundle\"));\n\t\t\t\tdocument.head.appendChild(script);\n\t\t\t});\n\n\t\t\tlogger.debug(\"[loadBundleFromString] Bundle loaded into window.pie\");\n\t\t},\n\t);\n};\n\n/**\n * Load a PIE bundle from a JavaScript string and initialize elements\n * Convenience wrapper around loadBundleFromString + loadPieModule\n */\nexport const loadPieModuleFromString = async (\n\tbundleJs: string,\n\tconfig: ConfigEntity,\n\tsession: any[],\n\topts: LoadPieElementsOptions = {},\n): Promise<void> => {\n\tawait withBlobBundleUrl(bundleJs, {}, async (bundleUrl) => {\n\t\t// Use existing loadPieModule with the blob URL\n\t\tawait loadPieModule(config, session, { ...opts, bundleUrl });\n\t});\n};\n\nconst withBlobBundleUrl = async <T>(\n\tbundleJs: string,\n\toptions: { stripSourceMapComment?: boolean },\n\trun: (bundleUrl: string) => Promise<T>,\n): Promise<T> => {\n\tconst source = options.stripSourceMapComment\n\t\t? bundleJs.replace(/\\/\\/# sourceMappingURL=.*$/m, \"\")\n\t\t: bundleJs;\n\tconst blob = new Blob([source], { type: \"application/javascript\" });\n\tconst bundleUrl = URL.createObjectURL(blob);\n\ttry {\n\t\treturn await run(bundleUrl);\n\t} finally {\n\t\tURL.revokeObjectURL(bundleUrl);\n\t}\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"instrumentation-event-bridge.js","sourceRoot":"","sources":["../../src/pie/instrumentation-event-bridge.ts"],"names":[],"mappings":"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","sourcesContent":["import { isInstrumentationProvider } from \"../instrumentation/provider-guards.js\";\nimport type { InstrumentationProvider } from \"../instrumentation/types.js\";\nimport type { InstrumentationEventMapping } from \"./instrumentation-event-map.js\";\nimport { createPieLogger, isGlobalDebugEnabled } from \"./logger.js\";\n\nconst logger = createPieLogger(\"instrumentation-event-bridge\", () =>\n\tisGlobalDebugEnabled(),\n);\n\nexport type AttachInstrumentationEventBridgeArgs = {\n\thost: EventTarget | null | undefined;\n\tinstrumentationProvider?: unknown;\n\tcomponent: string;\n\teventMap: InstrumentationEventMapping[];\n\tstaticAttributes?: Record<string, unknown>;\n\tdebug?: boolean;\n\tdedupeWindowMs?: number;\n\tshouldTrackEvent?: (event: Event) => boolean;\n};\n\nfunction normalizeEventDetail(detail: unknown): Record<string, unknown> {\n\tif (detail && typeof detail === \"object\") {\n\t\treturn detail as Record<string, unknown>;\n\t}\n\tif (typeof detail === \"undefined\") {\n\t\treturn {};\n\t}\n\treturn { value: detail };\n}\n\nfunction warnInvalidProvider(component: string): void {\n\tlogger.warn(\n\t\t`[InstrumentationEventBridge:${component}] Ignoring invalid instrumentation provider; expected InstrumentationProvider contract`,\n\t);\n}\n\nfunction trackBridgeError(args: {\n\tprovider: InstrumentationProvider;\n\tcomponent: string;\n\terror: unknown;\n\tsourceEventName: string;\n}): void {\n\ttry {\n\t\targs.provider.trackError(\n\t\t\targs.error instanceof Error\n\t\t\t\t? args.error\n\t\t\t\t: new Error(\n\t\t\t\t\t\tString(args.error ?? \"Unknown instrumentation bridge error\"),\n\t\t\t\t\t),\n\t\t\t{\n\t\t\t\tcomponent: args.component,\n\t\t\t\terrorType: \"InstrumentationBridgeError\",\n\t\t\t\tsourceEventName: args.sourceEventName,\n\t\t\t},\n\t\t);\n\t} catch {\n\t\t// Avoid recursive failures while reporting instrumentation bridge errors.\n\t}\n}\n\nexport function attachInstrumentationEventBridge(\n\targs: AttachInstrumentationEventBridgeArgs,\n): () => void {\n\tif (!args.host || !args.eventMap.length) return () => {};\n\tif (!args.instrumentationProvider) return () => {};\n\tif (!isInstrumentationProvider(args.instrumentationProvider)) {\n\t\tif (args.debug) {\n\t\t\twarnInvalidProvider(args.component);\n\t\t}\n\t\treturn () => {};\n\t}\n\n\tconst provider = args.instrumentationProvider;\n\tconst removeListeners: Array<() => void> = [];\n\tconst dedupeWindowMs = Math.max(0, args.dedupeWindowMs ?? 0);\n\tconst recentEventMap = new Map<string, number>();\n\n\tconst computeDedupeKey = (\n\t\tmapping: InstrumentationEventMapping,\n\t\tdetail: Record<string, unknown>,\n\t): string => {\n\t\tconst summary = [\n\t\t\tdetail.assessmentId,\n\t\t\tdetail.sectionId,\n\t\t\tdetail.attemptId,\n\t\t\tdetail.itemId,\n\t\t\tdetail.canonicalItemId,\n\t\t\tdetail.sourceRuntimeId,\n\t\t]\n\t\t\t.map((value) => String(value ?? \"\"))\n\t\t\t.join(\"|\");\n\t\treturn `${mapping.instrumentationEventName}|${summary}`;\n\t};\n\n\tfor (const mapping of args.eventMap) {\n\t\tconst handler = (event: Event) => {\n\t\t\ttry {\n\t\t\t\tif (!provider.isReady()) return;\n\t\t\t\tif (args.shouldTrackEvent && !args.shouldTrackEvent(event)) return;\n\t\t\t\tconst customEvent = event as CustomEvent<unknown>;\n\t\t\t\tconst detail = normalizeEventDetail(customEvent.detail);\n\t\t\t\tconst timestamp = new Date().toISOString();\n\t\t\t\tconst mergedAttributes = {\n\t\t\t\t\t...detail,\n\t\t\t\t\t...args.staticAttributes,\n\t\t\t\t\tcomponent: args.component,\n\t\t\t\t\tsourceEventName: mapping.sourceEventName,\n\t\t\t\t\ttimestamp,\n\t\t\t\t};\n\t\t\t\tif (dedupeWindowMs > 0) {\n\t\t\t\t\tconst now = Date.now();\n\t\t\t\t\tconst dedupeKey = computeDedupeKey(mapping, mergedAttributes);\n\t\t\t\t\tconst previousTimestamp = recentEventMap.get(dedupeKey);\n\t\t\t\t\tif (\n\t\t\t\t\t\ttypeof previousTimestamp === \"number\" &&\n\t\t\t\t\t\tnow - previousTimestamp < dedupeWindowMs\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\trecentEventMap.set(dedupeKey, now);\n\t\t\t\t}\n\t\t\t\tprovider.trackEvent(mapping.instrumentationEventName, {\n\t\t\t\t\t...mergedAttributes,\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\ttrackBridgeError({\n\t\t\t\t\tprovider,\n\t\t\t\t\tcomponent: args.component,\n\t\t\t\t\terror,\n\t\t\t\t\tsourceEventName: mapping.sourceEventName,\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\n\t\targs.host.addEventListener(\n\t\t\tmapping.sourceEventName,\n\t\t\thandler as EventListener,\n\t\t);\n\t\tremoveListeners.push(() => {\n\t\t\targs.host?.removeEventListener(\n\t\t\t\tmapping.sourceEventName,\n\t\t\t\thandler as EventListener,\n\t\t\t);\n\t\t});\n\t}\n\n\treturn () => {\n\t\tfor (const removeListener of removeListeners) {\n\t\t\tremoveListener();\n\t\t}\n\t};\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"instrumentation-event-map.js","sourceRoot":"","sources":["../../src/pie/instrumentation-event-map.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,iCAAiC,GAC7C;IACC,mEAAmE;IACnE,uEAAuE;IACvE,sEAAsE;IACtE,qEAAqE;IACrE,gEAAgE;IAChE,uEAAuE;IACvE,8CAA8C;IAC9C;QACC,eAAe,EAAE,kBAAkB;QACnC,wBAAwB,EAAE,0BAA0B;KACpD;IACD;QACC,eAAe,EAAE,eAAe;QAChC,wBAAwB,EAAE,2BAA2B;KACrD;IACD;QACC,eAAe,EAAE,mBAAmB;QACpC,wBAAwB,EAAE,+BAA+B;KACzD;IACD;QACC,eAAe,EAAE,eAAe;QAChC,wBAAwB,EAAE,mBAAmB;KAC7C;IACD;QACC,eAAe,EAAE,eAAe;QAChC,wBAAwB,EAAE,2BAA2B;KACrD;IACD;QACC,eAAe,EAAE,iBAAiB;QAClC,wBAAwB,EAAE,6BAA6B;KACvD;CACD,CAAC;AAEH,MAAM,CAAC,MAAM,iCAAiC,GAC7C;IACC,uEAAuE;IACvE,mEAAmE;IACnE,mEAAmE;IACnE,qEAAqE;IACrE,mEAAmE;IACnE,sCAAsC;IACtC;QACC,eAAe,EAAE,kBAAkB;QACnC,wBAAwB,EAAE,0BAA0B;KACpD;IACD;QACC,eAAe,EAAE,sBAAsB;QACvC,wBAAwB,EAAE,8BAA8B;KACxD;IACD;QACC,eAAe,EAAE,iBAAiB;QAClC,wBAAwB,EAAE,6BAA6B;KACvD;IACD;QACC,eAAe,EAAE,qBAAqB;QACtC,wBAAwB,EAAE,iCAAiC;KAC3D;IACD;QACC,eAAe,EAAE,iBAAiB;QAClC,wBAAwB,EAAE,6BAA6B;KACvD;IACD;QACC,eAAe,EAAE,uBAAuB;QACxC,wBAAwB,EAAE,mCAAmC;KAC7D;IACD;QACC,eAAe,EAAE,uBAAuB;QACxC,wBAAwB,EAAE,mCAAmC;KAC7D;CACD,CAAC;AAEH,MAAM,CAAC,MAAM,oCAAoC,GAChD;IACC;QACC,eAAe,EAAE,6BAA6B;QAC9C,wBAAwB,EAAE,iCAAiC;KAC3D;IACD;QACC,eAAe,EAAE,iCAAiC;QAClD,wBAAwB,EAAE,qCAAqC;KAC/D;IACD;QACC,eAAe,EAAE,0BAA0B;QAC3C,wBAAwB,EAAE,8BAA8B;KACxD;IACD;QACC,eAAe,EAAE,4BAA4B;QAC7C,wBAAwB,EAAE,gCAAgC;KAC1D;IACD;QACC,eAAe,EAAE,4BAA4B;QAC7C,wBAAwB,EAAE,gCAAgC;KAC1D;IACD;QACC,eAAe,EAAE,6BAA6B;QAC9C,wBAAwB,EAAE,iCAAiC;KAC3D;IACD;QACC,eAAe,EAAE,qCAAqC;QACtD,wBAAwB,EAAE,yCAAyC;KACnE;IACD;QACC,eAAe,EAAE,kBAAkB;QACnC,wBAAwB,EAAE,sBAAsB;KAChD;CACD,CAAC","sourcesContent":["export type InstrumentationEventMapping = {\n\tsourceEventName: string;\n\tinstrumentationEventName: string;\n};\n\nexport const TOOLKIT_INSTRUMENTATION_EVENT_MAP: InstrumentationEventMapping[] =\n\t[\n\t\t// M6 canonical readiness vocabulary. The four-stage canonical list\n\t\t// (`composed`, `engine-ready`, `interactive`, `disposed`) is identical\n\t\t// across the toolkit CE and the layout CEs — the M6 retro removed the\n\t\t// `attached`, `runtime-bound`, and `ui-rendered` stages because they\n\t\t// had zero internal or external consumers. Hosts listen for the\n\t\t// DOM-prefixed name directly (`pie-stage-change`); the instrumentation\n\t\t// bridge forwards the same name to telemetry.\n\t\t{\n\t\t\tsourceEventName: \"pie-stage-change\",\n\t\t\tinstrumentationEventName: \"pie-toolkit-stage-change\",\n\t\t},\n\t\t{\n\t\t\tsourceEventName: \"runtime-owned\",\n\t\t\tinstrumentationEventName: \"pie-toolkit-runtime-owned\",\n\t\t},\n\t\t{\n\t\t\tsourceEventName: \"runtime-inherited\",\n\t\t\tinstrumentationEventName: \"pie-toolkit-runtime-inherited\",\n\t\t},\n\t\t{\n\t\t\tsourceEventName: \"toolkit-ready\",\n\t\t\tinstrumentationEventName: \"pie-toolkit-ready\",\n\t\t},\n\t\t{\n\t\t\tsourceEventName: \"section-ready\",\n\t\t\tinstrumentationEventName: \"pie-toolkit-section-ready\",\n\t\t},\n\t\t{\n\t\t\tsourceEventName: \"framework-error\",\n\t\t\tinstrumentationEventName: \"pie-toolkit-framework-error\",\n\t\t},\n\t];\n\nexport const SECTION_INSTRUMENTATION_EVENT_MAP: InstrumentationEventMapping[] =\n\t[\n\t\t// M6 canonical readiness vocabulary. Hosts listen for the DOM-prefixed\n\t\t// names directly (`pie-stage-change`, `pie-loading-complete`); the\n\t\t// instrumentation bridge forwards the same names to telemetry. The\n\t\t// readiness alias mappings (`readiness-change`, `interaction-ready`,\n\t\t// `ready`) and the `section-controller-ready` mapping were removed\n\t\t// alongside their DOM-event surfaces.\n\t\t{\n\t\t\tsourceEventName: \"pie-stage-change\",\n\t\t\tinstrumentationEventName: \"pie-section-stage-change\",\n\t\t},\n\t\t{\n\t\t\tsourceEventName: \"pie-loading-complete\",\n\t\t\tinstrumentationEventName: \"pie-section-loading-complete\",\n\t\t},\n\t\t{\n\t\t\tsourceEventName: \"session-changed\",\n\t\t\tinstrumentationEventName: \"pie-section-session-changed\",\n\t\t},\n\t\t{\n\t\t\tsourceEventName: \"composition-changed\",\n\t\t\tinstrumentationEventName: \"pie-section-composition-changed\",\n\t\t},\n\t\t{\n\t\t\tsourceEventName: \"framework-error\",\n\t\t\tinstrumentationEventName: \"pie-section-framework-error\",\n\t\t},\n\t\t{\n\t\t\tsourceEventName: \"element-preload-retry\",\n\t\t\tinstrumentationEventName: \"pie-section-element-preload-retry\",\n\t\t},\n\t\t{\n\t\t\tsourceEventName: \"element-preload-error\",\n\t\t\tinstrumentationEventName: \"pie-section-element-preload-error\",\n\t\t},\n\t];\n\nexport const ASSESSMENT_INSTRUMENTATION_EVENT_MAP: InstrumentationEventMapping[] =\n\t[\n\t\t{\n\t\t\tsourceEventName: \"assessment-controller-ready\",\n\t\t\tinstrumentationEventName: \"pie-assessment-controller-ready\",\n\t\t},\n\t\t{\n\t\t\tsourceEventName: \"assessment-navigation-requested\",\n\t\t\tinstrumentationEventName: \"pie-assessment-navigation-requested\",\n\t\t},\n\t\t{\n\t\t\tsourceEventName: \"assessment-route-changed\",\n\t\t\tinstrumentationEventName: \"pie-assessment-route-changed\",\n\t\t},\n\t\t{\n\t\t\tsourceEventName: \"assessment-session-applied\",\n\t\t\tinstrumentationEventName: \"pie-assessment-session-applied\",\n\t\t},\n\t\t{\n\t\t\tsourceEventName: \"assessment-session-changed\",\n\t\t\tinstrumentationEventName: \"pie-assessment-session-changed\",\n\t\t},\n\t\t{\n\t\t\tsourceEventName: \"assessment-progress-changed\",\n\t\t\tinstrumentationEventName: \"pie-assessment-progress-changed\",\n\t\t},\n\t\t{\n\t\t\tsourceEventName: \"assessment-submission-state-changed\",\n\t\t\tinstrumentationEventName: \"pie-assessment-submission-state-changed\",\n\t\t},\n\t\t{\n\t\t\tsourceEventName: \"assessment-error\",\n\t\t\tinstrumentationEventName: \"pie-assessment-error\",\n\t\t},\n\t];\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"instrumentation-provider-resolution.js","sourceRoot":"","sources":["../../src/pie/instrumentation-provider-resolution.ts"],"names":[],"mappings":"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","sourcesContent":["import { isInstrumentationProvider } from \"../instrumentation/provider-guards.js\";\nimport { NewRelicInstrumentationProvider } from \"../instrumentation/providers/NewRelicInstrumentationProvider.js\";\nimport { createPieLogger, isGlobalDebugEnabled } from \"./logger.js\";\n\ntype UnknownRecord = Record<string, unknown>;\ntype ProviderCandidate =\n\t| { kind: \"unset\" }\n\t| { kind: \"null\" }\n\t| { kind: \"value\"; value: unknown };\n\nfunction asRecord(value: unknown): UnknownRecord {\n\treturn value && typeof value === \"object\" ? (value as UnknownRecord) : {};\n}\n\nfunction resolveLoaderConfig(playerLike: unknown): UnknownRecord | null {\n\tconst player = asRecord(playerLike);\n\tconst loaderConfig = asRecord(player.loaderConfig);\n\treturn Object.keys(loaderConfig).length > 0 ? loaderConfig : null;\n}\n\nfunction resolveProviderFromLoaderConfig(\n\tloaderConfig: UnknownRecord | null,\n): ProviderCandidate {\n\tif (!loaderConfig || !(\"instrumentationProvider\" in loaderConfig)) {\n\t\treturn { kind: \"unset\" };\n\t}\n\tconst provider = loaderConfig.instrumentationProvider;\n\tif (provider === null) return { kind: \"null\" };\n\tif (typeof provider === \"undefined\") return { kind: \"unset\" };\n\treturn { kind: \"value\", value: provider };\n}\n\nfunction resolveTrackPageActionsFromLoaderConfig(\n\tloaderConfig: UnknownRecord | null,\n): boolean | undefined {\n\tif (!loaderConfig || !(\"trackPageActions\" in loaderConfig)) return undefined;\n\tconst trackPageActions = loaderConfig.trackPageActions;\n\treturn typeof trackPageActions === \"boolean\" ? trackPageActions : undefined;\n}\n\nfunction selectProviderCandidate(\n\truntimeCandidate: ProviderCandidate,\n\ttopLevelCandidate: ProviderCandidate,\n): ProviderCandidate {\n\tif (runtimeCandidate.kind === \"value\" || runtimeCandidate.kind === \"null\") {\n\t\treturn runtimeCandidate;\n\t}\n\treturn topLevelCandidate;\n}\n\nlet defaultProvider: NewRelicInstrumentationProvider | undefined;\nconst logger = createPieLogger(\"instrumentation-provider-resolution\", () =>\n\tisGlobalDebugEnabled(),\n);\n\nfunction getDefaultInstrumentationProvider(): NewRelicInstrumentationProvider {\n\tif (!defaultProvider) {\n\t\tdefaultProvider = new NewRelicInstrumentationProvider();\n\t\t// New Relic provider sets readiness based on window.newrelic.\n\t\tvoid defaultProvider.initialize();\n\t}\n\treturn defaultProvider;\n}\n\nexport function resolveInstrumentationProvider(args: {\n\truntimePlayer?: unknown;\n\tplayer?: unknown;\n\tdebug?: boolean;\n\tcomponent?: string;\n}): unknown {\n\tconst runtimeLoaderConfig = resolveLoaderConfig(args.runtimePlayer);\n\tconst topLevelLoaderConfig = resolveLoaderConfig(args.player);\n\tconst runtimeTrackPageActions =\n\t\tresolveTrackPageActionsFromLoaderConfig(runtimeLoaderConfig);\n\tconst topLevelTrackPageActions =\n\t\tresolveTrackPageActionsFromLoaderConfig(topLevelLoaderConfig);\n\tconst trackPageActions =\n\t\truntimeTrackPageActions ?? topLevelTrackPageActions ?? false;\n\tconst candidateProvider = selectProviderCandidate(\n\t\tresolveProviderFromLoaderConfig(runtimeLoaderConfig),\n\t\tresolveProviderFromLoaderConfig(topLevelLoaderConfig),\n\t);\n\tif (candidateProvider.kind === \"null\") return undefined;\n\tif (candidateProvider.kind === \"unset\") {\n\t\treturn trackPageActions ? getDefaultInstrumentationProvider() : undefined;\n\t}\n\tif (isInstrumentationProvider(candidateProvider.value)) {\n\t\treturn candidateProvider.value;\n\t}\n\tif (args.debug) {\n\t\tconst prefix = args.component ? `[${args.component}] ` : \"\";\n\t\tlogger.warn(\n\t\t\t`${prefix}Ignoring invalid instrumentation provider; expected InstrumentationProvider contract`,\n\t\t);\n\t}\n\treturn undefined;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"item-controller-storage.js","sourceRoot":"","sources":["../../src/pie/item-controller-storage.ts"],"names":[],"mappings":"AAaA,MAAM,OAAO,wBAAwB;IAC5B,KAAK,GAAG,IAAI,GAAG,EAAgC,CAAC;IAExD,IAAI,CAAC,GAAW;QACf,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;IACpC,CAAC;IAED,IAAI,CAAC,GAAW,EAAE,OAA6B;QAC9C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,GAAW;QAChB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;CACD;AAED,MAAM,OAAO,gCAAgC;IAG5C,IAAI,CAAC,GAAW;QACf,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,OAAO,IAAI,CAAC;QAC/C,IAAI,CAAC;YACJ,MAAM,GAAG,GAAG,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC/C,IAAI,CAAC,GAAG;gBAAE,OAAO,IAAI,CAAC;YACtB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyB,CAAC;QAChD,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,IAAI,CAAC;QACb,CAAC;IACF,CAAC;IAED,IAAI,CAAC,GAAW,EAAE,OAA6B;QAC9C,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,OAAO;QAC1C,IAAI,CAAC;YACJ,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7D,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACX,CAAC;IAED,KAAK,CAAC,GAAW;QAChB,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,OAAO;QAC1C,IAAI,CAAC;YACJ,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACX,CAAC;CACD","sourcesContent":["export type ItemSessionContainer = {\n\tid: string;\n\tdata: any[];\n};\n\nexport interface ItemSessionStorageStrategy {\n\tload(\n\t\tkey: string,\n\t): ItemSessionContainer | null | Promise<ItemSessionContainer | null>;\n\tsave(key: string, session: ItemSessionContainer): void | Promise<void>;\n\tclear?(key: string): void | Promise<void>;\n}\n\nexport class MemoryItemSessionStorage implements ItemSessionStorageStrategy {\n\tprivate store = new Map<string, ItemSessionContainer>();\n\n\tload(key: string): ItemSessionContainer | null {\n\t\treturn this.store.get(key) ?? null;\n\t}\n\n\tsave(key: string, session: ItemSessionContainer): void {\n\t\tthis.store.set(key, session);\n\t}\n\n\tclear(key: string): void {\n\t\tthis.store.delete(key);\n\t}\n}\n\nexport class SessionStorageItemSessionStorage\n\timplements ItemSessionStorageStrategy\n{\n\tload(key: string): ItemSessionContainer | null {\n\t\tif (typeof window === \"undefined\") return null;\n\t\ttry {\n\t\t\tconst raw = window.sessionStorage.getItem(key);\n\t\t\tif (!raw) return null;\n\t\t\treturn JSON.parse(raw) as ItemSessionContainer;\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tsave(key: string, session: ItemSessionContainer): void {\n\t\tif (typeof window === \"undefined\") return;\n\t\ttry {\n\t\t\twindow.sessionStorage.setItem(key, JSON.stringify(session));\n\t\t} catch {}\n\t}\n\n\tclear(key: string): void {\n\t\tif (typeof window === \"undefined\") return;\n\t\ttry {\n\t\t\twindow.sessionStorage.removeItem(key);\n\t\t} catch {}\n\t}\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"item-controller.js","sourceRoot":"","sources":["../../src/pie/item-controller.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,wBAAwB,GAGxB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACN,gBAAgB,EAChB,gBAAgB,EAChB,uBAAuB,EACvB,6BAA6B,IAAI,yBAAyB,EAC1D,0BAA0B,GAC1B,MAAM,4BAA4B,CAAC;AAepC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAE9B,SAAS,YAAY,CAAC,OAA6B;IAClD,IAAI,CAAC;QACJ,OAAO,eAAe,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACR,OAAO;YACN,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;SACpD,CAAC;IACH,CAAC;AACF,CAAC;AAED,MAAM,OAAO,cAAc;IAClB,OAAO,CAA6B;IACpC,OAAO,CAAuB;IAC9B,UAAU,CAAS;IACnB,SAAS,CAAS;IAClB,MAAM,CAAS;IAEvB,YAAY,OAA8B;QACzC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,wBAAwB,EAAE,CAAC;QACjE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,UAAU;YACd,OAAO,CAAC,UAAU,IAAI,0BAA0B,OAAO,CAAC,MAAM,EAAE,CAAC;QAClE,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,kBAAkB,CAAC;QACzD,IAAI,CAAC,OAAO,GAAG,yBAAyB,CACvC,OAAO,CAAC,cAAc,EACtB,IAAI,CAAC,SAAS,CACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACZ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACxD,IAAI,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC,OAAO,GAAG,yBAAyB,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,OAAO;QACZ,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,cAAc;QACnB,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC7C,CAAC;IAED,UAAU;QACT,OAAO,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,UAAU,CACT,KAAc,EACd,UAA6B,EAAE;QAE/B,MAAM,IAAI,GAAG,yBAAyB,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9D,MAAM,sBAAsB,GAAG,OAAO,CAAC,sBAAsB,IAAI,KAAK,CAAC;QACvE,IACC,CAAC,sBAAsB;YACvB,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC;YAC9B,CAAC,gBAAgB,CAAC,IAAI,CAAC;YACvB,CAAC,gBAAgB,CAAC,IAAI,CAAC,EACtB,CAAC;YACF,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC;QAC1B,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAC/B,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC;IAC1B,CAAC;IAED;;;;;;;;;;;OAWG;IACH,mBAAmB,CAClB,SAAiB,EACjB,UAAmC,EACnC,UAAiC,EAAE;QAEnC,IAAI,CAAC,OAAO,GAAG,uBAAuB,CACrC,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,IAAI,CAAC,SAAS,EACjC,IAAI,CAAC,OAAO,EACZ,SAAS,EACT,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,UAAU,EAAE,CAChC,CAAC;QACF,IAAI,OAAO,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YAC9B,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC;IAC1B,CAAC;IAED,qBAAqB,CACpB,MAAe,EACf,UAA6B,EAAE;QAE/B,MAAM,UAAU,GAAG,0BAA0B,CAAC;YAC7C,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,IAAI,CAAC,MAAM;YACtC,aAAa,EAAE,MAAM;YACrB,mBAAmB,EAAE,IAAI,CAAC,OAAO;SACjC,CAAC,CAAC;QACH,IAAI,UAAU,CAAC,MAAM,KAAK,eAAe,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;YAClE,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC;QAC1B,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACrD,CAAC;CACD;AAED,MAAM,CAAC,MAAM,6BAA6B,GAAG,yBAAyB,CAAC","sourcesContent":["import {\n\tMemoryItemSessionStorage,\n\ttype ItemSessionContainer,\n\ttype ItemSessionStorageStrategy,\n} from \"./item-controller-storage.js\";\nimport {\n\thasResponseField,\n\thasResponseValue,\n\tmergeElementIntoSession,\n\tnormalizeItemSessionContainer as normalizeSessionContainer,\n\tnormalizeItemSessionChange,\n} from \"./item-session-contract.js\";\n\nexport type ItemControllerOptions = {\n\titemId: string;\n\tstorageKey?: string;\n\tsessionId?: string;\n\tinitialSession?: unknown;\n\tstorage?: ItemSessionStorageStrategy;\n};\n\ntype SetSessionOptions = {\n\tpersist?: boolean;\n\tallowMetadataOverwrite?: boolean;\n};\n\nconst DEFAULT_SESSION_ID = \"\";\n\nfunction cloneSession(session: ItemSessionContainer): ItemSessionContainer {\n\ttry {\n\t\treturn structuredClone(session);\n\t} catch {\n\t\treturn {\n\t\t\tid: session.id,\n\t\t\tdata: JSON.parse(JSON.stringify(session.data ?? [])),\n\t\t};\n\t}\n}\n\nexport class ItemController {\n\tprivate storage: ItemSessionStorageStrategy;\n\tprivate session: ItemSessionContainer;\n\tprivate storageKey: string;\n\tprivate sessionId: string;\n\tprivate itemId: string;\n\n\tconstructor(options: ItemControllerOptions) {\n\t\tthis.storage = options.storage ?? new MemoryItemSessionStorage();\n\t\tthis.itemId = options.itemId;\n\t\tthis.storageKey =\n\t\t\toptions.storageKey ?? `pie:item-controller:v1:${options.itemId}`;\n\t\tthis.sessionId = options.sessionId ?? DEFAULT_SESSION_ID;\n\t\tthis.session = normalizeSessionContainer(\n\t\t\toptions.initialSession,\n\t\t\tthis.sessionId,\n\t\t);\n\t}\n\n\tasync hydrate(): Promise<ItemSessionContainer> {\n\t\tconst loaded = await this.storage.load(this.storageKey);\n\t\tif (loaded) {\n\t\t\tthis.session = normalizeSessionContainer(loaded, this.sessionId);\n\t\t}\n\t\treturn this.getSession();\n\t}\n\n\tasync persist(): Promise<void> {\n\t\tawait this.storage.save(this.storageKey, this.session);\n\t}\n\n\tasync clearPersisted(): Promise<void> {\n\t\tawait this.storage.clear?.(this.storageKey);\n\t}\n\n\tgetSession(): ItemSessionContainer {\n\t\treturn cloneSession(this.session);\n\t}\n\n\tsetSession(\n\t\tinput: unknown,\n\t\toptions: SetSessionOptions = {},\n\t): ItemSessionContainer {\n\t\tconst next = normalizeSessionContainer(input, this.sessionId);\n\t\tconst allowMetadataOverwrite = options.allowMetadataOverwrite ?? false;\n\t\tif (\n\t\t\t!allowMetadataOverwrite &&\n\t\t\thasResponseValue(this.session) &&\n\t\t\t!hasResponseValue(next) &&\n\t\t\t!hasResponseField(next)\n\t\t) {\n\t\t\treturn this.getSession();\n\t\t}\n\t\tthis.session = next;\n\t\tif (options.persist !== false) {\n\t\t\tvoid this.persist();\n\t\t}\n\t\treturn this.getSession();\n\t}\n\n\t/**\n\t * Merge derived, non-response element state (e.g. a controller's persisted\n\t * shuffle order) into the authoritative session for a single element entry.\n\t *\n\t * Unlike {@link setSession}, this deliberately bypasses the response-protection\n\t * guard: the merged `properties` are element-derived metadata (no `value`), so\n\t * they must never be blocked by, nor mistaken for, a student response. The\n\t * shallow merge preserves any existing response on the entry.\n\t *\n\t * Defaults to `persist: false` — shuffle order rides along with the next genuine\n\t * response save rather than triggering its own persistence.\n\t */\n\tmergeElementSession(\n\t\telementId: string,\n\t\tproperties: Record<string, unknown>,\n\t\toptions: { persist?: boolean } = {},\n\t): ItemSessionContainer {\n\t\tthis.session = mergeElementIntoSession(\n\t\t\tthis.session.id || this.sessionId,\n\t\t\tthis.session,\n\t\t\telementId,\n\t\t\t{ id: elementId, ...properties },\n\t\t);\n\t\tif (options.persist === true) {\n\t\t\tvoid this.persist();\n\t\t}\n\t\treturn this.getSession();\n\t}\n\n\tupdateFromEventDetail(\n\t\tdetail: unknown,\n\t\toptions: SetSessionOptions = {},\n\t): ItemSessionContainer {\n\t\tconst normalized = normalizeItemSessionChange({\n\t\t\titemId: this.session.id || this.itemId,\n\t\t\tsessionDetail: detail,\n\t\t\tpreviousItemSession: this.session,\n\t\t});\n\t\tif (normalized.intent === \"metadata-only\" || !normalized.session) {\n\t\t\treturn this.getSession();\n\t\t}\n\t\treturn this.setSession(normalized.session, options);\n\t}\n}\n\nexport const normalizeItemSessionContainer = normalizeSessionContainer;\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"item-session-contract.js","sourceRoot":"","sources":["../../src/pie/item-session-contract.ts"],"names":[],"mappings":"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","sourcesContent":["export type ItemSessionContainer = {\n\tid: string;\n\tdata: unknown[];\n};\n\nexport type ItemSessionUpdateIntent =\n\t| \"replace-item-session\"\n\t| \"merge-element-session\"\n\t| \"metadata-only\";\n\nexport type NormalizedItemSessionChange = {\n\titemId: string;\n\tsession: ItemSessionContainer | null;\n\tintent: ItemSessionUpdateIntent;\n\tcomponent?: string;\n\tcomplete?: boolean;\n};\n\nconst DEFAULT_SESSION_ID = \"\";\nconst METADATA_ONLY_SESSION_KEYS = new Set([\n\t\"complete\",\n\t\"component\",\n\t\"timestamp\",\n\t\"sourceRuntimeId\",\n]);\nconst ELEMENT_IDENTITY_SESSION_KEYS = new Set([\n\t\"id\",\n\t\"element\",\n\t...METADATA_ONLY_SESSION_KEYS,\n]);\n\nfunction areSessionContainersEqual(\n\tleft: ItemSessionContainer | null,\n\tright: ItemSessionContainer | null,\n): boolean {\n\tif (!left && !right) return true;\n\tif (!left || !right) return false;\n\tif ((left.id || \"\") !== (right.id || \"\")) return false;\n\ttry {\n\t\treturn JSON.stringify(left.data || []) === JSON.stringify(right.data || []);\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction alignPreviousSessionIdForRendererSnapshot(\n\tcandidate: ItemSessionContainer,\n\tprevious: ItemSessionContainer | null,\n): ItemSessionContainer | null {\n\tif (!previous || candidate.id !== \"\") return previous;\n\treturn {\n\t\t...previous,\n\t\tid: \"\",\n\t};\n}\n\nexport function normalizeItemSessionContainer(\n\tinput: unknown,\n\tfallbackSessionId: string = DEFAULT_SESSION_ID,\n): ItemSessionContainer {\n\tif (input && typeof input === \"object\") {\n\t\tconst candidate = input as Record<string, unknown>;\n\t\tif (Array.isArray(candidate.data)) {\n\t\t\treturn {\n\t\t\t\tid: typeof candidate.id === \"string\" ? candidate.id : fallbackSessionId,\n\t\t\t\tdata: candidate.data,\n\t\t\t};\n\t\t}\n\t\tif (Array.isArray(input)) {\n\t\t\treturn { id: fallbackSessionId, data: input };\n\t\t}\n\t\treturn { id: fallbackSessionId, data: [input] };\n\t}\n\tif (Array.isArray(input)) {\n\t\treturn { id: fallbackSessionId, data: input };\n\t}\n\treturn { id: fallbackSessionId, data: [] };\n}\n\nexport function hasResponseValue(value: unknown): boolean {\n\tif (value == null) return false;\n\tif (Array.isArray(value))\n\t\treturn value.some((entry) => hasResponseValue(entry));\n\tif (typeof value !== \"object\") return false;\n\tfor (const [key, nested] of Object.entries(\n\t\tvalue as Record<string, unknown>,\n\t)) {\n\t\tif (\n\t\t\tkey === \"value\" &&\n\t\t\tnested !== undefined &&\n\t\t\tnested !== null &&\n\t\t\t!(typeof nested === \"string\" && nested.trim() === \"\") &&\n\t\t\t!(Array.isArray(nested) && nested.length === 0)\n\t\t) {\n\t\t\treturn true;\n\t\t}\n\t\tif (hasResponseValue(nested)) return true;\n\t}\n\treturn false;\n}\n\nexport function hasResponseField(value: unknown): boolean {\n\tif (value == null) return false;\n\tif (Array.isArray(value))\n\t\treturn value.some((entry) => hasResponseField(entry));\n\tif (typeof value !== \"object\") return false;\n\tfor (const [key, nested] of Object.entries(\n\t\tvalue as Record<string, unknown>,\n\t)) {\n\t\tif (key === \"value\") {\n\t\t\treturn true;\n\t\t}\n\t\tif (hasResponseField(nested)) return true;\n\t}\n\treturn false;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n\treturn Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction getMetadataComponent(\n\tsessionDetail: Record<string, unknown>,\n\tcandidate?: Record<string, unknown>,\n): string | undefined {\n\tif (typeof sessionDetail.component === \"string\")\n\t\treturn sessionDetail.component;\n\tif (typeof candidate?.component === \"string\") return candidate.component;\n\treturn undefined;\n}\n\nfunction getMetadataComplete(\n\tsessionDetail: Record<string, unknown>,\n\tcandidate?: Record<string, unknown>,\n): boolean | undefined {\n\tif (typeof sessionDetail.complete === \"boolean\")\n\t\treturn sessionDetail.complete;\n\tif (typeof candidate?.complete === \"boolean\") return candidate.complete;\n\treturn undefined;\n}\n\nfunction isElementIdentityOnlyPayload(\n\tcandidate: Record<string, unknown>,\n): boolean {\n\tconst candidateKeys = Object.keys(candidate);\n\tconst hasIdentityKey = \"id\" in candidate || \"element\" in candidate;\n\treturn (\n\t\thasIdentityKey &&\n\t\t!hasResponseField(candidate) &&\n\t\tcandidateKeys.every((key) => ELEMENT_IDENTITY_SESSION_KEYS.has(key))\n\t);\n}\n\nfunction isWrappedIdentityOnlyElementEcho(\n\tcandidate: ItemSessionContainer,\n): boolean {\n\treturn (\n\t\tcandidate.data.length > 0 &&\n\t\tcandidate.data.every(\n\t\t\t(entry) =>\n\t\t\t\tentry &&\n\t\t\t\ttypeof entry === \"object\" &&\n\t\t\t\t!Array.isArray(entry) &&\n\t\t\t\tisElementIdentityOnlyPayload(entry as Record<string, unknown>),\n\t\t)\n\t);\n}\n\nfunction mergeSessionEntry(\n\texisting: Record<string, unknown>,\n\tincoming: Record<string, unknown>,\n): Record<string, unknown> {\n\tconst merged = { ...existing };\n\tfor (const [key, value] of Object.entries(incoming)) {\n\t\tconst previous = merged[key];\n\t\tmerged[key] =\n\t\t\tisPlainObject(previous) && isPlainObject(value)\n\t\t\t\t? mergeSessionEntry(previous, value)\n\t\t\t\t: value;\n\t}\n\treturn merged;\n}\n\nexport function mergeElementIntoSession(\n\titemId: string,\n\tpreviousItemSession: unknown,\n\tentryId: string,\n\tentry: Record<string, unknown>,\n): ItemSessionContainer {\n\tconst previous = normalizeItemSessionContainer(previousItemSession, itemId);\n\tconst nextData = [...previous.data];\n\tconst existingIndex = nextData.findIndex((candidate) => {\n\t\tif (!candidate || typeof candidate !== \"object\") return false;\n\t\treturn (candidate as Record<string, unknown>).id === entryId;\n\t});\n\tif (existingIndex >= 0) {\n\t\tconst existing = nextData[existingIndex];\n\t\tnextData[existingIndex] =\n\t\t\texisting && typeof existing === \"object\"\n\t\t\t\t? mergeSessionEntry(existing as Record<string, unknown>, entry)\n\t\t\t\t: entry;\n\t} else {\n\t\tnextData.push(entry);\n\t}\n\treturn {\n\t\tid: previous.id || itemId,\n\t\tdata: nextData,\n\t};\n}\n\nexport function normalizeItemSessionChange(args: {\n\titemId: string;\n\tsessionDetail: unknown;\n\tpreviousItemSession?: unknown;\n}): NormalizedItemSessionChange {\n\tconst sessionDetail = (args.sessionDetail || {}) as Record<string, unknown>;\n\tconst actualSession =\n\t\tsessionDetail &&\n\t\ttypeof sessionDetail === \"object\" &&\n\t\t\"session\" in sessionDetail\n\t\t\t? sessionDetail.session\n\t\t\t: args.sessionDetail;\n\n\tconst safeItemId =\n\t\ttypeof args.itemId === \"string\" && args.itemId\n\t\t\t? args.itemId\n\t\t\t: typeof (actualSession as Record<string, unknown> | null)?.id ===\n\t\t\t\t\t\"string\"\n\t\t\t\t? String((actualSession as Record<string, unknown>).id)\n\t\t\t\t: \"\";\n\n\tif (!actualSession || typeof actualSession !== \"object\") {\n\t\treturn {\n\t\t\titemId: safeItemId,\n\t\t\tsession: null,\n\t\t\tintent: \"metadata-only\",\n\t\t\tcomponent: getMetadataComponent(sessionDetail),\n\t\t\tcomplete: getMetadataComplete(sessionDetail),\n\t\t};\n\t}\n\n\tconst candidate = actualSession as Record<string, unknown>;\n\tif (Array.isArray(candidate.data)) {\n\t\tconst normalizedCandidate = normalizeItemSessionContainer(\n\t\t\tcandidate,\n\t\t\tsafeItemId,\n\t\t);\n\t\tconst previousNormalized =\n\t\t\targs.previousItemSession !== undefined\n\t\t\t\t? normalizeItemSessionContainer(args.previousItemSession, safeItemId)\n\t\t\t\t: null;\n\t\tconst previousForMetadataComparison =\n\t\t\talignPreviousSessionIdForRendererSnapshot(\n\t\t\t\tnormalizedCandidate,\n\t\t\t\tpreviousNormalized,\n\t\t\t);\n\t\tconst sessionDetailKeys = Object.keys(sessionDetail);\n\t\tconst metadataWithSessionOnly =\n\t\t\tsessionDetailKeys.length > 0 &&\n\t\t\tsessionDetailKeys.every(\n\t\t\t\t(key) =>\n\t\t\t\t\tkey === \"session\" ||\n\t\t\t\t\tkey === \"complete\" ||\n\t\t\t\t\tkey === \"component\" ||\n\t\t\t\t\tkey === \"timestamp\" ||\n\t\t\t\t\tkey === \"sourceRuntimeId\",\n\t\t\t);\n\t\tconst hasMetadataBeyondSession = sessionDetailKeys.some(\n\t\t\t(key) => key !== \"session\",\n\t\t);\n\t\tif (\n\t\t\tmetadataWithSessionOnly &&\n\t\t\thasMetadataBeyondSession &&\n\t\t\tpreviousForMetadataComparison &&\n\t\t\tareSessionContainersEqual(\n\t\t\t\tnormalizedCandidate,\n\t\t\t\tpreviousForMetadataComparison,\n\t\t\t)\n\t\t) {\n\t\t\treturn {\n\t\t\t\titemId: safeItemId,\n\t\t\t\tsession: null,\n\t\t\t\tintent: \"metadata-only\",\n\t\t\t\tcomponent: getMetadataComponent(sessionDetail),\n\t\t\t\tcomplete: getMetadataComplete(sessionDetail),\n\t\t\t};\n\t\t}\n\t\tif (\n\t\t\tmetadataWithSessionOnly &&\n\t\t\tisWrappedIdentityOnlyElementEcho(normalizedCandidate)\n\t\t) {\n\t\t\treturn {\n\t\t\t\titemId: safeItemId,\n\t\t\t\tsession: null,\n\t\t\t\tintent: \"metadata-only\",\n\t\t\t\tcomponent: getMetadataComponent(sessionDetail),\n\t\t\t\tcomplete: getMetadataComplete(sessionDetail),\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\titemId: safeItemId,\n\t\t\tsession: normalizedCandidate,\n\t\t\tintent: \"replace-item-session\",\n\t\t\tcomponent: getMetadataComponent(sessionDetail),\n\t\t\tcomplete: getMetadataComplete(sessionDetail),\n\t\t};\n\t}\n\n\tconst candidateKeys = Object.keys(candidate);\n\tconst isMetadataOnlyPayload =\n\t\tcandidateKeys.length > 0 &&\n\t\tcandidateKeys.every(\n\t\t\t(key) =>\n\t\t\t\tkey === \"complete\" ||\n\t\t\t\tkey === \"component\" ||\n\t\t\t\tkey === \"timestamp\" ||\n\t\t\t\tkey === \"sourceRuntimeId\",\n\t\t);\n\tif (isMetadataOnlyPayload) {\n\t\treturn {\n\t\t\titemId: safeItemId,\n\t\t\tsession: null,\n\t\t\tintent: \"metadata-only\",\n\t\t\tcomponent: getMetadataComponent(sessionDetail, candidate),\n\t\t\tcomplete: getMetadataComplete(sessionDetail, candidate),\n\t\t};\n\t}\n\tif (isElementIdentityOnlyPayload(candidate)) {\n\t\treturn {\n\t\t\titemId: safeItemId,\n\t\t\tsession: null,\n\t\t\tintent: \"metadata-only\",\n\t\t\tcomponent: getMetadataComponent(sessionDetail, candidate),\n\t\t\tcomplete: getMetadataComplete(sessionDetail, candidate),\n\t\t};\n\t}\n\n\tconst component =\n\t\tgetMetadataComponent(sessionDetail, candidate) ?? \"response\";\n\tconst elementEntryId =\n\t\ttypeof candidate.id === \"string\" && candidate.id ? candidate.id : component;\n\tconst merged = mergeElementIntoSession(\n\t\tsafeItemId,\n\t\targs.previousItemSession,\n\t\telementEntryId,\n\t\t{ id: elementEntryId, ...candidate },\n\t);\n\treturn {\n\t\titemId: safeItemId,\n\t\tsession: merged,\n\t\tintent: \"merge-element-session\",\n\t\tcomponent,\n\t\tcomplete: getMetadataComplete(sessionDetail, candidate),\n\t};\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/pie/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AA4BH;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAC9B,SAAiB,EACjB,cAA6B;IAE7B,MAAM,MAAM,GAAG,IAAI,SAAS,GAAG,CAAC;IAEhC,OAAO;QACN,mFAAmF;QACnF,KAAK,EAAE,CAAC,OAAe,EAAE,GAAG,IAAW,EAAE,EAAE;YAC1C,IAAI,cAAc,EAAE,EAAE,CAAC;gBACtB,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;YACzC,CAAC;QACF,CAAC;QAED,yDAAyD;QACzD,IAAI,EAAE,CAAC,OAAe,EAAE,GAAG,IAAW,EAAE,EAAE,CACzC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QAEvC,IAAI,EAAE,CAAC,OAAe,EAAE,GAAG,IAAW,EAAE,EAAE,CACzC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QAEvC,KAAK,EAAE,CAAC,OAAe,EAAE,GAAG,IAAW,EAAE,EAAE,CAC1C,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;KACxC,CAAC;AACH,CAAC;AAgBD;;GAEG;AACH,MAAM,UAAU,oBAAoB;IACnC,OAAO,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,SAAS,KAAK,IAAI,CAAC;AACnE,CAAC","sourcesContent":["/**\n * PIE Logger Utility\n *\n * Simple, efficient logging for PIE players with debug mode support.\n * Uses browser console methods (debug, info, warn, error) which can be\n * filtered natively in browser dev tools.\n *\n * Usage:\n * ```typescript\n * const logger = createPieLogger('pie-item-player', debug);\n * logger.debug('Detailed debug info', data); // Only shown if debug=true\n * logger.info('Important production info'); // Always shown\n * logger.warn('Warning message'); // Always shown\n * logger.error('Error occurred', error); // Always shown\n * ```\n */\n\nexport interface PieLogger {\n\t/**\n\t * Debug-level logging - only shown when debug mode is enabled\n\t * Use for: detailed initialization steps, data transformations, internal state\n\t */\n\tdebug: (message: string, ...args: any[]) => void;\n\n\t/**\n\t * Info-level logging - always shown\n\t * Use for: successful operations, lifecycle events, important milestones\n\t */\n\tinfo: (message: string, ...args: any[]) => void;\n\n\t/**\n\t * Warning-level logging - always shown\n\t * Use for: recoverable errors, removed/unsupported features, potential issues\n\t */\n\twarn: (message: string, ...args: any[]) => void;\n\n\t/**\n\t * Error-level logging - always shown\n\t * Use for: errors, exceptions, failures\n\t */\n\terror: (message: string, ...args: any[]) => void;\n}\n\n/**\n * Create a PIE logger instance\n *\n * @param namespace - Component name for log prefixing (e.g., 'pie-item-player')\n * @param debugEnabledFn - Function that returns whether debug logs should be shown (checked dynamically on each call)\n * @returns Logger instance with debug, info, warn, error methods\n */\nexport function createPieLogger(\n\tnamespace: string,\n\tdebugEnabledFn: () => boolean,\n): PieLogger {\n\tconst prefix = `[${namespace}]`;\n\n\treturn {\n\t\t// Only debug method checks debugEnabledFn - it's checked dynamically on every call\n\t\tdebug: (message: string, ...args: any[]) => {\n\t\t\tif (debugEnabledFn()) {\n\t\t\t\tconsole.debug(prefix, message, ...args);\n\t\t\t}\n\t\t},\n\n\t\t// info, warn, error always log (not gated by debug flag)\n\t\tinfo: (message: string, ...args: any[]) =>\n\t\t\tconsole.info(prefix, message, ...args),\n\n\t\twarn: (message: string, ...args: any[]) =>\n\t\t\tconsole.warn(prefix, message, ...args),\n\n\t\terror: (message: string, ...args: any[]) =>\n\t\t\tconsole.error(prefix, message, ...args),\n\t};\n}\n\n/**\n * Global debug flag - can be set via window for runtime debugging\n *\n * Usage in browser console:\n * ```javascript\n * window.PIE_DEBUG = true; // Enable debug logging\n * ```\n */\ndeclare global {\n\tinterface Window {\n\t\tPIE_DEBUG?: boolean;\n\t}\n}\n\n/**\n * Check if debug mode is enabled globally\n */\nexport function isGlobalDebugEnabled(): boolean {\n\treturn typeof window !== \"undefined\" && window.PIE_DEBUG === true;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"math-rendering.js","sourceRoot":"","sources":["../../src/pie/math-rendering.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,sCAAsC;AACtC,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAUpE,MAAM,UAAU,GAAG,yBAAyB,CAAC;AAC7C,MAAM,cAAc,GAAG,8BAA8B,CAAC;AACtD,IAAI,WAAW,GAAyB,IAAI,CAAC;AAC7C,MAAM,MAAM,GAAG,eAAe,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,oBAAoB,EAAE,CAAC,CAAC;AAE/E,MAAM,iBAAiB,GAAG,GAA4B,EAAE;IACvD,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC;IACb,CAAC;IACD,MAAM,QAAQ,GAAI,MAAc,CAAC,UAAU,CAAiC,CAAC;IAC7E,OAAO,QAAQ,IAAI,IAAI,CAAC;AACzB,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,QAA0B,EAAQ,EAAE;IAC9D,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO;IACzC,MAAc,CAAC,UAAU,CAAC,GAAG,QAAQ,CAAC;IACtC,MAAc,CAAC,cAAc,CAAC,GAAG,QAAQ,CAAC;AAC5C,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC5C,cAAiC;IAEjC,sBAAsB;IACtB,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QACnC,OAAO;IACR,CAAC;IAED,iCAAiC;IACjC,IAAI,cAAc,EAAE,CAAC;QACpB,iBAAiB,CAAC,cAAc,CAAC,CAAC;QAClC,OAAO;IACR,CAAC;IAED,8BAA8B;IAC9B,IAAI,iBAAiB,EAAE,EAAE,CAAC;QACzB,OAAO;IACR,CAAC;IACD,IAAI,WAAW,EAAE,CAAC;QACjB,MAAM,WAAW,CAAC;QAClB,OAAO;IACR,CAAC;IAED,WAAW,GAAG,CAAC,KAAK,IAAI,EAAE;QACzB,IAAI,CAAC;YACJ,MAAM,EAAE,4BAA4B,EAAE,GAAG,MAAM,MAAM,CACpD,uCAAuC,CACvC,CAAC;YACF,iBAAiB,CAAC,4BAAgD,CAAC,CAAC;YAEpE,MAAM,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;QACtE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,CAAC,KAAK,CAAC,sCAAsC,EAAE,KAAK,CAAC,CAAC;YAC5D,MAAM,KAAK,CAAC;QACb,CAAC;IACF,CAAC,CAAC,EAAE,CAAC;IACL,IAAI,CAAC;QACJ,MAAM,WAAW,CAAC;IACnB,CAAC;YAAS,CAAC;QACV,WAAW,GAAG,IAAI,CAAC;IACpB,CAAC;AACF,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,eAAe,CAAC,QAA0B;IACzD,iBAAiB,CAAC,QAAQ,CAAC,CAAC;AAC7B,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAC,OAAoB;IAC9C,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAC;IACrC,IAAI,QAAQ,IAAI,OAAO,QAAQ,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;QAC3D,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;AACF,CAAC","sourcesContent":["/**\n * Math rendering bootstrap for PIE players\n *\n * PIE elements expect @pie-lib/math-rendering to be available on window.\n * This module ensures required globals are populated from the upstream\n * @pie-lib/math-rendering-module package, and also supports overriding with\n * a custom renderer object when needed.\n */\n\n/// <reference path=\"../shims.d.ts\" />\nimport { createPieLogger, isGlobalDebugEnabled } from \"./logger.js\";\n\nexport type MathRenderer = (element: HTMLElement) => void | Promise<void>;\nexport interface MathRenderingAPI {\n\trenderMath: MathRenderer;\n\twrapMath?: (latex: string) => string;\n\tunWrapMath?: (wrapped: string) => string;\n\tmmlToLatex?: (mathml: string) => string;\n}\n\nconst GLOBAL_KEY = \"@pie-lib/math-rendering\";\nconst GLOBAL_DLL_KEY = \"_dll_pie_lib__math_rendering\";\nlet initPromise: Promise<void> | null = null;\nconst logger = createPieLogger(\"math-rendering\", () => isGlobalDebugEnabled());\n\nconst getWindowRenderer = (): MathRenderingAPI | null => {\n\tif (typeof window === \"undefined\") {\n\t\treturn null;\n\t}\n\tconst renderer = (window as any)[GLOBAL_KEY] as MathRenderingAPI | undefined;\n\treturn renderer || null;\n};\n\nconst setWindowRenderer = (renderer: MathRenderingAPI): void => {\n\tif (typeof window === \"undefined\") return;\n\t(window as any)[GLOBAL_KEY] = renderer;\n\t(window as any)[GLOBAL_DLL_KEY] = renderer;\n};\n\n/**\n * Initialize math rendering with optional custom renderer\n *\n * If no custom renderer is provided, defaults to MathJax.\n * For custom renderers, use setMathRenderer() before calling this function.\n *\n * Sets TWO window globals that PIE elements expect:\n * - window[\"@pie-lib/math-rendering\"] (standard key)\n * - window[\"_dll_pie_lib__math_rendering\"] (SystemJS/DLL key for IIFE bundles)\n *\n * @param customRenderer - Optional custom renderer to use instead of default MathJax\n *\n * @example\n * ```typescript\n * // Default MathJax\n * await initializeMathRendering();\n *\n * // Custom renderer instance implementing MathRenderingAPI\n * const customRenderer = await createCustomRenderer();\n * await initializeMathRendering(customRenderer);\n *\n * // Or use setMathRenderer first\n * setMathRenderer(katexRenderer);\n * await initializeMathRendering();\n * ```\n */\nexport async function initializeMathRendering(\n\tcustomRenderer?: MathRenderingAPI,\n): Promise<void> {\n\t// Only run in browser\n\tif (typeof window === \"undefined\") {\n\t\treturn;\n\t}\n\n\t// Explicit override always wins.\n\tif (customRenderer) {\n\t\tsetWindowRenderer(customRenderer);\n\t\treturn;\n\t}\n\n\t// Already initialized - skip.\n\tif (getWindowRenderer()) {\n\t\treturn;\n\t}\n\tif (initPromise) {\n\t\tawait initPromise;\n\t\treturn;\n\t}\n\n\tinitPromise = (async () => {\n\t\ttry {\n\t\t\tconst { _dll_pie_lib__math_rendering } = await import(\n\t\t\t\t\"@pie-lib/math-rendering-module/module\"\n\t\t\t);\n\t\t\tsetWindowRenderer(_dll_pie_lib__math_rendering as MathRenderingAPI);\n\n\t\t\tlogger.debug(\"Math rendering module initialized (both globals set)\");\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Failed to initialize math rendering:\", error);\n\t\t\tthrow error;\n\t\t}\n\t})();\n\ttry {\n\t\tawait initPromise;\n\t} finally {\n\t\tinitPromise = null;\n\t}\n}\n\n/**\n * Set custom math renderer programmatically\n *\n * Call this BEFORE initializeMathRendering() or any loader.load() calls\n * to override the default MathJax renderer.\n *\n * @param renderer - The renderer to use\n *\n * @example\n * ```typescript\n * import { setMathRenderer } from '@pie-players/pie-players-shared/pie';\n *\n * const renderer = await createCustomRenderer();\n * setMathRenderer(renderer);\n *\n * // Now load PIE elements - they'll use your custom renderer\n * await loader.load(config, document, needsControllers);\n * ```\n */\nexport function setMathRenderer(renderer: MathRenderingAPI): void {\n\tsetWindowRenderer(renderer);\n}\n\n/**\n * Render math in the given element\n *\n * Convenience wrapper that calls the active renderer's renderMath() function.\n * Typically called after PIE elements are rendered.\n *\n * @param element - The element to render math within\n */\nexport function renderMath(element: HTMLElement): void {\n\tconst renderer = getWindowRenderer();\n\tif (renderer && typeof renderer.renderMath === \"function\") {\n\t\trenderer.renderMath(element);\n\t}\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"overrides.js","sourceRoot":"","sources":["../../src/pie/overrides.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * PIE element override helpers.\n *\n * Used to:\n * - parse overrides from URL params\n * - apply overrides to a PIE config (server-side or client-side)\n * - build URLs/params for sharing override state\n */\n\nimport { cloneDeep } from \"../object/index.js\";\nimport { createPieLogger, isGlobalDebugEnabled } from \"./logger.js\";\nimport { parsePackageName } from \"./utils.js\";\nimport { toPackageVersionedTag } from \"./versioned-tag.js\";\n\nexport type ElementOverrides = Record<string, string>;\nconst logger = createPieLogger(\"pie-overrides\", () => isGlobalDebugEnabled());\n\n/**\n * Apply element overrides to a PIE config\n * @param config The original PIE config\n * @param elementOverrides Map of element packages to override versions\n * @returns Updated config with overridden elements\n */\nexport function applyElementOverrides(\n\tconfig: any,\n\telementOverrides: ElementOverrides,\n) {\n\tif (\n\t\t!config ||\n\t\t!elementOverrides ||\n\t\tObject.keys(elementOverrides).length === 0\n\t) {\n\t\treturn config;\n\t}\n\n\t// pie-item contract compatibility: runtime version overrides have historically\n\t// returned a cloned config with tags renamed for the selected package version.\n\tconst updatedConfig = cloneDeep(config);\n\n\t// Check if there are elements to override\n\tif (!updatedConfig.elements) {\n\t\treturn updatedConfig;\n\t}\n\n\tconst matchedPackages = new Set<string>();\n\tconst tagMappings = new Map<string, string>();\n\tconst elements: Record<string, unknown> = {};\n\n\tfor (const [elementKey, elementPackageValue] of Object.entries(\n\t\tupdatedConfig.elements,\n\t)) {\n\t\tconst elementPackageStr = String(elementPackageValue);\n\t\ttry {\n\t\t\tconst parsed = parsePackageName(elementPackageStr);\n\t\t\tconst overrideVersion = elementOverrides[parsed.name];\n\t\t\tif (overrideVersion === undefined) {\n\t\t\t\telements[elementKey] = elementPackageValue;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tmatchedPackages.add(parsed.name);\n\t\t\tconst packageBase = parsed.path\n\t\t\t\t? `${parsed.name}/${parsed.path}`\n\t\t\t\t: parsed.name;\n\t\t\tconst overriddenPackage = `${packageBase}@${String(overrideVersion).trim()}`;\n\t\t\tconst overriddenTag = toPackageVersionedTag(\n\t\t\t\telementKey,\n\t\t\t\toverriddenPackage,\n\t\t\t);\n\t\t\telements[overriddenTag] = overriddenPackage;\n\t\t\tif (overriddenTag !== elementKey) {\n\t\t\t\ttagMappings.set(elementKey, overriddenTag);\n\t\t\t}\n\t\t} catch {\n\t\t\tlogger.debug(\n\t\t\t\t`Couldn't parse element package value: ${elementPackageStr}`,\n\t\t\t);\n\t\t\telements[elementKey] = elementPackageValue;\n\t\t}\n\t}\n\n\tupdatedConfig.elements = elements;\n\n\tif (tagMappings.size > 0) {\n\t\tif (updatedConfig.markup) {\n\t\t\tconst escapeRegExp = (value: string): string =>\n\t\t\t\tvalue.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\t\t\tconst sourceTags = [...tagMappings.keys()]\n\t\t\t\t.sort((left, right) => right.length - left.length)\n\t\t\t\t.map(escapeRegExp)\n\t\t\t\t.join(\"|\");\n\t\t\tconst exactTag = new RegExp(\n\t\t\t\t`(<\\\\/?)(${sourceTags})(?=[\\\\t\\\\n\\\\f\\\\r />])`,\n\t\t\t\t\"g\",\n\t\t\t);\n\t\t\tupdatedConfig.markup = String(updatedConfig.markup).replace(\n\t\t\t\texactTag,\n\t\t\t\t(_match: string, opening: string, tagName: string) =>\n\t\t\t\t\t`${opening}${tagMappings.get(tagName) ?? tagName}`,\n\t\t\t);\n\t\t}\n\n\t\tif (Array.isArray(updatedConfig.models)) {\n\t\t\tupdatedConfig.models = updatedConfig.models.map((model: any) => {\n\t\t\t\tconst overriddenTag = tagMappings.get(model?.element);\n\t\t\t\treturn overriddenTag ? { ...model, element: overriddenTag } : model;\n\t\t\t});\n\t\t}\n\t}\n\n\tfor (const packageName of Object.keys(elementOverrides)) {\n\t\tif (!matchedPackages.has(packageName)) {\n\t\t\tlogger.debug(`No matching element found for package ${packageName}`);\n\t\t}\n\t}\n\n\treturn updatedConfig;\n}\n\n/**\n * Apply element version overrides without renaming custom element tags.\n *\n * Unlike `applyElementOverrides`, this helper keeps `config.markup` and\n * `config.elements` keys intact and only updates each matching element package\n * value to the requested version. This is intended for unified `pie-item-player`\n * flows that preserve authored tags at the override boundary; `makeUniqueTags`\n * later derives the effective per-version runtime namespace on a cloned config.\n */\nexport function applyElementVersionOverridesPreserveTags(\n\tconfig: any,\n\telementOverrides: ElementOverrides,\n) {\n\tif (\n\t\t!config ||\n\t\t!elementOverrides ||\n\t\tObject.keys(elementOverrides).length === 0\n\t) {\n\t\treturn config;\n\t}\n\n\tconst updatedConfig = cloneDeep(config);\n\tif (!updatedConfig.elements || typeof updatedConfig.elements !== \"object\") {\n\t\treturn updatedConfig;\n\t}\n\n\tfor (const [elementKey, elementPackageValue] of Object.entries(\n\t\tupdatedConfig.elements,\n\t)) {\n\t\tconst elementPackageStr = String(elementPackageValue);\n\t\ttry {\n\t\t\tconst parsed = parsePackageName(elementPackageStr);\n\t\t\tconst nextVersion = elementOverrides[parsed.name];\n\t\t\tif (!nextVersion) continue;\n\t\t\tconst packageBase = parsed.path\n\t\t\t\t? `${parsed.name}/${parsed.path}`\n\t\t\t\t: parsed.name;\n\t\t\tupdatedConfig.elements[elementKey] =\n\t\t\t\t`${packageBase}@${String(nextVersion).trim()}`;\n\t\t} catch {\n\t\t\tlogger.debug(\n\t\t\t\t`Couldn't parse element package value: ${elementPackageStr}`,\n\t\t\t);\n\t\t}\n\t}\n\n\treturn updatedConfig;\n}\n\n/**\n * Parse element overrides from URL search params.\n * @returns Map of element package names to versions\n */\nexport function parseElementOverridesFromUrl(\n\tsearchParams: URLSearchParams,\n): ElementOverrides {\n\tconst overrides: ElementOverrides = {};\n\n\t// Look for parameters with the pattern pie-overrides[packageName]=version\n\tfor (const [key, value] of searchParams.entries()) {\n\t\tif (key.startsWith(\"pie-overrides[\") && key.endsWith(\"]\")) {\n\t\t\t// Extract the package name from between the brackets\n\t\t\tconst packageName = key.substring(14, key.length - 1);\n\n\t\t\t// Ensure the package name format is correct (including @)\n\t\t\tconst normalizedPackageName = packageName.startsWith(\"@\")\n\t\t\t\t? packageName\n\t\t\t\t: `@${packageName}`;\n\t\t\toverrides[normalizedPackageName] = value;\n\t\t}\n\t}\n\n\treturn overrides;\n}\n\n/**\n * Parse element overrides from current window URL (client-only).\n */\nexport function parseElementOverridesFromCurrentUrl(): ElementOverrides {\n\tif (typeof window === \"undefined\") {\n\t\treturn {};\n\t}\n\n\tconst url = new URL(window.location.href);\n\treturn parseElementOverridesFromUrl(url.searchParams);\n}\n\n/**\n * Generate a URL parameter string for an element override\n */\nexport function formatElementOverrideParam(\n\tpackageName: string,\n\tversion: string,\n): string {\n\t// Normalize the package name for the parameter key (strip leading @)\n\tconst normalizedPackageName = packageName.startsWith(\"@\")\n\t\t? packageName.substring(1)\n\t\t: packageName;\n\treturn `pie-overrides[${normalizedPackageName}]=${encodeURIComponent(version)}`;\n}\n\n/**\n * Creates a URL that preserves existing overrides and adds or updates a new one.\n */\nexport function addOrUpdateOverrideInUrl(\n\turl: URL,\n\tpackageName: string,\n\tversion: string,\n): string {\n\tconst params = new URLSearchParams(url.search);\n\n\t// Remove @ if present for consistency in URL\n\tconst normalizedPackageName = packageName.startsWith(\"@\")\n\t\t? packageName.substring(1)\n\t\t: packageName;\n\n\t// Set the new override\n\tparams.set(`pie-overrides[${normalizedPackageName}]`, version);\n\n\t// Create the new URL\n\tconst newUrl = new URL(url.pathname, url.origin);\n\tnewUrl.search = params.toString();\n\treturn newUrl.toString();\n}\n\n/**\n * Extract package information from a package string.\n * Intended for UI display.\n */\nexport function extractPackageInfo(packageStr: string) {\n\ttry {\n\t\tconst parsed = parsePackageName(String(packageStr));\n\t\treturn {\n\t\t\tname: parsed.name,\n\t\t\tversion: parsed.version || \"unknown\",\n\t\t\tdisplayName: parsed.name.split(\"/\").pop() || parsed.name,\n\t\t};\n\t} catch {\n\t\tconst s = String(packageStr);\n\t\treturn {\n\t\t\tname: s,\n\t\t\tversion: \"unknown\",\n\t\t\tdisplayName: s.split(\"/\").pop() || s,\n\t\t};\n\t}\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"player-initializer.js","sourceRoot":"","sources":["../../src/pie/player-initializer.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Shared PIE player initialization logic\n * Used by preloaded static player runtimes\n */\n\nexport interface PiePlayerConfig {\n\tenv: any;\n\taddCorrectResponse: boolean;\n\tsession: any[];\n\texternalStyleUrls?: string;\n\tcustomClassName?: string;\n\tcontainerClass?: string;\n\tpassageContainerClass?: string;\n}\n\nexport interface ItemData {\n\titem: {\n\t\tconfig: any;\n\t};\n\tpassage?: {\n\t\tconfig: {\n\t\t\tmarkup?: string;\n\t\t};\n\t};\n}\n\nexport interface PiePlayerElements {\n\tplayerEl: HTMLElement;\n\tpassageMarkup: string | null;\n}\n\n/**\n * Initialize PIE player with item data\n * Shared initialization for preloaded/static player entrypoints.\n */\nexport async function initializePiePlayer(\n\titemData: ItemData,\n\tconfig: PiePlayerConfig,\n\telements: PiePlayerElements,\n): Promise<void> {\n\tconst { playerEl } = elements;\n\n\tif (!itemData.item?.config || !playerEl) {\n\t\tthrow new Error(\"Missing item config or player element\");\n\t}\n\n\t// Ensure pie-player is loaded\n\tawait ensurePiePlayerLoaded();\n\n\tconst defaultEnv = config.env || { mode: \"evaluate\", role: \"instructor\" };\n\n\t// Configure player element\n\t(playerEl as any).config = itemData.item.config;\n\t(playerEl as any).env = defaultEnv;\n\n\tconst shouldShowCorrect = !!(\n\t\tconfig.addCorrectResponse ||\n\t\t(defaultEnv.mode === \"evaluate\" && defaultEnv.role === \"instructor\")\n\t);\n\t(playerEl as any).addCorrectResponse = shouldShowCorrect;\n\n\t// Forward additional properties\n\t(playerEl as any).session = {\n\t\tid: \"\",\n\t\tdata: Array.isArray(config.session) ? config.session : [],\n\t};\n\n\tif (config.externalStyleUrls) {\n\t\t(playerEl as any).externalStyleUrls = config.externalStyleUrls;\n\t}\n\tif (config.customClassName) {\n\t\t(playerEl as any).customClassName = config.customClassName;\n\t}\n\tif (config.containerClass) {\n\t\t(playerEl as any).containerClass = config.containerClass;\n\t}\n\tif (config.passageContainerClass) {\n\t\t(playerEl as any).passageContainerClass = config.passageContainerClass;\n\t}\n}\n\n/**\n * Extract passage markup from item data\n */\nexport function extractPassageMarkup(itemData: ItemData): string | null {\n\treturn itemData.passage?.config?.markup || null;\n}\n\n/**\n * Ensure pie-player web component is loaded\n */\nexport async function ensurePiePlayerLoaded(): Promise<void> {\n\tif (customElements.get(\"pie-player\")) return;\n\n\tconst url =\n\t\t\"https://cdn.jsdelivr.net/npm/@pie-players/pie-player-components@latest/dist/pie-player-components/pie-player-components.esm.js\";\n\n\tawait new Promise<void>((resolve, reject) => {\n\t\tconst existing = document.querySelector(\n\t\t\t\"script[data-pie-player]\",\n\t\t) as HTMLScriptElement | null;\n\t\tif (existing) {\n\t\t\texisting.addEventListener(\"load\", () => resolve());\n\t\t\texisting.addEventListener(\"error\", () =>\n\t\t\t\treject(new Error(\"failed to load pie-player\")),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst s = document.createElement(\"script\");\n\t\ts.type = \"module\";\n\t\ts.dataset.piePlayer = \"true\";\n\t\ts.src = url;\n\t\ts.addEventListener(\"load\", () => resolve());\n\t\ts.addEventListener(\"error\", () =>\n\t\t\treject(new Error(\"failed to load pie-player\")),\n\t\t);\n\t\tdocument.head.appendChild(s);\n\t});\n\n\tawait customElements.whenDefined(\"pie-player\");\n}\n\n/**\n * Build event listeners map for PIE elements\n */\nexport function buildEventListenersMap(\n\tconfig: any,\n\tonSessionChanged: (detail: any) => void,\n): Record<string, Record<string, (e: CustomEvent) => void>> | undefined {\n\tif (!config?.elements) return undefined;\n\n\tconst listeners: Record<\n\t\tstring,\n\t\tRecord<string, (e: CustomEvent) => void>\n\t> = {};\n\tObject.keys(config.elements).forEach((elName) => {\n\t\tlisteners[elName] = {\n\t\t\t\"session-changed\": (e: CustomEvent) => onSessionChanged(e.detail),\n\t\t};\n\t});\n\treturn listeners;\n}\n\n/**\n * Build URL parameters for API request\n * Shared by preloaded/static player entrypoints.\n */\nexport function buildApiParams(\n\tenv: any,\n\taddCorrectResponse: boolean,\n): URLSearchParams {\n\tconst params = new URLSearchParams();\n\tif (env && typeof env === \"object\") {\n\t\tif (env.mode) params.set(\"mode\", String(env.mode));\n\t\tif (env.role) params.set(\"role\", String(env.role));\n\t}\n\tif (addCorrectResponse) params.set(\"addCorrectResponse\", \"true\");\n\treturn params;\n}\n\n/**\n * Fetch item data from API\n * Shared by preloaded/static player entrypoints.\n */\nexport async function fetchItemData(\n\tapiBaseUrl: string,\n\titemId: string,\n\ttoken: string,\n\tendpoint: \"packaged\" | \"data-only\",\n\tenv: any,\n\taddCorrectResponse: boolean,\n\tsignal?: AbortSignal,\n): Promise<any> {\n\tif (typeof window === \"undefined\" || typeof document === \"undefined\") {\n\t\tthrow new Error(\"PIE initialization must run in browser\");\n\t}\n\n\tconst params = buildApiParams(env, addCorrectResponse);\n\tconst apiUrl = `${apiBaseUrl}/api/item/${itemId}/${endpoint}${params.toString() ? `?${params.toString()}` : \"\"}`;\n\n\tconst response = await fetch(apiUrl, {\n\t\theaders: {\n\t\t\tAuthorization: `Bearer ${token}`,\n\t\t\tAccept: \"application/json\",\n\t\t},\n\t\tsignal,\n\t});\n\n\tif (!response.ok) {\n\t\tthrow new Error(`Failed to fetch item data: ${response.statusText}`);\n\t}\n\n\treturn await response.json();\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/pie/registry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEpD;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,GAAgB,EAAE;IAC5C,IAAI,QAAqB,CAAC;IAC1B,IAAI,sBAAsB,CAAC,MAAM,CAAC,EAAE,CAAC;QACpC,QAAQ,GAAG,MAAM,CAAC,YAAY,CAAC;IAChC,CAAC;SAAM,CAAC;QACP,QAAQ,GAAG,EAAE,CAAC;QACb,MAAc,CAAC,YAAY,GAAG,QAAQ,CAAC;IACzC,CAAC;IACD,OAAO,QAAQ,CAAC;AACjB,CAAC,CAAC","sourcesContent":["/**\n * PIE Registry Module\n *\n * Manages the global PIE registry that tracks loaded elements.\n */\n\nimport type { PieRegistry } from \"./types.js\";\nimport { isPieRegistryAvailable } from \"./types.js\";\n\n/**\n * Get or create the global PIE registry\n */\nexport const pieRegistry = (): PieRegistry => {\n\tlet registry: PieRegistry;\n\tif (isPieRegistryAvailable(window)) {\n\t\tregistry = window.PIE_REGISTRY;\n\t} else {\n\t\tregistry = {};\n\t\t(window as any).PIE_REGISTRY = registry;\n\t}\n\treturn registry;\n};\n"]}