@simpreact/simpreact 0.0.3 → 0.0.4
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/compat/context.d.ts +8 -0
- package/compat/context.js +7 -0
- package/compat/core.d.ts +4 -7
- package/compat/core.js +2 -5
- package/compat/hooks.d.ts +0 -2
- package/compat/hooks.js +0 -2
- package/compat/index.d.ts +5 -4
- package/compat/index.js +3 -0
- package/context/index.d.ts +24 -0
- package/context/index.js +64 -0
- package/core/createElement.d.ts +6 -9
- package/core/createElement.js +1 -24
- package/core/index.d.ts +2 -21
- package/core/index.js +3 -3
- package/core/internal.d.ts +1 -1
- package/core/internal.js +1 -1
- package/core/memo.d.ts +10 -0
- package/core/memo.js +11 -0
- package/core/mounting.d.ts +6 -9
- package/core/mounting.js +21 -53
- package/core/patching.d.ts +4 -5
- package/core/patching.js +55 -82
- package/core/rerender.d.ts +5 -4
- package/core/rerender.js +76 -24
- package/core/unmounting.js +3 -3
- package/dom/attach-element-to-dom.js +10 -1
- package/dom/events.d.ts +6 -1
- package/dom/events.js +12 -2
- package/hooks/index.d.ts +1 -3
- package/hooks/index.js +6 -7
- package/package.json +1 -1
- package/shared/index.d.ts +6 -0
- package/shared/index.js +12 -3
- package/shared/utils.d.ts +1 -0
- package/shared/utils.js +20 -0
- package/compat/utils.d.ts +0 -1
- package/compat/utils.js +0 -3
- package/core/context.d.ts +0 -18
- package/core/context.js +0 -18
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import * as SimpReactContext from '../context/index.js';
|
|
2
|
+
export declare const createContext: typeof SimpReactContext.createContext;
|
|
3
|
+
export declare const useContext: typeof SimpReactContext.useContext;
|
|
4
|
+
declare const _default: {
|
|
5
|
+
createContext: typeof SimpReactContext.createContext;
|
|
6
|
+
useContext: typeof SimpReactContext.useContext;
|
|
7
|
+
};
|
|
8
|
+
export default _default;
|
package/compat/core.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import * as SimpReactInternal from '../core/internal.js';
|
|
2
|
-
import { identity } from './utils.js';
|
|
3
2
|
export declare const Children: {
|
|
4
3
|
map(children: SimpReactInternal.SimpNode, fn: (child: SimpReactInternal.SimpNode, index: number) => SimpReactInternal.SimpNode): SimpReactInternal.SimpNode[];
|
|
5
4
|
forEach(children: SimpReactInternal.SimpNode, fn: (child: SimpReactInternal.SimpNode, index: number) => void): void;
|
|
@@ -16,10 +15,9 @@ export declare function Suspense(props: {
|
|
|
16
15
|
export declare function forwardRef<P, T>(Component: (props: P, ref: SimpReactInternal.Ref<T>) => any): (props: P) => any;
|
|
17
16
|
export declare const Fragment: SimpReactInternal.Fragment;
|
|
18
17
|
export declare const createElement: typeof SimpReactInternal.createElement;
|
|
19
|
-
export declare const createContext: typeof SimpReactInternal.createContext;
|
|
20
18
|
export declare const createPortal: typeof SimpReactInternal.createPortal;
|
|
21
|
-
export declare const memo: typeof
|
|
22
|
-
export declare const flushSync:
|
|
19
|
+
export declare const memo: typeof SimpReactInternal.memo;
|
|
20
|
+
export declare const flushSync: (value: any) => any;
|
|
23
21
|
export declare class Component {
|
|
24
22
|
constructor();
|
|
25
23
|
}
|
|
@@ -37,10 +35,9 @@ declare const _default: {
|
|
|
37
35
|
forwardRef: typeof forwardRef;
|
|
38
36
|
Fragment: SimpReactInternal.Fragment;
|
|
39
37
|
createElement: typeof SimpReactInternal.createElement;
|
|
40
|
-
createContext: typeof SimpReactInternal.createContext;
|
|
41
38
|
createPortal: typeof SimpReactInternal.createPortal;
|
|
42
|
-
memo: typeof
|
|
43
|
-
flushSync:
|
|
39
|
+
memo: typeof SimpReactInternal.memo;
|
|
40
|
+
flushSync: (value: any) => any;
|
|
44
41
|
Component: typeof Component;
|
|
45
42
|
};
|
|
46
43
|
export default _default;
|
package/compat/core.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import * as SimpReactInternal from '../core/internal.js';
|
|
2
2
|
import * as SimpReactHooks from '../hooks/index.js';
|
|
3
|
-
import { identity } from './utils.js';
|
|
4
3
|
export const Children = {
|
|
5
4
|
map(children, fn) {
|
|
6
5
|
return Children.toArray(children).map(fn);
|
|
@@ -68,10 +67,9 @@ export function forwardRef(Component) {
|
|
|
68
67
|
}
|
|
69
68
|
export const Fragment = SimpReactInternal.Fragment;
|
|
70
69
|
export const createElement = SimpReactInternal.createElement;
|
|
71
|
-
export const createContext = SimpReactInternal.createContext;
|
|
72
70
|
export const createPortal = SimpReactInternal.createPortal;
|
|
73
|
-
export const memo =
|
|
74
|
-
export const flushSync =
|
|
71
|
+
export const memo = SimpReactInternal.memo;
|
|
72
|
+
export const flushSync = (value) => value;
|
|
75
73
|
export class Component {
|
|
76
74
|
constructor() {
|
|
77
75
|
throw new Error('Not implemented.');
|
|
@@ -85,7 +83,6 @@ export default {
|
|
|
85
83
|
forwardRef,
|
|
86
84
|
Fragment,
|
|
87
85
|
createElement,
|
|
88
|
-
createContext,
|
|
89
86
|
createPortal,
|
|
90
87
|
memo,
|
|
91
88
|
flushSync,
|
package/compat/hooks.d.ts
CHANGED
|
@@ -9,7 +9,6 @@ export declare const useEffect: typeof SimpReactHooks.useEffect;
|
|
|
9
9
|
export declare const useLayoutEffect: typeof SimpReactHooks.useEffect;
|
|
10
10
|
export declare const useInsertionEffect: typeof SimpReactHooks.useEffect;
|
|
11
11
|
export declare const useRef: typeof SimpReactHooks.useRef;
|
|
12
|
-
export declare const useContext: typeof SimpReactHooks.useContext;
|
|
13
12
|
declare const _default: {
|
|
14
13
|
useSyncExternalStore: typeof useSyncExternalStore;
|
|
15
14
|
useReducer: typeof useReducer;
|
|
@@ -21,6 +20,5 @@ declare const _default: {
|
|
|
21
20
|
useLayoutEffect: typeof SimpReactHooks.useEffect;
|
|
22
21
|
useInsertionEffect: typeof SimpReactHooks.useEffect;
|
|
23
22
|
useRef: typeof SimpReactHooks.useRef;
|
|
24
|
-
useContext: typeof SimpReactHooks.useContext;
|
|
25
23
|
};
|
|
26
24
|
export default _default;
|
package/compat/hooks.js
CHANGED
|
@@ -61,7 +61,6 @@ export const useEffect = SimpReactHooks.useEffect;
|
|
|
61
61
|
export const useLayoutEffect = SimpReactHooks.useEffect;
|
|
62
62
|
export const useInsertionEffect = SimpReactHooks.useEffect;
|
|
63
63
|
export const useRef = SimpReactHooks.useRef;
|
|
64
|
-
export const useContext = SimpReactHooks.useContext;
|
|
65
64
|
export default {
|
|
66
65
|
useSyncExternalStore,
|
|
67
66
|
useReducer,
|
|
@@ -73,5 +72,4 @@ export default {
|
|
|
73
72
|
useLayoutEffect,
|
|
74
73
|
useInsertionEffect,
|
|
75
74
|
useRef,
|
|
76
|
-
useContext,
|
|
77
75
|
};
|
package/compat/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export * from './context.js';
|
|
1
2
|
export * from './core.js';
|
|
2
3
|
export * from './dom.js';
|
|
3
4
|
export * from './hooks.js';
|
|
@@ -16,7 +17,6 @@ declare const _default: {
|
|
|
16
17
|
useLayoutEffect: typeof import("../hooks/index.js").useEffect;
|
|
17
18
|
useInsertionEffect: typeof import("../hooks/index.js").useEffect;
|
|
18
19
|
useRef: typeof import("../hooks/index.js").useRef;
|
|
19
|
-
useContext: typeof import("../hooks/index.js").useContext;
|
|
20
20
|
hydrate: typeof import("../shared/utils.js").noop;
|
|
21
21
|
render: typeof import("../dom/render.js").render;
|
|
22
22
|
createRoot: typeof import("../dom/render.js").createRoot;
|
|
@@ -33,10 +33,11 @@ declare const _default: {
|
|
|
33
33
|
forwardRef: typeof import("./core.js").forwardRef;
|
|
34
34
|
Fragment: import("../core/fragment.js").Fragment;
|
|
35
35
|
createElement: typeof import("../core/createElement.js").createElement;
|
|
36
|
-
createContext: typeof import("../core/context.js").createContext;
|
|
37
36
|
createPortal: typeof import("../core/portal.js").createPortal;
|
|
38
|
-
memo: typeof import("
|
|
39
|
-
flushSync:
|
|
37
|
+
memo: typeof import("../core/memo.js").memo;
|
|
38
|
+
flushSync: (value: any) => any;
|
|
40
39
|
Component: typeof import("./core.js").Component;
|
|
40
|
+
createContext: typeof import("../context/index.js").createContext;
|
|
41
|
+
useContext: typeof import("../context/index.js").useContext;
|
|
41
42
|
};
|
|
42
43
|
export default _default;
|
package/compat/index.js
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
|
+
import contextDefault from './context.js';
|
|
1
2
|
import coreDefault from './core.js';
|
|
2
3
|
import domDefault from './dom.js';
|
|
3
4
|
import hooksDefault from './hooks.js';
|
|
4
5
|
import jsxRuntimeDefault from './jsx-runtime.js';
|
|
6
|
+
export * from './context.js';
|
|
5
7
|
export * from './core.js';
|
|
6
8
|
export * from './dom.js';
|
|
7
9
|
export * from './hooks.js';
|
|
8
10
|
export * from './jsx-runtime.js';
|
|
9
11
|
export default {
|
|
12
|
+
...contextDefault,
|
|
10
13
|
...coreDefault,
|
|
11
14
|
...domDefault,
|
|
12
15
|
...hooksDefault,
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { FunctionComponent, SimpNode } from '../core/index.js';
|
|
2
|
+
|
|
3
|
+
export interface ProviderProps<T> {
|
|
4
|
+
value: T;
|
|
5
|
+
children?: SimpNode;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface ConsumerProps<T> {
|
|
9
|
+
children: (value: T) => SimpNode;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export type SimpContext<T> = {
|
|
13
|
+
Provider: Provider<T>;
|
|
14
|
+
Consumer: Consumer<T>;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export type ContextType<C extends SimpContext<any>> = C extends SimpContext<infer T> ? T : never;
|
|
18
|
+
|
|
19
|
+
export type Provider<T> = FunctionComponent<ProviderProps<T>>;
|
|
20
|
+
export type Consumer<T> = FunctionComponent<ConsumerProps<T>>;
|
|
21
|
+
|
|
22
|
+
declare function createContext<T>(defaultValue: T): SimpContext<T>;
|
|
23
|
+
|
|
24
|
+
declare function useContext<T>(context: SimpContext<T>): T;
|
package/context/index.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { lifecycleEventBus, rerender } from '../core/internal.js';
|
|
2
|
+
// In runtime these variables are nullable.
|
|
3
|
+
let currentElement;
|
|
4
|
+
let phase;
|
|
5
|
+
lifecycleEventBus.subscribe(event => {
|
|
6
|
+
if (event.type === 'beforeRender') {
|
|
7
|
+
currentElement = event.element;
|
|
8
|
+
phase = event.phase;
|
|
9
|
+
}
|
|
10
|
+
if (event.type === 'afterRender') {
|
|
11
|
+
currentElement = null;
|
|
12
|
+
phase = null;
|
|
13
|
+
}
|
|
14
|
+
if (event.type === 'unmounted') {
|
|
15
|
+
event.element.context?.forEach(value => value.subs.delete(event.element.store));
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
export function createContext(defaultValue) {
|
|
19
|
+
const context = {
|
|
20
|
+
defaultValue,
|
|
21
|
+
Provider(props) {
|
|
22
|
+
if (!currentElement.context) {
|
|
23
|
+
currentElement.context = new Map();
|
|
24
|
+
}
|
|
25
|
+
else if (phase === 'mounting') {
|
|
26
|
+
currentElement.context = new Map(currentElement.context);
|
|
27
|
+
}
|
|
28
|
+
if (phase === 'mounting') {
|
|
29
|
+
currentElement.context.set(context, { value: props.value, subs: new Set() });
|
|
30
|
+
return props.children;
|
|
31
|
+
}
|
|
32
|
+
let contextEntry = currentElement.context.get(context);
|
|
33
|
+
if (!contextEntry) {
|
|
34
|
+
contextEntry = { value: props.value, subs: new Set() };
|
|
35
|
+
currentElement.context.set(context, contextEntry);
|
|
36
|
+
return props.children;
|
|
37
|
+
}
|
|
38
|
+
if (Object.is(contextEntry.value, props.value)) {
|
|
39
|
+
return props.children;
|
|
40
|
+
}
|
|
41
|
+
contextEntry.value = props.value;
|
|
42
|
+
for (let sub of contextEntry.subs) {
|
|
43
|
+
sub.forceRender = true;
|
|
44
|
+
rerender(sub.latestElement);
|
|
45
|
+
}
|
|
46
|
+
return props.children;
|
|
47
|
+
},
|
|
48
|
+
Consumer(props) {
|
|
49
|
+
return props.children(currentElement.context?.get(context)?.value ?? defaultValue);
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
return context;
|
|
53
|
+
}
|
|
54
|
+
export function useContext(context) {
|
|
55
|
+
const contextEntry = currentElement.context?.get(context);
|
|
56
|
+
if (!contextEntry) {
|
|
57
|
+
// No provider above: just return the default value, don't subscribe
|
|
58
|
+
return context.defaultValue;
|
|
59
|
+
}
|
|
60
|
+
if (!contextEntry.subs.has(currentElement.store)) {
|
|
61
|
+
contextEntry.subs.add(currentElement.store);
|
|
62
|
+
}
|
|
63
|
+
return contextEntry.value;
|
|
64
|
+
}
|
package/core/createElement.d.ts
CHANGED
|
@@ -1,33 +1,30 @@
|
|
|
1
1
|
import type { Many, Maybe, Nullable, SimpText } from '../shared/index.js';
|
|
2
2
|
import type { HostReference } from './hostAdapter.js';
|
|
3
|
-
import type { SimpContextMap } from './context.js';
|
|
4
3
|
export type SimpNode = SimpElement | SimpText | Array<SimpNode> | boolean | null | undefined;
|
|
5
4
|
export type Key = string | number | bigint;
|
|
6
|
-
export
|
|
7
|
-
|
|
8
|
-
}
|
|
9
|
-
export type FC = FunctionComponent;
|
|
10
|
-
export type SimpElementFlag = 'FC' | 'HOST' | 'TEXT' | 'FRAGMENT' | 'PROVIDER' | 'CONSUMER' | 'PORTAL';
|
|
5
|
+
export type FC = (props: any) => SimpNode;
|
|
6
|
+
export type SimpElementFlag = 'FC' | 'HOST' | 'TEXT' | 'FRAGMENT' | 'PORTAL';
|
|
11
7
|
export interface SimpElementStore {
|
|
12
8
|
latestElement?: Maybe<SimpElement>;
|
|
13
9
|
hostNamespace?: Maybe<string>;
|
|
10
|
+
forceRender?: boolean;
|
|
14
11
|
[key: string]: unknown;
|
|
15
12
|
}
|
|
16
13
|
export interface SimpElement {
|
|
17
14
|
flag: SimpElementFlag;
|
|
18
15
|
parent: Nullable<SimpElement>;
|
|
19
16
|
key?: Maybe<Key>;
|
|
20
|
-
type?: string |
|
|
17
|
+
type?: string | FC;
|
|
21
18
|
props?: any;
|
|
22
19
|
children?: Maybe<SimpNode>;
|
|
23
20
|
className?: Maybe<string>;
|
|
24
21
|
reference?: Maybe<HostReference>;
|
|
25
22
|
store?: SimpElementStore;
|
|
26
|
-
|
|
23
|
+
context?: any;
|
|
27
24
|
ref?: any;
|
|
28
25
|
unmounted?: boolean;
|
|
29
26
|
}
|
|
30
|
-
export declare function createElement(type: string |
|
|
27
|
+
export declare function createElement(type: string | FC, props?: any, ...children: SimpNode[]): SimpElement;
|
|
31
28
|
export declare function createTextElement(text: SimpText): SimpElement;
|
|
32
29
|
export declare function normalizeChildren(children: SimpNode, skipIgnoredCheck: boolean): Maybe<Many<SimpElement>>;
|
|
33
30
|
export declare function normalizeRoot(node: SimpNode, skipIgnoredCheck: boolean): Maybe<SimpElement>;
|
package/core/createElement.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { isSimpText } from '../shared/index.js';
|
|
2
2
|
import { Fragment } from './fragment.js';
|
|
3
|
-
import { isConsumer, isProvider } from './context.js';
|
|
4
3
|
export function createElement(type, props, ...children) {
|
|
5
4
|
let newProps;
|
|
6
5
|
let className;
|
|
@@ -83,28 +82,6 @@ export function createElement(type, props, ...children) {
|
|
|
83
82
|
}
|
|
84
83
|
return element;
|
|
85
84
|
}
|
|
86
|
-
else if (isProvider(type)) {
|
|
87
|
-
const element = { flag: 'PROVIDER', type, props: { value: props.value }, parent: null };
|
|
88
|
-
if ((definedChildren = normalizeChildren(definedChildren || props.children, false))) {
|
|
89
|
-
element.children = definedChildren;
|
|
90
|
-
}
|
|
91
|
-
if (props != null && props.key) {
|
|
92
|
-
element.key = props?.key;
|
|
93
|
-
}
|
|
94
|
-
return element;
|
|
95
|
-
}
|
|
96
|
-
else if (isConsumer(type)) {
|
|
97
|
-
const element = {
|
|
98
|
-
flag: 'CONSUMER',
|
|
99
|
-
type,
|
|
100
|
-
props: { children: definedChildren || (props != null ? props.children : null) },
|
|
101
|
-
parent: null,
|
|
102
|
-
};
|
|
103
|
-
if (props != null && props.key) {
|
|
104
|
-
element.key = props?.key;
|
|
105
|
-
}
|
|
106
|
-
return element;
|
|
107
|
-
}
|
|
108
85
|
else {
|
|
109
86
|
if (props != null) {
|
|
110
87
|
for (const propName in props) {
|
|
@@ -210,7 +187,7 @@ function isIgnoredNode(node) {
|
|
|
210
187
|
if (isSimpText(node)) {
|
|
211
188
|
return false;
|
|
212
189
|
}
|
|
213
|
-
if (node.flag === 'FRAGMENT' || node.flag === '
|
|
190
|
+
if (node.flag === 'FRAGMENT' || node.flag === 'PORTAL') {
|
|
214
191
|
return node.children == null;
|
|
215
192
|
}
|
|
216
193
|
return false;
|
package/core/index.d.ts
CHANGED
|
@@ -26,25 +26,6 @@ export interface SimpElement<P = unknown, T extends string | FunctionComponent<P
|
|
|
26
26
|
|
|
27
27
|
export type SimpNode = SimpElement | SimpText | Array<SimpNode> | boolean | null | undefined;
|
|
28
28
|
|
|
29
|
-
export interface ProviderProps<T> {
|
|
30
|
-
value: T;
|
|
31
|
-
children?: SimpNode | undefined;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export interface ConsumerProps<T> {
|
|
35
|
-
children: (value: T) => SimpNode;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export type SimpContext<T> = {
|
|
39
|
-
Provider: Provider<T>;
|
|
40
|
-
Consumer: Consumer<T>;
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
export type ContextType<C extends SimpContext<any>> = C extends SimpContext<infer T> ? T : never;
|
|
44
|
-
|
|
45
|
-
export type Provider<T> = FunctionComponent<ProviderProps<T>>;
|
|
46
|
-
export type Consumer<T> = FunctionComponent<ConsumerProps<T>>;
|
|
47
|
-
|
|
48
29
|
declare function createElement<P extends {}, T>(
|
|
49
30
|
type: string,
|
|
50
31
|
props?: (RefAttributes<T> & P) | null,
|
|
@@ -58,11 +39,11 @@ declare function createElement<P extends {}>(
|
|
|
58
39
|
|
|
59
40
|
declare function createPortal<HostRef = {}>(children: SimpNode, container: HostRef): SimpElement;
|
|
60
41
|
|
|
61
|
-
declare function createContext<T>(defaultValue: T): SimpContext<T>;
|
|
62
|
-
|
|
63
42
|
declare function Fragment(props: PropsWithChildren): SimpElement;
|
|
64
43
|
|
|
65
44
|
export type FunctionComponent<P = {}> = (props: P) => SimpNode;
|
|
66
45
|
export type FC<P = {}> = FunctionComponent<P>;
|
|
67
46
|
|
|
68
47
|
export type PropsWithChildren<P = {}> = P & { children?: SimpNode | undefined };
|
|
48
|
+
|
|
49
|
+
declare function memo<P = {}>(Component: FC<P>, compare?: (objA: Readonly<P>, objB: Readonly<P>) => boolean): FC<P>;
|
package/core/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createElement } from './createElement.js';
|
|
2
2
|
import { Fragment } from './fragment.js';
|
|
3
|
-
import {
|
|
3
|
+
import { memo } from './memo.js';
|
|
4
4
|
import { createPortal } from './portal.js';
|
|
5
|
-
export { createElement, Fragment,
|
|
6
|
-
export default { createElement, Fragment,
|
|
5
|
+
export { createElement, Fragment, memo, createPortal };
|
|
6
|
+
export default { createElement, Fragment, memo, createPortal };
|
package/core/internal.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export * from './context.js';
|
|
2
1
|
export * from './createElement.js';
|
|
3
2
|
export * from './fragment.js';
|
|
4
3
|
export * from './hostAdapter.js';
|
|
5
4
|
export * from './lifecycleEventBus.js';
|
|
5
|
+
export * from './memo.js';
|
|
6
6
|
export * from './mounting.js';
|
|
7
7
|
export * from './patching.js';
|
|
8
8
|
export * from './portal.js';
|
package/core/internal.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export * from './context.js';
|
|
2
1
|
export * from './createElement.js';
|
|
3
2
|
export * from './fragment.js';
|
|
4
3
|
export * from './hostAdapter.js';
|
|
5
4
|
export * from './lifecycleEventBus.js';
|
|
5
|
+
export * from './memo.js';
|
|
6
6
|
export * from './mounting.js';
|
|
7
7
|
export * from './patching.js';
|
|
8
8
|
export * from './portal.js';
|
package/core/memo.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { shallowEqual } from '../shared/index.js';
|
|
2
|
+
import type { FC, SimpNode } from './createElement.js';
|
|
3
|
+
export interface MemoizedComponent {
|
|
4
|
+
(props: any): SimpNode;
|
|
5
|
+
_isMemo: true;
|
|
6
|
+
_render: FC;
|
|
7
|
+
_compare: (prevProps: any, nextProps: any) => boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare function memo(Component: FC, compare?: typeof shallowEqual): MemoizedComponent;
|
|
10
|
+
export declare function isMemo(type: any): type is MemoizedComponent;
|
package/core/memo.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { shallowEqual } from '../shared/index.js';
|
|
2
|
+
export function memo(Component, compare = shallowEqual) {
|
|
3
|
+
const Memoized = (props => Component(props));
|
|
4
|
+
Memoized._isMemo = true;
|
|
5
|
+
Memoized._render = Component;
|
|
6
|
+
Memoized._compare = compare;
|
|
7
|
+
return Memoized;
|
|
8
|
+
}
|
|
9
|
+
export function isMemo(type) {
|
|
10
|
+
return type._isMemo;
|
|
11
|
+
}
|
package/core/mounting.d.ts
CHANGED
|
@@ -1,13 +1,10 @@
|
|
|
1
1
|
import type { Maybe, Nullable } from '../shared/index.js';
|
|
2
2
|
import type { HostReference } from './hostAdapter.js';
|
|
3
3
|
import type { SimpElement } from './createElement.js';
|
|
4
|
-
|
|
5
|
-
export declare function mount(element: SimpElement, parentReference: Nullable<HostReference>, nextReference: Nullable<HostReference>, contextMap: Nullable<SimpContextMap>, hostNamespace: Maybe<string>): void;
|
|
4
|
+
export declare function mount(element: SimpElement, parentReference: Nullable<HostReference>, nextReference: Nullable<HostReference>, context: unknown, hostNamespace: Maybe<string>): void;
|
|
6
5
|
export declare function mountTextElement(element: SimpElement, parentReference: Nullable<HostReference>, nextReference: Nullable<HostReference>): void;
|
|
7
|
-
export declare function mountHostElement(element: SimpElement, parentReference: Nullable<HostReference>, nextReference: Nullable<HostReference>,
|
|
8
|
-
export declare function mountFunctionalElement(element: SimpElement, parentReference: Nullable<HostReference>, nextReference: Nullable<HostReference>,
|
|
9
|
-
export declare function mountFragment(element: SimpElement, parentReference: Nullable<HostReference>, nextReference: Nullable<HostReference>,
|
|
10
|
-
export declare function mountArrayChildren(children: SimpElement[], reference: Nullable<HostReference>, nextReference: Nullable<HostReference>,
|
|
11
|
-
export declare function
|
|
12
|
-
export declare function mountConsumer(element: SimpElement, parentReference: Nullable<HostReference>, nextReference: Nullable<HostReference>, contextMap: Nullable<SimpContextMap>, hostNamespace: Maybe<string>): void;
|
|
13
|
-
export declare function mountPortal(element: SimpElement, parentReference: Nullable<HostReference>, nextReference: Nullable<HostReference>, contextMap: Nullable<SimpContextMap>): void;
|
|
6
|
+
export declare function mountHostElement(element: SimpElement, parentReference: Nullable<HostReference>, nextReference: Nullable<HostReference>, context: unknown, hostNamespace: Maybe<string>): void;
|
|
7
|
+
export declare function mountFunctionalElement(element: SimpElement, parentReference: Nullable<HostReference>, nextReference: Nullable<HostReference>, context: unknown, hostNamespace: Maybe<string>): void;
|
|
8
|
+
export declare function mountFragment(element: SimpElement, parentReference: Nullable<HostReference>, nextReference: Nullable<HostReference>, context: unknown, hostNamespace: Maybe<string>): void;
|
|
9
|
+
export declare function mountArrayChildren(children: SimpElement[], reference: Nullable<HostReference>, nextReference: Nullable<HostReference>, context: unknown, parentElement: SimpElement, hostNamespace: Maybe<string>): void;
|
|
10
|
+
export declare function mountPortal(element: SimpElement, parentReference: Nullable<HostReference>, nextReference: Nullable<HostReference>, context: unknown): void;
|
package/core/mounting.js
CHANGED
|
@@ -1,30 +1,24 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { emptyObject } from '../shared/index.js';
|
|
2
2
|
import { hostAdapter } from './hostAdapter.js';
|
|
3
3
|
import { createTextElement, normalizeRoot } from './createElement.js';
|
|
4
4
|
import { applyRef } from './ref.js';
|
|
5
5
|
import { lifecycleEventBus } from './lifecycleEventBus.js';
|
|
6
6
|
import { batchingRerenderLocker } from './rerender.js';
|
|
7
|
-
export function mount(element, parentReference, nextReference,
|
|
7
|
+
export function mount(element, parentReference, nextReference, context, hostNamespace) {
|
|
8
8
|
if (element.flag === 'TEXT') {
|
|
9
9
|
mountTextElement(element, parentReference, nextReference);
|
|
10
10
|
}
|
|
11
11
|
else if (element.flag === 'HOST') {
|
|
12
|
-
mountHostElement(element, parentReference, nextReference,
|
|
12
|
+
mountHostElement(element, parentReference, nextReference, context, hostNamespace);
|
|
13
13
|
}
|
|
14
14
|
else if (element.flag === 'FC') {
|
|
15
|
-
mountFunctionalElement(element, parentReference, nextReference,
|
|
15
|
+
mountFunctionalElement(element, parentReference, nextReference, context, hostNamespace);
|
|
16
16
|
}
|
|
17
17
|
else if (element.flag === 'FRAGMENT') {
|
|
18
|
-
mountFragment(element, parentReference, nextReference,
|
|
19
|
-
}
|
|
20
|
-
else if (element.flag === 'PROVIDER') {
|
|
21
|
-
mountProvider(element, parentReference, nextReference, contextMap, hostNamespace);
|
|
22
|
-
}
|
|
23
|
-
else if (element.flag === 'PORTAL') {
|
|
24
|
-
mountPortal(element, parentReference, nextReference, contextMap);
|
|
18
|
+
mountFragment(element, parentReference, nextReference, context, hostNamespace);
|
|
25
19
|
}
|
|
26
20
|
else {
|
|
27
|
-
|
|
21
|
+
mountPortal(element, parentReference, nextReference, context);
|
|
28
22
|
}
|
|
29
23
|
}
|
|
30
24
|
export function mountTextElement(element, parentReference, nextReference) {
|
|
@@ -33,7 +27,7 @@ export function mountTextElement(element, parentReference, nextReference) {
|
|
|
33
27
|
hostAdapter.insertOrAppend(parentReference, reference, nextReference);
|
|
34
28
|
}
|
|
35
29
|
}
|
|
36
|
-
export function mountHostElement(element, parentReference, nextReference,
|
|
30
|
+
export function mountHostElement(element, parentReference, nextReference, context, hostNamespace) {
|
|
37
31
|
const hostNamespaces = hostAdapter.getHostNamespaces(element, hostNamespace);
|
|
38
32
|
hostNamespace = hostNamespaces?.self;
|
|
39
33
|
const hostReference = (element.reference = hostAdapter.createReference(element.type, hostNamespace));
|
|
@@ -41,11 +35,11 @@ export function mountHostElement(element, parentReference, nextReference, contex
|
|
|
41
35
|
// HOST element always has Maybe<Many<SimpElement>> children due to normalization process.
|
|
42
36
|
const children = element.children;
|
|
43
37
|
if (Array.isArray(children)) {
|
|
44
|
-
mountArrayChildren(children, hostReference, null,
|
|
38
|
+
mountArrayChildren(children, hostReference, null, context, element, hostNamespaces?.children);
|
|
45
39
|
}
|
|
46
40
|
else if (children) {
|
|
47
41
|
children.parent = element;
|
|
48
|
-
mount(children, hostReference, null,
|
|
42
|
+
mount(children, hostReference, null, context, hostNamespaces?.children);
|
|
49
43
|
}
|
|
50
44
|
if (element.props) {
|
|
51
45
|
hostAdapter.mountProps(hostReference, element, hostNamespace);
|
|
@@ -62,9 +56,9 @@ export function mountHostElement(element, parentReference, nextReference, contex
|
|
|
62
56
|
}
|
|
63
57
|
applyRef(element);
|
|
64
58
|
}
|
|
65
|
-
export function mountFunctionalElement(element, parentReference, nextReference,
|
|
66
|
-
if (
|
|
67
|
-
element.
|
|
59
|
+
export function mountFunctionalElement(element, parentReference, nextReference, context, hostNamespace) {
|
|
60
|
+
if (context) {
|
|
61
|
+
element.context = context;
|
|
68
62
|
}
|
|
69
63
|
if (element.unmounted) {
|
|
70
64
|
element.unmounted = false;
|
|
@@ -87,13 +81,7 @@ export function mountFunctionalElement(element, parentReference, nextReference,
|
|
|
87
81
|
do {
|
|
88
82
|
triedToRerender = false;
|
|
89
83
|
if (++rerenderCounter >= 25) {
|
|
90
|
-
|
|
91
|
-
type: 'errored',
|
|
92
|
-
element,
|
|
93
|
-
error: new Error('Too many re-renders. SimpReact limits the number of renders to prevent an infinite loop.'),
|
|
94
|
-
phase: 'mounting',
|
|
95
|
-
});
|
|
96
|
-
return;
|
|
84
|
+
throw new Error('Too many re-renders.');
|
|
97
85
|
}
|
|
98
86
|
lifecycleEventBus.publish({ type: 'beforeRender', element, phase: 'mounting' });
|
|
99
87
|
batchingRerenderLocker.lock();
|
|
@@ -112,50 +100,30 @@ export function mountFunctionalElement(element, parentReference, nextReference,
|
|
|
112
100
|
}
|
|
113
101
|
if (children) {
|
|
114
102
|
children.parent = element;
|
|
115
|
-
mount((element.children = children), parentReference, nextReference,
|
|
103
|
+
mount((element.children = children), parentReference, nextReference, element.context, hostNamespace);
|
|
116
104
|
}
|
|
117
105
|
lifecycleEventBus.publish({ type: 'mounted', element });
|
|
118
106
|
}
|
|
119
|
-
export function mountFragment(element, parentReference, nextReference,
|
|
107
|
+
export function mountFragment(element, parentReference, nextReference, context, hostNamespace) {
|
|
120
108
|
// FRAGMENT element always has Maybe<Many<SimpElement>> children due to normalization process.
|
|
121
109
|
if (Array.isArray(element.children)) {
|
|
122
|
-
mountArrayChildren(element.children, parentReference, nextReference,
|
|
110
|
+
mountArrayChildren(element.children, parentReference, nextReference, context, element, hostNamespace);
|
|
123
111
|
}
|
|
124
112
|
else if (element.children) {
|
|
125
113
|
element.children.parent = element;
|
|
126
|
-
mount(element.children, parentReference, nextReference,
|
|
114
|
+
mount(element.children, parentReference, nextReference, context, hostNamespace);
|
|
127
115
|
}
|
|
128
116
|
}
|
|
129
|
-
export function mountArrayChildren(children, reference, nextReference,
|
|
117
|
+
export function mountArrayChildren(children, reference, nextReference, context, parentElement, hostNamespace) {
|
|
130
118
|
for (const child of children) {
|
|
131
119
|
child.parent = parentElement;
|
|
132
|
-
mount(child, reference, nextReference,
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
export function mountProvider(element, parentReference, nextReference, contextMap, hostNamespace) {
|
|
136
|
-
contextMap = new Map(contextMap);
|
|
137
|
-
contextMap.set(element.type.context, element.props.value);
|
|
138
|
-
// PROVIDER element always has Maybe<Many<SimpElement>> children due to normalization process.
|
|
139
|
-
if (Array.isArray(element.children)) {
|
|
140
|
-
mountArrayChildren(element.children, parentReference, nextReference, contextMap, element, hostNamespace);
|
|
141
|
-
}
|
|
142
|
-
else if (element.children) {
|
|
143
|
-
element.children.parent = element;
|
|
144
|
-
mount(element.children, parentReference, nextReference, contextMap, hostNamespace);
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
export function mountConsumer(element, parentReference, nextReference, contextMap, hostNamespace) {
|
|
148
|
-
const children = normalizeRoot(element.type(element.props || emptyObject, contextMap || emptyMap), false);
|
|
149
|
-
if (!children) {
|
|
150
|
-
return;
|
|
120
|
+
mount(child, reference, nextReference, context, hostNamespace);
|
|
151
121
|
}
|
|
152
|
-
children.parent = element;
|
|
153
|
-
mount((element.children = children), parentReference, nextReference, contextMap, hostNamespace);
|
|
154
122
|
}
|
|
155
|
-
export function mountPortal(element, parentReference, nextReference,
|
|
123
|
+
export function mountPortal(element, parentReference, nextReference, context) {
|
|
156
124
|
if (element.children) {
|
|
157
125
|
element.children.parent = element;
|
|
158
|
-
mount(element.children, element.ref, null,
|
|
126
|
+
mount(element.children, element.ref, null, context, hostAdapter.getHostNamespaces(element.children, undefined)?.self);
|
|
159
127
|
}
|
|
160
128
|
const placeHolderElement = createTextElement('');
|
|
161
129
|
mountTextElement(placeHolderElement, parentReference, nextReference);
|
package/core/patching.d.ts
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import type { Maybe, Nullable } from '../shared/index.js';
|
|
2
2
|
import type { SimpElement } from './createElement.js';
|
|
3
3
|
import type { HostReference } from './hostAdapter.js';
|
|
4
|
-
|
|
5
|
-
export declare function
|
|
6
|
-
export declare function
|
|
7
|
-
export declare function
|
|
8
|
-
export declare function patchKeyedChildren(prevChildren: SimpElement[], nextChildren: SimpElement[], parentReference: HostReference, nextReference: Nullable<HostReference>, contextMap: Nullable<SimpContextMap>, hostNamespace: Maybe<string>): void;
|
|
4
|
+
export declare function patch(prevElement: SimpElement, nextElement: SimpElement, parentReference: HostReference, nextReference: Nullable<HostReference>, context: unknown, hostNamespace: Maybe<string>): void;
|
|
5
|
+
export declare function patchPortal(prevElement: SimpElement, nextElement: SimpElement, context: unknown): void;
|
|
6
|
+
export declare function updateFunctionalComponent(element: SimpElement, parentReference: HostReference, nextReference: Nullable<HostReference>, context: unknown, hostNamespace: Maybe<string>): void;
|
|
7
|
+
export declare function patchKeyedChildren(prevChildren: SimpElement[], nextChildren: SimpElement[], parentReference: HostReference, nextReference: Nullable<HostReference>, context: unknown, hostNamespace: Maybe<string>): void;
|
|
9
8
|
export declare function findParentReferenceFromElement(element: SimpElement): Nullable<HostReference>;
|
|
10
9
|
export declare function findHostReferenceFromElement(element: SimpElement): Nullable<HostReference>;
|