@shivaedev/react 0.0.0 → 0.19.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 +300 -0
- package/LICENSE +21 -0
- package/README.md +844 -1
- package/dist/actionTrace.d.ts +3 -0
- package/dist/actionTrace.d.ts.map +1 -0
- package/dist/actionTrace.js +5 -0
- package/dist/actionTrace.js.map +1 -0
- package/dist/client/QueryView.d.ts +10 -0
- package/dist/client/QueryView.d.ts.map +1 -0
- package/dist/client/QueryView.js +13 -0
- package/dist/client/QueryView.js.map +1 -0
- package/dist/client/actionCompletion.d.ts +12 -0
- package/dist/client/actionCompletion.d.ts.map +1 -0
- package/dist/client/actionCompletion.js +68 -0
- package/dist/client/actionCompletion.js.map +1 -0
- package/dist/client/authAction.d.ts +15 -0
- package/dist/client/authAction.d.ts.map +1 -0
- package/dist/client/authAction.js +11 -0
- package/dist/client/authAction.js.map +1 -0
- package/dist/client/create.d.ts +21 -0
- package/dist/client/create.d.ts.map +1 -0
- package/dist/client/create.js +35 -0
- package/dist/client/create.js.map +1 -0
- package/dist/client/editor.d.ts +33 -0
- package/dist/client/editor.d.ts.map +1 -0
- package/dist/client/editor.js +50 -0
- package/dist/client/editor.js.map +1 -0
- package/dist/client/mountLive.d.ts +4 -0
- package/dist/client/mountLive.d.ts.map +1 -0
- package/dist/client/mountLive.js +46 -0
- package/dist/client/mountLive.js.map +1 -0
- package/dist/client/pendingCommand.d.ts +13 -0
- package/dist/client/pendingCommand.d.ts.map +1 -0
- package/dist/client/pendingCommand.js +30 -0
- package/dist/client/pendingCommand.js.map +1 -0
- package/dist/client/resultState.d.ts +32 -0
- package/dist/client/resultState.d.ts.map +1 -0
- package/dist/client/resultState.js +62 -0
- package/dist/client/resultState.js.map +1 -0
- package/dist/client/saveState.d.ts +11 -0
- package/dist/client/saveState.d.ts.map +1 -0
- package/dist/client/saveState.js +37 -0
- package/dist/client/saveState.js.map +1 -0
- package/dist/client/sessionBoundary.d.ts +15 -0
- package/dist/client/sessionBoundary.d.ts.map +1 -0
- package/dist/client/sessionBoundary.js +70 -0
- package/dist/client/sessionBoundary.js.map +1 -0
- package/dist/client/testing.d.ts +28 -0
- package/dist/client/testing.d.ts.map +1 -0
- package/dist/client/testing.js +108 -0
- package/dist/client/testing.js.map +1 -0
- package/dist/client/useDraftOwner.d.ts +3 -0
- package/dist/client/useDraftOwner.d.ts.map +1 -0
- package/dist/client/useDraftOwner.js +36 -0
- package/dist/client/useDraftOwner.js.map +1 -0
- package/dist/client/useLoaderQuery.d.ts +8 -0
- package/dist/client/useLoaderQuery.d.ts.map +1 -0
- package/dist/client/useLoaderQuery.js +10 -0
- package/dist/client/useLoaderQuery.js.map +1 -0
- package/dist/fieldRejection.d.ts +25 -0
- package/dist/fieldRejection.d.ts.map +1 -0
- package/dist/fieldRejection.js +21 -0
- package/dist/fieldRejection.js.map +1 -0
- package/dist/internal/NoticeContext.d.ts +7 -0
- package/dist/internal/NoticeContext.d.ts.map +1 -0
- package/dist/internal/NoticeContext.js +3 -0
- package/dist/internal/NoticeContext.js.map +1 -0
- package/dist/internal/loadedQuery.d.ts +16 -0
- package/dist/internal/loadedQuery.d.ts.map +1 -0
- package/dist/internal/loadedQuery.js +11 -0
- package/dist/internal/loadedQuery.js.map +1 -0
- package/dist/internal/noticeEntry.d.ts +21 -0
- package/dist/internal/noticeEntry.d.ts.map +1 -0
- package/dist/internal/noticeEntry.js +45 -0
- package/dist/internal/noticeEntry.js.map +1 -0
- package/dist/internal/noticeStore.d.ts +12 -0
- package/dist/internal/noticeStore.d.ts.map +1 -0
- package/dist/internal/noticeStore.js +37 -0
- package/dist/internal/noticeStore.js.map +1 -0
- package/dist/internal/queryHandoff.d.ts +9 -0
- package/dist/internal/queryHandoff.d.ts.map +1 -0
- package/dist/internal/queryHandoff.js +50 -0
- package/dist/internal/queryHandoff.js.map +1 -0
- package/dist/internal/sessionRecheck.d.ts +4 -0
- package/dist/internal/sessionRecheck.d.ts.map +1 -0
- package/dist/internal/sessionRecheck.js +14 -0
- package/dist/internal/sessionRecheck.js.map +1 -0
- package/dist/internal/useLoaderHandoff.d.ts +4 -0
- package/dist/internal/useLoaderHandoff.d.ts.map +1 -0
- package/dist/internal/useLoaderHandoff.js +18 -0
- package/dist/internal/useLoaderHandoff.js.map +1 -0
- package/dist/internal/useNoticePublisher.d.ts +4 -0
- package/dist/internal/useNoticePublisher.d.ts.map +1 -0
- package/dist/internal/useNoticePublisher.js +8 -0
- package/dist/internal/useNoticePublisher.js.map +1 -0
- package/dist/internal/useQueryNotice.d.ts +8 -0
- package/dist/internal/useQueryNotice.d.ts.map +1 -0
- package/dist/internal/useQueryNotice.js +26 -0
- package/dist/internal/useQueryNotice.js.map +1 -0
- package/dist/internal/useSubmissionCallbacks.d.ts +11 -0
- package/dist/internal/useSubmissionCallbacks.d.ts.map +1 -0
- package/dist/internal/useSubmissionCallbacks.js +45 -0
- package/dist/internal/useSubmissionCallbacks.js.map +1 -0
- package/dist/loadQuery.d.ts +6 -0
- package/dist/loadQuery.d.ts.map +1 -0
- package/dist/loadQuery.js +29 -0
- package/dist/loadQuery.js.map +1 -0
- package/dist/notices.d.ts +32 -0
- package/dist/notices.d.ts.map +1 -0
- package/dist/notices.js +34 -0
- package/dist/notices.js.map +1 -0
- package/dist/queryRoute.d.ts +20 -0
- package/dist/queryRoute.d.ts.map +1 -0
- package/dist/queryRoute.js +20 -0
- package/dist/queryRoute.js.map +1 -0
- package/dist/resumeSignal.d.ts +6 -0
- package/dist/resumeSignal.d.ts.map +1 -0
- package/dist/resumeSignal.js +5 -0
- package/dist/resumeSignal.js.map +1 -0
- package/dist/submission.d.ts +19 -0
- package/dist/submission.d.ts.map +1 -0
- package/dist/submission.js +19 -0
- package/dist/submission.js.map +1 -0
- package/package.json +104 -4
- package/src/actionTrace.ts +5 -0
- package/src/client/QueryView.ts +27 -0
- package/src/client/actionCompletion.ts +82 -0
- package/src/client/authAction.ts +22 -0
- package/src/client/create.ts +55 -0
- package/src/client/editor.ts +89 -0
- package/src/client/mountLive.ts +57 -0
- package/src/client/pendingCommand.ts +42 -0
- package/src/client/resultState.ts +102 -0
- package/src/client/saveState.ts +54 -0
- package/src/client/sessionBoundary.ts +107 -0
- package/src/client/testing.ts +142 -0
- package/src/client/useDraftOwner.ts +42 -0
- package/src/client/useLoaderQuery.ts +16 -0
- package/src/fieldRejection.ts +51 -0
- package/src/internal/NoticeContext.ts +4 -0
- package/src/internal/loadedQuery.ts +18 -0
- package/src/internal/noticeEntry.ts +65 -0
- package/src/internal/noticeStore.ts +46 -0
- package/src/internal/queryHandoff.ts +60 -0
- package/src/internal/sessionRecheck.ts +17 -0
- package/src/internal/useLoaderHandoff.ts +20 -0
- package/src/internal/useNoticePublisher.ts +10 -0
- package/src/internal/useQueryNotice.ts +32 -0
- package/src/internal/useSubmissionCallbacks.ts +57 -0
- package/src/loadQuery.ts +34 -0
- package/src/notices.ts +65 -0
- package/src/queryRoute.ts +30 -0
- package/src/resumeSignal.ts +13 -0
- package/src/submission.ts +39 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actionTrace.d.ts","sourceRoot":"","sources":["../src/actionTrace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,wBAAgB,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,SAAc,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAE/G"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actionTrace.js","sourceRoot":"","sources":["../src/actionTrace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,MAAM,UAAU,WAAW,CAAU,MAA8B,EAAE,IAAI,GAAG,WAAW;IACtF,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
import type { QueryState } from "./resultState.ts";
|
|
3
|
+
export interface QueryViewProps<A, E> {
|
|
4
|
+
readonly content: (data: A, query: QueryState<A, E>) => ReactNode;
|
|
5
|
+
readonly failure: (error: E, query: QueryState<A, E>) => ReactNode;
|
|
6
|
+
readonly loading: (query: QueryState<A, E>) => ReactNode;
|
|
7
|
+
readonly query: QueryState<A, E>;
|
|
8
|
+
}
|
|
9
|
+
export declare function QueryView<A, E>({ query, loading, content, failure }: QueryViewProps<A, E>): ReactNode;
|
|
10
|
+
//# sourceMappingURL=QueryView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueryView.d.ts","sourceRoot":"","sources":["../../src/client/QueryView.ts"],"names":[],"mappings":"AACA,OAAO,EAA2B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,WAAW,cAAc,CAAC,CAAC,EAAE,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC;IAClE,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC;IACnE,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC;IACzD,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CACjC;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS,CAerG"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Cause, Option, Result } from "effect";
|
|
2
|
+
import { createElement, Fragment } from "react";
|
|
3
|
+
export function QueryView({ query, loading, content, failure }) {
|
|
4
|
+
const error = Option.flatMap(query.cause, (cause) => {
|
|
5
|
+
const defect = Cause.findDefect(cause);
|
|
6
|
+
if (Result.isSuccess(defect)) {
|
|
7
|
+
throw defect.success;
|
|
8
|
+
}
|
|
9
|
+
return Cause.findErrorOption(cause);
|
|
10
|
+
});
|
|
11
|
+
return createElement(Fragment, null, Option.isSome(query.data) ? content(query.data.value, query) : null, query.pending || (Option.isNone(query.data) && Option.isNone(error)) ? loading(query) : null, Option.isSome(error) ? failure(error.value, query) : null);
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=QueryView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueryView.js","sourceRoot":"","sources":["../../src/client/QueryView.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AAUhE,MAAM,UAAU,SAAS,CAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAwB;IACzF,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;QACnD,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9B,MAAM,MAAM,CAAC,OAAO,CAAC;QACtB,CAAC;QACD,OAAO,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IACH,OAAO,aAAa,CACnB,QAAQ,EACR,IAAI,EACJ,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EACnE,KAAK,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAC5F,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CACzD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import type * as Atom from "effect/reactivity/Atom";
|
|
3
|
+
import type { AtomServices } from "#fieldRejection.ts";
|
|
4
|
+
import type { NoticeFeedback } from "#notices.ts";
|
|
5
|
+
export interface ActionOptions<TInput, A, E, R = never> {
|
|
6
|
+
readonly concurrent?: boolean;
|
|
7
|
+
readonly notices?: NoticeFeedback<TInput, A, E, R>;
|
|
8
|
+
readonly onFailure?: (error: E, input: TInput) => void;
|
|
9
|
+
readonly onSuccess?: (value: A, input: TInput) => void;
|
|
10
|
+
}
|
|
11
|
+
export declare function useActionSource<TInput, A, E, R, TRuntimeError>(source: Atom.AtomResultFn<TInput, A, E> | Atom.AtomRuntime<R, TRuntimeError>, run: ((input: TInput) => Effect.Effect<A, E, AtomServices<R>>) | undefined, options: ActionOptions<TInput, A, E, R>): Atom.AtomResultFn<TInput, A, E | TRuntimeError>;
|
|
12
|
+
//# sourceMappingURL=actionCompletion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actionCompletion.d.ts","sourceRoot":"","sources":["../../src/client/actionCompletion.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAa,MAAM,QAAQ,CAAC;AAC3C,OAAO,KAAK,KAAK,IAAI,MAAM,wBAAwB,CAAC;AAEpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,MAAM,WAAW,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,KAAK;IACrD,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACnD,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvD,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACvD;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,aAAa,EAC7D,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,aAAa,CAAC,EAC5E,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,EAC1E,OAAO,EAAE,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GACrC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,CA4DjD"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { RegistryContext } from "@effect/atom-react";
|
|
2
|
+
import { Effect, Predicate } from "effect";
|
|
3
|
+
import { useContext, useInsertionEffect, useMemo, useRef } from "react";
|
|
4
|
+
import { NoticeContext } from "#internal/NoticeContext.ts";
|
|
5
|
+
import { publishNotice } from "#internal/noticeStore.ts";
|
|
6
|
+
import { useSessionRecheck } from "./sessionBoundary.js";
|
|
7
|
+
export function useActionSource(source, run, options) {
|
|
8
|
+
const registry = useContext(RegistryContext);
|
|
9
|
+
const recheck = useSessionRecheck();
|
|
10
|
+
const notices = useContext(NoticeContext);
|
|
11
|
+
const latestRef = useRef({ options, recheck, run });
|
|
12
|
+
useInsertionEffect(() => {
|
|
13
|
+
latestRef.current = { options, recheck, run };
|
|
14
|
+
}, [options, recheck, run]);
|
|
15
|
+
const concurrent = options.concurrent;
|
|
16
|
+
const owner = useMemo(() => {
|
|
17
|
+
const lifetime = { active: false, registry };
|
|
18
|
+
function rejected(error, input) {
|
|
19
|
+
return Effect.gen(function* () {
|
|
20
|
+
if (lifetime.active && Predicate.isTagged(error, "Unauthorized")) {
|
|
21
|
+
yield* Effect.sync(() => latestRef.current.recheck());
|
|
22
|
+
}
|
|
23
|
+
yield* Effect.sync(() => {
|
|
24
|
+
if (lifetime.active) {
|
|
25
|
+
latestRef.current.options.onFailure?.(error, input);
|
|
26
|
+
if ("fn" in source) {
|
|
27
|
+
publishNotice(notices, source, latestRef.current.options.notices?.onFailure?.(error, input));
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
return yield* Effect.fail(error);
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
function completed(value, input) {
|
|
35
|
+
return Effect.sync(() => {
|
|
36
|
+
if (lifetime.active) {
|
|
37
|
+
latestRef.current.options.onSuccess?.(value, input);
|
|
38
|
+
if ("fn" in source) {
|
|
39
|
+
publishNotice(notices, source, latestRef.current.options.notices?.onSuccess?.(value, input));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return value;
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
function execute(input) {
|
|
46
|
+
return Effect.suspend(() => {
|
|
47
|
+
const command = latestRef.current.run;
|
|
48
|
+
if (!command) {
|
|
49
|
+
return Effect.die(new Error("Missing command Effect"));
|
|
50
|
+
}
|
|
51
|
+
return Effect.matchEffect(command(input), {
|
|
52
|
+
onFailure: (error) => rejected(error, input),
|
|
53
|
+
onSuccess: (value) => completed(value, input),
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
const atom = "fn" in source ? source.fn(execute, { concurrent }) : source;
|
|
58
|
+
return { atom, lifetime };
|
|
59
|
+
}, [source, registry, concurrent, notices]);
|
|
60
|
+
useInsertionEffect(() => {
|
|
61
|
+
owner.lifetime.active = true;
|
|
62
|
+
return () => {
|
|
63
|
+
owner.lifetime.active = false;
|
|
64
|
+
};
|
|
65
|
+
}, [owner]);
|
|
66
|
+
return owner.atom;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=actionCompletion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actionCompletion.js","sourceRoot":"","sources":["../../src/client/actionCompletion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import * as Atom from "effect/reactivity/Atom";
|
|
2
|
+
declare const AuthActionUnavailable_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
3
|
+
readonly _tag: "AuthActionUnavailable";
|
|
4
|
+
} & Readonly<A>;
|
|
5
|
+
export declare class AuthActionUnavailable extends AuthActionUnavailable_base<{
|
|
6
|
+
readonly cause: unknown;
|
|
7
|
+
}> {
|
|
8
|
+
}
|
|
9
|
+
export interface AuthActionResult<A, E> {
|
|
10
|
+
readonly data: A;
|
|
11
|
+
readonly error: E | null;
|
|
12
|
+
}
|
|
13
|
+
export declare function authAction<TInput, A, E extends object = never>(run: (input: TInput, signal: AbortSignal) => Promise<AuthActionResult<A, E>>): Atom.AtomResultFn<TInput, A, E | AuthActionUnavailable>;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=authAction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authAction.d.ts","sourceRoot":"","sources":["../../src/client/authAction.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,IAAI,MAAM,wBAAwB,CAAC;;;;AAE/C,qBAAa,qBAAsB,SAAQ,2BAA0C;IACpF,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACxB,CAAC;CAAG;AAEL,MAAM,WAAW,gBAAgB,CAAC,CAAC,EAAE,CAAC;IACrC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACjB,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;CACzB;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,SAAS,MAAM,GAAG,KAAK,EAC7D,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAC1E,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,qBAAqB,CAAC,CAOzD"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Data, Effect } from "effect";
|
|
2
|
+
import * as Atom from "effect/reactivity/Atom";
|
|
3
|
+
export class AuthActionUnavailable extends Data.TaggedError("AuthActionUnavailable") {
|
|
4
|
+
}
|
|
5
|
+
export function authAction(run) {
|
|
6
|
+
return Atom.fn()((input) => Effect.tryPromise({
|
|
7
|
+
catch: (cause) => new AuthActionUnavailable({ cause }),
|
|
8
|
+
try: (signal) => run(input, signal),
|
|
9
|
+
}).pipe(Effect.flatMap((result) => (result.error === null ? Effect.succeed(result.data) : Effect.fail(result.error)))));
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=authAction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authAction.js","sourceRoot":"","sources":["../../src/client/authAction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,IAAI,MAAM,wBAAwB,CAAC;AAE/C,MAAM,OAAO,qBAAsB,SAAQ,IAAI,CAAC,WAAW,CAAC,uBAAuB,CAEjF;CAAG;AAOL,MAAM,UAAU,UAAU,CACzB,GAA4E;IAE5E,OAAO,IAAI,CAAC,EAAE,EAAU,CAAC,CAAC,KAAK,EAAE,EAAE,CAClC,MAAM,CAAC,UAAU,CAAC;QACjB,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,qBAAqB,CAAC,EAAE,KAAK,EAAE,CAAC;QACtD,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC;KACnC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CACtH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type Effect, Option, type Schema } from "effect";
|
|
2
|
+
import type * as Atom from "effect/reactivity/Atom";
|
|
3
|
+
import { type BrowserDraftConfig } from "@shivaedev/form/client/react.ts";
|
|
4
|
+
import type { Decoded, Encoded, FieldFailure, Fields, Form, Services } from "@shivaedev/form/shape.ts";
|
|
5
|
+
import type { AtomServices, FieldRejectionMapping } from "#fieldRejection.ts";
|
|
6
|
+
import type { NoticeFeedback } from "#notices.ts";
|
|
7
|
+
import { type SaveState } from "./saveState.ts";
|
|
8
|
+
export type CreateConfig<TFields extends Fields, TCreated, TSaveError, R, TRuntimeError> = {
|
|
9
|
+
readonly persistedDraft?: BrowserDraftConfig | undefined;
|
|
10
|
+
readonly fields: Schema.Struct<TFields>;
|
|
11
|
+
readonly initialValues: Encoded<TFields>;
|
|
12
|
+
readonly create: (values: Decoded<TFields>) => Effect.Effect<TCreated, TSaveError, AtomServices<R>>;
|
|
13
|
+
readonly runtime: Atom.AtomRuntime<Services<TFields, R>, TRuntimeError>;
|
|
14
|
+
readonly notices?: NoticeFeedback<Decoded<TFields>, TCreated, TSaveError, Services<TFields, R>>;
|
|
15
|
+
} & FieldRejectionMapping<TFields, TSaveError>;
|
|
16
|
+
export interface Create<TFields extends Fields, TCreated, TSaveError, TRuntimeError> extends SaveState<TSaveError | TRuntimeError> {
|
|
17
|
+
readonly created: Option.Option<TCreated>;
|
|
18
|
+
readonly form: Form<TFields, TCreated, TSaveError | FieldFailure, TRuntimeError>;
|
|
19
|
+
}
|
|
20
|
+
export declare function useCreate<TFields extends Fields, TCreated, TSaveError, R, TRuntimeError>(config: CreateConfig<TFields, TCreated, TSaveError, R, TRuntimeError>): Create<TFields, TCreated, TSaveError, TRuntimeError>;
|
|
21
|
+
//# sourceMappingURL=create.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/client/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAS,MAAM,EAAE,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAC;AACjE,OAAO,KAAK,KAAK,IAAI,MAAM,wBAAwB,CAAC;AAEpD,OAAO,EAAE,KAAK,kBAAkB,EAAqB,MAAM,iCAAiC,CAAC;AAC7F,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACvG,OAAO,KAAK,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,EAAE,KAAK,SAAS,EAAgB,MAAM,gBAAgB,CAAC;AAC9D,MAAM,MAAM,YAAY,CAAC,OAAO,SAAS,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,EAAE,aAAa,IAAI;IAC1F,QAAQ,CAAC,cAAc,CAAC,EAAE,kBAAkB,GAAG,SAAS,CAAC;IACzD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACxC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACzC,QAAQ,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IACpG,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;IACxE,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;CAChG,GAAG,qBAAqB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AAC/C,MAAM,WAAW,MAAM,CAAC,OAAO,SAAS,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,CAAE,SAAQ,SAAS,CAAC,UAAU,GAAG,aAAa,CAAC;IACjI,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC1C,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,GAAG,YAAY,EAAE,aAAa,CAAC,CAAC;CACjF;AAKD,wBAAgB,SAAS,CAAC,OAAO,SAAS,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,EAAE,aAAa,EACvF,MAAM,EAAE,YAAY,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,EAAE,aAAa,CAAC,GACnE,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,CAAC,CA0BtD"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Equal, Option } from "effect";
|
|
2
|
+
import { useCallback, useState } from "react";
|
|
3
|
+
import { usePersistedDraft } from "@shivaedev/form/client/react.ts";
|
|
4
|
+
import { useSubmissionCallbacks } from "#internal/useSubmissionCallbacks.ts";
|
|
5
|
+
import { submission } from "#submission.ts";
|
|
6
|
+
import { useSaveState } from "./saveState.js";
|
|
7
|
+
function editedSince(current, submitted) {
|
|
8
|
+
const before = new Map(Object.entries(submitted ?? current));
|
|
9
|
+
return Object.fromEntries(Object.entries(current).filter(([name, value]) => !Equal.equals(value, before.get(name))));
|
|
10
|
+
}
|
|
11
|
+
export function useCreate(config) {
|
|
12
|
+
const persistedDraft = usePersistedDraft(config.persistedDraft);
|
|
13
|
+
const callbacks = useSubmissionCallbacks(config.fields, config.create, config.rejectField, config.runtime, config.notices);
|
|
14
|
+
function initialize() {
|
|
15
|
+
const { fields, initialValues, runtime } = config;
|
|
16
|
+
function makeSubmission() {
|
|
17
|
+
return submission({ ...callbacks, fields, initialValues, persistedDraft, runtime });
|
|
18
|
+
}
|
|
19
|
+
return { baseline: initialValues, created: Option.none(), current: makeSubmission(), fields, fresh: makeSubmission, runtime };
|
|
20
|
+
}
|
|
21
|
+
const [held, hold] = useState(initialize);
|
|
22
|
+
let entry = held;
|
|
23
|
+
if (entry.fields !== config.fields || entry.runtime !== config.runtime) {
|
|
24
|
+
entry = initialize();
|
|
25
|
+
hold(entry);
|
|
26
|
+
}
|
|
27
|
+
const { baseline, created, current, fresh } = entry;
|
|
28
|
+
const settled = useCallback((value) => {
|
|
29
|
+
const next = fresh();
|
|
30
|
+
next.form.values.set({ ...baseline, ...editedSince(current.form.values.value, current.submitted()) });
|
|
31
|
+
hold({ ...entry, created: Option.some(value), current: next });
|
|
32
|
+
}, [entry, current, fresh, baseline]);
|
|
33
|
+
return { ...useSaveState(current.form, settled), created, form: current.form };
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/client/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { type Effect, type Schema } from "effect";
|
|
2
|
+
import type * as AsyncResult from "effect/reactivity/AsyncResult";
|
|
3
|
+
import type * as Atom from "effect/reactivity/Atom";
|
|
4
|
+
import { type BrowserDraftConfig } from "@shivaedev/form/client/react.ts";
|
|
5
|
+
import type { Decoded, Encoded, FieldFailure, Fields, Form, Services } from "@shivaedev/form/shape.ts";
|
|
6
|
+
import type { AtomServices, FieldRejectionMapping } from "#fieldRejection.ts";
|
|
7
|
+
import type { NoticeFeedback } from "#notices.ts";
|
|
8
|
+
import { type QueryOptions, type QueryState } from "./resultState.ts";
|
|
9
|
+
import { type SaveState } from "./saveState.ts";
|
|
10
|
+
import type { LoadedQueryState } from "./useLoaderQuery.ts";
|
|
11
|
+
export type EditorConfig<TFields extends Fields, TRow, TQueryError, TSaveError, R, TRuntimeError> = {
|
|
12
|
+
readonly persistedDraft?: BrowserDraftConfig | undefined;
|
|
13
|
+
readonly query: Atom.Atom<AsyncResult.AsyncResult<TRow, TQueryError>>;
|
|
14
|
+
readonly fields: Schema.Struct<TFields>;
|
|
15
|
+
readonly values: (row: TRow) => Encoded<TFields>;
|
|
16
|
+
readonly save: (values: Decoded<TFields>) => Effect.Effect<TRow, TSaveError, AtomServices<R>>;
|
|
17
|
+
readonly runtime: Atom.AtomRuntime<Services<TFields, R>, TRuntimeError>;
|
|
18
|
+
readonly notices?: NoticeFeedback<Decoded<TFields>, TRow, TSaveError, Services<TFields, R>>;
|
|
19
|
+
readonly queryNotice?: QueryOptions<TQueryError>["notice"];
|
|
20
|
+
} & FieldRejectionMapping<TFields, TSaveError>;
|
|
21
|
+
export interface Editor<TFields extends Fields, TRow, TQueryError, TSaveError, TRuntimeError> extends SaveState<TSaveError | TRuntimeError> {
|
|
22
|
+
readonly form: Form<TFields, TRow, TSaveError | FieldFailure, TRuntimeError> | undefined;
|
|
23
|
+
readonly query: QueryState<TRow, TQueryError>;
|
|
24
|
+
}
|
|
25
|
+
export interface LoadedEditor<TFields extends Fields, TRow, TQueryError, TSaveError, TRuntimeError> extends Omit<Editor<TFields, TRow, TQueryError, TSaveError, TRuntimeError>, "form" | "query"> {
|
|
26
|
+
readonly form: Form<TFields, TRow, TSaveError | FieldFailure, TRuntimeError>;
|
|
27
|
+
readonly query: LoadedQueryState<TRow, TQueryError>;
|
|
28
|
+
}
|
|
29
|
+
export declare function useEditor<TFields extends Fields, TRow, TQueryError, TSaveError, R, TRuntimeError>(config: EditorConfig<TFields, TRow, TQueryError, TSaveError, R, TRuntimeError> & {
|
|
30
|
+
readonly loaded: TRow;
|
|
31
|
+
}): LoadedEditor<TFields, TRow, TQueryError, TSaveError, TRuntimeError>;
|
|
32
|
+
export declare function useEditor<TFields extends Fields, TRow, TQueryError, TSaveError, R, TRuntimeError>(config: EditorConfig<TFields, TRow, TQueryError, TSaveError, R, TRuntimeError>): Editor<TFields, TRow, TQueryError, TSaveError, TRuntimeError>;
|
|
33
|
+
//# sourceMappingURL=editor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../../src/client/editor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Option } from "effect";
|
|
2
|
+
import { useCallback, useEffect, useState } from "react";
|
|
3
|
+
import { usePersistedDraft } from "@shivaedev/form/client/react.ts";
|
|
4
|
+
import { loadedQuery } from "#internal/loadedQuery.ts";
|
|
5
|
+
import { useSubmissionCallbacks } from "#internal/useSubmissionCallbacks.ts";
|
|
6
|
+
import { submission } from "#submission.ts";
|
|
7
|
+
import { useQuery } from "./resultState.js";
|
|
8
|
+
import { useSaveState } from "./saveState.js";
|
|
9
|
+
export function useEditor(config) {
|
|
10
|
+
const persistedDraft = usePersistedDraft(config.persistedDraft);
|
|
11
|
+
const callbacks = useSubmissionCallbacks(config.fields, config.save, config.rejectField, config.runtime, config.notices);
|
|
12
|
+
const query = useQuery(config.query, config.queryNotice === undefined ? {} : { notice: config.queryNotice });
|
|
13
|
+
const row = Option.orElse(query.data, () => ("loaded" in config ? Option.some(config.loaded) : Option.none()));
|
|
14
|
+
const [held, hold] = useState(undefined);
|
|
15
|
+
let current = held?.query === config.query && held.fields === config.fields && held.runtime === config.runtime ? held : undefined;
|
|
16
|
+
if (current === undefined && Option.isSome(row)) {
|
|
17
|
+
current = {
|
|
18
|
+
fields: config.fields,
|
|
19
|
+
form: submission({
|
|
20
|
+
...callbacks,
|
|
21
|
+
fields: config.fields,
|
|
22
|
+
initialValues: config.values(row.value),
|
|
23
|
+
persistedDraft,
|
|
24
|
+
runtime: config.runtime,
|
|
25
|
+
}).form,
|
|
26
|
+
query: config.query,
|
|
27
|
+
runtime: config.runtime,
|
|
28
|
+
values: config.values,
|
|
29
|
+
};
|
|
30
|
+
hold(current);
|
|
31
|
+
}
|
|
32
|
+
const form = current?.form;
|
|
33
|
+
const values = current?.values;
|
|
34
|
+
const received = Option.getOrUndefined(row);
|
|
35
|
+
useEffect(() => {
|
|
36
|
+
if (form && values && received !== undefined) {
|
|
37
|
+
form.receive(values(received));
|
|
38
|
+
}
|
|
39
|
+
}, [form, values, received]);
|
|
40
|
+
const settled = useCallback((saved) => (form && values ? form.receive(values(saved)) : undefined), [form, values]);
|
|
41
|
+
const saveState = useSaveState(form, settled);
|
|
42
|
+
if ("loaded" in config) {
|
|
43
|
+
if (!form) {
|
|
44
|
+
throw new Error("A loaded editor requires a row");
|
|
45
|
+
}
|
|
46
|
+
return { ...saveState, form, query: loadedQuery(query, config.loaded) };
|
|
47
|
+
}
|
|
48
|
+
return { ...saveState, form, query };
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=editor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editor.js","sourceRoot":"","sources":["../../src/client/editor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type Duration } from "effect";
|
|
2
|
+
import type * as AtomRegistry from "effect/reactivity/AtomRegistry";
|
|
3
|
+
export declare function mountLive(registry: AtomRegistry.AtomRegistry, client: unknown, coalesceWindow?: Duration.Input): () => void;
|
|
4
|
+
//# sourceMappingURL=mountLive.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mountLive.d.ts","sourceRoot":"","sources":["../../src/client/mountLive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,QAAQ,EAAqB,MAAM,QAAQ,CAAC;AAEjE,OAAO,KAAK,KAAK,YAAY,MAAM,gCAAgC,CAAC;AAepE,wBAAgB,SAAS,CAAC,QAAQ,EAAE,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,CAAC,EAAE,QAAQ,CAAC,KAAK,cAuC9G"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Cause, Option, Predicate } from "effect";
|
|
2
|
+
import * as Atom from "effect/reactivity/Atom";
|
|
3
|
+
import { LiveConnection } from "@shivaedev/contract/automaticLive.ts";
|
|
4
|
+
import { recheckUnauthorized } from "#internal/sessionRecheck.ts";
|
|
5
|
+
function isLiveBound(value) {
|
|
6
|
+
return Predicate.hasProperty(value, LiveConnection);
|
|
7
|
+
}
|
|
8
|
+
function recheckFailure(registry, failure) {
|
|
9
|
+
const error = Option.flatMap(failure, Cause.findErrorOption);
|
|
10
|
+
if (Option.isSome(error)) {
|
|
11
|
+
void recheckUnauthorized(registry, error.value);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export function mountLive(registry, client, coalesceWindow) {
|
|
15
|
+
const releases = [];
|
|
16
|
+
const found = new Set();
|
|
17
|
+
function mount(value) {
|
|
18
|
+
if (!isLiveBound(value)) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const live = value[LiveConnection];
|
|
22
|
+
if (Predicate.hasProperty(live, "connection") && Atom.isAtom(live.connection) && !found.has(live.connection)) {
|
|
23
|
+
if (coalesceWindow !== undefined
|
|
24
|
+
&& Predicate.hasProperty(live, "coalesceWindow")
|
|
25
|
+
&& Atom.isAtom(live.coalesceWindow)
|
|
26
|
+
&& Atom.isWritable(live.coalesceWindow)) {
|
|
27
|
+
registry.set(live.coalesceWindow, coalesceWindow);
|
|
28
|
+
}
|
|
29
|
+
found.add(live.connection);
|
|
30
|
+
releases.push(registry.subscribe(Atom.map(live.status, (status) => status.failure), (failure) => recheckFailure(registry, failure), { immediate: true }));
|
|
31
|
+
releases.push(registry.mount(live.connection));
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
mount(client);
|
|
35
|
+
if (typeof client === "object" && client !== null) {
|
|
36
|
+
for (const value of Object.values(client)) {
|
|
37
|
+
mount(value);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return () => {
|
|
41
|
+
for (const release of releases) {
|
|
42
|
+
release();
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=mountLive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mountLive.js","sourceRoot":"","sources":["../../src/client/mountLive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAiB,MAAM,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACjE,OAAO,KAAK,IAAI,MAAM,wBAAwB,CAAC;AAE/C,OAAO,EAAkB,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACtF,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAElE,SAAS,WAAW,CAAC,KAAc;IAClC,OAAO,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,cAAc,CAAC,QAAmC,EAAE,OAA4C;IACxG,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC;IAC7D,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,KAAK,mBAAmB,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC;AACF,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,QAAmC,EAAE,MAAe,EAAE,cAA+B;IAC9G,MAAM,QAAQ,GAAsB,EAAE,CAAC;IACvC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAW,CAAC;IACjC,SAAS,KAAK,CAAC,KAAc;QAC5B,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO;QACR,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC;QACnC,IAAI,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9G,IACC,cAAc,KAAK,SAAS;mBACzB,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,gBAAgB,CAAC;mBAC7C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC;mBAChC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,EACtC,CAAC;gBACF,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;YACnD,CAAC;YACD,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC3B,QAAQ,CAAC,IAAI,CACZ,QAAQ,CAAC,SAAS,CACjB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EACjD,CAAC,OAAO,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,EAC9C,EAAE,SAAS,EAAE,IAAI,EAAE,CACnB,CACD,CAAC;YACF,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAChD,CAAC;IACF,CAAC;IACD,KAAK,CAAC,MAAM,CAAC,CAAC;IACd,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACnD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3C,KAAK,CAAC,KAAK,CAAC,CAAC;QACd,CAAC;IACF,CAAC;IACD,OAAO,GAAG,EAAE;QACX,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAChC,OAAO,EAAE,CAAC;QACX,CAAC;IACF,CAAC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as AsyncResult from "effect/reactivity/AsyncResult";
|
|
2
|
+
import * as Atom from "effect/reactivity/Atom";
|
|
3
|
+
import { type ActionState } from "./resultState.ts";
|
|
4
|
+
export interface PendingCommandOptions<TInput, TValue> {
|
|
5
|
+
readonly queries: readonly Atom.Atom<AsyncResult.AsyncResult<unknown, unknown>>[];
|
|
6
|
+
readonly value: TValue;
|
|
7
|
+
readonly wanted: (input: TInput) => TValue;
|
|
8
|
+
}
|
|
9
|
+
export interface PendingCommandState<TInput, A, E, TValue> extends ActionState<TInput, A, E> {
|
|
10
|
+
readonly value: TValue;
|
|
11
|
+
}
|
|
12
|
+
export declare function usePendingCommand<TInput, A, E, TValue>(atom: Atom.AtomResultFn<TInput, A, E>, options: PendingCommandOptions<TInput, TValue>): PendingCommandState<TInput, A, E, TValue>;
|
|
13
|
+
//# sourceMappingURL=pendingCommand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pendingCommand.d.ts","sourceRoot":"","sources":["../../src/client/pendingCommand.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,WAAW,MAAM,+BAA+B,CAAC;AAC7D,OAAO,KAAK,IAAI,MAAM,wBAAwB,CAAC;AAE/C,OAAO,EAAE,KAAK,WAAW,EAAa,MAAM,kBAAkB,CAAC;AAE/D,MAAM,WAAW,qBAAqB,CAAC,MAAM,EAAE,MAAM;IACpD,QAAQ,CAAC,OAAO,EAAE,SAAS,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;IAClF,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CAC3C;AACD,MAAM,WAAW,mBAAmB,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAE,SAAQ,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IAC3F,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EACrD,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,EACrC,OAAO,EAAE,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5C,mBAAmB,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAsB3C"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { RegistryContext, useAtomValue } from "@effect/atom-react";
|
|
2
|
+
import { Option } from "effect";
|
|
3
|
+
import * as AsyncResult from "effect/reactivity/AsyncResult";
|
|
4
|
+
import * as Atom from "effect/reactivity/Atom";
|
|
5
|
+
import { useContext, useMemo, useState } from "react";
|
|
6
|
+
import { useAction } from "./resultState.js";
|
|
7
|
+
export function usePendingCommand(atom, options) {
|
|
8
|
+
const action = useAction(atom);
|
|
9
|
+
const registry = useContext(RegistryContext);
|
|
10
|
+
const { queries, value, wanted } = options;
|
|
11
|
+
const waiting = useMemo(() => Atom.make((get) => queries.map((query) => get(query).waiting).some(Boolean)), [queries]);
|
|
12
|
+
const refreshing = useAtomValue(waiting);
|
|
13
|
+
const [held, hold] = useState({ atom, registry, value: Option.none() });
|
|
14
|
+
const sameOwner = held.atom === atom && held.registry === registry;
|
|
15
|
+
const failed = AsyncResult.isFailure(action.result) && !action.pending;
|
|
16
|
+
const pending = sameOwner && Option.isSome(held.value) && !failed && (action.pending || refreshing);
|
|
17
|
+
if (!sameOwner || (Option.isSome(held.value) && !pending)) {
|
|
18
|
+
hold({ atom, registry, value: Option.none() });
|
|
19
|
+
}
|
|
20
|
+
return {
|
|
21
|
+
...action,
|
|
22
|
+
dispatch: (input) => {
|
|
23
|
+
hold({ atom, registry, value: Option.some(wanted(input)) });
|
|
24
|
+
action.dispatch(input);
|
|
25
|
+
},
|
|
26
|
+
pending: action.pending || pending,
|
|
27
|
+
value: pending ? Option.getOrElse(held.value, () => value) : value,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=pendingCommand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pendingCommand.js","sourceRoot":"","sources":["../../src/client/pendingCommand.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,+BAA+B,CAAC;AAC7D,OAAO,KAAK,IAAI,MAAM,wBAAwB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,EAAoB,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAW/D,MAAM,UAAU,iBAAiB,CAChC,IAAqC,EACrC,OAA8C;IAE9C,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,QAAQ,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;IAC7C,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IACvH,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,EAAU,EAAE,CAAC,CAAC;IAChF,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC;IACnE,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;IACvE,MAAM,OAAO,GAAG,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,UAAU,CAAC,CAAC;IACpG,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3D,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,OAAO;QACN,GAAG,MAAM;QACT,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;YACnB,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YAC5D,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,OAAO;QAClC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK;KAClE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Cause, type Duration, type Effect, Option } from "effect";
|
|
2
|
+
import * as AsyncResult from "effect/reactivity/AsyncResult";
|
|
3
|
+
import type * as Atom from "effect/reactivity/Atom";
|
|
4
|
+
import type { AtomServices } from "#fieldRejection.ts";
|
|
5
|
+
import type { NoticeDescriptor } from "#notices.ts";
|
|
6
|
+
import { type ActionOptions } from "./actionCompletion.ts";
|
|
7
|
+
export interface ResultState<A, E> {
|
|
8
|
+
readonly cause: Option.Option<Cause.Cause<E>>;
|
|
9
|
+
readonly data: Option.Option<A>;
|
|
10
|
+
readonly pending: boolean;
|
|
11
|
+
readonly refreshing: boolean;
|
|
12
|
+
readonly result: AsyncResult.AsyncResult<A, E>;
|
|
13
|
+
}
|
|
14
|
+
export declare function isUnauthorized<E>(cause: Cause.Cause<E>): boolean;
|
|
15
|
+
export interface QueryState<A, E> extends ResultState<A, E> {
|
|
16
|
+
readonly refresh: () => void;
|
|
17
|
+
}
|
|
18
|
+
export interface QueryOptions<E = unknown> {
|
|
19
|
+
readonly coalesceWindow?: Duration.Input | undefined;
|
|
20
|
+
readonly keepPreviousData?: boolean;
|
|
21
|
+
readonly notice?: (failure: {
|
|
22
|
+
readonly cause: Cause.Cause<E>;
|
|
23
|
+
readonly refreshing: boolean;
|
|
24
|
+
}) => NoticeDescriptor | undefined;
|
|
25
|
+
}
|
|
26
|
+
export declare function useQuery<A, E>(atom: Atom.Atom<AsyncResult.AsyncResult<A, E>>, options?: QueryOptions<E>): QueryState<A, E>;
|
|
27
|
+
export interface ActionState<TInput, A, E> extends ResultState<A, E> {
|
|
28
|
+
readonly dispatch: (input: TInput) => void;
|
|
29
|
+
}
|
|
30
|
+
export declare function useAction<TInput, A, E>(atom: Atom.AtomResultFn<TInput, A, E>): ActionState<TInput, A, E>;
|
|
31
|
+
export declare function useAction<TInput, A, E, R, TRuntimeError>(runtime: Atom.AtomRuntime<R, TRuntimeError>, run: (input: TInput) => Effect.Effect<A, E, AtomServices<R>>, options?: ActionOptions<NoInfer<TInput>, NoInfer<A>, NoInfer<E>, R>): ActionState<TInput, A, E | TRuntimeError>;
|
|
32
|
+
//# sourceMappingURL=resultState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resultState.d.ts","sourceRoot":"","sources":["../../src/client/resultState.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { RegistryContext, useAtomRefresh, useAtomSet, useAtomValue } from "@effect/atom-react";
|
|
2
|
+
import { Cause, Option, Predicate } from "effect";
|
|
3
|
+
import * as AsyncResult from "effect/reactivity/AsyncResult";
|
|
4
|
+
import { useContext, useEffect, useState } from "react";
|
|
5
|
+
import { queryCoalesceWindow } from "@shivaedev/contract/queryCoalesceWindow.ts";
|
|
6
|
+
import { acceptLoaderQuery } from "#internal/queryHandoff.ts";
|
|
7
|
+
import { useQueryNotice } from "#internal/useQueryNotice.ts";
|
|
8
|
+
import { useActionSource } from "./actionCompletion.js";
|
|
9
|
+
import { useSessionRecheck } from "./sessionBoundary.js";
|
|
10
|
+
function state(result, data = AsyncResult.value(result)) {
|
|
11
|
+
return {
|
|
12
|
+
cause: AsyncResult.cause(result),
|
|
13
|
+
data,
|
|
14
|
+
pending: result.waiting,
|
|
15
|
+
refreshing: result.waiting && Option.isSome(data),
|
|
16
|
+
result,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export function isUnauthorized(cause) {
|
|
20
|
+
return Option.match(Cause.findErrorOption(cause), { onNone: () => false, onSome: (error) => Predicate.isTagged(error, "Unauthorized") });
|
|
21
|
+
}
|
|
22
|
+
function useRecheckOnUnauthorized(result, enabled = true) {
|
|
23
|
+
const recheck = useSessionRecheck();
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
if (enabled && AsyncResult.isFailure(result) && isUnauthorized(result.cause)) {
|
|
26
|
+
recheck();
|
|
27
|
+
}
|
|
28
|
+
}, [enabled, recheck, result]);
|
|
29
|
+
}
|
|
30
|
+
export function useQuery(atom, options = {}) {
|
|
31
|
+
const result = useAtomValue(atom);
|
|
32
|
+
const registry = useContext(RegistryContext);
|
|
33
|
+
useEffect(() => acceptLoaderQuery(registry, atom), [registry, atom]);
|
|
34
|
+
useEffect(() => {
|
|
35
|
+
if (options.coalesceWindow === undefined) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const window = queryCoalesceWindow(atom);
|
|
39
|
+
registry.set(window, options.coalesceWindow);
|
|
40
|
+
return () => registry.set(window, undefined);
|
|
41
|
+
}, [registry, atom, options.coalesceWindow]);
|
|
42
|
+
const keepPreviousData = options.keepPreviousData === true;
|
|
43
|
+
const nativeData = AsyncResult.value(result);
|
|
44
|
+
const [held, hold] = useState(() => ({ atom, data: nativeData, dataAtom: atom, keepPreviousData, registry, result }));
|
|
45
|
+
const previous = held.registry === registry && (held.dataAtom === atom || keepPreviousData) ? held.data : Option.none();
|
|
46
|
+
const data = Option.orElse(nativeData, () => previous);
|
|
47
|
+
const dataAtom = Option.isSome(nativeData) || Option.isNone(previous) ? atom : held.dataAtom;
|
|
48
|
+
// Render state keeps abandoned React renders from changing the committed screen's retained value.
|
|
49
|
+
if (held.atom !== atom || held.registry !== registry || held.result !== result || held.keepPreviousData !== keepPreviousData) {
|
|
50
|
+
hold({ atom, data, dataAtom, keepPreviousData, registry, result });
|
|
51
|
+
}
|
|
52
|
+
useRecheckOnUnauthorized(result);
|
|
53
|
+
useQueryNotice(result, Option.isSome(data), options.notice);
|
|
54
|
+
return { ...state(result, data), refresh: useAtomRefresh(atom) };
|
|
55
|
+
}
|
|
56
|
+
export function useAction(source, run, options = {}) {
|
|
57
|
+
const atom = useActionSource(source, run, options);
|
|
58
|
+
const result = useAtomValue(atom);
|
|
59
|
+
useRecheckOnUnauthorized(result, run === undefined);
|
|
60
|
+
return { ...state(result), dispatch: useAtomSet(atom) };
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=resultState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resultState.js","sourceRoot":"","sources":["../../src/client/resultState.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Option } from "effect";
|
|
2
|
+
import { FieldFailure, type Fields, type Form } from "@shivaedev/form/shape.ts";
|
|
3
|
+
export interface SaveState<E> {
|
|
4
|
+
readonly dirty: boolean;
|
|
5
|
+
readonly failure: Option.Option<E>;
|
|
6
|
+
readonly revert: () => void;
|
|
7
|
+
readonly save: () => void;
|
|
8
|
+
readonly saving: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare function useSaveState<TFields extends Fields, A, E, TRuntimeError>(form: Form<TFields, A, E | FieldFailure, TRuntimeError> | undefined, settled: (result: A) => void): SaveState<E | TRuntimeError>;
|
|
11
|
+
//# sourceMappingURL=saveState.d.ts.map
|