storion 0.8.3 → 0.10.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 (77) hide show
  1. package/CHANGELOG.md +127 -21
  2. package/README.md +42 -2021
  3. package/dist/async/abortable.d.ts +295 -0
  4. package/dist/async/abortable.d.ts.map +1 -0
  5. package/dist/async/async.d.ts +86 -5
  6. package/dist/async/async.d.ts.map +1 -1
  7. package/dist/async/context.d.ts +15 -0
  8. package/dist/async/context.d.ts.map +1 -0
  9. package/dist/async/index.d.ts +16 -3
  10. package/dist/async/index.d.ts.map +1 -1
  11. package/dist/async/index.js +407 -137
  12. package/dist/async/safe.d.ts +221 -0
  13. package/dist/async/safe.d.ts.map +1 -0
  14. package/dist/async/types.d.ts +77 -29
  15. package/dist/async/types.d.ts.map +1 -1
  16. package/dist/async/wrappers.d.ts +217 -0
  17. package/dist/async/wrappers.d.ts.map +1 -0
  18. package/dist/core/effect.d.ts +34 -26
  19. package/dist/core/effect.d.ts.map +1 -1
  20. package/dist/core/equality.d.ts +25 -0
  21. package/dist/core/equality.d.ts.map +1 -1
  22. package/dist/core/focus.d.ts +20 -0
  23. package/dist/core/focus.d.ts.map +1 -0
  24. package/dist/core/focusHelpers.d.ts +258 -0
  25. package/dist/core/focusHelpers.d.ts.map +1 -0
  26. package/dist/core/middleware.d.ts +4 -4
  27. package/dist/core/store.d.ts.map +1 -1
  28. package/dist/core/storeContext.d.ts +2 -9
  29. package/dist/core/storeContext.d.ts.map +1 -1
  30. package/dist/dev.d.ts +0 -10
  31. package/dist/dev.d.ts.map +1 -1
  32. package/dist/{index-C8B6Mo8r.js → effect-BDQU8Voz.js} +1241 -583
  33. package/dist/errors.d.ts +6 -0
  34. package/dist/errors.d.ts.map +1 -1
  35. package/dist/index.d.ts +5 -4
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/network/index.d.ts +69 -0
  38. package/dist/network/index.d.ts.map +1 -0
  39. package/dist/network/retry.d.ts +53 -0
  40. package/dist/network/retry.d.ts.map +1 -0
  41. package/dist/network/services.d.ts +58 -0
  42. package/dist/network/services.d.ts.map +1 -0
  43. package/dist/network/store.d.ts +36 -0
  44. package/dist/network/store.d.ts.map +1 -0
  45. package/dist/network/utils.d.ts +9 -0
  46. package/dist/network/utils.d.ts.map +1 -0
  47. package/dist/persist/index.d.ts +1 -1
  48. package/dist/persist/index.d.ts.map +1 -1
  49. package/dist/persist/index.js +55 -31
  50. package/dist/persist/persist.d.ts +119 -62
  51. package/dist/persist/persist.d.ts.map +1 -1
  52. package/dist/pool.d.ts +77 -0
  53. package/dist/pool.d.ts.map +1 -0
  54. package/dist/react/index.d.ts +2 -2
  55. package/dist/react/index.d.ts.map +1 -1
  56. package/dist/react/index.js +245 -244
  57. package/dist/react/stable.d.ts +27 -0
  58. package/dist/react/stable.d.ts.map +1 -0
  59. package/dist/react/useStore.d.ts +38 -13
  60. package/dist/react/useStore.d.ts.map +1 -1
  61. package/dist/react/withStore.d.ts.map +1 -1
  62. package/dist/storion.js +911 -37
  63. package/dist/trigger.d.ts +12 -7
  64. package/dist/trigger.d.ts.map +1 -1
  65. package/dist/types.d.ts +133 -22
  66. package/dist/types.d.ts.map +1 -1
  67. package/dist/utils/storeTuple.d.ts +7 -0
  68. package/dist/utils/storeTuple.d.ts.map +1 -0
  69. package/package.json +5 -1
  70. package/dist/collection.d.ts +0 -34
  71. package/dist/collection.d.ts.map +0 -1
  72. package/dist/core/proxy.d.ts +0 -47
  73. package/dist/core/proxy.d.ts.map +0 -1
  74. package/dist/effect-C6h0PDDI.js +0 -446
  75. package/dist/isPromiseLike-bFkfHAbm.js +0 -6
  76. package/dist/react/useLocalStore.d.ts +0 -48
  77. package/dist/react/useLocalStore.d.ts.map +0 -1
package/dist/errors.d.ts CHANGED
@@ -65,4 +65,10 @@ export declare class LocalStoreDependencyError extends StorionError {
65
65
  export declare class EffectRefreshError extends StorionError {
66
66
  constructor();
67
67
  }
68
+ /**
69
+ * Thrown when scoped() is called outside of a selector function.
70
+ */
71
+ export declare class ScopedOutsideSelectorError extends StorionError {
72
+ constructor();
73
+ }
68
74
  //# sourceMappingURL=errors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,qBAAa,YAAa,SAAQ,KAAK;gBACzB,OAAO,EAAE,MAAM;CAI5B;AAMD;;;GAGG;AACH,qBAAa,eAAgB,SAAQ,YAAY;gBAE7C,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,MAAM;CAShB;AAMD;;;GAGG;AACH,qBAAa,qBAAsB,SAAQ,YAAY;gBAEnD,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,WAAW,GAAG,QAAQ;CAUpC;AAMD;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,YAAY;gBACtC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;CAI1C;AAMD;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,YAAY;gBACtC,OAAO,EAAE,MAAM;CAI5B;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,YAAY;gBACtC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;CAQnD;AAMD;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,YAAY;gBACrC,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM;CAOpD;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,YAAY;gBACxC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;CAI3C;AAMD;;GAEG;AACH,qBAAa,yBAA0B,SAAQ,YAAY;gBAC7C,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM;CAOvD;AAMD;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,YAAY;;CAKnD"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,qBAAa,YAAa,SAAQ,KAAK;gBACzB,OAAO,EAAE,MAAM;CAI5B;AAMD;;;GAGG;AACH,qBAAa,eAAgB,SAAQ,YAAY;gBAE7C,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,MAAM;CAShB;AAMD;;;GAGG;AACH,qBAAa,qBAAsB,SAAQ,YAAY;gBAEnD,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,WAAW,GAAG,QAAQ;CAUpC;AAMD;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,YAAY;gBACtC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;CAI1C;AAMD;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,YAAY;gBACtC,OAAO,EAAE,MAAM;CAI5B;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,YAAY;gBACtC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;CAQnD;AAMD;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,YAAY;gBACrC,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM;CAOpD;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,YAAY;gBACxC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;CAI3C;AAMD;;GAEG;AACH,qBAAa,yBAA0B,SAAQ,YAAY;gBAC7C,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM;CAOvD;AAMD;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,YAAY;;CAKnD;AAKD;;GAEG;AACH,qBAAa,0BAA2B,SAAQ,YAAY;;CAQ3D"}
package/dist/index.d.ts CHANGED
@@ -3,19 +3,20 @@
3
3
  *
4
4
  * @packageDocumentation
5
5
  */
6
- export { STORION_TYPE, type StorionKind, type StorionObject, type StateBase, type ActionsBase, type Equality, type EqualityMap, type Lifetime, type DispatchEvent, type ActionDispatchEvent, type ReactiveAction, type ReactiveActions, type StoreSpec, type StoreContext, type StoreMixin, type StoreOptions, type StoreInstance, type StoreContainer, type ContainerOptions, type StoreMiddleware, type SelectorContext, type SelectorMixin, type Selector, type StoreTuple, type StableResult, type PickEquality, type StatePath, type PathValue, type Focus, type FocusOptions, type FocusChangeEvent, type NonNullish, type Factory, type Middleware, type MiddlewareContext, type Resolver, type ResolverOptions, type MetaType, type MetaInfo, } from './types';
7
- export { is, isStorion, getKind, isSpec, isContainer, isStore, isFocus, isAction, isStoreContext, isSelectorContext, } from './is';
6
+ export * from './types';
7
+ export { is } from './is';
8
8
  export { store } from './core/store';
9
9
  export { container } from './core/container';
10
10
  export { batch, untrack } from './core/tracking';
11
- export { createResolver } from './core/createResolver';
11
+ export { createResolver as resolver } from './core/createResolver';
12
12
  export { pick } from './core/pick';
13
+ export { list, map, toggle, increment, decrement, multiply, divide, clamp, append, prepend, merge, reset, type ListOptions, type MapOptions, type FocusList, type FocusMap, } from './core/focusHelpers';
13
14
  export { effect, type EffectFn, type EffectContext, type EffectOptions, type EffectErrorStrategy, type EffectErrorContext, type EffectRetryConfig, } from './core/effect';
14
15
  export { applyFor, applyExcept, forStores, type SpecPattern, type MiddlewareMap, } from './core/middleware';
15
16
  export { equality, shallowEqual, deepEqual, strictEqual, } from './core/equality';
16
17
  export { trigger, type TriggerOptions } from './trigger';
17
- export { wrapFn as wrapFn, unwrapFn, isWrappedFn } from './core/fnWrapper';
18
18
  export { StorionError, SetupPhaseError, LifetimeMismatchError, AsyncFunctionError, StoreDisposedError, InvalidActionError, HooksContextError, ProviderMissingError, LocalStoreDependencyError, EffectRefreshError, } from './errors';
19
19
  export { meta } from './meta/meta';
20
20
  export { withMeta } from './meta/withMeta';
21
+ export { pool } from './pool';
21
22
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,YAAY,EACZ,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,YAAY,EAEjB,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,KAAK,EACV,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,UAAU,EAEf,KAAK,OAAO,EACZ,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,QAAQ,EACb,KAAK,eAAe,EAEpB,KAAK,QAAQ,EACb,KAAK,QAAQ,GACd,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,EAAE,EACF,SAAS,EACT,OAAO,EACP,MAAM,EACN,WAAW,EACX,OAAO,EACP,OAAO,EACP,QAAQ,EACR,cAAc,EACd,iBAAiB,GAClB,MAAM,MAAM,CAAC;AAGd,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAGjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGvD,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAEnC,OAAO,EACL,MAAM,EACN,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,GACvB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,QAAQ,EACR,WAAW,EACX,SAAS,EACT,KAAK,WAAW,EAChB,KAAK,aAAa,GACnB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,SAAS,EACT,WAAW,GACZ,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AAGzD,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG3E,OAAO,EACL,YAAY,EACZ,eAAe,EACf,qBAAqB,EACrB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,oBAAoB,EACpB,yBAAyB,EACzB,kBAAkB,GACnB,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,cAAc,SAAS,CAAC;AAGxB,OAAO,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC;AAG1B,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAGjD,OAAO,EAAE,cAAc,IAAI,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAGnE,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAGnC,OAAO,EACL,IAAI,EACJ,GAAG,EAEH,MAAM,EACN,SAAS,EACT,SAAS,EACT,QAAQ,EACR,MAAM,EACN,KAAK,EACL,MAAM,EACN,OAAO,EACP,KAAK,EACL,KAAK,EAEL,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,QAAQ,GACd,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,MAAM,EACN,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,GACvB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,QAAQ,EACR,WAAW,EACX,SAAS,EACT,KAAK,WAAW,EAChB,KAAK,aAAa,GACnB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,SAAS,EACT,WAAW,GACZ,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AAGzD,OAAO,EACL,YAAY,EACZ,eAAe,EACf,qBAAqB,EACrB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,oBAAoB,EACpB,yBAAyB,EACzB,kBAAkB,GACnB,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Network connectivity module.
3
+ *
4
+ * Provides platform-agnostic network state management:
5
+ * - `networkStore` - Reactive store with `online` state for React components
6
+ * - `networkService` - Provides `isOnline()`, `waitForOnline()`, and `offlineRetry()` wrapper
7
+ * - `onlineService` - Customizable online/offline event subscription
8
+ * - `pingService` - Customizable network reachability check
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * import { networkStore, networkService } from 'storion/network';
13
+ * import { abortable, retry } from 'storion/async';
14
+ *
15
+ * // React component - use store for reactive state
16
+ * function NetworkBanner() {
17
+ * const { online } = useStore(({ get }) => {
18
+ * const [state] = get(networkStore);
19
+ * return { online: state.online };
20
+ * });
21
+ * return online ? null : <div>You are offline</div>;
22
+ * }
23
+ *
24
+ * // In store setup - use service for logic
25
+ * setup({ get, focus }) {
26
+ * const network = get(networkService);
27
+ *
28
+ * const fetchUsers = abortable(async ({ signal }) => {
29
+ * const res = await fetch('/api/users', { signal });
30
+ * return res.json();
31
+ * });
32
+ *
33
+ * // Chain wrappers: retry 3 times, then wait for network
34
+ * const robustFetch = fetchUsers
35
+ * .use(retry(3))
36
+ * .use(network.offlineRetry());
37
+ *
38
+ * const usersQuery = async.action(focus("users"), robustFetch);
39
+ *
40
+ * return { fetchUsers: usersQuery.dispatch };
41
+ * }
42
+ *
43
+ * // Wait for connectivity
44
+ * const network = get(networkService);
45
+ * await network.waitForOnline();
46
+ * await uploadData();
47
+ *
48
+ * // Override for React Native
49
+ * container.set(onlineService, () => ({
50
+ * isOnline: () => true,
51
+ * subscribe: (listener) => NetInfo.addEventListener(s => listener(!!s.isConnected)),
52
+ * }));
53
+ *
54
+ * // Override for real connectivity check
55
+ * container.set(pingService, () => ({
56
+ * ping: async () => {
57
+ * try {
58
+ * await fetch('/api/health', { method: 'HEAD' });
59
+ * return true;
60
+ * } catch { return false; }
61
+ * },
62
+ * }));
63
+ * ```
64
+ */
65
+ export { pingService, onlineService, type PingService, type OnlineService, } from './services';
66
+ export { networkStore } from './store';
67
+ export { isNetworkError } from './utils';
68
+ export { networkService, type NetworkService } from './retry';
69
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/network/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+DG;AAGH,OAAO,EACL,WAAW,EACX,aAAa,EACb,KAAK,WAAW,EAChB,KAAK,aAAa,GACnB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGvC,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAGzC,OAAO,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,53 @@
1
+ import { Resolver } from '../types';
2
+ import { IdentityWrapper } from '../async';
3
+
4
+ /**
5
+ * Service for handling network detection and retry logic.
6
+ *
7
+ * Provides:
8
+ * - `isOnline()` - Check current connectivity
9
+ * - `subscribe()` - Listen to online/offline changes
10
+ * - `waitForOnline()` - Promise that resolves when online
11
+ * - `offlineRetry()` - Wrapper for automatic retry on reconnection
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * import { abortable, retry } from "storion/async";
16
+ * import { networkService } from "storion/network";
17
+ *
18
+ * setup({ get, focus }) {
19
+ * const network = get(networkService);
20
+ *
21
+ * const fetchUsers = abortable(async ({ signal }) => {
22
+ * const res = await fetch("/api/users", { signal });
23
+ * return res.json();
24
+ * });
25
+ *
26
+ * // Chain wrappers: retry 3 times, then wait for network
27
+ * const robustFetch = fetchUsers
28
+ * .use(retry(3))
29
+ * .use(network.offlineRetry());
30
+ *
31
+ * const usersQuery = async.action(focus("users"), robustFetch);
32
+ *
33
+ * return { fetchUsers: usersQuery.dispatch };
34
+ * }
35
+ * ```
36
+ */
37
+ export declare const networkService: ({ get }: Resolver) => {
38
+ isOnline: () => boolean;
39
+ subscribe: {
40
+ (listeners: import('..').SingleOrMultipleListeners<boolean>): VoidFunction;
41
+ <TValue>(map: (value: boolean) => {
42
+ value: TValue;
43
+ } | undefined, listeners: import('..').SingleOrMultipleListeners<TValue>): VoidFunction;
44
+ };
45
+ waitForOnline: () => Promise<void>;
46
+ offlineRetry: () => IdentityWrapper;
47
+ dispose: () => void;
48
+ };
49
+ /**
50
+ * Type of the network service instance.
51
+ */
52
+ export type NetworkService = ReturnType<typeof networkService>;
53
+ //# sourceMappingURL=retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/network/retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAShD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,eAAO,MAAM,cAAc,GAAI,SAAS,QAAQ;oBAuCzB,OAAO;;;;;;;yBAoCF,OAAO,CAAC,IAAI,CAAC;wBAkCd,eAAe;mBAmBpB,IAAI;CAWzB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC"}
@@ -0,0 +1,58 @@
1
+ import { Factory } from '../types';
2
+
3
+ export interface PingService {
4
+ /**
5
+ * Check if the network is reachable.
6
+ * Default: 300ms delay, returns true (optimistic).
7
+ */
8
+ ping(): Promise<boolean>;
9
+ }
10
+ export interface OnlineService {
11
+ /**
12
+ * Get current online status.
13
+ * Default: uses navigator.onLine if available.
14
+ */
15
+ isOnline(): boolean;
16
+ /**
17
+ * Subscribe to online/offline events.
18
+ * Default: uses window 'online'/'offline' events.
19
+ *
20
+ * @returns Unsubscribe function
21
+ */
22
+ subscribe(listener: (online: boolean) => void): VoidFunction;
23
+ }
24
+ /**
25
+ * Service for checking network reachability.
26
+ *
27
+ * Default implementation: 300ms delay, always returns true (optimistic).
28
+ *
29
+ * Override for real connectivity check:
30
+ * ```ts
31
+ * container.set(pingService, () => ({
32
+ * ping: async () => {
33
+ * try {
34
+ * await fetch('/api/health', { method: 'HEAD' });
35
+ * return true;
36
+ * } catch { return false; }
37
+ * },
38
+ * }));
39
+ * ```
40
+ */
41
+ export declare const pingService: Factory<PingService>;
42
+ /**
43
+ * Service for online/offline event subscription.
44
+ *
45
+ * Default implementation: uses browser's navigator.onLine and window events.
46
+ *
47
+ * Override for React Native:
48
+ * ```ts
49
+ * import NetInfo from '@react-native-community/netinfo';
50
+ *
51
+ * container.set(onlineService, () => ({
52
+ * isOnline: () => true,
53
+ * subscribe: (listener) => NetInfo.addEventListener(s => listener(!!s.isConnected)),
54
+ * }));
55
+ * ```
56
+ */
57
+ export declare const onlineService: Factory<OnlineService>;
58
+ //# sourceMappingURL=services.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../../src/network/services.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAOxC,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,QAAQ,IAAI,OAAO,CAAC;IAEpB;;;;;OAKG;IACH,SAAS,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,GAAG,YAAY,CAAC;CAC9D;AAMD;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,WAAW,EAAE,OAAO,CAAC,WAAW,CAO5C,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,aAAa,EAAE,OAAO,CAAC,aAAa,CAwBhD,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Reactive network state store.
3
+ *
4
+ * This store consumes `networkService` to provide reactive state for React components.
5
+ * The actual logic lives in `networkService` - this store only syncs the state.
6
+ */
7
+ /**
8
+ * Reactive network state store.
9
+ *
10
+ * Provides reactive `state.online` for UI components.
11
+ * For logic (waitForOnline, offlineRetry), use `networkService` directly.
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * // React component - use store for reactive state
16
+ * function NetworkIndicator() {
17
+ * const { online } = useStore(({ get }) => {
18
+ * const [state] = get(networkStore);
19
+ * return { online: state.online };
20
+ * });
21
+ * return online ? '🟢 Online' : '🔴 Offline';
22
+ * }
23
+ *
24
+ * // In store setup - use service for logic
25
+ * setup({ get, focus }) {
26
+ * const network = get(networkService);
27
+ * await network.waitForOnline();
28
+ * const robustFetch = fetchUsers.use(network.offlineRetry());
29
+ * }
30
+ * ```
31
+ */
32
+ export declare const networkStore: import('..').StoreSpec<{
33
+ /** Whether the network is currently online */
34
+ online: boolean;
35
+ }, {}>;
36
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/network/store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,YAAY;IAGrB,8CAA8C;;MAoBhD,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Network utility functions.
3
+ */
4
+ /**
5
+ * Check if an error is a network connectivity error.
6
+ * Works across Chrome, Firefox, Safari, React Native, and Apollo Client.
7
+ */
8
+ export declare function isNetworkError(error: unknown): boolean;
9
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/network/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAuDtD"}
@@ -5,5 +5,5 @@
5
5
  *
6
6
  * @packageDocumentation
7
7
  */
8
- export { persistMiddleware, notPersisted, type PersistOptions, type PersistLoadResult, } from './persist';
8
+ export { persist, notPersisted, type PersistOptions, type PersistLoadResult, } from './persist';
9
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/persist/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,KAAK,cAAc,EACnB,KAAK,iBAAiB,GACvB,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/persist/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,OAAO,EACP,YAAY,EACZ,KAAK,cAAc,EACnB,KAAK,iBAAiB,GACvB,MAAM,WAAW,CAAC"}
@@ -1,12 +1,18 @@
1
1
  import { m as meta } from "../meta-40r-AZfe.js";
2
- import { i as isPromiseLike } from "../isPromiseLike-bFkfHAbm.js";
2
+ function isPromiseLike(value) {
3
+ return typeof value === "object" && value !== null && "then" in value && typeof value.then === "function";
4
+ }
3
5
  const notPersisted = meta();
4
- function persistMiddleware(options) {
5
- const { filter, fields, load, save, onError, force = false } = options;
6
+ function persist(options) {
7
+ const { filter, fields, handler, onError, force = false } = options;
6
8
  return (context) => {
7
9
  const { next, meta: meta2 } = context;
8
10
  const instance = next();
9
- if (filter && !filter(context)) {
11
+ const persistContext = {
12
+ ...context,
13
+ store: instance
14
+ };
15
+ if (filter && !filter(persistContext)) {
10
16
  return instance;
11
17
  }
12
18
  const notPersistedInfo = meta2(notPersisted);
@@ -18,7 +24,7 @@ function persistMiddleware(options) {
18
24
  (field) => notPersistedInfo.fields[field] === true
19
25
  )
20
26
  );
21
- const stateFields = (fields == null ? void 0 : fields(context)) ?? context.spec.fields;
27
+ const stateFields = (fields == null ? void 0 : fields(persistContext)) ?? context.spec.fields;
22
28
  if (stateFields.length === 0) {
23
29
  return instance;
24
30
  }
@@ -38,44 +44,62 @@ function persistMiddleware(options) {
38
44
  }
39
45
  return filtered;
40
46
  };
41
- const hydrateWithState = (state) => {
42
- if (state != null) {
47
+ const setupPersistence = (persistHandler) => {
48
+ const { load, save } = persistHandler;
49
+ const hydrateWithState = (state) => {
50
+ if (state != null) {
51
+ try {
52
+ instance.hydrate(filterState(state), { force });
53
+ } catch (error) {
54
+ onError == null ? void 0 : onError(error, "load");
55
+ }
56
+ }
57
+ };
58
+ if (load) {
43
59
  try {
44
- instance.hydrate(filterState(state), { force });
60
+ const loadResult = load();
61
+ if (loadResult) {
62
+ if (isPromiseLike(loadResult)) {
63
+ loadResult.then(
64
+ (state) => hydrateWithState(state),
65
+ (error) => onError == null ? void 0 : onError(error, "load")
66
+ );
67
+ } else {
68
+ hydrateWithState(loadResult);
69
+ }
70
+ }
45
71
  } catch (error) {
46
- onError == null ? void 0 : onError(context, error, "load");
72
+ onError == null ? void 0 : onError(error, "load");
47
73
  }
48
74
  }
75
+ if (save) {
76
+ instance.subscribe(() => {
77
+ try {
78
+ const state = instance.dehydrate();
79
+ save(filterState(state));
80
+ } catch (error) {
81
+ onError == null ? void 0 : onError(error, "save");
82
+ }
83
+ });
84
+ }
49
85
  };
50
86
  try {
51
- const loadResult = load == null ? void 0 : load(context);
52
- if (loadResult) {
53
- if (isPromiseLike(loadResult)) {
54
- loadResult.then(
55
- (state) => hydrateWithState(state),
56
- (error) => onError == null ? void 0 : onError(context, error, "load")
57
- );
58
- } else {
59
- hydrateWithState(loadResult);
60
- }
87
+ const handlerResult = handler(persistContext);
88
+ if (isPromiseLike(handlerResult)) {
89
+ handlerResult.then(
90
+ (persistHandler) => setupPersistence(persistHandler),
91
+ (error) => onError == null ? void 0 : onError(error, "init")
92
+ );
93
+ } else {
94
+ setupPersistence(handlerResult);
61
95
  }
62
96
  } catch (error) {
63
- onError == null ? void 0 : onError(context, error, "load");
64
- }
65
- if (save) {
66
- instance.subscribe(() => {
67
- try {
68
- const state = instance.dehydrate();
69
- save(context, filterState(state));
70
- } catch (error) {
71
- onError == null ? void 0 : onError(context, error, "save");
72
- }
73
- });
97
+ onError == null ? void 0 : onError(error, "init");
74
98
  }
75
99
  return instance;
76
100
  };
77
101
  }
78
102
  export {
79
103
  notPersisted,
80
- persistMiddleware
104
+ persist
81
105
  };