@sweidos/eidos 0.1.0 → 0.2.0
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/LICENSE +21 -0
- package/dist/eidos.cjs.js +22 -13
- package/dist/eidos.cjs.js.map +1 -1
- package/dist/eidos.es.js +22 -13
- package/dist/eidos.es.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/package.json +7 -8
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Aditya
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/dist/eidos.cjs.js
CHANGED
|
@@ -488,7 +488,9 @@ function flushResourceRegistrations() {
|
|
|
488
488
|
}
|
|
489
489
|
const _registry = /* @__PURE__ */ new Map();
|
|
490
490
|
function resource(url, config) {
|
|
491
|
-
if (_registry.has(url))
|
|
491
|
+
if (_registry.has(url)) {
|
|
492
|
+
return _registry.get(url);
|
|
493
|
+
}
|
|
492
494
|
const strategy = deriveStrategy(url, config);
|
|
493
495
|
const entry = {
|
|
494
496
|
url,
|
|
@@ -515,12 +517,13 @@ function resource(url, config) {
|
|
|
515
517
|
try {
|
|
516
518
|
const cache = await caches.open(strategy.cacheName).catch(() => null);
|
|
517
519
|
const cached = cache ? await cache.match(url).catch(() => null) : null;
|
|
518
|
-
|
|
519
|
-
|
|
520
|
+
const current = useEidosStore.getState().resources[url];
|
|
521
|
+
const expired = config.maxAge !== void 0 && (current == null ? void 0 : current.cachedAt) !== void 0 && Date.now() - current.cachedAt > config.maxAge;
|
|
522
|
+
if (cached && !expired) {
|
|
520
523
|
store.updateResource(url, {
|
|
521
524
|
status: "fresh",
|
|
522
525
|
lastEvent: "cache-hit",
|
|
523
|
-
cacheHits: ((
|
|
526
|
+
cacheHits: ((current == null ? void 0 : current.cacheHits) ?? 0) + 1
|
|
524
527
|
});
|
|
525
528
|
if (strategy.swStrategy === "stale-while-revalidate") {
|
|
526
529
|
fetch(url).then(async (resp) => {
|
|
@@ -536,9 +539,9 @@ function resource(url, config) {
|
|
|
536
539
|
}
|
|
537
540
|
return cached;
|
|
538
541
|
}
|
|
539
|
-
const
|
|
542
|
+
const storeEntry = useEidosStore.getState().resources[url];
|
|
540
543
|
store.updateResource(url, {
|
|
541
|
-
cacheMisses: ((
|
|
544
|
+
cacheMisses: ((storeEntry == null ? void 0 : storeEntry.cacheMisses) ?? 0) + 1
|
|
542
545
|
});
|
|
543
546
|
const response = await fetch(url);
|
|
544
547
|
if (response.ok) {
|
|
@@ -605,8 +608,8 @@ function resource(url, config) {
|
|
|
605
608
|
}
|
|
606
609
|
function deriveStrategy(url, config) {
|
|
607
610
|
const explicit = config.strategy;
|
|
608
|
-
if (config.offline) return buildStrategy(explicit ?? "stale-while-revalidate");
|
|
609
|
-
return buildStrategy(explicit ?? "network-first");
|
|
611
|
+
if (config.offline) return buildStrategy(explicit ?? "stale-while-revalidate", url, config.cacheName);
|
|
612
|
+
return buildStrategy(explicit ?? "network-first", url, config.cacheName);
|
|
610
613
|
}
|
|
611
614
|
const STRATEGY_META = {
|
|
612
615
|
"stale-while-revalidate": {
|
|
@@ -655,11 +658,11 @@ new NetworkFirst({
|
|
|
655
658
|
})`
|
|
656
659
|
}
|
|
657
660
|
};
|
|
658
|
-
function buildStrategy(swStrategy, _url) {
|
|
661
|
+
function buildStrategy(swStrategy, _url, cacheName) {
|
|
659
662
|
return {
|
|
660
663
|
...STRATEGY_META[swStrategy],
|
|
661
664
|
swStrategy,
|
|
662
|
-
cacheName: "eidos-resources-v1"
|
|
665
|
+
cacheName: cacheName ?? "eidos-resources-v1"
|
|
663
666
|
};
|
|
664
667
|
}
|
|
665
668
|
const DB_NAME = "eidos";
|
|
@@ -770,12 +773,17 @@ async function persistAndQueue(actionId, actionName, args, config) {
|
|
|
770
773
|
message: `"${actionName}" queued — will execute when online`
|
|
771
774
|
};
|
|
772
775
|
}
|
|
776
|
+
function backoffMs(retryCount) {
|
|
777
|
+
const base = Math.min(2e3 * 2 ** retryCount, 3e5);
|
|
778
|
+
return base * (0.8 + Math.random() * 0.4);
|
|
779
|
+
}
|
|
773
780
|
async function replayQueue() {
|
|
774
781
|
const store = useEidosStore.getState();
|
|
775
782
|
if (!store.isOnline) return;
|
|
776
783
|
const queue = await idbGetQueue();
|
|
784
|
+
const now = Date.now();
|
|
777
785
|
const pending = queue.filter(
|
|
778
|
-
(item) => item.status === "pending" || item.status === "failed"
|
|
786
|
+
(item) => (item.status === "pending" || item.status === "failed") && (!item.nextRetryAt || item.nextRetryAt <= now)
|
|
779
787
|
);
|
|
780
788
|
for (const item of pending) {
|
|
781
789
|
const fn = _actionRegistry.get(item.actionId);
|
|
@@ -805,8 +813,9 @@ async function replayQueue() {
|
|
|
805
813
|
retryCount
|
|
806
814
|
});
|
|
807
815
|
} else {
|
|
808
|
-
|
|
809
|
-
|
|
816
|
+
const nextRetryAt = Date.now() + backoffMs(retryCount);
|
|
817
|
+
store.updateQueueItem(item.id, { status: "pending", retryCount, nextRetryAt });
|
|
818
|
+
await idbUpdateQueueItem(item.id, { status: "pending", retryCount, nextRetryAt });
|
|
810
819
|
}
|
|
811
820
|
}
|
|
812
821
|
}
|
package/dist/eidos.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eidos.cjs.js","sources":["../../../node_modules/.pnpm/zustand@4.5.7_@types+react@18.3.30_react@18.3.1/node_modules/zustand/esm/vanilla.mjs","../../../node_modules/.pnpm/use-sync-external-store@1.6.0_react@18.3.1/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js","../../../node_modules/.pnpm/use-sync-external-store@1.6.0_react@18.3.1/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js","../../../node_modules/.pnpm/use-sync-external-store@1.6.0_react@18.3.1/node_modules/use-sync-external-store/shim/index.js","../../../node_modules/.pnpm/use-sync-external-store@1.6.0_react@18.3.1/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.js","../../../node_modules/.pnpm/use-sync-external-store@1.6.0_react@18.3.1/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js","../../../node_modules/.pnpm/use-sync-external-store@1.6.0_react@18.3.1/node_modules/use-sync-external-store/shim/with-selector.js","../../../node_modules/.pnpm/zustand@4.5.7_@types+react@18.3.30_react@18.3.1/node_modules/zustand/esm/index.mjs","../src/store.ts","../src/sw-bridge.ts","../src/resource.ts","../src/idb.ts","../src/action.ts","../src/runtime.ts","../src/react/Provider.tsx","../src/react/hooks.ts"],"sourcesContent":["const createStoreImpl = (createState) => {\n let state;\n const listeners = /* @__PURE__ */ new Set();\n const setState = (partial, replace) => {\n const nextState = typeof partial === \"function\" ? partial(state) : partial;\n if (!Object.is(nextState, state)) {\n const previousState = state;\n state = (replace != null ? replace : typeof nextState !== \"object\" || nextState === null) ? nextState : Object.assign({}, state, nextState);\n listeners.forEach((listener) => listener(state, previousState));\n }\n };\n const getState = () => state;\n const getInitialState = () => initialState;\n const subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const destroy = () => {\n if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\") {\n console.warn(\n \"[DEPRECATED] The `destroy` method will be unsupported in a future version. Instead use unsubscribe function returned by subscribe. Everything will be garbage-collected if store is garbage-collected.\"\n );\n }\n listeners.clear();\n };\n const api = { setState, getState, getInitialState, subscribe, destroy };\n const initialState = state = createState(setState, getState, api);\n return api;\n};\nconst createStore = (createState) => createState ? createStoreImpl(createState) : createStoreImpl;\nvar vanilla = (createState) => {\n if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\") {\n console.warn(\n \"[DEPRECATED] Default export is deprecated. Instead use import { createStore } from 'zustand/vanilla'.\"\n );\n }\n return createStore(createState);\n};\n\nexport { createStore, vanilla as default };\n","/**\n * @license React\n * use-sync-external-store-shim.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar React = require(\"react\");\nfunction is(x, y) {\n return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n}\nvar objectIs = \"function\" === typeof Object.is ? Object.is : is,\n useState = React.useState,\n useEffect = React.useEffect,\n useLayoutEffect = React.useLayoutEffect,\n useDebugValue = React.useDebugValue;\nfunction useSyncExternalStore$2(subscribe, getSnapshot) {\n var value = getSnapshot(),\n _useState = useState({ inst: { value: value, getSnapshot: getSnapshot } }),\n inst = _useState[0].inst,\n forceUpdate = _useState[1];\n useLayoutEffect(\n function () {\n inst.value = value;\n inst.getSnapshot = getSnapshot;\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n },\n [subscribe, value, getSnapshot]\n );\n useEffect(\n function () {\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n return subscribe(function () {\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n });\n },\n [subscribe]\n );\n useDebugValue(value);\n return value;\n}\nfunction checkIfSnapshotChanged(inst) {\n var latestGetSnapshot = inst.getSnapshot;\n inst = inst.value;\n try {\n var nextValue = latestGetSnapshot();\n return !objectIs(inst, nextValue);\n } catch (error) {\n return !0;\n }\n}\nfunction useSyncExternalStore$1(subscribe, getSnapshot) {\n return getSnapshot();\n}\nvar shim =\n \"undefined\" === typeof window ||\n \"undefined\" === typeof window.document ||\n \"undefined\" === typeof window.document.createElement\n ? useSyncExternalStore$1\n : useSyncExternalStore$2;\nexports.useSyncExternalStore =\n void 0 !== React.useSyncExternalStore ? React.useSyncExternalStore : shim;\n","/**\n * @license React\n * use-sync-external-store-shim.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function is(x, y) {\n return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n }\n function useSyncExternalStore$2(subscribe, getSnapshot) {\n didWarnOld18Alpha ||\n void 0 === React.startTransition ||\n ((didWarnOld18Alpha = !0),\n console.error(\n \"You are using an outdated, pre-release alpha of React 18 that does not support useSyncExternalStore. The use-sync-external-store shim will not work correctly. Upgrade to a newer pre-release.\"\n ));\n var value = getSnapshot();\n if (!didWarnUncachedGetSnapshot) {\n var cachedValue = getSnapshot();\n objectIs(value, cachedValue) ||\n (console.error(\n \"The result of getSnapshot should be cached to avoid an infinite loop\"\n ),\n (didWarnUncachedGetSnapshot = !0));\n }\n cachedValue = useState({\n inst: { value: value, getSnapshot: getSnapshot }\n });\n var inst = cachedValue[0].inst,\n forceUpdate = cachedValue[1];\n useLayoutEffect(\n function () {\n inst.value = value;\n inst.getSnapshot = getSnapshot;\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n },\n [subscribe, value, getSnapshot]\n );\n useEffect(\n function () {\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n return subscribe(function () {\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n });\n },\n [subscribe]\n );\n useDebugValue(value);\n return value;\n }\n function checkIfSnapshotChanged(inst) {\n var latestGetSnapshot = inst.getSnapshot;\n inst = inst.value;\n try {\n var nextValue = latestGetSnapshot();\n return !objectIs(inst, nextValue);\n } catch (error) {\n return !0;\n }\n }\n function useSyncExternalStore$1(subscribe, getSnapshot) {\n return getSnapshot();\n }\n \"undefined\" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&\n \"function\" ===\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart &&\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());\n var React = require(\"react\"),\n objectIs = \"function\" === typeof Object.is ? Object.is : is,\n useState = React.useState,\n useEffect = React.useEffect,\n useLayoutEffect = React.useLayoutEffect,\n useDebugValue = React.useDebugValue,\n didWarnOld18Alpha = !1,\n didWarnUncachedGetSnapshot = !1,\n shim =\n \"undefined\" === typeof window ||\n \"undefined\" === typeof window.document ||\n \"undefined\" === typeof window.document.createElement\n ? useSyncExternalStore$1\n : useSyncExternalStore$2;\n exports.useSyncExternalStore =\n void 0 !== React.useSyncExternalStore ? React.useSyncExternalStore : shim;\n \"undefined\" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&\n \"function\" ===\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error());\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('../cjs/use-sync-external-store-shim.production.js');\n} else {\n module.exports = require('../cjs/use-sync-external-store-shim.development.js');\n}\n","/**\n * @license React\n * use-sync-external-store-shim/with-selector.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar React = require(\"react\"),\n shim = require(\"use-sync-external-store/shim\");\nfunction is(x, y) {\n return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n}\nvar objectIs = \"function\" === typeof Object.is ? Object.is : is,\n useSyncExternalStore = shim.useSyncExternalStore,\n useRef = React.useRef,\n useEffect = React.useEffect,\n useMemo = React.useMemo,\n useDebugValue = React.useDebugValue;\nexports.useSyncExternalStoreWithSelector = function (\n subscribe,\n getSnapshot,\n getServerSnapshot,\n selector,\n isEqual\n) {\n var instRef = useRef(null);\n if (null === instRef.current) {\n var inst = { hasValue: !1, value: null };\n instRef.current = inst;\n } else inst = instRef.current;\n instRef = useMemo(\n function () {\n function memoizedSelector(nextSnapshot) {\n if (!hasMemo) {\n hasMemo = !0;\n memoizedSnapshot = nextSnapshot;\n nextSnapshot = selector(nextSnapshot);\n if (void 0 !== isEqual && inst.hasValue) {\n var currentSelection = inst.value;\n if (isEqual(currentSelection, nextSnapshot))\n return (memoizedSelection = currentSelection);\n }\n return (memoizedSelection = nextSnapshot);\n }\n currentSelection = memoizedSelection;\n if (objectIs(memoizedSnapshot, nextSnapshot)) return currentSelection;\n var nextSelection = selector(nextSnapshot);\n if (void 0 !== isEqual && isEqual(currentSelection, nextSelection))\n return (memoizedSnapshot = nextSnapshot), currentSelection;\n memoizedSnapshot = nextSnapshot;\n return (memoizedSelection = nextSelection);\n }\n var hasMemo = !1,\n memoizedSnapshot,\n memoizedSelection,\n maybeGetServerSnapshot =\n void 0 === getServerSnapshot ? null : getServerSnapshot;\n return [\n function () {\n return memoizedSelector(getSnapshot());\n },\n null === maybeGetServerSnapshot\n ? void 0\n : function () {\n return memoizedSelector(maybeGetServerSnapshot());\n }\n ];\n },\n [getSnapshot, getServerSnapshot, selector, isEqual]\n );\n var value = useSyncExternalStore(subscribe, instRef[0], instRef[1]);\n useEffect(\n function () {\n inst.hasValue = !0;\n inst.value = value;\n },\n [value]\n );\n useDebugValue(value);\n return value;\n};\n","/**\n * @license React\n * use-sync-external-store-shim/with-selector.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function is(x, y) {\n return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n }\n \"undefined\" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&\n \"function\" ===\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart &&\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());\n var React = require(\"react\"),\n shim = require(\"use-sync-external-store/shim\"),\n objectIs = \"function\" === typeof Object.is ? Object.is : is,\n useSyncExternalStore = shim.useSyncExternalStore,\n useRef = React.useRef,\n useEffect = React.useEffect,\n useMemo = React.useMemo,\n useDebugValue = React.useDebugValue;\n exports.useSyncExternalStoreWithSelector = function (\n subscribe,\n getSnapshot,\n getServerSnapshot,\n selector,\n isEqual\n ) {\n var instRef = useRef(null);\n if (null === instRef.current) {\n var inst = { hasValue: !1, value: null };\n instRef.current = inst;\n } else inst = instRef.current;\n instRef = useMemo(\n function () {\n function memoizedSelector(nextSnapshot) {\n if (!hasMemo) {\n hasMemo = !0;\n memoizedSnapshot = nextSnapshot;\n nextSnapshot = selector(nextSnapshot);\n if (void 0 !== isEqual && inst.hasValue) {\n var currentSelection = inst.value;\n if (isEqual(currentSelection, nextSnapshot))\n return (memoizedSelection = currentSelection);\n }\n return (memoizedSelection = nextSnapshot);\n }\n currentSelection = memoizedSelection;\n if (objectIs(memoizedSnapshot, nextSnapshot))\n return currentSelection;\n var nextSelection = selector(nextSnapshot);\n if (void 0 !== isEqual && isEqual(currentSelection, nextSelection))\n return (memoizedSnapshot = nextSnapshot), currentSelection;\n memoizedSnapshot = nextSnapshot;\n return (memoizedSelection = nextSelection);\n }\n var hasMemo = !1,\n memoizedSnapshot,\n memoizedSelection,\n maybeGetServerSnapshot =\n void 0 === getServerSnapshot ? null : getServerSnapshot;\n return [\n function () {\n return memoizedSelector(getSnapshot());\n },\n null === maybeGetServerSnapshot\n ? void 0\n : function () {\n return memoizedSelector(maybeGetServerSnapshot());\n }\n ];\n },\n [getSnapshot, getServerSnapshot, selector, isEqual]\n );\n var value = useSyncExternalStore(subscribe, instRef[0], instRef[1]);\n useEffect(\n function () {\n inst.hasValue = !0;\n inst.value = value;\n },\n [value]\n );\n useDebugValue(value);\n return value;\n };\n \"undefined\" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&\n \"function\" ===\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error());\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('../cjs/use-sync-external-store-shim/with-selector.production.js');\n} else {\n module.exports = require('../cjs/use-sync-external-store-shim/with-selector.development.js');\n}\n","import { createStore } from 'zustand/vanilla';\nexport * from 'zustand/vanilla';\nimport ReactExports from 'react';\nimport useSyncExternalStoreExports from 'use-sync-external-store/shim/with-selector.js';\n\nconst { useDebugValue } = ReactExports;\nconst { useSyncExternalStoreWithSelector } = useSyncExternalStoreExports;\nlet didWarnAboutEqualityFn = false;\nconst identity = (arg) => arg;\nfunction useStore(api, selector = identity, equalityFn) {\n if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\" && equalityFn && !didWarnAboutEqualityFn) {\n console.warn(\n \"[DEPRECATED] Use `createWithEqualityFn` instead of `create` or use `useStoreWithEqualityFn` instead of `useStore`. They can be imported from 'zustand/traditional'. https://github.com/pmndrs/zustand/discussions/1937\"\n );\n didWarnAboutEqualityFn = true;\n }\n const slice = useSyncExternalStoreWithSelector(\n api.subscribe,\n api.getState,\n api.getServerState || api.getInitialState,\n selector,\n equalityFn\n );\n useDebugValue(slice);\n return slice;\n}\nconst createImpl = (createState) => {\n if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\" && typeof createState !== \"function\") {\n console.warn(\n \"[DEPRECATED] Passing a vanilla store will be unsupported in a future version. Instead use `import { useStore } from 'zustand'`.\"\n );\n }\n const api = typeof createState === \"function\" ? createStore(createState) : createState;\n const useBoundStore = (selector, equalityFn) => useStore(api, selector, equalityFn);\n Object.assign(useBoundStore, api);\n return useBoundStore;\n};\nconst create = (createState) => createState ? createImpl(createState) : createImpl;\nvar react = (createState) => {\n if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\") {\n console.warn(\n \"[DEPRECATED] Default export is deprecated. Instead use `import { create } from 'zustand'`.\"\n );\n }\n return create(createState);\n};\n\nexport { create, react as default, useStore };\n","import { create } from 'zustand'\nimport type { EidosState, ResourceEntry, ActionQueueItem } from './types'\n\nexport interface EidosStore extends EidosState {\n // Online\n setOnline: (online: boolean) => void\n // SW\n setSwStatus: (status: EidosState['swStatus'], error?: string) => void\n // Resources\n registerResource: (url: string, entry: ResourceEntry) => void\n updateResource: (url: string, update: Partial<ResourceEntry>) => void\n unregisterResource: (url: string) => void\n // Queue\n addQueueItem: (item: ActionQueueItem) => void\n updateQueueItem: (id: string, update: Partial<ActionQueueItem>) => void\n removeQueueItem: (id: string) => void\n hydrateQueue: (items: ActionQueueItem[]) => void\n}\n\nexport const useEidosStore = create<EidosStore>((set) => ({\n isOnline: typeof navigator !== 'undefined' ? navigator.onLine : true,\n swStatus: 'idle',\n swError: undefined,\n resources: {},\n queue: [],\n\n setOnline: (isOnline) => set({ isOnline }),\n\n setSwStatus: (swStatus, swError) => set({ swStatus, swError }),\n\n registerResource: (url, entry) =>\n set((s) => ({ resources: { ...s.resources, [url]: entry } })),\n\n updateResource: (url, update) =>\n set((s) => ({\n resources: {\n ...s.resources,\n [url]: s.resources[url] ? { ...s.resources[url], ...update } : s.resources[url],\n },\n })),\n\n unregisterResource: (url) =>\n set((s) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { [url]: _removed, ...rest } = s.resources\n return { resources: rest }\n }),\n\n addQueueItem: (item) => set((s) => ({ queue: [...s.queue, item] })),\n\n updateQueueItem: (id, update) =>\n set((s) => ({\n queue: s.queue.map((item) => (item.id === id ? { ...item, ...update } : item)),\n })),\n\n removeQueueItem: (id) => set((s) => ({ queue: s.queue.filter((item) => item.id !== id) })),\n\n hydrateQueue: (items) => set({ queue: items }),\n}))\n","import { useEidosStore } from './store'\n\nlet _registration: ServiceWorkerRegistration | null = null\n\nexport function getSwRegistration() {\n return _registration\n}\n\nexport async function registerServiceWorker(swPath: string): Promise<void> {\n if (typeof navigator === 'undefined' || !('serviceWorker' in navigator)) {\n useEidosStore.getState().setSwStatus('unsupported')\n return\n }\n\n const store = useEidosStore.getState()\n store.setSwStatus('registering')\n\n try {\n _registration = await navigator.serviceWorker.register(swPath, { scope: '/' })\n\n await waitForActivation(_registration)\n\n store.setSwStatus('active')\n\n // Receive messages from SW\n navigator.serviceWorker.addEventListener('message', onSwMessage)\n\n // Track online/offline\n window.addEventListener('online', () => store.setOnline(true))\n window.addEventListener('offline', () => store.setOnline(false))\n\n // resource() is called at module scope — before the SW is ready.\n // Re-send every registration now that the SW is active so it can\n // start intercepting fetches immediately.\n flushResourceRegistrations()\n } catch (err) {\n store.setSwStatus('error', String(err))\n }\n}\n\nfunction waitForActivation(reg: ServiceWorkerRegistration): Promise<void> {\n return new Promise((resolve) => {\n if (reg.active) { resolve(); return }\n const sw = reg.installing ?? reg.waiting\n if (!sw) { resolve(); return }\n sw.addEventListener('statechange', function handler() {\n if (sw.state === 'activated') {\n sw.removeEventListener('statechange', handler)\n resolve()\n }\n })\n })\n}\n\nexport function sendToWorker(message: Record<string, unknown>): void {\n const sw = _registration?.active\n if (sw) sw.postMessage(message)\n}\n\nfunction onSwMessage(event: MessageEvent): void {\n const data = event.data as { type: string; url?: string; strategy?: string }\n if (!data?.type) return\n\n const store = useEidosStore.getState()\n const { type, url } = data\n\n if (!url) return\n\n switch (type) {\n case 'EIDOS_CACHE_HIT': {\n const current = store.resources[url]\n store.updateResource(url, {\n status: 'fresh',\n lastEvent: 'cache-hit',\n cacheHits: (current?.cacheHits ?? 0) + 1,\n })\n break\n }\n case 'EIDOS_CACHE_UPDATED': {\n store.updateResource(url, {\n status: 'fresh',\n lastEvent: 'cache-updated',\n cachedAt: Date.now(),\n })\n break\n }\n case 'EIDOS_NETWORK_ERROR': {\n store.updateResource(url, {\n status: 'error',\n lastEvent: 'network-error',\n })\n break\n }\n }\n}\n\nexport function setOfflineSimulation(enabled: boolean): void {\n sendToWorker({ type: 'EIDOS_SIMULATE_OFFLINE', enabled })\n useEidosStore.getState().setOnline(!enabled)\n}\n\n// Sends EIDOS_REGISTER_RESOURCE for every resource already in the store.\n// Called once after the SW activates to handle the common case where\n// resource() is declared at module scope before the SW is ready.\nfunction flushResourceRegistrations(): void {\n const { resources } = useEidosStore.getState()\n Object.values(resources).forEach((entry) => {\n sendToWorker({\n type: 'EIDOS_REGISTER_RESOURCE',\n url: entry.url,\n strategy: entry.strategy.swStrategy,\n cacheName: entry.strategy.cacheName,\n })\n })\n}\n","import { useEidosStore } from './store'\nimport { sendToWorker } from './sw-bridge'\nimport type {\n ResourceConfig,\n ResourceHandle,\n ResourceEntry,\n GeneratedStrategy,\n CacheStrategy,\n} from './types'\n\nconst _registry = new Map<string, ResourceHandle>()\n\nexport function resource<T = unknown>(\n url: string,\n config: ResourceConfig,\n): ResourceHandle<T> {\n if (_registry.has(url)) return _registry.get(url) as ResourceHandle<T>\n\n const strategy = deriveStrategy(url, config)\n\n const entry: ResourceEntry = {\n url,\n config,\n strategy,\n status: 'idle',\n cacheHits: 0,\n cacheMisses: 0,\n }\n\n useEidosStore.getState().registerResource(url, entry)\n\n sendToWorker({\n type: 'EIDOS_REGISTER_RESOURCE',\n url,\n strategy: strategy.swStrategy,\n cacheName: strategy.cacheName,\n })\n\n const handle: ResourceHandle<T> = {\n url,\n config,\n strategy,\n\n fetch: async () => {\n const store = useEidosStore.getState()\n store.updateResource(url, { status: 'fetching', fetchedAt: Date.now() })\n\n try {\n // ── Direct Cache API check ─────────────────────────────────────\n // We read the cache in the main thread rather than waiting for\n // an async SW postMessage. This gives instant, reliable status\n // updates regardless of SW message timing.\n const cache = await caches.open(strategy.cacheName).catch(() => null)\n const cached = cache ? await cache.match(url).catch(() => null) : null\n\n if (cached) {\n const current = useEidosStore.getState().resources[url]\n store.updateResource(url, {\n status: 'fresh',\n lastEvent: 'cache-hit',\n cacheHits: (current?.cacheHits ?? 0) + 1,\n })\n\n // Background revalidation for SWR (stale-while-revalidate)\n if (strategy.swStrategy === 'stale-while-revalidate') {\n fetch(url)\n .then(async (resp) => {\n if (resp.ok && cache) {\n await cache.put(url, resp.clone())\n useEidosStore.getState().updateResource(url, {\n cachedAt: Date.now(),\n lastEvent: 'cache-updated',\n })\n }\n })\n .catch(() => {\n /* offline — cached version stays valid */\n })\n }\n\n return cached\n }\n\n // ── Cache miss: fetch from network ─────────────────────────────\n const current = useEidosStore.getState().resources[url]\n store.updateResource(url, {\n cacheMisses: (current?.cacheMisses ?? 0) + 1,\n })\n\n const response = await fetch(url)\n\n if (response.ok) {\n if (cache) await cache.put(url, response.clone())\n store.updateResource(url, {\n status: 'fresh',\n cachedAt: Date.now(),\n lastEvent: 'cache-updated',\n })\n return response\n }\n\n // Non-2xx response (e.g. 503 from offline SW) — update status and throw\n // so callers get a proper error instead of a plain-object body they can't use.\n store.updateResource(url, { status: response.status === 503 ? 'offline' : 'error' })\n\n // Check if the SW tagged this as an offline response\n const isOffline = response.headers.get('X-Eidos-Offline') === 'true'\n throw new Error(\n isOffline ? `offline: no cached response for ${url}` : `${response.status} ${response.statusText}`,\n )\n } catch (err) {\n // Network failure — try cache one more time as fallback\n const cache = await caches.open(strategy.cacheName).catch(() => null)\n const fallback = cache ? await cache.match(url).catch(() => null) : null\n\n if (fallback) {\n const current = useEidosStore.getState().resources[url]\n store.updateResource(url, {\n status: 'fresh',\n lastEvent: 'cache-hit',\n cacheHits: (current?.cacheHits ?? 0) + 1,\n })\n return fallback\n }\n\n store.updateResource(url, { status: 'error' })\n throw err\n }\n },\n\n json: async () => {\n const res = await handle.fetch()\n return res.json() as Promise<T>\n },\n\n query: () => ({\n queryKey: ['eidos', url] as [string, string],\n queryFn: () => handle.json(),\n }),\n\n prefetch: async () => {\n await handle.fetch()\n },\n\n invalidate: async () => {\n sendToWorker({ type: 'EIDOS_CLEAR_CACHE', url })\n const cache = await caches.open(strategy.cacheName).catch(() => null)\n if (cache) {\n const keys = await cache.keys()\n await Promise.all(\n keys.filter((r) => new URL(r.url).pathname === url).map((r) => cache.delete(r)),\n )\n }\n useEidosStore.getState().updateResource(url, {\n status: 'stale',\n cachedAt: undefined,\n lastEvent: 'cache-cleared',\n cacheHits: 0,\n cacheMisses: 0,\n })\n },\n }\n\n _registry.set(url, handle)\n return handle\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Strategy derivation — intent → deterministic caching strategy\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction deriveStrategy(url: string, config: ResourceConfig): GeneratedStrategy {\n const explicit = config.strategy\n if (config.offline) return buildStrategy(explicit ?? 'stale-while-revalidate', url)\n return buildStrategy(explicit ?? 'network-first', url)\n}\n\nconst STRATEGY_META: Record<CacheStrategy, Omit<GeneratedStrategy, 'swStrategy' | 'cacheName'>> = {\n 'stale-while-revalidate': {\n name: 'StaleWhileRevalidate',\n reasoning:\n 'offline: true signals resilience. SWR returns cached data instantly while revalidating in the background — the best tradeoff between speed and freshness for offline-capable resources.',\n behavior: [\n 'Cache hit → return immediately, kick off background revalidation',\n 'Cache miss → fetch from network, cache the response, return it',\n 'Offline → return cached version if available, 503 if not',\n 'Reconnect → next request triggers a background refresh',\n ],\n equivalentCode: `// Workbox equivalent\nnew StaleWhileRevalidate({\n cacheName: 'eidos-resources-v1',\n plugins: [new ExpirationPlugin({ maxEntries: 60 })],\n})`,\n },\n 'cache-first': {\n name: 'CacheFirst',\n reasoning:\n 'cache-first maximises speed and offline availability. Network is consulted only on cache miss. Best for static or infrequently-updated data.',\n behavior: [\n 'Cache hit → return immediately, no network request made',\n 'Cache miss → fetch from network, cache the response, return it',\n 'Offline → return cached version, 503 if cache is empty',\n 'Cache never expires unless explicitly invalidated',\n ],\n equivalentCode: `// Workbox equivalent\nnew CacheFirst({\n cacheName: 'eidos-resources-v1',\n plugins: [new ExpirationPlugin({ maxEntries: 60 })],\n})`,\n },\n 'network-first': {\n name: 'NetworkFirst',\n reasoning:\n 'network-first prioritises fresh data. Cache acts as a safety net when offline. Best for frequently-updated resources where stale data causes problems.',\n behavior: [\n 'Always try network first',\n 'Network success → update cache, return fresh response',\n 'Network failure → fall back to cached version',\n 'Offline with empty cache → return 503 error response',\n ],\n equivalentCode: `// Workbox equivalent\nnew NetworkFirst({\n cacheName: 'eidos-resources-v1',\n networkTimeoutSeconds: 3,\n})`,\n },\n}\n\nfunction buildStrategy(swStrategy: CacheStrategy, _url: string): GeneratedStrategy {\n return {\n ...STRATEGY_META[swStrategy],\n swStrategy,\n cacheName: 'eidos-resources-v1',\n }\n}\n","import type { ActionQueueItem } from './types'\n\nconst DB_NAME = 'eidos'\nconst DB_VERSION = 1\nconst QUEUE_STORE = 'action-queue'\n\nlet _db: IDBDatabase | null = null\n\nfunction openDB(): Promise<IDBDatabase> {\n if (_db) return Promise.resolve(_db)\n\n return new Promise((resolve, reject) => {\n const req = indexedDB.open(DB_NAME, DB_VERSION)\n\n req.onupgradeneeded = (event) => {\n const db = (event.target as IDBOpenDBRequest).result\n if (!db.objectStoreNames.contains(QUEUE_STORE)) {\n const store = db.createObjectStore(QUEUE_STORE, { keyPath: 'id' })\n store.createIndex('status', 'status', { unique: false })\n store.createIndex('actionId', 'actionId', { unique: false })\n }\n }\n\n req.onsuccess = () => {\n _db = req.result\n resolve(req.result)\n }\n\n req.onerror = () => reject(req.error)\n })\n}\n\nexport async function idbAddToQueue(item: ActionQueueItem): Promise<void> {\n const db = await openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(QUEUE_STORE, 'readwrite')\n tx.objectStore(QUEUE_STORE).add(item)\n tx.oncomplete = () => resolve()\n tx.onerror = () => reject(tx.error)\n })\n}\n\nexport async function idbGetQueue(): Promise<ActionQueueItem[]> {\n const db = await openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(QUEUE_STORE, 'readonly')\n const req = tx.objectStore(QUEUE_STORE).getAll()\n req.onsuccess = () => resolve(req.result as ActionQueueItem[])\n req.onerror = () => reject(req.error)\n })\n}\n\nexport async function idbUpdateQueueItem(\n id: string,\n update: Partial<ActionQueueItem>,\n): Promise<void> {\n const db = await openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(QUEUE_STORE, 'readwrite')\n const store = tx.objectStore(QUEUE_STORE)\n const get = store.get(id)\n get.onsuccess = () => {\n if (get.result) store.put({ ...get.result, ...update })\n }\n tx.oncomplete = () => resolve()\n tx.onerror = () => reject(tx.error)\n })\n}\n\nexport async function idbRemoveFromQueue(id: string): Promise<void> {\n const db = await openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(QUEUE_STORE, 'readwrite')\n tx.objectStore(QUEUE_STORE).delete(id)\n tx.oncomplete = () => resolve()\n tx.onerror = () => reject(tx.error)\n })\n}\n\nexport async function idbClearQueue(): Promise<void> {\n const db = await openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(QUEUE_STORE, 'readwrite')\n tx.objectStore(QUEUE_STORE).clear()\n tx.oncomplete = () => resolve()\n tx.onerror = () => reject(tx.error)\n })\n}\n","import { useEidosStore } from './store'\nimport {\n idbAddToQueue,\n idbGetQueue,\n idbUpdateQueueItem,\n idbRemoveFromQueue,\n} from './idb'\nimport type {\n ActionConfig,\n ActionHandle,\n ActionFn,\n ActionQueueItem,\n QueuedResult,\n} from './types'\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst _actionRegistry = new Map<string, ActionFn<any[], any>>()\n\nfunction uid() {\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 7)}`\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function action<TArgs extends any[], TReturn>(\n fn: ActionFn<TArgs, TReturn>,\n config: ActionConfig,\n): ActionHandle<TArgs, TReturn> {\n const actionId = config.name ?? fn.name ?? uid()\n\n // Registering here means the function is available for replay after\n // the user refreshes the page (actions are defined at module scope).\n _actionRegistry.set(actionId, fn as ActionFn<unknown[], unknown>)\n\n const wrapped = async (...args: TArgs): Promise<TReturn | QueuedResult> => {\n const { isOnline } = useEidosStore.getState()\n\n if (config.reliability === 'neverLose') {\n if (!isOnline) {\n return persistAndQueue(actionId, fn.name || actionId, args, config)\n }\n // Online + neverLose: execute, queue on failure\n try {\n return await fn(...args)\n } catch {\n return persistAndQueue(actionId, fn.name || actionId, args, config)\n }\n }\n\n // best-effort: execute directly, no queuing\n return fn(...args)\n }\n\n Object.defineProperty(wrapped, 'id', { value: actionId, writable: false })\n Object.defineProperty(wrapped, 'config', { value: config, writable: false })\n\n return wrapped as unknown as ActionHandle<TArgs, TReturn>\n}\n\nasync function persistAndQueue(\n actionId: string,\n actionName: string,\n args: unknown[],\n config: ActionConfig,\n): Promise<QueuedResult> {\n const id = uid()\n const item: ActionQueueItem = {\n id,\n actionId,\n actionName,\n args,\n queuedAt: Date.now(),\n retryCount: 0,\n maxRetries: config.maxRetries ?? 3,\n status: 'pending',\n }\n\n await idbAddToQueue(item)\n useEidosStore.getState().addQueueItem(item)\n\n return {\n queued: true,\n id,\n message: `\"${actionName}\" queued — will execute when online`,\n }\n}\n\nexport async function replayQueue(): Promise<void> {\n const store = useEidosStore.getState()\n if (!store.isOnline) return\n\n const queue = await idbGetQueue()\n const pending = queue.filter(\n (item) => item.status === 'pending' || item.status === 'failed',\n )\n\n for (const item of pending) {\n const fn = _actionRegistry.get(item.actionId)\n if (!fn) continue\n\n store.updateQueueItem(item.id, { status: 'replaying' })\n await idbUpdateQueueItem(item.id, { status: 'replaying' })\n\n try {\n await fn(...(item.args as unknown[]))\n const completedAt = Date.now()\n store.updateQueueItem(item.id, { status: 'succeeded', completedAt })\n await idbUpdateQueueItem(item.id, { status: 'succeeded', completedAt })\n\n // Remove from queue after a delay so the UI can show the success state\n setTimeout(() => {\n store.removeQueueItem(item.id)\n idbRemoveFromQueue(item.id)\n }, 3000)\n } catch (err) {\n const retryCount = item.retryCount + 1\n if (retryCount >= item.maxRetries) {\n store.updateQueueItem(item.id, {\n status: 'failed',\n error: String(err),\n retryCount,\n })\n await idbUpdateQueueItem(item.id, {\n status: 'failed',\n error: String(err),\n retryCount,\n })\n } else {\n store.updateQueueItem(item.id, { status: 'pending', retryCount })\n await idbUpdateQueueItem(item.id, { status: 'pending', retryCount })\n }\n }\n }\n}\n","import { registerServiceWorker } from './sw-bridge'\nimport { replayQueue } from './action'\nimport { useEidosStore } from './store'\nimport { idbGetQueue } from './idb'\n\nexport interface EidosConfig {\n /** Path to the eidos service worker. Defaults to '/eidos-sw.js'. */\n swPath?: string\n /** Automatically replay the action queue on reconnect. Default: true. */\n autoReplay?: boolean\n}\n\nlet _initialized = false\n\nexport async function initEidos(config: EidosConfig = {}): Promise<void> {\n if (_initialized) return\n _initialized = true\n\n const swPath = config.swPath ?? '/eidos-sw.js'\n const autoReplay = config.autoReplay ?? true\n\n // Restore persisted queue from IndexedDB on startup\n try {\n const persisted = await idbGetQueue()\n if (persisted.length > 0) {\n useEidosStore.getState().hydrateQueue(persisted)\n }\n } catch {\n // IndexedDB unavailable (Firefox private browsing) — silent fallback\n }\n\n try {\n await registerServiceWorker(swPath)\n } catch {\n // SW registration failed; app continues without offline support\n }\n\n if (autoReplay) {\n // ── Subscribe to the Zustand store instead of window.addEventListener('online')\n //\n // WHY: setOfflineSimulation() updates the store directly but never fires a\n // real browser `online` event. Watching the store means we catch both:\n // • Real network reconnects (sw-bridge updates store on window.online)\n // • Simulation toggled off (setOfflineSimulation(false) → store.setOnline(true))\n //\n let prevIsOnline = useEidosStore.getState().isOnline\n\n useEidosStore.subscribe((state) => {\n const justCameOnline = state.isOnline && !prevIsOnline\n prevIsOnline = state.isOnline\n\n if (justCameOnline) {\n // Small delay so the connection (or simulation reset) settles first\n setTimeout(replayQueue, 600)\n }\n })\n\n // Replay any pending items that survived a page reload\n const store = useEidosStore.getState()\n const hasPending = store.queue.some((q) => q.status === 'pending' || q.status === 'failed')\n if (store.isOnline && hasPending) {\n setTimeout(replayQueue, 1200)\n }\n }\n\n if (import.meta.env.DEV) {\n const store = useEidosStore.getState()\n console.groupCollapsed('%c⚡ Eidos', 'color:#38bdf8;font-weight:bold')\n console.log('SW path :', swPath)\n console.log('Auto-replay:', autoReplay)\n console.log('SW status :', store.swStatus)\n console.groupEnd()\n }\n}\n\nexport function _resetEidos() {\n _initialized = false\n}\n","import { useEffect, type ReactNode } from 'react'\nimport { initEidos, type EidosConfig } from '../runtime'\n\ninterface EidosProviderProps extends EidosConfig {\n children: ReactNode\n}\n\n/**\n * Mount once at the root of your application.\n * Registers the service worker and initialises the Eidos runtime.\n *\n * @example\n * <EidosProvider swPath=\"/eidos-sw.js\">\n * <App />\n * </EidosProvider>\n */\nexport function EidosProvider({ children, swPath, autoReplay }: EidosProviderProps) {\n useEffect(() => {\n initEidos({ swPath, autoReplay })\n // Run once on mount only\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n return <>{children}</>\n}\n","import { useEidosStore } from '../store'\n\n/** Full Eidos store — prefer the narrower hooks below for performance. */\nexport function useEidos() {\n return useEidosStore()\n}\n\n/** Live state for a single registered resource URL. */\nexport function useEidosResource(url: string) {\n return useEidosStore((s) => s.resources[url])\n}\n\n/** The current action queue. */\nexport function useEidosQueue() {\n return useEidosStore((s) => s.queue)\n}\n\n/** Online + SW status — cheap subscription, safe to use in header components. */\nexport function useEidosStatus() {\n return useEidosStore((s) => ({\n isOnline: s.isOnline,\n swStatus: s.swStatus,\n swError: s.swError,\n }))\n}\n"],"names":["__vite_import_meta_env__","useDebugValue","shim","shimModule","require$$0","require$$1","withSelectorModule","ReactExports","current","useEffect"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7]}
|
|
1
|
+
{"version":3,"file":"eidos.cjs.js","sources":["../../../node_modules/.pnpm/zustand@4.5.7_@types+react@18.3.30_react@18.3.1/node_modules/zustand/esm/vanilla.mjs","../../../node_modules/.pnpm/use-sync-external-store@1.6.0_react@18.3.1/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js","../../../node_modules/.pnpm/use-sync-external-store@1.6.0_react@18.3.1/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js","../../../node_modules/.pnpm/use-sync-external-store@1.6.0_react@18.3.1/node_modules/use-sync-external-store/shim/index.js","../../../node_modules/.pnpm/use-sync-external-store@1.6.0_react@18.3.1/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.js","../../../node_modules/.pnpm/use-sync-external-store@1.6.0_react@18.3.1/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js","../../../node_modules/.pnpm/use-sync-external-store@1.6.0_react@18.3.1/node_modules/use-sync-external-store/shim/with-selector.js","../../../node_modules/.pnpm/zustand@4.5.7_@types+react@18.3.30_react@18.3.1/node_modules/zustand/esm/index.mjs","../src/store.ts","../src/sw-bridge.ts","../src/resource.ts","../src/idb.ts","../src/action.ts","../src/runtime.ts","../src/react/Provider.tsx","../src/react/hooks.ts"],"sourcesContent":["const createStoreImpl = (createState) => {\n let state;\n const listeners = /* @__PURE__ */ new Set();\n const setState = (partial, replace) => {\n const nextState = typeof partial === \"function\" ? partial(state) : partial;\n if (!Object.is(nextState, state)) {\n const previousState = state;\n state = (replace != null ? replace : typeof nextState !== \"object\" || nextState === null) ? nextState : Object.assign({}, state, nextState);\n listeners.forEach((listener) => listener(state, previousState));\n }\n };\n const getState = () => state;\n const getInitialState = () => initialState;\n const subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const destroy = () => {\n if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\") {\n console.warn(\n \"[DEPRECATED] The `destroy` method will be unsupported in a future version. Instead use unsubscribe function returned by subscribe. Everything will be garbage-collected if store is garbage-collected.\"\n );\n }\n listeners.clear();\n };\n const api = { setState, getState, getInitialState, subscribe, destroy };\n const initialState = state = createState(setState, getState, api);\n return api;\n};\nconst createStore = (createState) => createState ? createStoreImpl(createState) : createStoreImpl;\nvar vanilla = (createState) => {\n if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\") {\n console.warn(\n \"[DEPRECATED] Default export is deprecated. Instead use import { createStore } from 'zustand/vanilla'.\"\n );\n }\n return createStore(createState);\n};\n\nexport { createStore, vanilla as default };\n","/**\n * @license React\n * use-sync-external-store-shim.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar React = require(\"react\");\nfunction is(x, y) {\n return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n}\nvar objectIs = \"function\" === typeof Object.is ? Object.is : is,\n useState = React.useState,\n useEffect = React.useEffect,\n useLayoutEffect = React.useLayoutEffect,\n useDebugValue = React.useDebugValue;\nfunction useSyncExternalStore$2(subscribe, getSnapshot) {\n var value = getSnapshot(),\n _useState = useState({ inst: { value: value, getSnapshot: getSnapshot } }),\n inst = _useState[0].inst,\n forceUpdate = _useState[1];\n useLayoutEffect(\n function () {\n inst.value = value;\n inst.getSnapshot = getSnapshot;\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n },\n [subscribe, value, getSnapshot]\n );\n useEffect(\n function () {\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n return subscribe(function () {\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n });\n },\n [subscribe]\n );\n useDebugValue(value);\n return value;\n}\nfunction checkIfSnapshotChanged(inst) {\n var latestGetSnapshot = inst.getSnapshot;\n inst = inst.value;\n try {\n var nextValue = latestGetSnapshot();\n return !objectIs(inst, nextValue);\n } catch (error) {\n return !0;\n }\n}\nfunction useSyncExternalStore$1(subscribe, getSnapshot) {\n return getSnapshot();\n}\nvar shim =\n \"undefined\" === typeof window ||\n \"undefined\" === typeof window.document ||\n \"undefined\" === typeof window.document.createElement\n ? useSyncExternalStore$1\n : useSyncExternalStore$2;\nexports.useSyncExternalStore =\n void 0 !== React.useSyncExternalStore ? React.useSyncExternalStore : shim;\n","/**\n * @license React\n * use-sync-external-store-shim.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function is(x, y) {\n return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n }\n function useSyncExternalStore$2(subscribe, getSnapshot) {\n didWarnOld18Alpha ||\n void 0 === React.startTransition ||\n ((didWarnOld18Alpha = !0),\n console.error(\n \"You are using an outdated, pre-release alpha of React 18 that does not support useSyncExternalStore. The use-sync-external-store shim will not work correctly. Upgrade to a newer pre-release.\"\n ));\n var value = getSnapshot();\n if (!didWarnUncachedGetSnapshot) {\n var cachedValue = getSnapshot();\n objectIs(value, cachedValue) ||\n (console.error(\n \"The result of getSnapshot should be cached to avoid an infinite loop\"\n ),\n (didWarnUncachedGetSnapshot = !0));\n }\n cachedValue = useState({\n inst: { value: value, getSnapshot: getSnapshot }\n });\n var inst = cachedValue[0].inst,\n forceUpdate = cachedValue[1];\n useLayoutEffect(\n function () {\n inst.value = value;\n inst.getSnapshot = getSnapshot;\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n },\n [subscribe, value, getSnapshot]\n );\n useEffect(\n function () {\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n return subscribe(function () {\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n });\n },\n [subscribe]\n );\n useDebugValue(value);\n return value;\n }\n function checkIfSnapshotChanged(inst) {\n var latestGetSnapshot = inst.getSnapshot;\n inst = inst.value;\n try {\n var nextValue = latestGetSnapshot();\n return !objectIs(inst, nextValue);\n } catch (error) {\n return !0;\n }\n }\n function useSyncExternalStore$1(subscribe, getSnapshot) {\n return getSnapshot();\n }\n \"undefined\" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&\n \"function\" ===\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart &&\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());\n var React = require(\"react\"),\n objectIs = \"function\" === typeof Object.is ? Object.is : is,\n useState = React.useState,\n useEffect = React.useEffect,\n useLayoutEffect = React.useLayoutEffect,\n useDebugValue = React.useDebugValue,\n didWarnOld18Alpha = !1,\n didWarnUncachedGetSnapshot = !1,\n shim =\n \"undefined\" === typeof window ||\n \"undefined\" === typeof window.document ||\n \"undefined\" === typeof window.document.createElement\n ? useSyncExternalStore$1\n : useSyncExternalStore$2;\n exports.useSyncExternalStore =\n void 0 !== React.useSyncExternalStore ? React.useSyncExternalStore : shim;\n \"undefined\" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&\n \"function\" ===\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error());\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('../cjs/use-sync-external-store-shim.production.js');\n} else {\n module.exports = require('../cjs/use-sync-external-store-shim.development.js');\n}\n","/**\n * @license React\n * use-sync-external-store-shim/with-selector.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar React = require(\"react\"),\n shim = require(\"use-sync-external-store/shim\");\nfunction is(x, y) {\n return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n}\nvar objectIs = \"function\" === typeof Object.is ? Object.is : is,\n useSyncExternalStore = shim.useSyncExternalStore,\n useRef = React.useRef,\n useEffect = React.useEffect,\n useMemo = React.useMemo,\n useDebugValue = React.useDebugValue;\nexports.useSyncExternalStoreWithSelector = function (\n subscribe,\n getSnapshot,\n getServerSnapshot,\n selector,\n isEqual\n) {\n var instRef = useRef(null);\n if (null === instRef.current) {\n var inst = { hasValue: !1, value: null };\n instRef.current = inst;\n } else inst = instRef.current;\n instRef = useMemo(\n function () {\n function memoizedSelector(nextSnapshot) {\n if (!hasMemo) {\n hasMemo = !0;\n memoizedSnapshot = nextSnapshot;\n nextSnapshot = selector(nextSnapshot);\n if (void 0 !== isEqual && inst.hasValue) {\n var currentSelection = inst.value;\n if (isEqual(currentSelection, nextSnapshot))\n return (memoizedSelection = currentSelection);\n }\n return (memoizedSelection = nextSnapshot);\n }\n currentSelection = memoizedSelection;\n if (objectIs(memoizedSnapshot, nextSnapshot)) return currentSelection;\n var nextSelection = selector(nextSnapshot);\n if (void 0 !== isEqual && isEqual(currentSelection, nextSelection))\n return (memoizedSnapshot = nextSnapshot), currentSelection;\n memoizedSnapshot = nextSnapshot;\n return (memoizedSelection = nextSelection);\n }\n var hasMemo = !1,\n memoizedSnapshot,\n memoizedSelection,\n maybeGetServerSnapshot =\n void 0 === getServerSnapshot ? null : getServerSnapshot;\n return [\n function () {\n return memoizedSelector(getSnapshot());\n },\n null === maybeGetServerSnapshot\n ? void 0\n : function () {\n return memoizedSelector(maybeGetServerSnapshot());\n }\n ];\n },\n [getSnapshot, getServerSnapshot, selector, isEqual]\n );\n var value = useSyncExternalStore(subscribe, instRef[0], instRef[1]);\n useEffect(\n function () {\n inst.hasValue = !0;\n inst.value = value;\n },\n [value]\n );\n useDebugValue(value);\n return value;\n};\n","/**\n * @license React\n * use-sync-external-store-shim/with-selector.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function is(x, y) {\n return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n }\n \"undefined\" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&\n \"function\" ===\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart &&\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());\n var React = require(\"react\"),\n shim = require(\"use-sync-external-store/shim\"),\n objectIs = \"function\" === typeof Object.is ? Object.is : is,\n useSyncExternalStore = shim.useSyncExternalStore,\n useRef = React.useRef,\n useEffect = React.useEffect,\n useMemo = React.useMemo,\n useDebugValue = React.useDebugValue;\n exports.useSyncExternalStoreWithSelector = function (\n subscribe,\n getSnapshot,\n getServerSnapshot,\n selector,\n isEqual\n ) {\n var instRef = useRef(null);\n if (null === instRef.current) {\n var inst = { hasValue: !1, value: null };\n instRef.current = inst;\n } else inst = instRef.current;\n instRef = useMemo(\n function () {\n function memoizedSelector(nextSnapshot) {\n if (!hasMemo) {\n hasMemo = !0;\n memoizedSnapshot = nextSnapshot;\n nextSnapshot = selector(nextSnapshot);\n if (void 0 !== isEqual && inst.hasValue) {\n var currentSelection = inst.value;\n if (isEqual(currentSelection, nextSnapshot))\n return (memoizedSelection = currentSelection);\n }\n return (memoizedSelection = nextSnapshot);\n }\n currentSelection = memoizedSelection;\n if (objectIs(memoizedSnapshot, nextSnapshot))\n return currentSelection;\n var nextSelection = selector(nextSnapshot);\n if (void 0 !== isEqual && isEqual(currentSelection, nextSelection))\n return (memoizedSnapshot = nextSnapshot), currentSelection;\n memoizedSnapshot = nextSnapshot;\n return (memoizedSelection = nextSelection);\n }\n var hasMemo = !1,\n memoizedSnapshot,\n memoizedSelection,\n maybeGetServerSnapshot =\n void 0 === getServerSnapshot ? null : getServerSnapshot;\n return [\n function () {\n return memoizedSelector(getSnapshot());\n },\n null === maybeGetServerSnapshot\n ? void 0\n : function () {\n return memoizedSelector(maybeGetServerSnapshot());\n }\n ];\n },\n [getSnapshot, getServerSnapshot, selector, isEqual]\n );\n var value = useSyncExternalStore(subscribe, instRef[0], instRef[1]);\n useEffect(\n function () {\n inst.hasValue = !0;\n inst.value = value;\n },\n [value]\n );\n useDebugValue(value);\n return value;\n };\n \"undefined\" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&\n \"function\" ===\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error());\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('../cjs/use-sync-external-store-shim/with-selector.production.js');\n} else {\n module.exports = require('../cjs/use-sync-external-store-shim/with-selector.development.js');\n}\n","import { createStore } from 'zustand/vanilla';\nexport * from 'zustand/vanilla';\nimport ReactExports from 'react';\nimport useSyncExternalStoreExports from 'use-sync-external-store/shim/with-selector.js';\n\nconst { useDebugValue } = ReactExports;\nconst { useSyncExternalStoreWithSelector } = useSyncExternalStoreExports;\nlet didWarnAboutEqualityFn = false;\nconst identity = (arg) => arg;\nfunction useStore(api, selector = identity, equalityFn) {\n if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\" && equalityFn && !didWarnAboutEqualityFn) {\n console.warn(\n \"[DEPRECATED] Use `createWithEqualityFn` instead of `create` or use `useStoreWithEqualityFn` instead of `useStore`. They can be imported from 'zustand/traditional'. https://github.com/pmndrs/zustand/discussions/1937\"\n );\n didWarnAboutEqualityFn = true;\n }\n const slice = useSyncExternalStoreWithSelector(\n api.subscribe,\n api.getState,\n api.getServerState || api.getInitialState,\n selector,\n equalityFn\n );\n useDebugValue(slice);\n return slice;\n}\nconst createImpl = (createState) => {\n if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\" && typeof createState !== \"function\") {\n console.warn(\n \"[DEPRECATED] Passing a vanilla store will be unsupported in a future version. Instead use `import { useStore } from 'zustand'`.\"\n );\n }\n const api = typeof createState === \"function\" ? createStore(createState) : createState;\n const useBoundStore = (selector, equalityFn) => useStore(api, selector, equalityFn);\n Object.assign(useBoundStore, api);\n return useBoundStore;\n};\nconst create = (createState) => createState ? createImpl(createState) : createImpl;\nvar react = (createState) => {\n if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\") {\n console.warn(\n \"[DEPRECATED] Default export is deprecated. Instead use `import { create } from 'zustand'`.\"\n );\n }\n return create(createState);\n};\n\nexport { create, react as default, useStore };\n","import { create } from 'zustand'\nimport type { EidosState, ResourceEntry, ActionQueueItem } from './types'\n\nexport interface EidosStore extends EidosState {\n // Online\n setOnline: (online: boolean) => void\n // SW\n setSwStatus: (status: EidosState['swStatus'], error?: string) => void\n // Resources\n registerResource: (url: string, entry: ResourceEntry) => void\n updateResource: (url: string, update: Partial<ResourceEntry>) => void\n unregisterResource: (url: string) => void\n // Queue\n addQueueItem: (item: ActionQueueItem) => void\n updateQueueItem: (id: string, update: Partial<ActionQueueItem>) => void\n removeQueueItem: (id: string) => void\n hydrateQueue: (items: ActionQueueItem[]) => void\n}\n\nexport const useEidosStore = create<EidosStore>((set) => ({\n isOnline: typeof navigator !== 'undefined' ? navigator.onLine : true,\n swStatus: 'idle',\n swError: undefined,\n resources: {},\n queue: [],\n\n setOnline: (isOnline) => set({ isOnline }),\n\n setSwStatus: (swStatus, swError) => set({ swStatus, swError }),\n\n registerResource: (url, entry) =>\n set((s) => ({ resources: { ...s.resources, [url]: entry } })),\n\n updateResource: (url, update) =>\n set((s) => ({\n resources: {\n ...s.resources,\n [url]: s.resources[url] ? { ...s.resources[url], ...update } : s.resources[url],\n },\n })),\n\n unregisterResource: (url) =>\n set((s) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { [url]: _removed, ...rest } = s.resources\n return { resources: rest }\n }),\n\n addQueueItem: (item) => set((s) => ({ queue: [...s.queue, item] })),\n\n updateQueueItem: (id, update) =>\n set((s) => ({\n queue: s.queue.map((item) => (item.id === id ? { ...item, ...update } : item)),\n })),\n\n removeQueueItem: (id) => set((s) => ({ queue: s.queue.filter((item) => item.id !== id) })),\n\n hydrateQueue: (items) => set({ queue: items }),\n}))\n","import { useEidosStore } from './store'\n\nlet _registration: ServiceWorkerRegistration | null = null\n\nexport function getSwRegistration() {\n return _registration\n}\n\nexport async function registerServiceWorker(swPath: string): Promise<void> {\n if (typeof navigator === 'undefined' || !('serviceWorker' in navigator)) {\n useEidosStore.getState().setSwStatus('unsupported')\n return\n }\n\n const store = useEidosStore.getState()\n store.setSwStatus('registering')\n\n try {\n _registration = await navigator.serviceWorker.register(swPath, { scope: '/' })\n\n await waitForActivation(_registration)\n\n store.setSwStatus('active')\n\n // Receive messages from SW\n navigator.serviceWorker.addEventListener('message', onSwMessage)\n\n // Track online/offline\n window.addEventListener('online', () => store.setOnline(true))\n window.addEventListener('offline', () => store.setOnline(false))\n\n // resource() is called at module scope — before the SW is ready.\n // Re-send every registration now that the SW is active so it can\n // start intercepting fetches immediately.\n flushResourceRegistrations()\n } catch (err) {\n store.setSwStatus('error', String(err))\n }\n}\n\nfunction waitForActivation(reg: ServiceWorkerRegistration): Promise<void> {\n return new Promise((resolve) => {\n if (reg.active) { resolve(); return }\n const sw = reg.installing ?? reg.waiting\n if (!sw) { resolve(); return }\n sw.addEventListener('statechange', function handler() {\n if (sw.state === 'activated') {\n sw.removeEventListener('statechange', handler)\n resolve()\n }\n })\n })\n}\n\nexport function sendToWorker(message: Record<string, unknown>): void {\n const sw = _registration?.active\n if (sw) sw.postMessage(message)\n}\n\nfunction onSwMessage(event: MessageEvent): void {\n const data = event.data as { type: string; url?: string; strategy?: string }\n if (!data?.type) return\n\n const store = useEidosStore.getState()\n const { type, url } = data\n\n if (!url) return\n\n switch (type) {\n case 'EIDOS_CACHE_HIT': {\n const current = store.resources[url]\n store.updateResource(url, {\n status: 'fresh',\n lastEvent: 'cache-hit',\n cacheHits: (current?.cacheHits ?? 0) + 1,\n })\n break\n }\n case 'EIDOS_CACHE_UPDATED': {\n store.updateResource(url, {\n status: 'fresh',\n lastEvent: 'cache-updated',\n cachedAt: Date.now(),\n })\n break\n }\n case 'EIDOS_NETWORK_ERROR': {\n store.updateResource(url, {\n status: 'error',\n lastEvent: 'network-error',\n })\n break\n }\n }\n}\n\nexport function setOfflineSimulation(enabled: boolean): void {\n sendToWorker({ type: 'EIDOS_SIMULATE_OFFLINE', enabled })\n useEidosStore.getState().setOnline(!enabled)\n}\n\n// Sends EIDOS_REGISTER_RESOURCE for every resource already in the store.\n// Called once after the SW activates to handle the common case where\n// resource() is declared at module scope before the SW is ready.\nfunction flushResourceRegistrations(): void {\n const { resources } = useEidosStore.getState()\n Object.values(resources).forEach((entry) => {\n sendToWorker({\n type: 'EIDOS_REGISTER_RESOURCE',\n url: entry.url,\n strategy: entry.strategy.swStrategy,\n cacheName: entry.strategy.cacheName,\n })\n })\n}\n","import { useEidosStore } from './store'\nimport { sendToWorker } from './sw-bridge'\nimport type {\n ResourceConfig,\n ResourceHandle,\n ResourceEntry,\n GeneratedStrategy,\n CacheStrategy,\n} from './types'\n\nconst _registry = new Map<string, ResourceHandle>()\n\nexport function resource<T = unknown>(\n url: string,\n config: ResourceConfig,\n): ResourceHandle<T> {\n if (_registry.has(url)) {\n if (import.meta.env.DEV) {\n const existing = _registry.get(url)!\n const existingCfg = existing.config\n if (\n existingCfg.offline !== config.offline ||\n existingCfg.strategy !== config.strategy ||\n existingCfg.cacheName !== config.cacheName\n ) {\n console.warn(\n `[eidos] resource('${url}') already registered with a different config — returning cached handle. Call resource.unregister() first to re-register.`,\n { registered: existingCfg, ignored: config },\n )\n }\n }\n return _registry.get(url) as ResourceHandle<T>\n }\n\n const strategy = deriveStrategy(url, config)\n\n const entry: ResourceEntry = {\n url,\n config,\n strategy,\n status: 'idle',\n cacheHits: 0,\n cacheMisses: 0,\n }\n\n useEidosStore.getState().registerResource(url, entry)\n\n sendToWorker({\n type: 'EIDOS_REGISTER_RESOURCE',\n url,\n strategy: strategy.swStrategy,\n cacheName: strategy.cacheName,\n })\n\n const handle: ResourceHandle<T> = {\n url,\n config,\n strategy,\n\n fetch: async () => {\n const store = useEidosStore.getState()\n store.updateResource(url, { status: 'fetching', fetchedAt: Date.now() })\n\n try {\n // ── Direct Cache API check ─────────────────────────────────────\n // We read the cache in the main thread rather than waiting for\n // an async SW postMessage. This gives instant, reliable status\n // updates regardless of SW message timing.\n const cache = await caches.open(strategy.cacheName).catch(() => null)\n const cached = cache ? await cache.match(url).catch(() => null) : null\n\n // Treat cache as miss if maxAge exceeded\n const current = useEidosStore.getState().resources[url]\n const expired =\n config.maxAge !== undefined &&\n current?.cachedAt !== undefined &&\n Date.now() - current.cachedAt > config.maxAge\n\n if (cached && !expired) {\n store.updateResource(url, {\n status: 'fresh',\n lastEvent: 'cache-hit',\n cacheHits: (current?.cacheHits ?? 0) + 1,\n })\n\n // Background revalidation for SWR (stale-while-revalidate)\n if (strategy.swStrategy === 'stale-while-revalidate') {\n fetch(url)\n .then(async (resp) => {\n if (resp.ok && cache) {\n await cache.put(url, resp.clone())\n useEidosStore.getState().updateResource(url, {\n cachedAt: Date.now(),\n lastEvent: 'cache-updated',\n })\n }\n })\n .catch(() => {\n /* offline — cached version stays valid */\n })\n }\n\n return cached\n }\n\n // ── Cache miss (or expired): fetch from network ────────────────\n const storeEntry = useEidosStore.getState().resources[url]\n store.updateResource(url, {\n cacheMisses: (storeEntry?.cacheMisses ?? 0) + 1,\n })\n\n const response = await fetch(url)\n\n if (response.ok) {\n if (cache) await cache.put(url, response.clone())\n store.updateResource(url, {\n status: 'fresh',\n cachedAt: Date.now(),\n lastEvent: 'cache-updated',\n })\n return response\n }\n\n // Non-2xx response (e.g. 503 from offline SW) — update status and throw\n // so callers get a proper error instead of a plain-object body they can't use.\n store.updateResource(url, { status: response.status === 503 ? 'offline' : 'error' })\n\n // Check if the SW tagged this as an offline response\n const isOffline = response.headers.get('X-Eidos-Offline') === 'true'\n throw new Error(\n isOffline ? `offline: no cached response for ${url}` : `${response.status} ${response.statusText}`,\n )\n } catch (err) {\n // Network failure — try cache one more time as fallback\n const cache = await caches.open(strategy.cacheName).catch(() => null)\n const fallback = cache ? await cache.match(url).catch(() => null) : null\n\n if (fallback) {\n const current = useEidosStore.getState().resources[url]\n store.updateResource(url, {\n status: 'fresh',\n lastEvent: 'cache-hit',\n cacheHits: (current?.cacheHits ?? 0) + 1,\n })\n return fallback\n }\n\n store.updateResource(url, { status: 'error' })\n throw err\n }\n },\n\n json: async () => {\n const res = await handle.fetch()\n return res.json() as Promise<T>\n },\n\n query: () => ({\n queryKey: ['eidos', url] as [string, string],\n queryFn: () => handle.json(),\n }),\n\n prefetch: async () => {\n await handle.fetch()\n },\n\n invalidate: async () => {\n sendToWorker({ type: 'EIDOS_CLEAR_CACHE', url })\n const cache = await caches.open(strategy.cacheName).catch(() => null)\n if (cache) {\n const keys = await cache.keys()\n await Promise.all(\n keys.filter((r) => new URL(r.url).pathname === url).map((r) => cache.delete(r)),\n )\n }\n useEidosStore.getState().updateResource(url, {\n status: 'stale',\n cachedAt: undefined,\n lastEvent: 'cache-cleared',\n cacheHits: 0,\n cacheMisses: 0,\n })\n },\n }\n\n _registry.set(url, handle)\n return handle\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Strategy derivation — intent → deterministic caching strategy\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction deriveStrategy(url: string, config: ResourceConfig): GeneratedStrategy {\n const explicit = config.strategy\n if (config.offline) return buildStrategy(explicit ?? 'stale-while-revalidate', url, config.cacheName)\n return buildStrategy(explicit ?? 'network-first', url, config.cacheName)\n}\n\nconst STRATEGY_META: Record<CacheStrategy, Omit<GeneratedStrategy, 'swStrategy' | 'cacheName'>> = {\n 'stale-while-revalidate': {\n name: 'StaleWhileRevalidate',\n reasoning:\n 'offline: true signals resilience. SWR returns cached data instantly while revalidating in the background — the best tradeoff between speed and freshness for offline-capable resources.',\n behavior: [\n 'Cache hit → return immediately, kick off background revalidation',\n 'Cache miss → fetch from network, cache the response, return it',\n 'Offline → return cached version if available, 503 if not',\n 'Reconnect → next request triggers a background refresh',\n ],\n equivalentCode: `// Workbox equivalent\nnew StaleWhileRevalidate({\n cacheName: 'eidos-resources-v1',\n plugins: [new ExpirationPlugin({ maxEntries: 60 })],\n})`,\n },\n 'cache-first': {\n name: 'CacheFirst',\n reasoning:\n 'cache-first maximises speed and offline availability. Network is consulted only on cache miss. Best for static or infrequently-updated data.',\n behavior: [\n 'Cache hit → return immediately, no network request made',\n 'Cache miss → fetch from network, cache the response, return it',\n 'Offline → return cached version, 503 if cache is empty',\n 'Cache never expires unless explicitly invalidated',\n ],\n equivalentCode: `// Workbox equivalent\nnew CacheFirst({\n cacheName: 'eidos-resources-v1',\n plugins: [new ExpirationPlugin({ maxEntries: 60 })],\n})`,\n },\n 'network-first': {\n name: 'NetworkFirst',\n reasoning:\n 'network-first prioritises fresh data. Cache acts as a safety net when offline. Best for frequently-updated resources where stale data causes problems.',\n behavior: [\n 'Always try network first',\n 'Network success → update cache, return fresh response',\n 'Network failure → fall back to cached version',\n 'Offline with empty cache → return 503 error response',\n ],\n equivalentCode: `// Workbox equivalent\nnew NetworkFirst({\n cacheName: 'eidos-resources-v1',\n networkTimeoutSeconds: 3,\n})`,\n },\n}\n\nfunction buildStrategy(swStrategy: CacheStrategy, _url: string, cacheName?: string): GeneratedStrategy {\n return {\n ...STRATEGY_META[swStrategy],\n swStrategy,\n cacheName: cacheName ?? 'eidos-resources-v1',\n }\n}\n","import type { ActionQueueItem } from './types'\n\nconst DB_NAME = 'eidos'\nconst DB_VERSION = 1\nconst QUEUE_STORE = 'action-queue'\n\nlet _db: IDBDatabase | null = null\n\nfunction openDB(): Promise<IDBDatabase> {\n if (_db) return Promise.resolve(_db)\n\n return new Promise((resolve, reject) => {\n const req = indexedDB.open(DB_NAME, DB_VERSION)\n\n req.onupgradeneeded = (event) => {\n const db = (event.target as IDBOpenDBRequest).result\n if (!db.objectStoreNames.contains(QUEUE_STORE)) {\n const store = db.createObjectStore(QUEUE_STORE, { keyPath: 'id' })\n store.createIndex('status', 'status', { unique: false })\n store.createIndex('actionId', 'actionId', { unique: false })\n }\n }\n\n req.onsuccess = () => {\n _db = req.result\n resolve(req.result)\n }\n\n req.onerror = () => reject(req.error)\n })\n}\n\nexport async function idbAddToQueue(item: ActionQueueItem): Promise<void> {\n const db = await openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(QUEUE_STORE, 'readwrite')\n tx.objectStore(QUEUE_STORE).add(item)\n tx.oncomplete = () => resolve()\n tx.onerror = () => reject(tx.error)\n })\n}\n\nexport async function idbGetQueue(): Promise<ActionQueueItem[]> {\n const db = await openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(QUEUE_STORE, 'readonly')\n const req = tx.objectStore(QUEUE_STORE).getAll()\n req.onsuccess = () => resolve(req.result as ActionQueueItem[])\n req.onerror = () => reject(req.error)\n })\n}\n\nexport async function idbUpdateQueueItem(\n id: string,\n update: Partial<ActionQueueItem>,\n): Promise<void> {\n const db = await openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(QUEUE_STORE, 'readwrite')\n const store = tx.objectStore(QUEUE_STORE)\n const get = store.get(id)\n get.onsuccess = () => {\n if (get.result) store.put({ ...get.result, ...update })\n }\n tx.oncomplete = () => resolve()\n tx.onerror = () => reject(tx.error)\n })\n}\n\nexport async function idbRemoveFromQueue(id: string): Promise<void> {\n const db = await openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(QUEUE_STORE, 'readwrite')\n tx.objectStore(QUEUE_STORE).delete(id)\n tx.oncomplete = () => resolve()\n tx.onerror = () => reject(tx.error)\n })\n}\n\nexport async function idbClearQueue(): Promise<void> {\n const db = await openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(QUEUE_STORE, 'readwrite')\n tx.objectStore(QUEUE_STORE).clear()\n tx.oncomplete = () => resolve()\n tx.onerror = () => reject(tx.error)\n })\n}\n","import { useEidosStore } from './store'\nimport {\n idbAddToQueue,\n idbGetQueue,\n idbUpdateQueueItem,\n idbRemoveFromQueue,\n} from './idb'\nimport type {\n ActionConfig,\n ActionHandle,\n ActionFn,\n ActionQueueItem,\n QueuedResult,\n} from './types'\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst _actionRegistry = new Map<string, ActionFn<any[], any>>()\n\nfunction uid() {\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 7)}`\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function action<TArgs extends any[], TReturn>(\n fn: ActionFn<TArgs, TReturn>,\n config: ActionConfig,\n): ActionHandle<TArgs, TReturn> {\n const actionId = config.name ?? fn.name ?? uid()\n\n // Registering here means the function is available for replay after\n // the user refreshes the page (actions are defined at module scope).\n _actionRegistry.set(actionId, fn as ActionFn<unknown[], unknown>)\n\n const wrapped = async (...args: TArgs): Promise<TReturn | QueuedResult> => {\n const { isOnline } = useEidosStore.getState()\n\n if (config.reliability === 'neverLose') {\n if (!isOnline) {\n return persistAndQueue(actionId, fn.name || actionId, args, config)\n }\n // Online + neverLose: execute, queue on failure\n try {\n return await fn(...args)\n } catch {\n return persistAndQueue(actionId, fn.name || actionId, args, config)\n }\n }\n\n // best-effort: execute directly, no queuing\n return fn(...args)\n }\n\n Object.defineProperty(wrapped, 'id', { value: actionId, writable: false })\n Object.defineProperty(wrapped, 'config', { value: config, writable: false })\n\n return wrapped as unknown as ActionHandle<TArgs, TReturn>\n}\n\nfunction isJsonSerializable(value: unknown): boolean {\n try {\n JSON.stringify(value)\n return true\n } catch {\n return false\n }\n}\n\nasync function persistAndQueue(\n actionId: string,\n actionName: string,\n args: unknown[],\n config: ActionConfig,\n): Promise<QueuedResult> {\n if (import.meta.env.DEV && !isJsonSerializable(args)) {\n console.warn(\n `[eidos] action \"${actionName}\" queued with non-JSON-serializable args. These args will be lost after a page reload. Use plain JSON values for neverLose actions.`,\n args,\n )\n }\n\n const id = uid()\n const item: ActionQueueItem = {\n id,\n actionId,\n actionName,\n args,\n queuedAt: Date.now(),\n retryCount: 0,\n maxRetries: config.maxRetries ?? 3,\n status: 'pending',\n }\n\n await idbAddToQueue(item)\n useEidosStore.getState().addQueueItem(item)\n\n return {\n queued: true,\n id,\n message: `\"${actionName}\" queued — will execute when online`,\n }\n}\n\n// Base delay 2s, doubles per retry, capped at 5 minutes, ±20% jitter\nfunction backoffMs(retryCount: number): number {\n const base = Math.min(2000 * 2 ** retryCount, 300_000)\n return base * (0.8 + Math.random() * 0.4)\n}\n\nexport async function replayQueue(): Promise<void> {\n const store = useEidosStore.getState()\n if (!store.isOnline) return\n\n const queue = await idbGetQueue()\n const now = Date.now()\n const pending = queue.filter(\n (item) =>\n (item.status === 'pending' || item.status === 'failed') &&\n (!item.nextRetryAt || item.nextRetryAt <= now),\n )\n\n for (const item of pending) {\n const fn = _actionRegistry.get(item.actionId)\n if (!fn) continue\n\n store.updateQueueItem(item.id, { status: 'replaying' })\n await idbUpdateQueueItem(item.id, { status: 'replaying' })\n\n try {\n await fn(...(item.args as unknown[]))\n const completedAt = Date.now()\n store.updateQueueItem(item.id, { status: 'succeeded', completedAt })\n await idbUpdateQueueItem(item.id, { status: 'succeeded', completedAt })\n\n // Remove from queue after a delay so the UI can show the success state\n setTimeout(() => {\n store.removeQueueItem(item.id)\n idbRemoveFromQueue(item.id)\n }, 3000)\n } catch (err) {\n const retryCount = item.retryCount + 1\n if (retryCount >= item.maxRetries) {\n store.updateQueueItem(item.id, {\n status: 'failed',\n error: String(err),\n retryCount,\n })\n await idbUpdateQueueItem(item.id, {\n status: 'failed',\n error: String(err),\n retryCount,\n })\n } else {\n const nextRetryAt = Date.now() + backoffMs(retryCount)\n store.updateQueueItem(item.id, { status: 'pending', retryCount, nextRetryAt })\n await idbUpdateQueueItem(item.id, { status: 'pending', retryCount, nextRetryAt })\n }\n }\n }\n}\n","import { registerServiceWorker } from './sw-bridge'\nimport { replayQueue } from './action'\nimport { useEidosStore } from './store'\nimport { idbGetQueue } from './idb'\n\nexport interface EidosConfig {\n /** Path to the eidos service worker. Defaults to '/eidos-sw.js'. */\n swPath?: string\n /** Automatically replay the action queue on reconnect. Default: true. */\n autoReplay?: boolean\n}\n\nlet _initialized = false\n\nexport async function initEidos(config: EidosConfig = {}): Promise<void> {\n if (_initialized) return\n _initialized = true\n\n const swPath = config.swPath ?? '/eidos-sw.js'\n const autoReplay = config.autoReplay ?? true\n\n // Restore persisted queue from IndexedDB on startup\n try {\n const persisted = await idbGetQueue()\n if (persisted.length > 0) {\n useEidosStore.getState().hydrateQueue(persisted)\n }\n } catch {\n // IndexedDB unavailable (Firefox private browsing) — silent fallback\n }\n\n try {\n await registerServiceWorker(swPath)\n } catch {\n // SW registration failed; app continues without offline support\n }\n\n if (autoReplay) {\n // ── Subscribe to the Zustand store instead of window.addEventListener('online')\n //\n // WHY: setOfflineSimulation() updates the store directly but never fires a\n // real browser `online` event. Watching the store means we catch both:\n // • Real network reconnects (sw-bridge updates store on window.online)\n // • Simulation toggled off (setOfflineSimulation(false) → store.setOnline(true))\n //\n let prevIsOnline = useEidosStore.getState().isOnline\n\n useEidosStore.subscribe((state) => {\n const justCameOnline = state.isOnline && !prevIsOnline\n prevIsOnline = state.isOnline\n\n if (justCameOnline) {\n // Small delay so the connection (or simulation reset) settles first\n setTimeout(replayQueue, 600)\n }\n })\n\n // Replay any pending items that survived a page reload\n const store = useEidosStore.getState()\n const hasPending = store.queue.some((q) => q.status === 'pending' || q.status === 'failed')\n if (store.isOnline && hasPending) {\n setTimeout(replayQueue, 1200)\n }\n }\n\n if (import.meta.env.DEV) {\n const store = useEidosStore.getState()\n console.groupCollapsed('%c⚡ Eidos', 'color:#38bdf8;font-weight:bold')\n console.log('SW path :', swPath)\n console.log('Auto-replay:', autoReplay)\n console.log('SW status :', store.swStatus)\n console.groupEnd()\n }\n}\n\nexport function _resetEidos() {\n _initialized = false\n}\n","import { useEffect, type ReactNode } from 'react'\nimport { initEidos, type EidosConfig } from '../runtime'\n\ninterface EidosProviderProps extends EidosConfig {\n children: ReactNode\n}\n\n/**\n * Mount once at the root of your application.\n * Registers the service worker and initialises the Eidos runtime.\n *\n * @example\n * <EidosProvider swPath=\"/eidos-sw.js\">\n * <App />\n * </EidosProvider>\n */\nexport function EidosProvider({ children, swPath, autoReplay }: EidosProviderProps) {\n useEffect(() => {\n initEidos({ swPath, autoReplay })\n // Run once on mount only\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n return <>{children}</>\n}\n","import { useEidosStore } from '../store'\n\n/** Full Eidos store — prefer the narrower hooks below for performance. */\nexport function useEidos() {\n return useEidosStore()\n}\n\n/** Live state for a single registered resource URL. */\nexport function useEidosResource(url: string) {\n return useEidosStore((s) => s.resources[url])\n}\n\n/** The current action queue. */\nexport function useEidosQueue() {\n return useEidosStore((s) => s.queue)\n}\n\n/** Online + SW status — cheap subscription, safe to use in header components. */\nexport function useEidosStatus() {\n return useEidosStore((s) => ({\n isOnline: s.isOnline,\n swStatus: s.swStatus,\n swError: s.swError,\n }))\n}\n"],"names":["__vite_import_meta_env__","useDebugValue","shim","shimModule","require$$0","require$$1","withSelectorModule","ReactExports","useEffect"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7]}
|
package/dist/eidos.es.js
CHANGED
|
@@ -486,7 +486,9 @@ function flushResourceRegistrations() {
|
|
|
486
486
|
}
|
|
487
487
|
const _registry = /* @__PURE__ */ new Map();
|
|
488
488
|
function resource(url, config) {
|
|
489
|
-
if (_registry.has(url))
|
|
489
|
+
if (_registry.has(url)) {
|
|
490
|
+
return _registry.get(url);
|
|
491
|
+
}
|
|
490
492
|
const strategy = deriveStrategy(url, config);
|
|
491
493
|
const entry = {
|
|
492
494
|
url,
|
|
@@ -513,12 +515,13 @@ function resource(url, config) {
|
|
|
513
515
|
try {
|
|
514
516
|
const cache = await caches.open(strategy.cacheName).catch(() => null);
|
|
515
517
|
const cached = cache ? await cache.match(url).catch(() => null) : null;
|
|
516
|
-
|
|
517
|
-
|
|
518
|
+
const current = useEidosStore.getState().resources[url];
|
|
519
|
+
const expired = config.maxAge !== void 0 && (current == null ? void 0 : current.cachedAt) !== void 0 && Date.now() - current.cachedAt > config.maxAge;
|
|
520
|
+
if (cached && !expired) {
|
|
518
521
|
store.updateResource(url, {
|
|
519
522
|
status: "fresh",
|
|
520
523
|
lastEvent: "cache-hit",
|
|
521
|
-
cacheHits: ((
|
|
524
|
+
cacheHits: ((current == null ? void 0 : current.cacheHits) ?? 0) + 1
|
|
522
525
|
});
|
|
523
526
|
if (strategy.swStrategy === "stale-while-revalidate") {
|
|
524
527
|
fetch(url).then(async (resp) => {
|
|
@@ -534,9 +537,9 @@ function resource(url, config) {
|
|
|
534
537
|
}
|
|
535
538
|
return cached;
|
|
536
539
|
}
|
|
537
|
-
const
|
|
540
|
+
const storeEntry = useEidosStore.getState().resources[url];
|
|
538
541
|
store.updateResource(url, {
|
|
539
|
-
cacheMisses: ((
|
|
542
|
+
cacheMisses: ((storeEntry == null ? void 0 : storeEntry.cacheMisses) ?? 0) + 1
|
|
540
543
|
});
|
|
541
544
|
const response = await fetch(url);
|
|
542
545
|
if (response.ok) {
|
|
@@ -603,8 +606,8 @@ function resource(url, config) {
|
|
|
603
606
|
}
|
|
604
607
|
function deriveStrategy(url, config) {
|
|
605
608
|
const explicit = config.strategy;
|
|
606
|
-
if (config.offline) return buildStrategy(explicit ?? "stale-while-revalidate");
|
|
607
|
-
return buildStrategy(explicit ?? "network-first");
|
|
609
|
+
if (config.offline) return buildStrategy(explicit ?? "stale-while-revalidate", url, config.cacheName);
|
|
610
|
+
return buildStrategy(explicit ?? "network-first", url, config.cacheName);
|
|
608
611
|
}
|
|
609
612
|
const STRATEGY_META = {
|
|
610
613
|
"stale-while-revalidate": {
|
|
@@ -653,11 +656,11 @@ new NetworkFirst({
|
|
|
653
656
|
})`
|
|
654
657
|
}
|
|
655
658
|
};
|
|
656
|
-
function buildStrategy(swStrategy, _url) {
|
|
659
|
+
function buildStrategy(swStrategy, _url, cacheName) {
|
|
657
660
|
return {
|
|
658
661
|
...STRATEGY_META[swStrategy],
|
|
659
662
|
swStrategy,
|
|
660
|
-
cacheName: "eidos-resources-v1"
|
|
663
|
+
cacheName: cacheName ?? "eidos-resources-v1"
|
|
661
664
|
};
|
|
662
665
|
}
|
|
663
666
|
const DB_NAME = "eidos";
|
|
@@ -768,12 +771,17 @@ async function persistAndQueue(actionId, actionName, args, config) {
|
|
|
768
771
|
message: `"${actionName}" queued — will execute when online`
|
|
769
772
|
};
|
|
770
773
|
}
|
|
774
|
+
function backoffMs(retryCount) {
|
|
775
|
+
const base = Math.min(2e3 * 2 ** retryCount, 3e5);
|
|
776
|
+
return base * (0.8 + Math.random() * 0.4);
|
|
777
|
+
}
|
|
771
778
|
async function replayQueue() {
|
|
772
779
|
const store = useEidosStore.getState();
|
|
773
780
|
if (!store.isOnline) return;
|
|
774
781
|
const queue = await idbGetQueue();
|
|
782
|
+
const now = Date.now();
|
|
775
783
|
const pending = queue.filter(
|
|
776
|
-
(item) => item.status === "pending" || item.status === "failed"
|
|
784
|
+
(item) => (item.status === "pending" || item.status === "failed") && (!item.nextRetryAt || item.nextRetryAt <= now)
|
|
777
785
|
);
|
|
778
786
|
for (const item of pending) {
|
|
779
787
|
const fn = _actionRegistry.get(item.actionId);
|
|
@@ -803,8 +811,9 @@ async function replayQueue() {
|
|
|
803
811
|
retryCount
|
|
804
812
|
});
|
|
805
813
|
} else {
|
|
806
|
-
|
|
807
|
-
|
|
814
|
+
const nextRetryAt = Date.now() + backoffMs(retryCount);
|
|
815
|
+
store.updateQueueItem(item.id, { status: "pending", retryCount, nextRetryAt });
|
|
816
|
+
await idbUpdateQueueItem(item.id, { status: "pending", retryCount, nextRetryAt });
|
|
808
817
|
}
|
|
809
818
|
}
|
|
810
819
|
}
|
package/dist/eidos.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eidos.es.js","sources":["../../../node_modules/.pnpm/zustand@4.5.7_@types+react@18.3.30_react@18.3.1/node_modules/zustand/esm/vanilla.mjs","../../../node_modules/.pnpm/use-sync-external-store@1.6.0_react@18.3.1/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js","../../../node_modules/.pnpm/use-sync-external-store@1.6.0_react@18.3.1/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js","../../../node_modules/.pnpm/use-sync-external-store@1.6.0_react@18.3.1/node_modules/use-sync-external-store/shim/index.js","../../../node_modules/.pnpm/use-sync-external-store@1.6.0_react@18.3.1/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.js","../../../node_modules/.pnpm/use-sync-external-store@1.6.0_react@18.3.1/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js","../../../node_modules/.pnpm/use-sync-external-store@1.6.0_react@18.3.1/node_modules/use-sync-external-store/shim/with-selector.js","../../../node_modules/.pnpm/zustand@4.5.7_@types+react@18.3.30_react@18.3.1/node_modules/zustand/esm/index.mjs","../src/store.ts","../src/sw-bridge.ts","../src/resource.ts","../src/idb.ts","../src/action.ts","../src/runtime.ts","../src/react/Provider.tsx","../src/react/hooks.ts"],"sourcesContent":["const createStoreImpl = (createState) => {\n let state;\n const listeners = /* @__PURE__ */ new Set();\n const setState = (partial, replace) => {\n const nextState = typeof partial === \"function\" ? partial(state) : partial;\n if (!Object.is(nextState, state)) {\n const previousState = state;\n state = (replace != null ? replace : typeof nextState !== \"object\" || nextState === null) ? nextState : Object.assign({}, state, nextState);\n listeners.forEach((listener) => listener(state, previousState));\n }\n };\n const getState = () => state;\n const getInitialState = () => initialState;\n const subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const destroy = () => {\n if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\") {\n console.warn(\n \"[DEPRECATED] The `destroy` method will be unsupported in a future version. Instead use unsubscribe function returned by subscribe. Everything will be garbage-collected if store is garbage-collected.\"\n );\n }\n listeners.clear();\n };\n const api = { setState, getState, getInitialState, subscribe, destroy };\n const initialState = state = createState(setState, getState, api);\n return api;\n};\nconst createStore = (createState) => createState ? createStoreImpl(createState) : createStoreImpl;\nvar vanilla = (createState) => {\n if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\") {\n console.warn(\n \"[DEPRECATED] Default export is deprecated. Instead use import { createStore } from 'zustand/vanilla'.\"\n );\n }\n return createStore(createState);\n};\n\nexport { createStore, vanilla as default };\n","/**\n * @license React\n * use-sync-external-store-shim.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar React = require(\"react\");\nfunction is(x, y) {\n return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n}\nvar objectIs = \"function\" === typeof Object.is ? Object.is : is,\n useState = React.useState,\n useEffect = React.useEffect,\n useLayoutEffect = React.useLayoutEffect,\n useDebugValue = React.useDebugValue;\nfunction useSyncExternalStore$2(subscribe, getSnapshot) {\n var value = getSnapshot(),\n _useState = useState({ inst: { value: value, getSnapshot: getSnapshot } }),\n inst = _useState[0].inst,\n forceUpdate = _useState[1];\n useLayoutEffect(\n function () {\n inst.value = value;\n inst.getSnapshot = getSnapshot;\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n },\n [subscribe, value, getSnapshot]\n );\n useEffect(\n function () {\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n return subscribe(function () {\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n });\n },\n [subscribe]\n );\n useDebugValue(value);\n return value;\n}\nfunction checkIfSnapshotChanged(inst) {\n var latestGetSnapshot = inst.getSnapshot;\n inst = inst.value;\n try {\n var nextValue = latestGetSnapshot();\n return !objectIs(inst, nextValue);\n } catch (error) {\n return !0;\n }\n}\nfunction useSyncExternalStore$1(subscribe, getSnapshot) {\n return getSnapshot();\n}\nvar shim =\n \"undefined\" === typeof window ||\n \"undefined\" === typeof window.document ||\n \"undefined\" === typeof window.document.createElement\n ? useSyncExternalStore$1\n : useSyncExternalStore$2;\nexports.useSyncExternalStore =\n void 0 !== React.useSyncExternalStore ? React.useSyncExternalStore : shim;\n","/**\n * @license React\n * use-sync-external-store-shim.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function is(x, y) {\n return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n }\n function useSyncExternalStore$2(subscribe, getSnapshot) {\n didWarnOld18Alpha ||\n void 0 === React.startTransition ||\n ((didWarnOld18Alpha = !0),\n console.error(\n \"You are using an outdated, pre-release alpha of React 18 that does not support useSyncExternalStore. The use-sync-external-store shim will not work correctly. Upgrade to a newer pre-release.\"\n ));\n var value = getSnapshot();\n if (!didWarnUncachedGetSnapshot) {\n var cachedValue = getSnapshot();\n objectIs(value, cachedValue) ||\n (console.error(\n \"The result of getSnapshot should be cached to avoid an infinite loop\"\n ),\n (didWarnUncachedGetSnapshot = !0));\n }\n cachedValue = useState({\n inst: { value: value, getSnapshot: getSnapshot }\n });\n var inst = cachedValue[0].inst,\n forceUpdate = cachedValue[1];\n useLayoutEffect(\n function () {\n inst.value = value;\n inst.getSnapshot = getSnapshot;\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n },\n [subscribe, value, getSnapshot]\n );\n useEffect(\n function () {\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n return subscribe(function () {\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n });\n },\n [subscribe]\n );\n useDebugValue(value);\n return value;\n }\n function checkIfSnapshotChanged(inst) {\n var latestGetSnapshot = inst.getSnapshot;\n inst = inst.value;\n try {\n var nextValue = latestGetSnapshot();\n return !objectIs(inst, nextValue);\n } catch (error) {\n return !0;\n }\n }\n function useSyncExternalStore$1(subscribe, getSnapshot) {\n return getSnapshot();\n }\n \"undefined\" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&\n \"function\" ===\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart &&\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());\n var React = require(\"react\"),\n objectIs = \"function\" === typeof Object.is ? Object.is : is,\n useState = React.useState,\n useEffect = React.useEffect,\n useLayoutEffect = React.useLayoutEffect,\n useDebugValue = React.useDebugValue,\n didWarnOld18Alpha = !1,\n didWarnUncachedGetSnapshot = !1,\n shim =\n \"undefined\" === typeof window ||\n \"undefined\" === typeof window.document ||\n \"undefined\" === typeof window.document.createElement\n ? useSyncExternalStore$1\n : useSyncExternalStore$2;\n exports.useSyncExternalStore =\n void 0 !== React.useSyncExternalStore ? React.useSyncExternalStore : shim;\n \"undefined\" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&\n \"function\" ===\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error());\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('../cjs/use-sync-external-store-shim.production.js');\n} else {\n module.exports = require('../cjs/use-sync-external-store-shim.development.js');\n}\n","/**\n * @license React\n * use-sync-external-store-shim/with-selector.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar React = require(\"react\"),\n shim = require(\"use-sync-external-store/shim\");\nfunction is(x, y) {\n return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n}\nvar objectIs = \"function\" === typeof Object.is ? Object.is : is,\n useSyncExternalStore = shim.useSyncExternalStore,\n useRef = React.useRef,\n useEffect = React.useEffect,\n useMemo = React.useMemo,\n useDebugValue = React.useDebugValue;\nexports.useSyncExternalStoreWithSelector = function (\n subscribe,\n getSnapshot,\n getServerSnapshot,\n selector,\n isEqual\n) {\n var instRef = useRef(null);\n if (null === instRef.current) {\n var inst = { hasValue: !1, value: null };\n instRef.current = inst;\n } else inst = instRef.current;\n instRef = useMemo(\n function () {\n function memoizedSelector(nextSnapshot) {\n if (!hasMemo) {\n hasMemo = !0;\n memoizedSnapshot = nextSnapshot;\n nextSnapshot = selector(nextSnapshot);\n if (void 0 !== isEqual && inst.hasValue) {\n var currentSelection = inst.value;\n if (isEqual(currentSelection, nextSnapshot))\n return (memoizedSelection = currentSelection);\n }\n return (memoizedSelection = nextSnapshot);\n }\n currentSelection = memoizedSelection;\n if (objectIs(memoizedSnapshot, nextSnapshot)) return currentSelection;\n var nextSelection = selector(nextSnapshot);\n if (void 0 !== isEqual && isEqual(currentSelection, nextSelection))\n return (memoizedSnapshot = nextSnapshot), currentSelection;\n memoizedSnapshot = nextSnapshot;\n return (memoizedSelection = nextSelection);\n }\n var hasMemo = !1,\n memoizedSnapshot,\n memoizedSelection,\n maybeGetServerSnapshot =\n void 0 === getServerSnapshot ? null : getServerSnapshot;\n return [\n function () {\n return memoizedSelector(getSnapshot());\n },\n null === maybeGetServerSnapshot\n ? void 0\n : function () {\n return memoizedSelector(maybeGetServerSnapshot());\n }\n ];\n },\n [getSnapshot, getServerSnapshot, selector, isEqual]\n );\n var value = useSyncExternalStore(subscribe, instRef[0], instRef[1]);\n useEffect(\n function () {\n inst.hasValue = !0;\n inst.value = value;\n },\n [value]\n );\n useDebugValue(value);\n return value;\n};\n","/**\n * @license React\n * use-sync-external-store-shim/with-selector.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function is(x, y) {\n return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n }\n \"undefined\" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&\n \"function\" ===\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart &&\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());\n var React = require(\"react\"),\n shim = require(\"use-sync-external-store/shim\"),\n objectIs = \"function\" === typeof Object.is ? Object.is : is,\n useSyncExternalStore = shim.useSyncExternalStore,\n useRef = React.useRef,\n useEffect = React.useEffect,\n useMemo = React.useMemo,\n useDebugValue = React.useDebugValue;\n exports.useSyncExternalStoreWithSelector = function (\n subscribe,\n getSnapshot,\n getServerSnapshot,\n selector,\n isEqual\n ) {\n var instRef = useRef(null);\n if (null === instRef.current) {\n var inst = { hasValue: !1, value: null };\n instRef.current = inst;\n } else inst = instRef.current;\n instRef = useMemo(\n function () {\n function memoizedSelector(nextSnapshot) {\n if (!hasMemo) {\n hasMemo = !0;\n memoizedSnapshot = nextSnapshot;\n nextSnapshot = selector(nextSnapshot);\n if (void 0 !== isEqual && inst.hasValue) {\n var currentSelection = inst.value;\n if (isEqual(currentSelection, nextSnapshot))\n return (memoizedSelection = currentSelection);\n }\n return (memoizedSelection = nextSnapshot);\n }\n currentSelection = memoizedSelection;\n if (objectIs(memoizedSnapshot, nextSnapshot))\n return currentSelection;\n var nextSelection = selector(nextSnapshot);\n if (void 0 !== isEqual && isEqual(currentSelection, nextSelection))\n return (memoizedSnapshot = nextSnapshot), currentSelection;\n memoizedSnapshot = nextSnapshot;\n return (memoizedSelection = nextSelection);\n }\n var hasMemo = !1,\n memoizedSnapshot,\n memoizedSelection,\n maybeGetServerSnapshot =\n void 0 === getServerSnapshot ? null : getServerSnapshot;\n return [\n function () {\n return memoizedSelector(getSnapshot());\n },\n null === maybeGetServerSnapshot\n ? void 0\n : function () {\n return memoizedSelector(maybeGetServerSnapshot());\n }\n ];\n },\n [getSnapshot, getServerSnapshot, selector, isEqual]\n );\n var value = useSyncExternalStore(subscribe, instRef[0], instRef[1]);\n useEffect(\n function () {\n inst.hasValue = !0;\n inst.value = value;\n },\n [value]\n );\n useDebugValue(value);\n return value;\n };\n \"undefined\" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&\n \"function\" ===\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error());\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('../cjs/use-sync-external-store-shim/with-selector.production.js');\n} else {\n module.exports = require('../cjs/use-sync-external-store-shim/with-selector.development.js');\n}\n","import { createStore } from 'zustand/vanilla';\nexport * from 'zustand/vanilla';\nimport ReactExports from 'react';\nimport useSyncExternalStoreExports from 'use-sync-external-store/shim/with-selector.js';\n\nconst { useDebugValue } = ReactExports;\nconst { useSyncExternalStoreWithSelector } = useSyncExternalStoreExports;\nlet didWarnAboutEqualityFn = false;\nconst identity = (arg) => arg;\nfunction useStore(api, selector = identity, equalityFn) {\n if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\" && equalityFn && !didWarnAboutEqualityFn) {\n console.warn(\n \"[DEPRECATED] Use `createWithEqualityFn` instead of `create` or use `useStoreWithEqualityFn` instead of `useStore`. They can be imported from 'zustand/traditional'. https://github.com/pmndrs/zustand/discussions/1937\"\n );\n didWarnAboutEqualityFn = true;\n }\n const slice = useSyncExternalStoreWithSelector(\n api.subscribe,\n api.getState,\n api.getServerState || api.getInitialState,\n selector,\n equalityFn\n );\n useDebugValue(slice);\n return slice;\n}\nconst createImpl = (createState) => {\n if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\" && typeof createState !== \"function\") {\n console.warn(\n \"[DEPRECATED] Passing a vanilla store will be unsupported in a future version. Instead use `import { useStore } from 'zustand'`.\"\n );\n }\n const api = typeof createState === \"function\" ? createStore(createState) : createState;\n const useBoundStore = (selector, equalityFn) => useStore(api, selector, equalityFn);\n Object.assign(useBoundStore, api);\n return useBoundStore;\n};\nconst create = (createState) => createState ? createImpl(createState) : createImpl;\nvar react = (createState) => {\n if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\") {\n console.warn(\n \"[DEPRECATED] Default export is deprecated. Instead use `import { create } from 'zustand'`.\"\n );\n }\n return create(createState);\n};\n\nexport { create, react as default, useStore };\n","import { create } from 'zustand'\nimport type { EidosState, ResourceEntry, ActionQueueItem } from './types'\n\nexport interface EidosStore extends EidosState {\n // Online\n setOnline: (online: boolean) => void\n // SW\n setSwStatus: (status: EidosState['swStatus'], error?: string) => void\n // Resources\n registerResource: (url: string, entry: ResourceEntry) => void\n updateResource: (url: string, update: Partial<ResourceEntry>) => void\n unregisterResource: (url: string) => void\n // Queue\n addQueueItem: (item: ActionQueueItem) => void\n updateQueueItem: (id: string, update: Partial<ActionQueueItem>) => void\n removeQueueItem: (id: string) => void\n hydrateQueue: (items: ActionQueueItem[]) => void\n}\n\nexport const useEidosStore = create<EidosStore>((set) => ({\n isOnline: typeof navigator !== 'undefined' ? navigator.onLine : true,\n swStatus: 'idle',\n swError: undefined,\n resources: {},\n queue: [],\n\n setOnline: (isOnline) => set({ isOnline }),\n\n setSwStatus: (swStatus, swError) => set({ swStatus, swError }),\n\n registerResource: (url, entry) =>\n set((s) => ({ resources: { ...s.resources, [url]: entry } })),\n\n updateResource: (url, update) =>\n set((s) => ({\n resources: {\n ...s.resources,\n [url]: s.resources[url] ? { ...s.resources[url], ...update } : s.resources[url],\n },\n })),\n\n unregisterResource: (url) =>\n set((s) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { [url]: _removed, ...rest } = s.resources\n return { resources: rest }\n }),\n\n addQueueItem: (item) => set((s) => ({ queue: [...s.queue, item] })),\n\n updateQueueItem: (id, update) =>\n set((s) => ({\n queue: s.queue.map((item) => (item.id === id ? { ...item, ...update } : item)),\n })),\n\n removeQueueItem: (id) => set((s) => ({ queue: s.queue.filter((item) => item.id !== id) })),\n\n hydrateQueue: (items) => set({ queue: items }),\n}))\n","import { useEidosStore } from './store'\n\nlet _registration: ServiceWorkerRegistration | null = null\n\nexport function getSwRegistration() {\n return _registration\n}\n\nexport async function registerServiceWorker(swPath: string): Promise<void> {\n if (typeof navigator === 'undefined' || !('serviceWorker' in navigator)) {\n useEidosStore.getState().setSwStatus('unsupported')\n return\n }\n\n const store = useEidosStore.getState()\n store.setSwStatus('registering')\n\n try {\n _registration = await navigator.serviceWorker.register(swPath, { scope: '/' })\n\n await waitForActivation(_registration)\n\n store.setSwStatus('active')\n\n // Receive messages from SW\n navigator.serviceWorker.addEventListener('message', onSwMessage)\n\n // Track online/offline\n window.addEventListener('online', () => store.setOnline(true))\n window.addEventListener('offline', () => store.setOnline(false))\n\n // resource() is called at module scope — before the SW is ready.\n // Re-send every registration now that the SW is active so it can\n // start intercepting fetches immediately.\n flushResourceRegistrations()\n } catch (err) {\n store.setSwStatus('error', String(err))\n }\n}\n\nfunction waitForActivation(reg: ServiceWorkerRegistration): Promise<void> {\n return new Promise((resolve) => {\n if (reg.active) { resolve(); return }\n const sw = reg.installing ?? reg.waiting\n if (!sw) { resolve(); return }\n sw.addEventListener('statechange', function handler() {\n if (sw.state === 'activated') {\n sw.removeEventListener('statechange', handler)\n resolve()\n }\n })\n })\n}\n\nexport function sendToWorker(message: Record<string, unknown>): void {\n const sw = _registration?.active\n if (sw) sw.postMessage(message)\n}\n\nfunction onSwMessage(event: MessageEvent): void {\n const data = event.data as { type: string; url?: string; strategy?: string }\n if (!data?.type) return\n\n const store = useEidosStore.getState()\n const { type, url } = data\n\n if (!url) return\n\n switch (type) {\n case 'EIDOS_CACHE_HIT': {\n const current = store.resources[url]\n store.updateResource(url, {\n status: 'fresh',\n lastEvent: 'cache-hit',\n cacheHits: (current?.cacheHits ?? 0) + 1,\n })\n break\n }\n case 'EIDOS_CACHE_UPDATED': {\n store.updateResource(url, {\n status: 'fresh',\n lastEvent: 'cache-updated',\n cachedAt: Date.now(),\n })\n break\n }\n case 'EIDOS_NETWORK_ERROR': {\n store.updateResource(url, {\n status: 'error',\n lastEvent: 'network-error',\n })\n break\n }\n }\n}\n\nexport function setOfflineSimulation(enabled: boolean): void {\n sendToWorker({ type: 'EIDOS_SIMULATE_OFFLINE', enabled })\n useEidosStore.getState().setOnline(!enabled)\n}\n\n// Sends EIDOS_REGISTER_RESOURCE for every resource already in the store.\n// Called once after the SW activates to handle the common case where\n// resource() is declared at module scope before the SW is ready.\nfunction flushResourceRegistrations(): void {\n const { resources } = useEidosStore.getState()\n Object.values(resources).forEach((entry) => {\n sendToWorker({\n type: 'EIDOS_REGISTER_RESOURCE',\n url: entry.url,\n strategy: entry.strategy.swStrategy,\n cacheName: entry.strategy.cacheName,\n })\n })\n}\n","import { useEidosStore } from './store'\nimport { sendToWorker } from './sw-bridge'\nimport type {\n ResourceConfig,\n ResourceHandle,\n ResourceEntry,\n GeneratedStrategy,\n CacheStrategy,\n} from './types'\n\nconst _registry = new Map<string, ResourceHandle>()\n\nexport function resource<T = unknown>(\n url: string,\n config: ResourceConfig,\n): ResourceHandle<T> {\n if (_registry.has(url)) return _registry.get(url) as ResourceHandle<T>\n\n const strategy = deriveStrategy(url, config)\n\n const entry: ResourceEntry = {\n url,\n config,\n strategy,\n status: 'idle',\n cacheHits: 0,\n cacheMisses: 0,\n }\n\n useEidosStore.getState().registerResource(url, entry)\n\n sendToWorker({\n type: 'EIDOS_REGISTER_RESOURCE',\n url,\n strategy: strategy.swStrategy,\n cacheName: strategy.cacheName,\n })\n\n const handle: ResourceHandle<T> = {\n url,\n config,\n strategy,\n\n fetch: async () => {\n const store = useEidosStore.getState()\n store.updateResource(url, { status: 'fetching', fetchedAt: Date.now() })\n\n try {\n // ── Direct Cache API check ─────────────────────────────────────\n // We read the cache in the main thread rather than waiting for\n // an async SW postMessage. This gives instant, reliable status\n // updates regardless of SW message timing.\n const cache = await caches.open(strategy.cacheName).catch(() => null)\n const cached = cache ? await cache.match(url).catch(() => null) : null\n\n if (cached) {\n const current = useEidosStore.getState().resources[url]\n store.updateResource(url, {\n status: 'fresh',\n lastEvent: 'cache-hit',\n cacheHits: (current?.cacheHits ?? 0) + 1,\n })\n\n // Background revalidation for SWR (stale-while-revalidate)\n if (strategy.swStrategy === 'stale-while-revalidate') {\n fetch(url)\n .then(async (resp) => {\n if (resp.ok && cache) {\n await cache.put(url, resp.clone())\n useEidosStore.getState().updateResource(url, {\n cachedAt: Date.now(),\n lastEvent: 'cache-updated',\n })\n }\n })\n .catch(() => {\n /* offline — cached version stays valid */\n })\n }\n\n return cached\n }\n\n // ── Cache miss: fetch from network ─────────────────────────────\n const current = useEidosStore.getState().resources[url]\n store.updateResource(url, {\n cacheMisses: (current?.cacheMisses ?? 0) + 1,\n })\n\n const response = await fetch(url)\n\n if (response.ok) {\n if (cache) await cache.put(url, response.clone())\n store.updateResource(url, {\n status: 'fresh',\n cachedAt: Date.now(),\n lastEvent: 'cache-updated',\n })\n return response\n }\n\n // Non-2xx response (e.g. 503 from offline SW) — update status and throw\n // so callers get a proper error instead of a plain-object body they can't use.\n store.updateResource(url, { status: response.status === 503 ? 'offline' : 'error' })\n\n // Check if the SW tagged this as an offline response\n const isOffline = response.headers.get('X-Eidos-Offline') === 'true'\n throw new Error(\n isOffline ? `offline: no cached response for ${url}` : `${response.status} ${response.statusText}`,\n )\n } catch (err) {\n // Network failure — try cache one more time as fallback\n const cache = await caches.open(strategy.cacheName).catch(() => null)\n const fallback = cache ? await cache.match(url).catch(() => null) : null\n\n if (fallback) {\n const current = useEidosStore.getState().resources[url]\n store.updateResource(url, {\n status: 'fresh',\n lastEvent: 'cache-hit',\n cacheHits: (current?.cacheHits ?? 0) + 1,\n })\n return fallback\n }\n\n store.updateResource(url, { status: 'error' })\n throw err\n }\n },\n\n json: async () => {\n const res = await handle.fetch()\n return res.json() as Promise<T>\n },\n\n query: () => ({\n queryKey: ['eidos', url] as [string, string],\n queryFn: () => handle.json(),\n }),\n\n prefetch: async () => {\n await handle.fetch()\n },\n\n invalidate: async () => {\n sendToWorker({ type: 'EIDOS_CLEAR_CACHE', url })\n const cache = await caches.open(strategy.cacheName).catch(() => null)\n if (cache) {\n const keys = await cache.keys()\n await Promise.all(\n keys.filter((r) => new URL(r.url).pathname === url).map((r) => cache.delete(r)),\n )\n }\n useEidosStore.getState().updateResource(url, {\n status: 'stale',\n cachedAt: undefined,\n lastEvent: 'cache-cleared',\n cacheHits: 0,\n cacheMisses: 0,\n })\n },\n }\n\n _registry.set(url, handle)\n return handle\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Strategy derivation — intent → deterministic caching strategy\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction deriveStrategy(url: string, config: ResourceConfig): GeneratedStrategy {\n const explicit = config.strategy\n if (config.offline) return buildStrategy(explicit ?? 'stale-while-revalidate', url)\n return buildStrategy(explicit ?? 'network-first', url)\n}\n\nconst STRATEGY_META: Record<CacheStrategy, Omit<GeneratedStrategy, 'swStrategy' | 'cacheName'>> = {\n 'stale-while-revalidate': {\n name: 'StaleWhileRevalidate',\n reasoning:\n 'offline: true signals resilience. SWR returns cached data instantly while revalidating in the background — the best tradeoff between speed and freshness for offline-capable resources.',\n behavior: [\n 'Cache hit → return immediately, kick off background revalidation',\n 'Cache miss → fetch from network, cache the response, return it',\n 'Offline → return cached version if available, 503 if not',\n 'Reconnect → next request triggers a background refresh',\n ],\n equivalentCode: `// Workbox equivalent\nnew StaleWhileRevalidate({\n cacheName: 'eidos-resources-v1',\n plugins: [new ExpirationPlugin({ maxEntries: 60 })],\n})`,\n },\n 'cache-first': {\n name: 'CacheFirst',\n reasoning:\n 'cache-first maximises speed and offline availability. Network is consulted only on cache miss. Best for static or infrequently-updated data.',\n behavior: [\n 'Cache hit → return immediately, no network request made',\n 'Cache miss → fetch from network, cache the response, return it',\n 'Offline → return cached version, 503 if cache is empty',\n 'Cache never expires unless explicitly invalidated',\n ],\n equivalentCode: `// Workbox equivalent\nnew CacheFirst({\n cacheName: 'eidos-resources-v1',\n plugins: [new ExpirationPlugin({ maxEntries: 60 })],\n})`,\n },\n 'network-first': {\n name: 'NetworkFirst',\n reasoning:\n 'network-first prioritises fresh data. Cache acts as a safety net when offline. Best for frequently-updated resources where stale data causes problems.',\n behavior: [\n 'Always try network first',\n 'Network success → update cache, return fresh response',\n 'Network failure → fall back to cached version',\n 'Offline with empty cache → return 503 error response',\n ],\n equivalentCode: `// Workbox equivalent\nnew NetworkFirst({\n cacheName: 'eidos-resources-v1',\n networkTimeoutSeconds: 3,\n})`,\n },\n}\n\nfunction buildStrategy(swStrategy: CacheStrategy, _url: string): GeneratedStrategy {\n return {\n ...STRATEGY_META[swStrategy],\n swStrategy,\n cacheName: 'eidos-resources-v1',\n }\n}\n","import type { ActionQueueItem } from './types'\n\nconst DB_NAME = 'eidos'\nconst DB_VERSION = 1\nconst QUEUE_STORE = 'action-queue'\n\nlet _db: IDBDatabase | null = null\n\nfunction openDB(): Promise<IDBDatabase> {\n if (_db) return Promise.resolve(_db)\n\n return new Promise((resolve, reject) => {\n const req = indexedDB.open(DB_NAME, DB_VERSION)\n\n req.onupgradeneeded = (event) => {\n const db = (event.target as IDBOpenDBRequest).result\n if (!db.objectStoreNames.contains(QUEUE_STORE)) {\n const store = db.createObjectStore(QUEUE_STORE, { keyPath: 'id' })\n store.createIndex('status', 'status', { unique: false })\n store.createIndex('actionId', 'actionId', { unique: false })\n }\n }\n\n req.onsuccess = () => {\n _db = req.result\n resolve(req.result)\n }\n\n req.onerror = () => reject(req.error)\n })\n}\n\nexport async function idbAddToQueue(item: ActionQueueItem): Promise<void> {\n const db = await openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(QUEUE_STORE, 'readwrite')\n tx.objectStore(QUEUE_STORE).add(item)\n tx.oncomplete = () => resolve()\n tx.onerror = () => reject(tx.error)\n })\n}\n\nexport async function idbGetQueue(): Promise<ActionQueueItem[]> {\n const db = await openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(QUEUE_STORE, 'readonly')\n const req = tx.objectStore(QUEUE_STORE).getAll()\n req.onsuccess = () => resolve(req.result as ActionQueueItem[])\n req.onerror = () => reject(req.error)\n })\n}\n\nexport async function idbUpdateQueueItem(\n id: string,\n update: Partial<ActionQueueItem>,\n): Promise<void> {\n const db = await openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(QUEUE_STORE, 'readwrite')\n const store = tx.objectStore(QUEUE_STORE)\n const get = store.get(id)\n get.onsuccess = () => {\n if (get.result) store.put({ ...get.result, ...update })\n }\n tx.oncomplete = () => resolve()\n tx.onerror = () => reject(tx.error)\n })\n}\n\nexport async function idbRemoveFromQueue(id: string): Promise<void> {\n const db = await openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(QUEUE_STORE, 'readwrite')\n tx.objectStore(QUEUE_STORE).delete(id)\n tx.oncomplete = () => resolve()\n tx.onerror = () => reject(tx.error)\n })\n}\n\nexport async function idbClearQueue(): Promise<void> {\n const db = await openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(QUEUE_STORE, 'readwrite')\n tx.objectStore(QUEUE_STORE).clear()\n tx.oncomplete = () => resolve()\n tx.onerror = () => reject(tx.error)\n })\n}\n","import { useEidosStore } from './store'\nimport {\n idbAddToQueue,\n idbGetQueue,\n idbUpdateQueueItem,\n idbRemoveFromQueue,\n} from './idb'\nimport type {\n ActionConfig,\n ActionHandle,\n ActionFn,\n ActionQueueItem,\n QueuedResult,\n} from './types'\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst _actionRegistry = new Map<string, ActionFn<any[], any>>()\n\nfunction uid() {\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 7)}`\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function action<TArgs extends any[], TReturn>(\n fn: ActionFn<TArgs, TReturn>,\n config: ActionConfig,\n): ActionHandle<TArgs, TReturn> {\n const actionId = config.name ?? fn.name ?? uid()\n\n // Registering here means the function is available for replay after\n // the user refreshes the page (actions are defined at module scope).\n _actionRegistry.set(actionId, fn as ActionFn<unknown[], unknown>)\n\n const wrapped = async (...args: TArgs): Promise<TReturn | QueuedResult> => {\n const { isOnline } = useEidosStore.getState()\n\n if (config.reliability === 'neverLose') {\n if (!isOnline) {\n return persistAndQueue(actionId, fn.name || actionId, args, config)\n }\n // Online + neverLose: execute, queue on failure\n try {\n return await fn(...args)\n } catch {\n return persistAndQueue(actionId, fn.name || actionId, args, config)\n }\n }\n\n // best-effort: execute directly, no queuing\n return fn(...args)\n }\n\n Object.defineProperty(wrapped, 'id', { value: actionId, writable: false })\n Object.defineProperty(wrapped, 'config', { value: config, writable: false })\n\n return wrapped as unknown as ActionHandle<TArgs, TReturn>\n}\n\nasync function persistAndQueue(\n actionId: string,\n actionName: string,\n args: unknown[],\n config: ActionConfig,\n): Promise<QueuedResult> {\n const id = uid()\n const item: ActionQueueItem = {\n id,\n actionId,\n actionName,\n args,\n queuedAt: Date.now(),\n retryCount: 0,\n maxRetries: config.maxRetries ?? 3,\n status: 'pending',\n }\n\n await idbAddToQueue(item)\n useEidosStore.getState().addQueueItem(item)\n\n return {\n queued: true,\n id,\n message: `\"${actionName}\" queued — will execute when online`,\n }\n}\n\nexport async function replayQueue(): Promise<void> {\n const store = useEidosStore.getState()\n if (!store.isOnline) return\n\n const queue = await idbGetQueue()\n const pending = queue.filter(\n (item) => item.status === 'pending' || item.status === 'failed',\n )\n\n for (const item of pending) {\n const fn = _actionRegistry.get(item.actionId)\n if (!fn) continue\n\n store.updateQueueItem(item.id, { status: 'replaying' })\n await idbUpdateQueueItem(item.id, { status: 'replaying' })\n\n try {\n await fn(...(item.args as unknown[]))\n const completedAt = Date.now()\n store.updateQueueItem(item.id, { status: 'succeeded', completedAt })\n await idbUpdateQueueItem(item.id, { status: 'succeeded', completedAt })\n\n // Remove from queue after a delay so the UI can show the success state\n setTimeout(() => {\n store.removeQueueItem(item.id)\n idbRemoveFromQueue(item.id)\n }, 3000)\n } catch (err) {\n const retryCount = item.retryCount + 1\n if (retryCount >= item.maxRetries) {\n store.updateQueueItem(item.id, {\n status: 'failed',\n error: String(err),\n retryCount,\n })\n await idbUpdateQueueItem(item.id, {\n status: 'failed',\n error: String(err),\n retryCount,\n })\n } else {\n store.updateQueueItem(item.id, { status: 'pending', retryCount })\n await idbUpdateQueueItem(item.id, { status: 'pending', retryCount })\n }\n }\n }\n}\n","import { registerServiceWorker } from './sw-bridge'\nimport { replayQueue } from './action'\nimport { useEidosStore } from './store'\nimport { idbGetQueue } from './idb'\n\nexport interface EidosConfig {\n /** Path to the eidos service worker. Defaults to '/eidos-sw.js'. */\n swPath?: string\n /** Automatically replay the action queue on reconnect. Default: true. */\n autoReplay?: boolean\n}\n\nlet _initialized = false\n\nexport async function initEidos(config: EidosConfig = {}): Promise<void> {\n if (_initialized) return\n _initialized = true\n\n const swPath = config.swPath ?? '/eidos-sw.js'\n const autoReplay = config.autoReplay ?? true\n\n // Restore persisted queue from IndexedDB on startup\n try {\n const persisted = await idbGetQueue()\n if (persisted.length > 0) {\n useEidosStore.getState().hydrateQueue(persisted)\n }\n } catch {\n // IndexedDB unavailable (Firefox private browsing) — silent fallback\n }\n\n try {\n await registerServiceWorker(swPath)\n } catch {\n // SW registration failed; app continues without offline support\n }\n\n if (autoReplay) {\n // ── Subscribe to the Zustand store instead of window.addEventListener('online')\n //\n // WHY: setOfflineSimulation() updates the store directly but never fires a\n // real browser `online` event. Watching the store means we catch both:\n // • Real network reconnects (sw-bridge updates store on window.online)\n // • Simulation toggled off (setOfflineSimulation(false) → store.setOnline(true))\n //\n let prevIsOnline = useEidosStore.getState().isOnline\n\n useEidosStore.subscribe((state) => {\n const justCameOnline = state.isOnline && !prevIsOnline\n prevIsOnline = state.isOnline\n\n if (justCameOnline) {\n // Small delay so the connection (or simulation reset) settles first\n setTimeout(replayQueue, 600)\n }\n })\n\n // Replay any pending items that survived a page reload\n const store = useEidosStore.getState()\n const hasPending = store.queue.some((q) => q.status === 'pending' || q.status === 'failed')\n if (store.isOnline && hasPending) {\n setTimeout(replayQueue, 1200)\n }\n }\n\n if (import.meta.env.DEV) {\n const store = useEidosStore.getState()\n console.groupCollapsed('%c⚡ Eidos', 'color:#38bdf8;font-weight:bold')\n console.log('SW path :', swPath)\n console.log('Auto-replay:', autoReplay)\n console.log('SW status :', store.swStatus)\n console.groupEnd()\n }\n}\n\nexport function _resetEidos() {\n _initialized = false\n}\n","import { useEffect, type ReactNode } from 'react'\nimport { initEidos, type EidosConfig } from '../runtime'\n\ninterface EidosProviderProps extends EidosConfig {\n children: ReactNode\n}\n\n/**\n * Mount once at the root of your application.\n * Registers the service worker and initialises the Eidos runtime.\n *\n * @example\n * <EidosProvider swPath=\"/eidos-sw.js\">\n * <App />\n * </EidosProvider>\n */\nexport function EidosProvider({ children, swPath, autoReplay }: EidosProviderProps) {\n useEffect(() => {\n initEidos({ swPath, autoReplay })\n // Run once on mount only\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n return <>{children}</>\n}\n","import { useEidosStore } from '../store'\n\n/** Full Eidos store — prefer the narrower hooks below for performance. */\nexport function useEidos() {\n return useEidosStore()\n}\n\n/** Live state for a single registered resource URL. */\nexport function useEidosResource(url: string) {\n return useEidosStore((s) => s.resources[url])\n}\n\n/** The current action queue. */\nexport function useEidosQueue() {\n return useEidosStore((s) => s.queue)\n}\n\n/** Online + SW status — cheap subscription, safe to use in header components. */\nexport function useEidosStatus() {\n return useEidosStore((s) => ({\n isOnline: s.isOnline,\n swStatus: s.swStatus,\n swError: s.swError,\n }))\n}\n"],"names":["__vite_import_meta_env__","useEffect","useDebugValue","shim","shimModule","require$$0","require$$1","withSelectorModule","ReactExports","current"],"mappings":";;;AAAA,MAAM,kBAAkB,CAAC,gBAAgB;AACvC,MAAI;AACJ,QAAM,gCAAgC,IAAA;AACtC,QAAM,WAAW,CAAC,SAAS,YAAY;AACrC,UAAM,YAAY,OAAO,YAAY,aAAa,QAAQ,KAAK,IAAI;AACnE,QAAI,CAAC,OAAO,GAAG,WAAW,KAAK,GAAG;AAChC,YAAM,gBAAgB;AACtB,eAAS,WAAW,OAAO,UAAU,OAAO,cAAc,YAAY,cAAc,QAAQ,YAAY,OAAO,OAAO,CAAA,GAAI,OAAO,SAAS;AAC1I,gBAAU,QAAQ,CAAC,aAAa,SAAS,OAAO,aAAa,CAAC;AAAA,IAChE;AAAA,EACF;AACA,QAAM,WAAW,MAAM;AACvB,QAAM,kBAAkB,MAAM;AAC9B,QAAM,YAAY,CAAC,aAAa;AAC9B,cAAU,IAAI,QAAQ;AACtB,WAAO,MAAM,UAAU,OAAO,QAAQ;AAAA,EACxC;AACA,QAAM,UAAU,MAAM;AACpB,SAAKA,6BAAkB,eAAuB,YAAY,cAAc;AACtE,cAAQ;AAAA,QACN;AAAA,MAAA;AAAA,IAEJ;AACA,cAAU,MAAA;AAAA,EACZ;AACA,QAAM,MAAM,EAAE,UAAU,UAAU,iBAAiB,WAAW,QAAA;AAC9D,QAAM,eAAe,QAAQ,YAAY,UAAU,UAAU,GAAG;AAChE,SAAO;AACT;AACA,MAAM,cAAc,CAAC,gBAAgB,cAAc,gBAAgB,WAAW,IAAI;;;;;;;;;;;;;;;;;;;;;AClBlF,MAAI,QAAQ;AACZ,WAAS,GAAG,GAAG,GAAG;AAChB,WAAQ,MAAM,MAAM,MAAM,KAAK,IAAI,MAAM,IAAI,MAAQ,MAAM,KAAK,MAAM;AAAA,EACxE;AACA,MAAI,WAAW,eAAe,OAAO,OAAO,KAAK,OAAO,KAAK,IAC3D,WAAW,MAAM,UACjBC,aAAY,MAAM,WAClB,kBAAkB,MAAM,iBACxBC,iBAAgB,MAAM;AACxB,WAAS,uBAAuB,WAAW,aAAa;AACtD,QAAI,QAAQ,YAAW,GACrB,YAAY,SAAS,EAAE,MAAM,EAAE,OAAc,YAAwB,GAAI,GACzE,OAAO,UAAU,CAAC,EAAE,MACpB,cAAc,UAAU,CAAC;AAC3B;AAAA,MACE,WAAY;AACV,aAAK,QAAQ;AACb,aAAK,cAAc;AACnB,+BAAuB,IAAI,KAAK,YAAY,EAAE,KAAU,CAAE;AAAA,MAChE;AAAA,MACI,CAAC,WAAW,OAAO,WAAW;AAAA,IAClC;AACE,IAAAD;AAAA,MACE,WAAY;AACV,+BAAuB,IAAI,KAAK,YAAY,EAAE,KAAU,CAAE;AAC1D,eAAO,UAAU,WAAY;AAC3B,iCAAuB,IAAI,KAAK,YAAY,EAAE,KAAU,CAAE;AAAA,QAClE,CAAO;AAAA,MACP;AAAA,MACI,CAAC,SAAS;AAAA,IACd;AACE,IAAAC,eAAc,KAAK;AACnB,WAAO;AAAA,EACT;AACA,WAAS,uBAAuB,MAAM;AACpC,QAAI,oBAAoB,KAAK;AAC7B,WAAO,KAAK;AACZ,QAAI;AACF,UAAI,YAAY,kBAAiB;AACjC,aAAO,CAAC,SAAS,MAAM,SAAS;AAAA,IACpC,SAAW,OAAO;AACd,aAAO;AAAA,IACX;AAAA,EACA;AACA,WAAS,uBAAuB,WAAW,aAAa;AACtD,WAAO,YAAW;AAAA,EACpB;AACA,MAAIC,QACF,gBAAgB,OAAO,UACvB,gBAAgB,OAAO,OAAO,YAC9B,gBAAgB,OAAO,OAAO,SAAS,gBACnC,yBACA;AACN,sCAAA,uBACE,WAAW,MAAM,uBAAuB,MAAM,uBAAuBA;;;;;;;;;;;;;;;;;ACtDvE,mBAAiB,QAAQ,IAAI,YAC1B,WAAY;AACX,aAAS,GAAG,GAAG,GAAG;AAChB,aAAQ,MAAM,MAAM,MAAM,KAAK,IAAI,MAAM,IAAI,MAAQ,MAAM,KAAK,MAAM;AAAA,IAC5E;AACI,aAAS,uBAAuB,WAAW,aAAa;AACtD,2BACE,WAAW,MAAM,oBACf,oBAAoB,MACtB,QAAQ;AAAA,QACN;AAAA,MACV;AACM,UAAI,QAAQ,YAAW;AACvB,UAAI,CAAC,4BAA4B;AAC/B,YAAI,cAAc,YAAW;AAC7B,iBAAS,OAAO,WAAW,MACxB,QAAQ;AAAA,UACP;AAAA,WAED,6BAA6B;AAAA,MACxC;AACM,oBAAc,SAAS;AAAA,QACrB,MAAM,EAAE,OAAc,YAAwB;AAAA,MACtD,CAAO;AACD,UAAI,OAAO,YAAY,CAAC,EAAE,MACxB,cAAc,YAAY,CAAC;AAC7B;AAAA,QACE,WAAY;AACV,eAAK,QAAQ;AACb,eAAK,cAAc;AACnB,iCAAuB,IAAI,KAAK,YAAY,EAAE,KAAU,CAAE;AAAA,QACpE;AAAA,QACQ,CAAC,WAAW,OAAO,WAAW;AAAA,MACtC;AACM,MAAAF;AAAA,QACE,WAAY;AACV,iCAAuB,IAAI,KAAK,YAAY,EAAE,KAAU,CAAE;AAC1D,iBAAO,UAAU,WAAY;AAC3B,mCAAuB,IAAI,KAAK,YAAY,EAAE,KAAU,CAAE;AAAA,UACtE,CAAW;AAAA,QACX;AAAA,QACQ,CAAC,SAAS;AAAA,MAClB;AACM,MAAAC,eAAc,KAAK;AACnB,aAAO;AAAA,IACb;AACI,aAAS,uBAAuB,MAAM;AACpC,UAAI,oBAAoB,KAAK;AAC7B,aAAO,KAAK;AACZ,UAAI;AACF,YAAI,YAAY,kBAAiB;AACjC,eAAO,CAAC,SAAS,MAAM,SAAS;AAAA,MACxC,SAAe,OAAO;AACd,eAAO;AAAA,MACf;AAAA,IACA;AACI,aAAS,uBAAuB,WAAW,aAAa;AACtD,aAAO,YAAW;AAAA,IACxB;AACI,oBAAgB,OAAO,kCACrB,eACE,OAAO,+BAA+B,+BACxC,+BAA+B,4BAA4B,OAAO;AACpE,QAAI,QAAQ,YACV,WAAW,eAAe,OAAO,OAAO,KAAK,OAAO,KAAK,IACzD,WAAW,MAAM,UACjBD,aAAY,MAAM,WAClB,kBAAkB,MAAM,iBACxBC,iBAAgB,MAAM,eACtB,oBAAoB,OACpB,6BAA6B,OAC7BC,QACE,gBAAgB,OAAO,UACvB,gBAAgB,OAAO,OAAO,YAC9B,gBAAgB,OAAO,OAAO,SAAS,gBACnC,yBACA;AACR,yCAAA,uBACE,WAAW,MAAM,uBAAuB,MAAM,uBAAuBA;AACvE,oBAAgB,OAAO,kCACrB,eACE,OAAO,+BAA+B,8BACxC,+BAA+B,2BAA2B,OAAO;AAAA,EACvE,EAAG;;;;;;;AC5FH,MAAI,QAAQ,IAAI,aAAa,cAAc;AACzCC,SAAA,UAAiBC,2CAAA;AAAA,EACnB,OAAO;AACLD,SAAA,UAAiBE,4CAAA;AAAA,EACnB;;;;;;;;;;;;;;;;ACKA,MAAI,QAAQ,YACVH,QAAOG,YAAA;AACT,WAAS,GAAG,GAAG,GAAG;AAChB,WAAQ,MAAM,MAAM,MAAM,KAAK,IAAI,MAAM,IAAI,MAAQ,MAAM,KAAK,MAAM;AAAA,EACxE;AACA,MAAI,WAAW,eAAe,OAAO,OAAO,KAAK,OAAO,KAAK,IAC3D,uBAAuBH,MAAK,sBAC5B,SAAS,MAAM,QACfF,aAAY,MAAM,WAClB,UAAU,MAAM,SAChBC,iBAAgB,MAAM;AACxB,0BAAA,mCAA2C,SACzC,WACA,aACA,mBACA,UACA,SACA;AACA,QAAI,UAAU,OAAO,IAAI;AACzB,QAAI,SAAS,QAAQ,SAAS;AAC5B,UAAI,OAAO,EAAE,UAAU,OAAI,OAAO,KAAI;AACtC,cAAQ,UAAU;AAAA,IACtB,MAAS,QAAO,QAAQ;AACtB,cAAU;AAAA,MACR,WAAY;AACV,iBAAS,iBAAiB,cAAc;AACtC,cAAI,CAAC,SAAS;AACZ,sBAAU;AACV,+BAAmB;AACnB,2BAAe,SAAS,YAAY;AACpC,gBAAI,WAAW,WAAW,KAAK,UAAU;AACvC,kBAAI,mBAAmB,KAAK;AAC5B,kBAAI,QAAQ,kBAAkB,YAAY;AACxC,uBAAQ,oBAAoB;AAAA,YAC1C;AACU,mBAAQ,oBAAoB;AAAA,UACtC;AACQ,6BAAmB;AACnB,cAAI,SAAS,kBAAkB,YAAY,EAAG,QAAO;AACrD,cAAI,gBAAgB,SAAS,YAAY;AACzC,cAAI,WAAW,WAAW,QAAQ,kBAAkB,aAAa;AAC/D,mBAAQ,mBAAmB,cAAe;AAC5C,6BAAmB;AACnB,iBAAQ,oBAAoB;AAAA,QACpC;AACM,YAAI,UAAU,OACZ,kBACA,mBACA,yBACE,WAAW,oBAAoB,OAAO;AAC1C,eAAO;AAAA,UACL,WAAY;AACV,mBAAO,iBAAiB,aAAa;AAAA,UAC/C;AAAA,UACQ,SAAS,yBACL,SACA,WAAY;AACV,mBAAO,iBAAiB,wBAAwB;AAAA,UAC9D;AAAA,QACA;AAAA,MACA;AAAA,MACI,CAAC,aAAa,mBAAmB,UAAU,OAAO;AAAA,IACtD;AACE,QAAI,QAAQ,qBAAqB,WAAW,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC;AAClE,IAAAD;AAAA,MACE,WAAY;AACV,aAAK,WAAW;AAChB,aAAK,QAAQ;AAAA,MACnB;AAAA,MACI,CAAC,KAAK;AAAA,IACV;AACE,IAAAC,eAAc,KAAK;AACnB,WAAO;AAAA,EACT;;;;;;;;;;;;;;;;;ACzEA,mBAAiB,QAAQ,IAAI,YAC1B,WAAY;AACX,aAAS,GAAG,GAAG,GAAG;AAChB,aAAQ,MAAM,MAAM,MAAM,KAAK,IAAI,MAAM,IAAI,MAAQ,MAAM,KAAK,MAAM;AAAA,IAC5E;AACI,oBAAgB,OAAO,kCACrB,eACE,OAAO,+BAA+B,+BACxC,+BAA+B,4BAA4B,OAAO;AACpE,QAAI,QAAQ,YACVC,QAAOG,YAAA,GACP,WAAW,eAAe,OAAO,OAAO,KAAK,OAAO,KAAK,IACzD,uBAAuBH,MAAK,sBAC5B,SAAS,MAAM,QACfF,aAAY,MAAM,WAClB,UAAU,MAAM,SAChBC,iBAAgB,MAAM;AACxB,gEAA2C,SACzC,WACA,aACA,mBACA,UACA,SACA;AACA,UAAI,UAAU,OAAO,IAAI;AACzB,UAAI,SAAS,QAAQ,SAAS;AAC5B,YAAI,OAAO,EAAE,UAAU,OAAI,OAAO,KAAI;AACtC,gBAAQ,UAAU;AAAA,MAC1B,MAAa,QAAO,QAAQ;AACtB,gBAAU;AAAA,QACR,WAAY;AACV,mBAAS,iBAAiB,cAAc;AACtC,gBAAI,CAAC,SAAS;AACZ,wBAAU;AACV,iCAAmB;AACnB,6BAAe,SAAS,YAAY;AACpC,kBAAI,WAAW,WAAW,KAAK,UAAU;AACvC,oBAAI,mBAAmB,KAAK;AAC5B,oBAAI,QAAQ,kBAAkB,YAAY;AACxC,yBAAQ,oBAAoB;AAAA,cAC9C;AACc,qBAAQ,oBAAoB;AAAA,YAC1C;AACY,+BAAmB;AACnB,gBAAI,SAAS,kBAAkB,YAAY;AACzC,qBAAO;AACT,gBAAI,gBAAgB,SAAS,YAAY;AACzC,gBAAI,WAAW,WAAW,QAAQ,kBAAkB,aAAa;AAC/D,qBAAQ,mBAAmB,cAAe;AAC5C,+BAAmB;AACnB,mBAAQ,oBAAoB;AAAA,UACxC;AACU,cAAI,UAAU,OACZ,kBACA,mBACA,yBACE,WAAW,oBAAoB,OAAO;AAC1C,iBAAO;AAAA,YACL,WAAY;AACV,qBAAO,iBAAiB,aAAa;AAAA,YACnD;AAAA,YACY,SAAS,yBACL,SACA,WAAY;AACV,qBAAO,iBAAiB,wBAAwB;AAAA,YAClE;AAAA,UACA;AAAA,QACA;AAAA,QACQ,CAAC,aAAa,mBAAmB,UAAU,OAAO;AAAA,MAC1D;AACM,UAAI,QAAQ,qBAAqB,WAAW,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC;AAClE,MAAAD;AAAA,QACE,WAAY;AACV,eAAK,WAAW;AAChB,eAAK,QAAQ;AAAA,QACvB;AAAA,QACQ,CAAC,KAAK;AAAA,MACd;AACM,MAAAC,eAAc,KAAK;AACnB,aAAO;AAAA,IACb;AACI,oBAAgB,OAAO,kCACrB,eACE,OAAO,+BAA+B,8BACxC,+BAA+B,2BAA2B,OAAO;AAAA,EACvE,EAAG;;;AC9FH,IAAI,QAAQ,IAAI,aAAa,cAAc;AACzCK,eAAA,UAAiBF,+BAAA;AACnB,OAAO;AACLE,eAAA,UAAiBD,gCAAA;AACnB;;;;ACDA,MAAM,EAAE,kBAAkBE;AAC1B,MAAM,EAAE,qCAAqC;AAC7C,IAAI,yBAAyB;AAC7B,MAAM,WAAW,CAAC,QAAQ;AAC1B,SAAS,SAAS,KAAK,WAAW,UAAU,YAAY;AACtD,OAAK,2BAAkB,eAAuB,YAAY,gBAAgB,cAAc,CAAC,wBAAwB;AAC/G,YAAQ;AAAA,MACN;AAAA,IAAA;AAEF,6BAAyB;AAAA,EAC3B;AACA,QAAM,QAAQ;AAAA,IACZ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI,kBAAkB,IAAI;AAAA,IAC1B;AAAA,IACA;AAAA,EAAA;AAEF,gBAAc,KAAK;AACnB,SAAO;AACT;AACA,MAAM,aAAa,CAAC,gBAAgB;AAClC,OAAK,2BAAkB,eAAuB,YAAY,gBAAgB,OAAO,gBAAgB,YAAY;AAC3G,YAAQ;AAAA,MACN;AAAA,IAAA;AAAA,EAEJ;AACA,QAAM,MAAM,OAAO,gBAAgB,aAAa,YAAY,WAAW,IAAI;AAC3E,QAAM,gBAAgB,CAAC,UAAU,eAAe,SAAS,KAAK,UAAU,UAAU;AAClF,SAAO,OAAO,eAAe,GAAG;AAChC,SAAO;AACT;AACA,MAAM,SAAS,CAAC,gBAAgB,cAAc,WAAW,WAAW,IAAI;AClBjE,MAAM,gBAAgB,OAAmB,CAAC,SAAS;AAAA,EACxD,UAAU,OAAO,cAAc,cAAc,UAAU,SAAS;AAAA,EAChE,UAAU;AAAA,EACV,SAAS;AAAA,EACT,WAAW,CAAA;AAAA,EACX,OAAO,CAAA;AAAA,EAEP,WAAW,CAAC,aAAa,IAAI,EAAE,UAAU;AAAA,EAEzC,aAAa,CAAC,UAAU,YAAY,IAAI,EAAE,UAAU,SAAS;AAAA,EAE7D,kBAAkB,CAAC,KAAK,UACtB,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,CAAC,GAAG,GAAG,MAAA,IAAU;AAAA,EAE9D,gBAAgB,CAAC,KAAK,WACpB,IAAI,CAAC,OAAO;AAAA,IACV,WAAW;AAAA,MACT,GAAG,EAAE;AAAA,MACL,CAAC,GAAG,GAAG,EAAE,UAAU,GAAG,IAAI,EAAE,GAAG,EAAE,UAAU,GAAG,GAAG,GAAG,WAAW,EAAE,UAAU,GAAG;AAAA,IAAA;AAAA,EAChF,EACA;AAAA,EAEJ,oBAAoB,CAAC,QACnB,IAAI,CAAC,MAAM;AAET,UAAM,EAAE,CAAC,GAAG,GAAG,UAAU,GAAG,KAAA,IAAS,EAAE;AACvC,WAAO,EAAE,WAAW,KAAA;AAAA,EACtB,CAAC;AAAA,EAEH,cAAc,CAAC,SAAS,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,IAAI,IAAI;AAAA,EAElE,iBAAiB,CAAC,IAAI,WACpB,IAAI,CAAC,OAAO;AAAA,IACV,OAAO,EAAE,MAAM,IAAI,CAAC,SAAU,KAAK,OAAO,KAAK,EAAE,GAAG,MAAM,GAAG,OAAA,IAAW,IAAK;AAAA,EAAA,EAC7E;AAAA,EAEJ,iBAAiB,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC,SAAS,KAAK,OAAO,EAAE,IAAI;AAAA,EAEzF,cAAc,CAAC,UAAU,IAAI,EAAE,OAAO,OAAO;AAC/C,EAAE;ACxDF,IAAI,gBAAkD;AAMtD,eAAsB,sBAAsB,QAA+B;AACzE,MAAI,OAAO,cAAc,eAAe,EAAE,mBAAmB,YAAY;AACvE,kBAAc,SAAA,EAAW,YAAY,aAAa;AAClD;AAAA,EACF;AAEA,QAAM,QAAQ,cAAc,SAAA;AAC5B,QAAM,YAAY,aAAa;AAE/B,MAAI;AACF,oBAAgB,MAAM,UAAU,cAAc,SAAS,QAAQ,EAAE,OAAO,KAAK;AAE7E,UAAM,kBAAkB,aAAa;AAErC,UAAM,YAAY,QAAQ;AAG1B,cAAU,cAAc,iBAAiB,WAAW,WAAW;AAG/D,WAAO,iBAAiB,UAAU,MAAM,MAAM,UAAU,IAAI,CAAC;AAC7D,WAAO,iBAAiB,WAAW,MAAM,MAAM,UAAU,KAAK,CAAC;AAK/D,+BAAA;AAAA,EACF,SAAS,KAAK;AACZ,UAAM,YAAY,SAAS,OAAO,GAAG,CAAC;AAAA,EACxC;AACF;AAEA,SAAS,kBAAkB,KAA+C;AACxE,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,QAAI,IAAI,QAAQ;AAAE,cAAA;AAAW;AAAA,IAAO;AACpC,UAAM,KAAK,IAAI,cAAc,IAAI;AACjC,QAAI,CAAC,IAAI;AAAE,cAAA;AAAW;AAAA,IAAO;AAC7B,OAAG,iBAAiB,eAAe,SAAS,UAAU;AACpD,UAAI,GAAG,UAAU,aAAa;AAC5B,WAAG,oBAAoB,eAAe,OAAO;AAC7C,gBAAA;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,aAAa,SAAwC;AACnE,QAAM,KAAK,+CAAe;AAC1B,MAAI,GAAI,IAAG,YAAY,OAAO;AAChC;AAEA,SAAS,YAAY,OAA2B;AAC9C,QAAM,OAAO,MAAM;AACnB,MAAI,EAAC,6BAAM,MAAM;AAEjB,QAAM,QAAQ,cAAc,SAAA;AAC5B,QAAM,EAAE,MAAM,IAAA,IAAQ;AAEtB,MAAI,CAAC,IAAK;AAEV,UAAQ,MAAA;AAAA,IACN,KAAK,mBAAmB;AACtB,YAAM,UAAU,MAAM,UAAU,GAAG;AACnC,YAAM,eAAe,KAAK;AAAA,QACxB,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,aAAY,mCAAS,cAAa,KAAK;AAAA,MAAA,CACxC;AACD;AAAA,IACF;AAAA,IACA,KAAK,uBAAuB;AAC1B,YAAM,eAAe,KAAK;AAAA,QACxB,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,UAAU,KAAK,IAAA;AAAA,MAAI,CACpB;AACD;AAAA,IACF;AAAA,IACA,KAAK,uBAAuB;AAC1B,YAAM,eAAe,KAAK;AAAA,QACxB,QAAQ;AAAA,QACR,WAAW;AAAA,MAAA,CACZ;AACD;AAAA,IACF;AAAA,EAAA;AAEJ;AAEO,SAAS,qBAAqB,SAAwB;AAC3D,eAAa,EAAE,MAAM,0BAA0B,QAAA,CAAS;AACxD,gBAAc,SAAA,EAAW,UAAU,CAAC,OAAO;AAC7C;AAKA,SAAS,6BAAmC;AAC1C,QAAM,EAAE,UAAA,IAAc,cAAc,SAAA;AACpC,SAAO,OAAO,SAAS,EAAE,QAAQ,CAAC,UAAU;AAC1C,iBAAa;AAAA,MACX,MAAM;AAAA,MACN,KAAK,MAAM;AAAA,MACX,UAAU,MAAM,SAAS;AAAA,MACzB,WAAW,MAAM,SAAS;AAAA,IAAA,CAC3B;AAAA,EACH,CAAC;AACH;ACxGA,MAAM,gCAAgB,IAAA;AAEf,SAAS,SACd,KACA,QACmB;AACnB,MAAI,UAAU,IAAI,GAAG,EAAG,QAAO,UAAU,IAAI,GAAG;AAEhD,QAAM,WAAW,eAAe,KAAK,MAAM;AAE3C,QAAM,QAAuB;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,aAAa;AAAA,EAAA;AAGf,gBAAc,SAAA,EAAW,iBAAiB,KAAK,KAAK;AAEpD,eAAa;AAAA,IACX,MAAM;AAAA,IACN;AAAA,IACA,UAAU,SAAS;AAAA,IACnB,WAAW,SAAS;AAAA,EAAA,CACrB;AAED,QAAM,SAA4B;AAAA,IAChC;AAAA,IACA;AAAA,IACA;AAAA,IAEA,OAAO,YAAY;AACjB,YAAM,QAAQ,cAAc,SAAA;AAC5B,YAAM,eAAe,KAAK,EAAE,QAAQ,YAAY,WAAW,KAAK,IAAA,GAAO;AAEvE,UAAI;AAKF,cAAM,QAAQ,MAAM,OAAO,KAAK,SAAS,SAAS,EAAE,MAAM,MAAM,IAAI;AACpE,cAAM,SAAS,QAAQ,MAAM,MAAM,MAAM,GAAG,EAAE,MAAM,MAAM,IAAI,IAAI;AAElE,YAAI,QAAQ;AACV,gBAAMC,WAAU,cAAc,SAAA,EAAW,UAAU,GAAG;AACtD,gBAAM,eAAe,KAAK;AAAA,YACxB,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,aAAYA,qCAAS,cAAa,KAAK;AAAA,UAAA,CACxC;AAGD,cAAI,SAAS,eAAe,0BAA0B;AACpD,kBAAM,GAAG,EACN,KAAK,OAAO,SAAS;AACpB,kBAAI,KAAK,MAAM,OAAO;AACpB,sBAAM,MAAM,IAAI,KAAK,KAAK,OAAO;AACjC,8BAAc,SAAA,EAAW,eAAe,KAAK;AAAA,kBAC3C,UAAU,KAAK,IAAA;AAAA,kBACf,WAAW;AAAA,gBAAA,CACZ;AAAA,cACH;AAAA,YACF,CAAC,EACA,MAAM,MAAM;AAAA,YAEb,CAAC;AAAA,UACL;AAEA,iBAAO;AAAA,QACT;AAGA,cAAM,UAAU,cAAc,SAAA,EAAW,UAAU,GAAG;AACtD,cAAM,eAAe,KAAK;AAAA,UACxB,eAAc,mCAAS,gBAAe,KAAK;AAAA,QAAA,CAC5C;AAED,cAAM,WAAW,MAAM,MAAM,GAAG;AAEhC,YAAI,SAAS,IAAI;AACf,cAAI,MAAO,OAAM,MAAM,IAAI,KAAK,SAAS,OAAO;AAChD,gBAAM,eAAe,KAAK;AAAA,YACxB,QAAQ;AAAA,YACR,UAAU,KAAK,IAAA;AAAA,YACf,WAAW;AAAA,UAAA,CACZ;AACD,iBAAO;AAAA,QACT;AAIA,cAAM,eAAe,KAAK,EAAE,QAAQ,SAAS,WAAW,MAAM,YAAY,SAAS;AAGnF,cAAM,YAAY,SAAS,QAAQ,IAAI,iBAAiB,MAAM;AAC9D,cAAM,IAAI;AAAA,UACR,YAAY,mCAAmC,GAAG,KAAK,GAAG,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,QAAA;AAAA,MAEpG,SAAS,KAAK;AAEZ,cAAM,QAAQ,MAAM,OAAO,KAAK,SAAS,SAAS,EAAE,MAAM,MAAM,IAAI;AACpE,cAAM,WAAW,QAAQ,MAAM,MAAM,MAAM,GAAG,EAAE,MAAM,MAAM,IAAI,IAAI;AAEpE,YAAI,UAAU;AACZ,gBAAM,UAAU,cAAc,SAAA,EAAW,UAAU,GAAG;AACtD,gBAAM,eAAe,KAAK;AAAA,YACxB,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,aAAY,mCAAS,cAAa,KAAK;AAAA,UAAA,CACxC;AACD,iBAAO;AAAA,QACT;AAEA,cAAM,eAAe,KAAK,EAAE,QAAQ,SAAS;AAC7C,cAAM;AAAA,MACR;AAAA,IACF;AAAA,IAEA,MAAM,YAAY;AAChB,YAAM,MAAM,MAAM,OAAO,MAAA;AACzB,aAAO,IAAI,KAAA;AAAA,IACb;AAAA,IAEA,OAAO,OAAO;AAAA,MACZ,UAAU,CAAC,SAAS,GAAG;AAAA,MACvB,SAAS,MAAM,OAAO,KAAA;AAAA,IAAK;AAAA,IAG7B,UAAU,YAAY;AACpB,YAAM,OAAO,MAAA;AAAA,IACf;AAAA,IAEA,YAAY,YAAY;AACtB,mBAAa,EAAE,MAAM,qBAAqB,IAAA,CAAK;AAC/C,YAAM,QAAQ,MAAM,OAAO,KAAK,SAAS,SAAS,EAAE,MAAM,MAAM,IAAI;AACpE,UAAI,OAAO;AACT,cAAM,OAAO,MAAM,MAAM,KAAA;AACzB,cAAM,QAAQ;AAAA,UACZ,KAAK,OAAO,CAAC,MAAM,IAAI,IAAI,EAAE,GAAG,EAAE,aAAa,GAAG,EAAE,IAAI,CAAC,MAAM,MAAM,OAAO,CAAC,CAAC;AAAA,QAAA;AAAA,MAElF;AACA,oBAAc,SAAA,EAAW,eAAe,KAAK;AAAA,QAC3C,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,WAAW;AAAA,QACX,WAAW;AAAA,QACX,aAAa;AAAA,MAAA,CACd;AAAA,IACH;AAAA,EAAA;AAGF,YAAU,IAAI,KAAK,MAAM;AACzB,SAAO;AACT;AAMA,SAAS,eAAe,KAAa,QAA2C;AAC9E,QAAM,WAAW,OAAO;AACxB,MAAI,OAAO,QAAS,QAAO,cAAc,YAAY,wBAA6B;AAClF,SAAO,cAAc,YAAY,eAAoB;AACvD;AAEA,MAAM,gBAA4F;AAAA,EAChG,0BAA0B;AAAA,IACxB,MAAM;AAAA,IACN,WACE;AAAA,IACF,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAAA,EAMlB,eAAe;AAAA,IACb,MAAM;AAAA,IACN,WACE;AAAA,IACF,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAAA,EAMlB,iBAAiB;AAAA,IACf,MAAM;AAAA,IACN,WACE;AAAA,IACF,UAAU;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAMpB;AAEA,SAAS,cAAc,YAA2B,MAAiC;AACjF,SAAO;AAAA,IACL,GAAG,cAAc,UAAU;AAAA,IAC3B;AAAA,IACA,WAAW;AAAA,EAAA;AAEf;ACxOA,MAAM,UAAU;AAChB,MAAM,aAAa;AACnB,MAAM,cAAc;AAEpB,IAAI,MAA0B;AAE9B,SAAS,SAA+B;AACtC,MAAI,IAAK,QAAO,QAAQ,QAAQ,GAAG;AAEnC,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,MAAM,UAAU,KAAK,SAAS,UAAU;AAE9C,QAAI,kBAAkB,CAAC,UAAU;AAC/B,YAAM,KAAM,MAAM,OAA4B;AAC9C,UAAI,CAAC,GAAG,iBAAiB,SAAS,WAAW,GAAG;AAC9C,cAAM,QAAQ,GAAG,kBAAkB,aAAa,EAAE,SAAS,MAAM;AACjE,cAAM,YAAY,UAAU,UAAU,EAAE,QAAQ,OAAO;AACvD,cAAM,YAAY,YAAY,YAAY,EAAE,QAAQ,OAAO;AAAA,MAC7D;AAAA,IACF;AAEA,QAAI,YAAY,MAAM;AACpB,YAAM,IAAI;AACV,cAAQ,IAAI,MAAM;AAAA,IACpB;AAEA,QAAI,UAAU,MAAM,OAAO,IAAI,KAAK;AAAA,EACtC,CAAC;AACH;AAEA,eAAsB,cAAc,MAAsC;AACxE,QAAM,KAAK,MAAM,OAAA;AACjB,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,KAAK,GAAG,YAAY,aAAa,WAAW;AAClD,OAAG,YAAY,WAAW,EAAE,IAAI,IAAI;AACpC,OAAG,aAAa,MAAM,QAAA;AACtB,OAAG,UAAU,MAAM,OAAO,GAAG,KAAK;AAAA,EACpC,CAAC;AACH;AAEA,eAAsB,cAA0C;AAC9D,QAAM,KAAK,MAAM,OAAA;AACjB,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,KAAK,GAAG,YAAY,aAAa,UAAU;AACjD,UAAM,MAAM,GAAG,YAAY,WAAW,EAAE,OAAA;AACxC,QAAI,YAAY,MAAM,QAAQ,IAAI,MAA2B;AAC7D,QAAI,UAAU,MAAM,OAAO,IAAI,KAAK;AAAA,EACtC,CAAC;AACH;AAEA,eAAsB,mBACpB,IACA,QACe;AACf,QAAM,KAAK,MAAM,OAAA;AACjB,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,KAAK,GAAG,YAAY,aAAa,WAAW;AAClD,UAAM,QAAQ,GAAG,YAAY,WAAW;AACxC,UAAM,MAAM,MAAM,IAAI,EAAE;AACxB,QAAI,YAAY,MAAM;AACpB,UAAI,IAAI,OAAQ,OAAM,IAAI,EAAE,GAAG,IAAI,QAAQ,GAAG,QAAQ;AAAA,IACxD;AACA,OAAG,aAAa,MAAM,QAAA;AACtB,OAAG,UAAU,MAAM,OAAO,GAAG,KAAK;AAAA,EACpC,CAAC;AACH;AAEA,eAAsB,mBAAmB,IAA2B;AAClE,QAAM,KAAK,MAAM,OAAA;AACjB,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,KAAK,GAAG,YAAY,aAAa,WAAW;AAClD,OAAG,YAAY,WAAW,EAAE,OAAO,EAAE;AACrC,OAAG,aAAa,MAAM,QAAA;AACtB,OAAG,UAAU,MAAM,OAAO,GAAG,KAAK;AAAA,EACpC,CAAC;AACH;AC7DA,MAAM,sCAAsB,IAAA;AAE5B,SAAS,MAAM;AACb,SAAO,GAAG,KAAK,IAAA,EAAM,SAAS,EAAE,CAAC,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAC7E;AAGO,SAAS,OACd,IACA,QAC8B;AAC9B,QAAM,WAAW,OAAO,QAAQ,GAAG,QAAQ,IAAA;AAI3C,kBAAgB,IAAI,UAAU,EAAkC;AAEhE,QAAM,UAAU,UAAU,SAAiD;AACzE,UAAM,EAAE,SAAA,IAAa,cAAc,SAAA;AAEnC,QAAI,OAAO,gBAAgB,aAAa;AACtC,UAAI,CAAC,UAAU;AACb,eAAO,gBAAgB,UAAU,GAAG,QAAQ,UAAU,MAAM,MAAM;AAAA,MACpE;AAEA,UAAI;AACF,eAAO,MAAM,GAAG,GAAG,IAAI;AAAA,MACzB,QAAQ;AACN,eAAO,gBAAgB,UAAU,GAAG,QAAQ,UAAU,MAAM,MAAM;AAAA,MACpE;AAAA,IACF;AAGA,WAAO,GAAG,GAAG,IAAI;AAAA,EACnB;AAEA,SAAO,eAAe,SAAS,MAAM,EAAE,OAAO,UAAU,UAAU,OAAO;AACzE,SAAO,eAAe,SAAS,UAAU,EAAE,OAAO,QAAQ,UAAU,OAAO;AAE3E,SAAO;AACT;AAEA,eAAe,gBACb,UACA,YACA,MACA,QACuB;AACvB,QAAM,KAAK,IAAA;AACX,QAAM,OAAwB;AAAA,IAC5B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU,KAAK,IAAA;AAAA,IACf,YAAY;AAAA,IACZ,YAAY,OAAO,cAAc;AAAA,IACjC,QAAQ;AAAA,EAAA;AAGV,QAAM,cAAc,IAAI;AACxB,gBAAc,SAAA,EAAW,aAAa,IAAI;AAE1C,SAAO;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,IACA,SAAS,IAAI,UAAU;AAAA,EAAA;AAE3B;AAEA,eAAsB,cAA6B;AACjD,QAAM,QAAQ,cAAc,SAAA;AAC5B,MAAI,CAAC,MAAM,SAAU;AAErB,QAAM,QAAQ,MAAM,YAAA;AACpB,QAAM,UAAU,MAAM;AAAA,IACpB,CAAC,SAAS,KAAK,WAAW,aAAa,KAAK,WAAW;AAAA,EAAA;AAGzD,aAAW,QAAQ,SAAS;AAC1B,UAAM,KAAK,gBAAgB,IAAI,KAAK,QAAQ;AAC5C,QAAI,CAAC,GAAI;AAET,UAAM,gBAAgB,KAAK,IAAI,EAAE,QAAQ,aAAa;AACtD,UAAM,mBAAmB,KAAK,IAAI,EAAE,QAAQ,aAAa;AAEzD,QAAI;AACF,YAAM,GAAG,GAAI,KAAK,IAAkB;AACpC,YAAM,cAAc,KAAK,IAAA;AACzB,YAAM,gBAAgB,KAAK,IAAI,EAAE,QAAQ,aAAa,aAAa;AACnE,YAAM,mBAAmB,KAAK,IAAI,EAAE,QAAQ,aAAa,aAAa;AAGtE,iBAAW,MAAM;AACf,cAAM,gBAAgB,KAAK,EAAE;AAC7B,2BAAmB,KAAK,EAAE;AAAA,MAC5B,GAAG,GAAI;AAAA,IACT,SAAS,KAAK;AACZ,YAAM,aAAa,KAAK,aAAa;AACrC,UAAI,cAAc,KAAK,YAAY;AACjC,cAAM,gBAAgB,KAAK,IAAI;AAAA,UAC7B,QAAQ;AAAA,UACR,OAAO,OAAO,GAAG;AAAA,UACjB;AAAA,QAAA,CACD;AACD,cAAM,mBAAmB,KAAK,IAAI;AAAA,UAChC,QAAQ;AAAA,UACR,OAAO,OAAO,GAAG;AAAA,UACjB;AAAA,QAAA,CACD;AAAA,MACH,OAAO;AACL,cAAM,gBAAgB,KAAK,IAAI,EAAE,QAAQ,WAAW,YAAY;AAChE,cAAM,mBAAmB,KAAK,IAAI,EAAE,QAAQ,WAAW,YAAY;AAAA,MACrE;AAAA,IACF;AAAA,EACF;AACF;ACxHA,IAAI,eAAe;AAEnB,eAAsB,UAAU,SAAsB,IAAmB;AACvE,MAAI,aAAc;AAClB,iBAAe;AAEf,QAAM,SAAS,OAAO,UAAU;AAChC,QAAM,aAAa,OAAO,cAAc;AAGxC,MAAI;AACF,UAAM,YAAY,MAAM,YAAA;AACxB,QAAI,UAAU,SAAS,GAAG;AACxB,oBAAc,SAAA,EAAW,aAAa,SAAS;AAAA,IACjD;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,MAAI;AACF,UAAM,sBAAsB,MAAM;AAAA,EACpC,QAAQ;AAAA,EAER;AAEA,MAAI,YAAY;AAQd,QAAI,eAAe,cAAc,SAAA,EAAW;AAE5C,kBAAc,UAAU,CAAC,UAAU;AACjC,YAAM,iBAAiB,MAAM,YAAY,CAAC;AAC1C,qBAAe,MAAM;AAErB,UAAI,gBAAgB;AAElB,mBAAW,aAAa,GAAG;AAAA,MAC7B;AAAA,IACF,CAAC;AAGD,UAAM,QAAQ,cAAc,SAAA;AAC5B,UAAM,aAAa,MAAM,MAAM,KAAK,CAAC,MAAM,EAAE,WAAW,aAAa,EAAE,WAAW,QAAQ;AAC1F,QAAI,MAAM,YAAY,YAAY;AAChC,iBAAW,aAAa,IAAI;AAAA,IAC9B;AAAA,EACF;AAUF;ACzDO,SAAS,cAAc,EAAE,UAAU,QAAQ,cAAkC;AAClF,YAAU,MAAM;AACd,cAAU,EAAE,QAAQ,YAAY;AAAA,EAGlC,GAAG,CAAA,CAAE;AAEL,yCAAU,UAAS;AACrB;ACrBO,SAAS,WAAW;AACzB,SAAO,cAAA;AACT;AAGO,SAAS,iBAAiB,KAAa;AAC5C,SAAO,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,CAAC;AAC9C;AAGO,SAAS,gBAAgB;AAC9B,SAAO,cAAc,CAAC,MAAM,EAAE,KAAK;AACrC;AAGO,SAAS,iBAAiB;AAC/B,SAAO,cAAc,CAAC,OAAO;AAAA,IAC3B,UAAU,EAAE;AAAA,IACZ,UAAU,EAAE;AAAA,IACZ,SAAS,EAAE;AAAA,EAAA,EACX;AACJ;","x_google_ignoreList":[0,1,2,3,4,5,6,7]}
|
|
1
|
+
{"version":3,"file":"eidos.es.js","sources":["../../../node_modules/.pnpm/zustand@4.5.7_@types+react@18.3.30_react@18.3.1/node_modules/zustand/esm/vanilla.mjs","../../../node_modules/.pnpm/use-sync-external-store@1.6.0_react@18.3.1/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js","../../../node_modules/.pnpm/use-sync-external-store@1.6.0_react@18.3.1/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js","../../../node_modules/.pnpm/use-sync-external-store@1.6.0_react@18.3.1/node_modules/use-sync-external-store/shim/index.js","../../../node_modules/.pnpm/use-sync-external-store@1.6.0_react@18.3.1/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.js","../../../node_modules/.pnpm/use-sync-external-store@1.6.0_react@18.3.1/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js","../../../node_modules/.pnpm/use-sync-external-store@1.6.0_react@18.3.1/node_modules/use-sync-external-store/shim/with-selector.js","../../../node_modules/.pnpm/zustand@4.5.7_@types+react@18.3.30_react@18.3.1/node_modules/zustand/esm/index.mjs","../src/store.ts","../src/sw-bridge.ts","../src/resource.ts","../src/idb.ts","../src/action.ts","../src/runtime.ts","../src/react/Provider.tsx","../src/react/hooks.ts"],"sourcesContent":["const createStoreImpl = (createState) => {\n let state;\n const listeners = /* @__PURE__ */ new Set();\n const setState = (partial, replace) => {\n const nextState = typeof partial === \"function\" ? partial(state) : partial;\n if (!Object.is(nextState, state)) {\n const previousState = state;\n state = (replace != null ? replace : typeof nextState !== \"object\" || nextState === null) ? nextState : Object.assign({}, state, nextState);\n listeners.forEach((listener) => listener(state, previousState));\n }\n };\n const getState = () => state;\n const getInitialState = () => initialState;\n const subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const destroy = () => {\n if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\") {\n console.warn(\n \"[DEPRECATED] The `destroy` method will be unsupported in a future version. Instead use unsubscribe function returned by subscribe. Everything will be garbage-collected if store is garbage-collected.\"\n );\n }\n listeners.clear();\n };\n const api = { setState, getState, getInitialState, subscribe, destroy };\n const initialState = state = createState(setState, getState, api);\n return api;\n};\nconst createStore = (createState) => createState ? createStoreImpl(createState) : createStoreImpl;\nvar vanilla = (createState) => {\n if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\") {\n console.warn(\n \"[DEPRECATED] Default export is deprecated. Instead use import { createStore } from 'zustand/vanilla'.\"\n );\n }\n return createStore(createState);\n};\n\nexport { createStore, vanilla as default };\n","/**\n * @license React\n * use-sync-external-store-shim.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar React = require(\"react\");\nfunction is(x, y) {\n return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n}\nvar objectIs = \"function\" === typeof Object.is ? Object.is : is,\n useState = React.useState,\n useEffect = React.useEffect,\n useLayoutEffect = React.useLayoutEffect,\n useDebugValue = React.useDebugValue;\nfunction useSyncExternalStore$2(subscribe, getSnapshot) {\n var value = getSnapshot(),\n _useState = useState({ inst: { value: value, getSnapshot: getSnapshot } }),\n inst = _useState[0].inst,\n forceUpdate = _useState[1];\n useLayoutEffect(\n function () {\n inst.value = value;\n inst.getSnapshot = getSnapshot;\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n },\n [subscribe, value, getSnapshot]\n );\n useEffect(\n function () {\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n return subscribe(function () {\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n });\n },\n [subscribe]\n );\n useDebugValue(value);\n return value;\n}\nfunction checkIfSnapshotChanged(inst) {\n var latestGetSnapshot = inst.getSnapshot;\n inst = inst.value;\n try {\n var nextValue = latestGetSnapshot();\n return !objectIs(inst, nextValue);\n } catch (error) {\n return !0;\n }\n}\nfunction useSyncExternalStore$1(subscribe, getSnapshot) {\n return getSnapshot();\n}\nvar shim =\n \"undefined\" === typeof window ||\n \"undefined\" === typeof window.document ||\n \"undefined\" === typeof window.document.createElement\n ? useSyncExternalStore$1\n : useSyncExternalStore$2;\nexports.useSyncExternalStore =\n void 0 !== React.useSyncExternalStore ? React.useSyncExternalStore : shim;\n","/**\n * @license React\n * use-sync-external-store-shim.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function is(x, y) {\n return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n }\n function useSyncExternalStore$2(subscribe, getSnapshot) {\n didWarnOld18Alpha ||\n void 0 === React.startTransition ||\n ((didWarnOld18Alpha = !0),\n console.error(\n \"You are using an outdated, pre-release alpha of React 18 that does not support useSyncExternalStore. The use-sync-external-store shim will not work correctly. Upgrade to a newer pre-release.\"\n ));\n var value = getSnapshot();\n if (!didWarnUncachedGetSnapshot) {\n var cachedValue = getSnapshot();\n objectIs(value, cachedValue) ||\n (console.error(\n \"The result of getSnapshot should be cached to avoid an infinite loop\"\n ),\n (didWarnUncachedGetSnapshot = !0));\n }\n cachedValue = useState({\n inst: { value: value, getSnapshot: getSnapshot }\n });\n var inst = cachedValue[0].inst,\n forceUpdate = cachedValue[1];\n useLayoutEffect(\n function () {\n inst.value = value;\n inst.getSnapshot = getSnapshot;\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n },\n [subscribe, value, getSnapshot]\n );\n useEffect(\n function () {\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n return subscribe(function () {\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n });\n },\n [subscribe]\n );\n useDebugValue(value);\n return value;\n }\n function checkIfSnapshotChanged(inst) {\n var latestGetSnapshot = inst.getSnapshot;\n inst = inst.value;\n try {\n var nextValue = latestGetSnapshot();\n return !objectIs(inst, nextValue);\n } catch (error) {\n return !0;\n }\n }\n function useSyncExternalStore$1(subscribe, getSnapshot) {\n return getSnapshot();\n }\n \"undefined\" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&\n \"function\" ===\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart &&\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());\n var React = require(\"react\"),\n objectIs = \"function\" === typeof Object.is ? Object.is : is,\n useState = React.useState,\n useEffect = React.useEffect,\n useLayoutEffect = React.useLayoutEffect,\n useDebugValue = React.useDebugValue,\n didWarnOld18Alpha = !1,\n didWarnUncachedGetSnapshot = !1,\n shim =\n \"undefined\" === typeof window ||\n \"undefined\" === typeof window.document ||\n \"undefined\" === typeof window.document.createElement\n ? useSyncExternalStore$1\n : useSyncExternalStore$2;\n exports.useSyncExternalStore =\n void 0 !== React.useSyncExternalStore ? React.useSyncExternalStore : shim;\n \"undefined\" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&\n \"function\" ===\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error());\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('../cjs/use-sync-external-store-shim.production.js');\n} else {\n module.exports = require('../cjs/use-sync-external-store-shim.development.js');\n}\n","/**\n * @license React\n * use-sync-external-store-shim/with-selector.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar React = require(\"react\"),\n shim = require(\"use-sync-external-store/shim\");\nfunction is(x, y) {\n return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n}\nvar objectIs = \"function\" === typeof Object.is ? Object.is : is,\n useSyncExternalStore = shim.useSyncExternalStore,\n useRef = React.useRef,\n useEffect = React.useEffect,\n useMemo = React.useMemo,\n useDebugValue = React.useDebugValue;\nexports.useSyncExternalStoreWithSelector = function (\n subscribe,\n getSnapshot,\n getServerSnapshot,\n selector,\n isEqual\n) {\n var instRef = useRef(null);\n if (null === instRef.current) {\n var inst = { hasValue: !1, value: null };\n instRef.current = inst;\n } else inst = instRef.current;\n instRef = useMemo(\n function () {\n function memoizedSelector(nextSnapshot) {\n if (!hasMemo) {\n hasMemo = !0;\n memoizedSnapshot = nextSnapshot;\n nextSnapshot = selector(nextSnapshot);\n if (void 0 !== isEqual && inst.hasValue) {\n var currentSelection = inst.value;\n if (isEqual(currentSelection, nextSnapshot))\n return (memoizedSelection = currentSelection);\n }\n return (memoizedSelection = nextSnapshot);\n }\n currentSelection = memoizedSelection;\n if (objectIs(memoizedSnapshot, nextSnapshot)) return currentSelection;\n var nextSelection = selector(nextSnapshot);\n if (void 0 !== isEqual && isEqual(currentSelection, nextSelection))\n return (memoizedSnapshot = nextSnapshot), currentSelection;\n memoizedSnapshot = nextSnapshot;\n return (memoizedSelection = nextSelection);\n }\n var hasMemo = !1,\n memoizedSnapshot,\n memoizedSelection,\n maybeGetServerSnapshot =\n void 0 === getServerSnapshot ? null : getServerSnapshot;\n return [\n function () {\n return memoizedSelector(getSnapshot());\n },\n null === maybeGetServerSnapshot\n ? void 0\n : function () {\n return memoizedSelector(maybeGetServerSnapshot());\n }\n ];\n },\n [getSnapshot, getServerSnapshot, selector, isEqual]\n );\n var value = useSyncExternalStore(subscribe, instRef[0], instRef[1]);\n useEffect(\n function () {\n inst.hasValue = !0;\n inst.value = value;\n },\n [value]\n );\n useDebugValue(value);\n return value;\n};\n","/**\n * @license React\n * use-sync-external-store-shim/with-selector.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function is(x, y) {\n return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n }\n \"undefined\" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&\n \"function\" ===\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart &&\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());\n var React = require(\"react\"),\n shim = require(\"use-sync-external-store/shim\"),\n objectIs = \"function\" === typeof Object.is ? Object.is : is,\n useSyncExternalStore = shim.useSyncExternalStore,\n useRef = React.useRef,\n useEffect = React.useEffect,\n useMemo = React.useMemo,\n useDebugValue = React.useDebugValue;\n exports.useSyncExternalStoreWithSelector = function (\n subscribe,\n getSnapshot,\n getServerSnapshot,\n selector,\n isEqual\n ) {\n var instRef = useRef(null);\n if (null === instRef.current) {\n var inst = { hasValue: !1, value: null };\n instRef.current = inst;\n } else inst = instRef.current;\n instRef = useMemo(\n function () {\n function memoizedSelector(nextSnapshot) {\n if (!hasMemo) {\n hasMemo = !0;\n memoizedSnapshot = nextSnapshot;\n nextSnapshot = selector(nextSnapshot);\n if (void 0 !== isEqual && inst.hasValue) {\n var currentSelection = inst.value;\n if (isEqual(currentSelection, nextSnapshot))\n return (memoizedSelection = currentSelection);\n }\n return (memoizedSelection = nextSnapshot);\n }\n currentSelection = memoizedSelection;\n if (objectIs(memoizedSnapshot, nextSnapshot))\n return currentSelection;\n var nextSelection = selector(nextSnapshot);\n if (void 0 !== isEqual && isEqual(currentSelection, nextSelection))\n return (memoizedSnapshot = nextSnapshot), currentSelection;\n memoizedSnapshot = nextSnapshot;\n return (memoizedSelection = nextSelection);\n }\n var hasMemo = !1,\n memoizedSnapshot,\n memoizedSelection,\n maybeGetServerSnapshot =\n void 0 === getServerSnapshot ? null : getServerSnapshot;\n return [\n function () {\n return memoizedSelector(getSnapshot());\n },\n null === maybeGetServerSnapshot\n ? void 0\n : function () {\n return memoizedSelector(maybeGetServerSnapshot());\n }\n ];\n },\n [getSnapshot, getServerSnapshot, selector, isEqual]\n );\n var value = useSyncExternalStore(subscribe, instRef[0], instRef[1]);\n useEffect(\n function () {\n inst.hasValue = !0;\n inst.value = value;\n },\n [value]\n );\n useDebugValue(value);\n return value;\n };\n \"undefined\" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&\n \"function\" ===\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&\n __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error());\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('../cjs/use-sync-external-store-shim/with-selector.production.js');\n} else {\n module.exports = require('../cjs/use-sync-external-store-shim/with-selector.development.js');\n}\n","import { createStore } from 'zustand/vanilla';\nexport * from 'zustand/vanilla';\nimport ReactExports from 'react';\nimport useSyncExternalStoreExports from 'use-sync-external-store/shim/with-selector.js';\n\nconst { useDebugValue } = ReactExports;\nconst { useSyncExternalStoreWithSelector } = useSyncExternalStoreExports;\nlet didWarnAboutEqualityFn = false;\nconst identity = (arg) => arg;\nfunction useStore(api, selector = identity, equalityFn) {\n if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\" && equalityFn && !didWarnAboutEqualityFn) {\n console.warn(\n \"[DEPRECATED] Use `createWithEqualityFn` instead of `create` or use `useStoreWithEqualityFn` instead of `useStore`. They can be imported from 'zustand/traditional'. https://github.com/pmndrs/zustand/discussions/1937\"\n );\n didWarnAboutEqualityFn = true;\n }\n const slice = useSyncExternalStoreWithSelector(\n api.subscribe,\n api.getState,\n api.getServerState || api.getInitialState,\n selector,\n equalityFn\n );\n useDebugValue(slice);\n return slice;\n}\nconst createImpl = (createState) => {\n if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\" && typeof createState !== \"function\") {\n console.warn(\n \"[DEPRECATED] Passing a vanilla store will be unsupported in a future version. Instead use `import { useStore } from 'zustand'`.\"\n );\n }\n const api = typeof createState === \"function\" ? createStore(createState) : createState;\n const useBoundStore = (selector, equalityFn) => useStore(api, selector, equalityFn);\n Object.assign(useBoundStore, api);\n return useBoundStore;\n};\nconst create = (createState) => createState ? createImpl(createState) : createImpl;\nvar react = (createState) => {\n if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\") {\n console.warn(\n \"[DEPRECATED] Default export is deprecated. Instead use `import { create } from 'zustand'`.\"\n );\n }\n return create(createState);\n};\n\nexport { create, react as default, useStore };\n","import { create } from 'zustand'\nimport type { EidosState, ResourceEntry, ActionQueueItem } from './types'\n\nexport interface EidosStore extends EidosState {\n // Online\n setOnline: (online: boolean) => void\n // SW\n setSwStatus: (status: EidosState['swStatus'], error?: string) => void\n // Resources\n registerResource: (url: string, entry: ResourceEntry) => void\n updateResource: (url: string, update: Partial<ResourceEntry>) => void\n unregisterResource: (url: string) => void\n // Queue\n addQueueItem: (item: ActionQueueItem) => void\n updateQueueItem: (id: string, update: Partial<ActionQueueItem>) => void\n removeQueueItem: (id: string) => void\n hydrateQueue: (items: ActionQueueItem[]) => void\n}\n\nexport const useEidosStore = create<EidosStore>((set) => ({\n isOnline: typeof navigator !== 'undefined' ? navigator.onLine : true,\n swStatus: 'idle',\n swError: undefined,\n resources: {},\n queue: [],\n\n setOnline: (isOnline) => set({ isOnline }),\n\n setSwStatus: (swStatus, swError) => set({ swStatus, swError }),\n\n registerResource: (url, entry) =>\n set((s) => ({ resources: { ...s.resources, [url]: entry } })),\n\n updateResource: (url, update) =>\n set((s) => ({\n resources: {\n ...s.resources,\n [url]: s.resources[url] ? { ...s.resources[url], ...update } : s.resources[url],\n },\n })),\n\n unregisterResource: (url) =>\n set((s) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { [url]: _removed, ...rest } = s.resources\n return { resources: rest }\n }),\n\n addQueueItem: (item) => set((s) => ({ queue: [...s.queue, item] })),\n\n updateQueueItem: (id, update) =>\n set((s) => ({\n queue: s.queue.map((item) => (item.id === id ? { ...item, ...update } : item)),\n })),\n\n removeQueueItem: (id) => set((s) => ({ queue: s.queue.filter((item) => item.id !== id) })),\n\n hydrateQueue: (items) => set({ queue: items }),\n}))\n","import { useEidosStore } from './store'\n\nlet _registration: ServiceWorkerRegistration | null = null\n\nexport function getSwRegistration() {\n return _registration\n}\n\nexport async function registerServiceWorker(swPath: string): Promise<void> {\n if (typeof navigator === 'undefined' || !('serviceWorker' in navigator)) {\n useEidosStore.getState().setSwStatus('unsupported')\n return\n }\n\n const store = useEidosStore.getState()\n store.setSwStatus('registering')\n\n try {\n _registration = await navigator.serviceWorker.register(swPath, { scope: '/' })\n\n await waitForActivation(_registration)\n\n store.setSwStatus('active')\n\n // Receive messages from SW\n navigator.serviceWorker.addEventListener('message', onSwMessage)\n\n // Track online/offline\n window.addEventListener('online', () => store.setOnline(true))\n window.addEventListener('offline', () => store.setOnline(false))\n\n // resource() is called at module scope — before the SW is ready.\n // Re-send every registration now that the SW is active so it can\n // start intercepting fetches immediately.\n flushResourceRegistrations()\n } catch (err) {\n store.setSwStatus('error', String(err))\n }\n}\n\nfunction waitForActivation(reg: ServiceWorkerRegistration): Promise<void> {\n return new Promise((resolve) => {\n if (reg.active) { resolve(); return }\n const sw = reg.installing ?? reg.waiting\n if (!sw) { resolve(); return }\n sw.addEventListener('statechange', function handler() {\n if (sw.state === 'activated') {\n sw.removeEventListener('statechange', handler)\n resolve()\n }\n })\n })\n}\n\nexport function sendToWorker(message: Record<string, unknown>): void {\n const sw = _registration?.active\n if (sw) sw.postMessage(message)\n}\n\nfunction onSwMessage(event: MessageEvent): void {\n const data = event.data as { type: string; url?: string; strategy?: string }\n if (!data?.type) return\n\n const store = useEidosStore.getState()\n const { type, url } = data\n\n if (!url) return\n\n switch (type) {\n case 'EIDOS_CACHE_HIT': {\n const current = store.resources[url]\n store.updateResource(url, {\n status: 'fresh',\n lastEvent: 'cache-hit',\n cacheHits: (current?.cacheHits ?? 0) + 1,\n })\n break\n }\n case 'EIDOS_CACHE_UPDATED': {\n store.updateResource(url, {\n status: 'fresh',\n lastEvent: 'cache-updated',\n cachedAt: Date.now(),\n })\n break\n }\n case 'EIDOS_NETWORK_ERROR': {\n store.updateResource(url, {\n status: 'error',\n lastEvent: 'network-error',\n })\n break\n }\n }\n}\n\nexport function setOfflineSimulation(enabled: boolean): void {\n sendToWorker({ type: 'EIDOS_SIMULATE_OFFLINE', enabled })\n useEidosStore.getState().setOnline(!enabled)\n}\n\n// Sends EIDOS_REGISTER_RESOURCE for every resource already in the store.\n// Called once after the SW activates to handle the common case where\n// resource() is declared at module scope before the SW is ready.\nfunction flushResourceRegistrations(): void {\n const { resources } = useEidosStore.getState()\n Object.values(resources).forEach((entry) => {\n sendToWorker({\n type: 'EIDOS_REGISTER_RESOURCE',\n url: entry.url,\n strategy: entry.strategy.swStrategy,\n cacheName: entry.strategy.cacheName,\n })\n })\n}\n","import { useEidosStore } from './store'\nimport { sendToWorker } from './sw-bridge'\nimport type {\n ResourceConfig,\n ResourceHandle,\n ResourceEntry,\n GeneratedStrategy,\n CacheStrategy,\n} from './types'\n\nconst _registry = new Map<string, ResourceHandle>()\n\nexport function resource<T = unknown>(\n url: string,\n config: ResourceConfig,\n): ResourceHandle<T> {\n if (_registry.has(url)) {\n if (import.meta.env.DEV) {\n const existing = _registry.get(url)!\n const existingCfg = existing.config\n if (\n existingCfg.offline !== config.offline ||\n existingCfg.strategy !== config.strategy ||\n existingCfg.cacheName !== config.cacheName\n ) {\n console.warn(\n `[eidos] resource('${url}') already registered with a different config — returning cached handle. Call resource.unregister() first to re-register.`,\n { registered: existingCfg, ignored: config },\n )\n }\n }\n return _registry.get(url) as ResourceHandle<T>\n }\n\n const strategy = deriveStrategy(url, config)\n\n const entry: ResourceEntry = {\n url,\n config,\n strategy,\n status: 'idle',\n cacheHits: 0,\n cacheMisses: 0,\n }\n\n useEidosStore.getState().registerResource(url, entry)\n\n sendToWorker({\n type: 'EIDOS_REGISTER_RESOURCE',\n url,\n strategy: strategy.swStrategy,\n cacheName: strategy.cacheName,\n })\n\n const handle: ResourceHandle<T> = {\n url,\n config,\n strategy,\n\n fetch: async () => {\n const store = useEidosStore.getState()\n store.updateResource(url, { status: 'fetching', fetchedAt: Date.now() })\n\n try {\n // ── Direct Cache API check ─────────────────────────────────────\n // We read the cache in the main thread rather than waiting for\n // an async SW postMessage. This gives instant, reliable status\n // updates regardless of SW message timing.\n const cache = await caches.open(strategy.cacheName).catch(() => null)\n const cached = cache ? await cache.match(url).catch(() => null) : null\n\n // Treat cache as miss if maxAge exceeded\n const current = useEidosStore.getState().resources[url]\n const expired =\n config.maxAge !== undefined &&\n current?.cachedAt !== undefined &&\n Date.now() - current.cachedAt > config.maxAge\n\n if (cached && !expired) {\n store.updateResource(url, {\n status: 'fresh',\n lastEvent: 'cache-hit',\n cacheHits: (current?.cacheHits ?? 0) + 1,\n })\n\n // Background revalidation for SWR (stale-while-revalidate)\n if (strategy.swStrategy === 'stale-while-revalidate') {\n fetch(url)\n .then(async (resp) => {\n if (resp.ok && cache) {\n await cache.put(url, resp.clone())\n useEidosStore.getState().updateResource(url, {\n cachedAt: Date.now(),\n lastEvent: 'cache-updated',\n })\n }\n })\n .catch(() => {\n /* offline — cached version stays valid */\n })\n }\n\n return cached\n }\n\n // ── Cache miss (or expired): fetch from network ────────────────\n const storeEntry = useEidosStore.getState().resources[url]\n store.updateResource(url, {\n cacheMisses: (storeEntry?.cacheMisses ?? 0) + 1,\n })\n\n const response = await fetch(url)\n\n if (response.ok) {\n if (cache) await cache.put(url, response.clone())\n store.updateResource(url, {\n status: 'fresh',\n cachedAt: Date.now(),\n lastEvent: 'cache-updated',\n })\n return response\n }\n\n // Non-2xx response (e.g. 503 from offline SW) — update status and throw\n // so callers get a proper error instead of a plain-object body they can't use.\n store.updateResource(url, { status: response.status === 503 ? 'offline' : 'error' })\n\n // Check if the SW tagged this as an offline response\n const isOffline = response.headers.get('X-Eidos-Offline') === 'true'\n throw new Error(\n isOffline ? `offline: no cached response for ${url}` : `${response.status} ${response.statusText}`,\n )\n } catch (err) {\n // Network failure — try cache one more time as fallback\n const cache = await caches.open(strategy.cacheName).catch(() => null)\n const fallback = cache ? await cache.match(url).catch(() => null) : null\n\n if (fallback) {\n const current = useEidosStore.getState().resources[url]\n store.updateResource(url, {\n status: 'fresh',\n lastEvent: 'cache-hit',\n cacheHits: (current?.cacheHits ?? 0) + 1,\n })\n return fallback\n }\n\n store.updateResource(url, { status: 'error' })\n throw err\n }\n },\n\n json: async () => {\n const res = await handle.fetch()\n return res.json() as Promise<T>\n },\n\n query: () => ({\n queryKey: ['eidos', url] as [string, string],\n queryFn: () => handle.json(),\n }),\n\n prefetch: async () => {\n await handle.fetch()\n },\n\n invalidate: async () => {\n sendToWorker({ type: 'EIDOS_CLEAR_CACHE', url })\n const cache = await caches.open(strategy.cacheName).catch(() => null)\n if (cache) {\n const keys = await cache.keys()\n await Promise.all(\n keys.filter((r) => new URL(r.url).pathname === url).map((r) => cache.delete(r)),\n )\n }\n useEidosStore.getState().updateResource(url, {\n status: 'stale',\n cachedAt: undefined,\n lastEvent: 'cache-cleared',\n cacheHits: 0,\n cacheMisses: 0,\n })\n },\n }\n\n _registry.set(url, handle)\n return handle\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Strategy derivation — intent → deterministic caching strategy\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction deriveStrategy(url: string, config: ResourceConfig): GeneratedStrategy {\n const explicit = config.strategy\n if (config.offline) return buildStrategy(explicit ?? 'stale-while-revalidate', url, config.cacheName)\n return buildStrategy(explicit ?? 'network-first', url, config.cacheName)\n}\n\nconst STRATEGY_META: Record<CacheStrategy, Omit<GeneratedStrategy, 'swStrategy' | 'cacheName'>> = {\n 'stale-while-revalidate': {\n name: 'StaleWhileRevalidate',\n reasoning:\n 'offline: true signals resilience. SWR returns cached data instantly while revalidating in the background — the best tradeoff between speed and freshness for offline-capable resources.',\n behavior: [\n 'Cache hit → return immediately, kick off background revalidation',\n 'Cache miss → fetch from network, cache the response, return it',\n 'Offline → return cached version if available, 503 if not',\n 'Reconnect → next request triggers a background refresh',\n ],\n equivalentCode: `// Workbox equivalent\nnew StaleWhileRevalidate({\n cacheName: 'eidos-resources-v1',\n plugins: [new ExpirationPlugin({ maxEntries: 60 })],\n})`,\n },\n 'cache-first': {\n name: 'CacheFirst',\n reasoning:\n 'cache-first maximises speed and offline availability. Network is consulted only on cache miss. Best for static or infrequently-updated data.',\n behavior: [\n 'Cache hit → return immediately, no network request made',\n 'Cache miss → fetch from network, cache the response, return it',\n 'Offline → return cached version, 503 if cache is empty',\n 'Cache never expires unless explicitly invalidated',\n ],\n equivalentCode: `// Workbox equivalent\nnew CacheFirst({\n cacheName: 'eidos-resources-v1',\n plugins: [new ExpirationPlugin({ maxEntries: 60 })],\n})`,\n },\n 'network-first': {\n name: 'NetworkFirst',\n reasoning:\n 'network-first prioritises fresh data. Cache acts as a safety net when offline. Best for frequently-updated resources where stale data causes problems.',\n behavior: [\n 'Always try network first',\n 'Network success → update cache, return fresh response',\n 'Network failure → fall back to cached version',\n 'Offline with empty cache → return 503 error response',\n ],\n equivalentCode: `// Workbox equivalent\nnew NetworkFirst({\n cacheName: 'eidos-resources-v1',\n networkTimeoutSeconds: 3,\n})`,\n },\n}\n\nfunction buildStrategy(swStrategy: CacheStrategy, _url: string, cacheName?: string): GeneratedStrategy {\n return {\n ...STRATEGY_META[swStrategy],\n swStrategy,\n cacheName: cacheName ?? 'eidos-resources-v1',\n }\n}\n","import type { ActionQueueItem } from './types'\n\nconst DB_NAME = 'eidos'\nconst DB_VERSION = 1\nconst QUEUE_STORE = 'action-queue'\n\nlet _db: IDBDatabase | null = null\n\nfunction openDB(): Promise<IDBDatabase> {\n if (_db) return Promise.resolve(_db)\n\n return new Promise((resolve, reject) => {\n const req = indexedDB.open(DB_NAME, DB_VERSION)\n\n req.onupgradeneeded = (event) => {\n const db = (event.target as IDBOpenDBRequest).result\n if (!db.objectStoreNames.contains(QUEUE_STORE)) {\n const store = db.createObjectStore(QUEUE_STORE, { keyPath: 'id' })\n store.createIndex('status', 'status', { unique: false })\n store.createIndex('actionId', 'actionId', { unique: false })\n }\n }\n\n req.onsuccess = () => {\n _db = req.result\n resolve(req.result)\n }\n\n req.onerror = () => reject(req.error)\n })\n}\n\nexport async function idbAddToQueue(item: ActionQueueItem): Promise<void> {\n const db = await openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(QUEUE_STORE, 'readwrite')\n tx.objectStore(QUEUE_STORE).add(item)\n tx.oncomplete = () => resolve()\n tx.onerror = () => reject(tx.error)\n })\n}\n\nexport async function idbGetQueue(): Promise<ActionQueueItem[]> {\n const db = await openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(QUEUE_STORE, 'readonly')\n const req = tx.objectStore(QUEUE_STORE).getAll()\n req.onsuccess = () => resolve(req.result as ActionQueueItem[])\n req.onerror = () => reject(req.error)\n })\n}\n\nexport async function idbUpdateQueueItem(\n id: string,\n update: Partial<ActionQueueItem>,\n): Promise<void> {\n const db = await openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(QUEUE_STORE, 'readwrite')\n const store = tx.objectStore(QUEUE_STORE)\n const get = store.get(id)\n get.onsuccess = () => {\n if (get.result) store.put({ ...get.result, ...update })\n }\n tx.oncomplete = () => resolve()\n tx.onerror = () => reject(tx.error)\n })\n}\n\nexport async function idbRemoveFromQueue(id: string): Promise<void> {\n const db = await openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(QUEUE_STORE, 'readwrite')\n tx.objectStore(QUEUE_STORE).delete(id)\n tx.oncomplete = () => resolve()\n tx.onerror = () => reject(tx.error)\n })\n}\n\nexport async function idbClearQueue(): Promise<void> {\n const db = await openDB()\n return new Promise((resolve, reject) => {\n const tx = db.transaction(QUEUE_STORE, 'readwrite')\n tx.objectStore(QUEUE_STORE).clear()\n tx.oncomplete = () => resolve()\n tx.onerror = () => reject(tx.error)\n })\n}\n","import { useEidosStore } from './store'\nimport {\n idbAddToQueue,\n idbGetQueue,\n idbUpdateQueueItem,\n idbRemoveFromQueue,\n} from './idb'\nimport type {\n ActionConfig,\n ActionHandle,\n ActionFn,\n ActionQueueItem,\n QueuedResult,\n} from './types'\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst _actionRegistry = new Map<string, ActionFn<any[], any>>()\n\nfunction uid() {\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 7)}`\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function action<TArgs extends any[], TReturn>(\n fn: ActionFn<TArgs, TReturn>,\n config: ActionConfig,\n): ActionHandle<TArgs, TReturn> {\n const actionId = config.name ?? fn.name ?? uid()\n\n // Registering here means the function is available for replay after\n // the user refreshes the page (actions are defined at module scope).\n _actionRegistry.set(actionId, fn as ActionFn<unknown[], unknown>)\n\n const wrapped = async (...args: TArgs): Promise<TReturn | QueuedResult> => {\n const { isOnline } = useEidosStore.getState()\n\n if (config.reliability === 'neverLose') {\n if (!isOnline) {\n return persistAndQueue(actionId, fn.name || actionId, args, config)\n }\n // Online + neverLose: execute, queue on failure\n try {\n return await fn(...args)\n } catch {\n return persistAndQueue(actionId, fn.name || actionId, args, config)\n }\n }\n\n // best-effort: execute directly, no queuing\n return fn(...args)\n }\n\n Object.defineProperty(wrapped, 'id', { value: actionId, writable: false })\n Object.defineProperty(wrapped, 'config', { value: config, writable: false })\n\n return wrapped as unknown as ActionHandle<TArgs, TReturn>\n}\n\nfunction isJsonSerializable(value: unknown): boolean {\n try {\n JSON.stringify(value)\n return true\n } catch {\n return false\n }\n}\n\nasync function persistAndQueue(\n actionId: string,\n actionName: string,\n args: unknown[],\n config: ActionConfig,\n): Promise<QueuedResult> {\n if (import.meta.env.DEV && !isJsonSerializable(args)) {\n console.warn(\n `[eidos] action \"${actionName}\" queued with non-JSON-serializable args. These args will be lost after a page reload. Use plain JSON values for neverLose actions.`,\n args,\n )\n }\n\n const id = uid()\n const item: ActionQueueItem = {\n id,\n actionId,\n actionName,\n args,\n queuedAt: Date.now(),\n retryCount: 0,\n maxRetries: config.maxRetries ?? 3,\n status: 'pending',\n }\n\n await idbAddToQueue(item)\n useEidosStore.getState().addQueueItem(item)\n\n return {\n queued: true,\n id,\n message: `\"${actionName}\" queued — will execute when online`,\n }\n}\n\n// Base delay 2s, doubles per retry, capped at 5 minutes, ±20% jitter\nfunction backoffMs(retryCount: number): number {\n const base = Math.min(2000 * 2 ** retryCount, 300_000)\n return base * (0.8 + Math.random() * 0.4)\n}\n\nexport async function replayQueue(): Promise<void> {\n const store = useEidosStore.getState()\n if (!store.isOnline) return\n\n const queue = await idbGetQueue()\n const now = Date.now()\n const pending = queue.filter(\n (item) =>\n (item.status === 'pending' || item.status === 'failed') &&\n (!item.nextRetryAt || item.nextRetryAt <= now),\n )\n\n for (const item of pending) {\n const fn = _actionRegistry.get(item.actionId)\n if (!fn) continue\n\n store.updateQueueItem(item.id, { status: 'replaying' })\n await idbUpdateQueueItem(item.id, { status: 'replaying' })\n\n try {\n await fn(...(item.args as unknown[]))\n const completedAt = Date.now()\n store.updateQueueItem(item.id, { status: 'succeeded', completedAt })\n await idbUpdateQueueItem(item.id, { status: 'succeeded', completedAt })\n\n // Remove from queue after a delay so the UI can show the success state\n setTimeout(() => {\n store.removeQueueItem(item.id)\n idbRemoveFromQueue(item.id)\n }, 3000)\n } catch (err) {\n const retryCount = item.retryCount + 1\n if (retryCount >= item.maxRetries) {\n store.updateQueueItem(item.id, {\n status: 'failed',\n error: String(err),\n retryCount,\n })\n await idbUpdateQueueItem(item.id, {\n status: 'failed',\n error: String(err),\n retryCount,\n })\n } else {\n const nextRetryAt = Date.now() + backoffMs(retryCount)\n store.updateQueueItem(item.id, { status: 'pending', retryCount, nextRetryAt })\n await idbUpdateQueueItem(item.id, { status: 'pending', retryCount, nextRetryAt })\n }\n }\n }\n}\n","import { registerServiceWorker } from './sw-bridge'\nimport { replayQueue } from './action'\nimport { useEidosStore } from './store'\nimport { idbGetQueue } from './idb'\n\nexport interface EidosConfig {\n /** Path to the eidos service worker. Defaults to '/eidos-sw.js'. */\n swPath?: string\n /** Automatically replay the action queue on reconnect. Default: true. */\n autoReplay?: boolean\n}\n\nlet _initialized = false\n\nexport async function initEidos(config: EidosConfig = {}): Promise<void> {\n if (_initialized) return\n _initialized = true\n\n const swPath = config.swPath ?? '/eidos-sw.js'\n const autoReplay = config.autoReplay ?? true\n\n // Restore persisted queue from IndexedDB on startup\n try {\n const persisted = await idbGetQueue()\n if (persisted.length > 0) {\n useEidosStore.getState().hydrateQueue(persisted)\n }\n } catch {\n // IndexedDB unavailable (Firefox private browsing) — silent fallback\n }\n\n try {\n await registerServiceWorker(swPath)\n } catch {\n // SW registration failed; app continues without offline support\n }\n\n if (autoReplay) {\n // ── Subscribe to the Zustand store instead of window.addEventListener('online')\n //\n // WHY: setOfflineSimulation() updates the store directly but never fires a\n // real browser `online` event. Watching the store means we catch both:\n // • Real network reconnects (sw-bridge updates store on window.online)\n // • Simulation toggled off (setOfflineSimulation(false) → store.setOnline(true))\n //\n let prevIsOnline = useEidosStore.getState().isOnline\n\n useEidosStore.subscribe((state) => {\n const justCameOnline = state.isOnline && !prevIsOnline\n prevIsOnline = state.isOnline\n\n if (justCameOnline) {\n // Small delay so the connection (or simulation reset) settles first\n setTimeout(replayQueue, 600)\n }\n })\n\n // Replay any pending items that survived a page reload\n const store = useEidosStore.getState()\n const hasPending = store.queue.some((q) => q.status === 'pending' || q.status === 'failed')\n if (store.isOnline && hasPending) {\n setTimeout(replayQueue, 1200)\n }\n }\n\n if (import.meta.env.DEV) {\n const store = useEidosStore.getState()\n console.groupCollapsed('%c⚡ Eidos', 'color:#38bdf8;font-weight:bold')\n console.log('SW path :', swPath)\n console.log('Auto-replay:', autoReplay)\n console.log('SW status :', store.swStatus)\n console.groupEnd()\n }\n}\n\nexport function _resetEidos() {\n _initialized = false\n}\n","import { useEffect, type ReactNode } from 'react'\nimport { initEidos, type EidosConfig } from '../runtime'\n\ninterface EidosProviderProps extends EidosConfig {\n children: ReactNode\n}\n\n/**\n * Mount once at the root of your application.\n * Registers the service worker and initialises the Eidos runtime.\n *\n * @example\n * <EidosProvider swPath=\"/eidos-sw.js\">\n * <App />\n * </EidosProvider>\n */\nexport function EidosProvider({ children, swPath, autoReplay }: EidosProviderProps) {\n useEffect(() => {\n initEidos({ swPath, autoReplay })\n // Run once on mount only\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n return <>{children}</>\n}\n","import { useEidosStore } from '../store'\n\n/** Full Eidos store — prefer the narrower hooks below for performance. */\nexport function useEidos() {\n return useEidosStore()\n}\n\n/** Live state for a single registered resource URL. */\nexport function useEidosResource(url: string) {\n return useEidosStore((s) => s.resources[url])\n}\n\n/** The current action queue. */\nexport function useEidosQueue() {\n return useEidosStore((s) => s.queue)\n}\n\n/** Online + SW status — cheap subscription, safe to use in header components. */\nexport function useEidosStatus() {\n return useEidosStore((s) => ({\n isOnline: s.isOnline,\n swStatus: s.swStatus,\n swError: s.swError,\n }))\n}\n"],"names":["__vite_import_meta_env__","useEffect","useDebugValue","shim","shimModule","require$$0","require$$1","withSelectorModule","ReactExports"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7]}
|
package/dist/index.d.ts
CHANGED
|
@@ -37,6 +37,8 @@ export declare interface ActionQueueItem {
|
|
|
37
37
|
status: 'pending' | 'replaying' | 'succeeded' | 'failed';
|
|
38
38
|
error?: string;
|
|
39
39
|
completedAt?: number;
|
|
40
|
+
/** Earliest timestamp at which this item should be retried (exponential backoff). */
|
|
41
|
+
nextRetryAt?: number;
|
|
40
42
|
}
|
|
41
43
|
|
|
42
44
|
export declare type CacheStrategy = 'cache-first' | 'stale-while-revalidate' | 'network-first';
|
|
@@ -114,6 +116,8 @@ export declare interface ResourceConfig {
|
|
|
114
116
|
strategy?: CacheStrategy;
|
|
115
117
|
/** Custom cache bucket name. Defaults to 'eidos-resources-v1'. */
|
|
116
118
|
cacheName?: string;
|
|
119
|
+
/** Max age of cached response in milliseconds. Expired entries trigger a network fetch. */
|
|
120
|
+
maxAge?: number;
|
|
117
121
|
}
|
|
118
122
|
|
|
119
123
|
export declare interface ResourceEntry {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sweidos/eidos",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Describe intent. The runtime figures out how. An abstraction layer for offline-first web apps.",
|
|
5
5
|
"author": "Aditya Raj",
|
|
6
6
|
"license": "MIT",
|
|
@@ -38,12 +38,6 @@
|
|
|
38
38
|
"dist",
|
|
39
39
|
"README.md"
|
|
40
40
|
],
|
|
41
|
-
"scripts": {
|
|
42
|
-
"build": "vite build && node scripts/copy-sw.mjs",
|
|
43
|
-
"dev": "vite build --watch",
|
|
44
|
-
"type-check": "tsc --noEmit",
|
|
45
|
-
"prepublishOnly": "pnpm build"
|
|
46
|
-
},
|
|
47
41
|
"peerDependencies": {
|
|
48
42
|
"react": ">=18.0.0",
|
|
49
43
|
"react-dom": ">=18.0.0"
|
|
@@ -58,5 +52,10 @@
|
|
|
58
52
|
"typescript": "^5.4.5",
|
|
59
53
|
"vite": "^5.3.1",
|
|
60
54
|
"vite-plugin-dts": "^3.9.1"
|
|
55
|
+
},
|
|
56
|
+
"scripts": {
|
|
57
|
+
"build": "vite build && node scripts/copy-sw.mjs",
|
|
58
|
+
"dev": "vite build --watch",
|
|
59
|
+
"type-check": "tsc --noEmit"
|
|
61
60
|
}
|
|
62
|
-
}
|
|
61
|
+
}
|