@powerhousedao/connect 6.2.3-dev.10 → 6.2.3-dev.11

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.
Files changed (100) hide show
  1. package/dist/{AddDriveModal-xAw48kdl.js → AddDriveModal-CW-ZSWkf.js} +5 -5
  2. package/dist/{AddDriveModal-xAw48kdl.js.map → AddDriveModal-CW-ZSWkf.js.map} +1 -1
  3. package/dist/{ClearStorageModal-BHLFpni1.js → ClearStorageModal-DmcvyYIt.js} +5 -5
  4. package/dist/{ClearStorageModal-BHLFpni1.js.map → ClearStorageModal-DmcvyYIt.js.map} +1 -1
  5. package/dist/{ConfirmDocumentUpgradeModal-FUOhZsk7.js → ConfirmDocumentUpgradeModal-BBrFlHp_.js} +6 -6
  6. package/dist/{ConfirmDocumentUpgradeModal-FUOhZsk7.js.map → ConfirmDocumentUpgradeModal-BBrFlHp_.js.map} +1 -1
  7. package/dist/{CookiesPolicyModal-BpyPPyxS.js → CookiesPolicyModal-lKdOuTNm.js} +4 -4
  8. package/dist/{CookiesPolicyModal-BpyPPyxS.js.map → CookiesPolicyModal-lKdOuTNm.js.map} +1 -1
  9. package/dist/{CreateDocumentModal-C45W8J0V.js → CreateDocumentModal-HmK-78sB.js} +4 -4
  10. package/dist/{CreateDocumentModal-C45W8J0V.js.map → CreateDocumentModal-HmK-78sB.js.map} +1 -1
  11. package/dist/{DebugSettingsModal-cFjT1zO6.js → DebugSettingsModal-DCHY1gxr.js} +7 -7
  12. package/dist/{DebugSettingsModal-cFjT1zO6.js.map → DebugSettingsModal-DCHY1gxr.js.map} +1 -1
  13. package/dist/{DeleteDriveModal-Dug84t1j.js → DeleteDriveModal-Cyw6hwc2.js} +5 -5
  14. package/dist/{DeleteDriveModal-Dug84t1j.js.map → DeleteDriveModal-Cyw6hwc2.js.map} +1 -1
  15. package/dist/{DeleteItemModal-mMzy3V8o.js → DeleteItemModal-CiFwstZx.js} +5 -5
  16. package/dist/{DeleteItemModal-mMzy3V8o.js.map → DeleteItemModal-CiFwstZx.js.map} +1 -1
  17. package/dist/{DisclaimerModal-DvpD5dPM.js → DisclaimerModal-DIRsjUvu.js} +4 -4
  18. package/dist/{DisclaimerModal-DvpD5dPM.js.map → DisclaimerModal-DIRsjUvu.js.map} +1 -1
  19. package/dist/{DocumentVersionUnsupportedModal-C3Q0V75l.js → DocumentVersionUnsupportedModal-KftC3-jr.js} +4 -4
  20. package/dist/{DocumentVersionUnsupportedModal-C3Q0V75l.js.map → DocumentVersionUnsupportedModal-KftC3-jr.js.map} +1 -1
  21. package/dist/{DownloadDocumentWithErrorsModal-IKl0ljQb.js → DownloadDocumentWithErrorsModal-CxsR74d-.js} +4 -4
  22. package/dist/{DownloadDocumentWithErrorsModal-IKl0ljQb.js.map → DownloadDocumentWithErrorsModal-CxsR74d-.js.map} +1 -1
  23. package/dist/{DriveAuthRequiredModal-DVK7ZQzO.js → DriveAuthRequiredModal-BoqnnNKT.js} +5 -5
  24. package/dist/{DriveAuthRequiredModal-DVK7ZQzO.js.map → DriveAuthRequiredModal-BoqnnNKT.js.map} +1 -1
  25. package/dist/{DriveSettingsModal-C6-mRQiv.js → DriveSettingsModal-DRarHRIb.js} +4 -4
  26. package/dist/{DriveSettingsModal-C6-mRQiv.js.map → DriveSettingsModal-DRarHRIb.js.map} +1 -1
  27. package/dist/{InspectorModal-Z7YMEHRm.js → InspectorModal-C-stEvbU.js} +8 -8
  28. package/dist/{InspectorModal-Z7YMEHRm.js.map → InspectorModal-C-stEvbU.js.map} +1 -1
  29. package/dist/{LoginModal-CybbOm3N.js → LoginModal-DhQTxsoG.js} +5 -5
  30. package/dist/{LoginModal-CybbOm3N.js.map → LoginModal-DhQTxsoG.js.map} +1 -1
  31. package/dist/{MissingPackageModal-nBnExqO0.js → MissingPackageModal-aotCq824.js} +5 -5
  32. package/dist/{MissingPackageModal-nBnExqO0.js.map → MissingPackageModal-aotCq824.js.map} +1 -1
  33. package/dist/{OpenFileDocumentsModal-JcGCx1ta.js → OpenFileDocumentsModal-D6KDgv7k.js} +6 -6
  34. package/dist/{OpenFileDocumentsModal-JcGCx1ta.js.map → OpenFileDocumentsModal-D6KDgv7k.js.map} +1 -1
  35. package/dist/{SettingsModal-CgqnSXs5.js → SettingsModal-BUZo2YyO.js} +9 -9
  36. package/dist/{SettingsModal-CgqnSXs5.js.map → SettingsModal-BUZo2YyO.js.map} +1 -1
  37. package/dist/{UpgradeDriveModal-_8t9slxQ.js → UpgradeDriveModal-C8scFkuq.js} +4 -4
  38. package/dist/{UpgradeDriveModal-_8t9slxQ.js.map → UpgradeDriveModal-C8scFkuq.js.map} +1 -1
  39. package/dist/app-loader-8h_8WWHM.js +4 -0
  40. package/dist/{app-loader-GDy45Yza.js → app-loader-DmGPm7Sl.js} +1102 -1105
  41. package/dist/app-loader-DmGPm7Sl.js.map +1 -0
  42. package/dist/app-skeleton-BQts0IHn.js +4 -0
  43. package/dist/app-skeleton-C6RjKQuy.js +111 -0
  44. package/dist/app-skeleton-C6RjKQuy.js.map +1 -0
  45. package/dist/boot-uobbAyWT.js +210 -0
  46. package/dist/boot-uobbAyWT.js.map +1 -0
  47. package/dist/buffer-Bu1eWySI.js +66 -0
  48. package/dist/buffer-Bu1eWySI.js.map +1 -0
  49. package/dist/{build-info-BPvkFr0E.js → build-info-BaGdg_ws.js} +5 -5
  50. package/dist/{build-info-BPvkFr0E.js.map → build-info-BaGdg_ws.js.map} +1 -1
  51. package/dist/components-BCqRZRGY.js +5 -0
  52. package/dist/{connect.config-DaHDEUrw.js → connect.config-CzrL0fQ8.js} +3 -3
  53. package/dist/{connect.config-DaHDEUrw.js.map → connect.config-CzrL0fQ8.js.map} +1 -1
  54. package/dist/{connection-state-3w4liC1X.js → connection-state-B-ZALWjg.js} +5 -5
  55. package/dist/{connection-state-3w4liC1X.js.map → connection-state-B-ZALWjg.js.map} +1 -1
  56. package/dist/{cookie-banner-BH6bIq24.js → cookie-banner-DNkY7wrk.js} +6 -6
  57. package/dist/{cookie-banner-BH6bIq24.js.map → cookie-banner-DNkY7wrk.js.map} +1 -1
  58. package/dist/{i18n-CWO0vYVd.js → i18n-90Q8hAPL.js} +3 -3
  59. package/dist/{i18n-CWO0vYVd.js.map → i18n-90Q8hAPL.js.map} +1 -1
  60. package/dist/{load-BJ8uRKR9.js → load-ChkCrcus.js} +8 -8
  61. package/dist/{load-BJ8uRKR9.js.map → load-ChkCrcus.js.map} +1 -1
  62. package/dist/main.js +8 -8
  63. package/dist/main.js.map +1 -1
  64. package/dist/package-manager-ncb8SFdW.js +470 -0
  65. package/dist/package-manager-ncb8SFdW.js.map +1 -0
  66. package/dist/{pglite-major-B39aOEiE.js → pglite-major-D3sdYMs2.js} +3 -3
  67. package/dist/{pglite-major-B39aOEiE.js.map → pglite-major-D3sdYMs2.js.map} +1 -1
  68. package/dist/{pglite-migrate-core-Boxqqx-c.js → pglite-migrate-core-BIWwtl5e.js} +4 -4
  69. package/dist/{pglite-migrate-core-Boxqqx-c.js.map → pglite-migrate-core-BIWwtl5e.js.map} +1 -1
  70. package/dist/{pglite-seed-BqAUvNFw.js → pglite-seed-CMX1lzzo.js} +4 -4
  71. package/dist/{pglite-seed-BqAUvNFw.js.map → pglite-seed-CMX1lzzo.js.map} +1 -1
  72. package/dist/{preferences-store-_5Cw4_YV.js → preferences-store-D6w85eGd.js} +6 -25
  73. package/dist/preferences-store-D6w85eGd.js.map +1 -0
  74. package/dist/{pwa-manifest-link-DIgOSo2Q.js → pwa-manifest-link-B38lBmEu.js} +3 -3
  75. package/dist/{pwa-manifest-link-DIgOSo2Q.js.map → pwa-manifest-link-B38lBmEu.js.map} +1 -1
  76. package/dist/{reactor-CbgxQyev.js → reactor-CskVEvz2.js} +23 -420
  77. package/dist/reactor-CskVEvz2.js.map +1 -0
  78. package/dist/reactor.worker.js +9 -4
  79. package/dist/reactor.worker.js.map +1 -1
  80. package/dist/{registerServiceWorker-BSzbNfvz.js → registerServiceWorker-B3cnPnPC.js} +5 -5
  81. package/dist/{registerServiceWorker-BSzbNfvz.js.map → registerServiceWorker-B3cnPnPC.js.map} +1 -1
  82. package/dist/start-connect.d.ts.map +1 -1
  83. package/dist/start-connect.js +6 -8
  84. package/dist/start-connect.js.map +1 -1
  85. package/dist/style.css +19 -0
  86. package/dist/{toast-BXIGd4Eb.js → toast-CO6ChlzE.js} +3 -3
  87. package/dist/{toast-BXIGd4Eb.js.map → toast-CO6ChlzE.js.map} +1 -1
  88. package/dist/{use-renown-login-Cf3va6u_.js → use-renown-login-rS9wfcuG.js} +3 -3
  89. package/dist/{use-renown-login-Cf3va6u_.js.map → use-renown-login-rS9wfcuG.js.map} +1 -1
  90. package/dist/useIsEmbedded-B_AIFqBu.js +26 -0
  91. package/dist/useIsEmbedded-B_AIFqBu.js.map +1 -0
  92. package/dist/{useRegistryPackages-BnUcL_nZ.js → useRegistryPackages-B4jnu65n.js} +60 -3
  93. package/dist/useRegistryPackages-B4jnu65n.js.map +1 -0
  94. package/package.json +12 -12
  95. package/dist/app-loader-GDy45Yza.js.map +0 -1
  96. package/dist/app-loader-WZecUfE8.js +0 -4
  97. package/dist/components-Df4NlQZz.js +0 -4
  98. package/dist/preferences-store-_5Cw4_YV.js.map +0 -1
  99. package/dist/reactor-CbgxQyev.js.map +0 -1
  100. package/dist/useRegistryPackages-BnUcL_nZ.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"pglite-major-B39aOEiE.js","sources":["../src/utils/pglite-idb.ts","../src/utils/pglite-major.ts"],"sourcesContent":["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":"ddbad278-3c18-5b56-abbb-371faa5f9b3a"}
1
+ {"version":3,"file":"pglite-major-D3sdYMs2.js","sources":["../src/utils/pglite-idb.ts","../src/utils/pglite-major.ts"],"sourcesContent":["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":"d5748eb7-b264-5ed4-bd82-ff98afd56f55"}
@@ -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]="5602ae27-0e93-52ce-93a2-befe343f87dd")}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-B39aOEiE.js";
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]="4b8c64a0-74c6-57b6-b136-5b7f33f6627a")}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-D3sdYMs2.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 () => {
@@ -139,5 +139,5 @@ async function migrateIdb(idbName, publishPhase, backup) {
139
139
  //#endregion
140
140
  export { writeFileData as a, readFileData as i, cloneFileData as n, migrateIdb as r, clearFileData as t };
141
141
 
142
- //# sourceMappingURL=pglite-migrate-core-Boxqqx-c.js.map
143
- //# debugId=5602ae27-0e93-52ce-93a2-befe343f87dd
142
+ //# sourceMappingURL=pglite-migrate-core-BIWwtl5e.js.map
143
+ //# debugId=4b8c64a0-74c6-57b6-b136-5b7f33f6627a
@@ -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-BIWwtl5e.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":"4b8c64a0-74c6-57b6-b136-5b7f33f6627a"}
@@ -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]="80c44266-18c5-5681-aebc-58df7e206589")}catch(e){}}();
3
- import { l as invalidateReactorPgMajorCache, m as REACTOR_PGLITE_NAME } from "./connection-state-3w4liC1X.js";
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]="e3a9f1af-a977-5d13-85f8-38669ba89044")}catch(e){}}();
3
+ import { l as invalidateReactorPgMajorCache, m as REACTOR_PGLITE_NAME } from "./connection-state-B-ZALWjg.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-BqAUvNFw.js.map
49
- //# debugId=80c44266-18c5-5681-aebc-58df7e206589
48
+ //# sourceMappingURL=pglite-seed-CMX1lzzo.js.map
49
+ //# debugId=e3a9f1af-a977-5d13-85f8-38669ba89044
@@ -1 +1 @@
1
- {"version":3,"file":"pglite-seed-BqAUvNFw.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,oBAAoB;AACrD,KAAI,CAAC,IAAK;CAEV,MAAM,QAAQ,SAAS,KAAK,GAAG;AAC/B,SAAQ,KAAK,iCAAiC,MAAM,cAAc;AAElE,KAAI;AACF,MAAI,UAAU,IAAI;GAChB,MAAM,EAAE,WAAW,MAAM,OAAO;GAChC,MAAM,KAAK,IAAI,OAAO,SAAS,sBAAsB;AACrD,OAAI;AACF,UAAM,GAAG;aACD;AACR,UAAM,GAAG,OAAO;;aAET,UAAU,IAAI;GACvB,MAAM,EAAE,WAAW,MAAM,OAAO;GAChC,MAAM,KAAK,IAAI,OAAO,SAAS,sBAAsB;AACrD,OAAI;AACF,UAAM,GAAG;aACD;AACR,UAAM,GAAG,OAAO;;SAEb;AACL,WAAQ,KAAK,qCAAqC,IAAI,YAAY;AAClE;;AAEF,UAAQ,KAAK,0BAA0B,MAAM,YAAY;WACjD;AACR,eAAa,WAAW,oBAAoB;AAC5C,iCAA+B","debug_id":"80c44266-18c5-5681-aebc-58df7e206589"}
1
+ {"version":3,"file":"pglite-seed-CMX1lzzo.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,oBAAoB;AACrD,KAAI,CAAC,IAAK;CAEV,MAAM,QAAQ,SAAS,KAAK,GAAG;AAC/B,SAAQ,KAAK,iCAAiC,MAAM,cAAc;AAElE,KAAI;AACF,MAAI,UAAU,IAAI;GAChB,MAAM,EAAE,WAAW,MAAM,OAAO;GAChC,MAAM,KAAK,IAAI,OAAO,SAAS,sBAAsB;AACrD,OAAI;AACF,UAAM,GAAG;aACD;AACR,UAAM,GAAG,OAAO;;aAET,UAAU,IAAI;GACvB,MAAM,EAAE,WAAW,MAAM,OAAO;GAChC,MAAM,KAAK,IAAI,OAAO,SAAS,sBAAsB;AACrD,OAAI;AACF,UAAM,GAAG;aACD;AACR,UAAM,GAAG,OAAO;;SAEb;AACL,WAAQ,KAAK,qCAAqC,IAAI,YAAY;AAClE;;AAEF,UAAQ,KAAK,0BAA0B,MAAM,YAAY;WACjD;AACR,eAAa,WAAW,oBAAoB;AAC5C,iCAA+B","debug_id":"e3a9f1af-a977-5d13-85f8-38669ba89044"}
@@ -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]="dbbeb3d8-22d7-5df6-a263-a0c970e9578b")}catch(e){}}();
3
- import { r as connectConfig } from "./connect.config-DaHDEUrw.js";
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]="f7866128-66b0-5e00-9efc-cc8530e0d871")}catch(e){}}();
3
+ import { t as getIsEmbedded } from "./useIsEmbedded-B_AIFqBu.js";
4
+ import { r as connectConfig } from "./connect.config-CzrL0fQ8.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 { useIsEmbedded as i, useCookieBanner as n, getIsEmbedded as r, useAcceptedCookies as t };
82
+ export { useAcceptedCookies as n, useCookieBanner as r, setBannerShown as t };
102
83
 
103
- //# sourceMappingURL=preferences-store-_5Cw4_YV.js.map
104
- //# debugId=dbbeb3d8-22d7-5df6-a263-a0c970e9578b
84
+ //# sourceMappingURL=preferences-store-D6w85eGd.js.map
85
+ //# debugId=f7866128-66b0-5e00-9efc-cc8530e0d871
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preferences-store-D6w85eGd.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;CACb;AAED,MAAM,kCAAkB,IAAI,KAAiB;AAE7C,IAAI,kBAAmC,2BAA2B;AAElE,SAAS,4BAA6C;AACpD,KAAI;EACF,MAAM,QAAQ,aAAa,QAAQ,6BAA6B;AAChE,SAAO,QAAS,KAAK,MAAM,MAAM,GAAuB;SAClD;AACN,SAAO;;;AAIX,SAAS,yBAAyB,IAAgB;AAChD,iBAAgB,IAAI,GAAG;AACvB,cAAa;AACX,kBAAgB,OAAO,GAAG;;;AAI9B,SAAS,qBAAsC;AAC7C,QAAO;;AAGT,SAAgB,mBACd,QACA;AACA,mBAAkB,OAAO,gBAAgB;AACzC,cAAa,QACX,8BACA,KAAK,UAAU,gBAAgB,CAChC;AACD,iBAAgB,SAAS,OAAO,IAAI,CAAC;;AAGvC,MAAa,2BAA2B;AAMtC,QAAO,CALS,qBACd,0BACA,oBACA,mBACD,EACgB,mBAAmB;;AAOtC,MAAa,4BAA4B,GAAG,UAAU;AAEtD,MAAM,kCAAkB,IAAI,KAAiB;AAE7C,IAAI,cAAc,uBAAuB;AAEzC,SAAS,wBAAiC;AACxC,KAAI,eAAe,CAAE,QAAO;AAC5B,KAAI;AAEF,SADc,aAAa,QAAQ,0BAA0B,KAC5C;UACV,OAAO;AACd,UAAQ,MAAM,MAAM;AACpB,SAAO;;;AAIX,SAAS,qBAAqB,IAAgB;AAC5C,iBAAgB,IAAI,GAAG;AACvB,cAAa;AACX,kBAAgB,OAAO,GAAG;;;AAI9B,SAAS,iBAA0B;AACjC,QAAO;;AAGT,SAAgB,eAAe,OAAgB;AAC7C,eAAc;AACd,cAAa,QAAQ,2BAA2B,KAAK,UAAU,MAAM,CAAC;AACtE,iBAAgB,SAAS,OAAO,IAAI,CAAC;;AAGvC,MAAa,wBAAwB;AAMnC,QAAO,CALO,qBACZ,sBACA,gBACA,eACD,EACc,eAAe","debug_id":"f7866128-66b0-5e00-9efc-cc8530e0d871"}
@@ -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]="b41f4611-48ee-5074-90dd-4eba2ebbe97f")}catch(e){}}();
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]="613989ef-9062-5946-a797-a0a6b2ee87c4")}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-DIgOSo2Q.js.map
34
- //# debugId=b41f4611-48ee-5074-90dd-4eba2ebbe97f
33
+ //# sourceMappingURL=pwa-manifest-link-B38lBmEu.js.map
34
+ //# debugId=613989ef-9062-5946-a797-a0a6b2ee87c4
@@ -1 +1 @@
1
- {"version":3,"file":"pwa-manifest-link-DIgOSo2Q.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;AAC7C,KAAI,OAAO,aAAa,YAAa;CACrC,MAAM,WAAW,SAAS,cACxB,yBACD;AACD,KAAI,CAAC,SAAU;AAGf,KAAI,CAAC,SAAS,aAAa,OAAO,CAAE;CAEpC,IAAI;AACJ,KAAI;EACF,MAAM,MAAM,IAAI,IAAI,SAAS,MAAM,SAAS,QAAQ;AACpD,MAAI,aAAa,IAAI,mBAAmB,OAAO,EAAE,iBAAiB,CAAC;AACnE,SAAO,IAAI,UAAU;SACf;AACN;;CAGF,MAAM,OAAO,SAAS,cAAc,OAAO;AAC3C,MAAK,MAAM;AAEX,KAAI,SAAS,YAAa,MAAK,cAAc,SAAS;AACtD,MAAK,OAAO;AACZ,UAAS,YAAY,KAAK","debug_id":"b41f4611-48ee-5074-90dd-4eba2ebbe97f"}
1
+ {"version":3,"file":"pwa-manifest-link-B38lBmEu.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;AAC7C,KAAI,OAAO,aAAa,YAAa;CACrC,MAAM,WAAW,SAAS,cACxB,yBACD;AACD,KAAI,CAAC,SAAU;AAGf,KAAI,CAAC,SAAS,aAAa,OAAO,CAAE;CAEpC,IAAI;AACJ,KAAI;EACF,MAAM,MAAM,IAAI,IAAI,SAAS,MAAM,SAAS,QAAQ;AACpD,MAAI,aAAa,IAAI,mBAAmB,OAAO,EAAE,iBAAiB,CAAC;AACnE,SAAO,IAAI,UAAU;SACf;AACN;;CAGF,MAAM,OAAO,SAAS,cAAc,OAAO;AAC3C,MAAK,MAAM;AAEX,KAAI,SAAS,YAAa,MAAK,cAAc,SAAS;AACtD,MAAK,OAAO;AACZ,UAAS,YAAY,KAAK","debug_id":"613989ef-9062-5946-a797-a0a6b2ee87c4"}