@fluid-app/portal-sdk 0.1.388 → 0.1.390
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{FluidProvider-CThrU69_.mjs → FluidProvider-BfcG29PT.mjs} +9 -4
- package/dist/FluidProvider-BfcG29PT.mjs.map +1 -0
- package/dist/{FluidProvider-Bv-611UX.cjs → FluidProvider-CvyRvMMa.cjs} +9 -4
- package/dist/FluidProvider-CvyRvMMa.cjs.map +1 -0
- package/dist/{MessagingScreen-TaNsI8dA.mjs → MessagingScreen-5KqM0KBC.mjs} +2 -2
- package/dist/{MessagingScreen-RcSfAzF3.cjs → MessagingScreen-CNFeVh1u.cjs} +2 -2
- package/dist/{MessagingScreen-RcSfAzF3.cjs.map → MessagingScreen-CNFeVh1u.cjs.map} +1 -1
- package/dist/{MessagingScreen-JRadkjXu.cjs → MessagingScreen-CkIY-Gkf.cjs} +2 -2
- package/dist/{MessagingScreen-D1YHkBo9.mjs → MessagingScreen-qXNcsl4-.mjs} +2 -2
- package/dist/{MessagingScreen-D1YHkBo9.mjs.map → MessagingScreen-qXNcsl4-.mjs.map} +1 -1
- package/dist/{OrdersScreen-DvNRH6EK.mjs → OrdersScreen-BGLW79kk.mjs} +2 -2
- package/dist/{OrdersScreen-DDZw9Irw.cjs → OrdersScreen-BPqOolGL.cjs} +77 -2
- package/dist/OrdersScreen-BPqOolGL.cjs.map +1 -0
- package/dist/{OrdersScreen-8gzLDwSH.cjs → OrdersScreen-CNyjYP5D.cjs} +2 -2
- package/dist/{OrdersScreen-DaZiEfa5.mjs → OrdersScreen-CzvcmBtF.mjs} +77 -2
- package/dist/OrdersScreen-CzvcmBtF.mjs.map +1 -0
- package/dist/{ProfileScreen-DCLG83Nj.mjs → ProfileScreen-BXytHMQ9.mjs} +3 -3
- package/dist/{ProfileScreen-BoMEdiOM.cjs → ProfileScreen-DCAvMSez.cjs} +3 -3
- package/dist/{ProfileScreen-BjnMAGlF.cjs → ProfileScreen-DaiPMlWG.cjs} +3 -3
- package/dist/{ProfileScreen-BjnMAGlF.cjs.map → ProfileScreen-DaiPMlWG.cjs.map} +1 -1
- package/dist/{ProfileScreen-rGG2uL5S.mjs → ProfileScreen-QHqdkZr0.mjs} +3 -3
- package/dist/{ProfileScreen-rGG2uL5S.mjs.map → ProfileScreen-QHqdkZr0.mjs.map} +1 -1
- package/dist/{ShopScreen-DkabG0ri.mjs → ShopScreen-BY-fGCuv.mjs} +2 -2
- package/dist/{ShopScreen-DkabG0ri.mjs.map → ShopScreen-BY-fGCuv.mjs.map} +1 -1
- package/dist/{ShopScreen-RypYnbBz.mjs → ShopScreen-CQm2LayD.mjs} +2 -2
- package/dist/{ShopScreen-BJTnBgqC.cjs → ShopScreen-DPrt71ZR.cjs} +2 -2
- package/dist/{ShopScreen-BJTnBgqC.cjs.map → ShopScreen-DPrt71ZR.cjs.map} +1 -1
- package/dist/{ShopScreen-BVe21Z5Y.cjs → ShopScreen-Dli69S1r.cjs} +2 -2
- package/dist/{SubscriptionsScreen-mQSP3T9t.cjs → SubscriptionsScreen-CMrn02Xn.cjs} +3 -3
- package/dist/{SubscriptionsScreen-mQSP3T9t.cjs.map → SubscriptionsScreen-CMrn02Xn.cjs.map} +1 -1
- package/dist/{SubscriptionsScreen-cdpbCLy_.mjs → SubscriptionsScreen-DlZrgMFX.mjs} +3 -3
- package/dist/{SubscriptionsScreen-DbNBjZWM.mjs → SubscriptionsScreen-DoG57hMn.mjs} +3 -3
- package/dist/{SubscriptionsScreen-DbNBjZWM.mjs.map → SubscriptionsScreen-DoG57hMn.mjs.map} +1 -1
- package/dist/{SubscriptionsScreen-CGZZGAOa.cjs → SubscriptionsScreen-tnC24Iv4.cjs} +3 -3
- package/dist/adapters/orders-api-adapter.d.ts.map +1 -1
- package/dist/index.cjs +18 -18
- package/dist/index.mjs +18 -18
- package/dist/preview/preview-entry.cjs +2 -2
- package/dist/preview/preview-entry.mjs +2 -2
- package/dist/{use-portal-card-add-3ds-flow-DrWgD6uf.cjs → use-portal-card-add-3ds-flow-B05lhrGA.cjs} +2 -2
- package/dist/{use-portal-card-add-3ds-flow-DrWgD6uf.cjs.map → use-portal-card-add-3ds-flow-B05lhrGA.cjs.map} +1 -1
- package/dist/{use-portal-card-add-3ds-flow-CZrxDpTV.mjs → use-portal-card-add-3ds-flow-BfbkPCl2.mjs} +2 -2
- package/dist/{use-portal-card-add-3ds-flow-CZrxDpTV.mjs.map → use-portal-card-add-3ds-flow-BfbkPCl2.mjs.map} +1 -1
- package/dist/{widget-package-utils-CqEcjLCK.cjs → widget-package-utils-CJcLEvqE.cjs} +2 -2
- package/dist/{widget-package-utils-CqEcjLCK.cjs.map → widget-package-utils-CJcLEvqE.cjs.map} +1 -1
- package/dist/{widget-package-utils-C42fwyj3.mjs → widget-package-utils-DdZ28aa2.mjs} +2 -2
- package/dist/{widget-package-utils-C42fwyj3.mjs.map → widget-package-utils-DdZ28aa2.mjs.map} +1 -1
- package/package.json +12 -12
- package/dist/FluidProvider-Bv-611UX.cjs.map +0 -1
- package/dist/FluidProvider-CThrU69_.mjs.map +0 -1
- package/dist/OrdersScreen-DDZw9Irw.cjs.map +0 -1
- package/dist/OrdersScreen-DaZiEfa5.mjs.map +0 -1
package/dist/{widget-package-utils-CqEcjLCK.cjs.map → widget-package-utils-CJcLEvqE.cjs.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"widget-package-utils-CqEcjLCK.cjs","names":["toRawManifest","createPersister","useAppDefinitionApi","useCompanyScopedQueryKey","transformManifestToRepAppData","deleteDatabase","globalMarker","widgetPackageTypes","widgetContainers","widgetResizableValues","isRecord","hasAmbiguousHttpScheme","React","ReactDOM","ReactJsxRuntime","Component","DEFAULT_SDK_WIDGET_REGISTRY","useAppDefinitionApi","useCompanyScopedQueryKey","transformManifestToRepAppData","usePortalTenantClient","deleteDatabase"],"sources":["../src/hooks/use-fluid-app.ts","../src/hooks/use-logout.ts","../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/types.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/hooks/use-fluid-profile.ts","../src/hooks/use-company-switch.ts","../src/widgets/runtime-sdk.ts","../src/utils/widget-package-manifest-url.ts","../src/utils/load-widget-packages.ts","../src/utils/widget-package-utils.ts"],"sourcesContent":["import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { createPersister } from \"@fluid-app/query-persister\";\nimport { useAppDefinitionApi } from \"@fluid-app/portal-core/app-definition-api-context\";\nimport type { AppDefinitionApi } from \"@fluid-app/portal-core/app-definition-api\";\nimport { useCompanyScopedQueryKey } from \"./query-keys\";\nimport { transformManifestToRepAppData, toRawManifest } from \"../transforms\";\nimport type { RawManifestResponse } from \"../transforms\";\nimport type { RepAppData } from \"@fluid-app/portal-core/types\";\n\n/**\n * Base query key for full app data (rendered manifest endpoint).\n * Kept for backwards compatibility — the runtime key used by the hook\n * includes a company prefix via {@link useCompanyScopedQueryKey}.\n */\nexport const APP_DATA_QUERY_KEY = [\"fluid\", \"app\"] as const;\n\n/**\n * Fetch the raw rendered manifest via the portal-tenant BFF adapter.\n * Shared by `useFluidApp` and `useFluidProfile` to avoid drift.\n */\nexport async function fetchRawManifest(\n api: AppDefinitionApi,\n): Promise<RawManifestResponse> {\n const response = await api.fetchManifest();\n return toRawManifest(response);\n}\n\n/**\n * Module-level persister instance (browser only).\n * Created once when the module loads so all calls to useFluidApp share\n * the same IndexedDB connection. Applied at the query level so it works\n * regardless of which QueryClient the app provides.\n */\nconst appDataPersister =\n typeof window !== \"undefined\" && !import.meta.env?.DEV\n ? createPersister()\n : undefined;\n\n/**\n * Hook to fetch the full portal app data from the rendered-manifest endpoint.\n *\n * Returns a `RepAppData` object containing:\n * - `screens` — all screen definitions with normalized component trees\n * - `profile.themes` — fully-transformed ThemeDefinition[] (handles legacy + new formats)\n * - `profile.activeThemeId` — the currently active theme ID\n * - `profile.navigation.navigation_items` — sorted, recursive navigation tree\n *\n * Uses IndexedDB persistence so subsequent page loads hydrate instantly\n * from cache while revalidating in the background. The raw API response\n * (plain JSON) is cached; Color objects are recreated from cache via\n * `select` on every restore — this is fast (CPU only, no network).\n *\n * @example\n * ```tsx\n * function App() {\n * const { data: appData, isLoading } = useFluidApp();\n *\n * if (isLoading) return <Spinner />;\n *\n * return (\n * <AppShell\n * appData={appData}\n * navigation={appData.profile.navigation.navigation_items}\n * />\n * );\n * }\n * ```\n */\nexport function useFluidApp(options?: {\n enabled?: boolean;\n}): UseQueryResult<RepAppData> {\n const appDefinitionApi = useAppDefinitionApi();\n const { scopeKey } = useCompanyScopedQueryKey();\n\n return useQuery<\n RawManifestResponse,\n Error,\n RepAppData,\n readonly (string | number)[]\n >({\n queryKey: scopeKey(APP_DATA_QUERY_KEY),\n queryFn: () => fetchRawManifest(appDefinitionApi),\n select: transformManifestToRepAppData,\n ...(appDataPersister && { persister: appDataPersister.persisterFn }),\n ...(options?.enabled !== undefined && { enabled: options.enabled }),\n });\n}\n","/**\n * useLogout Hook\n *\n * Provides a complete logout function that:\n * 1. Clears all client-side state (query cache, IndexedDB, sessionStorage)\n * 2. Navigates to GET /logout — Rails clears the session and redirects to the Hub\n */\n\nimport { useCallback } from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { deleteDatabase } from \"@fluid-app/query-persister\";\n\nexport interface UseLogoutOptions {\n /** URL to redirect to after logout. Triggers a full page navigation. */\n redirectUrl?: string;\n /** Callback invoked after all state is cleared. Ignored when `redirectUrl` is set. */\n onLogout?: () => void;\n}\n\n/**\n * Hook that returns a `logout` function which clears the server session\n * via `DELETE /logout` and all cached/persisted client state.\n *\n * @example\n * ```tsx\n * const logout = useLogout({ redirectUrl: \"/login\" });\n * <button onClick={logout}>Log out</button>\n * ```\n *\n * @example\n * ```tsx\n * const logout = useLogout({\n * onLogout: () => navigate(\"/signed-out\"),\n * });\n * ```\n */\nexport function useLogout({\n redirectUrl,\n onLogout,\n}: UseLogoutOptions = {}): () => Promise<void> {\n const queryClient = useQueryClient();\n\n const logout = useCallback(async () => {\n // 1. Cancel in-flight requests to prevent cache repopulation\n await queryClient.cancelQueries();\n\n // 2. Clear in-memory TanStack Query cache\n queryClient.clear();\n\n // 3. Clear IndexedDB persisted query cache\n try {\n await deleteDatabase();\n } catch (error) {\n // Non-fatal — continue with logout even if IndexedDB cleanup fails\n console.error(\"[useLogout] Failed to clear IndexedDB cache:\", error);\n }\n\n // 4. Clear sessionStorage — intentionally clears all keys because the\n // portal app owns the full page (not embedded as a micro-frontend).\n try {\n sessionStorage.clear();\n } catch {\n // sessionStorage may be unavailable in some contexts\n }\n\n // 5. Navigate to the server logout endpoint. Rails clears the session\n // cookie and redirects to the Portal Hub company list. A full page\n // navigation lets the browser follow the redirect naturally — no\n // fetch or JSON parsing needed.\n if (redirectUrl) {\n window.location.href = redirectUrl;\n } else if (onLogout) {\n onLogout();\n } else {\n window.location.href = \"/logout\";\n }\n }, [queryClient, redirectUrl, onLogout]);\n\n return logout;\n}\n","/**\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 * as React from \"react\";\nimport type * as ReactDOM from \"react-dom\";\nimport type * as ReactJsxRuntime from \"react/jsx-runtime\";\n\nimport type { WidgetRuntimeError } from \"./errors\";\n\nexport const WIDGET_PACKAGE_MANIFEST_VERSION = 1;\n\nexport type WidgetPackageType =\n | \"fluid\"\n | \"company\"\n | \"droplet\"\n | \"partner\"\n | \"internal\";\n\nexport type WidgetRuntimeContainer = \"inline\" | \"block\" | \"card\" | \"fullscreen\";\n\nexport type WidgetRuntimeResizable =\n | boolean\n | \"horizontal\"\n | \"vertical\"\n | \"both\";\n\nexport type WidgetPropertySchema = {\n readonly widgetType?: string;\n readonly [key: string]: unknown;\n};\n\nexport type WidgetDefaultProps = Readonly<Record<string, unknown>>;\n\nexport interface WidgetDescriptor {\n readonly type: string;\n readonly name: string;\n readonly displayName: string;\n readonly description: string;\n readonly icon: string;\n readonly category: string;\n readonly propertySchema: WidgetPropertySchema;\n readonly defaultProps: WidgetDefaultProps;\n readonly container: WidgetRuntimeContainer;\n readonly minSdkVersion: string;\n readonly resizable: WidgetRuntimeResizable;\n}\n\nexport interface WidgetPackageDescriptor {\n readonly manifestVersion: typeof WIDGET_PACKAGE_MANIFEST_VERSION;\n readonly packageId: string;\n readonly packageType: WidgetPackageType;\n readonly version: string;\n readonly remoteEntryUrl: string;\n readonly cssUrls: readonly string[];\n readonly widgets: readonly WidgetDescriptor[];\n}\n\nexport type WidgetRuntimeComponent<Props = Readonly<Record<string, unknown>>> =\n React.ComponentType<Props>;\n\nexport interface RuntimeWidgetRegistration\n extends\n Omit<\n WidgetDescriptor,\n | \"name\"\n | \"displayName\"\n | \"description\"\n | \"icon\"\n | \"category\"\n | \"container\"\n | \"minSdkVersion\"\n | \"resizable\"\n >,\n Partial<\n Pick<\n WidgetDescriptor,\n | \"name\"\n | \"displayName\"\n | \"description\"\n | \"icon\"\n | \"category\"\n | \"container\"\n | \"minSdkVersion\"\n | \"resizable\"\n >\n > {\n readonly component: WidgetRuntimeComponent;\n}\n\nexport interface WidgetPackageRegistration {\n readonly packageId: string;\n readonly version: string;\n readonly widgets: readonly RuntimeWidgetRegistration[];\n}\n\nexport interface RegisteredWidget extends WidgetDescriptor {\n readonly packageId: string;\n readonly packageType: WidgetPackageType;\n readonly version: string;\n readonly component: WidgetRuntimeComponent;\n}\n\n/**\n * Key for a widget registry entry.\n *\n * Create keys with `createWidgetRegistryKey(packageId, version, type)`.\n */\nexport type WidgetRuntimeRegistryKey = string;\n\nexport type WidgetRuntimeRegistry = ReadonlyMap<\n WidgetRuntimeRegistryKey,\n RegisteredWidget\n>;\n\nexport interface GlobalRegisteredWidget extends RuntimeWidgetRegistration {\n readonly packageId: string;\n readonly version: string;\n}\n\nexport type FluidWidgetsGlobalRegistry = ReadonlyMap<\n WidgetRuntimeRegistryKey,\n GlobalRegisteredWidget\n>;\n\nexport type FluidWidgetsGlobalRegistryEvent =\n | {\n readonly kind: \"register\";\n readonly registration: WidgetPackageRegistration;\n readonly previousRegistration?: WidgetPackageRegistration;\n }\n | {\n readonly kind: \"clear\";\n readonly packageId?: string;\n readonly version?: string;\n };\n\nexport type FluidWidgetsGlobalUnsubscribe = () => void;\n\nexport interface LoadWidgetPackageSuccess {\n readonly ok: true;\n readonly packageId: string;\n readonly version: string;\n readonly widgets: readonly RegisteredWidget[];\n}\n\nexport interface LoadWidgetPackageFailure {\n readonly ok: false;\n readonly packageId: string;\n readonly version: string;\n readonly error: WidgetRuntimeError;\n}\n\nexport type LoadWidgetPackageResult =\n | LoadWidgetPackageSuccess\n | LoadWidgetPackageFailure;\n\n/**\n * Per-loader behavior options.\n *\n * Remote script insertion is still coordinated by a module-level,\n * page-wide queue shared by every loader instance created from the same loaded\n * runtime module. That coupling intentionally serializes classic script loads\n * so package registrations can be attributed safely through `window.FluidWidgets`.\n */\nexport interface WidgetRuntimeLoaderOptions {\n readonly cacheBust?: boolean | string | (() => string);\n /**\n * Ignore package registrations that already exist on `window.FluidWidgets`\n * before a descriptor's remote entry script is appended. Runtime packages\n * loaded by that script can still satisfy the descriptor by registering while\n * the script is loading.\n */\n readonly ignorePreRegisteredPackages?: boolean;\n readonly timeoutMs?: number;\n readonly throwOnError?: boolean;\n}\n\nexport interface WidgetRuntimeLoader {\n loadPackage(\n descriptor: WidgetPackageDescriptor,\n ): Promise<LoadWidgetPackageResult>;\n loadPackages(\n descriptors: readonly WidgetPackageDescriptor[],\n ): Promise<readonly LoadWidgetPackageResult[]>;\n getRegisteredWidgets(): readonly RegisteredWidget[];\n getRegistry(): WidgetRuntimeRegistry;\n /**\n * Invalidates this loader's matching package cache and also removes matching\n * registrations from the shared `window.FluidWidgets` global registry.\n */\n invalidatePackage(packageId: string, version?: string): void;\n /**\n * Clears this loader's package cache and also clears the shared\n * `window.FluidWidgets` global registry for the page.\n */\n clear(): void;\n}\n\nexport const FLUID_WIDGET_PACKAGE_REQUIRES_PORTAL_SDK_FLAG =\n \"__fluidRequiresPortalSdk\";\n\nexport type FluidWidgetPackageFactory = {\n (): void;\n readonly [FLUID_WIDGET_PACKAGE_REQUIRES_PORTAL_SDK_FLAG]?: true;\n};\n\nexport type FluidWidgetPackageQueue = FluidWidgetPackageFactory[];\n\nexport interface FluidWidgetsGlobal {\n registerPackage(registration: WidgetPackageRegistration): void;\n getPackageRegistration(\n packageId: string,\n version: string,\n ): WidgetPackageRegistration | undefined;\n getRegisteredWidgets(): readonly GlobalRegisteredWidget[];\n getRegistry(): FluidWidgetsGlobalRegistry;\n /**\n * Mutates the shared `window.FluidWidgets` registry for the page. Without a\n * package id it clears every global registration; with a package id it clears\n * all matching versions, or the single matching version when provided.\n */\n clear(packageId?: string, version?: string): void;\n subscribe(\n listener: (event: FluidWidgetsGlobalRegistryEvent) => void,\n ): FluidWidgetsGlobalUnsubscribe;\n}\n\nexport type FluidSharedPortalSdkFunction = (...args: never[]) => unknown;\n\nexport interface FluidSharedPortalSdk {\n readonly defineWidget: FluidSharedPortalSdkFunction;\n readonly defineWidgetPackage: FluidSharedPortalSdkFunction;\n readonly useAccount: FluidSharedPortalSdkFunction;\n readonly useStore: FluidSharedPortalSdkFunction;\n readonly useAppNavigation: FluidSharedPortalSdkFunction;\n readonly usePortalTenantClient: FluidSharedPortalSdkFunction;\n readonly useFluidApp: FluidSharedPortalSdkFunction;\n readonly useFluidProfile: FluidSharedPortalSdkFunction;\n}\n\nexport interface FluidSharedGlobals {\n readonly React: typeof React;\n readonly ReactDOM: typeof ReactDOM;\n readonly ReactJsxRuntime: typeof ReactJsxRuntime;\n readonly WidgetRuntime: WidgetRuntimeHostApi;\n readonly PortalSdk?: FluidSharedPortalSdk;\n}\n\nexport interface InstallFluidWidgetRuntimeHostGlobalsOptions {\n readonly React?: typeof React;\n readonly ReactDOM?: typeof ReactDOM;\n readonly ReactJsxRuntime?: typeof ReactJsxRuntime;\n readonly WidgetRuntime?: Partial<WidgetRuntimeHostApi>;\n readonly PortalSdk?: FluidSharedPortalSdk;\n}\n\nexport interface WidgetRuntimeHostApi {\n readonly createWidgetRuntimeLoader: (\n options?: WidgetRuntimeLoaderOptions,\n ) => WidgetRuntimeLoader;\n readonly installFluidWidgetRuntimeHostGlobals: (\n shared?: InstallFluidWidgetRuntimeHostGlobalsOptions,\n ) => FluidSharedGlobals;\n readonly manifestVersion: typeof WIDGET_PACKAGE_MANIFEST_VERSION;\n}\n\ndeclare global {\n interface Window {\n FluidWidgets?: FluidWidgetsGlobal;\n FluidShared?: FluidSharedGlobals;\n FluidWidgetPackageQueue?: FluidWidgetPackageQueue;\n }\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 FLUID_WIDGET_PACKAGE_REQUIRES_PORTAL_SDK_FLAG,\n WIDGET_PACKAGE_MANIFEST_VERSION,\n type FluidSharedGlobals,\n type FluidSharedPortalSdk,\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 = Omit<FluidSharedGlobals, \"PortalSdk\"> & {\n readonly [globalMarker]: true;\n PortalSdk?: FluidSharedPortalSdk;\n};\n\nexport function installFluidWidgetRuntimeHostGlobals(\n shared: InstallFluidWidgetRuntimeHostGlobalsOptions = {},\n): FluidSharedGlobals {\n ensureFluidWidgetsGlobal();\n\n const existing = window.FluidShared;\n if (isFluidSharedGlobal(existing)) {\n if (existing.PortalSdk === undefined && shared.PortalSdk !== undefined) {\n existing.PortalSdk = shared.PortalSdk;\n }\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 ?? React,\n ReactDOM: shared.ReactDOM ?? ReactDOM,\n ReactJsxRuntime: shared.ReactJsxRuntime ?? ReactJsxRuntime,\n WidgetRuntime: widgetRuntime,\n ...(shared.PortalSdk === undefined ? {} : { PortalSdk: shared.PortalSdk }),\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) || window.FluidShared === undefined) return;\n\n const hasPortalSdk = window.FluidShared.PortalSdk !== undefined;\n const deferredFactories: FluidWidgetPackageFactory[] = [];\n\n while (queue.length > 0) {\n const factory = queue.shift();\n if (typeof factory !== \"function\") continue;\n\n if (\n factory[FLUID_WIDGET_PACKAGE_REQUIRES_PORTAL_SDK_FLAG] === true &&\n !hasPortalSdk\n ) {\n deferredFactories.push(factory);\n continue;\n }\n\n try {\n factory();\n } catch (err) {\n console.error(pendingPackageFactoryErrorPrefix, err);\n }\n }\n\n queue.push(...deferredFactories);\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","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { useAppDefinitionApi } from \"@fluid-app/portal-core/app-definition-api-context\";\nimport { useCompanyScopedQueryKey } from \"./query-keys\";\nimport { transformManifestToRepAppData } from \"../transforms\";\nimport type { RawManifestResponse } from \"../transforms\";\nimport type { Profile } from \"../types/profile\";\nimport { APP_DATA_QUERY_KEY, fetchRawManifest } from \"./use-fluid-app\";\n\n/**\n * Base query key for profile data.\n * Kept for backwards compatibility — the runtime key used by the hook\n * includes a company prefix via {@link useCompanyScopedQueryKey}.\n *\n * @deprecated Use {@link APP_DATA_QUERY_KEY} with `useFluidApp` instead.\n */\nexport const PROFILE_QUERY_KEY = [\"fluid\", \"profile\"] as const;\n\n/**\n * Hook to fetch the portal profile (themes, navigation, screens).\n *\n * Internally fetches from the fluidos API (same data source as\n * {@link useFluidApp}) and selects the `profile` slice, so no\n * legacy `/api/rep_app/manifest` call is made.\n *\n * @deprecated Use `useFluidApp()` instead — it returns the full\n * `RepAppData` including `profile`, `screens`, and more.\n *\n * @example\n * ```tsx\n * function Navigation() {\n * const { data: profile, isLoading } = useFluidProfile();\n *\n * if (isLoading) return <Spinner />;\n *\n * return (\n * <nav>\n * {profile?.navigation.navigation_items.map(item => (\n * <NavItem key={item.id} item={item} />\n * ))}\n * </nav>\n * );\n * }\n * ```\n */\nexport function useFluidProfile(): UseQueryResult<Profile> {\n const appDefinitionApi = useAppDefinitionApi();\n const { scopeKey } = useCompanyScopedQueryKey();\n\n return useQuery<\n RawManifestResponse,\n Error,\n Profile,\n readonly (string | number)[]\n >({\n queryKey: scopeKey(APP_DATA_QUERY_KEY),\n queryFn: () => fetchRawManifest(appDefinitionApi),\n select: (raw) => {\n const appData = transformManifestToRepAppData(raw);\n return appData.profile;\n },\n });\n}\n","import { useCallback, useRef } from \"react\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { deleteDatabase } from \"@fluid-app/query-persister\";\nimport { usePortalTenantClient } from \"../providers/PortalTenantClientProvider\";\n\nexport interface UseCompanySwitchOptions {\n // Preserved for API compatibility; no longer used internally.\n}\n\n/**\n * Hook that handles company switching for the portal.\n *\n * Calls PUT /api/authentication/company/{id}/switch, clears the TanStack\n * Query cache and IndexedDB persisted cache, then reloads the page so all\n * queries re-fetch with the new company context.\n *\n * The server updates the session cookie automatically via the switch\n * endpoint response; no client-side token storage is needed.\n */\nexport function useCompanySwitch(_options?: UseCompanySwitchOptions): {\n switchCompany: (companyId: number) => void;\n isPending: boolean;\n isError: boolean;\n error: Error | null;\n} {\n const client = usePortalTenantClient();\n const queryClient = useQueryClient();\n const switchingRef = useRef(false);\n\n const { mutate, isPending, isError, error } = useMutation({\n mutationFn: (companyId: number) =>\n client.put(`/api/authentication/company/${companyId}/switch`),\n onSuccess: async () => {\n // Clear in-memory cache and IndexedDB to prevent stale data\n // rehydration after reload.\n queryClient.clear();\n try {\n await deleteDatabase(\"company-switch\");\n } catch {\n // Non-fatal: company-scoped query keys prevent cross-company reads\n // even if the IDB delete fails.\n }\n // Session cookie is updated server-side by the switch endpoint.\n // Reload to re-fetch all queries with the new company context.\n window.location.reload();\n },\n onError: () => {\n switchingRef.current = false;\n },\n });\n\n const switchCompany = useCallback(\n (companyId: number) => {\n if (switchingRef.current) return;\n switchingRef.current = true;\n mutate(companyId);\n },\n [mutate],\n );\n\n return {\n switchCompany: switchCompany,\n isPending: isPending,\n isError: isError,\n error: error,\n };\n}\n","export { useAppDefinitionApi } from \"@fluid-app/portal-core/app-definition-api-context\";\n\nexport { usePortalTenantClient } from \"../providers/PortalTenantClientProvider\";\nexport { APP_DATA_QUERY_KEY, useFluidApp } from \"../hooks/use-fluid-app\";\nexport {\n APP_DEFINITION_QUERY_KEY,\n useAppDefinition,\n} from \"../hooks/use-app-definition\";\nexport { PROFILE_QUERY_KEY, useFluidProfile } from \"../hooks/use-fluid-profile\";\nexport {\n useFluidTheme,\n type UseFluidThemeResult,\n} from \"../hooks/use-fluid-theme\";\nexport {\n createCompanyQueryKey,\n useCompanyScopedQueryKey,\n} from \"../hooks/query-keys\";\nexport { useAccount } from \"../hooks/use-account\";\nexport {\n useCompanySwitch,\n type UseCompanySwitchOptions,\n} from \"../hooks/use-company-switch\";\nexport { useLogout, type UseLogoutOptions } from \"../hooks/use-logout\";\nexport { useStore } from \"../hooks/use-store\";\nexport {\n getProperty,\n hasData,\n isErrorResult,\n isIdle,\n isLoading,\n selectProperty,\n type ListQueryResult,\n type QueryResult,\n type QueryResultNullable,\n type UseListResourceHook,\n type UseSingleResourceHook,\n type ValueListQueryResult,\n type WithData,\n} from \"../hooks/hook-types\";\nexport {\n AppNavigationProvider,\n useAppNavigation,\n type AppNavigationContextValue,\n type AppNavigationProviderProps,\n} from \"../shell/AppNavigationContext\";\nexport {\n applyPropertyValues,\n extractPropertyValues,\n groupPropertyFields,\n isPropertyFieldType,\n PROPERTY_FIELD_TYPES,\n type PropertyFieldSchema,\n type PropertyFieldType,\n type TabConfig,\n} from \"../registries/property-schema-types\";\nexport {\n buildThemeDefinition,\n getActiveThemeId,\n normalizeComponentTree,\n toNavigationItem,\n toRawManifest,\n toScreenDefinition,\n transformManifestToRepAppData,\n transformThemes,\n type RawApiNavigationItem,\n type RawApiScreen,\n type RawApiTheme,\n type RawManifestResponse,\n} from \"../transforms\";\nexport {\n defineWidget,\n defineWidgetPackage,\n isSourceWidgetPackage,\n sourceWidgetPackagesToManifests,\n type DefineWidgetOptions,\n type DefineWidgetPackageOptions,\n type SourceWidget,\n type SourceWidgetPackage,\n} from \"./authoring\";\n\nexport type { AccountRep } from \"@fluid-app/portal-core/account-types\";\nexport type { AppDefinitionApi } from \"@fluid-app/portal-core/app-definition-api\";\nexport type {\n AppDefinitionResponse,\n AppFluidOsDefinition,\n AppManifest,\n AppManifestProfile,\n AppManifestResponse,\n} from \"@fluid-app/portal-core/app-definition-types\";\nexport type { WidgetManifest } from \"@fluid-app/portal-core/registries\";\nexport type { Store } from \"@fluid-app/portal-core/store-types\";\nexport type {\n RepAppData,\n RepAppManifest,\n RepAppProfile,\n} from \"@fluid-app/portal-core/types\";\nexport type { UserType } from \"@fluid-app/auth\";\nexport type { UseQueryResult } from \"@tanstack/react-query\";\nexport type { FetchClient as PortalTenantFetchClient } from \"@fluid-app/portal-tenant-api-client\";\nexport type { FluidSDKConfig } from \"../types/config\";\nexport type {\n AlignOptions,\n BackgroundType,\n BackgroundValue,\n BorderRadiusOptions,\n ButtonSizeOptions,\n ColorOptions,\n FontSizeOptions,\n GapOptions,\n PaddingOptions,\n SectionLayoutType,\n} from \"../types/field-types\";\nexport type {\n Navigation,\n NavigationItem,\n ScreenDefinition,\n} from \"../types/navigation\";\nexport type { Profile } from \"../types/profile\";\nexport type {\n ResolvedTheme,\n ThemeColorInput,\n ThemeDefinition,\n ThemePayload,\n} from \"../types/theme\";\nexport type {\n WidgetDefaultProps,\n WidgetDescriptor,\n WidgetPackageDescriptor,\n WidgetPackageType,\n WidgetRuntimeContainer,\n WidgetRuntimeResizable,\n} from \"../types/widget-package-descriptor\";\nexport type {\n TypedWidgetSchema,\n WidgetPath,\n WidgetRegistry,\n WidgetSchema,\n WidgetType,\n WidgetTypeName,\n} from \"../types/widget-schema\";\nexport type { WidgetPropertySchema } from \"../registries/property-schema-types\";\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 * as PortalSdk from \"../widgets/runtime-sdk\";\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 PortalSdk,\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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"}
|
|
1
|
+
{"version":3,"file":"widget-package-utils-CJcLEvqE.cjs","names":["toRawManifest","createPersister","useAppDefinitionApi","useCompanyScopedQueryKey","transformManifestToRepAppData","deleteDatabase","globalMarker","widgetPackageTypes","widgetContainers","widgetResizableValues","isRecord","hasAmbiguousHttpScheme","React","ReactDOM","ReactJsxRuntime","Component","DEFAULT_SDK_WIDGET_REGISTRY","useAppDefinitionApi","useCompanyScopedQueryKey","transformManifestToRepAppData","usePortalTenantClient","deleteDatabase"],"sources":["../src/hooks/use-fluid-app.ts","../src/hooks/use-logout.ts","../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/types.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/hooks/use-fluid-profile.ts","../src/hooks/use-company-switch.ts","../src/widgets/runtime-sdk.ts","../src/utils/widget-package-manifest-url.ts","../src/utils/load-widget-packages.ts","../src/utils/widget-package-utils.ts"],"sourcesContent":["import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { createPersister } from \"@fluid-app/query-persister\";\nimport { useAppDefinitionApi } from \"@fluid-app/portal-core/app-definition-api-context\";\nimport type { AppDefinitionApi } from \"@fluid-app/portal-core/app-definition-api\";\nimport { useCompanyScopedQueryKey } from \"./query-keys\";\nimport { transformManifestToRepAppData, toRawManifest } from \"../transforms\";\nimport type { RawManifestResponse } from \"../transforms\";\nimport type { RepAppData } from \"@fluid-app/portal-core/types\";\n\n/**\n * Base query key for full app data (rendered manifest endpoint).\n * Kept for backwards compatibility — the runtime key used by the hook\n * includes a company prefix via {@link useCompanyScopedQueryKey}.\n */\nexport const APP_DATA_QUERY_KEY = [\"fluid\", \"app\"] as const;\n\n/**\n * Fetch the raw rendered manifest via the portal-tenant BFF adapter.\n * Shared by `useFluidApp` and `useFluidProfile` to avoid drift.\n */\nexport async function fetchRawManifest(\n api: AppDefinitionApi,\n): Promise<RawManifestResponse> {\n const response = await api.fetchManifest();\n return toRawManifest(response);\n}\n\n/**\n * Module-level persister instance (browser only).\n * Created once when the module loads so all calls to useFluidApp share\n * the same IndexedDB connection. Applied at the query level so it works\n * regardless of which QueryClient the app provides.\n */\nconst appDataPersister =\n typeof window !== \"undefined\" && !import.meta.env?.DEV\n ? createPersister()\n : undefined;\n\n/**\n * Hook to fetch the full portal app data from the rendered-manifest endpoint.\n *\n * Returns a `RepAppData` object containing:\n * - `screens` — all screen definitions with normalized component trees\n * - `profile.themes` — fully-transformed ThemeDefinition[] (handles legacy + new formats)\n * - `profile.activeThemeId` — the currently active theme ID\n * - `profile.navigation.navigation_items` — sorted, recursive navigation tree\n *\n * Uses IndexedDB persistence so subsequent page loads hydrate instantly\n * from cache while revalidating in the background. The raw API response\n * (plain JSON) is cached; Color objects are recreated from cache via\n * `select` on every restore — this is fast (CPU only, no network).\n *\n * @example\n * ```tsx\n * function App() {\n * const { data: appData, isLoading } = useFluidApp();\n *\n * if (isLoading) return <Spinner />;\n *\n * return (\n * <AppShell\n * appData={appData}\n * navigation={appData.profile.navigation.navigation_items}\n * />\n * );\n * }\n * ```\n */\nexport function useFluidApp(options?: {\n enabled?: boolean;\n}): UseQueryResult<RepAppData> {\n const appDefinitionApi = useAppDefinitionApi();\n const { scopeKey } = useCompanyScopedQueryKey();\n\n return useQuery<\n RawManifestResponse,\n Error,\n RepAppData,\n readonly (string | number)[]\n >({\n queryKey: scopeKey(APP_DATA_QUERY_KEY),\n queryFn: () => fetchRawManifest(appDefinitionApi),\n select: transformManifestToRepAppData,\n ...(appDataPersister && { persister: appDataPersister.persisterFn }),\n ...(options?.enabled !== undefined && { enabled: options.enabled }),\n });\n}\n","/**\n * useLogout Hook\n *\n * Provides a complete logout function that:\n * 1. Clears all client-side state (query cache, IndexedDB, sessionStorage)\n * 2. Navigates to GET /logout — Rails clears the session and redirects to the Hub\n */\n\nimport { useCallback } from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { deleteDatabase } from \"@fluid-app/query-persister\";\n\nexport interface UseLogoutOptions {\n /** URL to redirect to after logout. Triggers a full page navigation. */\n redirectUrl?: string;\n /** Callback invoked after all state is cleared. Ignored when `redirectUrl` is set. */\n onLogout?: () => void;\n}\n\n/**\n * Hook that returns a `logout` function which clears the server session\n * via `DELETE /logout` and all cached/persisted client state.\n *\n * @example\n * ```tsx\n * const logout = useLogout({ redirectUrl: \"/login\" });\n * <button onClick={logout}>Log out</button>\n * ```\n *\n * @example\n * ```tsx\n * const logout = useLogout({\n * onLogout: () => navigate(\"/signed-out\"),\n * });\n * ```\n */\nexport function useLogout({\n redirectUrl,\n onLogout,\n}: UseLogoutOptions = {}): () => Promise<void> {\n const queryClient = useQueryClient();\n\n const logout = useCallback(async () => {\n // 1. Cancel in-flight requests to prevent cache repopulation\n await queryClient.cancelQueries();\n\n // 2. Clear in-memory TanStack Query cache\n queryClient.clear();\n\n // 3. Clear IndexedDB persisted query cache\n try {\n await deleteDatabase();\n } catch (error) {\n // Non-fatal — continue with logout even if IndexedDB cleanup fails\n console.error(\"[useLogout] Failed to clear IndexedDB cache:\", error);\n }\n\n // 4. Clear sessionStorage — intentionally clears all keys because the\n // portal app owns the full page (not embedded as a micro-frontend).\n try {\n sessionStorage.clear();\n } catch {\n // sessionStorage may be unavailable in some contexts\n }\n\n // 5. Navigate to the server logout endpoint. Rails clears the session\n // cookie and redirects to the Portal Hub company list. A full page\n // navigation lets the browser follow the redirect naturally — no\n // fetch or JSON parsing needed.\n if (redirectUrl) {\n window.location.href = redirectUrl;\n } else if (onLogout) {\n onLogout();\n } else {\n window.location.href = \"/logout\";\n }\n }, [queryClient, redirectUrl, onLogout]);\n\n return logout;\n}\n","/**\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 * as React from \"react\";\nimport type * as ReactDOM from \"react-dom\";\nimport type * as ReactJsxRuntime from \"react/jsx-runtime\";\n\nimport type { WidgetRuntimeError } from \"./errors\";\n\nexport const WIDGET_PACKAGE_MANIFEST_VERSION = 1;\n\nexport type WidgetPackageType =\n | \"fluid\"\n | \"company\"\n | \"droplet\"\n | \"partner\"\n | \"internal\";\n\nexport type WidgetRuntimeContainer = \"inline\" | \"block\" | \"card\" | \"fullscreen\";\n\nexport type WidgetRuntimeResizable =\n | boolean\n | \"horizontal\"\n | \"vertical\"\n | \"both\";\n\nexport type WidgetPropertySchema = {\n readonly widgetType?: string;\n readonly [key: string]: unknown;\n};\n\nexport type WidgetDefaultProps = Readonly<Record<string, unknown>>;\n\nexport interface WidgetDescriptor {\n readonly type: string;\n readonly name: string;\n readonly displayName: string;\n readonly description: string;\n readonly icon: string;\n readonly category: string;\n readonly propertySchema: WidgetPropertySchema;\n readonly defaultProps: WidgetDefaultProps;\n readonly container: WidgetRuntimeContainer;\n readonly minSdkVersion: string;\n readonly resizable: WidgetRuntimeResizable;\n}\n\nexport interface WidgetPackageDescriptor {\n readonly manifestVersion: typeof WIDGET_PACKAGE_MANIFEST_VERSION;\n readonly packageId: string;\n readonly packageType: WidgetPackageType;\n readonly version: string;\n readonly remoteEntryUrl: string;\n readonly cssUrls: readonly string[];\n readonly widgets: readonly WidgetDescriptor[];\n}\n\nexport type WidgetRuntimeComponent<Props = Readonly<Record<string, unknown>>> =\n React.ComponentType<Props>;\n\nexport interface RuntimeWidgetRegistration\n extends\n Omit<\n WidgetDescriptor,\n | \"name\"\n | \"displayName\"\n | \"description\"\n | \"icon\"\n | \"category\"\n | \"container\"\n | \"minSdkVersion\"\n | \"resizable\"\n >,\n Partial<\n Pick<\n WidgetDescriptor,\n | \"name\"\n | \"displayName\"\n | \"description\"\n | \"icon\"\n | \"category\"\n | \"container\"\n | \"minSdkVersion\"\n | \"resizable\"\n >\n > {\n readonly component: WidgetRuntimeComponent;\n}\n\nexport interface WidgetPackageRegistration {\n readonly packageId: string;\n readonly version: string;\n readonly widgets: readonly RuntimeWidgetRegistration[];\n}\n\nexport interface RegisteredWidget extends WidgetDescriptor {\n readonly packageId: string;\n readonly packageType: WidgetPackageType;\n readonly version: string;\n readonly component: WidgetRuntimeComponent;\n}\n\n/**\n * Key for a widget registry entry.\n *\n * Create keys with `createWidgetRegistryKey(packageId, version, type)`.\n */\nexport type WidgetRuntimeRegistryKey = string;\n\nexport type WidgetRuntimeRegistry = ReadonlyMap<\n WidgetRuntimeRegistryKey,\n RegisteredWidget\n>;\n\nexport interface GlobalRegisteredWidget extends RuntimeWidgetRegistration {\n readonly packageId: string;\n readonly version: string;\n}\n\nexport type FluidWidgetsGlobalRegistry = ReadonlyMap<\n WidgetRuntimeRegistryKey,\n GlobalRegisteredWidget\n>;\n\nexport type FluidWidgetsGlobalRegistryEvent =\n | {\n readonly kind: \"register\";\n readonly registration: WidgetPackageRegistration;\n readonly previousRegistration?: WidgetPackageRegistration;\n }\n | {\n readonly kind: \"clear\";\n readonly packageId?: string;\n readonly version?: string;\n };\n\nexport type FluidWidgetsGlobalUnsubscribe = () => void;\n\nexport interface LoadWidgetPackageSuccess {\n readonly ok: true;\n readonly packageId: string;\n readonly version: string;\n readonly widgets: readonly RegisteredWidget[];\n}\n\nexport interface LoadWidgetPackageFailure {\n readonly ok: false;\n readonly packageId: string;\n readonly version: string;\n readonly error: WidgetRuntimeError;\n}\n\nexport type LoadWidgetPackageResult =\n | LoadWidgetPackageSuccess\n | LoadWidgetPackageFailure;\n\n/**\n * Per-loader behavior options.\n *\n * Remote script insertion is still coordinated by a module-level,\n * page-wide queue shared by every loader instance created from the same loaded\n * runtime module. That coupling intentionally serializes classic script loads\n * so package registrations can be attributed safely through `window.FluidWidgets`.\n */\nexport interface WidgetRuntimeLoaderOptions {\n readonly cacheBust?: boolean | string | (() => string);\n /**\n * Ignore package registrations that already exist on `window.FluidWidgets`\n * before a descriptor's remote entry script is appended. Runtime packages\n * loaded by that script can still satisfy the descriptor by registering while\n * the script is loading.\n */\n readonly ignorePreRegisteredPackages?: boolean;\n readonly timeoutMs?: number;\n readonly throwOnError?: boolean;\n}\n\nexport interface WidgetRuntimeLoader {\n loadPackage(\n descriptor: WidgetPackageDescriptor,\n ): Promise<LoadWidgetPackageResult>;\n loadPackages(\n descriptors: readonly WidgetPackageDescriptor[],\n ): Promise<readonly LoadWidgetPackageResult[]>;\n getRegisteredWidgets(): readonly RegisteredWidget[];\n getRegistry(): WidgetRuntimeRegistry;\n /**\n * Invalidates this loader's matching package cache and also removes matching\n * registrations from the shared `window.FluidWidgets` global registry.\n */\n invalidatePackage(packageId: string, version?: string): void;\n /**\n * Clears this loader's package cache and also clears the shared\n * `window.FluidWidgets` global registry for the page.\n */\n clear(): void;\n}\n\nexport const FLUID_WIDGET_PACKAGE_REQUIRES_PORTAL_SDK_FLAG =\n \"__fluidRequiresPortalSdk\";\n\nexport type FluidWidgetPackageFactory = {\n (): void;\n readonly [FLUID_WIDGET_PACKAGE_REQUIRES_PORTAL_SDK_FLAG]?: true;\n};\n\nexport type FluidWidgetPackageQueue = FluidWidgetPackageFactory[];\n\nexport interface FluidWidgetsGlobal {\n registerPackage(registration: WidgetPackageRegistration): void;\n getPackageRegistration(\n packageId: string,\n version: string,\n ): WidgetPackageRegistration | undefined;\n getRegisteredWidgets(): readonly GlobalRegisteredWidget[];\n getRegistry(): FluidWidgetsGlobalRegistry;\n /**\n * Mutates the shared `window.FluidWidgets` registry for the page. Without a\n * package id it clears every global registration; with a package id it clears\n * all matching versions, or the single matching version when provided.\n */\n clear(packageId?: string, version?: string): void;\n subscribe(\n listener: (event: FluidWidgetsGlobalRegistryEvent) => void,\n ): FluidWidgetsGlobalUnsubscribe;\n}\n\nexport type FluidSharedPortalSdkFunction = (...args: never[]) => unknown;\n\nexport interface FluidSharedPortalSdk {\n readonly defineWidget: FluidSharedPortalSdkFunction;\n readonly defineWidgetPackage: FluidSharedPortalSdkFunction;\n readonly useAccount: FluidSharedPortalSdkFunction;\n readonly useStore: FluidSharedPortalSdkFunction;\n readonly useAppNavigation: FluidSharedPortalSdkFunction;\n readonly usePortalTenantClient: FluidSharedPortalSdkFunction;\n readonly useFluidApp: FluidSharedPortalSdkFunction;\n readonly useFluidProfile: FluidSharedPortalSdkFunction;\n}\n\nexport interface FluidSharedGlobals {\n readonly React: typeof React;\n readonly ReactDOM: typeof ReactDOM;\n readonly ReactJsxRuntime: typeof ReactJsxRuntime;\n readonly WidgetRuntime: WidgetRuntimeHostApi;\n readonly PortalSdk?: FluidSharedPortalSdk;\n}\n\nexport interface InstallFluidWidgetRuntimeHostGlobalsOptions {\n readonly React?: typeof React;\n readonly ReactDOM?: typeof ReactDOM;\n readonly ReactJsxRuntime?: typeof ReactJsxRuntime;\n readonly WidgetRuntime?: Partial<WidgetRuntimeHostApi>;\n readonly PortalSdk?: FluidSharedPortalSdk;\n}\n\nexport interface WidgetRuntimeHostApi {\n readonly createWidgetRuntimeLoader: (\n options?: WidgetRuntimeLoaderOptions,\n ) => WidgetRuntimeLoader;\n readonly installFluidWidgetRuntimeHostGlobals: (\n shared?: InstallFluidWidgetRuntimeHostGlobalsOptions,\n ) => FluidSharedGlobals;\n readonly manifestVersion: typeof WIDGET_PACKAGE_MANIFEST_VERSION;\n}\n\ndeclare global {\n interface Window {\n FluidWidgets?: FluidWidgetsGlobal;\n FluidShared?: FluidSharedGlobals;\n FluidWidgetPackageQueue?: FluidWidgetPackageQueue;\n }\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 FLUID_WIDGET_PACKAGE_REQUIRES_PORTAL_SDK_FLAG,\n WIDGET_PACKAGE_MANIFEST_VERSION,\n type FluidSharedGlobals,\n type FluidSharedPortalSdk,\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 = Omit<FluidSharedGlobals, \"PortalSdk\"> & {\n readonly [globalMarker]: true;\n PortalSdk?: FluidSharedPortalSdk;\n};\n\nexport function installFluidWidgetRuntimeHostGlobals(\n shared: InstallFluidWidgetRuntimeHostGlobalsOptions = {},\n): FluidSharedGlobals {\n ensureFluidWidgetsGlobal();\n\n const existing = window.FluidShared;\n if (isFluidSharedGlobal(existing)) {\n if (existing.PortalSdk === undefined && shared.PortalSdk !== undefined) {\n existing.PortalSdk = shared.PortalSdk;\n }\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 ?? React,\n ReactDOM: shared.ReactDOM ?? ReactDOM,\n ReactJsxRuntime: shared.ReactJsxRuntime ?? ReactJsxRuntime,\n WidgetRuntime: widgetRuntime,\n ...(shared.PortalSdk === undefined ? {} : { PortalSdk: shared.PortalSdk }),\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) || window.FluidShared === undefined) return;\n\n const hasPortalSdk = window.FluidShared.PortalSdk !== undefined;\n const deferredFactories: FluidWidgetPackageFactory[] = [];\n\n while (queue.length > 0) {\n const factory = queue.shift();\n if (typeof factory !== \"function\") continue;\n\n if (\n factory[FLUID_WIDGET_PACKAGE_REQUIRES_PORTAL_SDK_FLAG] === true &&\n !hasPortalSdk\n ) {\n deferredFactories.push(factory);\n continue;\n }\n\n try {\n factory();\n } catch (err) {\n console.error(pendingPackageFactoryErrorPrefix, err);\n }\n }\n\n queue.push(...deferredFactories);\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","import { useQuery, type UseQueryResult } from \"@tanstack/react-query\";\nimport { useAppDefinitionApi } from \"@fluid-app/portal-core/app-definition-api-context\";\nimport { useCompanyScopedQueryKey } from \"./query-keys\";\nimport { transformManifestToRepAppData } from \"../transforms\";\nimport type { RawManifestResponse } from \"../transforms\";\nimport type { Profile } from \"../types/profile\";\nimport { APP_DATA_QUERY_KEY, fetchRawManifest } from \"./use-fluid-app\";\n\n/**\n * Base query key for profile data.\n * Kept for backwards compatibility — the runtime key used by the hook\n * includes a company prefix via {@link useCompanyScopedQueryKey}.\n *\n * @deprecated Use {@link APP_DATA_QUERY_KEY} with `useFluidApp` instead.\n */\nexport const PROFILE_QUERY_KEY = [\"fluid\", \"profile\"] as const;\n\n/**\n * Hook to fetch the portal profile (themes, navigation, screens).\n *\n * Internally fetches from the fluidos API (same data source as\n * {@link useFluidApp}) and selects the `profile` slice, so no\n * legacy `/api/rep_app/manifest` call is made.\n *\n * @deprecated Use `useFluidApp()` instead — it returns the full\n * `RepAppData` including `profile`, `screens`, and more.\n *\n * @example\n * ```tsx\n * function Navigation() {\n * const { data: profile, isLoading } = useFluidProfile();\n *\n * if (isLoading) return <Spinner />;\n *\n * return (\n * <nav>\n * {profile?.navigation.navigation_items.map(item => (\n * <NavItem key={item.id} item={item} />\n * ))}\n * </nav>\n * );\n * }\n * ```\n */\nexport function useFluidProfile(): UseQueryResult<Profile> {\n const appDefinitionApi = useAppDefinitionApi();\n const { scopeKey } = useCompanyScopedQueryKey();\n\n return useQuery<\n RawManifestResponse,\n Error,\n Profile,\n readonly (string | number)[]\n >({\n queryKey: scopeKey(APP_DATA_QUERY_KEY),\n queryFn: () => fetchRawManifest(appDefinitionApi),\n select: (raw) => {\n const appData = transformManifestToRepAppData(raw);\n return appData.profile;\n },\n });\n}\n","import { useCallback, useRef } from \"react\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { deleteDatabase } from \"@fluid-app/query-persister\";\nimport { usePortalTenantClient } from \"../providers/PortalTenantClientProvider\";\n\nexport interface UseCompanySwitchOptions {\n // Preserved for API compatibility; no longer used internally.\n}\n\n/**\n * Hook that handles company switching for the portal.\n *\n * Calls PUT /api/authentication/company/{id}/switch, clears the TanStack\n * Query cache and IndexedDB persisted cache, then reloads the page so all\n * queries re-fetch with the new company context.\n *\n * The server updates the session cookie automatically via the switch\n * endpoint response; no client-side token storage is needed.\n */\nexport function useCompanySwitch(_options?: UseCompanySwitchOptions): {\n switchCompany: (companyId: number) => void;\n isPending: boolean;\n isError: boolean;\n error: Error | null;\n} {\n const client = usePortalTenantClient();\n const queryClient = useQueryClient();\n const switchingRef = useRef(false);\n\n const { mutate, isPending, isError, error } = useMutation({\n mutationFn: (companyId: number) =>\n client.put(`/api/authentication/company/${companyId}/switch`),\n onSuccess: async () => {\n // Clear in-memory cache and IndexedDB to prevent stale data\n // rehydration after reload.\n queryClient.clear();\n try {\n await deleteDatabase(\"company-switch\");\n } catch {\n // Non-fatal: company-scoped query keys prevent cross-company reads\n // even if the IDB delete fails.\n }\n // Session cookie is updated server-side by the switch endpoint.\n // Reload to re-fetch all queries with the new company context.\n window.location.reload();\n },\n onError: () => {\n switchingRef.current = false;\n },\n });\n\n const switchCompany = useCallback(\n (companyId: number) => {\n if (switchingRef.current) return;\n switchingRef.current = true;\n mutate(companyId);\n },\n [mutate],\n );\n\n return {\n switchCompany: switchCompany,\n isPending: isPending,\n isError: isError,\n error: error,\n };\n}\n","export { useAppDefinitionApi } from \"@fluid-app/portal-core/app-definition-api-context\";\n\nexport { usePortalTenantClient } from \"../providers/PortalTenantClientProvider\";\nexport { APP_DATA_QUERY_KEY, useFluidApp } from \"../hooks/use-fluid-app\";\nexport {\n APP_DEFINITION_QUERY_KEY,\n useAppDefinition,\n} from \"../hooks/use-app-definition\";\nexport { PROFILE_QUERY_KEY, useFluidProfile } from \"../hooks/use-fluid-profile\";\nexport {\n useFluidTheme,\n type UseFluidThemeResult,\n} from \"../hooks/use-fluid-theme\";\nexport {\n createCompanyQueryKey,\n useCompanyScopedQueryKey,\n} from \"../hooks/query-keys\";\nexport { useAccount } from \"../hooks/use-account\";\nexport {\n useCompanySwitch,\n type UseCompanySwitchOptions,\n} from \"../hooks/use-company-switch\";\nexport { useLogout, type UseLogoutOptions } from \"../hooks/use-logout\";\nexport { useStore } from \"../hooks/use-store\";\nexport {\n getProperty,\n hasData,\n isErrorResult,\n isIdle,\n isLoading,\n selectProperty,\n type ListQueryResult,\n type QueryResult,\n type QueryResultNullable,\n type UseListResourceHook,\n type UseSingleResourceHook,\n type ValueListQueryResult,\n type WithData,\n} from \"../hooks/hook-types\";\nexport {\n AppNavigationProvider,\n useAppNavigation,\n type AppNavigationContextValue,\n type AppNavigationProviderProps,\n} from \"../shell/AppNavigationContext\";\nexport {\n applyPropertyValues,\n extractPropertyValues,\n groupPropertyFields,\n isPropertyFieldType,\n PROPERTY_FIELD_TYPES,\n type PropertyFieldSchema,\n type PropertyFieldType,\n type TabConfig,\n} from \"../registries/property-schema-types\";\nexport {\n buildThemeDefinition,\n getActiveThemeId,\n normalizeComponentTree,\n toNavigationItem,\n toRawManifest,\n toScreenDefinition,\n transformManifestToRepAppData,\n transformThemes,\n type RawApiNavigationItem,\n type RawApiScreen,\n type RawApiTheme,\n type RawManifestResponse,\n} from \"../transforms\";\nexport {\n defineWidget,\n defineWidgetPackage,\n isSourceWidgetPackage,\n sourceWidgetPackagesToManifests,\n type DefineWidgetOptions,\n type DefineWidgetPackageOptions,\n type SourceWidget,\n type SourceWidgetPackage,\n} from \"./authoring\";\n\nexport type { AccountRep } from \"@fluid-app/portal-core/account-types\";\nexport type { AppDefinitionApi } from \"@fluid-app/portal-core/app-definition-api\";\nexport type {\n AppDefinitionResponse,\n AppFluidOsDefinition,\n AppManifest,\n AppManifestProfile,\n AppManifestResponse,\n} from \"@fluid-app/portal-core/app-definition-types\";\nexport type { WidgetManifest } from \"@fluid-app/portal-core/registries\";\nexport type { Store } from \"@fluid-app/portal-core/store-types\";\nexport type {\n RepAppData,\n RepAppManifest,\n RepAppProfile,\n} from \"@fluid-app/portal-core/types\";\nexport type { UserType } from \"@fluid-app/auth\";\nexport type { UseQueryResult } from \"@tanstack/react-query\";\nexport type { FetchClient as PortalTenantFetchClient } from \"@fluid-app/portal-tenant-api-client\";\nexport type { FluidSDKConfig } from \"../types/config\";\nexport type {\n AlignOptions,\n BackgroundType,\n BackgroundValue,\n BorderRadiusOptions,\n ButtonSizeOptions,\n ColorOptions,\n FontSizeOptions,\n GapOptions,\n PaddingOptions,\n SectionLayoutType,\n} from \"../types/field-types\";\nexport type {\n Navigation,\n NavigationItem,\n ScreenDefinition,\n} from \"../types/navigation\";\nexport type { Profile } from \"../types/profile\";\nexport type {\n ResolvedTheme,\n ThemeColorInput,\n ThemeDefinition,\n ThemePayload,\n} from \"../types/theme\";\nexport type {\n WidgetDefaultProps,\n WidgetDescriptor,\n WidgetPackageDescriptor,\n WidgetPackageType,\n WidgetRuntimeContainer,\n WidgetRuntimeResizable,\n} from \"../types/widget-package-descriptor\";\nexport type {\n TypedWidgetSchema,\n WidgetPath,\n WidgetRegistry,\n WidgetSchema,\n WidgetType,\n WidgetTypeName,\n} from \"../types/widget-schema\";\nexport type { WidgetPropertySchema } from \"../registries/property-schema-types\";\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 * as PortalSdk from \"../widgets/runtime-sdk\";\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 PortalSdk,\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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"}
|