@e280/strata 0.3.0 → 0.3.1

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 CHANGED
@@ -339,12 +339,18 @@ note, the *items* that the tracker tracks can be any object, or symbol.. the tra
339
339
  import * as react from "react"
340
340
  import {react as strata} from "@e280/strata"
341
341
 
342
- export const {component, useStrata} = strata(react)
342
+ export const {
343
+ component,
344
+ useStrata,
345
+ useOnce,
346
+ useSignal,
347
+ useDerived,
348
+ } = strata(react)
343
349
  ```
344
350
 
345
351
  ### ⚛️ `component` enables fully automatic reactive re-rendering
346
352
  ```ts
347
- import {component, useStrata} from "./strata.js"
353
+ import {component} from "./strata.js"
348
354
 
349
355
  const $count = signal(0)
350
356
 
@@ -356,7 +362,7 @@ export const MyCounter = component(() => {
356
362
 
357
363
  ### ⚛️ `useStrata` for a manual hands-on approach (plays nicer with hmr)
358
364
  ```ts
359
- import {component, useStrata} from "./strata.js"
365
+ import {useStrata} from "./strata.js"
360
366
 
361
367
  const $count = signal(0)
362
368
 
@@ -367,6 +373,17 @@ export const MyCounter = () => {
367
373
  }
368
374
  ```
369
375
 
376
+ ### ⚛️ `useSignal` for local component state
377
+ ```ts
378
+ import {useSignal} from "./strata.js"
379
+
380
+ export const MyCounter = () => {
381
+ const $count = useSignal(0)
382
+ const add = () => $count.value++
383
+ return <button onClick={add}>{$count()}</button>
384
+ }
385
+ ```
386
+
370
387
 
371
388
 
372
389
  <br/><br/>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@e280/strata",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "description": "state management",
5
5
  "license": "MIT",
6
6
  "author": "Chase Moskal <chasemoskal@gmail.com>",
@@ -1,9 +1,15 @@
1
1
 
2
2
  import {tracker} from "../tracker.js"
3
+ import {signal} from "../../signals/signal/fn.js"
4
+ import {derived} from "../../signals/derived/fn.js"
5
+ import {SignalOptions} from "../../signals/types.js"
3
6
 
4
7
  export function react(react: {
5
- useState: <X>(x: X) => [value: X, set: (fn: (x: X) => void) => void]
6
- useEffect: (fn: () => void) => void
8
+ useEffect: (fn: () => void | (() => void), deps?: unknown[]) => void
9
+ useState: <X>(x: X | (() => X)) => [
10
+ value: X,
11
+ set: (value: X | ((x: X) => X)) => void
12
+ ]
7
13
  }) {
8
14
 
9
15
  const useStrata = <X>(fn: () => X) => {
@@ -20,23 +26,28 @@ export function react(react: {
20
26
  }
21
27
 
22
28
  const component = <P extends object, R>(render: (props: P) => R) => {
23
- function c(props: P) {
24
- const [, setTick] = react.useState(0)
25
- const {seen, result} = tracker.observe(() => render(props))
29
+ const c = (props: P) => useStrata(() => render(props))
30
+ c.displayName = (render as any).displayName ?? render.name ?? "Component"
31
+ return c
32
+ }
26
33
 
27
- react.useEffect(() => {
28
- const rerender = async() => setTick(tick => tick + 1)
29
- const stoppers = [...seen].map(item => tracker.subscribe(item, rerender))
30
- return () => stoppers.forEach(stop => stop())
31
- })
34
+ const useOnce = <X>(fn: () => X) => {
35
+ const [value] = react.useState(fn)
36
+ return value
37
+ }
32
38
 
33
- return result
34
- }
39
+ const useSignal = <X>(value: X, options?: Partial<SignalOptions>) => {
40
+ const $signal = useOnce(() => signal(value, options))
41
+ void useStrata(() => $signal())
42
+ return $signal
43
+ }
35
44
 
36
- c.displayName = (render as any).displayName ?? render.name ?? "Component"
37
- return c
45
+ const useDerived = <X>(formula: () => X, options?: Partial<SignalOptions>) => {
46
+ const $derived = useOnce(() => derived(formula, options))
47
+ void useStrata(() => $derived())
48
+ return $derived
38
49
  }
39
50
 
40
- return {component, useStrata}
51
+ return {component, useStrata, useOnce, useSignal, useDerived}
41
52
  }
42
53
 
@@ -1,10 +1,17 @@
1
+ import { SignalOptions } from "../../signals/types.js";
1
2
  export declare function react(react: {
2
- useState: <X>(x: X) => [value: X, set: (fn: (x: X) => void) => void];
3
- useEffect: (fn: () => void) => void;
3
+ useEffect: (fn: () => void | (() => void), deps?: unknown[]) => void;
4
+ useState: <X>(x: X | (() => X)) => [
5
+ value: X,
6
+ set: (value: X | ((x: X) => X)) => void
7
+ ];
4
8
  }): {
5
9
  component: <P extends object, R>(render: (props: P) => R) => {
6
10
  (props: P): R;
7
11
  displayName: any;
8
12
  };
9
13
  useStrata: <X>(fn: () => X) => X;
14
+ useOnce: <X>(fn: () => X) => X;
15
+ useSignal: <X>(value: X, options?: Partial<SignalOptions>) => import("../../index.js").Signal<X>;
16
+ useDerived: <X>(formula: () => X, options?: Partial<SignalOptions>) => import("../../index.js").Derived<X>;
10
17
  };
@@ -1,4 +1,6 @@
1
1
  import { tracker } from "../tracker.js";
2
+ import { signal } from "../../signals/signal/fn.js";
3
+ import { derived } from "../../signals/derived/fn.js";
2
4
  export function react(react) {
3
5
  const useStrata = (fn) => {
4
6
  const [, setTick] = react.useState(0);
@@ -11,19 +13,24 @@ export function react(react) {
11
13
  return result;
12
14
  };
13
15
  const component = (render) => {
14
- function c(props) {
15
- const [, setTick] = react.useState(0);
16
- const { seen, result } = tracker.observe(() => render(props));
17
- react.useEffect(() => {
18
- const rerender = async () => setTick(tick => tick + 1);
19
- const stoppers = [...seen].map(item => tracker.subscribe(item, rerender));
20
- return () => stoppers.forEach(stop => stop());
21
- });
22
- return result;
23
- }
16
+ const c = (props) => useStrata(() => render(props));
24
17
  c.displayName = render.displayName ?? render.name ?? "Component";
25
18
  return c;
26
19
  };
27
- return { component, useStrata };
20
+ const useOnce = (fn) => {
21
+ const [value] = react.useState(fn);
22
+ return value;
23
+ };
24
+ const useSignal = (value, options) => {
25
+ const $signal = useOnce(() => signal(value, options));
26
+ void useStrata(() => $signal());
27
+ return $signal;
28
+ };
29
+ const useDerived = (formula, options) => {
30
+ const $derived = useOnce(() => derived(formula, options));
31
+ void useStrata(() => $derived());
32
+ return $derived;
33
+ };
34
+ return { component, useStrata, useOnce, useSignal, useDerived };
28
35
  }
29
36
  //# sourceMappingURL=react.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"react.js","sourceRoot":"","sources":["../../../s/tracker/bindings/react.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,OAAO,EAAC,MAAM,eAAe,CAAA;AAErC,MAAM,UAAU,KAAK,CAAC,KAGpB;IAED,MAAM,SAAS,GAAG,CAAI,EAAW,EAAE,EAAE;QACpC,MAAM,CAAC,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;QACrC,MAAM,EAAC,IAAI,EAAE,MAAM,EAAC,GAAG,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAE1C,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;YACpB,MAAM,QAAQ,GAAG,KAAK,IAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAA;YACrD,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAA;YACzE,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAA;QAC9C,CAAC,CAAC,CAAA;QAEF,OAAO,MAAM,CAAA;IACd,CAAC,CAAA;IAED,MAAM,SAAS,GAAG,CAAsB,MAAuB,EAAE,EAAE;QAClE,SAAS,CAAC,CAAC,KAAQ;YAClB,MAAM,CAAC,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YACrC,MAAM,EAAC,IAAI,EAAE,MAAM,EAAC,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;YAE3D,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;gBACpB,MAAM,QAAQ,GAAG,KAAK,IAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAA;gBACrD,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAA;gBACzE,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAA;YAC9C,CAAC,CAAC,CAAA;YAEF,OAAO,MAAM,CAAA;QACd,CAAC;QAED,CAAC,CAAC,WAAW,GAAI,MAAc,CAAC,WAAW,IAAI,MAAM,CAAC,IAAI,IAAI,WAAW,CAAA;QACzE,OAAO,CAAC,CAAA;IACT,CAAC,CAAA;IAED,OAAO,EAAC,SAAS,EAAE,SAAS,EAAC,CAAA;AAC9B,CAAC"}
1
+ {"version":3,"file":"react.js","sourceRoot":"","sources":["../../../s/tracker/bindings/react.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,OAAO,EAAC,MAAM,eAAe,CAAA;AACrC,OAAO,EAAC,MAAM,EAAC,MAAM,4BAA4B,CAAA;AACjD,OAAO,EAAC,OAAO,EAAC,MAAM,6BAA6B,CAAA;AAGnD,MAAM,UAAU,KAAK,CAAC,KAMpB;IAED,MAAM,SAAS,GAAG,CAAI,EAAW,EAAE,EAAE;QACpC,MAAM,CAAC,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;QACrC,MAAM,EAAC,IAAI,EAAE,MAAM,EAAC,GAAG,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAE1C,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;YACpB,MAAM,QAAQ,GAAG,KAAK,IAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAA;YACrD,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAA;YACzE,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAA;QAC9C,CAAC,CAAC,CAAA;QAEF,OAAO,MAAM,CAAA;IACd,CAAC,CAAA;IAED,MAAM,SAAS,GAAG,CAAsB,MAAuB,EAAE,EAAE;QAClE,MAAM,CAAC,GAAG,CAAC,KAAQ,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;QACtD,CAAC,CAAC,WAAW,GAAI,MAAc,CAAC,WAAW,IAAI,MAAM,CAAC,IAAI,IAAI,WAAW,CAAA;QACzE,OAAO,CAAC,CAAA;IACT,CAAC,CAAA;IAED,MAAM,OAAO,GAAG,CAAI,EAAW,EAAE,EAAE;QAClC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;QAClC,OAAO,KAAK,CAAA;IACb,CAAC,CAAA;IAED,MAAM,SAAS,GAAG,CAAI,KAAQ,EAAE,OAAgC,EAAE,EAAE;QACnE,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAA;QACrD,KAAK,SAAS,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAA;QAC/B,OAAO,OAAO,CAAA;IACf,CAAC,CAAA;IAED,MAAM,UAAU,GAAG,CAAI,OAAgB,EAAE,OAAgC,EAAE,EAAE;QAC5E,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAA;QACzD,KAAK,SAAS,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAA;QAChC,OAAO,QAAQ,CAAA;IAChB,CAAC,CAAA;IAED,OAAO,EAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAC,CAAA;AAC9D,CAAC"}