-
Notifications
You must be signed in to change notification settings - Fork 122
feat: remove options.document and reuse vnode as dom #1728
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from 15 commits
8081585
8a9f990
b4f50a4
462a05e
a330192
edf53b1
d9c3120
bb888ee
6faba1e
6a9240b
5418cb5
f46df65
62d2869
04eb7c9
ad4c7d2
79713c3
3c752c1
36d6ef7
7d5a206
0b1076a
6d668a8
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,5 @@ | ||
| --- | ||
| "@lynx-js/react": patch | ||
| --- | ||
|
|
||
| Reuse vnode tree as dom tree in bts | ||
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -1,12 +1,11 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| // Copyright 2025 The Lynx Authors. All rights reserved. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| // Licensed under the Apache License Version 2.0 that can be found in the | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| // LICENSE file in the root directory of this source tree. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| /* eslint-disable @typescript-eslint/unbound-method */ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import { root, useEffect, useState } from '@lynx-js/react'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| BackgroundSnapshotInstance, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| SnapshotInstance, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } from '@lynx-js/react/internal'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import { SnapshotInstance, options } from '@lynx-js/react/internal'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import type { BackgroundDOM } from '@lynx-js/react/internal'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import type { CSSProperties, MainThread, NodesRef } from '@lynx-js/types'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import { hook, isMainThread } from '../../src/hook.js'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -89,26 +88,32 @@ if (typeof Codspeed !== 'undefined' && __MAIN_THREAD__) { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if (typeof Codspeed !== 'undefined' && __BACKGROUND__) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| hook( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| BackgroundSnapshotInstance.prototype, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 'setAttribute', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| function(this: BackgroundSnapshotInstance, old, key, value) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| const values = value as unknown[]; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| key === 'values' && values[values.length - 1] === 'stop-benchmark-true' | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| // we only care about the update that stops the benchmark | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Codspeed.startBenchmark(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| const ret = old!.call(this, key, value); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Codspeed.stopBenchmark(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Codspeed.setExecutedBenchmark( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| `${__REPO_FILEPATH__}::${__webpack_chunkname__}-setAttribute__BatchedValues`, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return ret; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| options, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 'setupDom', | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| function(old: typeof options.setupDom, vnode: BackgroundDOM) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| old?.(vnode); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| const oldSetAttribute = vnode.setAttribute; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| vnode.setAttribute = function(this: BackgroundDOM, key, value) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| const values = value as unknown[]; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| key === 'values' | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| && values[values.length - 1] === 'stop-benchmark-true' | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| // we only care about the update that stops the benchmark | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Codspeed.startBenchmark(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| const ret = oldSetAttribute.call(this, key, value); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Codspeed.stopBenchmark(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Codspeed.setExecutedBenchmark( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| `${__REPO_FILEPATH__}::${__webpack_chunkname__}-setAttribute__BatchedValues`, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return ret; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return old!.call(this, key, value); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return oldSetAttribute.call(this, key, value); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return vnode; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } as never, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+91
to
117
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Preserve setupDom return value and type the setAttribute shim correctly
hook(
options,
'setupDom',
function(old: typeof options.setupDom, vnode: BackgroundDOM) {
- old?.(vnode);
- const oldSetAttribute = vnode.setAttribute;
- vnode.setAttribute = function(this: BackgroundDOM, key, value) {
+ vnode = (old?.(vnode) as BackgroundDOM | undefined) ?? vnode;
+ const oldSetAttribute = vnode.setAttribute;
+ vnode.setAttribute = function(this: BackgroundDOM, key: string | number, value: unknown) {
const values = value as unknown[];
- if (
- key === 'values'
+ if (
+ key === 'values'
&& values[values.length - 1] === 'stop-benchmark-true'
) {📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Original file line number | Diff line number | Diff line change | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -1,8 +1,7 @@ | ||||||||||||
| import { Component, render } from 'preact'; | ||||||||||||
| import { Component, render, options } from 'preact'; | ||||||||||||
| import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest'; | ||||||||||||
| import { elementTree, waitSchedule } from '../utils/nativeMethod'; | ||||||||||||
| import { BackgroundSnapshotInstance } from '../../src/backgroundSnapshot'; | ||||||||||||
| import { setupBackgroundDocument } from '../../src/document'; | ||||||||||||
| import { backgroundSnapshotInstanceManager, setupPage, SnapshotInstance } from '../../src/snapshot'; | ||||||||||||
| import { backgroundSnapshotInstanceToJSON } from '../utils/debug'; | ||||||||||||
| import { useState } from 'preact/compat'; | ||||||||||||
|
|
@@ -11,22 +10,30 @@ import { globalEnvManager } from '../utils/envManager'; | |||||||||||
|
|
||||||||||||
| /** @type {SnapshotInstance} */ | ||||||||||||
| let scratch; | ||||||||||||
| let switchToBackground = globalEnvManager.switchToBackground.bind(globalEnvManager); | ||||||||||||
|
|
||||||||||||
| beforeAll(() => { | ||||||||||||
| setupBackgroundDocument(); | ||||||||||||
| setupPage(__CreatePage('0', 0)); | ||||||||||||
|
|
||||||||||||
| BackgroundSnapshotInstance.prototype.toJSON = backgroundSnapshotInstanceToJSON; | ||||||||||||
| globalEnvManager.switchToBackground = () => { | ||||||||||||
| switchToBackground(); | ||||||||||||
| const oldSetupDom = options.setupDom; | ||||||||||||
| options.setupDom = (vnode) => { | ||||||||||||
| vnode = oldSetupDom(vnode); | ||||||||||||
| vnode.toJSON = backgroundSnapshotInstanceToJSON; | ||||||||||||
| return vnode; | ||||||||||||
| }; | ||||||||||||
| }; | ||||||||||||
|
Comment on lines
+18
to
+26
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Avoid global leakage and double-wrapping options.setupDom Wrap once and restore in afterAll; otherwise tests may stack wrappers and leak into other files. Apply: - globalEnvManager.switchToBackground = () => {
- switchToBackground();
- const oldSetupDom = options.setupDom;
- options.setupDom = (vnode) => {
- vnode = oldSetupDom(vnode);
- vnode.toJSON = backgroundSnapshotInstanceToJSON;
- return vnode;
- };
- };
+ /** keep original to restore in afterAll */
+ /** @type {typeof options.setupDom | undefined} */
+ let originalSetupDom;
+ const DECORATED = Symbol.for('lynx.test.setupDomDecorated');
+ globalEnvManager.switchToBackground = () => {
+ switchToBackground();
+ if ((options.setupDom)[DECORATED]) return;
+ originalSetupDom = options.setupDom;
+ const base = originalSetupDom;
+ const wrapped = (vnode) => {
+ const dom = base(vnode);
+ dom.toJSON = backgroundSnapshotInstanceToJSON;
+ return dom;
+ };
+ wrapped[DECORATED] = true;
+ options.setupDom = wrapped;
+ };
🤖 Prompt for AI Agents |
||||||||||||
|
|
||||||||||||
| globalEnvManager.switchToBackground(); | ||||||||||||
| }); | ||||||||||||
|
|
||||||||||||
| afterAll(() => { | ||||||||||||
| delete BackgroundSnapshotInstance.prototype.toJSON; | ||||||||||||
| globalEnvManager.switchToBackground = switchToBackground; | ||||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Also restore options.setupDom Restore the original setupDom to avoid global state bleed. Apply: afterAll(() => {
globalEnvManager.switchToBackground = switchToBackground;
+ if (typeof originalSetupDom === 'function') options.setupDom = originalSetupDom;
});📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||
| }); | ||||||||||||
|
|
||||||||||||
| beforeEach(() => { | ||||||||||||
| scratch = document.createElement('root'); | ||||||||||||
| scratch = options.setupDom({ type: 'root' }); | ||||||||||||
| lynx.__initData = {}; | ||||||||||||
| }); | ||||||||||||
|
|
||||||||||||
|
|
||||||||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -5,27 +5,35 @@ | |
| */ | ||
| import { EventEmitter } from 'node:events'; | ||
|
|
||
| import { render } from 'preact'; | ||
| import { render, options } from 'preact'; | ||
| import { useState } from 'preact/compat'; | ||
| import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest'; | ||
|
|
||
| import { BackgroundSnapshotInstance } from '../../src/backgroundSnapshot'; | ||
| import { setupBackgroundDocument } from '../../src/document'; | ||
| import { useLynxGlobalEventListener } from '../../src/lynx-api'; | ||
| import { SnapshotInstance, backgroundSnapshotInstanceManager, setupPage } from '../../src/snapshot'; | ||
| import { backgroundSnapshotInstanceToJSON } from '../utils/debug.js'; | ||
| import { elementTree } from '../utils/nativeMethod'; | ||
| import { globalEnvManager } from '../utils/envManager'; | ||
|
|
||
| describe('useLynxGlobalEventListener', () => { | ||
| /** @type {SnapshotInstance} */ | ||
| let scratch; | ||
| let switchToBackground = globalEnvManager.switchToBackground.bind(globalEnvManager); | ||
| const ee = new EventEmitter(); | ||
|
|
||
| beforeAll(() => { | ||
| setupBackgroundDocument(); | ||
| setupPage(__CreatePage('0', 0)); | ||
|
|
||
| BackgroundSnapshotInstance.prototype.toJSON = backgroundSnapshotInstanceToJSON; | ||
| globalEnvManager.switchToBackground = () => { | ||
| switchToBackground(); | ||
| const oldSetupDom = options.setupDom; | ||
| options.setupDom = (vnode) => { | ||
| vnode = oldSetupDom(vnode); | ||
| vnode.toJSON = backgroundSnapshotInstanceToJSON; | ||
| return vnode; | ||
| }; | ||
| }; | ||
|
|
||
|
Comment on lines
+22
to
37
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Avoid accumulating wrappers on options.setupDom; restore it after tests Each call to switchToBackground wraps options.setupDom again, and afterAll only restores the switchToBackground function, not options.setupDom. Capture the original setupDom once and restore it; also wrap against that original to prevent wrapper stacking across tests. - let switchToBackground = globalEnvManager.switchToBackground.bind(globalEnvManager);
+ let switchToBackground = globalEnvManager.switchToBackground.bind(globalEnvManager);
+ let originalSetupDom = options.setupDom;
beforeAll(() => {
setupPage(__CreatePage('0', 0));
globalEnvManager.switchToBackground = () => {
switchToBackground();
- const oldSetupDom = options.setupDom;
- options.setupDom = (vnode) => {
- vnode = oldSetupDom(vnode);
+ options.setupDom = (vnode) => {
+ vnode = originalSetupDom(vnode);
vnode.toJSON = backgroundSnapshotInstanceToJSON;
return vnode;
};
};
});
@@
afterAll(() => {
- globalEnvManager.switchToBackground = switchToBackground;
+ globalEnvManager.switchToBackground = switchToBackground;
+ options.setupDom = originalSetupDom;
});Also applies to: 49-51 🤖 Prompt for AI Agents |
||
| const lynx = { | ||
| ...globalThis.lynx, | ||
|
|
@@ -39,11 +47,12 @@ describe('useLynxGlobalEventListener', () => { | |
| }); | ||
|
|
||
| afterAll(() => { | ||
| delete BackgroundSnapshotInstance.prototype.toJSON; | ||
| globalEnvManager.switchToBackground = switchToBackground; | ||
| }); | ||
|
|
||
| beforeEach(() => { | ||
| scratch = document.createElement('root'); | ||
| globalEnvManager.switchToBackground(); | ||
| scratch = options.setupDom({ type: 'root' }); | ||
| }); | ||
|
|
||
| afterEach(() => { | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Clarify scope and bump version; this is a breaking surface change
Removing the public
./internal/documentexport and switching fromoptions.documenttooptions.setupDomis breaking for external consumers. Promote to a major (or at least minor if you considerinternal/*non-semver) and spell out the migration in the note.Apply:
📝 Committable suggestion
🤖 Prompt for AI Agents
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@coderabbitai minor please, we are in 0.x stage
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@upupming You're absolutely right! In 0.x stage, breaking changes should go in minor releases. Here's the updated changeset:
This properly reflects the 0.x semver convention where breaking changes are released as minor bumps rather than major ones.
🧠 Learnings used