@shivaedev/effect-react 0.1.1 → 0.1.2

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 (42) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/create.d.ts +2 -2
  3. package/dist/create.d.ts.map +1 -1
  4. package/dist/create.js +2 -2
  5. package/dist/create.js.map +1 -1
  6. package/dist/editor.d.ts +2 -2
  7. package/dist/editor.d.ts.map +1 -1
  8. package/dist/editor.js +6 -5
  9. package/dist/editor.js.map +1 -1
  10. package/dist/field-rejection.d.ts +1 -1
  11. package/dist/field-rejection.d.ts.map +1 -1
  12. package/dist/field-rejection.js +2 -1
  13. package/dist/field-rejection.js.map +1 -1
  14. package/dist/result-state.d.ts +2 -3
  15. package/dist/result-state.d.ts.map +1 -1
  16. package/dist/result-state.js +5 -4
  17. package/dist/result-state.js.map +1 -1
  18. package/dist/resume-signal.d.ts +2 -2
  19. package/dist/resume-signal.d.ts.map +1 -1
  20. package/dist/resume-signal.js +4 -2
  21. package/dist/resume-signal.js.map +1 -1
  22. package/dist/save-state.d.ts +3 -3
  23. package/dist/save-state.d.ts.map +1 -1
  24. package/dist/save-state.js +11 -8
  25. package/dist/save-state.js.map +1 -1
  26. package/dist/session-boundary.d.ts +3 -3
  27. package/dist/session-boundary.d.ts.map +1 -1
  28. package/dist/session-boundary.js +8 -5
  29. package/dist/session-boundary.js.map +1 -1
  30. package/dist/submission.d.ts +3 -3
  31. package/dist/submission.d.ts.map +1 -1
  32. package/dist/submission.js +1 -1
  33. package/dist/submission.js.map +1 -1
  34. package/package.json +48 -42
  35. package/src/create.ts +4 -4
  36. package/src/editor.ts +10 -8
  37. package/src/field-rejection.ts +4 -2
  38. package/src/result-state.ts +8 -6
  39. package/src/resume-signal.ts +8 -4
  40. package/src/save-state.ts +16 -13
  41. package/src/session-boundary.ts +17 -11
  42. package/src/submission.ts +4 -4
package/CHANGELOG.md CHANGED
@@ -1,5 +1,27 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.2 - 2026-10-04
4
+
5
+ ### Changed
6
+
7
+ - Imports that leave their folder go through `#` aliases declared in the `imports` field of `package.json`: `#*.ts` resolves to `src` under the `source` condition and to `dist` otherwise, and `#test/*` names a test file. The published modules and declarations name the package's own files through these aliases.
8
+
9
+ - Consolidate duplicate test cases around observable package behavior.
10
+
11
+ - Validate packed consumers and executable bins through the shared workspace gate.
12
+
13
+ - Replace a JSDoc block with a short reason comment, so the package passes the comment rules of `@shivaedev/quality`.
14
+
15
+ - Build with the `@shivaedev/quality` tsconfig presets, which target ESNext and allow only erasable TypeScript syntax.
16
+
17
+ - Type-check with TypeScript 7 only. TypeScript 6 still builds the package.
18
+
19
+ - Lint and format with the `@shivaedev/quality` Biome preset through `quality lint` at the repository root, which replaces the package's `check` script.
20
+
21
+ - Run tests through the `@shivaedev/quality` Vitest projects, which take a test's environment from its file name. Type tests are named `*.typecheck.test.ts`.
22
+
23
+ - Keep `package.json` in sort-package-json key order, checked by `quality lint`.
24
+
3
25
  ## 0.1.1 - 2026-09-26
4
26
 
5
27
  ### Changed
package/dist/create.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import type { Decoded, Encoded, FieldFailure, Fields, Form, Services } from "@shivaedev/effect-form";
2
1
  import { type Effect, Option, type Schema } from "effect";
3
2
  import type * as Atom from "effect/unstable/reactivity/Atom";
3
+ import type { Decoded, Encoded, FieldFailure, Fields, Form, Services } from "@shivaedev/effect-form";
4
4
  import type { AtomServices, FieldRejectionMapping } from "./field-rejection.ts";
5
5
  import { type SaveState } from "./save-state.ts";
6
6
  export type CreateConfig<F extends Fields, Created, SE, R, ER> = {
@@ -10,8 +10,8 @@ export type CreateConfig<F extends Fields, Created, SE, R, ER> = {
10
10
  readonly runtime: Atom.AtomRuntime<Services<F, R>, ER>;
11
11
  } & FieldRejectionMapping<F, SE>;
12
12
  export interface Create<F extends Fields, Created, SE, ER> extends SaveState<SE | ER> {
13
- readonly form: Form<F, Created, SE | FieldFailure, ER>;
14
13
  readonly created: Option.Option<Created>;
14
+ readonly form: Form<F, Created, SE | FieldFailure, ER>;
15
15
  }
16
16
  export declare const useCreate: <F extends Fields, Created, SE, R, ER>(config: CreateConfig<F, Created, SE, R, ER>) => Create<F, Created, SE, ER>;
17
17
  //# sourceMappingURL=create.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACrG,OAAO,EAAE,KAAK,MAAM,EAAS,MAAM,EAAE,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAC;AACjE,OAAO,KAAK,KAAK,IAAI,MAAM,iCAAiC,CAAC;AAE7D,OAAO,KAAK,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,KAAK,SAAS,EAAgB,MAAM,iBAAiB,CAAC;AAG/D,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,IAAI;IAChE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAClC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IACrF,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;CACvD,GAAG,qBAAqB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAEjC,MAAM,WAAW,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,CAAE,SAAQ,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC;IACpF,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,GAAG,YAAY,EAAE,EAAE,CAAC,CAAC;IACvD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;CACzC;AAOD,eAAO,MAAM,SAAS,GAAI,CAAC,SAAS,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,QAAQ,YAAY,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,KAAG,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,CAiBtI,CAAC"}
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAS,MAAM,EAAE,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAC;AACjE,OAAO,KAAK,KAAK,IAAI,MAAM,iCAAiC,CAAC;AAE7D,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACrG,OAAO,KAAK,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,KAAK,SAAS,EAAgB,MAAM,iBAAiB,CAAC;AAG/D,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,IAAI;IAChE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAClC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IACrF,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;CACvD,GAAG,qBAAqB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAEjC,MAAM,WAAW,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,CAAE,SAAQ,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC;IACpF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACzC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,GAAG,YAAY,EAAE,EAAE,CAAC,CAAC;CACvD;AAOD,eAAO,MAAM,SAAS,GAAI,CAAC,SAAS,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,QAAQ,YAAY,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,KAAG,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,CAiBtI,CAAC"}
package/dist/create.js CHANGED
@@ -9,7 +9,7 @@ const editedSince = (current, submitted) => {
9
9
  export const useCreate = (config) => {
10
10
  const [{ initialValues, fresh }] = useState(() => {
11
11
  const { fields, initialValues, runtime, create, rejectField } = config;
12
- return { initialValues, fresh: () => submission({ fields, initialValues, runtime, save: create, rejectField }) };
12
+ return { fresh: () => submission({ fields, initialValues, rejectField, runtime, save: create }), initialValues };
13
13
  });
14
14
  const [current, replace] = useState(fresh);
15
15
  const [created, record] = useState(Option.none());
@@ -19,6 +19,6 @@ export const useCreate = (config) => {
19
19
  record(Option.some(value));
20
20
  replace(next);
21
21
  }, [current, fresh, initialValues]);
22
- return { ...useSaveState(current.form, settled), form: current.form, created };
22
+ return { ...useSaveState(current.form, settled), created, form: current.form };
23
23
  };
24
24
  //# sourceMappingURL=create.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"create.js","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,KAAK,EAAE,MAAM,EAAe,MAAM,QAAQ,CAAC;AAEjE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE9C,OAAO,EAAkB,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAc7C,MAAM,WAAW,GAAG,CAAmB,OAAU,EAAE,SAAwB,EAAqC,EAAE;IACjH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,CAAC,CAAC;IAC7D,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACtH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAuC,MAA2C,EAA8B,EAAE;IAC1I,MAAM,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE;QAChD,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;QACvE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;IAClH,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC3C,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAyB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1E,MAAM,OAAO,GAAG,WAAW,CAC1B,CAAC,KAAc,EAAE,EAAE;QAClB,MAAM,IAAI,GAAG,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,aAAa,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;QAC3G,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC,CAAC;IACf,CAAC,EACD,CAAC,OAAO,EAAE,KAAK,EAAE,aAAa,CAAC,CAC/B,CAAC;IACF,OAAO,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC;AAChF,CAAC,CAAC"}
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,EAAE,MAAM,EAAe,MAAM,QAAQ,CAAC;AAEjE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAG9C,OAAO,EAAkB,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAc7C,MAAM,WAAW,GAAG,CAAmB,OAAU,EAAE,SAAwB,EAAqC,EAAE;IACjH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,CAAC,CAAC;IAC7D,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACtH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAuC,MAA2C,EAA8B,EAAE;IAC1I,MAAM,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE;QAChD,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;QACvE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC;IAClH,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC3C,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAyB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1E,MAAM,OAAO,GAAG,WAAW,CAC1B,CAAC,KAAc,EAAE,EAAE;QAClB,MAAM,IAAI,GAAG,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,aAAa,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;QAC3G,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC,CAAC;IACf,CAAC,EACD,CAAC,OAAO,EAAE,KAAK,EAAE,aAAa,CAAC,CAC/B,CAAC;IACF,OAAO,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;AAChF,CAAC,CAAC"}
package/dist/editor.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- import type { Decoded, Encoded, FieldFailure, Fields, Form, Services } from "@shivaedev/effect-form";
2
1
  import { type Effect, type Schema } from "effect";
3
2
  import type * as AsyncResult from "effect/unstable/reactivity/AsyncResult";
4
3
  import type * as Atom from "effect/unstable/reactivity/Atom";
4
+ import type { Decoded, Encoded, FieldFailure, Fields, Form, Services } from "@shivaedev/effect-form";
5
5
  import type { AtomServices, FieldRejectionMapping } from "./field-rejection.ts";
6
6
  import { type QueryState } from "./result-state.ts";
7
7
  import { type SaveState } from "./save-state.ts";
@@ -13,8 +13,8 @@ export type EditorConfig<F extends Fields, Row, QE, SE, R, ER> = {
13
13
  readonly runtime: Atom.AtomRuntime<Services<F, R>, ER>;
14
14
  } & FieldRejectionMapping<F, SE>;
15
15
  export interface Editor<F extends Fields, Row, QE, SE, ER> extends SaveState<SE | ER> {
16
- readonly query: QueryState<Row, QE>;
17
16
  readonly form: Form<F, Row, SE | FieldFailure, ER> | undefined;
17
+ readonly query: QueryState<Row, QE>;
18
18
  }
19
19
  export declare const useEditor: <F extends Fields, Row, QE, SE, R, ER>(config: EditorConfig<F, Row, QE, SE, R, ER>) => Editor<F, Row, QE, SE, ER>;
20
20
  //# sourceMappingURL=editor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../src/editor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACrG,OAAO,EAAE,KAAK,MAAM,EAAU,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC1D,OAAO,KAAK,KAAK,WAAW,MAAM,wCAAwC,CAAC;AAC3E,OAAO,KAAK,KAAK,IAAI,MAAM,iCAAiC,CAAC;AAE7D,OAAO,KAAK,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,KAAK,UAAU,EAAY,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,KAAK,SAAS,EAAgB,MAAM,iBAAiB,CAAC;AAG/D,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,IAAI;IAChE,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;IAC5D,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAC1C,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/E,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;CACvD,GAAG,qBAAqB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAEjC,MAAM,WAAW,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAE,SAAQ,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC;IACpF,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,GAAG,YAAY,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC;CAC/D;AAQD,eAAO,MAAM,SAAS,GAAI,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,QAAQ,YAAY,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,KAAG,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CA0BtI,CAAC"}
1
+ {"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../src/editor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAU,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC1D,OAAO,KAAK,KAAK,WAAW,MAAM,wCAAwC,CAAC;AAC3E,OAAO,KAAK,KAAK,IAAI,MAAM,iCAAiC,CAAC;AAE7D,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACrG,OAAO,KAAK,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,KAAK,UAAU,EAAY,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,KAAK,SAAS,EAAgB,MAAM,iBAAiB,CAAC;AAG/D,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,IAAI;IAChE,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;IAC5D,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAC1C,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/E,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;CACvD,GAAG,qBAAqB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAEjC,MAAM,WAAW,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAE,SAAQ,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC;IACpF,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,GAAG,YAAY,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC;IAC/D,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;CACpC;AAQD,eAAO,MAAM,SAAS,GAAI,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,QAAQ,YAAY,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,KAAG,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CA4BtI,CAAC"}
package/dist/editor.js CHANGED
@@ -10,25 +10,26 @@ export const useEditor = (config) => {
10
10
  let current = held?.query === config.query ? held : undefined;
11
11
  if (current === undefined && row !== undefined) {
12
12
  current = {
13
- query: config.query,
14
- values: config.values,
15
13
  form: submission({
16
14
  fields: config.fields,
17
15
  initialValues: config.values(row),
16
+ rejectField: config.rejectField,
18
17
  runtime: config.runtime,
19
18
  save: config.save,
20
- rejectField: config.rejectField,
21
19
  }).form,
20
+ query: config.query,
21
+ values: config.values,
22
22
  };
23
23
  hold(current);
24
24
  }
25
25
  const form = current?.form;
26
26
  const values = current?.values;
27
27
  useEffect(() => {
28
- if (form && values && row !== undefined)
28
+ if (form && values && row !== undefined) {
29
29
  form.receive(values(row));
30
+ }
30
31
  }, [form, values, row]);
31
32
  const settled = useCallback((saved) => (form && values ? form.receive(values(saved)) : undefined), [form, values]);
32
- return { ...useSaveState(form, settled), query, form };
33
+ return { ...useSaveState(form, settled), form, query };
33
34
  };
34
35
  //# sourceMappingURL=editor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"editor.js","sourceRoot":"","sources":["../src/editor.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,MAAM,EAAe,MAAM,QAAQ,CAAC;AAG1D,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEzD,OAAO,EAAmB,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAkB,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAqB7C,MAAM,CAAC,MAAM,SAAS,GAAG,CAAuC,MAA2C,EAA8B,EAAE;IAC1I,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACrC,MAAM,GAAG,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,QAAQ,CAAmC,SAAS,CAAC,CAAC;IAC3E,IAAI,OAAO,GAAG,IAAI,EAAE,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9D,IAAI,OAAO,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QAChD,OAAO,GAAG;YACT,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,IAAI,EAAE,UAAU,CAAC;gBAChB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC;gBACjC,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,WAAW,EAAE,MAAM,CAAC,WAAW;aAC/B,CAAC,CAAC,IAAI;SACP,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,CAAC;IACf,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,CAAC;IAC3B,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,CAAC;IAC/B,SAAS,CAAC,GAAG,EAAE;QACd,IAAI,IAAI,IAAI,MAAM,IAAI,GAAG,KAAK,SAAS;YAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACpE,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IACxB,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IACxH,OAAO,EAAE,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACxD,CAAC,CAAC"}
1
+ {"version":3,"file":"editor.js","sourceRoot":"","sources":["../src/editor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,MAAM,EAAe,MAAM,QAAQ,CAAC;AAG1D,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAGzD,OAAO,EAAmB,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAkB,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAqB7C,MAAM,CAAC,MAAM,SAAS,GAAG,CAAuC,MAA2C,EAA8B,EAAE;IAC1I,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACrC,MAAM,GAAG,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,QAAQ,CAAmC,SAAS,CAAC,CAAC;IAC3E,IAAI,OAAO,GAAG,IAAI,EAAE,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9D,IAAI,OAAO,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QAChD,OAAO,GAAG;YACT,IAAI,EAAE,UAAU,CAAC;gBAChB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC;gBACjC,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,IAAI,EAAE,MAAM,CAAC,IAAI;aACjB,CAAC,CAAC,IAAI;YACP,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,MAAM,EAAE,MAAM,CAAC,MAAM;SACrB,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,CAAC;IACf,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,CAAC;IAC3B,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,CAAC;IAC/B,SAAS,CAAC,GAAG,EAAE;QACd,IAAI,IAAI,IAAI,MAAM,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACzC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3B,CAAC;IACF,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IACxB,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IACxH,OAAO,EAAE,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACxD,CAAC,CAAC"}
@@ -1,7 +1,7 @@
1
- import type { FieldFailure, Fields, Name, Submitter } from "@shivaedev/effect-form";
2
1
  import { Effect, type Schema, type Scope } from "effect";
3
2
  import type { AtomRegistry } from "effect/unstable/reactivity/AtomRegistry";
4
3
  import type { Reactivity } from "effect/unstable/reactivity/Reactivity";
4
+ import type { FieldFailure, Fields, Name, Submitter } from "@shivaedev/effect-form";
5
5
  export interface FieldRejection<N extends string> {
6
6
  readonly field: N;
7
7
  readonly message: string;
@@ -1 +1 @@
1
- {"version":3,"file":"field-rejection.d.ts","sourceRoot":"","sources":["../src/field-rejection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACpF,OAAO,EAAE,MAAM,EAAa,KAAK,MAAM,EAAE,KAAK,KAAK,EAAE,MAAM,QAAQ,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC;AAC5E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uCAAuC,CAAC;AAExE,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,MAAM;IAC/C,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,GAAG,YAAY,GAAG,UAAU,CAAC;AAE1E,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;AAEjG,KAAK,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAChG,OAAO,SAAS,MAAM,CAAC,GACtB,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,GACxC,KAAK,GACN,KAAK,CAAC;AAET,MAAM,MAAM,qBAAqB,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,IAAI;IAAE,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;CAAE,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GACvI,OAAO,GACP;IAAE,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;CAAE,CAAC,CAAC;AAEhD,eAAO,MAAM,gBAAgB,GAC3B,CAAC,SAAS,MAAM,EAAE,QAAQ,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAC1C,OAAO,OAAO,KAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,SAK3C,CAAC;AAEH,eAAO,MAAM,SAAS,GAAI,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EACrD,QAAQ,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EACxB,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC3C,QAAQ,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS,MAG7B,QAAQ,CAAC,EAAE,WAAW,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,YAAY,EAAE,CAAC,CAKvF,CAAC"}
1
+ {"version":3,"file":"field-rejection.d.ts","sourceRoot":"","sources":["../src/field-rejection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAa,KAAK,MAAM,EAAE,KAAK,KAAK,EAAE,MAAM,QAAQ,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC;AAC5E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uCAAuC,CAAC;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEpF,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,MAAM;IAC/C,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,GAAG,YAAY,GAAG,UAAU,CAAC;AAE1E,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;AAEjG,KAAK,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAChG,OAAO,SAAS,MAAM,CAAC,GACtB,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,GACxC,KAAK,GACN,KAAK,CAAC;AAET,MAAM,MAAM,qBAAqB,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,IAAI;IAAE,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;CAAE,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GACvI,OAAO,GACP;IAAE,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;CAAE,CAAC,CAAC;AAEhD,eAAO,MAAM,gBAAgB,GAC3B,CAAC,SAAS,MAAM,EAAE,QAAQ,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAC1C,OAAO,OAAO,KAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,SAO3C,CAAC;AAEH,eAAO,MAAM,SAAS,GAAI,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EACrD,QAAQ,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EACxB,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC3C,QAAQ,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS,MAG7B,QAAQ,CAAC,EAAE,WAAW,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,YAAY,EAAE,CAAC,CAKvF,CAAC"}
@@ -1,8 +1,9 @@
1
1
  import { Effect, Predicate } from "effect";
2
2
  export const fieldRejectionOf = (schema) => (error) => {
3
3
  const isName = (name) => typeof name === "string" && Object.hasOwn(schema.fields, name);
4
- if (!Predicate.hasProperty(error, "_tag") || !Predicate.hasProperty(error, "field") || !Predicate.hasProperty(error, "message"))
4
+ if (!(Predicate.hasProperty(error, "_tag") && Predicate.hasProperty(error, "field") && Predicate.hasProperty(error, "message"))) {
5
5
  return undefined;
6
+ }
6
7
  const { _tag, field, message } = error;
7
8
  return typeof _tag === "string" && isName(field) && typeof message === "string" ? { field, message } : undefined;
8
9
  };
@@ -1 +1 @@
1
- {"version":3,"file":"field-rejection.js","sourceRoot":"","sources":["../src/field-rejection.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,SAAS,EAA2B,MAAM,QAAQ,CAAC;AAuBpE,MAAM,CAAC,MAAM,gBAAgB,GAC5B,CAAmB,MAAwB,EAAE,EAAE,CAC/C,CAAC,KAAc,EAAuC,EAAE;IACvD,MAAM,MAAM,GAAG,CAAC,IAAa,EAAmB,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAClH,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IAClJ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IACvC,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAClH,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,SAAS,GAAG,CACxB,MAAwB,EACxB,IAA2C,EAC3C,MAAqC,EACpC,EAAE;IACH,MAAM,SAAS,GAAG,MAAM,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACrD,OAAO,CAAC,MAAS,EAAE,SAA6B,EAAyC,EAAE,CAC1F,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAA0C,EAAE;QAC5E,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAC/B,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAC9F,CAAC,CAAC,CAAC;AACL,CAAC,CAAC"}
1
+ {"version":3,"file":"field-rejection.js","sourceRoot":"","sources":["../src/field-rejection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,SAAS,EAA2B,MAAM,QAAQ,CAAC;AAwBpE,MAAM,CAAC,MAAM,gBAAgB,GAC5B,CAAmB,MAAwB,EAAE,EAAE,CAC/C,CAAC,KAAc,EAAuC,EAAE;IACvD,MAAM,MAAM,GAAG,CAAC,IAAa,EAAmB,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAClH,IAAI,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;QACjI,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IACvC,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAClH,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,SAAS,GAAG,CACxB,MAAwB,EACxB,IAA2C,EAC3C,MAAqC,EACpC,EAAE;IACH,MAAM,SAAS,GAAG,MAAM,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACrD,OAAO,CAAC,MAAS,EAAE,SAA6B,EAAyC,EAAE,CAC1F,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAA0C,EAAE;QAC5E,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAC/B,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAC9F,CAAC,CAAC,CAAC;AACL,CAAC,CAAC"}
@@ -2,11 +2,11 @@ import { Cause, Option } from "effect";
2
2
  import * as AsyncResult from "effect/unstable/reactivity/AsyncResult";
3
3
  import type * as Atom from "effect/unstable/reactivity/Atom";
4
4
  export interface ResultState<A, E> {
5
- readonly result: AsyncResult.AsyncResult<A, E>;
6
- readonly data: Option.Option<A>;
7
5
  readonly cause: Option.Option<Cause.Cause<E>>;
6
+ readonly data: Option.Option<A>;
8
7
  readonly pending: boolean;
9
8
  readonly refreshing: boolean;
9
+ readonly result: AsyncResult.AsyncResult<A, E>;
10
10
  }
11
11
  export declare const isUnauthorized: <E>(cause: Cause.Cause<E>) => boolean;
12
12
  export interface QueryState<A, E> extends ResultState<A, E> {
@@ -16,6 +16,5 @@ export declare const useQuery: <A, E>(atom: Atom.Atom<AsyncResult.AsyncResult<A,
16
16
  export interface ActionState<Input, A, E> extends ResultState<A, E> {
17
17
  readonly dispatch: (input: Input) => void;
18
18
  }
19
- /** Dispatches an action and reads its shared native state without claiming a per-invocation completion result. */
20
19
  export declare const useAction: <Input, A, E>(atom: Atom.AtomResultFn<Input, A, E>) => ActionState<Input, A, E>;
21
20
  //# sourceMappingURL=result-state.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"result-state.d.ts","sourceRoot":"","sources":["../src/result-state.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAa,MAAM,QAAQ,CAAC;AAClD,OAAO,KAAK,WAAW,MAAM,wCAAwC,CAAC;AACtE,OAAO,KAAK,KAAK,IAAI,MAAM,iCAAiC,CAAC;AAI7D,MAAM,WAAW,WAAW,CAAC,CAAC,EAAE,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC7B;AAaD,eAAO,MAAM,cAAc,GAAI,CAAC,EAAE,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAG,OACwE,CAAC;AASnI,MAAM,WAAW,UAAU,CAAC,CAAC,EAAE,CAAC,CAAE,SAAQ,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC;IAC1D,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;CAC7B;AAED,eAAO,MAAM,QAAQ,GAAI,CAAC,EAAE,CAAC,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAG,UAAU,CAAC,CAAC,EAAE,CAAC,CAI9F,CAAC;AAEF,MAAM,WAAW,WAAW,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAE,SAAQ,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC;IAClE,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAC1C;AAED,kHAAkH;AAClH,eAAO,MAAM,SAAS,GAAI,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,KAAG,WAAW,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAIpG,CAAC"}
1
+ {"version":3,"file":"result-state.d.ts","sourceRoot":"","sources":["../src/result-state.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAa,MAAM,QAAQ,CAAC;AAClD,OAAO,KAAK,WAAW,MAAM,wCAAwC,CAAC;AACtE,OAAO,KAAK,KAAK,IAAI,MAAM,iCAAiC,CAAC;AAI7D,MAAM,WAAW,WAAW,CAAC,CAAC,EAAE,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CAC/C;AAaD,eAAO,MAAM,cAAc,GAAI,CAAC,EAAE,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAG,OACwE,CAAC;AAWnI,MAAM,WAAW,UAAU,CAAC,CAAC,EAAE,CAAC,CAAE,SAAQ,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC;IAC1D,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;CAC7B;AAED,eAAO,MAAM,QAAQ,GAAI,CAAC,EAAE,CAAC,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAG,UAAU,CAAC,CAAC,EAAE,CAAC,CAI9F,CAAC;AAEF,MAAM,WAAW,WAAW,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAE,SAAQ,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC;IAClE,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAC1C;AAGD,eAAO,MAAM,SAAS,GAAI,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,KAAG,WAAW,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAIpG,CAAC"}
@@ -6,19 +6,20 @@ import { useSessionRecheck } from "./session-boundary.js";
6
6
  const state = (result) => {
7
7
  const data = AsyncResult.value(result);
8
8
  return {
9
- result,
10
- data,
11
9
  cause: AsyncResult.cause(result),
10
+ data,
12
11
  pending: result.waiting,
13
12
  refreshing: result.waiting && Option.isSome(data),
13
+ result,
14
14
  };
15
15
  };
16
16
  export const isUnauthorized = (cause) => Option.match(Cause.findErrorOption(cause), { onNone: () => false, onSome: (error) => Predicate.isTagged(error, "Unauthorized") });
17
17
  const useRecheckOnUnauthorized = (result) => {
18
18
  const recheck = useSessionRecheck();
19
19
  useEffect(() => {
20
- if (AsyncResult.isFailure(result) && isUnauthorized(result.cause))
20
+ if (AsyncResult.isFailure(result) && isUnauthorized(result.cause)) {
21
21
  recheck();
22
+ }
22
23
  }, [recheck, result]);
23
24
  };
24
25
  export const useQuery = (atom) => {
@@ -26,7 +27,7 @@ export const useQuery = (atom) => {
26
27
  useRecheckOnUnauthorized(result);
27
28
  return { ...state(result), refresh: useAtomRefresh(atom) };
28
29
  };
29
- /** Dispatches an action and reads its shared native state without claiming a per-invocation completion result. */
30
+ // The atom's state is shared by every dispatch, so it never claims to be one invocation's completion result.
30
31
  export const useAction = (atom) => {
31
32
  const result = useAtomValue(atom);
32
33
  useRecheckOnUnauthorized(result);
@@ -1 +1 @@
1
- {"version":3,"file":"result-state.js","sourceRoot":"","sources":["../src/result-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,KAAK,WAAW,MAAM,wCAAwC,CAAC;AAEtE,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAU1D,MAAM,KAAK,GAAG,CAAO,MAAqC,EAAqB,EAAE;IAChF,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACvC,OAAO;QACN,MAAM;QACN,IAAI;QACJ,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC;QAChC,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,UAAU,EAAE,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;KACjD,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAI,KAAqB,EAAW,EAAE,CACnE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC,EAAE,CAAC,CAAC;AAEnI,MAAM,wBAAwB,GAAG,CAAO,MAAqC,EAAQ,EAAE;IACtF,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;IACpC,SAAS,CAAC,GAAG,EAAE;QACd,IAAI,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;IAC9E,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AACvB,CAAC,CAAC;AAMF,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAO,IAA8C,EAAoB,EAAE;IAClG,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAClC,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACjC,OAAO,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;AAC5D,CAAC,CAAC;AAMF,kHAAkH;AAClH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAc,IAAoC,EAA4B,EAAE;IACxG,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAClC,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACjC,OAAO,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;AACzD,CAAC,CAAC"}
1
+ {"version":3,"file":"result-state.js","sourceRoot":"","sources":["../src/result-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,KAAK,WAAW,MAAM,wCAAwC,CAAC;AAEtE,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAU1D,MAAM,KAAK,GAAG,CAAO,MAAqC,EAAqB,EAAE;IAChF,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACvC,OAAO;QACN,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC;QAChC,IAAI;QACJ,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,UAAU,EAAE,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;QACjD,MAAM;KACN,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAI,KAAqB,EAAW,EAAE,CACnE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC,EAAE,CAAC,CAAC;AAEnI,MAAM,wBAAwB,GAAG,CAAO,MAAqC,EAAQ,EAAE;IACtF,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;IACpC,SAAS,CAAC,GAAG,EAAE;QACd,IAAI,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACnE,OAAO,EAAE,CAAC;QACX,CAAC;IACF,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AACvB,CAAC,CAAC;AAMF,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAO,IAA8C,EAAoB,EAAE;IAClG,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAClC,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACjC,OAAO,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;AAC5D,CAAC,CAAC;AAMF,6GAA6G;AAC7G,MAAM,CAAC,MAAM,SAAS,GAAG,CAAc,IAAoC,EAA4B,EAAE;IACxG,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAClC,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACjC,OAAO,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;AACzD,CAAC,CAAC"}
@@ -3,14 +3,14 @@ export type ResumeSource = (resume: () => void) => () => void;
3
3
  type ResumeEvent = "online" | "visibilitychange";
4
4
  export interface ResumeWindow {
5
5
  readonly addEventListener: (type: ResumeEvent, listener: () => void) => void;
6
- readonly removeEventListener: (type: ResumeEvent, listener: () => void) => void;
7
6
  readonly document: {
8
7
  readonly visibilityState: string;
9
8
  };
9
+ readonly removeEventListener: (type: ResumeEvent, listener: () => void) => void;
10
10
  }
11
11
  export interface ResumeOptions {
12
- readonly window?: ResumeWindow;
13
12
  readonly native?: ResumeSource;
13
+ readonly window?: ResumeWindow;
14
14
  }
15
15
  export declare const resumeSignal: ({ window, native }: ResumeOptions) => Atom.Atom<number>;
16
16
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"resume-signal.d.ts","sourceRoot":"","sources":["../src/resume-signal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,iCAAiC,CAAC;AAExD,MAAM,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;AAE9D,KAAK,WAAW,GAAG,QAAQ,GAAG,kBAAkB,CAAC;AAEjD,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,gBAAgB,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IAC7E,QAAQ,CAAC,mBAAmB,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IAChF,QAAQ,CAAC,QAAQ,EAAE;QAAE,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;KAAE,CAAC;CACxD;AAED,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC;CAC/B;AAYD,eAAO,MAAM,YAAY,GAAI,oBAAoB,aAAa,KAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAShF,CAAC"}
1
+ {"version":3,"file":"resume-signal.d.ts","sourceRoot":"","sources":["../src/resume-signal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,iCAAiC,CAAC;AAExD,MAAM,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;AAE9D,KAAK,WAAW,GAAG,QAAQ,GAAG,kBAAkB,CAAC;AAEjD,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,gBAAgB,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IAC7E,QAAQ,CAAC,QAAQ,EAAE;QAAE,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;KAAE,CAAC;IACxD,QAAQ,CAAC,mBAAmB,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;CAChF;AAED,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC;CAC/B;AAcD,eAAO,MAAM,YAAY,GAAI,oBAAoB,aAAa,KAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAWhF,CAAC"}
@@ -1,8 +1,9 @@
1
1
  import * as Atom from "effect/unstable/reactivity/Atom";
2
2
  const whileVisible = (target, type) => (resume) => {
3
3
  const visible = () => {
4
- if (target.document.visibilityState === "visible")
4
+ if (target.document.visibilityState === "visible") {
5
5
  resume();
6
+ }
6
7
  };
7
8
  target.addEventListener(type, visible);
8
9
  return () => target.removeEventListener(type, visible);
@@ -13,8 +14,9 @@ export const resumeSignal = ({ window, native }) => {
13
14
  return Atom.readable((get) => {
14
15
  let count = 0;
15
16
  const resume = () => get.setSelf(++count);
16
- for (const source of sources)
17
+ for (const source of sources) {
17
18
  get.addFinalizer(source(resume));
19
+ }
18
20
  return count;
19
21
  });
20
22
  };
@@ -1 +1 @@
1
- {"version":3,"file":"resume-signal.js","sourceRoot":"","sources":["../src/resume-signal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,iCAAiC,CAAC;AAiBxD,MAAM,YAAY,GACjB,CAAC,MAAoB,EAAE,IAAiB,EAAgB,EAAE,CAC1D,CAAC,MAAM,EAAE,EAAE;IACV,MAAM,OAAO,GAAG,GAAG,EAAE;QACpB,IAAI,MAAM,CAAC,QAAQ,CAAC,eAAe,KAAK,SAAS;YAAE,MAAM,EAAE,CAAC;IAC7D,CAAC,CAAC;IACF,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACvC,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACxD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,EAAiB,EAAqB,EAAE;IACpF,MAAM,OAAO,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE,kBAAkB,CAAC,EAAE,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IACvH,MAAM,OAAO,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,CAAC,CAAC;IACtE,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,EAAE;QAC5B,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;QAC1C,KAAK,MAAM,MAAM,IAAI,OAAO;YAAE,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAC/D,OAAO,KAAK,CAAC;IACd,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"resume-signal.js","sourceRoot":"","sources":["../src/resume-signal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,iCAAiC,CAAC;AAiBxD,MAAM,YAAY,GACjB,CAAC,MAAoB,EAAE,IAAiB,EAAgB,EAAE,CAC1D,CAAC,MAAM,EAAE,EAAE;IACV,MAAM,OAAO,GAAG,GAAG,EAAE;QACpB,IAAI,MAAM,CAAC,QAAQ,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;YACnD,MAAM,EAAE,CAAC;QACV,CAAC;IACF,CAAC,CAAC;IACF,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACvC,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACxD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,EAAiB,EAAqB,EAAE;IACpF,MAAM,OAAO,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE,kBAAkB,CAAC,EAAE,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IACvH,MAAM,OAAO,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,CAAC,CAAC;IACtE,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,EAAE;QAC5B,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;QAC1C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC9B,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,KAAK,CAAC;IACd,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC"}
@@ -1,11 +1,11 @@
1
- import { FieldFailure, type Fields, type Form } from "@shivaedev/effect-form";
2
1
  import { Option } from "effect";
2
+ import { FieldFailure, type Fields, type Form } from "@shivaedev/effect-form";
3
3
  export interface SaveState<E> {
4
4
  readonly dirty: boolean;
5
5
  readonly failure: Option.Option<E>;
6
- readonly saving: boolean;
7
- readonly save: () => void;
8
6
  readonly revert: () => void;
7
+ readonly save: () => void;
8
+ readonly saving: boolean;
9
9
  }
10
10
  export declare const useSaveState: <F extends Fields, A, E, ER>(form: Form<F, A, E | FieldFailure, ER> | undefined, settled: (result: A) => void) => SaveState<E | ER>;
11
11
  //# sourceMappingURL=save-state.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"save-state.d.ts","sourceRoot":"","sources":["../src/save-state.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,KAAK,MAAM,EAAE,KAAK,IAAI,EAAW,MAAM,wBAAwB,CAAC;AACvF,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAUhC,MAAM,WAAW,SAAS,CAAC,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC;CAC5B;AAED,eAAO,MAAM,YAAY,GAAI,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EACtD,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,YAAY,EAAE,EAAE,CAAC,GAAG,SAAS,EAClD,SAAS,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,KAC1B,SAAS,CAAC,CAAC,GAAG,EAAE,CA0BlB,CAAC"}
1
+ {"version":3,"file":"save-state.d.ts","sourceRoot":"","sources":["../src/save-state.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIhC,OAAO,EAAE,YAAY,EAAE,KAAK,MAAM,EAAE,KAAK,IAAI,EAAW,MAAM,wBAAwB,CAAC;AAOvF,MAAM,WAAW,SAAS,CAAC,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CACzB;AAED,eAAO,MAAM,YAAY,GAAI,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EACtD,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,YAAY,EAAE,EAAE,CAAC,GAAG,SAAS,EAClD,SAAS,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,KAC1B,SAAS,CAAC,CAAC,GAAG,EAAE,CA6BlB,CAAC"}
@@ -1,9 +1,9 @@
1
1
  import { RegistryContext, useAtomValue } from "@effect/atom-react";
2
- import { FieldFailure, Invalid } from "@shivaedev/effect-form";
3
2
  import { Option } from "effect";
4
3
  import * as AsyncResult from "effect/unstable/reactivity/AsyncResult";
5
4
  import * as Atom from "effect/unstable/reactivity/Atom";
6
5
  import { useCallback, useContext, useEffect } from "react";
6
+ import { FieldFailure, Invalid } from "@shivaedev/effect-form";
7
7
  import { isUnauthorized } from "./result-state.js";
8
8
  import { useSessionRecheck } from "./session-boundary.js";
9
9
  const idle = Atom.make(AsyncResult.initial());
@@ -14,21 +14,24 @@ export const useSaveState = (form, settled) => {
14
14
  const result = useAtomValue(form?.submit ?? idle);
15
15
  const dirty = useAtomValue(form?.dirty ?? clean);
16
16
  useEffect(() => {
17
- if (AsyncResult.isFailure(result) && isUnauthorized(result.cause))
17
+ if (AsyncResult.isFailure(result) && isUnauthorized(result.cause)) {
18
18
  recheck();
19
+ }
19
20
  }, [recheck, result]);
20
- useEffect(() => form &&
21
- registry.subscribe(form.submit, (next) => {
22
- if (AsyncResult.isSuccess(next) && !next.waiting)
21
+ useEffect(() => form
22
+ && registry.subscribe(form.submit, (next) => {
23
+ if (AsyncResult.isSuccess(next) && !next.waiting) {
23
24
  settled(next.value);
25
+ }
24
26
  }), [form, registry, settled]);
25
27
  const save = useCallback(() => {
26
- if (form === undefined || registry.get(form.submit).waiting)
28
+ if (form === undefined || registry.get(form.submit).waiting) {
27
29
  return;
30
+ }
28
31
  registry.set(form.submit, undefined);
29
32
  }, [form, registry]);
30
33
  const revert = useCallback(() => form?.revert(), [form]);
31
- const failure = Option.filter(AsyncResult.error(result), (error) => !(error instanceof FieldFailure) && !(error instanceof Invalid));
32
- return { dirty, failure, saving: result.waiting, save, revert };
34
+ const failure = Option.filter(AsyncResult.error(result), (error) => !(error instanceof FieldFailure || error instanceof Invalid));
35
+ return { dirty, failure, revert, save, saving: result.waiting };
33
36
  };
34
37
  //# sourceMappingURL=save-state.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"save-state.js","sourceRoot":"","sources":["../src/save-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAE,YAAY,EAA0B,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACvF,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,WAAW,MAAM,wCAAwC,CAAC;AACtE,OAAO,KAAK,IAAI,MAAM,iCAAiC,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;AAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAU/B,MAAM,CAAC,MAAM,YAAY,GAAG,CAC3B,IAAkD,EAClD,OAA4B,EACR,EAAE;IACtB,MAAM,QAAQ,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;IACpC,MAAM,MAAM,GAAgE,YAAY,CAAC,IAAI,EAAE,MAAM,IAAI,IAAI,CAAC,CAAC;IAC/G,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,EAAE,KAAK,IAAI,KAAK,CAAC,CAAC;IACjD,SAAS,CAAC,GAAG,EAAE;QACd,IAAI,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;IAC9E,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IACtB,SAAS,CACR,GAAG,EAAE,CACJ,IAAI;QACJ,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACxC,IAAI,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO;gBAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvE,CAAC,CAAC,EACH,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CACzB,CAAC;IACF,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,IAAI,IAAI,KAAK,SAAS,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO;YAAE,OAAO;QACpE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACtC,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IACrB,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAC5B,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,EACzB,CAAC,KAAK,EAAmB,EAAE,CAAC,CAAC,CAAC,KAAK,YAAY,YAAY,CAAC,IAAI,CAAC,CAAC,KAAK,YAAY,OAAO,CAAC,CAC3F,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AACjE,CAAC,CAAC"}
1
+ {"version":3,"file":"save-state.js","sourceRoot":"","sources":["../src/save-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,WAAW,MAAM,wCAAwC,CAAC;AACtE,OAAO,KAAK,IAAI,MAAM,iCAAiC,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC3D,OAAO,EAAE,YAAY,EAA0B,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACvF,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;AAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAU/B,MAAM,CAAC,MAAM,YAAY,GAAG,CAC3B,IAAkD,EAClD,OAA4B,EACR,EAAE;IACtB,MAAM,QAAQ,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;IACpC,MAAM,MAAM,GAAgE,YAAY,CAAC,IAAI,EAAE,MAAM,IAAI,IAAI,CAAC,CAAC;IAC/G,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,EAAE,KAAK,IAAI,KAAK,CAAC,CAAC;IACjD,SAAS,CAAC,GAAG,EAAE;QACd,IAAI,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACnE,OAAO,EAAE,CAAC;QACX,CAAC;IACF,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IACtB,SAAS,CACR,GAAG,EAAE,CACJ,IAAI;WACD,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YAC3C,IAAI,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBAClD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;QACF,CAAC,CAAC,EACH,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CACzB,CAAC;IACF,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,IAAI,IAAI,KAAK,SAAS,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC;YAC7D,OAAO;QACR,CAAC;QACD,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACtC,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IACrB,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAmB,EAAE,CAAC,CAAC,CAAC,KAAK,YAAY,YAAY,IAAI,KAAK,YAAY,OAAO,CAAC,CAAC,CAAC;IACnJ,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;AACjE,CAAC,CAAC"}
@@ -1,11 +1,11 @@
1
1
  import { type ReactNode } from "react";
2
2
  export interface SessionBoundaryProps<S, Client> {
3
- readonly session: S | undefined;
4
- readonly identify: (session: S) => string;
3
+ readonly children: (client: Client) => ReactNode;
5
4
  readonly connect: (session: S) => Client;
5
+ readonly identify: (session: S) => string;
6
6
  readonly recheck: () => void;
7
+ readonly session: S | undefined;
7
8
  readonly signedOut?: ReactNode;
8
- readonly children: (client: Client) => ReactNode;
9
9
  }
10
10
  export declare const useSessionRecheck: () => (() => void);
11
11
  export declare const SessionBoundary: <S, Client>({ session, identify, connect, recheck, signedOut, children, }: SessionBoundaryProps<S, Client>) => ReactNode;
@@ -1 +1 @@
1
- {"version":3,"file":"session-boundary.d.ts","sourceRoot":"","sources":["../src/session-boundary.ts"],"names":[],"mappings":"AAEA,OAAO,EAA0C,KAAK,SAAS,EAAmC,MAAM,OAAO,CAAC;AAEhH,MAAM,WAAW,oBAAoB,CAAC,CAAC,EAAE,MAAM;IAC9C,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,SAAS,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,MAAM,CAAC;IAC1C,QAAQ,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,MAAM,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,SAAS,CAAC;CACjD;AAID,eAAO,MAAM,iBAAiB,QAAO,CAAC,MAAM,IAAI,CAAwB,CAAC;AAoDzE,eAAO,MAAM,eAAe,GAAI,CAAC,EAAE,MAAM,EAAE,+DAOxC,oBAAoB,CAAC,CAAC,EAAE,MAAM,CAAC,KAAG,SAGoE,CAAC"}
1
+ {"version":3,"file":"session-boundary.d.ts","sourceRoot":"","sources":["../src/session-boundary.ts"],"names":[],"mappings":"AAEA,OAAO,EAA0C,KAAK,SAAS,EAAmC,MAAM,OAAO,CAAC;AAEhH,MAAM,WAAW,oBAAoB,CAAC,CAAC,EAAE,MAAM;IAC9C,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,SAAS,CAAC;IACjD,QAAQ,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,MAAM,CAAC;IACzC,QAAQ,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,MAAM,CAAC;IAC1C,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,SAAS,CAAC;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC;CAC/B;AAID,eAAO,MAAM,iBAAiB,QAAO,CAAC,MAAM,IAAI,CAAwB,CAAC;AA0DzE,eAAO,MAAM,eAAe,GAAI,CAAC,EAAE,MAAM,EAAE,+DAOxC,oBAAoB,CAAC,CAAC,EAAE,MAAM,CAAC,KAAG,SAGoE,CAAC"}
@@ -3,19 +3,21 @@ import * as AtomRegistry from "effect/unstable/reactivity/AtomRegistry";
3
3
  import { createContext, createElement, Fragment, useContext, useEffect, useState } from "react";
4
4
  const Recheck = createContext(() => { });
5
5
  export const useSessionRecheck = () => useContext(Recheck);
6
- const owning = (client) => ({ client, registry: AtomRegistry.make(), mounted: 0 });
6
+ const owning = (client) => ({ client, mounted: 0, registry: AtomRegistry.make() });
7
7
  // No cleanup runs when a hidden <Activity> subtree is unmounted, so nodes a hidden render creates must not outlive it.
8
8
  const hidden = (client) => {
9
9
  const owned = owning(client);
10
10
  let reaping = false;
11
11
  owned.registry.onNodeAdded = () => {
12
- if (reaping || owned.mounted > 0)
12
+ if (reaping || owned.mounted > 0) {
13
13
  return;
14
+ }
14
15
  reaping = true;
15
16
  setTimeout(() => {
16
17
  reaping = false;
17
- if (owned.mounted === 0)
18
+ if (owned.mounted === 0) {
18
19
  owned.registry.reset();
20
+ }
19
21
  }, 0);
20
22
  };
21
23
  return owned;
@@ -27,8 +29,9 @@ const Generation = ({ session, connect, recheck, children }) => {
27
29
  return () => {
28
30
  owned.mounted -= 1;
29
31
  queueMicrotask(() => {
30
- if (owned.mounted > 0)
32
+ if (owned.mounted > 0) {
31
33
  return;
34
+ }
32
35
  owned.registry.dispose();
33
36
  own((current) => (current === owned ? hidden(owned.client) : current));
34
37
  });
@@ -38,5 +41,5 @@ const Generation = ({ session, connect, recheck, children }) => {
38
41
  };
39
42
  export const SessionBoundary = ({ session, identify, connect, recheck, signedOut, children, }) => session === undefined
40
43
  ? createElement(Fragment, null, signedOut)
41
- : createElement((Generation), { key: identify(session), session, connect, recheck, children });
44
+ : createElement((Generation), { children, connect, key: identify(session), recheck, session });
42
45
  //# sourceMappingURL=session-boundary.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-boundary.js","sourceRoot":"","sources":["../src/session-boundary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,YAAY,MAAM,yCAAyC,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,QAAQ,EAAkB,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAWhH,MAAM,OAAO,GAAG,aAAa,CAAa,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AAEpD,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAiB,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AAQzE,MAAM,MAAM,GAAG,CAAS,MAAc,EAAiB,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;AAElH,uHAAuH;AACvH,MAAM,MAAM,GAAG,CAAS,MAAc,EAAiB,EAAE;IACxD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7B,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,CAAC,QAAQ,CAAC,WAAW,GAAG,GAAG,EAAE;QACjC,IAAI,OAAO,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC;YAAE,OAAO;QACzC,OAAO,GAAG,IAAI,CAAC;QACf,UAAU,CAAC,GAAG,EAAE;YACf,OAAO,GAAG,KAAK,CAAC;YAChB,IAAI,KAAK,CAAC,OAAO,KAAK,CAAC;gBAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjD,CAAC,EAAE,CAAC,CAAC,CAAC;IACP,CAAC,CAAC;IACF,OAAO,KAAK,CAAC;AACd,CAAC,CAAC;AASF,MAAM,UAAU,GAAG,CAAY,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAA8B,EAAa,EAAE;IAChH,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC9D,SAAS,CAAC,GAAG,EAAE;QACd,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;QACnB,OAAO,GAAG,EAAE;YACX,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;YACnB,cAAc,CAAC,GAAG,EAAE;gBACnB,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC;oBAAE,OAAO;gBAC9B,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACzB,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YACxE,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IACZ,OAAO,aAAa,CACnB,OAAO,CAAC,QAAQ,EAChB,EAAE,KAAK,EAAE,OAAO,EAAE,EAClB,aAAa,CAAC,eAAe,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAC1F,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAY,EAC1C,OAAO,EACP,QAAQ,EACR,OAAO,EACP,OAAO,EACP,SAAS,EACT,QAAQ,GACyB,EAAa,EAAE,CAChD,OAAO,KAAK,SAAS;IACpB,CAAC,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC;IAC1C,CAAC,CAAC,aAAa,CAAC,CAAA,UAAqB,CAAA,EAAE,EAAE,GAAG,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC"}
1
+ {"version":3,"file":"session-boundary.js","sourceRoot":"","sources":["../src/session-boundary.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,13 @@
1
- import { type Decoded, type Encoded, type FieldFailure, type Fields, type Form, type Services } from "@shivaedev/effect-form";
2
1
  import type { Effect, Schema } from "effect";
3
2
  import type * as Atom from "effect/unstable/reactivity/Atom";
3
+ import { type Decoded, type Encoded, type FieldFailure, type Fields, type Form, type Services } from "@shivaedev/effect-form";
4
4
  import { type AtomServices, type RejectField } from "./field-rejection.ts";
5
5
  export interface SubmissionConfig<F extends Fields, A, E, R, ER> {
6
6
  readonly fields: Schema.Struct<F>;
7
7
  readonly initialValues: Encoded<F>;
8
- readonly save: (values: Decoded<F>) => Effect.Effect<A, E, AtomServices<R>>;
9
- readonly runtime: Atom.AtomRuntime<Services<F, R>, ER>;
10
8
  readonly rejectField: RejectField<F, E> | undefined;
9
+ readonly runtime: Atom.AtomRuntime<Services<F, R>, ER>;
10
+ readonly save: (values: Decoded<F>) => Effect.Effect<A, E, AtomServices<R>>;
11
11
  }
12
12
  export interface Submission<F extends Fields, A, E, ER> {
13
13
  readonly form: Form<F, A, E | FieldFailure, ER>;
@@ -1 +1 @@
1
- {"version":3,"file":"submission.d.ts","sourceRoot":"","sources":["../src/submission.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,MAAM,EAAE,KAAK,IAAI,EAAQ,KAAK,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACpI,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,KAAK,KAAK,IAAI,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAa,MAAM,sBAAsB,CAAC;AAEtF,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;IAC9D,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAClC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5E,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACvD,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC;CACpD;AAED,MAAM,WAAW,UAAU,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;IACrD,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,YAAY,EAAE,EAAE,CAAC,CAAC;IAChD,QAAQ,CAAC,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;CACjD;AAED,eAAO,MAAM,UAAU,GAAI,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,QAAQ,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAG,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAa1H,CAAC"}
1
+ {"version":3,"file":"submission.d.ts","sourceRoot":"","sources":["../src/submission.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,KAAK,KAAK,IAAI,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,MAAM,EAAE,KAAK,IAAI,EAAQ,KAAK,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACpI,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAa,MAAM,sBAAsB,CAAC;AAEtF,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;IAC9D,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAClC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACnC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC;IACpD,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACvD,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;CAC5E;AAED,MAAM,WAAW,UAAU,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;IACrD,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,YAAY,EAAE,EAAE,CAAC,CAAC;IAChD,QAAQ,CAAC,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;CACjD;AAED,eAAO,MAAM,UAAU,GAAI,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,QAAQ,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAG,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAa1H,CAAC"}
@@ -6,11 +6,11 @@ export const submission = (config) => {
6
6
  let submitted;
7
7
  const form = make(fields, {
8
8
  initialValues,
9
- runtime,
10
9
  onSubmit: (values, submitter, snapshot) => {
11
10
  submitted = snapshot;
12
11
  return save(values, submitter);
13
12
  },
13
+ runtime,
14
14
  });
15
15
  return { form, submitted: () => submitted };
16
16
  };
@@ -1 +1 @@
1
- {"version":3,"file":"submission.js","sourceRoot":"","sources":["../src/submission.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyE,IAAI,EAAiB,MAAM,wBAAwB,CAAC;AAGpI,OAAO,EAAuC,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAetF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAgC,MAAwC,EAA2B,EAAE;IAC9H,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAClD,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IAChE,IAAI,SAAiC,CAAC;IACtC,MAAM,IAAI,GAAqC,IAAI,CAAC,MAAM,EAAE;QAC3D,aAAa;QACb,OAAO;QACP,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE;YACzC,SAAS,GAAG,QAAQ,CAAC;YACrB,OAAO,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAChC,CAAC;KACD,CAAC,CAAC;IACH,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC;AAC7C,CAAC,CAAC"}
1
+ {"version":3,"file":"submission.js","sourceRoot":"","sources":["../src/submission.ts"],"names":[],"mappings":"AAEA,OAAO,EAAyE,IAAI,EAAiB,MAAM,wBAAwB,CAAC;AACpI,OAAO,EAAuC,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAetF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAgC,MAAwC,EAA2B,EAAE;IAC9H,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAClD,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IAChE,IAAI,SAAiC,CAAC;IACtC,MAAM,IAAI,GAAqC,IAAI,CAAC,MAAM,EAAE;QAC3D,aAAa;QACb,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE;YACzC,SAAS,GAAG,QAAQ,CAAC;YACrB,OAAO,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAChC,CAAC;QACD,OAAO;KACP,CAAC,CAAC;IACH,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC;AAC7C,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,28 +1,27 @@
1
1
  {
2
2
  "name": "@shivaedev/effect-react",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "React query, action, editor and session hooks for native Effect atoms",
5
- "type": "module",
6
- "license": "MIT",
7
- "repository": {
8
- "type": "git",
9
- "url": "git+https://github.com/ShivaeDev/platform.git",
10
- "directory": "packages/effect-react"
11
- },
12
5
  "homepage": "https://github.com/ShivaeDev/platform/tree/main/packages/effect-react#readme",
13
6
  "bugs": {
14
7
  "url": "https://github.com/ShivaeDev/platform/issues"
15
8
  },
16
- "engines": {
17
- "node": ">=24"
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/ShivaeDev/platform.git",
12
+ "directory": "packages/effect-react"
18
13
  },
14
+ "license": "MIT",
19
15
  "sideEffects": false,
20
- "files": [
21
- "dist",
22
- "src",
23
- "CHANGELOG.md",
24
- "README.md"
25
- ],
16
+ "type": "module",
17
+ "imports": {
18
+ "#test/*": "./test/*",
19
+ "#*.ts": {
20
+ "source": "./src/*.ts",
21
+ "types": "./dist/*.d.ts",
22
+ "default": "./dist/*.js"
23
+ }
24
+ },
26
25
  "exports": {
27
26
  ".": {
28
27
  "types": "./dist/index.d.ts",
@@ -38,23 +37,20 @@
38
37
  },
39
38
  "./package.json": "./package.json"
40
39
  },
41
- "publishConfig": {
42
- "access": "public",
43
- "provenance": true
44
- },
45
- "peerDependencies": {
46
- "@effect/atom-react": "4.0.0-rc.112",
47
- "effect": "4.0.0-rc.112",
48
- "react": "19.2.8",
49
- "@shivaedev/effect-form": "0.1.1"
50
- },
51
- "peerDependenciesMeta": {
52
- "@shivaedev/effect-form": {
53
- "optional": true
54
- }
55
- },
40
+ "files": [
41
+ "dist",
42
+ "src",
43
+ "CHANGELOG.md",
44
+ "README.md"
45
+ ],
56
46
  "devDependencies": {
57
47
  "@effect/atom-react": "4.0.0-rc.112",
48
+ "@effect/sql-sqlite-node": "4.0.0-rc.112",
49
+ "@shivaedev/effect-contract": "0.2.1",
50
+ "@shivaedev/effect-form": "0.1.2",
51
+ "@shivaedev/effect-service": "0.1.1",
52
+ "@shivaedev/effect-sql": "0.1.1",
53
+ "@shivaedev/quality": "0.7.3",
58
54
  "@types/node": "24.10.1",
59
55
  "@types/react": "19.2.18",
60
56
  "@types/react-dom": "19.2.4",
@@ -64,20 +60,30 @@
64
60
  "react": "19.2.8",
65
61
  "react-dom": "19.2.8",
66
62
  "typescript": "npm:@typescript/typescript6@6.0.2",
67
- "vitest": "4.1.9",
68
- "@effect/sql-sqlite-node": "4.0.0-rc.112",
69
- "@shivaedev/effect-sql": "0.1.0",
70
- "@shivaedev/effect-form": "0.1.1",
71
- "@shivaedev/effect-contract": "0.1.0",
72
- "@shivaedev/effect-service": "0.1.0"
63
+ "vitest": "4.1.9"
64
+ },
65
+ "peerDependencies": {
66
+ "@effect/atom-react": "4.0.0-rc.112",
67
+ "@shivaedev/effect-form": "0.1.2",
68
+ "effect": "4.0.0-rc.112",
69
+ "react": "19.2.8"
70
+ },
71
+ "peerDependenciesMeta": {
72
+ "@shivaedev/effect-form": {
73
+ "optional": true
74
+ }
75
+ },
76
+ "engines": {
77
+ "node": ">=24"
78
+ },
79
+ "publishConfig": {
80
+ "access": "public",
81
+ "provenance": true
73
82
  },
74
83
  "scripts": {
75
84
  "build": "node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { force: true, recursive: true }))\" && tsc6 --project tsconfig.build.json",
76
- "check": "biome check .",
85
+ "ready": "pnpm typecheck && pnpm test && pnpm build",
77
86
  "test": "vitest run",
78
- "test:package": "node scripts/test-package.mjs",
79
- "typecheck": "tsc --noEmit",
80
- "typecheck:compat": "tsc6 --noEmit",
81
- "ready": "pnpm check && pnpm typecheck && pnpm typecheck:compat && pnpm test && pnpm build && pnpm test:package"
87
+ "typecheck": "tsc --noEmit"
82
88
  }
83
89
  }
package/src/create.ts CHANGED
@@ -1,7 +1,7 @@
1
- import type { Decoded, Encoded, FieldFailure, Fields, Form, Services } from "@shivaedev/effect-form";
2
1
  import { type Effect, Equal, Option, type Schema } from "effect";
3
2
  import type * as Atom from "effect/unstable/reactivity/Atom";
4
3
  import { useCallback, useState } from "react";
4
+ import type { Decoded, Encoded, FieldFailure, Fields, Form, Services } from "@shivaedev/effect-form";
5
5
  import type { AtomServices, FieldRejectionMapping } from "./field-rejection.ts";
6
6
  import { type SaveState, useSaveState } from "./save-state.ts";
7
7
  import { submission } from "./submission.ts";
@@ -14,8 +14,8 @@ export type CreateConfig<F extends Fields, Created, SE, R, ER> = {
14
14
  } & FieldRejectionMapping<F, SE>;
15
15
 
16
16
  export interface Create<F extends Fields, Created, SE, ER> extends SaveState<SE | ER> {
17
- readonly form: Form<F, Created, SE | FieldFailure, ER>;
18
17
  readonly created: Option.Option<Created>;
18
+ readonly form: Form<F, Created, SE | FieldFailure, ER>;
19
19
  }
20
20
 
21
21
  const editedSince = <V extends object>(current: V, submitted: V | undefined): Readonly<Record<string, unknown>> => {
@@ -26,7 +26,7 @@ const editedSince = <V extends object>(current: V, submitted: V | undefined): Re
26
26
  export const useCreate = <F extends Fields, Created, SE, R, ER>(config: CreateConfig<F, Created, SE, R, ER>): Create<F, Created, SE, ER> => {
27
27
  const [{ initialValues, fresh }] = useState(() => {
28
28
  const { fields, initialValues, runtime, create, rejectField } = config;
29
- return { initialValues, fresh: () => submission({ fields, initialValues, runtime, save: create, rejectField }) };
29
+ return { fresh: () => submission({ fields, initialValues, rejectField, runtime, save: create }), initialValues };
30
30
  });
31
31
  const [current, replace] = useState(fresh);
32
32
  const [created, record] = useState<Option.Option<Created>>(Option.none());
@@ -39,5 +39,5 @@ export const useCreate = <F extends Fields, Created, SE, R, ER>(config: CreateCo
39
39
  },
40
40
  [current, fresh, initialValues],
41
41
  );
42
- return { ...useSaveState(current.form, settled), form: current.form, created };
42
+ return { ...useSaveState(current.form, settled), created, form: current.form };
43
43
  };
package/src/editor.ts CHANGED
@@ -1,8 +1,8 @@
1
- import type { Decoded, Encoded, FieldFailure, Fields, Form, Services } from "@shivaedev/effect-form";
2
1
  import { type Effect, Option, type Schema } from "effect";
3
2
  import type * as AsyncResult from "effect/unstable/reactivity/AsyncResult";
4
3
  import type * as Atom from "effect/unstable/reactivity/Atom";
5
4
  import { useCallback, useEffect, useState } from "react";
5
+ import type { Decoded, Encoded, FieldFailure, Fields, Form, Services } from "@shivaedev/effect-form";
6
6
  import type { AtomServices, FieldRejectionMapping } from "./field-rejection.ts";
7
7
  import { type QueryState, useQuery } from "./result-state.ts";
8
8
  import { type SaveState, useSaveState } from "./save-state.ts";
@@ -17,13 +17,13 @@ export type EditorConfig<F extends Fields, Row, QE, SE, R, ER> = {
17
17
  } & FieldRejectionMapping<F, SE>;
18
18
 
19
19
  export interface Editor<F extends Fields, Row, QE, SE, ER> extends SaveState<SE | ER> {
20
- readonly query: QueryState<Row, QE>;
21
20
  readonly form: Form<F, Row, SE | FieldFailure, ER> | undefined;
21
+ readonly query: QueryState<Row, QE>;
22
22
  }
23
23
 
24
24
  interface Held<F extends Fields, Row, SE, ER> {
25
- readonly query: Atom.Atom<unknown>;
26
25
  readonly form: Form<F, Row, SE | FieldFailure, ER>;
26
+ readonly query: Atom.Atom<unknown>;
27
27
  readonly values: (row: Row) => Encoded<F>;
28
28
  }
29
29
 
@@ -34,23 +34,25 @@ export const useEditor = <F extends Fields, Row, QE, SE, R, ER>(config: EditorCo
34
34
  let current = held?.query === config.query ? held : undefined;
35
35
  if (current === undefined && row !== undefined) {
36
36
  current = {
37
- query: config.query,
38
- values: config.values,
39
37
  form: submission({
40
38
  fields: config.fields,
41
39
  initialValues: config.values(row),
40
+ rejectField: config.rejectField,
42
41
  runtime: config.runtime,
43
42
  save: config.save,
44
- rejectField: config.rejectField,
45
43
  }).form,
44
+ query: config.query,
45
+ values: config.values,
46
46
  };
47
47
  hold(current);
48
48
  }
49
49
  const form = current?.form;
50
50
  const values = current?.values;
51
51
  useEffect(() => {
52
- if (form && values && row !== undefined) form.receive(values(row));
52
+ if (form && values && row !== undefined) {
53
+ form.receive(values(row));
54
+ }
53
55
  }, [form, values, row]);
54
56
  const settled = useCallback((saved: Row) => (form && values ? form.receive(values(saved)) : undefined), [form, values]);
55
- return { ...useSaveState(form, settled), query, form };
57
+ return { ...useSaveState(form, settled), form, query };
56
58
  };
@@ -1,7 +1,7 @@
1
- import type { FieldFailure, Fields, Name, Submitter } from "@shivaedev/effect-form";
2
1
  import { Effect, Predicate, type Schema, type Scope } from "effect";
3
2
  import type { AtomRegistry } from "effect/unstable/reactivity/AtomRegistry";
4
3
  import type { Reactivity } from "effect/unstable/reactivity/Reactivity";
4
+ import type { FieldFailure, Fields, Name, Submitter } from "@shivaedev/effect-form";
5
5
 
6
6
  export interface FieldRejection<N extends string> {
7
7
  readonly field: N;
@@ -26,7 +26,9 @@ export const fieldRejectionOf =
26
26
  <F extends Fields>(schema: Schema.Struct<F>) =>
27
27
  (error: unknown): FieldRejection<Name<F>> | undefined => {
28
28
  const isName = (name: unknown): name is Name<F> => typeof name === "string" && Object.hasOwn(schema.fields, name);
29
- if (!Predicate.hasProperty(error, "_tag") || !Predicate.hasProperty(error, "field") || !Predicate.hasProperty(error, "message")) return undefined;
29
+ if (!(Predicate.hasProperty(error, "_tag") && Predicate.hasProperty(error, "field") && Predicate.hasProperty(error, "message"))) {
30
+ return undefined;
31
+ }
30
32
  const { _tag, field, message } = error;
31
33
  return typeof _tag === "string" && isName(field) && typeof message === "string" ? { field, message } : undefined;
32
34
  };
@@ -6,21 +6,21 @@ import { useEffect } from "react";
6
6
  import { useSessionRecheck } from "./session-boundary.ts";
7
7
 
8
8
  export interface ResultState<A, E> {
9
- readonly result: AsyncResult.AsyncResult<A, E>;
10
- readonly data: Option.Option<A>;
11
9
  readonly cause: Option.Option<Cause.Cause<E>>;
10
+ readonly data: Option.Option<A>;
12
11
  readonly pending: boolean;
13
12
  readonly refreshing: boolean;
13
+ readonly result: AsyncResult.AsyncResult<A, E>;
14
14
  }
15
15
 
16
16
  const state = <A, E>(result: AsyncResult.AsyncResult<A, E>): ResultState<A, E> => {
17
17
  const data = AsyncResult.value(result);
18
18
  return {
19
- result,
20
- data,
21
19
  cause: AsyncResult.cause(result),
20
+ data,
22
21
  pending: result.waiting,
23
22
  refreshing: result.waiting && Option.isSome(data),
23
+ result,
24
24
  };
25
25
  };
26
26
 
@@ -30,7 +30,9 @@ export const isUnauthorized = <E>(cause: Cause.Cause<E>): boolean =>
30
30
  const useRecheckOnUnauthorized = <A, E>(result: AsyncResult.AsyncResult<A, E>): void => {
31
31
  const recheck = useSessionRecheck();
32
32
  useEffect(() => {
33
- if (AsyncResult.isFailure(result) && isUnauthorized(result.cause)) recheck();
33
+ if (AsyncResult.isFailure(result) && isUnauthorized(result.cause)) {
34
+ recheck();
35
+ }
34
36
  }, [recheck, result]);
35
37
  };
36
38
 
@@ -48,7 +50,7 @@ export interface ActionState<Input, A, E> extends ResultState<A, E> {
48
50
  readonly dispatch: (input: Input) => void;
49
51
  }
50
52
 
51
- /** Dispatches an action and reads its shared native state without claiming a per-invocation completion result. */
53
+ // The atom's state is shared by every dispatch, so it never claims to be one invocation's completion result.
52
54
  export const useAction = <Input, A, E>(atom: Atom.AtomResultFn<Input, A, E>): ActionState<Input, A, E> => {
53
55
  const result = useAtomValue(atom);
54
56
  useRecheckOnUnauthorized(result);
@@ -6,20 +6,22 @@ type ResumeEvent = "online" | "visibilitychange";
6
6
 
7
7
  export interface ResumeWindow {
8
8
  readonly addEventListener: (type: ResumeEvent, listener: () => void) => void;
9
- readonly removeEventListener: (type: ResumeEvent, listener: () => void) => void;
10
9
  readonly document: { readonly visibilityState: string };
10
+ readonly removeEventListener: (type: ResumeEvent, listener: () => void) => void;
11
11
  }
12
12
 
13
13
  export interface ResumeOptions {
14
- readonly window?: ResumeWindow;
15
14
  readonly native?: ResumeSource;
15
+ readonly window?: ResumeWindow;
16
16
  }
17
17
 
18
18
  const whileVisible =
19
19
  (target: ResumeWindow, type: ResumeEvent): ResumeSource =>
20
20
  (resume) => {
21
21
  const visible = () => {
22
- if (target.document.visibilityState === "visible") resume();
22
+ if (target.document.visibilityState === "visible") {
23
+ resume();
24
+ }
23
25
  };
24
26
  target.addEventListener(type, visible);
25
27
  return () => target.removeEventListener(type, visible);
@@ -31,7 +33,9 @@ export const resumeSignal = ({ window, native }: ResumeOptions): Atom.Atom<numbe
31
33
  return Atom.readable((get) => {
32
34
  let count = 0;
33
35
  const resume = () => get.setSelf(++count);
34
- for (const source of sources) get.addFinalizer(source(resume));
36
+ for (const source of sources) {
37
+ get.addFinalizer(source(resume));
38
+ }
35
39
  return count;
36
40
  });
37
41
  };
package/src/save-state.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  import { RegistryContext, useAtomValue } from "@effect/atom-react";
2
- import { FieldFailure, type Fields, type Form, Invalid } from "@shivaedev/effect-form";
3
2
  import { Option } from "effect";
4
3
  import * as AsyncResult from "effect/unstable/reactivity/AsyncResult";
5
4
  import * as Atom from "effect/unstable/reactivity/Atom";
6
5
  import { useCallback, useContext, useEffect } from "react";
6
+ import { FieldFailure, type Fields, type Form, Invalid } from "@shivaedev/effect-form";
7
7
  import { isUnauthorized } from "./result-state.ts";
8
8
  import { useSessionRecheck } from "./session-boundary.ts";
9
9
 
@@ -13,9 +13,9 @@ const clean = Atom.make(false);
13
13
  export interface SaveState<E> {
14
14
  readonly dirty: boolean;
15
15
  readonly failure: Option.Option<E>;
16
- readonly saving: boolean;
17
- readonly save: () => void;
18
16
  readonly revert: () => void;
17
+ readonly save: () => void;
18
+ readonly saving: boolean;
19
19
  }
20
20
 
21
21
  export const useSaveState = <F extends Fields, A, E, ER>(
@@ -27,24 +27,27 @@ export const useSaveState = <F extends Fields, A, E, ER>(
27
27
  const result: AsyncResult.AsyncResult<A, E | ER | FieldFailure | Invalid> = useAtomValue(form?.submit ?? idle);
28
28
  const dirty = useAtomValue(form?.dirty ?? clean);
29
29
  useEffect(() => {
30
- if (AsyncResult.isFailure(result) && isUnauthorized(result.cause)) recheck();
30
+ if (AsyncResult.isFailure(result) && isUnauthorized(result.cause)) {
31
+ recheck();
32
+ }
31
33
  }, [recheck, result]);
32
34
  useEffect(
33
35
  () =>
34
- form &&
35
- registry.subscribe(form.submit, (next) => {
36
- if (AsyncResult.isSuccess(next) && !next.waiting) settled(next.value);
36
+ form
37
+ && registry.subscribe(form.submit, (next) => {
38
+ if (AsyncResult.isSuccess(next) && !next.waiting) {
39
+ settled(next.value);
40
+ }
37
41
  }),
38
42
  [form, registry, settled],
39
43
  );
40
44
  const save = useCallback(() => {
41
- if (form === undefined || registry.get(form.submit).waiting) return;
45
+ if (form === undefined || registry.get(form.submit).waiting) {
46
+ return;
47
+ }
42
48
  registry.set(form.submit, undefined);
43
49
  }, [form, registry]);
44
50
  const revert = useCallback(() => form?.revert(), [form]);
45
- const failure = Option.filter(
46
- AsyncResult.error(result),
47
- (error): error is E | ER => !(error instanceof FieldFailure) && !(error instanceof Invalid),
48
- );
49
- return { dirty, failure, saving: result.waiting, save, revert };
51
+ const failure = Option.filter(AsyncResult.error(result), (error): error is E | ER => !(error instanceof FieldFailure || error instanceof Invalid));
52
+ return { dirty, failure, revert, save, saving: result.waiting };
50
53
  };
@@ -3,12 +3,12 @@ import * as AtomRegistry from "effect/unstable/reactivity/AtomRegistry";
3
3
  import { createContext, createElement, Fragment, type ReactNode, useContext, useEffect, useState } from "react";
4
4
 
5
5
  export interface SessionBoundaryProps<S, Client> {
6
- readonly session: S | undefined;
7
- readonly identify: (session: S) => string;
6
+ readonly children: (client: Client) => ReactNode;
8
7
  readonly connect: (session: S) => Client;
8
+ readonly identify: (session: S) => string;
9
9
  readonly recheck: () => void;
10
+ readonly session: S | undefined;
10
11
  readonly signedOut?: ReactNode;
11
- readonly children: (client: Client) => ReactNode;
12
12
  }
13
13
 
14
14
  const Recheck = createContext<() => void>(() => {});
@@ -17,32 +17,36 @@ export const useSessionRecheck = (): (() => void) => useContext(Recheck);
17
17
 
18
18
  interface Owned<Client> {
19
19
  readonly client: Client;
20
- readonly registry: AtomRegistry.AtomRegistry;
21
20
  mounted: number;
21
+ readonly registry: AtomRegistry.AtomRegistry;
22
22
  }
23
23
 
24
- const owning = <Client>(client: Client): Owned<Client> => ({ client, registry: AtomRegistry.make(), mounted: 0 });
24
+ const owning = <Client>(client: Client): Owned<Client> => ({ client, mounted: 0, registry: AtomRegistry.make() });
25
25
 
26
26
  // No cleanup runs when a hidden <Activity> subtree is unmounted, so nodes a hidden render creates must not outlive it.
27
27
  const hidden = <Client>(client: Client): Owned<Client> => {
28
28
  const owned = owning(client);
29
29
  let reaping = false;
30
30
  owned.registry.onNodeAdded = () => {
31
- if (reaping || owned.mounted > 0) return;
31
+ if (reaping || owned.mounted > 0) {
32
+ return;
33
+ }
32
34
  reaping = true;
33
35
  setTimeout(() => {
34
36
  reaping = false;
35
- if (owned.mounted === 0) owned.registry.reset();
37
+ if (owned.mounted === 0) {
38
+ owned.registry.reset();
39
+ }
36
40
  }, 0);
37
41
  };
38
42
  return owned;
39
43
  };
40
44
 
41
45
  interface GenerationProps<S, Client> {
42
- readonly session: S;
46
+ readonly children: (client: Client) => ReactNode;
43
47
  readonly connect: (session: S) => Client;
44
48
  readonly recheck: () => void;
45
- readonly children: (client: Client) => ReactNode;
49
+ readonly session: S;
46
50
  }
47
51
 
48
52
  const Generation = <S, Client>({ session, connect, recheck, children }: GenerationProps<S, Client>): ReactNode => {
@@ -52,7 +56,9 @@ const Generation = <S, Client>({ session, connect, recheck, children }: Generati
52
56
  return () => {
53
57
  owned.mounted -= 1;
54
58
  queueMicrotask(() => {
55
- if (owned.mounted > 0) return;
59
+ if (owned.mounted > 0) {
60
+ return;
61
+ }
56
62
  owned.registry.dispose();
57
63
  own((current) => (current === owned ? hidden(owned.client) : current));
58
64
  });
@@ -75,4 +81,4 @@ export const SessionBoundary = <S, Client>({
75
81
  }: SessionBoundaryProps<S, Client>): ReactNode =>
76
82
  session === undefined
77
83
  ? createElement(Fragment, null, signedOut)
78
- : createElement(Generation<S, Client>, { key: identify(session), session, connect, recheck, children });
84
+ : createElement(Generation<S, Client>, { children, connect, key: identify(session), recheck, session });
package/src/submission.ts CHANGED
@@ -1,14 +1,14 @@
1
- import { type Decoded, type Encoded, type FieldFailure, type Fields, type Form, make, type Services } from "@shivaedev/effect-form";
2
1
  import type { Effect, Schema } from "effect";
3
2
  import type * as Atom from "effect/unstable/reactivity/Atom";
3
+ import { type Decoded, type Encoded, type FieldFailure, type Fields, type Form, make, type Services } from "@shivaedev/effect-form";
4
4
  import { type AtomServices, type RejectField, rejecting } from "./field-rejection.ts";
5
5
 
6
6
  export interface SubmissionConfig<F extends Fields, A, E, R, ER> {
7
7
  readonly fields: Schema.Struct<F>;
8
8
  readonly initialValues: Encoded<F>;
9
- readonly save: (values: Decoded<F>) => Effect.Effect<A, E, AtomServices<R>>;
10
- readonly runtime: Atom.AtomRuntime<Services<F, R>, ER>;
11
9
  readonly rejectField: RejectField<F, E> | undefined;
10
+ readonly runtime: Atom.AtomRuntime<Services<F, R>, ER>;
11
+ readonly save: (values: Decoded<F>) => Effect.Effect<A, E, AtomServices<R>>;
12
12
  }
13
13
 
14
14
  export interface Submission<F extends Fields, A, E, ER> {
@@ -22,11 +22,11 @@ export const submission = <F extends Fields, A, E, R, ER>(config: SubmissionConf
22
22
  let submitted: Encoded<F> | undefined;
23
23
  const form: Form<F, A, E | FieldFailure, ER> = make(fields, {
24
24
  initialValues,
25
- runtime,
26
25
  onSubmit: (values, submitter, snapshot) => {
27
26
  submitted = snapshot;
28
27
  return save(values, submitter);
29
28
  },
29
+ runtime,
30
30
  });
31
31
  return { form, submitted: () => submitted };
32
32
  };