solid-js 1.3.0-rc.2 → 1.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.
@@ -1,4 +1,4 @@
1
1
  export { createStore, unwrap, $RAW } from "./store";
2
- export type { Store, SetStoreFunction, NotWrappable, StoreNode, StoreSetter, StorePathRange, ArrayFilterFn, Part, Next, Readonly, DeepReadonly } from "./store";
2
+ export type { Store, SetStoreFunction, NotWrappable, StoreNode, StoreSetter, StorePathRange, ArrayFilterFn, Part, Next, WrappableNext, DeepReadonly } from "./store";
3
3
  export * from "./mutable";
4
4
  export * from "./modifiers";
@@ -1,7 +1,7 @@
1
- import { Store, NotWrappable, DeepReadonly } from "./store";
1
+ import { Store } from "./store";
2
2
  export declare type ReconcileOptions = {
3
3
  key?: string | null;
4
4
  merge?: boolean;
5
5
  };
6
- export declare function reconcile<T>(value: T | Store<T>, options?: ReconcileOptions): (state: T extends NotWrappable ? T : Store<DeepReadonly<T>>) => T extends NotWrappable ? T : Store<T>;
7
- export declare function produce<T>(fn: (state: T) => void): (state: T extends NotWrappable ? T : Store<DeepReadonly<T>>) => T extends NotWrappable ? T : Store<T>;
6
+ export declare function reconcile<T>(value: T, options?: ReconcileOptions): (state: unknown) => Store<T>;
7
+ export declare function produce<T>(fn: (state: T) => void): (state: Store<T>) => Store<T>;
@@ -1,4 +1,4 @@
1
- import { StoreNode, Store } from "./store";
2
- export declare function createMutable<T extends StoreNode>(state: T | Store<T>, options?: {
1
+ import { StoreNode } from "./store";
2
+ export declare function createMutable<T extends StoreNode>(state: T, options?: {
3
3
  name?: string;
4
- }): Store<T>;
4
+ }): T;
@@ -1,50 +1,15 @@
1
+ import { SetStoreFunction, Store } from "store";
1
2
  export declare const $RAW: unique symbol;
2
- declare type AddSymbolToPrimitive<T> = T extends {
3
- [Symbol.toPrimitive]: infer V;
4
- } ? {
5
- [Symbol.toPrimitive]: V;
6
- } : {};
7
- declare type AddCallable<T> = T extends {
8
- (...x: any[]): infer V;
9
- } ? {
10
- (...x: Parameters<T>): V;
11
- } : {};
12
- declare type NotWrappable = string | number | boolean | Function | null;
13
- export declare type Store<T> = {
14
- [P in keyof T]: T[P] extends object ? Store<T[P]> : T[P];
15
- } & {
16
- [$RAW]?: T;
17
- } & AddSymbolToPrimitive<T> & AddCallable<T>;
18
3
  export declare function isWrappable(obj: any): boolean;
19
4
  export declare function unwrap<T>(item: any): T;
20
5
  export declare function setProperty(state: any, property: string | number, value: any, force?: boolean): void;
21
6
  export declare function updatePath(current: any, path: any[], traversed?: (number | string)[]): void;
22
- declare type StoreSetter<T> = Partial<T> | ((prevState: T extends NotWrappable ? T : Store<T>, traversed?: (string | number)[]) => Partial<T> | void);
23
- declare type StorePathRange = {
24
- from?: number;
25
- to?: number;
26
- by?: number;
27
- };
28
- declare type ArrayFilterFn<T> = (item: T extends any[] ? T[number] : never, index: number) => boolean;
29
- declare type Part<T> = keyof T | Array<keyof T> | StorePathRange | ArrayFilterFn<T>;
30
- declare type Next<T, K> = K extends keyof T ? T[K] : K extends Array<keyof T> ? T[K[number]] : T extends any[] ? K extends StorePathRange ? T[number] : K extends ArrayFilterFn<T> ? T[number] : never : never;
31
- export interface SetStoreFunction<T> {
32
- <Setter extends StoreSetter<T>>(...args: [Setter]): void;
33
- <K1 extends Part<T>, Setter extends StoreSetter<Next<T, K1>>>(...args: [K1, Setter]): void;
34
- <K1 extends Part<T>, K2 extends Part<Next<T, K1>>, Setter extends StoreSetter<Next<Next<T, K1>, K2>>>(...args: [K1, K2, Setter]): void;
35
- <K1 extends Part<T>, K2 extends Part<Next<T, K1>>, K3 extends Part<Next<Next<T, K1>, K2>>, Setter extends StoreSetter<Next<Next<Next<T, K1>, K2>, K3>>>(...args: [K1, K2, K3, Setter]): void;
36
- <K1 extends Part<T>, K2 extends Part<Next<T, K1>>, K3 extends Part<Next<Next<T, K1>, K2>>, K4 extends Part<Next<Next<Next<T, K1>, K2>, K3>>, Setter extends StoreSetter<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>>>(...args: [K1, K2, K3, K4, Setter]): void;
37
- <K1 extends Part<T>, K2 extends Part<Next<T, K1>>, K3 extends Part<Next<Next<T, K1>, K2>>, K4 extends Part<Next<Next<Next<T, K1>, K2>, K3>>, K5 extends Part<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>>, Setter extends StoreSetter<Next<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>>>(...args: [K1, K2, K3, K4, K5, Setter]): void;
38
- <K1 extends Part<T>, K2 extends Part<Next<T, K1>>, K3 extends Part<Next<Next<T, K1>, K2>>, K4 extends Part<Next<Next<Next<T, K1>, K2>, K3>>, K5 extends Part<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>>, K6 extends Part<Next<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>>, Setter extends StoreSetter<Next<Next<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>, K6>>>(...args: [K1, K2, K3, K4, K5, K6, Setter]): void;
39
- <K1 extends Part<T>, K2 extends Part<Next<T, K1>>, K3 extends Part<Next<Next<T, K1>, K2>>, K4 extends Part<Next<Next<Next<T, K1>, K2>, K3>>, K5 extends Part<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>>, K6 extends Part<Next<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>>, K7 extends Part<Next<Next<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>, K6>>, Setter extends StoreSetter<Next<Next<Next<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>, K6>, K7>>>(...args: [K1, K2, K3, K4, K5, K6, K7, Setter]): void;
40
- <K1 extends Part<T>, K2 extends Part<Next<T, K1>>, K3 extends Part<Next<Next<T, K1>, K2>>, K4 extends Part<Next<Next<Next<T, K1>, K2>, K3>>, K5 extends Part<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>>, K6 extends Part<Next<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>>, K7 extends Part<Next<Next<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>, K6>>, K8 extends Part<Next<Next<Next<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>, K6>, K7>>>(...args: [K1, K2, K3, K4, K5, K6, K7, K8, ...(Part<any> | StoreSetter<any>)[]]): void;
41
- }
42
7
  export declare function createStore<T>(state: T | Store<T>): [Store<T>, SetStoreFunction<T>];
43
8
  export declare function createMutable<T>(state: T | Store<T>): Store<T>;
44
9
  declare type ReconcileOptions = {
45
10
  key?: string | null;
46
11
  merge?: boolean;
47
12
  };
48
- export declare function reconcile<T>(value: T | Store<T>, options?: ReconcileOptions): (state: T extends NotWrappable ? T : Store<T>) => void;
49
- export declare function produce<T>(fn: (state: T) => void): (state: T extends NotWrappable ? T : Store<T>) => T extends NotWrappable ? T : Store<T>;
13
+ export declare function reconcile<T>(value: T | Store<T>, options?: ReconcileOptions): (state: Store<T>) => void;
14
+ export declare function produce<T>(fn: (state: T) => void): (state: Store<T>) => Store<T>;
50
15
  export {};
@@ -1,72 +1,44 @@
1
- import { $PROXY, Accessor } from "../..";
1
+ import { Accessor } from "../..";
2
2
  export declare const $RAW: unique symbol, $NODE: unique symbol, $NAME: unique symbol;
3
- export declare type StoreNode = {
4
- [$NODE]?: any;
5
- [$PROXY]?: any;
6
- [$NAME]?: string;
7
- [k: string]: any;
8
- [k: number]: any;
9
- };
10
- declare type AddSymbolToPrimitive<T> = T extends {
11
- [Symbol.toPrimitive]: infer V;
12
- } ? {
13
- [Symbol.toPrimitive]: V;
14
- } : {};
15
- declare type AddSymbolIterator<T> = T extends {
16
- [Symbol.iterator]: infer V;
17
- } ? {
18
- [Symbol.iterator]: V;
19
- } : {};
20
- declare type AddSymbolToStringTag<T> = T extends {
21
- [Symbol.toStringTag]: infer V;
22
- } ? {
23
- [Symbol.toStringTag]: V;
24
- } : {};
25
- declare type AddCallable<T> = T extends {
26
- (...x: any[]): infer V;
27
- } ? {
28
- (...x: Parameters<T>): V;
29
- } : {};
30
- export declare type NotWrappable = string | number | boolean | Function | null;
31
- export declare type Store<T> = {
32
- [P in keyof T]: T[P] extends object ? Store<T[P]> & T[P] : T[P];
33
- } & {
34
- [$RAW]?: T;
35
- } & AddSymbolToPrimitive<T> & AddSymbolIterator<T> & AddSymbolToStringTag<T> & AddCallable<T>;
3
+ export declare type StoreNode = Record<keyof any, any>;
4
+ export declare type NotWrappable = string | number | bigint | symbol | boolean | Function | null | undefined;
5
+ export declare type Store<T> = DeepReadonly<T>;
36
6
  export declare function isWrappable(obj: any): any;
37
7
  export declare function unwrap<T extends StoreNode>(item: any, set?: Set<unknown>): T;
38
8
  export declare function getDataNodes(target: StoreNode): any;
39
- export declare function proxyDescriptor(target: StoreNode, property: string | number | symbol): PropertyDescriptor | undefined;
9
+ export declare function proxyDescriptor(target: StoreNode, property: keyof any): PropertyDescriptor | undefined;
40
10
  export declare function ownKeys(target: StoreNode): (string | symbol)[];
41
11
  export declare function createDataNode(): Accessor<void> & {
42
12
  $: () => void;
43
13
  };
44
- export declare function setProperty(state: StoreNode, property: string | number, value: any): void;
45
- export declare function updatePath(current: StoreNode, path: any[], traversed?: (number | string)[]): void;
46
- export declare type Readonly<T> = {
47
- readonly [K in keyof T]: DeepReadonly<T[K]>;
14
+ export declare function setProperty(state: StoreNode, property: keyof any, value: any): void;
15
+ export declare function updatePath(current: StoreNode, path: any[], traversed?: (keyof any)[]): void;
16
+ export declare type DeepReadonly<T> = {
17
+ readonly [K in keyof T]: T[K] extends NotWrappable ? T[K] : DeepReadonly<T[K]>;
48
18
  };
49
- export declare type DeepReadonly<T> = T extends [infer A] ? Readonly<[A]> : T extends [infer A, infer B] ? Readonly<[A, B]> : T extends [infer A, infer B, infer C] ? Readonly<[A, B, C]> : T extends [infer A, infer B, infer C, infer D] ? Readonly<[A, B, C, D]> : T extends [infer A, infer B, infer C, infer D, infer E] ? Readonly<[A, B, C, D, E]> : T extends [infer A, infer B, infer C, infer D, infer E, infer F] ? Readonly<[A, B, C, D, E, F]> : T extends [infer A, infer B, infer C, infer D, infer E, infer F, infer G] ? Readonly<[A, B, C, D, E, F, G]> : T extends [infer A, infer B, infer C, infer D, infer E, infer F, infer G, infer H] ? Readonly<[A, B, C, D, E, F, G, H]> : T extends object ? Readonly<T> : T;
50
- export declare type StoreSetter<T> = Partial<T> | ((prevState: T extends NotWrappable ? T : Store<DeepReadonly<T>>, traversed?: (string | number)[]) => Partial<T | DeepReadonly<T>> | void);
19
+ export declare type StoreSetter<T> = T | Partial<T> | ((prevState: T, traversed?: (keyof any)[]) => Partial<T> | void);
51
20
  export declare type StorePathRange = {
52
21
  from?: number;
53
22
  to?: number;
54
23
  by?: number;
55
24
  };
56
- export declare type ArrayFilterFn<T> = (item: T extends any[] ? T[number] : never, index: number) => boolean;
57
- export declare type Part<T> = T extends any[] ? keyof T | Array<keyof T> | ArrayFilterFn<T> | StorePathRange : T extends object ? keyof T | Array<keyof T> : never;
58
- export declare type NullableNext<T, K> = K extends keyof T ? T[K] : K extends Array<keyof T> ? T[K[number]] : T extends any[] ? K extends StorePathRange ? T[number] : K extends ArrayFilterFn<T> ? T[number] : never : never;
59
- export declare type Next<T, K> = NonNullable<NullableNext<T, K>>;
60
- export interface SetStoreFunction<T> {
61
- <Setter extends StoreSetter<T>>(...args: [Setter]): void;
62
- <K1 extends Part<T>, Setter extends StoreSetter<NullableNext<T, K1>>>(...args: [K1, Setter]): void;
63
- <K1 extends Part<T>, K2 extends Part<Next<T, K1>>, Setter extends StoreSetter<NullableNext<Next<T, K1>, K2>>>(...args: [K1, K2, Setter]): void;
64
- <K1 extends Part<T>, K2 extends Part<Next<T, K1>>, K3 extends Part<Next<Next<T, K1>, K2>>, Setter extends StoreSetter<NullableNext<Next<Next<T, K1>, K2>, K3>>>(...args: [K1, K2, K3, Setter]): void;
65
- <K1 extends Part<T>, K2 extends Part<Next<T, K1>>, K3 extends Part<Next<Next<T, K1>, K2>>, K4 extends Part<Next<Next<Next<T, K1>, K2>, K3>>, Setter extends StoreSetter<NullableNext<Next<Next<Next<T, K1>, K2>, K3>, K4>>>(...args: [K1, K2, K3, K4, Setter]): void;
66
- <K1 extends Part<T>, K2 extends Part<Next<T, K1>>, K3 extends Part<Next<Next<T, K1>, K2>>, K4 extends Part<Next<Next<Next<T, K1>, K2>, K3>>, K5 extends Part<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>>, Setter extends StoreSetter<NullableNext<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>>>(...args: [K1, K2, K3, K4, K5, Setter]): void;
67
- <K1 extends Part<T>, K2 extends Part<Next<T, K1>>, K3 extends Part<Next<Next<T, K1>, K2>>, K4 extends Part<Next<Next<Next<T, K1>, K2>, K3>>, K5 extends Part<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>>, K6 extends Part<Next<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>>, Setter extends StoreSetter<NullableNext<Next<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>, K6>>>(...args: [K1, K2, K3, K4, K5, K6, Setter]): void;
68
- <K1 extends Part<T>, K2 extends Part<Next<T, K1>>, K3 extends Part<Next<Next<T, K1>, K2>>, K4 extends Part<Next<Next<Next<T, K1>, K2>, K3>>, K5 extends Part<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>>, K6 extends Part<Next<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>>, K7 extends Part<Next<Next<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>, K6>>, Setter extends StoreSetter<NullableNext<Next<Next<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>, K6>, K7>>>(...args: [K1, K2, K3, K4, K5, K6, K7, Setter]): void;
69
- <K1 extends Part<T>, K2 extends Part<Next<T, K1>>, K3 extends Part<Next<Next<T, K1>, K2>>, K4 extends Part<Next<Next<Next<T, K1>, K2>, K3>>, K5 extends Part<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>>, K6 extends Part<Next<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>>, K7 extends Part<Next<Next<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>, K6>>, K8 extends Part<Next<Next<Next<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>, K6>, K7>>>(...args: [K1, K2, K3, K4, K5, K6, K7, K8, ...(Part<any> | StoreSetter<any>)[]]): void;
25
+ export declare type ArrayFilterFn<T> = (item: T, index: number) => boolean;
26
+ export declare type Part<T> = [T] extends [never] ? never : [keyof T] extends [never] ? never : keyof T | (keyof T)[] | (number extends keyof T ? ArrayFilterFn<T[number]> | StorePathRange : never);
27
+ export declare type Next<T, K extends Part<T>> = [K] extends [never] ? never : K extends keyof T ? T[K] : K extends (keyof T)[] ? T[K[number]] : number extends keyof T ? T[number] : never;
28
+ export declare type WrappableNext<T, K extends Part<T>> = Exclude<Next<T, K>, NotWrappable>;
29
+ declare type DistributeRest<T, K extends Part<T>> = K extends K ? [K, ...Rest<Next<T, K>>] : never;
30
+ export declare type Rest<T> = 0 extends 1 & T ? [...(keyof any)[], any] : [StoreSetter<T>] | (T extends NotWrappable ? never : DistributeRest<T, Part<T>>);
31
+ export declare type SetStoreFunction<T> = _SetStoreFunction<Store<T>>;
32
+ interface _SetStoreFunction<T> {
33
+ <K1 extends Part<T>, K2 extends Part<T1>, K3 extends Part<T2>, K4 extends Part<T3>, K5 extends Part<T4>, K6 extends Part<T5>, K7 extends Part<T6>, T1 extends WrappableNext<T, K1>, T2 extends WrappableNext<T1, K2>, T3 extends WrappableNext<T2, K3>, T4 extends WrappableNext<T3, K4>, T5 extends WrappableNext<T4, K5>, T6 extends WrappableNext<T5, K6>>(k1: K1, k2: K2, k3: K3, k4: K4, k5: K5, k6: K6, k7: K7, ...rest: Rest<Next<T6, K7>>): void;
34
+ <K1 extends Part<T>, K2 extends Part<T1>, K3 extends Part<T2>, K4 extends Part<T3>, K5 extends Part<T4>, K6 extends Part<T5>, K7 extends Part<T6>, T1 extends WrappableNext<T, K1>, T2 extends WrappableNext<T1, K2>, T3 extends WrappableNext<T2, K3>, T4 extends WrappableNext<T3, K4>, T5 extends WrappableNext<T4, K5>, T6 extends WrappableNext<T5, K6>>(k1: K1, k2: K2, k3: K3, k4: K4, k5: K5, k6: K6, k7: K7, setter: StoreSetter<Next<T6, K7>>): void;
35
+ <K1 extends Part<T>, K2 extends Part<T1>, K3 extends Part<T2>, K4 extends Part<T3>, K5 extends Part<T4>, K6 extends Part<T5>, T1 extends WrappableNext<T, K1>, T2 extends WrappableNext<T1, K2>, T3 extends WrappableNext<T2, K3>, T4 extends WrappableNext<T3, K4>, T5 extends WrappableNext<T4, K5>>(k1: K1, k2: K2, k3: K3, k4: K4, k5: K5, k6: K6, setter: StoreSetter<Next<T5, K6>>): void;
36
+ <K1 extends Part<T>, K2 extends Part<T1>, K3 extends Part<T2>, K4 extends Part<T3>, K5 extends Part<T4>, T1 extends WrappableNext<T, K1>, T2 extends WrappableNext<T1, K2>, T3 extends WrappableNext<T2, K3>, T4 extends WrappableNext<T3, K4>>(k1: K1, k2: K2, k3: K3, k4: K4, k5: K5, setter: StoreSetter<Next<T4, K5>>): void;
37
+ <K1 extends Part<T>, K2 extends Part<T1>, K3 extends Part<T2>, K4 extends Part<T3>, T1 extends WrappableNext<T, K1>, T2 extends WrappableNext<T1, K2>, T3 extends WrappableNext<T2, K3>>(k1: K1, k2: K2, k3: K3, k4: K4, setter: StoreSetter<Next<T3, K4>>): void;
38
+ <K1 extends Part<T>, K2 extends Part<T1>, K3 extends Part<T2>, T1 extends WrappableNext<T, K1>, T2 extends WrappableNext<T1, K2>>(k1: K1, k2: K2, k3: K3, setter: StoreSetter<Next<T2, K3>>): void;
39
+ <K1 extends Part<T>, K2 extends Part<T1>, T1 extends WrappableNext<T, K1>>(k1: K1, k2: K2, setter: StoreSetter<Next<T1, K2>>): void;
40
+ <K extends Part<T>>(k: K, setter: StoreSetter<Next<T, K>>): void;
41
+ (setter: StoreSetter<T>): void;
70
42
  }
71
43
  /**
72
44
  * creates a reactive store that can be read through a proxy object and written with a setter function
package/types/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { createRoot, createSignal, createEffect, createRenderEffect, createComputed, createDeferred, createSelector, createMemo, createResource, onMount, onCleanup, onError, untrack, batch, on, enableScheduling, enableExternalSource, startTransition, useTransition, refetchResources, createContext, useContext, children, getListener, getOwner, runWithOwner, equalFn, $PROXY } from "./reactive/signal";
1
+ export { createRoot, createSignal, createEffect, createRenderEffect, createComputed, createReaction, createDeferred, createSelector, createMemo, createResource, onMount, onCleanup, onError, untrack, batch, on, enableScheduling, enableExternalSource, startTransition, useTransition, refetchResources, createContext, useContext, children, getListener, getOwner, runWithOwner, equalFn, $DEVCOMP, $PROXY } from "./reactive/signal";
2
2
  export type { Accessor, Setter, Resource, ResourceReturn, ResourceFetcher, ResourceFetcherInfo, Context, ReturnTypes } from "./reactive/signal";
3
3
  export * from "./reactive/observable";
4
4
  export * from "./reactive/scheduler";
package/types/jsx.d.ts CHANGED
@@ -3160,6 +3160,7 @@ export namespace JSX {
3160
3160
  startOffset?: number | string;
3161
3161
  method?: "align" | "stretch";
3162
3162
  spacing?: "auto" | "exact";
3163
+ href?: string;
3163
3164
  }
3164
3165
  interface TSpanSVGAttributes<T>
3165
3166
  extends TextContentElementSVGAttributes<T>,
@@ -2,6 +2,7 @@ import { requestCallback } from "./scheduler";
2
2
  import type { JSX } from "../jsx";
3
3
  export declare const equalFn: <T>(a: T, b: T) => boolean;
4
4
  export declare const $PROXY: unique symbol;
5
+ export declare const $DEVCOMP: unique symbol;
5
6
  export declare const NOTPENDING: {};
6
7
  export declare var Owner: Owner | null;
7
8
  export declare let Transition: TransitionState | null;
@@ -157,6 +158,20 @@ export declare function createRenderEffect<Next, Init = undefined>(..._: undefin
157
158
  */
158
159
  export declare function createEffect<Next, Init = Next>(fn: EffectFunction<Init | Next, Next>, value: Init, options?: EffectOptions): void;
159
160
  export declare function createEffect<Next, Init = undefined>(..._: undefined extends Init ? [fn: EffectFunction<Init | Next, Next>, value?: Init, options?: EffectOptions] : [fn: EffectFunction<Init | Next, Next>, value: Init, options?: EffectOptions]): void;
161
+ /**
162
+ * Creates a reactive computation that runs after the render phase with flexible tracking
163
+ * ```typescript
164
+ * export function createReaction(
165
+ * onInvalidate: () => void,
166
+ * options?: { name?: string }
167
+ * ): (fn: () => void) => void;
168
+ * ```
169
+ * @param invalidated a function that is called when tracked function is invalidated.
170
+ * @param options allows to set a name in dev mode for debugging purposes
171
+ *
172
+ * @description https://www.solidjs.com/docs/latest/api#createreaction
173
+ */
174
+ export declare function createReaction(onInvalidate: () => void, options?: EffectOptions): (tracking: () => void) => void;
160
175
  interface Memo<Prev, Next = Prev> extends SignalState<Next>, Computation<Next> {
161
176
  tOwned?: Computation<Prev | Next, Next>[];
162
177
  }
@@ -170,7 +185,7 @@ export interface MemoOptions<T> extends EffectOptions {
170
185
  * fn: (v: T) => T,
171
186
  * value?: T,
172
187
  * options?: { name?: string, equals?: false | ((prev: T, next: T) => boolean) }
173
- * ): T;
188
+ * ): () => T;
174
189
  * ```
175
190
  * @param fn a function that receives its previous or the initial value, if set, and returns a new value used to react on a computation
176
191
  * @param value an optional initial value for the computation; if set, fn will never receive undefined as first argument
@@ -235,7 +250,7 @@ export declare function createResource<T, S = true>(fetcher: ResourceFetcher<S,
235
250
  export declare function createResource<T, S = true>(fetcher: ResourceFetcher<S, T>, options: ResourceOptions<T>): ResourceReturn<T>;
236
251
  export declare function createResource<T, S>(source: ResourceSource<S>, fetcher: ResourceFetcher<S, T>, options?: ResourceOptions<undefined>): ResourceReturn<T | undefined>;
237
252
  export declare function createResource<T, S>(source: ResourceSource<S>, fetcher: ResourceFetcher<S, T>, options: ResourceOptions<T>): ResourceReturn<T>;
238
- export declare function refetchResources(info?: unknown): void;
253
+ export declare function refetchResources(info?: unknown): Promise<any[]>;
239
254
  export interface DeferredOptions<T> {
240
255
  equals?: false | ((prev: T, next: T) => boolean);
241
256
  name?: string;
@@ -356,7 +371,7 @@ export declare function onCleanup(fn: () => void): () => void;
356
371
  export declare function onError(fn: (err: any) => void): void;
357
372
  export declare function getListener(): Computation<any, any> | null;
358
373
  export declare function getOwner(): Owner | null;
359
- export declare function runWithOwner(o: Owner, fn: () => any): any;
374
+ export declare function runWithOwner<T>(o: Owner, fn: () => T): T;
360
375
  export declare function enableScheduling(scheduler?: typeof requestCallback): void;
361
376
  /**
362
377
  * ```typescript
@@ -1,3 +1,3 @@
1
- export { createRoot, createSignal, createComputed, createRenderEffect, createEffect, createDeferred, createSelector, createMemo, getListener, onMount, onCleanup, onError, untrack, batch, on, children, createContext, useContext, getOwner, runWithOwner, equalFn, requestCallback, mapArray, observable, from, $PROXY, DEV, enableExternalSource } from "./reactive";
1
+ export { createRoot, createSignal, createComputed, createRenderEffect, createEffect, createReaction, createDeferred, createSelector, createMemo, getListener, onMount, onCleanup, onError, untrack, batch, on, children, createContext, useContext, getOwner, runWithOwner, equalFn, requestCallback, mapArray, observable, from, $PROXY, $DEVCOMP, DEV, enableExternalSource } from "./reactive";
2
2
  export { mergeProps, splitProps, createComponent, For, Index, Show, Switch, Match, ErrorBoundary, Suspense, SuspenseList, createResource, enableScheduling, enableHydration, startTransition, useTransition, createUniqueId, lazy, sharedConfig } from "./rendering";
3
3
  export type { Component, Resource } from "./rendering";
@@ -1,6 +1,7 @@
1
1
  import type { Accessor, Setter } from "../reactive/signal";
2
2
  export declare const equalFn: <T>(a: T, b: T) => boolean;
3
3
  export declare const $PROXY: unique symbol;
4
+ export declare const $DEVCOMP: unique symbol;
4
5
  export declare const DEV: {};
5
6
  export declare let Owner: Owner | null;
6
7
  interface Owner {
@@ -15,6 +16,7 @@ export declare function createSignal<T>(value: T, options?: {
15
16
  export declare function createComputed<T>(fn: (v?: T) => T, value?: T): void;
16
17
  export declare const createRenderEffect: typeof createComputed;
17
18
  export declare function createEffect<T>(fn: (v?: T) => T, value?: T): void;
19
+ export declare function createReaction(fn: () => void): (fn: () => void) => void;
18
20
  export declare function createMemo<T>(fn: (v?: T) => T, value?: T): () => T;
19
21
  export declare function createDeferred<T>(source: () => T): () => T;
20
22
  export declare function createSelector<T>(source: () => T, fn: (k: T, value: T) => boolean): (k: T) => boolean;
package/web/dist/dev.cjs CHANGED
@@ -452,7 +452,7 @@ function cleanChildren(parent, current, marker, replacement) {
452
452
  if (!inserted && !i) isParent ? parent.replaceChild(node, el) : parent.insertBefore(node, marker);else isParent && parent.removeChild(el);
453
453
  } else inserted = true;
454
454
  }
455
- } else parent.insertBefore(node, marker);
455
+ } else if (current instanceof Node) parent.replaceChild(node, current);else parent.insertBefore(node, marker);
456
456
  return [node];
457
457
  }
458
458
  function gatherHydratable(element, root) {
@@ -551,75 +551,51 @@ function Dynamic(props) {
551
551
 
552
552
  Object.defineProperty(exports, 'ErrorBoundary', {
553
553
  enumerable: true,
554
- get: function () {
555
- return solidJs.ErrorBoundary;
556
- }
554
+ get: function () { return solidJs.ErrorBoundary; }
557
555
  });
558
556
  Object.defineProperty(exports, 'For', {
559
557
  enumerable: true,
560
- get: function () {
561
- return solidJs.For;
562
- }
558
+ get: function () { return solidJs.For; }
563
559
  });
564
560
  Object.defineProperty(exports, 'Index', {
565
561
  enumerable: true,
566
- get: function () {
567
- return solidJs.Index;
568
- }
562
+ get: function () { return solidJs.Index; }
569
563
  });
570
564
  Object.defineProperty(exports, 'Match', {
571
565
  enumerable: true,
572
- get: function () {
573
- return solidJs.Match;
574
- }
566
+ get: function () { return solidJs.Match; }
575
567
  });
576
568
  Object.defineProperty(exports, 'Show', {
577
569
  enumerable: true,
578
- get: function () {
579
- return solidJs.Show;
580
- }
570
+ get: function () { return solidJs.Show; }
581
571
  });
582
572
  Object.defineProperty(exports, 'Suspense', {
583
573
  enumerable: true,
584
- get: function () {
585
- return solidJs.Suspense;
586
- }
574
+ get: function () { return solidJs.Suspense; }
587
575
  });
588
576
  Object.defineProperty(exports, 'SuspenseList', {
589
577
  enumerable: true,
590
- get: function () {
591
- return solidJs.SuspenseList;
592
- }
578
+ get: function () { return solidJs.SuspenseList; }
593
579
  });
594
580
  Object.defineProperty(exports, 'Switch', {
595
581
  enumerable: true,
596
- get: function () {
597
- return solidJs.Switch;
598
- }
582
+ get: function () { return solidJs.Switch; }
599
583
  });
600
584
  Object.defineProperty(exports, 'createComponent', {
601
585
  enumerable: true,
602
- get: function () {
603
- return solidJs.createComponent;
604
- }
586
+ get: function () { return solidJs.createComponent; }
605
587
  });
606
588
  Object.defineProperty(exports, 'effect', {
607
589
  enumerable: true,
608
- get: function () {
609
- return solidJs.createRenderEffect;
610
- }
590
+ get: function () { return solidJs.createRenderEffect; }
611
591
  });
612
592
  Object.defineProperty(exports, 'getOwner', {
613
593
  enumerable: true,
614
- get: function () {
615
- return solidJs.getOwner;
616
- }
594
+ get: function () { return solidJs.getOwner; }
617
595
  });
618
596
  Object.defineProperty(exports, 'mergeProps', {
619
597
  enumerable: true,
620
- get: function () {
621
- return solidJs.mergeProps;
622
- }
598
+ get: function () { return solidJs.mergeProps; }
623
599
  });
624
600
  exports.Aliases = Aliases;
625
601
  exports.Assets = Assets;
package/web/dist/dev.js CHANGED
@@ -449,7 +449,7 @@ function cleanChildren(parent, current, marker, replacement) {
449
449
  if (!inserted && !i) isParent ? parent.replaceChild(node, el) : parent.insertBefore(node, marker);else isParent && parent.removeChild(el);
450
450
  } else inserted = true;
451
451
  }
452
- } else parent.insertBefore(node, marker);
452
+ } else if (current instanceof Node) parent.replaceChild(node, current);else parent.insertBefore(node, marker);
453
453
  return [node];
454
454
  }
455
455
  function gatherHydratable(element, root) {
@@ -258,6 +258,7 @@ function renderToStringAsync(code, options = {}) {
258
258
  renderId,
259
259
  timeoutMs = 30000
260
260
  } = options;
261
+ const dedupe = new WeakMap();
261
262
  const context = solidJs.sharedConfig.context = {
262
263
  id: renderId || "",
263
264
  count: 0,
@@ -268,8 +269,8 @@ function renderToStringAsync(code, options = {}) {
268
269
  nonce,
269
270
  writeResource(id, p, error) {
270
271
  if (error) return scripts += `_$HY.set("${id}", ${serializeError(p)});`;
271
- if (!p || typeof p !== "object" || !("then" in p)) return scripts += `_$HY.set("${id}", ${devalue(p)});`;
272
- p.then(d => scripts += `_$HY.set("${id}", ${devalue(d)});`).catch(() => scripts += `_$HY.set("${id}", {});`);
272
+ if (!p || typeof p !== "object" || !("then" in p)) return scripts += serializeSet(dedupe, id, p);
273
+ p.then(d => scripts += serializeSet(dedupe, id, d)).catch(() => scripts += `_$HY.set("${id}", {});`);
273
274
  }
274
275
  };
275
276
  const timeout = new Promise((_, reject) => setTimeout(() => reject("renderToString timed out"), timeoutMs));
@@ -318,6 +319,7 @@ function renderToStream(code, options = {}) {
318
319
  const tmp = [];
319
320
  const tasks = [];
320
321
  const registry = new Map();
322
+ const dedupe = new WeakMap();
321
323
  const checkEnd = () => {
322
324
  if (!registry.size && !completed) {
323
325
  onCompleteAll && onCompleteAll(result);
@@ -356,11 +358,11 @@ function renderToStream(code, options = {}) {
356
358
  scheduled = true;
357
359
  }
358
360
  if (error) return tasks.push(`_$HY.set("${id}", ${serializeError(p)})`);
359
- if (!p || typeof p !== "object" || !("then" in p)) return tasks.push(`_$HY.set("${id}", ${devalue(p)})`);
361
+ if (!p || typeof p !== "object" || !("then" in p)) return tasks.push(serializeSet(dedupe, id, p));
360
362
  tasks.push(`_$HY.init("${id}")`);
361
363
  p.then(d => {
362
- !completed && buffer.write(`<script${nonce ? ` nonce="${nonce}"` : ""}>_$HY.set("${id}", ${devalue(d)})</script>`);
363
- }).catch(err => {
364
+ !completed && buffer.write(`<script${nonce ? ` nonce="${nonce}"` : ""}>${serializeSet(dedupe, id, d)}</script>`);
365
+ }).catch(() => {
364
366
  !completed && buffer.write(`<script${nonce ? ` nonce="${nonce}"` : ""}>_$HY.set("${id}", {})</script>`);
365
367
  });
366
368
  },
@@ -574,7 +576,7 @@ function generateHydrationScript({
574
576
  eventNames = ["click", "input"],
575
577
  nonce
576
578
  }) {
577
- return `<script${nonce ? ` nonce="${nonce}"` : ""}>((e,t,o={})=>{t=e=>e&&e.hasAttribute&&(e.hasAttribute("data-hk")?e:t(e.host&&e.host instanceof Node?e.host:e.parentNode)),["${eventNames.join('","')}"].forEach((o=>document.addEventListener(o,(o=>{let s=o.composedPath&&o.composedPath()[0]||o.target,n=t(s);n&&!e.completed.has(n)&&e.events.push([n,o])})))),e.init=(e,t)=>{o[e]=[new Promise(((e,o)=>t=e)),t]},e.set=(e,t,s)=>{(s=o[e])&&s[1](t),o[e]=[t]},e.unset=e=>{delete o[e]},e.load=(e,t)=>{if(t=o[e])return t[0]}})(window._$HY||(_$HY={events:[],completed:new WeakSet}))</script><!xs>`;
579
+ return `<script${nonce ? ` nonce="${nonce}"` : ""}>var e,t;e=window._$HY||(_$HY={events:[],completed:new WeakSet,r:{}}),t=e=>e&&e.hasAttribute&&(e.hasAttribute("data-hk")?e:t(e.host&&e.host instanceof Node?e.host:e.parentNode)),["${eventNames.join('","')}"].forEach((o=>document.addEventListener(o,(o=>{let s=o.composedPath&&o.composedPath()[0]||o.target,a=t(s);a&&!e.completed.has(a)&&e.events.push([a,o])})))),e.init=(t,o)=>{e.r[t]=[new Promise(((e,t)=>o=e)),o]},e.set=(t,o,s)=>{(s=e.r[t])&&s[1](o),e.r[t]=[o]},e.unset=t=>{delete e.r[t]},e.load=(t,o)=>{if(o=e.r[t])return o[0]};</script><!xs>`;
578
580
  }
579
581
  function injectAssets(assets, html) {
580
582
  for (let i = 0; i < assets.length; i++) {
@@ -602,6 +604,12 @@ function waitForFragments(registry, key) {
602
604
  }
603
605
  return false;
604
606
  }
607
+ function serializeSet(registry, key, value) {
608
+ const exist = registry.get(value);
609
+ if (exist) return `_$HY.set("${key}", _$HY.r["${exist}"][0]);`;
610
+ value !== null && typeof value === "object" && registry.set(value, key);
611
+ return `_$HY.set("${key}", ${devalue(value)});`;
612
+ }
605
613
  function pipeToNodeWritable(code, writable, options = {}) {
606
614
  if (options.onReady) {
607
615
  options.onCompleteShell = () => {
@@ -648,63 +656,43 @@ function Portal(props) {
648
656
 
649
657
  Object.defineProperty(exports, 'ErrorBoundary', {
650
658
  enumerable: true,
651
- get: function () {
652
- return solidJs.ErrorBoundary;
653
- }
659
+ get: function () { return solidJs.ErrorBoundary; }
654
660
  });
655
661
  Object.defineProperty(exports, 'For', {
656
662
  enumerable: true,
657
- get: function () {
658
- return solidJs.For;
659
- }
663
+ get: function () { return solidJs.For; }
660
664
  });
661
665
  Object.defineProperty(exports, 'Index', {
662
666
  enumerable: true,
663
- get: function () {
664
- return solidJs.Index;
665
- }
667
+ get: function () { return solidJs.Index; }
666
668
  });
667
669
  Object.defineProperty(exports, 'Match', {
668
670
  enumerable: true,
669
- get: function () {
670
- return solidJs.Match;
671
- }
671
+ get: function () { return solidJs.Match; }
672
672
  });
673
673
  Object.defineProperty(exports, 'Show', {
674
674
  enumerable: true,
675
- get: function () {
676
- return solidJs.Show;
677
- }
675
+ get: function () { return solidJs.Show; }
678
676
  });
679
677
  Object.defineProperty(exports, 'Suspense', {
680
678
  enumerable: true,
681
- get: function () {
682
- return solidJs.Suspense;
683
- }
679
+ get: function () { return solidJs.Suspense; }
684
680
  });
685
681
  Object.defineProperty(exports, 'SuspenseList', {
686
682
  enumerable: true,
687
- get: function () {
688
- return solidJs.SuspenseList;
689
- }
683
+ get: function () { return solidJs.SuspenseList; }
690
684
  });
691
685
  Object.defineProperty(exports, 'Switch', {
692
686
  enumerable: true,
693
- get: function () {
694
- return solidJs.Switch;
695
- }
687
+ get: function () { return solidJs.Switch; }
696
688
  });
697
689
  Object.defineProperty(exports, 'createComponent', {
698
690
  enumerable: true,
699
- get: function () {
700
- return solidJs.createComponent;
701
- }
691
+ get: function () { return solidJs.createComponent; }
702
692
  });
703
693
  Object.defineProperty(exports, 'mergeProps', {
704
694
  enumerable: true,
705
- get: function () {
706
- return solidJs.mergeProps;
707
- }
695
+ get: function () { return solidJs.mergeProps; }
708
696
  });
709
697
  exports.Assets = Assets;
710
698
  exports.Dynamic = Dynamic;
@@ -255,6 +255,7 @@ function renderToStringAsync(code, options = {}) {
255
255
  renderId,
256
256
  timeoutMs = 30000
257
257
  } = options;
258
+ const dedupe = new WeakMap();
258
259
  const context = sharedConfig.context = {
259
260
  id: renderId || "",
260
261
  count: 0,
@@ -265,8 +266,8 @@ function renderToStringAsync(code, options = {}) {
265
266
  nonce,
266
267
  writeResource(id, p, error) {
267
268
  if (error) return scripts += `_$HY.set("${id}", ${serializeError(p)});`;
268
- if (!p || typeof p !== "object" || !("then" in p)) return scripts += `_$HY.set("${id}", ${devalue(p)});`;
269
- p.then(d => scripts += `_$HY.set("${id}", ${devalue(d)});`).catch(() => scripts += `_$HY.set("${id}", {});`);
269
+ if (!p || typeof p !== "object" || !("then" in p)) return scripts += serializeSet(dedupe, id, p);
270
+ p.then(d => scripts += serializeSet(dedupe, id, d)).catch(() => scripts += `_$HY.set("${id}", {});`);
270
271
  }
271
272
  };
272
273
  const timeout = new Promise((_, reject) => setTimeout(() => reject("renderToString timed out"), timeoutMs));
@@ -315,6 +316,7 @@ function renderToStream(code, options = {}) {
315
316
  const tmp = [];
316
317
  const tasks = [];
317
318
  const registry = new Map();
319
+ const dedupe = new WeakMap();
318
320
  const checkEnd = () => {
319
321
  if (!registry.size && !completed) {
320
322
  onCompleteAll && onCompleteAll(result);
@@ -353,11 +355,11 @@ function renderToStream(code, options = {}) {
353
355
  scheduled = true;
354
356
  }
355
357
  if (error) return tasks.push(`_$HY.set("${id}", ${serializeError(p)})`);
356
- if (!p || typeof p !== "object" || !("then" in p)) return tasks.push(`_$HY.set("${id}", ${devalue(p)})`);
358
+ if (!p || typeof p !== "object" || !("then" in p)) return tasks.push(serializeSet(dedupe, id, p));
357
359
  tasks.push(`_$HY.init("${id}")`);
358
360
  p.then(d => {
359
- !completed && buffer.write(`<script${nonce ? ` nonce="${nonce}"` : ""}>_$HY.set("${id}", ${devalue(d)})</script>`);
360
- }).catch(err => {
361
+ !completed && buffer.write(`<script${nonce ? ` nonce="${nonce}"` : ""}>${serializeSet(dedupe, id, d)}</script>`);
362
+ }).catch(() => {
361
363
  !completed && buffer.write(`<script${nonce ? ` nonce="${nonce}"` : ""}>_$HY.set("${id}", {})</script>`);
362
364
  });
363
365
  },
@@ -571,7 +573,7 @@ function generateHydrationScript({
571
573
  eventNames = ["click", "input"],
572
574
  nonce
573
575
  }) {
574
- return `<script${nonce ? ` nonce="${nonce}"` : ""}>((e,t,o={})=>{t=e=>e&&e.hasAttribute&&(e.hasAttribute("data-hk")?e:t(e.host&&e.host instanceof Node?e.host:e.parentNode)),["${eventNames.join('","')}"].forEach((o=>document.addEventListener(o,(o=>{let s=o.composedPath&&o.composedPath()[0]||o.target,n=t(s);n&&!e.completed.has(n)&&e.events.push([n,o])})))),e.init=(e,t)=>{o[e]=[new Promise(((e,o)=>t=e)),t]},e.set=(e,t,s)=>{(s=o[e])&&s[1](t),o[e]=[t]},e.unset=e=>{delete o[e]},e.load=(e,t)=>{if(t=o[e])return t[0]}})(window._$HY||(_$HY={events:[],completed:new WeakSet}))</script><!xs>`;
576
+ return `<script${nonce ? ` nonce="${nonce}"` : ""}>var e,t;e=window._$HY||(_$HY={events:[],completed:new WeakSet,r:{}}),t=e=>e&&e.hasAttribute&&(e.hasAttribute("data-hk")?e:t(e.host&&e.host instanceof Node?e.host:e.parentNode)),["${eventNames.join('","')}"].forEach((o=>document.addEventListener(o,(o=>{let s=o.composedPath&&o.composedPath()[0]||o.target,a=t(s);a&&!e.completed.has(a)&&e.events.push([a,o])})))),e.init=(t,o)=>{e.r[t]=[new Promise(((e,t)=>o=e)),o]},e.set=(t,o,s)=>{(s=e.r[t])&&s[1](o),e.r[t]=[o]},e.unset=t=>{delete e.r[t]},e.load=(t,o)=>{if(o=e.r[t])return o[0]};</script><!xs>`;
575
577
  }
576
578
  function injectAssets(assets, html) {
577
579
  for (let i = 0; i < assets.length; i++) {
@@ -599,6 +601,12 @@ function waitForFragments(registry, key) {
599
601
  }
600
602
  return false;
601
603
  }
604
+ function serializeSet(registry, key, value) {
605
+ const exist = registry.get(value);
606
+ if (exist) return `_$HY.set("${key}", _$HY.r["${exist}"][0]);`;
607
+ value !== null && typeof value === "object" && registry.set(value, key);
608
+ return `_$HY.set("${key}", ${devalue(value)});`;
609
+ }
602
610
  function pipeToNodeWritable(code, writable, options = {}) {
603
611
  if (options.onReady) {
604
612
  options.onCompleteShell = () => {