use-effect-ts 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -2
- package/dist/use-component-lifecycle.d.ts +5 -0
- package/dist/use-component-lifecycle.d.ts.map +1 -0
- package/dist/use-component-lifecycle.js +17 -0
- package/dist/use-component-scope.d.ts +3 -0
- package/dist/use-component-scope.d.ts.map +1 -0
- package/dist/use-component-scope.js +14 -0
- package/dist/use-live-ref.d.ts +4 -0
- package/dist/use-live-ref.d.ts.map +1 -0
- package/dist/use-live-ref.js +6 -0
- package/dist/use-run-effect-latest.d.ts +3 -0
- package/dist/use-run-effect-latest.d.ts.map +1 -0
- package/dist/use-run-effect-latest.js +16 -0
- package/dist/use-run-effect-queue.d.ts +3 -0
- package/dist/use-run-effect-queue.d.ts.map +1 -0
- package/dist/use-run-effect-queue.js +29 -0
- package/dist/use-run-effect.d.ts +3 -0
- package/dist/use-run-effect.d.ts.map +1 -0
- package/dist/use-run-effect.js +16 -0
- package/package.json +5 -4
- package/src/index.ts +6 -1
- package/src/use-component-lifecycle.ts +29 -0
- package/src/use-component-scope.ts +20 -0
- package/src/use-live-ref.ts +8 -0
- package/src/use-run-effect-latest.ts +27 -0
- package/src/use-run-effect-queue.ts +40 -0
- package/src/use-run-effect.ts +23 -0
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,7 @@
|
|
|
1
|
-
export {};
|
|
1
|
+
export { useComponentLifecycle } from "./use-component-lifecycle.js";
|
|
2
|
+
export { useRunEffect } from "./use-run-effect.js";
|
|
3
|
+
export { useRunEffectLatest } from "./use-run-effect-latest.js";
|
|
4
|
+
export { useRunEffectQueue } from "./use-run-effect-queue.js";
|
|
5
|
+
export { useComponentScope } from "./use-component-scope.js";
|
|
6
|
+
export { useLiveRef } from "./use-live-ref.js";
|
|
2
7
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
export {};
|
|
1
|
+
export { useComponentLifecycle } from "./use-component-lifecycle.js";
|
|
2
|
+
export { useRunEffect } from "./use-run-effect.js";
|
|
3
|
+
export { useRunEffectLatest } from "./use-run-effect-latest.js";
|
|
4
|
+
export { useRunEffectQueue } from "./use-run-effect-queue.js";
|
|
5
|
+
export { useComponentScope } from "./use-component-scope.js";
|
|
6
|
+
export { useLiveRef } from "./use-live-ref.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-component-lifecycle.d.ts","sourceRoot":"","sources":["../src/use-component-lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAS,KAAK,EAAE,MAAM,QAAQ,CAAC;AAI9C,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,EACpD,EACE,IAAS,GACV,GAAE;IACD,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;CACb,QAkBP"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Effect, Fiber, Scope } from "effect";
|
|
2
|
+
import { useEffect } from "react";
|
|
3
|
+
import { useLiveRef } from "./use-live-ref.js";
|
|
4
|
+
export function useComponentLifecycle(effect, { deps = [], } = {}) {
|
|
5
|
+
const effectRef = useLiveRef(effect);
|
|
6
|
+
useEffect(() => {
|
|
7
|
+
const scope = Effect.runSync(Scope.make());
|
|
8
|
+
const fiber = Effect.runFork(effectRef.current.pipe(Scope.extend(scope)));
|
|
9
|
+
return () => {
|
|
10
|
+
Effect.runFork(Effect.gen(function* () {
|
|
11
|
+
const exit = yield* Fiber.interrupt(fiber);
|
|
12
|
+
yield* Scope.close(scope, exit);
|
|
13
|
+
}));
|
|
14
|
+
void Effect.runPromise(Fiber.interrupt(fiber));
|
|
15
|
+
};
|
|
16
|
+
}, [effectRef, ...deps]);
|
|
17
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-component-scope.d.ts","sourceRoot":"","sources":["../src/use-component-scope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,EAAE,MAAM,QAAQ,CAAC;AAG7C,wBAAgB,iBAAiB,CAC/B,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,KAAK,IAAI,GAC5C,KAAK,CAAC,cAAc,GAAG,SAAS,CAclC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Effect, Exit, Scope } from "effect";
|
|
2
|
+
import { useEffect, useState } from "react";
|
|
3
|
+
export function useComponentScope(setup) {
|
|
4
|
+
const [scope, setScope] = useState();
|
|
5
|
+
useEffect(() => {
|
|
6
|
+
const s = Effect.runSync(Scope.make());
|
|
7
|
+
setScope(s);
|
|
8
|
+
setup?.(s);
|
|
9
|
+
return () => {
|
|
10
|
+
void Effect.runPromise(Scope.close(s, Exit.void));
|
|
11
|
+
};
|
|
12
|
+
}, []);
|
|
13
|
+
return scope;
|
|
14
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-live-ref.d.ts","sourceRoot":"","sources":["../src/use-live-ref.ts"],"names":[],"mappings":"AAEA,wBAAgB,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG;IAAE,OAAO,EAAE,CAAC,CAAA;CAAE,CAKtD"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
export declare function useRunEffectLatest<Args extends any[], A, E>(fn: (...args: Args) => Effect.Effect<A, E, never>): (...args: Args) => void | Promise<import("effect/Exit").Exit<import("effect/Fiber").RuntimeFiber<A, E>, never>>;
|
|
3
|
+
//# sourceMappingURL=use-run-effect-latest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-run-effect-latest.d.ts","sourceRoot":"","sources":["../src/use-run-effect-latest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAsB,MAAM,QAAQ,CAAC;AAIpD,wBAAgB,kBAAkB,CAAC,IAAI,SAAS,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EACzD,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,IAYzC,GAAG,MAAM,IAAI,kGAStB"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Effect, FiberHandle, Scope } from "effect";
|
|
2
|
+
import { useComponentScope } from "./use-component-scope.js";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
export function useRunEffectLatest(fn) {
|
|
5
|
+
const [fiberHandle, setFiberHandle] = useState(null);
|
|
6
|
+
useComponentScope((scope) => {
|
|
7
|
+
const fiberHandle = Effect.runSync(FiberHandle.make().pipe(Scope.extend(scope)));
|
|
8
|
+
setFiberHandle(fiberHandle);
|
|
9
|
+
});
|
|
10
|
+
return (...args) => {
|
|
11
|
+
if (!fiberHandle) {
|
|
12
|
+
return console.error("useRunEffectLatest: No scope available, effect will not run.");
|
|
13
|
+
}
|
|
14
|
+
return Effect.runPromiseExit(FiberHandle.run(fiberHandle, fn(...args)));
|
|
15
|
+
};
|
|
16
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-run-effect-queue.d.ts","sourceRoot":"","sources":["../src/use-run-effect-queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAA6B,MAAM,QAAQ,CAAC;AAI3D,wBAAgB,iBAAiB,CAAC,IAAI,SAAS,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EACxD,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,IA8BzC,GAAG,MAAM,IAAI,UAItB"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Effect, Fiber, FiberHandle, Scope } from "effect";
|
|
2
|
+
import { useComponentScope } from "./use-component-scope.js";
|
|
3
|
+
import { useEffect, useRef } from "react";
|
|
4
|
+
export function useRunEffectQueue(fn) {
|
|
5
|
+
const queue = useRef([]);
|
|
6
|
+
const scope = useComponentScope();
|
|
7
|
+
const isExecuting = useRef(false);
|
|
8
|
+
const runFromQueue = () => {
|
|
9
|
+
const [first, ...rest] = queue.current;
|
|
10
|
+
if (!scope || !first || isExecuting.current) {
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
queue.current = rest;
|
|
14
|
+
isExecuting.current = true;
|
|
15
|
+
Effect.runPromiseExit(Effect.gen(function* () {
|
|
16
|
+
const fiberHandle = yield* FiberHandle.make().pipe(Scope.extend(scope));
|
|
17
|
+
const fiber = yield* FiberHandle.run(fiberHandle)(fn(...first));
|
|
18
|
+
yield* Fiber.join(fiber);
|
|
19
|
+
})).finally(() => {
|
|
20
|
+
isExecuting.current = false;
|
|
21
|
+
runFromQueue();
|
|
22
|
+
});
|
|
23
|
+
};
|
|
24
|
+
useEffect(runFromQueue, [scope]);
|
|
25
|
+
return (...args) => {
|
|
26
|
+
queue.current.push(args);
|
|
27
|
+
runFromQueue();
|
|
28
|
+
};
|
|
29
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
export declare function useRunEffect<Args extends any[], A, E>(fn: (...args: Args) => Effect.Effect<A, E, never>): (...args: Args) => void | Promise<import("effect/Exit").Exit<import("effect/Fiber").RuntimeFiber<A, E>, never>>;
|
|
3
|
+
//# sourceMappingURL=use-run-effect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-run-effect.d.ts","sourceRoot":"","sources":["../src/use-run-effect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAmB,MAAM,QAAQ,CAAC;AAIjD,wBAAgB,YAAY,CAAC,IAAI,SAAS,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EACnD,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,IAQzC,GAAG,MAAM,IAAI,kGAStB"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Effect, FiberSet, Scope } from "effect";
|
|
2
|
+
import { useComponentScope } from "./use-component-scope.js";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
export function useRunEffect(fn) {
|
|
5
|
+
const [fiberSet, setFiberSet] = useState(null);
|
|
6
|
+
useComponentScope((scope) => {
|
|
7
|
+
const fiberSet = Effect.runSync(FiberSet.make().pipe(Scope.extend(scope)));
|
|
8
|
+
setFiberSet(fiberSet);
|
|
9
|
+
});
|
|
10
|
+
return (...args) => {
|
|
11
|
+
if (!fiberSet) {
|
|
12
|
+
return console.error("useRunEffect: No scope available, effect will not run.");
|
|
13
|
+
}
|
|
14
|
+
return Effect.runPromiseExit(FiberSet.run(fiberSet, fn(...args)));
|
|
15
|
+
};
|
|
16
|
+
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "use-effect-ts",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.2",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dist/index.js",
|
|
7
7
|
"./*": "./dist/*"
|
|
@@ -12,14 +12,15 @@
|
|
|
12
12
|
"README.md",
|
|
13
13
|
"LICENCE"
|
|
14
14
|
],
|
|
15
|
-
"dependencies": {
|
|
16
|
-
"effect": "3.16.9"
|
|
17
|
-
},
|
|
18
15
|
"devDependencies": {
|
|
19
16
|
"@tsconfig/node22": "22.0.2",
|
|
17
|
+
"@types/react": "^19.1.8",
|
|
18
|
+
"effect": "3.16.12",
|
|
19
|
+
"react": "19.1.0",
|
|
20
20
|
"typescript": "5.8.3"
|
|
21
21
|
},
|
|
22
22
|
"peerDependencies": {
|
|
23
|
+
"effect": ">=3.0.0",
|
|
23
24
|
"react": ">=18.0.0"
|
|
24
25
|
},
|
|
25
26
|
"scripts": {
|
package/src/index.ts
CHANGED
|
@@ -1 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
export { useComponentLifecycle } from "./use-component-lifecycle.js";
|
|
2
|
+
export { useRunEffect } from "./use-run-effect.js";
|
|
3
|
+
export { useRunEffectLatest } from "./use-run-effect-latest.js";
|
|
4
|
+
export { useRunEffectQueue } from "./use-run-effect-queue.js";
|
|
5
|
+
export { useComponentScope } from "./use-component-scope.js";
|
|
6
|
+
export { useLiveRef } from "./use-live-ref.js";
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Effect, Fiber, Scope } from "effect";
|
|
2
|
+
import { useEffect } from "react";
|
|
3
|
+
import { useLiveRef } from "./use-live-ref.js";
|
|
4
|
+
|
|
5
|
+
export function useComponentLifecycle(
|
|
6
|
+
effect: Effect.Effect<unknown, unknown, Scope.Scope>,
|
|
7
|
+
{
|
|
8
|
+
deps = [],
|
|
9
|
+
}: {
|
|
10
|
+
deps?: unknown[];
|
|
11
|
+
} = {},
|
|
12
|
+
) {
|
|
13
|
+
const effectRef = useLiveRef(effect);
|
|
14
|
+
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
const scope = Effect.runSync(Scope.make());
|
|
17
|
+
const fiber = Effect.runFork(effectRef.current.pipe(Scope.extend(scope)));
|
|
18
|
+
|
|
19
|
+
return () => {
|
|
20
|
+
Effect.runFork(
|
|
21
|
+
Effect.gen(function* () {
|
|
22
|
+
const exit = yield* Fiber.interrupt(fiber);
|
|
23
|
+
yield* Scope.close(scope, exit);
|
|
24
|
+
}),
|
|
25
|
+
);
|
|
26
|
+
void Effect.runPromise(Fiber.interrupt(fiber));
|
|
27
|
+
};
|
|
28
|
+
}, [effectRef, ...deps]);
|
|
29
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Effect, Exit, Scope } from "effect";
|
|
2
|
+
import { useEffect, useState } from "react";
|
|
3
|
+
|
|
4
|
+
export function useComponentScope(
|
|
5
|
+
setup?: (scope: Scope.CloseableScope) => void,
|
|
6
|
+
): Scope.CloseableScope | undefined {
|
|
7
|
+
const [scope, setScope] = useState<Scope.CloseableScope>();
|
|
8
|
+
|
|
9
|
+
useEffect(() => {
|
|
10
|
+
const s = Effect.runSync(Scope.make());
|
|
11
|
+
setScope(s);
|
|
12
|
+
setup?.(s);
|
|
13
|
+
|
|
14
|
+
return () => {
|
|
15
|
+
void Effect.runPromise(Scope.close(s, Exit.void));
|
|
16
|
+
};
|
|
17
|
+
}, []);
|
|
18
|
+
|
|
19
|
+
return scope;
|
|
20
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Effect, FiberHandle, Scope } from "effect";
|
|
2
|
+
import { useComponentScope } from "./use-component-scope.js";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
|
|
5
|
+
export function useRunEffectLatest<Args extends any[], A, E>(
|
|
6
|
+
fn: (...args: Args) => Effect.Effect<A, E, never>,
|
|
7
|
+
) {
|
|
8
|
+
const [fiberHandle, setFiberHandle] =
|
|
9
|
+
useState<FiberHandle.FiberHandle | null>(null);
|
|
10
|
+
|
|
11
|
+
useComponentScope((scope) => {
|
|
12
|
+
const fiberHandle = Effect.runSync(
|
|
13
|
+
FiberHandle.make().pipe(Scope.extend(scope)),
|
|
14
|
+
);
|
|
15
|
+
setFiberHandle(fiberHandle);
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
return (...args: Args) => {
|
|
19
|
+
if (!fiberHandle) {
|
|
20
|
+
return console.error(
|
|
21
|
+
"useRunEffectLatest: No scope available, effect will not run.",
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
return Effect.runPromiseExit(FiberHandle.run(fiberHandle, fn(...args)));
|
|
26
|
+
};
|
|
27
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Effect, Fiber, FiberHandle, Scope } from "effect";
|
|
2
|
+
import { useComponentScope } from "./use-component-scope.js";
|
|
3
|
+
import { useEffect, useRef } from "react";
|
|
4
|
+
|
|
5
|
+
export function useRunEffectQueue<Args extends any[], A, E>(
|
|
6
|
+
fn: (...args: Args) => Effect.Effect<A, E, never>,
|
|
7
|
+
) {
|
|
8
|
+
const queue = useRef<Args[]>([]);
|
|
9
|
+
const scope = useComponentScope();
|
|
10
|
+
|
|
11
|
+
const isExecuting = useRef(false);
|
|
12
|
+
const runFromQueue = () => {
|
|
13
|
+
const [first, ...rest] = queue.current;
|
|
14
|
+
if (!scope || !first || isExecuting.current) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
queue.current = rest;
|
|
19
|
+
isExecuting.current = true;
|
|
20
|
+
Effect.runPromiseExit(
|
|
21
|
+
Effect.gen(function* () {
|
|
22
|
+
const fiberHandle = yield* FiberHandle.make().pipe(Scope.extend(scope));
|
|
23
|
+
|
|
24
|
+
const fiber = yield* FiberHandle.run(fiberHandle)(fn(...first));
|
|
25
|
+
|
|
26
|
+
yield* Fiber.join(fiber);
|
|
27
|
+
}),
|
|
28
|
+
).finally(() => {
|
|
29
|
+
isExecuting.current = false;
|
|
30
|
+
runFromQueue();
|
|
31
|
+
});
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
useEffect(runFromQueue, [scope]);
|
|
35
|
+
|
|
36
|
+
return (...args: Args) => {
|
|
37
|
+
queue.current.push(args);
|
|
38
|
+
runFromQueue();
|
|
39
|
+
};
|
|
40
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Effect, FiberSet, Scope } from "effect";
|
|
2
|
+
import { useComponentScope } from "./use-component-scope.js";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
|
|
5
|
+
export function useRunEffect<Args extends any[], A, E>(
|
|
6
|
+
fn: (...args: Args) => Effect.Effect<A, E, never>,
|
|
7
|
+
) {
|
|
8
|
+
const [fiberSet, setFiberSet] = useState<FiberSet.FiberSet | null>(null);
|
|
9
|
+
useComponentScope((scope) => {
|
|
10
|
+
const fiberSet = Effect.runSync(FiberSet.make().pipe(Scope.extend(scope)));
|
|
11
|
+
setFiberSet(fiberSet);
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
return (...args: Args) => {
|
|
15
|
+
if (!fiberSet) {
|
|
16
|
+
return console.error(
|
|
17
|
+
"useRunEffect: No scope available, effect will not run.",
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
return Effect.runPromiseExit(FiberSet.run(fiberSet, fn(...args)));
|
|
22
|
+
};
|
|
23
|
+
}
|