@kontsedal/olas-core 0.0.1-rc.0 → 0.0.1

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 (40) hide show
  1. package/dist/index.cjs +2 -1
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.cts +13 -2
  4. package/dist/index.d.cts.map +1 -1
  5. package/dist/index.d.mts +13 -2
  6. package/dist/index.d.mts.map +1 -1
  7. package/dist/index.mjs +2 -2
  8. package/dist/index.mjs.map +1 -1
  9. package/dist/{root-BImHnGj1.mjs → root-BCZDC5Fv.mjs} +442 -139
  10. package/dist/root-BCZDC5Fv.mjs.map +1 -0
  11. package/dist/{root-Bazp5_Ik.cjs → root-DXV1gVbQ.cjs} +447 -138
  12. package/dist/root-DXV1gVbQ.cjs.map +1 -0
  13. package/dist/testing.cjs +1 -1
  14. package/dist/testing.d.cts +1 -1
  15. package/dist/testing.d.mts +1 -1
  16. package/dist/testing.mjs +1 -1
  17. package/dist/{types-CAMgqCMz.d.mts → types-CffZ1QXt.d.cts} +82 -10
  18. package/dist/types-CffZ1QXt.d.cts.map +1 -0
  19. package/dist/{types-emq_lZd7.d.cts → types-DSlDowpE.d.mts} +82 -10
  20. package/dist/types-DSlDowpE.d.mts.map +1 -0
  21. package/package.json +28 -2
  22. package/src/controller/instance.ts +115 -15
  23. package/src/controller/root.ts +9 -1
  24. package/src/controller/types.ts +17 -7
  25. package/src/forms/field.ts +73 -8
  26. package/src/forms/form-types.ts +16 -0
  27. package/src/forms/form.ts +171 -21
  28. package/src/index.ts +5 -0
  29. package/src/query/client.ts +161 -6
  30. package/src/query/define.ts +14 -0
  31. package/src/query/entry.ts +64 -42
  32. package/src/query/infinite.ts +77 -55
  33. package/src/query/mutation.ts +11 -21
  34. package/src/query/plugin.ts +50 -0
  35. package/src/query/use.ts +80 -3
  36. package/src/utils.ts +24 -0
  37. package/dist/root-BImHnGj1.mjs.map +0 -1
  38. package/dist/root-Bazp5_Ik.cjs.map +0 -1
  39. package/dist/types-CAMgqCMz.d.mts.map +0 -1
  40. package/dist/types-emq_lZd7.d.cts.map +0 -1
package/dist/testing.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_root = require("./root-Bazp5_Ik.cjs");
2
+ const require_root = require("./root-DXV1gVbQ.cjs");
3
3
  //#region src/testing.ts
4
4
  /**
5
5
  * Construct an isolated root wrapping a single controller. The returned object
@@ -1,4 +1,4 @@
1
- import { O as AsyncState, c as RootOptions, k as AsyncStatus, n as ControllerDef, o as Field, s as Root } from "./types-emq_lZd7.cjs";
1
+ import { O as AsyncState, c as RootOptions, k as AsyncStatus, n as ControllerDef, o as Field, s as Root } from "./types-CffZ1QXt.cjs";
2
2
 
3
3
  //#region src/testing.d.ts
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { O as AsyncState, c as RootOptions, k as AsyncStatus, n as ControllerDef, o as Field, s as Root } from "./types-CAMgqCMz.mjs";
1
+ import { O as AsyncState, c as RootOptions, k as AsyncStatus, n as ControllerDef, o as Field, s as Root } from "./types-DSlDowpE.mjs";
2
2
 
3
3
  //#region src/testing.d.ts
4
4
  /**
package/dist/testing.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { d as signal, l as computed, n as createRootWithProps } from "./root-BImHnGj1.mjs";
1
+ import { f as signal, n as createRootWithProps, u as computed } from "./root-BCZDC5Fv.mjs";
2
2
  //#region src/testing.ts
3
3
  /**
4
4
  * Construct an isolated root wrapping a single controller. The returned object
@@ -85,8 +85,24 @@ type DeepPartial<T> = T extends object ? T extends ReadonlyArray<infer U> ? Read
85
85
  type FormValidator<S extends FormSchema> = Validator<FormValue<S>>;
86
86
  type FieldArrayValidator<I> = Validator<FieldArrayValue<I>>;
87
87
  type FormOptions<S extends FormSchema> = {
88
+ /**
89
+ * Initial values for the form. A function form is **tracked** — if the
90
+ * function reads reactive signals (e.g. a query's `data`), the form re-seats
91
+ * itself when those signals change, but only while the form is not dirty
92
+ * (so a user mid-edit isn't clobbered by a background refetch). See
93
+ * `resetOnInitialChange` for opt-out. Spec §8.4.
94
+ */
88
95
  initial?: (() => DeepPartial<FormValue<S>> | undefined) | DeepPartial<FormValue<S>>;
89
96
  validators?: FormValidator<S>[];
97
+ /**
98
+ * When `initial` is a function and one of its tracked deps changes:
99
+ * - `'when-clean'` (default) — re-seat only if the form is not dirty.
100
+ * - `'never'` — never re-seat; `initial()` runs once at construction.
101
+ * - `'always'` — re-seat unconditionally (dirty state is discarded).
102
+ *
103
+ * Spec §20.7.
104
+ */
105
+ resetOnInitialChange?: 'when-clean' | 'never' | 'always';
90
106
  };
91
107
  type FieldArrayOptions<I> = {
92
108
  initial?: Array<ItemInitial<I>>;
@@ -356,9 +372,7 @@ type InfiniteQuery<Args extends unknown[], TPage, _TItem> = {
356
372
  readonly __olas: 'infiniteQuery';
357
373
  invalidate(...args: Args): void;
358
374
  invalidateAll(): void;
359
- setData(...args: [...Args, updater: (prev: TPage[] | undefined) => TPage[]]): {
360
- rollback: () => void;
361
- };
375
+ setData(...args: [...Args, updater: (prev: TPage[] | undefined) => TPage[]]): Snapshot;
362
376
  prefetch(...args: Args): Promise<TPage>;
363
377
  };
364
378
  /**
@@ -574,10 +588,44 @@ type QueryClientPluginApi = {
574
588
  */
575
589
  applyRemoteSetData(queryId: string, keyArgs: readonly unknown[], data: unknown): void;
576
590
  applyRemoteInvalidate(queryId: string, keyArgs: readonly unknown[]): void;
591
+ /**
592
+ * Apply a local-originated `setData` to the entry identified by
593
+ * `(queryId, keyArgs)`. The resulting plugin events fire with
594
+ * `isRemote: false` and `source: 'set'` — cross-tab plugins WILL
595
+ * rebroadcast (the write is treated as if a controller called
596
+ * `client.setData(...)` directly).
597
+ *
598
+ * Drops silently when the queryId is unknown, the registered query is
599
+ * infinite, or no local entry exists for that key. The `updater`
600
+ * receives the previous data (typed as `unknown` because plugins are
601
+ * type-erased) and returns the next.
602
+ *
603
+ * Use case: entity-normalization plugins that want to backpropagate an
604
+ * `entity.update(...)` patch into every query holding that entity.
605
+ * Mutations / optimistic updates already go through the public
606
+ * `client.setData` and don't need this API.
607
+ */
608
+ setEntryData(queryId: string, keyArgs: readonly unknown[], updater: (prev: unknown) => unknown): void;
577
609
  /**
578
610
  * Snapshot of currently bound entry keys for a query (by `queryId`). Empty
579
611
  * array when the query isn't registered, has no client entries, or the
580
612
  * `queryId` doesn't match any registered query.
613
+ *
614
+ * @example
615
+ * ```ts
616
+ * // Plugin sees an incoming invalidate; only echo it outward if any local
617
+ * // controller is actually subscribed to that key — otherwise the message
618
+ * // is unilateral noise.
619
+ * const plugin: QueryClientPlugin = {
620
+ * init(api) { this.api = api },
621
+ * onInvalidate(ev) {
622
+ * if (ev.isRemote) return
623
+ * const subscribed = this.api.subscribedKeys(ev.queryId)
624
+ * if (subscribed.length === 0) return // no local subscribers → don't send
625
+ * transport.send({ type: 'invalidate', queryId: ev.queryId, keyArgs: ev.keyArgs })
626
+ * },
627
+ * }
628
+ * ```
581
629
  */
582
630
  subscribedKeys(queryId: string): readonly (readonly unknown[])[];
583
631
  };
@@ -596,6 +644,18 @@ type SetDataEvent = {
596
644
  * skip rebroadcast in that case — otherwise the message would echo back.
597
645
  */
598
646
  isRemote: boolean;
647
+ /**
648
+ * Origin of the write. `'set'` covers explicit `client.setData` (mutations,
649
+ * optimistic updates, plugin-initiated patches). `'fetch'` fires when the
650
+ * query fetcher resolved successfully and wrote the result into the entry
651
+ * — emitted after the data signal is settled. `'remote'` is the
652
+ * `applyRemoteSetData` path (cross-tab / server-push); equivalent to
653
+ * `isRemote === true`.
654
+ *
655
+ * Layered plugins use this to decide whether to react: cross-tab broadcasts
656
+ * only on `'set'`, an entity-normalization plugin observes all sources.
657
+ */
658
+ source: 'set' | 'fetch' | 'remote';
599
659
  };
600
660
  type InvalidateEvent = {
601
661
  queryId: string;
@@ -755,18 +815,30 @@ type Ctx<TDeps = AmbientDeps> = {
755
815
  deps?: Partial<TDeps>;
756
816
  }): Api;
757
817
  /**
758
- * Like `child(...)` but additionally returns a `dispose()` handle so the
759
- * parent can tear down this specific sub-tree earlye.g. when the user
760
- * closes a details panel. The child is still disposed automatically when
761
- * the parent disposes; `dispose()` is idempotent and only earlies the
762
- * teardown. Useful for "openable" sub-controllers whose lifetime is driven
763
- * by a user gesture rather than the parent's lifetime alone.
818
+ * Like `child(...)` but additionally returns a handle that lets the parent
819
+ * control the attached sub-tree's lifecycle independently `dispose()`
820
+ * tears it down early, and `suspend()` / `resume()` freeze and thaw it.
821
+ * The child is still disposed automatically when the parent disposes;
822
+ * `dispose()` / `suspend()` / `resume()` are idempotent.
823
+ *
824
+ * `<KeepAlive controller={…}>` in `@kontsedal/olas-react` consumes the
825
+ * returned `{ suspend, resume }` directly — no hand-rolled `isPaused`
826
+ * signal needed on the child's `Api`. Useful for "openable" sub-
827
+ * controllers driven by a user gesture (modal, side panel, wizard).
828
+ *
829
+ * `suspend()` cascades through the attached controller's lifecycle
830
+ * entries: cache subscriptions pause `refetchInterval` and release the
831
+ * entry, effects are torn down, `onSuspend(...)` handlers fire. `resume()`
832
+ * re-runs effects, re-acquires cache entries (a stale entry refetches),
833
+ * and fires `onResume(...)`. Spec §4.1, §16.5.
764
834
  */
765
835
  attach<Props, Api>(def: ControllerDef<Props, Api>, props: Props, options?: {
766
836
  deps?: Partial<TDeps>;
767
837
  }): {
768
838
  api: Api;
769
839
  dispose: () => void;
840
+ suspend: () => void;
841
+ resume: () => void;
770
842
  };
771
843
  effect(fn: () => void | (() => void)): void;
772
844
  on<T>(emitter: Emitter<T>, handler: (value: T) => void): void;
@@ -813,4 +885,4 @@ type Root<Api> = Api & {
813
885
  };
814
886
  //#endregion
815
887
  export { Validator as $, DehydratedEntry as A, DeepPartial as B, DebugCacheEntry as C, InfiniteQuerySubscription as D, InfiniteQuerySpec as E, QuerySubscription as F, FieldArrayValue as G, FieldArrayItemErrors as H, RetryDelay as I, FormOptions as J, Form as K, RetryPolicy as L, LocalCache as M, Query as N, AsyncState as O, QuerySpec as P, ItemInitial as Q, Snapshot as R, DebugBus as S, InfiniteQuery as T, FieldArrayOptions as U, FieldArray as V, FieldArrayValidator as W, FormValidator as X, FormSchema as Y, FormValue as Z, SetDataEvent as _, Ctx as a, createEmitter as at, MutationConcurrency as b, RootOptions as c, defineScope as d, Computed as et, GcEvent as f, RegisteredQuery as g, QueryClientPluginApi as h, CtrlProps as i, Emitter as it, DehydratedState as j, AsyncStatus as k, Scope as l, QueryClientPlugin as m, ControllerDef as n, Signal as nt, Field as o, InvalidateEvent as p, FormErrors as q, CtrlApi as r, ErrorContext as rt, Root as s, AmbientDeps as t, ReadSignal as tt, ScopeOptions as u, lookupRegisteredQuery as v, DebugEvent as w, MutationSpec as x, Mutation as y, UseOptions as z };
816
- //# sourceMappingURL=types-CAMgqCMz.d.mts.map
888
+ //# sourceMappingURL=types-CffZ1QXt.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-CffZ1QXt.d.cts","names":[],"sources":["../src/emitter.ts","../src/errors.ts","../src/signals/types.ts","../src/forms/types.ts","../src/forms/form-types.ts","../src/query/types.ts","../src/query/infinite.ts","../src/devtools.ts","../src/query/mutation.ts","../src/query/plugin.ts","../src/scope.ts","../src/controller/types.ts"],"mappings":"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"}
@@ -85,8 +85,24 @@ type DeepPartial<T> = T extends object ? T extends ReadonlyArray<infer U> ? Read
85
85
  type FormValidator<S extends FormSchema> = Validator<FormValue<S>>;
86
86
  type FieldArrayValidator<I> = Validator<FieldArrayValue<I>>;
87
87
  type FormOptions<S extends FormSchema> = {
88
+ /**
89
+ * Initial values for the form. A function form is **tracked** — if the
90
+ * function reads reactive signals (e.g. a query's `data`), the form re-seats
91
+ * itself when those signals change, but only while the form is not dirty
92
+ * (so a user mid-edit isn't clobbered by a background refetch). See
93
+ * `resetOnInitialChange` for opt-out. Spec §8.4.
94
+ */
88
95
  initial?: (() => DeepPartial<FormValue<S>> | undefined) | DeepPartial<FormValue<S>>;
89
96
  validators?: FormValidator<S>[];
97
+ /**
98
+ * When `initial` is a function and one of its tracked deps changes:
99
+ * - `'when-clean'` (default) — re-seat only if the form is not dirty.
100
+ * - `'never'` — never re-seat; `initial()` runs once at construction.
101
+ * - `'always'` — re-seat unconditionally (dirty state is discarded).
102
+ *
103
+ * Spec §20.7.
104
+ */
105
+ resetOnInitialChange?: 'when-clean' | 'never' | 'always';
90
106
  };
91
107
  type FieldArrayOptions<I> = {
92
108
  initial?: Array<ItemInitial<I>>;
@@ -356,9 +372,7 @@ type InfiniteQuery<Args extends unknown[], TPage, _TItem> = {
356
372
  readonly __olas: 'infiniteQuery';
357
373
  invalidate(...args: Args): void;
358
374
  invalidateAll(): void;
359
- setData(...args: [...Args, updater: (prev: TPage[] | undefined) => TPage[]]): {
360
- rollback: () => void;
361
- };
375
+ setData(...args: [...Args, updater: (prev: TPage[] | undefined) => TPage[]]): Snapshot;
362
376
  prefetch(...args: Args): Promise<TPage>;
363
377
  };
364
378
  /**
@@ -574,10 +588,44 @@ type QueryClientPluginApi = {
574
588
  */
575
589
  applyRemoteSetData(queryId: string, keyArgs: readonly unknown[], data: unknown): void;
576
590
  applyRemoteInvalidate(queryId: string, keyArgs: readonly unknown[]): void;
591
+ /**
592
+ * Apply a local-originated `setData` to the entry identified by
593
+ * `(queryId, keyArgs)`. The resulting plugin events fire with
594
+ * `isRemote: false` and `source: 'set'` — cross-tab plugins WILL
595
+ * rebroadcast (the write is treated as if a controller called
596
+ * `client.setData(...)` directly).
597
+ *
598
+ * Drops silently when the queryId is unknown, the registered query is
599
+ * infinite, or no local entry exists for that key. The `updater`
600
+ * receives the previous data (typed as `unknown` because plugins are
601
+ * type-erased) and returns the next.
602
+ *
603
+ * Use case: entity-normalization plugins that want to backpropagate an
604
+ * `entity.update(...)` patch into every query holding that entity.
605
+ * Mutations / optimistic updates already go through the public
606
+ * `client.setData` and don't need this API.
607
+ */
608
+ setEntryData(queryId: string, keyArgs: readonly unknown[], updater: (prev: unknown) => unknown): void;
577
609
  /**
578
610
  * Snapshot of currently bound entry keys for a query (by `queryId`). Empty
579
611
  * array when the query isn't registered, has no client entries, or the
580
612
  * `queryId` doesn't match any registered query.
613
+ *
614
+ * @example
615
+ * ```ts
616
+ * // Plugin sees an incoming invalidate; only echo it outward if any local
617
+ * // controller is actually subscribed to that key — otherwise the message
618
+ * // is unilateral noise.
619
+ * const plugin: QueryClientPlugin = {
620
+ * init(api) { this.api = api },
621
+ * onInvalidate(ev) {
622
+ * if (ev.isRemote) return
623
+ * const subscribed = this.api.subscribedKeys(ev.queryId)
624
+ * if (subscribed.length === 0) return // no local subscribers → don't send
625
+ * transport.send({ type: 'invalidate', queryId: ev.queryId, keyArgs: ev.keyArgs })
626
+ * },
627
+ * }
628
+ * ```
581
629
  */
582
630
  subscribedKeys(queryId: string): readonly (readonly unknown[])[];
583
631
  };
@@ -596,6 +644,18 @@ type SetDataEvent = {
596
644
  * skip rebroadcast in that case — otherwise the message would echo back.
597
645
  */
598
646
  isRemote: boolean;
647
+ /**
648
+ * Origin of the write. `'set'` covers explicit `client.setData` (mutations,
649
+ * optimistic updates, plugin-initiated patches). `'fetch'` fires when the
650
+ * query fetcher resolved successfully and wrote the result into the entry
651
+ * — emitted after the data signal is settled. `'remote'` is the
652
+ * `applyRemoteSetData` path (cross-tab / server-push); equivalent to
653
+ * `isRemote === true`.
654
+ *
655
+ * Layered plugins use this to decide whether to react: cross-tab broadcasts
656
+ * only on `'set'`, an entity-normalization plugin observes all sources.
657
+ */
658
+ source: 'set' | 'fetch' | 'remote';
599
659
  };
600
660
  type InvalidateEvent = {
601
661
  queryId: string;
@@ -755,18 +815,30 @@ type Ctx<TDeps = AmbientDeps> = {
755
815
  deps?: Partial<TDeps>;
756
816
  }): Api;
757
817
  /**
758
- * Like `child(...)` but additionally returns a `dispose()` handle so the
759
- * parent can tear down this specific sub-tree earlye.g. when the user
760
- * closes a details panel. The child is still disposed automatically when
761
- * the parent disposes; `dispose()` is idempotent and only earlies the
762
- * teardown. Useful for "openable" sub-controllers whose lifetime is driven
763
- * by a user gesture rather than the parent's lifetime alone.
818
+ * Like `child(...)` but additionally returns a handle that lets the parent
819
+ * control the attached sub-tree's lifecycle independently `dispose()`
820
+ * tears it down early, and `suspend()` / `resume()` freeze and thaw it.
821
+ * The child is still disposed automatically when the parent disposes;
822
+ * `dispose()` / `suspend()` / `resume()` are idempotent.
823
+ *
824
+ * `<KeepAlive controller={…}>` in `@kontsedal/olas-react` consumes the
825
+ * returned `{ suspend, resume }` directly — no hand-rolled `isPaused`
826
+ * signal needed on the child's `Api`. Useful for "openable" sub-
827
+ * controllers driven by a user gesture (modal, side panel, wizard).
828
+ *
829
+ * `suspend()` cascades through the attached controller's lifecycle
830
+ * entries: cache subscriptions pause `refetchInterval` and release the
831
+ * entry, effects are torn down, `onSuspend(...)` handlers fire. `resume()`
832
+ * re-runs effects, re-acquires cache entries (a stale entry refetches),
833
+ * and fires `onResume(...)`. Spec §4.1, §16.5.
764
834
  */
765
835
  attach<Props, Api>(def: ControllerDef<Props, Api>, props: Props, options?: {
766
836
  deps?: Partial<TDeps>;
767
837
  }): {
768
838
  api: Api;
769
839
  dispose: () => void;
840
+ suspend: () => void;
841
+ resume: () => void;
770
842
  };
771
843
  effect(fn: () => void | (() => void)): void;
772
844
  on<T>(emitter: Emitter<T>, handler: (value: T) => void): void;
@@ -813,4 +885,4 @@ type Root<Api> = Api & {
813
885
  };
814
886
  //#endregion
815
887
  export { Validator as $, DehydratedEntry as A, DeepPartial as B, DebugCacheEntry as C, InfiniteQuerySubscription as D, InfiniteQuerySpec as E, QuerySubscription as F, FieldArrayValue as G, FieldArrayItemErrors as H, RetryDelay as I, FormOptions as J, Form as K, RetryPolicy as L, LocalCache as M, Query as N, AsyncState as O, QuerySpec as P, ItemInitial as Q, Snapshot as R, DebugBus as S, InfiniteQuery as T, FieldArrayOptions as U, FieldArray as V, FieldArrayValidator as W, FormValidator as X, FormSchema as Y, FormValue as Z, SetDataEvent as _, Ctx as a, createEmitter as at, MutationConcurrency as b, RootOptions as c, defineScope as d, Computed as et, GcEvent as f, RegisteredQuery as g, QueryClientPluginApi as h, CtrlProps as i, Emitter as it, DehydratedState as j, AsyncStatus as k, Scope as l, QueryClientPlugin as m, ControllerDef as n, Signal as nt, Field as o, InvalidateEvent as p, FormErrors as q, CtrlApi as r, ErrorContext as rt, Root as s, AmbientDeps as t, ReadSignal as tt, ScopeOptions as u, lookupRegisteredQuery as v, DebugEvent as w, MutationSpec as x, Mutation as y, UseOptions as z };
816
- //# sourceMappingURL=types-emq_lZd7.d.cts.map
888
+ //# sourceMappingURL=types-DSlDowpE.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-DSlDowpE.d.mts","names":[],"sources":["../src/emitter.ts","../src/errors.ts","../src/signals/types.ts","../src/forms/types.ts","../src/forms/form-types.ts","../src/query/types.ts","../src/query/infinite.ts","../src/devtools.ts","../src/query/mutation.ts","../src/query/plugin.ts","../src/scope.ts","../src/controller/types.ts"],"mappings":"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"}
package/package.json CHANGED
@@ -1,8 +1,31 @@
1
1
  {
2
2
  "name": "@kontsedal/olas-core",
3
- "version": "0.0.1-rc.0",
4
- "description": "Olas core — controller tree, signals, queries, mutations, forms",
3
+ "version": "0.0.1",
4
+ "description": "Olas core — controller-tree state management with signals, queries, mutations, and forms. Framework-agnostic.",
5
+ "keywords": [
6
+ "olas",
7
+ "controller-tree",
8
+ "signals",
9
+ "reactive",
10
+ "state-management",
11
+ "query-cache",
12
+ "mutation",
13
+ "optimistic-updates",
14
+ "forms",
15
+ "ssr",
16
+ "framework-agnostic"
17
+ ],
5
18
  "license": "MIT",
19
+ "author": "Bohdan Kontsedal <kontsedalbohdan@gmail.com>",
20
+ "homepage": "https://github.com/Kontsedal/olas/tree/main/packages/core#readme",
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "git+https://github.com/Kontsedal/olas.git",
24
+ "directory": "packages/core"
25
+ },
26
+ "bugs": {
27
+ "url": "https://github.com/Kontsedal/olas/issues"
28
+ },
6
29
  "type": "module",
7
30
  "main": "./dist/index.cjs",
8
31
  "module": "./dist/index.mjs",
@@ -40,6 +63,9 @@
40
63
  "devDependencies": {
41
64
  "@preact/signals-core": "^1.14.2"
42
65
  },
66
+ "publishConfig": {
67
+ "access": "public"
68
+ },
43
69
  "scripts": {
44
70
  "build": "tsdown",
45
71
  "typecheck": "tsc --noEmit"
@@ -2,7 +2,12 @@ import type { DevtoolsEmitter } from '../devtools'
2
2
  import { createEmitter, type Emitter } from '../emitter'
3
3
  import { dispatchError, type ErrorHandler } from '../errors'
4
4
  import { bindFieldDevtoolsOwner, createField } from '../forms/field'
5
- import { bindTreeToDevtools, createFieldArray, createForm } from '../forms/form'
5
+ import {
6
+ bindTreeToDevtools,
7
+ bindTreeValidatorErrorReporter,
8
+ createFieldArray,
9
+ createForm,
10
+ } from '../forms/form'
6
11
  import type {
7
12
  FieldArray,
8
13
  FieldArrayOptions,
@@ -36,6 +41,17 @@ type LifecycleEntry =
36
41
  dispose: (() => void) | null
37
42
  }
38
43
  | { kind: 'cleanup'; dispose: () => void }
44
+ | {
45
+ /**
46
+ * Cache subscription via `ctx.use`. Suspend/resume call the
47
+ * `suspend`/`resume` hooks so the underlying entry's `refetchInterval`
48
+ * and event listeners pause for the duration. Spec §4.1.
49
+ */
50
+ kind: 'subscription-cache'
51
+ dispose: () => void
52
+ suspend: () => void
53
+ resume: () => void
54
+ }
39
55
  | { kind: 'child'; instance: ControllerInstance }
40
56
  | { kind: 'onDispose'; fn: () => void }
41
57
  | { kind: 'onSuspend'; fn: () => void }
@@ -109,7 +125,6 @@ export class ControllerInstance {
109
125
 
110
126
  dispose(): void {
111
127
  if (this.state === 'disposed') return
112
- const wasSuspended = this.state === 'suspended'
113
128
  this.state = 'disposed'
114
129
 
115
130
  for (let i = this.entries.length - 1; i >= 0; i--) {
@@ -130,8 +145,6 @@ export class ControllerInstance {
130
145
  if (__DEV__) {
131
146
  this.rootShared.devtools.emit({ type: 'controller:disposed', path: this.path })
132
147
  }
133
- // Silence "unused" — `wasSuspended` may inform future logic; intentionally a no-op for now.
134
- void wasSuspended
135
148
  }
136
149
 
137
150
  private disposeEntry(entry: LifecycleEntry): void {
@@ -143,6 +156,9 @@ export class ControllerInstance {
143
156
  case 'cleanup':
144
157
  entry.dispose()
145
158
  break
159
+ case 'subscription-cache':
160
+ entry.dispose()
161
+ break
146
162
  case 'child':
147
163
  entry.instance.dispose()
148
164
  break
@@ -172,6 +188,11 @@ export class ControllerInstance {
172
188
  entry.dispose?.()
173
189
  entry.dispose = null
174
190
  break
191
+ case 'subscription-cache':
192
+ // Pause `refetchInterval` + focus/online listeners + release the
193
+ // entry from this subscriber. Spec §4.1.
194
+ entry.suspend()
195
+ break
175
196
  case 'child':
176
197
  entry.instance.suspend()
177
198
  break
@@ -204,6 +225,11 @@ export class ControllerInstance {
204
225
  case 'effect':
205
226
  entry.dispose = standaloneEffect(entry.factory)
206
227
  break
228
+ case 'subscription-cache':
229
+ // Re-acquire the entry, restart `refetchInterval`, and re-check
230
+ // staleness (a stale entry refetches on resume — spec §4.1).
231
+ entry.resume()
232
+ break
207
233
  case 'child':
208
234
  entry.instance.resume()
209
235
  break
@@ -255,7 +281,12 @@ export class ControllerInstance {
255
281
  }
256
282
  }
257
283
  entry.factory = wrapped
258
- entry.dispose = standaloneEffect(wrapped)
284
+ // If we're suspended, register the entry but defer activation to
285
+ // `resume()` — otherwise the resume loop would overwrite a live
286
+ // `dispose` ref (the just-activated effect), leaking it.
287
+ if (self.state !== 'suspended') {
288
+ entry.dispose = standaloneEffect(wrapped)
289
+ }
259
290
  self.entries.push(entry)
260
291
  },
261
292
 
@@ -271,21 +302,31 @@ export class ControllerInstance {
271
302
  use(query: any, keyOrOptions?: any): any {
272
303
  const brand = (query as { __olas?: string }).__olas
273
304
  if (brand === 'infiniteQuery') {
274
- const { subscription, dispose: d } = createInfiniteUse(
305
+ const handle = createInfiniteUse(
275
306
  self.rootShared.queryClient,
276
307
  query as InfiniteQuery<unknown[], unknown, unknown>,
277
308
  keyOrOptions,
278
309
  )
279
- self.entries.push({ kind: 'cleanup', dispose: d })
280
- return subscription
310
+ self.entries.push({
311
+ kind: 'subscription-cache',
312
+ dispose: handle.dispose,
313
+ suspend: handle.suspend,
314
+ resume: handle.resume,
315
+ })
316
+ return handle.subscription
281
317
  }
282
- const { subscription, dispose: d } = createUse(
318
+ const handle = createUse(
283
319
  self.rootShared.queryClient,
284
320
  query as Query<unknown[], unknown>,
285
321
  keyOrOptions,
286
322
  )
287
- self.entries.push({ kind: 'cleanup', dispose: d })
288
- return subscription
323
+ self.entries.push({
324
+ kind: 'subscription-cache',
325
+ dispose: handle.dispose,
326
+ suspend: handle.suspend,
327
+ resume: handle.resume,
328
+ })
329
+ return handle.subscription
289
330
  },
290
331
 
291
332
  mutation<V, R>(spec: MutationSpec<V, R>): Mutation<V, R> {
@@ -307,7 +348,17 @@ export class ControllerInstance {
307
348
  },
308
349
 
309
350
  field<T>(initial: T, validators?: ReadonlyArray<Validator<T>>): Field<T> {
310
- const f = createField(initial, validators)
351
+ // Pass the reporter at construct time so the FIRST validator pass
352
+ // (which runs synchronously in the FieldImpl constructor's
353
+ // validator-effect) is covered.
354
+ const f = createField(initial, validators, {
355
+ onValidatorError: (err) => {
356
+ dispatchError(self.rootShared.onError, err, {
357
+ kind: 'effect',
358
+ controllerPath: self.path,
359
+ })
360
+ },
361
+ })
311
362
  self.entries.push({ kind: 'cleanup', dispose: () => f.dispose() })
312
363
  // Standalone fields (not inside a form) still publish field:validated
313
364
  // events. Use the controller path with field name "(field)" — the
@@ -321,7 +372,13 @@ export class ControllerInstance {
321
372
  },
322
373
 
323
374
  form<S extends FormSchema>(schema: S, options?: FormOptions<S>): Form<S> {
324
- const f = createForm(schema, options)
375
+ const reporter = (err: unknown): void => {
376
+ dispatchError(self.rootShared.onError, err, {
377
+ kind: 'effect',
378
+ controllerPath: self.path,
379
+ })
380
+ }
381
+ const f = createForm(schema, options, { onValidatorError: reporter })
325
382
  self.entries.push({ kind: 'cleanup', dispose: () => f.dispose() })
326
383
  // Make every leaf field publish `field:validated` to the devtools bus
327
384
  // with its key path inside the form. See spec §20.9.
@@ -332,6 +389,12 @@ export class ControllerInstance {
332
389
  self.rootShared.devtools,
333
390
  )
334
391
  self.entries.push({ kind: 'cleanup', dispose: stop })
392
+ // Bind the reporter onto every leaf in the tree too (the form itself
393
+ // got it via the constructor option; nested forms/arrays inside the
394
+ // schema didn't, since they were constructed by the caller before
395
+ // ctx.form ran). Idempotent — leaves that already got the reporter
396
+ // via ctx.field get the same one set again.
397
+ bindTreeValidatorErrorReporter(f as unknown as Form<FormSchema>, reporter)
335
398
  return f
336
399
  },
337
400
 
@@ -339,7 +402,13 @@ export class ControllerInstance {
339
402
  itemFactory: (initial?: ItemInitial<I>) => I,
340
403
  options?: FieldArrayOptions<I>,
341
404
  ): FieldArray<I> {
342
- const fa = createFieldArray<I>(itemFactory, options)
405
+ const reporter = (err: unknown): void => {
406
+ dispatchError(self.rootShared.onError, err, {
407
+ kind: 'effect',
408
+ controllerPath: self.path,
409
+ })
410
+ }
411
+ const fa = createFieldArray<I>(itemFactory, options, { onValidatorError: reporter })
343
412
  self.entries.push({ kind: 'cleanup', dispose: () => fa.dispose() })
344
413
  const stop = bindTreeToDevtools(
345
414
  fa as unknown as FieldArray<Field<unknown> | Form<FormSchema>>,
@@ -348,6 +417,10 @@ export class ControllerInstance {
348
417
  self.rootShared.devtools,
349
418
  )
350
419
  self.entries.push({ kind: 'cleanup', dispose: stop })
420
+ bindTreeValidatorErrorReporter(
421
+ fa as unknown as FieldArray<Field<unknown> | Form<FormSchema>>,
422
+ reporter,
423
+ )
351
424
  return fa
352
425
  },
353
426
 
@@ -407,7 +480,7 @@ export class ControllerInstance {
407
480
  def: ControllerDef<Props, Api>,
408
481
  props: Props,
409
482
  options?: { deps?: Partial<Record<string, unknown>> },
410
- ): { api: Api; dispose: () => void } {
483
+ ): { api: Api; dispose: () => void; suspend: () => void; resume: () => void } {
411
484
  const segment = self.makeChildSegment(getFactory(def), getName(def))
412
485
  const override = options?.deps
413
486
  const childDeps = override !== undefined ? { ...self.deps, ...override } : self.deps
@@ -432,6 +505,33 @@ export class ControllerInstance {
432
505
  })
433
506
  }
434
507
  },
508
+ // Suspend / resume cascade through the child instance's lifecycle
509
+ // entries (same code path as `root.suspend()`); the child's state
510
+ // machine handles the no-op cases (suspending a disposed child,
511
+ // resuming an active child) on its own — no need to track an
512
+ // extra flag here.
513
+ suspend: () => {
514
+ if (disposed) return
515
+ try {
516
+ childInstance.suspend()
517
+ } catch (err) {
518
+ dispatchError(self.rootShared.onError, err, {
519
+ kind: 'effect',
520
+ controllerPath: self.path,
521
+ })
522
+ }
523
+ },
524
+ resume: () => {
525
+ if (disposed) return
526
+ try {
527
+ childInstance.resume()
528
+ } catch (err) {
529
+ dispatchError(self.rootShared.onError, err, {
530
+ kind: 'effect',
531
+ controllerPath: self.path,
532
+ })
533
+ }
534
+ },
435
535
  }
436
536
  },
437
537