@powerhousedao/connect 6.2.2-dev.10 → 6.2.2-dev.12

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 (77) hide show
  1. package/assets/document-icon-192x192.png +0 -0
  2. package/assets/document-icon-512x512.png +0 -0
  3. package/assets/pwa-192x192.png +0 -0
  4. package/assets/pwa-512x512-maskable.png +0 -0
  5. package/assets/pwa-512x512.png +0 -0
  6. package/dist/{AddDriveModal-MMHlkJBJ.js → AddDriveModal-B_Oft9Cv.js} +4 -4
  7. package/dist/{AddDriveModal-MMHlkJBJ.js.map → AddDriveModal-B_Oft9Cv.js.map} +1 -1
  8. package/dist/{ClearStorageModal-CriXdO7P.js → ClearStorageModal-14u4aeex.js} +4 -4
  9. package/dist/{ClearStorageModal-CriXdO7P.js.map → ClearStorageModal-14u4aeex.js.map} +1 -1
  10. package/dist/{CookiesPolicyModal-CkcUKPLb.js → CookiesPolicyModal-CYFTfkEN.js} +3 -3
  11. package/dist/{CookiesPolicyModal-CkcUKPLb.js.map → CookiesPolicyModal-CYFTfkEN.js.map} +1 -1
  12. package/dist/{CreateDocumentModal-CvsTh0HM.js → CreateDocumentModal-Dmg3R-Vh.js} +3 -3
  13. package/dist/{CreateDocumentModal-CvsTh0HM.js.map → CreateDocumentModal-Dmg3R-Vh.js.map} +1 -1
  14. package/dist/{DebugSettingsModal-YV8YMO9a.js → DebugSettingsModal-CHyfTg2u.js} +5 -5
  15. package/dist/{DebugSettingsModal-YV8YMO9a.js.map → DebugSettingsModal-CHyfTg2u.js.map} +1 -1
  16. package/dist/{DeleteDriveModal-DSTK8FYk.js → DeleteDriveModal-CzRPqyMf.js} +4 -4
  17. package/dist/{DeleteDriveModal-DSTK8FYk.js.map → DeleteDriveModal-CzRPqyMf.js.map} +1 -1
  18. package/dist/{DeleteItemModal-B2nJmjsP.js → DeleteItemModal-CaCrmQOG.js} +4 -4
  19. package/dist/{DeleteItemModal-B2nJmjsP.js.map → DeleteItemModal-CaCrmQOG.js.map} +1 -1
  20. package/dist/{DisclaimerModal-D5FO34u9.js → DisclaimerModal-D5Jhefcc.js} +3 -3
  21. package/dist/{DisclaimerModal-D5FO34u9.js.map → DisclaimerModal-D5Jhefcc.js.map} +1 -1
  22. package/dist/{DownloadDocumentWithErrorsModal-tEr3bbtN.js → DownloadDocumentWithErrorsModal-ZuX8WDCC.js} +3 -3
  23. package/dist/{DownloadDocumentWithErrorsModal-tEr3bbtN.js.map → DownloadDocumentWithErrorsModal-ZuX8WDCC.js.map} +1 -1
  24. package/dist/{DriveAuthRequiredModal-BA2vS3oF.js → DriveAuthRequiredModal-CPV5uXnf.js} +3 -3
  25. package/dist/{DriveAuthRequiredModal-BA2vS3oF.js.map → DriveAuthRequiredModal-CPV5uXnf.js.map} +1 -1
  26. package/dist/{DriveSettingsModal-kR3hQnh4.js → DriveSettingsModal-VNpuhty1.js} +3 -3
  27. package/dist/{DriveSettingsModal-kR3hQnh4.js.map → DriveSettingsModal-VNpuhty1.js.map} +1 -1
  28. package/dist/{InspectorModal-DKvjtozu.js → InspectorModal-DKzQILfr.js} +6 -6
  29. package/dist/{InspectorModal-DKvjtozu.js.map → InspectorModal-DKzQILfr.js.map} +1 -1
  30. package/dist/{MissingPackageModal-BQcCQbOn.js → MissingPackageModal-D4V6oYzy.js} +18 -6
  31. package/dist/MissingPackageModal-D4V6oYzy.js.map +1 -0
  32. package/dist/OpenFileDocumentsModal-BLy9Z98Q.js +293 -0
  33. package/dist/OpenFileDocumentsModal-BLy9Z98Q.js.map +1 -0
  34. package/dist/{SettingsModal-yk1gDZgB.js → SettingsModal-Cmq_VH4m.js} +25 -12
  35. package/dist/SettingsModal-Cmq_VH4m.js.map +1 -0
  36. package/dist/{UpgradeDriveModal-BZGSE9_r.js → UpgradeDriveModal-Ul4tyz-Q.js} +3 -3
  37. package/dist/{UpgradeDriveModal-BZGSE9_r.js.map → UpgradeDriveModal-Ul4tyz-Q.js.map} +1 -1
  38. package/dist/app-loader-CmZQxyq0.js +4 -0
  39. package/dist/{app-loader-BrGV3wVg.js → app-loader-DdiMcHzZ.js} +251 -34
  40. package/dist/app-loader-DdiMcHzZ.js.map +1 -0
  41. package/dist/{build-info-DDJ2GhCe.js → build-info-BU9FFwx3.js} +5 -5
  42. package/dist/{build-info-DDJ2GhCe.js.map → build-info-BU9FFwx3.js.map} +1 -1
  43. package/dist/components-D_F74RBh.js +5 -0
  44. package/dist/{connection-state-DO_2lAEJ.js → connection-state-xPSbZ_4J.js} +3 -3
  45. package/dist/{connection-state-DO_2lAEJ.js.map → connection-state-xPSbZ_4J.js.map} +1 -1
  46. package/dist/{load-BrYKdy5m.js → load-ClIUHisS.js} +9 -9
  47. package/dist/{load-BrYKdy5m.js.map → load-ClIUHisS.js.map} +1 -1
  48. package/dist/main.js +1 -1
  49. package/dist/{package-DvEHDzEU.js → package-G8LMMUz8.js} +4 -4
  50. package/dist/package-G8LMMUz8.js.map +1 -0
  51. package/dist/{pglite-seed-z3B1JA38.js → pglite-seed-DRYYEWUq.js} +4 -4
  52. package/dist/{pglite-seed-z3B1JA38.js.map → pglite-seed-DRYYEWUq.js.map} +1 -1
  53. package/dist/pwa-manifest-link-CG8UajMz.js +34 -0
  54. package/dist/pwa-manifest-link-CG8UajMz.js.map +1 -0
  55. package/dist/{reactor-BRr4To9y.js → reactor-BGdk3n2t.js} +138 -11
  56. package/dist/reactor-BGdk3n2t.js.map +1 -0
  57. package/dist/{registerServiceWorker-nJIc0yEY.js → registerServiceWorker-uI4Gj6fl.js} +5 -3
  58. package/dist/registerServiceWorker-uI4Gj6fl.js.map +1 -0
  59. package/dist/{reload-connect-toast-D1Iqw9E_.js → reload-connect-toast-BkgP9i6_.js} +19 -3
  60. package/dist/{reload-connect-toast-D1Iqw9E_.js.map → reload-connect-toast-BkgP9i6_.js.map} +1 -1
  61. package/dist/start-connect.js +1 -1
  62. package/dist/style.css +16 -3
  63. package/dist/{toast-4t-VimvD.js → toast-BLv8rjmy.js} +3 -3
  64. package/dist/{toast-4t-VimvD.js.map → toast-BLv8rjmy.js.map} +1 -1
  65. package/dist/useRegistryPackages-DMhCvTWq.js +314 -0
  66. package/dist/useRegistryPackages-DMhCvTWq.js.map +1 -0
  67. package/package.json +11 -11
  68. package/dist/MissingPackageModal-BQcCQbOn.js.map +0 -1
  69. package/dist/SettingsModal-yk1gDZgB.js.map +0 -1
  70. package/dist/app-loader-Be9G3Rlk.js +0 -4
  71. package/dist/app-loader-BrGV3wVg.js.map +0 -1
  72. package/dist/components-BfW9xuar.js +0 -5
  73. package/dist/package-DvEHDzEU.js.map +0 -1
  74. package/dist/reactor-BRr4To9y.js.map +0 -1
  75. package/dist/registerServiceWorker-nJIc0yEY.js.map +0 -1
  76. package/dist/useRegistryPackages-BaYtekjQ.js +0 -179
  77. package/dist/useRegistryPackages-BaYtekjQ.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"registerServiceWorker-nJIc0yEY.js","sources":["../src/utils/registerServiceWorker.ts"],"sourcesContent":["import { connectConfig } from \"@powerhousedao/connect/config\";\n\nconst basePath = connectConfig.routerBasename;\n\nconst serviceWorkerScriptPath = [basePath, \"service-worker.js\"]\n .join(\"/\")\n .replace(/\\/{2,}/gm, \"/\");\n\n// External store backing the refresh prompt: Workbox (generateSW + prompt mode)\n// parks a new worker as \"waiting\"; we flag that here so\n// service-worker-update-prompt.tsx can offer a Refresh instead of reloading\n// from under the user.\nlet updateAvailable = false;\nconst updateListeners = new Set<() => void>();\n\nfunction setUpdateAvailable(value: boolean) {\n if (updateAvailable === value) return;\n updateAvailable = value;\n for (const listener of updateListeners) listener();\n}\n\nexport function subscribeServiceWorkerUpdate(cb: () => void): () => void {\n updateListeners.add(cb);\n return () => {\n updateListeners.delete(cb);\n };\n}\n\nexport function getServiceWorkerUpdateAvailable(): boolean {\n return updateAvailable;\n}\n\nclass ServiceWorkerManager {\n ready = false;\n debug = false;\n registration: ServiceWorkerRegistration | null = null;\n // Only reload on controllerchange when the user actually accepted an update.\n // clientsClaim fires controllerchange on the very first install too, and we\n // must not reload then.\n #updateAccepted = false;\n #reloading = false;\n\n constructor(debug = false) {\n this.debug = debug;\n }\n\n setDebug(debug: boolean) {\n this.debug = debug;\n }\n\n #log(...args: unknown[]) {\n if (this.debug) console.log(\"[ServiceWorker]\", ...args);\n }\n\n // Watch an installing worker; once it reaches \"installed\" while another\n // worker already controls the page, a new version is waiting → prompt.\n #trackInstalling(worker: ServiceWorker | null) {\n if (!worker) return;\n worker.addEventListener(\"statechange\", () => {\n if (worker.state === \"installed\" && navigator.serviceWorker.controller) {\n this.#log(\"New version installed and waiting\");\n setUpdateAvailable(true);\n }\n });\n }\n\n #handleRegistration(registration: ServiceWorkerRegistration) {\n this.registration = registration;\n this.ready = true;\n this.#log(\"registered\", registration);\n\n // A worker installed by a previous page load may already be waiting.\n if (registration.waiting && navigator.serviceWorker.controller) {\n setUpdateAvailable(true);\n }\n\n this.#trackInstalling(registration.installing);\n registration.addEventListener(\"updatefound\", () => {\n this.#trackInstalling(registration.installing);\n });\n }\n\n async #register() {\n try {\n navigator.serviceWorker.addEventListener(\"controllerchange\", () => {\n // First visit: boot fetches the runtime config before this SW controls\n // the page, so it never lands in the cache. Warm it now (clientsClaim\n // just gave us control) so a single online load is enough to go offline.\n this.#warmRuntimeConfigCache();\n // Reload once the worker we activated via applyUpdate() takes control.\n if (!this.#updateAccepted || this.#reloading) return;\n this.#reloading = true;\n window.location.reload();\n });\n\n const existing = await navigator.serviceWorker.getRegistration();\n if (existing) {\n this.#handleRegistration(existing);\n // Force an immediate check so a deploy that happened while the tab was\n // closed surfaces a prompt on the next load.\n await existing.update();\n } else {\n const registration = await navigator.serviceWorker.register(\n serviceWorkerScriptPath,\n );\n this.#handleRegistration(registration);\n }\n\n // Periodically poll for a new version while the tab stays open.\n const intervalId = setInterval(() => {\n void (async () => {\n const reg = await navigator.serviceWorker.getRegistration();\n if (!reg) {\n clearInterval(intervalId);\n return;\n }\n // Skip while a worker is mid-install or the browser is offline —\n // updating then would only fire a doomed network fetch (per the\n // vite-plugin-pwa periodic-update guidance).\n if (reg.installing || !navigator.onLine) return;\n await reg.update();\n })();\n }, connectConfig.appVersionCheckInterval);\n } catch (error) {\n console.error(\"ServiceWorker registration failed: \", error);\n }\n }\n\n registerServiceWorker(debug = false) {\n this.debug = debug;\n\n if (!(\"serviceWorker\" in navigator)) {\n console.warn(\"Service Worker not available\");\n return;\n }\n const start = () => {\n this.#register().catch(console.error);\n };\n // This runs from a React effect, which usually fires *after* the window\n // `load` event has already happened — so adding a load listener would never\n // fire. Register immediately when the page is already loaded; otherwise wait\n // for load to avoid contending with initial page resource fetches.\n if (document.readyState === \"complete\") {\n start();\n } else {\n window.addEventListener(\"load\", start, { once: true });\n }\n }\n\n // Fire-and-forget re-fetch so the controlling SW's NetworkFirst rule caches\n // the config (see controllerchange). The URL MUST match runtime-config.ts's\n // loader (`${import.meta.env.BASE_URL}powerhouse.config.json`) or the cache\n // keys won't line up.\n #warmRuntimeConfigCache() {\n void fetch(`${import.meta.env.BASE_URL}powerhouse.config.json`).catch(\n () => {},\n );\n }\n\n // Activate the waiting worker; the controllerchange handler then reloads.\n applyUpdate() {\n setUpdateAvailable(false);\n const waiting = this.registration?.waiting;\n if (!waiting) {\n // Nothing waiting (or already activated) — reload to pick up whatever\n // the active worker now serves.\n this.#reloading = true;\n window.location.reload();\n return;\n }\n this.#updateAccepted = true;\n waiting.postMessage({ type: \"SKIP_WAITING\" });\n }\n\n sendMessage(message: unknown) {\n const target =\n this.registration?.active ??\n this.registration?.waiting ??\n navigator.serviceWorker.controller;\n target?.postMessage(message);\n }\n\n // Drop any worker controlling this scope — used when offline support is\n // disabled (a disabled build also ships a self-destroying worker).\n async unregisterAll() {\n if (!(\"serviceWorker\" in navigator)) return;\n const registrations = await navigator.serviceWorker.getRegistrations();\n await Promise.all(registrations.map((r) => r.unregister()));\n }\n}\n\nexport const serviceWorkerManager = new ServiceWorkerManager();\n"],"names":["#log","#trackInstalling","#register","#warmRuntimeConfigCache","#updateAccepted","#reloading","#handleRegistration"],"mappings":"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","debug_id":"9dd758a7-d4b4-55cf-8fad-8fc2791ec1b0"}
@@ -1,179 +0,0 @@
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]="199fdba5-336e-57f9-9bbb-f3d5fbd3554a")}catch(e){}}();
3
- import { n as getRuntimeConfig } from "./runtime-config-DL3QjcfM.js";
4
- import { useEffect, useMemo, useState } from "react";
5
- import { getPackages, trimTrailingSlash, useVetraPackageManager } from "@powerhousedao/reactor-browser";
6
- import { slimManifest } from "@powerhousedao/shared/registry/manifest-slim";
7
- //#region src/hooks/useRegistryPackages.ts
8
- function useRegistryPackages() {
9
- const packageManager = useVetraPackageManager();
10
- const packageManagerPackages = packageManager?.packages;
11
- const registryUrl = getRuntimeConfig().packageRegistryUrl ?? null;
12
- const [registryPackagesMap, setRegistryPackagesMap] = useBestEffortLocalStorage(`REGISTRY_PACKAGES:${registryUrl === null ? null : trimTrailingSlash(registryUrl)}`, {});
13
- const registryPackageList = useMemo(() => {
14
- return Array.from(Object.values(registryPackagesMap)).filter((p) => p !== void 0);
15
- }, [registryPackagesMap]);
16
- useEffect(() => {
17
- async function refreshPackages() {
18
- if (registryUrl === null || !packageManager) return;
19
- const packageInfos = await getPackages(registryUrl);
20
- setRegistryPackagesMap((oldPackages) => {
21
- const newRegistryPackages = { ...oldPackages };
22
- for (const packageInfo of packageInfos) {
23
- const existingPackage = newRegistryPackages[packageInfo.name];
24
- if (!existingPackage) {
25
- const status = getPackageStatusFromPackageSource(packageManager.getPackageSource(packageInfo.name));
26
- newRegistryPackages[packageInfo.name] = makeRegistryPackageFromPackageInfo(packageInfo, status);
27
- } else {
28
- const installedVersion = packageManager.getPackageVersion(packageInfo.name);
29
- newRegistryPackages[packageInfo.name] = {
30
- ...existingPackage,
31
- manifest: slimManifest(packageInfo.manifest) ?? existingPackage.manifest,
32
- version: installedVersion ?? packageInfo.version ?? existingPackage.version,
33
- distTags: packageInfo.distTags ?? existingPackage.distTags,
34
- versions: packageInfo.versions ?? existingPackage.versions,
35
- documentTypes: packageInfo.documentTypes.length ? packageInfo.documentTypes : existingPackage.documentTypes,
36
- status: promoteStatus(existingPackage.status, packageManager.getPackageSource(packageInfo.name))
37
- };
38
- }
39
- }
40
- return newRegistryPackages;
41
- });
42
- }
43
- refreshPackages().catch(console.error);
44
- }, []);
45
- useEffect(() => {
46
- if (!packageManager) return;
47
- if (packageManagerPackages?.length) for (const packageManagerPackage of packageManagerPackages) setRegistryPackagesMap((existingRegistryPackages) => {
48
- const packageName = packageManagerPackage.manifest.name;
49
- const existingPackage = existingRegistryPackages[packageName];
50
- const newRegistryPackages = { ...existingRegistryPackages };
51
- const version = packageManager.getPackageVersion(packageName);
52
- if (existingPackage) newRegistryPackages[packageName] = {
53
- ...existingPackage,
54
- version: version ?? existingPackage.version,
55
- status: promoteStatus(existingPackage.status, packageManager.getPackageSource(packageName))
56
- };
57
- else newRegistryPackages[packageName] = makeRegistryPackageFromDocumentModelLib(packageManagerPackage, getPackageStatusFromPackageSource(packageManager.getPackageSource(packageName)), version);
58
- return newRegistryPackages;
59
- });
60
- }, [packageManagerPackages]);
61
- function updateRegistryPackageStatus(packageName, newStatus) {
62
- setRegistryPackagesMap((oldRegistryPackages) => {
63
- const newRegistryPackages = { ...oldRegistryPackages };
64
- const newRegistryPackage = newRegistryPackages[packageName];
65
- if (!newRegistryPackage) {
66
- console.error("Attempting to update status for package that does not exist.");
67
- return newRegistryPackages;
68
- }
69
- newRegistryPackages[packageName] = {
70
- ...newRegistryPackage,
71
- status: newStatus
72
- };
73
- return newRegistryPackages;
74
- });
75
- }
76
- /**
77
- * Register a freshly-installed package that came in via the npm-uplink
78
- * fallback — the user typed a bare name, our local `/packages` didn't know
79
- * it, but the install succeeded because verdaccio proxy-fetched the tarball.
80
- *
81
- * This is the one legitimate case where the status update runs against a
82
- * name that wasn't in the registry map. We treat it as an insert rather
83
- * than logging the "does not exist" error. Data is pulled from the loaded
84
- * module so the UI card shows the real manifest immediately; the next
85
- * `/packages` refresh will add `versions`/`distTags`.
86
- */
87
- function registerFallbackRegistryPackage(packageName, loadedPackage, version, status) {
88
- setRegistryPackagesMap((oldRegistryPackages) => {
89
- const newRegistryPackages = { ...oldRegistryPackages };
90
- newRegistryPackages[packageName] = {
91
- ...makeRegistryPackageFromDocumentModelLib(loadedPackage, status, version),
92
- name: packageName
93
- };
94
- return newRegistryPackages;
95
- });
96
- }
97
- return {
98
- registryPackagesMap,
99
- registryPackageList,
100
- updateRegistryPackageStatus,
101
- registerFallbackRegistryPackage
102
- };
103
- }
104
- function makeRegistryPackageFromDocumentModelLib(documentModelLib, status, version) {
105
- return {
106
- name: documentModelLib.manifest.name,
107
- path: "stub-path",
108
- documentTypes: documentModelLib.documentModels.map((d) => d.documentModel.global.id),
109
- status,
110
- manifest: slimManifest(documentModelLib.manifest),
111
- version
112
- };
113
- }
114
- function makeRegistryPackageFromPackageInfo(packageInfo, status) {
115
- return {
116
- ...packageInfo,
117
- manifest: slimManifest(packageInfo.manifest),
118
- documentTypes: packageInfo.manifest?.documentModels?.map((d) => d.id) ?? [],
119
- status
120
- };
121
- }
122
- /**
123
- * Like usehooks-ts' useLocalStorage, but persistence is best-effort: a failed
124
- * `setItem` (e.g. QuotaExceededError on an oversized payload) keeps the
125
- * in-memory state so the package manager still works for the session.
126
- * useLocalStorage couples the state update to the write — when the write
127
- * threw, the freshly fetched package list was discarded and the registry UI
128
- * rendered (and searched) an empty list.
129
- *
130
- * The key is derived from the boot-time runtime config and never changes
131
- * within a session, so no key-change rehydration is needed.
132
- */
133
- function useBestEffortLocalStorage(key, initialValue) {
134
- const [value, setValue] = useState(() => readJsonFromStorage(key) ?? initialValue);
135
- useEffect(() => {
136
- try {
137
- window.localStorage.setItem(key, JSON.stringify(value));
138
- } catch (error) {
139
- try {
140
- window.localStorage.removeItem(key);
141
- window.localStorage.setItem(key, JSON.stringify(value));
142
- } catch {
143
- console.warn(`Failed to persist "${key}" to localStorage; continuing with in-memory data.`, error);
144
- }
145
- }
146
- }, [key, value]);
147
- return [value, setValue];
148
- }
149
- function readJsonFromStorage(key) {
150
- try {
151
- const raw = window.localStorage.getItem(key);
152
- return raw === null ? null : JSON.parse(raw);
153
- } catch {
154
- return null;
155
- }
156
- }
157
- /**
158
- * When refreshing a cached entry, promote `"available"` to whatever the
159
- * packageManager now reports — the cached `"available"` was almost certainly
160
- * recorded before `packageManager.addPackages()` finished on a prior session.
161
- * Never downgrade an already-installed entry, and never overwrite a deliberate
162
- * `"dismissed"` choice.
163
- */
164
- function promoteStatus(cachedStatus, packageSource) {
165
- if (cachedStatus !== "available") return cachedStatus;
166
- if (packageSource === null) return cachedStatus;
167
- return getPackageStatusFromPackageSource(packageSource);
168
- }
169
- function getPackageStatusFromPackageSource(packageSource) {
170
- if (packageSource === null) return "available";
171
- if (packageSource === "local-install" || packageSource === "common" || packageSource === "project") return "local-install";
172
- if (packageSource === "registry-install") return "registry-install";
173
- return "available";
174
- }
175
- //#endregion
176
- export { useRegistryPackages as t };
177
-
178
- //# sourceMappingURL=useRegistryPackages-BaYtekjQ.js.map
179
- //# debugId=199fdba5-336e-57f9-9bbb-f3d5fbd3554a
@@ -1 +0,0 @@
1
- {"version":3,"file":"useRegistryPackages-BaYtekjQ.js","sources":["../src/hooks/useRegistryPackages.ts"],"sourcesContent":["import {\n getPackages,\n trimTrailingSlash,\n useVetraPackageManager,\n} from \"@powerhousedao/reactor-browser\";\nimport type {\n PackageInfo,\n RegistryPackage,\n RegistryPackageList,\n RegistryPackageMap,\n RegistryPackageSource,\n RegistryPackageStatus,\n} from \"@powerhousedao/shared/registry\";\nimport { slimManifest } from \"@powerhousedao/shared/registry/manifest-slim\";\nimport type { DocumentModelLib } from \"document-model\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { getRuntimeConfig } from \"../runtime-config.js\";\n\nexport function useRegistryPackages() {\n const packageManager = useVetraPackageManager();\n const packageManagerPackages = packageManager?.packages;\n const registryUrl = getRuntimeConfig().packageRegistryUrl ?? null;\n // Normalize so `http://host` and `http://host/` don't produce two separate\n // localStorage maps where the install/status flow reads from one while the\n // registry fetch writes to the other.\n const registryPackagesKey = `REGISTRY_PACKAGES:${registryUrl === null ? null : trimTrailingSlash(registryUrl)}`;\n const [registryPackagesMap, setRegistryPackagesMap] =\n useBestEffortLocalStorage<RegistryPackageMap>(registryPackagesKey, {});\n const registryPackageList: RegistryPackageList = useMemo(() => {\n return Array.from(Object.values(registryPackagesMap)).filter(\n (p) => p !== undefined,\n );\n }, [registryPackagesMap]);\n\n useEffect(() => {\n async function refreshPackages() {\n if (registryUrl === null || !packageManager) return;\n\n const packageInfos = await getPackages(registryUrl);\n\n setRegistryPackagesMap((oldPackages) => {\n const newRegistryPackages: RegistryPackageMap = {\n ...oldPackages,\n };\n\n for (const packageInfo of packageInfos) {\n const existingPackage = newRegistryPackages[packageInfo.name];\n\n if (!existingPackage) {\n const packageSource = packageManager.getPackageSource(\n packageInfo.name,\n );\n const status = getPackageStatusFromPackageSource(packageSource);\n newRegistryPackages[packageInfo.name] =\n makeRegistryPackageFromPackageInfo(packageInfo, status);\n } else {\n // Keep the cached entry's status, but refresh anything the\n // registry sent. This includes distTags and the versions list\n // the Package Manager UI filters on.\n //\n // For `version`, prefer the actually-installed version from the\n // package manager (set by the rehydration effect). `packageInfo.version`\n // is the registry's newest-published version, which for installed\n // packages would incorrectly overwrite the user's picked version\n // on the next /packages refresh.\n const installedVersion = packageManager.getPackageVersion(\n packageInfo.name,\n );\n newRegistryPackages[packageInfo.name] = {\n ...existingPackage,\n manifest:\n slimManifest(packageInfo.manifest) ?? existingPackage.manifest,\n version:\n installedVersion ??\n packageInfo.version ??\n existingPackage.version,\n distTags: packageInfo.distTags ?? existingPackage.distTags,\n versions: packageInfo.versions ?? existingPackage.versions,\n documentTypes: packageInfo.documentTypes.length\n ? packageInfo.documentTypes\n : existingPackage.documentTypes,\n status: promoteStatus(\n existingPackage.status,\n packageManager.getPackageSource(packageInfo.name),\n ),\n };\n }\n }\n\n return newRegistryPackages;\n });\n }\n\n refreshPackages().catch(console.error);\n }, []);\n\n useEffect(() => {\n if (!packageManager) return;\n\n if (packageManagerPackages?.length) {\n for (const packageManagerPackage of packageManagerPackages) {\n setRegistryPackagesMap((existingRegistryPackages) => {\n const packageName = packageManagerPackage.manifest.name;\n const existingPackage = existingRegistryPackages[packageName];\n const newRegistryPackages = { ...existingRegistryPackages };\n const version = packageManager.getPackageVersion(packageName);\n if (existingPackage) {\n newRegistryPackages[packageName] = {\n ...existingPackage,\n version: version ?? existingPackage.version,\n status: promoteStatus(\n existingPackage.status,\n packageManager.getPackageSource(packageName),\n ),\n };\n } else {\n const packageSource = packageManager.getPackageSource(packageName);\n const status = getPackageStatusFromPackageSource(packageSource);\n const newRegistryPackage = makeRegistryPackageFromDocumentModelLib(\n packageManagerPackage,\n status,\n version,\n );\n newRegistryPackages[packageName] = newRegistryPackage;\n }\n return newRegistryPackages;\n });\n }\n }\n }, [packageManagerPackages]);\n\n function updateRegistryPackageStatus(\n packageName: string,\n newStatus: RegistryPackageStatus,\n ) {\n setRegistryPackagesMap((oldRegistryPackages) => {\n const newRegistryPackages = { ...oldRegistryPackages };\n const newRegistryPackage = newRegistryPackages[packageName];\n if (!newRegistryPackage) {\n console.error(\n \"Attempting to update status for package that does not exist.\",\n );\n return newRegistryPackages;\n }\n newRegistryPackages[packageName] = {\n ...newRegistryPackage,\n status: newStatus,\n };\n\n return newRegistryPackages;\n });\n }\n\n /**\n * Register a freshly-installed package that came in via the npm-uplink\n * fallback — the user typed a bare name, our local `/packages` didn't know\n * it, but the install succeeded because verdaccio proxy-fetched the tarball.\n *\n * This is the one legitimate case where the status update runs against a\n * name that wasn't in the registry map. We treat it as an insert rather\n * than logging the \"does not exist\" error. Data is pulled from the loaded\n * module so the UI card shows the real manifest immediately; the next\n * `/packages` refresh will add `versions`/`distTags`.\n */\n function registerFallbackRegistryPackage(\n packageName: string,\n loadedPackage: DocumentModelLib,\n version: string | undefined,\n status: RegistryPackageStatus,\n ) {\n setRegistryPackagesMap((oldRegistryPackages) => {\n const newRegistryPackages = { ...oldRegistryPackages };\n newRegistryPackages[packageName] = {\n ...makeRegistryPackageFromDocumentModelLib(\n loadedPackage,\n status,\n version,\n ),\n name: packageName,\n };\n return newRegistryPackages;\n });\n }\n\n return {\n registryPackagesMap,\n registryPackageList,\n updateRegistryPackageStatus,\n registerFallbackRegistryPackage,\n };\n}\n\nfunction makeRegistryPackageFromDocumentModelLib(\n documentModelLib: DocumentModelLib,\n status: RegistryPackageStatus,\n version?: string,\n): RegistryPackage {\n return {\n name: documentModelLib.manifest.name,\n path: \"stub-path\",\n documentTypes: documentModelLib.documentModels.map(\n (d) => d.documentModel.global.id,\n ),\n status,\n manifest: slimManifest(documentModelLib.manifest),\n version,\n };\n}\n\nfunction makeRegistryPackageFromPackageInfo(\n packageInfo: PackageInfo,\n status: RegistryPackageStatus,\n): RegistryPackage {\n return {\n ...packageInfo,\n // Slim before caching: registry manifests are unvalidated JSON and have\n // carried multi-megabyte junk fields that blew the localStorage quota\n // (and the UI only reads the summary fields anyway).\n manifest: slimManifest(packageInfo.manifest),\n documentTypes: packageInfo.manifest?.documentModels?.map((d) => d.id) ?? [],\n status,\n };\n}\n\n/**\n * Like usehooks-ts' useLocalStorage, but persistence is best-effort: a failed\n * `setItem` (e.g. QuotaExceededError on an oversized payload) keeps the\n * in-memory state so the package manager still works for the session.\n * useLocalStorage couples the state update to the write — when the write\n * threw, the freshly fetched package list was discarded and the registry UI\n * rendered (and searched) an empty list.\n *\n * The key is derived from the boot-time runtime config and never changes\n * within a session, so no key-change rehydration is needed.\n */\nfunction useBestEffortLocalStorage<T>(key: string, initialValue: T) {\n const [value, setValue] = useState<T>(\n () => readJsonFromStorage<T>(key) ?? initialValue,\n );\n\n useEffect(() => {\n try {\n window.localStorage.setItem(key, JSON.stringify(value));\n } catch (error) {\n // Free the key and retry once — a stale oversized entry from an older\n // session may be occupying the quota this write needs.\n try {\n window.localStorage.removeItem(key);\n window.localStorage.setItem(key, JSON.stringify(value));\n } catch {\n console.warn(\n `Failed to persist \"${key}\" to localStorage; continuing with in-memory data.`,\n error,\n );\n }\n }\n }, [key, value]);\n\n return [value, setValue] as const;\n}\n\nfunction readJsonFromStorage<T>(key: string): T | null {\n try {\n const raw = window.localStorage.getItem(key);\n return raw === null ? null : (JSON.parse(raw) as T);\n } catch {\n return null;\n }\n}\n\n/**\n * When refreshing a cached entry, promote `\"available\"` to whatever the\n * packageManager now reports — the cached `\"available\"` was almost certainly\n * recorded before `packageManager.addPackages()` finished on a prior session.\n * Never downgrade an already-installed entry, and never overwrite a deliberate\n * `\"dismissed\"` choice.\n */\nfunction promoteStatus(\n cachedStatus: RegistryPackageStatus,\n packageSource: RegistryPackageSource | null,\n): RegistryPackageStatus {\n if (cachedStatus !== \"available\") return cachedStatus;\n if (packageSource === null) return cachedStatus;\n return getPackageStatusFromPackageSource(packageSource);\n}\n\nfunction getPackageStatusFromPackageSource(\n packageSource: RegistryPackageSource | null,\n): RegistryPackageStatus {\n // if we check the package source for a package that came from the api and it doesn't exist yet,\n // then we know the package is available on the api but not installed\n if (packageSource === null) return \"available\";\n // show common package, local project package and locally installed packages as \"local-install\"\n if (\n packageSource === \"local-install\" ||\n packageSource === \"common\" ||\n packageSource === \"project\"\n )\n return \"local-install\";\n // show \"registry-install\" status for package source \"registry-install\"\n if (packageSource === \"registry-install\") return \"registry-install\";\n // fallback to available — we should probably do more checks here\n return \"available\";\n}\n"],"names":[],"mappings":"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","debug_id":"199fdba5-336e-57f9-9bbb-f3d5fbd3554a"}