@powerhousedao/connect 6.2.3-dev.4 → 6.2.3-dev.41
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/{AddDriveModal-xAw48kdl.js → AddDriveModal-DhNfP94R.js} +5 -5
- package/dist/{AddDriveModal-xAw48kdl.js.map → AddDriveModal-DhNfP94R.js.map} +1 -1
- package/dist/{ClearStorageModal-DLchAUxQ.js → ClearStorageModal-DaNmZ8f2.js} +5 -5
- package/dist/{ClearStorageModal-DLchAUxQ.js.map → ClearStorageModal-DaNmZ8f2.js.map} +1 -1
- package/dist/{ConfirmDocumentUpgradeModal-FUOhZsk7.js → ConfirmDocumentUpgradeModal-DcOZy20m.js} +8 -7
- package/dist/{ConfirmDocumentUpgradeModal-FUOhZsk7.js.map → ConfirmDocumentUpgradeModal-DcOZy20m.js.map} +1 -1
- package/dist/{CookiesPolicyModal-BpyPPyxS.js → CookiesPolicyModal-BLw4pnhn.js} +4 -4
- package/dist/{CookiesPolicyModal-BpyPPyxS.js.map → CookiesPolicyModal-BLw4pnhn.js.map} +1 -1
- package/dist/{CreateDocumentModal-C45W8J0V.js → CreateDocumentModal-Bmv0V-kY.js} +6 -5
- package/dist/{CreateDocumentModal-C45W8J0V.js.map → CreateDocumentModal-Bmv0V-kY.js.map} +1 -1
- package/dist/{DebugSettingsModal-Bg0wn3oX.js → DebugSettingsModal-EYgccEiI.js} +7 -7
- package/dist/{DebugSettingsModal-Bg0wn3oX.js.map → DebugSettingsModal-EYgccEiI.js.map} +1 -1
- package/dist/{DeleteDriveModal-Dug84t1j.js → DeleteDriveModal-CjGnG0ht.js} +5 -5
- package/dist/{DeleteDriveModal-Dug84t1j.js.map → DeleteDriveModal-CjGnG0ht.js.map} +1 -1
- package/dist/{DeleteItemModal-mMzy3V8o.js → DeleteItemModal-BbY_4_xT.js} +5 -5
- package/dist/{DeleteItemModal-mMzy3V8o.js.map → DeleteItemModal-BbY_4_xT.js.map} +1 -1
- package/dist/{DisclaimerModal-DvpD5dPM.js → DisclaimerModal-DuglmEwL.js} +4 -4
- package/dist/{DisclaimerModal-DvpD5dPM.js.map → DisclaimerModal-DuglmEwL.js.map} +1 -1
- package/dist/{DocumentVersionUnsupportedModal-C3Q0V75l.js → DocumentVersionUnsupportedModal-C4fy7fZ6.js} +4 -4
- package/dist/{DocumentVersionUnsupportedModal-C3Q0V75l.js.map → DocumentVersionUnsupportedModal-C4fy7fZ6.js.map} +1 -1
- package/dist/{DownloadDocumentWithErrorsModal-IKl0ljQb.js → DownloadDocumentWithErrorsModal-BsPQ5qgy.js} +6 -5
- package/dist/{DownloadDocumentWithErrorsModal-IKl0ljQb.js.map → DownloadDocumentWithErrorsModal-BsPQ5qgy.js.map} +1 -1
- package/dist/{DriveAuthRequiredModal-DVK7ZQzO.js → DriveAuthRequiredModal-CtsB0kwH.js} +5 -5
- package/dist/{DriveAuthRequiredModal-DVK7ZQzO.js.map → DriveAuthRequiredModal-CtsB0kwH.js.map} +1 -1
- package/dist/{DriveSettingsModal-C6-mRQiv.js → DriveSettingsModal-d1L0eYof.js} +4 -4
- package/dist/{DriveSettingsModal-C6-mRQiv.js.map → DriveSettingsModal-d1L0eYof.js.map} +1 -1
- package/dist/{InspectorModal-DoEQVQYq.js → InspectorModal-Bkry1jv9.js} +61 -21
- package/dist/InspectorModal-Bkry1jv9.js.map +1 -0
- package/dist/{LoginModal-CybbOm3N.js → LoginModal-CI0ogC2-.js} +5 -5
- package/dist/{LoginModal-CybbOm3N.js.map → LoginModal-CI0ogC2-.js.map} +1 -1
- package/dist/{MissingPackageModal-nBnExqO0.js → MissingPackageModal-CjkK_4A7.js} +5 -5
- package/dist/{MissingPackageModal-nBnExqO0.js.map → MissingPackageModal-CjkK_4A7.js.map} +1 -1
- package/dist/{OpenFileDocumentsModal-D50ZOp6U.js → OpenFileDocumentsModal-CEFijapC.js} +8 -7
- package/dist/{OpenFileDocumentsModal-D50ZOp6U.js.map → OpenFileDocumentsModal-CEFijapC.js.map} +1 -1
- package/dist/{SettingsModal-Dj6IQcRU.js → SettingsModal-iBBWf4UN.js} +17 -15
- package/dist/{SettingsModal-Dj6IQcRU.js.map → SettingsModal-iBBWf4UN.js.map} +1 -1
- package/dist/{UpgradeDriveModal-_8t9slxQ.js → UpgradeDriveModal-CXX6D5Au.js} +4 -4
- package/dist/{UpgradeDriveModal-_8t9slxQ.js.map → UpgradeDriveModal-CXX6D5Au.js.map} +1 -1
- package/dist/{app-loader-CKTEeFBT.js → app-loader-BXd5hsez.js} +1160 -1121
- package/dist/app-loader-BXd5hsez.js.map +1 -0
- package/dist/app-loader-D_p85Yp8.js +4 -0
- package/dist/app-skeleton--Me5zlSz.js +112 -0
- package/dist/app-skeleton--Me5zlSz.js.map +1 -0
- package/dist/app-skeleton-CBN4tenZ.js +4 -0
- package/dist/boot-DPNEOI2A.js +210 -0
- package/dist/boot-DPNEOI2A.js.map +1 -0
- package/dist/buffer-DNTcuap_.js +66 -0
- package/dist/buffer-DNTcuap_.js.map +1 -0
- package/dist/{build-info-N9NcY_pl.js → build-info-C7dDerrM.js} +5 -5
- package/dist/{build-info-N9NcY_pl.js.map → build-info-C7dDerrM.js.map} +1 -1
- package/dist/components-CRXekmxS.js +5 -0
- package/dist/{connect.config-DaHDEUrw.js → connect.config-CaXMoB42.js} +24 -12
- package/dist/connect.config-CaXMoB42.js.map +1 -0
- package/dist/{connection-state-3w4liC1X.js → connection-state-Eqc2izmt.js} +6 -6
- package/dist/{connection-state-3w4liC1X.js.map → connection-state-Eqc2izmt.js.map} +1 -1
- package/dist/{cookie-banner-BH6bIq24.js → cookie-banner-BxXvPdIY.js} +6 -6
- package/dist/{cookie-banner-BH6bIq24.js.map → cookie-banner-BxXvPdIY.js.map} +1 -1
- package/dist/{i18n-CWO0vYVd.js → i18n-CTgT1HG-.js} +3 -3
- package/dist/{i18n-CWO0vYVd.js.map → i18n-CTgT1HG-.js.map} +1 -1
- package/dist/{load-BcbPl8PK.js → load--VQTmlAi.js} +13 -11
- package/dist/{load-BcbPl8PK.js.map → load--VQTmlAi.js.map} +1 -1
- package/dist/main.d.ts +2 -1
- package/dist/main.js +8 -8
- package/dist/main.js.map +1 -1
- package/dist/package-manager-BbzIV9aN.js +485 -0
- package/dist/package-manager-BbzIV9aN.js.map +1 -0
- package/dist/{pglite-major-B39aOEiE.js → pglite-major-p4_YefAE.js} +23 -5
- package/dist/pglite-major-p4_YefAE.js.map +1 -0
- package/dist/{pglite-migrate-core-Boxqqx-c.js → pglite-migrate-core-BcXcImng.js} +8 -6
- package/dist/{pglite-migrate-core-Boxqqx-c.js.map → pglite-migrate-core-BcXcImng.js.map} +1 -1
- package/dist/{pglite-seed-BqAUvNFw.js → pglite-seed-Cl2d-iyl.js} +4 -4
- package/dist/{pglite-seed-BqAUvNFw.js.map → pglite-seed-Cl2d-iyl.js.map} +1 -1
- package/dist/pglite.worker.d.ts +2 -1
- package/dist/pglite.worker.js +4 -3
- package/dist/pglite.worker.js.map +1 -1
- package/dist/pglite.worker.legacy.d.ts +2 -1
- package/dist/pglite.worker.legacy.js +4 -3
- package/dist/pglite.worker.legacy.js.map +1 -1
- package/dist/{preferences-store-_5Cw4_YV.js → preferences-store-DZUIAkHE.js} +6 -25
- package/dist/preferences-store-DZUIAkHE.js.map +1 -0
- package/dist/{pwa-manifest-link-DIgOSo2Q.js → pwa-manifest-link-DQRJpF0r.js} +3 -3
- package/dist/{pwa-manifest-link-DIgOSo2Q.js.map → pwa-manifest-link-DQRJpF0r.js.map} +1 -1
- package/dist/{reactor-C8xEzPA1.js → reactor-DnUFDbsP.js} +93 -451
- package/dist/reactor-DnUFDbsP.js.map +1 -0
- package/dist/reactor.worker.d.ts +2 -1
- package/dist/reactor.worker.js +76 -21
- package/dist/reactor.worker.js.map +1 -1
- package/dist/{registerServiceWorker-BSzbNfvz.js → registerServiceWorker-smkROQhm.js} +5 -5
- package/dist/{registerServiceWorker-BSzbNfvz.js.map → registerServiceWorker-smkROQhm.js.map} +1 -1
- package/dist/renown-trust-DRgHpxlZ.js +34 -0
- package/dist/renown-trust-DRgHpxlZ.js.map +1 -0
- package/dist/{runtime-config-DL3QjcfM.js → runtime-config-DtJIUgYw.js} +3 -3
- package/dist/{runtime-config-DL3QjcfM.js.map → runtime-config-DtJIUgYw.js.map} +1 -1
- package/dist/{sentry-QXKgQmr2.js → sentry-jfDyrxdX.js} +3 -3
- package/dist/{sentry-QXKgQmr2.js.map → sentry-jfDyrxdX.js.map} +1 -1
- package/dist/start-connect.d.ts +4 -5
- package/dist/start-connect.d.ts.map +1 -1
- package/dist/start-connect.js +6 -8
- package/dist/start-connect.js.map +1 -1
- package/dist/style.css +2907 -1
- package/dist/{toast-BXIGd4Eb.js → toast-C6WW-_O-.js} +3 -3
- package/dist/{toast-BXIGd4Eb.js.map → toast-C6WW-_O-.js.map} +1 -1
- package/dist/{use-renown-login-Cf3va6u_.js → use-renown-login-BzOSQETV.js} +3 -3
- package/dist/{use-renown-login-Cf3va6u_.js.map → use-renown-login-BzOSQETV.js.map} +1 -1
- package/dist/useIsEmbedded-BWJ0qb7w.js +26 -0
- package/dist/useIsEmbedded-BWJ0qb7w.js.map +1 -0
- package/dist/{useRegistryPackages-BnUcL_nZ.js → useRegistryPackages-Bruz_77X.js} +75 -13
- package/dist/useRegistryPackages-Bruz_77X.js.map +1 -0
- package/package.json +19 -19
- package/style.css +7 -5
- package/dist/InspectorModal-DoEQVQYq.js.map +0 -1
- package/dist/app-loader-B2GI39lp.js +0 -4
- package/dist/app-loader-CKTEeFBT.js.map +0 -1
- package/dist/components-CkldoWSk.js +0 -4
- package/dist/connect.config-DaHDEUrw.js.map +0 -1
- package/dist/pglite-major-B39aOEiE.js.map +0 -1
- package/dist/preferences-store-_5Cw4_YV.js.map +0 -1
- package/dist/reactor-C8xEzPA1.js.map +0 -1
- package/dist/useRegistryPackages-BnUcL_nZ.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="c219f819-7d17-5158-9aa3-054550ecc5de")}catch(e){}}();
|
|
3
3
|
import { createElement } from "react";
|
|
4
4
|
import { ToastContainer, dismiss, toast } from "@powerhousedao/design-system/connect/toast";
|
|
5
5
|
//#region src/services/toast.ts
|
|
@@ -22,5 +22,5 @@ function dismissToast(toastId) {
|
|
|
22
22
|
//#endregion
|
|
23
23
|
export { dismissToast as n, toast$1 as r, ToastContainer$1 as t };
|
|
24
24
|
|
|
25
|
-
//# sourceMappingURL=toast-
|
|
26
|
-
//# debugId=
|
|
25
|
+
//# sourceMappingURL=toast-C6WW-_O-.js.map
|
|
26
|
+
//# debugId=c219f819-7d17-5158-9aa3-054550ecc5de
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toast-
|
|
1
|
+
{"version":3,"file":"toast-C6WW-_O-.js","sources":["../src/services/toast.ts"],"sourcesContent":["import type { ConnectToastOptions } from \"@powerhousedao/design-system/connect/toast\";\nimport {\n ToastContainer as BaseToastContainer,\n dismiss as baseDismiss,\n toast as baseToast,\n} from \"@powerhousedao/design-system/connect/toast\";\nimport { createElement, type ComponentProps } from \"react\";\n\nexport const CONNECT_TOAST_CONTAINER_ID = \"connect\";\n\ntype BaseToastContainerProps = ComponentProps<typeof BaseToastContainer>;\n\nexport const ToastContainer = (\n props: Omit<BaseToastContainerProps, \"containerId\"> = {},\n) =>\n createElement(BaseToastContainer, {\n containerId: CONNECT_TOAST_CONTAINER_ID,\n ...props,\n });\n\ntype ToastArgs = Parameters<typeof baseToast>;\nexport function toast(content: ToastArgs[0], options?: ConnectToastOptions) {\n const {\n type = \"default\",\n containerId = CONNECT_TOAST_CONTAINER_ID,\n ...restOptions\n } = options || {};\n return baseToast(content, { type, containerId, ...restOptions });\n}\n\nexport function dismissToast(toastId: string | number) {\n return baseDismiss(toastId);\n}\n"],"names":["ToastContainer","BaseToastContainer","toast","baseToast","baseDismiss"],"mappings":";;;;;AAQA,MAAa,6BAA6B;AAI1C,MAAaA,oBACX,QAAsD,CAAC,MAEvD,cAAcC,gBAAoB;CAChC,aAAa;CACb,GAAG;AACL,CAAC;AAGH,SAAgBC,QAAM,SAAuB,SAA+B;CAC1E,MAAM,EACJ,OAAO,WACP,cAAc,4BACd,GAAG,gBACD,WAAW,CAAC;CAChB,OAAOC,MAAU,SAAS;EAAE;EAAM;EAAa,GAAG;CAAY,CAAC;AACjE;AAEA,SAAgB,aAAa,SAA0B;CACrD,OAAOC,QAAY,OAAO;AAC5B","debug_id":"c219f819-7d17-5158-9aa3-054550ecc5de"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="7371b189-110f-51b5-a76f-e2857d4c8cbb")}catch(e){}}();
|
|
3
3
|
import { useCallback, useMemo } from "react";
|
|
4
4
|
import { openRenown, showPHModal, useRenownAuth, useRenownLoginMethods } from "@powerhousedao/reactor-browser";
|
|
5
5
|
//#region src/hooks/use-renown-login.ts
|
|
@@ -48,5 +48,5 @@ function useRenownLoginProps() {
|
|
|
48
48
|
//#endregion
|
|
49
49
|
export { useRenownLoginProps as n, useOpenRenownLogin as t };
|
|
50
50
|
|
|
51
|
-
//# sourceMappingURL=use-renown-login-
|
|
52
|
-
//# debugId=
|
|
51
|
+
//# sourceMappingURL=use-renown-login-BzOSQETV.js.map
|
|
52
|
+
//# debugId=7371b189-110f-51b5-a76f-e2857d4c8cbb
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-renown-login-
|
|
1
|
+
{"version":3,"file":"use-renown-login-BzOSQETV.js","sources":["../src/hooks/use-renown-login.ts"],"sourcesContent":["import type { RenownLoginOption } from \"@powerhousedao/design-system/connect\";\nimport {\n openRenown,\n showPHModal,\n useRenownAuth,\n useRenownLoginMethods,\n} from \"@powerhousedao/reactor-browser\";\nimport { useCallback, useMemo } from \"react\";\n\n// Opens the in-page login modal when wallet adapters are configured; otherwise\n// redirects straight to the Renown portal (no modal with only a redirect button).\nexport function useOpenRenownLogin(): () => void {\n const methods = useRenownLoginMethods();\n return useCallback(() => {\n if (methods.length > 0) {\n showPHModal({ type: \"login\" });\n } else {\n openRenown();\n }\n }, [methods]);\n}\n\nexport interface RenownLoginProps {\n onLogin: () => void;\n // One option per configured login method (wallet, Google, email, …). Empty\n // only when no adapters are configured (the redirect Connect button is used).\n methods: RenownLoginOption[];\n loading: boolean;\n error: string | null;\n}\n\nconst LAST_METHOD_KEY = \"renown:last-login-method\";\n\nfunction getLastLoginMethod(): string | null {\n try {\n return localStorage.getItem(LAST_METHOD_KEY);\n } catch {\n return null;\n }\n}\n\nfunction setLastLoginMethod(method: string): void {\n try {\n localStorage.setItem(LAST_METHOD_KEY, method);\n } catch {\n // localStorage unavailable (private mode / SSR) — the badge is optional.\n }\n}\n\n// Single source of the login wiring shared by every Connect CTA: in-page\n// sign-in (with redirect fallback) plus pending/error feedback.\nexport function useRenownLoginProps(): RenownLoginProps {\n const { login, pending, error } = useRenownAuth();\n const onLogin = useCallback(() => login(), [login]);\n\n // Method list (labels) comes from the shared primitive; Connect adds the\n // last-used badge + the onSelect wiring for its design-system card.\n const baseMethods = useRenownLoginMethods();\n\n const methods = useMemo<RenownLoginOption[]>(() => {\n const lastUsed = getLastLoginMethod();\n return baseMethods.map((method) => ({\n id: method.id,\n label: method.label,\n lastUsed: lastUsed === method.id,\n onSelect: () => {\n setLastLoginMethod(method.id);\n login(undefined, method.id);\n },\n }));\n }, [baseMethods, login]);\n\n return { onLogin, methods, loading: pending, error: error?.message ?? null };\n}\n"],"names":[],"mappings":";;;;;AAWA,SAAgB,qBAAiC;CAC/C,MAAM,UAAU,sBAAsB;CACtC,OAAO,kBAAkB;EACvB,IAAI,QAAQ,SAAS,GACnB,YAAY,EAAE,MAAM,QAAQ,CAAC;OAE7B,WAAW;CAEf,GAAG,CAAC,OAAO,CAAC;AACd;AAWA,MAAM,kBAAkB;AAExB,SAAS,qBAAoC;CAC3C,IAAI;EACF,OAAO,aAAa,QAAQ,eAAe;CAC7C,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,mBAAmB,QAAsB;CAChD,IAAI;EACF,aAAa,QAAQ,iBAAiB,MAAM;CAC9C,QAAQ,CAER;AACF;AAIA,SAAgB,sBAAwC;CACtD,MAAM,EAAE,OAAO,SAAS,UAAU,cAAc;CAChD,MAAM,UAAU,kBAAkB,MAAM,GAAG,CAAC,KAAK,CAAC;CAIlD,MAAM,cAAc,sBAAsB;CAe1C,OAAO;EAAE;EAAS,SAbF,cAAmC;GACjD,MAAM,WAAW,mBAAmB;GACpC,OAAO,YAAY,KAAK,YAAY;IAClC,IAAI,OAAO;IACX,OAAO,OAAO;IACd,UAAU,aAAa,OAAO;IAC9B,gBAAgB;KACd,mBAAmB,OAAO,EAAE;KAC5B,MAAM,KAAA,GAAW,OAAO,EAAE;IAC5B;GACF,EAAE;EACJ,GAAG,CAAC,aAAa,KAAK,CAEE;EAAG,SAAS;EAAS,OAAO,OAAO,WAAW;CAAK;AAC7E","debug_id":"7371b189-110f-51b5-a76f-e2857d4c8cbb"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
//#region src/hooks/useIsEmbedded.ts
|
|
2
|
+
/**
|
|
3
|
+
* Detects whether Connect is being rendered inside another app (e.g. inside
|
|
4
|
+
* an iframe in the vetra-cli drive editor). When `?embed=1` is present in the
|
|
5
|
+
* URL, chrome that doesn't make sense in the embedded context — the cookie
|
|
6
|
+
* banner, the outer sidebar — is suppressed.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="494265e6-60de-5054-ae34-5a75f4ee0a25")}catch(e){}}();
|
|
10
|
+
function getIsEmbedded() {
|
|
11
|
+
if (typeof window === "undefined") return false;
|
|
12
|
+
try {
|
|
13
|
+
const value = new URLSearchParams(window.location.search).get("embed");
|
|
14
|
+
return value !== null && value !== "0" && value !== "false";
|
|
15
|
+
} catch {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function useIsEmbedded() {
|
|
20
|
+
return getIsEmbedded();
|
|
21
|
+
}
|
|
22
|
+
//#endregion
|
|
23
|
+
export { useIsEmbedded as n, getIsEmbedded as t };
|
|
24
|
+
|
|
25
|
+
//# sourceMappingURL=useIsEmbedded-BWJ0qb7w.js.map
|
|
26
|
+
//# debugId=494265e6-60de-5054-ae34-5a75f4ee0a25
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useIsEmbedded-BWJ0qb7w.js","sources":["../src/hooks/useIsEmbedded.ts"],"sourcesContent":["/**\n * Detects whether Connect is being rendered inside another app (e.g. inside\n * an iframe in the vetra-cli drive editor). When `?embed=1` is present in the\n * URL, chrome that doesn't make sense in the embedded context — the cookie\n * banner, the outer sidebar — is suppressed.\n */\nexport function getIsEmbedded(): boolean {\n if (typeof window === \"undefined\") return false;\n try {\n const params = new URLSearchParams(window.location.search);\n const value = params.get(\"embed\");\n return value !== null && value !== \"0\" && value !== \"false\";\n } catch {\n return false;\n }\n}\n\nexport function useIsEmbedded(): boolean {\n return getIsEmbedded();\n}\n"],"names":[],"mappings":";;;;;;;;;AAMA,SAAgB,gBAAyB;CACvC,IAAI,OAAO,WAAW,aAAa,OAAO;CAC1C,IAAI;EAEF,MAAM,QAAQ,IADK,gBAAgB,OAAO,SAAS,MAChC,CAAC,CAAC,IAAI,OAAO;EAChC,OAAO,UAAU,QAAQ,UAAU,OAAO,UAAU;CACtD,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAgB,gBAAyB;CACvC,OAAO,cAAc;AACvB","debug_id":"494265e6-60de-5054-ae34-5a75f4ee0a25"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
3
|
-
import { n as getRuntimeConfig } from "./runtime-config-
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="fb71e699-833f-5b63-b16a-6bbe5dea2a78")}catch(e){}}();
|
|
3
|
+
import { n as getRuntimeConfig } from "./runtime-config-DtJIUgYw.js";
|
|
4
|
+
import { n as sharedDepMismatchWarnings, r as getSharedDeps } from "./package-manager-BbzIV9aN.js";
|
|
4
5
|
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
5
6
|
import { getPackageInfo, getPackagePage, getPackagesForDocumentType, trimTrailingSlash, useVetraPackageManager } from "@powerhousedao/reactor-browser";
|
|
7
|
+
import { toCdnUrl } from "@powerhousedao/shared/registry/urls";
|
|
6
8
|
import { slimManifest } from "@powerhousedao/shared/registry/manifest-slim";
|
|
7
9
|
//#region src/hooks/useRegistryPackages.ts
|
|
8
10
|
/** Page size for the paginated Available-packages listing. */
|
|
@@ -114,9 +116,8 @@ function useRegistryPackages() {
|
|
|
114
116
|
fetchAvailablePage({ reset: true });
|
|
115
117
|
}
|
|
116
118
|
/**
|
|
117
|
-
* Fetch full package info for a document type
|
|
118
|
-
*
|
|
119
|
-
* offer installs without loading the whole paginated listing.
|
|
119
|
+
* Fetch full package info for a document type and merge into the map. Lets
|
|
120
|
+
* MissingPackageModal offer installs without loading the whole listing.
|
|
120
121
|
*/
|
|
121
122
|
const fetchPackagesByDocumentType = useCallback(async (documentType) => {
|
|
122
123
|
if (registryUrl === null || !packageManager) return [];
|
|
@@ -148,6 +149,62 @@ function useRegistryPackages() {
|
|
|
148
149
|
useEffect(() => () => {
|
|
149
150
|
if (debounceRef.current) clearTimeout(debounceRef.current);
|
|
150
151
|
}, []);
|
|
152
|
+
const [hostVersions, setHostVersions] = useState(null);
|
|
153
|
+
useEffect(() => {
|
|
154
|
+
let cancelled = false;
|
|
155
|
+
getSharedDeps().then((deps) => {
|
|
156
|
+
if (!cancelled) setHostVersions(deps?.versions ?? null);
|
|
157
|
+
});
|
|
158
|
+
return () => {
|
|
159
|
+
cancelled = true;
|
|
160
|
+
};
|
|
161
|
+
}, []);
|
|
162
|
+
const sharedDepAttemptedRef = useRef(/* @__PURE__ */ new Set());
|
|
163
|
+
useEffect(() => {
|
|
164
|
+
if (!registryUrl || !hostVersions) return;
|
|
165
|
+
const cdnUrl = toCdnUrl(trimTrailingSlash(registryUrl));
|
|
166
|
+
const pending = registryPackageList.filter((p) => !sharedDepAttemptedRef.current.has(p.name) && p.sharedDepWarnings === void 0);
|
|
167
|
+
if (pending.length === 0) return;
|
|
168
|
+
let cancelled = false;
|
|
169
|
+
let index = 0;
|
|
170
|
+
const runNext = () => {
|
|
171
|
+
if (cancelled) return;
|
|
172
|
+
const row = pending[index++];
|
|
173
|
+
if (!row) return;
|
|
174
|
+
sharedDepAttemptedRef.current.add(row.name);
|
|
175
|
+
(async () => {
|
|
176
|
+
try {
|
|
177
|
+
const res = await fetch(`${cdnUrl}/${encodeURIComponent(row.name)}/package.json`);
|
|
178
|
+
if (!res.ok) return;
|
|
179
|
+
const pkgJson = await res.json();
|
|
180
|
+
const warnings = sharedDepMismatchWarnings(pkgJson, hostVersions);
|
|
181
|
+
if (warnings.length === 0) return;
|
|
182
|
+
setRegistryPackagesMap((old) => {
|
|
183
|
+
const current = old[row.name];
|
|
184
|
+
if (!current) return old;
|
|
185
|
+
return {
|
|
186
|
+
...old,
|
|
187
|
+
[row.name]: {
|
|
188
|
+
...current,
|
|
189
|
+
sharedDepWarnings: warnings
|
|
190
|
+
}
|
|
191
|
+
};
|
|
192
|
+
});
|
|
193
|
+
} catch {} finally {
|
|
194
|
+
runNext();
|
|
195
|
+
}
|
|
196
|
+
})();
|
|
197
|
+
};
|
|
198
|
+
runNext();
|
|
199
|
+
return () => {
|
|
200
|
+
cancelled = true;
|
|
201
|
+
};
|
|
202
|
+
}, [
|
|
203
|
+
registryUrl,
|
|
204
|
+
hostVersions,
|
|
205
|
+
registryPackageList,
|
|
206
|
+
setRegistryPackagesMap
|
|
207
|
+
]);
|
|
151
208
|
useEffect(() => {
|
|
152
209
|
if (!packageManager) return;
|
|
153
210
|
if (packageManagerPackages?.length) for (const packageManagerPackage of packageManagerPackages) setRegistryPackagesMap((existingRegistryPackages) => {
|
|
@@ -162,10 +219,13 @@ function useRegistryPackages() {
|
|
|
162
219
|
spec: spec ?? existingPackage.spec,
|
|
163
220
|
status: promoteStatus(existingPackage.status, packageManager.getPackageSource(packageName))
|
|
164
221
|
};
|
|
165
|
-
else
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
222
|
+
else {
|
|
223
|
+
const status = getPackageStatusFromPackageSource(packageManager.getPackageSource(packageName));
|
|
224
|
+
newRegistryPackages[packageName] = {
|
|
225
|
+
...makeRegistryPackageFromDocumentModelLib(packageManagerPackage, status, version),
|
|
226
|
+
...spec !== void 0 ? { spec } : null
|
|
227
|
+
};
|
|
228
|
+
}
|
|
169
229
|
return newRegistryPackages;
|
|
170
230
|
});
|
|
171
231
|
}, [packageManagerPackages]);
|
|
@@ -256,7 +316,8 @@ function useRegistryPackages() {
|
|
|
256
316
|
*/
|
|
257
317
|
const ensureInstalledMetadataLoaded = useCallback(() => {
|
|
258
318
|
if (registryUrl === null || !packageManager) return;
|
|
259
|
-
|
|
319
|
+
const missing = Object.values(registryPackagesMap).filter((p) => p !== void 0 && p.status === "registry-install" && (!p.latestVersion || !(p.distTags && Object.keys(p.distTags).length > 0 || (p.versions?.length ?? 0) > 0))).map((p) => p.name);
|
|
320
|
+
fetchInstalledRowData(missing);
|
|
260
321
|
}, [
|
|
261
322
|
registryUrl,
|
|
262
323
|
packageManager,
|
|
@@ -265,7 +326,8 @@ function useRegistryPackages() {
|
|
|
265
326
|
]);
|
|
266
327
|
useEffect(() => {
|
|
267
328
|
if (!packageManagerPackages?.length || !packageManager) return;
|
|
268
|
-
|
|
329
|
+
const names = packageManagerPackages.filter((p) => packageManager.getPackageSource(p.manifest.name) === "registry-install").map((p) => p.manifest.name);
|
|
330
|
+
fetchInstalledRowData(names);
|
|
269
331
|
}, [
|
|
270
332
|
packageManagerPackages,
|
|
271
333
|
packageManager,
|
|
@@ -386,5 +448,5 @@ function getPackageStatusFromPackageSource(packageSource) {
|
|
|
386
448
|
//#endregion
|
|
387
449
|
export { useRegistryPackages as t };
|
|
388
450
|
|
|
389
|
-
//# sourceMappingURL=useRegistryPackages-
|
|
390
|
-
//# debugId=
|
|
451
|
+
//# sourceMappingURL=useRegistryPackages-Bruz_77X.js.map
|
|
452
|
+
//# debugId=fb71e699-833f-5b63-b16a-6bbe5dea2a78
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useRegistryPackages-Bruz_77X.js","sources":["../src/hooks/useRegistryPackages.ts"],"sourcesContent":["import {\n getPackageInfo,\n getPackagePage,\n getPackagesForDocumentType,\n trimTrailingSlash,\n useVetraPackageManager,\n} from \"@powerhousedao/reactor-browser\";\nimport type {\n PackageInfo,\n PackageListItem,\n RegistryPackage,\n RegistryPackageList,\n RegistryPackageMap,\n RegistryPackageSource,\n RegistryPackageStatus,\n} from \"@powerhousedao/shared/registry\";\nimport { toCdnUrl } from \"@powerhousedao/shared/registry/urls\";\nimport type { PackageDeps } from \"@powerhousedao/shared/connect\";\nimport { slimManifest } from \"@powerhousedao/shared/registry/manifest-slim\";\nimport type { DocumentModelLib } from \"document-model\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { getRuntimeConfig } from \"../runtime-config.js\";\nimport { sharedDepMismatchWarnings } from \"../package-manager.js\";\nimport { getSharedDeps } from \"../shared-deps.js\";\n\n/** Page size for the paginated Available-packages listing. */\nconst AVAILABLE_PAGE_SIZE = 30;\n\nexport function useRegistryPackages() {\n const packageManager = useVetraPackageManager();\n const packageManagerPackages = packageManager?.packages;\n const registryUrl = getRuntimeConfig().packageRegistryUrl ?? null;\n // Normalize so `http://host` and `http://host/` don't produce two separate\n // localStorage maps where the install/status flow reads from one while the\n // registry fetch writes to the other.\n const registryPackagesKey = `REGISTRY_PACKAGES:${registryUrl === null ? null : trimTrailingSlash(registryUrl)}`;\n const [registryPackagesMap, setRegistryPackagesMap] =\n useBestEffortLocalStorage<RegistryPackageMap>(registryPackagesKey, {});\n const registryPackageList: RegistryPackageList = useMemo(() => {\n return Array.from(Object.values(registryPackagesMap)).filter(\n (p) => p !== undefined,\n );\n }, [registryPackagesMap]);\n // Split for the two Package Manager tabs: installed is derivable from local\n // state alone (no network), available/dismissed come from the registry\n // fetch (or its localStorage cache).\n const installedPackages: RegistryPackageList = useMemo(\n () =>\n registryPackageList.filter(\n (p) => p.status === \"local-install\" || p.status === \"registry-install\",\n ),\n [registryPackageList],\n );\n // --- Available tab: paginated + server-searched, layered on the map ---\n //\n // The map above stays the single source of truth for each package's status,\n // version metadata and install state. `availableOrder` is the ordering layer\n // for the current search: a page-accumulated list of names. The rendered\n // available list looks each name up in the map and drops anything that is\n // now installed (it moves to the Installed tab) — so installing a row needs\n // no extra bookkeeping.\n const [availableOrder, setAvailableOrder] = useState<string[]>([]);\n const [availableTotal, setAvailableTotal] = useState<number | null>(null);\n const [availableHasMore, setAvailableHasMore] = useState(false);\n const [isLoadingAvailable, setIsLoadingAvailable] = useState(false);\n const [isLoadingMoreAvailable, setIsLoadingMoreAvailable] = useState(false);\n const [availableError, setAvailableError] = useState(false);\n\n // Latest search string (updated synchronously so a debounced fetch reads the\n // freshest query), the server offset for the next page, and a monotonic\n // request generation so out-of-order responses never clobber a newer query.\n const availableQueryRef = useRef(\"\");\n const nextOffsetRef = useRef(0);\n const requestGenerationRef = useRef(0);\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const availablePackages: RegistryPackageList = useMemo(\n () =>\n availableOrder\n .map((name) => registryPackagesMap[name])\n .filter(\n (p): p is RegistryPackage =>\n p !== undefined &&\n (p.status === \"available\" || p.status === \"dismissed\"),\n ),\n [availableOrder, registryPackagesMap],\n );\n\n const fetchAvailablePage = useCallback(\n async ({ reset }: { reset: boolean }): Promise<void> => {\n if (registryUrl === null || !packageManager) return;\n const generation = ++requestGenerationRef.current;\n const offset = reset ? 0 : nextOffsetRef.current;\n const search = availableQueryRef.current;\n if (reset) setIsLoadingAvailable(true);\n else setIsLoadingMoreAvailable(true);\n setAvailableError(false);\n\n try {\n const page = await getPackagePage(registryUrl, {\n limit: AVAILABLE_PAGE_SIZE,\n offset,\n search: search || undefined,\n });\n // A newer search/reset superseded this request — drop its result.\n if (generation !== requestGenerationRef.current) return;\n\n setRegistryPackagesMap((oldPackages) => {\n const next: RegistryPackageMap = { ...oldPackages };\n for (const item of page.items) {\n const existing = next[item.name];\n if (!existing) {\n const status = getPackageStatusFromPackageSource(\n packageManager.getPackageSource(item.name),\n );\n next[item.name] = makeRegistryPackageFromListItem(item, status);\n } else {\n // Keep the existing (possibly fuller) entry; just refresh the\n // installed version, the registry's newest version, and\n // re-promote status. Never downgrade an installed/dismissed\n // row from a trimmed list item.\n next[item.name] = {\n ...existing,\n version:\n packageManager.getPackageVersion(item.name) ??\n item.version ??\n existing.version,\n latestVersion: item.version ?? existing.latestVersion,\n status: promoteStatus(\n existing.status,\n packageManager.getPackageSource(item.name),\n ),\n };\n }\n }\n return next;\n });\n\n setAvailableOrder((prev) => {\n const base = reset ? [] : prev;\n const seen = new Set(base);\n const merged = [...base];\n for (const item of page.items) {\n if (!seen.has(item.name)) {\n seen.add(item.name);\n merged.push(item.name);\n }\n }\n return merged;\n });\n\n nextOffsetRef.current = offset + page.items.length;\n setAvailableTotal(page.total);\n setAvailableHasMore(page.hasMore);\n } catch (error: unknown) {\n if (generation !== requestGenerationRef.current) return;\n // Log the raw failure for debugging; the UI only gets a boolean so we\n // never surface generic API / network messages to the user.\n console.error(error);\n setAvailableError(true);\n } finally {\n // Only the newest request clears the spinners.\n if (generation === requestGenerationRef.current) {\n setIsLoadingAvailable(false);\n setIsLoadingMoreAvailable(false);\n }\n }\n },\n [registryUrl, packageManager, setRegistryPackagesMap],\n );\n\n /** Debounced server search — resets to page 1 for the new query. */\n const setAvailableSearch = useCallback(\n (query: string) => {\n availableQueryRef.current = query;\n if (debounceRef.current) clearTimeout(debounceRef.current);\n debounceRef.current = setTimeout(() => {\n void fetchAvailablePage({ reset: true });\n }, 300);\n },\n [fetchAvailablePage],\n );\n\n /** Load the next page (infinite scroll). No-op when exhausted/busy. */\n const loadMoreAvailable = useCallback(() => {\n if (!availableHasMore || isLoadingAvailable || isLoadingMoreAvailable) {\n return;\n }\n void fetchAvailablePage({ reset: false });\n }, [\n availableHasMore,\n isLoadingAvailable,\n isLoadingMoreAvailable,\n fetchAvailablePage,\n ]);\n\n /**\n * Load page 1 the first time the Available tab is opened. Re-opening keeps\n * the accumulated pages; a fetch error leaves the panel's Retry to re-fetch\n * (this guard avoids auto-retry loops on tab re-open).\n */\n function ensureAvailableLoaded() {\n if (availableOrder.length > 0 || isLoadingAvailable || availableError) {\n return;\n }\n void fetchAvailablePage({ reset: true });\n }\n\n /**\n * Fetch full package info for a document type and merge into the map. Lets\n * MissingPackageModal offer installs without loading the whole listing.\n */\n const fetchPackagesByDocumentType = useCallback(\n async (documentType: string): Promise<RegistryPackage[]> => {\n if (registryUrl === null || !packageManager) return [];\n try {\n const infos = await getPackagesForDocumentType(\n registryUrl,\n documentType,\n );\n setRegistryPackagesMap((oldPackages) => {\n const next: RegistryPackageMap = { ...oldPackages };\n for (const info of infos) {\n const existing = next[info.name];\n const status = getPackageStatusFromPackageSource(\n packageManager.getPackageSource(info.name),\n );\n next[info.name] = existing\n ? {\n ...existing,\n latestVersion: info.version ?? existing.latestVersion,\n status: promoteStatus(\n existing.status,\n packageManager.getPackageSource(info.name),\n ),\n }\n : makeRegistryPackageFromPackageInfo(info, status);\n }\n return next;\n });\n return infos.map((info) =>\n makeRegistryPackageFromPackageInfo(\n info,\n getPackageStatusFromPackageSource(\n packageManager.getPackageSource(info.name),\n ),\n ),\n );\n } catch (error: unknown) {\n console.error(error);\n return [];\n }\n },\n [registryUrl, packageManager, setRegistryPackagesMap],\n );\n\n // Clear any pending debounce on unmount.\n useEffect(\n () => () => {\n if (debounceRef.current) clearTimeout(debounceRef.current);\n },\n [],\n );\n\n // The host's shared-deps version table, from the production vendor\n // (null in dev / vendor-off builds — nothing to compare against, so the\n // rows simply have no warnings).\n const [hostVersions, setHostVersions] = useState<Record<\n string,\n string\n > | null>(null);\n useEffect(() => {\n let cancelled = false;\n void getSharedDeps().then((deps) => {\n if (!cancelled) setHostVersions(deps?.versions ?? null);\n });\n return () => {\n cancelled = true;\n };\n }, []);\n\n // Shared-dependency compatibility per row: fetch each package's npm\n // package.json once from the CDN (session-cached), compare its declared\n // shared-dep ranges against the host table, and stamp any mismatch\n // warnings onto the row. Sequential on purpose — a page first load is a\n // burst of row fetches, and this keeps it to one in flight at a time.\n // Best-effort: a fetch failure or absent CDN means no warning, same as a\n // vendor-less host.\n const sharedDepAttemptedRef = useRef(new Set<string>());\n useEffect(() => {\n if (!registryUrl || !hostVersions) return;\n const cdnUrl = toCdnUrl(trimTrailingSlash(registryUrl));\n const pending = registryPackageList.filter(\n (p) =>\n !sharedDepAttemptedRef.current.has(p.name) &&\n p.sharedDepWarnings === undefined,\n );\n if (pending.length === 0) return;\n let cancelled = false;\n let index = 0;\n const runNext = () => {\n if (cancelled) return;\n const row: RegistryPackage | undefined = pending[index++];\n if (!row) return;\n sharedDepAttemptedRef.current.add(row.name);\n void (async () => {\n try {\n const res = await fetch(\n `${cdnUrl}/${encodeURIComponent(row.name)}/package.json`,\n );\n if (!res.ok) return;\n const pkgJson = (await res.json()) as PackageDeps;\n const warnings = sharedDepMismatchWarnings(pkgJson, hostVersions);\n if (warnings.length === 0) return;\n setRegistryPackagesMap((old) => {\n const current = old[row.name];\n if (!current) return old;\n return {\n ...old,\n [row.name]: { ...current, sharedDepWarnings: warnings },\n };\n });\n } catch {\n // no warning\n } finally {\n runNext();\n }\n })();\n };\n runNext();\n return () => {\n cancelled = true;\n };\n }, [registryUrl, hostVersions, registryPackageList, setRegistryPackagesMap]);\n\n useEffect(() => {\n if (!packageManager) return;\n\n if (packageManagerPackages?.length) {\n for (const packageManagerPackage of packageManagerPackages) {\n setRegistryPackagesMap((existingRegistryPackages) => {\n const packageName = packageManagerPackage.manifest.name;\n const existingPackage = existingRegistryPackages[packageName];\n const newRegistryPackages = { ...existingRegistryPackages };\n const version = packageManager.getPackageVersion(packageName);\n const spec = packageManager.getPackageSpec(packageName);\n if (existingPackage) {\n newRegistryPackages[packageName] = {\n ...existingPackage,\n version: version ?? existingPackage.version,\n spec: spec ?? existingPackage.spec,\n status: promoteStatus(\n existingPackage.status,\n packageManager.getPackageSource(packageName),\n ),\n };\n } else {\n const packageSource = packageManager.getPackageSource(packageName);\n const status = getPackageStatusFromPackageSource(packageSource);\n const newRegistryPackage = makeRegistryPackageFromDocumentModelLib(\n packageManagerPackage,\n status,\n version,\n );\n newRegistryPackages[packageName] = {\n ...newRegistryPackage,\n ...(spec !== undefined ? { spec } : null),\n };\n }\n return newRegistryPackages;\n });\n }\n }\n }, [packageManagerPackages]);\n\n function updateRegistryPackageStatus(\n packageName: string,\n newStatus: RegistryPackageStatus,\n ) {\n setRegistryPackagesMap((oldRegistryPackages) => {\n const newRegistryPackages = { ...oldRegistryPackages };\n const newRegistryPackage = newRegistryPackages[packageName];\n if (!newRegistryPackage) {\n console.error(\n \"Attempting to update status for package that does not exist.\",\n );\n return newRegistryPackages;\n }\n newRegistryPackages[packageName] = {\n ...newRegistryPackage,\n status: newStatus,\n };\n\n return newRegistryPackages;\n });\n }\n\n /**\n * Register a freshly-installed package that came in via the npm-uplink\n * fallback — the user typed a bare name, our local `/packages` didn't know\n * it, but the install succeeded because verdaccio proxy-fetched the tarball.\n *\n * This is the one legitimate case where the status update runs against a\n * name that wasn't in the registry map. We treat it as an insert rather\n * than logging the \"does not exist\" error. Data is pulled from the loaded\n * module so the UI card shows the real manifest immediately; the next\n * `/packages` refresh will add `versions`/`distTags`.\n */\n function registerFallbackRegistryPackage(\n packageName: string,\n loadedPackage: DocumentModelLib,\n version: string | undefined,\n status: RegistryPackageStatus,\n ) {\n setRegistryPackagesMap((oldRegistryPackages) => {\n const newRegistryPackages = { ...oldRegistryPackages };\n newRegistryPackages[packageName] = {\n ...makeRegistryPackageFromDocumentModelLib(\n loadedPackage,\n status,\n version,\n ),\n name: packageName,\n };\n return newRegistryPackages;\n });\n }\n\n /**\n * In-flight dedupe: the same row can be requested by the Installed-tab\n * trigger and by runtime registration in the same tick — at most one\n * fetch per row at a time.\n */\n const metadataInFlightRef = useRef(new Set<string>());\n\n /**\n * Fetch single-package info for the given rows and merge it into the\n * map. The endpoint's `version` is the registry's newest release — the\n * latest-stream target — and is stored as `latestVersion`, never\n * overwriting the installed `version`, `spec`, or status. `distTags`/\n * `versions` (the picker's data) merge in when the registry provides\n * them. Per-row failures are logged and swallowed — a dead registry or\n * one bad package must not blank the others.\n */\n const fetchInstalledRowData = useCallback(\n (names: string[]) => {\n if (registryUrl === null || names.length === 0) return;\n const pending = names.filter(\n (name) => !metadataInFlightRef.current.has(name),\n );\n if (pending.length === 0) return;\n for (const name of pending) metadataInFlightRef.current.add(name);\n void Promise.all(\n pending.map(async (name) => {\n try {\n const info = await getPackageInfo(registryUrl, name);\n if (!info || (!info.version && !info.distTags && !info.versions))\n return;\n setRegistryPackagesMap((oldPackages) => {\n const existing = oldPackages[name];\n if (!existing) return oldPackages;\n return {\n ...oldPackages,\n [name]: {\n ...existing,\n latestVersion: info.version ?? existing.latestVersion,\n distTags: info.distTags ?? existing.distTags,\n versions: info.versions ?? existing.versions,\n },\n };\n });\n } catch (error: unknown) {\n console.error(error);\n } finally {\n metadataInFlightRef.current.delete(name);\n }\n }),\n );\n },\n [registryUrl, setRegistryPackagesMap],\n );\n\n /**\n * Lazy refresh of installed-row version data — the Installed-tab trigger.\n * Fetches rows missing `latestVersion` or the full `versions`/`distTags`\n * metadata (the picker).\n */\n const ensureInstalledMetadataLoaded = useCallback(() => {\n if (registryUrl === null || !packageManager) return;\n const missing = Object.values(registryPackagesMap)\n .filter(\n (p): p is RegistryPackage =>\n p !== undefined &&\n p.status === \"registry-install\" &&\n (!p.latestVersion ||\n !(\n (p.distTags && Object.keys(p.distTags).length > 0) ||\n (p.versions?.length ?? 0) > 0\n )),\n )\n .map((p) => p.name);\n void fetchInstalledRowData(missing);\n }, [registryUrl, packageManager, registryPackagesMap, fetchInstalledRowData]);\n\n // Runtime registration can postdate the last Installed-tab activation\n // (boot-time registry packages resolve after the modal opened, or an\n // install lands while it is closed) — refresh the rows that were just\n // registered so their update data arrives without a manual re-open.\n useEffect(() => {\n if (!packageManagerPackages?.length || !packageManager) return;\n const names = packageManagerPackages\n .filter(\n (p) =>\n packageManager.getPackageSource(p.manifest.name) ===\n \"registry-install\",\n )\n .map((p) => p.manifest.name);\n void fetchInstalledRowData(names);\n }, [packageManagerPackages, packageManager, fetchInstalledRowData]);\n\n return {\n registryPackagesMap,\n registryPackageList,\n installedPackages,\n ensureInstalledMetadataLoaded,\n // Available tab (paginated + server search)\n availablePackages,\n availableTotal,\n availableHasMore,\n isLoadingAvailable,\n isLoadingMoreAvailable,\n availableError,\n ensureAvailableLoaded,\n fetchAvailablePage,\n loadMoreAvailable,\n setAvailableSearch,\n fetchPackagesByDocumentType,\n // Status mutations\n updateRegistryPackageStatus,\n registerFallbackRegistryPackage,\n };\n}\n\n/**\n * Build a RegistryPackage from a trimmed paginated list item. Version metadata\n * (distTags/versions) and documentTypes are absent — the row lazy-loads them.\n */\nfunction makeRegistryPackageFromListItem(\n item: PackageListItem,\n status: RegistryPackageStatus,\n): RegistryPackage {\n return {\n name: item.name,\n path: item.path,\n documentTypes: [],\n version: item.version,\n latestVersion: item.version,\n status,\n manifest: {\n name: item.name,\n ...(item.description !== undefined\n ? { description: item.description }\n : {}),\n ...(item.category !== undefined ? { category: item.category } : {}),\n ...(item.publisher !== undefined ? { publisher: item.publisher } : {}),\n },\n };\n}\n\nfunction makeRegistryPackageFromDocumentModelLib(\n documentModelLib: DocumentModelLib,\n status: RegistryPackageStatus,\n version?: string,\n): RegistryPackage {\n return {\n name: documentModelLib.manifest.name,\n path: \"stub-path\",\n documentTypes: documentModelLib.documentModels.map(\n (d) => d.documentModel.global.id,\n ),\n status,\n manifest: slimManifest(documentModelLib.manifest),\n version,\n };\n}\n\nfunction makeRegistryPackageFromPackageInfo(\n packageInfo: PackageInfo,\n status: RegistryPackageStatus,\n): RegistryPackage {\n return {\n ...packageInfo,\n // The full-info `version` is the registry's newest release — record it\n // as the latest-stream target even for installed rows (whose `version`\n // is then refreshed to the installed one by the map merge).\n latestVersion: packageInfo.version,\n // Slim before caching: registry manifests are unvalidated JSON and have\n // carried multi-megabyte junk fields that blew the localStorage quota\n // (and the UI only reads the summary fields anyway).\n manifest: slimManifest(packageInfo.manifest),\n documentTypes: packageInfo.manifest?.documentModels?.map((d) => d.id) ?? [],\n status,\n };\n}\n\n/**\n * Like usehooks-ts' useLocalStorage, but persistence is best-effort: a failed\n * `setItem` (e.g. QuotaExceededError on an oversized payload) keeps the\n * in-memory state so the package manager still works for the session.\n * useLocalStorage couples the state update to the write — when the write\n * threw, the freshly fetched package list was discarded and the registry UI\n * rendered (and searched) an empty list.\n *\n * The key is derived from the boot-time runtime config and never changes\n * within a session, so no key-change rehydration is needed.\n */\nfunction useBestEffortLocalStorage<T>(key: string, initialValue: T) {\n const [value, setValue] = useState<T>(\n () => readJsonFromStorage<T>(key) ?? initialValue,\n );\n\n useEffect(() => {\n try {\n window.localStorage.setItem(key, JSON.stringify(value));\n } catch (error) {\n // Free the key and retry once — a stale oversized entry from an older\n // session may be occupying the quota this write needs.\n try {\n window.localStorage.removeItem(key);\n window.localStorage.setItem(key, JSON.stringify(value));\n } catch {\n console.warn(\n `Failed to persist \"${key}\" to localStorage; continuing with in-memory data.`,\n error,\n );\n }\n }\n }, [key, value]);\n\n return [value, setValue] as const;\n}\n\nfunction readJsonFromStorage<T>(key: string): T | null {\n try {\n const raw = window.localStorage.getItem(key);\n return raw === null ? null : (JSON.parse(raw) as T);\n } catch {\n return null;\n }\n}\n\n/**\n * When refreshing a cached entry, promote `\"available\"` to whatever the\n * packageManager now reports — the cached `\"available\"` was almost certainly\n * recorded before `packageManager.addPackages()` finished on a prior session.\n * Never downgrade an already-installed entry, and never overwrite a deliberate\n * `\"dismissed\"` choice.\n */\nfunction promoteStatus(\n cachedStatus: RegistryPackageStatus,\n packageSource: RegistryPackageSource | null,\n): RegistryPackageStatus {\n if (cachedStatus !== \"available\") return cachedStatus;\n if (packageSource === null) return cachedStatus;\n return getPackageStatusFromPackageSource(packageSource);\n}\n\nfunction getPackageStatusFromPackageSource(\n packageSource: RegistryPackageSource | null,\n): RegistryPackageStatus {\n // if we check the package source for a package that came from the api and it doesn't exist yet,\n // then we know the package is available on the api but not installed\n if (packageSource === null) return \"available\";\n // show common package, local project package and locally installed packages as \"local-install\"\n if (\n packageSource === \"local-install\" ||\n packageSource === \"common\" ||\n packageSource === \"project\"\n )\n return \"local-install\";\n // show \"registry-install\" status for package source \"registry-install\"\n if (packageSource === \"registry-install\") return \"registry-install\";\n // fallback to available — we should probably do more checks here\n return \"available\";\n}\n"],"names":[],"mappings":"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","debug_id":"fb71e699-833f-5b63-b16a-6bbe5dea2a78"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@powerhousedao/connect",
|
|
3
3
|
"productName": "Powerhouse-Connect",
|
|
4
|
-
"version": "6.2.3-dev.
|
|
4
|
+
"version": "6.2.3-dev.41",
|
|
5
5
|
"description": "Powerhouse Connect",
|
|
6
6
|
"main": "dist/index.html",
|
|
7
7
|
"type": "module",
|
|
@@ -37,6 +37,7 @@
|
|
|
37
37
|
"./dist/main.js",
|
|
38
38
|
"./dist/start-connect.js",
|
|
39
39
|
"./dist/i18n-*.js",
|
|
40
|
+
"./src/i18n/index.ts",
|
|
40
41
|
"./dist/style.css"
|
|
41
42
|
],
|
|
42
43
|
"license": "AGPL-3.0-only",
|
|
@@ -55,22 +56,23 @@
|
|
|
55
56
|
"@openfeature/core": "1.9.1",
|
|
56
57
|
"@openfeature/web-sdk": "1.6.2",
|
|
57
58
|
"@openpanel/web": "^1.4.1",
|
|
58
|
-
"@powerhousedao/config": "6.2.3-dev.
|
|
59
|
-
"@powerhousedao/design-system": "6.2.3-dev.
|
|
59
|
+
"@powerhousedao/config": "6.2.3-dev.41",
|
|
60
|
+
"@powerhousedao/design-system": "6.2.3-dev.41",
|
|
60
61
|
"@powerhousedao/document-engineering": "1.40.5",
|
|
61
|
-
"@powerhousedao/powerhouse-vetra-packages": "6.2.3-dev.
|
|
62
|
-
"@powerhousedao/reactor": "6.2.3-dev.
|
|
63
|
-
"@powerhousedao/reactor-attachments": "6.2.3-dev.
|
|
64
|
-
"@powerhousedao/reactor-browser": "6.2.3-dev.
|
|
65
|
-
"@powerhousedao/reactor-mcp": "6.2.3-dev.
|
|
66
|
-
"@powerhousedao/shared": "6.2.3-dev.
|
|
67
|
-
"@powerhousedao/vetra": "6.2.3-dev.
|
|
62
|
+
"@powerhousedao/powerhouse-vetra-packages": "6.2.3-dev.41",
|
|
63
|
+
"@powerhousedao/reactor": "6.2.3-dev.41",
|
|
64
|
+
"@powerhousedao/reactor-attachments": "6.2.3-dev.41",
|
|
65
|
+
"@powerhousedao/reactor-browser": "6.2.3-dev.41",
|
|
66
|
+
"@powerhousedao/reactor-mcp": "6.2.3-dev.41",
|
|
67
|
+
"@powerhousedao/shared": "6.2.3-dev.41",
|
|
68
|
+
"@powerhousedao/vetra": "6.2.3-dev.41",
|
|
69
|
+
"@powerhousedao/workflow": "6.2.3-dev.41",
|
|
68
70
|
"@privy-io/react-auth": "3.35.0",
|
|
69
71
|
"@rainbow-me/rainbowkit": "^2.2.11",
|
|
70
|
-
"@renown/sdk": "6.2.3-dev.
|
|
72
|
+
"@renown/sdk": "6.2.3-dev.41",
|
|
71
73
|
"@sentry/react": "^10.17.0",
|
|
72
74
|
"@tanstack/react-query": "^5.90.2",
|
|
73
|
-
"document-model": "6.2.3-dev.
|
|
75
|
+
"document-model": "6.2.3-dev.41",
|
|
74
76
|
"i18next": "^25.5.3",
|
|
75
77
|
"kysely": "0.28.16",
|
|
76
78
|
"kysely-pglite-dialect": "1.2.0",
|
|
@@ -97,15 +99,14 @@
|
|
|
97
99
|
"@types/react": "19.2.14",
|
|
98
100
|
"@types/react-dom": "19.2.3",
|
|
99
101
|
"@types/wicg-file-system-access": "^2023.10.7",
|
|
100
|
-
"@vitejs/plugin-react": "6.
|
|
101
|
-
"cypress": "^14.5.4",
|
|
102
|
+
"@vitejs/plugin-react": "6.1.1",
|
|
102
103
|
"happy-dom": "^20.8.9",
|
|
103
104
|
"react": "19.2.6",
|
|
104
105
|
"react-dom": "19.2.6",
|
|
105
106
|
"tailwindcss": "4.2.2",
|
|
106
|
-
"tsdown": "0.
|
|
107
|
-
"
|
|
108
|
-
"vite
|
|
107
|
+
"tsdown": "0.23.0",
|
|
108
|
+
"typescript": "7.0.2",
|
|
109
|
+
"vite": "8.3.0",
|
|
109
110
|
"vite-tsconfig-paths": "6.1.1"
|
|
110
111
|
},
|
|
111
112
|
"peerDependencies": {
|
|
@@ -114,7 +115,7 @@
|
|
|
114
115
|
},
|
|
115
116
|
"scripts": {
|
|
116
117
|
"tsc": "tsc",
|
|
117
|
-
"lint": "
|
|
118
|
+
"lint": "cd ../.. && oxlint apps/connect",
|
|
118
119
|
"test": "vitest --run",
|
|
119
120
|
"dev": "vite dev",
|
|
120
121
|
"build": "pnpm run build:bundle && pnpm run build:css",
|
|
@@ -122,7 +123,6 @@
|
|
|
122
123
|
"build:css": "pnpm exec tailwindcss -i style.css -o dist/style.css",
|
|
123
124
|
"build:debug": "cross-env PH_DEBUG_BUILD=true vite build",
|
|
124
125
|
"preview": "vite preview",
|
|
125
|
-
"cy:open": "cypress open",
|
|
126
126
|
"docker:build": "docker build -f ./Dockerfile --tag connect-test-dev --build-arg TAG=dev .",
|
|
127
127
|
"docker:run": "docker run -it -p 4000:4000 -v $(realpath ../../../monorepo):/monorepo -v $(pwd)/nginx.conf:/etc/nginx/nginx.conf.template -e PH_CONNECT_BASE_PATH=/develop/powerhouse/connect -e PORT=4000 connect-test-dev"
|
|
128
128
|
}
|
package/style.css
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
/*
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
design-system, vetra, or powerhouse-vetra-packages styles. */
|
|
5
|
-
@layer external-packages;
|
|
1
|
+
/* Package CSS goes in external-packages: above the reset, below Connect's
|
|
2
|
+
utilities. Keep in sync with LAYER_ORDER in src/package-manager.ts. */
|
|
3
|
+
@layer theme, base, components, external-packages, utilities;
|
|
6
4
|
/* Pull in the design-system's Tailwind theme extension (theme block with all
|
|
7
5
|
color, font, and spacing tokens) so they are available before Tailwind
|
|
8
6
|
generates utility classes below. Also defines the dark-mode custom variant. */
|
|
@@ -27,3 +25,7 @@
|
|
|
27
25
|
/* Component styles for powerhouse-vetra-packages and vetra. */
|
|
28
26
|
@import "@powerhousedao/powerhouse-vetra-packages/style.css";
|
|
29
27
|
@import "@powerhousedao/vetra/style.css";
|
|
28
|
+
/* Loaded like vetra's: a local package mounts no stylesheet of its own, so the
|
|
29
|
+
workflow editors' and canvas styles ride with Connect's. Class-scoped, so a
|
|
30
|
+
deployment with workflows off pays bytes, not behaviour. */
|
|
31
|
+
@import "@powerhousedao/workflow/style.css";
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"InspectorModal-DoEQVQYq.js","sources":["../src/components/modal/modals/InspectorModal/useDbExplorer.ts","../src/components/modal/modals/InspectorModal/useDebugInspector.ts","../src/components/modal/modals/InspectorModal/useIntegrityInspector.ts","../src/components/modal/modals/InspectorModal/useProcessorsInspector.ts","../src/components/modal/modals/InspectorModal/useQueueInspector.ts","../src/components/modal/modals/InspectorModal/useRemotesInspector.ts","../src/components/modal/modals/InspectorModal/useWorkerInspector.ts","../src/components/modal/modals/InspectorModal/InspectorModal.tsx"],"sourcesContent":["import type { PGlite } from \"@electric-sql/pglite\";\nimport {\n getCachedReactorPgMajor,\n loadPgDump,\n resolvePgMajorForRuntime,\n} from \"@powerhousedao/connect/utils\";\nimport type {\n FilterGroup,\n SortOptions,\n} from \"@powerhousedao/design-system/connect\";\nimport type { Database } from \"@powerhousedao/reactor\";\nimport {\n REACTOR_SCHEMA,\n useDatabase,\n usePGlite,\n useReactorClientModule,\n type IQueue,\n} from \"@powerhousedao/reactor-browser\";\nimport type { IInspectorProxy } from \"@powerhousedao/reactor-browser/rpc\";\nimport { Kysely, sql } from \"kysely\";\nimport { PGliteDialect } from \"kysely-pglite-dialect\";\nimport { useCallback, useMemo } from \"react\";\n\nasync function quiesceQueue(queue: IQueue): Promise<void> {\n await new Promise<void>((resolve) => queue.block(() => resolve()));\n}\n\n// The reactor runs with `relaxedDurability: true`, which makes PGlite's\n// `syncToFs()` fire the IDBFS→IndexedDB write and return without awaiting\n// Emscripten's syncfs callback. `close()` also doesn't flush. Calling\n// `FS.syncfs(false, cb)` directly gives us a callback that fires from the\n// IDBFS transaction's `oncomplete` — i.e. after IDB has actually committed.\nasync function syncPgliteToIdb(pglite: {\n readonly Module: {\n readonly FS: {\n syncfs(populate: boolean, cb: (err: Error | null) => void): void;\n };\n };\n}): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n pglite.Module.FS.syncfs(false, (err) => (err ? reject(err) : resolve()));\n });\n}\n\ntype ColumnInfo = {\n readonly name: string;\n readonly dataType: string;\n readonly isNullable: boolean;\n};\n\ntype TableInfo = {\n readonly name: string;\n readonly columns: ColumnInfo[];\n};\n\ntype ColumnRow = {\n table_name: string;\n column_name: string;\n data_type: string;\n is_nullable: string;\n};\n\ntype GetTableRowsOptions = {\n readonly schema?: string;\n readonly limit: number;\n readonly offset: number;\n readonly sort?: SortOptions;\n readonly filters?: FilterGroup;\n};\n\ntype TablePage = {\n readonly columns: string[];\n readonly rows: Record<string, unknown>[];\n readonly total: number | null;\n};\n\nconst PRIORITY_COLUMNS = [\n \"documentType\",\n \"documentId\",\n \"scope\",\n \"branch\",\n \"index\",\n \"skip\",\n] as const;\n\ntype ReactorPgliteAdapter = {\n query: (\n sql: string,\n params?: unknown[],\n ) => Promise<{ rows: unknown[]; affectedRows?: number }>;\n};\n\nfunction createWorkerReactorDatabase(\n inspector: IInspectorProxy,\n): Kysely<Database> {\n const adapter: ReactorPgliteAdapter = {\n query: async (statement, params) => ({\n rows: (await inspector.queryReactorDb(statement, params)) as unknown[],\n }),\n };\n return new Kysely<Database>({\n dialect: new PGliteDialect(adapter as unknown as PGlite),\n });\n}\n\nexport function useDbExplorer() {\n const browserDatabase = useDatabase();\n const pglite = usePGlite();\n const module = useReactorClientModule();\n const reactorClientModule = module?.kind === \"browser\" ? module : undefined;\n const reactor = reactorClientModule?.reactorModule?.reactor;\n const queue = reactorClientModule?.reactorModule?.queue;\n const workerModule = module?.kind === \"worker\" ? module : undefined;\n const workerDatabase = useMemo(\n () =>\n workerModule\n ? createWorkerReactorDatabase(workerModule.inspector)\n : undefined,\n [workerModule],\n );\n const database = browserDatabase ?? workerDatabase;\n\n const getTables = useCallback(async (): Promise<TableInfo[]> => {\n if (!database) return [];\n\n const result = await sql<ColumnRow>`\n SELECT\n c.table_name,\n c.column_name,\n c.data_type,\n c.is_nullable\n FROM information_schema.columns c\n INNER JOIN information_schema.tables t\n ON c.table_name = t.table_name\n AND c.table_schema = t.table_schema\n WHERE c.table_schema = ${REACTOR_SCHEMA}\n AND t.table_type = 'BASE TABLE'\n ORDER BY c.table_name, c.ordinal_position\n `.execute(database);\n\n const tableMap = new Map<string, ColumnInfo[]>();\n for (const row of result.rows) {\n if (!tableMap.has(row.table_name)) {\n tableMap.set(row.table_name, []);\n }\n tableMap.get(row.table_name)!.push({\n name: row.column_name,\n dataType: row.data_type,\n isNullable: row.is_nullable === \"YES\",\n });\n }\n\n return Array.from(tableMap).map(([name, columns]) => {\n const columnNames = columns.map((col) => col.name);\n const orderedColumns = [\n ...PRIORITY_COLUMNS.filter((col) => columnNames.includes(col)).map(\n (col) => columns.find((c) => c.name === col)!,\n ),\n ...columns.filter(\n (col) =>\n !PRIORITY_COLUMNS.includes(\n col.name as (typeof PRIORITY_COLUMNS)[number],\n ),\n ),\n ];\n return {\n name,\n columns: orderedColumns,\n };\n });\n }, [database]);\n\n const getTableRows = useCallback(\n async (table: string, options: GetTableRowsOptions): Promise<TablePage> => {\n if (!database) {\n return { columns: [], rows: [], total: null };\n }\n\n const limit = options.limit;\n const offset = options.offset;\n const sort = options.sort;\n const filters = options.filters;\n const tableRef = sql.raw(`${REACTOR_SCHEMA}.\"${table}\"`);\n\n // Build WHERE clause from filters\n let whereClause = sql``;\n if (filters?.clauses && filters.clauses.length > 0) {\n const conditions: ReturnType<typeof sql>[] = [];\n\n for (let i = 0; i < filters.clauses.length; i++) {\n const clause = filters.clauses[i];\n if (!clause) continue;\n\n const columnRef = sql.raw(`\"${clause.column}\"`);\n\n let condition: ReturnType<typeof sql>;\n\n if (clause.operator === \"IS NULL\") {\n condition = sql`${columnRef} IS NULL`;\n } else if (clause.operator === \"IS NOT NULL\") {\n condition = sql`${columnRef} IS NOT NULL`;\n } else if (\n clause.operator === \"LIKE\" ||\n clause.operator === \"ILIKE\"\n ) {\n const value = clause.value;\n const operator =\n clause.operator === \"LIKE\" ? sql`LIKE` : sql`ILIKE`;\n condition = sql`${columnRef} ${operator} ${value}`;\n } else {\n // For =, !=, >, <, >=, <=\n const operator = sql.raw(clause.operator);\n const value = clause.value;\n\n // Try to parse as number if it looks like a number\n let parsedValue: string | number = value;\n if (value !== \"\" && !isNaN(Number(value)) && value.trim() !== \"\") {\n parsedValue = Number(value);\n }\n\n condition = sql`${columnRef} ${operator} ${parsedValue}`;\n }\n\n conditions.push(condition);\n\n // Add connector if not the last clause\n if (i < filters.clauses.length - 1) {\n const connector = filters.connectors?.[i] ?? \"AND\";\n conditions.push(sql.raw(connector));\n }\n }\n\n // Combine all conditions\n if (conditions.length > 0) {\n whereClause = sql`WHERE ${sql.join(conditions, sql` `)}`;\n }\n }\n\n // Build main query\n let query;\n if (sort) {\n const columnRef = sql.raw(`\"${sort.column}\"`);\n const direction = sort.direction === \"desc\" ? sql`DESC` : sql`ASC`;\n query = sql<Record<string, unknown>>`\n SELECT * FROM ${tableRef}\n ${whereClause}\n ORDER BY ${columnRef} ${direction}\n LIMIT ${limit} OFFSET ${offset}\n `;\n } else {\n query = sql<Record<string, unknown>>`\n SELECT * FROM ${tableRef}\n ${whereClause}\n LIMIT ${limit} OFFSET ${offset}\n `;\n }\n\n const result = await query.execute(database);\n\n // Build count query with same filters\n const countQuery = sql<{ count: string }>`\n SELECT COUNT(*) as count FROM ${tableRef}\n ${whereClause}\n `;\n const countResult = await countQuery.execute(database);\n const total = countResult.rows[0]\n ? parseInt(countResult.rows[0].count, 10)\n : null;\n\n const rawColumns =\n result.rows.length > 0 ? Object.keys(result.rows[0]) : [];\n const columns = [\n ...PRIORITY_COLUMNS.filter((col) => rawColumns.includes(col)),\n ...rawColumns.filter(\n (col) =>\n !PRIORITY_COLUMNS.includes(\n col as (typeof PRIORITY_COLUMNS)[number],\n ),\n ),\n ];\n\n return {\n columns,\n rows: result.rows,\n total,\n };\n },\n [database],\n );\n\n const onExportDb = useCallback(async () => {\n if (!pglite) return;\n\n if (queue) await quiesceQueue(queue);\n\n try {\n const major = resolvePgMajorForRuntime(getCachedReactorPgMajor() ?? null);\n const pgDump = await loadPgDump(major);\n const dump = await pgDump({ pg: pglite });\n const sqlContent = await dump.text();\n\n const blob = new Blob([sqlContent], { type: \"text/sql\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `database-export-${Date.now()}.sql`;\n a.click();\n URL.revokeObjectURL(url);\n } finally {\n queue?.unblock();\n }\n }, [pglite, queue]);\n\n const onImportDb = useCallback(\n async (sqlContent: string) => {\n if (!pglite) return;\n\n if (queue) await quiesceQueue(queue);\n\n if (reactor) {\n const status = reactor.kill();\n await status.completed;\n }\n\n // drop every user-created schema before restoring\n await pglite.transaction(async (tx) => {\n const schemas = await tx.query<{ nspname: string }>(\n `SELECT nspname FROM pg_namespace\n WHERE nspname NOT IN ('pg_catalog', 'pg_toast', 'information_schema', 'public')\n AND nspname NOT LIKE 'pg_temp_%'\n AND nspname NOT LIKE 'pg_toast_temp_%'`,\n );\n for (const { nspname } of schemas.rows) {\n await tx.exec(`DROP SCHEMA IF EXISTS \"${nspname}\" CASCADE`);\n }\n try {\n await tx.exec(\"SET standard_conforming_strings = off;\");\n } catch {\n // PG17 still accepts this but log if it ever fails.\n }\n await tx.exec(sqlContent);\n await tx.exec(`SET search_path TO ${REACTOR_SCHEMA}`);\n });\n\n // flush IDBFS → IndexedDB synchronously\n await syncPgliteToIdb(pglite);\n\n window.location.reload();\n\n // reload() is asynchronous; without blocking here the DBExplorer caller\n // would continue and call loadTables() against an in-flight shutdown.\n await new Promise(() => {});\n },\n [pglite, queue, reactor],\n );\n\n const getDefaultSort = useCallback(\n (table: string): SortOptions | undefined => {\n if (table === \"Operation\") {\n return { column: \"timestampUtcMs\", direction: \"desc\" };\n }\n return undefined;\n },\n [],\n );\n\n const canModifyDb = !!pglite;\n\n return {\n getTables,\n getTableRows,\n getDefaultSort,\n onExportDb: canModifyDb ? onExportDb : undefined,\n onImportDb: canModifyDb ? onImportDb : undefined,\n };\n}\n","import { clearReactorStorage } from \"@powerhousedao/connect/store\";\nimport {\n getCachedReactorPgMajor,\n PENDING_PG_SEED_KEY,\n subscribeReactorPgMajor,\n} from \"@powerhousedao/connect/utils\";\nimport { useCallback, useSyncExternalStore } from \"react\";\n\nconst SUPPORTED_PG_VERSIONS = [16, 17] as const;\n\nexport function useDebugInspector() {\n const currentPgVersion = useSyncExternalStore(\n subscribeReactorPgMajor,\n getCachedReactorPgMajor,\n () => undefined,\n );\n\n const onResetToPgVersion = useCallback(async (major: number) => {\n console.info(`[debug-inspector] Reset requested: PG${major}`);\n try {\n localStorage.setItem(PENDING_PG_SEED_KEY, String(major));\n console.info(`[debug-inspector] Clearing reactor storage...`);\n await clearReactorStorage();\n console.info(`[debug-inspector] Storage cleared. Reloading...`);\n window.location.reload();\n } catch (err) {\n console.error(\"[debug-inspector] Reset failed:\", err);\n localStorage.removeItem(PENDING_PG_SEED_KEY);\n throw err;\n }\n }, []);\n\n return {\n supportedPgVersions: SUPPORTED_PG_VERSIONS,\n currentPgVersion: currentPgVersion ?? null,\n onResetToPgVersion,\n };\n}\n","import type { IntegrityInspectorProps } from \"@powerhousedao/design-system/connect\";\nimport {\n DocumentIntegrityService,\n useReactorClientModule,\n type RebuildResult,\n type ValidationResult,\n} from \"@powerhousedao/reactor-browser\";\nimport { useCallback, useMemo } from \"react\";\n\nexport function useIntegrityInspector(): IntegrityInspectorProps | undefined {\n const module = useReactorClientModule();\n const reactorModule =\n module?.kind === \"browser\" ? module.reactorModule : undefined;\n const inspector = module?.kind === \"worker\" ? module.inspector : undefined;\n\n const service = useMemo(() => {\n if (!reactorModule) return undefined;\n\n return new DocumentIntegrityService(\n reactorModule.keyframeStore,\n reactorModule.operationStore,\n reactorModule.writeCache,\n reactorModule.documentView,\n reactorModule.documentModelRegistry,\n );\n }, [reactorModule]);\n\n const onValidate = useCallback(\n async (documentId: string, branch?: string): Promise<ValidationResult> => {\n if (inspector) {\n return (await inspector.validateDocument(\n documentId,\n branch,\n )) as ValidationResult;\n }\n if (!service) {\n throw new Error(\"Reactor module not available\");\n }\n return service.validateDocument(documentId, branch);\n },\n [service, inspector],\n );\n\n const onRebuildKeyframes = useCallback(\n async (documentId: string, branch?: string): Promise<RebuildResult> => {\n if (inspector) {\n return (await inspector.rebuildKeyframes(\n documentId,\n branch,\n )) as RebuildResult;\n }\n if (!service) {\n throw new Error(\"Reactor module not available\");\n }\n return service.rebuildKeyframes(documentId, branch);\n },\n [service, inspector],\n );\n\n const onRebuildSnapshots = useCallback(\n async (documentId: string, branch?: string): Promise<RebuildResult> => {\n if (inspector) {\n return (await inspector.rebuildSnapshots(\n documentId,\n branch,\n )) as RebuildResult;\n }\n if (!service) {\n throw new Error(\"Reactor module not available\");\n }\n return service.rebuildSnapshots(documentId, branch);\n },\n [service, inspector],\n );\n\n if (!service && !inspector) {\n return undefined;\n }\n\n return {\n onValidate,\n onRebuildKeyframes,\n onRebuildSnapshots,\n };\n}\n","import type {\n ProcessorInfo,\n ProcessorsInspectorProps,\n} from \"@powerhousedao/design-system/connect\";\nimport { useReactorClientModule } from \"@powerhousedao/reactor-browser\";\nimport { useCallback, useMemo } from \"react\";\n\nexport function useProcessorsInspector(): ProcessorsInspectorProps | undefined {\n const module = useReactorClientModule();\n const processorManager =\n module?.kind === \"browser\"\n ? module.reactorModule?.processorManager\n : undefined;\n const inspector = module?.kind === \"worker\" ? module.inspector : undefined;\n\n const available = useMemo(\n () => processorManager != null || inspector != null,\n [processorManager, inspector],\n );\n\n const getProcessors = useCallback((): Promise<ProcessorInfo[]> => {\n if (inspector) {\n return inspector.getProcessors() as Promise<ProcessorInfo[]>;\n }\n if (!processorManager) {\n return Promise.resolve([]);\n }\n return Promise.resolve(\n processorManager.getAll().map((tracked) => ({\n processorId: tracked.processorId,\n factoryId: tracked.factoryId,\n driveId: tracked.driveId,\n processorIndex: tracked.processorIndex,\n lastOrdinal: tracked.lastOrdinal,\n status: tracked.status,\n lastError: tracked.lastError,\n lastErrorTimestamp: tracked.lastErrorTimestamp,\n })),\n );\n }, [processorManager, inspector]);\n\n const onRetry = useCallback(\n async (processorId: string) => {\n if (inspector) {\n await inspector.retryProcessor(processorId);\n return;\n }\n if (!processorManager) return;\n const tracked = processorManager.get(processorId);\n if (tracked) {\n await tracked.retry();\n }\n },\n [processorManager, inspector],\n );\n\n if (!available) {\n return undefined;\n }\n\n return {\n getProcessors,\n onRetry,\n };\n}\n","import type {\n QueueInspectorProps,\n QueueState,\n} from \"@powerhousedao/design-system/connect\";\nimport {\n InMemoryQueue,\n useReactorClientModule,\n type Job,\n} from \"@powerhousedao/reactor-browser\";\nimport { useCallback, useMemo } from \"react\";\n\nexport function useQueueInspector(): QueueInspectorProps | undefined {\n const module = useReactorClientModule();\n const reactorClientModule = module?.kind === \"browser\" ? module : undefined;\n const inspector = module?.kind === \"worker\" ? module.inspector : undefined;\n const queue = reactorClientModule?.reactorModule?.queue;\n\n const inMemoryQueue = useMemo(() => {\n if (queue instanceof InMemoryQueue) {\n return queue;\n }\n return undefined;\n }, [queue]);\n\n const getQueueState = useCallback((): Promise<QueueState> => {\n if (inspector) {\n return inspector.getQueueState() as Promise<QueueState>;\n }\n if (!inMemoryQueue) {\n return Promise.resolve({\n isPaused: false,\n pendingJobs: [],\n executingJobs: [],\n totalPending: 0,\n totalExecuting: 0,\n });\n }\n\n const pendingJobs = inMemoryQueue.getPendingJobs();\n const executingJobIds = inMemoryQueue.getExecutingJobIds();\n\n const executingJobs: Job[] = [];\n for (const jobIdSet of executingJobIds.values()) {\n for (const jobId of jobIdSet) {\n const job = inMemoryQueue.getJob(jobId);\n if (job) {\n executingJobs.push(job);\n }\n }\n }\n\n return Promise.resolve({\n isPaused: inMemoryQueue.paused,\n pendingJobs,\n executingJobs,\n totalPending: pendingJobs.length,\n totalExecuting: executingJobs.length,\n });\n }, [inMemoryQueue, inspector]);\n\n const onPause = useCallback(async (): Promise<void> => {\n if (inspector) {\n await inspector.pauseQueue();\n return;\n }\n if (inMemoryQueue) {\n inMemoryQueue.pause();\n }\n }, [inMemoryQueue, inspector]);\n\n const onResume = useCallback(async (): Promise<void> => {\n if (inspector) {\n await inspector.resumeQueue();\n return;\n }\n if (inMemoryQueue) {\n await inMemoryQueue.resume();\n }\n }, [inMemoryQueue, inspector]);\n\n if (!inMemoryQueue && !inspector) {\n return undefined;\n }\n\n return {\n getQueueState,\n onPause,\n onResume,\n };\n}\n","import type {\n ConnectionStateSnapshot,\n Remote,\n} from \"@powerhousedao/reactor-browser\";\nimport {\n addRemoteDrive,\n PollBehavior,\n useConnectionStates,\n useSync,\n} from \"@powerhousedao/reactor-browser\";\nimport { useCallback } from \"react\";\n\nexport function useRemotesInspector(): {\n getRemotes: () => Promise<Remote[]>;\n removeRemote: (name: string) => Promise<void>;\n addRemoteManual: (url: string) => Promise<void>;\n triggerPull: (name: string) => void;\n connectionStates: ReadonlyMap<string, ConnectionStateSnapshot>;\n} {\n const syncManager = useSync();\n if (!syncManager) {\n throw new Error(\"Sync manager not found\");\n }\n\n const connectionStates = useConnectionStates();\n\n const getRemotes = useCallback(() => {\n return Promise.resolve(syncManager.list());\n }, [syncManager]);\n\n const removeRemote = useCallback(\n (name: string) => syncManager.remove(name),\n [syncManager],\n );\n\n const addRemoteManual = useCallback(async (url: string) => {\n await addRemoteDrive(url, undefined, {\n pollBehavior: PollBehavior.Manual,\n });\n }, []);\n\n const triggerPull = useCallback(\n (name: string) => syncManager.triggerPull(name),\n [syncManager],\n );\n\n return {\n getRemotes,\n removeRemote,\n addRemoteManual,\n triggerPull,\n connectionStates,\n };\n}\n","import type { WorkerInspectorProps } from \"@powerhousedao/design-system/connect\";\nimport { useReactorClientModule } from \"@powerhousedao/reactor-browser\";\nimport { useMemo } from \"react\";\n\nexport function useWorkerInspector(): WorkerInspectorProps | undefined {\n const module = useReactorClientModule();\n const adminClient =\n module?.kind === \"worker\" ? module.adminClient : undefined;\n\n return useMemo(() => {\n if (!adminClient) {\n return undefined;\n }\n return {\n getInfo: () => adminClient.info(),\n onRestart: () => adminClient.restart(),\n };\n }, [adminClient]);\n}\n","import { InspectorModal as ConnectInspectorModal } from \"@powerhousedao/design-system/connect\";\nimport {\n closePHModal,\n REACTOR_SCHEMA,\n usePHModal,\n} from \"@powerhousedao/reactor-browser\";\nimport { useDbExplorer } from \"./useDbExplorer.js\";\nimport { useDebugInspector } from \"./useDebugInspector.js\";\nimport { useIntegrityInspector } from \"./useIntegrityInspector.js\";\nimport { useProcessorsInspector } from \"./useProcessorsInspector.js\";\nimport { useQueueInspector } from \"./useQueueInspector.js\";\nimport { useRemotesInspector } from \"./useRemotesInspector.js\";\nimport { useWorkerInspector } from \"./useWorkerInspector.js\";\n\nconst DEFAULT_PAGE_SIZE = 25;\n\nexport const InspectorModal: React.FC = () => {\n const phModal = usePHModal();\n const open = phModal?.type === \"inspector\";\n\n const { getTables, getTableRows, getDefaultSort, onExportDb, onImportDb } =\n useDbExplorer();\n const {\n getRemotes,\n removeRemote,\n addRemoteManual,\n triggerPull,\n connectionStates,\n } = useRemotesInspector();\n const queueInspectorProps = useQueueInspector();\n const processorsInspectorProps = useProcessorsInspector();\n const integrityInspectorProps = useIntegrityInspector();\n const workerInspectorProps = useWorkerInspector();\n const { currentPgVersion, supportedPgVersions, onResetToPgVersion } =\n useDebugInspector();\n\n return (\n <ConnectInspectorModal\n open={open}\n onOpenChange={(status) => {\n if (!status) closePHModal();\n }}\n dbExplorerProps={{\n schema: REACTOR_SCHEMA,\n getTables,\n getTableRows,\n getDefaultSort,\n pageSize: DEFAULT_PAGE_SIZE,\n onExportDb,\n onImportDb,\n pgVersionControl: {\n currentPgVersion,\n supportedPgVersions,\n onResetToPgVersion,\n },\n }}\n remotesInspectorProps={{\n getRemotes,\n removeRemote,\n addRemoteManual,\n triggerPull,\n connectionStates,\n }}\n queueInspectorProps={queueInspectorProps}\n processorsInspectorProps={processorsInspectorProps}\n integrityInspectorProps={integrityInspectorProps}\n workerInspectorProps={workerInspectorProps}\n />\n );\n};\n"],"names":["ConnectInspectorModal"],"mappings":"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","debug_id":"3ece21d4-b1c3-57b8-ba52-46f4fab7454b"}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import { t as AppLoader } from "./app-loader-CKTEeFBT.js";
|
|
2
|
-
export { AppLoader };
|
|
3
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="0a424c5c-f55c-5531-b8eb-ce06e3ad0ace")}catch(e){}}();
|
|
4
|
-
//# debugId=0a424c5c-f55c-5531-b8eb-ce06e3ad0ace
|