@fluid-app/portal-sdk 0.1.370 → 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/{FluidProvider-DG7duKf4.cjs → FluidProvider-C6d1TUVm.cjs} +8 -10
- package/dist/{FluidProvider-DG7duKf4.cjs.map → FluidProvider-C6d1TUVm.cjs.map} +1 -1
- package/dist/{FluidProvider-Bmmdax4d.mjs → FluidProvider-C80gc4Yi.mjs} +8 -10
- package/dist/{FluidProvider-Bmmdax4d.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-BY8IowR0.mjs → MessagingScreen-D3si8TPx.mjs} +6 -6
- package/dist/{MessagingScreen-CyxUDdcb.mjs → MessagingScreen-DKzYThAY.mjs} +2 -2
- package/dist/{MessagingScreen-CyxUDdcb.mjs.map → MessagingScreen-DKzYThAY.mjs.map} +1 -1
- package/dist/{MessagingScreen-ylXd2Um7.cjs → MessagingScreen-DqxRu2x3.cjs} +2 -2
- package/dist/{MessagingScreen-ylXd2Um7.cjs.map → MessagingScreen-DqxRu2x3.cjs.map} +1 -1
- package/dist/{MessagingScreen-BIJU7dWT.cjs → MessagingScreen-PZyO11S1.cjs} +6 -6
- package/dist/{OrdersScreen-DsTMrxlo.mjs → OrdersScreen-B2htbQ2Q.mjs} +2 -2
- package/dist/{OrdersScreen-DsTMrxlo.mjs.map → OrdersScreen-B2htbQ2Q.mjs.map} +1 -1
- package/dist/{OrdersScreen-1b2ZzMEg.cjs → OrdersScreen-BuX5aWgx.cjs} +6 -6
- package/dist/{OrdersScreen-BVRpsxMF.mjs → OrdersScreen-Cgjfo2Fs.mjs} +6 -6
- package/dist/{OrdersScreen-B-biRUNQ.cjs → OrdersScreen-CpNvxRDC.cjs} +2 -2
- package/dist/{OrdersScreen-B-biRUNQ.cjs.map → OrdersScreen-CpNvxRDC.cjs.map} +1 -1
- package/dist/{ProfileScreen-DvnWtXlF.mjs → ProfileScreen-BCwdwO_p.mjs} +3 -3
- package/dist/{ProfileScreen-DvnWtXlF.mjs.map → ProfileScreen-BCwdwO_p.mjs.map} +1 -1
- package/dist/{ProfileScreen-DzgGP3lr.mjs → ProfileScreen-D7UA604p.mjs} +7 -7
- package/dist/{ProfileScreen-DYe6Msda.cjs → ProfileScreen-DlIXDIeu.cjs} +3 -3
- package/dist/{ProfileScreen-DYe6Msda.cjs.map → ProfileScreen-DlIXDIeu.cjs.map} +1 -1
- package/dist/{ProfileScreen-Dsbr8wip.cjs → ProfileScreen-MypXufrO.cjs} +7 -7
- 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-DcgyX3Wk.cjs → ShopScreen-29SZwMWF.cjs} +2 -2
- package/dist/{ShopScreen-DcgyX3Wk.cjs.map → ShopScreen-29SZwMWF.cjs.map} +1 -1
- package/dist/{ShopScreen-nUFdeac6.cjs → ShopScreen-BC9NDysQ.cjs} +6 -6
- package/dist/{ShopScreen-Cy5cf6tn.mjs → ShopScreen-BKVNW6ya.mjs} +6 -6
- package/dist/{ShopScreen-DVYzIHJA.mjs → ShopScreen-CgN-6gic.mjs} +2 -2
- package/dist/{ShopScreen-DVYzIHJA.mjs.map → ShopScreen-CgN-6gic.mjs.map} +1 -1
- package/dist/{SubscriptionsScreen-BnRWR4Df.mjs → SubscriptionsScreen-CPiLzWhm.mjs} +7 -7
- package/dist/{SubscriptionsScreen-Dw68LWDh.cjs → SubscriptionsScreen-Dz6Y_1oD.cjs} +3 -3
- package/dist/{SubscriptionsScreen-Dw68LWDh.cjs.map → SubscriptionsScreen-Dz6Y_1oD.cjs.map} +1 -1
- package/dist/{SubscriptionsScreen-DqG_qHS_.mjs → SubscriptionsScreen-M2WaVHH7.mjs} +3 -3
- package/dist/{SubscriptionsScreen-DqG_qHS_.mjs.map → SubscriptionsScreen-M2WaVHH7.mjs.map} +1 -1
- package/dist/{SubscriptionsScreen-Day2TSrY.cjs → SubscriptionsScreen-dN42J-MR.cjs} +7 -7
- 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 +22 -24
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -8
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +3 -9
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +22 -24
- package/dist/index.mjs.map +1 -1
- package/dist/preview/preview-entry.cjs +6 -6
- package/dist/preview/preview-entry.d.cts +1 -1
- package/dist/preview/preview-entry.d.mts +1 -1
- package/dist/preview/preview-entry.mjs +6 -6
- package/dist/{use-portal-card-add-3ds-flow-hGLvDBZT.cjs → use-portal-card-add-3ds-flow-C0YUg213.cjs} +2 -2
- package/dist/{use-portal-card-add-3ds-flow-hGLvDBZT.cjs.map → use-portal-card-add-3ds-flow-C0YUg213.cjs.map} +1 -1
- package/dist/{use-portal-card-add-3ds-flow-FSWDlXtP.mjs → use-portal-card-add-3ds-flow-DKXraYw-.mjs} +2 -2
- package/dist/{use-portal-card-add-3ds-flow-FSWDlXtP.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/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-BGu5fWAU.cjs +0 -650
- package/dist/widget-package-utils-BGu5fWAU.cjs.map +0 -1
- package/dist/widget-package-utils-DzdFCK04.mjs +0 -582
- package/dist/widget-package-utils-DzdFCK04.mjs.map +0 -1
|
@@ -1,650 +0,0 @@
|
|
|
1
|
-
const require_chunk = require("./chunk-9hOWP6kD.cjs");
|
|
2
|
-
const require_FluidProvider = require("./FluidProvider-DG7duKf4.cjs");
|
|
3
|
-
let react = require("react");
|
|
4
|
-
react = require_chunk.__toESM(react);
|
|
5
|
-
let react_jsx_runtime = require("react/jsx-runtime");
|
|
6
|
-
react_jsx_runtime = require_chunk.__toESM(react_jsx_runtime);
|
|
7
|
-
let react_dom = require("react-dom");
|
|
8
|
-
react_dom = require_chunk.__toESM(react_dom);
|
|
9
|
-
let _fluid_app_widget_runtime = require("@fluid-app/widget-runtime");
|
|
10
|
-
let _fluid_app_widget_runtime_catalog = require("@fluid-app/widget-runtime/catalog");
|
|
11
|
-
//#region src/config/env.ts
|
|
12
|
-
/**
|
|
13
|
-
* Read Vite environment variables at runtime.
|
|
14
|
-
*
|
|
15
|
-
* Isolated into its own module so that Jest tests can mock it
|
|
16
|
-
* (import.meta is a syntax-level construct that CJS/Jest cannot parse).
|
|
17
|
-
*/
|
|
18
|
-
function getViteEnv(key) {
|
|
19
|
-
return {}.env?.[key];
|
|
20
|
-
}
|
|
21
|
-
//#endregion
|
|
22
|
-
//#region src/config/defaults.ts
|
|
23
|
-
/**
|
|
24
|
-
* Creates a FluidSDKConfig with sensible defaults.
|
|
25
|
-
*
|
|
26
|
-
* Default behavior:
|
|
27
|
-
* - baseUrl: reads from `VITE_API_URL` env var, falls back to `""` (same-origin relative)
|
|
28
|
-
* - Auth: relies on session cookies sent via `credentials: 'include'`
|
|
29
|
-
*
|
|
30
|
-
* Pass overrides to customize any field:
|
|
31
|
-
* ```ts
|
|
32
|
-
* const config = createDefaultFluidConfig({ baseUrl: "https://my-api.example.com" });
|
|
33
|
-
* ```
|
|
34
|
-
*/
|
|
35
|
-
function createDefaultFluidConfig(overrides) {
|
|
36
|
-
return {
|
|
37
|
-
baseUrl: getViteEnv("VITE_API_URL") ?? "",
|
|
38
|
-
smartyEmbeddedKey: getViteEnv("NEXT_PUBLIC_SMARTY_EMBEDDED_KEY"),
|
|
39
|
-
googleMapsApiKey: getViteEnv("NEXT_PUBLIC_GOOGLE_MAPS_API_KEY"),
|
|
40
|
-
...overrides
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
//#endregion
|
|
44
|
-
//#region src/utils/build-widget-registry.ts
|
|
45
|
-
function buildWidgetRegistry(manifests) {
|
|
46
|
-
if (manifests.length === 0) return require_FluidProvider.DEFAULT_SDK_WIDGET_REGISTRY;
|
|
47
|
-
const customEntries = Object.fromEntries(manifests.filter((manifest) => {
|
|
48
|
-
const isBuiltIn = isBuiltInWidgetType(manifest.type);
|
|
49
|
-
if (isBuiltIn) warnBuiltInWidgetCollision("manifest", manifest.type);
|
|
50
|
-
return !isBuiltIn;
|
|
51
|
-
}).map((manifest) => [manifest.type, manifest.component]));
|
|
52
|
-
return {
|
|
53
|
-
...require_FluidProvider.DEFAULT_SDK_WIDGET_REGISTRY,
|
|
54
|
-
...customEntries
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
function mergeRegisteredWidgetsIntoRegistry(registry, registeredWidgets) {
|
|
58
|
-
if (registeredWidgets.length === 0) return registry;
|
|
59
|
-
const duplicateRuntimeWidgetTypes = getDuplicateWidgetTypes(registeredWidgets);
|
|
60
|
-
const remoteEntries = Object.fromEntries(registeredWidgets.filter((widget) => {
|
|
61
|
-
if (isBuiltInWidgetType(widget.type)) {
|
|
62
|
-
warnBuiltInWidgetCollision("runtime registration", widget.type);
|
|
63
|
-
return false;
|
|
64
|
-
}
|
|
65
|
-
if (duplicateRuntimeWidgetTypes.has(widget.type)) {
|
|
66
|
-
warnDuplicateRuntimeWidgetType(widget.type);
|
|
67
|
-
return false;
|
|
68
|
-
}
|
|
69
|
-
if (isExistingRegistryWidgetType(registry, widget.type)) {
|
|
70
|
-
warnExistingRegistryWidgetCollision(widget.type);
|
|
71
|
-
return false;
|
|
72
|
-
}
|
|
73
|
-
return true;
|
|
74
|
-
}).map((widget) => [widget.type, wrapRuntimeWidgetComponent(widget)]));
|
|
75
|
-
return {
|
|
76
|
-
...registry,
|
|
77
|
-
...remoteEntries
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
function getDuplicateWidgetTypes(widgets) {
|
|
81
|
-
const counts = /* @__PURE__ */ new Map();
|
|
82
|
-
for (const widget of widgets) counts.set(widget.type, (counts.get(widget.type) ?? 0) + 1);
|
|
83
|
-
return new Set(Array.from(counts.entries()).filter(([, count]) => count > 1).map(([type]) => type));
|
|
84
|
-
}
|
|
85
|
-
function wrapRuntimeWidgetComponent(widget) {
|
|
86
|
-
const RuntimeWidgetComponent = widget.component;
|
|
87
|
-
function RuntimeWidgetWithBoundary(props) {
|
|
88
|
-
return (0, react.createElement)(_fluid_app_widget_runtime.WidgetRuntimeErrorBoundary, null, (0, react.createElement)(RuntimeWidgetComponent, props));
|
|
89
|
-
}
|
|
90
|
-
RuntimeWidgetWithBoundary.displayName = `WidgetRuntimeErrorBoundary(${widget.type})`;
|
|
91
|
-
return RuntimeWidgetWithBoundary;
|
|
92
|
-
}
|
|
93
|
-
function isBuiltInWidgetType(widgetType) {
|
|
94
|
-
return Object.prototype.hasOwnProperty.call(require_FluidProvider.DEFAULT_SDK_WIDGET_REGISTRY, widgetType);
|
|
95
|
-
}
|
|
96
|
-
function isExistingRegistryWidgetType(registry, widgetType) {
|
|
97
|
-
return Object.prototype.hasOwnProperty.call(registry, widgetType);
|
|
98
|
-
}
|
|
99
|
-
function warnBuiltInWidgetCollision(source, widgetType) {
|
|
100
|
-
console.warn(`[portal-sdk] Ignoring ${source} for built-in widget type "${widgetType}". Built-in widgets cannot be overridden.`);
|
|
101
|
-
}
|
|
102
|
-
function warnDuplicateRuntimeWidgetType(widgetType) {
|
|
103
|
-
console.warn(`[portal-sdk] Ignoring runtime widget type "${widgetType}" because multiple packages registered the same SDK-facing type.`);
|
|
104
|
-
}
|
|
105
|
-
function warnExistingRegistryWidgetCollision(widgetType) {
|
|
106
|
-
console.warn(`[portal-sdk] Ignoring runtime widget type "${widgetType}" because the SDK registry already contains that type.`);
|
|
107
|
-
}
|
|
108
|
-
//#endregion
|
|
109
|
-
//#region src/utils/widget-package-manifest-url.ts
|
|
110
|
-
const DEFAULT_WIDGET_PACKAGE_MANIFEST_URL = "/api/app/widget-packages";
|
|
111
|
-
const VITE_DEV_WIDGET_PACKAGE_MANIFEST_URL = "/__widget-packages__";
|
|
112
|
-
const VITE_DEV_MODULE_PATH_SEGMENTS = [
|
|
113
|
-
"/@fs/",
|
|
114
|
-
"/src/",
|
|
115
|
-
"/node_modules/.vite/",
|
|
116
|
-
"/@id/"
|
|
117
|
-
];
|
|
118
|
-
function resolveDefaultWidgetPackageManifestUrl(moduleUrl, options = {}) {
|
|
119
|
-
const parsedModuleUrl = parseModuleUrl(moduleUrl);
|
|
120
|
-
if (!parsedModuleUrl) return false;
|
|
121
|
-
if (options.isViteDev && isViteDevModulePath(parsedModuleUrl.pathname)) return new URL(VITE_DEV_WIDGET_PACKAGE_MANIFEST_URL, parsedModuleUrl.origin).href;
|
|
122
|
-
return DEFAULT_WIDGET_PACKAGE_MANIFEST_URL;
|
|
123
|
-
}
|
|
124
|
-
function parseModuleUrl(moduleUrl) {
|
|
125
|
-
if (!moduleUrl) return null;
|
|
126
|
-
try {
|
|
127
|
-
return new URL(moduleUrl);
|
|
128
|
-
} catch {
|
|
129
|
-
return null;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
function isViteDevModulePath(pathname) {
|
|
133
|
-
return VITE_DEV_MODULE_PATH_SEGMENTS.some((segment) => pathname.includes(segment));
|
|
134
|
-
}
|
|
135
|
-
function getDefaultWidgetPackageManifestUrl() {
|
|
136
|
-
return resolveDefaultWidgetPackageManifestUrl(require("url").pathToFileURL(__filename).href, { isViteDev: isViteDevRuntime() });
|
|
137
|
-
}
|
|
138
|
-
function isViteDevRuntime() {
|
|
139
|
-
return {}.env?.DEV === true;
|
|
140
|
-
}
|
|
141
|
-
//#endregion
|
|
142
|
-
//#region src/utils/load-widget-packages.ts
|
|
143
|
-
const WIDGET_PACKAGE_DESCRIPTOR_MANIFEST_VERSION = 1;
|
|
144
|
-
const WIDGET_PACKAGE_DESCRIPTOR_FETCH_TIMEOUT_MS = 5e3;
|
|
145
|
-
function installAndReadFluidWidgetsRegistry() {
|
|
146
|
-
if (typeof window === "undefined") return [];
|
|
147
|
-
(0, _fluid_app_widget_runtime.installFluidWidgetRuntimeHostGlobals)({
|
|
148
|
-
React: react,
|
|
149
|
-
ReactDOM: react_dom,
|
|
150
|
-
ReactJsxRuntime: react_jsx_runtime
|
|
151
|
-
});
|
|
152
|
-
return (0, _fluid_app_widget_runtime.ensureFluidWidgetsGlobal)().getRegisteredWidgets();
|
|
153
|
-
}
|
|
154
|
-
function subscribeToFluidWidgetsRegistry(listener) {
|
|
155
|
-
if (typeof window === "undefined") return () => void 0;
|
|
156
|
-
(0, _fluid_app_widget_runtime.installFluidWidgetRuntimeHostGlobals)({
|
|
157
|
-
React: react,
|
|
158
|
-
ReactDOM: react_dom,
|
|
159
|
-
ReactJsxRuntime: react_jsx_runtime
|
|
160
|
-
});
|
|
161
|
-
const fluidWidgets = (0, _fluid_app_widget_runtime.ensureFluidWidgetsGlobal)();
|
|
162
|
-
return fluidWidgets.subscribe(() => {
|
|
163
|
-
listener(fluidWidgets.getRegisteredWidgets());
|
|
164
|
-
});
|
|
165
|
-
}
|
|
166
|
-
async function fetchWidgetPackageDescriptors(descriptorEndpointUrl = DEFAULT_WIDGET_PACKAGE_MANIFEST_URL, options = {}) {
|
|
167
|
-
const abortSignal = createTimeoutAbortSignal(WIDGET_PACKAGE_DESCRIPTOR_FETCH_TIMEOUT_MS);
|
|
168
|
-
try {
|
|
169
|
-
const response = await fetch(descriptorEndpointUrl, {
|
|
170
|
-
credentials: options.credentials ?? "same-origin",
|
|
171
|
-
signal: abortSignal.signal
|
|
172
|
-
});
|
|
173
|
-
if (!response.ok) throw new Error(`[portal] Failed to fetch widget package descriptors from ${descriptorEndpointUrl}: ${response.status} ${response.statusText}`);
|
|
174
|
-
return parseWidgetPackageDescriptorResponse(await response.json(), descriptorEndpointUrl, options);
|
|
175
|
-
} finally {
|
|
176
|
-
abortSignal.cleanup();
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
function parseWidgetPackageDescriptorResponse(data, descriptorEndpointUrl = DEFAULT_WIDGET_PACKAGE_MANIFEST_URL, options = {}) {
|
|
180
|
-
const descriptorEndpointBaseUrl = normalizeDescriptorEndpointUrl(descriptorEndpointUrl);
|
|
181
|
-
if (!descriptorEndpointBaseUrl) return [];
|
|
182
|
-
const entries = getWidgetPackageDescriptorEntries(data);
|
|
183
|
-
if (!entries) return [];
|
|
184
|
-
const assetOriginPolicy = createRuntimeAssetOriginPolicy(descriptorEndpointBaseUrl, options.allowedOrigins ?? [], options.trustCatalogAssetOrigins === true);
|
|
185
|
-
const descriptors = [];
|
|
186
|
-
for (const entry of entries) {
|
|
187
|
-
const descriptor = normalizeWidgetPackageDescriptor(entry, descriptorEndpointBaseUrl, assetOriginPolicy);
|
|
188
|
-
if (descriptor) descriptors.push(descriptor);
|
|
189
|
-
}
|
|
190
|
-
return descriptors;
|
|
191
|
-
}
|
|
192
|
-
async function loadWidgetPackages(widgetPackages) {
|
|
193
|
-
if (widgetPackages.length === 0) return {
|
|
194
|
-
registeredWidgets: [],
|
|
195
|
-
hasFailures: false
|
|
196
|
-
};
|
|
197
|
-
installAndReadFluidWidgetsRegistry();
|
|
198
|
-
const loader = (0, _fluid_app_widget_runtime.createWidgetRuntimeLoader)();
|
|
199
|
-
const runtimeWidgetPackages = widgetPackages;
|
|
200
|
-
const results = await loader.loadPackages(runtimeWidgetPackages);
|
|
201
|
-
let hasFailures = false;
|
|
202
|
-
for (const result of results) if (!result.ok) {
|
|
203
|
-
hasFailures = true;
|
|
204
|
-
console.error(`[portal] Failed to load widget package ${result.packageId}@${result.version}:`, result.error);
|
|
205
|
-
}
|
|
206
|
-
return {
|
|
207
|
-
registeredWidgets: loader.getRegisteredWidgets(),
|
|
208
|
-
hasFailures
|
|
209
|
-
};
|
|
210
|
-
}
|
|
211
|
-
function createTimeoutAbortSignal(timeoutMs) {
|
|
212
|
-
if (typeof AbortSignal.timeout === "function") return {
|
|
213
|
-
signal: AbortSignal.timeout(timeoutMs),
|
|
214
|
-
cleanup: () => void 0
|
|
215
|
-
};
|
|
216
|
-
const controller = new AbortController();
|
|
217
|
-
const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
|
|
218
|
-
return {
|
|
219
|
-
signal: controller.signal,
|
|
220
|
-
cleanup: () => clearTimeout(timeoutId)
|
|
221
|
-
};
|
|
222
|
-
}
|
|
223
|
-
function getWidgetPackageDescriptorEntries(data) {
|
|
224
|
-
if (Array.isArray(data)) return data;
|
|
225
|
-
if (!isRecord(data)) return null;
|
|
226
|
-
const wrappedEntries = getArrayProperty(data, "packages") ?? getArrayProperty(data, "packageDescriptors") ?? getArrayProperty(data, "widgetPackages");
|
|
227
|
-
if (wrappedEntries) return wrappedEntries;
|
|
228
|
-
return looksLikeWidgetPackageEntry(data) ? [data] : null;
|
|
229
|
-
}
|
|
230
|
-
function normalizeWidgetPackageDescriptor(entry, descriptorEndpointUrl, assetOriginPolicy) {
|
|
231
|
-
const candidate = createWidgetPackageDescriptorCandidate(entry);
|
|
232
|
-
if (candidate.kind === "skipped") return null;
|
|
233
|
-
if (candidate.kind === "invalid") {
|
|
234
|
-
warnRejectedMalformedWidgetPackageEntry(entry, candidate.reason, descriptorEndpointUrl);
|
|
235
|
-
return null;
|
|
236
|
-
}
|
|
237
|
-
const remoteEntryUrl = normalizeRuntimeAssetUrl(candidate.descriptor.remoteEntryUrl, descriptorEndpointUrl, assetOriginPolicy);
|
|
238
|
-
if (!remoteEntryUrl.ok) {
|
|
239
|
-
warnRejectedWidgetPackageDescriptor(candidate.descriptor, "remoteEntryUrl", remoteEntryUrl.failure, descriptorEndpointUrl);
|
|
240
|
-
return null;
|
|
241
|
-
}
|
|
242
|
-
const cssUrls = [];
|
|
243
|
-
for (const cssUrl of candidate.descriptor.cssUrls) {
|
|
244
|
-
const normalizedCssUrl = normalizeRuntimeAssetUrl(cssUrl, descriptorEndpointUrl, assetOriginPolicy);
|
|
245
|
-
if (!normalizedCssUrl.ok) {
|
|
246
|
-
warnRejectedWidgetPackageDescriptor(candidate.descriptor, "cssUrls", normalizedCssUrl.failure, descriptorEndpointUrl);
|
|
247
|
-
return null;
|
|
248
|
-
}
|
|
249
|
-
cssUrls.push(normalizedCssUrl.url);
|
|
250
|
-
}
|
|
251
|
-
const descriptor = {
|
|
252
|
-
...candidate.descriptor,
|
|
253
|
-
remoteEntryUrl: remoteEntryUrl.url,
|
|
254
|
-
cssUrls
|
|
255
|
-
};
|
|
256
|
-
const validationError = validateDescriptorCandidate(descriptor);
|
|
257
|
-
if (validationError) {
|
|
258
|
-
warnRejectedMalformedWidgetPackageEntry(entry, validationError, descriptorEndpointUrl);
|
|
259
|
-
return null;
|
|
260
|
-
}
|
|
261
|
-
return descriptor;
|
|
262
|
-
}
|
|
263
|
-
function createWidgetPackageDescriptorCandidate(entry) {
|
|
264
|
-
if (!isRecord(entry)) return {
|
|
265
|
-
kind: "invalid",
|
|
266
|
-
reason: "entry must be an object"
|
|
267
|
-
};
|
|
268
|
-
const manifest = isRecord(entry.manifest) ? entry.manifest : void 0;
|
|
269
|
-
if (entry.disabled === true || entry.enabled === false) return { kind: "skipped" };
|
|
270
|
-
if (isRuntimeWidgetPackageDescriptorAttempt(entry)) return createStrictRuntimeWidgetPackageDescriptorCandidate(entry);
|
|
271
|
-
if (isCatalogWidgetPackageEntry(entry, manifest)) return createCatalogWidgetPackageDescriptorCandidate(entry, manifest);
|
|
272
|
-
return createRuntimeWidgetPackageDescriptorCandidate(entry, manifest);
|
|
273
|
-
}
|
|
274
|
-
function createStrictRuntimeWidgetPackageDescriptorCandidate(entry) {
|
|
275
|
-
return createDescriptorCandidate({
|
|
276
|
-
manifestVersion: normalizeManifestVersion(entry.manifestVersion, { defaultWhenMissing: false }),
|
|
277
|
-
packageId: (0, _fluid_app_widget_runtime_catalog.readNonEmptyString)(entry.packageId),
|
|
278
|
-
packageType: (0, _fluid_app_widget_runtime_catalog.normalizeWidgetPackageType)(entry.packageType),
|
|
279
|
-
version: (0, _fluid_app_widget_runtime_catalog.readNonEmptyString)(entry.version),
|
|
280
|
-
remoteEntryUrl: (0, _fluid_app_widget_runtime_catalog.readNonEmptyString)(entry.remoteEntryUrl),
|
|
281
|
-
cssUrls: normalizeRuntimeCssUrls(entry.cssUrls),
|
|
282
|
-
widgets: normalizeRuntimeWidgets(entry.widgets),
|
|
283
|
-
packageTypeError: "packageType must be one of fluid, company, droplet, partner, or internal",
|
|
284
|
-
widgetsError: "manifest.widgets/widgets must be a non-empty array"
|
|
285
|
-
});
|
|
286
|
-
}
|
|
287
|
-
function createRuntimeWidgetPackageDescriptorCandidate(entry, manifest) {
|
|
288
|
-
const packageId = (0, _fluid_app_widget_runtime_catalog.readNonEmptyString)(entry.packageId) ?? (0, _fluid_app_widget_runtime_catalog.readNonEmptyString)(manifest?.packageId);
|
|
289
|
-
const version = (0, _fluid_app_widget_runtime_catalog.readNonEmptyString)(entry.version) ?? (0, _fluid_app_widget_runtime_catalog.readNonEmptyString)(manifest?.version);
|
|
290
|
-
const remoteEntryUrl = (0, _fluid_app_widget_runtime_catalog.readNonEmptyString)(entry.remoteEntryUrl) ?? (0, _fluid_app_widget_runtime_catalog.readNonEmptyString)(manifest?.remoteEntryUrl);
|
|
291
|
-
const packageType = (0, _fluid_app_widget_runtime_catalog.normalizeWidgetPackageType)(entry.packageType) ?? (0, _fluid_app_widget_runtime_catalog.normalizeWidgetPackageType)(manifest?.packageType);
|
|
292
|
-
return createDescriptorCandidate({
|
|
293
|
-
manifestVersion: normalizeManifestVersion(entry.manifestVersion ?? manifest?.manifestVersion, { defaultWhenMissing: false }),
|
|
294
|
-
packageId,
|
|
295
|
-
packageType,
|
|
296
|
-
version,
|
|
297
|
-
remoteEntryUrl,
|
|
298
|
-
cssUrls: normalizeRuntimeCssUrls(entry.cssUrls ?? manifest?.cssUrls),
|
|
299
|
-
widgets: normalizeRuntimeWidgets(manifest?.widgets ?? entry.widgets),
|
|
300
|
-
packageTypeError: "packageType must be one of fluid, company, droplet, partner, or internal",
|
|
301
|
-
widgetsError: "manifest.widgets/widgets must be a non-empty array"
|
|
302
|
-
});
|
|
303
|
-
}
|
|
304
|
-
function createCatalogWidgetPackageDescriptorCandidate(entry, manifest) {
|
|
305
|
-
const packageId = (0, _fluid_app_widget_runtime_catalog.readNonEmptyString)(entry.packageId) ?? (0, _fluid_app_widget_runtime_catalog.readNonEmptyString)(manifest?.packageId);
|
|
306
|
-
const version = (0, _fluid_app_widget_runtime_catalog.readNonEmptyString)(entry.version) ?? (0, _fluid_app_widget_runtime_catalog.readNonEmptyString)(manifest?.version);
|
|
307
|
-
const remoteEntryUrl = (0, _fluid_app_widget_runtime_catalog.readNonEmptyString)(entry.scriptUrl) ?? (0, _fluid_app_widget_runtime_catalog.readNonEmptyString)(entry.remoteEntryUrl) ?? (0, _fluid_app_widget_runtime_catalog.readNonEmptyString)(manifest?.scriptUrl) ?? (0, _fluid_app_widget_runtime_catalog.readNonEmptyString)(manifest?.remoteEntryUrl);
|
|
308
|
-
const packageType = (0, _fluid_app_widget_runtime_catalog.normalizeWidgetPackageType)(entry.source) ?? (0, _fluid_app_widget_runtime_catalog.normalizeWidgetPackageType)(entry.packageType) ?? (0, _fluid_app_widget_runtime_catalog.normalizeWidgetPackageType)(manifest?.source) ?? (0, _fluid_app_widget_runtime_catalog.normalizeWidgetPackageType)(manifest?.packageType) ?? "company";
|
|
309
|
-
const manifestVersion = normalizeManifestVersion(entry.manifestVersion ?? manifest?.manifestVersion, { defaultWhenMissing: true });
|
|
310
|
-
const cssUrls = normalizeCssUrls(entry.cssUrls ?? manifest?.cssUrls);
|
|
311
|
-
const rawWidgets = manifest?.widgets ?? entry.widgets;
|
|
312
|
-
return createDescriptorCandidate({
|
|
313
|
-
manifestVersion,
|
|
314
|
-
packageId,
|
|
315
|
-
packageType,
|
|
316
|
-
version,
|
|
317
|
-
remoteEntryUrl,
|
|
318
|
-
cssUrls,
|
|
319
|
-
widgets: Array.isArray(rawWidgets) ? normalizeCatalogWidgets(rawWidgets, packageId) : null,
|
|
320
|
-
packageTypeError: "packageType/source must be one of fluid, company, droplet, partner, internal, or omitted for company catalog packages",
|
|
321
|
-
widgetsError: "manifest.widgets/widgets must contain at least one valid widget"
|
|
322
|
-
});
|
|
323
|
-
}
|
|
324
|
-
function createDescriptorCandidate(fields) {
|
|
325
|
-
if (!fields.manifestVersion) return {
|
|
326
|
-
kind: "invalid",
|
|
327
|
-
reason: "unsupported manifestVersion"
|
|
328
|
-
};
|
|
329
|
-
if (!fields.packageId) return {
|
|
330
|
-
kind: "invalid",
|
|
331
|
-
reason: "packageId must be a non-empty string"
|
|
332
|
-
};
|
|
333
|
-
if (!fields.version) return {
|
|
334
|
-
kind: "invalid",
|
|
335
|
-
reason: "version must be a non-empty string"
|
|
336
|
-
};
|
|
337
|
-
if (!fields.packageType) return {
|
|
338
|
-
kind: "invalid",
|
|
339
|
-
reason: fields.packageTypeError
|
|
340
|
-
};
|
|
341
|
-
if (!fields.remoteEntryUrl) return {
|
|
342
|
-
kind: "invalid",
|
|
343
|
-
reason: "remoteEntryUrl/scriptUrl must be a non-empty string"
|
|
344
|
-
};
|
|
345
|
-
if (!fields.cssUrls) return {
|
|
346
|
-
kind: "invalid",
|
|
347
|
-
reason: "cssUrls must be an array of strings"
|
|
348
|
-
};
|
|
349
|
-
if (!fields.widgets || fields.widgets.length === 0) return {
|
|
350
|
-
kind: "invalid",
|
|
351
|
-
reason: fields.widgetsError
|
|
352
|
-
};
|
|
353
|
-
return {
|
|
354
|
-
kind: "valid",
|
|
355
|
-
descriptor: {
|
|
356
|
-
manifestVersion: fields.manifestVersion,
|
|
357
|
-
packageId: fields.packageId,
|
|
358
|
-
packageType: fields.packageType,
|
|
359
|
-
version: fields.version,
|
|
360
|
-
remoteEntryUrl: fields.remoteEntryUrl,
|
|
361
|
-
cssUrls: fields.cssUrls,
|
|
362
|
-
widgets: fields.widgets
|
|
363
|
-
}
|
|
364
|
-
};
|
|
365
|
-
}
|
|
366
|
-
function validateDescriptorCandidate(descriptor) {
|
|
367
|
-
try {
|
|
368
|
-
(0, _fluid_app_widget_runtime.validateWidgetPackageDescriptor)(descriptor);
|
|
369
|
-
return null;
|
|
370
|
-
} catch (error) {
|
|
371
|
-
return error instanceof Error ? error.message : String(error);
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
function isRuntimeWidgetPackageDescriptorAttempt(entry) {
|
|
375
|
-
return entry.manifestVersion !== void 0 && entry.packageId !== void 0 && entry.packageType !== void 0 && entry.version !== void 0 && entry.remoteEntryUrl !== void 0 && entry.cssUrls !== void 0 && entry.widgets !== void 0;
|
|
376
|
-
}
|
|
377
|
-
function isCatalogWidgetPackageEntry(entry, manifest) {
|
|
378
|
-
return entry.source !== void 0 || entry.scriptUrl !== void 0 || entry.manifestUrl !== void 0 || manifest?.source !== void 0 || manifest?.scriptUrl !== void 0 || manifest?.manifestUrl !== void 0 || manifest?.widgets !== void 0;
|
|
379
|
-
}
|
|
380
|
-
function normalizeManifestVersion(value, options) {
|
|
381
|
-
if (value === WIDGET_PACKAGE_DESCRIPTOR_MANIFEST_VERSION) return WIDGET_PACKAGE_DESCRIPTOR_MANIFEST_VERSION;
|
|
382
|
-
if (value === void 0 && options.defaultWhenMissing) return WIDGET_PACKAGE_DESCRIPTOR_MANIFEST_VERSION;
|
|
383
|
-
return null;
|
|
384
|
-
}
|
|
385
|
-
function normalizeCssUrls(value) {
|
|
386
|
-
return normalizeCssUrlList(value, { undefinedValue: [] });
|
|
387
|
-
}
|
|
388
|
-
function normalizeRuntimeCssUrls(value) {
|
|
389
|
-
return normalizeCssUrlList(value, { undefinedValue: null });
|
|
390
|
-
}
|
|
391
|
-
function normalizeCssUrlList(value, options) {
|
|
392
|
-
if (value === void 0) return options.undefinedValue;
|
|
393
|
-
if (!Array.isArray(value)) return null;
|
|
394
|
-
const cssUrls = [];
|
|
395
|
-
for (const cssUrl of value) {
|
|
396
|
-
const normalizedCssUrl = (0, _fluid_app_widget_runtime_catalog.readNonEmptyString)(cssUrl);
|
|
397
|
-
if (!normalizedCssUrl) return null;
|
|
398
|
-
cssUrls.push(normalizedCssUrl);
|
|
399
|
-
}
|
|
400
|
-
return cssUrls;
|
|
401
|
-
}
|
|
402
|
-
function normalizeRuntimeWidgets(value) {
|
|
403
|
-
if (!Array.isArray(value)) return null;
|
|
404
|
-
return value;
|
|
405
|
-
}
|
|
406
|
-
function normalizeCatalogWidgets(value, packageId) {
|
|
407
|
-
const widgets = [];
|
|
408
|
-
value.forEach((widget, index) => {
|
|
409
|
-
const normalizedWidget = normalizeWidgetDescriptor(widget, {
|
|
410
|
-
fallbackType: packageId === void 0 ? void 0 : `${packageId}-widget-${index + 1}`,
|
|
411
|
-
overwritePropertySchemaWidgetType: true
|
|
412
|
-
});
|
|
413
|
-
if (normalizedWidget) widgets.push(normalizedWidget);
|
|
414
|
-
});
|
|
415
|
-
return widgets;
|
|
416
|
-
}
|
|
417
|
-
function normalizeWidgetDescriptor(widget, options = {}) {
|
|
418
|
-
if (!isRecord(widget)) return null;
|
|
419
|
-
const type = (0, _fluid_app_widget_runtime_catalog.readNonEmptyString)(widget.type) ?? (0, _fluid_app_widget_runtime_catalog.readNonEmptyString)(widget.name) ?? options.fallbackType;
|
|
420
|
-
if (!type) return null;
|
|
421
|
-
const name = (0, _fluid_app_widget_runtime_catalog.readNonEmptyString)(widget.name) ?? type;
|
|
422
|
-
const displayName = (0, _fluid_app_widget_runtime_catalog.readNonEmptyString)(widget.displayName) ?? name;
|
|
423
|
-
return {
|
|
424
|
-
type,
|
|
425
|
-
name,
|
|
426
|
-
displayName,
|
|
427
|
-
description: (0, _fluid_app_widget_runtime_catalog.readNonEmptyString)(widget.description) ?? `Custom widget ${displayName}`,
|
|
428
|
-
icon: (0, _fluid_app_widget_runtime_catalog.readNonEmptyString)(widget.icon) ?? _fluid_app_widget_runtime_catalog.DEFAULT_WIDGET_ICON,
|
|
429
|
-
category: (0, _fluid_app_widget_runtime_catalog.readNonEmptyString)(widget.category) ?? _fluid_app_widget_runtime_catalog.DEFAULT_WIDGET_CATEGORY,
|
|
430
|
-
propertySchema: normalizePropertySchema(widget.propertySchema, type, { overwriteWidgetType: options.overwritePropertySchemaWidgetType === true }),
|
|
431
|
-
defaultProps: isRecord(widget.defaultProps) ? widget.defaultProps : {},
|
|
432
|
-
container: normalizeContainer(widget.container),
|
|
433
|
-
minSdkVersion: (0, _fluid_app_widget_runtime_catalog.readNonEmptyString)(widget.minSdkVersion) ?? _fluid_app_widget_runtime_catalog.DEFAULT_MIN_SDK_VERSION,
|
|
434
|
-
resizable: normalizeResizable(widget.resizable)
|
|
435
|
-
};
|
|
436
|
-
}
|
|
437
|
-
function normalizePropertySchema(value, widgetType, options = { overwriteWidgetType: false }) {
|
|
438
|
-
if (!isRecord(value)) return { widgetType };
|
|
439
|
-
if (options.overwriteWidgetType || value.widgetType === void 0) return {
|
|
440
|
-
...value,
|
|
441
|
-
widgetType
|
|
442
|
-
};
|
|
443
|
-
return value;
|
|
444
|
-
}
|
|
445
|
-
function normalizeContainer(value) {
|
|
446
|
-
return (0, _fluid_app_widget_runtime_catalog.normalizeWidgetRuntimeContainer)(value);
|
|
447
|
-
}
|
|
448
|
-
function normalizeResizable(value) {
|
|
449
|
-
return (0, _fluid_app_widget_runtime_catalog.normalizeWidgetRuntimeResizable)(value);
|
|
450
|
-
}
|
|
451
|
-
function normalizeRuntimeAssetUrl(url, baseUrl, assetOriginPolicy) {
|
|
452
|
-
if (hasUnsafeRawRuntimeAssetUrlSyntax(url)) return {
|
|
453
|
-
ok: false,
|
|
454
|
-
failure: {
|
|
455
|
-
inputUrl: url,
|
|
456
|
-
reason: "invalid-url"
|
|
457
|
-
}
|
|
458
|
-
};
|
|
459
|
-
try {
|
|
460
|
-
const parsedUrl = new URL(url, baseUrl);
|
|
461
|
-
if (parsedUrl.protocol !== "http:" && parsedUrl.protocol !== "https:") return {
|
|
462
|
-
ok: false,
|
|
463
|
-
failure: {
|
|
464
|
-
inputUrl: url,
|
|
465
|
-
resolvedUrl: parsedUrl.href,
|
|
466
|
-
reason: "unsupported-protocol"
|
|
467
|
-
}
|
|
468
|
-
};
|
|
469
|
-
if (assetOriginPolicy.allowedOrigins.has(parsedUrl.origin)) return {
|
|
470
|
-
ok: true,
|
|
471
|
-
url: parsedUrl.href
|
|
472
|
-
};
|
|
473
|
-
if (assetOriginPolicy.allowSharedWidgetArtifactBucket && parsedUrl.href.startsWith(_fluid_app_widget_runtime_catalog.SHARED_WIDGET_ARTIFACT_URL_PREFIX)) return {
|
|
474
|
-
ok: true,
|
|
475
|
-
url: parsedUrl.href
|
|
476
|
-
};
|
|
477
|
-
return {
|
|
478
|
-
ok: false,
|
|
479
|
-
failure: {
|
|
480
|
-
inputUrl: url,
|
|
481
|
-
resolvedUrl: parsedUrl.href,
|
|
482
|
-
reason: "untrusted-origin"
|
|
483
|
-
}
|
|
484
|
-
};
|
|
485
|
-
} catch {
|
|
486
|
-
return {
|
|
487
|
-
ok: false,
|
|
488
|
-
failure: {
|
|
489
|
-
inputUrl: url,
|
|
490
|
-
reason: "invalid-url"
|
|
491
|
-
}
|
|
492
|
-
};
|
|
493
|
-
}
|
|
494
|
-
}
|
|
495
|
-
function warnRejectedWidgetPackageDescriptor(descriptor, assetField, failure, descriptorEndpointUrl) {
|
|
496
|
-
console.warn(`[portal] Dropping widget package descriptor ${descriptor.packageId}@${descriptor.version} from ${descriptorEndpointUrl.href}: ${assetField} "${failure.inputUrl}" ${formatRuntimeAssetUrlFailure(failure)}.`);
|
|
497
|
-
}
|
|
498
|
-
function warnRejectedMalformedWidgetPackageEntry(entry, reason, descriptorEndpointUrl) {
|
|
499
|
-
console.warn(`[portal] Dropping widget package catalog entry ${formatWidgetPackageEntryIdentity(entry)} from ${descriptorEndpointUrl.href}: ${reason}.`);
|
|
500
|
-
}
|
|
501
|
-
function formatWidgetPackageEntryIdentity(entry) {
|
|
502
|
-
if (!isRecord(entry)) return "<unknown>";
|
|
503
|
-
const packageId = (0, _fluid_app_widget_runtime_catalog.readNonEmptyString)(entry.packageId);
|
|
504
|
-
const version = (0, _fluid_app_widget_runtime_catalog.readNonEmptyString)(entry.version);
|
|
505
|
-
if (packageId && version) return `${packageId}@${version}`;
|
|
506
|
-
if (packageId) return packageId;
|
|
507
|
-
return "<unknown>";
|
|
508
|
-
}
|
|
509
|
-
function formatRuntimeAssetUrlFailure(failure) {
|
|
510
|
-
const resolvedUrl = failure.resolvedUrl ? ` (resolved as ${failure.resolvedUrl})` : "";
|
|
511
|
-
switch (failure.reason) {
|
|
512
|
-
case "invalid-url": return "is not a valid URL";
|
|
513
|
-
case "unsupported-protocol": return `uses an unsupported protocol${resolvedUrl}`;
|
|
514
|
-
case "untrusted-origin": return `resolved to an untrusted origin${resolvedUrl}`;
|
|
515
|
-
}
|
|
516
|
-
}
|
|
517
|
-
function createRuntimeAssetOriginPolicy(descriptorEndpointUrl, allowedOrigins, trustCatalogAssetOrigins) {
|
|
518
|
-
const origins = /* @__PURE__ */ new Set();
|
|
519
|
-
if (!trustCatalogAssetOrigins) origins.add(descriptorEndpointUrl.origin);
|
|
520
|
-
for (const origin of allowedOrigins) {
|
|
521
|
-
const normalizedOrigin = normalizeAllowedOrigin(origin);
|
|
522
|
-
if (normalizedOrigin) origins.add(normalizedOrigin);
|
|
523
|
-
else console.warn(`[portal] Ignoring invalid widget package allowed origin "${origin}". Expected an http(s) absolute URL origin.`);
|
|
524
|
-
}
|
|
525
|
-
return {
|
|
526
|
-
allowSharedWidgetArtifactBucket: trustCatalogAssetOrigins,
|
|
527
|
-
allowedOrigins: origins
|
|
528
|
-
};
|
|
529
|
-
}
|
|
530
|
-
function hasUnsafeRawRuntimeAssetUrlSyntax(url) {
|
|
531
|
-
return url.trim() !== url || (0, _fluid_app_widget_runtime_catalog.hasControlCharacter)(url) || url.includes("\\") || url.startsWith("//") || hasAmbiguousHttpScheme(url);
|
|
532
|
-
}
|
|
533
|
-
function hasAmbiguousHttpScheme(url) {
|
|
534
|
-
return /^https?:(?!\/\/)/i.test(url);
|
|
535
|
-
}
|
|
536
|
-
function normalizeAllowedOrigin(origin) {
|
|
537
|
-
try {
|
|
538
|
-
const parsedOrigin = new URL(origin);
|
|
539
|
-
if (parsedOrigin.protocol !== "http:" && parsedOrigin.protocol !== "https:") return null;
|
|
540
|
-
return parsedOrigin.origin;
|
|
541
|
-
} catch {
|
|
542
|
-
return null;
|
|
543
|
-
}
|
|
544
|
-
}
|
|
545
|
-
function normalizeDescriptorEndpointUrl(url) {
|
|
546
|
-
try {
|
|
547
|
-
return new URL(url, getWindowLocationHref());
|
|
548
|
-
} catch {
|
|
549
|
-
return null;
|
|
550
|
-
}
|
|
551
|
-
}
|
|
552
|
-
function getWindowLocationHref() {
|
|
553
|
-
return typeof window === "undefined" ? void 0 : window.location.href;
|
|
554
|
-
}
|
|
555
|
-
function looksLikeWidgetPackageEntry(value) {
|
|
556
|
-
return value.packageId !== void 0 || value.remoteEntryUrl !== void 0 || value.scriptUrl !== void 0 || value.manifest !== void 0 || value.widgets !== void 0;
|
|
557
|
-
}
|
|
558
|
-
function getArrayProperty(value, key) {
|
|
559
|
-
const property = value[key];
|
|
560
|
-
return Array.isArray(property) ? property : void 0;
|
|
561
|
-
}
|
|
562
|
-
function isRecord(value) {
|
|
563
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
564
|
-
}
|
|
565
|
-
//#endregion
|
|
566
|
-
//#region src/utils/widget-package-utils.ts
|
|
567
|
-
function resolveHostedWidgetPackageManifestUrl(descriptorEndpointUrl, baseUrl) {
|
|
568
|
-
try {
|
|
569
|
-
return new URL(descriptorEndpointUrl, baseUrl).href;
|
|
570
|
-
} catch {
|
|
571
|
-
return descriptorEndpointUrl;
|
|
572
|
-
}
|
|
573
|
-
}
|
|
574
|
-
function dedupeWidgetPackagesByPackageIdAndVersion(widgetPackages) {
|
|
575
|
-
const widgetPackagesByIdAndVersion = /* @__PURE__ */ new Map();
|
|
576
|
-
for (const widgetPackage of widgetPackages) {
|
|
577
|
-
const key = JSON.stringify([widgetPackage.packageId, widgetPackage.version]);
|
|
578
|
-
if (!widgetPackagesByIdAndVersion.has(key)) widgetPackagesByIdAndVersion.set(key, widgetPackage);
|
|
579
|
-
}
|
|
580
|
-
return Array.from(widgetPackagesByIdAndVersion.values());
|
|
581
|
-
}
|
|
582
|
-
//#endregion
|
|
583
|
-
Object.defineProperty(exports, "DEFAULT_WIDGET_PACKAGE_MANIFEST_URL", {
|
|
584
|
-
enumerable: true,
|
|
585
|
-
get: function() {
|
|
586
|
-
return DEFAULT_WIDGET_PACKAGE_MANIFEST_URL;
|
|
587
|
-
}
|
|
588
|
-
});
|
|
589
|
-
Object.defineProperty(exports, "buildWidgetRegistry", {
|
|
590
|
-
enumerable: true,
|
|
591
|
-
get: function() {
|
|
592
|
-
return buildWidgetRegistry;
|
|
593
|
-
}
|
|
594
|
-
});
|
|
595
|
-
Object.defineProperty(exports, "createDefaultFluidConfig", {
|
|
596
|
-
enumerable: true,
|
|
597
|
-
get: function() {
|
|
598
|
-
return createDefaultFluidConfig;
|
|
599
|
-
}
|
|
600
|
-
});
|
|
601
|
-
Object.defineProperty(exports, "dedupeWidgetPackagesByPackageIdAndVersion", {
|
|
602
|
-
enumerable: true,
|
|
603
|
-
get: function() {
|
|
604
|
-
return dedupeWidgetPackagesByPackageIdAndVersion;
|
|
605
|
-
}
|
|
606
|
-
});
|
|
607
|
-
Object.defineProperty(exports, "fetchWidgetPackageDescriptors", {
|
|
608
|
-
enumerable: true,
|
|
609
|
-
get: function() {
|
|
610
|
-
return fetchWidgetPackageDescriptors;
|
|
611
|
-
}
|
|
612
|
-
});
|
|
613
|
-
Object.defineProperty(exports, "getDefaultWidgetPackageManifestUrl", {
|
|
614
|
-
enumerable: true,
|
|
615
|
-
get: function() {
|
|
616
|
-
return getDefaultWidgetPackageManifestUrl;
|
|
617
|
-
}
|
|
618
|
-
});
|
|
619
|
-
Object.defineProperty(exports, "installAndReadFluidWidgetsRegistry", {
|
|
620
|
-
enumerable: true,
|
|
621
|
-
get: function() {
|
|
622
|
-
return installAndReadFluidWidgetsRegistry;
|
|
623
|
-
}
|
|
624
|
-
});
|
|
625
|
-
Object.defineProperty(exports, "loadWidgetPackages", {
|
|
626
|
-
enumerable: true,
|
|
627
|
-
get: function() {
|
|
628
|
-
return loadWidgetPackages;
|
|
629
|
-
}
|
|
630
|
-
});
|
|
631
|
-
Object.defineProperty(exports, "mergeRegisteredWidgetsIntoRegistry", {
|
|
632
|
-
enumerable: true,
|
|
633
|
-
get: function() {
|
|
634
|
-
return mergeRegisteredWidgetsIntoRegistry;
|
|
635
|
-
}
|
|
636
|
-
});
|
|
637
|
-
Object.defineProperty(exports, "resolveHostedWidgetPackageManifestUrl", {
|
|
638
|
-
enumerable: true,
|
|
639
|
-
get: function() {
|
|
640
|
-
return resolveHostedWidgetPackageManifestUrl;
|
|
641
|
-
}
|
|
642
|
-
});
|
|
643
|
-
Object.defineProperty(exports, "subscribeToFluidWidgetsRegistry", {
|
|
644
|
-
enumerable: true,
|
|
645
|
-
get: function() {
|
|
646
|
-
return subscribeToFluidWidgetsRegistry;
|
|
647
|
-
}
|
|
648
|
-
});
|
|
649
|
-
|
|
650
|
-
//# sourceMappingURL=widget-package-utils-BGu5fWAU.cjs.map
|