@powerhousedao/connect 6.2.3-dev.9 → 6.2.3
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-C1BXHTq3.js → ClearStorageModal-DyU-FIgY.js} +5 -5
- package/dist/{ClearStorageModal-C1BXHTq3.js.map → ClearStorageModal-DyU-FIgY.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-ClqHzcxM.js → DebugSettingsModal-CwUN9gIr.js} +7 -7
- package/dist/{DebugSettingsModal-ClqHzcxM.js.map → DebugSettingsModal-CwUN9gIr.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-7FQBTEzt.js → InspectorModal-Cd8kbCV8.js} +61 -21
- package/dist/InspectorModal-Cd8kbCV8.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-HFUPQMML.js} +5 -5
- package/dist/{MissingPackageModal-nBnExqO0.js.map → MissingPackageModal-HFUPQMML.js.map} +1 -1
- package/dist/{OpenFileDocumentsModal-DGaYJpXW.js → OpenFileDocumentsModal-BQsaBP4x.js} +8 -7
- package/dist/{OpenFileDocumentsModal-DGaYJpXW.js.map → OpenFileDocumentsModal-BQsaBP4x.js.map} +1 -1
- package/dist/{SettingsModal-CPv3_jmp.js → SettingsModal-CgjW-M2a.js} +17 -15
- package/dist/{SettingsModal-CPv3_jmp.js.map → SettingsModal-CgjW-M2a.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-D2bV-77j.js +4 -0
- package/dist/{app-loader-DyGcBhGV.js → app-loader-l5wtQh5z.js} +1160 -1121
- package/dist/app-loader-l5wtQh5z.js.map +1 -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-D9_h0032.js → build-info-BV8UtyA4.js} +5 -5
- package/dist/{build-info-D9_h0032.js.map → build-info-BV8UtyA4.js.map} +1 -1
- package/dist/components-BH57lxCU.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-Cu7S9GPc.js → load-ftpCX1HI.js} +13 -11
- package/dist/{load-Cu7S9GPc.js.map → load-ftpCX1HI.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-yC8BveHb.js → reactor-CItc8KaF.js} +68 -437
- package/dist/reactor-CItc8KaF.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-DuoU75ap.js} +73 -10
- package/dist/useRegistryPackages-DuoU75ap.js.map +1 -0
- package/package.json +19 -19
- package/style.css +7 -5
- package/dist/InspectorModal-7FQBTEzt.js.map +0 -1
- package/dist/app-loader-C4pFYc82.js +0 -4
- package/dist/app-loader-DyGcBhGV.js.map +0 -1
- package/dist/components-MEmS6hgr.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-yC8BveHb.js.map +0 -1
- package/dist/useRegistryPackages-BnUcL_nZ.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-manager-BbzIV9aN.js","sources":["../src/shared-deps.ts","../src/utils/pwa-idb.ts","../src/package-manager.ts"],"sourcesContent":["import { DYNAMIC_BASE_PLACEHOLDER } from \"@powerhousedao/shared/connect\";\n\nexport type SharedDeps = {\n imports: Record<string, string>;\n versions: Record<string, string>;\n};\n\n/**\n * Resolve the vendor's import-map values to absolute URLs: the\n * dynamic-base placeholder (present in dynamic-base builds) is replaced\n * with the runtime base — which `import.meta.env.BASE_URL` already is,\n * since the dynamic-base plugin rewrites it to the resolved base — and\n * the result is made absolute against the page origin. Absolute URLs are\n * what the worker needs: its imports have no document context, so\n * relative or placeholder-based values would not resolve there.\n */\nexport function normalizeVendorImports(\n rawImports: Record<string, string>,\n runtimeBase: string,\n): Record<string, string> {\n // `location` is a browser global; the fallback keeps the helper usable\n // from node-based tests, where no origin exists.\n const origin =\n (globalThis as { location?: Location }).location?.origin ??\n \"http://localhost\";\n return Object.fromEntries(\n Object.entries(rawImports).map(([spec, value]) => [\n spec,\n new URL(value.replace(DYNAMIC_BASE_PLACEHOLDER, runtimeBase), origin)\n .href,\n ]),\n );\n}\n\nlet cached: Promise<SharedDeps | null> | null = null;\n\n/**\n * The production vendor's shared-deps table: import-map entries for the\n * shared dependency set plus the resolved version of every shared package\n * in this build. Fails soft (`null`) when the vendor is not present (dev,\n * or a `PH_CONNECT_VENDOR=0` build) — callers treat that as \"no sharing\".\n * The promise is cached: the vendor table is immutable per build.\n */\nexport function getSharedDeps(): Promise<SharedDeps | null> {\n cached ??= (async () => {\n try {\n const mod = (await import(\n /* @vite-ignore */ `${import.meta.env.BASE_URL}__vendor__/shared-deps.js`\n )) as {\n imports: Record<string, string>;\n versions: Record<string, string>;\n };\n return {\n imports: normalizeVendorImports(mod.imports, import.meta.env.BASE_URL),\n versions: mod.versions,\n };\n } catch {\n return null;\n }\n })();\n return cached;\n}\n","import {\n PWA_IDB_KEY,\n PWA_IDB_NAME,\n PWA_IDB_STORE,\n PWA_IDB_VERSION,\n type PHConnectPwa,\n type PHConnectPwaIcon,\n} from \"@powerhousedao/shared/connect\";\n\n// The page-owned mirror of the effective PWA fragment contributed by the\n// currently-installed packages. The service worker reads this (read-only) to\n// serve a live web-app manifest — a SW cannot reach localStorage (where the\n// package list lives), so BrowserPackageManager writes the merged fragment\n// here on every package change. The db/store/key/version constants are the\n// SHARED source of truth in @powerhousedao/shared/connect, imported by both\n// this writer and the SW reader so the two cannot desync.\n\nexport type PwaFragmentRecord = {\n version: 1;\n fragment: PHConnectPwa;\n updatedAt: number;\n};\n\n// Self-contained IDB open (not reusing pglite-idb) so this module — and its\n// pure `resolveFragmentAssetUrls` — carries no dependency on connect.config,\n// keeping it importable in isolation.\nfunction openPwaIdb(): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const req = indexedDB.open(PWA_IDB_NAME, PWA_IDB_VERSION);\n req.onupgradeneeded = () => {\n if (!req.result.objectStoreNames.contains(PWA_IDB_STORE)) {\n req.result.createObjectStore(PWA_IDB_STORE);\n }\n };\n req.onerror = () => reject(req.error ?? new Error(\"ph-pwa open failed\"));\n req.onblocked = () => reject(new Error(\"ph-pwa open blocked\"));\n req.onsuccess = () => resolve(req.result);\n });\n}\n\n/** Write (replace) the single merged fragment record. Best-effort: a failure to\n * mirror the manifest must never break package installation, so callers ignore\n * rejections. No-op when IndexedDB is unavailable (SSR/tests). */\nexport async function writeMergedPwaFragment(\n fragment: PHConnectPwa,\n): Promise<void> {\n if (typeof indexedDB === \"undefined\") return;\n const db = await openPwaIdb();\n try {\n await new Promise<void>((resolve, reject) => {\n const tx = db.transaction(PWA_IDB_STORE, \"readwrite\");\n tx.oncomplete = () => resolve();\n tx.onerror = () =>\n reject(tx.error ?? new Error(\"PWA fragment write failed\"));\n tx.objectStore(PWA_IDB_STORE).put(\n {\n version: 1,\n fragment,\n updatedAt: Date.now(),\n } satisfies PwaFragmentRecord,\n PWA_IDB_KEY,\n );\n });\n } finally {\n db.close();\n }\n}\n\n/** Resolve `src` against the package `baseUrl`, absolute srcs passing through.\n * `baseUrl` may itself be relative (e.g. a same-origin-proxied registry, or the\n * dev `/node_modules/…` path), so it is first made absolute against the app\n * origin — `new URL(src, relativeBase)` would otherwise throw and silently\n * leave the src unresolved. A malformed src is left untouched. */\nfunction toAbsoluteAssetUrl(src: string, baseUrl: string): string {\n try {\n const origin =\n typeof location !== \"undefined\" ? location.href : \"http://localhost/\";\n return new URL(src, new URL(baseUrl, origin)).toString();\n } catch {\n return src;\n }\n}\n\nfunction resolveIconSrc(\n icon: PHConnectPwaIcon,\n baseUrl: string,\n): PHConnectPwaIcon {\n return { ...icon, src: toAbsoluteAssetUrl(icon.src, baseUrl) };\n}\n\n/**\n * Rewrite a package fragment's relative asset srcs (manifest icons and\n * file-handler icons) to absolute URLs against the package's base — a runtime\n * package's assets live on the registry CDN, not the app origin, so the served\n * manifest must point there. `baseUrl` null (a local/bundled package whose\n * assets are app-origin-relative) leaves srcs untouched.\n */\nexport function resolveFragmentAssetUrls(\n config: PHConnectPwa,\n baseUrl: string | null,\n): PHConnectPwa {\n if (!baseUrl || !config.manifest) return config;\n const m = config.manifest;\n const resolveIcons = (icons?: PHConnectPwaIcon[]) =>\n icons?.map((icon) => resolveIconSrc(icon, baseUrl));\n return {\n ...config,\n manifest: {\n ...m,\n icons: resolveIcons(m.icons),\n file_handlers: m.file_handlers?.map((handler) => ({\n ...handler,\n icons: resolveIcons(handler.icons),\n })),\n },\n };\n}\n","import * as common from \"@powerhousedao/powerhouse-vetra-packages\";\nimport commonPkg from \"@powerhousedao/powerhouse-vetra-packages/package.json\" with { type: \"json\" };\nimport type {\n IPackagesListener,\n PackageManagerInstallResult,\n} from \"@powerhousedao/reactor-browser\";\nimport {\n BrowserLocalStorage,\n type IPackageListerUnsubscribe,\n type IPackageManager,\n} from \"@powerhousedao/reactor-browser\";\nimport {\n checkSharedDeps,\n formatSharedDepWarnings,\n mergePwaConfig,\n type PHConnectPwa,\n type PwaContribution,\n withInferredCategory,\n} from \"@powerhousedao/shared/connect\";\nimport {\n type DocumentModelLib,\n type DocumentModelModule,\n PwaConfigSchema,\n} from \"@powerhousedao/shared/document-model\";\nimport { toCdnUrl } from \"@powerhousedao/shared/registry/urls\";\nimport { getSharedDeps } from \"./shared-deps.js\";\nimport {\n resolveFragmentAssetUrls,\n writeMergedPwaFragment,\n} from \"./utils/pwa-idb.js\";\nimport { refreshPwaManifestLink } from \"./utils/pwa-manifest-link.js\";\nimport vetraPkg from \"@powerhousedao/vetra/package.json\" with { type: \"json\" };\nimport workflowPkg from \"@powerhousedao/workflow/package.json\" with { type: \"json\" };\n\ntype PackageMeta = {\n name: string;\n importUrl: string | null;\n stylesheetUrl: string | null;\n version?: string;\n /**\n * Full spec the user asked for (e.g. `@scope/pkg@2.0.0-beta.2`). Kept so a\n * reload re-installs exactly the tag/version originally picked rather than\n * sliding to `latest`. Absent for legacy entries and local packages.\n */\n spec?: string;\n};\n\n/**\n * Strip any `@tag` / `@version` suffix from a package spec, returning the bare\n * package name. Mirrors `parsePackageSpec` on the UI side.\n */\nfunction parseBareName(spec: string): string {\n const trimmed = spec.trim();\n const at = trimmed.startsWith(\"@\")\n ? trimmed.lastIndexOf(\"@\")\n : trimmed.indexOf(\"@\");\n return at > 0 ? trimmed.slice(0, at) : trimmed;\n}\n\ntype PackageWithMeta = PackageMeta & {\n loadedPackage: DocumentModelLib<any>;\n spec?: string;\n};\n\ntype FetchedPackageJson = {\n version?: string;\n dependencies?: Record<string, unknown>;\n peerDependencies?: Record<string, unknown>;\n};\n\nasync function fetchPackageJson(\n baseUrl: string,\n): Promise<FetchedPackageJson | null> {\n try {\n const res = await fetch(baseUrl);\n if (!res.ok) return null;\n const pkg = (await res.json()) as {\n version?: unknown;\n dependencies?: Record<string, unknown>;\n peerDependencies?: Record<string, unknown>;\n };\n return {\n version: typeof pkg.version === \"string\" ? pkg.version : undefined,\n dependencies: pkg.dependencies,\n peerDependencies: pkg.peerDependencies,\n };\n } catch {\n return null;\n }\n}\n\nasync function fetchPackageJsonVersion(\n baseUrl: string,\n): Promise<string | undefined> {\n return (await fetchPackageJson(baseUrl))?.version;\n}\n\n/**\n * Human-readable warnings for shared-dep mismatches between a package's npm\n * `package.json` (as served by the CDN) and the host's shared-deps version\n * table. Empty when either side is unavailable — a dev / vendor-off host has\n * no table to compare against, and a missing package.json means the check\n * can't run. Used by both the install flow and the package-manager UI.\n */\nexport function sharedDepMismatchWarnings(\n pkgJson: FetchedPackageJson | null,\n hostVersions: Record<string, string> | null | undefined,\n): string[] {\n if (!pkgJson || !hostVersions) return [];\n return formatSharedDepWarnings(checkSharedDeps(pkgJson, hostVersions));\n}\n\nconst LOCAL_PACKAGE_NAME = \"Local\" as const;\n\n// Package CSS goes in external-packages: above Connect's reset so it can style\n// its editors, below Connect's utilities so it can't override them.\nexport const LAYER_ORDER =\n \"@layer theme, base, components, external-packages, utilities;\";\nconst LAYER_ORDER_ATTR = \"data-ph-layer-order\";\n\n// Layer order is set by the first declaration in the document, and a project's\n// style.css declares Tailwind's layers first, so this goes first in <head>.\n\nexport function declareExternalPackagesLayer(): void {\n if (document.head.querySelector(`style[${LAYER_ORDER_ATTR}]`)) return;\n const order = document.createElement(\"style\");\n order.setAttribute(LAYER_ORDER_ATTR, \"\");\n order.textContent = LAYER_ORDER;\n document.head.prepend(order);\n}\n\nexport class BrowserPackageManager implements IPackageManager {\n registryUrl: string | null;\n #storage: BrowserLocalStorage<PackageMeta>;\n #packages: Map<string, DocumentModelLib<any>> = new Map();\n #subscribers = new Set<IPackagesListener>();\n #packagesMemo: DocumentModelLib<any>[] = [];\n #stylesheets: Map<string, HTMLStyleElement> = new Map();\n #localPackage: DocumentModelLib<any> | undefined;\n\n #cdnUrl: string | null;\n #localPackageVersion: string | undefined;\n #localPackageNames: Set<string> = new Set([LOCAL_PACKAGE_NAME]);\n #pwaSyncTimer: ReturnType<typeof setTimeout> | undefined;\n /** Serialized last-mirrored PWA fragment; lets a sync skip the IndexedDB\n * write + manifest re-attach when nothing PWA-relevant changed. */\n #lastSyncedFragmentJson: string | undefined;\n\n constructor(namespace: string, registryUrl: string | null) {\n this.#storage = new BrowserLocalStorage<PackageMeta>(\n namespace + \":PH_PACKAGES\",\n );\n this.registryUrl = registryUrl;\n this.#cdnUrl = registryUrl !== null ? toCdnUrl(registryUrl) : null;\n }\n\n async init(\n localPackage?: DocumentModelLib<any>,\n localPackageVersion?: string,\n studioMode?: boolean,\n workflowsEnabled?: boolean,\n ) {\n this.addLocalPackage(common.manifest.name, common, commonPkg.version);\n // Vetra is builder-only and not CDN-loadable; lazy-load it (code-split\n // chunk, never fetched in production) only in studio mode.\n if (studioMode) {\n const vetra = await import(\"@powerhousedao/vetra\");\n this.addLocalPackage(vetra.manifest.name, vetra, vetraPkg.version);\n }\n // Same shape for the workflow package, behind its own independent flag.\n // Only the package root: `./pieces` and `./reactor` are node-only.\n if (workflowsEnabled) {\n const workflow = await import(\"@powerhousedao/workflow\");\n this.addLocalPackage(\n workflow.manifest.name,\n workflow,\n workflowPkg.version,\n );\n }\n if (localPackage) {\n this.updateLocalPackage(localPackage, localPackageVersion);\n }\n for (const packageName of this.#storage.keys()) {\n // Re-hydrate with the originally-requested spec so a tag/version pick\n // sticks across reloads. Fall back to the bare key for legacy entries\n // (pre-spec) and for entries that never had a tag.\n const existingMeta = this.#storage.get(packageName);\n const specForReload = existingMeta?.spec ?? packageName;\n console.debug(\n `[Connect][PackageManager] Rehydrating \"${packageName}\" via spec \"${specForReload}\"`,\n );\n const result = await this.addPackage(specForReload);\n // Previously-installed package that no longer resolves (version\n // withdrawn from npm, registry moved, etc.) would otherwise\n // 404-toast on every boot forever. Drop it from persistent storage\n // so the failure is one-shot instead of sticky.\n if (result.type === \"error\") {\n this.#storage.delete(packageName);\n }\n }\n }\n\n addLocalPackage(\n name: string,\n loadedPackage: DocumentModelLib<any>,\n version?: string,\n ) {\n this.#localPackageNames.add(name);\n this.#registerPackage({\n name,\n importUrl: null,\n stylesheetUrl: null,\n loadedPackage,\n version,\n });\n }\n\n updateLocalPackage(pkg: DocumentModelLib<any>, version?: string) {\n console.debug(\"Updating local package:\", pkg);\n this.#localPackage = pkg;\n this.#registerPackage({\n name: LOCAL_PACKAGE_NAME,\n stylesheetUrl: null,\n importUrl: null,\n loadedPackage: pkg,\n });\n if (version) {\n this.#localPackageVersion = version;\n this.#notifyPackagesChanged();\n return;\n }\n fetchPackageJsonVersion(\"/package.json\")\n .then((fetchedVersion) => {\n this.#localPackageVersion = fetchedVersion;\n if (fetchedVersion) this.#notifyPackagesChanged();\n })\n .catch(() => {});\n }\n\n get packages() {\n return this.#packagesMemo;\n }\n\n get cdnUrl(): string | null {\n return this.#cdnUrl;\n }\n\n getPackageSource(packageName: string) {\n // check vs packages registered as local (Common, Vetra, bundled packages...)\n if (this.#localPackageNames.has(packageName)) {\n return \"common\";\n }\n // check if the package has the same name as the local project\n if (packageName === this.#localPackage?.manifest.name) return \"project\";\n const packageMeta = this.#storage.get(packageName);\n // if meta does not exist the package is not installed\n if (!packageMeta) return null;\n // if imported from node_modules then the package is installed locally\n if (packageMeta.importUrl === `/node_modules/${packageName}`)\n return \"local-install\";\n // all other import urls point to a registry\n return \"registry-install\";\n }\n\n /**\n * Return the registry-installed packages keyed by their storage name (which\n * is the registry spec, e.g. \"@powerhousedao/clint-common\"), with the\n * installed version when known. Excludes bundled (common) packages, the\n * local project package, and packages resolved out of `/node_modules/`.\n */\n getRegistryPackages(): { name: string; version: string | undefined }[] {\n const out: { name: string; version: string | undefined }[] = [];\n for (const [name, meta] of this.#storage) {\n if (this.#localPackageNames.has(name)) continue;\n if (name === LOCAL_PACKAGE_NAME) continue;\n if (meta.importUrl === `/node_modules/${name}`) continue;\n out.push({ name, version: meta.version });\n }\n return out;\n }\n\n getPackageVersion(packageName: string): string | undefined {\n if (packageName === this.#localPackage?.manifest.name) {\n return this.#localPackageVersion;\n }\n return this.#storage.get(packageName)?.version;\n }\n\n /**\n * The spec the user requested when this package was installed (e.g.\n * `name@dev` or `name@6.2.1`). Undefined for bare-name installs, legacy\n * entries, and local packages — the Package Manager treats that as the\n * `latest` stream when picking update targets.\n */\n getPackageSpec(packageName: string): string | undefined {\n return this.#storage.get(packageName)?.spec;\n }\n\n async addPackage(packageSpec: string): Promise<PackageManagerInstallResult> {\n // `packageSpec` may include a `@tag` / `@version` suffix (e.g. user picked\n // a specific version in the package manager UI, or re-hydrated on reload\n // from the persisted spec). We always register/look up by the bare name so\n // status tracking, version lookups, and uninstall all go through a single\n // canonical key. The spec itself is kept on the meta so reloads re-fetch\n // the same tag.\n const bareName = parseBareName(packageSpec);\n const hasTagOrVersion = bareName !== packageSpec;\n console.debug(\n `[Connect][PackageManager] addPackage spec=\"${packageSpec}\" bareName=\"${bareName}\"`,\n );\n\n const existingPackage = this.#packages.get(bareName);\n if (existingPackage) {\n const requestedVersion = hasTagOrVersion\n ? packageSpec.slice(bareName.length + 1)\n : undefined;\n const currentVersion = this.#storage.get(bareName)?.version;\n const isLocal = this.#localPackageNames.has(bareName);\n const sameVersion =\n !requestedVersion ||\n !currentVersion ||\n requestedVersion === currentVersion;\n if (isLocal || sameVersion) {\n console.debug(\n `[Connect][PackageManager] \"${bareName}\" already loaded; skipping re-fetch`,\n );\n return {\n type: \"success\",\n package: existingPackage,\n };\n }\n console.debug(\n `[Connect][PackageManager] \"${bareName}\" version bump ${currentVersion} → ${requestedVersion}; refetching`,\n );\n }\n try {\n const packageWithMeta = await this.#loadPackage(packageSpec);\n // `#loadPackage*` set `name` to whatever spec it built the URL from.\n // Canonicalize to the bare name for the map/storage keys, and stash the\n // original spec separately so reloads re-use it.\n packageWithMeta.name = bareName;\n if (hasTagOrVersion) {\n packageWithMeta.spec = packageSpec;\n }\n // Swap stylesheets only once the new package is in hand. If `#loadPackage`\n // throws above, the old stylesheet stays mounted and the UI keeps\n // rendering the previous version instead of unstyled markup.\n if (existingPackage) {\n this.#unmountStylesheet(bareName);\n }\n this.#registerPackage(packageWithMeta);\n\n return {\n type: \"success\",\n package: packageWithMeta.loadedPackage,\n };\n } catch (error) {\n const normalized =\n error instanceof Error ? error : new Error(String(error));\n console.error(\n `[Connect][PackageManager] Failed to install package \"${packageSpec}\": ${normalized.message}`,\n normalized,\n );\n return {\n type: \"error\",\n error: normalized,\n };\n }\n }\n\n async addPackages(packageNames: string[]) {\n const results: PackageManagerInstallResult[] = [];\n for (const packageName of packageNames) {\n const result = await this.addPackage(packageName);\n results.push(result);\n }\n return results;\n }\n\n removePackage(name: string) {\n this.#packages.delete(name);\n this.#storage.delete(name);\n this.#unmountStylesheet(name);\n this.#notifyPackagesChanged();\n }\n\n subscribe(handler: IPackagesListener): IPackageListerUnsubscribe {\n this.#subscribers.add(handler);\n return () => {\n this.#subscribers.delete(handler);\n };\n }\n\n load(documentType: string): Promise<DocumentModelModule<any>> {\n const documentModelModule = Array.from(\n this.#packages.values().flatMap((p) => p.documentModels),\n ).find((m) => m.documentModel.global.id === documentType);\n\n if (documentModelModule) return Promise.resolve(documentModelModule);\n return Promise.reject(new Error(\"Model not available\"));\n }\n\n async #loadPackageFromNodeModules(name: string): Promise<PackageWithMeta> {\n const importUrl = `/node_modules/${name}/browser/index.js`;\n const stylesheetUrl = `/node_modules/${name}/style.css`;\n\n const packageWithMeta = await this.#importPackage({\n name,\n importUrl,\n stylesheetUrl,\n });\n packageWithMeta.version = await fetchPackageJsonVersion(\n `/node_modules/${name}/package.json`,\n );\n\n return packageWithMeta;\n }\n\n async #loadPackageFromRegistry(name: string): Promise<PackageWithMeta> {\n const importUrl = `${this.#cdnUrl}/${name}/browser/index.js`;\n const stylesheetUrl = `${this.#cdnUrl}/${name}/style.css`;\n const packageWithMeta = await this.#importPackage({\n name,\n importUrl,\n stylesheetUrl,\n });\n const pkgJson = await fetchPackageJson(\n `${this.#cdnUrl}/${name}/package.json`,\n );\n packageWithMeta.version = pkgJson?.version;\n\n // Non-blocking warning: a package that pins a shared dep at a version\n // the host's vendor was built without still installs, but the host's\n // copy is what runs — surface the mismatch before it surprises the\n // user at runtime.\n const warnings = sharedDepMismatchWarnings(\n pkgJson,\n (await getSharedDeps())?.versions,\n );\n if (warnings.length > 0) {\n console.error(\n `[package-manager] shared-deps mismatch for ${name}:\\n` +\n warnings.join(\"\\n\"),\n );\n }\n\n return packageWithMeta;\n }\n\n async #importPackage(packageMeta: PackageMeta): Promise<PackageWithMeta> {\n const { name, importUrl, stylesheetUrl } = packageMeta;\n if (!importUrl) {\n throw new Error(`Import url not defined for package \"${name}\".`);\n }\n\n const loadedPackage = (await import(\n /* @vite-ignore */ importUrl\n )) as DocumentModelLib<any>;\n\n return {\n name,\n loadedPackage,\n importUrl,\n stylesheetUrl,\n };\n }\n\n async #loadPackage(packageName: string): Promise<PackageWithMeta> {\n if (this.#localPackageNames.has(packageName)) {\n throw new Error(\n `Package \"${packageName}\" is a local package and cannot be loaded dynamically.`,\n );\n }\n\n // only attemp to load from node_modules in dev mode\n if (!import.meta.env.PROD) {\n try {\n const packageWithMeta =\n await this.#loadPackageFromNodeModules(packageName);\n return packageWithMeta;\n } catch (error) {\n console.warn(\n `Failed to load package \"${packageName}\" from node_modules:`,\n error,\n );\n }\n }\n\n if (!this.registryUrl) {\n throw new Error(\"Registry url not defined.\");\n }\n\n return await this.#loadPackageFromRegistry(packageName);\n }\n\n #registerPackage(packageWithMeta: PackageWithMeta) {\n const { name, loadedPackage, importUrl, stylesheetUrl, version, spec } =\n packageWithMeta;\n\n if (stylesheetUrl !== null) {\n this.#mountStylesheet(name, stylesheetUrl);\n }\n this.#packages.set(name, loadedPackage);\n this.#storage.set(name, {\n name,\n importUrl,\n stylesheetUrl,\n version,\n ...(spec ? { spec } : {}),\n });\n console.debug(\n `[Connect][PackageManager] Registered \"${name}\" (version=${version ?? \"?\"}, spec=${spec ?? \"—\"})`,\n );\n\n this.#notifyPackagesChanged();\n }\n\n #mountStylesheet(name: string, href: string) {\n const existing = this.#stylesheets.get(name);\n if (existing) return existing;\n\n declareExternalPackagesLayer();\n const style = document.createElement(\"style\");\n style.textContent = `@import url(\"${href}\") layer(external-packages);`;\n document.head.appendChild(style);\n\n this.#stylesheets.set(name, style);\n }\n\n #unmountStylesheet(name: string): void {\n const style = this.#stylesheets.get(name);\n if (!style) return;\n\n style.remove();\n this.#stylesheets.delete(name);\n }\n\n #notifyPackagesChanged() {\n this.#packagesMemo = Array.from(this.#packages.values());\n const packages = this.packages;\n this.#subscribers.forEach((handler) => {\n handler({ packages });\n });\n this.#schedulePwaSync();\n }\n\n /**\n * Debounced mirror of every loaded package's PWA fragment into IndexedDB, so\n * the service worker can serve a web-app manifest that reflects packages\n * installed AT RUNTIME (a SW can't read localStorage, where the package list\n * lives). Debounced because `init()` rehydrates many packages in a burst;\n * coalescing collapses that into a single write.\n */\n #schedulePwaSync() {\n if (typeof indexedDB === \"undefined\") return;\n clearTimeout(this.#pwaSyncTimer);\n this.#pwaSyncTimer = setTimeout(() => {\n void this.#syncPwaFragments();\n }, 50);\n }\n\n async #syncPwaFragments() {\n const contributions: PwaContribution[] = [];\n for (const [name, loadedPackage] of this.#packages) {\n const manifest = loadedPackage.manifest;\n let config: PHConnectPwa = {};\n if (manifest.pwa) {\n // Third-party package code must not inject arbitrary manifest fields the\n // SW will serve — validate strictly and skip (with a warning) on failure.\n const parsed = PwaConfigSchema.safeParse(manifest.pwa);\n if (parsed.success) {\n // A package's assets live at its base (CDN for registry installs);\n // make relative icon srcs absolute so the served manifest resolves.\n const importUrl = this.#storage.get(name)?.importUrl ?? null;\n const baseUrl = importUrl\n ? importUrl.replace(/browser\\/index\\.js$/, \"\")\n : null;\n config = resolveFragmentAssetUrls(parsed.data, baseUrl);\n } else {\n console.warn(\n `[Connect][PWA] \"${name}\" ships an invalid pwa fragment; skipped.`,\n parsed.error,\n );\n }\n }\n // `categories` is derived from the manifest's `category` field (not\n // authored under `pwa`); it unions into the SW-served manifest so a\n // runtime-installed package's category shows up like a build-time one.\n config = withInferredCategory(config, manifest.category);\n if (Object.keys(config).length === 0) continue;\n contributions.push({ source: name, config });\n }\n // Fold in load order (base-first ordering is preserved so a package cannot\n // hijack the built-in .phd/.phdm handler at merge time either).\n const merged = mergePwaConfig(contributions);\n // Most package operations don't touch PWA config; skip the write + manifest\n // re-attach (which forces a redundant manifest re-fetch) when unchanged.\n const mergedJson = JSON.stringify(merged);\n if (mergedJson === this.#lastSyncedFragmentJson) return;\n try {\n await writeMergedPwaFragment(merged);\n } catch (error) {\n // Leave #lastSyncedFragmentJson unset so a later sync retries the write.\n console.debug(\n \"[Connect][PWA] fragment mirror to IndexedDB failed:\",\n error,\n );\n return;\n }\n this.#lastSyncedFragmentJson = mergedJson;\n // The SW serves the manifest fresh from IndexedDB, but the browser only\n // parsed <link rel=\"manifest\"> at page load — re-attach it so it\n // re-consumes the now-updated manifest without a manual reload. (Kept out\n // of the write's try/catch so a DOM error isn't mislabeled as an IDB\n // failure; refreshPwaManifestLink is itself non-throwing.)\n refreshPwaManifestLink();\n }\n}\n"],"names":[],"mappings":"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","debug_id":"9177dffe-876f-5372-b971-22d253b5334e"}
|
|
@@ -1,6 +1,24 @@
|
|
|
1
|
-
//#region src/utils/pglite-idb.ts
|
|
2
1
|
|
|
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]="
|
|
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]="bf83be21-3f86-55bd-ae14-c4aa466d5a81")}catch(e){}}();
|
|
3
|
+
import { UnsupportedStoredProtocolError } from "@powerhousedao/reactor";
|
|
4
|
+
//#region src/utils/stored-documents-refused.ts
|
|
5
|
+
const STORED_DOCUMENTS_REFUSED = "StoredDocumentsRefusedError";
|
|
6
|
+
var StoredDocumentsRefusedError = class extends Error {
|
|
7
|
+
constructor(cause) {
|
|
8
|
+
const named = cause.versions.map(({ protocol, version }) => `${protocol} ${version}`).join(", ");
|
|
9
|
+
super(`This browser holds ${cause.documents} document(s) that require ${named}, which this version of Connect does not run. Open them with a Connect build that runs ${named}, or set connect.reactor.unsupportedStoredDocuments to "read-only" in powerhouse.config.json to open them read-only.`, { cause });
|
|
10
|
+
this.name = STORED_DOCUMENTS_REFUSED;
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
/** Rewrites the reactor's refusal for the boot screen. */
|
|
14
|
+
function toStoredDocumentsRefused(error) {
|
|
15
|
+
return UnsupportedStoredProtocolError.isError(error) ? new StoredDocumentsRefusedError(error) : error;
|
|
16
|
+
}
|
|
17
|
+
function isStoredDocumentsRefused(error) {
|
|
18
|
+
return error instanceof Error && error.name === "StoredDocumentsRefusedError";
|
|
19
|
+
}
|
|
20
|
+
//#endregion
|
|
21
|
+
//#region src/utils/pglite-idb.ts
|
|
4
22
|
const IDB_STORE_NAME = "FILE_DATA";
|
|
5
23
|
function idbError(req, context) {
|
|
6
24
|
const cause = req.error ?? /* @__PURE__ */ new Error("unknown IDB error");
|
|
@@ -92,7 +110,7 @@ async function loadPgDump(major) {
|
|
|
92
110
|
throw new Error(`Unsupported PGlite major: ${String(major)}`);
|
|
93
111
|
}
|
|
94
112
|
//#endregion
|
|
95
|
-
export { resolvePgMajorForRuntime as a, idbError as c, loadPgDump as i, openIdb as l, isMigratableMajor as n, IDB_STORE_NAME as o, loadPGliteModule as r, createFileDataStore as s, coerceMajor as t, readPgVersionFile as u };
|
|
113
|
+
export { resolvePgMajorForRuntime as a, idbError as c, isStoredDocumentsRefused as d, toStoredDocumentsRefused as f, loadPgDump as i, openIdb as l, isMigratableMajor as n, IDB_STORE_NAME as o, loadPGliteModule as r, createFileDataStore as s, coerceMajor as t, readPgVersionFile as u };
|
|
96
114
|
|
|
97
|
-
//# sourceMappingURL=pglite-major-
|
|
98
|
-
//# debugId=
|
|
115
|
+
//# sourceMappingURL=pglite-major-p4_YefAE.js.map
|
|
116
|
+
//# debugId=bf83be21-3f86-55bd-ae14-c4aa466d5a81
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pglite-major-p4_YefAE.js","sources":["../src/utils/stored-documents-refused.ts","../src/utils/pglite-idb.ts","../src/utils/pglite-major.ts"],"sourcesContent":["import { UnsupportedStoredProtocolError } from \"@powerhousedao/reactor\";\n\nexport const STORED_DOCUMENTS_REFUSED = \"StoredDocumentsRefusedError\";\n\n// Only name and message cross the worker boundary, so the message says it all.\nexport class StoredDocumentsRefusedError extends Error {\n constructor(cause: UnsupportedStoredProtocolError) {\n const named = cause.versions\n .map(({ protocol, version }) => `${protocol} ${version}`)\n .join(\", \");\n super(\n `This browser holds ${cause.documents} document(s) that require ${named}, which this version of Connect does not run. ` +\n `Open them with a Connect build that runs ${named}, or set connect.reactor.unsupportedStoredDocuments to \"read-only\" in powerhouse.config.json to open them read-only.`,\n { cause },\n );\n this.name = STORED_DOCUMENTS_REFUSED;\n }\n}\n\n/** Rewrites the reactor's refusal for the boot screen. */\nexport function toStoredDocumentsRefused(error: unknown): unknown {\n return UnsupportedStoredProtocolError.isError(error)\n ? new StoredDocumentsRefusedError(error)\n : error;\n}\n\nexport function isStoredDocumentsRefused(error: unknown): error is Error {\n return error instanceof Error && error.name === STORED_DOCUMENTS_REFUSED;\n}\n","export const IDB_STORE_NAME = \"FILE_DATA\";\nexport const IDB_DB_VERSION = 21;\n\ntype FileDataValue = {\n contents: Uint8Array | number[];\n mode: number;\n timestamp: Date | number;\n};\n\nexport function idbError(\n req: IDBRequest | IDBTransaction,\n context: string,\n): Error {\n const cause = req.error ?? new Error(\"unknown IDB error\");\n return new Error(`${context}: ${cause.message}`, { cause });\n}\n\nexport function indexedDbExists(name: string): Promise<boolean> {\n if (typeof indexedDB.databases === \"function\") {\n return indexedDB\n .databases()\n .then((dbs) => dbs.some((d) => d.name === name))\n .catch(() => true);\n }\n return Promise.resolve(true);\n}\n\nexport function openIdb(\n name: string,\n version: number,\n upgrade?: (db: IDBDatabase) => void,\n): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const req = indexedDB.open(name, version);\n req.onerror = () => reject(idbError(req, `IDB open failed for ${name}`));\n req.onblocked = () => reject(new Error(`IDB open blocked for ${name}`));\n req.onupgradeneeded = () => upgrade?.(req.result);\n req.onsuccess = () => resolve(req.result);\n });\n}\n\nexport function createFileDataStore(db: IDBDatabase): void {\n if (!db.objectStoreNames.contains(IDB_STORE_NAME)) {\n const store = db.createObjectStore(IDB_STORE_NAME);\n store.createIndex(\"timestamp\", \"timestamp\", { unique: false });\n }\n}\n\nexport async function readPgVersionFile(\n idbName: string,\n): Promise<number | null> {\n if (!(await indexedDbExists(idbName))) return null;\n let db: IDBDatabase;\n try {\n db = await openIdb(idbName, IDB_DB_VERSION, createFileDataStore);\n } catch {\n return null;\n }\n try {\n if (!db.objectStoreNames.contains(IDB_STORE_NAME)) return null;\n const tx = db.transaction(IDB_STORE_NAME, \"readonly\");\n const store = tx.objectStore(IDB_STORE_NAME);\n const value = await new Promise<FileDataValue | null>((resolve, reject) => {\n const req = store.openCursor();\n req.onerror = () =>\n reject(idbError(req, `FILE_DATA cursor failed for ${idbName}`));\n req.onsuccess = () => {\n const cursor = req.result;\n if (!cursor) return resolve(null);\n const key = typeof cursor.key === \"string\" ? cursor.key : \"\";\n if (key.endsWith(\"/PG_VERSION\")) {\n resolve(cursor.value as FileDataValue);\n } else {\n cursor.continue();\n }\n };\n });\n if (!value) return null;\n const bytes =\n value.contents instanceof Uint8Array\n ? value.contents\n : new Uint8Array(value.contents);\n const text = new TextDecoder().decode(bytes).trim();\n const major = parseInt(text, 10);\n return Number.isFinite(major) ? major : null;\n } finally {\n db.close();\n }\n}\n","import type * as CurrentPGliteModuleNs from \"@electric-sql/pglite\";\n\nexport const CURRENT_PG_MAJOR = 17;\nexport const SUPPORTED_PG_MAJORS = [16, 17] as const;\nexport type SupportedPgMajor = (typeof SUPPORTED_PG_MAJORS)[number];\nexport type DetectedMajor = SupportedPgMajor | null;\n\ntype CurrentPGliteModule = typeof CurrentPGliteModuleNs;\n\nexport function coerceMajor(value: number | null): DetectedMajor {\n if (value === null) return null;\n return (SUPPORTED_PG_MAJORS as readonly number[]).includes(value)\n ? (value as SupportedPgMajor)\n : null;\n}\n\nexport function isMigratableMajor(\n value: number | null,\n): value is SupportedPgMajor {\n const major = coerceMajor(value);\n return major !== null && major !== CURRENT_PG_MAJOR;\n}\n\n/**\n * Pick the PGlite major to use for *new* reactor clients: fall back to the\n * current version when there is no existing data dir.\n */\nexport function resolvePgMajorForRuntime(\n detected: DetectedMajor,\n): SupportedPgMajor {\n return detected ?? CURRENT_PG_MAJOR;\n}\n\n/**\n * Loads the PGlite module that matches an on-disk data dir major version.\n *\n * The 0.2.x and 0.3.x modules expose the same runtime interface (PGlite class,\n * `idb://` data-dir support, waitReady, exec/query/transaction, close). The\n * return type is pinned to the current package's module so callers can use it\n * against `kysely-pglite-dialect` which peer-depends on both majors.\n */\nexport async function loadPGliteModule(\n major: SupportedPgMajor,\n): Promise<CurrentPGliteModule> {\n if (major === 16) {\n return (await import(\"pglite-legacy-02\")) as unknown as CurrentPGliteModule;\n }\n if (major === 17) return import(\"@electric-sql/pglite\");\n throw new Error(`Unsupported PGlite major: ${String(major)}`);\n}\n\ntype PgDumpFn = (options: {\n pg: unknown;\n}) => Promise<{ text(): Promise<string> }>;\n\n/**\n * Loads the pg_dump tool for the given PGlite major. pg_dump's VFS layout is\n * version-specific, so using the wrong major against a live PGlite instance\n * fails with Emscripten ENOENT (errno 44).\n */\nexport async function loadPgDump(major: SupportedPgMajor): Promise<PgDumpFn> {\n if (major === 16) {\n const mod = (await import(\"pglite-tools-legacy-02/pg_dump\")) as {\n pgDump: PgDumpFn;\n };\n return mod.pgDump;\n }\n if (major === 17) {\n const mod = (await import(\"@electric-sql/pglite-tools/pg_dump\")) as {\n pgDump: PgDumpFn;\n };\n return mod.pgDump;\n }\n throw new Error(`Unsupported PGlite major: ${String(major)}`);\n}\n"],"names":[],"mappings":"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","debug_id":"bf83be21-3f86-55bd-ae14-c4aa466d5a81"}
|
|
@@ -1,12 +1,13 @@
|
|
|
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 { c as idbError, l as openIdb, n as isMigratableMajor, o as IDB_STORE_NAME, s as createFileDataStore, u as readPgVersionFile } from "./pglite-major-
|
|
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]="b8f54f63-862e-5017-822c-cf08ac6f7ca2")}catch(e){}}();
|
|
3
|
+
import { c as idbError, l as openIdb, n as isMigratableMajor, o as IDB_STORE_NAME, s as createFileDataStore, u as readPgVersionFile } from "./pglite-major-p4_YefAE.js";
|
|
4
4
|
import { PGlite } from "@electric-sql/pglite";
|
|
5
5
|
//#region src/utils/pglite-migrate-core.ts
|
|
6
6
|
const LEGACY_DUMPERS = { 16: async () => {
|
|
7
7
|
const [{ PGlite: LegacyPGlite }, { pgDump }] = await Promise.all([import("pglite-legacy-02"), import("pglite-tools-legacy-02/pg_dump")]);
|
|
8
8
|
return async (idbName) => {
|
|
9
|
-
const
|
|
9
|
+
const stripped = idbName.replace(/^\/pglite\//, "");
|
|
10
|
+
const pg = new LegacyPGlite(`idb://${stripped}`);
|
|
10
11
|
try {
|
|
11
12
|
await pg.waitReady;
|
|
12
13
|
return await (await pgDump({ pg })).text();
|
|
@@ -89,7 +90,8 @@ function logRestoreFailure(idbName, sql, err) {
|
|
|
89
90
|
} else console.error(`[pglite-migration] No position info. First 2000 chars of dump:\n${sql.slice(0, 2e3)}`);
|
|
90
91
|
}
|
|
91
92
|
async function restoreDumpIntoIdb(idbName, sql) {
|
|
92
|
-
const
|
|
93
|
+
const stripped = idbName.replace(/^\/pglite\//, "");
|
|
94
|
+
const pg = new PGlite(`idb://${stripped}`, { relaxedDurability: false });
|
|
93
95
|
try {
|
|
94
96
|
await pg.waitReady;
|
|
95
97
|
try {
|
|
@@ -139,5 +141,5 @@ async function migrateIdb(idbName, publishPhase, backup) {
|
|
|
139
141
|
//#endregion
|
|
140
142
|
export { writeFileData as a, readFileData as i, cloneFileData as n, migrateIdb as r, clearFileData as t };
|
|
141
143
|
|
|
142
|
-
//# sourceMappingURL=pglite-migrate-core-
|
|
143
|
-
//# debugId=
|
|
144
|
+
//# sourceMappingURL=pglite-migrate-core-BcXcImng.js.map
|
|
145
|
+
//# debugId=b8f54f63-862e-5017-822c-cf08ac6f7ca2
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pglite-migrate-core-Boxqqx-c.js","sources":["../src/utils/pglite-migrate-core.ts"],"sourcesContent":["import { PGlite } from \"@electric-sql/pglite\";\nimport {\n createFileDataStore,\n IDB_DB_VERSION,\n IDB_STORE_NAME,\n idbError,\n openIdb,\n readPgVersionFile,\n} from \"./pglite-idb.js\";\nimport { CURRENT_PG_MAJOR, isMigratableMajor } from \"./pglite-major.js\";\n\nexport type MigrationPhase = \"clone\" | \"dump\" | \"restore\";\n\nexport type FileDataValue = {\n contents: Uint8Array | number[];\n mode: number;\n timestamp: Date | number;\n};\n\nexport type FileDataEntry = { key: IDBValidKey; value: FileDataValue };\n\n// Snapshots a data dir before migration and restores/discards it after. The\n// flag-off path persists to an IDB backup (with retention); the worker keeps\n// the snapshot in memory for same-run rollback only.\nexport interface BackupStrategy {\n snapshot(idbName: string): Promise<unknown>;\n rollback(handle: unknown, idbName: string, cause: unknown): Promise<void>;\n discard(handle: unknown): Promise<void>;\n commit(handle: unknown): Promise<void>;\n}\n\ntype LegacyDumper = (idbName: string) => Promise<string>;\n\nconst LEGACY_DUMPERS: Partial<Record<number, () => Promise<LegacyDumper>>> = {\n 16: async () => {\n const [{ PGlite: LegacyPGlite }, { pgDump }] = await Promise.all([\n import(\"pglite-legacy-02\"),\n import(\"pglite-tools-legacy-02/pg_dump\"),\n ]);\n return async (idbName: string) => {\n const stripped = idbName.replace(/^\\/pglite\\//, \"\");\n const pg = new LegacyPGlite(`idb://${stripped}`);\n try {\n await pg.waitReady;\n const file = await pgDump({ pg });\n return await file.text();\n } finally {\n await pg.close();\n }\n };\n },\n};\n\nexport async function clearFileData(idbName: string): Promise<void> {\n const db = await openIdb(idbName, IDB_DB_VERSION, createFileDataStore);\n try {\n await new Promise<void>((resolve, reject) => {\n const tx = db.transaction(IDB_STORE_NAME, \"readwrite\");\n tx.oncomplete = () => resolve();\n tx.onerror = () =>\n reject(idbError(tx, `FILE_DATA clear failed for ${idbName}`));\n tx.onabort = () =>\n reject(idbError(tx, `FILE_DATA clear aborted for ${idbName}`));\n tx.objectStore(IDB_STORE_NAME).clear();\n });\n } finally {\n db.close();\n }\n}\n\nexport async function readFileData(idbName: string): Promise<FileDataEntry[]> {\n const db = await openIdb(idbName, IDB_DB_VERSION, createFileDataStore);\n try {\n return await new Promise<FileDataEntry[]>((resolve, reject) => {\n const out: FileDataEntry[] = [];\n const req = db\n .transaction(IDB_STORE_NAME, \"readonly\")\n .objectStore(IDB_STORE_NAME)\n .openCursor();\n req.onerror = () =>\n reject(idbError(req, `FILE_DATA read cursor failed for ${idbName}`));\n req.onsuccess = () => {\n const cursor = req.result;\n if (!cursor) return resolve(out);\n out.push({ key: cursor.key, value: cursor.value as FileDataValue });\n cursor.continue();\n };\n });\n } finally {\n db.close();\n }\n}\n\nexport async function writeFileData(\n idbName: string,\n entries: FileDataEntry[],\n): Promise<void> {\n const db = await openIdb(idbName, IDB_DB_VERSION, createFileDataStore);\n try {\n await new Promise<void>((resolve, reject) => {\n const tx = db.transaction(IDB_STORE_NAME, \"readwrite\");\n tx.oncomplete = () => resolve();\n tx.onerror = () =>\n reject(idbError(tx, `FILE_DATA write failed for ${idbName}`));\n tx.onabort = () =>\n reject(idbError(tx, `FILE_DATA write aborted for ${idbName}`));\n const store = tx.objectStore(IDB_STORE_NAME);\n store.clear();\n for (const { key, value } of entries) {\n store.put(value, key);\n }\n });\n } finally {\n db.close();\n }\n}\n\nexport async function cloneFileData(\n sourceName: string,\n destName: string,\n): Promise<void> {\n await writeFileData(destName, await readFileData(sourceName));\n}\n\nfunction logRestoreFailure(idbName: string, sql: string, err: unknown): void {\n const errObj = err as {\n message?: string;\n position?: string | number;\n severity?: string;\n code?: string;\n detail?: string;\n where?: string;\n };\n const position =\n typeof errObj.position === \"string\"\n ? parseInt(errObj.position, 10)\n : typeof errObj.position === \"number\"\n ? errObj.position\n : NaN;\n\n console.error(`[pglite-migration] Restore failed for ${idbName}`, {\n message: errObj.message,\n code: errObj.code,\n severity: errObj.severity,\n detail: errObj.detail,\n where: errObj.where,\n position: errObj.position,\n sqlLength: sql.length,\n });\n\n if (Number.isFinite(position) && position > 0) {\n const zeroBased = position - 1;\n const start = Math.max(0, zeroBased - 200);\n const end = Math.min(sql.length, zeroBased + 200);\n console.error(\n `[pglite-migration] SQL context around position ${position}:\\n${sql.slice(start, zeroBased)}»${sql.slice(zeroBased, zeroBased + 1)}«${sql.slice(zeroBased + 1, end)}`,\n );\n } else {\n console.error(\n `[pglite-migration] No position info. First 2000 chars of dump:\\n${sql.slice(0, 2000)}`,\n );\n }\n}\n\nasync function restoreDumpIntoIdb(idbName: string, sql: string): Promise<void> {\n const stripped = idbName.replace(/^\\/pglite\\//, \"\");\n const pg = new PGlite(`idb://${stripped}`, { relaxedDurability: false });\n try {\n await pg.waitReady;\n // PG16 pg_dump emits doubled backslashes (escape-string form) without the\n // matching SET; PG17 defaults standard_conforming_strings on, breaking JSONB.\n try {\n await pg.exec(\"SET standard_conforming_strings = off;\");\n } catch (gucErr) {\n console.warn(\n \"[pglite-migration] Could not force standard_conforming_strings=off\",\n gucErr,\n );\n }\n try {\n await pg.exec(sql);\n } catch (execErr) {\n logRestoreFailure(idbName, sql, execErr);\n throw execErr;\n }\n } finally {\n await pg.close();\n }\n}\n\nexport async function migrateIdb(\n idbName: string,\n publishPhase: (phase: MigrationPhase) => void,\n backup: BackupStrategy,\n): Promise<void> {\n const major = await readPgVersionFile(idbName);\n if (major === null || major === CURRENT_PG_MAJOR) return;\n\n if (!isMigratableMajor(major)) {\n console.warn(\n `[pglite-migration] Skipping ${idbName}: unsupported PG_VERSION=${major}; no migration path.`,\n );\n return;\n }\n\n const loader = LEGACY_DUMPERS[major];\n if (!loader) {\n throw new Error(\n `No legacy dumper for supported PG_VERSION=${major} (${idbName}); ` +\n `SUPPORTED_PG_MAJORS and LEGACY_DUMPERS are out of sync.`,\n );\n }\n\n publishPhase(\"clone\");\n const handle = await backup.snapshot(idbName);\n\n let sql: string;\n try {\n publishPhase(\"dump\");\n const dump = await loader();\n sql = await dump(idbName);\n } catch (err) {\n await backup.discard(handle);\n throw err;\n }\n\n try {\n await clearFileData(idbName);\n publishPhase(\"restore\");\n await restoreDumpIntoIdb(idbName, sql);\n } catch (err) {\n await backup.rollback(handle, idbName, err);\n throw err;\n }\n await backup.commit(handle);\n}\n"],"names":[],"mappings":"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","debug_id":"5602ae27-0e93-52ce-93a2-befe343f87dd"}
|
|
1
|
+
{"version":3,"file":"pglite-migrate-core-BcXcImng.js","sources":["../src/utils/pglite-migrate-core.ts"],"sourcesContent":["import { PGlite } from \"@electric-sql/pglite\";\nimport {\n createFileDataStore,\n IDB_DB_VERSION,\n IDB_STORE_NAME,\n idbError,\n openIdb,\n readPgVersionFile,\n} from \"./pglite-idb.js\";\nimport { CURRENT_PG_MAJOR, isMigratableMajor } from \"./pglite-major.js\";\n\nexport type MigrationPhase = \"clone\" | \"dump\" | \"restore\";\n\nexport type FileDataValue = {\n contents: Uint8Array | number[];\n mode: number;\n timestamp: Date | number;\n};\n\nexport type FileDataEntry = { key: IDBValidKey; value: FileDataValue };\n\n// Snapshots a data dir before migration and restores/discards it after. The\n// flag-off path persists to an IDB backup (with retention); the worker keeps\n// the snapshot in memory for same-run rollback only.\nexport interface BackupStrategy {\n snapshot(idbName: string): Promise<unknown>;\n rollback(handle: unknown, idbName: string, cause: unknown): Promise<void>;\n discard(handle: unknown): Promise<void>;\n commit(handle: unknown): Promise<void>;\n}\n\ntype LegacyDumper = (idbName: string) => Promise<string>;\n\nconst LEGACY_DUMPERS: Partial<Record<number, () => Promise<LegacyDumper>>> = {\n 16: async () => {\n const [{ PGlite: LegacyPGlite }, { pgDump }] = await Promise.all([\n import(\"pglite-legacy-02\"),\n import(\"pglite-tools-legacy-02/pg_dump\"),\n ]);\n return async (idbName: string) => {\n const stripped = idbName.replace(/^\\/pglite\\//, \"\");\n const pg = new LegacyPGlite(`idb://${stripped}`);\n try {\n await pg.waitReady;\n const file = await pgDump({ pg });\n return await file.text();\n } finally {\n await pg.close();\n }\n };\n },\n};\n\nexport async function clearFileData(idbName: string): Promise<void> {\n const db = await openIdb(idbName, IDB_DB_VERSION, createFileDataStore);\n try {\n await new Promise<void>((resolve, reject) => {\n const tx = db.transaction(IDB_STORE_NAME, \"readwrite\");\n tx.oncomplete = () => resolve();\n tx.onerror = () =>\n reject(idbError(tx, `FILE_DATA clear failed for ${idbName}`));\n tx.onabort = () =>\n reject(idbError(tx, `FILE_DATA clear aborted for ${idbName}`));\n tx.objectStore(IDB_STORE_NAME).clear();\n });\n } finally {\n db.close();\n }\n}\n\nexport async function readFileData(idbName: string): Promise<FileDataEntry[]> {\n const db = await openIdb(idbName, IDB_DB_VERSION, createFileDataStore);\n try {\n return await new Promise<FileDataEntry[]>((resolve, reject) => {\n const out: FileDataEntry[] = [];\n const req = db\n .transaction(IDB_STORE_NAME, \"readonly\")\n .objectStore(IDB_STORE_NAME)\n .openCursor();\n req.onerror = () =>\n reject(idbError(req, `FILE_DATA read cursor failed for ${idbName}`));\n req.onsuccess = () => {\n const cursor = req.result;\n if (!cursor) return resolve(out);\n out.push({ key: cursor.key, value: cursor.value as FileDataValue });\n cursor.continue();\n };\n });\n } finally {\n db.close();\n }\n}\n\nexport async function writeFileData(\n idbName: string,\n entries: FileDataEntry[],\n): Promise<void> {\n const db = await openIdb(idbName, IDB_DB_VERSION, createFileDataStore);\n try {\n await new Promise<void>((resolve, reject) => {\n const tx = db.transaction(IDB_STORE_NAME, \"readwrite\");\n tx.oncomplete = () => resolve();\n tx.onerror = () =>\n reject(idbError(tx, `FILE_DATA write failed for ${idbName}`));\n tx.onabort = () =>\n reject(idbError(tx, `FILE_DATA write aborted for ${idbName}`));\n const store = tx.objectStore(IDB_STORE_NAME);\n store.clear();\n for (const { key, value } of entries) {\n store.put(value, key);\n }\n });\n } finally {\n db.close();\n }\n}\n\nexport async function cloneFileData(\n sourceName: string,\n destName: string,\n): Promise<void> {\n await writeFileData(destName, await readFileData(sourceName));\n}\n\nfunction logRestoreFailure(idbName: string, sql: string, err: unknown): void {\n const errObj = err as {\n message?: string;\n position?: string | number;\n severity?: string;\n code?: string;\n detail?: string;\n where?: string;\n };\n const position =\n typeof errObj.position === \"string\"\n ? parseInt(errObj.position, 10)\n : typeof errObj.position === \"number\"\n ? errObj.position\n : NaN;\n\n console.error(`[pglite-migration] Restore failed for ${idbName}`, {\n message: errObj.message,\n code: errObj.code,\n severity: errObj.severity,\n detail: errObj.detail,\n where: errObj.where,\n position: errObj.position,\n sqlLength: sql.length,\n });\n\n if (Number.isFinite(position) && position > 0) {\n const zeroBased = position - 1;\n const start = Math.max(0, zeroBased - 200);\n const end = Math.min(sql.length, zeroBased + 200);\n console.error(\n `[pglite-migration] SQL context around position ${position}:\\n${sql.slice(start, zeroBased)}»${sql.slice(zeroBased, zeroBased + 1)}«${sql.slice(zeroBased + 1, end)}`,\n );\n } else {\n console.error(\n `[pglite-migration] No position info. First 2000 chars of dump:\\n${sql.slice(0, 2000)}`,\n );\n }\n}\n\nasync function restoreDumpIntoIdb(idbName: string, sql: string): Promise<void> {\n const stripped = idbName.replace(/^\\/pglite\\//, \"\");\n const pg = new PGlite(`idb://${stripped}`, { relaxedDurability: false });\n try {\n await pg.waitReady;\n // PG16 pg_dump emits doubled backslashes (escape-string form) without the\n // matching SET; PG17 defaults standard_conforming_strings on, breaking JSONB.\n try {\n await pg.exec(\"SET standard_conforming_strings = off;\");\n } catch (gucErr) {\n console.warn(\n \"[pglite-migration] Could not force standard_conforming_strings=off\",\n gucErr,\n );\n }\n try {\n await pg.exec(sql);\n } catch (execErr) {\n logRestoreFailure(idbName, sql, execErr);\n throw execErr;\n }\n } finally {\n await pg.close();\n }\n}\n\nexport async function migrateIdb(\n idbName: string,\n publishPhase: (phase: MigrationPhase) => void,\n backup: BackupStrategy,\n): Promise<void> {\n const major = await readPgVersionFile(idbName);\n if (major === null || major === CURRENT_PG_MAJOR) return;\n\n if (!isMigratableMajor(major)) {\n console.warn(\n `[pglite-migration] Skipping ${idbName}: unsupported PG_VERSION=${major}; no migration path.`,\n );\n return;\n }\n\n const loader = LEGACY_DUMPERS[major];\n if (!loader) {\n throw new Error(\n `No legacy dumper for supported PG_VERSION=${major} (${idbName}); ` +\n `SUPPORTED_PG_MAJORS and LEGACY_DUMPERS are out of sync.`,\n );\n }\n\n publishPhase(\"clone\");\n const handle = await backup.snapshot(idbName);\n\n let sql: string;\n try {\n publishPhase(\"dump\");\n const dump = await loader();\n sql = await dump(idbName);\n } catch (err) {\n await backup.discard(handle);\n throw err;\n }\n\n try {\n await clearFileData(idbName);\n publishPhase(\"restore\");\n await restoreDumpIntoIdb(idbName, sql);\n } catch (err) {\n await backup.rollback(handle, idbName, err);\n throw err;\n }\n await backup.commit(handle);\n}\n"],"names":[],"mappings":"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","debug_id":"b8f54f63-862e-5017-822c-cf08ac6f7ca2"}
|
|
@@ -1,6 +1,6 @@
|
|
|
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 { l as invalidateReactorPgMajorCache, m as REACTOR_PGLITE_NAME } from "./connection-state-
|
|
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]="d59c69fe-5f4d-5aa8-accd-b4fbae2bd47a")}catch(e){}}();
|
|
3
|
+
import { l as invalidateReactorPgMajorCache, m as REACTOR_PGLITE_NAME } from "./connection-state-Eqc2izmt.js";
|
|
4
4
|
//#region src/utils/pglite-seed.ts
|
|
5
5
|
const PENDING_PG_SEED_KEY = "ph:pending-pg-seed";
|
|
6
6
|
/**
|
|
@@ -45,5 +45,5 @@ async function seedPendingPgVersion() {
|
|
|
45
45
|
//#endregion
|
|
46
46
|
export { seedPendingPgVersion as n, PENDING_PG_SEED_KEY as t };
|
|
47
47
|
|
|
48
|
-
//# sourceMappingURL=pglite-seed-
|
|
49
|
-
//# debugId=
|
|
48
|
+
//# sourceMappingURL=pglite-seed-Cl2d-iyl.js.map
|
|
49
|
+
//# debugId=d59c69fe-5f4d-5aa8-accd-b4fbae2bd47a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pglite-seed-
|
|
1
|
+
{"version":3,"file":"pglite-seed-Cl2d-iyl.js","sources":["../src/utils/pglite-seed.ts"],"sourcesContent":["import { invalidateReactorPgMajorCache } from \"./pglite-runtime.js\";\nimport { REACTOR_PGLITE_NAME } from \"./storage-namespace.js\";\n\nexport const PENDING_PG_SEED_KEY = \"ph:pending-pg-seed\";\n\n/**\n * If the Debug Inspector requested a forced PG version reset, this runs\n * before the reactor is created on the subsequent page load: opens a fresh\n * PGlite of the requested major against the reactor data dir, lets `initdb`\n * populate `PG_VERSION`, then closes. The next step of app boot then\n * detects this fresh data dir and picks the matching runtime.\n */\nexport async function seedPendingPgVersion(): Promise<void> {\n const raw = localStorage.getItem(PENDING_PG_SEED_KEY);\n if (!raw) return;\n\n const major = parseInt(raw, 10);\n console.info(`[pglite-seed] Seeding fresh PG${major} data dir...`);\n\n try {\n if (major === 16) {\n const { PGlite } = await import(\"pglite-legacy-02\");\n const pg = new PGlite(`idb://${REACTOR_PGLITE_NAME}`);\n try {\n await pg.waitReady;\n } finally {\n await pg.close();\n }\n } else if (major === 17) {\n const { PGlite } = await import(\"@electric-sql/pglite\");\n const pg = new PGlite(`idb://${REACTOR_PGLITE_NAME}`);\n try {\n await pg.waitReady;\n } finally {\n await pg.close();\n }\n } else {\n console.warn(`[pglite-seed] Unsupported version ${raw}, skipping`);\n return;\n }\n console.info(`[pglite-seed] Seeded PG${major} data dir.`);\n } finally {\n localStorage.removeItem(PENDING_PG_SEED_KEY);\n invalidateReactorPgMajorCache();\n }\n}\n"],"names":[],"mappings":";;;;AAGA,MAAa,sBAAsB;;;;;;;;AASnC,eAAsB,uBAAsC;CAC1D,MAAM,MAAM,aAAa,QAAQ,mBAAmB;CACpD,IAAI,CAAC,KAAK;CAEV,MAAM,QAAQ,SAAS,KAAK,EAAE;CAC9B,QAAQ,KAAK,iCAAiC,MAAM,aAAa;CAEjE,IAAI;EACF,IAAI,UAAU,IAAI;GAChB,MAAM,EAAE,WAAW,MAAM,OAAO;GAChC,MAAM,KAAK,IAAI,OAAO,SAAS,qBAAqB;GACpD,IAAI;IACF,MAAM,GAAG;GACX,UAAU;IACR,MAAM,GAAG,MAAM;GACjB;EACF,OAAO,IAAI,UAAU,IAAI;GACvB,MAAM,EAAE,WAAW,MAAM,OAAO;GAChC,MAAM,KAAK,IAAI,OAAO,SAAS,qBAAqB;GACpD,IAAI;IACF,MAAM,GAAG;GACX,UAAU;IACR,MAAM,GAAG,MAAM;GACjB;EACF,OAAO;GACL,QAAQ,KAAK,qCAAqC,IAAI,WAAW;GACjE;EACF;EACA,QAAQ,KAAK,0BAA0B,MAAM,WAAW;CAC1D,UAAU;EACR,aAAa,WAAW,mBAAmB;EAC3C,8BAA8B;CAChC;AACF","debug_id":"d59c69fe-5f4d-5aa8-accd-b4fbae2bd47a"}
|
package/dist/pglite.worker.d.ts
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export {}
|
|
2
|
+
export {};
|
package/dist/pglite.worker.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
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]="d41200c7-f359-5872-986a-21f333235e55")}catch(e){}}();
|
|
3
3
|
import { IdbFs, PGlite } from "@electric-sql/pglite";
|
|
4
4
|
import { live } from "@electric-sql/pglite/live";
|
|
5
5
|
import { worker } from "@electric-sql/pglite/worker";
|
|
6
6
|
import { DEFAULT_RELATIONAL_PROCESSOR_DB_NAME } from "@powerhousedao/shared/processors";
|
|
7
7
|
//#region pglite.worker.ts
|
|
8
8
|
worker({ init(options) {
|
|
9
|
-
const
|
|
9
|
+
const dbName = (options?.meta)?.dbName ?? DEFAULT_RELATIONAL_PROCESSOR_DB_NAME;
|
|
10
|
+
const idbFs = new IdbFs(dbName);
|
|
10
11
|
return Promise.resolve(new PGlite({
|
|
11
12
|
fs: idbFs,
|
|
12
13
|
relaxedDurability: true,
|
|
@@ -16,4 +17,4 @@ worker({ init(options) {
|
|
|
16
17
|
//#endregion
|
|
17
18
|
|
|
18
19
|
//# sourceMappingURL=pglite.worker.js.map
|
|
19
|
-
//# debugId=
|
|
20
|
+
//# debugId=d41200c7-f359-5872-986a-21f333235e55
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pglite.worker.js","sources":["../pglite.worker.ts"],"sourcesContent":["import { IdbFs, PGlite } from \"@electric-sql/pglite\";\nimport { live } from \"@electric-sql/pglite/live\";\nimport { worker } from \"@electric-sql/pglite/worker\";\nimport { DEFAULT_RELATIONAL_PROCESSOR_DB_NAME } from \"@powerhousedao/shared/processors\";\n\nworker({\n init(options) {\n // dbName carries the origin-scoped storage namespace from the main thread.\n const dbName =\n (options?.meta as { dbName?: string } | undefined)?.dbName ??\n DEFAULT_RELATIONAL_PROCESSOR_DB_NAME;\n const idbFs = new IdbFs(dbName);\n return Promise.resolve(\n new PGlite({\n fs: idbFs,\n relaxedDurability: true,\n extensions: { live },\n }),\n );\n },\n}).catch(console.error);\n"],"names":[],"mappings":";;;;;;;AAKA,OAAO,EACL,KAAK,SAAS;
|
|
1
|
+
{"version":3,"file":"pglite.worker.js","sources":["../pglite.worker.ts"],"sourcesContent":["import { IdbFs, PGlite } from \"@electric-sql/pglite\";\nimport { live } from \"@electric-sql/pglite/live\";\nimport { worker } from \"@electric-sql/pglite/worker\";\nimport { DEFAULT_RELATIONAL_PROCESSOR_DB_NAME } from \"@powerhousedao/shared/processors\";\n\nworker({\n init(options) {\n // dbName carries the origin-scoped storage namespace from the main thread.\n const dbName =\n (options?.meta as { dbName?: string } | undefined)?.dbName ??\n DEFAULT_RELATIONAL_PROCESSOR_DB_NAME;\n const idbFs = new IdbFs(dbName);\n return Promise.resolve(\n new PGlite({\n fs: idbFs,\n relaxedDurability: true,\n extensions: { live },\n }),\n );\n },\n}).catch(console.error);\n"],"names":[],"mappings":";;;;;;;AAKA,OAAO,EACL,KAAK,SAAS;CAEZ,MAAM,UACH,SAAS,KAAA,EAA0C,UACpD;CACF,MAAM,QAAQ,IAAI,MAAM,MAAM;CAC9B,OAAO,QAAQ,QACb,IAAI,OAAO;EACT,IAAI;EACJ,mBAAmB;EACnB,YAAY,EAAE,KAAK;CACrB,CAAC,CACH;AACF,EACF,CAAC,CAAC,CAAC,MAAM,QAAQ,KAAK","debug_id":"d41200c7-f359-5872-986a-21f333235e55"}
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export {}
|
|
2
|
+
export {};
|
|
@@ -1,12 +1,13 @@
|
|
|
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]="7d3ab944-b06a-5973-b3ff-073440f249b5")}catch(e){}}();
|
|
3
3
|
import { DEFAULT_RELATIONAL_PROCESSOR_DB_NAME } from "@powerhousedao/shared/processors";
|
|
4
4
|
import { IdbFs, PGlite } from "pglite-legacy-02";
|
|
5
5
|
import { live } from "pglite-legacy-02/live";
|
|
6
6
|
import { worker } from "pglite-legacy-02/worker";
|
|
7
7
|
//#region pglite.worker.legacy.ts
|
|
8
8
|
worker({ init(options) {
|
|
9
|
-
const
|
|
9
|
+
const dbName = (options?.meta)?.dbName ?? DEFAULT_RELATIONAL_PROCESSOR_DB_NAME;
|
|
10
|
+
const idbFs = new IdbFs(dbName);
|
|
10
11
|
return Promise.resolve(new PGlite({
|
|
11
12
|
fs: idbFs,
|
|
12
13
|
relaxedDurability: true,
|
|
@@ -16,4 +17,4 @@ worker({ init(options) {
|
|
|
16
17
|
//#endregion
|
|
17
18
|
|
|
18
19
|
//# sourceMappingURL=pglite.worker.legacy.js.map
|
|
19
|
-
//# debugId=
|
|
20
|
+
//# debugId=7d3ab944-b06a-5973-b3ff-073440f249b5
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pglite.worker.legacy.js","sources":["../pglite.worker.legacy.ts"],"sourcesContent":["import { IdbFs, PGlite } from \"pglite-legacy-02\";\nimport { live } from \"pglite-legacy-02/live\";\nimport { worker } from \"pglite-legacy-02/worker\";\nimport { DEFAULT_RELATIONAL_PROCESSOR_DB_NAME } from \"@powerhousedao/shared/processors\";\n\nworker({\n init(options) {\n // dbName carries the origin-scoped storage namespace from the main thread.\n const dbName =\n (options?.meta as { dbName?: string } | undefined)?.dbName ??\n DEFAULT_RELATIONAL_PROCESSOR_DB_NAME;\n const idbFs = new IdbFs(dbName);\n return Promise.resolve(\n new PGlite({\n fs: idbFs,\n relaxedDurability: true,\n extensions: { live },\n }),\n );\n },\n}).catch(console.error);\n"],"names":[],"mappings":";;;;;;;AAKA,OAAO,EACL,KAAK,SAAS;
|
|
1
|
+
{"version":3,"file":"pglite.worker.legacy.js","sources":["../pglite.worker.legacy.ts"],"sourcesContent":["import { IdbFs, PGlite } from \"pglite-legacy-02\";\nimport { live } from \"pglite-legacy-02/live\";\nimport { worker } from \"pglite-legacy-02/worker\";\nimport { DEFAULT_RELATIONAL_PROCESSOR_DB_NAME } from \"@powerhousedao/shared/processors\";\n\nworker({\n init(options) {\n // dbName carries the origin-scoped storage namespace from the main thread.\n const dbName =\n (options?.meta as { dbName?: string } | undefined)?.dbName ??\n DEFAULT_RELATIONAL_PROCESSOR_DB_NAME;\n const idbFs = new IdbFs(dbName);\n return Promise.resolve(\n new PGlite({\n fs: idbFs,\n relaxedDurability: true,\n extensions: { live },\n }),\n );\n },\n}).catch(console.error);\n"],"names":[],"mappings":";;;;;;;AAKA,OAAO,EACL,KAAK,SAAS;CAEZ,MAAM,UACH,SAAS,KAAA,EAA0C,UACpD;CACF,MAAM,QAAQ,IAAI,MAAM,MAAM;CAC9B,OAAO,QAAQ,QACb,IAAI,OAAO;EACT,IAAI;EACJ,mBAAmB;EACnB,YAAY,EAAE,KAAK;CACrB,CAAC,CACH;AACF,EACF,CAAC,CAAC,CAAC,MAAM,QAAQ,KAAK","debug_id":"7d3ab944-b06a-5973-b3ff-073440f249b5"}
|
|
@@ -1,27 +1,8 @@
|
|
|
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 {
|
|
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]="ee33d4d1-ef09-5b2c-8c8a-cf207add5ce2")}catch(e){}}();
|
|
3
|
+
import { t as getIsEmbedded } from "./useIsEmbedded-BWJ0qb7w.js";
|
|
4
|
+
import { r as connectConfig } from "./connect.config-CaXMoB42.js";
|
|
4
5
|
import { useSyncExternalStore } from "react";
|
|
5
|
-
//#region src/hooks/useIsEmbedded.ts
|
|
6
|
-
/**
|
|
7
|
-
* Detects whether Connect is being rendered inside another app (e.g. inside
|
|
8
|
-
* an iframe in the vetra-cli drive editor). When `?embed=1` is present in the
|
|
9
|
-
* URL, chrome that doesn't make sense in the embedded context — the cookie
|
|
10
|
-
* banner, the outer sidebar — is suppressed.
|
|
11
|
-
*/
|
|
12
|
-
function getIsEmbedded() {
|
|
13
|
-
if (typeof window === "undefined") return false;
|
|
14
|
-
try {
|
|
15
|
-
const value = new URLSearchParams(window.location.search).get("embed");
|
|
16
|
-
return value !== null && value !== "0" && value !== "false";
|
|
17
|
-
} catch {
|
|
18
|
-
return false;
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
function useIsEmbedded() {
|
|
22
|
-
return getIsEmbedded();
|
|
23
|
-
}
|
|
24
|
-
//#endregion
|
|
25
6
|
//#region src/hooks/preferences-store.ts
|
|
26
7
|
const namespace = connectConfig.routerBasename;
|
|
27
8
|
/**
|
|
@@ -98,7 +79,7 @@ const useCookieBanner = () => {
|
|
|
98
79
|
return [useSyncExternalStore(subscribeBannerShown, getBannerShown, getBannerShown), setBannerShown];
|
|
99
80
|
};
|
|
100
81
|
//#endregion
|
|
101
|
-
export {
|
|
82
|
+
export { useAcceptedCookies as n, useCookieBanner as r, setBannerShown as t };
|
|
102
83
|
|
|
103
|
-
//# sourceMappingURL=preferences-store-
|
|
104
|
-
//# debugId=
|
|
84
|
+
//# sourceMappingURL=preferences-store-DZUIAkHE.js.map
|
|
85
|
+
//# debugId=ee33d4d1-ef09-5b2c-8c8a-cf207add5ce2
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preferences-store-DZUIAkHE.js","sources":["../src/hooks/preferences-store.ts"],"sourcesContent":["import { connectConfig } from \"@powerhousedao/connect/config\";\nimport { useSyncExternalStore } from \"react\";\n\nimport { getIsEmbedded } from \"./useIsEmbedded.js\";\n\nconst namespace = connectConfig.routerBasename;\n\n/**\n * Block-proof home for Connect's consent and banner state.\n *\n * The file name deliberately avoids words that appear in ad-blocker\n * filter lists (cookie, banner, consent, analytics, ...). Modules in the\n * app's critical import chain import from here, never from files whose\n * URLs match those filters. If an ad blocker blocks the lazy-loaded\n * cookie-banner chunk instead, the app simply never shows the banner —\n * which leaves the flags at their rejected defaults (analytics off) —\n * and everything else keeps working.\n */\n\n// ---------------------------------------------------------------------------\n// Accepted cookies (analytics / marketing / functional)\n// ---------------------------------------------------------------------------\n\nexport const ACCEPTED_COOKIES_KEY_STORAGE = `${namespace}:acceptedCookies`;\n\nexport interface AcceptedCookies {\n analytics: boolean;\n marketing: boolean;\n functional: boolean;\n}\n\nconst REJECTED_COOKIES: AcceptedCookies = {\n analytics: false,\n marketing: false,\n functional: false,\n};\n\nconst cookieListeners = new Set<() => void>();\n\nlet acceptedCookies: AcceptedCookies = getInitialAcceptedCookies();\n\nfunction getInitialAcceptedCookies(): AcceptedCookies {\n try {\n const value = localStorage.getItem(ACCEPTED_COOKIES_KEY_STORAGE);\n return value ? (JSON.parse(value) as AcceptedCookies) : REJECTED_COOKIES;\n } catch {\n return REJECTED_COOKIES;\n }\n}\n\nfunction subscribeAcceptedCookies(fn: () => void) {\n cookieListeners.add(fn);\n return () => {\n cookieListeners.delete(fn);\n };\n}\n\nfunction getAcceptedCookies(): AcceptedCookies {\n return acceptedCookies;\n}\n\nexport function setAcceptedCookies(\n setter: (prev: AcceptedCookies) => AcceptedCookies,\n) {\n acceptedCookies = setter(acceptedCookies);\n localStorage.setItem(\n ACCEPTED_COOKIES_KEY_STORAGE,\n JSON.stringify(acceptedCookies),\n );\n cookieListeners.forEach((fn) => fn());\n}\n\nexport const useAcceptedCookies = () => {\n const cookies = useSyncExternalStore(\n subscribeAcceptedCookies,\n getAcceptedCookies,\n getAcceptedCookies,\n );\n return [cookies, setAcceptedCookies] as const;\n};\n\n// ---------------------------------------------------------------------------\n// Cookie banner visibility\n// ---------------------------------------------------------------------------\n\nexport const COOKIE_BANNER_KEY_STORAGE = `${namespace}:display-cookie-banner`;\n\nconst bannerListeners = new Set<() => void>();\n\nlet bannerShown = getInitialBannerShown();\n\nfunction getInitialBannerShown(): boolean {\n if (getIsEmbedded()) return false;\n try {\n const value = localStorage.getItem(COOKIE_BANNER_KEY_STORAGE);\n return value !== \"false\";\n } catch (error) {\n console.error(error);\n return true;\n }\n}\n\nfunction subscribeBannerShown(fn: () => void) {\n bannerListeners.add(fn);\n return () => {\n bannerListeners.delete(fn);\n };\n}\n\nfunction getBannerShown(): boolean {\n return bannerShown;\n}\n\nexport function setBannerShown(state: boolean) {\n bannerShown = state;\n localStorage.setItem(COOKIE_BANNER_KEY_STORAGE, JSON.stringify(state));\n bannerListeners.forEach((fn) => fn());\n}\n\nexport const useCookieBanner = () => {\n const shown = useSyncExternalStore(\n subscribeBannerShown,\n getBannerShown,\n getBannerShown,\n );\n return [shown, setBannerShown] as const;\n};\n"],"names":[],"mappings":";;;;;;AAKA,MAAM,YAAY,cAAc;;;;;;;;;;;;AAkBhC,MAAa,+BAA+B,GAAG,UAAU;AAQzD,MAAM,mBAAoC;CACxC,WAAW;CACX,WAAW;CACX,YAAY;AACd;AAEA,MAAM,kCAAkB,IAAI,IAAgB;AAE5C,IAAI,kBAAmC,0BAA0B;AAEjE,SAAS,4BAA6C;CACpD,IAAI;EACF,MAAM,QAAQ,aAAa,QAAQ,4BAA4B;EAC/D,OAAO,QAAS,KAAK,MAAM,KAAK,IAAwB;CAC1D,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,yBAAyB,IAAgB;CAChD,gBAAgB,IAAI,EAAE;CACtB,aAAa;EACX,gBAAgB,OAAO,EAAE;CAC3B;AACF;AAEA,SAAS,qBAAsC;CAC7C,OAAO;AACT;AAEA,SAAgB,mBACd,QACA;CACA,kBAAkB,OAAO,eAAe;CACxC,aAAa,QACX,8BACA,KAAK,UAAU,eAAe,CAChC;CACA,gBAAgB,SAAS,OAAO,GAAG,CAAC;AACtC;AAEA,MAAa,2BAA2B;CAMtC,OAAO,CALS,qBACd,0BACA,oBACA,kBAEY,GAAG,kBAAkB;AACrC;AAMA,MAAa,4BAA4B,GAAG,UAAU;AAEtD,MAAM,kCAAkB,IAAI,IAAgB;AAE5C,IAAI,cAAc,sBAAsB;AAExC,SAAS,wBAAiC;CACxC,IAAI,cAAc,GAAG,OAAO;CAC5B,IAAI;EAEF,OADc,aAAa,QAAQ,yBACxB,MAAM;CACnB,SAAS,OAAO;EACd,QAAQ,MAAM,KAAK;EACnB,OAAO;CACT;AACF;AAEA,SAAS,qBAAqB,IAAgB;CAC5C,gBAAgB,IAAI,EAAE;CACtB,aAAa;EACX,gBAAgB,OAAO,EAAE;CAC3B;AACF;AAEA,SAAS,iBAA0B;CACjC,OAAO;AACT;AAEA,SAAgB,eAAe,OAAgB;CAC7C,cAAc;CACd,aAAa,QAAQ,2BAA2B,KAAK,UAAU,KAAK,CAAC;CACrE,gBAAgB,SAAS,OAAO,GAAG,CAAC;AACtC;AAEA,MAAa,wBAAwB;CAMnC,OAAO,CALO,qBACZ,sBACA,gBACA,cAEU,GAAG,cAAc;AAC/B","debug_id":"ee33d4d1-ef09-5b2c-8c8a-cf207add5ce2"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
//#region src/utils/pwa-manifest-link.ts
|
|
2
2
|
|
|
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]="
|
|
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]="0e412e66-7d59-5eec-9dd7-16040f9e56b6")}catch(e){}}();
|
|
4
4
|
let manifestRevision = 0;
|
|
5
5
|
/**
|
|
6
6
|
* Force the browser to re-consume `manifest.webmanifest` by replacing the
|
|
@@ -30,5 +30,5 @@ function refreshPwaManifestLink() {
|
|
|
30
30
|
//#endregion
|
|
31
31
|
export { refreshPwaManifestLink as t };
|
|
32
32
|
|
|
33
|
-
//# sourceMappingURL=pwa-manifest-link-
|
|
34
|
-
//# debugId=
|
|
33
|
+
//# sourceMappingURL=pwa-manifest-link-DQRJpF0r.js.map
|
|
34
|
+
//# debugId=0e412e66-7d59-5eec-9dd7-16040f9e56b6
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pwa-manifest-link-
|
|
1
|
+
{"version":3,"file":"pwa-manifest-link-DQRJpF0r.js","sources":["../src/utils/pwa-manifest-link.ts"],"sourcesContent":["// After a runtime package install/removal updates the PWA fragment in\n// IndexedDB (BrowserPackageManager.#syncPwaFragments), the service worker\n// already serves an up-to-date `manifest.webmanifest` — it reads IndexedDB\n// fresh on every request. But the browser only parsed `<link rel=\"manifest\">`\n// ONCE, at page load, so its in-memory manifest (the install prompt, and the\n// manifest's declared fields as the browser reads them — visible in\n// DevTools → Application → Manifest) stays frozen until something makes it\n// re-consume. That \"something\" used to be a manual reload / service-worker\n// update.\n//\n// Re-attaching the manifest `<link>` with a fresh, cache-busting href triggers\n// Chromium's manifest-change invalidation (it recomputes the manifest URL and\n// notifies its consumers), so the install pipeline / DevTools re-fetch the\n// (dynamically served) manifest on demand — no full page reload. The SW route\n// matches on the pathname, so the extra query param doesn't change which\n// response is served, and `start_url`/`scope`/`id` are unaffected (they resolve\n// to the same directory, dropping the query).\n//\n// Caveat (unavoidable, not app-fixable): the OS-level registrations the manifest\n// drives — file associations and launch_handler — are snapshotted by the OS at\n// install time and only re-read on the browser's own throttled manifest-update\n// schedule, so those still lag. The reliable, immediate signal is the served\n// manifest itself (DevTools → Application → Manifest).\n\n// Monotonic per-session revision so each re-attach uses a distinct href (a\n// counter, not a timestamp — deterministic and dependency-free).\nlet manifestRevision = 0;\n\n/**\n * Force the browser to re-consume `manifest.webmanifest` by replacing the\n * `<link rel=\"manifest\">` element with a fresh, cache-busting one. No-op when\n * there is no DOM or no manifest link (dev mode / offline disabled — the build\n * only injects the link when the service worker is enabled).\n */\nexport function refreshPwaManifestLink(): void {\n if (typeof document === \"undefined\") return;\n const existing = document.querySelector<HTMLLinkElement>(\n 'link[rel=\"manifest\"]',\n );\n if (!existing) return;\n // An absent/empty href would resolve to the document URL (new URL(\"\", base)\n // does not throw), producing a manifest link pointing at the HTML page. Bail.\n if (!existing.getAttribute(\"href\")) return;\n\n let href: string;\n try {\n const url = new URL(existing.href, document.baseURI);\n url.searchParams.set(\"ph-manifest-rev\", String(++manifestRevision));\n href = url.toString();\n } catch {\n return;\n }\n\n const link = document.createElement(\"link\");\n link.rel = \"manifest\";\n // Preserve crossorigin (vite-plugin-pwa sets it when useCredentials is on).\n if (existing.crossOrigin) link.crossOrigin = existing.crossOrigin;\n link.href = href;\n existing.replaceWith(link);\n}\n"],"names":[],"mappings":";;;AA0BA,IAAI,mBAAmB;;;;;;;AAQvB,SAAgB,yBAA+B;CAC7C,IAAI,OAAO,aAAa,aAAa;CACrC,MAAM,WAAW,SAAS,cACxB,wBACF;CACA,IAAI,CAAC,UAAU;CAGf,IAAI,CAAC,SAAS,aAAa,MAAM,GAAG;CAEpC,IAAI;CACJ,IAAI;EACF,MAAM,MAAM,IAAI,IAAI,SAAS,MAAM,SAAS,OAAO;EACnD,IAAI,aAAa,IAAI,mBAAmB,OAAO,EAAE,gBAAgB,CAAC;EAClE,OAAO,IAAI,SAAS;CACtB,QAAQ;EACN;CACF;CAEA,MAAM,OAAO,SAAS,cAAc,MAAM;CAC1C,KAAK,MAAM;CAEX,IAAI,SAAS,aAAa,KAAK,cAAc,SAAS;CACtD,KAAK,OAAO;CACZ,SAAS,YAAY,IAAI;AAC3B","debug_id":"0e412e66-7d59-5eec-9dd7-16040f9e56b6"}
|