@pie-players/pie-players-shared 0.3.57 → 0.3.59

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 (33) hide show
  1. package/dist/components/vendor/nds/README.md +120 -0
  2. package/dist/components/vendor/nds/nds-icon-button.d.ts +19 -0
  3. package/dist/components/vendor/nds/nds-icon-button.js +826 -0
  4. package/dist/loaders/ElementLoader.d.ts +6 -5
  5. package/dist/loaders/ElementLoader.js +11 -45
  6. package/dist/loaders/ElementLoader.js.map +1 -1
  7. package/dist/loaders/element-loader.d.ts +6 -0
  8. package/dist/loaders/element-loader.js +4 -0
  9. package/dist/loaders/element-loader.js.map +1 -1
  10. package/dist/loaders/element-package-policy.d.ts +19 -0
  11. package/dist/loaders/element-package-policy.js +68 -0
  12. package/dist/loaders/element-package-policy.js.map +1 -0
  13. package/dist/loaders/iife-adapter.js +35 -1
  14. package/dist/loaders/iife-adapter.js.map +1 -1
  15. package/dist/loaders/index.d.ts +2 -0
  16. package/dist/loaders/index.js +1 -0
  17. package/dist/loaders/index.js.map +1 -1
  18. package/dist/pie/authoring-tag.d.ts +6 -0
  19. package/dist/pie/authoring-tag.js +13 -0
  20. package/dist/pie/authoring-tag.js.map +1 -0
  21. package/dist/pie/config.d.ts +5 -6
  22. package/dist/pie/config.js +26 -45
  23. package/dist/pie/config.js.map +1 -1
  24. package/dist/pie/overrides.d.ts +2 -1
  25. package/dist/pie/overrides.js +49 -32
  26. package/dist/pie/overrides.js.map +1 -1
  27. package/dist/pie/versioned-tag.d.ts +15 -0
  28. package/dist/pie/versioned-tag.js +43 -0
  29. package/dist/pie/versioned-tag.js.map +1 -0
  30. package/dist/ui/zoom-compensation.d.ts +44 -0
  31. package/dist/ui/zoom-compensation.js +44 -0
  32. package/dist/ui/zoom-compensation.js.map +1 -0
  33. package/package.json +10 -2
@@ -1 +1 @@
1
- {"version":3,"file":"iife-adapter.js","sourceRoot":"","sources":["../../src/loaders/iife-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * IIFE backend adapter for the ElementLoader primitive.\n *\n * Loads PIE elements from IIFE bundles served by the PIE build service,\n * then registers them with `customElements`. On any per-tag failure\n * (missing package, non-constructor element class, define failure),\n * throws `AdapterFailure` with a structured `reasons` map that the\n * primitive unpacks into `ElementLoaderError.reasons`.\n *\n * This adapter deliberately does *not* gate its own promise on\n * `customElements.whenDefined` — the primitive performs that verification\n * uniformly for every backend, so the adapter's job is narrowly:\n *\n * 1. Fetch the bundle.\n * 2. Extract per-tag element classes from `window.pie.default`.\n * 3. Validate each class is a custom-element constructor.\n * 4. Call `customElements.define` via `defineCustomElementSafely`.\n * 5. Collect structured per-tag reasons for anything that failed.\n * 6. Resolve (everything OK) or throw `AdapterFailure` (anything failed).\n */\n\nimport type { InstrumentationProvider } from \"../instrumentation/types.js\";\nimport { isInstrumentationProvider } from \"../instrumentation/provider-guards.js\";\nimport {\n\tDEFAULT_IIFE_BUNDLE_RETRY_CONFIG,\n\ttype IifeBundleRetryConfig,\n} from \"../loader-config.js\";\nimport { defineCustomElementSafely } from \"../pie/custom-element-define.js\";\nimport { pieRegistry } from \"../pie/registry.js\";\nimport { validateCustomElementTag } from \"../pie/tag-names.js\";\nimport {\n\tBundleType,\n\tisCustomElementConstructor,\n\tStatus,\n} from \"../pie/types.js\";\nimport { getPackageWithoutVersion } from \"../pie/utils.js\";\nimport type { ElementMap } from \"./ElementLoader.js\";\nimport {\n\tAdapterFailure,\n\ttype BackendContext,\n\ttype ElementLoaderBackend,\n\ttype ElementTag,\n\ttype RegistrationFailureReason,\n} from \"./element-loader-types.js\";\n\n/**\n * Default PIE bundle service base URL. Exported so widgets can use it as\n * the fallback when the host does not supply `loaderOptions.bundleHost`.\n */\nexport const DEFAULT_BUNDLE_HOST = \"https://proxy.pie-api.com/bundles/\";\n\n/**\n * Bundle-build retry status emitted while a bundle is being built or after\n * it completes. Hosts that display a \"bundle is building…\" UI subscribe via\n * `onBundleRetryStatus` and read each transition.\n */\nexport type IifeBundleRetryStatus = {\n\tstate: \"retrying\" | \"completed\" | \"timeout\" | \"cancelled\";\n\turl: string;\n\tattempt: number;\n\telapsedMs: number;\n\ttimeoutMs: number;\n\tretryDelayMs?: number;\n\treason?: string;\n};\n\nexport type IifeBackendConfig = {\n\tkind: \"iife\";\n\t/** Base URL for the PIE bundle service. */\n\tbundleHost: string;\n\t/** Bundle variant to request (player / client-player / editor). */\n\tbundleType?: BundleType;\n\t/** Whether the registered entries should carry their controller exports. */\n\tneedsControllers?: boolean;\n\t/** Explicit bundle override (hash + optional URL) supplied by the host. */\n\tbundleInfo?: { hash?: string; url?: string };\n\t/** Debug flag hook. */\n\tdebugEnabled?: () => boolean;\n\t/**\n\t * Retry policy for transient bundle load failures.\n\t *\n\t * When the bundle service is building a bundle on demand, the first\n\t * few `<script src>` requests can fail. This policy polls until the\n\t * bundle is available or `timeoutMs` elapses. Default matches\n\t * `DEFAULT_IIFE_BUNDLE_RETRY_CONFIG`.\n\t */\n\tbundleRetry?: IifeBundleRetryConfig;\n\t/**\n\t * Callback invoked with retry status transitions. Lets hosts render\n\t * \"bundle still building, retrying in Ns\" messaging without touching\n\t * internal adapter state.\n\t */\n\tonBundleRetryStatus?: (status: IifeBundleRetryStatus) => void;\n\t/**\n\t * If true and `instrumentationProvider` is set and ready, retry\n\t * lifecycle events (`pie-iife-bundle-retry*`) are emitted.\n\t */\n\ttrackPageActions?: boolean;\n\t/**\n\t * Instrumentation provider used to emit retry lifecycle telemetry.\n\t */\n\tinstrumentationProvider?: InstrumentationProvider;\n};\n\n/**\n * Bundle-script loader seam. Default implementation injects a `<script>` tag\n * into the document head. Tests replace it with a scripted stub via\n * `IifeBackendTestSeams.replaceLoadBundleScript`.\n *\n * @internal\n */\nexport type IifeBundleScriptLoader = (\n\turl: string,\n\tdoc: Document,\n) => Promise<void>;\n\n/**\n * Test-only seam exposed via `IifeBackend.__seams`. Lets contract tests\n * inject scripted bundle-load behaviour without going through the network\n * or the document. Not part of the runtime API; production code must not\n * touch this field.\n *\n * @internal\n */\nexport type IifeBackendTestSeams = {\n\treplaceLoadBundleScript(fn: IifeBundleScriptLoader): void;\n\trestore(): void;\n};\n\nexport type IifeBackend = ElementLoaderBackend & {\n\t/** @internal Test-only seam — see {@link IifeBackendTestSeams}. */\n\treadonly __seams: IifeBackendTestSeams;\n};\n\nexport function createIifeBackend(config: IifeBackendConfig): IifeBackend {\n\tconst bundleType = config.bundleType ?? BundleType.clientPlayer;\n\tconst needsControllers = config.needsControllers ?? true;\n\n\tlet loadBundleScript: IifeBundleScriptLoader = defaultLoadBundleScript;\n\tconst inFlightBundleLoads = new Map<string, Promise<void>>();\n\n\tconst __seams: IifeBackendTestSeams = {\n\t\treplaceLoadBundleScript(fn) {\n\t\t\tloadBundleScript = fn;\n\t\t\tinFlightBundleLoads.clear();\n\t\t},\n\t\trestore() {\n\t\t\tloadBundleScript = defaultLoadBundleScript;\n\t\t\tinFlightBundleLoads.clear();\n\t\t},\n\t};\n\n\tasync function ensureBundleLoaded(url: string, doc: Document): Promise<void> {\n\t\tconst existing = inFlightBundleLoads.get(url);\n\t\tif (existing) return existing;\n\t\tconst promise = loadBundleScriptWithRetry(url, doc).finally(() => {\n\t\t\tinFlightBundleLoads.delete(url);\n\t\t});\n\t\tinFlightBundleLoads.set(url, promise);\n\t\treturn promise;\n\t}\n\n\t/**\n\t * Wrap the single-shot script loader with poll-until-ready retry.\n\t *\n\t * The PIE bundle service may return a transient failure while it\n\t * builds a bundle on demand. Retry with fixed-interval polling until\n\t * the bundle is ready or the cumulative deadline elapses. Emits\n\t * retry lifecycle events to the host via `onBundleRetryStatus` and to\n\t * the instrumentation provider (if configured and ready).\n\t */\n\tasync function loadBundleScriptWithRetry(\n\t\turl: string,\n\t\tdoc: Document,\n\t): Promise<void> {\n\t\tconst { retryDelayMs, timeoutMs } = resolveBundleRetryConfig(\n\t\t\tconfig.bundleRetry,\n\t\t);\n\t\tconst startedAt = Date.now();\n\t\tlet attempt = 0;\n\t\twhile (true) {\n\t\t\tattempt += 1;\n\t\t\ttry {\n\t\t\t\tawait loadBundleScript(url, doc);\n\t\t\t\tconst elapsedMs = Date.now() - startedAt;\n\t\t\t\tif (attempt > 1) {\n\t\t\t\t\tconfig.onBundleRetryStatus?.({\n\t\t\t\t\t\tstate: \"completed\",\n\t\t\t\t\t\turl,\n\t\t\t\t\t\tattempt,\n\t\t\t\t\t\telapsedMs,\n\t\t\t\t\t\ttimeoutMs,\n\t\t\t\t\t});\n\t\t\t\t\ttrackRetryEvent(\"pie-iife-bundle-retry-success\", {\n\t\t\t\t\t\turl,\n\t\t\t\t\t\tattempt,\n\t\t\t\t\t\telapsedMs,\n\t\t\t\t\t\ttimeoutMs,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t} catch (error) {\n\t\t\t\tconst elapsedMs = Date.now() - startedAt;\n\t\t\t\tconst remainingMs = timeoutMs - elapsedMs;\n\t\t\t\tconst reason = error instanceof Error ? error.message : String(error);\n\t\t\t\tif (remainingMs <= 0) {\n\t\t\t\t\tconst timeoutError = new Error(\n\t\t\t\t\t\t`IIFE bundle load timed out after ${timeoutMs}ms: ${url}`,\n\t\t\t\t\t);\n\t\t\t\t\tconfig.onBundleRetryStatus?.({\n\t\t\t\t\t\tstate: \"timeout\",\n\t\t\t\t\t\turl,\n\t\t\t\t\t\tattempt,\n\t\t\t\t\t\telapsedMs,\n\t\t\t\t\t\ttimeoutMs,\n\t\t\t\t\t\treason,\n\t\t\t\t\t});\n\t\t\t\t\ttrackRetryEvent(\"pie-iife-bundle-retry-timeout\", {\n\t\t\t\t\t\turl,\n\t\t\t\t\t\tattempt,\n\t\t\t\t\t\telapsedMs,\n\t\t\t\t\t\ttimeoutMs,\n\t\t\t\t\t\tlastError: reason,\n\t\t\t\t\t});\n\t\t\t\t\ttrackRetryError(timeoutError, {\n\t\t\t\t\t\turl,\n\t\t\t\t\t\tattempt,\n\t\t\t\t\t\telapsedMs,\n\t\t\t\t\t\ttimeoutMs,\n\t\t\t\t\t\tlastError: reason,\n\t\t\t\t\t});\n\t\t\t\t\tthrow timeoutError;\n\t\t\t\t}\n\t\t\t\tconst nextDelay = Math.min(retryDelayMs, remainingMs);\n\t\t\t\tconfig.onBundleRetryStatus?.({\n\t\t\t\t\tstate: \"retrying\",\n\t\t\t\t\turl,\n\t\t\t\t\tattempt,\n\t\t\t\t\telapsedMs,\n\t\t\t\t\ttimeoutMs,\n\t\t\t\t\tretryDelayMs: nextDelay,\n\t\t\t\t\treason,\n\t\t\t\t});\n\t\t\t\ttrackRetryEvent(\"pie-iife-bundle-retry\", {\n\t\t\t\t\turl,\n\t\t\t\t\tattempt,\n\t\t\t\t\telapsedMs,\n\t\t\t\t\tretryDelayMs: nextDelay,\n\t\t\t\t\ttimeoutMs,\n\t\t\t\t\tlastError: reason,\n\t\t\t\t});\n\t\t\t\tawait waitMs(nextDelay);\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction getInstrumentationProvider(): InstrumentationProvider | undefined {\n\t\tif (!config.trackPageActions) return undefined;\n\t\tconst provider = config.instrumentationProvider;\n\t\tif (!isInstrumentationProvider(provider)) return undefined;\n\t\tif (!provider.isReady()) return undefined;\n\t\treturn provider;\n\t}\n\n\tfunction trackRetryEvent(\n\t\teventName: string,\n\t\tattributes: Record<string, unknown>,\n\t): void {\n\t\tconst provider = getInstrumentationProvider();\n\t\tif (!provider) return;\n\t\ttry {\n\t\t\tprovider.trackEvent(eventName, attributes);\n\t\t} catch {\n\t\t\t// Swallow: instrumentation must never break loading.\n\t\t}\n\t}\n\n\tfunction trackRetryError(\n\t\terror: Error,\n\t\tattributes: Record<string, unknown>,\n\t): void {\n\t\tconst provider = getInstrumentationProvider();\n\t\tif (!provider) return;\n\t\ttry {\n\t\t\tprovider.trackError(error, {\n\t\t\t\t...attributes,\n\t\t\t\tcomponent: \"iife-adapter\",\n\t\t\t\terrorType: \"IifeBundleRetryError\",\n\t\t\t});\n\t\t} catch {\n\t\t\t// Swallow: instrumentation must never break loading.\n\t\t}\n\t}\n\n\tasync function load(\n\t\telements: ElementMap,\n\t\tcontext: BackendContext,\n\t): Promise<void> {\n\t\tif (!elements || Object.keys(elements).length === 0) return;\n\n\t\tconst bundleUrl = buildBundleUrl(elements, bundleType, config);\n\t\ttry {\n\t\t\tawait ensureBundleLoaded(bundleUrl, context.doc);\n\t\t} catch (err) {\n\t\t\tconst cause = err instanceof Error ? err.message : String(err);\n\t\t\tconst reasons = new Map<ElementTag, RegistrationFailureReason>();\n\t\t\tfor (const tag of Object.keys(elements)) {\n\t\t\t\treasons.set(tag, {\n\t\t\t\t\tkind: \"bundle-load-failed\",\n\t\t\t\t\ttag,\n\t\t\t\t\turl: bundleUrl,\n\t\t\t\t\tcause,\n\t\t\t\t});\n\t\t\t}\n\t\t\tthrow new AdapterFailure(reasons);\n\t\t}\n\n\t\tconst pieModule = readPieModule();\n\t\tif (!pieModule) {\n\t\t\tconst reasons = new Map<ElementTag, RegistrationFailureReason>();\n\t\t\tfor (const tag of Object.keys(elements)) {\n\t\t\t\treasons.set(tag, {\n\t\t\t\t\tkind: \"bundle-load-failed\",\n\t\t\t\t\ttag,\n\t\t\t\t\turl: bundleUrl,\n\t\t\t\t\tcause: \"window.pie.default missing after bundle load\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tthrow new AdapterFailure(reasons);\n\t\t}\n\n\t\tconst reasons = new Map<ElementTag, RegistrationFailureReason>();\n\t\tconst isEditorBundle = bundleType === BundleType.editor;\n\t\tconst registry = pieRegistry();\n\n\t\tfor (const [tag, packageVersion] of Object.entries(elements)) {\n\t\t\tconst packageName = getPackageWithoutVersion(packageVersion);\n\t\t\tconst elementData = pieModule[packageName];\n\t\t\tif (!elementData) {\n\t\t\t\treasons.set(tag, {\n\t\t\t\t\tkind: \"package-not-in-bundle\",\n\t\t\t\t\ttag,\n\t\t\t\t\tpackageName,\n\t\t\t\t\tavailablePackages: Object.keys(pieModule),\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst ElementClass = isEditorBundle\n\t\t\t\t? (elementData.Configure ?? createEmptyConfigure())\n\t\t\t\t: elementData.Element;\n\n\t\t\tif (!ElementClass) {\n\t\t\t\treasons.set(tag, {\n\t\t\t\t\tkind: \"no-element-class\",\n\t\t\t\t\ttag,\n\t\t\t\t\tpackageName,\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!isCustomElementConstructor(ElementClass)) {\n\t\t\t\treasons.set(tag, {\n\t\t\t\t\tkind: \"not-a-constructor\",\n\t\t\t\t\ttag,\n\t\t\t\t\tpackageName,\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet actualTag: string;\n\t\t\ttry {\n\t\t\t\tactualTag = validateCustomElementTag(\n\t\t\t\t\ttag,\n\t\t\t\t\t`element tag for ${packageName}`,\n\t\t\t\t);\n\t\t\t} catch (err) {\n\t\t\t\treasons.set(tag, {\n\t\t\t\t\tkind: \"define-failed\",\n\t\t\t\t\ttag,\n\t\t\t\t\tcause: err instanceof Error ? err.message : String(err),\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tdefineCustomElementSafely(\n\t\t\t\t\tactualTag,\n\t\t\t\t\tclass extends ElementClass {},\n\t\t\t\t\t`element tag for ${packageName}`,\n\t\t\t\t);\n\t\t\t} catch (err) {\n\t\t\t\treasons.set(tag, {\n\t\t\t\t\tkind: \"define-failed\",\n\t\t\t\t\ttag,\n\t\t\t\t\tcause: err instanceof Error ? err.message : String(err),\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tregistry[actualTag] = {\n\t\t\t\tpackage: packageVersion,\n\t\t\t\tstatus: Status.loaded,\n\t\t\t\ttagName: actualTag,\n\t\t\t\telement: ElementClass,\n\t\t\t\tcontroller: needsControllers ? (elementData.controller ?? null) : null,\n\t\t\t\tconfig: elementData.config ?? null,\n\t\t\t\tbundleType,\n\t\t\t};\n\t\t}\n\n\t\tif (reasons.size > 0) {\n\t\t\tthrow new AdapterFailure(reasons);\n\t\t}\n\t}\n\n\treturn {\n\t\tload,\n\t\tget __seams() {\n\t\t\treturn __seams;\n\t\t},\n\t};\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction defaultLoadBundleScript(url: string, doc: Document): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst script = doc.createElement(\"script\") as HTMLScriptElement;\n\t\tscript.src = url;\n\t\tscript.defer = true;\n\t\tscript.setAttribute(\"data-pie-bundle\", \"true\");\n\t\tscript.onload = () => resolve();\n\t\tscript.onerror = () =>\n\t\t\treject(new Error(`Failed to load IIFE bundle from: ${url}`));\n\t\tdoc.head.appendChild(script);\n\t});\n}\n\nfunction readPieModule(): Record<string, any> | undefined {\n\tconst maybeWindow = (\n\t\tglobalThis as { window?: { pie?: { default?: unknown } } }\n\t).window;\n\tconst pieDefault = maybeWindow?.pie?.default;\n\tif (!pieDefault || typeof pieDefault !== \"object\") return undefined;\n\treturn pieDefault as Record<string, any>;\n}\n\nfunction buildBundleUrl(\n\telements: ElementMap,\n\tbundleType: BundleType,\n\tconfig: IifeBackendConfig,\n): string {\n\tconst elementTags = Object.keys(elements).sort().join(\",\");\n\n\tif (config.bundleInfo?.url) {\n\t\tconst separator = config.bundleInfo.url.includes(\"?\") ? \"&\" : \"?\";\n\t\treturn elementTags\n\t\t\t? `${config.bundleInfo.url}${separator}elements=${encodeURIComponent(elementTags)}`\n\t\t\t: config.bundleInfo.url;\n\t}\n\n\tconst packageVersions = Object.values(elements).join(\"+\");\n\tconst host = normalizeBundleHost(config.bundleHost);\n\tconst base = `${host}${encodeURI(packageVersions)}/${bundleType}`;\n\treturn elementTags\n\t\t? `${base}?elements=${encodeURIComponent(elementTags)}`\n\t\t: base;\n}\n\nfunction normalizeBundleHost(host: string): string {\n\treturn `${host.trim().replace(/\\/+$/, \"\")}/`;\n}\n\nfunction resolveBundleRetryConfig(\n\tconfigured: IifeBundleRetryConfig | undefined,\n): Required<IifeBundleRetryConfig> {\n\tconst retryDelayMs =\n\t\ttypeof configured?.retryDelayMs === \"number\" && configured.retryDelayMs > 0\n\t\t\t? configured.retryDelayMs\n\t\t\t: DEFAULT_IIFE_BUNDLE_RETRY_CONFIG.retryDelayMs;\n\tconst timeoutMs =\n\t\ttypeof configured?.timeoutMs === \"number\" && configured.timeoutMs > 0\n\t\t\t? configured.timeoutMs\n\t\t\t: DEFAULT_IIFE_BUNDLE_RETRY_CONFIG.timeoutMs;\n\treturn { retryDelayMs, timeoutMs };\n}\n\nfunction waitMs(ms: number): Promise<void> {\n\treturn new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction createEmptyConfigure(): CustomElementConstructor {\n\t// Minimal configure fallback used for editor bundles that omit a Configure\n\t// export. Intentionally silent; the host will see a blank configuration UI\n\t// rather than a hard failure.\n\treturn class EmptyConfigureElement extends HTMLElement {\n\t\tprivate _model: unknown;\n\t\tprivate _configuration: unknown;\n\t\tget model() {\n\t\t\treturn this._model;\n\t\t}\n\t\tset model(v: unknown) {\n\t\t\tthis._model = v;\n\t\t}\n\t\tget configuration() {\n\t\t\treturn this._configuration;\n\t\t}\n\t\tset configuration(v: unknown) {\n\t\t\tthis._configuration = v;\n\t\t}\n\t};\n}\n"]}
1
+ {"version":3,"file":"iife-adapter.js","sourceRoot":"","sources":["../../src/loaders/iife-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * IIFE backend adapter for the ElementLoader primitive.\n *\n * Loads PIE elements from IIFE bundles served by the PIE build service,\n * then registers them with `customElements`. On any per-tag failure\n * (missing package, non-constructor element class, define failure),\n * throws `AdapterFailure` with a structured `reasons` map that the\n * primitive unpacks into `ElementLoaderError.reasons`.\n *\n * This adapter deliberately does *not* gate its own promise on\n * `customElements.whenDefined` — the primitive performs that verification\n * uniformly for every backend, so the adapter's job is narrowly:\n *\n * 1. Fetch the bundle.\n * 2. Extract per-tag element classes from `window.pie.default`.\n * 3. Validate each class is a custom-element constructor.\n * 4. Call `customElements.define` via `defineCustomElementSafely`.\n * 5. Collect structured per-tag reasons for anything that failed.\n * 6. Resolve (everything OK) or throw `AdapterFailure` (anything failed).\n */\n\nimport type { InstrumentationProvider } from \"../instrumentation/types.js\";\nimport { isInstrumentationProvider } from \"../instrumentation/provider-guards.js\";\nimport {\n\tDEFAULT_IIFE_BUNDLE_RETRY_CONFIG,\n\ttype IifeBundleRetryConfig,\n} from \"../loader-config.js\";\nimport { defineCustomElementSafely } from \"../pie/custom-element-define.js\";\nimport { pieRegistry } from \"../pie/registry.js\";\nimport { validateCustomElementTag } from \"../pie/tag-names.js\";\nimport {\n\tBundleType,\n\tisCustomElementConstructor,\n\tStatus,\n} from \"../pie/types.js\";\nimport { getPackageWithoutVersion, parsePackageName } from \"../pie/utils.js\";\nimport type { ElementMap } from \"./ElementLoader.js\";\nimport {\n\tAdapterFailure,\n\ttype BackendContext,\n\ttype ElementLoaderBackend,\n\ttype ElementTag,\n\ttype RegistrationFailureReason,\n} from \"./element-loader-types.js\";\n\n/**\n * Default PIE bundle service base URL. Exported so widgets can use it as\n * the fallback when the host does not supply `loaderOptions.bundleHost`.\n */\nexport const DEFAULT_BUNDLE_HOST = \"https://proxy.pie-api.com/bundles/\";\n\n/**\n * Bundle-build retry status emitted while a bundle is being built or after\n * it completes. Hosts that display a \"bundle is building…\" UI subscribe via\n * `onBundleRetryStatus` and read each transition.\n */\nexport type IifeBundleRetryStatus = {\n\tstate: \"retrying\" | \"completed\" | \"timeout\" | \"cancelled\";\n\turl: string;\n\tattempt: number;\n\telapsedMs: number;\n\ttimeoutMs: number;\n\tretryDelayMs?: number;\n\treason?: string;\n};\n\nexport type IifeBackendConfig = {\n\tkind: \"iife\";\n\t/** Base URL for the PIE bundle service. */\n\tbundleHost: string;\n\t/** Bundle variant to request (player / client-player / editor). */\n\tbundleType?: BundleType;\n\t/** Whether the registered entries should carry their controller exports. */\n\tneedsControllers?: boolean;\n\t/** Explicit bundle override (hash + optional URL) supplied by the host. */\n\tbundleInfo?: { hash?: string; url?: string };\n\t/** Debug flag hook. */\n\tdebugEnabled?: () => boolean;\n\t/**\n\t * Retry policy for transient bundle load failures.\n\t *\n\t * When the bundle service is building a bundle on demand, the first\n\t * few `<script src>` requests can fail. This policy polls until the\n\t * bundle is available or `timeoutMs` elapses. Default matches\n\t * `DEFAULT_IIFE_BUNDLE_RETRY_CONFIG`.\n\t */\n\tbundleRetry?: IifeBundleRetryConfig;\n\t/**\n\t * Callback invoked with retry status transitions. Lets hosts render\n\t * \"bundle still building, retrying in Ns\" messaging without touching\n\t * internal adapter state.\n\t */\n\tonBundleRetryStatus?: (status: IifeBundleRetryStatus) => void;\n\t/**\n\t * If true and `instrumentationProvider` is set and ready, retry\n\t * lifecycle events (`pie-iife-bundle-retry*`) are emitted.\n\t */\n\ttrackPageActions?: boolean;\n\t/**\n\t * Instrumentation provider used to emit retry lifecycle telemetry.\n\t */\n\tinstrumentationProvider?: InstrumentationProvider;\n};\n\n/**\n * Bundle-script loader seam. Default implementation injects a `<script>` tag\n * into the document head. Tests replace it with a scripted stub via\n * `IifeBackendTestSeams.replaceLoadBundleScript`.\n *\n * @internal\n */\nexport type IifeBundleScriptLoader = (\n\turl: string,\n\tdoc: Document,\n) => Promise<void>;\n\n/**\n * Test-only seam exposed via `IifeBackend.__seams`. Lets contract tests\n * inject scripted bundle-load behaviour without going through the network\n * or the document. Not part of the runtime API; production code must not\n * touch this field.\n *\n * @internal\n */\nexport type IifeBackendTestSeams = {\n\treplaceLoadBundleScript(fn: IifeBundleScriptLoader): void;\n\trestore(): void;\n};\n\nexport type IifeBackend = ElementLoaderBackend & {\n\t/** @internal Test-only seam — see {@link IifeBackendTestSeams}. */\n\treadonly __seams: IifeBackendTestSeams;\n};\n\n/**\n * The legacy IIFE bundle global is keyed by unversioned package name. Two\n * distinct specs for one package therefore cannot coexist in a single bundle:\n * one constructor would silently be reused for both requested versioned tags.\n */\nfunction findIifeElementMapConflict(elements: ElementMap): string | undefined {\n\tconst specsByPackageName = new Map<string, Set<string>>();\n\n\tfor (const packageSpecValue of Object.values(elements)) {\n\t\tconst packageSpec = String(packageSpecValue);\n\t\tconst packageName = parsePackageName(packageSpec).name;\n\t\tconst specs = specsByPackageName.get(packageName) ?? new Set<string>();\n\t\tspecs.add(packageSpec);\n\t\tspecsByPackageName.set(packageName, specs);\n\t}\n\n\tconst conflictingPackages = [...specsByPackageName.entries()]\n\t\t.filter(([, specs]) => specs.size > 1)\n\t\t.map(([packageName]) => packageName)\n\t\t.sort();\n\n\treturn conflictingPackages.length > 0\n\t\t? `IIFE bundles cannot load multiple package specs for: ${conflictingPackages.join(\", \")}`\n\t\t: undefined;\n}\n\nexport function createIifeBackend(config: IifeBackendConfig): IifeBackend {\n\tconst bundleType = config.bundleType ?? BundleType.clientPlayer;\n\tconst needsControllers = config.needsControllers ?? true;\n\n\tlet loadBundleScript: IifeBundleScriptLoader = defaultLoadBundleScript;\n\tconst inFlightBundleLoads = new Map<string, Promise<void>>();\n\n\tconst __seams: IifeBackendTestSeams = {\n\t\treplaceLoadBundleScript(fn) {\n\t\t\tloadBundleScript = fn;\n\t\t\tinFlightBundleLoads.clear();\n\t\t},\n\t\trestore() {\n\t\t\tloadBundleScript = defaultLoadBundleScript;\n\t\t\tinFlightBundleLoads.clear();\n\t\t},\n\t};\n\n\tasync function ensureBundleLoaded(url: string, doc: Document): Promise<void> {\n\t\tconst existing = inFlightBundleLoads.get(url);\n\t\tif (existing) return existing;\n\t\tconst promise = loadBundleScriptWithRetry(url, doc).finally(() => {\n\t\t\tinFlightBundleLoads.delete(url);\n\t\t});\n\t\tinFlightBundleLoads.set(url, promise);\n\t\treturn promise;\n\t}\n\n\t/**\n\t * Wrap the single-shot script loader with poll-until-ready retry.\n\t *\n\t * The PIE bundle service may return a transient failure while it\n\t * builds a bundle on demand. Retry with fixed-interval polling until\n\t * the bundle is ready or the cumulative deadline elapses. Emits\n\t * retry lifecycle events to the host via `onBundleRetryStatus` and to\n\t * the instrumentation provider (if configured and ready).\n\t */\n\tasync function loadBundleScriptWithRetry(\n\t\turl: string,\n\t\tdoc: Document,\n\t): Promise<void> {\n\t\tconst { retryDelayMs, timeoutMs } = resolveBundleRetryConfig(\n\t\t\tconfig.bundleRetry,\n\t\t);\n\t\tconst startedAt = Date.now();\n\t\tlet attempt = 0;\n\t\twhile (true) {\n\t\t\tattempt += 1;\n\t\t\ttry {\n\t\t\t\tawait loadBundleScript(url, doc);\n\t\t\t\tconst elapsedMs = Date.now() - startedAt;\n\t\t\t\tif (attempt > 1) {\n\t\t\t\t\tconfig.onBundleRetryStatus?.({\n\t\t\t\t\t\tstate: \"completed\",\n\t\t\t\t\t\turl,\n\t\t\t\t\t\tattempt,\n\t\t\t\t\t\telapsedMs,\n\t\t\t\t\t\ttimeoutMs,\n\t\t\t\t\t});\n\t\t\t\t\ttrackRetryEvent(\"pie-iife-bundle-retry-success\", {\n\t\t\t\t\t\turl,\n\t\t\t\t\t\tattempt,\n\t\t\t\t\t\telapsedMs,\n\t\t\t\t\t\ttimeoutMs,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t} catch (error) {\n\t\t\t\tconst elapsedMs = Date.now() - startedAt;\n\t\t\t\tconst remainingMs = timeoutMs - elapsedMs;\n\t\t\t\tconst reason = error instanceof Error ? error.message : String(error);\n\t\t\t\tif (remainingMs <= 0) {\n\t\t\t\t\tconst timeoutError = new Error(\n\t\t\t\t\t\t`IIFE bundle load timed out after ${timeoutMs}ms: ${url}`,\n\t\t\t\t\t);\n\t\t\t\t\tconfig.onBundleRetryStatus?.({\n\t\t\t\t\t\tstate: \"timeout\",\n\t\t\t\t\t\turl,\n\t\t\t\t\t\tattempt,\n\t\t\t\t\t\telapsedMs,\n\t\t\t\t\t\ttimeoutMs,\n\t\t\t\t\t\treason,\n\t\t\t\t\t});\n\t\t\t\t\ttrackRetryEvent(\"pie-iife-bundle-retry-timeout\", {\n\t\t\t\t\t\turl,\n\t\t\t\t\t\tattempt,\n\t\t\t\t\t\telapsedMs,\n\t\t\t\t\t\ttimeoutMs,\n\t\t\t\t\t\tlastError: reason,\n\t\t\t\t\t});\n\t\t\t\t\ttrackRetryError(timeoutError, {\n\t\t\t\t\t\turl,\n\t\t\t\t\t\tattempt,\n\t\t\t\t\t\telapsedMs,\n\t\t\t\t\t\ttimeoutMs,\n\t\t\t\t\t\tlastError: reason,\n\t\t\t\t\t});\n\t\t\t\t\tthrow timeoutError;\n\t\t\t\t}\n\t\t\t\tconst nextDelay = Math.min(retryDelayMs, remainingMs);\n\t\t\t\tconfig.onBundleRetryStatus?.({\n\t\t\t\t\tstate: \"retrying\",\n\t\t\t\t\turl,\n\t\t\t\t\tattempt,\n\t\t\t\t\telapsedMs,\n\t\t\t\t\ttimeoutMs,\n\t\t\t\t\tretryDelayMs: nextDelay,\n\t\t\t\t\treason,\n\t\t\t\t});\n\t\t\t\ttrackRetryEvent(\"pie-iife-bundle-retry\", {\n\t\t\t\t\turl,\n\t\t\t\t\tattempt,\n\t\t\t\t\telapsedMs,\n\t\t\t\t\tretryDelayMs: nextDelay,\n\t\t\t\t\ttimeoutMs,\n\t\t\t\t\tlastError: reason,\n\t\t\t\t});\n\t\t\t\tawait waitMs(nextDelay);\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction getInstrumentationProvider(): InstrumentationProvider | undefined {\n\t\tif (!config.trackPageActions) return undefined;\n\t\tconst provider = config.instrumentationProvider;\n\t\tif (!isInstrumentationProvider(provider)) return undefined;\n\t\tif (!provider.isReady()) return undefined;\n\t\treturn provider;\n\t}\n\n\tfunction trackRetryEvent(\n\t\teventName: string,\n\t\tattributes: Record<string, unknown>,\n\t): void {\n\t\tconst provider = getInstrumentationProvider();\n\t\tif (!provider) return;\n\t\ttry {\n\t\t\tprovider.trackEvent(eventName, attributes);\n\t\t} catch {\n\t\t\t// Swallow: instrumentation must never break loading.\n\t\t}\n\t}\n\n\tfunction trackRetryError(\n\t\terror: Error,\n\t\tattributes: Record<string, unknown>,\n\t): void {\n\t\tconst provider = getInstrumentationProvider();\n\t\tif (!provider) return;\n\t\ttry {\n\t\t\tprovider.trackError(error, {\n\t\t\t\t...attributes,\n\t\t\t\tcomponent: \"iife-adapter\",\n\t\t\t\terrorType: \"IifeBundleRetryError\",\n\t\t\t});\n\t\t} catch {\n\t\t\t// Swallow: instrumentation must never break loading.\n\t\t}\n\t}\n\n\tasync function load(\n\t\telements: ElementMap,\n\t\tcontext: BackendContext,\n\t): Promise<void> {\n\t\tif (!elements || Object.keys(elements).length === 0) return;\n\n\t\tconst conflict = findIifeElementMapConflict(elements);\n\t\tif (conflict) {\n\t\t\tconst reasons = new Map<ElementTag, RegistrationFailureReason>();\n\t\t\tfor (const tag of Object.keys(elements)) {\n\t\t\t\treasons.set(tag, {\n\t\t\t\t\tkind: \"backend-rejected\",\n\t\t\t\t\ttag,\n\t\t\t\t\tcause: conflict,\n\t\t\t\t});\n\t\t\t}\n\t\t\tthrow new AdapterFailure(reasons);\n\t\t}\n\n\t\tconst bundleUrl = buildBundleUrl(elements, bundleType, config);\n\t\ttry {\n\t\t\tawait ensureBundleLoaded(bundleUrl, context.doc);\n\t\t} catch (err) {\n\t\t\tconst cause = err instanceof Error ? err.message : String(err);\n\t\t\tconst reasons = new Map<ElementTag, RegistrationFailureReason>();\n\t\t\tfor (const tag of Object.keys(elements)) {\n\t\t\t\treasons.set(tag, {\n\t\t\t\t\tkind: \"bundle-load-failed\",\n\t\t\t\t\ttag,\n\t\t\t\t\turl: bundleUrl,\n\t\t\t\t\tcause,\n\t\t\t\t});\n\t\t\t}\n\t\t\tthrow new AdapterFailure(reasons);\n\t\t}\n\n\t\tconst pieModule = readPieModule();\n\t\tif (!pieModule) {\n\t\t\tconst reasons = new Map<ElementTag, RegistrationFailureReason>();\n\t\t\tfor (const tag of Object.keys(elements)) {\n\t\t\t\treasons.set(tag, {\n\t\t\t\t\tkind: \"bundle-load-failed\",\n\t\t\t\t\ttag,\n\t\t\t\t\turl: bundleUrl,\n\t\t\t\t\tcause: \"window.pie.default missing after bundle load\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tthrow new AdapterFailure(reasons);\n\t\t}\n\n\t\tconst reasons = new Map<ElementTag, RegistrationFailureReason>();\n\t\tconst isEditorBundle = bundleType === BundleType.editor;\n\t\tconst registry = pieRegistry();\n\n\t\tfor (const [tag, packageVersion] of Object.entries(elements)) {\n\t\t\tconst packageName = getPackageWithoutVersion(packageVersion);\n\t\t\tconst elementData = pieModule[packageName];\n\t\t\tif (!elementData) {\n\t\t\t\treasons.set(tag, {\n\t\t\t\t\tkind: \"package-not-in-bundle\",\n\t\t\t\t\ttag,\n\t\t\t\t\tpackageName,\n\t\t\t\t\tavailablePackages: Object.keys(pieModule),\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst ElementClass = isEditorBundle\n\t\t\t\t? (elementData.Configure ?? createEmptyConfigure())\n\t\t\t\t: elementData.Element;\n\n\t\t\tif (!ElementClass) {\n\t\t\t\treasons.set(tag, {\n\t\t\t\t\tkind: \"no-element-class\",\n\t\t\t\t\ttag,\n\t\t\t\t\tpackageName,\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!isCustomElementConstructor(ElementClass)) {\n\t\t\t\treasons.set(tag, {\n\t\t\t\t\tkind: \"not-a-constructor\",\n\t\t\t\t\ttag,\n\t\t\t\t\tpackageName,\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet actualTag: string;\n\t\t\ttry {\n\t\t\t\tactualTag = validateCustomElementTag(\n\t\t\t\t\ttag,\n\t\t\t\t\t`element tag for ${packageName}`,\n\t\t\t\t);\n\t\t\t} catch (err) {\n\t\t\t\treasons.set(tag, {\n\t\t\t\t\tkind: \"define-failed\",\n\t\t\t\t\ttag,\n\t\t\t\t\tcause: err instanceof Error ? err.message : String(err),\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tdefineCustomElementSafely(\n\t\t\t\t\tactualTag,\n\t\t\t\t\tclass extends ElementClass {},\n\t\t\t\t\t`element tag for ${packageName}`,\n\t\t\t\t);\n\t\t\t} catch (err) {\n\t\t\t\treasons.set(tag, {\n\t\t\t\t\tkind: \"define-failed\",\n\t\t\t\t\ttag,\n\t\t\t\t\tcause: err instanceof Error ? err.message : String(err),\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tregistry[actualTag] = {\n\t\t\t\tpackage: packageVersion,\n\t\t\t\tstatus: Status.loaded,\n\t\t\t\ttagName: actualTag,\n\t\t\t\telement: ElementClass,\n\t\t\t\tcontroller: needsControllers ? (elementData.controller ?? null) : null,\n\t\t\t\tconfig: elementData.config ?? null,\n\t\t\t\tbundleType,\n\t\t\t};\n\t\t}\n\n\t\tif (reasons.size > 0) {\n\t\t\tthrow new AdapterFailure(reasons);\n\t\t}\n\t}\n\n\treturn {\n\t\tload,\n\t\tget __seams() {\n\t\t\treturn __seams;\n\t\t},\n\t};\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction defaultLoadBundleScript(url: string, doc: Document): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst script = doc.createElement(\"script\") as HTMLScriptElement;\n\t\tscript.src = url;\n\t\tscript.defer = true;\n\t\tscript.setAttribute(\"data-pie-bundle\", \"true\");\n\t\tscript.onload = () => resolve();\n\t\tscript.onerror = () =>\n\t\t\treject(new Error(`Failed to load IIFE bundle from: ${url}`));\n\t\tdoc.head.appendChild(script);\n\t});\n}\n\nfunction readPieModule(): Record<string, any> | undefined {\n\tconst maybeWindow = (\n\t\tglobalThis as { window?: { pie?: { default?: unknown } } }\n\t).window;\n\tconst pieDefault = maybeWindow?.pie?.default;\n\tif (!pieDefault || typeof pieDefault !== \"object\") return undefined;\n\treturn pieDefault as Record<string, any>;\n}\n\nfunction buildBundleUrl(\n\telements: ElementMap,\n\tbundleType: BundleType,\n\tconfig: IifeBackendConfig,\n): string {\n\tconst elementTags = Object.keys(elements).sort().join(\",\");\n\n\tif (config.bundleInfo?.url) {\n\t\tconst separator = config.bundleInfo.url.includes(\"?\") ? \"&\" : \"?\";\n\t\treturn elementTags\n\t\t\t? `${config.bundleInfo.url}${separator}elements=${encodeURIComponent(elementTags)}`\n\t\t\t: config.bundleInfo.url;\n\t}\n\n\tconst packageVersions = Object.values(elements).join(\"+\");\n\tconst host = normalizeBundleHost(config.bundleHost);\n\tconst base = `${host}${encodeURI(packageVersions)}/${bundleType}`;\n\treturn elementTags\n\t\t? `${base}?elements=${encodeURIComponent(elementTags)}`\n\t\t: base;\n}\n\nfunction normalizeBundleHost(host: string): string {\n\treturn `${host.trim().replace(/\\/+$/, \"\")}/`;\n}\n\nfunction resolveBundleRetryConfig(\n\tconfigured: IifeBundleRetryConfig | undefined,\n): Required<IifeBundleRetryConfig> {\n\tconst retryDelayMs =\n\t\ttypeof configured?.retryDelayMs === \"number\" && configured.retryDelayMs > 0\n\t\t\t? configured.retryDelayMs\n\t\t\t: DEFAULT_IIFE_BUNDLE_RETRY_CONFIG.retryDelayMs;\n\tconst timeoutMs =\n\t\ttypeof configured?.timeoutMs === \"number\" && configured.timeoutMs > 0\n\t\t\t? configured.timeoutMs\n\t\t\t: DEFAULT_IIFE_BUNDLE_RETRY_CONFIG.timeoutMs;\n\treturn { retryDelayMs, timeoutMs };\n}\n\nfunction waitMs(ms: number): Promise<void> {\n\treturn new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction createEmptyConfigure(): CustomElementConstructor {\n\t// Minimal configure fallback used for editor bundles that omit a Configure\n\t// export. Intentionally silent; the host will see a blank configuration UI\n\t// rather than a hard failure.\n\treturn class EmptyConfigureElement extends HTMLElement {\n\t\tprivate _model: unknown;\n\t\tprivate _configuration: unknown;\n\t\tget model() {\n\t\t\treturn this._model;\n\t\t}\n\t\tset model(v: unknown) {\n\t\t\tthis._model = v;\n\t\t}\n\t\tget configuration() {\n\t\t\treturn this._configuration;\n\t\t}\n\t\tset configuration(v: unknown) {\n\t\t\tthis._configuration = v;\n\t\t}\n\t};\n}\n"]}
@@ -32,6 +32,8 @@
32
32
  */
33
33
  export type { ElementMap } from "./ElementLoader.js";
34
34
  export { aggregateElements } from "./ElementLoader.js";
35
+ export type { ElementPackagePolicy } from "./element-package-policy.js";
36
+ export { assertElementPackagesAllowed, ElementPackagePolicyError, } from "./element-package-policy.js";
35
37
  export type { BackendContext, BackendOption, ElementLoaderBackend, ElementTag, EnsureRegisteredOptions, EsmBackendConfig, IifeBackendConfig, RegistrationFailureReason, } from "./element-loader.js";
36
38
  export { AdapterFailure, ElementAssertionError, ElementLoaderError, assertRegistered, ensureRegistered, } from "./element-loader.js";
37
39
  export type { BuiltInEsmCdnProviderName, EsmBackend, EsmCdnProvider, EsmCdnProviderName, EsmCdnProviderOption, ViewConfig, } from "./esm-adapter.js";
@@ -31,6 +31,7 @@
31
31
  * ```
32
32
  */
33
33
  export { aggregateElements } from "./ElementLoader.js";
34
+ export { assertElementPackagesAllowed, ElementPackagePolicyError, } from "./element-package-policy.js";
34
35
  export { AdapterFailure, ElementAssertionError, ElementLoaderError, assertRegistered, ensureRegistered, } from "./element-loader.js";
35
36
  export { BUILT_IN_VIEWS, createEsmBackend, mapEsmViewElements, } from "./esm-adapter.js";
36
37
  export { createIifeBackend, DEFAULT_BUNDLE_HOST } from "./iife-adapter.js";
@@ -1 +1 @@
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;AAcvD,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\";\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
+ {"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"]}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Rewrite exact authored custom-element tags to their authoring-mode variants.
3
+ * Tag names are escaped because valid custom-element names may contain regexp
4
+ * metacharacters such as dots.
5
+ */
6
+ export declare function transformMarkupForAuthoring(markup: string, elements: Record<string, string>): string;
@@ -0,0 +1,13 @@
1
+ const escapeRegExp = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
2
+ /**
3
+ * Rewrite exact authored custom-element tags to their authoring-mode variants.
4
+ * Tag names are escaped because valid custom-element names may contain regexp
5
+ * metacharacters such as dots.
6
+ */
7
+ export function transformMarkupForAuthoring(markup, elements) {
8
+ return Object.keys(elements).reduce((result, elementTag) => {
9
+ const exactTag = new RegExp(`(<\\/?)${escapeRegExp(elementTag)}(?=[\\t\\n\\f\\r />])`, "g");
10
+ return result.replace(exactTag, (_match, opening) => `${opening}${elementTag}-config`);
11
+ }, markup);
12
+ }
13
+ //# sourceMappingURL=authoring-tag.js.map
@@ -0,0 +1 @@
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"]}
@@ -35,11 +35,10 @@ export declare const addMarkupForPackage: (config: ConfigEntity, npmPackage: str
35
35
  */
36
36
  export declare const addRubricIfNeeded: (content: ConfigEntity) => ConfigEntity;
37
37
  /**
38
- * We make the web component name unique by using the version number. This is needed
39
- * because the spec doesn't allow for removing/ updating a custom element definition
40
- * once it's been defined. This is a workaround to ensure that the custom element
41
- * is redefined when the version changes. This requires the same thing to be done
42
- * in the markup when the item is loaded on the backend, similarly, and in addition
43
- * to applying sanctioned versions appropriate for the current organization.
38
+ * We make the web component name unique by using the version number because a
39
+ * CustomElementRegistry definition cannot be removed, updated, or replaced. A
40
+ * distinct versioned tag gives each loaded constructor its own effective runtime
41
+ * namespace, allowing several versions of one PIE element to coexist. The same
42
+ * transformation must be applied to the runtime markup and model references.
44
43
  */
45
44
  export declare const makeUniqueTags: <T extends ConfigContainerEntity>(container: T) => T;
@@ -5,9 +5,10 @@
5
5
  */
6
6
  import { cloneDeep } from "../object/index.js";
7
7
  import { parsePackageName } from "./utils.js";
8
+ import { parseVersionedTagName, toPackageVersionedTag, } from "./versioned-tag.js";
8
9
  function collectMarkupElementTags(markup) {
9
10
  const tags = new Set();
10
- const tagRegex = /<\/?([a-zA-Z][\w-]*)\b/g;
11
+ const tagRegex = /<\/?([a-zA-Z][a-zA-Z0-9._-]*)(?=[\t\n\f\r />])/g;
11
12
  let match = null;
12
13
  while ((match = tagRegex.exec(markup)) !== null) {
13
14
  const tagName = String(match[1] || "").trim();
@@ -59,7 +60,7 @@ export const validatePieConfigContract = (config) => {
59
60
  continue;
60
61
  }
61
62
  try {
62
- parsePackageName(packageSpec);
63
+ toPackageVersionedTag(tagName, packageSpec);
63
64
  }
64
65
  catch {
65
66
  errors.push(`Element "${tagName}" has invalid package spec "${packageSpec}".`);
@@ -180,42 +181,16 @@ export const addRubricIfNeeded = (content) => {
180
181
  });
181
182
  };
182
183
  /**
183
- * We make the web component name unique by using the version number. This is needed
184
- * because the spec doesn't allow for removing/ updating a custom element definition
185
- * once it's been defined. This is a workaround to ensure that the custom element
186
- * is redefined when the version changes. This requires the same thing to be done
187
- * in the markup when the item is loaded on the backend, similarly, and in addition
188
- * to applying sanctioned versions appropriate for the current organization.
184
+ * We make the web component name unique by using the version number because a
185
+ * CustomElementRegistry definition cannot be removed, updated, or replaced. A
186
+ * distinct versioned tag gives each loaded constructor its own effective runtime
187
+ * namespace, allowing several versions of one PIE element to coexist. The same
188
+ * transformation must be applied to the runtime markup and model references.
189
189
  */
190
190
  export const makeUniqueTags = (container) => {
191
- const VERSION_DELIMITER = "--version-";
192
- const TAG_VERSION_PATTERN = "[0-9A-Za-z-]+";
193
- const encodeVersionForTag = (version) => version
194
- .trim()
195
- .replace(/[.+]/g, "-")
196
- .replace(/[^0-9A-Za-z-]/g, "-")
197
- .replace(/-{2,}/g, "-");
198
- const parseElementName = (elName) => {
199
- const versionMatch = elName.match(new RegExp(`${VERSION_DELIMITER}(${TAG_VERSION_PATTERN})$`));
200
- return versionMatch
201
- ? {
202
- baseName: elName.replace(`${VERSION_DELIMITER}${versionMatch[1]}`, ""),
203
- existingEncodedVersion: versionMatch[1],
204
- }
205
- : { baseName: elName };
206
- };
207
- const createVersionedName = (elName, pkg) => {
208
- const { baseName, existingEncodedVersion } = parseElementName(elName);
209
- const { version } = parsePackageName(pkg);
210
- const targetEncodedVersion = encodeVersionForTag(version);
211
- if (existingEncodedVersion !== targetEncodedVersion) {
212
- return `${baseName}${VERSION_DELIMITER}${targetEncodedVersion}`;
213
- }
214
- return elName;
215
- };
216
191
  // Create mapping of original to versioned names
217
192
  const elementMappings = Object.entries(container.config.elements).reduce((acc, [elName, pkg]) => {
218
- const versionedName = createVersionedName(elName, pkg);
193
+ const versionedName = toPackageVersionedTag(elName, pkg);
219
194
  return {
220
195
  ...acc,
221
196
  [elName]: {
@@ -224,11 +199,16 @@ export const makeUniqueTags = (container) => {
224
199
  },
225
200
  };
226
201
  }, {});
227
- // Transform markup using the mappings
202
+ // Transform exact opening/closing tags only. Element names may contain
203
+ // regexp-significant characters, and prefix tags (pie-foo/pie-foo-bar)
204
+ // are separate authored-content contracts.
205
+ const escapeRegExp = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
206
+ const replaceMarkupTag = (markup, originalName, versionedName) => {
207
+ const exactTag = new RegExp(`(<\\/?)${escapeRegExp(originalName)}(?=[\\t\\n\\f\\r />])`, "g");
208
+ return markup.replace(exactTag, (_match, opening) => `${opening}${versionedName}`);
209
+ };
228
210
  const markup = Object.entries(elementMappings).reduce((currentMarkup, [originalName, { versionedName }]) => originalName !== versionedName
229
- ? currentMarkup
230
- .replace(new RegExp(`<${originalName}`, "g"), `<${versionedName}`)
231
- .replace(new RegExp(`</${originalName}`, "g"), `</${versionedName}`)
211
+ ? replaceMarkupTag(currentMarkup, originalName, versionedName)
232
212
  : currentMarkup, container.config.markup);
233
213
  // Create new elements object
234
214
  const elements = Object.values(elementMappings).reduce((acc, { versionedName, package: pkg }) => ({
@@ -250,21 +230,22 @@ export const makeUniqueTags = (container) => {
250
230
  if (elements[originalElement]) {
251
231
  return model;
252
232
  }
253
- // For cases where the model's element isn't in the original elements mapping
254
- // Try to find by base name (without version)
233
+ // pie-item contract compatibility: makeUniqueTags historically repaired an
234
+ // unversioned model reference when the element map contained a versioned tag.
235
+ // Preserve only the unambiguous case; never guess between multiple versions.
255
236
  const baseNameMatches = Object.entries(elementMappings).filter(([key]) => {
256
- const { baseName } = parseElementName(key);
257
- return baseName === originalElement;
237
+ const { baseName, existingEncodedVersion } = parseVersionedTagName(key);
238
+ return (existingEncodedVersion !== undefined && baseName === originalElement);
258
239
  });
259
- if (baseNameMatches.length > 0) {
260
- // Use the first match if there are multiple (shouldn't happen in normal usage)
240
+ if (baseNameMatches.length === 1) {
261
241
  const [, { versionedName }] = baseNameMatches[0];
262
242
  return {
263
243
  ...model,
264
244
  element: versionedName,
265
245
  };
266
246
  }
267
- // If we can't find a mapping, keep the original
247
+ // Invalid or ambiguous undeclared model references stay untouched here;
248
+ // validation owns the error.
268
249
  return model;
269
250
  });
270
251
  return {
@@ -1 +1 @@
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\";\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][\\w-]*)\\b/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\tparsePackageName(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. This is needed\n * because the spec doesn't allow for removing/ updating a custom element definition\n * once it's been defined. This is a workaround to ensure that the custom element\n * is redefined when the version changes. This requires the same thing to be done\n * in the markup when the item is loaded on the backend, similarly, and in addition\n * to applying sanctioned versions appropriate for the current organization.\n */\nexport const makeUniqueTags = <T extends ConfigContainerEntity>(\n\tcontainer: T,\n): T => {\n\tconst VERSION_DELIMITER = \"--version-\";\n\tconst TAG_VERSION_PATTERN = \"[0-9A-Za-z-]+\";\n\tconst encodeVersionForTag = (version: string): string =>\n\t\tversion\n\t\t\t.trim()\n\t\t\t.replace(/[.+]/g, \"-\")\n\t\t\t.replace(/[^0-9A-Za-z-]/g, \"-\")\n\t\t\t.replace(/-{2,}/g, \"-\");\n\n\tconst parseElementName = (\n\t\telName: string,\n\t): { baseName: string; existingEncodedVersion?: string } => {\n\t\tconst versionMatch = elName.match(\n\t\t\tnew RegExp(`${VERSION_DELIMITER}(${TAG_VERSION_PATTERN})$`),\n\t\t);\n\t\treturn versionMatch\n\t\t\t? {\n\t\t\t\t\tbaseName: elName.replace(\n\t\t\t\t\t\t`${VERSION_DELIMITER}${versionMatch[1]}`,\n\t\t\t\t\t\t\"\",\n\t\t\t\t\t),\n\t\t\t\t\texistingEncodedVersion: versionMatch[1],\n\t\t\t\t}\n\t\t\t: { baseName: elName };\n\t};\n\n\tconst createVersionedName = (elName: string, pkg: string): string => {\n\t\tconst { baseName, existingEncodedVersion } = parseElementName(elName);\n\t\tconst { version } = parsePackageName(pkg);\n\t\tconst targetEncodedVersion = encodeVersionForTag(version);\n\n\t\tif (existingEncodedVersion !== targetEncodedVersion) {\n\t\t\treturn `${baseName}${VERSION_DELIMITER}${targetEncodedVersion}`;\n\t\t}\n\n\t\treturn elName;\n\t};\n\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 = createVersionedName(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\n\t// Transform markup using the mappings\n\tconst markup = Object.entries(elementMappings).reduce(\n\t\t(currentMarkup, [originalName, { versionedName }]) =>\n\t\t\toriginalName !== versionedName\n\t\t\t\t? currentMarkup\n\t\t\t\t\t\t.replace(new RegExp(`<${originalName}`, \"g\"), `<${versionedName}`)\n\t\t\t\t\t\t.replace(new RegExp(`</${originalName}`, \"g\"), `</${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// For cases where the model's element isn't in the original elements mapping\n\t\t// Try to find by base name (without version)\n\t\tconst baseNameMatches = Object.entries(elementMappings).filter(([key]) => {\n\t\t\tconst { baseName } = parseElementName(key);\n\t\t\treturn baseName === originalElement;\n\t\t});\n\n\t\tif (baseNameMatches.length > 0) {\n\t\t\t// Use the first match if there are multiple (shouldn't happen in normal usage)\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// If we can't find a mapping, keep the original\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
+ {"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"]}
@@ -20,7 +20,8 @@ export declare function applyElementOverrides(config: any, elementOverrides: Ele
20
20
  * Unlike `applyElementOverrides`, this helper keeps `config.markup` and
21
21
  * `config.elements` keys intact and only updates each matching element package
22
22
  * value to the requested version. This is intended for unified `pie-item-player`
23
- * flows where stable tag names are required.
23
+ * flows that preserve authored tags at the override boundary; `makeUniqueTags`
24
+ * later derives the effective per-version runtime namespace on a cloned config.
24
25
  */
25
26
  export declare function applyElementVersionOverridesPreserveTags(config: any, elementOverrides: ElementOverrides): any;
26
27
  /**
@@ -9,6 +9,7 @@
9
9
  import { cloneDeep } from "../object/index.js";
10
10
  import { createPieLogger, isGlobalDebugEnabled } from "./logger.js";
11
11
  import { parsePackageName } from "./utils.js";
12
+ import { toPackageVersionedTag } from "./versioned-tag.js";
12
13
  const logger = createPieLogger("pie-overrides", () => isGlobalDebugEnabled());
13
14
  /**
14
15
  * Apply element overrides to a PIE config
@@ -22,46 +23,61 @@ export function applyElementOverrides(config, elementOverrides) {
22
23
  Object.keys(elementOverrides).length === 0) {
23
24
  return config;
24
25
  }
25
- // Create a deep copy of the config to avoid mutating the original
26
+ // pie-item contract compatibility: runtime version overrides have historically
27
+ // returned a cloned config with tags renamed for the selected package version.
26
28
  const updatedConfig = cloneDeep(config);
27
29
  // Check if there are elements to override
28
30
  if (!updatedConfig.elements) {
29
31
  return updatedConfig;
30
32
  }
31
- // Process each override
32
- for (const [packageName, version] of Object.entries(elementOverrides)) {
33
- let matched = false;
34
- // Find the element key that uses this package
35
- for (const [elementKey, elementPackageValue] of Object.entries(updatedConfig.elements)) {
36
- const elementPackageStr = String(elementPackageValue);
37
- let basePackageName = "";
38
- try {
39
- basePackageName = parsePackageName(elementPackageStr).name;
40
- }
41
- catch {
42
- logger.debug(`Couldn't parse element package value: ${elementPackageStr}`);
33
+ const matchedPackages = new Set();
34
+ const tagMappings = new Map();
35
+ const elements = {};
36
+ for (const [elementKey, elementPackageValue] of Object.entries(updatedConfig.elements)) {
37
+ const elementPackageStr = String(elementPackageValue);
38
+ try {
39
+ const parsed = parsePackageName(elementPackageStr);
40
+ const overrideVersion = elementOverrides[parsed.name];
41
+ if (overrideVersion === undefined) {
42
+ elements[elementKey] = elementPackageValue;
43
43
  continue;
44
44
  }
45
- if (basePackageName === packageName) {
46
- matched = true;
47
- // Create a new element key with the specified version
48
- const versionNumber = String(version).replace(/[^0-9.-]/g, "");
49
- const parts = String(elementKey).split("--version-");
50
- const baseElementName = parts[0];
51
- const newElementKey = `${baseElementName}--version-${versionNumber.replace(/\./g, "-")}`;
52
- // Update the elements map
53
- updatedConfig.elements[newElementKey] = `${packageName}@${version}`;
54
- // If the key changed, update markup to reference the new key
55
- if (newElementKey !== elementKey) {
56
- if (updatedConfig.markup) {
57
- updatedConfig.markup = String(updatedConfig.markup).replace(new RegExp(elementKey, "g"), newElementKey);
58
- }
59
- // Remove the old element if we created a new one with a different key
60
- delete updatedConfig.elements[elementKey];
61
- }
45
+ matchedPackages.add(parsed.name);
46
+ const packageBase = parsed.path
47
+ ? `${parsed.name}/${parsed.path}`
48
+ : parsed.name;
49
+ const overriddenPackage = `${packageBase}@${String(overrideVersion).trim()}`;
50
+ const overriddenTag = toPackageVersionedTag(elementKey, overriddenPackage);
51
+ elements[overriddenTag] = overriddenPackage;
52
+ if (overriddenTag !== elementKey) {
53
+ tagMappings.set(elementKey, overriddenTag);
62
54
  }
63
55
  }
64
- if (!matched) {
56
+ catch {
57
+ logger.debug(`Couldn't parse element package value: ${elementPackageStr}`);
58
+ elements[elementKey] = elementPackageValue;
59
+ }
60
+ }
61
+ updatedConfig.elements = elements;
62
+ if (tagMappings.size > 0) {
63
+ if (updatedConfig.markup) {
64
+ const escapeRegExp = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
65
+ const sourceTags = [...tagMappings.keys()]
66
+ .sort((left, right) => right.length - left.length)
67
+ .map(escapeRegExp)
68
+ .join("|");
69
+ const exactTag = new RegExp(`(<\\/?)(${sourceTags})(?=[\\t\\n\\f\\r />])`, "g");
70
+ updatedConfig.markup = String(updatedConfig.markup).replace(exactTag, (_match, opening, tagName) => `${opening}${tagMappings.get(tagName) ?? tagName}`);
71
+ }
72
+ if (Array.isArray(updatedConfig.models)) {
73
+ updatedConfig.models = updatedConfig.models.map((model) => {
74
+ const overriddenTag = tagMappings.get(model?.element);
75
+ return overriddenTag ? { ...model, element: overriddenTag } : model;
76
+ });
77
+ }
78
+ }
79
+ for (const packageName of Object.keys(elementOverrides)) {
80
+ if (!matchedPackages.has(packageName)) {
65
81
  logger.debug(`No matching element found for package ${packageName}`);
66
82
  }
67
83
  }
@@ -73,7 +89,8 @@ export function applyElementOverrides(config, elementOverrides) {
73
89
  * Unlike `applyElementOverrides`, this helper keeps `config.markup` and
74
90
  * `config.elements` keys intact and only updates each matching element package
75
91
  * value to the requested version. This is intended for unified `pie-item-player`
76
- * flows where stable tag names are required.
92
+ * flows that preserve authored tags at the override boundary; `makeUniqueTags`
93
+ * later derives the effective per-version runtime namespace on a cloned config.
77
94
  */
78
95
  export function applyElementVersionOverridesPreserveTags(config, elementOverrides) {
79
96
  if (!config ||