@reckona/mreact-compat 0.0.91 → 0.0.92

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.
Files changed (104) hide show
  1. package/README.md +1 -0
  2. package/dist/class-component.d.ts +20 -6
  3. package/dist/class-component.d.ts.map +1 -1
  4. package/dist/class-component.js +94 -51
  5. package/dist/class-component.js.map +1 -1
  6. package/dist/context.d.ts +19 -3
  7. package/dist/context.d.ts.map +1 -1
  8. package/dist/context.js +55 -6
  9. package/dist/context.js.map +1 -1
  10. package/dist/dom-children.d.ts +2 -0
  11. package/dist/dom-children.d.ts.map +1 -1
  12. package/dist/dom-children.js +103 -1
  13. package/dist/dom-children.js.map +1 -1
  14. package/dist/dom-host-rules.d.ts +10 -0
  15. package/dist/dom-host-rules.d.ts.map +1 -0
  16. package/dist/dom-host-rules.js +86 -0
  17. package/dist/dom-host-rules.js.map +1 -0
  18. package/dist/dom-props.d.ts +3 -2
  19. package/dist/dom-props.d.ts.map +1 -1
  20. package/dist/dom-props.js +229 -33
  21. package/dist/dom-props.js.map +1 -1
  22. package/dist/element.d.ts +9 -4
  23. package/dist/element.d.ts.map +1 -1
  24. package/dist/element.js +101 -26
  25. package/dist/element.js.map +1 -1
  26. package/dist/event-listeners.d.ts +4 -4
  27. package/dist/event-listeners.d.ts.map +1 -1
  28. package/dist/event-listeners.js +1 -1
  29. package/dist/event-listeners.js.map +1 -1
  30. package/dist/event-types.d.ts +10 -0
  31. package/dist/event-types.d.ts.map +1 -1
  32. package/dist/event-types.js.map +1 -1
  33. package/dist/events.js +22 -1
  34. package/dist/events.js.map +1 -1
  35. package/dist/fiber-commit.d.ts +2 -1
  36. package/dist/fiber-commit.d.ts.map +1 -1
  37. package/dist/fiber-commit.js +13 -1
  38. package/dist/fiber-commit.js.map +1 -1
  39. package/dist/fiber-reconciler.d.ts.map +1 -1
  40. package/dist/fiber-reconciler.js +28 -7
  41. package/dist/fiber-reconciler.js.map +1 -1
  42. package/dist/fiber-work-loop.d.ts.map +1 -1
  43. package/dist/fiber-work-loop.js +4 -3
  44. package/dist/fiber-work-loop.js.map +1 -1
  45. package/dist/fiber.d.ts +5 -0
  46. package/dist/fiber.d.ts.map +1 -1
  47. package/dist/fiber.js +9 -0
  48. package/dist/fiber.js.map +1 -1
  49. package/dist/hooks-entry.d.ts +3 -0
  50. package/dist/hooks-entry.d.ts.map +1 -0
  51. package/dist/hooks-entry.js +2 -0
  52. package/dist/hooks-entry.js.map +1 -0
  53. package/dist/hooks.d.ts +39 -5
  54. package/dist/hooks.d.ts.map +1 -1
  55. package/dist/hooks.js +373 -326
  56. package/dist/hooks.js.map +1 -1
  57. package/dist/host-reconciler.d.ts +3 -0
  58. package/dist/host-reconciler.d.ts.map +1 -1
  59. package/dist/host-reconciler.js +1152 -64
  60. package/dist/host-reconciler.js.map +1 -1
  61. package/dist/hydration.d.ts +1 -1
  62. package/dist/hydration.d.ts.map +1 -1
  63. package/dist/hydration.js.map +1 -1
  64. package/dist/index.d.ts +2 -1
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +2 -1
  67. package/dist/index.js.map +1 -1
  68. package/dist/react-default.d.ts +4 -4
  69. package/dist/react-default.d.ts.map +1 -1
  70. package/dist/react-default.js +2 -1
  71. package/dist/react-default.js.map +1 -1
  72. package/dist/reconciler.d.ts.map +1 -1
  73. package/dist/reconciler.js +38 -22
  74. package/dist/reconciler.js.map +1 -1
  75. package/dist/root.d.ts.map +1 -1
  76. package/dist/root.js +48 -13
  77. package/dist/root.js.map +1 -1
  78. package/dist/server-render.d.ts +6 -0
  79. package/dist/server-render.d.ts.map +1 -0
  80. package/dist/server-render.js +307 -0
  81. package/dist/server-render.js.map +1 -0
  82. package/package.json +6 -2
  83. package/src/class-component.ts +216 -51
  84. package/src/context.ts +108 -9
  85. package/src/dom-children.ts +155 -1
  86. package/src/dom-host-rules.ts +115 -0
  87. package/src/dom-props.ts +297 -46
  88. package/src/element.ts +141 -31
  89. package/src/event-listeners.ts +6 -6
  90. package/src/event-types.ts +10 -0
  91. package/src/events.ts +32 -10
  92. package/src/fiber-commit.ts +16 -1
  93. package/src/fiber-reconciler.ts +39 -6
  94. package/src/fiber-work-loop.ts +4 -3
  95. package/src/fiber.ts +14 -0
  96. package/src/hooks-entry.ts +24 -0
  97. package/src/hooks.ts +482 -479
  98. package/src/host-reconciler.ts +1628 -94
  99. package/src/hydration.ts +1 -1
  100. package/src/index.ts +1 -1
  101. package/src/react-default.ts +1 -1
  102. package/src/reconciler.ts +61 -22
  103. package/src/root.ts +55 -12
  104. package/src/server-render.ts +478 -0
package/README.md CHANGED
@@ -22,6 +22,7 @@ compatibility runtime.
22
22
  - The main entrypoint includes a React-style default namespace export for dependencies that import React as an object.
23
23
  - `@reckona/mreact-compat/jsx-runtime` and `./jsx-dev-runtime` provide JSX
24
24
  runtime entrypoints.
25
+ - `@reckona/mreact-compat/hooks` exposes the hook runtime APIs for integrations that import hooks from a dedicated subpath.
25
26
  - `@reckona/mreact-compat/scheduler` exposes the scheduler-compatible API.
26
27
  - `@reckona/mreact-compat/flight` and `./internal` are framework integration
27
28
  entrypoints.
@@ -22,17 +22,28 @@ export interface ClassComponentType {
22
22
  getDerivedStateFromProps?: (nextProps: Record<string, unknown>, previousState: Record<string, unknown>) => Record<string, unknown> | null;
23
23
  getDerivedStateFromError?: (error: Error) => Record<string, unknown> | null;
24
24
  }
25
- export declare class Component<P extends Record<string, unknown> = Record<string, unknown>, S extends Record<string, unknown> = Record<string, unknown>> {
25
+ export interface Component<P extends Record<string, unknown> = Record<string, unknown>, S extends Record<string, unknown> = Record<string, unknown>> {
26
26
  props: P;
27
27
  state?: S;
28
- setState: ClassComponentInstance["setState"];
29
- forceUpdate: ClassComponentInstance["forceUpdate"];
30
- constructor(props: P);
28
+ setState(partial: Partial<S> | ((previousState: Readonly<S>, props: Readonly<P>) => Partial<S> | S | null), callback?: () => void): void;
29
+ forceUpdate(callback?: () => void): void;
31
30
  render(): ReactCompatNode;
32
31
  }
33
- export declare class PureComponent<P extends Record<string, unknown> = Record<string, unknown>, S extends Record<string, unknown> = Record<string, unknown>> extends Component<P, S> {
32
+ export interface ComponentConstructor {
33
+ new <P extends Record<string, unknown> = Record<string, unknown>, S extends Record<string, unknown> = Record<string, unknown>>(props: P): Component<P, S>;
34
+ <P extends Record<string, unknown> = Record<string, unknown>, S extends Record<string, unknown> = Record<string, unknown>>(this: Component<P, S>, props: P): void;
35
+ prototype: Component<any, any>;
36
+ }
37
+ export declare const Component: ComponentConstructor;
38
+ export interface PureComponent<P extends Record<string, unknown> = Record<string, unknown>, S extends Record<string, unknown> = Record<string, unknown>> extends Component<P, S> {
34
39
  shouldComponentUpdate(nextProps: P, nextState: S): boolean;
35
40
  }
41
+ export interface PureComponentConstructor {
42
+ new <P extends Record<string, unknown> = Record<string, unknown>, S extends Record<string, unknown> = Record<string, unknown>>(props: P): PureComponent<P, S>;
43
+ <P extends Record<string, unknown> = Record<string, unknown>, S extends Record<string, unknown> = Record<string, unknown>>(this: PureComponent<P, S>, props: P): void;
44
+ prototype: PureComponent<any, any>;
45
+ }
46
+ export declare const PureComponent: PureComponentConstructor;
36
47
  export type ClassComponentRenderResult = {
37
48
  kind: "render";
38
49
  node: ReactCompatNode;
@@ -42,8 +53,11 @@ export type ClassComponentRenderResult = {
42
53
  kind: "skip";
43
54
  };
44
55
  export declare function reconcileClassComponent(parent: ParentNode, previousNodes: readonly Node[], type: ClassComponentType, props: Record<string, unknown>, runtime: RootRuntime, path: string, options: RenderOptions, reconcileNode: ReconcileNode, onInstance?: (instance: ClassComponentInstance) => void): ReconcileResult;
45
- export declare function renderClassComponentWithRuntime(type: ClassComponentType, props: Record<string, unknown>, runtime: RootRuntime, path: string): ClassComponentRenderResult;
56
+ export declare function renderClassComponentWithRuntime(type: ClassComponentType, props: Record<string, unknown>, runtime: RootRuntime, path: string, options?: {
57
+ hasDirtyDescendant?: boolean;
58
+ }): ClassComponentRenderResult;
46
59
  export declare function applyDerivedStateFromProps(type: ClassComponentType, instance: ClassComponentInstance, nextProps: Record<string, unknown>, previousState: Record<string, unknown>): void;
60
+ export declare function resolveDerivedStateFromProps(type: ClassComponentType, nextProps: Record<string, unknown>, previousState: Record<string, unknown>): Record<string, unknown>;
47
61
  export declare function recoverClassComponentError(type: ClassComponentType, instance: ClassComponentInstance, error: unknown): ReactCompatNode | undefined;
48
62
  export declare function isClassComponentType(value: unknown): value is ClassComponentType;
49
63
  export declare function reconcileErrorBoundary(parent: ParentNode, previousNodes: readonly Node[], element: ReactCompatElement, runtime: RootRuntime, path: string, options: RenderOptions, reconcileNode: ReconcileNode): ReconcileResult;
@@ -1 +1 @@
1
- {"version":3,"file":"class-component.d.ts","sourceRoot":"","sources":["../src/class-component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"class-component.d.ts","sourceRoot":"","sources":["../src/class-component.ts"],"names":[],"mappings":"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"}
@@ -2,24 +2,34 @@ import { renderWithRootRuntime, useLayoutEffect, useRef } from "./hooks.js";
2
2
  import { withHydrationComponentStack } from "./hydration.js";
3
3
  import { isThenable } from "./thenable.js";
4
4
  import { shallowEqual } from "./prop-comparison.js";
5
- export class Component {
6
- props;
7
- state;
8
- setState;
9
- forceUpdate;
10
- constructor(props) {
11
- this.props = props;
12
- }
13
- render() {
14
- return null;
15
- }
16
- }
17
- export class PureComponent extends Component {
18
- shouldComponentUpdate(nextProps, nextState) {
19
- return !shallowEqual(this.props, nextProps) || !shallowEqual(this.state ?? {}, nextState ?? {});
20
- }
21
- }
22
- const classLifecycleSnapshots = new WeakMap();
5
+ const CLASS_COMPONENT_RUNTIME_OWNER = Symbol.for("modular.react.class_component_runtime");
6
+ export const Component = function Component(props) {
7
+ this.props = props;
8
+ };
9
+ Component.prototype.setState = function setState(partial, callback) {
10
+ enqueueClassSetState(this, partial, callback);
11
+ };
12
+ Component.prototype.forceUpdate = function forceUpdate(callback) {
13
+ enqueueClassForceUpdate(this, callback);
14
+ };
15
+ Component.prototype.render = function render() {
16
+ return null;
17
+ };
18
+ export const PureComponent = function PureComponent(props) {
19
+ Component.call(this, props);
20
+ };
21
+ PureComponent.prototype = Object.create(Component.prototype);
22
+ PureComponent.prototype.constructor = PureComponent;
23
+ PureComponent.prototype.shouldComponentUpdate = function shouldComponentUpdate(nextProps, nextState) {
24
+ return !shallowEqual(this.props, nextProps) || !shallowEqual(this.state ?? {}, nextState ?? {});
25
+ };
26
+ const CLASS_COMPONENT_STATE_KEY = Symbol.for("modular.react.class_component_state");
27
+ const classComponentGlobalState = (globalThis[CLASS_COMPONENT_STATE_KEY] ??= {
28
+ lifecycleSnapshots: new WeakMap(),
29
+ updateContexts: new WeakMap(),
30
+ });
31
+ const classLifecycleSnapshots = classComponentGlobalState.lifecycleSnapshots;
32
+ const classUpdateContexts = classComponentGlobalState.updateContexts;
23
33
  export function reconcileClassComponent(parent, previousNodes, type, props, runtime, path, options, reconcileNode, onInstance) {
24
34
  const rendered = renderClassComponentWithRuntime(type, props, runtime, path);
25
35
  if (rendered.kind === "skip") {
@@ -38,7 +48,7 @@ export function reconcileClassComponent(parent, previousNodes, type, props, runt
38
48
  return reconcileNode(parent, previousNodes, fallbackNode, runtime, `${path}.class.fallback`, childOptions);
39
49
  }
40
50
  }
41
- export function renderClassComponentWithRuntime(type, props, runtime, path) {
51
+ export function renderClassComponentWithRuntime(type, props, runtime, path, options = {}) {
42
52
  return renderWithRootRuntime(runtime, path, () => {
43
53
  const instanceRef = useRef(undefined);
44
54
  const didCommitRef = useRef(false);
@@ -47,6 +57,7 @@ export function renderClassComponentWithRuntime(type, props, runtime, path) {
47
57
  const replacedInstance = hasDifferentType ? previousInstance : undefined;
48
58
  if (hasDifferentType) {
49
59
  classLifecycleSnapshots.delete(previousInstance);
60
+ classUpdateContexts.delete(previousInstance);
50
61
  didCommitRef.current = false;
51
62
  instanceRef.current = undefined;
52
63
  }
@@ -57,13 +68,14 @@ export function renderClassComponentWithRuntime(type, props, runtime, path) {
57
68
  const snapshot = classLifecycleSnapshots.get(instance);
58
69
  const previousState = snapshot?.previousState ?? instance.state ?? {};
59
70
  instanceRef.current = instance;
60
- installClassUpdateMethods(instance, runtime);
61
- applyDerivedStateFromProps(type, instance, props, previousState);
62
- const nextState = instance.state ?? {};
71
+ installClassUpdateMethods(instance, runtime, path);
72
+ const nextState = resolveDerivedStateFromProps(type, props, snapshot?.nextState ?? instance.state ?? {});
63
73
  const shouldSkipUpdate = didCommitRef.current &&
64
74
  snapshot?.force !== true &&
75
+ options.hasDirtyDescendant !== true &&
65
76
  instance.shouldComponentUpdate?.(props, nextState) === false;
66
77
  instance.props = props;
78
+ instance.state = nextState;
67
79
  installClassLifecycleEffects(instance, didCommitRef, previousProps, previousState, shouldSkipUpdate, replacedInstance);
68
80
  if (shouldSkipUpdate) {
69
81
  return { kind: "skip" };
@@ -85,15 +97,18 @@ export function renderClassComponentWithRuntime(type, props, runtime, path) {
85
97
  }
86
98
  return { kind: "render", node: fallbackNode, instance, type };
87
99
  }
88
- });
100
+ }, CLASS_COMPONENT_RUNTIME_OWNER);
89
101
  }
90
102
  export function applyDerivedStateFromProps(type, instance, nextProps, previousState) {
103
+ instance.state = resolveDerivedStateFromProps(type, nextProps, previousState);
104
+ }
105
+ export function resolveDerivedStateFromProps(type, nextProps, previousState) {
91
106
  const derivedState = type.getDerivedStateFromProps?.(nextProps, previousState);
92
107
  if (derivedState === undefined || derivedState === null) {
93
- return;
108
+ return previousState;
94
109
  }
95
- instance.state = {
96
- ...instance.state,
110
+ return {
111
+ ...previousState,
97
112
  ...derivedState,
98
113
  };
99
114
  }
@@ -140,36 +155,63 @@ export function reconcileErrorBoundary(parent, previousNodes, element, runtime,
140
155
  return reconcileNode(parent, previousNodes, fallbackNode, runtime, `${path}.eb.fallback`, options);
141
156
  }
142
157
  }
143
- function installClassUpdateMethods(instance, runtime) {
144
- instance.setState = (partial, callback) => {
145
- const previousState = instance.state ?? {};
146
- if (!classLifecycleSnapshots.has(instance)) {
147
- classLifecycleSnapshots.set(instance, { previousState });
148
- }
149
- const nextPartial = typeof partial === "function"
150
- ? partial(previousState, instance.props)
151
- : partial;
152
- if (nextPartial !== null) {
153
- instance.state = {
154
- ...previousState,
155
- ...nextPartial,
156
- };
157
- }
158
- runtime.rerender();
158
+ function installClassUpdateMethods(instance, runtime, path) {
159
+ classUpdateContexts.set(instance, { runtime, path });
160
+ instance.setState = Component.prototype.setState;
161
+ instance.forceUpdate = Component.prototype.forceUpdate;
162
+ }
163
+ function enqueueClassSetState(instance, partial, callback) {
164
+ const updateContext = classUpdateContexts.get(instance);
165
+ if (updateContext === undefined) {
159
166
  callback?.call(instance);
160
- };
161
- instance.forceUpdate = (callback) => {
162
- classLifecycleSnapshots.set(instance, {
163
- previousState: instance.state ?? {},
164
- force: true,
165
- });
166
- runtime.rerender();
167
+ return;
168
+ }
169
+ const snapshot = classLifecycleSnapshots.get(instance);
170
+ const previousState = snapshot?.previousState ?? instance.state ?? {};
171
+ const baseState = snapshot?.nextState ?? instance.state ?? {};
172
+ const nextPartial = typeof partial === "function"
173
+ ? partial(baseState, instance.props)
174
+ : partial;
175
+ const nextState = nextPartial === null
176
+ ? baseState
177
+ : {
178
+ ...baseState,
179
+ ...nextPartial,
180
+ };
181
+ classLifecycleSnapshots.set(instance, {
182
+ ...snapshot,
183
+ previousState,
184
+ nextState,
185
+ });
186
+ markClassInstanceDirty(updateContext);
187
+ callback?.call(instance);
188
+ }
189
+ function enqueueClassForceUpdate(instance, callback) {
190
+ const updateContext = classUpdateContexts.get(instance);
191
+ if (updateContext === undefined) {
167
192
  callback?.call(instance);
168
- };
193
+ return;
194
+ }
195
+ classLifecycleSnapshots.set(instance, {
196
+ previousState: instance.state ?? {},
197
+ force: true,
198
+ });
199
+ markClassInstanceDirty(updateContext);
200
+ callback?.call(instance);
201
+ }
202
+ function markClassInstanceDirty(updateContext) {
203
+ const runtimeInstance = updateContext.runtime.instances.get(updateContext.path);
204
+ if (runtimeInstance !== undefined) {
205
+ runtimeInstance.dirty = true;
206
+ }
207
+ updateContext.runtime.rerender();
169
208
  }
170
209
  function installClassLifecycleEffects(instance, didCommitRef, previousProps, previousState, skipUpdate, replacedInstance) {
171
210
  useLayoutEffect(() => {
172
- replacedInstance?.componentWillUnmount?.();
211
+ if (replacedInstance !== undefined) {
212
+ replacedInstance.componentWillUnmount?.();
213
+ classUpdateContexts.delete(replacedInstance);
214
+ }
173
215
  if (skipUpdate) {
174
216
  classLifecycleSnapshots.delete(instance);
175
217
  return;
@@ -187,6 +229,7 @@ function installClassLifecycleEffects(instance, didCommitRef, previousProps, pre
187
229
  return () => {
188
230
  instance.componentWillUnmount?.();
189
231
  classLifecycleSnapshots.delete(instance);
232
+ classUpdateContexts.delete(instance);
190
233
  };
191
234
  }, []);
192
235
  }
@@ -1 +1 @@
1
- {"version":3,"file":"class-component.js","sourceRoot":"","sources":["../src/class-component.ts"],"names":[],"mappings":"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","sourcesContent":["import { renderWithRootRuntime, useLayoutEffect, useRef, type RootRuntime } from \"./hooks.js\";\nimport type { ReactCompatElement, ReactCompatNode } from \"./element.js\";\nimport { withHydrationComponentStack, type RenderOptions } from \"./hydration.js\";\nimport type { ReconcileNode, ReconcileResult } from \"./reconcile-types.js\";\nimport { isThenable } from \"./thenable.js\";\nimport { shallowEqual } from \"./prop-comparison.js\";\n\nexport interface ClassComponentInstance {\n props: Record<string, unknown>;\n state?: Record<string, unknown>;\n setState?: (\n partial:\n | Record<string, unknown>\n | ((\n previousState: Record<string, unknown>,\n props: Record<string, unknown>,\n ) => Record<string, unknown> | null),\n callback?: () => void,\n ) => void;\n forceUpdate?: (callback?: () => void) => void;\n render(): ReactCompatNode;\n componentDidMount?: () => void;\n componentDidUpdate?: (\n previousProps: Record<string, unknown>,\n previousState: Record<string, unknown>,\n snapshot?: unknown,\n ) => void;\n componentWillUnmount?: () => void;\n shouldComponentUpdate?: (\n nextProps: Record<string, unknown>,\n nextState: Record<string, unknown>,\n ) => boolean;\n getSnapshotBeforeUpdate?: (\n previousProps: Record<string, unknown>,\n previousState: Record<string, unknown>,\n ) => unknown;\n componentDidCatch?: (error: Error, info: { componentStack: string }) => void;\n}\n\nexport interface ClassComponentType {\n new (props: Record<string, unknown>): ClassComponentInstance;\n getDerivedStateFromProps?: (\n nextProps: Record<string, unknown>,\n previousState: Record<string, unknown>,\n ) => Record<string, unknown> | null;\n getDerivedStateFromError?: (error: Error) => Record<string, unknown> | null;\n}\n\nexport class Component<\n P extends Record<string, unknown> = Record<string, unknown>,\n S extends Record<string, unknown> = Record<string, unknown>,\n> {\n props: P;\n state?: S;\n setState!: ClassComponentInstance[\"setState\"];\n forceUpdate!: ClassComponentInstance[\"forceUpdate\"];\n\n constructor(props: P) {\n this.props = props;\n }\n\n render(): ReactCompatNode {\n return null;\n }\n}\n\nexport class PureComponent<\n P extends Record<string, unknown> = Record<string, unknown>,\n S extends Record<string, unknown> = Record<string, unknown>,\n> extends Component<P, S> {\n shouldComponentUpdate(nextProps: P, nextState: S): boolean {\n return !shallowEqual(this.props, nextProps) || !shallowEqual(this.state ?? {}, nextState ?? {});\n }\n}\n\ninterface ClassLifecycleSnapshot {\n previousState?: Record<string, unknown>;\n force?: boolean;\n snapshot?: unknown;\n}\n\nconst classLifecycleSnapshots = new WeakMap<\n ClassComponentInstance,\n ClassLifecycleSnapshot\n>();\n\nexport type ClassComponentRenderResult =\n | {\n kind: \"render\";\n node: ReactCompatNode;\n instance: ClassComponentInstance;\n type: ClassComponentType;\n }\n | { kind: \"skip\" };\n\nexport function reconcileClassComponent(\n parent: ParentNode,\n previousNodes: readonly Node[],\n type: ClassComponentType,\n props: Record<string, unknown>,\n runtime: RootRuntime,\n path: string,\n options: RenderOptions,\n reconcileNode: ReconcileNode,\n onInstance?: (instance: ClassComponentInstance) => void,\n): ReconcileResult {\n const rendered = renderClassComponentWithRuntime(type, props, runtime, path);\n\n if (rendered.kind === \"skip\") {\n return { nodes: previousNodes.slice(0, 1), consumed: previousNodes.length };\n }\n\n onInstance?.(rendered.instance);\n const childOptions = withHydrationComponentStack(\n options,\n getClassComponentName(type),\n );\n\n try {\n return reconcileNode(\n parent,\n previousNodes,\n rendered.node,\n runtime,\n `${path}.class`,\n childOptions,\n );\n } catch (error) {\n const fallbackNode = recoverClassComponentError(\n rendered.type,\n rendered.instance,\n error,\n );\n\n if (fallbackNode === undefined) {\n throw error;\n }\n\n return reconcileNode(\n parent,\n previousNodes,\n fallbackNode,\n runtime,\n `${path}.class.fallback`,\n childOptions,\n );\n }\n}\n\nexport function renderClassComponentWithRuntime(\n type: ClassComponentType,\n props: Record<string, unknown>,\n runtime: RootRuntime,\n path: string,\n): ClassComponentRenderResult {\n return renderWithRootRuntime(runtime, path, () => {\n const instanceRef = useRef<ClassComponentInstance | undefined>(undefined);\n const didCommitRef = useRef(false);\n const previousInstance = instanceRef.current;\n const hasDifferentType =\n previousInstance !== undefined && !(previousInstance instanceof type);\n const replacedInstance = hasDifferentType ? previousInstance : undefined;\n\n if (hasDifferentType) {\n classLifecycleSnapshots.delete(previousInstance);\n didCommitRef.current = false;\n instanceRef.current = undefined;\n }\n\n const instance =\n instanceRef.current !== undefined && instanceRef.current instanceof type\n ? instanceRef.current\n : new type(props);\n const previousProps = instance.props;\n const snapshot = classLifecycleSnapshots.get(instance);\n const previousState = snapshot?.previousState ?? instance.state ?? {};\n\n instanceRef.current = instance;\n installClassUpdateMethods(instance, runtime);\n applyDerivedStateFromProps(type, instance, props, previousState);\n const nextState = instance.state ?? {};\n const shouldSkipUpdate =\n didCommitRef.current &&\n snapshot?.force !== true &&\n instance.shouldComponentUpdate?.(props, nextState) === false;\n\n instance.props = props;\n installClassLifecycleEffects(\n instance,\n didCommitRef,\n previousProps,\n previousState,\n shouldSkipUpdate,\n replacedInstance,\n );\n\n if (shouldSkipUpdate) {\n return { kind: \"skip\" };\n }\n\n try {\n const node = instance.render();\n\n if (didCommitRef.current) {\n classLifecycleSnapshots.set(instance, {\n ...classLifecycleSnapshots.get(instance),\n snapshot: instance.getSnapshotBeforeUpdate?.(\n previousProps ?? {},\n previousState,\n ),\n });\n }\n\n return { kind: \"render\", node, instance, type };\n } catch (error) {\n const fallbackNode = recoverClassComponentError(type, instance, error);\n\n if (fallbackNode === undefined) {\n throw error;\n }\n\n return { kind: \"render\", node: fallbackNode, instance, type };\n }\n });\n}\n\nexport function applyDerivedStateFromProps(\n type: ClassComponentType,\n instance: ClassComponentInstance,\n nextProps: Record<string, unknown>,\n previousState: Record<string, unknown>,\n): void {\n const derivedState = type.getDerivedStateFromProps?.(nextProps, previousState);\n\n if (derivedState === undefined || derivedState === null) {\n return;\n }\n\n instance.state = {\n ...instance.state,\n ...derivedState,\n };\n}\n\nexport function recoverClassComponentError(\n type: ClassComponentType,\n instance: ClassComponentInstance,\n error: unknown,\n): ReactCompatNode | undefined {\n if (isThenable(error) || !isErrorBoundaryClass(type, instance)) {\n return undefined;\n }\n\n const normalizedError =\n error instanceof Error ? error : new Error(String(error));\n const derivedState = type.getDerivedStateFromError?.(normalizedError);\n\n if (derivedState !== undefined && derivedState !== null) {\n instance.state = {\n ...instance.state,\n ...derivedState,\n };\n }\n\n instance.componentDidCatch?.(normalizedError, { componentStack: \"\" });\n return instance.render();\n}\n\nexport function isClassComponentType(value: unknown): value is ClassComponentType {\n return (\n typeof value === \"function\" &&\n typeof (value as { prototype?: { render?: unknown } }).prototype?.render ===\n \"function\"\n );\n}\n\nfunction getClassComponentName(type: ClassComponentType): string {\n return type.name === \"\" ? \"Anonymous\" : type.name;\n}\n\nexport function reconcileErrorBoundary(\n parent: ParentNode,\n previousNodes: readonly Node[],\n element: ReactCompatElement,\n runtime: RootRuntime,\n path: string,\n options: RenderOptions,\n reconcileNode: ReconcileNode,\n): ReconcileResult {\n try {\n return reconcileNode(\n parent,\n previousNodes,\n element.props.children,\n runtime,\n `${path}.eb`,\n options,\n );\n } catch (error) {\n if (isThenable(error)) {\n throw error;\n }\n\n const normalizedError =\n error instanceof Error ? error : new Error(String(error));\n const onError = element.props.onError;\n\n if (typeof onError === \"function\") {\n (onError as (error: Error) => void)(normalizedError);\n }\n\n const fallback = element.props.fallback;\n const fallbackNode =\n typeof fallback === \"function\"\n ? (fallback as (error: Error) => ReactCompatNode)(normalizedError)\n : null;\n\n return reconcileNode(\n parent,\n previousNodes,\n fallbackNode,\n runtime,\n `${path}.eb.fallback`,\n options,\n );\n }\n}\n\nfunction installClassUpdateMethods(\n instance: ClassComponentInstance,\n runtime: RootRuntime,\n): void {\n instance.setState = (partial, callback): void => {\n const previousState = instance.state ?? {};\n if (!classLifecycleSnapshots.has(instance)) {\n classLifecycleSnapshots.set(instance, { previousState });\n }\n const nextPartial =\n typeof partial === \"function\"\n ? partial(previousState, instance.props)\n : partial;\n\n if (nextPartial !== null) {\n instance.state = {\n ...previousState,\n ...nextPartial,\n };\n }\n\n runtime.rerender();\n callback?.call(instance);\n };\n instance.forceUpdate = (callback): void => {\n classLifecycleSnapshots.set(instance, {\n previousState: instance.state ?? {},\n force: true,\n });\n runtime.rerender();\n callback?.call(instance);\n };\n}\n\nfunction installClassLifecycleEffects(\n instance: ClassComponentInstance,\n didCommitRef: { current: boolean },\n previousProps: Record<string, unknown> | undefined,\n previousState: Record<string, unknown>,\n skipUpdate: boolean,\n replacedInstance?: ClassComponentInstance,\n): void {\n useLayoutEffect(() => {\n replacedInstance?.componentWillUnmount?.();\n\n if (skipUpdate) {\n classLifecycleSnapshots.delete(instance);\n return;\n }\n\n if (didCommitRef.current) {\n instance.componentDidUpdate?.(\n previousProps ?? {},\n previousState,\n classLifecycleSnapshots.get(instance)?.snapshot,\n );\n } else {\n didCommitRef.current = true;\n instance.componentDidMount?.();\n }\n\n classLifecycleSnapshots.delete(instance);\n });\n\n useLayoutEffect(() => {\n return () => {\n instance.componentWillUnmount?.();\n classLifecycleSnapshots.delete(instance);\n };\n }, []);\n}\n\nfunction isErrorBoundaryClass(\n type: ClassComponentType,\n instance: ClassComponentInstance,\n): boolean {\n return (\n typeof type.getDerivedStateFromError === \"function\" ||\n typeof instance.componentDidCatch === \"function\"\n );\n}\n"]}
1
+ {"version":3,"file":"class-component.js","sourceRoot":"","sources":["../src/class-component.ts"],"names":[],"mappings":"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","sourcesContent":["import { renderWithRootRuntime, useLayoutEffect, useRef, type RootRuntime } from \"./hooks.js\";\nimport type { ReactCompatElement, ReactCompatNode } from \"./element.js\";\nimport { withHydrationComponentStack, type RenderOptions } from \"./hydration.js\";\nimport type { ReconcileNode, ReconcileResult } from \"./reconcile-types.js\";\nimport { isThenable } from \"./thenable.js\";\nimport { shallowEqual } from \"./prop-comparison.js\";\n\nconst CLASS_COMPONENT_RUNTIME_OWNER = Symbol.for(\"modular.react.class_component_runtime\");\n\nexport interface ClassComponentInstance {\n props: Record<string, unknown>;\n state?: Record<string, unknown>;\n setState?: (\n partial:\n | Record<string, unknown>\n | ((\n previousState: Record<string, unknown>,\n props: Record<string, unknown>,\n ) => Record<string, unknown> | null),\n callback?: () => void,\n ) => void;\n forceUpdate?: (callback?: () => void) => void;\n render(): ReactCompatNode;\n componentDidMount?: () => void;\n componentDidUpdate?: (\n previousProps: Record<string, unknown>,\n previousState: Record<string, unknown>,\n snapshot?: unknown,\n ) => void;\n componentWillUnmount?: () => void;\n shouldComponentUpdate?: (\n nextProps: Record<string, unknown>,\n nextState: Record<string, unknown>,\n ) => boolean;\n getSnapshotBeforeUpdate?: (\n previousProps: Record<string, unknown>,\n previousState: Record<string, unknown>,\n ) => unknown;\n componentDidCatch?: (error: Error, info: { componentStack: string }) => void;\n}\n\nexport interface ClassComponentType {\n new (props: Record<string, unknown>): ClassComponentInstance;\n getDerivedStateFromProps?: (\n nextProps: Record<string, unknown>,\n previousState: Record<string, unknown>,\n ) => Record<string, unknown> | null;\n getDerivedStateFromError?: (error: Error) => Record<string, unknown> | null;\n}\n\nexport interface Component<\n P extends Record<string, unknown> = Record<string, unknown>,\n S extends Record<string, unknown> = Record<string, unknown>,\n> {\n props: P;\n state?: S;\n setState(\n partial:\n | Partial<S>\n | ((\n previousState: Readonly<S>,\n props: Readonly<P>,\n ) => Partial<S> | S | null),\n callback?: () => void,\n ): void;\n forceUpdate(callback?: () => void): void;\n render(): ReactCompatNode;\n}\n\nexport interface ComponentConstructor {\n new <\n P extends Record<string, unknown> = Record<string, unknown>,\n S extends Record<string, unknown> = Record<string, unknown>,\n >(props: P): Component<P, S>;\n <\n P extends Record<string, unknown> = Record<string, unknown>,\n S extends Record<string, unknown> = Record<string, unknown>,\n >(this: Component<P, S>, props: P): void;\n prototype: Component<any, any>;\n}\n\nexport const Component: ComponentConstructor = function Component<\n P extends Record<string, unknown> = Record<string, unknown>,\n S extends Record<string, unknown> = Record<string, unknown>,\n>(this: Component<P, S>, props: P): void {\n this.props = props;\n} as ComponentConstructor;\n\nComponent.prototype.setState = function setState<\n P extends Record<string, unknown>,\n S extends Record<string, unknown>,\n>(\n this: Component<P, S>,\n partial:\n | Partial<S>\n | ((\n previousState: Readonly<S>,\n props: Readonly<P>,\n ) => Partial<S> | S | null),\n callback?: () => void,\n): void {\n enqueueClassSetState(\n this as unknown as ClassComponentInstance,\n partial as Parameters<NonNullable<ClassComponentInstance[\"setState\"]>>[0],\n callback,\n );\n};\n\nComponent.prototype.forceUpdate = function forceUpdate(\n this: Component,\n callback?: () => void,\n): void {\n enqueueClassForceUpdate(this as unknown as ClassComponentInstance, callback);\n};\n\nComponent.prototype.render = function render(): ReactCompatNode {\n return null;\n};\n\nexport interface PureComponent<\n P extends Record<string, unknown> = Record<string, unknown>,\n S extends Record<string, unknown> = Record<string, unknown>,\n> extends Component<P, S> {\n shouldComponentUpdate(nextProps: P, nextState: S): boolean;\n}\n\nexport interface PureComponentConstructor {\n new <\n P extends Record<string, unknown> = Record<string, unknown>,\n S extends Record<string, unknown> = Record<string, unknown>,\n >(props: P): PureComponent<P, S>;\n <\n P extends Record<string, unknown> = Record<string, unknown>,\n S extends Record<string, unknown> = Record<string, unknown>,\n >(this: PureComponent<P, S>, props: P): void;\n prototype: PureComponent<any, any>;\n}\n\nexport const PureComponent: PureComponentConstructor = function PureComponent<\n P extends Record<string, unknown> = Record<string, unknown>,\n S extends Record<string, unknown> = Record<string, unknown>,\n>(this: PureComponent<P, S>, props: P): void {\n (Component as unknown as (this: unknown, props: unknown) => void).call(\n this,\n props,\n );\n} as PureComponentConstructor;\n\nPureComponent.prototype = Object.create(Component.prototype) as PureComponent<any, any>;\nPureComponent.prototype.constructor = PureComponent;\nPureComponent.prototype.shouldComponentUpdate = function shouldComponentUpdate<\n P extends Record<string, unknown>,\n S extends Record<string, unknown>,\n>(\n this: PureComponent<P, S>,\n nextProps: P,\n nextState: S,\n): boolean {\n return !shallowEqual(this.props, nextProps) || !shallowEqual(this.state ?? {}, nextState ?? {});\n};\n\ninterface ClassLifecycleSnapshot {\n previousState?: Record<string, unknown>;\n nextState?: Record<string, unknown>;\n force?: boolean;\n snapshot?: unknown;\n}\n\ninterface ClassUpdateContext {\n runtime: RootRuntime;\n path: string;\n}\n\ninterface ClassComponentGlobalState {\n lifecycleSnapshots: WeakMap<ClassComponentInstance, ClassLifecycleSnapshot>;\n updateContexts: WeakMap<ClassComponentInstance, ClassUpdateContext>;\n}\n\nconst CLASS_COMPONENT_STATE_KEY = Symbol.for(\"modular.react.class_component_state\");\nconst classComponentGlobalState =\n ((globalThis as typeof globalThis & Record<symbol, ClassComponentGlobalState | undefined>)[\n CLASS_COMPONENT_STATE_KEY\n ] ??= {\n lifecycleSnapshots: new WeakMap(),\n updateContexts: new WeakMap(),\n });\nconst classLifecycleSnapshots = classComponentGlobalState.lifecycleSnapshots;\nconst classUpdateContexts = classComponentGlobalState.updateContexts;\n\nexport type ClassComponentRenderResult =\n | {\n kind: \"render\";\n node: ReactCompatNode;\n instance: ClassComponentInstance;\n type: ClassComponentType;\n }\n | { kind: \"skip\" };\n\nexport function reconcileClassComponent(\n parent: ParentNode,\n previousNodes: readonly Node[],\n type: ClassComponentType,\n props: Record<string, unknown>,\n runtime: RootRuntime,\n path: string,\n options: RenderOptions,\n reconcileNode: ReconcileNode,\n onInstance?: (instance: ClassComponentInstance) => void,\n): ReconcileResult {\n const rendered = renderClassComponentWithRuntime(type, props, runtime, path);\n\n if (rendered.kind === \"skip\") {\n return { nodes: previousNodes.slice(0, 1), consumed: previousNodes.length };\n }\n\n onInstance?.(rendered.instance);\n const childOptions = withHydrationComponentStack(\n options,\n getClassComponentName(type),\n );\n\n try {\n return reconcileNode(\n parent,\n previousNodes,\n rendered.node,\n runtime,\n `${path}.class`,\n childOptions,\n );\n } catch (error) {\n const fallbackNode = recoverClassComponentError(\n rendered.type,\n rendered.instance,\n error,\n );\n\n if (fallbackNode === undefined) {\n throw error;\n }\n\n return reconcileNode(\n parent,\n previousNodes,\n fallbackNode,\n runtime,\n `${path}.class.fallback`,\n childOptions,\n );\n }\n}\n\nexport function renderClassComponentWithRuntime(\n type: ClassComponentType,\n props: Record<string, unknown>,\n runtime: RootRuntime,\n path: string,\n options: { hasDirtyDescendant?: boolean } = {},\n): ClassComponentRenderResult {\n return renderWithRootRuntime(runtime, path, () => {\n const instanceRef = useRef<ClassComponentInstance | undefined>(undefined);\n const didCommitRef = useRef(false);\n const previousInstance = instanceRef.current;\n const hasDifferentType =\n previousInstance !== undefined && !(previousInstance instanceof type);\n const replacedInstance = hasDifferentType ? previousInstance : undefined;\n\n if (hasDifferentType) {\n classLifecycleSnapshots.delete(previousInstance);\n classUpdateContexts.delete(previousInstance);\n didCommitRef.current = false;\n instanceRef.current = undefined;\n }\n\n const instance =\n instanceRef.current !== undefined && instanceRef.current instanceof type\n ? instanceRef.current\n : new type(props);\n const previousProps = instance.props;\n const snapshot = classLifecycleSnapshots.get(instance);\n const previousState = snapshot?.previousState ?? instance.state ?? {};\n\n instanceRef.current = instance;\n installClassUpdateMethods(instance, runtime, path);\n const nextState = resolveDerivedStateFromProps(\n type,\n props,\n snapshot?.nextState ?? instance.state ?? {},\n );\n const shouldSkipUpdate =\n didCommitRef.current &&\n snapshot?.force !== true &&\n options.hasDirtyDescendant !== true &&\n instance.shouldComponentUpdate?.(props, nextState) === false;\n\n instance.props = props;\n instance.state = nextState;\n installClassLifecycleEffects(\n instance,\n didCommitRef,\n previousProps,\n previousState,\n shouldSkipUpdate,\n replacedInstance,\n );\n\n if (shouldSkipUpdate) {\n return { kind: \"skip\" };\n }\n\n try {\n const node = instance.render();\n\n if (didCommitRef.current) {\n classLifecycleSnapshots.set(instance, {\n ...classLifecycleSnapshots.get(instance),\n snapshot: instance.getSnapshotBeforeUpdate?.(\n previousProps ?? {},\n previousState,\n ),\n });\n }\n\n return { kind: \"render\", node, instance, type };\n } catch (error) {\n const fallbackNode = recoverClassComponentError(type, instance, error);\n\n if (fallbackNode === undefined) {\n throw error;\n }\n\n return { kind: \"render\", node: fallbackNode, instance, type };\n }\n }, CLASS_COMPONENT_RUNTIME_OWNER);\n}\n\nexport function applyDerivedStateFromProps(\n type: ClassComponentType,\n instance: ClassComponentInstance,\n nextProps: Record<string, unknown>,\n previousState: Record<string, unknown>,\n): void {\n instance.state = resolveDerivedStateFromProps(type, nextProps, previousState);\n}\n\nexport function resolveDerivedStateFromProps(\n type: ClassComponentType,\n nextProps: Record<string, unknown>,\n previousState: Record<string, unknown>,\n): Record<string, unknown> {\n const derivedState = type.getDerivedStateFromProps?.(nextProps, previousState);\n\n if (derivedState === undefined || derivedState === null) {\n return previousState;\n }\n\n return {\n ...previousState,\n ...derivedState,\n };\n}\n\nexport function recoverClassComponentError(\n type: ClassComponentType,\n instance: ClassComponentInstance,\n error: unknown,\n): ReactCompatNode | undefined {\n if (isThenable(error) || !isErrorBoundaryClass(type, instance)) {\n return undefined;\n }\n\n const normalizedError =\n error instanceof Error ? error : new Error(String(error));\n const derivedState = type.getDerivedStateFromError?.(normalizedError);\n\n if (derivedState !== undefined && derivedState !== null) {\n instance.state = {\n ...instance.state,\n ...derivedState,\n };\n }\n\n instance.componentDidCatch?.(normalizedError, { componentStack: \"\" });\n return instance.render();\n}\n\nexport function isClassComponentType(value: unknown): value is ClassComponentType {\n return (\n typeof value === \"function\" &&\n typeof (value as { prototype?: { render?: unknown } }).prototype?.render ===\n \"function\"\n );\n}\n\nfunction getClassComponentName(type: ClassComponentType): string {\n return type.name === \"\" ? \"Anonymous\" : type.name;\n}\n\nexport function reconcileErrorBoundary(\n parent: ParentNode,\n previousNodes: readonly Node[],\n element: ReactCompatElement,\n runtime: RootRuntime,\n path: string,\n options: RenderOptions,\n reconcileNode: ReconcileNode,\n): ReconcileResult {\n try {\n return reconcileNode(\n parent,\n previousNodes,\n element.props.children,\n runtime,\n `${path}.eb`,\n options,\n );\n } catch (error) {\n if (isThenable(error)) {\n throw error;\n }\n\n const normalizedError =\n error instanceof Error ? error : new Error(String(error));\n const onError = element.props.onError;\n\n if (typeof onError === \"function\") {\n (onError as (error: Error) => void)(normalizedError);\n }\n\n const fallback = element.props.fallback;\n const fallbackNode =\n typeof fallback === \"function\"\n ? (fallback as (error: Error) => ReactCompatNode)(normalizedError)\n : null;\n\n return reconcileNode(\n parent,\n previousNodes,\n fallbackNode,\n runtime,\n `${path}.eb.fallback`,\n options,\n );\n }\n}\n\nfunction installClassUpdateMethods(\n instance: ClassComponentInstance,\n runtime: RootRuntime,\n path: string,\n): void {\n classUpdateContexts.set(instance, { runtime, path });\n instance.setState = Component.prototype.setState;\n instance.forceUpdate = Component.prototype.forceUpdate;\n}\n\nfunction enqueueClassSetState(\n instance: ClassComponentInstance,\n partial: Parameters<NonNullable<ClassComponentInstance[\"setState\"]>>[0],\n callback?: () => void,\n): void {\n const updateContext = classUpdateContexts.get(instance);\n\n if (updateContext === undefined) {\n callback?.call(instance);\n return;\n }\n\n const snapshot = classLifecycleSnapshots.get(instance);\n const previousState = snapshot?.previousState ?? instance.state ?? {};\n const baseState = snapshot?.nextState ?? instance.state ?? {};\n const nextPartial =\n typeof partial === \"function\"\n ? partial(baseState, instance.props)\n : partial;\n\n const nextState =\n nextPartial === null\n ? baseState\n : {\n ...baseState,\n ...nextPartial,\n };\n\n classLifecycleSnapshots.set(instance, {\n ...snapshot,\n previousState,\n nextState,\n });\n\n markClassInstanceDirty(updateContext);\n callback?.call(instance);\n}\n\nfunction enqueueClassForceUpdate(\n instance: ClassComponentInstance,\n callback?: () => void,\n): void {\n const updateContext = classUpdateContexts.get(instance);\n\n if (updateContext === undefined) {\n callback?.call(instance);\n return;\n }\n\n classLifecycleSnapshots.set(instance, {\n previousState: instance.state ?? {},\n force: true,\n });\n markClassInstanceDirty(updateContext);\n callback?.call(instance);\n}\n\nfunction markClassInstanceDirty(updateContext: ClassUpdateContext): void {\n const runtimeInstance = updateContext.runtime.instances.get(updateContext.path) as\n | { dirty?: boolean }\n | undefined;\n if (runtimeInstance !== undefined) {\n runtimeInstance.dirty = true;\n }\n updateContext.runtime.rerender();\n}\n\nfunction installClassLifecycleEffects(\n instance: ClassComponentInstance,\n didCommitRef: { current: boolean },\n previousProps: Record<string, unknown> | undefined,\n previousState: Record<string, unknown>,\n skipUpdate: boolean,\n replacedInstance?: ClassComponentInstance,\n): void {\n useLayoutEffect(() => {\n if (replacedInstance !== undefined) {\n replacedInstance.componentWillUnmount?.();\n classUpdateContexts.delete(replacedInstance);\n }\n\n if (skipUpdate) {\n classLifecycleSnapshots.delete(instance);\n return;\n }\n\n if (didCommitRef.current) {\n instance.componentDidUpdate?.(\n previousProps ?? {},\n previousState,\n classLifecycleSnapshots.get(instance)?.snapshot,\n );\n } else {\n didCommitRef.current = true;\n instance.componentDidMount?.();\n }\n\n classLifecycleSnapshots.delete(instance);\n });\n\n useLayoutEffect(() => {\n return () => {\n instance.componentWillUnmount?.();\n classLifecycleSnapshots.delete(instance);\n classUpdateContexts.delete(instance);\n };\n }, []);\n}\n\nfunction isErrorBoundaryClass(\n type: ClassComponentType,\n instance: ClassComponentInstance,\n): boolean {\n return (\n typeof type.getDerivedStateFromError === \"function\" ||\n typeof instance.componentDidCatch === \"function\"\n );\n}\n"]}
package/dist/context.d.ts CHANGED
@@ -7,18 +7,32 @@ export interface ReactCompatContext<T> {
7
7
  Consumer: ReactCompatConsumer<T>;
8
8
  displayName: string | undefined;
9
9
  }
10
+ export interface ReactCompatExternalContext<T> {
11
+ $$typeof: typeof REACT_COMPAT_PROVIDER_TYPE;
12
+ _currentValue?: T;
13
+ _currentValue2?: T;
14
+ _defaultValue?: T;
15
+ Provider?: unknown;
16
+ Consumer?: unknown;
17
+ displayName?: string | undefined;
18
+ }
19
+ export type ReactCompatContextLike<T> = ReactCompatContext<T> | ReactCompatExternalContext<T>;
10
20
  export interface ReactCompatProvider<T> {
11
21
  $$typeof: typeof REACT_COMPAT_PROVIDER_TYPE;
12
- context: ReactCompatContext<T>;
22
+ context?: ReactCompatContextLike<T>;
13
23
  displayName: string | undefined;
14
24
  }
15
25
  export interface ReactCompatConsumer<T> {
16
26
  $$typeof: typeof REACT_COMPAT_CONSUMER_TYPE;
17
- context: ReactCompatContext<T>;
27
+ context?: ReactCompatContextLike<T>;
28
+ _context?: ReactCompatContextLike<T>;
18
29
  displayName: string | undefined;
19
30
  }
31
+ type ContextReadObserver = (context: ReactCompatContextLike<unknown>, value: unknown) => void;
20
32
  export declare function createContext<T>(defaultValue: T): ReactCompatContext<T>;
21
- export declare function useContext<T>(context: ReactCompatContext<T>): T;
33
+ export declare function useContext<T>(context: ReactCompatContextLike<T>): T;
34
+ export declare function readContextValue<T>(context: ReactCompatContextLike<T>): T;
35
+ export declare function withContextReadObserver<T>(observer: ContextReadObserver, render: () => T): T;
22
36
  export declare function isReactCompatProvider(value: unknown): value is ReactCompatProvider<unknown>;
23
37
  export declare function isReactCompatContext(value: unknown): value is ReactCompatContext<unknown>;
24
38
  export declare function isReactCompatConsumer(value: unknown): value is ReactCompatConsumer<unknown>;
@@ -27,5 +41,7 @@ export declare function pushContextProvider<T>(provider: ReactCompatProvider<T>,
27
41
  export declare function popContextProvider<T>(provider: ReactCompatProvider<T>): void;
28
42
  export declare function renderContextProviderToString<T>(provider: ReactCompatProvider<T>, value: T, render: () => string): string;
29
43
  export declare function renderContextConsumerToString<T>(consumer: ReactCompatConsumer<T>, render: (value: T) => string): string;
44
+ export declare function providerContext<T>(provider: ReactCompatProvider<T>): ReactCompatContextLike<T>;
45
+ export declare function consumerContext<T>(consumer: ReactCompatConsumer<T>): ReactCompatContextLike<T>;
30
46
  export {};
31
47
  //# sourceMappingURL=context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,0BAA0B,eAAuC,CAAC;AACxE,QAAA,MAAM,0BAA0B,eAAuC,CAAC;AAExE,MAAM,WAAW,kBAAkB,CAAC,CAAC;IACnC,YAAY,EAAE,CAAC,CAAC;IAChB,MAAM,EAAE,CAAC,EAAE,CAAC;IACZ,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC;IACjC,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC;IACjC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAED,MAAM,WAAW,mBAAmB,CAAC,CAAC;IACpC,QAAQ,EAAE,OAAO,0BAA0B,CAAC;IAC5C,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAC/B,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAED,MAAM,WAAW,mBAAmB,CAAC,CAAC;IACpC,QAAQ,EAAE,OAAO,0BAA0B,CAAC;IAC5C,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAC/B,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAoBvE;AAqBD,wBAAgB,UAAU,CAAC,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,CAE/D;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,mBAAmB,CAAC,OAAO,CAAC,CAMvC;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,kBAAkB,CAAC,OAAO,CAAC,CAStC;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,mBAAmB,CAAC,OAAO,CAAC,CAMvC;AAED,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,CAAC,EAC5C,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,EAChC,KAAK,EAAE,CAAC,EACR,MAAM,EAAE,MAAM,CAAC,GACd,CAAC,CAQH;AAED,wBAAgB,mBAAmB,CAAC,CAAC,EACnC,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,EAChC,KAAK,EAAE,CAAC,GACP,IAAI,CAEN;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,IAAI,CAE5E;AAED,wBAAgB,6BAA6B,CAAC,CAAC,EAC7C,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,EAChC,KAAK,EAAE,CAAC,EACR,MAAM,EAAE,MAAM,MAAM,GACnB,MAAM,CAER;AAED,wBAAgB,6BAA6B,CAAC,CAAC,EAC7C,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,EAChC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,GAC3B,MAAM,CAER"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
package/dist/context.js CHANGED
@@ -1,5 +1,10 @@
1
- const REACT_COMPAT_PROVIDER_TYPE = Symbol.for("modular.react.provider");
2
- const REACT_COMPAT_CONSUMER_TYPE = Symbol.for("modular.react.consumer");
1
+ const REACT_COMPAT_PROVIDER_TYPE = Symbol.for("react.context");
2
+ const REACT_COMPAT_CONSUMER_TYPE = Symbol.for("react.consumer");
3
+ const externalContextValues = new WeakMap();
4
+ const CONTEXT_READ_OBSERVER_STATE_KEY = Symbol.for("modular.react.context_read_observer_state");
5
+ const contextReadObserverState = (globalThis[CONTEXT_READ_OBSERVER_STATE_KEY] ??= {
6
+ current: undefined,
7
+ });
3
8
  export function createContext(defaultValue) {
4
9
  const context = {
5
10
  defaultValue,
@@ -39,7 +44,28 @@ function installContextDisplayName(context) {
39
44
  });
40
45
  }
41
46
  export function useContext(context) {
42
- return context.values.at(-1) ?? context.defaultValue;
47
+ const value = readContextValue(context);
48
+ contextReadObserverState.current?.(context, value);
49
+ return value;
50
+ }
51
+ export function readContextValue(context) {
52
+ if (isInternalContextRecord(context)) {
53
+ return context.values.at(-1) ?? context.defaultValue;
54
+ }
55
+ return (externalContextValues.get(context)?.at(-1) ??
56
+ context._currentValue ??
57
+ context._currentValue2 ??
58
+ context._defaultValue);
59
+ }
60
+ export function withContextReadObserver(observer, render) {
61
+ const previousObserver = contextReadObserverState.current;
62
+ contextReadObserverState.current = observer;
63
+ try {
64
+ return render();
65
+ }
66
+ finally {
67
+ contextReadObserverState.current = previousObserver;
68
+ }
43
69
  }
44
70
  export function isReactCompatProvider(value) {
45
71
  return (typeof value === "object" &&
@@ -69,15 +95,38 @@ export function renderWithContextProvider(provider, value, render) {
69
95
  }
70
96
  }
71
97
  export function pushContextProvider(provider, value) {
72
- provider.context.values.push(value);
98
+ const context = providerContext(provider);
99
+ if (isInternalContextRecord(context)) {
100
+ context.values.push(value);
101
+ return;
102
+ }
103
+ const values = externalContextValues.get(context) ?? [];
104
+ values.push(value);
105
+ externalContextValues.set(context, values);
73
106
  }
74
107
  export function popContextProvider(provider) {
75
- provider.context.values.pop();
108
+ const context = providerContext(provider);
109
+ if (isInternalContextRecord(context)) {
110
+ context.values.pop();
111
+ return;
112
+ }
113
+ externalContextValues.get(context)?.pop();
76
114
  }
77
115
  export function renderContextProviderToString(provider, value, render) {
78
116
  return renderWithContextProvider(provider, value, render);
79
117
  }
80
118
  export function renderContextConsumerToString(consumer, render) {
81
- return render(useContext(consumer.context));
119
+ return render(useContext(consumerContext(consumer)));
120
+ }
121
+ export function providerContext(provider) {
122
+ return provider.context ?? provider;
123
+ }
124
+ export function consumerContext(consumer) {
125
+ return (consumer.context ??
126
+ consumer._context ??
127
+ consumer);
128
+ }
129
+ function isInternalContextRecord(context) {
130
+ return "values" in context && Array.isArray(context.values);
82
131
  }
83
132
  //# sourceMappingURL=context.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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","sourcesContent":["const REACT_COMPAT_PROVIDER_TYPE = Symbol.for(\"modular.react.provider\");\nconst REACT_COMPAT_CONSUMER_TYPE = Symbol.for(\"modular.react.consumer\");\n\nexport interface ReactCompatContext<T> {\n defaultValue: T;\n values: T[];\n Provider: ReactCompatProvider<T>;\n Consumer: ReactCompatConsumer<T>;\n displayName: string | undefined;\n}\n\nexport interface ReactCompatProvider<T> {\n $$typeof: typeof REACT_COMPAT_PROVIDER_TYPE;\n context: ReactCompatContext<T>;\n displayName: string | undefined;\n}\n\nexport interface ReactCompatConsumer<T> {\n $$typeof: typeof REACT_COMPAT_CONSUMER_TYPE;\n context: ReactCompatContext<T>;\n displayName: string | undefined;\n}\n\nexport function createContext<T>(defaultValue: T): ReactCompatContext<T> {\n const context: ReactCompatContext<T> = {\n defaultValue,\n values: [],\n Provider: undefined as unknown as ReactCompatProvider<T>,\n Consumer: undefined as unknown as ReactCompatConsumer<T>,\n displayName: undefined,\n };\n context.Provider = {\n $$typeof: REACT_COMPAT_PROVIDER_TYPE,\n context,\n displayName: undefined,\n };\n context.Consumer = {\n $$typeof: REACT_COMPAT_CONSUMER_TYPE,\n context,\n displayName: undefined,\n };\n installContextDisplayName(context);\n return context;\n}\n\nfunction installContextDisplayName<T>(context: ReactCompatContext<T>): void {\n let displayName: string | undefined;\n\n Object.defineProperty(context, \"displayName\", {\n configurable: true,\n enumerable: true,\n get() {\n return displayName;\n },\n set(value: string | undefined) {\n displayName = value;\n context.Provider.displayName =\n value === undefined ? undefined : `${value}.Provider`;\n context.Consumer.displayName =\n value === undefined ? undefined : `${value}.Consumer`;\n },\n });\n}\n\nexport function useContext<T>(context: ReactCompatContext<T>): T {\n return context.values.at(-1) ?? context.defaultValue;\n}\n\nexport function isReactCompatProvider(\n value: unknown,\n): value is ReactCompatProvider<unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n (value as { $$typeof?: unknown }).$$typeof === REACT_COMPAT_PROVIDER_TYPE\n );\n}\n\nexport function isReactCompatContext(\n value: unknown,\n): value is ReactCompatContext<unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"Provider\" in value &&\n \"Consumer\" in value &&\n isReactCompatProvider((value as { Provider?: unknown }).Provider) &&\n isReactCompatConsumer((value as { Consumer?: unknown }).Consumer)\n );\n}\n\nexport function isReactCompatConsumer(\n value: unknown,\n): value is ReactCompatConsumer<unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n (value as { $$typeof?: unknown }).$$typeof === REACT_COMPAT_CONSUMER_TYPE\n );\n}\n\nexport function renderWithContextProvider<T, R>(\n provider: ReactCompatProvider<T>,\n value: T,\n render: () => R,\n): R {\n pushContextProvider(provider, value);\n\n try {\n return render();\n } finally {\n popContextProvider(provider);\n }\n}\n\nexport function pushContextProvider<T>(\n provider: ReactCompatProvider<T>,\n value: T,\n): void {\n provider.context.values.push(value);\n}\n\nexport function popContextProvider<T>(provider: ReactCompatProvider<T>): void {\n provider.context.values.pop();\n}\n\nexport function renderContextProviderToString<T>(\n provider: ReactCompatProvider<T>,\n value: T,\n render: () => string,\n): string {\n return renderWithContextProvider(provider, value, render);\n}\n\nexport function renderContextConsumerToString<T>(\n consumer: ReactCompatConsumer<T>,\n render: (value: T) => string,\n): string {\n return render(useContext(consumer.context));\n}\n"]}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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","sourcesContent":["const REACT_COMPAT_PROVIDER_TYPE = Symbol.for(\"react.context\");\nconst REACT_COMPAT_CONSUMER_TYPE = Symbol.for(\"react.consumer\");\n\nexport interface ReactCompatContext<T> {\n defaultValue: T;\n values: T[];\n Provider: ReactCompatProvider<T>;\n Consumer: ReactCompatConsumer<T>;\n displayName: string | undefined;\n}\n\nexport interface ReactCompatExternalContext<T> {\n $$typeof: typeof REACT_COMPAT_PROVIDER_TYPE;\n _currentValue?: T;\n _currentValue2?: T;\n _defaultValue?: T;\n Provider?: unknown;\n Consumer?: unknown;\n displayName?: string | undefined;\n}\n\nexport type ReactCompatContextLike<T> =\n | ReactCompatContext<T>\n | ReactCompatExternalContext<T>;\n\nexport interface ReactCompatProvider<T> {\n $$typeof: typeof REACT_COMPAT_PROVIDER_TYPE;\n context?: ReactCompatContextLike<T>;\n displayName: string | undefined;\n}\n\nexport interface ReactCompatConsumer<T> {\n $$typeof: typeof REACT_COMPAT_CONSUMER_TYPE;\n context?: ReactCompatContextLike<T>;\n _context?: ReactCompatContextLike<T>;\n displayName: string | undefined;\n}\n\ntype ContextReadObserver = (context: ReactCompatContextLike<unknown>, value: unknown) => void;\ninterface ContextReadObserverState {\n current: ContextReadObserver | undefined;\n}\n\nconst externalContextValues = new WeakMap<object, unknown[]>();\n\nconst CONTEXT_READ_OBSERVER_STATE_KEY = Symbol.for(\n \"modular.react.context_read_observer_state\",\n);\nconst contextReadObserverState =\n ((globalThis as typeof globalThis & Record<symbol, ContextReadObserverState | undefined>)[\n CONTEXT_READ_OBSERVER_STATE_KEY\n ] ??= {\n current: undefined,\n });\n\nexport function createContext<T>(defaultValue: T): ReactCompatContext<T> {\n const context: ReactCompatContext<T> = {\n defaultValue,\n values: [],\n Provider: undefined as unknown as ReactCompatProvider<T>,\n Consumer: undefined as unknown as ReactCompatConsumer<T>,\n displayName: undefined,\n };\n context.Provider = {\n $$typeof: REACT_COMPAT_PROVIDER_TYPE,\n context,\n displayName: undefined,\n };\n context.Consumer = {\n $$typeof: REACT_COMPAT_CONSUMER_TYPE,\n context,\n displayName: undefined,\n };\n installContextDisplayName(context);\n return context;\n}\n\nfunction installContextDisplayName<T>(context: ReactCompatContext<T>): void {\n let displayName: string | undefined;\n\n Object.defineProperty(context, \"displayName\", {\n configurable: true,\n enumerable: true,\n get() {\n return displayName;\n },\n set(value: string | undefined) {\n displayName = value;\n context.Provider.displayName =\n value === undefined ? undefined : `${value}.Provider`;\n context.Consumer.displayName =\n value === undefined ? undefined : `${value}.Consumer`;\n },\n });\n}\n\nexport function useContext<T>(context: ReactCompatContextLike<T>): T {\n const value = readContextValue(context);\n contextReadObserverState.current?.(context as ReactCompatContextLike<unknown>, value);\n return value;\n}\n\nexport function readContextValue<T>(context: ReactCompatContextLike<T>): T {\n if (isInternalContextRecord(context)) {\n return context.values.at(-1) ?? context.defaultValue;\n }\n\n return (\n (externalContextValues.get(context)?.at(-1) as T | undefined) ??\n context._currentValue ??\n context._currentValue2 ??\n (context._defaultValue as T)\n );\n}\n\nexport function withContextReadObserver<T>(\n observer: ContextReadObserver,\n render: () => T,\n): T {\n const previousObserver = contextReadObserverState.current;\n contextReadObserverState.current = observer;\n\n try {\n return render();\n } finally {\n contextReadObserverState.current = previousObserver;\n }\n}\n\nexport function isReactCompatProvider(\n value: unknown,\n): value is ReactCompatProvider<unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n (value as { $$typeof?: unknown }).$$typeof === REACT_COMPAT_PROVIDER_TYPE\n );\n}\n\nexport function isReactCompatContext(\n value: unknown,\n): value is ReactCompatContext<unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"Provider\" in value &&\n \"Consumer\" in value &&\n isReactCompatProvider((value as { Provider?: unknown }).Provider) &&\n isReactCompatConsumer((value as { Consumer?: unknown }).Consumer)\n );\n}\n\nexport function isReactCompatConsumer(\n value: unknown,\n): value is ReactCompatConsumer<unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n (value as { $$typeof?: unknown }).$$typeof === REACT_COMPAT_CONSUMER_TYPE\n );\n}\n\nexport function renderWithContextProvider<T, R>(\n provider: ReactCompatProvider<T>,\n value: T,\n render: () => R,\n): R {\n pushContextProvider(provider, value);\n\n try {\n return render();\n } finally {\n popContextProvider(provider);\n }\n}\n\nexport function pushContextProvider<T>(\n provider: ReactCompatProvider<T>,\n value: T,\n): void {\n const context = providerContext(provider);\n\n if (isInternalContextRecord(context)) {\n context.values.push(value);\n return;\n }\n\n const values = externalContextValues.get(context) ?? [];\n values.push(value);\n externalContextValues.set(context, values);\n}\n\nexport function popContextProvider<T>(provider: ReactCompatProvider<T>): void {\n const context = providerContext(provider);\n\n if (isInternalContextRecord(context)) {\n context.values.pop();\n return;\n }\n\n externalContextValues.get(context)?.pop();\n}\n\nexport function renderContextProviderToString<T>(\n provider: ReactCompatProvider<T>,\n value: T,\n render: () => string,\n): string {\n return renderWithContextProvider(provider, value, render);\n}\n\nexport function renderContextConsumerToString<T>(\n consumer: ReactCompatConsumer<T>,\n render: (value: T) => string,\n): string {\n return render(useContext(consumerContext(consumer)));\n}\n\nexport function providerContext<T>(\n provider: ReactCompatProvider<T>,\n): ReactCompatContextLike<T> {\n return provider.context ?? (provider as unknown as ReactCompatExternalContext<T>);\n}\n\nexport function consumerContext<T>(\n consumer: ReactCompatConsumer<T>,\n): ReactCompatContextLike<T> {\n return (\n consumer.context ??\n consumer._context ??\n (consumer as unknown as ReactCompatExternalContext<T>)\n );\n}\n\nfunction isInternalContextRecord<T>(\n context: ReactCompatContextLike<T>,\n): context is ReactCompatContext<T> {\n return \"values\" in context && Array.isArray(context.values);\n}\n"]}
@@ -1,3 +1,5 @@
1
1
  export declare function syncChildNodes(parent: ParentNode, nextNodes: readonly Node[]): void;
2
+ export declare function syncOwnedChildNodes(parent: ParentNode, previousNodes: readonly Node[], nextNodes: readonly Node[]): void;
2
3
  export declare function syncScopedChildNodes(parent: ParentNode, before: ChildNode | null, after: ChildNode | null, nextNodes: readonly Node[]): void;
4
+ export declare function removeChildIfPresent(parent: ParentNode, child: Node): void;
3
5
  //# sourceMappingURL=dom-children.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dom-children.d.ts","sourceRoot":"","sources":["../src/dom-children.ts"],"names":[],"mappings":"AAEA,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,IAAI,EAAE,GAAG,IAAI,CAEnF;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,SAAS,GAAG,IAAI,EACxB,KAAK,EAAE,SAAS,GAAG,IAAI,EACvB,SAAS,EAAE,SAAS,IAAI,EAAE,GACzB,IAAI,CAsBN"}
1
+ {"version":3,"file":"dom-children.d.ts","sourceRoot":"","sources":["../src/dom-children.ts"],"names":[],"mappings":"AAEA,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,IAAI,EAAE,GAAG,IAAI,CAEnF;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,UAAU,EAClB,aAAa,EAAE,SAAS,IAAI,EAAE,EAC9B,SAAS,EAAE,SAAS,IAAI,EAAE,GACzB,IAAI,CAcN;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,SAAS,GAAG,IAAI,EACxB,KAAK,EAAE,SAAS,GAAG,IAAI,EACvB,SAAS,EAAE,SAAS,IAAI,EAAE,GACzB,IAAI,CA6CN;AAwFD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,GAAG,IAAI,CAc1E"}