@shivaedev/effect-react 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +30 -0
- package/README.md +2 -2
- package/dist/create.d.ts +2 -2
- package/dist/create.d.ts.map +1 -1
- package/dist/create.js +2 -2
- package/dist/create.js.map +1 -1
- package/dist/editor.d.ts +2 -2
- package/dist/editor.d.ts.map +1 -1
- package/dist/editor.js +6 -5
- package/dist/editor.js.map +1 -1
- package/dist/field-rejection.d.ts +1 -1
- package/dist/field-rejection.d.ts.map +1 -1
- package/dist/field-rejection.js +2 -1
- package/dist/field-rejection.js.map +1 -1
- package/dist/result-state.d.ts +2 -3
- package/dist/result-state.d.ts.map +1 -1
- package/dist/result-state.js +5 -4
- package/dist/result-state.js.map +1 -1
- package/dist/resume-signal.d.ts +2 -2
- package/dist/resume-signal.d.ts.map +1 -1
- package/dist/resume-signal.js +4 -2
- package/dist/resume-signal.js.map +1 -1
- package/dist/save-state.d.ts +3 -3
- package/dist/save-state.d.ts.map +1 -1
- package/dist/save-state.js +11 -8
- package/dist/save-state.js.map +1 -1
- package/dist/session-boundary.d.ts +3 -3
- package/dist/session-boundary.d.ts.map +1 -1
- package/dist/session-boundary.js +8 -5
- package/dist/session-boundary.js.map +1 -1
- package/dist/submission.d.ts +3 -3
- package/dist/submission.d.ts.map +1 -1
- package/dist/submission.js +2 -2
- package/dist/submission.js.map +1 -1
- package/package.json +50 -50
- package/src/create.ts +4 -4
- package/src/editor.ts +10 -8
- package/src/field-rejection.ts +4 -2
- package/src/result-state.ts +8 -6
- package/src/resume-signal.ts +8 -4
- package/src/save-state.ts +16 -13
- package/src/session-boundary.ts +17 -11
- package/src/submission.ts +5 -4
- package/dist/form.d.ts +0 -7
- package/dist/form.d.ts.map +0 -1
- package/dist/form.js +0 -3
- package/dist/form.js.map +0 -1
- package/dist/index.d.ts +0 -7
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -4
- package/dist/index.js.map +0 -1
- package/src/form.ts +0 -6
- package/src/index.ts +0 -6
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,35 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.2.0 - 2026-10-04
|
|
4
|
+
|
|
5
|
+
### Changed
|
|
6
|
+
|
|
7
|
+
- Breaking: no root entry and no module that re-exports another. `exports` maps one `"./*.ts"` pattern to every module (`src` under the `source` condition, `dist` otherwise), so you import the module that defines a name, and a bundler sees only the modules you use. Where each name now lives:
|
|
8
|
+
- `@shivaedev/effect-react`: `@shivaedev/effect-react/result-state.ts` (`ActionState`, `QueryState`, `ResultState`, `isUnauthorized`, `useAction`, `useQuery`), `@shivaedev/effect-react/resume-signal.ts` (`ResumeOptions`, `ResumeSource`, `ResumeWindow`, `resumeSignal`), `@shivaedev/effect-react/session-boundary.ts` (`SessionBoundaryProps`, `SessionBoundary`, `useSessionRecheck`)
|
|
9
|
+
- `@shivaedev/effect-react/form`: `@shivaedev/effect-react/create.ts` (`Create`, `CreateConfig`, `useCreate`), `@shivaedev/effect-react/editor.ts` (`Editor`, `EditorConfig`, `useEditor`), `@shivaedev/effect-react/field-rejection.ts` (`FieldRejection`, `FieldRejectionMapping`, `RejectField`), `@shivaedev/effect-react/save-state.ts` (`SaveState`)
|
|
10
|
+
|
|
11
|
+
## 0.1.2 - 2026-10-04
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
|
|
15
|
+
- 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.
|
|
16
|
+
|
|
17
|
+
- Consolidate duplicate test cases around observable package behavior.
|
|
18
|
+
|
|
19
|
+
- Validate packed consumers and executable bins through the shared workspace gate.
|
|
20
|
+
|
|
21
|
+
- Replace a JSDoc block with a short reason comment, so the package passes the comment rules of `@shivaedev/quality`.
|
|
22
|
+
|
|
23
|
+
- Build with the `@shivaedev/quality` tsconfig presets, which target ESNext and allow only erasable TypeScript syntax.
|
|
24
|
+
|
|
25
|
+
- Type-check with TypeScript 7 only. TypeScript 6 still builds the package.
|
|
26
|
+
|
|
27
|
+
- Lint and format with the `@shivaedev/quality` Biome preset through `quality lint` at the repository root, which replaces the package's `check` script.
|
|
28
|
+
|
|
29
|
+
- 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`.
|
|
30
|
+
|
|
31
|
+
- Keep `package.json` in sort-package-json key order, checked by `quality lint`.
|
|
32
|
+
|
|
3
33
|
## 0.1.1 - 2026-09-26
|
|
4
34
|
|
|
5
35
|
### Changed
|
package/README.md
CHANGED
|
@@ -10,7 +10,7 @@ Given an `Api` service constructed with native `AtomRpc.Service`, and RPCs `Orde
|
|
|
10
10
|
|
|
11
11
|
```tsx
|
|
12
12
|
import { RegistryProvider } from "@effect/atom-react"
|
|
13
|
-
import { useAction, useQuery } from "@shivaedev/effect-react"
|
|
13
|
+
import { useAction, useQuery } from "@shivaedev/effect-react/result-state.ts"
|
|
14
14
|
import { Option } from "effect"
|
|
15
15
|
|
|
16
16
|
function Orders() {
|
|
@@ -45,7 +45,7 @@ function App() {
|
|
|
45
45
|
|
|
46
46
|
## Editing
|
|
47
47
|
|
|
48
|
-
`useEditor` and `useCreate` from `@shivaedev/effect-react/
|
|
48
|
+
`useEditor` from `@shivaedev/effect-react/editor.ts` and `useCreate` from `@shivaedev/effect-react/create.ts` bind `@shivaedev/effect-form` to a query atom and a save Effect, for example from an `@shivaedev/effect-contract` binding `api`. `@shivaedev/effect-form` is an optional peer dependency: install it only when you import these modules; the other modules do not load it. See the [editing guide](../../docs/framework/editing.md).
|
|
49
49
|
|
|
50
50
|
```ts
|
|
51
51
|
const editor = useEditor({
|
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/shape.ts";
|
|
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
|
package/dist/create.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
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,iCAAiC,CAAC;AAC9G,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 {
|
|
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
|
|
22
|
+
return { ...useSaveState(current.form, settled), created, form: current.form };
|
|
23
23
|
};
|
|
24
24
|
//# sourceMappingURL=create.js.map
|
package/dist/create.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"","sources":["../src/create.ts"],"names":[],"mappings":"
|
|
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/shape.ts";
|
|
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
|
package/dist/editor.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../src/editor.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
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,iCAAiC,CAAC;AAC9G,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),
|
|
33
|
+
return { ...useSaveState(form, settled), form, query };
|
|
33
34
|
};
|
|
34
35
|
//# sourceMappingURL=editor.js.map
|
package/dist/editor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editor.js","sourceRoot":"","sources":["../src/editor.ts"],"names":[],"mappings":"
|
|
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/shape.ts";
|
|
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,
|
|
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,iCAAiC,CAAC;AAE7F,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"}
|
package/dist/field-rejection.js
CHANGED
|
@@ -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")
|
|
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":"
|
|
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"}
|
package/dist/result-state.d.ts
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/result-state.js
CHANGED
|
@@ -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
|
-
|
|
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);
|
package/dist/result-state.js.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/resume-signal.d.ts
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/resume-signal.js
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/save-state.d.ts
CHANGED
|
@@ -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/shape.ts";
|
|
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
|
package/dist/save-state.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"save-state.d.ts","sourceRoot":"","sources":["../src/save-state.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
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,iCAAiC,CAAC;AAOhG,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"}
|
package/dist/save-state.js
CHANGED
|
@@ -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/shape.ts";
|
|
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
|
|
32
|
-
return { dirty, failure, saving: result.waiting
|
|
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
|
package/dist/save-state.js.map
CHANGED
|
@@ -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,
|
|
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,iCAAiC,CAAC;AAChG,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
|
|
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,
|
|
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"}
|
package/dist/session-boundary.js
CHANGED
|
@@ -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()
|
|
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),
|
|
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,
|
|
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,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,YAAY,CAAC,IAAI,EAAE,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,EAAE,CAAC;YAClC,OAAO;QACR,CAAC;QACD,OAAO,GAAG,IAAI,CAAC;QACf,UAAU,CAAC,GAAG,EAAE;YACf,OAAO,GAAG,KAAK,CAAC;YAChB,IAAI,KAAK,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;gBACzB,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YACxB,CAAC;QACF,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,EAAE,CAAC;oBACvB,OAAO;gBACR,CAAC;gBACD,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,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC"}
|
package/dist/submission.d.ts
CHANGED
|
@@ -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, Encoded, FieldFailure, Fields, Form, Services } from "@shivaedev/effect-form/shape.ts";
|
|
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>;
|
package/dist/submission.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"submission.d.ts","sourceRoot":"","sources":["../src/submission.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
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;AAE7D,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAC9G,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"}
|
package/dist/submission.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { make } from "@shivaedev/effect-form";
|
|
1
|
+
import { make } from "@shivaedev/effect-form/form.ts";
|
|
2
2
|
import { rejecting } from "./field-rejection.js";
|
|
3
3
|
export const submission = (config) => {
|
|
4
4
|
const { fields, initialValues, runtime } = config;
|
|
@@ -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
|
};
|
package/dist/submission.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"submission.js","sourceRoot":"","sources":["../src/submission.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"submission.js","sourceRoot":"","sources":["../src/submission.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,gCAAgC,CAAC;AAEtD,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,60 +1,50 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shivaedev/effect-react",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "React query, action, editor and session hooks for native Effect atoms",
|
|
5
|
-
"
|
|
6
|
-
"
|
|
5
|
+
"homepage": "https://github.com/ShivaeDev/platform/tree/main/packages/effect-react#readme",
|
|
6
|
+
"bugs": {
|
|
7
|
+
"url": "https://github.com/ShivaeDev/platform/issues"
|
|
8
|
+
},
|
|
7
9
|
"repository": {
|
|
8
10
|
"type": "git",
|
|
9
11
|
"url": "git+https://github.com/ShivaeDev/platform.git",
|
|
10
12
|
"directory": "packages/effect-react"
|
|
11
13
|
},
|
|
12
|
-
"
|
|
13
|
-
"
|
|
14
|
-
|
|
14
|
+
"license": "MIT",
|
|
15
|
+
"sideEffects": false,
|
|
16
|
+
"type": "module",
|
|
17
|
+
"imports": {
|
|
18
|
+
"#test/*": "./test/*",
|
|
19
|
+
"#*.ts": {
|
|
20
|
+
"source": "./src/*.ts",
|
|
21
|
+
"types": "./dist/*.d.ts",
|
|
22
|
+
"default": "./dist/*.js"
|
|
23
|
+
}
|
|
15
24
|
},
|
|
16
|
-
"
|
|
17
|
-
"
|
|
25
|
+
"exports": {
|
|
26
|
+
"./*.ts": {
|
|
27
|
+
"types": "./dist/*.d.ts",
|
|
28
|
+
"source": "./src/*.ts",
|
|
29
|
+
"import": "./dist/*.js",
|
|
30
|
+
"default": "./dist/*.js"
|
|
31
|
+
},
|
|
32
|
+
"./package.json": "./package.json"
|
|
18
33
|
},
|
|
19
|
-
"sideEffects": false,
|
|
20
34
|
"files": [
|
|
21
35
|
"dist",
|
|
22
36
|
"src",
|
|
23
37
|
"CHANGELOG.md",
|
|
24
38
|
"README.md"
|
|
25
39
|
],
|
|
26
|
-
"exports": {
|
|
27
|
-
".": {
|
|
28
|
-
"types": "./dist/index.d.ts",
|
|
29
|
-
"source": "./src/index.ts",
|
|
30
|
-
"import": "./dist/index.js",
|
|
31
|
-
"default": "./dist/index.js"
|
|
32
|
-
},
|
|
33
|
-
"./form": {
|
|
34
|
-
"types": "./dist/form.d.ts",
|
|
35
|
-
"source": "./src/form.ts",
|
|
36
|
-
"import": "./dist/form.js",
|
|
37
|
-
"default": "./dist/form.js"
|
|
38
|
-
},
|
|
39
|
-
"./package.json": "./package.json"
|
|
40
|
-
},
|
|
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
|
-
},
|
|
56
40
|
"devDependencies": {
|
|
57
41
|
"@effect/atom-react": "4.0.0-rc.112",
|
|
42
|
+
"@effect/sql-sqlite-node": "4.0.0-rc.112",
|
|
43
|
+
"@shivaedev/effect-contract": "0.3.0",
|
|
44
|
+
"@shivaedev/effect-form": "0.2.0",
|
|
45
|
+
"@shivaedev/effect-service": "0.2.0",
|
|
46
|
+
"@shivaedev/effect-sql": "0.2.0",
|
|
47
|
+
"@shivaedev/quality": "0.9.0",
|
|
58
48
|
"@types/node": "24.10.1",
|
|
59
49
|
"@types/react": "19.2.18",
|
|
60
50
|
"@types/react-dom": "19.2.4",
|
|
@@ -64,20 +54,30 @@
|
|
|
64
54
|
"react": "19.2.8",
|
|
65
55
|
"react-dom": "19.2.8",
|
|
66
56
|
"typescript": "npm:@typescript/typescript6@6.0.2",
|
|
67
|
-
"vitest": "4.1.9"
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
"@
|
|
71
|
-
"@shivaedev/effect-
|
|
72
|
-
"
|
|
57
|
+
"vitest": "4.1.9"
|
|
58
|
+
},
|
|
59
|
+
"peerDependencies": {
|
|
60
|
+
"@effect/atom-react": "4.0.0-rc.112",
|
|
61
|
+
"@shivaedev/effect-form": "0.2.0",
|
|
62
|
+
"effect": "4.0.0-rc.112",
|
|
63
|
+
"react": "19.2.8"
|
|
64
|
+
},
|
|
65
|
+
"peerDependenciesMeta": {
|
|
66
|
+
"@shivaedev/effect-form": {
|
|
67
|
+
"optional": true
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
"engines": {
|
|
71
|
+
"node": ">=24"
|
|
72
|
+
},
|
|
73
|
+
"publishConfig": {
|
|
74
|
+
"access": "public",
|
|
75
|
+
"provenance": true
|
|
73
76
|
},
|
|
74
77
|
"scripts": {
|
|
75
78
|
"build": "node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { force: true, recursive: true }))\" && tsc6 --project tsconfig.build.json",
|
|
76
|
-
"
|
|
79
|
+
"ready": "pnpm typecheck && pnpm test && pnpm build",
|
|
77
80
|
"test": "vitest run",
|
|
78
|
-
"
|
|
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"
|
|
81
|
+
"typecheck": "tsc --noEmit"
|
|
82
82
|
}
|
|
83
83
|
}
|
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/shape.ts";
|
|
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 {
|
|
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
|
|
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/shape.ts";
|
|
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)
|
|
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),
|
|
57
|
+
return { ...useSaveState(form, settled), form, query };
|
|
56
58
|
};
|
package/src/field-rejection.ts
CHANGED
|
@@ -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/shape.ts";
|
|
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")
|
|
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
|
};
|
package/src/result-state.ts
CHANGED
|
@@ -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))
|
|
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
|
-
|
|
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);
|
package/src/resume-signal.ts
CHANGED
|
@@ -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")
|
|
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)
|
|
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/shape.ts";
|
|
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))
|
|
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)
|
|
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)
|
|
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
|
-
|
|
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
|
};
|
package/src/session-boundary.ts
CHANGED
|
@@ -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
|
|
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()
|
|
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)
|
|
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)
|
|
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
|
|
46
|
+
readonly children: (client: Client) => ReactNode;
|
|
43
47
|
readonly connect: (session: S) => Client;
|
|
44
48
|
readonly recheck: () => void;
|
|
45
|
-
readonly
|
|
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)
|
|
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),
|
|
84
|
+
: createElement(Generation<S, Client>, { children, connect, key: identify(session), recheck, session });
|
package/src/submission.ts
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
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 { make } from "@shivaedev/effect-form/form.ts";
|
|
4
|
+
import type { Decoded, Encoded, FieldFailure, Fields, Form, Services } from "@shivaedev/effect-form/shape.ts";
|
|
4
5
|
import { type AtomServices, type RejectField, rejecting } from "./field-rejection.ts";
|
|
5
6
|
|
|
6
7
|
export interface SubmissionConfig<F extends Fields, A, E, R, ER> {
|
|
7
8
|
readonly fields: Schema.Struct<F>;
|
|
8
9
|
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
10
|
readonly rejectField: RejectField<F, E> | undefined;
|
|
11
|
+
readonly runtime: Atom.AtomRuntime<Services<F, R>, ER>;
|
|
12
|
+
readonly save: (values: Decoded<F>) => Effect.Effect<A, E, AtomServices<R>>;
|
|
12
13
|
}
|
|
13
14
|
|
|
14
15
|
export interface Submission<F extends Fields, A, E, ER> {
|
|
@@ -22,11 +23,11 @@ export const submission = <F extends Fields, A, E, R, ER>(config: SubmissionConf
|
|
|
22
23
|
let submitted: Encoded<F> | undefined;
|
|
23
24
|
const form: Form<F, A, E | FieldFailure, ER> = make(fields, {
|
|
24
25
|
initialValues,
|
|
25
|
-
runtime,
|
|
26
26
|
onSubmit: (values, submitter, snapshot) => {
|
|
27
27
|
submitted = snapshot;
|
|
28
28
|
return save(values, submitter);
|
|
29
29
|
},
|
|
30
|
+
runtime,
|
|
30
31
|
});
|
|
31
32
|
return { form, submitted: () => submitted };
|
|
32
33
|
};
|
package/dist/form.d.ts
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
export type { Create, CreateConfig } from "./create.ts";
|
|
2
|
-
export { useCreate } from "./create.ts";
|
|
3
|
-
export type { Editor, EditorConfig } from "./editor.ts";
|
|
4
|
-
export { useEditor } from "./editor.ts";
|
|
5
|
-
export type { FieldRejection, FieldRejectionMapping, RejectField } from "./field-rejection.ts";
|
|
6
|
-
export type { SaveState } from "./save-state.ts";
|
|
7
|
-
//# sourceMappingURL=form.d.ts.map
|
package/dist/form.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"form.d.ts","sourceRoot":"","sources":["../src/form.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,cAAc,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC/F,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/form.js
DELETED
package/dist/form.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"form.js","sourceRoot":"","sources":["../src/form.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.d.ts
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
export type { ActionState, QueryState, ResultState } from "./result-state.ts";
|
|
2
|
-
export { isUnauthorized, useAction, useQuery } from "./result-state.ts";
|
|
3
|
-
export type { ResumeOptions, ResumeSource, ResumeWindow } from "./resume-signal.ts";
|
|
4
|
-
export { resumeSignal } from "./resume-signal.ts";
|
|
5
|
-
export type { SessionBoundaryProps } from "./session-boundary.ts";
|
|
6
|
-
export { SessionBoundary, useSessionRecheck } from "./session-boundary.ts";
|
|
7
|
-
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACxE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACpF,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC"}
|
package/dist/index.js
DELETED
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAExE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC"}
|
package/src/form.ts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
export type { Create, CreateConfig } from "./create.ts";
|
|
2
|
-
export { useCreate } from "./create.ts";
|
|
3
|
-
export type { Editor, EditorConfig } from "./editor.ts";
|
|
4
|
-
export { useEditor } from "./editor.ts";
|
|
5
|
-
export type { FieldRejection, FieldRejectionMapping, RejectField } from "./field-rejection.ts";
|
|
6
|
-
export type { SaveState } from "./save-state.ts";
|
package/src/index.ts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
export type { ActionState, QueryState, ResultState } from "./result-state.ts";
|
|
2
|
-
export { isUnauthorized, useAction, useQuery } from "./result-state.ts";
|
|
3
|
-
export type { ResumeOptions, ResumeSource, ResumeWindow } from "./resume-signal.ts";
|
|
4
|
-
export { resumeSignal } from "./resume-signal.ts";
|
|
5
|
-
export type { SessionBoundaryProps } from "./session-boundary.ts";
|
|
6
|
-
export { SessionBoundary, useSessionRecheck } from "./session-boundary.ts";
|