effect-react-bridge 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/README.md +30 -0
- package/dist/RemoteData.d.ts +26 -0
- package/dist/RemoteData.d.ts.map +1 -0
- package/dist/RemoteData.js +28 -0
- package/dist/RemoteData.js.map +1 -0
- package/dist/hooks.d.ts +26 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +67 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/package.json +43 -0
package/README.md
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# effect-react-bridge
|
|
2
|
+
|
|
3
|
+
Run [Effect](https://effect.website) programs inside [React](https://react.dev). A small, **domain-agnostic** bridge — no hypermedia, no Affordant coupling. It lives in this workspace for convenience but depends only on React and Effect.
|
|
4
|
+
|
|
5
|
+
- `makeEffectHooks({ runtime })` → `{ useEffectQuery, useEffectFn }`, bound to a `ManagedRuntime`.
|
|
6
|
+
- `useEffectQuery(factory, deps)` — run an Effect as a query: `{ data, error, loading, refresh }`. The fiber is interrupted on unmount or when deps change.
|
|
7
|
+
- `useEffectFn(factory)` — an imperative runner: `{ running, error, run }`.
|
|
8
|
+
- `RemoteData` — an ADT (`Idle | Loading | Loaded | Failed`) with `fromQuery` and `match`.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
import { makeEffectHooks, RemoteData } from 'effect-react-bridge'
|
|
12
|
+
|
|
13
|
+
const { useEffectQuery } = makeEffectHooks({ runtime })
|
|
14
|
+
|
|
15
|
+
function OrderView({ id }: { id: string }) {
|
|
16
|
+
const query = useEffectQuery(() => loadOrder(id), [id])
|
|
17
|
+
return RemoteData.match(RemoteData.fromQuery(query), {
|
|
18
|
+
onIdle: () => null,
|
|
19
|
+
onLoading: () => <Spinner />,
|
|
20
|
+
onLoaded: (order) => <Order order={order} />,
|
|
21
|
+
onFailed: (e) => <ErrorBanner error={e} />,
|
|
22
|
+
})
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
`effect` and `react` are peer dependencies.
|
|
27
|
+
|
|
28
|
+
## License
|
|
29
|
+
|
|
30
|
+
MIT
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { EffectQueryState } from './hooks.js';
|
|
2
|
+
export type RemoteData<E, A> = {
|
|
3
|
+
readonly _tag: 'Idle';
|
|
4
|
+
} | {
|
|
5
|
+
readonly _tag: 'Loading';
|
|
6
|
+
} | {
|
|
7
|
+
readonly _tag: 'Loaded';
|
|
8
|
+
readonly value: A;
|
|
9
|
+
} | {
|
|
10
|
+
readonly _tag: 'Failed';
|
|
11
|
+
readonly error: E;
|
|
12
|
+
};
|
|
13
|
+
export declare const RemoteData: {
|
|
14
|
+
readonly idle: <E, A>() => RemoteData<E, A>;
|
|
15
|
+
readonly loading: <E, A>() => RemoteData<E, A>;
|
|
16
|
+
readonly loaded: <E, A>(value: A) => RemoteData<E, A>;
|
|
17
|
+
readonly failed: <E, A>(error: E) => RemoteData<E, A>;
|
|
18
|
+
readonly fromQuery: <A, E>(state: EffectQueryState<A, E>) => RemoteData<E, A>;
|
|
19
|
+
readonly match: <E, A, R>(rd: RemoteData<E, A>, handlers: {
|
|
20
|
+
readonly onIdle: () => R;
|
|
21
|
+
readonly onLoading: () => R;
|
|
22
|
+
readonly onLoaded: (value: A) => R;
|
|
23
|
+
readonly onFailed: (error: E) => R;
|
|
24
|
+
}) => R;
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=RemoteData.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RemoteData.d.ts","sourceRoot":"","sources":["../src/RemoteData.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAElD,MAAM,MAAM,UAAU,CAAC,CAAC,EAAE,CAAC,IACvB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzB;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GAC5B;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GAC9C;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;CAAE,CAAA;AAElD,eAAO,MAAM,UAAU;oBACd,CAAC,EAAE,CAAC,OAAK,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC;uBACtB,CAAC,EAAE,CAAC,OAAK,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC;sBAC1B,CAAC,EAAE,CAAC,SAAS,CAAC,KAAG,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC;sBACjC,CAAC,EAAE,CAAC,SAAS,CAAC,KAAG,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC;yBAE9B,CAAC,EAAE,CAAC,SAAS,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,KAAG,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC;qBAO1D,CAAC,EAAE,CAAC,EAAE,CAAC,MACT,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,YACV;QACR,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;QAC3B,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAA;QAClC,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAA;KACnC,KACA,CAAC;CAYI,CAAA"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export const RemoteData = {
|
|
2
|
+
idle: () => ({ _tag: 'Idle' }),
|
|
3
|
+
loading: () => ({ _tag: 'Loading' }),
|
|
4
|
+
loaded: (value) => ({ _tag: 'Loaded', value }),
|
|
5
|
+
failed: (error) => ({ _tag: 'Failed', error }),
|
|
6
|
+
fromQuery: (state) => {
|
|
7
|
+
if (state.loading)
|
|
8
|
+
return { _tag: 'Loading' };
|
|
9
|
+
if (state.error !== null)
|
|
10
|
+
return { _tag: 'Failed', error: state.error };
|
|
11
|
+
if (state.data !== null)
|
|
12
|
+
return { _tag: 'Loaded', value: state.data };
|
|
13
|
+
return { _tag: 'Idle' };
|
|
14
|
+
},
|
|
15
|
+
match: (rd, handlers) => {
|
|
16
|
+
switch (rd._tag) {
|
|
17
|
+
case 'Idle':
|
|
18
|
+
return handlers.onIdle();
|
|
19
|
+
case 'Loading':
|
|
20
|
+
return handlers.onLoading();
|
|
21
|
+
case 'Loaded':
|
|
22
|
+
return handlers.onLoaded(rd.value);
|
|
23
|
+
case 'Failed':
|
|
24
|
+
return handlers.onFailed(rd.error);
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=RemoteData.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RemoteData.js","sourceRoot":"","sources":["../src/RemoteData.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,IAAI,EAAE,GAA2B,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACtD,OAAO,EAAE,GAA2B,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAC5D,MAAM,EAAE,CAAO,KAAQ,EAAoB,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACzE,MAAM,EAAE,CAAO,KAAQ,EAAoB,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAEzE,SAAS,EAAE,CAAO,KAA6B,EAAoB,EAAE;QACnE,IAAI,KAAK,CAAC,OAAO;YAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAA;QAC7C,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI;YAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAA;QACvE,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,CAAA;QACrE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;IACzB,CAAC;IAED,KAAK,EAAE,CACL,EAAoB,EACpB,QAKC,EACE,EAAE;QACL,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;YAChB,KAAK,MAAM;gBACT,OAAO,QAAQ,CAAC,MAAM,EAAE,CAAA;YAC1B,KAAK,SAAS;gBACZ,OAAO,QAAQ,CAAC,SAAS,EAAE,CAAA;YAC7B,KAAK,QAAQ;gBACX,OAAO,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAA;YACpC,KAAK,QAAQ;gBACX,OAAO,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAA;QACtC,CAAC;IACH,CAAC;CACO,CAAA"}
|
package/dist/hooks.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Effect, type ManagedRuntime } from 'effect';
|
|
2
|
+
export interface EffectHooksOptions<R> {
|
|
3
|
+
readonly runtime: ManagedRuntime.ManagedRuntime<R, never>;
|
|
4
|
+
readonly onError?: (error: unknown) => void;
|
|
5
|
+
}
|
|
6
|
+
export interface EffectQueryState<A, E> {
|
|
7
|
+
readonly data: A | null;
|
|
8
|
+
readonly error: E | null;
|
|
9
|
+
readonly loading: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface EffectQueryResult<A, E> extends EffectQueryState<A, E> {
|
|
12
|
+
readonly refresh: () => void;
|
|
13
|
+
}
|
|
14
|
+
export interface EffectFnState<E> {
|
|
15
|
+
readonly running: boolean;
|
|
16
|
+
readonly error: E | null;
|
|
17
|
+
}
|
|
18
|
+
export interface EffectFnResult<A, E, Args extends ReadonlyArray<unknown>> extends EffectFnState<E> {
|
|
19
|
+
readonly run: (...args: Args) => Promise<A>;
|
|
20
|
+
}
|
|
21
|
+
export interface EffectHooks<R> {
|
|
22
|
+
useEffectQuery<A, E>(factory: () => Effect.Effect<A, E, R>, deps: ReadonlyArray<unknown>): EffectQueryResult<A, E>;
|
|
23
|
+
useEffectFn<A, E, Args extends ReadonlyArray<unknown>>(factory: (...args: Args) => Effect.Effect<A, E, R>): EffectFnResult<A, E, Args>;
|
|
24
|
+
}
|
|
25
|
+
export declare function makeEffectHooks<R>(options: EffectHooksOptions<R>): EffectHooks<R>;
|
|
26
|
+
//# sourceMappingURL=hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,MAAM,EAAe,KAAK,cAAc,EAAE,MAAM,QAAQ,CAAA;AAGxE,MAAM,WAAW,kBAAkB,CAAC,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC,cAAc,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;IACzD,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;CAC5C;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC,EAAE,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAA;IACvB,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAA;IACxB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAC1B;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAE,SAAQ,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC;IACrE,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAA;CAC7B;AAED,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAA;CACzB;AAED,MAAM,WAAW,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,SAAS,aAAa,CAAC,OAAO,CAAC,CACvE,SAAQ,aAAa,CAAC,CAAC,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAA;CAC5C;AAED,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,cAAc,CAAC,CAAC,EAAE,CAAC,EACjB,OAAO,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EACrC,IAAI,EAAE,aAAa,CAAC,OAAO,CAAC,GAC3B,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAE1B,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,SAAS,aAAa,CAAC,OAAO,CAAC,EACnD,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GACjD,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAA;CAC9B;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CA8EjF"}
|
package/dist/hooks.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Cause, Effect, Exit, Fiber } from 'effect';
|
|
2
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
3
|
+
export function makeEffectHooks(options) {
|
|
4
|
+
const { runtime, onError } = options;
|
|
5
|
+
function useEffectQuery(factory, deps) {
|
|
6
|
+
const [state, setState] = useState({
|
|
7
|
+
data: null,
|
|
8
|
+
error: null,
|
|
9
|
+
loading: true,
|
|
10
|
+
});
|
|
11
|
+
const [version, setVersion] = useState(0);
|
|
12
|
+
const factoryRef = useRef(factory);
|
|
13
|
+
factoryRef.current = factory;
|
|
14
|
+
useEffect(() => {
|
|
15
|
+
let cancelled = false;
|
|
16
|
+
setState((prev) => ({ ...prev, loading: true, error: null }));
|
|
17
|
+
const fiber = runtime.runFork(factoryRef.current());
|
|
18
|
+
fiber.addObserver((exit) => {
|
|
19
|
+
if (cancelled)
|
|
20
|
+
return;
|
|
21
|
+
Exit.match(exit, {
|
|
22
|
+
onFailure: (cause) => {
|
|
23
|
+
if (Cause.isInterruptedOnly(cause)) {
|
|
24
|
+
setState((prev) => ({ ...prev, loading: false }));
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const failure = Cause.failureOption(cause);
|
|
28
|
+
const error = failure._tag === 'Some' ? failure.value : Cause.squash(cause);
|
|
29
|
+
onError?.(error);
|
|
30
|
+
setState({ data: null, loading: false, error });
|
|
31
|
+
},
|
|
32
|
+
onSuccess: (data) => setState({ data, error: null, loading: false }),
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
return () => {
|
|
36
|
+
cancelled = true;
|
|
37
|
+
Effect.runFork(Fiber.interruptFork(fiber));
|
|
38
|
+
};
|
|
39
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
40
|
+
}, [...deps, version]);
|
|
41
|
+
const refresh = useCallback(() => setVersion((v) => v + 1), []);
|
|
42
|
+
return { ...state, refresh };
|
|
43
|
+
}
|
|
44
|
+
function useEffectFn(factory) {
|
|
45
|
+
const [state, setState] = useState({ running: false, error: null });
|
|
46
|
+
const factoryRef = useRef(factory);
|
|
47
|
+
factoryRef.current = factory;
|
|
48
|
+
const run = useCallback(async (...args) => {
|
|
49
|
+
setState({ running: true, error: null });
|
|
50
|
+
try {
|
|
51
|
+
const value = await runtime.runPromise(factoryRef.current(...args));
|
|
52
|
+
setState({ running: false, error: null });
|
|
53
|
+
return value;
|
|
54
|
+
}
|
|
55
|
+
catch (cause) {
|
|
56
|
+
const typed = cause;
|
|
57
|
+
onError?.(typed);
|
|
58
|
+
setState({ running: false, error: typed });
|
|
59
|
+
throw cause;
|
|
60
|
+
}
|
|
61
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
62
|
+
}, []);
|
|
63
|
+
return { ...state, run };
|
|
64
|
+
}
|
|
65
|
+
return { useEffectQuery, useEffectFn };
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAuB,MAAM,QAAQ,CAAA;AACxE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAsChE,MAAM,UAAU,eAAe,CAAI,OAA8B;IAC/D,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAA;IAEpC,SAAS,cAAc,CACrB,OAAqC,EACrC,IAA4B;QAE5B,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAyB;YACzD,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,IAAI;YACX,OAAO,EAAE,IAAI;SACd,CAAC,CAAA;QACF,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;QACzC,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAA;QAClC,UAAU,CAAC,OAAO,GAAG,OAAO,CAAA;QAE5B,SAAS,CAAC,GAAG,EAAE;YACb,IAAI,SAAS,GAAG,KAAK,CAAA;YACrB,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;YAE7D,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAA;YAEnD,KAAK,CAAC,WAAW,CAAC,CAAC,IAAqB,EAAE,EAAE;gBAC1C,IAAI,SAAS;oBAAE,OAAM;gBACrB,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;oBACf,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;wBACnB,IAAI,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;4BACnC,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;4BACjD,OAAM;wBACR,CAAC;wBACD,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;wBAC1C,MAAM,KAAK,GACT,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAO,CAAA;wBACtE,OAAO,EAAE,CAAC,KAAK,CAAC,CAAA;wBAChB,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;oBACjD,CAAC;oBACD,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;iBACrE,CAAC,CAAA;YACJ,CAAC,CAAC,CAAA;YAEF,OAAO,GAAG,EAAE;gBACV,SAAS,GAAG,IAAI,CAAA;gBAChB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAA;YAC5C,CAAC,CAAA;YACD,uDAAuD;QACzD,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC,CAAA;QAEtB,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QAE/D,OAAO,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,CAAA;IAC9B,CAAC;IAED,SAAS,WAAW,CAClB,OAAkD;QAElD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAmB,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QACrF,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAA;QAClC,UAAU,CAAC,OAAO,GAAG,OAAO,CAAA;QAE5B,MAAM,GAAG,GAAG,WAAW,CAAC,KAAK,EAAE,GAAG,IAAU,EAAc,EAAE;YAC1D,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;YACxC,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;gBACnE,QAAQ,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;gBACzC,OAAO,KAAK,CAAA;YACd,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,KAAK,GAAG,KAAU,CAAA;gBACxB,OAAO,EAAE,CAAC,KAAK,CAAC,CAAA;gBAChB,QAAQ,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;gBAC1C,MAAM,KAAK,CAAA;YACb,CAAC;YACD,uDAAuD;QACzD,CAAC,EAAE,EAAE,CAAC,CAAA;QAEN,OAAO,EAAE,GAAG,KAAK,EAAE,GAAG,EAAE,CAAA;IAC1B,CAAC;IAED,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,CAAA;AACxC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAC5C,YAAY,EACV,WAAW,EACX,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,cAAc,GACf,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAS5C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA"}
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "effect-react-bridge",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Run Effect programs inside React: query and imperative hooks with fiber lifecycle management, plus a RemoteData view model. Domain-agnostic — no hypermedia, no Affordant coupling.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "Florian Leroy",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/Leroy-Florian/Affordant.git",
|
|
10
|
+
"directory": "packages/effect-react-bridge"
|
|
11
|
+
},
|
|
12
|
+
"homepage": "https://leroy-florian.github.io/Affordant/",
|
|
13
|
+
"bugs": "https://github.com/Leroy-Florian/Affordant/issues",
|
|
14
|
+
"keywords": [
|
|
15
|
+
"effect",
|
|
16
|
+
"react",
|
|
17
|
+
"hooks",
|
|
18
|
+
"fiber",
|
|
19
|
+
"remote-data"
|
|
20
|
+
],
|
|
21
|
+
"type": "module",
|
|
22
|
+
"sideEffects": false,
|
|
23
|
+
"main": "dist/index.js",
|
|
24
|
+
"types": "dist/index.d.ts",
|
|
25
|
+
"exports": {
|
|
26
|
+
".": {
|
|
27
|
+
"types": "./dist/index.d.ts",
|
|
28
|
+
"import": "./dist/index.js"
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"files": [
|
|
32
|
+
"dist"
|
|
33
|
+
],
|
|
34
|
+
"peerDependencies": {
|
|
35
|
+
"effect": "^3.21.0",
|
|
36
|
+
"react": ">=18"
|
|
37
|
+
},
|
|
38
|
+
"scripts": {
|
|
39
|
+
"build": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\" && tsc -p tsconfig.build.json",
|
|
40
|
+
"typecheck": "tsc -p tsconfig.json",
|
|
41
|
+
"test": "vitest run"
|
|
42
|
+
}
|
|
43
|
+
}
|