@sweidos/eidos 1.0.34 → 1.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.
Files changed (53) hide show
  1. package/README.md +171 -89
  2. package/dist/action.js +197 -91
  3. package/dist/async-storage-adapter.js +15 -12
  4. package/dist/cli.js +102 -0
  5. package/dist/devtools.js +1009 -551
  6. package/dist/eidos-sw.js +280 -188
  7. package/dist/eidos.cjs +15 -0
  8. package/dist/idb.js +59 -56
  9. package/dist/index.d.ts +135 -18
  10. package/dist/index.js +46 -42
  11. package/dist/nextjs.js +1 -10
  12. package/dist/push.cjs +120 -0
  13. package/dist/push.d.ts +28 -0
  14. package/dist/push.js +113 -0
  15. package/dist/query.cjs +131 -0
  16. package/dist/query.js +121 -41
  17. package/dist/queue-storage.js +5 -4
  18. package/dist/react/Devtools.d.ts +1 -1
  19. package/dist/react/Provider.js +11 -7
  20. package/dist/react/hooks.js +48 -38
  21. package/dist/react-native.js +47 -53
  22. package/dist/replay.js +15 -0
  23. package/dist/resource.js +77 -79
  24. package/dist/runtime.js +39 -28
  25. package/dist/store-slices.js +43 -0
  26. package/dist/store.js +32 -49
  27. package/dist/stores.js +25 -22
  28. package/dist/sveltekit.js +22 -6
  29. package/dist/sw-bridge.js +64 -49
  30. package/dist/testing.cjs +165 -0
  31. package/dist/testing.js +140 -70
  32. package/dist/version.js +4 -3
  33. package/dist/vite.cjs +48 -0
  34. package/dist/vite.js +45 -29
  35. package/package.json +57 -28
  36. package/dist/action.js.map +0 -1
  37. package/dist/async-storage-adapter.js.map +0 -1
  38. package/dist/eidos.cjs.js +0 -14
  39. package/dist/eidos.cjs.js.map +0 -1
  40. package/dist/idb.js.map +0 -1
  41. package/dist/index.js.map +0 -1
  42. package/dist/query.cjs.js +0 -48
  43. package/dist/queue-storage.js.map +0 -1
  44. package/dist/react/Provider.js.map +0 -1
  45. package/dist/react/hooks.js.map +0 -1
  46. package/dist/resource.js.map +0 -1
  47. package/dist/runtime.js.map +0 -1
  48. package/dist/store.js.map +0 -1
  49. package/dist/stores.js.map +0 -1
  50. package/dist/sw-bridge.js.map +0 -1
  51. package/dist/testing.cjs.js +0 -86
  52. package/dist/version.js.map +0 -1
  53. package/dist/vite.cjs.js +0 -31
package/dist/replay.js ADDED
@@ -0,0 +1,15 @@
1
+ import { useEidosStore as t } from "./store.js";
2
+ import { replayQueue as i } from "./action.js";
3
+ function l() {
4
+ let n = t.getState().isOnline;
5
+ const o = t.subscribe(() => {
6
+ const { isOnline: e } = t.getState(), r = e && !n;
7
+ n = e, r && setTimeout(i, 600);
8
+ }), s = t.getState(), u = s.queue.some((e) => e.status === "pending");
9
+ return s.isOnline && u && setTimeout(i, 1200), o;
10
+ }
11
+ export {
12
+ l as subscribeReplayOnReconnect
13
+ };
14
+
15
+ //# sourceMappingURL=replay.js.map
package/dist/resource.js CHANGED
@@ -1,25 +1,21 @@
1
1
  import { useEidosStore as h } from "./store.js";
2
- import { sendToWorker as g } from "./sw-bridge.js";
3
- const p = /* @__PURE__ */ new Map(), v = /* @__PURE__ */ new Map();
4
- let m = null;
5
- function q(e) {
6
- m = e;
2
+ import { sendToWorker as v } from "./sw-bridge.js";
3
+ var p = /* @__PURE__ */ new Map(), m = /* @__PURE__ */ new Map(), E = null;
4
+ function N(e) {
5
+ E = e;
7
6
  }
8
- function l(e) {
7
+ function d(e) {
9
8
  return e.includes("*") || /:[^/]+/.test(e);
10
9
  }
11
- function E(e) {
10
+ function R(e) {
12
11
  return "^" + e.replace(/[.+?^${}()|[\]\\]/g, "\\$&").replace(/\*\*/g, ".+").replace(/\*/g, "[^/]+").replace(/:[^/]+/g, "[^/]+") + "$";
13
12
  }
14
13
  function w(e, a) {
15
- return new Error(
16
- `[eidos] resource('${e}') is a URL pattern — ${a}() is not supported on pattern handles. The SW intercepts matching requests automatically; call fetch(specificUrl) directly in your app code.`
17
- );
14
+ return /* @__PURE__ */ new Error(`[eidos] resource('${e}') is a URL pattern — ${a}() is not supported on pattern handles. The SW intercepts matching requests automatically; call fetch(specificUrl) directly in your app code.`);
18
15
  }
19
16
  function A(e, a) {
20
- if (p.has(e))
21
- return p.get(e);
22
- const s = S(e, a), t = l(e) ? E(e) : void 0, o = {
17
+ if (p.has(e)) return p.get(e);
18
+ const s = S(a), t = d(e) ? R(e) : void 0, c = {
23
19
  url: e,
24
20
  config: a,
25
21
  strategy: s,
@@ -27,120 +23,123 @@ function A(e, a) {
27
23
  cacheHits: 0,
28
24
  cacheMisses: 0
29
25
  };
30
- h.getState().registerResource(e, o), g({
26
+ h.getState().registerResource(e, c), v({
31
27
  type: "EIDOS_REGISTER_RESOURCE",
32
28
  url: e,
33
29
  strategy: s.swStrategy,
34
30
  cacheName: s.cacheName,
35
31
  ...t !== void 0 && { pattern: t }
36
32
  });
37
- const c = {
33
+ const r = {
38
34
  url: e,
39
35
  config: a,
40
36
  strategy: s,
41
37
  fetch: async () => {
42
- if (l(e)) throw w(e, "fetch");
43
- const r = v.get(e);
44
- if (r) return r.then((n) => n.clone());
38
+ if (d(e)) throw w(e, "fetch");
39
+ const n = m.get(e);
40
+ if (n) return n.then((o) => o.clone());
45
41
  const i = k(e, a, s);
46
- return v.set(e, i), i.finally(() => v.delete(e)).catch(() => {
47
- }), i.then((n) => n.clone());
42
+ return m.set(e, i), i.finally(() => m.delete(e)).catch(() => {
43
+ }), i.then((o) => o.clone());
48
44
  },
49
45
  json: async () => {
50
- if (l(e)) throw w(e, "json");
51
- return (await c.fetch()).json();
46
+ if (d(e)) throw w(e, "json");
47
+ return (await r.fetch()).json();
52
48
  },
53
49
  query: () => {
54
- if (l(e)) throw w(e, "query");
50
+ if (d(e)) throw w(e, "query");
55
51
  return {
56
52
  queryKey: ["eidos", e],
57
- queryFn: () => c.json()
53
+ queryFn: () => r.json()
58
54
  };
59
55
  },
60
56
  prefetch: async () => {
61
- if (l(e)) throw w(e, "prefetch");
62
- await c.fetch();
57
+ if (d(e)) throw w(e, "prefetch");
58
+ await r.fetch();
63
59
  },
64
60
  invalidate: async () => {
65
- g({ type: "EIDOS_CLEAR_CACHE", url: e });
66
- const r = await caches.open(s.cacheName).catch(() => null);
67
- if (r) {
68
- const i = await r.keys(), n = t ? new RegExp(t) : null, u = e.startsWith("http");
69
- await Promise.all(
70
- i.filter((f) => {
71
- const d = f.url, y = new URL(d).pathname;
72
- return n ? n.test(u ? d : y) : u ? d === e : d === e || y === e;
73
- }).map((f) => r.delete(f))
74
- );
61
+ v({
62
+ type: "EIDOS_CLEAR_CACHE",
63
+ url: e
64
+ });
65
+ const n = await caches.open(s.cacheName).catch(() => null);
66
+ if (n) {
67
+ const i = await n.keys(), o = t ? new RegExp(t) : null, l = e.startsWith("http");
68
+ await Promise.all(i.filter((u) => {
69
+ const f = u.url, g = new URL(f).pathname;
70
+ return o ? o.test(l ? f : g) : l ? f === e : f === e || g === e;
71
+ }).map((u) => n.delete(u)));
75
72
  }
76
- l(e) || h.getState().updateResource(e, {
73
+ d(e) || h.getState().updateResource(e, {
77
74
  status: "stale",
78
75
  cachedAt: void 0,
79
76
  lastEvent: "cache-cleared",
80
77
  cacheHits: 0,
81
78
  cacheMisses: 0
82
- }), m == null || m(["eidos", e]);
79
+ }), E?.(["eidos", e]);
83
80
  },
84
81
  unregister: () => {
85
- p.delete(e), g({ type: "EIDOS_UNREGISTER_RESOURCE", url: e }), h.getState().unregisterResource(e);
82
+ p.delete(e), v({
83
+ type: "EIDOS_UNREGISTER_RESOURCE",
84
+ url: e
85
+ }), h.getState().unregisterResource(e);
86
86
  }
87
87
  };
88
- return p.set(e, c), c;
88
+ return p.set(e, r), r;
89
89
  }
90
90
  async function k(e, a, s) {
91
91
  const t = h.getState();
92
- t.updateResource(e, { status: "fetching", fetchedAt: Date.now() });
93
- const o = await caches.open(s.cacheName).catch(() => null);
92
+ t.updateResource(e, {
93
+ status: "fetching",
94
+ fetchedAt: Date.now()
95
+ });
96
+ const c = await caches.open(s.cacheName).catch(() => null);
94
97
  try {
95
98
  if (s.swStrategy !== "network-first") {
96
- const i = o ? await o.match(e).catch(() => null) : null, n = h.getState().resources[e], u = a.maxAge !== void 0 && (n == null ? void 0 : n.cachedAt) !== void 0 && Date.now() - n.cachedAt > a.maxAge;
97
- if (i && !u)
99
+ const i = c ? await c.match(e).catch(() => null) : null, o = h.getState().resources[e], l = a.maxAge !== void 0 && o?.cachedAt !== void 0 && Date.now() - o.cachedAt > a.maxAge;
100
+ if (i && !l)
98
101
  return t.updateResource(e, {
99
102
  status: "fresh",
100
103
  lastEvent: "cache-hit",
101
- cacheHits: ((n == null ? void 0 : n.cacheHits) ?? 0) + 1
102
- }), s.swStrategy === "stale-while-revalidate" && fetch(e, { signal: AbortSignal.timeout(5e3) }).then(async (d) => {
103
- d.ok && o && (await o.put(e, d.clone()), h.getState().updateResource(e, {
104
+ cacheHits: (o?.cacheHits ?? 0) + 1
105
+ }), s.swStrategy === "stale-while-revalidate" && fetch(e, { signal: AbortSignal.timeout(5e3) }).then(async (f) => {
106
+ f.ok && c && (await c.put(e, f.clone()), h.getState().updateResource(e, {
104
107
  cachedAt: Date.now(),
105
108
  lastEvent: "cache-updated"
106
109
  }));
107
110
  }).catch(() => {
108
111
  }), i;
109
- const f = h.getState().resources[e];
110
- t.updateResource(e, {
111
- cacheMisses: ((f == null ? void 0 : f.cacheMisses) ?? 0) + 1
112
- });
112
+ const u = h.getState().resources[e];
113
+ t.updateResource(e, { cacheMisses: (u?.cacheMisses ?? 0) + 1 });
113
114
  }
114
- const c = await fetch(e);
115
- if (c.ok)
116
- return o && await o.put(e, c.clone()), t.updateResource(e, {
115
+ const r = await fetch(e);
116
+ if (r.ok)
117
+ return c && await c.put(e, r.clone()), t.updateResource(e, {
117
118
  status: "fresh",
118
119
  cachedAt: Date.now(),
119
120
  lastEvent: "cache-updated"
120
- }), c;
121
- t.updateResource(e, { status: c.status === 503 ? "offline" : "error" });
122
- const r = c.headers.get("X-Eidos-Offline") === "true";
123
- throw new Error(
124
- r ? `offline: no cached response for ${e}` : `${c.status} ${c.statusText}`
125
- );
126
- } catch (c) {
127
- const r = o ? await o.match(e).catch(() => null) : null;
128
- if (r) {
121
+ }), r;
122
+ t.updateResource(e, { status: r.status === 503 ? "offline" : "error" });
123
+ const n = r.headers.get("X-Eidos-Offline") === "true";
124
+ throw new Error(n ? `offline: no cached response for ${e}` : `${r.status} ${r.statusText}`);
125
+ } catch (r) {
126
+ const n = c ? await c.match(e).catch(() => null) : null;
127
+ if (n) {
129
128
  const i = h.getState().resources[e];
130
129
  return t.updateResource(e, {
131
130
  status: "fresh",
132
131
  lastEvent: "cache-hit",
133
- cacheHits: ((i == null ? void 0 : i.cacheHits) ?? 0) + 1
134
- }), r;
132
+ cacheHits: (i?.cacheHits ?? 0) + 1
133
+ }), n;
135
134
  }
136
- throw t.updateResource(e, { status: "error" }), c;
135
+ throw t.updateResource(e, { status: "error" }), r;
137
136
  }
138
137
  }
139
- function S(e, a) {
140
- const s = a.strategy;
141
- return a.offline ? R(s ?? "stale-while-revalidate", e, a.cacheName) : R(s ?? "network-first", e, a.cacheName);
138
+ function S(e) {
139
+ const a = e.strategy;
140
+ return e.offline ? y(a ?? "stale-while-revalidate", e.cacheName) : y(a ?? "network-first", e.cacheName);
142
141
  }
143
- const b = {
142
+ var b = {
144
143
  "stale-while-revalidate": "StaleWhileRevalidate",
145
144
  "cache-first": "CacheFirst",
146
145
  "network-first": "NetworkFirst"
@@ -188,16 +187,14 @@ new NetworkFirst({
188
187
  })`
189
188
  }
190
189
  };
191
- function R(e, a, s) {
192
- const t = x[e];
190
+ function y(e, a) {
191
+ const s = x[e];
193
192
  return {
194
193
  name: b[e],
195
194
  swStrategy: e,
196
- cacheName: s ?? "eidos-resources-v1",
197
- // reasoning + behavior are rendered by the playground UI from live ResourceEntry objects —
198
- // keep them in all builds. equivalentCode is a static code block only used in DEV tools.
199
- reasoning: t.reasoning,
200
- behavior: t.behavior,
195
+ cacheName: a ?? "eidos-resources-v1",
196
+ reasoning: s.reasoning,
197
+ behavior: s.behavior,
201
198
  equivalentCode: ""
202
199
  };
203
200
  }
@@ -211,7 +208,8 @@ async function _(e) {
211
208
  }
212
209
  export {
213
210
  A as resource,
214
- q as setQueryInvalidator,
211
+ N as setQueryInvalidator,
215
212
  _ as warmCache
216
213
  };
217
- //# sourceMappingURL=resource.js.map
214
+
215
+ //# sourceMappingURL=resource.js.map
package/dist/runtime.js CHANGED
@@ -1,38 +1,49 @@
1
- import { registerServiceWorker as d, registerBgSyncHandler as m } from "./sw-bridge.js";
2
- import { replayQueue as s } from "./action.js";
3
- import { useEidosStore as e } from "./store.js";
4
- import { idbGetQueue as p } from "./idb.js";
5
- let o = !1, i = null;
6
- async function w(r = {}) {
7
- if (typeof window > "u" || o) return;
8
- o = !0;
9
- const u = r.swPath ?? "/eidos-sw.js", l = r.autoReplay ?? !0;
1
+ import { useEidosStore as a } from "./store.js";
2
+ import { registerBgSyncHandler as u, registerServiceWorker as c } from "./sw-bridge.js";
3
+ import { idbGetQueue as m, idbQueueStorage as d } from "./idb.js";
4
+ import { _getQueueStorage as y } from "./queue-storage.js";
5
+ import { replayQueue as p } from "./action.js";
6
+ import { subscribeReplayOnReconnect as f } from "./replay.js";
7
+ async function l(e) {
8
+ if (e.schemaVersion === 2 && e.idempotencyKey) return e;
9
+ const t = {
10
+ ...e,
11
+ schemaVersion: 2,
12
+ idempotencyKey: e.idempotencyKey ?? crypto.randomUUID()
13
+ };
14
+ return await (y() ?? d).update(t.id, {
15
+ schemaVersion: t.schemaVersion,
16
+ idempotencyKey: t.idempotencyKey
17
+ }).catch(() => {
18
+ }), t;
19
+ }
20
+ var r = !1, i = null;
21
+ async function K(e = {}) {
22
+ if (typeof window > "u" || r) return;
23
+ r = !0;
24
+ const t = e.swPath ?? "/eidos-sw.js", n = e.autoReplay ?? !0;
10
25
  try {
11
- const t = await p();
12
- t.length > 0 && e.getState().hydrateQueue(t);
26
+ const o = await m();
27
+ if (o.length > 0) {
28
+ const s = await Promise.all(o.map(l));
29
+ a.getState().hydrateQueue(s);
30
+ }
13
31
  } catch {
14
32
  }
15
33
  try {
16
- await d(u);
34
+ await c(t);
17
35
  } catch {
18
36
  }
19
- if (m(() => {
20
- e.getState().isOnline && setTimeout(s, 200);
21
- }), l) {
22
- let t = e.getState().isOnline;
23
- i = e.subscribe(() => {
24
- const { isOnline: n } = e.getState(), c = n && !t;
25
- t = n, c && setTimeout(s, 600);
26
- });
27
- const a = e.getState(), f = a.queue.some((n) => n.status === "pending");
28
- a.isOnline && f && setTimeout(s, 1200);
29
- }
37
+ u(() => {
38
+ a.getState().isOnline && setTimeout(p, 200);
39
+ }), n && (i = f());
30
40
  }
31
- function O() {
32
- i == null || i(), i = null, o = !1;
41
+ function R() {
42
+ i?.(), i = null, r = !1;
33
43
  }
34
44
  export {
35
- O as _resetEidos,
36
- w as initEidos
45
+ R as _resetEidos,
46
+ K as initEidos
37
47
  };
38
- //# sourceMappingURL=runtime.js.map
48
+
49
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1,43 @@
1
+ function t(o) {
2
+ return {
3
+ registerResource: (e, r) => o((u) => ({ resources: {
4
+ ...u.resources,
5
+ [e]: r
6
+ } })),
7
+ updateResource: (e, r) => o((u) => ({ resources: {
8
+ ...u.resources,
9
+ [e]: u.resources[e] ? {
10
+ ...u.resources[e],
11
+ ...r
12
+ } : u.resources[e]
13
+ } })),
14
+ unregisterResource: (e) => o((r) => ({ resources: Object.fromEntries(Object.entries(r.resources).filter(([u]) => u !== e)) }))
15
+ };
16
+ }
17
+ function n(o) {
18
+ return {
19
+ addQueueItem: (e) => o((r) => ({ queue: [...r.queue, e] })),
20
+ updateQueueItem: (e, r) => o((u) => ({ queue: u.queue.map((c) => c.id === e ? {
21
+ ...c,
22
+ ...r
23
+ } : c) })),
24
+ batchUpdateQueueItems: (e) => o((r) => {
25
+ const u = new Map(e.map((c) => [c.id, c.update]));
26
+ return { queue: r.queue.map((c) => {
27
+ const s = u.get(c.id);
28
+ return s ? {
29
+ ...c,
30
+ ...s
31
+ } : c;
32
+ }) };
33
+ }),
34
+ removeQueueItem: (e) => o((r) => ({ queue: r.queue.filter((u) => u.id !== e) })),
35
+ hydrateQueue: (e) => o(() => ({ queue: e }))
36
+ };
37
+ }
38
+ export {
39
+ n as createQueueActions,
40
+ t as createResourceActions
41
+ };
42
+
43
+ //# sourceMappingURL=store-slices.js.map
package/dist/store.js CHANGED
@@ -1,66 +1,49 @@
1
- let o;
2
- const n = /* @__PURE__ */ new Set();
3
- function a() {
4
- n.forEach((e) => e());
1
+ import { createQueueActions as u, createResourceActions as i } from "./store-slices.js";
2
+ var t, s = /* @__PURE__ */ new Set();
3
+ function r() {
4
+ s.forEach((e) => e());
5
5
  }
6
- function r(e) {
7
- o = { ...o, ...e(o) }, a();
6
+ function n(e) {
7
+ t = {
8
+ ...t,
9
+ ...e(t)
10
+ }, r();
8
11
  }
9
- o = {
10
- // navigator.onLine is undefined in React Native — default to true unless explicitly false
12
+ t = {
11
13
  isOnline: typeof navigator > "u" || navigator.onLine !== !1,
12
14
  swStatus: "idle",
13
15
  swError: void 0,
14
16
  resources: {},
15
17
  queue: [],
16
- setOnline: (e) => r(() => ({ isOnline: e })),
17
- setSwStatus: (e, u) => r(() => ({ swStatus: e, swError: u })),
18
- registerResource: (e, u) => r((t) => ({ resources: { ...t.resources, [e]: u } })),
19
- updateResource: (e, u) => r((t) => ({
20
- resources: {
21
- ...t.resources,
22
- [e]: t.resources[e] ? { ...t.resources[e], ...u } : t.resources[e]
23
- }
24
- })),
25
- unregisterResource: (e) => r((u) => ({
26
- resources: Object.fromEntries(
27
- Object.entries(u.resources).filter(([t]) => t !== e)
28
- )
18
+ setOnline: (e) => n(() => ({ isOnline: e })),
19
+ setSwStatus: (e, o) => n(() => ({
20
+ swStatus: e,
21
+ swError: o
29
22
  })),
30
- addQueueItem: (e) => r((u) => ({ queue: [...u.queue, e] })),
31
- updateQueueItem: (e, u) => r((t) => ({
32
- queue: t.queue.map((s) => s.id === e ? { ...s, ...u } : s)
33
- })),
34
- batchUpdateQueueItems: (e) => r((u) => {
35
- const t = new Map(e.map((s) => [s.id, s.update]));
36
- return {
37
- queue: u.queue.map((s) => {
38
- const c = t.get(s.id);
39
- return c ? { ...s, ...c } : s;
40
- })
41
- };
42
- }),
43
- removeQueueItem: (e) => r((u) => ({ queue: u.queue.filter((t) => t.id !== e) })),
44
- hydrateQueue: (e) => r(() => ({ queue: e }))
23
+ ...i(n),
24
+ ...u(n)
45
25
  };
46
- function i() {
47
- return o;
26
+ function a() {
27
+ return t;
48
28
  }
49
- function d(e) {
50
- return n.add(e), () => {
51
- n.delete(e);
29
+ function c(e) {
30
+ return s.add(e), () => {
31
+ s.delete(e);
52
32
  };
53
33
  }
54
- const f = {
55
- getState: i,
56
- subscribe: d,
57
- // Test/devtools helper — merges partial state, preserves action methods.
34
+ var d = {
35
+ getState: a,
36
+ subscribe: c,
58
37
  setState: (e) => {
59
- const u = typeof e == "function" ? e(o) : e;
60
- o = { ...o, ...u }, a();
38
+ const o = typeof e == "function" ? e(t) : e;
39
+ t = {
40
+ ...t,
41
+ ...o
42
+ }, r();
61
43
  }
62
44
  };
63
45
  export {
64
- f as useEidosStore
46
+ d as useEidosStore
65
47
  };
66
- //# sourceMappingURL=store.js.map
48
+
49
+ //# sourceMappingURL=store.js.map
package/dist/stores.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import { useEidosStore as i } from "./store.js";
2
2
  function a(e, t) {
3
- const s = Object.keys(e);
4
- if (s.length !== Object.keys(t).length) return !1;
5
- for (const n of s) if (e[n] !== t[n]) return !1;
3
+ const r = Object.keys(e);
4
+ if (r.length !== Object.keys(t).length) return !1;
5
+ for (const s of r) if (e[s] !== t[s]) return !1;
6
6
  return !0;
7
7
  }
8
8
  function o(e, t) {
@@ -10,11 +10,11 @@ function o(e, t) {
10
10
  }
11
11
  function u(e, t = Object.is) {
12
12
  return {
13
- subscribe(s) {
14
- let n = e(i.getState());
15
- return s(n), i.subscribe(() => {
16
- const r = e(i.getState());
17
- t(n, r) || (n = r, s(r));
13
+ subscribe(r) {
14
+ let s = e(i.getState());
15
+ return r(s), i.subscribe(() => {
16
+ const n = e(i.getState());
17
+ t(s, n) || (s = n, r(n));
18
18
  });
19
19
  },
20
20
  getState() {
@@ -22,23 +22,25 @@ function u(e, t = Object.is) {
22
22
  }
23
23
  };
24
24
  }
25
- const l = u((e) => e), c = u((e) => e.queue), d = u(
26
- (e) => ({ isOnline: e.isOnline, swStatus: e.swStatus, swError: e.swError }),
27
- o
28
- ), g = u(
29
- (e) => {
30
- let t = 0, s = 0, n = 0;
31
- for (const r of e.queue)
32
- r.status === "pending" ? t++ : r.status === "failed" ? s++ : r.status === "replaying" && n++;
33
- return { pending: t, failed: s, replaying: n, total: e.queue.length };
34
- },
35
- o
36
- );
25
+ var l = u((e) => e), c = u((e) => e.queue), d = u((e) => ({
26
+ isOnline: e.isOnline,
27
+ swStatus: e.swStatus,
28
+ swError: e.swError
29
+ }), o), g = u((e) => {
30
+ let t = 0, r = 0, s = 0;
31
+ for (const n of e.queue) n.status === "pending" ? t++ : n.status === "failed" ? r++ : n.status === "replaying" && s++;
32
+ return {
33
+ pending: t,
34
+ failed: r,
35
+ replaying: s,
36
+ total: e.queue.length
37
+ };
38
+ }, o);
37
39
  function S(e) {
38
40
  return u((t) => t.resources[e]);
39
41
  }
40
42
  function b(e) {
41
- return u((t) => t.queue.find((s) => s.id === e));
43
+ return u((t) => t.queue.find((r) => r.id === e));
42
44
  }
43
45
  export {
44
46
  b as eidosAction,
@@ -48,4 +50,5 @@ export {
48
50
  d as eidosStatus,
49
51
  l as eidosStore
50
52
  };
51
- //# sourceMappingURL=stores.js.map
53
+
54
+ //# sourceMappingURL=stores.js.map
package/dist/sveltekit.js CHANGED
@@ -1,9 +1,25 @@
1
1
  import { initEidos } from "@sweidos/eidos";
2
+ //#region src/sveltekit.ts
3
+ /**
4
+ * Returns an `onMount`-compatible callback that initialises the Eidos runtime
5
+ * on the client only. Prevents SSR crashes caused by accessing `indexedDB` or
6
+ * `navigator.serviceWorker` during server-side rendering.
7
+ *
8
+ * Call inside `onMount()` in your root `+layout.svelte`:
9
+ *
10
+ * ```svelte
11
+ * <script>
12
+ * import { onMount } from 'svelte'
13
+ * import { initEidosSvelteKit } from '@sweidos/eidos/sveltekit'
14
+ *
15
+ * onMount(initEidosSvelteKit({ swPath: '/eidos-sw.js' }))
16
+ * <\/script>
17
+ * ```
18
+ */
2
19
  function initEidosSvelteKit(config) {
3
- return () => {
4
- void initEidos(config);
5
- };
20
+ return () => {
21
+ initEidos(config);
22
+ };
6
23
  }
7
- export {
8
- initEidosSvelteKit
9
- };
24
+ //#endregion
25
+ export { initEidosSvelteKit };