@kontsedal/olas-core 0.0.5 → 0.1.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 (61) hide show
  1. package/dist/index.cjs +0 -0
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.cts +109 -27
  4. package/dist/index.d.cts.map +1 -1
  5. package/dist/index.d.mts +109 -27
  6. package/dist/index.d.mts.map +1 -1
  7. package/dist/index.mjs +0 -0
  8. package/dist/index.mjs.map +1 -1
  9. package/dist/{root-DqWolle_.mjs → root-Byq-QYTp.mjs} +1478 -347
  10. package/dist/root-Byq-QYTp.mjs.map +1 -0
  11. package/dist/{root-lBp7qziQ.cjs → root-CPSL5kpR.cjs} +1483 -346
  12. package/dist/root-CPSL5kpR.cjs.map +1 -0
  13. package/dist/testing.cjs +5 -1
  14. package/dist/testing.cjs.map +1 -1
  15. package/dist/testing.d.cts +3 -2
  16. package/dist/testing.d.cts.map +1 -1
  17. package/dist/testing.d.mts +3 -2
  18. package/dist/testing.d.mts.map +1 -1
  19. package/dist/testing.mjs +5 -2
  20. package/dist/testing.mjs.map +1 -1
  21. package/dist/{types-BH1o6nYa.d.mts → types-Brp-4WaZ.d.mts} +244 -23
  22. package/dist/types-Brp-4WaZ.d.mts.map +1 -0
  23. package/dist/{types-C4Vtkxbn.d.cts → types-DzDIypPo.d.cts} +244 -23
  24. package/dist/types-DzDIypPo.d.cts.map +1 -0
  25. package/package.json +4 -1
  26. package/src/controller/instance.ts +360 -94
  27. package/src/controller/root.ts +58 -30
  28. package/src/controller/types.ts +66 -4
  29. package/src/emitter.ts +8 -2
  30. package/src/errors.ts +39 -3
  31. package/src/forms/field.ts +219 -25
  32. package/src/forms/form-types.ts +16 -3
  33. package/src/forms/form.ts +360 -38
  34. package/src/forms/index.ts +3 -1
  35. package/src/forms/types.ts +27 -1
  36. package/src/forms/validators.ts +45 -11
  37. package/src/index.ts +13 -7
  38. package/src/query/client.ts +237 -58
  39. package/src/query/define.ts +0 -0
  40. package/src/query/entry.ts +259 -15
  41. package/src/query/focus-online.ts +53 -11
  42. package/src/query/infinite.ts +351 -47
  43. package/src/query/keys.ts +33 -2
  44. package/src/query/local.ts +3 -0
  45. package/src/query/mutation.ts +27 -6
  46. package/src/query/plugin.ts +43 -4
  47. package/src/query/types.ts +76 -6
  48. package/src/query/use.ts +53 -10
  49. package/src/selection.ts +49 -12
  50. package/src/signals/readonly.ts +3 -0
  51. package/src/signals/runtime.ts +27 -0
  52. package/src/signals/types.ts +10 -0
  53. package/src/testing.ts +9 -0
  54. package/src/timing/debounced.ts +106 -23
  55. package/src/timing/index.ts +1 -1
  56. package/src/timing/throttled.ts +85 -28
  57. package/src/utils.ts +15 -2
  58. package/dist/root-DqWolle_.mjs.map +0 -1
  59. package/dist/root-lBp7qziQ.cjs.map +0 -1
  60. package/dist/types-BH1o6nYa.d.mts.map +0 -1
  61. package/dist/types-C4Vtkxbn.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-lBp7qziQ.cjs");
2
+ const require_root = require("./root-CPSL5kpR.cjs");
3
3
  //#region src/testing.ts
4
4
  /**
5
5
  * Construct an isolated root wrapping a single controller. The returned object
@@ -34,6 +34,7 @@ function fakeField(initial, overrides) {
34
34
  },
35
35
  peek: () => value$.peek(),
36
36
  subscribe: (handler) => value$.subscribe(handler),
37
+ subscribeChanges: (handler) => value$.subscribeChanges(handler),
37
38
  errors: errors$,
38
39
  isValid: isValid$,
39
40
  isDirty: dirty$,
@@ -67,6 +68,7 @@ function fakeAsyncState(overrides) {
67
68
  const isStale$ = require_root.signal(overrides?.isStale ?? false);
68
69
  const lastUpdatedAt$ = require_root.signal(overrides?.lastUpdatedAt);
69
70
  const hasPendingMutations$ = require_root.signal(overrides?.hasPendingMutations ?? false);
71
+ const isPaused$ = require_root.signal(overrides?.isPaused ?? false);
70
72
  const refetch = overrides?.refetch ?? (async () => data$.peek());
71
73
  const reset = overrides?.reset ?? (() => {});
72
74
  const firstValue = overrides?.firstValue ?? (async () => data$.peek());
@@ -79,6 +81,7 @@ function fakeAsyncState(overrides) {
79
81
  isStale: isStale$,
80
82
  lastUpdatedAt: lastUpdatedAt$,
81
83
  hasPendingMutations: hasPendingMutations$,
84
+ isPaused: isPaused$,
82
85
  refetch,
83
86
  reset,
84
87
  firstValue,
@@ -86,6 +89,7 @@ function fakeAsyncState(overrides) {
86
89
  };
87
90
  }
88
91
  //#endregion
92
+ exports._unregisterMutationById = require_root._unregisterMutationById;
89
93
  exports.createTestController = createTestController;
90
94
  exports.fakeAsyncState = fakeAsyncState;
91
95
  exports.fakeField = fakeField;
@@ -1 +1 @@
1
- {"version":3,"file":"testing.cjs","names":["createRootWithProps","signal","computed"],"sources":["../src/testing.ts"],"sourcesContent":["import { createRootWithProps } from './controller/root'\nimport type { ControllerDef, Field, Root, RootOptions } from './controller/types'\nimport type { AsyncState, AsyncStatus } from './query/types'\nimport { computed, type ReadSignal, type Signal, signal } from './signals'\n\n/**\n * Construct an isolated root wrapping a single controller. The returned object\n * is the controller's api plus the standard Root lifecycle controls\n * (`dispose`, `suspend`, `resume`, `__debug`).\n *\n * Equivalent to defining a tiny root wrapper, but ergonomic in tests.\n */\nexport function createTestController<\n Props,\n Api,\n TDeps extends Record<string, unknown> = Record<string, unknown>,\n>(\n def: ControllerDef<Props, Api>,\n options: {\n deps: TDeps\n props: Props\n onError?: RootOptions<TDeps>['onError']\n },\n): Root<Api> {\n return createRootWithProps<Props, Api, TDeps>(def, options.props, {\n deps: options.deps,\n onError: options.onError,\n })\n}\n\n/**\n * Shape-correct fake `Field<T>` for UI tests. Pass an initial value plus any\n * overrides for the read-only signals. The returned object satisfies `Field<T>`\n * so it can be passed straight into `useField(...)` or any component that\n * accepts a real field. See spec §20.10.\n */\nexport function fakeField<T>(\n initial: T,\n overrides?: Partial<{\n errors: string[]\n isValid: boolean\n isDirty: boolean\n touched: boolean\n isValidating: boolean\n set: (value: T) => void\n setAsInitial: (value: T) => void\n reset: () => void\n markTouched: () => void\n revalidate: () => Promise<boolean>\n setErrors: (errors: ReadonlyArray<string>) => void\n dispose: () => void\n }>,\n): Field<T> {\n const value$: Signal<T> = signal(initial)\n const errors$: Signal<string[]> = signal(overrides?.errors ?? [])\n const touched$: Signal<boolean> = signal(overrides?.touched ?? false)\n const dirty$: Signal<boolean> = signal(overrides?.isDirty ?? false)\n const validating$: Signal<boolean> = signal(overrides?.isValidating ?? false)\n const isValid$: ReadSignal<boolean> =\n overrides?.isValid !== undefined\n ? signal(overrides.isValid)\n : computed(() => errors$.value.length === 0 && !validating$.value)\n\n let currentInitial = initial\n const set = overrides?.set ?? ((next: T) => value$.set(next))\n const setAsInitial =\n overrides?.setAsInitial ??\n ((next: T) => {\n currentInitial = next\n value$.set(next)\n dirty$.set(false)\n })\n const fake: Field<T> = {\n get value() {\n return value$.value\n },\n peek: () => value$.peek(),\n subscribe: (handler) => value$.subscribe(handler),\n errors: errors$,\n isValid: isValid$,\n isDirty: dirty$,\n touched: touched$,\n isValidating: validating$,\n set,\n setAsInitial,\n reset: overrides?.reset ?? (() => value$.set(currentInitial)),\n markTouched: overrides?.markTouched ?? (() => touched$.set(true)),\n revalidate: overrides?.revalidate ?? (async () => errors$.peek().length === 0),\n setErrors: overrides?.setErrors ?? ((errs) => errors$.set([...errs])),\n dispose: overrides?.dispose ?? (() => {}),\n }\n return fake\n}\n\n/**\n * Shape-correct fake `AsyncState<T>` for UI tests. Pass overrides for any of\n * the signal-backed properties; everything else falls back to inert defaults.\n * The returned object satisfies `AsyncState<T>` so it can stand in for a real\n * query subscription in component tests. See spec §20.10.\n */\nexport function fakeAsyncState<T>(\n overrides?: Partial<{\n data: T | undefined\n error: unknown | undefined\n status: AsyncStatus\n isLoading: boolean\n isFetching: boolean\n isStale: boolean\n lastUpdatedAt: number | undefined\n hasPendingMutations: boolean\n refetch: () => Promise<T>\n reset: () => void\n firstValue: () => Promise<T>\n promise: () => Promise<T>\n }>,\n): AsyncState<T> {\n const data$: ReadSignal<T | undefined> = signal(overrides?.data)\n const error$: ReadSignal<unknown | undefined> = signal(overrides?.error)\n const status$: ReadSignal<AsyncStatus> = signal(\n overrides?.status ?? (overrides?.data !== undefined ? 'success' : 'idle'),\n )\n const isLoading$: ReadSignal<boolean> = signal(overrides?.isLoading ?? false)\n const isFetching$: ReadSignal<boolean> = signal(overrides?.isFetching ?? false)\n const isStale$: ReadSignal<boolean> = signal(overrides?.isStale ?? false)\n const lastUpdatedAt$: ReadSignal<number | undefined> = signal(overrides?.lastUpdatedAt)\n const hasPendingMutations$: ReadSignal<boolean> = signal(overrides?.hasPendingMutations ?? false)\n\n const refetch = overrides?.refetch ?? (async () => data$.peek() as T)\n const reset = overrides?.reset ?? (() => {})\n const firstValue = overrides?.firstValue ?? (async () => data$.peek() as T)\n const promise = overrides?.promise ?? firstValue\n\n return {\n data: data$,\n error: error$,\n status: status$,\n isLoading: isLoading$,\n isFetching: isFetching$,\n isStale: isStale$,\n lastUpdatedAt: lastUpdatedAt$,\n hasPendingMutations: hasPendingMutations$,\n refetch,\n reset,\n firstValue,\n promise,\n }\n}\n"],"mappings":";;;;;;;;;;AAYA,SAAgB,qBAKd,KACA,SAKW;CACX,OAAOA,aAAAA,oBAAuC,KAAK,QAAQ,OAAO;EAChE,MAAM,QAAQ;EACd,SAAS,QAAQ;CACnB,CAAC;AACH;;;;;;;AAQA,SAAgB,UACd,SACA,WAcU;CACV,MAAM,SAAoBC,aAAAA,OAAO,OAAO;CACxC,MAAM,UAA4BA,aAAAA,OAAO,WAAW,UAAU,CAAC,CAAC;CAChE,MAAM,WAA4BA,aAAAA,OAAO,WAAW,WAAW,KAAK;CACpE,MAAM,SAA0BA,aAAAA,OAAO,WAAW,WAAW,KAAK;CAClE,MAAM,cAA+BA,aAAAA,OAAO,WAAW,gBAAgB,KAAK;CAC5E,MAAM,WACJ,WAAW,YAAY,KAAA,IACnBA,aAAAA,OAAO,UAAU,OAAO,IACxBC,aAAAA,eAAe,QAAQ,MAAM,WAAW,KAAK,CAAC,YAAY,KAAK;CAErE,IAAI,iBAAiB;CA4BrB,OAAO;EAlBL,IAAI,QAAQ;GACV,OAAO,OAAO;EAChB;EACA,YAAY,OAAO,KAAK;EACxB,YAAY,YAAY,OAAO,UAAU,OAAO;EAChD,QAAQ;EACR,SAAS;EACT,SAAS;EACT,SAAS;EACT,cAAc;EACd,KAnBU,WAAW,SAAS,SAAY,OAAO,IAAI,IAAI;EAoBzD,cAlBA,WAAW,kBACT,SAAY;GACZ,iBAAiB;GACjB,OAAO,IAAI,IAAI;GACf,OAAO,IAAI,KAAK;EAClB;EAcA,OAAO,WAAW,gBAAgB,OAAO,IAAI,cAAc;EAC3D,aAAa,WAAW,sBAAsB,SAAS,IAAI,IAAI;EAC/D,YAAY,WAAW,eAAe,YAAY,QAAQ,KAAK,EAAE,WAAW;EAC5E,WAAW,WAAW,eAAe,SAAS,QAAQ,IAAI,CAAC,GAAG,IAAI,CAAC;EACnE,SAAS,WAAW,kBAAkB,CAAC;CAE/B;AACZ;;;;;;;AAQA,SAAgB,eACd,WAce;CACf,MAAM,QAAmCD,aAAAA,OAAO,WAAW,IAAI;CAC/D,MAAM,SAA0CA,aAAAA,OAAO,WAAW,KAAK;CACvE,MAAM,UAAmCA,aAAAA,OACvC,WAAW,WAAW,WAAW,SAAS,KAAA,IAAY,YAAY,OACpE;CACA,MAAM,aAAkCA,aAAAA,OAAO,WAAW,aAAa,KAAK;CAC5E,MAAM,cAAmCA,aAAAA,OAAO,WAAW,cAAc,KAAK;CAC9E,MAAM,WAAgCA,aAAAA,OAAO,WAAW,WAAW,KAAK;CACxE,MAAM,iBAAiDA,aAAAA,OAAO,WAAW,aAAa;CACtF,MAAM,uBAA4CA,aAAAA,OAAO,WAAW,uBAAuB,KAAK;CAEhG,MAAM,UAAU,WAAW,YAAY,YAAY,MAAM,KAAK;CAC9D,MAAM,QAAQ,WAAW,gBAAgB,CAAC;CAC1C,MAAM,aAAa,WAAW,eAAe,YAAY,MAAM,KAAK;CAGpE,OAAO;EACL,MAAM;EACN,OAAO;EACP,QAAQ;EACR,WAAW;EACX,YAAY;EACZ,SAAS;EACT,eAAe;EACf,qBAAqB;EACrB;EACA;EACA;EACA,SAdc,WAAW,WAAW;CAetC;AACF"}
1
+ {"version":3,"file":"testing.cjs","names":["createRootWithProps","signal","computed"],"sources":["../src/testing.ts"],"sourcesContent":["import { createRootWithProps } from './controller/root'\nimport type { ControllerDef, Field, Root, RootOptions } from './controller/types'\nimport type { AsyncState, AsyncStatus } from './query/types'\nimport { computed, type ReadSignal, type Signal, signal } from './signals'\n\n// Test-only registry teardown — lives on the `@kontsedal/olas-core/testing`\n// sub-path, NOT the public entry (T3.9). Lets tests reusing a `mutationId`\n// across cases avoid registry bleed.\nexport { _unregisterMutationById } from './query/plugin'\n\n/**\n * Construct an isolated root wrapping a single controller. The returned object\n * is the controller's api plus the standard Root lifecycle controls\n * (`dispose`, `suspend`, `resume`, `__debug`).\n *\n * Equivalent to defining a tiny root wrapper, but ergonomic in tests.\n */\nexport function createTestController<\n Props,\n Api,\n TDeps extends Record<string, unknown> = Record<string, unknown>,\n>(\n def: ControllerDef<Props, Api>,\n options: {\n deps: TDeps\n props: Props\n onError?: RootOptions<TDeps>['onError']\n },\n): Root<Api> {\n return createRootWithProps<Props, Api, TDeps>(def, options.props, {\n deps: options.deps,\n onError: options.onError,\n })\n}\n\n/**\n * Shape-correct fake `Field<T>` for UI tests. Pass an initial value plus any\n * overrides for the read-only signals. The returned object satisfies `Field<T>`\n * so it can be passed straight into `useField(...)` or any component that\n * accepts a real field. See spec §20.10.\n */\nexport function fakeField<T>(\n initial: T,\n overrides?: Partial<{\n errors: string[]\n isValid: boolean\n isDirty: boolean\n touched: boolean\n isValidating: boolean\n set: (value: T) => void\n setAsInitial: (value: T) => void\n reset: () => void\n markTouched: () => void\n revalidate: () => Promise<boolean>\n setErrors: (errors: ReadonlyArray<string>) => void\n dispose: () => void\n }>,\n): Field<T> {\n const value$: Signal<T> = signal(initial)\n const errors$: Signal<string[]> = signal(overrides?.errors ?? [])\n const touched$: Signal<boolean> = signal(overrides?.touched ?? false)\n const dirty$: Signal<boolean> = signal(overrides?.isDirty ?? false)\n const validating$: Signal<boolean> = signal(overrides?.isValidating ?? false)\n const isValid$: ReadSignal<boolean> =\n overrides?.isValid !== undefined\n ? signal(overrides.isValid)\n : computed(() => errors$.value.length === 0 && !validating$.value)\n\n let currentInitial = initial\n const set = overrides?.set ?? ((next: T) => value$.set(next))\n const setAsInitial =\n overrides?.setAsInitial ??\n ((next: T) => {\n currentInitial = next\n value$.set(next)\n dirty$.set(false)\n })\n const fake: Field<T> = {\n get value() {\n return value$.value\n },\n peek: () => value$.peek(),\n subscribe: (handler) => value$.subscribe(handler),\n subscribeChanges: (handler) => value$.subscribeChanges(handler),\n errors: errors$,\n isValid: isValid$,\n isDirty: dirty$,\n touched: touched$,\n isValidating: validating$,\n set,\n setAsInitial,\n reset: overrides?.reset ?? (() => value$.set(currentInitial)),\n markTouched: overrides?.markTouched ?? (() => touched$.set(true)),\n revalidate: overrides?.revalidate ?? (async () => errors$.peek().length === 0),\n setErrors: overrides?.setErrors ?? ((errs) => errors$.set([...errs])),\n dispose: overrides?.dispose ?? (() => {}),\n }\n return fake\n}\n\n/**\n * Shape-correct fake `AsyncState<T>` for UI tests. Pass overrides for any of\n * the signal-backed properties; everything else falls back to inert defaults.\n * The returned object satisfies `AsyncState<T>` so it can stand in for a real\n * query subscription in component tests. See spec §20.10.\n */\nexport function fakeAsyncState<T>(\n overrides?: Partial<{\n data: T | undefined\n error: unknown | undefined\n status: AsyncStatus\n isLoading: boolean\n isFetching: boolean\n isStale: boolean\n lastUpdatedAt: number | undefined\n hasPendingMutations: boolean\n isPaused: boolean\n refetch: () => Promise<T>\n reset: () => void\n firstValue: () => Promise<T>\n promise: () => Promise<T>\n }>,\n): AsyncState<T> {\n const data$: ReadSignal<T | undefined> = signal(overrides?.data)\n const error$: ReadSignal<unknown | undefined> = signal(overrides?.error)\n const status$: ReadSignal<AsyncStatus> = signal(\n overrides?.status ?? (overrides?.data !== undefined ? 'success' : 'idle'),\n )\n const isLoading$: ReadSignal<boolean> = signal(overrides?.isLoading ?? false)\n const isFetching$: ReadSignal<boolean> = signal(overrides?.isFetching ?? false)\n const isStale$: ReadSignal<boolean> = signal(overrides?.isStale ?? false)\n const lastUpdatedAt$: ReadSignal<number | undefined> = signal(overrides?.lastUpdatedAt)\n const hasPendingMutations$: ReadSignal<boolean> = signal(overrides?.hasPendingMutations ?? false)\n const isPaused$: ReadSignal<boolean> = signal(overrides?.isPaused ?? false)\n\n const refetch = overrides?.refetch ?? (async () => data$.peek() as T)\n const reset = overrides?.reset ?? (() => {})\n const firstValue = overrides?.firstValue ?? (async () => data$.peek() as T)\n const promise = overrides?.promise ?? firstValue\n\n return {\n data: data$,\n error: error$,\n status: status$,\n isLoading: isLoading$,\n isFetching: isFetching$,\n isStale: isStale$,\n lastUpdatedAt: lastUpdatedAt$,\n hasPendingMutations: hasPendingMutations$,\n isPaused: isPaused$,\n refetch,\n reset,\n firstValue,\n promise,\n }\n}\n"],"mappings":";;;;;;;;;;AAiBA,SAAgB,qBAKd,KACA,SAKW;CACX,OAAOA,aAAAA,oBAAuC,KAAK,QAAQ,OAAO;EAChE,MAAM,QAAQ;EACd,SAAS,QAAQ;CACnB,CAAC;AACH;;;;;;;AAQA,SAAgB,UACd,SACA,WAcU;CACV,MAAM,SAAoBC,aAAAA,OAAO,OAAO;CACxC,MAAM,UAA4BA,aAAAA,OAAO,WAAW,UAAU,CAAC,CAAC;CAChE,MAAM,WAA4BA,aAAAA,OAAO,WAAW,WAAW,KAAK;CACpE,MAAM,SAA0BA,aAAAA,OAAO,WAAW,WAAW,KAAK;CAClE,MAAM,cAA+BA,aAAAA,OAAO,WAAW,gBAAgB,KAAK;CAC5E,MAAM,WACJ,WAAW,YAAY,KAAA,IACnBA,aAAAA,OAAO,UAAU,OAAO,IACxBC,aAAAA,eAAe,QAAQ,MAAM,WAAW,KAAK,CAAC,YAAY,KAAK;CAErE,IAAI,iBAAiB;CA6BrB,OAAO;EAnBL,IAAI,QAAQ;GACV,OAAO,OAAO;EAChB;EACA,YAAY,OAAO,KAAK;EACxB,YAAY,YAAY,OAAO,UAAU,OAAO;EAChD,mBAAmB,YAAY,OAAO,iBAAiB,OAAO;EAC9D,QAAQ;EACR,SAAS;EACT,SAAS;EACT,SAAS;EACT,cAAc;EACd,KApBU,WAAW,SAAS,SAAY,OAAO,IAAI,IAAI;EAqBzD,cAnBA,WAAW,kBACT,SAAY;GACZ,iBAAiB;GACjB,OAAO,IAAI,IAAI;GACf,OAAO,IAAI,KAAK;EAClB;EAeA,OAAO,WAAW,gBAAgB,OAAO,IAAI,cAAc;EAC3D,aAAa,WAAW,sBAAsB,SAAS,IAAI,IAAI;EAC/D,YAAY,WAAW,eAAe,YAAY,QAAQ,KAAK,EAAE,WAAW;EAC5E,WAAW,WAAW,eAAe,SAAS,QAAQ,IAAI,CAAC,GAAG,IAAI,CAAC;EACnE,SAAS,WAAW,kBAAkB,CAAC;CAE/B;AACZ;;;;;;;AAQA,SAAgB,eACd,WAee;CACf,MAAM,QAAmCD,aAAAA,OAAO,WAAW,IAAI;CAC/D,MAAM,SAA0CA,aAAAA,OAAO,WAAW,KAAK;CACvE,MAAM,UAAmCA,aAAAA,OACvC,WAAW,WAAW,WAAW,SAAS,KAAA,IAAY,YAAY,OACpE;CACA,MAAM,aAAkCA,aAAAA,OAAO,WAAW,aAAa,KAAK;CAC5E,MAAM,cAAmCA,aAAAA,OAAO,WAAW,cAAc,KAAK;CAC9E,MAAM,WAAgCA,aAAAA,OAAO,WAAW,WAAW,KAAK;CACxE,MAAM,iBAAiDA,aAAAA,OAAO,WAAW,aAAa;CACtF,MAAM,uBAA4CA,aAAAA,OAAO,WAAW,uBAAuB,KAAK;CAChG,MAAM,YAAiCA,aAAAA,OAAO,WAAW,YAAY,KAAK;CAE1E,MAAM,UAAU,WAAW,YAAY,YAAY,MAAM,KAAK;CAC9D,MAAM,QAAQ,WAAW,gBAAgB,CAAC;CAC1C,MAAM,aAAa,WAAW,eAAe,YAAY,MAAM,KAAK;CAGpE,OAAO;EACL,MAAM;EACN,OAAO;EACP,QAAQ;EACR,WAAW;EACX,YAAY;EACZ,SAAS;EACT,eAAe;EACf,qBAAqB;EACrB,UAAU;EACV;EACA;EACA;EACA,SAfc,WAAW,WAAW;CAgBtC;AACF"}
@@ -1,4 +1,4 @@
1
- import { H as AsyncStatus, V as AsyncState, d as Field, m as RootOptions, p as Root, s as ControllerDef } from "./types-C4Vtkxbn.cjs";
1
+ import { D as _unregisterMutationById, H as AsyncStatus, V as AsyncState, d as Field, m as RootOptions, p as Root, s as ControllerDef } from "./types-DzDIypPo.cjs";
2
2
 
3
3
  //#region src/testing.d.ts
4
4
  /**
@@ -48,11 +48,12 @@ declare function fakeAsyncState<T>(overrides?: Partial<{
48
48
  isStale: boolean;
49
49
  lastUpdatedAt: number | undefined;
50
50
  hasPendingMutations: boolean;
51
+ isPaused: boolean;
51
52
  refetch: () => Promise<T>;
52
53
  reset: () => void;
53
54
  firstValue: () => Promise<T>;
54
55
  promise: () => Promise<T>;
55
56
  }>): AsyncState<T>;
56
57
  //#endregion
57
- export { createTestController, fakeAsyncState, fakeField };
58
+ export { _unregisterMutationById, createTestController, fakeAsyncState, fakeField };
58
59
  //# sourceMappingURL=testing.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"testing.d.cts","names":[],"sources":["../src/testing.ts"],"mappings":";;;;AAYA;;;;;;iBAAgB,oBAAA,2BAGA,MAAA,oBAA0B,MAAA,kBAAA,CAExC,GAAA,EAAK,aAAA,CAAc,KAAA,EAAO,GAAA,GAC1B,OAAA;EACE,IAAA,EAAM,KAAA;EACN,KAAA,EAAO,KAAA;EACP,OAAA,GAAU,WAAA,CAAY,KAAA;AAAA,IAEvB,IAAA,CAAK,GAAA;;;;;;;iBAaQ,SAAA,GAAA,CACd,OAAA,EAAS,CAAA,EACT,SAAA,GAAY,OAAA;EACV,MAAA;EACA,OAAA;EACA,OAAA;EACA,OAAA;EACA,YAAA;EACA,GAAA,GAAM,KAAA,EAAO,CAAA;EACb,YAAA,GAAe,KAAA,EAAO,CAAA;EACtB,KAAA;EACA,WAAA;EACA,UAAA,QAAkB,OAAA;EAClB,SAAA,GAAY,MAAA,EAAQ,aAAA;EACpB,OAAA;AAAA,KAED,KAAA,CAAM,CAAA;;;;;;AA7BE;iBA6EK,cAAA,GAAA,CACd,SAAA,GAAY,OAAA;EACV,IAAA,EAAM,CAAA;EACN,KAAA;EACA,MAAA,EAAQ,WAAA;EACR,SAAA;EACA,UAAA;EACA,OAAA;EACA,aAAA;EACA,mBAAA;EACA,OAAA,QAAe,OAAA,CAAQ,CAAA;EACvB,KAAA;EACA,UAAA,QAAkB,OAAA,CAAQ,CAAA;EAC1B,OAAA,QAAe,OAAA,CAAQ,CAAA;AAAA,KAExB,UAAA,CAAW,CAAA"}
1
+ {"version":3,"file":"testing.d.cts","names":[],"sources":["../src/testing.ts"],"mappings":";;;AAiBA;;;;;;;AAAA,iBAAgB,oBAAA,2BAGA,MAAA,oBAA0B,MAAA,kBAAA,CAExC,GAAA,EAAK,aAAA,CAAc,KAAA,EAAO,GAAA,GAC1B,OAAA;EACE,IAAA,EAAM,KAAA;EACN,KAAA,EAAO,KAAA;EACP,OAAA,GAAU,WAAA,CAAY,KAAA;AAAA,IAEvB,IAAA,CAAK,GAAA;;;;;;;iBAaQ,SAAA,GAAA,CACd,OAAA,EAAS,CAAA,EACT,SAAA,GAAY,OAAA;EACV,MAAA;EACA,OAAA;EACA,OAAA;EACA,OAAA;EACA,YAAA;EACA,GAAA,GAAM,KAAA,EAAO,CAAA;EACb,YAAA,GAAe,KAAA,EAAO,CAAA;EACtB,KAAA;EACA,WAAA;EACA,UAAA,QAAkB,OAAA;EAClB,SAAA,GAAY,MAAA,EAAQ,aAAA;EACpB,OAAA;AAAA,KAED,KAAA,CAAM,CAAA;;;;;AA7BE;AAaX;iBAiEgB,cAAA,GAAA,CACd,SAAA,GAAY,OAAA;EACV,IAAA,EAAM,CAAA;EACN,KAAA;EACA,MAAA,EAAQ,WAAA;EACR,SAAA;EACA,UAAA;EACA,OAAA;EACA,aAAA;EACA,mBAAA;EACA,QAAA;EACA,OAAA,QAAe,OAAA,CAAQ,CAAA;EACvB,KAAA;EACA,UAAA,QAAkB,OAAA,CAAQ,CAAA;EAC1B,OAAA,QAAe,OAAA,CAAQ,CAAA;AAAA,KAExB,UAAA,CAAW,CAAA"}
@@ -1,4 +1,4 @@
1
- import { H as AsyncStatus, V as AsyncState, d as Field, m as RootOptions, p as Root, s as ControllerDef } from "./types-BH1o6nYa.mjs";
1
+ import { D as _unregisterMutationById, H as AsyncStatus, V as AsyncState, d as Field, m as RootOptions, p as Root, s as ControllerDef } from "./types-Brp-4WaZ.mjs";
2
2
 
3
3
  //#region src/testing.d.ts
4
4
  /**
@@ -48,11 +48,12 @@ declare function fakeAsyncState<T>(overrides?: Partial<{
48
48
  isStale: boolean;
49
49
  lastUpdatedAt: number | undefined;
50
50
  hasPendingMutations: boolean;
51
+ isPaused: boolean;
51
52
  refetch: () => Promise<T>;
52
53
  reset: () => void;
53
54
  firstValue: () => Promise<T>;
54
55
  promise: () => Promise<T>;
55
56
  }>): AsyncState<T>;
56
57
  //#endregion
57
- export { createTestController, fakeAsyncState, fakeField };
58
+ export { _unregisterMutationById, createTestController, fakeAsyncState, fakeField };
58
59
  //# sourceMappingURL=testing.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"testing.d.mts","names":[],"sources":["../src/testing.ts"],"mappings":";;;;AAYA;;;;;;iBAAgB,oBAAA,2BAGA,MAAA,oBAA0B,MAAA,kBAAA,CAExC,GAAA,EAAK,aAAA,CAAc,KAAA,EAAO,GAAA,GAC1B,OAAA;EACE,IAAA,EAAM,KAAA;EACN,KAAA,EAAO,KAAA;EACP,OAAA,GAAU,WAAA,CAAY,KAAA;AAAA,IAEvB,IAAA,CAAK,GAAA;;;;;;;iBAaQ,SAAA,GAAA,CACd,OAAA,EAAS,CAAA,EACT,SAAA,GAAY,OAAA;EACV,MAAA;EACA,OAAA;EACA,OAAA;EACA,OAAA;EACA,YAAA;EACA,GAAA,GAAM,KAAA,EAAO,CAAA;EACb,YAAA,GAAe,KAAA,EAAO,CAAA;EACtB,KAAA;EACA,WAAA;EACA,UAAA,QAAkB,OAAA;EAClB,SAAA,GAAY,MAAA,EAAQ,aAAA;EACpB,OAAA;AAAA,KAED,KAAA,CAAM,CAAA;;;;;;AA7BE;iBA6EK,cAAA,GAAA,CACd,SAAA,GAAY,OAAA;EACV,IAAA,EAAM,CAAA;EACN,KAAA;EACA,MAAA,EAAQ,WAAA;EACR,SAAA;EACA,UAAA;EACA,OAAA;EACA,aAAA;EACA,mBAAA;EACA,OAAA,QAAe,OAAA,CAAQ,CAAA;EACvB,KAAA;EACA,UAAA,QAAkB,OAAA,CAAQ,CAAA;EAC1B,OAAA,QAAe,OAAA,CAAQ,CAAA;AAAA,KAExB,UAAA,CAAW,CAAA"}
1
+ {"version":3,"file":"testing.d.mts","names":[],"sources":["../src/testing.ts"],"mappings":";;;AAiBA;;;;;;;AAAA,iBAAgB,oBAAA,2BAGA,MAAA,oBAA0B,MAAA,kBAAA,CAExC,GAAA,EAAK,aAAA,CAAc,KAAA,EAAO,GAAA,GAC1B,OAAA;EACE,IAAA,EAAM,KAAA;EACN,KAAA,EAAO,KAAA;EACP,OAAA,GAAU,WAAA,CAAY,KAAA;AAAA,IAEvB,IAAA,CAAK,GAAA;;;;;;;iBAaQ,SAAA,GAAA,CACd,OAAA,EAAS,CAAA,EACT,SAAA,GAAY,OAAA;EACV,MAAA;EACA,OAAA;EACA,OAAA;EACA,OAAA;EACA,YAAA;EACA,GAAA,GAAM,KAAA,EAAO,CAAA;EACb,YAAA,GAAe,KAAA,EAAO,CAAA;EACtB,KAAA;EACA,WAAA;EACA,UAAA,QAAkB,OAAA;EAClB,SAAA,GAAY,MAAA,EAAQ,aAAA;EACpB,OAAA;AAAA,KAED,KAAA,CAAM,CAAA;;;;;AA7BE;AAaX;iBAiEgB,cAAA,GAAA,CACd,SAAA,GAAY,OAAA;EACV,IAAA,EAAM,CAAA;EACN,KAAA;EACA,MAAA,EAAQ,WAAA;EACR,SAAA;EACA,UAAA;EACA,OAAA;EACA,aAAA;EACA,mBAAA;EACA,QAAA;EACA,OAAA,QAAe,OAAA,CAAQ,CAAA;EACvB,KAAA;EACA,UAAA,QAAkB,OAAA,CAAQ,CAAA;EAC1B,OAAA,QAAe,OAAA,CAAQ,CAAA;AAAA,KAExB,UAAA,CAAW,CAAA"}
package/dist/testing.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { h as signal, n as createRootWithProps, p as computed } from "./root-DqWolle_.mjs";
1
+ import { h as signal, n as createRootWithProps, o as _unregisterMutationById, p as computed } from "./root-Byq-QYTp.mjs";
2
2
  //#region src/testing.ts
3
3
  /**
4
4
  * Construct an isolated root wrapping a single controller. The returned object
@@ -33,6 +33,7 @@ function fakeField(initial, overrides) {
33
33
  },
34
34
  peek: () => value$.peek(),
35
35
  subscribe: (handler) => value$.subscribe(handler),
36
+ subscribeChanges: (handler) => value$.subscribeChanges(handler),
36
37
  errors: errors$,
37
38
  isValid: isValid$,
38
39
  isDirty: dirty$,
@@ -66,6 +67,7 @@ function fakeAsyncState(overrides) {
66
67
  const isStale$ = signal(overrides?.isStale ?? false);
67
68
  const lastUpdatedAt$ = signal(overrides?.lastUpdatedAt);
68
69
  const hasPendingMutations$ = signal(overrides?.hasPendingMutations ?? false);
70
+ const isPaused$ = signal(overrides?.isPaused ?? false);
69
71
  const refetch = overrides?.refetch ?? (async () => data$.peek());
70
72
  const reset = overrides?.reset ?? (() => {});
71
73
  const firstValue = overrides?.firstValue ?? (async () => data$.peek());
@@ -78,6 +80,7 @@ function fakeAsyncState(overrides) {
78
80
  isStale: isStale$,
79
81
  lastUpdatedAt: lastUpdatedAt$,
80
82
  hasPendingMutations: hasPendingMutations$,
83
+ isPaused: isPaused$,
81
84
  refetch,
82
85
  reset,
83
86
  firstValue,
@@ -85,6 +88,6 @@ function fakeAsyncState(overrides) {
85
88
  };
86
89
  }
87
90
  //#endregion
88
- export { createTestController, fakeAsyncState, fakeField };
91
+ export { _unregisterMutationById, createTestController, fakeAsyncState, fakeField };
89
92
 
90
93
  //# sourceMappingURL=testing.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"testing.mjs","names":[],"sources":["../src/testing.ts"],"sourcesContent":["import { createRootWithProps } from './controller/root'\nimport type { ControllerDef, Field, Root, RootOptions } from './controller/types'\nimport type { AsyncState, AsyncStatus } from './query/types'\nimport { computed, type ReadSignal, type Signal, signal } from './signals'\n\n/**\n * Construct an isolated root wrapping a single controller. The returned object\n * is the controller's api plus the standard Root lifecycle controls\n * (`dispose`, `suspend`, `resume`, `__debug`).\n *\n * Equivalent to defining a tiny root wrapper, but ergonomic in tests.\n */\nexport function createTestController<\n Props,\n Api,\n TDeps extends Record<string, unknown> = Record<string, unknown>,\n>(\n def: ControllerDef<Props, Api>,\n options: {\n deps: TDeps\n props: Props\n onError?: RootOptions<TDeps>['onError']\n },\n): Root<Api> {\n return createRootWithProps<Props, Api, TDeps>(def, options.props, {\n deps: options.deps,\n onError: options.onError,\n })\n}\n\n/**\n * Shape-correct fake `Field<T>` for UI tests. Pass an initial value plus any\n * overrides for the read-only signals. The returned object satisfies `Field<T>`\n * so it can be passed straight into `useField(...)` or any component that\n * accepts a real field. See spec §20.10.\n */\nexport function fakeField<T>(\n initial: T,\n overrides?: Partial<{\n errors: string[]\n isValid: boolean\n isDirty: boolean\n touched: boolean\n isValidating: boolean\n set: (value: T) => void\n setAsInitial: (value: T) => void\n reset: () => void\n markTouched: () => void\n revalidate: () => Promise<boolean>\n setErrors: (errors: ReadonlyArray<string>) => void\n dispose: () => void\n }>,\n): Field<T> {\n const value$: Signal<T> = signal(initial)\n const errors$: Signal<string[]> = signal(overrides?.errors ?? [])\n const touched$: Signal<boolean> = signal(overrides?.touched ?? false)\n const dirty$: Signal<boolean> = signal(overrides?.isDirty ?? false)\n const validating$: Signal<boolean> = signal(overrides?.isValidating ?? false)\n const isValid$: ReadSignal<boolean> =\n overrides?.isValid !== undefined\n ? signal(overrides.isValid)\n : computed(() => errors$.value.length === 0 && !validating$.value)\n\n let currentInitial = initial\n const set = overrides?.set ?? ((next: T) => value$.set(next))\n const setAsInitial =\n overrides?.setAsInitial ??\n ((next: T) => {\n currentInitial = next\n value$.set(next)\n dirty$.set(false)\n })\n const fake: Field<T> = {\n get value() {\n return value$.value\n },\n peek: () => value$.peek(),\n subscribe: (handler) => value$.subscribe(handler),\n errors: errors$,\n isValid: isValid$,\n isDirty: dirty$,\n touched: touched$,\n isValidating: validating$,\n set,\n setAsInitial,\n reset: overrides?.reset ?? (() => value$.set(currentInitial)),\n markTouched: overrides?.markTouched ?? (() => touched$.set(true)),\n revalidate: overrides?.revalidate ?? (async () => errors$.peek().length === 0),\n setErrors: overrides?.setErrors ?? ((errs) => errors$.set([...errs])),\n dispose: overrides?.dispose ?? (() => {}),\n }\n return fake\n}\n\n/**\n * Shape-correct fake `AsyncState<T>` for UI tests. Pass overrides for any of\n * the signal-backed properties; everything else falls back to inert defaults.\n * The returned object satisfies `AsyncState<T>` so it can stand in for a real\n * query subscription in component tests. See spec §20.10.\n */\nexport function fakeAsyncState<T>(\n overrides?: Partial<{\n data: T | undefined\n error: unknown | undefined\n status: AsyncStatus\n isLoading: boolean\n isFetching: boolean\n isStale: boolean\n lastUpdatedAt: number | undefined\n hasPendingMutations: boolean\n refetch: () => Promise<T>\n reset: () => void\n firstValue: () => Promise<T>\n promise: () => Promise<T>\n }>,\n): AsyncState<T> {\n const data$: ReadSignal<T | undefined> = signal(overrides?.data)\n const error$: ReadSignal<unknown | undefined> = signal(overrides?.error)\n const status$: ReadSignal<AsyncStatus> = signal(\n overrides?.status ?? (overrides?.data !== undefined ? 'success' : 'idle'),\n )\n const isLoading$: ReadSignal<boolean> = signal(overrides?.isLoading ?? false)\n const isFetching$: ReadSignal<boolean> = signal(overrides?.isFetching ?? false)\n const isStale$: ReadSignal<boolean> = signal(overrides?.isStale ?? false)\n const lastUpdatedAt$: ReadSignal<number | undefined> = signal(overrides?.lastUpdatedAt)\n const hasPendingMutations$: ReadSignal<boolean> = signal(overrides?.hasPendingMutations ?? false)\n\n const refetch = overrides?.refetch ?? (async () => data$.peek() as T)\n const reset = overrides?.reset ?? (() => {})\n const firstValue = overrides?.firstValue ?? (async () => data$.peek() as T)\n const promise = overrides?.promise ?? firstValue\n\n return {\n data: data$,\n error: error$,\n status: status$,\n isLoading: isLoading$,\n isFetching: isFetching$,\n isStale: isStale$,\n lastUpdatedAt: lastUpdatedAt$,\n hasPendingMutations: hasPendingMutations$,\n refetch,\n reset,\n firstValue,\n promise,\n }\n}\n"],"mappings":";;;;;;;;;AAYA,SAAgB,qBAKd,KACA,SAKW;CACX,OAAO,oBAAuC,KAAK,QAAQ,OAAO;EAChE,MAAM,QAAQ;EACd,SAAS,QAAQ;CACnB,CAAC;AACH;;;;;;;AAQA,SAAgB,UACd,SACA,WAcU;CACV,MAAM,SAAoB,OAAO,OAAO;CACxC,MAAM,UAA4B,OAAO,WAAW,UAAU,CAAC,CAAC;CAChE,MAAM,WAA4B,OAAO,WAAW,WAAW,KAAK;CACpE,MAAM,SAA0B,OAAO,WAAW,WAAW,KAAK;CAClE,MAAM,cAA+B,OAAO,WAAW,gBAAgB,KAAK;CAC5E,MAAM,WACJ,WAAW,YAAY,KAAA,IACnB,OAAO,UAAU,OAAO,IACxB,eAAe,QAAQ,MAAM,WAAW,KAAK,CAAC,YAAY,KAAK;CAErE,IAAI,iBAAiB;CA4BrB,OAAO;EAlBL,IAAI,QAAQ;GACV,OAAO,OAAO;EAChB;EACA,YAAY,OAAO,KAAK;EACxB,YAAY,YAAY,OAAO,UAAU,OAAO;EAChD,QAAQ;EACR,SAAS;EACT,SAAS;EACT,SAAS;EACT,cAAc;EACd,KAnBU,WAAW,SAAS,SAAY,OAAO,IAAI,IAAI;EAoBzD,cAlBA,WAAW,kBACT,SAAY;GACZ,iBAAiB;GACjB,OAAO,IAAI,IAAI;GACf,OAAO,IAAI,KAAK;EAClB;EAcA,OAAO,WAAW,gBAAgB,OAAO,IAAI,cAAc;EAC3D,aAAa,WAAW,sBAAsB,SAAS,IAAI,IAAI;EAC/D,YAAY,WAAW,eAAe,YAAY,QAAQ,KAAK,EAAE,WAAW;EAC5E,WAAW,WAAW,eAAe,SAAS,QAAQ,IAAI,CAAC,GAAG,IAAI,CAAC;EACnE,SAAS,WAAW,kBAAkB,CAAC;CAE/B;AACZ;;;;;;;AAQA,SAAgB,eACd,WAce;CACf,MAAM,QAAmC,OAAO,WAAW,IAAI;CAC/D,MAAM,SAA0C,OAAO,WAAW,KAAK;CACvE,MAAM,UAAmC,OACvC,WAAW,WAAW,WAAW,SAAS,KAAA,IAAY,YAAY,OACpE;CACA,MAAM,aAAkC,OAAO,WAAW,aAAa,KAAK;CAC5E,MAAM,cAAmC,OAAO,WAAW,cAAc,KAAK;CAC9E,MAAM,WAAgC,OAAO,WAAW,WAAW,KAAK;CACxE,MAAM,iBAAiD,OAAO,WAAW,aAAa;CACtF,MAAM,uBAA4C,OAAO,WAAW,uBAAuB,KAAK;CAEhG,MAAM,UAAU,WAAW,YAAY,YAAY,MAAM,KAAK;CAC9D,MAAM,QAAQ,WAAW,gBAAgB,CAAC;CAC1C,MAAM,aAAa,WAAW,eAAe,YAAY,MAAM,KAAK;CAGpE,OAAO;EACL,MAAM;EACN,OAAO;EACP,QAAQ;EACR,WAAW;EACX,YAAY;EACZ,SAAS;EACT,eAAe;EACf,qBAAqB;EACrB;EACA;EACA;EACA,SAdc,WAAW,WAAW;CAetC;AACF"}
1
+ {"version":3,"file":"testing.mjs","names":[],"sources":["../src/testing.ts"],"sourcesContent":["import { createRootWithProps } from './controller/root'\nimport type { ControllerDef, Field, Root, RootOptions } from './controller/types'\nimport type { AsyncState, AsyncStatus } from './query/types'\nimport { computed, type ReadSignal, type Signal, signal } from './signals'\n\n// Test-only registry teardown — lives on the `@kontsedal/olas-core/testing`\n// sub-path, NOT the public entry (T3.9). Lets tests reusing a `mutationId`\n// across cases avoid registry bleed.\nexport { _unregisterMutationById } from './query/plugin'\n\n/**\n * Construct an isolated root wrapping a single controller. The returned object\n * is the controller's api plus the standard Root lifecycle controls\n * (`dispose`, `suspend`, `resume`, `__debug`).\n *\n * Equivalent to defining a tiny root wrapper, but ergonomic in tests.\n */\nexport function createTestController<\n Props,\n Api,\n TDeps extends Record<string, unknown> = Record<string, unknown>,\n>(\n def: ControllerDef<Props, Api>,\n options: {\n deps: TDeps\n props: Props\n onError?: RootOptions<TDeps>['onError']\n },\n): Root<Api> {\n return createRootWithProps<Props, Api, TDeps>(def, options.props, {\n deps: options.deps,\n onError: options.onError,\n })\n}\n\n/**\n * Shape-correct fake `Field<T>` for UI tests. Pass an initial value plus any\n * overrides for the read-only signals. The returned object satisfies `Field<T>`\n * so it can be passed straight into `useField(...)` or any component that\n * accepts a real field. See spec §20.10.\n */\nexport function fakeField<T>(\n initial: T,\n overrides?: Partial<{\n errors: string[]\n isValid: boolean\n isDirty: boolean\n touched: boolean\n isValidating: boolean\n set: (value: T) => void\n setAsInitial: (value: T) => void\n reset: () => void\n markTouched: () => void\n revalidate: () => Promise<boolean>\n setErrors: (errors: ReadonlyArray<string>) => void\n dispose: () => void\n }>,\n): Field<T> {\n const value$: Signal<T> = signal(initial)\n const errors$: Signal<string[]> = signal(overrides?.errors ?? [])\n const touched$: Signal<boolean> = signal(overrides?.touched ?? false)\n const dirty$: Signal<boolean> = signal(overrides?.isDirty ?? false)\n const validating$: Signal<boolean> = signal(overrides?.isValidating ?? false)\n const isValid$: ReadSignal<boolean> =\n overrides?.isValid !== undefined\n ? signal(overrides.isValid)\n : computed(() => errors$.value.length === 0 && !validating$.value)\n\n let currentInitial = initial\n const set = overrides?.set ?? ((next: T) => value$.set(next))\n const setAsInitial =\n overrides?.setAsInitial ??\n ((next: T) => {\n currentInitial = next\n value$.set(next)\n dirty$.set(false)\n })\n const fake: Field<T> = {\n get value() {\n return value$.value\n },\n peek: () => value$.peek(),\n subscribe: (handler) => value$.subscribe(handler),\n subscribeChanges: (handler) => value$.subscribeChanges(handler),\n errors: errors$,\n isValid: isValid$,\n isDirty: dirty$,\n touched: touched$,\n isValidating: validating$,\n set,\n setAsInitial,\n reset: overrides?.reset ?? (() => value$.set(currentInitial)),\n markTouched: overrides?.markTouched ?? (() => touched$.set(true)),\n revalidate: overrides?.revalidate ?? (async () => errors$.peek().length === 0),\n setErrors: overrides?.setErrors ?? ((errs) => errors$.set([...errs])),\n dispose: overrides?.dispose ?? (() => {}),\n }\n return fake\n}\n\n/**\n * Shape-correct fake `AsyncState<T>` for UI tests. Pass overrides for any of\n * the signal-backed properties; everything else falls back to inert defaults.\n * The returned object satisfies `AsyncState<T>` so it can stand in for a real\n * query subscription in component tests. See spec §20.10.\n */\nexport function fakeAsyncState<T>(\n overrides?: Partial<{\n data: T | undefined\n error: unknown | undefined\n status: AsyncStatus\n isLoading: boolean\n isFetching: boolean\n isStale: boolean\n lastUpdatedAt: number | undefined\n hasPendingMutations: boolean\n isPaused: boolean\n refetch: () => Promise<T>\n reset: () => void\n firstValue: () => Promise<T>\n promise: () => Promise<T>\n }>,\n): AsyncState<T> {\n const data$: ReadSignal<T | undefined> = signal(overrides?.data)\n const error$: ReadSignal<unknown | undefined> = signal(overrides?.error)\n const status$: ReadSignal<AsyncStatus> = signal(\n overrides?.status ?? (overrides?.data !== undefined ? 'success' : 'idle'),\n )\n const isLoading$: ReadSignal<boolean> = signal(overrides?.isLoading ?? false)\n const isFetching$: ReadSignal<boolean> = signal(overrides?.isFetching ?? false)\n const isStale$: ReadSignal<boolean> = signal(overrides?.isStale ?? false)\n const lastUpdatedAt$: ReadSignal<number | undefined> = signal(overrides?.lastUpdatedAt)\n const hasPendingMutations$: ReadSignal<boolean> = signal(overrides?.hasPendingMutations ?? false)\n const isPaused$: ReadSignal<boolean> = signal(overrides?.isPaused ?? false)\n\n const refetch = overrides?.refetch ?? (async () => data$.peek() as T)\n const reset = overrides?.reset ?? (() => {})\n const firstValue = overrides?.firstValue ?? (async () => data$.peek() as T)\n const promise = overrides?.promise ?? firstValue\n\n return {\n data: data$,\n error: error$,\n status: status$,\n isLoading: isLoading$,\n isFetching: isFetching$,\n isStale: isStale$,\n lastUpdatedAt: lastUpdatedAt$,\n hasPendingMutations: hasPendingMutations$,\n isPaused: isPaused$,\n refetch,\n reset,\n firstValue,\n promise,\n }\n}\n"],"mappings":";;;;;;;;;AAiBA,SAAgB,qBAKd,KACA,SAKW;CACX,OAAO,oBAAuC,KAAK,QAAQ,OAAO;EAChE,MAAM,QAAQ;EACd,SAAS,QAAQ;CACnB,CAAC;AACH;;;;;;;AAQA,SAAgB,UACd,SACA,WAcU;CACV,MAAM,SAAoB,OAAO,OAAO;CACxC,MAAM,UAA4B,OAAO,WAAW,UAAU,CAAC,CAAC;CAChE,MAAM,WAA4B,OAAO,WAAW,WAAW,KAAK;CACpE,MAAM,SAA0B,OAAO,WAAW,WAAW,KAAK;CAClE,MAAM,cAA+B,OAAO,WAAW,gBAAgB,KAAK;CAC5E,MAAM,WACJ,WAAW,YAAY,KAAA,IACnB,OAAO,UAAU,OAAO,IACxB,eAAe,QAAQ,MAAM,WAAW,KAAK,CAAC,YAAY,KAAK;CAErE,IAAI,iBAAiB;CA6BrB,OAAO;EAnBL,IAAI,QAAQ;GACV,OAAO,OAAO;EAChB;EACA,YAAY,OAAO,KAAK;EACxB,YAAY,YAAY,OAAO,UAAU,OAAO;EAChD,mBAAmB,YAAY,OAAO,iBAAiB,OAAO;EAC9D,QAAQ;EACR,SAAS;EACT,SAAS;EACT,SAAS;EACT,cAAc;EACd,KApBU,WAAW,SAAS,SAAY,OAAO,IAAI,IAAI;EAqBzD,cAnBA,WAAW,kBACT,SAAY;GACZ,iBAAiB;GACjB,OAAO,IAAI,IAAI;GACf,OAAO,IAAI,KAAK;EAClB;EAeA,OAAO,WAAW,gBAAgB,OAAO,IAAI,cAAc;EAC3D,aAAa,WAAW,sBAAsB,SAAS,IAAI,IAAI;EAC/D,YAAY,WAAW,eAAe,YAAY,QAAQ,KAAK,EAAE,WAAW;EAC5E,WAAW,WAAW,eAAe,SAAS,QAAQ,IAAI,CAAC,GAAG,IAAI,CAAC;EACnE,SAAS,WAAW,kBAAkB,CAAC;CAE/B;AACZ;;;;;;;AAQA,SAAgB,eACd,WAee;CACf,MAAM,QAAmC,OAAO,WAAW,IAAI;CAC/D,MAAM,SAA0C,OAAO,WAAW,KAAK;CACvE,MAAM,UAAmC,OACvC,WAAW,WAAW,WAAW,SAAS,KAAA,IAAY,YAAY,OACpE;CACA,MAAM,aAAkC,OAAO,WAAW,aAAa,KAAK;CAC5E,MAAM,cAAmC,OAAO,WAAW,cAAc,KAAK;CAC9E,MAAM,WAAgC,OAAO,WAAW,WAAW,KAAK;CACxE,MAAM,iBAAiD,OAAO,WAAW,aAAa;CACtF,MAAM,uBAA4C,OAAO,WAAW,uBAAuB,KAAK;CAChG,MAAM,YAAiC,OAAO,WAAW,YAAY,KAAK;CAE1E,MAAM,UAAU,WAAW,YAAY,YAAY,MAAM,KAAK;CAC9D,MAAM,QAAQ,WAAW,gBAAgB,CAAC;CAC1C,MAAM,aAAa,WAAW,eAAe,YAAY,MAAM,KAAK;CAGpE,OAAO;EACL,MAAM;EACN,OAAO;EACP,QAAQ;EACR,WAAW;EACX,YAAY;EACZ,SAAS;EACT,eAAe;EACf,qBAAqB;EACrB,UAAU;EACV;EACA;EACA;EACA,SAfc,WAAW,WAAW;CAgBtC;AACF"}