@reckona/mreact-compat 0.0.91 → 0.0.93

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 +22 -6
  3. package/dist/class-component.d.ts.map +1 -1
  4. package/dist/class-component.js +157 -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 +1183 -68
  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 +313 -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 +1662 -83
  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,9 +53,14 @@ 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
+ currentInstance?: ClassComponentInstance;
58
+ hasDirtyDescendant?: boolean;
59
+ }): ClassComponentRenderResult;
46
60
  export declare function applyDerivedStateFromProps(type: ClassComponentType, instance: ClassComponentInstance, nextProps: Record<string, unknown>, previousState: Record<string, unknown>): void;
61
+ export declare function resolveDerivedStateFromProps(type: ClassComponentType, nextProps: Record<string, unknown>, previousState: Record<string, unknown>): Record<string, unknown>;
47
62
  export declare function recoverClassComponentError(type: ClassComponentType, instance: ClassComponentInstance, error: unknown): ReactCompatNode | undefined;
48
63
  export declare function isClassComponentType(value: unknown): value is ClassComponentType;
49
64
  export declare function reconcileErrorBoundary(parent: ParentNode, previousNodes: readonly Node[], element: ReactCompatElement, runtime: RootRuntime, path: string, options: RenderOptions, reconcileNode: ReconcileNode): ReconcileResult;
65
+ export declare function hasDirtyClassUpdate(runtime: RootRuntime | undefined, keys: readonly string[], prefix?: string): boolean;
50
66
  //# sourceMappingURL=class-component.d.ts.map
@@ -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,38 @@ 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
+ pendingInstancesByRuntime: new WeakMap(),
31
+ dirtyPathsByRuntime: new WeakMap(),
32
+ });
33
+ const classLifecycleSnapshots = classComponentGlobalState.lifecycleSnapshots;
34
+ const classUpdateContexts = classComponentGlobalState.updateContexts;
35
+ const classPendingInstancesByRuntime = classComponentGlobalState.pendingInstancesByRuntime;
36
+ const classDirtyPathsByRuntime = classComponentGlobalState.dirtyPathsByRuntime;
23
37
  export function reconcileClassComponent(parent, previousNodes, type, props, runtime, path, options, reconcileNode, onInstance) {
24
38
  const rendered = renderClassComponentWithRuntime(type, props, runtime, path);
25
39
  if (rendered.kind === "skip") {
@@ -38,15 +52,24 @@ export function reconcileClassComponent(parent, previousNodes, type, props, runt
38
52
  return reconcileNode(parent, previousNodes, fallbackNode, runtime, `${path}.class.fallback`, childOptions);
39
53
  }
40
54
  }
41
- export function renderClassComponentWithRuntime(type, props, runtime, path) {
55
+ export function renderClassComponentWithRuntime(type, props, runtime, path, options = {}) {
42
56
  return renderWithRootRuntime(runtime, path, () => {
43
57
  const instanceRef = useRef(undefined);
44
58
  const didCommitRef = useRef(false);
59
+ const currentInstance = options.currentInstance instanceof type
60
+ ? options.currentInstance
61
+ : getPendingClassInstance(runtime, path, type);
62
+ if (currentInstance !== undefined &&
63
+ instanceRef.current !== currentInstance) {
64
+ instanceRef.current = currentInstance;
65
+ didCommitRef.current = true;
66
+ }
45
67
  const previousInstance = instanceRef.current;
46
68
  const hasDifferentType = previousInstance !== undefined && !(previousInstance instanceof type);
47
69
  const replacedInstance = hasDifferentType ? previousInstance : undefined;
48
70
  if (hasDifferentType) {
49
71
  classLifecycleSnapshots.delete(previousInstance);
72
+ classUpdateContexts.delete(previousInstance);
50
73
  didCommitRef.current = false;
51
74
  instanceRef.current = undefined;
52
75
  }
@@ -57,13 +80,15 @@ export function renderClassComponentWithRuntime(type, props, runtime, path) {
57
80
  const snapshot = classLifecycleSnapshots.get(instance);
58
81
  const previousState = snapshot?.previousState ?? instance.state ?? {};
59
82
  instanceRef.current = instance;
60
- installClassUpdateMethods(instance, runtime);
61
- applyDerivedStateFromProps(type, instance, props, previousState);
62
- const nextState = instance.state ?? {};
83
+ installClassUpdateMethods(instance, runtime, path);
84
+ clearPendingClassUpdate(runtime, path);
85
+ const nextState = resolveDerivedStateFromProps(type, props, snapshot?.nextState ?? instance.state ?? {});
63
86
  const shouldSkipUpdate = didCommitRef.current &&
64
87
  snapshot?.force !== true &&
88
+ options.hasDirtyDescendant !== true &&
65
89
  instance.shouldComponentUpdate?.(props, nextState) === false;
66
90
  instance.props = props;
91
+ instance.state = nextState;
67
92
  installClassLifecycleEffects(instance, didCommitRef, previousProps, previousState, shouldSkipUpdate, replacedInstance);
68
93
  if (shouldSkipUpdate) {
69
94
  return { kind: "skip" };
@@ -85,15 +110,18 @@ export function renderClassComponentWithRuntime(type, props, runtime, path) {
85
110
  }
86
111
  return { kind: "render", node: fallbackNode, instance, type };
87
112
  }
88
- });
113
+ }, CLASS_COMPONENT_RUNTIME_OWNER);
89
114
  }
90
115
  export function applyDerivedStateFromProps(type, instance, nextProps, previousState) {
116
+ instance.state = resolveDerivedStateFromProps(type, nextProps, previousState);
117
+ }
118
+ export function resolveDerivedStateFromProps(type, nextProps, previousState) {
91
119
  const derivedState = type.getDerivedStateFromProps?.(nextProps, previousState);
92
120
  if (derivedState === undefined || derivedState === null) {
93
- return;
121
+ return previousState;
94
122
  }
95
- instance.state = {
96
- ...instance.state,
123
+ return {
124
+ ...previousState,
97
125
  ...derivedState,
98
126
  };
99
127
  }
@@ -140,36 +168,113 @@ export function reconcileErrorBoundary(parent, previousNodes, element, runtime,
140
168
  return reconcileNode(parent, previousNodes, fallbackNode, runtime, `${path}.eb.fallback`, options);
141
169
  }
142
170
  }
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();
171
+ function installClassUpdateMethods(instance, runtime, path) {
172
+ classUpdateContexts.set(instance, { runtime, path });
173
+ instance.setState = Component.prototype.setState;
174
+ instance.forceUpdate = Component.prototype.forceUpdate;
175
+ }
176
+ function enqueueClassSetState(instance, partial, callback) {
177
+ const updateContext = classUpdateContexts.get(instance);
178
+ if (updateContext === undefined) {
159
179
  callback?.call(instance);
160
- };
161
- instance.forceUpdate = (callback) => {
162
- classLifecycleSnapshots.set(instance, {
163
- previousState: instance.state ?? {},
164
- force: true,
165
- });
166
- runtime.rerender();
180
+ return;
181
+ }
182
+ const snapshot = classLifecycleSnapshots.get(instance);
183
+ const previousState = snapshot?.previousState ?? instance.state ?? {};
184
+ const baseState = snapshot?.nextState ?? instance.state ?? {};
185
+ const nextPartial = typeof partial === "function"
186
+ ? partial(baseState, instance.props)
187
+ : partial;
188
+ const nextState = nextPartial === null
189
+ ? baseState
190
+ : {
191
+ ...baseState,
192
+ ...nextPartial,
193
+ };
194
+ classLifecycleSnapshots.set(instance, {
195
+ ...snapshot,
196
+ previousState,
197
+ nextState,
198
+ });
199
+ markClassInstanceDirty(instance, updateContext);
200
+ callback?.call(instance);
201
+ }
202
+ function enqueueClassForceUpdate(instance, callback) {
203
+ const updateContext = classUpdateContexts.get(instance);
204
+ if (updateContext === undefined) {
167
205
  callback?.call(instance);
168
- };
206
+ return;
207
+ }
208
+ classLifecycleSnapshots.set(instance, {
209
+ previousState: instance.state ?? {},
210
+ force: true,
211
+ });
212
+ markClassInstanceDirty(instance, updateContext);
213
+ callback?.call(instance);
214
+ }
215
+ function markClassInstanceDirty(instance, updateContext) {
216
+ markPendingClassUpdate(instance, updateContext);
217
+ const runtimeInstance = updateContext.runtime.instances.get(updateContext.path);
218
+ if (runtimeInstance !== undefined) {
219
+ runtimeInstance.dirty = true;
220
+ }
221
+ updateContext.runtime.rerender();
222
+ }
223
+ export function hasDirtyClassUpdate(runtime, keys, prefix) {
224
+ if (runtime === undefined) {
225
+ return false;
226
+ }
227
+ const dirtyPaths = classDirtyPathsByRuntime.get(runtime);
228
+ if (dirtyPaths === undefined) {
229
+ return false;
230
+ }
231
+ for (const key of keys) {
232
+ if (dirtyPaths.has(key)) {
233
+ return true;
234
+ }
235
+ }
236
+ if (prefix === undefined) {
237
+ return false;
238
+ }
239
+ for (const dirtyPath of dirtyPaths) {
240
+ if (dirtyPath === prefix || dirtyPath.startsWith(`${prefix}.`)) {
241
+ return true;
242
+ }
243
+ }
244
+ return false;
245
+ }
246
+ function markPendingClassUpdate(instance, updateContext) {
247
+ let pendingInstances = classPendingInstancesByRuntime.get(updateContext.runtime);
248
+ if (pendingInstances === undefined) {
249
+ pendingInstances = new Map();
250
+ classPendingInstancesByRuntime.set(updateContext.runtime, pendingInstances);
251
+ }
252
+ let dirtyPaths = classDirtyPathsByRuntime.get(updateContext.runtime);
253
+ if (dirtyPaths === undefined) {
254
+ dirtyPaths = new Set();
255
+ classDirtyPathsByRuntime.set(updateContext.runtime, dirtyPaths);
256
+ }
257
+ pendingInstances.set(updateContext.path, instance);
258
+ dirtyPaths.add(updateContext.path);
259
+ }
260
+ function getPendingClassInstance(runtime, path, type) {
261
+ const dirtyPaths = classDirtyPathsByRuntime.get(runtime);
262
+ if (dirtyPaths?.has(path) !== true) {
263
+ return undefined;
264
+ }
265
+ const instance = classPendingInstancesByRuntime.get(runtime)?.get(path);
266
+ return instance instanceof type ? instance : undefined;
267
+ }
268
+ function clearPendingClassUpdate(runtime, path) {
269
+ classDirtyPathsByRuntime.get(runtime)?.delete(path);
270
+ classPendingInstancesByRuntime.get(runtime)?.delete(path);
169
271
  }
170
272
  function installClassLifecycleEffects(instance, didCommitRef, previousProps, previousState, skipUpdate, replacedInstance) {
171
273
  useLayoutEffect(() => {
172
- replacedInstance?.componentWillUnmount?.();
274
+ if (replacedInstance !== undefined) {
275
+ replacedInstance.componentWillUnmount?.();
276
+ classUpdateContexts.delete(replacedInstance);
277
+ }
173
278
  if (skipUpdate) {
174
279
  classLifecycleSnapshots.delete(instance);
175
280
  return;
@@ -187,6 +292,7 @@ function installClassLifecycleEffects(instance, didCommitRef, previousProps, pre
187
292
  return () => {
188
293
  instance.componentWillUnmount?.();
189
294
  classLifecycleSnapshots.delete(instance);
295
+ classUpdateContexts.delete(instance);
190
296
  };
191
297
  }, []);
192
298
  }
@@ -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 pendingInstancesByRuntime: WeakMap<RootRuntime, Map<string, ClassComponentInstance>>;\n dirtyPathsByRuntime: WeakMap<RootRuntime, Set<string>>;\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 pendingInstancesByRuntime: new WeakMap(),\n dirtyPathsByRuntime: new WeakMap(),\n });\nconst classLifecycleSnapshots = classComponentGlobalState.lifecycleSnapshots;\nconst classUpdateContexts = classComponentGlobalState.updateContexts;\nconst classPendingInstancesByRuntime = classComponentGlobalState.pendingInstancesByRuntime;\nconst classDirtyPathsByRuntime = classComponentGlobalState.dirtyPathsByRuntime;\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: {\n currentInstance?: ClassComponentInstance;\n hasDirtyDescendant?: boolean;\n } = {},\n): ClassComponentRenderResult {\n return renderWithRootRuntime(runtime, path, () => {\n const instanceRef = useRef<ClassComponentInstance | undefined>(undefined);\n const didCommitRef = useRef(false);\n const currentInstance =\n options.currentInstance instanceof type\n ? options.currentInstance\n : getPendingClassInstance(runtime, path, type);\n\n if (\n currentInstance !== undefined &&\n instanceRef.current !== currentInstance\n ) {\n instanceRef.current = currentInstance;\n didCommitRef.current = true;\n }\n\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 clearPendingClassUpdate(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(instance, 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(instance, updateContext);\n callback?.call(instance);\n}\n\nfunction markClassInstanceDirty(\n instance: ClassComponentInstance,\n updateContext: ClassUpdateContext,\n): void {\n markPendingClassUpdate(instance, updateContext);\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\nexport function hasDirtyClassUpdate(\n runtime: RootRuntime | undefined,\n keys: readonly string[],\n prefix?: string,\n): boolean {\n if (runtime === undefined) {\n return false;\n }\n\n const dirtyPaths = classDirtyPathsByRuntime.get(runtime);\n if (dirtyPaths === undefined) {\n return false;\n }\n\n for (const key of keys) {\n if (dirtyPaths.has(key)) {\n return true;\n }\n }\n\n if (prefix === undefined) {\n return false;\n }\n\n for (const dirtyPath of dirtyPaths) {\n if (dirtyPath === prefix || dirtyPath.startsWith(`${prefix}.`)) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction markPendingClassUpdate(\n instance: ClassComponentInstance,\n updateContext: ClassUpdateContext,\n): void {\n let pendingInstances = classPendingInstancesByRuntime.get(updateContext.runtime);\n if (pendingInstances === undefined) {\n pendingInstances = new Map();\n classPendingInstancesByRuntime.set(updateContext.runtime, pendingInstances);\n }\n let dirtyPaths = classDirtyPathsByRuntime.get(updateContext.runtime);\n if (dirtyPaths === undefined) {\n dirtyPaths = new Set();\n classDirtyPathsByRuntime.set(updateContext.runtime, dirtyPaths);\n }\n pendingInstances.set(updateContext.path, instance);\n dirtyPaths.add(updateContext.path);\n}\n\nfunction getPendingClassInstance(\n runtime: RootRuntime,\n path: string,\n type: ClassComponentType,\n): ClassComponentInstance | undefined {\n const dirtyPaths = classDirtyPathsByRuntime.get(runtime);\n if (dirtyPaths?.has(path) !== true) {\n return undefined;\n }\n\n const instance = classPendingInstancesByRuntime.get(runtime)?.get(path);\n return instance instanceof type ? instance : undefined;\n}\n\nfunction clearPendingClassUpdate(runtime: RootRuntime, path: string): void {\n classDirtyPathsByRuntime.get(runtime)?.delete(path);\n classPendingInstancesByRuntime.get(runtime)?.delete(path);\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