@fluid-app/portal-sdk 0.1.375 → 0.1.376

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 (29) hide show
  1. package/dist/{authoring-Di7OJapg.d.cts → authoring-DDJSpQcy.d.cts} +2 -2
  2. package/dist/{authoring-D0yimRFr.d.mts.map → authoring-DDJSpQcy.d.cts.map} +1 -1
  3. package/dist/{authoring-D0yimRFr.d.mts → authoring-DUQfz-af.d.mts} +2 -2
  4. package/dist/{authoring-Di7OJapg.d.cts.map → authoring-DUQfz-af.d.mts.map} +1 -1
  5. package/dist/index.cjs +119 -18
  6. package/dist/index.cjs.map +1 -1
  7. package/dist/index.d.cts +4 -3
  8. package/dist/index.d.cts.map +1 -1
  9. package/dist/index.d.mts +4 -3
  10. package/dist/index.d.mts.map +1 -1
  11. package/dist/index.mjs +119 -18
  12. package/dist/index.mjs.map +1 -1
  13. package/dist/preview/preview-entry.cjs +1 -1
  14. package/dist/preview/preview-entry.d.cts +1 -1
  15. package/dist/preview/preview-entry.d.mts +1 -1
  16. package/dist/preview/preview-entry.mjs +1 -1
  17. package/dist/{widget-package-descriptor-Chc8Gb6V.d.cts → widget-package-descriptor-BFknJmTb.d.cts} +11 -1
  18. package/dist/{widget-package-descriptor-Chc8Gb6V.d.cts.map → widget-package-descriptor-BFknJmTb.d.cts.map} +1 -1
  19. package/dist/{widget-package-descriptor-fjHqObKE.d.mts → widget-package-descriptor-BTnvi-td.d.mts} +11 -1
  20. package/dist/{widget-package-descriptor-fjHqObKE.d.mts.map → widget-package-descriptor-BTnvi-td.d.mts.map} +1 -1
  21. package/dist/{widget-package-utils-pdLitM72.cjs → widget-package-utils-CJp6o3RD.cjs} +94 -40
  22. package/dist/widget-package-utils-CJp6o3RD.cjs.map +1 -0
  23. package/dist/{widget-package-utils-DG2ibxqS.mjs → widget-package-utils-DnNxWKOo.mjs} +94 -40
  24. package/dist/widget-package-utils-DnNxWKOo.mjs.map +1 -0
  25. package/dist/widgets/authoring.d.cts +1 -1
  26. package/dist/widgets/authoring.d.mts +1 -1
  27. package/package.json +10 -10
  28. package/dist/widget-package-utils-DG2ibxqS.mjs.map +0 -1
  29. package/dist/widget-package-utils-pdLitM72.cjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widget-package-utils-CJp6o3RD.cjs","names":["globalMarker","widgetPackageTypes","widgetContainers","widgetResizableValues","isRecord","hasAmbiguousHttpScheme","Component","DEFAULT_SDK_WIDGET_REGISTRY"],"sources":["../src/config/env.ts","../src/config/defaults.ts","../../../platform/widget-runtime/src/errors.ts","../../../platform/widget-runtime/src/fluid-widgets.ts","../../../platform/widget-runtime/src/catalog.ts","../../../platform/widget-runtime/src/validation.ts","../../../platform/widget-runtime/src/loader.ts","../../../platform/widget-runtime/src/globals.ts","../../../platform/widget-runtime/src/components/WidgetRuntimeErrorBoundary.tsx","../src/utils/build-widget-registry.ts","../src/utils/widget-package-manifest-url.ts","../src/utils/load-widget-packages.ts","../src/utils/widget-package-utils.ts"],"sourcesContent":["/**\n * Read Vite environment variables at runtime.\n *\n * Isolated into its own module so that Jest tests can mock it\n * (import.meta is a syntax-level construct that CJS/Jest cannot parse).\n */\nexport function getViteEnv(key: string): string | undefined {\n const env = import.meta.env as unknown as Record<string, string> | undefined;\n return env?.[key];\n}\n","import type { FluidSDKConfig } from \"../types/config\";\nimport { getViteEnv } from \"./env\";\n\n/**\n * Creates a FluidSDKConfig with sensible defaults.\n *\n * Default behavior:\n * - baseUrl: reads from `VITE_API_URL` env var, falls back to `\"\"` (same-origin relative)\n * - Auth: relies on session cookies sent via `credentials: 'include'`\n *\n * Pass overrides to customize any field:\n * ```ts\n * const config = createDefaultFluidConfig({ baseUrl: \"https://my-api.example.com\" });\n * ```\n */\nexport function createDefaultFluidConfig(\n overrides?: Partial<FluidSDKConfig>,\n): FluidSDKConfig {\n return {\n baseUrl: getViteEnv(\"VITE_API_URL\") ?? \"\",\n smartyEmbeddedKey: getViteEnv(\"NEXT_PUBLIC_SMARTY_EMBEDDED_KEY\"),\n googleMapsApiKey: getViteEnv(\"NEXT_PUBLIC_GOOGLE_MAPS_API_KEY\"),\n ...overrides,\n };\n}\n","export type WidgetRuntimeErrorCode =\n | \"INVALID_DESCRIPTOR\"\n | \"INVALID_REGISTRATION\"\n | \"REGISTRATION_MISMATCH\"\n | \"REGISTRATION_MISSING\"\n | \"SCRIPT_LOAD_FAILED\"\n | \"SCRIPT_TIMEOUT\";\n\nexport interface WidgetRuntimeErrorDetails {\n readonly code: WidgetRuntimeErrorCode;\n readonly message: string;\n readonly packageId?: string;\n readonly version?: string;\n readonly cause?: unknown;\n}\n\nexport class WidgetRuntimeError extends Error {\n readonly code: WidgetRuntimeErrorCode;\n readonly packageId?: string;\n readonly version?: string;\n override readonly cause?: unknown;\n\n constructor(details: WidgetRuntimeErrorDetails) {\n super(details.message);\n this.name = \"WidgetRuntimeError\";\n this.code = details.code;\n this.packageId = details.packageId;\n this.version = details.version;\n this.cause = details.cause;\n }\n}\n\nexport function toWidgetRuntimeError(\n error: unknown,\n fallback: Omit<WidgetRuntimeErrorDetails, \"message\"> & {\n readonly message: string;\n },\n): WidgetRuntimeError {\n if (error instanceof WidgetRuntimeError) {\n return error;\n }\n\n return new WidgetRuntimeError({\n ...fallback,\n cause: error,\n });\n}\n","import type {\n FluidWidgetsGlobal,\n FluidWidgetsGlobalRegistryEvent,\n GlobalRegisteredWidget,\n WidgetPackageRegistration,\n WidgetRuntimeRegistryKey,\n} from \"./types\";\n\nconst globalMarker = Symbol.for(\"fluid.widget-runtime.FluidWidgetsGlobal\");\nconst cleanupRegistrationMarker = Symbol.for(\n \"fluid.widget-runtime.FluidWidgetsGlobal.cleanupRegistration\",\n);\n\ntype MutableFluidWidgetsGlobal = FluidWidgetsGlobal & {\n readonly [globalMarker]: true;\n readonly [cleanupRegistrationMarker]: (\n registration: WidgetPackageRegistration,\n previousRegistration: WidgetPackageRegistration | undefined,\n ) => void;\n};\n\nexport function ensureFluidWidgetsGlobal(): FluidWidgetsGlobal {\n const existing = window.FluidWidgets;\n if (isFluidWidgetsGlobal(existing)) {\n return existing;\n }\n\n const registrationsByPackageKey = new Map<\n string,\n WidgetPackageRegistration\n >();\n const subscribers = new Set<\n (event: FluidWidgetsGlobalRegistryEvent) => void\n >();\n\n const fluidWidgets: MutableFluidWidgetsGlobal = {\n [globalMarker]: true,\n\n [cleanupRegistrationMarker](registration, previousRegistration) {\n const registrationKey = createPackageRegistrationKey(\n registration.packageId,\n registration.version,\n );\n if (registrationsByPackageKey.get(registrationKey) !== registration) {\n return;\n }\n\n if (previousRegistration === undefined) {\n registrationsByPackageKey.delete(registrationKey);\n return;\n }\n\n registrationsByPackageKey.set(registrationKey, previousRegistration);\n },\n\n registerPackage(registration) {\n const registrationKey = createPackageRegistrationKey(\n registration.packageId,\n registration.version,\n );\n const previousRegistration =\n registrationsByPackageKey.get(registrationKey);\n registrationsByPackageKey.set(registrationKey, registration);\n notify({ kind: \"register\", registration, previousRegistration });\n },\n\n getPackageRegistration(packageId, version) {\n return registrationsByPackageKey.get(\n createPackageRegistrationKey(packageId, version),\n );\n },\n\n getRegisteredWidgets() {\n return Array.from(registrationsByPackageKey.values()).flatMap(\n (registration) =>\n registration.widgets.map(\n (widget) =>\n ({\n ...widget,\n packageId: registration.packageId,\n version: registration.version,\n }) satisfies GlobalRegisteredWidget,\n ),\n );\n },\n\n getRegistry() {\n const registry = new Map<\n WidgetRuntimeRegistryKey,\n GlobalRegisteredWidget\n >();\n for (const registration of registrationsByPackageKey.values()) {\n for (const widget of registration.widgets) {\n const globalWidget: GlobalRegisteredWidget = {\n ...widget,\n packageId: registration.packageId,\n version: registration.version,\n };\n registry.set(\n createGlobalWidgetRegistryKey(\n registration.packageId,\n registration.version,\n widget.type,\n ),\n globalWidget,\n );\n }\n }\n return registry;\n },\n\n clear(packageId, version) {\n if (packageId === undefined) {\n registrationsByPackageKey.clear();\n notify({ kind: \"clear\" });\n return;\n }\n\n let cleared = false;\n for (const [key, registration] of registrationsByPackageKey) {\n if (\n registration.packageId === packageId &&\n (version === undefined || registration.version === version)\n ) {\n registrationsByPackageKey.delete(key);\n cleared = true;\n }\n }\n\n if (cleared) {\n notify({ kind: \"clear\", packageId, version });\n }\n },\n\n subscribe(listener) {\n subscribers.add(listener);\n return () => {\n subscribers.delete(listener);\n };\n },\n };\n\n window.FluidWidgets = fluidWidgets;\n return fluidWidgets;\n\n function notify(event: FluidWidgetsGlobalRegistryEvent): void {\n for (const subscriber of Array.from(subscribers)) {\n subscriber(event);\n }\n }\n}\n\nexport function cleanupUnexpectedFluidWidgetsRegistration(\n registration: WidgetPackageRegistration,\n previousRegistration: WidgetPackageRegistration | undefined,\n): void {\n const fluidWidgets = window.FluidWidgets;\n if (!isFluidWidgetsGlobal(fluidWidgets)) {\n return;\n }\n\n fluidWidgets[cleanupRegistrationMarker](registration, previousRegistration);\n}\n\nfunction isFluidWidgetsGlobal(\n value: FluidWidgetsGlobal | undefined,\n): value is MutableFluidWidgetsGlobal {\n return (\n value !== undefined &&\n (value as Partial<MutableFluidWidgetsGlobal>)[globalMarker] === true\n );\n}\n\nfunction createPackageRegistrationKey(\n packageId: string,\n version: string,\n): string {\n return JSON.stringify([packageId, version]);\n}\n\nfunction createGlobalWidgetRegistryKey(\n packageId: string,\n version: string,\n type: string,\n): WidgetRuntimeRegistryKey {\n return JSON.stringify([packageId, version, type]);\n}\n","import type {\n WidgetPackageType,\n WidgetRuntimeContainer,\n WidgetRuntimeResizable,\n} from \"./types\";\n\nexport const DEFAULT_WIDGET_ICON = \"box\";\nexport const DEFAULT_WIDGET_CATEGORY = \"components\";\nexport const DEFAULT_WIDGET_CONTAINER =\n \"block\" satisfies WidgetRuntimeContainer;\nexport const DEFAULT_MIN_SDK_VERSION = \"0.0.0\";\nexport const SHARED_WIDGET_ARTIFACT_URL_PREFIX =\n \"https://storage.googleapis.com/portal-widgets/\";\n\nconst widgetPackageTypes = new Set<WidgetPackageType>([\n \"fluid\",\n \"company\",\n \"droplet\",\n \"partner\",\n \"internal\",\n]);\n\nconst widgetContainers = new Set<WidgetRuntimeContainer>([\n \"inline\",\n \"block\",\n \"card\",\n \"fullscreen\",\n]);\n\nconst widgetResizableValues = new Set<Exclude<WidgetRuntimeResizable, boolean>>(\n [\"horizontal\", \"vertical\", \"both\"],\n);\n\nexport function readNonEmptyString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nexport function readFirstDefined<T>(...values: readonly T[]): T | undefined {\n return values.find((value) => value !== undefined);\n}\n\nexport function hasControlCharacter(value: string): boolean {\n for (let index = 0; index < value.length; index++) {\n const code = value.charCodeAt(index);\n if (code <= 31 || (code >= 127 && code <= 159)) return true;\n }\n return false;\n}\n\nexport function isWidgetPackageType(\n value: unknown,\n): value is WidgetPackageType {\n return (\n typeof value === \"string\" &&\n widgetPackageTypes.has(value as WidgetPackageType)\n );\n}\n\nexport function normalizeWidgetPackageType(\n value: unknown,\n): WidgetPackageType | null {\n return isWidgetPackageType(value) ? value : null;\n}\n\nexport function isWidgetRuntimeContainer(\n value: unknown,\n): value is WidgetRuntimeContainer {\n return (\n typeof value === \"string\" &&\n widgetContainers.has(value as WidgetRuntimeContainer)\n );\n}\n\nexport function normalizeWidgetRuntimeContainer(\n value: unknown,\n): WidgetRuntimeContainer {\n return isWidgetRuntimeContainer(value) ? value : DEFAULT_WIDGET_CONTAINER;\n}\n\nexport function isWidgetRuntimeResizableString(\n value: unknown,\n): value is Exclude<WidgetRuntimeResizable, boolean> {\n return (\n typeof value === \"string\" &&\n widgetResizableValues.has(value as Exclude<WidgetRuntimeResizable, boolean>)\n );\n}\n\nexport function normalizeWidgetRuntimeResizable(\n value: unknown,\n): WidgetRuntimeResizable {\n if (typeof value === \"boolean\") return value;\n if (isWidgetRuntimeResizableString(value)) return value;\n if (!isRecord(value)) return false;\n\n const horizontal = value.horizontal === true;\n const vertical = value.vertical === true;\n\n if (horizontal && vertical) return \"both\";\n if (horizontal) return \"horizontal\";\n if (vertical) return \"vertical\";\n return false;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import { hasControlCharacter } from \"./catalog\";\nimport { WidgetRuntimeError } from \"./errors\";\nimport {\n WIDGET_PACKAGE_MANIFEST_VERSION,\n type RuntimeWidgetRegistration,\n type WidgetDescriptor,\n type WidgetPackageDescriptor,\n type WidgetPackageRegistration,\n type WidgetPackageType,\n type WidgetPropertySchema,\n type WidgetRuntimeComponent,\n type WidgetRuntimeContainer,\n type WidgetRuntimeResizable,\n} from \"./types\";\n\nconst widgetPackageTypes = new Set<WidgetPackageType>([\n \"fluid\",\n \"company\",\n \"droplet\",\n \"partner\",\n \"internal\",\n]);\n\nconst widgetContainers = new Set<WidgetRuntimeContainer>([\n \"inline\",\n \"block\",\n \"card\",\n \"fullscreen\",\n]);\n\nconst widgetResizableValues = new Set<Exclude<WidgetRuntimeResizable, boolean>>(\n [\"horizontal\", \"vertical\", \"both\"],\n);\n\nexport function validateWidgetPackageDescriptor(\n descriptor: WidgetPackageDescriptor,\n): void {\n if (!isObjectRecord(descriptor)) {\n throwInvalidDescriptor(\"Widget package descriptor must be an object\");\n }\n\n if (descriptor.manifestVersion !== WIDGET_PACKAGE_MANIFEST_VERSION) {\n throwInvalidDescriptor(\n `Unsupported widget package manifestVersion: ${String(descriptor.manifestVersion)}`,\n descriptor,\n );\n }\n\n assertNonEmptyString(descriptor.packageId, \"packageId\", descriptor);\n assertNonEmptyString(descriptor.version, \"version\", descriptor);\n assertNonEmptyString(descriptor.remoteEntryUrl, \"remoteEntryUrl\", descriptor);\n assertValidUrl(descriptor.remoteEntryUrl, \"remoteEntryUrl\", descriptor);\n\n if (!widgetPackageTypes.has(descriptor.packageType)) {\n throwInvalidDescriptor(\n `Unsupported widget packageType: ${String(descriptor.packageType)}`,\n descriptor,\n );\n }\n\n if (!Array.isArray(descriptor.cssUrls)) {\n throwInvalidDescriptor(\n \"Widget package cssUrls must be an array\",\n descriptor,\n );\n }\n\n for (const cssUrl of descriptor.cssUrls) {\n if (typeof cssUrl !== \"string\" || cssUrl.length === 0) {\n throwInvalidDescriptor(\n \"Widget package cssUrls must contain only non-empty strings\",\n descriptor,\n );\n }\n assertValidUrl(cssUrl, \"cssUrls[]\", descriptor);\n }\n\n if (!Array.isArray(descriptor.widgets) || descriptor.widgets.length === 0) {\n throwInvalidDescriptor(\n \"Widget package widgets must be a non-empty array\",\n descriptor,\n );\n }\n\n const seenTypes = new Set<string>();\n for (const widget of descriptor.widgets) {\n validateWidgetDescriptor(widget, descriptor);\n\n if (seenTypes.has(widget.type)) {\n throwInvalidDescriptor(\n `Widget package descriptor contains duplicate widget type: ${widget.type}`,\n descriptor,\n );\n }\n seenTypes.add(widget.type);\n }\n}\n\nexport function validateWidgetPackageRegistration(\n registration: WidgetPackageRegistration | undefined,\n descriptor: WidgetPackageDescriptor,\n): asserts registration is WidgetPackageRegistration {\n if (!registration) {\n throw new WidgetRuntimeError({\n code: \"REGISTRATION_MISSING\",\n message: `Remote widget package ${descriptor.packageId}@${descriptor.version} did not call window.FluidWidgets.registerPackage`,\n packageId: descriptor.packageId,\n version: descriptor.version,\n });\n }\n\n if (!isObjectRecord(registration)) {\n throwInvalidRegistration(\n \"Widget package registration must be an object\",\n descriptor,\n );\n }\n\n if (registration.packageId !== descriptor.packageId) {\n throw new WidgetRuntimeError({\n code: \"REGISTRATION_MISMATCH\",\n message: `Remote widget package registered packageId ${String(registration.packageId)} but descriptor expected ${descriptor.packageId}`,\n packageId: descriptor.packageId,\n version: descriptor.version,\n });\n }\n\n if (registration.version !== descriptor.version) {\n throw new WidgetRuntimeError({\n code: \"REGISTRATION_MISMATCH\",\n message: `Remote widget package ${descriptor.packageId} registered version ${String(registration.version)} but descriptor expected ${descriptor.version}`,\n packageId: descriptor.packageId,\n version: descriptor.version,\n });\n }\n\n if (!Array.isArray(registration.widgets)) {\n throwInvalidRegistration(\n \"Widget package registration widgets must be an array\",\n descriptor,\n );\n }\n\n const descriptorWidgetsByType = new Map(\n descriptor.widgets.map((widget) => [widget.type, widget]),\n );\n const registeredTypes = new Set<string>();\n\n for (const widget of registration.widgets) {\n validateRuntimeWidgetRegistration(\n widget,\n descriptor,\n descriptorWidgetsByType,\n );\n\n if (registeredTypes.has(widget.type)) {\n throwInvalidRegistration(\n `Widget package registration contains duplicate widget type: ${widget.type}`,\n descriptor,\n );\n }\n registeredTypes.add(widget.type);\n }\n\n for (const descriptorWidget of descriptor.widgets) {\n if (!registeredTypes.has(descriptorWidget.type)) {\n throwInvalidRegistration(\n `Widget package registration is missing widget type: ${descriptorWidget.type}`,\n descriptor,\n );\n }\n }\n}\n\nfunction validateWidgetDescriptor(\n widget: WidgetDescriptor,\n descriptor: WidgetPackageDescriptor,\n): void {\n if (!isObjectRecord(widget)) {\n throwInvalidDescriptor(\"Widget descriptor must be an object\", descriptor);\n }\n\n assertNonEmptyString(widget.type, \"widgets[].type\", descriptor);\n assertNonEmptyString(widget.name, \"widgets[].name\", descriptor);\n assertNonEmptyString(widget.displayName, \"widgets[].displayName\", descriptor);\n assertNonEmptyString(widget.description, \"widgets[].description\", descriptor);\n assertNonEmptyString(widget.icon, \"widgets[].icon\", descriptor);\n assertNonEmptyString(widget.category, \"widgets[].category\", descriptor);\n assertNonEmptyString(\n widget.minSdkVersion,\n \"widgets[].minSdkVersion\",\n descriptor,\n );\n\n if (!isObjectRecord(widget.propertySchema)) {\n throwInvalidDescriptor(\n \"Widget propertySchema must be an object\",\n descriptor,\n );\n }\n validatePropertySchemaWidgetType(\n widget.propertySchema,\n widget.type,\n descriptor,\n \"INVALID_DESCRIPTOR\",\n );\n\n if (!isObjectRecord(widget.defaultProps)) {\n throwInvalidDescriptor(\"Widget defaultProps must be an object\", descriptor);\n }\n\n if (!widgetContainers.has(widget.container)) {\n throwInvalidDescriptor(\n `Unsupported widget container: ${String(widget.container)}`,\n descriptor,\n );\n }\n\n validateResizable(widget.resizable, descriptor);\n}\n\nfunction validateRuntimeWidgetRegistration(\n widget: RuntimeWidgetRegistration,\n descriptor: WidgetPackageDescriptor,\n descriptorWidgetsByType: ReadonlyMap<string, WidgetDescriptor>,\n): void {\n if (!isObjectRecord(widget)) {\n throwInvalidRegistration(\"Registered widget must be an object\", descriptor);\n }\n\n assertNonEmptyString(widget.type, \"registered widgets[].type\", descriptor);\n\n const descriptorWidget = descriptorWidgetsByType.get(widget.type);\n if (!descriptorWidget) {\n throwInvalidRegistration(\n `Widget package registration contains unknown widget type: ${widget.type}`,\n descriptor,\n );\n }\n\n if (!isWidgetComponent(widget.component)) {\n throwInvalidRegistration(\n `Registered widget ${widget.type} must include a React component`,\n descriptor,\n );\n }\n\n if (!isObjectRecord(widget.propertySchema)) {\n throwInvalidRegistration(\n `Registered widget ${widget.type} propertySchema must be an object`,\n descriptor,\n );\n }\n validatePropertySchemaWidgetType(\n widget.propertySchema,\n widget.type,\n descriptor,\n \"INVALID_REGISTRATION\",\n );\n\n if (!isObjectRecord(widget.defaultProps)) {\n throwInvalidRegistration(\n `Registered widget ${widget.type} defaultProps must be an object`,\n descriptor,\n );\n }\n\n validateOptionalRuntimeMetadataStrings(widget, descriptor);\n\n if (\n widget.container !== undefined &&\n !widgetContainers.has(widget.container)\n ) {\n throwInvalidRegistration(\n `Registered widget ${widget.type} has unsupported container: ${String(widget.container)}`,\n descriptor,\n );\n }\n\n if (widget.resizable !== undefined) {\n validateResizable(widget.resizable, descriptor, \"INVALID_REGISTRATION\");\n }\n\n validatePropertySchemaWidgetType(\n descriptorWidget.propertySchema,\n widget.type,\n descriptor,\n \"INVALID_DESCRIPTOR\",\n );\n}\n\nfunction validateOptionalRuntimeMetadataStrings(\n widget: RuntimeWidgetRegistration,\n descriptor: WidgetPackageDescriptor,\n): void {\n for (const field of [\n \"name\",\n \"displayName\",\n \"description\",\n \"icon\",\n \"category\",\n \"minSdkVersion\",\n ] as const) {\n const value = widget[field];\n if (value === undefined) {\n continue;\n }\n\n if (typeof value !== \"string\" || value.length === 0) {\n throwInvalidRegistration(\n `Registered widget ${widget.type} ${field} must be a non-empty string when present`,\n descriptor,\n );\n }\n }\n}\n\nfunction validatePropertySchemaWidgetType(\n propertySchema: WidgetPropertySchema,\n widgetType: string,\n descriptor: WidgetPackageDescriptor,\n code: \"INVALID_DESCRIPTOR\" | \"INVALID_REGISTRATION\",\n): void {\n if (\n propertySchema.widgetType !== undefined &&\n propertySchema.widgetType !== widgetType\n ) {\n throwValidationError(\n code,\n `Widget type ${widgetType} must match propertySchema.widgetType ${propertySchema.widgetType}`,\n descriptor,\n );\n }\n}\n\nfunction validateResizable(\n resizable: WidgetRuntimeResizable,\n descriptor: WidgetPackageDescriptor,\n code: \"INVALID_DESCRIPTOR\" | \"INVALID_REGISTRATION\" = \"INVALID_DESCRIPTOR\",\n): void {\n const isValid =\n typeof resizable === \"boolean\" ||\n (typeof resizable === \"string\" && widgetResizableValues.has(resizable));\n\n if (!isValid) {\n throwValidationError(\n code,\n `Unsupported widget resizable value: ${String(resizable)}`,\n descriptor,\n );\n }\n}\n\nfunction throwValidationError(\n code: \"INVALID_DESCRIPTOR\" | \"INVALID_REGISTRATION\",\n message: string,\n descriptor: WidgetPackageDescriptor,\n): never {\n if (code === \"INVALID_REGISTRATION\") {\n throwInvalidRegistration(message, descriptor);\n }\n throwInvalidDescriptor(message, descriptor);\n}\n\nfunction assertNonEmptyString(\n value: unknown,\n field: string,\n descriptor: Pick<WidgetPackageDescriptor, \"packageId\" | \"version\">,\n): void {\n if (typeof value !== \"string\" || value.length === 0) {\n throwInvalidDescriptor(\n `Widget package ${field} must be a non-empty string`,\n descriptor,\n );\n }\n}\n\nfunction assertValidUrl(\n url: string,\n field: string,\n descriptor: Pick<WidgetPackageDescriptor, \"packageId\" | \"version\">,\n): void {\n if (\n url.trim() !== url ||\n containsUnsafeUrlCharacter(url) ||\n hasAmbiguousHttpScheme(url)\n ) {\n throwInvalidDescriptor(\n `Widget package ${field} contains invalid URL: ${url}`,\n descriptor,\n );\n }\n\n const schemeMatch = /^[a-zA-Z][a-zA-Z\\d+.-]*:/.exec(url);\n if (schemeMatch) {\n let parsedUrl: URL;\n try {\n parsedUrl = new URL(url);\n } catch {\n throwInvalidDescriptor(\n `Widget package ${field} contains invalid URL: ${url}`,\n descriptor,\n );\n }\n\n if (\n parsedUrl.protocol !== \"https:\" &&\n !isTrustedLocalHttpUrl(parsedUrl, url)\n ) {\n throwInvalidDescriptor(\n `Widget package ${field} must be an https absolute URL, a trusted local http URL, or a relative URL: ${url}`,\n descriptor,\n );\n }\n return;\n }\n\n if (url.slice(0, 2) === \"//\") {\n throwInvalidDescriptor(\n `Widget package ${field} must be an https absolute URL, a trusted local http URL, or a relative URL: ${url}`,\n descriptor,\n );\n }\n\n try {\n void new URL(url, getValidationBaseUrl());\n } catch {\n throwInvalidDescriptor(\n `Widget package ${field} contains invalid URL: ${url}`,\n descriptor,\n );\n }\n}\n\nfunction isTrustedLocalHttpUrl(url: URL, rawUrl: string): boolean {\n if (url.protocol !== \"http:\") return false;\n\n // Parse the raw host instead of URL.hostname: WHATWG URL normalizes\n // non-canonical loopback forms like 127.1 or hex/decimal IPv4 to 127.0.0.1.\n const hostname = extractRawHostname(rawUrl).toLowerCase();\n return (\n hostname === \"localhost\" ||\n hostname === \"[::1]\" ||\n hostname === \"::1\" ||\n isLoopbackIpv4Hostname(hostname)\n );\n}\n\nfunction extractRawHostname(rawUrl: string): string {\n const authorityStart = rawUrl.indexOf(\"://\") + 3;\n const authorityEnd = findAuthorityEnd(rawUrl, authorityStart);\n const authority = rawUrl.slice(authorityStart, authorityEnd);\n const hostAndPort = authority.slice(authority.lastIndexOf(\"@\") + 1);\n\n if (hostAndPort.charAt(0) === \"[\") {\n const bracketEnd = hostAndPort.indexOf(\"]\");\n return bracketEnd === -1\n ? hostAndPort\n : hostAndPort.slice(0, bracketEnd + 1);\n }\n\n const portStart = hostAndPort.indexOf(\":\");\n return portStart === -1 ? hostAndPort : hostAndPort.slice(0, portStart);\n}\n\nfunction findAuthorityEnd(rawUrl: string, authorityStart: number): number {\n let authorityEnd = rawUrl.length;\n for (const delimiter of [\"/\", \"?\", \"#\"] as const) {\n const delimiterIndex = rawUrl.indexOf(delimiter, authorityStart);\n if (delimiterIndex !== -1 && delimiterIndex < authorityEnd) {\n authorityEnd = delimiterIndex;\n }\n }\n return authorityEnd;\n}\n\nfunction isLoopbackIpv4Hostname(hostname: string): boolean {\n const octets = hostname.split(\".\");\n if (octets.length !== 4 || octets[0] !== \"127\") {\n return false;\n }\n\n return octets.every(isBoundedIpv4Octet);\n}\n\nfunction isBoundedIpv4Octet(octet: string): boolean {\n if (!/^\\d{1,3}$/.test(octet)) {\n return false;\n }\n\n if (octet.length > 1 && octet.charAt(0) === \"0\") {\n return false;\n }\n\n const value = Number(octet);\n return value >= 0 && value <= 255;\n}\n\nfunction containsUnsafeUrlCharacter(url: string): boolean {\n return hasControlCharacter(url) || url.includes(\"\\\\\");\n}\n\nfunction hasAmbiguousHttpScheme(url: string): boolean {\n return /^https?:(?!\\/\\/)/i.test(url);\n}\n\nfunction getValidationBaseUrl(): string {\n if (typeof window === \"undefined\") {\n return \"http://localhost\";\n }\n\n return window.location.href;\n}\n\nfunction throwInvalidDescriptor(\n message: string,\n descriptor?: Partial<Pick<WidgetPackageDescriptor, \"packageId\" | \"version\">>,\n): never {\n throw new WidgetRuntimeError({\n code: \"INVALID_DESCRIPTOR\",\n message,\n packageId: descriptor?.packageId,\n version: descriptor?.version,\n });\n}\n\nfunction throwInvalidRegistration(\n message: string,\n descriptor: Pick<WidgetPackageDescriptor, \"packageId\" | \"version\">,\n): never {\n throw new WidgetRuntimeError({\n code: \"INVALID_REGISTRATION\",\n message,\n packageId: descriptor.packageId,\n version: descriptor.version,\n });\n}\n\nfunction isObjectRecord(\n value: unknown,\n): value is Readonly<Record<string, unknown>> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isWidgetComponent(value: unknown): value is WidgetRuntimeComponent {\n if (typeof value === \"function\") {\n return true;\n }\n\n // React.memo / React.forwardRef produce non-function objects tagged with a\n // $$typeof symbol (e.g. Symbol.for(\"react.memo\")). This is a React internal\n // detail, but has been stable since React 16 and there is no public API\n // equivalent for detecting exotic component types.\n return isObjectRecord(value) && typeof value[\"$$typeof\"] === \"symbol\";\n}\n","import { WidgetRuntimeError, toWidgetRuntimeError } from \"./errors\";\nimport {\n cleanupUnexpectedFluidWidgetsRegistration,\n ensureFluidWidgetsGlobal,\n} from \"./fluid-widgets\";\nimport {\n type LoadWidgetPackageResult,\n type LoadWidgetPackageSuccess,\n type RegisteredWidget,\n type RuntimeWidgetRegistration,\n type WidgetPackageDescriptor,\n type WidgetPackageRegistration,\n type WidgetRuntimeLoader,\n type WidgetRuntimeLoaderOptions,\n type WidgetRuntimeRegistry,\n type WidgetRuntimeRegistryKey,\n} from \"./types\";\nimport {\n validateWidgetPackageDescriptor,\n validateWidgetPackageRegistration,\n} from \"./validation\";\n\nconst defaultTimeoutMs = 15_000;\n\ninterface CachedPackage {\n readonly cacheKey: string;\n readonly cssLoadRef: string;\n readonly packageId: string;\n readonly version: string;\n readonly scriptElement?: HTMLScriptElement;\n readonly widgets: readonly RegisteredWidget[];\n}\n\ninterface PendingPackageLoad {\n readonly cacheKey: string;\n readonly cssLoadRef: string;\n readonly generation: number;\n readonly packageId: string;\n readonly remoteEntryUrlKey: string;\n readonly version: string;\n readonly getCurrentGeneration: () => number;\n}\n\ninterface PendingPackage {\n readonly load: PendingPackageLoad;\n readonly promise: Promise<LoadWidgetPackageSuccess>;\n}\n\ninterface CssEntry {\n readonly key: string;\n readonly element: HTMLLinkElement;\n readonly packageRefs: Set<string>;\n}\n\n/**\n * Shared remote script queue for the page.\n *\n * Classic remote scripts register through the shared `window.FluidWidgets`\n * callback, so the loader intentionally appends only one remote entry script at\n * a time across all loader instances. Each queued load waits for the previous\n * load to settle, even when the previous load fails, which keeps registration\n * attribution deterministic and prevents overlapping classic-script remotes\n * from racing their global registrations.\n */\nlet remoteScriptLoadQueue: Promise<void> | undefined;\nconst pendingRemoteRegistrationsByPackageKey = new Map<\n string,\n Set<PendingPackageLoad>\n>();\ninterface ObservedRemoteRegistration {\n readonly previousRegistration: WidgetPackageRegistration | undefined;\n readonly registration: WidgetPackageRegistration;\n}\n\nconst observedRegistrationsByPendingLoad = new WeakMap<\n PendingPackageLoad,\n ObservedRemoteRegistration\n>();\n\nexport function createWidgetRuntimeLoader(\n options: WidgetRuntimeLoaderOptions = {},\n): WidgetRuntimeLoader {\n const timeoutMs = options.timeoutMs ?? defaultTimeoutMs;\n const ignorePreRegisteredPackages =\n options.ignorePreRegisteredPackages === true;\n const fluidWidgets = ensureFluidWidgetsGlobal();\n const packagesByKey = new Map<string, CachedPackage>();\n const pendingPackagesByKey = new Map<string, PendingPackage>();\n const packageGenerationsByKey = new Map<string, number>();\n const cssByKey = new Map<string, CssEntry>();\n const widgetsByKey = new Map<string, RegisteredWidget>();\n let isApplyingLocalGlobalClear = false;\n\n fluidWidgets.subscribe((event) => {\n if (isApplyingLocalGlobalClear || event.kind !== \"clear\") {\n return;\n }\n\n if (event.packageId === undefined) {\n invalidateCacheKeys(\n new Set([...packagesByKey.keys(), ...pendingPackagesByKey.keys()]),\n );\n return;\n }\n\n const cacheKeys = collectMatchingCacheKeys(event.packageId, event.version);\n invalidateCacheKeys(cacheKeys);\n });\n\n async function loadPackage(\n descriptor: WidgetPackageDescriptor,\n ): Promise<LoadWidgetPackageResult> {\n try {\n validateWidgetPackageDescriptor(descriptor);\n\n const cacheKey = createPackageCacheKey(\n descriptor.packageId,\n descriptor.version,\n );\n const cachedPackage = packagesByKey.get(cacheKey);\n if (cachedPackage) {\n return createSuccess(cachedPackage);\n }\n\n const pendingPackage = pendingPackagesByKey.get(cacheKey);\n if (pendingPackage) {\n return await pendingPackage.promise;\n }\n\n const globalRegistration = fluidWidgets.getPackageRegistration(\n descriptor.packageId,\n descriptor.version,\n );\n if (globalRegistration && !ignorePreRegisteredPackages) {\n return createSuccess(\n cachePreRegisteredPackage(\n descriptor,\n cacheKey,\n createCssLoadRef(cacheKey, getPackageGeneration(cacheKey)),\n globalRegistration,\n ),\n );\n }\n\n const generation = getPackageGeneration(cacheKey);\n const pendingLoad = {\n cacheKey,\n cssLoadRef: createCssLoadRef(cacheKey, generation),\n generation,\n packageId: descriptor.packageId,\n remoteEntryUrlKey: normalizeAssetUrl(\n descriptor.remoteEntryUrl,\n descriptor,\n ),\n version: descriptor.version,\n getCurrentGeneration: () => getPackageGeneration(cacheKey),\n } satisfies PendingPackageLoad;\n addPendingRemoteRegistration(pendingLoad);\n const promise = loadPackageUncached(descriptor, pendingLoad);\n const pendingPackageEntry = {\n load: pendingLoad,\n promise,\n } satisfies PendingPackage;\n void promise.then(\n () => {\n removePendingRemoteRegistration(pendingLoad);\n if (pendingPackagesByKey.get(cacheKey) === pendingPackageEntry) {\n pendingPackagesByKey.delete(cacheKey);\n }\n },\n () => {\n removePendingRemoteRegistration(pendingLoad);\n if (pendingPackagesByKey.get(cacheKey) === pendingPackageEntry) {\n pendingPackagesByKey.delete(cacheKey);\n }\n },\n );\n pendingPackagesByKey.set(cacheKey, pendingPackageEntry);\n return await pendingPackageEntry.promise;\n } catch (error) {\n const descriptorIdentity = getDescriptorIdentity(descriptor);\n const runtimeError = toWidgetRuntimeError(error, {\n code: \"SCRIPT_LOAD_FAILED\",\n message: \"Failed to load widget package\",\n packageId: descriptorIdentity.packageId,\n version: descriptorIdentity.version,\n });\n\n if (options.throwOnError === true) {\n throw runtimeError;\n }\n\n return {\n ok: false,\n packageId: descriptorIdentity.packageId ?? \"\",\n version: descriptorIdentity.version ?? \"\",\n error: runtimeError,\n };\n }\n }\n\n async function loadPackageUncached(\n descriptor: WidgetPackageDescriptor,\n pendingLoad: PendingPackageLoad,\n ): Promise<LoadWidgetPackageSuccess> {\n let scriptElement: HTMLScriptElement | undefined;\n try {\n installCssUrls(descriptor, pendingLoad.cssLoadRef);\n\n const scriptLoadResult = await loadRemoteEntryScript(\n descriptor,\n timeoutMs,\n options.cacheBust,\n () => {\n throwIfStalePackageLoad(pendingLoad);\n },\n () => isFreshPackageLoad(pendingLoad),\n pendingLoad,\n ignorePreRegisteredPackages,\n );\n scriptElement = scriptLoadResult.scriptElement;\n throwIfStalePackageLoad(pendingLoad);\n\n const registration = ignorePreRegisteredPackages\n ? scriptLoadResult.registration\n : (fluidWidgets.getPackageRegistration(\n descriptor.packageId,\n descriptor.version,\n ) ?? scriptLoadResult.registration);\n const cached = cachePackageRegistrationWithRemoteCleanup(\n descriptor,\n pendingLoad.cacheKey,\n pendingLoad.cssLoadRef,\n registration,\n scriptLoadResult,\n scriptElement,\n );\n throwIfStalePackageLoad(pendingLoad);\n\n return createSuccess(cached);\n } catch (error) {\n scriptElement?.remove();\n removeCssForLoad(pendingLoad.cssLoadRef);\n throw error;\n }\n }\n\n async function loadPackages(\n descriptors: readonly WidgetPackageDescriptor[],\n ): Promise<readonly LoadWidgetPackageResult[]> {\n return await Promise.all(descriptors.map(loadPackage));\n }\n\n function getRegisteredWidgets(): readonly RegisteredWidget[] {\n return Array.from(widgetsByKey.values());\n }\n\n function getRegistry(): WidgetRuntimeRegistry {\n return new Map(widgetsByKey);\n }\n\n function cachePreRegisteredPackage(\n descriptor: WidgetPackageDescriptor,\n cacheKey: string,\n cssLoadRef: string,\n registration: WidgetPackageRegistration,\n ): CachedPackage {\n try {\n installCssUrls(descriptor, cssLoadRef);\n return cachePackageRegistration(\n descriptor,\n cacheKey,\n cssLoadRef,\n registration,\n );\n } catch (error) {\n removeCssForLoad(cssLoadRef);\n throw error;\n }\n }\n\n function cachePackageRegistrationWithRemoteCleanup(\n descriptor: WidgetPackageDescriptor,\n cacheKey: string,\n cssLoadRef: string,\n registration: WidgetPackageRegistration | undefined,\n scriptLoadResult: RemoteEntryScriptLoadResult,\n scriptElement?: HTMLScriptElement,\n ): CachedPackage {\n try {\n return cachePackageRegistration(\n descriptor,\n cacheKey,\n cssLoadRef,\n registration,\n scriptElement,\n );\n } catch (error) {\n if (\n scriptLoadResult.registration !== undefined &&\n registration === scriptLoadResult.registration\n ) {\n cleanupUnexpectedFluidWidgetsRegistration(\n scriptLoadResult.registration,\n scriptLoadResult.previousRegistration,\n );\n }\n\n throw error;\n }\n }\n\n function cachePackageRegistration(\n descriptor: WidgetPackageDescriptor,\n cacheKey: string,\n cssLoadRef: string,\n registration: WidgetPackageRegistration | undefined,\n scriptElement?: HTMLScriptElement,\n ): CachedPackage {\n validateWidgetPackageRegistration(registration, descriptor);\n const widgets = mergeRegisteredWidgets(descriptor, registration);\n\n const cached: CachedPackage = {\n cacheKey,\n cssLoadRef,\n packageId: descriptor.packageId,\n version: descriptor.version,\n scriptElement,\n widgets,\n };\n\n packagesByKey.set(cacheKey, cached);\n for (const widget of widgets) {\n widgetsByKey.set(\n createWidgetRegistryKey(widget.packageId, widget.version, widget.type),\n widget,\n );\n }\n\n return cached;\n }\n\n function invalidatePackage(packageId: string, version?: string): void {\n isApplyingLocalGlobalClear = true;\n try {\n fluidWidgets.clear(packageId, version);\n } finally {\n isApplyingLocalGlobalClear = false;\n }\n\n invalidateCacheKeys(collectMatchingCacheKeys(packageId, version));\n }\n\n function clear(): void {\n isApplyingLocalGlobalClear = true;\n try {\n fluidWidgets.clear();\n } finally {\n isApplyingLocalGlobalClear = false;\n }\n\n invalidateCacheKeys(\n new Set([...packagesByKey.keys(), ...pendingPackagesByKey.keys()]),\n );\n }\n\n function collectMatchingCacheKeys(\n packageId: string,\n version?: string,\n ): Set<string> {\n const cacheKeys = new Set<string>();\n\n for (const cachedPackage of packagesByKey.values()) {\n if (matchesPackage(cachedPackage, packageId, version)) {\n cacheKeys.add(cachedPackage.cacheKey);\n }\n }\n\n for (const pendingPackage of pendingPackagesByKey.values()) {\n if (matchesPackage(pendingPackage.load, packageId, version)) {\n cacheKeys.add(pendingPackage.load.cacheKey);\n }\n }\n\n return cacheKeys;\n }\n\n function invalidateCacheKeys(cacheKeys: ReadonlySet<string>): void {\n for (const cacheKey of cacheKeys) {\n invalidatePackageCacheKey(cacheKey);\n }\n }\n\n function installCssUrls(\n descriptor: WidgetPackageDescriptor,\n cssLoadRef: string,\n ): readonly string[] {\n const normalizedCssUrls = descriptor.cssUrls.map((cssUrl) => ({\n key: normalizeAssetUrl(cssUrl, descriptor),\n }));\n const keys: string[] = [];\n\n for (const { key } of normalizedCssUrls) {\n const existing = cssByKey.get(key);\n if (existing) {\n existing.packageRefs.add(cssLoadRef);\n keys.push(key);\n continue;\n }\n\n const linkElement = document.createElement(\"link\");\n linkElement.rel = \"stylesheet\";\n linkElement.href = key;\n linkElement.dataset.fluidWidgetRuntimeCss = \"true\";\n linkElement.dataset.fluidWidgetRuntimeCssKey = key;\n document.head.appendChild(linkElement);\n\n cssByKey.set(key, {\n key,\n element: linkElement,\n packageRefs: new Set([cssLoadRef]),\n });\n keys.push(key);\n }\n\n return keys;\n }\n\n function invalidatePackageCacheKey(cacheKey: string): void {\n bumpPackageGeneration(cacheKey);\n\n const pendingPackage = pendingPackagesByKey.get(cacheKey);\n if (pendingPackage) {\n removeCssForLoad(pendingPackage.load.cssLoadRef);\n pendingPackagesByKey.delete(cacheKey);\n }\n\n removePackage(cacheKey);\n }\n\n function removePackage(cacheKey: string): void {\n const cachedPackage = packagesByKey.get(cacheKey);\n if (!cachedPackage) {\n return;\n }\n\n cachedPackage.scriptElement?.remove();\n for (const widget of cachedPackage.widgets) {\n widgetsByKey.delete(\n createWidgetRegistryKey(widget.packageId, widget.version, widget.type),\n );\n }\n removeCssForLoad(cachedPackage.cssLoadRef);\n packagesByKey.delete(cacheKey);\n }\n\n function removeCssForLoad(cssLoadRef: string): void {\n for (const entry of Array.from(cssByKey.values())) {\n entry.packageRefs.delete(cssLoadRef);\n if (entry.packageRefs.size === 0) {\n entry.element.remove();\n cssByKey.delete(entry.key);\n }\n }\n }\n\n function getPackageGeneration(cacheKey: string): number {\n return packageGenerationsByKey.get(cacheKey) ?? 0;\n }\n\n function bumpPackageGeneration(cacheKey: string): void {\n packageGenerationsByKey.set(cacheKey, getPackageGeneration(cacheKey) + 1);\n }\n\n function isFreshPackageLoad(pendingLoad: PendingPackageLoad): boolean {\n return (\n getPackageGeneration(pendingLoad.cacheKey) === pendingLoad.generation\n );\n }\n\n function throwIfStalePackageLoad(pendingLoad: PendingPackageLoad): void {\n if (isFreshPackageLoad(pendingLoad)) {\n return;\n }\n\n throw new WidgetRuntimeError({\n code: \"SCRIPT_LOAD_FAILED\",\n message: `Widget package load ${pendingLoad.packageId}@${pendingLoad.version} was invalidated before it completed`,\n packageId: pendingLoad.packageId,\n version: pendingLoad.version,\n });\n }\n\n function matchesPackage(\n cachedPackage: Pick<CachedPackage, \"packageId\" | \"version\">,\n packageId: string,\n version: string | undefined,\n ): boolean {\n if (cachedPackage.packageId !== packageId) {\n return false;\n }\n\n return version === undefined || cachedPackage.version === version;\n }\n\n return {\n loadPackage,\n loadPackages,\n getRegisteredWidgets,\n getRegistry,\n invalidatePackage,\n clear,\n };\n}\n\nfunction mergeRegisteredWidgets(\n descriptor: WidgetPackageDescriptor,\n registration: WidgetPackageRegistration,\n): readonly RegisteredWidget[] {\n const registrationWidgetsByType = new Map(\n registration.widgets.map((widget) => [widget.type, widget]),\n );\n\n return descriptor.widgets.map((descriptorWidget) => {\n const registeredWidget = registrationWidgetsByType.get(\n descriptorWidget.type,\n );\n if (!registeredWidget) {\n throw new WidgetRuntimeError({\n code: \"INVALID_REGISTRATION\",\n message: `Widget package registration is missing widget type: ${descriptorWidget.type}`,\n packageId: descriptor.packageId,\n version: descriptor.version,\n });\n }\n\n return {\n ...descriptorWidget,\n ...pickRuntimeMetadataOverrides(registeredWidget),\n packageId: descriptor.packageId,\n packageType: descriptor.packageType,\n version: descriptor.version,\n propertySchema: registeredWidget.propertySchema,\n defaultProps: registeredWidget.defaultProps,\n component: registeredWidget.component,\n } satisfies RegisteredWidget;\n });\n}\n\nfunction pickRuntimeMetadataOverrides(\n widget: RuntimeWidgetRegistration,\n): Partial<RegisteredWidget> {\n return {\n ...(widget.name !== undefined ? { name: widget.name } : {}),\n ...(widget.displayName !== undefined\n ? { displayName: widget.displayName }\n : {}),\n ...(widget.description !== undefined\n ? { description: widget.description }\n : {}),\n ...(widget.icon !== undefined ? { icon: widget.icon } : {}),\n ...(widget.category !== undefined ? { category: widget.category } : {}),\n ...(widget.container !== undefined ? { container: widget.container } : {}),\n ...(widget.minSdkVersion !== undefined\n ? { minSdkVersion: widget.minSdkVersion }\n : {}),\n ...(widget.resizable !== undefined ? { resizable: widget.resizable } : {}),\n };\n}\n\ninterface RemoteEntryScriptLoadResult {\n readonly previousRegistration: WidgetPackageRegistration | undefined;\n readonly registration: WidgetPackageRegistration | undefined;\n readonly scriptElement?: HTMLScriptElement;\n}\n\nfunction loadRemoteEntryScript(\n descriptor: WidgetPackageDescriptor,\n timeoutMs: number,\n cacheBust: WidgetRuntimeLoaderOptions[\"cacheBust\"],\n assertFreshPackageLoad: () => void,\n isFreshPackageLoad: () => boolean,\n pendingLoad: PendingPackageLoad,\n ignorePreRegisteredPackages: boolean,\n): Promise<RemoteEntryScriptLoadResult> {\n return enqueueRemoteEntryScriptLoad<RemoteEntryScriptLoadResult>(async () => {\n assertFreshPackageLoad();\n\n const registration = ensureFluidWidgetsGlobal().getPackageRegistration(\n descriptor.packageId,\n descriptor.version,\n );\n const observedRegistration =\n observedRegistrationsByPendingLoad.get(pendingLoad);\n if (registration && observedRegistration?.registration === registration) {\n return observedRegistration;\n }\n\n if (registration && !ignorePreRegisteredPackages) {\n return { previousRegistration: undefined, registration };\n }\n\n return await loadRemoteEntryScriptImmediately(\n descriptor,\n timeoutMs,\n cacheBust,\n isFreshPackageLoad,\n pendingLoad,\n );\n });\n}\n\nasync function loadRemoteEntryScriptImmediately(\n descriptor: WidgetPackageDescriptor,\n timeoutMs: number,\n cacheBust: WidgetRuntimeLoaderOptions[\"cacheBust\"],\n isFreshPackageLoad: () => boolean,\n pendingLoad: PendingPackageLoad,\n): Promise<\n RemoteEntryScriptLoadResult & { readonly scriptElement: HTMLScriptElement }\n> {\n const fluidWidgets = ensureFluidWidgetsGlobal();\n let previousRegistration: WidgetPackageRegistration | undefined;\n let registration: WidgetPackageRegistration | undefined;\n const unsubscribe = fluidWidgets.subscribe((event) => {\n if (event.kind !== \"register\") {\n return;\n }\n\n if (\n event.registration.packageId === descriptor.packageId &&\n event.registration.version === descriptor.version\n ) {\n if (isFreshPackageLoad()) {\n previousRegistration = event.previousRegistration;\n registration = event.registration;\n observeRegistrationForPendingLoad(pendingLoad, event);\n return;\n }\n\n if (observeFreshPendingRegistrationForScript(event, pendingLoad)) {\n return;\n }\n\n cleanupUnexpectedFluidWidgetsRegistration(\n event.registration,\n event.previousRegistration,\n );\n return;\n }\n\n const pendingSharedRemoteLoads = getPendingRemoteRegistrationsForScript(\n event.registration,\n pendingLoad.remoteEntryUrlKey,\n );\n if (pendingSharedRemoteLoads.length === 0) {\n // Registrations for other packageId/version values may be owned by the\n // host/BFF. Preserve them unless they match a pending descriptor for the\n // shared remote script currently being loaded.\n return;\n }\n\n const freshSharedRemoteLoads = pendingSharedRemoteLoads.filter(\n isFreshPendingPackageLoad,\n );\n if (freshSharedRemoteLoads.length > 0) {\n for (const freshPendingLoad of freshSharedRemoteLoads) {\n observeRegistrationForPendingLoad(freshPendingLoad, event);\n }\n return;\n }\n\n cleanupUnexpectedFluidWidgetsRegistration(\n event.registration,\n event.previousRegistration,\n );\n });\n const scriptElement = document.createElement(\"script\");\n let timeoutId: number | undefined;\n\n try {\n await new Promise<void>((resolve, reject) => {\n timeoutId = window.setTimeout(() => {\n reject(\n new WidgetRuntimeError({\n code: \"SCRIPT_TIMEOUT\",\n message: `Timed out loading widget package ${descriptor.packageId}@${descriptor.version}`,\n packageId: descriptor.packageId,\n version: descriptor.version,\n }),\n );\n }, timeoutMs);\n\n scriptElement.async = true;\n scriptElement.src = withCacheBust(descriptor.remoteEntryUrl, cacheBust);\n scriptElement.dataset.fluidWidgetRuntimeScript = \"true\";\n scriptElement.dataset.fluidWidgetRuntimePackageId = descriptor.packageId;\n scriptElement.dataset.fluidWidgetRuntimeVersion = descriptor.version;\n scriptElement.addEventListener(\n \"load\",\n () => {\n resolve();\n },\n { once: true },\n );\n scriptElement.addEventListener(\n \"error\",\n () => {\n reject(\n new WidgetRuntimeError({\n code: \"SCRIPT_LOAD_FAILED\",\n message: `Failed to load widget package script ${descriptor.remoteEntryUrl}`,\n packageId: descriptor.packageId,\n version: descriptor.version,\n }),\n );\n },\n { once: true },\n );\n\n document.head.appendChild(scriptElement);\n });\n } catch (error) {\n scriptElement.remove();\n throw error;\n } finally {\n unsubscribe();\n if (timeoutId !== undefined) {\n window.clearTimeout(timeoutId);\n }\n }\n\n return { previousRegistration, registration, scriptElement };\n}\n\nfunction getDescriptorIdentity(\n descriptor: WidgetPackageDescriptor,\n): Partial<Pick<LoadWidgetPackageResult, \"packageId\" | \"version\">> {\n if (typeof descriptor !== \"object\" || descriptor === null) {\n return {};\n }\n\n return {\n packageId:\n typeof descriptor.packageId === \"string\"\n ? descriptor.packageId\n : undefined,\n version:\n typeof descriptor.version === \"string\" ? descriptor.version : undefined,\n };\n}\n\nfunction createSuccess(cachedPackage: CachedPackage): LoadWidgetPackageSuccess {\n return {\n ok: true,\n packageId: cachedPackage.packageId,\n version: cachedPackage.version,\n widgets: cachedPackage.widgets,\n };\n}\n\nfunction createPackageCacheKey(packageId: string, version: string): string {\n return JSON.stringify([packageId, version]);\n}\n\nfunction createCssLoadRef(cacheKey: string, generation: number): string {\n return JSON.stringify([cacheKey, generation]);\n}\n\nexport function createWidgetRegistryKey(\n packageId: string,\n version: string,\n type: string,\n): WidgetRuntimeRegistryKey {\n return JSON.stringify([packageId, version, type]);\n}\n\nfunction addPendingRemoteRegistration(pendingLoad: PendingPackageLoad): void {\n const packageKey = createPackageCacheKey(\n pendingLoad.packageId,\n pendingLoad.version,\n );\n const pendingLoads = pendingRemoteRegistrationsByPackageKey.get(packageKey);\n if (pendingLoads) {\n pendingLoads.add(pendingLoad);\n return;\n }\n\n pendingRemoteRegistrationsByPackageKey.set(\n packageKey,\n new Set([pendingLoad]),\n );\n}\n\nfunction removePendingRemoteRegistration(\n pendingLoad: PendingPackageLoad,\n): void {\n const packageKey = createPackageCacheKey(\n pendingLoad.packageId,\n pendingLoad.version,\n );\n const pendingLoads = pendingRemoteRegistrationsByPackageKey.get(packageKey);\n if (!pendingLoads) {\n return;\n }\n\n pendingLoads.delete(pendingLoad);\n observedRegistrationsByPendingLoad.delete(pendingLoad);\n if (pendingLoads.size === 0) {\n pendingRemoteRegistrationsByPackageKey.delete(packageKey);\n }\n}\n\nfunction getPendingRemoteRegistrationsForScript(\n registration: WidgetPackageRegistration,\n remoteEntryUrlKey: string,\n): readonly PendingPackageLoad[] {\n const pendingLoads = pendingRemoteRegistrationsByPackageKey.get(\n createPackageCacheKey(registration.packageId, registration.version),\n );\n if (!pendingLoads) {\n return [];\n }\n\n return Array.from(pendingLoads).filter(\n (pendingLoad) => pendingLoad.remoteEntryUrlKey === remoteEntryUrlKey,\n );\n}\n\nfunction observeFreshPendingRegistrationForScript(\n event: {\n readonly registration: WidgetPackageRegistration;\n readonly previousRegistration?: WidgetPackageRegistration;\n },\n pendingLoad: PendingPackageLoad,\n): boolean {\n const freshPendingLoads = getPendingRemoteRegistrationsForScript(\n event.registration,\n pendingLoad.remoteEntryUrlKey,\n ).filter(isFreshPendingPackageLoad);\n\n if (freshPendingLoads.length === 0) {\n return false;\n }\n\n for (const freshPendingLoad of freshPendingLoads) {\n observeRegistrationForPendingLoad(freshPendingLoad, event);\n }\n return true;\n}\n\nfunction observeRegistrationForPendingLoad(\n pendingLoad: PendingPackageLoad,\n event: {\n readonly registration: WidgetPackageRegistration;\n readonly previousRegistration?: WidgetPackageRegistration;\n },\n): void {\n observedRegistrationsByPendingLoad.set(pendingLoad, {\n previousRegistration: event.previousRegistration,\n registration: event.registration,\n });\n}\n\nfunction isFreshPendingPackageLoad(pendingLoad: PendingPackageLoad): boolean {\n return pendingLoad.getCurrentGeneration() === pendingLoad.generation;\n}\n\nfunction enqueueRemoteEntryScriptLoad<T>(task: () => Promise<T>): Promise<T> {\n const previousLoad = remoteScriptLoadQueue;\n const resultPromise =\n previousLoad === undefined ? task() : previousLoad.then(task, task);\n const currentLoad = resultPromise.then(\n () => undefined,\n () => undefined,\n );\n\n remoteScriptLoadQueue = currentLoad;\n void currentLoad.then(() => {\n if (remoteScriptLoadQueue === currentLoad) {\n remoteScriptLoadQueue = undefined;\n }\n });\n\n return resultPromise;\n}\n\nfunction normalizeAssetUrl(\n url: string,\n descriptor: Pick<WidgetPackageDescriptor, \"packageId\" | \"version\">,\n): string {\n try {\n return new URL(url, window.location.href).href;\n } catch {\n throw new WidgetRuntimeError({\n code: \"INVALID_DESCRIPTOR\",\n message: `Widget package cssUrls contains invalid URL: ${url}`,\n packageId: descriptor.packageId,\n version: descriptor.version,\n });\n }\n}\n\nfunction withCacheBust(\n url: string,\n cacheBust: WidgetRuntimeLoaderOptions[\"cacheBust\"],\n): string {\n if (cacheBust === undefined || cacheBust === false) {\n return url;\n }\n\n const cacheBustValue =\n typeof cacheBust === \"function\"\n ? cacheBust()\n : cacheBust === true\n ? String(Date.now())\n : cacheBust;\n\n const nextUrl = new URL(url, window.location.href);\n nextUrl.searchParams.set(\"fluidWidgetRuntimeCacheBust\", cacheBustValue);\n return nextUrl.href;\n}\n","import * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport * as ReactJsxRuntime from \"react/jsx-runtime\";\n\nimport { ensureFluidWidgetsGlobal } from \"./fluid-widgets\";\nimport { createWidgetRuntimeLoader } from \"./loader\";\nimport {\n WIDGET_PACKAGE_MANIFEST_VERSION,\n type FluidSharedGlobals,\n type FluidWidgetPackageFactory,\n type InstallFluidWidgetRuntimeHostGlobalsOptions,\n type WidgetRuntimeHostApi,\n} from \"./types\";\n\nconst globalMarker = Symbol.for(\"fluid.widget-runtime.FluidSharedGlobals\");\nconst pendingPackageFactoryErrorPrefix =\n \"[Fluid Widget Runtime] Failed to register deferred widget package:\";\n\ntype MutableFluidSharedGlobals = FluidSharedGlobals & {\n readonly [globalMarker]: true;\n};\n\nexport function installFluidWidgetRuntimeHostGlobals(\n shared: InstallFluidWidgetRuntimeHostGlobalsOptions = {\n React,\n ReactDOM,\n ReactJsxRuntime,\n },\n): FluidSharedGlobals {\n ensureFluidWidgetsGlobal();\n\n const existing = window.FluidShared;\n if (isFluidSharedGlobal(existing)) {\n drainPendingFluidWidgetPackages();\n return existing;\n }\n\n const widgetRuntime: WidgetRuntimeHostApi = {\n createWidgetRuntimeLoader,\n installFluidWidgetRuntimeHostGlobals,\n manifestVersion: WIDGET_PACKAGE_MANIFEST_VERSION,\n ...shared.WidgetRuntime,\n };\n\n const fluidShared: MutableFluidSharedGlobals = {\n [globalMarker]: true,\n React: shared.React,\n ReactDOM: shared.ReactDOM,\n ReactJsxRuntime: shared.ReactJsxRuntime,\n WidgetRuntime: widgetRuntime,\n };\n\n window.FluidShared = fluidShared;\n drainPendingFluidWidgetPackages();\n return fluidShared;\n}\n\nexport function drainPendingFluidWidgetPackages(): void {\n const queue = window.FluidWidgetPackageQueue;\n if (!Array.isArray(queue)) return;\n\n while (queue.length > 0) {\n const factory = queue.shift();\n if (typeof factory !== \"function\") continue;\n\n try {\n factory();\n } catch (err) {\n console.error(pendingPackageFactoryErrorPrefix, err);\n }\n }\n}\n\nexport function enqueueFluidWidgetPackageFactory(\n factory: FluidWidgetPackageFactory,\n): void {\n const existingQueue = window.FluidWidgetPackageQueue;\n const queue = Array.isArray(existingQueue) ? existingQueue : [];\n window.FluidWidgetPackageQueue = queue;\n queue.push(factory);\n}\n\nfunction isFluidSharedGlobal(\n value: FluidSharedGlobals | undefined,\n): value is MutableFluidSharedGlobals {\n return (\n value !== undefined &&\n (value as Partial<MutableFluidSharedGlobals>)[globalMarker] === true\n );\n}\n","import { Component, type ErrorInfo, type ReactNode } from \"react\";\n\nimport { WidgetRuntimeError } from \"../errors\";\n\nexport interface WidgetRuntimeErrorBoundaryFallbackProps {\n readonly error: Error;\n readonly reset: () => void;\n}\n\nexport interface WidgetRuntimeErrorBoundaryProps {\n readonly children: ReactNode;\n readonly fallback?:\n | ReactNode\n | ((props: WidgetRuntimeErrorBoundaryFallbackProps) => ReactNode);\n readonly onError?: (error: Error, errorInfo: ErrorInfo) => void;\n}\n\ninterface WidgetRuntimeErrorBoundaryState {\n readonly error: Error | null;\n}\n\nexport class WidgetRuntimeErrorBoundary extends Component<\n WidgetRuntimeErrorBoundaryProps,\n WidgetRuntimeErrorBoundaryState\n> {\n override state: WidgetRuntimeErrorBoundaryState = {\n error: null,\n };\n\n static getDerivedStateFromError(\n error: Error,\n ): WidgetRuntimeErrorBoundaryState {\n return { error };\n }\n\n override componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n this.props.onError?.(error, errorInfo);\n }\n\n override render(): ReactNode {\n const { error } = this.state;\n if (!error) {\n return this.props.children;\n }\n\n const reset = (): void => {\n this.setState({ error: null });\n };\n\n if (typeof this.props.fallback === \"function\") {\n return this.props.fallback({ error, reset });\n }\n\n if (this.props.fallback !== undefined) {\n return this.props.fallback;\n }\n\n return <DefaultWidgetRuntimeErrorFallback error={error} reset={reset} />;\n }\n}\n\nfunction DefaultWidgetRuntimeErrorFallback({\n error,\n reset,\n}: WidgetRuntimeErrorBoundaryFallbackProps): ReactNode {\n const title =\n error instanceof WidgetRuntimeError\n ? \"Widget runtime failed\"\n : \"Widget failed to render\";\n\n return (\n <div role=\"alert\">\n <p>{title}</p>\n <button type=\"button\" onClick={reset}>\n Try again\n </button>\n </div>\n );\n}\n","import { createElement, type ComponentType, type ReactElement } from \"react\";\nimport type { WidgetManifest } from \"@fluid-app/portal-core/registries\";\nimport { WidgetRuntimeErrorBoundary } from \"@fluid-app/widget-runtime\";\nimport type { RegisteredWidget } from \"@fluid-app/widget-runtime\";\nimport { DEFAULT_SDK_WIDGET_REGISTRY } from \"../core/default-widget-registry\";\n\n/**\n * Merges custom widget components from manifests into the default\n * SDK widget registry. Returns the default registry unchanged when\n * no custom widgets are provided (avoids unnecessary object creation).\n */\nexport type SdkWidgetRegistry = Record<\n string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ComponentType<any>\n>;\n\nexport function buildWidgetRegistry(\n manifests: readonly WidgetManifest[],\n): SdkWidgetRegistry {\n if (manifests.length === 0) return DEFAULT_SDK_WIDGET_REGISTRY;\n\n const customEntries = Object.fromEntries(\n manifests\n .filter((manifest) => {\n const isBuiltIn = isBuiltInWidgetType(manifest.type);\n if (isBuiltIn) warnBuiltInWidgetCollision(\"manifest\", manifest.type);\n return !isBuiltIn;\n })\n .map((manifest) => [manifest.type, manifest.component]),\n );\n\n return { ...DEFAULT_SDK_WIDGET_REGISTRY, ...customEntries };\n}\n\nexport type RuntimeRegistryWidget = Pick<\n RegisteredWidget,\n \"type\" | \"component\"\n>;\n\nexport type WidgetRegistryWarningSink = (message: string) => void;\n\nexport function mergeRegisteredWidgetsIntoRegistry(\n registry: SdkWidgetRegistry,\n registeredWidgets: readonly RuntimeRegistryWidget[],\n warningSink: WidgetRegistryWarningSink = defaultWidgetRegistryWarningSink,\n): SdkWidgetRegistry {\n if (registeredWidgets.length === 0) return registry;\n\n const duplicateRuntimeWidgetTypes =\n getDuplicateWidgetTypes(registeredWidgets);\n const remoteEntries = Object.fromEntries(\n registeredWidgets\n .filter((widget) => {\n const isBuiltIn = isBuiltInWidgetType(widget.type);\n if (isBuiltIn) {\n warnBuiltInWidgetCollision(\n \"runtime registration\",\n widget.type,\n warningSink,\n );\n return false;\n }\n\n if (duplicateRuntimeWidgetTypes.has(widget.type)) {\n warnDuplicateRuntimeWidgetType(widget.type, warningSink);\n return false;\n }\n\n if (isExistingRegistryWidgetType(registry, widget.type)) {\n warnExistingRegistryWidgetCollision(widget.type, warningSink);\n return false;\n }\n\n return true;\n })\n .map((widget) => [widget.type, wrapRuntimeWidgetComponent(widget)]),\n );\n\n return { ...registry, ...remoteEntries };\n}\n\nfunction getDuplicateWidgetTypes(\n widgets: readonly RuntimeRegistryWidget[],\n): ReadonlySet<string> {\n const counts = new Map<string, number>();\n for (const widget of widgets) {\n counts.set(widget.type, (counts.get(widget.type) ?? 0) + 1);\n }\n\n return new Set(\n Array.from(counts.entries())\n .filter(([, count]) => count > 1)\n .map(([type]) => type),\n );\n}\n\nfunction wrapRuntimeWidgetComponent(\n widget: RuntimeRegistryWidget,\n): ComponentType<Record<string, unknown>> {\n const RuntimeWidgetComponent = widget.component as ComponentType<\n Record<string, unknown>\n >;\n\n function RuntimeWidgetWithBoundary(\n props: Record<string, unknown>,\n ): ReactElement {\n return createElement(\n WidgetRuntimeErrorBoundary,\n null,\n createElement(RuntimeWidgetComponent, props),\n );\n }\n\n RuntimeWidgetWithBoundary.displayName = `WidgetRuntimeErrorBoundary(${widget.type})`;\n\n return RuntimeWidgetWithBoundary;\n}\n\nfunction isBuiltInWidgetType(widgetType: string): boolean {\n return Object.prototype.hasOwnProperty.call(\n DEFAULT_SDK_WIDGET_REGISTRY,\n widgetType,\n );\n}\n\nfunction isExistingRegistryWidgetType(\n registry: SdkWidgetRegistry,\n widgetType: string,\n): boolean {\n return Object.prototype.hasOwnProperty.call(registry, widgetType);\n}\n\nfunction defaultWidgetRegistryWarningSink(message: string): void {\n console.warn(message);\n}\n\nfunction warnBuiltInWidgetCollision(\n source: string,\n widgetType: string,\n warningSink: WidgetRegistryWarningSink = defaultWidgetRegistryWarningSink,\n): void {\n warningSink(\n `[portal-sdk] Ignoring ${source} for built-in widget type \"${widgetType}\". ` +\n `Built-in widgets cannot be overridden.`,\n );\n}\n\nfunction warnDuplicateRuntimeWidgetType(\n widgetType: string,\n warningSink: WidgetRegistryWarningSink = defaultWidgetRegistryWarningSink,\n): void {\n warningSink(\n `[portal-sdk] Ignoring runtime widget type \"${widgetType}\" because multiple packages registered the same SDK-facing type.`,\n );\n}\n\nfunction warnExistingRegistryWidgetCollision(\n widgetType: string,\n warningSink: WidgetRegistryWarningSink = defaultWidgetRegistryWarningSink,\n): void {\n warningSink(\n `[portal-sdk] Ignoring runtime widget type \"${widgetType}\" because the SDK registry already contains that type.`,\n );\n}\n","export const DEFAULT_WIDGET_PACKAGE_MANIFEST_URL = \"/api/app/widget-packages\";\nexport const VITE_DEV_WIDGET_PACKAGE_MANIFEST_URL = \"/__widget-packages__\";\n\nconst VITE_DEV_MODULE_PATH_SEGMENTS = [\n \"/@fs/\",\n \"/src/\",\n \"/node_modules/.vite/\",\n \"/@id/\",\n] as const;\n\nexport interface DefaultWidgetPackageManifestUrlOptions {\n readonly isViteDev?: boolean;\n}\n\nexport function resolveDefaultWidgetPackageManifestUrl(\n moduleUrl: string | undefined,\n options: DefaultWidgetPackageManifestUrlOptions = {},\n): string | false {\n const parsedModuleUrl = parseModuleUrl(moduleUrl);\n if (!parsedModuleUrl) return false;\n\n if (options.isViteDev && isViteDevModulePath(parsedModuleUrl.pathname)) {\n return new URL(VITE_DEV_WIDGET_PACKAGE_MANIFEST_URL, parsedModuleUrl.origin)\n .href;\n }\n\n return DEFAULT_WIDGET_PACKAGE_MANIFEST_URL;\n}\n\nfunction parseModuleUrl(moduleUrl: string | undefined): URL | null {\n if (!moduleUrl) return null;\n\n try {\n return new URL(moduleUrl);\n } catch {\n return null;\n }\n}\n\nfunction isViteDevModulePath(pathname: string): boolean {\n return VITE_DEV_MODULE_PATH_SEGMENTS.some((segment) =>\n pathname.includes(segment),\n );\n}\n\nexport function getDefaultWidgetPackageManifestUrl(): string | false {\n return resolveDefaultWidgetPackageManifestUrl(import.meta.url, {\n isViteDev: isViteDevRuntime(),\n });\n}\n\nfunction isViteDevRuntime(): boolean {\n return (\n (import.meta.env as { readonly DEV?: boolean } | undefined)?.DEV === true\n );\n}\n","import * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport * as ReactJsxRuntime from \"react/jsx-runtime\";\nimport {\n createWidgetRuntimeLoader,\n ensureFluidWidgetsGlobal,\n installFluidWidgetRuntimeHostGlobals,\n validateWidgetPackageDescriptor,\n type FluidWidgetsGlobalRegistryEvent,\n type FluidWidgetsGlobalUnsubscribe,\n type GlobalRegisteredWidget,\n type RegisteredWidget,\n type WidgetPackageDescriptor as RuntimeWidgetPackageDescriptor,\n} from \"@fluid-app/widget-runtime\";\nimport {\n DEFAULT_MIN_SDK_VERSION,\n DEFAULT_WIDGET_CATEGORY,\n DEFAULT_WIDGET_ICON,\n SHARED_WIDGET_ARTIFACT_URL_PREFIX,\n hasControlCharacter,\n normalizeWidgetPackageType,\n normalizeWidgetRuntimeContainer,\n normalizeWidgetRuntimeResizable,\n readNonEmptyString,\n} from \"@fluid-app/widget-runtime/catalog\";\nimport type {\n WidgetDescriptor,\n WidgetPackageDescriptor,\n WidgetPackageType,\n WidgetRuntimeContainer,\n WidgetRuntimeResizable,\n} from \"../types/widget-package-descriptor\";\nimport { DEFAULT_WIDGET_PACKAGE_MANIFEST_URL } from \"./widget-package-manifest-url\";\n\nexport { DEFAULT_WIDGET_PACKAGE_MANIFEST_URL } from \"./widget-package-manifest-url\";\n\nconst WIDGET_PACKAGE_DESCRIPTOR_MANIFEST_VERSION =\n 1 satisfies WidgetPackageDescriptor[\"manifestVersion\"];\nconst WIDGET_PACKAGE_DESCRIPTOR_FETCH_TIMEOUT_MS = 5000;\n\nexport interface WidgetPackageLoadSummary {\n readonly registeredWidgets: readonly RegisteredWidget[];\n readonly hasFailures: boolean;\n}\n\nexport interface LoadWidgetPackagesOptions {\n /**\n * Do not reuse packages that were already present on `window.FluidWidgets`\n * before this load began. Packages loaded by this portal instance may still\n * register the same packageId/version/type and be returned.\n */\n readonly ignoreExistingGlobalRegistrations?: boolean;\n}\n\nexport interface WidgetPackageDescriptorFetchOptions {\n /** Additional trusted origins for fetched descriptor assets. */\n readonly allowedOrigins?: readonly string[];\n /** Credentials mode used for the descriptor catalog fetch. */\n readonly credentials?: RequestCredentials;\n /**\n * Trust catalog-authenticated runtime assets from the shared artifact bucket.\n * When enabled, descriptor/API-origin assets must still be listed explicitly\n * in allowedOrigins.\n */\n readonly trustCatalogAssetOrigins?: boolean;\n}\n\nexport interface FluidWidgetsRegistrySubscription {\n readonly registeredWidgets: readonly GlobalRegisteredWidget[];\n readonly unsubscribe: FluidWidgetsGlobalUnsubscribe;\n}\n\nexport type FluidWidgetsRegistryChangeListener = (\n registeredWidgets: readonly GlobalRegisteredWidget[],\n event: FluidWidgetsGlobalRegistryEvent,\n) => void;\n\nexport function installAndReadFluidWidgetsRegistry(): readonly GlobalRegisteredWidget[] {\n if (typeof window === \"undefined\") return [];\n\n return installAndReadFluidWidgetsGlobal().getRegisteredWidgets();\n}\n\nexport function subscribeToFluidWidgetsRegistry(\n listener: FluidWidgetsRegistryChangeListener,\n): FluidWidgetsRegistrySubscription {\n if (typeof window === \"undefined\") {\n return { registeredWidgets: [], unsubscribe: () => undefined };\n }\n\n const fluidWidgets = installAndReadFluidWidgetsGlobal();\n const unsubscribe = fluidWidgets.subscribe((event) => {\n listener(fluidWidgets.getRegisteredWidgets(), event);\n });\n\n return {\n registeredWidgets: fluidWidgets.getRegisteredWidgets(),\n unsubscribe,\n };\n}\n\nfunction installAndReadFluidWidgetsGlobal() {\n installFluidWidgetRuntimeHostGlobals({\n React,\n ReactDOM,\n ReactJsxRuntime,\n });\n\n return ensureFluidWidgetsGlobal();\n}\n\nexport async function fetchWidgetPackageDescriptors(\n descriptorEndpointUrl: string = DEFAULT_WIDGET_PACKAGE_MANIFEST_URL,\n options: WidgetPackageDescriptorFetchOptions = {},\n): Promise<WidgetPackageDescriptor[]> {\n const abortSignal = createTimeoutAbortSignal(\n WIDGET_PACKAGE_DESCRIPTOR_FETCH_TIMEOUT_MS,\n );\n\n try {\n const response = await fetch(descriptorEndpointUrl, {\n credentials: options.credentials ?? \"same-origin\",\n signal: abortSignal.signal,\n });\n\n if (!response.ok) {\n throw new Error(\n `[portal] Failed to fetch widget package descriptors from ${descriptorEndpointUrl}: ${response.status} ${response.statusText}`,\n );\n }\n\n const data: unknown = await response.json();\n return parseWidgetPackageDescriptorResponse(\n data,\n descriptorEndpointUrl,\n options,\n );\n } finally {\n abortSignal.cleanup();\n }\n}\n\nexport function parseWidgetPackageDescriptorResponse(\n data: unknown,\n descriptorEndpointUrl: string = DEFAULT_WIDGET_PACKAGE_MANIFEST_URL,\n options: WidgetPackageDescriptorFetchOptions = {},\n): WidgetPackageDescriptor[] {\n const descriptorEndpointBaseUrl = normalizeDescriptorEndpointUrl(\n descriptorEndpointUrl,\n );\n if (!descriptorEndpointBaseUrl) return [];\n\n const entries = getWidgetPackageDescriptorEntries(data);\n if (!entries) return [];\n\n const assetOriginPolicy = createRuntimeAssetOriginPolicy(\n descriptorEndpointBaseUrl,\n options.allowedOrigins ?? [],\n options.trustCatalogAssetOrigins === true,\n );\n\n const descriptors: WidgetPackageDescriptor[] = [];\n for (const entry of entries) {\n const descriptor = normalizeWidgetPackageDescriptor(\n entry,\n descriptorEndpointBaseUrl,\n assetOriginPolicy,\n );\n if (descriptor) descriptors.push(descriptor);\n }\n\n return descriptors;\n}\n\nexport async function loadWidgetPackages(\n widgetPackages: readonly WidgetPackageDescriptor[],\n options: LoadWidgetPackagesOptions = {},\n): Promise<WidgetPackageLoadSummary> {\n if (widgetPackages.length === 0) {\n return { registeredWidgets: [], hasFailures: false };\n }\n\n // Installs React host globals; pre-registered widgets are merged by the caller.\n if (options.ignoreExistingGlobalRegistrations) {\n installAndReadFluidWidgetsGlobal();\n } else {\n installAndReadFluidWidgetsRegistry();\n }\n\n const loader = createWidgetRuntimeLoader({\n ignorePreRegisteredPackages:\n options.ignoreExistingGlobalRegistrations === true,\n });\n const runtimeWidgetPackages: readonly RuntimeWidgetPackageDescriptor[] =\n widgetPackages;\n const results = await loader.loadPackages(runtimeWidgetPackages);\n let hasFailures = false;\n\n for (const result of results) {\n if (!result.ok) {\n hasFailures = true;\n console.error(\n `[portal] Failed to load widget package ${result.packageId}@${result.version}:`,\n result.error,\n );\n }\n }\n\n return {\n registeredWidgets: loader.getRegisteredWidgets(),\n hasFailures,\n };\n}\n\nfunction createTimeoutAbortSignal(timeoutMs: number): {\n readonly signal: AbortSignal;\n readonly cleanup: () => void;\n} {\n if (typeof AbortSignal.timeout === \"function\") {\n return {\n signal: AbortSignal.timeout(timeoutMs),\n cleanup: () => undefined,\n };\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n return {\n signal: controller.signal,\n cleanup: () => clearTimeout(timeoutId),\n };\n}\n\nfunction getWidgetPackageDescriptorEntries(\n data: unknown,\n): readonly unknown[] | null {\n if (Array.isArray(data)) return data;\n if (!isRecord(data)) return null;\n\n const wrappedEntries =\n getArrayProperty(data, \"packages\") ??\n getArrayProperty(data, \"packageDescriptors\") ??\n getArrayProperty(data, \"widgetPackages\");\n\n if (wrappedEntries) return wrappedEntries;\n return looksLikeWidgetPackageEntry(data) ? [data] : null;\n}\n\nfunction normalizeWidgetPackageDescriptor(\n entry: unknown,\n descriptorEndpointUrl: URL,\n assetOriginPolicy: RuntimeAssetOriginPolicy,\n): WidgetPackageDescriptor | null {\n const candidate = createWidgetPackageDescriptorCandidate(entry);\n if (candidate.kind === \"skipped\") return null;\n if (candidate.kind === \"invalid\") {\n warnRejectedMalformedWidgetPackageEntry(\n entry,\n candidate.reason,\n descriptorEndpointUrl,\n );\n return null;\n }\n\n const remoteEntryUrl = normalizeRuntimeAssetUrl(\n candidate.descriptor.remoteEntryUrl,\n descriptorEndpointUrl,\n assetOriginPolicy,\n );\n if (!remoteEntryUrl.ok) {\n warnRejectedWidgetPackageDescriptor(\n candidate.descriptor,\n \"remoteEntryUrl\",\n remoteEntryUrl.failure,\n descriptorEndpointUrl,\n );\n return null;\n }\n\n const cssUrls: string[] = [];\n for (const cssUrl of candidate.descriptor.cssUrls) {\n const normalizedCssUrl = normalizeRuntimeAssetUrl(\n cssUrl,\n descriptorEndpointUrl,\n assetOriginPolicy,\n );\n if (!normalizedCssUrl.ok) {\n warnRejectedWidgetPackageDescriptor(\n candidate.descriptor,\n \"cssUrls\",\n normalizedCssUrl.failure,\n descriptorEndpointUrl,\n );\n return null;\n }\n cssUrls.push(normalizedCssUrl.url);\n }\n\n const descriptor = {\n ...candidate.descriptor,\n remoteEntryUrl: remoteEntryUrl.url,\n cssUrls,\n };\n\n const validationError = validateDescriptorCandidate(descriptor);\n if (validationError) {\n warnRejectedMalformedWidgetPackageEntry(\n entry,\n validationError,\n descriptorEndpointUrl,\n );\n return null;\n }\n\n return descriptor;\n}\n\ninterface DescriptorCandidateSuccess {\n readonly kind: \"valid\";\n readonly descriptor: WidgetPackageDescriptor;\n}\n\ninterface DescriptorCandidateInvalid {\n readonly kind: \"invalid\";\n readonly reason: string;\n}\n\ninterface DescriptorCandidateSkipped {\n readonly kind: \"skipped\";\n}\n\ntype DescriptorCandidateResult =\n | DescriptorCandidateSuccess\n | DescriptorCandidateInvalid\n | DescriptorCandidateSkipped;\n\nfunction createWidgetPackageDescriptorCandidate(\n entry: unknown,\n): DescriptorCandidateResult {\n if (!isRecord(entry)) {\n return { kind: \"invalid\", reason: \"entry must be an object\" };\n }\n const manifest = isRecord(entry.manifest) ? entry.manifest : undefined;\n if (entry.disabled === true || entry.enabled === false) {\n return { kind: \"skipped\" };\n }\n\n if (isRuntimeWidgetPackageDescriptorAttempt(entry)) {\n return createStrictRuntimeWidgetPackageDescriptorCandidate(entry);\n }\n\n if (isCatalogWidgetPackageEntry(entry, manifest)) {\n return createCatalogWidgetPackageDescriptorCandidate(entry, manifest);\n }\n\n return createRuntimeWidgetPackageDescriptorCandidate(entry, manifest);\n}\n\nfunction createStrictRuntimeWidgetPackageDescriptorCandidate(\n entry: Readonly<Record<string, unknown>>,\n): DescriptorCandidateResult {\n return createDescriptorCandidate({\n manifestVersion: normalizeManifestVersion(entry.manifestVersion, {\n defaultWhenMissing: false,\n }),\n packageId: readNonEmptyString(entry.packageId),\n packageType: normalizeWidgetPackageType(entry.packageType),\n version: readNonEmptyString(entry.version),\n remoteEntryUrl: readNonEmptyString(entry.remoteEntryUrl),\n cssUrls: normalizeRuntimeCssUrls(entry.cssUrls),\n widgets: normalizeRuntimeWidgets(entry.widgets),\n packageTypeError:\n \"packageType must be one of fluid, company, droplet, partner, or internal\",\n widgetsError: \"manifest.widgets/widgets must be a non-empty array\",\n });\n}\n\nfunction createRuntimeWidgetPackageDescriptorCandidate(\n entry: Readonly<Record<string, unknown>>,\n manifest: Readonly<Record<string, unknown>> | undefined,\n): DescriptorCandidateResult {\n const packageId =\n readNonEmptyString(entry.packageId) ??\n readNonEmptyString(manifest?.packageId);\n const version =\n readNonEmptyString(entry.version) ?? readNonEmptyString(manifest?.version);\n const remoteEntryUrl =\n readNonEmptyString(entry.remoteEntryUrl) ??\n readNonEmptyString(manifest?.remoteEntryUrl);\n const packageType =\n normalizeWidgetPackageType(entry.packageType) ??\n normalizeWidgetPackageType(manifest?.packageType);\n const manifestVersion = normalizeManifestVersion(\n entry.manifestVersion ?? manifest?.manifestVersion,\n { defaultWhenMissing: false },\n );\n const cssUrls = normalizeRuntimeCssUrls(entry.cssUrls ?? manifest?.cssUrls);\n const widgets = normalizeRuntimeWidgets(manifest?.widgets ?? entry.widgets);\n\n return createDescriptorCandidate({\n manifestVersion,\n packageId,\n packageType,\n version,\n remoteEntryUrl,\n cssUrls,\n widgets,\n packageTypeError:\n \"packageType must be one of fluid, company, droplet, partner, or internal\",\n widgetsError: \"manifest.widgets/widgets must be a non-empty array\",\n });\n}\n\nfunction createCatalogWidgetPackageDescriptorCandidate(\n entry: Readonly<Record<string, unknown>>,\n manifest: Readonly<Record<string, unknown>> | undefined,\n): DescriptorCandidateResult {\n const packageId =\n readNonEmptyString(entry.packageId) ??\n readNonEmptyString(manifest?.packageId);\n const version =\n readNonEmptyString(entry.version) ?? readNonEmptyString(manifest?.version);\n const remoteEntryUrl =\n readNonEmptyString(entry.scriptUrl) ??\n readNonEmptyString(entry.remoteEntryUrl) ??\n readNonEmptyString(manifest?.scriptUrl) ??\n readNonEmptyString(manifest?.remoteEntryUrl);\n const packageType =\n normalizeWidgetPackageType(entry.source) ??\n normalizeWidgetPackageType(entry.packageType) ??\n normalizeWidgetPackageType(manifest?.source) ??\n normalizeWidgetPackageType(manifest?.packageType) ??\n \"company\";\n const manifestVersion = normalizeManifestVersion(\n entry.manifestVersion ?? manifest?.manifestVersion,\n { defaultWhenMissing: true },\n );\n const cssUrls = normalizeCssUrls(entry.cssUrls ?? manifest?.cssUrls);\n const rawWidgets = manifest?.widgets ?? entry.widgets;\n const widgets = Array.isArray(rawWidgets)\n ? normalizeCatalogWidgets(rawWidgets, packageId)\n : null;\n\n return createDescriptorCandidate({\n manifestVersion,\n packageId,\n packageType,\n version,\n remoteEntryUrl,\n cssUrls,\n widgets,\n packageTypeError:\n \"packageType/source must be one of fluid, company, droplet, partner, internal, or omitted for company catalog packages\",\n widgetsError:\n \"manifest.widgets/widgets must contain at least one valid widget\",\n });\n}\n\ninterface DescriptorCandidateFields {\n readonly manifestVersion: WidgetPackageDescriptor[\"manifestVersion\"] | null;\n readonly packageId: string | undefined;\n readonly packageType: WidgetPackageType | null;\n readonly version: string | undefined;\n readonly remoteEntryUrl: string | undefined;\n readonly cssUrls: string[] | null;\n readonly widgets: WidgetDescriptor[] | null;\n readonly packageTypeError: string;\n readonly widgetsError: string;\n}\n\nfunction createDescriptorCandidate(\n fields: DescriptorCandidateFields,\n): DescriptorCandidateResult {\n if (!fields.manifestVersion) {\n return { kind: \"invalid\", reason: \"unsupported manifestVersion\" };\n }\n if (!fields.packageId) {\n return { kind: \"invalid\", reason: \"packageId must be a non-empty string\" };\n }\n if (!fields.version) {\n return { kind: \"invalid\", reason: \"version must be a non-empty string\" };\n }\n if (!fields.packageType) {\n return { kind: \"invalid\", reason: fields.packageTypeError };\n }\n if (!fields.remoteEntryUrl) {\n return {\n kind: \"invalid\",\n reason: \"remoteEntryUrl/scriptUrl must be a non-empty string\",\n };\n }\n if (!fields.cssUrls) {\n return { kind: \"invalid\", reason: \"cssUrls must be an array of strings\" };\n }\n if (!fields.widgets || fields.widgets.length === 0) {\n return { kind: \"invalid\", reason: fields.widgetsError };\n }\n\n return {\n kind: \"valid\",\n descriptor: {\n manifestVersion: fields.manifestVersion,\n packageId: fields.packageId,\n packageType: fields.packageType,\n version: fields.version,\n remoteEntryUrl: fields.remoteEntryUrl,\n cssUrls: fields.cssUrls,\n widgets: fields.widgets,\n },\n };\n}\n\nfunction validateDescriptorCandidate(\n descriptor: WidgetPackageDescriptor,\n): string | null {\n try {\n validateWidgetPackageDescriptor(\n descriptor as RuntimeWidgetPackageDescriptor,\n );\n return null;\n } catch (error) {\n return error instanceof Error ? error.message : String(error);\n }\n}\n\nfunction isRuntimeWidgetPackageDescriptorAttempt(\n entry: Readonly<Record<string, unknown>>,\n): boolean {\n return (\n entry.manifestVersion !== undefined &&\n entry.packageId !== undefined &&\n entry.packageType !== undefined &&\n entry.version !== undefined &&\n entry.remoteEntryUrl !== undefined &&\n entry.cssUrls !== undefined &&\n entry.widgets !== undefined\n );\n}\n\nfunction isCatalogWidgetPackageEntry(\n entry: Readonly<Record<string, unknown>>,\n manifest: Readonly<Record<string, unknown>> | undefined,\n): boolean {\n return (\n entry.source !== undefined ||\n entry.scriptUrl !== undefined ||\n entry.manifestUrl !== undefined ||\n manifest?.source !== undefined ||\n manifest?.scriptUrl !== undefined ||\n manifest?.manifestUrl !== undefined ||\n manifest?.widgets !== undefined\n );\n}\n\nfunction normalizeManifestVersion(\n value: unknown,\n options: { readonly defaultWhenMissing: boolean },\n): WidgetPackageDescriptor[\"manifestVersion\"] | null {\n if (value === WIDGET_PACKAGE_DESCRIPTOR_MANIFEST_VERSION) {\n return WIDGET_PACKAGE_DESCRIPTOR_MANIFEST_VERSION;\n }\n\n if (value === undefined && options.defaultWhenMissing) {\n return WIDGET_PACKAGE_DESCRIPTOR_MANIFEST_VERSION;\n }\n\n return null;\n}\n\nfunction normalizeCssUrls(value: unknown): string[] | null {\n return normalizeCssUrlList(value, { undefinedValue: [] });\n}\n\nfunction normalizeRuntimeCssUrls(value: unknown): string[] | null {\n return normalizeCssUrlList(value, { undefinedValue: null });\n}\n\nfunction normalizeCssUrlList(\n value: unknown,\n options: { readonly undefinedValue: string[] | null },\n): string[] | null {\n if (value === undefined) return options.undefinedValue;\n if (!Array.isArray(value)) return null;\n\n const cssUrls: string[] = [];\n for (const cssUrl of value) {\n const normalizedCssUrl = readNonEmptyString(cssUrl);\n if (!normalizedCssUrl) return null;\n cssUrls.push(normalizedCssUrl);\n }\n return cssUrls;\n}\n\nfunction normalizeRuntimeWidgets(value: unknown): WidgetDescriptor[] | null {\n if (!Array.isArray(value)) return null;\n return value as WidgetDescriptor[];\n}\n\nfunction normalizeCatalogWidgets(\n value: readonly unknown[],\n packageId: string | undefined,\n): WidgetDescriptor[] {\n const widgets: WidgetDescriptor[] = [];\n value.forEach((widget, index) => {\n const normalizedWidget = normalizeWidgetDescriptor(widget, {\n fallbackType:\n packageId === undefined\n ? undefined\n : `${packageId}-widget-${index + 1}`,\n overwritePropertySchemaWidgetType: true,\n });\n if (normalizedWidget) widgets.push(normalizedWidget);\n });\n return widgets;\n}\n\nfunction normalizeWidgetDescriptor(\n widget: unknown,\n options: {\n readonly fallbackType?: string;\n readonly overwritePropertySchemaWidgetType?: boolean;\n } = {},\n): WidgetDescriptor | null {\n if (!isRecord(widget)) return null;\n\n const type =\n readNonEmptyString(widget.type) ??\n readNonEmptyString(widget.name) ??\n options.fallbackType;\n if (!type) return null;\n\n const name = readNonEmptyString(widget.name) ?? type;\n const displayName = readNonEmptyString(widget.displayName) ?? name;\n\n return {\n type,\n name,\n displayName,\n description:\n readNonEmptyString(widget.description) ?? `Custom widget ${displayName}`,\n icon: readNonEmptyString(widget.icon) ?? DEFAULT_WIDGET_ICON,\n category: readNonEmptyString(widget.category) ?? DEFAULT_WIDGET_CATEGORY,\n propertySchema: normalizePropertySchema(widget.propertySchema, type, {\n overwriteWidgetType: options.overwritePropertySchemaWidgetType === true,\n }),\n defaultProps: isRecord(widget.defaultProps) ? widget.defaultProps : {},\n container: normalizeContainer(widget.container),\n minSdkVersion:\n readNonEmptyString(widget.minSdkVersion) ?? DEFAULT_MIN_SDK_VERSION,\n resizable: normalizeResizable(widget.resizable),\n };\n}\n\nfunction normalizePropertySchema(\n value: unknown,\n widgetType: string,\n options: { readonly overwriteWidgetType: boolean } = {\n overwriteWidgetType: false,\n },\n): WidgetDescriptor[\"propertySchema\"] {\n if (!isRecord(value)) return { widgetType };\n if (options.overwriteWidgetType || value.widgetType === undefined) {\n return { ...value, widgetType };\n }\n return value;\n}\n\nfunction normalizeContainer(value: unknown): WidgetRuntimeContainer {\n return normalizeWidgetRuntimeContainer(value);\n}\n\nfunction normalizeResizable(value: unknown): WidgetRuntimeResizable {\n return normalizeWidgetRuntimeResizable(value);\n}\n\ninterface RuntimeAssetUrlNormalizationFailure {\n readonly inputUrl: string;\n readonly resolvedUrl?: string;\n readonly reason: \"invalid-url\" | \"unsupported-protocol\" | \"untrusted-origin\";\n}\n\ntype RuntimeAssetUrlNormalizationResult =\n | { readonly ok: true; readonly url: string }\n | {\n readonly ok: false;\n readonly failure: RuntimeAssetUrlNormalizationFailure;\n };\n\ninterface RuntimeAssetOriginPolicy {\n readonly allowSharedWidgetArtifactBucket: boolean;\n readonly allowedOrigins: ReadonlySet<string>;\n}\n\nfunction normalizeRuntimeAssetUrl(\n url: string,\n baseUrl: URL,\n assetOriginPolicy: RuntimeAssetOriginPolicy,\n): RuntimeAssetUrlNormalizationResult {\n if (hasUnsafeRawRuntimeAssetUrlSyntax(url)) {\n return {\n ok: false,\n failure: {\n inputUrl: url,\n reason: \"invalid-url\",\n },\n };\n }\n\n try {\n const parsedUrl = new URL(url, baseUrl);\n if (parsedUrl.protocol !== \"http:\" && parsedUrl.protocol !== \"https:\") {\n return {\n ok: false,\n failure: {\n inputUrl: url,\n resolvedUrl: parsedUrl.href,\n reason: \"unsupported-protocol\",\n },\n };\n }\n if (assetOriginPolicy.allowedOrigins.has(parsedUrl.origin)) {\n return { ok: true, url: parsedUrl.href };\n }\n\n if (\n assetOriginPolicy.allowSharedWidgetArtifactBucket &&\n parsedUrl.href.startsWith(SHARED_WIDGET_ARTIFACT_URL_PREFIX)\n ) {\n return { ok: true, url: parsedUrl.href };\n }\n\n return {\n ok: false,\n failure: {\n inputUrl: url,\n resolvedUrl: parsedUrl.href,\n reason: \"untrusted-origin\",\n },\n };\n } catch {\n return {\n ok: false,\n failure: {\n inputUrl: url,\n reason: \"invalid-url\",\n },\n };\n }\n}\n\nfunction warnRejectedWidgetPackageDescriptor(\n descriptor: WidgetPackageDescriptor,\n assetField: \"remoteEntryUrl\" | \"cssUrls\",\n failure: RuntimeAssetUrlNormalizationFailure,\n descriptorEndpointUrl: URL,\n): void {\n console.warn(\n `[portal] Dropping widget package descriptor ${descriptor.packageId}@${descriptor.version} from ${descriptorEndpointUrl.href}: ${assetField} \"${failure.inputUrl}\" ${formatRuntimeAssetUrlFailure(failure)}.`,\n );\n}\n\nfunction warnRejectedMalformedWidgetPackageEntry(\n entry: unknown,\n reason: string,\n descriptorEndpointUrl: URL,\n): void {\n console.warn(\n `[portal] Dropping widget package catalog entry ${formatWidgetPackageEntryIdentity(entry)} from ${descriptorEndpointUrl.href}: ${reason}.`,\n );\n}\n\nfunction formatWidgetPackageEntryIdentity(entry: unknown): string {\n if (!isRecord(entry)) return \"<unknown>\";\n\n const packageId = readNonEmptyString(entry.packageId);\n const version = readNonEmptyString(entry.version);\n if (packageId && version) return `${packageId}@${version}`;\n if (packageId) return packageId;\n return \"<unknown>\";\n}\n\nfunction formatRuntimeAssetUrlFailure(\n failure: RuntimeAssetUrlNormalizationFailure,\n): string {\n const resolvedUrl = failure.resolvedUrl\n ? ` (resolved as ${failure.resolvedUrl})`\n : \"\";\n\n switch (failure.reason) {\n case \"invalid-url\":\n return \"is not a valid URL\";\n case \"unsupported-protocol\":\n return `uses an unsupported protocol${resolvedUrl}`;\n case \"untrusted-origin\":\n return `resolved to an untrusted origin${resolvedUrl}`;\n }\n}\n\nfunction createRuntimeAssetOriginPolicy(\n descriptorEndpointUrl: URL,\n allowedOrigins: readonly string[],\n trustCatalogAssetOrigins: boolean,\n): RuntimeAssetOriginPolicy {\n const origins = new Set<string>();\n if (!trustCatalogAssetOrigins) {\n origins.add(descriptorEndpointUrl.origin);\n }\n\n for (const origin of allowedOrigins) {\n const normalizedOrigin = normalizeAllowedOrigin(origin);\n if (normalizedOrigin) {\n origins.add(normalizedOrigin);\n } else {\n console.warn(\n `[portal] Ignoring invalid widget package allowed origin \"${origin}\". Expected an http(s) absolute URL origin.`,\n );\n }\n }\n\n return {\n allowSharedWidgetArtifactBucket: trustCatalogAssetOrigins,\n allowedOrigins: origins,\n };\n}\n\nfunction hasUnsafeRawRuntimeAssetUrlSyntax(url: string): boolean {\n return (\n url.trim() !== url ||\n hasControlCharacter(url) ||\n url.includes(\"\\\\\") ||\n url.startsWith(\"//\") ||\n hasAmbiguousHttpScheme(url)\n );\n}\n\nfunction hasAmbiguousHttpScheme(url: string): boolean {\n return /^https?:(?!\\/\\/)/i.test(url);\n}\n\nfunction normalizeAllowedOrigin(origin: string): string | null {\n try {\n const parsedOrigin = new URL(origin);\n if (\n parsedOrigin.protocol !== \"http:\" &&\n parsedOrigin.protocol !== \"https:\"\n ) {\n return null;\n }\n\n return parsedOrigin.origin;\n } catch {\n return null;\n }\n}\n\nfunction normalizeDescriptorEndpointUrl(url: string): URL | null {\n try {\n return new URL(url, getWindowLocationHref());\n } catch {\n return null;\n }\n}\n\nfunction getWindowLocationHref(): string | undefined {\n return typeof window === \"undefined\" ? undefined : window.location.href;\n}\n\nfunction looksLikeWidgetPackageEntry(\n value: Readonly<Record<string, unknown>>,\n): boolean {\n return (\n value.packageId !== undefined ||\n value.remoteEntryUrl !== undefined ||\n value.scriptUrl !== undefined ||\n value.manifest !== undefined ||\n value.widgets !== undefined\n );\n}\n\nfunction getArrayProperty(\n value: Readonly<Record<string, unknown>>,\n key: string,\n): readonly unknown[] | undefined {\n const property = value[key];\n return Array.isArray(property) ? property : undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import type { WidgetPackageDescriptor } from \"../types/widget-package-descriptor\";\n\nexport function resolveHostedWidgetPackageManifestUrl(\n descriptorEndpointUrl: string,\n baseUrl: string,\n): string {\n try {\n return new URL(descriptorEndpointUrl, baseUrl).href;\n } catch {\n return descriptorEndpointUrl;\n }\n}\n\nexport function dedupeWidgetPackagesByPackageIdAndVersion(\n widgetPackages: readonly WidgetPackageDescriptor[],\n): WidgetPackageDescriptor[] {\n const widgetPackagesByIdAndVersion = new Map<\n string,\n WidgetPackageDescriptor\n >();\n for (const widgetPackage of widgetPackages) {\n const key = JSON.stringify([\n widgetPackage.packageId,\n widgetPackage.version,\n ]);\n if (!widgetPackagesByIdAndVersion.has(key)) {\n widgetPackagesByIdAndVersion.set(key, widgetPackage);\n }\n }\n return Array.from(widgetPackagesByIdAndVersion.values());\n}\n"],"mappings":"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"}
@@ -451,8 +451,10 @@ const defaultTimeoutMs = 15e3;
451
451
  */
452
452
  let remoteScriptLoadQueue;
453
453
  const pendingRemoteRegistrationsByPackageKey = /* @__PURE__ */ new Map();
454
+ const observedRegistrationsByPendingLoad = /* @__PURE__ */ new WeakMap();
454
455
  function createWidgetRuntimeLoader(options = {}) {
455
456
  const timeoutMs = options.timeoutMs ?? defaultTimeoutMs;
457
+ const ignorePreRegisteredPackages = options.ignorePreRegisteredPackages === true;
456
458
  const fluidWidgets = ensureFluidWidgetsGlobal();
457
459
  const packagesByKey = /* @__PURE__ */ new Map();
458
460
  const pendingPackagesByKey = /* @__PURE__ */ new Map();
@@ -477,7 +479,7 @@ function createWidgetRuntimeLoader(options = {}) {
477
479
  const pendingPackage = pendingPackagesByKey.get(cacheKey);
478
480
  if (pendingPackage) return await pendingPackage.promise;
479
481
  const globalRegistration = fluidWidgets.getPackageRegistration(descriptor.packageId, descriptor.version);
480
- if (globalRegistration) return createSuccess(cachePreRegisteredPackage(descriptor, cacheKey, createCssLoadRef(cacheKey, getPackageGeneration(cacheKey)), globalRegistration));
482
+ if (globalRegistration && !ignorePreRegisteredPackages) return createSuccess(cachePreRegisteredPackage(descriptor, cacheKey, createCssLoadRef(cacheKey, getPackageGeneration(cacheKey)), globalRegistration));
481
483
  const generation = getPackageGeneration(cacheKey);
482
484
  const pendingLoad = {
483
485
  cacheKey,
@@ -485,7 +487,8 @@ function createWidgetRuntimeLoader(options = {}) {
485
487
  generation,
486
488
  packageId: descriptor.packageId,
487
489
  remoteEntryUrlKey: normalizeAssetUrl(descriptor.remoteEntryUrl, descriptor),
488
- version: descriptor.version
490
+ version: descriptor.version,
491
+ getCurrentGeneration: () => getPackageGeneration(cacheKey)
489
492
  };
490
493
  addPendingRemoteRegistration(pendingLoad);
491
494
  const promise = loadPackageUncached(descriptor, pendingLoad);
@@ -525,10 +528,10 @@ function createWidgetRuntimeLoader(options = {}) {
525
528
  installCssUrls(descriptor, pendingLoad.cssLoadRef);
526
529
  const scriptLoadResult = await loadRemoteEntryScript(descriptor, timeoutMs, options.cacheBust, () => {
527
530
  throwIfStalePackageLoad(pendingLoad);
528
- }, () => isFreshPackageLoad(pendingLoad), pendingLoad.remoteEntryUrlKey);
531
+ }, () => isFreshPackageLoad(pendingLoad), pendingLoad, ignorePreRegisteredPackages);
529
532
  scriptElement = scriptLoadResult.scriptElement;
530
533
  throwIfStalePackageLoad(pendingLoad);
531
- const registration = fluidWidgets.getPackageRegistration(descriptor.packageId, descriptor.version) ?? scriptLoadResult.registration;
534
+ const registration = ignorePreRegisteredPackages ? scriptLoadResult.registration : fluidWidgets.getPackageRegistration(descriptor.packageId, descriptor.version) ?? scriptLoadResult.registration;
532
535
  const cached = cachePackageRegistrationWithRemoteCleanup(descriptor, pendingLoad.cacheKey, pendingLoad.cssLoadRef, registration, scriptLoadResult, scriptElement);
533
536
  throwIfStalePackageLoad(pendingLoad);
534
537
  return createSuccess(cached);
@@ -636,7 +639,6 @@ function createWidgetRuntimeLoader(options = {}) {
636
639
  const pendingPackage = pendingPackagesByKey.get(cacheKey);
637
640
  if (pendingPackage) {
638
641
  removeCssForLoad(pendingPackage.load.cssLoadRef);
639
- removePendingRemoteRegistration(pendingPackage.load);
640
642
  pendingPackagesByKey.delete(cacheKey);
641
643
  }
642
644
  removePackage(cacheKey);
@@ -723,18 +725,20 @@ function pickRuntimeMetadataOverrides(widget) {
723
725
  ...widget.resizable !== void 0 ? { resizable: widget.resizable } : {}
724
726
  };
725
727
  }
726
- function loadRemoteEntryScript(descriptor, timeoutMs, cacheBust, assertFreshPackageLoad, isFreshPackageLoad, remoteEntryUrlKey) {
728
+ function loadRemoteEntryScript(descriptor, timeoutMs, cacheBust, assertFreshPackageLoad, isFreshPackageLoad, pendingLoad, ignorePreRegisteredPackages) {
727
729
  return enqueueRemoteEntryScriptLoad(async () => {
728
730
  assertFreshPackageLoad();
729
731
  const registration = ensureFluidWidgetsGlobal().getPackageRegistration(descriptor.packageId, descriptor.version);
730
- if (registration) return {
732
+ const observedRegistration = observedRegistrationsByPendingLoad.get(pendingLoad);
733
+ if (registration && observedRegistration?.registration === registration) return observedRegistration;
734
+ if (registration && !ignorePreRegisteredPackages) return {
731
735
  previousRegistration: void 0,
732
736
  registration
733
737
  };
734
- return await loadRemoteEntryScriptImmediately(descriptor, timeoutMs, cacheBust, isFreshPackageLoad, remoteEntryUrlKey);
738
+ return await loadRemoteEntryScriptImmediately(descriptor, timeoutMs, cacheBust, isFreshPackageLoad, pendingLoad);
735
739
  });
736
740
  }
737
- async function loadRemoteEntryScriptImmediately(descriptor, timeoutMs, cacheBust, isFreshPackageLoad, remoteEntryUrlKey) {
741
+ async function loadRemoteEntryScriptImmediately(descriptor, timeoutMs, cacheBust, isFreshPackageLoad, pendingLoad) {
738
742
  const fluidWidgets = ensureFluidWidgetsGlobal();
739
743
  let previousRegistration;
740
744
  let registration;
@@ -744,12 +748,20 @@ async function loadRemoteEntryScriptImmediately(descriptor, timeoutMs, cacheBust
744
748
  if (isFreshPackageLoad()) {
745
749
  previousRegistration = event.previousRegistration;
746
750
  registration = event.registration;
751
+ observeRegistrationForPendingLoad(pendingLoad, event);
747
752
  return;
748
753
  }
754
+ if (observeFreshPendingRegistrationForScript(event, pendingLoad)) return;
749
755
  cleanupUnexpectedFluidWidgetsRegistration(event.registration, event.previousRegistration);
750
756
  return;
751
757
  }
752
- if (hasPendingRemoteRegistrationForScript(event.registration, remoteEntryUrlKey)) return;
758
+ const pendingSharedRemoteLoads = getPendingRemoteRegistrationsForScript(event.registration, pendingLoad.remoteEntryUrlKey);
759
+ if (pendingSharedRemoteLoads.length === 0) return;
760
+ const freshSharedRemoteLoads = pendingSharedRemoteLoads.filter(isFreshPendingPackageLoad);
761
+ if (freshSharedRemoteLoads.length > 0) {
762
+ for (const freshPendingLoad of freshSharedRemoteLoads) observeRegistrationForPendingLoad(freshPendingLoad, event);
763
+ return;
764
+ }
753
765
  cleanupUnexpectedFluidWidgetsRegistration(event.registration, event.previousRegistration);
754
766
  });
755
767
  const scriptElement = document.createElement("script");
@@ -837,13 +849,28 @@ function removePendingRemoteRegistration(pendingLoad) {
837
849
  const pendingLoads = pendingRemoteRegistrationsByPackageKey.get(packageKey);
838
850
  if (!pendingLoads) return;
839
851
  pendingLoads.delete(pendingLoad);
852
+ observedRegistrationsByPendingLoad.delete(pendingLoad);
840
853
  if (pendingLoads.size === 0) pendingRemoteRegistrationsByPackageKey.delete(packageKey);
841
854
  }
842
- function hasPendingRemoteRegistrationForScript(registration, remoteEntryUrlKey) {
855
+ function getPendingRemoteRegistrationsForScript(registration, remoteEntryUrlKey) {
843
856
  const pendingLoads = pendingRemoteRegistrationsByPackageKey.get(createPackageCacheKey(registration.packageId, registration.version));
844
- if (!pendingLoads) return false;
845
- for (const pendingLoad of pendingLoads) if (pendingLoad.remoteEntryUrlKey === remoteEntryUrlKey) return true;
846
- return false;
857
+ if (!pendingLoads) return [];
858
+ return Array.from(pendingLoads).filter((pendingLoad) => pendingLoad.remoteEntryUrlKey === remoteEntryUrlKey);
859
+ }
860
+ function observeFreshPendingRegistrationForScript(event, pendingLoad) {
861
+ const freshPendingLoads = getPendingRemoteRegistrationsForScript(event.registration, pendingLoad.remoteEntryUrlKey).filter(isFreshPendingPackageLoad);
862
+ if (freshPendingLoads.length === 0) return false;
863
+ for (const freshPendingLoad of freshPendingLoads) observeRegistrationForPendingLoad(freshPendingLoad, event);
864
+ return true;
865
+ }
866
+ function observeRegistrationForPendingLoad(pendingLoad, event) {
867
+ observedRegistrationsByPendingLoad.set(pendingLoad, {
868
+ previousRegistration: event.previousRegistration,
869
+ registration: event.registration
870
+ });
871
+ }
872
+ function isFreshPendingPackageLoad(pendingLoad) {
873
+ return pendingLoad.getCurrentGeneration() === pendingLoad.generation;
847
874
  }
848
875
  function enqueueRemoteEntryScriptLoad(task) {
849
876
  const previousLoad = remoteScriptLoadQueue;
@@ -877,6 +904,7 @@ function withCacheBust(url, cacheBust) {
877
904
  //#endregion
878
905
  //#region ../../platform/widget-runtime/src/globals.ts
879
906
  const globalMarker = Symbol.for("fluid.widget-runtime.FluidSharedGlobals");
907
+ const pendingPackageFactoryErrorPrefix = "[Fluid Widget Runtime] Failed to register deferred widget package:";
880
908
  function installFluidWidgetRuntimeHostGlobals(shared = {
881
909
  React: React$1,
882
910
  ReactDOM: ReactDOM$1,
@@ -884,7 +912,10 @@ function installFluidWidgetRuntimeHostGlobals(shared = {
884
912
  }) {
885
913
  ensureFluidWidgetsGlobal();
886
914
  const existing = window.FluidShared;
887
- if (isFluidSharedGlobal(existing)) return existing;
915
+ if (isFluidSharedGlobal(existing)) {
916
+ drainPendingFluidWidgetPackages();
917
+ return existing;
918
+ }
888
919
  const widgetRuntime = {
889
920
  createWidgetRuntimeLoader,
890
921
  installFluidWidgetRuntimeHostGlobals,
@@ -899,8 +930,22 @@ function installFluidWidgetRuntimeHostGlobals(shared = {
899
930
  WidgetRuntime: widgetRuntime
900
931
  };
901
932
  window.FluidShared = fluidShared;
933
+ drainPendingFluidWidgetPackages();
902
934
  return fluidShared;
903
935
  }
936
+ function drainPendingFluidWidgetPackages() {
937
+ const queue = window.FluidWidgetPackageQueue;
938
+ if (!Array.isArray(queue)) return;
939
+ while (queue.length > 0) {
940
+ const factory = queue.shift();
941
+ if (typeof factory !== "function") continue;
942
+ try {
943
+ factory();
944
+ } catch (err) {
945
+ console.error(pendingPackageFactoryErrorPrefix, err);
946
+ }
947
+ }
948
+ }
904
949
  function isFluidSharedGlobal(value) {
905
950
  return value !== void 0 && value[globalMarker] === true;
906
951
  }
@@ -955,20 +1000,20 @@ function buildWidgetRegistry(manifests) {
955
1000
  ...customEntries
956
1001
  };
957
1002
  }
958
- function mergeRegisteredWidgetsIntoRegistry(registry, registeredWidgets) {
1003
+ function mergeRegisteredWidgetsIntoRegistry(registry, registeredWidgets, warningSink = defaultWidgetRegistryWarningSink) {
959
1004
  if (registeredWidgets.length === 0) return registry;
960
1005
  const duplicateRuntimeWidgetTypes = getDuplicateWidgetTypes(registeredWidgets);
961
1006
  const remoteEntries = Object.fromEntries(registeredWidgets.filter((widget) => {
962
1007
  if (isBuiltInWidgetType(widget.type)) {
963
- warnBuiltInWidgetCollision("runtime registration", widget.type);
1008
+ warnBuiltInWidgetCollision("runtime registration", widget.type, warningSink);
964
1009
  return false;
965
1010
  }
966
1011
  if (duplicateRuntimeWidgetTypes.has(widget.type)) {
967
- warnDuplicateRuntimeWidgetType(widget.type);
1012
+ warnDuplicateRuntimeWidgetType(widget.type, warningSink);
968
1013
  return false;
969
1014
  }
970
1015
  if (isExistingRegistryWidgetType(registry, widget.type)) {
971
- warnExistingRegistryWidgetCollision(widget.type);
1016
+ warnExistingRegistryWidgetCollision(widget.type, warningSink);
972
1017
  return false;
973
1018
  }
974
1019
  return true;
@@ -997,14 +1042,17 @@ function isBuiltInWidgetType(widgetType) {
997
1042
  function isExistingRegistryWidgetType(registry, widgetType) {
998
1043
  return Object.prototype.hasOwnProperty.call(registry, widgetType);
999
1044
  }
1000
- function warnBuiltInWidgetCollision(source, widgetType) {
1001
- console.warn(`[portal-sdk] Ignoring ${source} for built-in widget type "${widgetType}". Built-in widgets cannot be overridden.`);
1045
+ function defaultWidgetRegistryWarningSink(message) {
1046
+ console.warn(message);
1002
1047
  }
1003
- function warnDuplicateRuntimeWidgetType(widgetType) {
1004
- console.warn(`[portal-sdk] Ignoring runtime widget type "${widgetType}" because multiple packages registered the same SDK-facing type.`);
1048
+ function warnBuiltInWidgetCollision(source, widgetType, warningSink = defaultWidgetRegistryWarningSink) {
1049
+ warningSink(`[portal-sdk] Ignoring ${source} for built-in widget type "${widgetType}". Built-in widgets cannot be overridden.`);
1005
1050
  }
1006
- function warnExistingRegistryWidgetCollision(widgetType) {
1007
- console.warn(`[portal-sdk] Ignoring runtime widget type "${widgetType}" because the SDK registry already contains that type.`);
1051
+ function warnDuplicateRuntimeWidgetType(widgetType, warningSink = defaultWidgetRegistryWarningSink) {
1052
+ warningSink(`[portal-sdk] Ignoring runtime widget type "${widgetType}" because multiple packages registered the same SDK-facing type.`);
1053
+ }
1054
+ function warnExistingRegistryWidgetCollision(widgetType, warningSink = defaultWidgetRegistryWarningSink) {
1055
+ warningSink(`[portal-sdk] Ignoring runtime widget type "${widgetType}" because the SDK registry already contains that type.`);
1008
1056
  }
1009
1057
  //#endregion
1010
1058
  //#region src/utils/widget-package-manifest-url.ts
@@ -1045,24 +1093,29 @@ const WIDGET_PACKAGE_DESCRIPTOR_MANIFEST_VERSION = 1;
1045
1093
  const WIDGET_PACKAGE_DESCRIPTOR_FETCH_TIMEOUT_MS = 5e3;
1046
1094
  function installAndReadFluidWidgetsRegistry() {
1047
1095
  if (typeof window === "undefined") return [];
1048
- installFluidWidgetRuntimeHostGlobals({
1049
- React: React$1,
1050
- ReactDOM: ReactDOM$1,
1051
- ReactJsxRuntime
1052
- });
1053
- return ensureFluidWidgetsGlobal().getRegisteredWidgets();
1096
+ return installAndReadFluidWidgetsGlobal().getRegisteredWidgets();
1054
1097
  }
1055
1098
  function subscribeToFluidWidgetsRegistry(listener) {
1056
- if (typeof window === "undefined") return () => void 0;
1099
+ if (typeof window === "undefined") return {
1100
+ registeredWidgets: [],
1101
+ unsubscribe: () => void 0
1102
+ };
1103
+ const fluidWidgets = installAndReadFluidWidgetsGlobal();
1104
+ const unsubscribe = fluidWidgets.subscribe((event) => {
1105
+ listener(fluidWidgets.getRegisteredWidgets(), event);
1106
+ });
1107
+ return {
1108
+ registeredWidgets: fluidWidgets.getRegisteredWidgets(),
1109
+ unsubscribe
1110
+ };
1111
+ }
1112
+ function installAndReadFluidWidgetsGlobal() {
1057
1113
  installFluidWidgetRuntimeHostGlobals({
1058
1114
  React: React$1,
1059
1115
  ReactDOM: ReactDOM$1,
1060
1116
  ReactJsxRuntime
1061
1117
  });
1062
- const fluidWidgets = ensureFluidWidgetsGlobal();
1063
- return fluidWidgets.subscribe(() => {
1064
- listener(fluidWidgets.getRegisteredWidgets());
1065
- });
1118
+ return ensureFluidWidgetsGlobal();
1066
1119
  }
1067
1120
  async function fetchWidgetPackageDescriptors(descriptorEndpointUrl = DEFAULT_WIDGET_PACKAGE_MANIFEST_URL, options = {}) {
1068
1121
  const abortSignal = createTimeoutAbortSignal(WIDGET_PACKAGE_DESCRIPTOR_FETCH_TIMEOUT_MS);
@@ -1090,13 +1143,14 @@ function parseWidgetPackageDescriptorResponse(data, descriptorEndpointUrl = DEFA
1090
1143
  }
1091
1144
  return descriptors;
1092
1145
  }
1093
- async function loadWidgetPackages(widgetPackages) {
1146
+ async function loadWidgetPackages(widgetPackages, options = {}) {
1094
1147
  if (widgetPackages.length === 0) return {
1095
1148
  registeredWidgets: [],
1096
1149
  hasFailures: false
1097
1150
  };
1098
- installAndReadFluidWidgetsRegistry();
1099
- const loader = createWidgetRuntimeLoader();
1151
+ if (options.ignoreExistingGlobalRegistrations) installAndReadFluidWidgetsGlobal();
1152
+ else installAndReadFluidWidgetsRegistry();
1153
+ const loader = createWidgetRuntimeLoader({ ignorePreRegisteredPackages: options.ignoreExistingGlobalRegistrations === true });
1100
1154
  const runtimeWidgetPackages = widgetPackages;
1101
1155
  const results = await loader.loadPackages(runtimeWidgetPackages);
1102
1156
  let hasFailures = false;
@@ -1483,4 +1537,4 @@ function dedupeWidgetPackagesByPackageIdAndVersion(widgetPackages) {
1483
1537
  //#endregion
1484
1538
  export { loadWidgetPackages as a, getDefaultWidgetPackageManifestUrl as c, createDefaultFluidConfig as d, installAndReadFluidWidgetsRegistry as i, buildWidgetRegistry as l, resolveHostedWidgetPackageManifestUrl as n, subscribeToFluidWidgetsRegistry as o, fetchWidgetPackageDescriptors as r, DEFAULT_WIDGET_PACKAGE_MANIFEST_URL as s, dedupeWidgetPackagesByPackageIdAndVersion as t, mergeRegisteredWidgetsIntoRegistry as u };
1485
1539
 
1486
- //# sourceMappingURL=widget-package-utils-DG2ibxqS.mjs.map
1540
+ //# sourceMappingURL=widget-package-utils-DnNxWKOo.mjs.map