@reckona/mreact-compat 0.0.143 → 0.0.145
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/element.d.ts +1 -0
- package/dist/element.d.ts.map +1 -1
- package/dist/element.js +8 -0
- package/dist/element.js.map +1 -1
- package/dist/hooks.d.ts +6 -0
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +73 -1
- package/dist/hooks.js.map +1 -1
- package/dist/host-reconciler.d.ts.map +1 -1
- package/dist/host-reconciler.js +17 -5
- package/dist/host-reconciler.js.map +1 -1
- package/dist/jsx-dev-runtime.d.ts +2 -1
- package/dist/jsx-dev-runtime.d.ts.map +1 -1
- package/dist/jsx-dev-runtime.js +2 -1
- package/dist/jsx-dev-runtime.js.map +1 -1
- package/dist/jsx-runtime.d.ts +2 -1
- package/dist/jsx-runtime.d.ts.map +1 -1
- package/dist/jsx-runtime.js +2 -1
- package/dist/jsx-runtime.js.map +1 -1
- package/package.json +3 -3
- package/src/element.ts +17 -3
- package/src/hooks.ts +103 -2
- package/src/host-reconciler.ts +27 -4
- package/src/jsx-dev-runtime.ts +6 -1
- package/src/jsx-runtime.ts +6 -1
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { Fragment } from "./jsx-runtime.js";
|
|
1
|
+
import { Fragment, REACTIVE_TEXT_BINDING_META } from "./jsx-runtime.js";
|
|
2
2
|
import type { ElementType, ReactCompatElement, ReactCompatNode } from "./element.js";
|
|
3
3
|
import type { JSXIntrinsicAttributes, JSXIntrinsicElements } from "./jsx-runtime.js";
|
|
4
4
|
export { Fragment };
|
|
5
|
+
export { REACTIVE_TEXT_BINDING_META };
|
|
5
6
|
export type { FormEvent, FormEventHandler, JSXEvent, JSXEventHandler, JSXHTMLAttributes, JSXIntrinsicAttributes, JSXIntrinsicElements, } from "./jsx-runtime.js";
|
|
6
7
|
export declare namespace JSX {
|
|
7
8
|
interface Element extends ReactCompatElement {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsx-dev-runtime.d.ts","sourceRoot":"","sources":["../src/jsx-dev-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"jsx-dev-runtime.d.ts","sourceRoot":"","sources":["../src/jsx-dev-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,0BAA0B,EAE3B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EACV,WAAW,EACX,kBAAkB,EAClB,eAAe,EAChB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EACV,sBAAsB,EACtB,oBAAoB,EACrB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,QAAQ,EAAE,CAAC;AACpB,OAAO,EAAE,0BAA0B,EAAE,CAAC;AACtC,YAAY,EACV,SAAS,EACT,gBAAgB,EAChB,QAAQ,EACR,eAAe,EACf,iBAAiB,EACjB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAE1B,yBAAiB,GAAG,CAAC;IACnB,UAAiB,OAAQ,SAAQ,kBAAkB;KAAG;IAEtD,UAAiB,mBAAoB,SAAQ,sBAAsB;KAAG;IAEtE,UAAiB,iBAAkB,SAAQ,oBAAoB;KAAG;CACnE;AAED,wBAAgB,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACtD,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,EACpB,KAAK,EAAE,CAAC,CAAC,GAAG;IAAE,QAAQ,CAAC,EAAE,eAAe,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,GAAG,IAAI,EAChF,GAAG,EAAE,OAAO,EACZ,iBAAiB,EAAE,OAAO,EAC1B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,OAAO,GACb,kBAAkB,CAAC,CAAC,CAAC,CAEvB"}
|
package/dist/jsx-dev-runtime.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { Fragment, jsx } from "./jsx-runtime.js";
|
|
1
|
+
import { Fragment, REACTIVE_TEXT_BINDING_META, jsx, } from "./jsx-runtime.js";
|
|
2
2
|
export { Fragment };
|
|
3
|
+
export { REACTIVE_TEXT_BINDING_META };
|
|
3
4
|
export function jsxDEV(type, props, key, _isStaticChildren, _source, _self) {
|
|
4
5
|
return jsx(type, props, key);
|
|
5
6
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsx-dev-runtime.js","sourceRoot":"","sources":["../src/jsx-dev-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"jsx-dev-runtime.js","sourceRoot":"","sources":["../src/jsx-dev-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,0BAA0B,EAC1B,GAAG,GACJ,MAAM,kBAAkB,CAAC;AAW1B,OAAO,EAAE,QAAQ,EAAE,CAAC;AACpB,OAAO,EAAE,0BAA0B,EAAE,CAAC;AAmBtC,MAAM,UAAU,MAAM,CACpB,IAAoB,EACpB,KAAgF,EAChF,GAAY,EACZ,iBAA0B,EAC1B,OAAgB,EAChB,KAAc;IAEd,OAAO,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;AAC/B,CAAC","sourcesContent":["import {\n Fragment,\n REACTIVE_TEXT_BINDING_META,\n jsx,\n} from \"./jsx-runtime.js\";\nimport type {\n ElementType,\n ReactCompatElement,\n ReactCompatNode,\n} from \"./element.js\";\nimport type {\n JSXIntrinsicAttributes,\n JSXIntrinsicElements,\n} from \"./jsx-runtime.js\";\n\nexport { Fragment };\nexport { REACTIVE_TEXT_BINDING_META };\nexport type {\n FormEvent,\n FormEventHandler,\n JSXEvent,\n JSXEventHandler,\n JSXHTMLAttributes,\n JSXIntrinsicAttributes,\n JSXIntrinsicElements,\n} from \"./jsx-runtime.js\";\n\nexport namespace JSX {\n export interface Element extends ReactCompatElement {}\n\n export interface IntrinsicAttributes extends JSXIntrinsicAttributes {}\n\n export interface IntrinsicElements extends JSXIntrinsicElements {}\n}\n\nexport function jsxDEV<P extends Record<string, unknown>>(\n type: ElementType<P>,\n props: (P & { children?: ReactCompatNode; key?: unknown; ref?: unknown }) | null,\n key: unknown,\n _isStaticChildren: boolean,\n _source: unknown,\n _self: unknown,\n): ReactCompatElement<P> {\n return jsx(type, props, key);\n}\n"]}
|
package/dist/jsx-runtime.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { Fragment } from "./element.js";
|
|
1
|
+
import { Fragment, REACTIVE_TEXT_BINDING_META } from "./element.js";
|
|
2
2
|
import type { ElementType, ReactCompatElement, ReactCompatNode } from "./element.js";
|
|
3
3
|
export { Fragment };
|
|
4
|
+
export { REACTIVE_TEXT_BINDING_META };
|
|
4
5
|
export type JSXEvent<TCurrentTarget extends EventTarget, TEvent extends Event = Event> = TEvent & {
|
|
5
6
|
readonly currentTarget: TCurrentTarget;
|
|
6
7
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsx-runtime.d.ts","sourceRoot":"","sources":["../src/jsx-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"jsx-runtime.d.ts","sourceRoot":"","sources":["../src/jsx-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,QAAQ,EACR,0BAA0B,EAC3B,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EACV,WAAW,EACX,kBAAkB,EAClB,eAAe,EAChB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,QAAQ,EAAE,CAAC;AACpB,OAAO,EAAE,0BAA0B,EAAE,CAAC;AAEtC,MAAM,MAAM,QAAQ,CAClB,cAAc,SAAS,WAAW,EAClC,MAAM,SAAS,KAAK,GAAG,KAAK,IAC1B,MAAM,GAAG;IACX,QAAQ,CAAC,aAAa,EAAE,cAAc,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,eAAe,CACzB,cAAc,SAAS,WAAW,EAClC,MAAM,SAAS,KAAK,GAAG,KAAK,IAC1B,CAAC,KAAK,EAAE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,KAAK,OAAO,CAAC;AAEzD,MAAM,MAAM,SAAS,CAAC,cAAc,SAAS,WAAW,GAAG,OAAO,IAAI,QAAQ,CAC5E,cAAc,EACd,WAAW,CACZ,CAAC;AAEF,MAAM,MAAM,gBAAgB,CAAC,cAAc,SAAS,WAAW,GAAG,OAAO,IACvE,eAAe,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;AAE/C,MAAM,WAAW,gBAAgB,CAAC,QAAQ,SAAS,WAAW;IAC5D,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,OAAO,CAAC,EAAE,eAAe,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAChD,QAAQ,CAAC,EAAE,eAAe,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC5C,OAAO,CAAC,EAAE,eAAe,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAChD,QAAQ,CAAC,EAAE,eAAe,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;CACnD;AAED,MAAM,WAAW,iBAAiB,CAAC,QAAQ,SAAS,WAAW,CAC7D,SAAQ,gBAAgB,CAAC,QAAQ,CAAC;IAClC,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC;CAClC;AAED,MAAM,WAAW,sBAAsB;IACrC,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,iBAAiB,CAAC,eAAe,CAAC,GAAG;QACzC,QAAQ,CAAC,EAAE,eAAe,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;KAC1D,CAAC;IACF,KAAK,EAAE,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;IAC3C,MAAM,EAAE,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;IAC7C,QAAQ,EAAE,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;IACjD,MAAM,EAAE,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;IAC7C,MAAM,EAAE,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;IAC7C,CAAC,EAAE,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;IACxC,GAAG,EAAE,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;IACzC,IAAI,EAAE,iBAAiB,CAAC,WAAW,CAAC,CAAC;IACrC,GAAG,EAAE,iBAAiB,CAAC,cAAc,CAAC,CAAC;IACvC,IAAI,EAAE,iBAAiB,CAAC,eAAe,CAAC,CAAC;IACzC,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChD;AAED,yBAAiB,GAAG,CAAC;IACnB,UAAiB,OAAQ,SAAQ,kBAAkB;KAAG;IAEtD,UAAiB,mBAAoB,SAAQ,sBAAsB;KAAG;IAEtE,UAAiB,iBAAkB,SAAQ,oBAAoB;KAAG;CACnE;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,GAAG,CAAC;QACZ,UAAU,OAAQ,SAAQ,kBAAkB;SAAG;QAC/C,UAAU,mBAAoB,SAAQ,sBAAsB;SAAG;QAC/D,UAAU,iBAAkB,SAAQ,oBAAoB;SAAG;KAC5D;CACF;AAED,wBAAgB,GAAG,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnD,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,EACpB,KAAK,EAAE,CAAC,CAAC,GAAG;IAAE,QAAQ,CAAC,EAAE,eAAe,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,GAAG,IAAI,EAChF,GAAG,CAAC,EAAE,OAAO,GACZ,kBAAkB,CAAC,CAAC,CAAC,CAEvB;AAED,wBAAgB,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpD,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,EACpB,KAAK,EAAE,CAAC,CAAC,GAAG;IAAE,QAAQ,CAAC,EAAE,eAAe,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,GAAG,IAAI,EAChF,GAAG,CAAC,EAAE,OAAO,GACZ,kBAAkB,CAAC,CAAC,CAAC,CAEvB"}
|
package/dist/jsx-runtime.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { createElementFromJsxConfig, Fragment } from "./element.js";
|
|
1
|
+
import { createElementFromJsxConfig, Fragment, REACTIVE_TEXT_BINDING_META, } from "./element.js";
|
|
2
2
|
export { Fragment };
|
|
3
|
+
export { REACTIVE_TEXT_BINDING_META };
|
|
3
4
|
export function jsx(type, props, key) {
|
|
4
5
|
return createElementFromJsx(type, props, key);
|
|
5
6
|
}
|
package/dist/jsx-runtime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsx-runtime.js","sourceRoot":"","sources":["../src/jsx-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"jsx-runtime.js","sourceRoot":"","sources":["../src/jsx-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,QAAQ,EACR,0BAA0B,GAC3B,MAAM,cAAc,CAAC;AAOtB,OAAO,EAAE,QAAQ,EAAE,CAAC;AACpB,OAAO,EAAE,0BAA0B,EAAE,CAAC;AAyEtC,MAAM,UAAU,GAAG,CACjB,IAAoB,EACpB,KAAgF,EAChF,GAAa;IAEb,OAAO,oBAAoB,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,IAAI,CAClB,IAAoB,EACpB,KAAgF,EAChF,GAAa;IAEb,OAAO,oBAAoB,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,oBAAoB,CAC3B,IAAoB,EACpB,KAAgF,EAChF,GAAY;IAEZ,OAAO,0BAA0B,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;AACtD,CAAC","sourcesContent":["import {\n createElementFromJsxConfig,\n Fragment,\n REACTIVE_TEXT_BINDING_META,\n} from \"./element.js\";\nimport type {\n ElementType,\n ReactCompatElement,\n ReactCompatNode,\n} from \"./element.js\";\n\nexport { Fragment };\nexport { REACTIVE_TEXT_BINDING_META };\n\nexport type JSXEvent<\n TCurrentTarget extends EventTarget,\n TEvent extends Event = Event,\n> = TEvent & {\n readonly currentTarget: TCurrentTarget;\n};\n\nexport type JSXEventHandler<\n TCurrentTarget extends EventTarget,\n TEvent extends Event = Event,\n> = (event: JSXEvent<TCurrentTarget, TEvent>) => unknown;\n\nexport type FormEvent<TCurrentTarget extends EventTarget = Element> = JSXEvent<\n TCurrentTarget,\n SubmitEvent\n>;\n\nexport type FormEventHandler<TCurrentTarget extends EventTarget = Element> =\n JSXEventHandler<TCurrentTarget, SubmitEvent>;\n\nexport interface JSXDOMAttributes<TElement extends EventTarget> {\n children?: ReactCompatNode;\n onClick?: JSXEventHandler<TElement, MouseEvent>;\n onChange?: JSXEventHandler<TElement, Event>;\n onInput?: JSXEventHandler<TElement, InputEvent>;\n onSubmit?: JSXEventHandler<TElement, SubmitEvent>;\n}\n\nexport interface JSXHTMLAttributes<TElement extends HTMLElement>\n extends JSXDOMAttributes<TElement> {\n [attributeName: string]: unknown;\n}\n\nexport interface JSXIntrinsicAttributes {\n key?: unknown;\n ref?: unknown;\n}\n\nexport interface JSXIntrinsicElements {\n form: JSXHTMLAttributes<HTMLFormElement> & {\n onSubmit?: JSXEventHandler<HTMLFormElement, SubmitEvent>;\n };\n input: JSXHTMLAttributes<HTMLInputElement>;\n button: JSXHTMLAttributes<HTMLButtonElement>;\n textarea: JSXHTMLAttributes<HTMLTextAreaElement>;\n select: JSXHTMLAttributes<HTMLSelectElement>;\n option: JSXHTMLAttributes<HTMLOptionElement>;\n a: JSXHTMLAttributes<HTMLAnchorElement>;\n img: JSXHTMLAttributes<HTMLImageElement>;\n main: JSXHTMLAttributes<HTMLElement>;\n div: JSXHTMLAttributes<HTMLDivElement>;\n span: JSXHTMLAttributes<HTMLSpanElement>;\n [elementName: string]: Record<string, unknown>;\n}\n\nexport namespace JSX {\n export interface Element extends ReactCompatElement {}\n\n export interface IntrinsicAttributes extends JSXIntrinsicAttributes {}\n\n export interface IntrinsicElements extends JSXIntrinsicElements {}\n}\n\ndeclare global {\n namespace JSX {\n interface Element extends ReactCompatElement {}\n interface IntrinsicAttributes extends JSXIntrinsicAttributes {}\n interface IntrinsicElements extends JSXIntrinsicElements {}\n }\n}\n\nexport function jsx<P extends Record<string, unknown>>(\n type: ElementType<P>,\n props: (P & { children?: ReactCompatNode; key?: unknown; ref?: unknown }) | null,\n key?: unknown,\n): ReactCompatElement<P> {\n return createElementFromJsx(type, props, key);\n}\n\nexport function jsxs<P extends Record<string, unknown>>(\n type: ElementType<P>,\n props: (P & { children?: ReactCompatNode; key?: unknown; ref?: unknown }) | null,\n key?: unknown,\n): ReactCompatElement<P> {\n return createElementFromJsx(type, props, key);\n}\n\nfunction createElementFromJsx<P extends Record<string, unknown>>(\n type: ElementType<P>,\n props: (P & { children?: ReactCompatNode; key?: unknown; ref?: unknown }) | null,\n key: unknown,\n): ReactCompatElement<P> {\n return createElementFromJsxConfig(type, props, key);\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@reckona/mreact-compat",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.145",
|
|
4
4
|
"description": "React-compatible runtime implementation for mreact.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"compatibility",
|
|
@@ -69,7 +69,7 @@
|
|
|
69
69
|
"access": "public"
|
|
70
70
|
},
|
|
71
71
|
"dependencies": {
|
|
72
|
-
"@reckona/mreact-reactive-core": "0.0.
|
|
73
|
-
"@reckona/mreact-shared": "0.0.
|
|
72
|
+
"@reckona/mreact-reactive-core": "0.0.145",
|
|
73
|
+
"@reckona/mreact-shared": "0.0.145"
|
|
74
74
|
}
|
|
75
75
|
}
|
package/src/element.ts
CHANGED
|
@@ -15,6 +15,9 @@ export const HOST_OWN_PROPS_META = Symbol.for("modular.react.host_own_props_meta
|
|
|
15
15
|
export const HOST_CHILDREN_ONLY_PROPS_META = Symbol.for(
|
|
16
16
|
"modular.react.host_children_only_props_meta",
|
|
17
17
|
);
|
|
18
|
+
export const REACTIVE_TEXT_BINDING_META = Symbol.for(
|
|
19
|
+
"modular.react.reactive_text_binding_meta",
|
|
20
|
+
);
|
|
18
21
|
const hasOwnProperty = Object.prototype.hasOwnProperty;
|
|
19
22
|
|
|
20
23
|
export interface ReactCompatProviderType {
|
|
@@ -274,18 +277,19 @@ function copyElementProps(
|
|
|
274
277
|
base?: Record<string, unknown>,
|
|
275
278
|
omitChildren = false,
|
|
276
279
|
): Record<string, unknown> {
|
|
277
|
-
const props: Record<
|
|
280
|
+
const props: Record<PropertyKey, unknown> = {};
|
|
278
281
|
|
|
279
282
|
if (base !== undefined) {
|
|
280
283
|
copyOwnStringElementProps(base, props, omitChildren);
|
|
281
284
|
}
|
|
282
285
|
|
|
283
286
|
if (source === null || source === undefined) {
|
|
284
|
-
return props
|
|
287
|
+
return props as Record<string, unknown>;
|
|
285
288
|
}
|
|
286
289
|
|
|
287
290
|
copyOwnStringElementProps(source, props, omitChildren);
|
|
288
|
-
|
|
291
|
+
copyOwnSymbolElementProps(source, props);
|
|
292
|
+
return props as Record<string, unknown>;
|
|
289
293
|
}
|
|
290
294
|
|
|
291
295
|
function copyOwnStringElementProps(
|
|
@@ -310,6 +314,16 @@ function copyOwnStringElementProps(
|
|
|
310
314
|
}
|
|
311
315
|
}
|
|
312
316
|
|
|
317
|
+
function copyOwnSymbolElementProps(
|
|
318
|
+
source: Record<string, unknown>,
|
|
319
|
+
target: Record<PropertyKey, unknown>,
|
|
320
|
+
): void {
|
|
321
|
+
const symbolSource = source as Record<PropertyKey, unknown>;
|
|
322
|
+
for (const symbol of Object.getOwnPropertySymbols(source)) {
|
|
323
|
+
target[symbol] = symbolSource[symbol];
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
|
|
313
327
|
function normalizeElementType<P>(type: ElementType<P>): ElementType<P> {
|
|
314
328
|
return isReactCompatContextProviderShorthand(type) ? (type.Provider as ElementType<P>) : type;
|
|
315
329
|
}
|
package/src/hooks.ts
CHANGED
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
useContext,
|
|
12
12
|
withContextReadObserver,
|
|
13
13
|
} from "./context.js";
|
|
14
|
+
import { REACTIVE_TEXT_BINDING_META } from "./element.js";
|
|
14
15
|
import { isThenable } from "./thenable.js";
|
|
15
16
|
|
|
16
17
|
export interface RootRuntime {
|
|
@@ -124,7 +125,7 @@ export type DevToolsHookValue =
|
|
|
124
125
|
| { kind: "effect"; effectKind: "insertion" | "layout" | "normal"; deps?: readonly unknown[] };
|
|
125
126
|
|
|
126
127
|
type HookSlot =
|
|
127
|
-
| { kind: "state"; value: unknown; hostCommitValue?: unknown }
|
|
128
|
+
| { kind: "state"; value: unknown; hostCommitValue?: unknown; textBinding?: ReactiveTextBinding }
|
|
128
129
|
| {
|
|
129
130
|
kind: "action-state";
|
|
130
131
|
state: unknown;
|
|
@@ -195,6 +196,13 @@ const queuedTransitionRerenders = new Map<RootRuntime, TransitionContext>();
|
|
|
195
196
|
const queuedEventRerenders = new Set<RootRuntime>();
|
|
196
197
|
export const version = "19.2.6";
|
|
197
198
|
|
|
199
|
+
export interface ReactiveTextBinding {
|
|
200
|
+
value: unknown;
|
|
201
|
+
subscribers: Set<Text>;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
const reactiveTextBindingsByNode = new WeakMap<Text, ReactiveTextBinding>();
|
|
205
|
+
|
|
198
206
|
export function act<T>(callback: () => T): T extends PromiseLike<unknown> ? Promise<void> : void {
|
|
199
207
|
const previousPriority = currentEventPriority;
|
|
200
208
|
currentEventPriority = "discrete";
|
|
@@ -778,6 +786,20 @@ export function useState<T>(
|
|
|
778
786
|
}
|
|
779
787
|
|
|
780
788
|
slot.value = nextValue;
|
|
789
|
+
const canUseDirectTextBinding =
|
|
790
|
+
hookRenderState.hostCommitDepth === 0 &&
|
|
791
|
+
hookRenderState.currentRuntime !== runtime &&
|
|
792
|
+
hookRenderState.currentInstance !== instance &&
|
|
793
|
+
runtime.effectFlushPhase === undefined &&
|
|
794
|
+
eventBatchDepth === 0 &&
|
|
795
|
+
transitionDepth === 0 &&
|
|
796
|
+
optionsAllowDirectTextBinding(value) &&
|
|
797
|
+
updateDirectTextBinding(slot.textBinding, nextValue);
|
|
798
|
+
|
|
799
|
+
if (canUseDirectTextBinding) {
|
|
800
|
+
return;
|
|
801
|
+
}
|
|
802
|
+
|
|
781
803
|
if (hookRenderState.hostCommitDepth > 0) {
|
|
782
804
|
updateHostCommitDirtyState(instance);
|
|
783
805
|
hookRenderState.queuedHostCommitRerenders.add(runtime);
|
|
@@ -792,7 +814,86 @@ export function useState<T>(
|
|
|
792
814
|
value: slot.value,
|
|
793
815
|
});
|
|
794
816
|
|
|
795
|
-
|
|
817
|
+
const result = [slot.value as T, setState] as [
|
|
818
|
+
T,
|
|
819
|
+
(value: T | ((previous: T) => T)) => void,
|
|
820
|
+
] & Record<PropertyKey, unknown>;
|
|
821
|
+
result[REACTIVE_TEXT_BINDING_META] = getStateTextBinding(slot);
|
|
822
|
+
return result;
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
export function subscribeReactiveTextBinding(binding: unknown, node: Text): void {
|
|
826
|
+
if (!isReactiveTextBinding(binding)) {
|
|
827
|
+
clearReactiveTextBinding(node);
|
|
828
|
+
return;
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
const previous = reactiveTextBindingsByNode.get(node);
|
|
832
|
+
|
|
833
|
+
if (previous !== undefined && previous !== binding) {
|
|
834
|
+
previous.subscribers.delete(node);
|
|
835
|
+
}
|
|
836
|
+
|
|
837
|
+
reactiveTextBindingsByNode.set(node, binding);
|
|
838
|
+
binding.subscribers.add(node);
|
|
839
|
+
}
|
|
840
|
+
|
|
841
|
+
function clearReactiveTextBinding(node: Text): void {
|
|
842
|
+
const previous = reactiveTextBindingsByNode.get(node);
|
|
843
|
+
|
|
844
|
+
if (previous === undefined) {
|
|
845
|
+
return;
|
|
846
|
+
}
|
|
847
|
+
|
|
848
|
+
previous.subscribers.delete(node);
|
|
849
|
+
reactiveTextBindingsByNode.delete(node);
|
|
850
|
+
}
|
|
851
|
+
|
|
852
|
+
function getStateTextBinding(slot: Extract<HookSlot, { kind: "state" }>): ReactiveTextBinding {
|
|
853
|
+
slot.textBinding ??= {
|
|
854
|
+
value: slot.value,
|
|
855
|
+
subscribers: new Set(),
|
|
856
|
+
};
|
|
857
|
+
slot.textBinding.value = slot.value;
|
|
858
|
+
return slot.textBinding;
|
|
859
|
+
}
|
|
860
|
+
|
|
861
|
+
function optionsAllowDirectTextBinding(value: unknown): boolean {
|
|
862
|
+
return typeof value !== "function";
|
|
863
|
+
}
|
|
864
|
+
|
|
865
|
+
function updateDirectTextBinding(binding: ReactiveTextBinding | undefined, value: unknown): boolean {
|
|
866
|
+
if (binding === undefined || binding.subscribers.size === 0) {
|
|
867
|
+
return false;
|
|
868
|
+
}
|
|
869
|
+
|
|
870
|
+
let updated = false;
|
|
871
|
+
const nextText = String(value);
|
|
872
|
+
|
|
873
|
+
for (const node of binding.subscribers) {
|
|
874
|
+
if (node.parentNode === null) {
|
|
875
|
+
binding.subscribers.delete(node);
|
|
876
|
+
reactiveTextBindingsByNode.delete(node);
|
|
877
|
+
continue;
|
|
878
|
+
}
|
|
879
|
+
|
|
880
|
+
if (node.data !== nextText) {
|
|
881
|
+
node.data = nextText;
|
|
882
|
+
}
|
|
883
|
+
updated = true;
|
|
884
|
+
}
|
|
885
|
+
|
|
886
|
+
binding.value = value;
|
|
887
|
+
return updated;
|
|
888
|
+
}
|
|
889
|
+
|
|
890
|
+
function isReactiveTextBinding(value: unknown): value is ReactiveTextBinding {
|
|
891
|
+
return (
|
|
892
|
+
typeof value === "object" &&
|
|
893
|
+
value !== null &&
|
|
894
|
+
"subscribers" in value &&
|
|
895
|
+
(value as { subscribers?: unknown }).subscribers instanceof Set
|
|
896
|
+
);
|
|
796
897
|
}
|
|
797
898
|
|
|
798
899
|
export function useReducer<TState, TAction, TInitial = TState>(
|
package/src/host-reconciler.ts
CHANGED
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
LAZY_TYPE,
|
|
9
9
|
MEMO_TYPE,
|
|
10
10
|
Profiler,
|
|
11
|
+
REACTIVE_TEXT_BINDING_META,
|
|
11
12
|
STRICT_MODE_TYPE,
|
|
12
13
|
Suspense,
|
|
13
14
|
SuspenseList,
|
|
@@ -49,6 +50,7 @@ import {
|
|
|
49
50
|
collectRuntimeInstanceKeys,
|
|
50
51
|
hasContextDependency,
|
|
51
52
|
hasChangedContextDependency,
|
|
53
|
+
subscribeReactiveTextBinding,
|
|
52
54
|
type RootRuntime,
|
|
53
55
|
} from "./hooks.js";
|
|
54
56
|
import { isThenable } from "./thenable.js";
|
|
@@ -1653,7 +1655,8 @@ function commitHostDirtyFiber(
|
|
|
1653
1655
|
}
|
|
1654
1656
|
|
|
1655
1657
|
if (directTextChild !== undefined) {
|
|
1656
|
-
syncDirectHostTextChild(element, directTextChild);
|
|
1658
|
+
const text = syncDirectHostTextChild(element, directTextChild);
|
|
1659
|
+
subscribeReactiveHostTextBinding(props, text);
|
|
1657
1660
|
} else if (fiber.subtreeFlags !== NoFlags) {
|
|
1658
1661
|
commitHostDirtyChildren(fiber.child, element, eventRoot, `${path}.c`, options);
|
|
1659
1662
|
}
|
|
@@ -2043,7 +2046,8 @@ function commitHostFiber(
|
|
|
2043
2046
|
applyChangedRef(previousProps?.ref, props.ref, element);
|
|
2044
2047
|
}
|
|
2045
2048
|
if (directTextChild !== undefined) {
|
|
2046
|
-
syncDirectHostTextChild(element, directTextChild);
|
|
2049
|
+
const text = syncDirectHostTextChild(element, directTextChild);
|
|
2050
|
+
subscribeReactiveHostTextBinding(props, text);
|
|
2047
2051
|
} else if (
|
|
2048
2052
|
fiber.hostChildListChanged ||
|
|
2049
2053
|
fiber.childListChanged ||
|
|
@@ -2410,17 +2414,36 @@ function shouldUseDirectHostTextChild(): boolean {
|
|
|
2410
2414
|
return globalProcess?.env?.NODE_ENV === "production";
|
|
2411
2415
|
}
|
|
2412
2416
|
|
|
2413
|
-
function syncDirectHostTextChild(element: Element, text: string):
|
|
2417
|
+
function syncDirectHostTextChild(element: Element, text: string): Text {
|
|
2414
2418
|
const firstChild = element.firstChild;
|
|
2415
2419
|
|
|
2416
2420
|
if (firstChild instanceof Text && firstChild.nextSibling === null) {
|
|
2417
2421
|
if (firstChild.data !== text) {
|
|
2418
2422
|
firstChild.data = text;
|
|
2419
2423
|
}
|
|
2420
|
-
return;
|
|
2424
|
+
return firstChild;
|
|
2421
2425
|
}
|
|
2422
2426
|
|
|
2423
2427
|
element.textContent = text;
|
|
2428
|
+
const nextFirstChild = element.firstChild;
|
|
2429
|
+
|
|
2430
|
+
if (!(nextFirstChild instanceof Text)) {
|
|
2431
|
+
const textNode = document.createTextNode(text);
|
|
2432
|
+
element.replaceChildren(textNode);
|
|
2433
|
+
return textNode;
|
|
2434
|
+
}
|
|
2435
|
+
|
|
2436
|
+
return nextFirstChild;
|
|
2437
|
+
}
|
|
2438
|
+
|
|
2439
|
+
function subscribeReactiveHostTextBinding(
|
|
2440
|
+
props: Record<string, unknown>,
|
|
2441
|
+
text: Text,
|
|
2442
|
+
): void {
|
|
2443
|
+
subscribeReactiveTextBinding(
|
|
2444
|
+
(props as Record<PropertyKey, unknown>)[REACTIVE_TEXT_BINDING_META],
|
|
2445
|
+
text,
|
|
2446
|
+
);
|
|
2424
2447
|
}
|
|
2425
2448
|
|
|
2426
2449
|
function shouldPreserveContentEditableChildren(
|
package/src/jsx-dev-runtime.ts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
Fragment,
|
|
3
|
+
REACTIVE_TEXT_BINDING_META,
|
|
4
|
+
jsx,
|
|
5
|
+
} from "./jsx-runtime.js";
|
|
2
6
|
import type {
|
|
3
7
|
ElementType,
|
|
4
8
|
ReactCompatElement,
|
|
@@ -10,6 +14,7 @@ import type {
|
|
|
10
14
|
} from "./jsx-runtime.js";
|
|
11
15
|
|
|
12
16
|
export { Fragment };
|
|
17
|
+
export { REACTIVE_TEXT_BINDING_META };
|
|
13
18
|
export type {
|
|
14
19
|
FormEvent,
|
|
15
20
|
FormEventHandler,
|
package/src/jsx-runtime.ts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
createElementFromJsxConfig,
|
|
3
|
+
Fragment,
|
|
4
|
+
REACTIVE_TEXT_BINDING_META,
|
|
5
|
+
} from "./element.js";
|
|
2
6
|
import type {
|
|
3
7
|
ElementType,
|
|
4
8
|
ReactCompatElement,
|
|
@@ -6,6 +10,7 @@ import type {
|
|
|
6
10
|
} from "./element.js";
|
|
7
11
|
|
|
8
12
|
export { Fragment };
|
|
13
|
+
export { REACTIVE_TEXT_BINDING_META };
|
|
9
14
|
|
|
10
15
|
export type JSXEvent<
|
|
11
16
|
TCurrentTarget extends EventTarget,
|