@fluid-app/portal-sdk 0.1.369 → 0.1.371
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/{CardWidget-CqdJHxX0.cjs → CardWidget-BWwI1G0Z.cjs} +2 -2
- package/dist/{CardWidget-CqdJHxX0.cjs.map → CardWidget-BWwI1G0Z.cjs.map} +1 -1
- package/dist/{CardWidget-DCrXorb0.cjs → CardWidget-aJYbzWG9.cjs} +2 -2
- package/dist/{CardWidget-DdV1HDy0.mjs → CardWidget-cIc9cOG9.mjs} +2 -2
- package/dist/{CardWidget-DdV1HDy0.mjs.map → CardWidget-cIc9cOG9.mjs.map} +1 -1
- package/dist/{ContainerWidget-CYIOGpgy.cjs → ContainerWidget-C2LMzXVj.cjs} +3 -3
- package/dist/{ContainerWidget-CZTRim0A.cjs → ContainerWidget-bMMdFhLg.cjs} +2 -2
- package/dist/{ContainerWidget-CZTRim0A.cjs.map → ContainerWidget-bMMdFhLg.cjs.map} +1 -1
- package/dist/{ContainerWidget-BKaiiPlW.mjs → ContainerWidget-mSWihekF.mjs} +2 -2
- package/dist/{ContainerWidget-BKaiiPlW.mjs.map → ContainerWidget-mSWihekF.mjs.map} +1 -1
- package/dist/{EmbedWidget-B18Qzd0T.cjs → EmbedWidget-CFqodi8C.cjs} +2 -1
- package/dist/{EmbedWidget-CoZgo8aI.cjs → EmbedWidget-D1lbYjuL.cjs} +300 -3
- package/dist/EmbedWidget-D1lbYjuL.cjs.map +1 -0
- package/dist/{EmbedWidget-BJY7l4pI.mjs → EmbedWidget-p_Ybl0em.mjs} +300 -3
- package/dist/EmbedWidget-p_Ybl0em.mjs.map +1 -0
- package/dist/{FluidProvider-iStLA04k.cjs → FluidProvider-C6d1TUVm.cjs} +10 -12
- package/dist/{FluidProvider-iStLA04k.cjs.map → FluidProvider-C6d1TUVm.cjs.map} +1 -1
- package/dist/{FluidProvider-DIhrcma3.mjs → FluidProvider-C80gc4Yi.mjs} +10 -12
- package/dist/{FluidProvider-DIhrcma3.mjs.map → FluidProvider-C80gc4Yi.mjs.map} +1 -1
- package/dist/{LayoutWidget-xw1zY6cc.cjs → LayoutWidget-BqUbneWw.cjs} +2 -2
- package/dist/{LayoutWidget-xw1zY6cc.cjs.map → LayoutWidget-BqUbneWw.cjs.map} +1 -1
- package/dist/{LayoutWidget-VU6uFW3-.cjs → LayoutWidget-C1BzDeQI.cjs} +2 -2
- package/dist/{LayoutWidget-C0TbnxQW.mjs → LayoutWidget-D3qYKt9F.mjs} +2 -2
- package/dist/{LayoutWidget-C0TbnxQW.mjs.map → LayoutWidget-D3qYKt9F.mjs.map} +1 -1
- package/dist/{MessagingScreen-BFpKQppV.mjs → MessagingScreen-D3si8TPx.mjs} +7 -7
- package/dist/{MessagingScreen-BOAnKE3v.mjs → MessagingScreen-DKzYThAY.mjs} +2 -2
- package/dist/{MessagingScreen-BOAnKE3v.mjs.map → MessagingScreen-DKzYThAY.mjs.map} +1 -1
- package/dist/{MessagingScreen-y_A92ivV.cjs → MessagingScreen-DqxRu2x3.cjs} +2 -2
- package/dist/{MessagingScreen-y_A92ivV.cjs.map → MessagingScreen-DqxRu2x3.cjs.map} +1 -1
- package/dist/{MessagingScreen-C5Pejtlt.cjs → MessagingScreen-PZyO11S1.cjs} +7 -7
- package/dist/{OrdersScreen-BzibsZC0.mjs → OrdersScreen-B2htbQ2Q.mjs} +2 -2
- package/dist/{OrdersScreen-BzibsZC0.mjs.map → OrdersScreen-B2htbQ2Q.mjs.map} +1 -1
- package/dist/{OrdersScreen-BlYerRr0.cjs → OrdersScreen-BuX5aWgx.cjs} +7 -7
- package/dist/{OrdersScreen-wtdmNSwV.mjs → OrdersScreen-Cgjfo2Fs.mjs} +7 -7
- package/dist/{OrdersScreen-B_jWMXAy.cjs → OrdersScreen-CpNvxRDC.cjs} +2 -2
- package/dist/{OrdersScreen-B_jWMXAy.cjs.map → OrdersScreen-CpNvxRDC.cjs.map} +1 -1
- package/dist/{ProfileScreen-B5bNfcEX.mjs → ProfileScreen-BCwdwO_p.mjs} +3 -3
- package/dist/{ProfileScreen-B5bNfcEX.mjs.map → ProfileScreen-BCwdwO_p.mjs.map} +1 -1
- package/dist/{ProfileScreen-CUEECEVi.mjs → ProfileScreen-D7UA604p.mjs} +8 -8
- package/dist/{ProfileScreen-BF7Xp0EB.cjs → ProfileScreen-DlIXDIeu.cjs} +3 -3
- package/dist/{ProfileScreen-BF7Xp0EB.cjs.map → ProfileScreen-DlIXDIeu.cjs.map} +1 -1
- package/dist/{ProfileScreen-DXaE0EJ2.cjs → ProfileScreen-MypXufrO.cjs} +8 -8
- package/dist/{ScreenRenderer-CKu-Jc1I.mjs → ScreenRenderer-CcT_j-WQ.mjs} +1 -4
- package/dist/{ScreenRenderer-CKu-Jc1I.mjs.map → ScreenRenderer-CcT_j-WQ.mjs.map} +1 -1
- package/dist/{ScreenRenderer-CZTdJd2G.cjs → ScreenRenderer-Ce8MJPnR.cjs} +1 -4
- package/dist/{ScreenRenderer-CZTdJd2G.cjs.map → ScreenRenderer-Ce8MJPnR.cjs.map} +1 -1
- package/dist/{ShopScreen-CTdqSSs6.cjs → ShopScreen-29SZwMWF.cjs} +2 -2
- package/dist/{ShopScreen-CTdqSSs6.cjs.map → ShopScreen-29SZwMWF.cjs.map} +1 -1
- package/dist/{ShopScreen-CIXdmZvI.cjs → ShopScreen-BC9NDysQ.cjs} +7 -7
- package/dist/{ShopScreen-CUQtjHcp.mjs → ShopScreen-BKVNW6ya.mjs} +7 -7
- package/dist/{ShopScreen-ChWVG5vG.mjs → ShopScreen-CgN-6gic.mjs} +2 -2
- package/dist/{ShopScreen-ChWVG5vG.mjs.map → ShopScreen-CgN-6gic.mjs.map} +1 -1
- package/dist/{SubscriptionsScreen-CXrorIz1.mjs → SubscriptionsScreen-CPiLzWhm.mjs} +8 -8
- package/dist/{SubscriptionsScreen-C8Oc4iYz.cjs → SubscriptionsScreen-Dz6Y_1oD.cjs} +3 -3
- package/dist/{SubscriptionsScreen-C8Oc4iYz.cjs.map → SubscriptionsScreen-Dz6Y_1oD.cjs.map} +1 -1
- package/dist/{SubscriptionsScreen-CwH8QyDm.mjs → SubscriptionsScreen-M2WaVHH7.mjs} +3 -3
- package/dist/{SubscriptionsScreen-CwH8QyDm.mjs.map → SubscriptionsScreen-M2WaVHH7.mjs.map} +1 -1
- package/dist/{SubscriptionsScreen-_X2bwjKO.cjs → SubscriptionsScreen-dN42J-MR.cjs} +8 -8
- package/dist/{authoring-BlXhd4Sj.d.cts → authoring--rXPyZca.d.cts} +2 -2
- package/dist/{authoring-BlXhd4Sj.d.cts.map → authoring--rXPyZca.d.cts.map} +1 -1
- package/dist/{authoring-BMuHXNFy.d.mts → authoring-V0sXg_j4.d.mts} +2 -2
- package/dist/{authoring-BMuHXNFy.d.mts.map → authoring-V0sXg_j4.d.mts.map} +1 -1
- package/dist/index.cjs +23 -25
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +19 -8
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +19 -9
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +23 -25
- package/dist/index.mjs.map +1 -1
- package/dist/preview/preview-entry.cjs +7 -7
- package/dist/preview/preview-entry.d.cts +1 -1
- package/dist/preview/preview-entry.d.mts +1 -1
- package/dist/preview/preview-entry.mjs +7 -7
- package/dist/{use-portal-card-add-3ds-flow-DJoxmO7y.cjs → use-portal-card-add-3ds-flow-C0YUg213.cjs} +2 -2
- package/dist/{use-portal-card-add-3ds-flow-DJoxmO7y.cjs.map → use-portal-card-add-3ds-flow-C0YUg213.cjs.map} +1 -1
- package/dist/{use-portal-card-add-3ds-flow-CKkPV6zg.mjs → use-portal-card-add-3ds-flow-DKXraYw-.mjs} +2 -2
- package/dist/{use-portal-card-add-3ds-flow-CKkPV6zg.mjs.map → use-portal-card-add-3ds-flow-DKXraYw-.mjs.map} +1 -1
- package/dist/vite/builder-preview-entry.cjs +573 -0
- package/dist/vite/builder-preview-entry.cjs.map +1 -0
- package/dist/vite/builder-preview-entry.d.cts +11 -0
- package/dist/vite/builder-preview-entry.d.cts.map +1 -0
- package/dist/vite/builder-preview-entry.d.mts +11 -0
- package/dist/vite/builder-preview-entry.d.mts.map +1 -0
- package/dist/vite/builder-preview-entry.mjs +571 -0
- package/dist/vite/builder-preview-entry.mjs.map +1 -0
- package/dist/vite/index.cjs +16 -28
- package/dist/vite/index.cjs.map +1 -1
- package/dist/vite/index.d.cts.map +1 -1
- package/dist/vite/index.d.mts.map +1 -1
- package/dist/vite/index.mjs +16 -28
- package/dist/vite/index.mjs.map +1 -1
- package/dist/{widget-package-descriptor-BnVCE5Fz.d.cts → widget-package-descriptor-ByCz_FNh.d.cts} +177 -9
- package/dist/widget-package-descriptor-ByCz_FNh.d.cts.map +1 -0
- package/dist/{widget-package-descriptor-Dt8BkF85.d.mts → widget-package-descriptor-CPIPAdUO.d.mts} +177 -9
- package/dist/widget-package-descriptor-CPIPAdUO.d.mts.map +1 -0
- package/dist/widget-package-utils-BWn56ZFw.cjs +1553 -0
- package/dist/widget-package-utils-BWn56ZFw.cjs.map +1 -0
- package/dist/widget-package-utils-BdS0B0pI.mjs +1486 -0
- package/dist/widget-package-utils-BdS0B0pI.mjs.map +1 -0
- package/dist/widgets/authoring.d.cts +1 -1
- package/dist/widgets/authoring.d.mts +1 -1
- package/package.json +17 -21
- package/dist/EmbedWidget-BJY7l4pI.mjs.map +0 -1
- package/dist/EmbedWidget-CoZgo8aI.cjs.map +0 -1
- package/dist/widget-package-descriptor-BnVCE5Fz.d.cts.map +0 -1
- package/dist/widget-package-descriptor-Dt8BkF85.d.mts.map +0 -1
- package/dist/widget-package-utils-BkrdrNr7.mjs +0 -582
- package/dist/widget-package-utils-BkrdrNr7.mjs.map +0 -1
- package/dist/widget-package-utils-C00ijCm-.cjs +0 -650
- package/dist/widget-package-utils-C00ijCm-.cjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"widget-package-utils-BkrdrNr7.mjs","names":[],"sources":["../src/config/env.ts","../src/config/defaults.ts","../src/utils/build-widget-registry.ts","../src/utils/widget-package-manifest-url.ts","../src/utils/load-widget-packages.ts","../src/utils/widget-package-utils.ts"],"sourcesContent":["/**\n * Read Vite environment variables at runtime.\n *\n * Isolated into its own module so that Jest tests can mock it\n * (import.meta is a syntax-level construct that CJS/Jest cannot parse).\n */\nexport function getViteEnv(key: string): string | undefined {\n const env = import.meta.env as unknown as Record<string, string> | undefined;\n return env?.[key];\n}\n","import type { FluidSDKConfig } from \"../types/config\";\nimport { getViteEnv } from \"./env\";\n\n/**\n * Creates a FluidSDKConfig with sensible defaults.\n *\n * Default behavior:\n * - baseUrl: reads from `VITE_API_URL` env var, falls back to `\"\"` (same-origin relative)\n * - Auth: relies on session cookies sent via `credentials: 'include'`\n *\n * Pass overrides to customize any field:\n * ```ts\n * const config = createDefaultFluidConfig({ baseUrl: \"https://my-api.example.com\" });\n * ```\n */\nexport function createDefaultFluidConfig(\n overrides?: Partial<FluidSDKConfig>,\n): FluidSDKConfig {\n return {\n baseUrl: getViteEnv(\"VITE_API_URL\") ?? \"\",\n smartyEmbeddedKey: getViteEnv(\"NEXT_PUBLIC_SMARTY_EMBEDDED_KEY\"),\n googleMapsApiKey: getViteEnv(\"NEXT_PUBLIC_GOOGLE_MAPS_API_KEY\"),\n ...overrides,\n };\n}\n","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 function mergeRegisteredWidgetsIntoRegistry(\n registry: SdkWidgetRegistry,\n registeredWidgets: readonly RuntimeRegistryWidget[],\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(\"runtime registration\", widget.type);\n return false;\n }\n\n if (duplicateRuntimeWidgetTypes.has(widget.type)) {\n warnDuplicateRuntimeWidgetType(widget.type);\n return false;\n }\n\n if (isExistingRegistryWidgetType(registry, widget.type)) {\n warnExistingRegistryWidgetCollision(widget.type);\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 warnBuiltInWidgetCollision(source: string, widgetType: string): void {\n console.warn(\n `[portal-sdk] Ignoring ${source} for built-in widget type \"${widgetType}\". ` +\n `Built-in widgets cannot be overridden.`,\n );\n}\n\nfunction warnDuplicateRuntimeWidgetType(widgetType: string): void {\n console.warn(\n `[portal-sdk] Ignoring runtime widget type \"${widgetType}\" because multiple packages registered the same SDK-facing type.`,\n );\n}\n\nfunction warnExistingRegistryWidgetCollision(widgetType: string): void {\n console.warn(\n `[portal-sdk] Ignoring runtime widget type \"${widgetType}\" because the SDK registry already contains that type.`,\n );\n}\n","export const DEFAULT_WIDGET_PACKAGE_MANIFEST_URL = \"/api/app/widget-packages\";\nexport const VITE_DEV_WIDGET_PACKAGE_MANIFEST_URL = \"/__widget-packages__\";\n\nconst VITE_DEV_MODULE_PATH_SEGMENTS = [\n \"/@fs/\",\n \"/src/\",\n \"/node_modules/.vite/\",\n \"/@id/\",\n] as const;\n\nexport interface DefaultWidgetPackageManifestUrlOptions {\n readonly isViteDev?: boolean;\n}\n\nexport function resolveDefaultWidgetPackageManifestUrl(\n moduleUrl: string | undefined,\n options: DefaultWidgetPackageManifestUrlOptions = {},\n): string | false {\n const parsedModuleUrl = parseModuleUrl(moduleUrl);\n if (!parsedModuleUrl) return false;\n\n if (options.isViteDev && isViteDevModulePath(parsedModuleUrl.pathname)) {\n return new URL(VITE_DEV_WIDGET_PACKAGE_MANIFEST_URL, parsedModuleUrl.origin)\n .href;\n }\n\n return DEFAULT_WIDGET_PACKAGE_MANIFEST_URL;\n}\n\nfunction parseModuleUrl(moduleUrl: string | undefined): URL | null {\n if (!moduleUrl) return null;\n\n try {\n return new URL(moduleUrl);\n } catch {\n return null;\n }\n}\n\nfunction isViteDevModulePath(pathname: string): boolean {\n return VITE_DEV_MODULE_PATH_SEGMENTS.some((segment) =>\n pathname.includes(segment),\n );\n}\n\nexport function getDefaultWidgetPackageManifestUrl(): string | false {\n return resolveDefaultWidgetPackageManifestUrl(import.meta.url, {\n isViteDev: isViteDevRuntime(),\n });\n}\n\nfunction isViteDevRuntime(): boolean {\n return (\n (import.meta.env as { readonly DEV?: boolean } | undefined)?.DEV === true\n );\n}\n","import * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport * as ReactJsxRuntime from \"react/jsx-runtime\";\nimport {\n createWidgetRuntimeLoader,\n ensureFluidWidgetsGlobal,\n installFluidWidgetRuntimeHostGlobals,\n validateWidgetPackageDescriptor,\n type GlobalRegisteredWidget,\n type RegisteredWidget,\n type WidgetPackageDescriptor as RuntimeWidgetPackageDescriptor,\n} from \"@fluid-app/widget-runtime\";\nimport {\n DEFAULT_MIN_SDK_VERSION,\n DEFAULT_WIDGET_CATEGORY,\n DEFAULT_WIDGET_ICON,\n SHARED_WIDGET_ARTIFACT_URL_PREFIX,\n hasControlCharacter,\n normalizeWidgetPackageType,\n normalizeWidgetRuntimeContainer,\n normalizeWidgetRuntimeResizable,\n readNonEmptyString,\n} from \"@fluid-app/widget-runtime/catalog\";\nimport type {\n WidgetDescriptor,\n WidgetPackageDescriptor,\n WidgetPackageType,\n WidgetRuntimeContainer,\n WidgetRuntimeResizable,\n} from \"../types/widget-package-descriptor\";\nimport { DEFAULT_WIDGET_PACKAGE_MANIFEST_URL } from \"./widget-package-manifest-url\";\n\nexport { DEFAULT_WIDGET_PACKAGE_MANIFEST_URL } from \"./widget-package-manifest-url\";\n\nconst WIDGET_PACKAGE_DESCRIPTOR_MANIFEST_VERSION =\n 1 satisfies WidgetPackageDescriptor[\"manifestVersion\"];\nconst WIDGET_PACKAGE_DESCRIPTOR_FETCH_TIMEOUT_MS = 5000;\n\nexport interface WidgetPackageLoadSummary {\n readonly registeredWidgets: readonly RegisteredWidget[];\n readonly hasFailures: boolean;\n}\n\nexport interface 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 function installAndReadFluidWidgetsRegistry(): readonly GlobalRegisteredWidget[] {\n if (typeof window === \"undefined\") return [];\n\n installFluidWidgetRuntimeHostGlobals({\n React,\n ReactDOM,\n ReactJsxRuntime,\n });\n\n return ensureFluidWidgetsGlobal().getRegisteredWidgets();\n}\n\nexport function subscribeToFluidWidgetsRegistry(\n listener: (registeredWidgets: readonly GlobalRegisteredWidget[]) => void,\n): () => void {\n if (typeof window === \"undefined\") return () => undefined;\n\n installFluidWidgetRuntimeHostGlobals({\n React,\n ReactDOM,\n ReactJsxRuntime,\n });\n\n const fluidWidgets = ensureFluidWidgetsGlobal();\n return fluidWidgets.subscribe(() => {\n listener(fluidWidgets.getRegisteredWidgets());\n });\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): 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 installAndReadFluidWidgetsRegistry();\n\n const loader = createWidgetRuntimeLoader();\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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"}
|