Skip to content

chore: replace usages with @vibe/shared#3340

Merged
talkor merged 1 commit intomasterfrom
chore/shared-cleanup
Mar 24, 2026
Merged

chore: replace usages with @vibe/shared#3340
talkor merged 1 commit intomasterfrom
chore/shared-cleanup

Conversation

@talkor
Copy link
Copy Markdown
Member

@talkor talkor commented Mar 23, 2026

Summary

Eliminates code duplication between @vibe/core and @vibe/shared by replacing all internal imports that were using local bridge files with direct imports from @vibe/shared.

  • Add testid-helper to @vibe/shared public exports (existed but wasn't exported)
  • Replace local bridge imports across ~120 files in @vibe/core components and hooks with direct @vibe/shared imports (useMergeRef, useIsomorphicLayoutEffect, getStyle, NOOP, chainFunctions, isFirefox, isClient, keyboard event helpers, etc.)
  • Delete 13 redundant bridge files from @vibe/core that were pure re-exports of @vibe/shared:
    • utils/: ssr-utils, dom-utils, dom-event-utils, warn-deprecated, user-agent-utils, media-query-utils, function-utils
    • helpers/: testid-helper, typesciptCssModulesHelper, screenReaderAccessHelper
    • hooks/: useMergeRef, ssr/useIsomorphicLayoutEffect, ssr/useIsMounted
  • Fix Checkbox test vi.mock to use importOriginal pattern for partial mocking of @vibe/shared

No public API changes — useEventListener and useKeyEvent remain exported from @vibe/core via their existing bridge files (which now delegate to @vibe/shared).

Test plan

  • yarn workspace @vibe/core test --run — 141/141 passing
  • yarn workspace @vibe/core lint — 0 errors
  • yarn workspace @vibe/core build — clean build

Ticket: https://monday.monday.com/boards/3532714909/pulses/11161238492

Replace all internal @vibe/core imports of utils and hooks that were
already copied to @vibe/shared with direct imports from @vibe/shared.

Changes:
- Add `testid-helper` to @vibe/shared public exports
- Replace local bridge imports in ~120 files across components and hooks
  with direct imports from @vibe/shared (useMergeRef, useIsomorphicLayoutEffect,
  useIsMounted, getStyle, NOOP, chainFunctions, chainRefFunctions,
  convertToArray, isFirefox, isClient, isEnterEvent, isEscapeEvent, etc.)
- Delete 13 now-redundant bridge files from @vibe/core:
  - utils: ssr-utils, dom-utils, dom-event-utils, warn-deprecated,
    user-agent-utils, media-query-utils, function-utils
  - helpers: testid-helper, typesciptCssModulesHelper, screenReaderAccessHelper
  - hooks: useMergeRef, ssr/useIsomorphicLayoutEffect, ssr/useIsMounted
- Update Checkbox test vi.mock to use importOriginal pattern so partial
  mocking of @vibe/shared doesn't break other consumers
@talkor talkor requested a review from a team as a code owner March 23, 2026 15:43
@qodo-free-for-open-source-projects
Copy link
Copy Markdown
Contributor

Review Summary by Qodo

Replace internal @vibe/core imports with direct @vibe/shared imports

✨ Enhancement

Grey Divider

Walkthroughs

Description
• Replace ~120 local bridge imports with direct @vibe/shared imports
• Delete 13 redundant bridge files that were pure re-exports
• Add testid-helper to @vibe/shared public exports
• Fix Checkbox test mocking to use importOriginal pattern
Diagram
flowchart LR
  A["@vibe/core components<br/>and hooks"] -->|"Replace local<br/>bridge imports"| B["@vibe/shared"]
  C["13 redundant<br/>bridge files"] -->|"Delete"| D["Removed"]
  E["testid-helper"] -->|"Export"| B
  F["Checkbox test"] -->|"Fix vi.mock<br/>with importOriginal"| G["Partial mocking"]
Loading

Grey Divider

File Changes

1. packages/core/src/components/List/utils/ListContext.ts ✨ Enhancement +1/-1

Replace function-utils import with @vibe/shared

packages/core/src/components/List/utils/ListContext.ts


2. packages/core/src/components/List/utils/ListUtils.ts ✨ Enhancement +1/-1

Replace useIsomorphicLayoutEffect import with @vibe/shared

packages/core/src/components/List/utils/ListUtils.ts


3. packages/core/src/components/Menu/MenuItem/hooks/useMenuItemMouseEvents.ts ✨ Enhancement +1/-1

Replace useIsomorphicLayoutEffect import with @vibe/shared

packages/core/src/components/Menu/MenuItem/hooks/useMenuItemMouseEvents.ts


View more (115)
4. packages/core/src/components/Slider/SliderHooks.ts ✨ Enhancement +1/-1

Replace function-utils import with @vibe/shared

packages/core/src/components/Slider/SliderHooks.ts


5. packages/core/src/helpers/screenReaderAccessHelper.ts Miscellaneous +0/-62

Delete redundant bridge file for screen reader helpers

packages/core/src/helpers/screenReaderAccessHelper.ts


6. packages/core/src/helpers/testid-helper.ts Miscellaneous +0/-5

Delete redundant bridge file for testid helper

packages/core/src/helpers/testid-helper.ts


7. packages/core/src/helpers/textManipulations.ts ✨ Enhancement +1/-1

Replace function-utils import with @vibe/shared

packages/core/src/helpers/textManipulations.ts


8. packages/core/src/helpers/typesciptCssModulesHelper.ts Miscellaneous +0/-12

Delete redundant bridge file for CSS modules helper

packages/core/src/helpers/typesciptCssModulesHelper.ts


9. packages/core/src/hooks/ssr/useIsMounted.ts Miscellaneous +0/-13

Delete redundant useIsMounted hook bridge file

packages/core/src/hooks/ssr/useIsMounted.ts


10. packages/core/src/hooks/ssr/useIsomorphicLayoutEffect.ts Miscellaneous +0/-7

Delete redundant useIsomorphicLayoutEffect bridge file

packages/core/src/hooks/ssr/useIsomorphicLayoutEffect.ts


11. packages/core/src/hooks/useEventListener/index.ts ✨ Enhancement +2/-26

Replace implementation with @vibe/shared re-export

packages/core/src/hooks/useEventListener/index.ts


12. packages/core/src/hooks/useGridKeyboardNavigation/useGridKeyboardNavigation.ts ✨ Enhancement +1/-1

Replace useEventListener import with @vibe/shared

packages/core/src/hooks/useGridKeyboardNavigation/useGridKeyboardNavigation.ts


13. packages/core/src/hooks/useItemsOverflow/useItemsOverflow.ts ✨ Enhancement +1/-1

Replace useIsomorphicLayoutEffect import with @vibe/shared

packages/core/src/hooks/useItemsOverflow/useItemsOverflow.ts


14. packages/core/src/hooks/useKeyEvent/index.ts ✨ Enhancement +2/-131

Replace implementation with @vibe/shared re-export

packages/core/src/hooks/useKeyEvent/index.ts


15. packages/core/src/hooks/useMediaQuery/index.ts ✨ Enhancement +1/-1

Replace useIsomorphicLayoutEffect import with @vibe/shared

packages/core/src/hooks/useMediaQuery/index.ts


16. packages/core/src/hooks/useMergeRef.ts Miscellaneous +0/-34

Delete redundant useMergeRef hook bridge file

packages/core/src/hooks/useMergeRef.ts


17. packages/core/src/hooks/usePrevious/index.ts ✨ Enhancement +1/-1

Replace useIsomorphicLayoutEffect import with @vibe/shared

packages/core/src/hooks/usePrevious/index.ts


18. packages/core/src/hooks/useVibeMediaQuery/index.ts ✨ Enhancement +3/-3

Replace media-query-utils and useIsomorphicLayoutEffect imports

packages/core/src/hooks/useVibeMediaQuery/index.ts


19. packages/core/src/utils/dom-event-utils.ts Miscellaneous +0/-84

Delete redundant DOM event utilities bridge file

packages/core/src/utils/dom-event-utils.ts


20. packages/core/src/utils/dom-utils.ts Miscellaneous +0/-38

Delete redundant DOM utilities bridge file

packages/core/src/utils/dom-utils.ts


21. packages/core/src/utils/function-utils.ts Miscellaneous +0/-50

Delete redundant function utilities bridge file

packages/core/src/utils/function-utils.ts


22. packages/core/src/utils/media-query-utils.ts Miscellaneous +0/-33

Delete redundant media query utilities bridge file

packages/core/src/utils/media-query-utils.ts


23. packages/core/src/utils/ssr-utils.ts Miscellaneous +0/-2

Delete redundant SSR utilities bridge file

packages/core/src/utils/ssr-utils.ts


24. packages/core/src/utils/user-agent-utils.ts Miscellaneous +0/-7

Delete redundant user agent utilities bridge file

packages/core/src/utils/user-agent-utils.ts


25. packages/core/src/utils/warn-deprecated.ts Miscellaneous +0/-31

Delete redundant warn deprecated utilities bridge file

packages/core/src/utils/warn-deprecated.ts


26. packages/shared/src/utils/index.ts ✨ Enhancement +1/-0

Export testid-helper from @vibe/shared

packages/shared/src/utils/index.ts


27. packages/core/src/components/Accordion/Accordion/Accordion.tsx ✨ Enhancement +1/-1

Replace useMergeRef import with @vibe/shared

packages/core/src/components/Accordion/Accordion/Accordion.tsx


28. packages/core/src/components/Checkbox/__tests__/Checkbox.test.tsx 🐞 Bug fix +9/-3

Fix vi.mock to use importOriginal pattern for partial mocking

packages/core/src/components/Checkbox/tests/Checkbox.test.tsx


29. packages/core/src/components/Accordion/AccordionItem/AccordionItem.tsx Additional files +1/-1

...

packages/core/src/components/Accordion/AccordionItem/AccordionItem.tsx


30. packages/core/src/components/AlertBanner/AlertBanner.tsx Additional files +2/-2

...

packages/core/src/components/AlertBanner/AlertBanner.tsx


31. packages/core/src/components/AlertBanner/__tests__/AlertBanner.snapshot.test.tsx Additional files +1/-1

...

packages/core/src/components/AlertBanner/tests/AlertBanner.snapshot.test.tsx


32. packages/core/src/components/Avatar/Avatar.tsx Additional files +1/-1

...

packages/core/src/components/Avatar/Avatar.tsx


33. packages/core/src/components/Avatar/AvatarBadge.tsx Additional files +1/-1

...

packages/core/src/components/Avatar/AvatarBadge.tsx


34. packages/core/src/components/Avatar/AvatarContent.tsx Additional files +1/-1

...

packages/core/src/components/Avatar/AvatarContent.tsx


35. packages/core/src/components/AvatarGroup/AvatarGroupCounter.tsx Additional files +1/-1

...

packages/core/src/components/AvatarGroup/AvatarGroupCounter.tsx


36. packages/core/src/components/Badge/Badge.tsx Additional files +2/-2

...

packages/core/src/components/Badge/Badge.tsx


37. packages/core/src/components/BaseItem/BaseItem.tsx Additional files +2/-2

...

packages/core/src/components/BaseItem/BaseItem.tsx


38. packages/core/src/components/BaseList/BaseList.tsx Additional files +2/-2

...

packages/core/src/components/BaseList/BaseList.tsx


39. packages/core/src/components/BaseList/context/BaseListContext.tsx Additional files +1/-1

...

packages/core/src/components/BaseList/context/BaseListContext.tsx


40. packages/core/src/components/ButtonGroup/ButtonGroup.tsx Additional files +2/-2

...

packages/core/src/components/ButtonGroup/ButtonGroup.tsx


41. packages/core/src/components/Checkbox/Checkbox.tsx Additional files +1/-1

...

packages/core/src/components/Checkbox/Checkbox.tsx


42. packages/core/src/components/Checkbox/hooks/useSupportFirefoxLabelClick.tsx Additional files +1/-1

...

packages/core/src/components/Checkbox/hooks/useSupportFirefoxLabelClick.tsx


43. packages/core/src/components/Chips/Chips.tsx Additional files +1/-1

...

packages/core/src/components/Chips/Chips.tsx


44. packages/core/src/components/ColorPicker/ColorPicker.tsx Additional files +2/-2

...

packages/core/src/components/ColorPicker/ColorPicker.tsx


45. packages/core/src/components/ColorPicker/components/ColorPickerContent/ColorPickerClearButton.tsx Additional files +1/-1

...

packages/core/src/components/ColorPicker/components/ColorPickerContent/ColorPickerClearButton.tsx


46. packages/core/src/components/ColorPicker/components/ColorPickerContent/ColorPickerContent.tsx Additional files +1/-1

...

packages/core/src/components/ColorPicker/components/ColorPickerContent/ColorPickerContent.tsx


47. packages/core/src/components/ColorPicker/components/ColorPickerItemComponent/ColorPickerItemComponent.tsx Additional files +1/-1

...

packages/core/src/components/ColorPicker/components/ColorPickerItemComponent/ColorPickerItemComponent.tsx


48. packages/core/src/components/Combobox/Combobox.tsx Additional files +3/-3

...

packages/core/src/components/Combobox/Combobox.tsx


49. packages/core/src/components/Counter/Counter.tsx Additional files +2/-2

...

packages/core/src/components/Counter/Counter.tsx


50. packages/core/src/components/Divider/Divider.tsx Additional files +1/-1

...

packages/core/src/components/Divider/Divider.tsx


51. packages/core/src/components/Dropdown/Dropdown.tsx Additional files +1/-1

...

packages/core/src/components/Dropdown/Dropdown.tsx


52. packages/core/src/components/Dropdown/components/Trigger/MultiSelectTrigger.tsx Additional files +1/-1

...

packages/core/src/components/Dropdown/components/Trigger/MultiSelectTrigger.tsx


53. packages/core/src/components/Dropdown/components/Trigger/SingleSelectTrigger.tsx Additional files +1/-1

...

packages/core/src/components/Dropdown/components/Trigger/SingleSelectTrigger.tsx


54. packages/core/src/components/EditableHeading/EditableHeading.tsx Additional files +1/-1

...

packages/core/src/components/EditableHeading/EditableHeading.tsx


55. packages/core/src/components/EditableText/EditableText.tsx Additional files +1/-1

...

packages/core/src/components/EditableText/EditableText.tsx


56. packages/core/src/components/EditableTypography/EditableTypography.tsx Additional files +2/-3

...

packages/core/src/components/EditableTypography/EditableTypography.tsx


57. packages/core/src/components/EmptyState/EmptyState.tsx Additional files +1/-1

...

packages/core/src/components/EmptyState/EmptyState.tsx


58. packages/core/src/components/ExpandCollapse/ExpandCollapse.tsx Additional files +1/-1

...

packages/core/src/components/ExpandCollapse/ExpandCollapse.tsx


59. packages/core/src/components/HiddenText/HiddenText.tsx Additional files +1/-1

...

packages/core/src/components/HiddenText/HiddenText.tsx


60. packages/core/src/components/Info/Info.tsx Additional files +1/-1

...

packages/core/src/components/Info/Info.tsx


61. packages/core/src/components/Label/Label.tsx Additional files +2/-2

...

packages/core/src/components/Label/Label.tsx


62. packages/core/src/components/Link/Link.tsx Additional files +2/-2

...

packages/core/src/components/Link/Link.tsx


63. packages/core/src/components/List/List.tsx Additional files +1/-1

...

packages/core/src/components/List/List.tsx


64. packages/core/src/components/ListItem/ListItem.tsx Additional files +3/-3

...

packages/core/src/components/ListItem/ListItem.tsx


65. packages/core/src/components/ListItemAvatar/ListItemAvatar.tsx Additional files +1/-1

...

packages/core/src/components/ListItemAvatar/ListItemAvatar.tsx


66. packages/core/src/components/ListItemIcon/ListItemIcon.tsx Additional files +2/-2

...

packages/core/src/components/ListItemIcon/ListItemIcon.tsx


67. packages/core/src/components/ListTitle/ListTitle.tsx Additional files +1/-1

...

packages/core/src/components/ListTitle/ListTitle.tsx


68. packages/core/src/components/Menu/Menu/Menu.tsx Additional files +3/-3

...

packages/core/src/components/Menu/Menu/Menu.tsx


69. packages/core/src/components/Menu/Menu/hooks/useMenuId.tsx Additional files +1/-1

...

packages/core/src/components/Menu/Menu/hooks/useMenuId.tsx


70. packages/core/src/components/Menu/Menu/hooks/useMouseLeave.tsx Additional files +1/-1

...

packages/core/src/components/Menu/Menu/hooks/useMouseLeave.tsx


71. packages/core/src/components/Menu/MenuGridItem/MenuGridItem.tsx Additional files +1/-1

...

packages/core/src/components/Menu/MenuGridItem/MenuGridItem.tsx


72. packages/core/src/components/Menu/MenuItem/components/BaseMenuItem/BaseMenuItem.tsx Additional files +1/-1

...

packages/core/src/components/Menu/MenuItem/components/BaseMenuItem/BaseMenuItem.tsx


73. packages/core/src/components/Menu/MenuItemButton/MenuItemButton.tsx Additional files +1/-1

...

packages/core/src/components/Menu/MenuItemButton/MenuItemButton.tsx


74. packages/core/src/components/Menu/MenuTitle/MenuTitle.tsx Additional files +1/-1

...

packages/core/src/components/Menu/MenuTitle/MenuTitle.tsx


75. packages/core/src/components/MenuButton/MenuButton.tsx Additional files +4/-4

...

packages/core/src/components/MenuButton/MenuButton.tsx


76. packages/core/src/components/Modal/Modal/Modal.tsx Additional files +1/-2

...

packages/core/src/components/Modal/Modal/Modal.tsx


77. packages/core/src/components/MultiStepIndicator/MultiStepIndicator.tsx Additional files +1/-1

...

packages/core/src/components/MultiStepIndicator/MultiStepIndicator.tsx


78. packages/core/src/components/MultiStepIndicator/components/StepIndicator/StepIndicator.tsx Additional files +2/-2

...

packages/core/src/components/MultiStepIndicator/components/StepIndicator/StepIndicator.tsx


79. packages/core/src/components/NumberField/NumberField.tsx Additional files +1/-1

...

packages/core/src/components/NumberField/NumberField.tsx


80. packages/core/src/components/NumberField/components/NumberFieldSpinButton/NumberFieldSpinButton.tsx Additional files +1/-1

...

packages/core/src/components/NumberField/components/NumberFieldSpinButton/NumberFieldSpinButton.tsx


81. packages/core/src/components/ProgressBars/ProgressBar/Bar/Bar.tsx Additional files +1/-1

...

packages/core/src/components/ProgressBars/ProgressBar/Bar/Bar.tsx


82. packages/core/src/components/ProgressBars/ProgressBar/ProgressBar.tsx Additional files +1/-1

...

packages/core/src/components/ProgressBars/ProgressBar/ProgressBar.tsx


83. packages/core/src/components/RadioButton/RadioButton.tsx Additional files +1/-1

...

packages/core/src/components/RadioButton/RadioButton.tsx


84. packages/core/src/components/Search/Search.tsx Additional files +1/-1

...

packages/core/src/components/Search/Search.tsx


85. packages/core/src/components/Skeleton/Skeleton.tsx Additional files +1/-1

...

packages/core/src/components/Skeleton/Skeleton.tsx


86. packages/core/src/components/Slider/Slider.tsx Additional files +3/-3

...

packages/core/src/components/Slider/Slider.tsx


87. packages/core/src/components/Slider/SliderBase/SliderBase.tsx Additional files +3/-3

...

packages/core/src/components/Slider/SliderBase/SliderBase.tsx


88. packages/core/src/components/Slider/SliderBase/SliderFilledTrack.tsx Additional files +1/-1

...

packages/core/src/components/Slider/SliderBase/SliderFilledTrack.tsx


89. packages/core/src/components/Slider/SliderBase/SliderRail.tsx Additional files +2/-2

...

packages/core/src/components/Slider/SliderBase/SliderRail.tsx


90. packages/core/src/components/Slider/SliderBase/SliderThumb.tsx Additional files +2/-2

...

packages/core/src/components/Slider/SliderBase/SliderThumb.tsx


91. packages/core/src/components/Slider/SliderBase/SliderTrack.tsx Additional files +1/-1

...

packages/core/src/components/Slider/SliderBase/SliderTrack.tsx


92. packages/core/src/components/Slider/SliderContext.tsx Additional files +1/-1

...

packages/core/src/components/Slider/SliderContext.tsx


93. packages/core/src/components/Slider/SliderInfix.tsx Additional files +1/-1

...

packages/core/src/components/Slider/SliderInfix.tsx


94. packages/core/src/components/SplitButton/SplitButton.tsx Additional files +2/-3

...

packages/core/src/components/SplitButton/SplitButton.tsx


95. packages/core/src/components/SplitButton/SplitButtonMenu/SplitButtonMenu.tsx Additional files +1/-1

...

packages/core/src/components/SplitButton/SplitButtonMenu/SplitButtonMenu.tsx


96. packages/core/src/components/Steps/Steps.tsx Additional files +2/-2

...

packages/core/src/components/Steps/Steps.tsx


97. packages/core/src/components/Steps/StepsCommand.tsx Additional files +1/-2

...

packages/core/src/components/Steps/StepsCommand.tsx


98. packages/core/src/components/Steps/StepsDot.tsx Additional files +1/-1

...

packages/core/src/components/Steps/StepsDot.tsx


99. packages/core/src/components/Table/Table/Table.tsx Additional files +1/-1

...

packages/core/src/components/Table/Table/Table.tsx


100. packages/core/src/components/Table/TableCellSkeleton/TableCellSkeleton.tsx Additional files +1/-1

...

packages/core/src/components/Table/TableCellSkeleton/TableCellSkeleton.tsx


101. packages/core/src/components/Table/TableHeader/TableHeader.tsx Additional files +1/-1

...

packages/core/src/components/Table/TableHeader/TableHeader.tsx


102. packages/core/src/components/Table/TableHeaderCell/TableHeaderCell.tsx Additional files +1/-1

...

packages/core/src/components/Table/TableHeaderCell/TableHeaderCell.tsx


103. packages/core/src/components/Table/TableRow/TableRow.tsx Additional files +1/-1

...

packages/core/src/components/Table/TableRow/TableRow.tsx


104. packages/core/src/components/Table/TableRowMenu/TableRowMenu.tsx Additional files +1/-1

...

packages/core/src/components/Table/TableRowMenu/TableRowMenu.tsx


105. packages/core/src/components/Tabs/Tab/Tab.tsx Additional files +2/-2

...

packages/core/src/components/Tabs/Tab/Tab.tsx


106. packages/core/src/components/Tabs/TabList/TabList.tsx Additional files +3/-3

...

packages/core/src/components/Tabs/TabList/TabList.tsx


107. packages/core/src/components/Tabs/TabPanel/TabPanel.tsx Additional files +1/-1

...

packages/core/src/components/Tabs/TabPanel/TabPanel.tsx


108. packages/core/src/components/Tabs/TabPanels/TabPanels.tsx Additional files +2/-2

...

packages/core/src/components/Tabs/TabPanels/TabPanels.tsx


109. packages/core/src/components/Tabs/TabsContext/TabsContext.tsx Additional files +1/-1

...

packages/core/src/components/Tabs/TabsContext/TabsContext.tsx


110. packages/core/src/components/TextField/TextField.tsx Additional files +2/-2

...

packages/core/src/components/TextField/TextField.tsx


111. packages/core/src/components/TextWithHighlight/TextWithHighlight.tsx Additional files +2/-2

...

packages/core/src/components/TextWithHighlight/TextWithHighlight.tsx


112. packages/core/src/components/ThemeProvider/ThemeProvider.tsx Additional files +1/-1

...

packages/core/src/components/ThemeProvider/ThemeProvider.tsx


113. packages/core/src/components/Tipseen/Tipseen.tsx Additional files +1/-1

...

packages/core/src/components/Tipseen/Tipseen.tsx


114. packages/core/src/components/Tipseen/TipseenMedia/TipseenMedia.tsx Additional files +2/-2

...

packages/core/src/components/Tipseen/TipseenMedia/TipseenMedia.tsx


115. packages/core/src/components/Toast/Toast.tsx Additional files +2/-2

...

packages/core/src/components/Toast/Toast.tsx


116. packages/core/src/components/Toggle/MockToggle.tsx Additional files +1/-1

...

packages/core/src/components/Toggle/MockToggle.tsx


117. packages/core/src/components/VirtualizedGrid/VirtualizedGrid.tsx Additional files +2/-2

...

packages/core/src/components/VirtualizedGrid/VirtualizedGrid.tsx


118. packages/core/src/components/VirtualizedList/VirtualizedList.tsx Additional files +1/-1

...

packages/core/src/components/VirtualizedList/VirtualizedList.tsx


Grey Divider

Qodo Logo

@qodo-free-for-open-source-projects
Copy link
Copy Markdown
Contributor

qodo-free-for-open-source-projects bot commented Mar 23, 2026

Code Review by Qodo

🐞 Bugs (1) 📘 Rule violations (0) 📎 Requirement gaps (0) 📐 Spec deviations (0)

Grey Divider


Action required

1. Hoisted mock in hooks 🐞 Bug ✓ Correctness
Description
Checkbox.test.tsx calls vi.mock("@vibe/shared") inside beforeAll/afterAll, but vi.mock is
hoisted and only affects module evaluation time, so these runtime calls won’t reliably change
isFirefox for the already-imported Checkbox. This can cause the “firefox checkbox tests” to run
against the default mocked isFirefox instead of true, making the suite misleading/flaky.
Code

packages/core/src/components/Checkbox/tests/Checkbox.test.tsx[R270-287]

    beforeAll(() => {
-      vi.mock("../../../utils/user-agent-utils", () => {
+      vi.mock("@vibe/shared", async importOriginal => {
+        const actual = await importOriginal();
        return {
+          ...(actual as object),
          isFirefox: vi.fn().mockImplementation(() => true)
        };
      });
    });

    afterAll(() => {
-      vi.mock("../../../utils/user-agent-utils", () => {
+      vi.mock("@vibe/shared", async importOriginal => {
+        const actual = await importOriginal();
        return {
+          ...(actual as object),
          isFirefox: vi.fn()
        };
      });
Evidence
The test imports Checkbox at module top (so its dependency graph is evaluated once), then attempts
to re-declare a module mock later inside beforeAll/afterAll; this pattern cannot reliably rewire
dependencies after initial import. The affected block is the Firefox-specific describe where
vi.mock("@vibe/shared", … isFirefox: () => true) is declared at runtime.

packages/core/src/components/Checkbox/tests/Checkbox.test.tsx[1-12]
packages/core/src/components/Checkbox/tests/Checkbox.test.tsx[270-288]
packages/core/src/components/Checkbox/Checkbox.tsx[128-129]
packages/core/src/components/Checkbox/hooks/useSupportFirefoxLabelClick.tsx[19-33]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
`vi.mock()` is hoisted and intended to be declared at module scope. The Firefox-specific tests currently call `vi.mock("@vibe/shared")` inside `beforeAll/afterAll`, which won’t reliably change `isFirefox` for `Checkbox` (already imported).

### Issue Context
You already have a top-level partial mock of `@vibe/shared` that defines `isFirefox: vi.fn()`. Reuse that single mock and adjust its return value per test block.

### How to fix
- Remove the `vi.mock("@vibe/shared", ...)` calls from `beforeAll`/`afterAll`.
- Import the mocked export and change its implementation instead.
 - Recommended pattern:
   ```ts
   import * as shared from "@vibe/shared";

   vi.mock("@vibe/shared", async importOriginal => {
     const actual = await importOriginal();
     return { ...(actual as object), isFirefox: vi.fn() };
   });

   // in firefox describe
   beforeAll(() => {
     vi.mocked(shared.isFirefox).mockReturnValue(true);
   });

   afterAll(() => {
     vi.mocked(shared.isFirefox).mockReset();
     vi.mocked(shared.isFirefox).mockReturnValue(false); // optional explicit default
   });
   ```
 - Alternatively set `mockReturnValue(true)` in `beforeEach` for tighter isolation.

### Fix Focus Areas
- packages/core/src/components/Checkbox/__tests__/Checkbox.test.tsx[1-12]
- packages/core/src/components/Checkbox/__tests__/Checkbox.test.tsx[270-288]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

ⓘ The new review experience is currently in Beta. Learn more

Grey Divider

Qodo Logo

Comment on lines 270 to 287
beforeAll(() => {
vi.mock("../../../utils/user-agent-utils", () => {
vi.mock("@vibe/shared", async importOriginal => {
const actual = await importOriginal();
return {
...(actual as object),
isFirefox: vi.fn().mockImplementation(() => true)
};
});
});

afterAll(() => {
vi.mock("../../../utils/user-agent-utils", () => {
vi.mock("@vibe/shared", async importOriginal => {
const actual = await importOriginal();
return {
...(actual as object),
isFirefox: vi.fn()
};
});
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

1. Hoisted mock in hooks 🐞 Bug ✓ Correctness

Checkbox.test.tsx calls vi.mock("@vibe/shared") inside beforeAll/afterAll, but vi.mock is
hoisted and only affects module evaluation time, so these runtime calls won’t reliably change
isFirefox for the already-imported Checkbox. This can cause the “firefox checkbox tests” to run
against the default mocked isFirefox instead of true, making the suite misleading/flaky.
Agent Prompt
### Issue description
`vi.mock()` is hoisted and intended to be declared at module scope. The Firefox-specific tests currently call `vi.mock("@vibe/shared")` inside `beforeAll/afterAll`, which won’t reliably change `isFirefox` for `Checkbox` (already imported).

### Issue Context
You already have a top-level partial mock of `@vibe/shared` that defines `isFirefox: vi.fn()`. Reuse that single mock and adjust its return value per test block.

### How to fix
- Remove the `vi.mock("@vibe/shared", ...)` calls from `beforeAll`/`afterAll`.
- Import the mocked export and change its implementation instead.
  - Recommended pattern:
    ```ts
    import * as shared from "@vibe/shared";

    vi.mock("@vibe/shared", async importOriginal => {
      const actual = await importOriginal();
      return { ...(actual as object), isFirefox: vi.fn() };
    });

    // in firefox describe
    beforeAll(() => {
      vi.mocked(shared.isFirefox).mockReturnValue(true);
    });

    afterAll(() => {
      vi.mocked(shared.isFirefox).mockReset();
      vi.mocked(shared.isFirefox).mockReturnValue(false); // optional explicit default
    });
    ```
  - Alternatively set `mockReturnValue(true)` in `beforeEach` for tighter isolation.

### Fix Focus Areas
- packages/core/src/components/Checkbox/__tests__/Checkbox.test.tsx[1-12]
- packages/core/src/components/Checkbox/__tests__/Checkbox.test.tsx[270-288]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

@github-actions
Copy link
Copy Markdown
Contributor

📦 Bundle Size Analysis

✅ No bundle size changes detected.

Unchanged Components
Component Base PR Diff
@vibe/button 17.3KB 17.27KB -37B 🟢
@vibe/clickable 5.97KB 5.96KB -8B 🟢
@vibe/dialog 52.17KB 52.13KB -40B 🟢
@vibe/icon-button 66.07KB 66.08KB +5B 🔺
@vibe/icon 12.92KB 12.93KB +6B 🔺
@vibe/layer 2.96KB 2.96KB 0B ➖
@vibe/layout 9.83KB 9.83KB 0B ➖
@vibe/loader 5.64KB 5.66KB +19B 🔺
@vibe/tooltip 61.31KB 61.31KB -3B 🟢
@vibe/typography 63.41KB 63.48KB +73B 🔺
Accordion 6.3KB 6.31KB +13B 🔺
AccordionItem 66.47KB 66.44KB -31B 🟢
AlertBanner 70.79KB 70.74KB -52B 🟢
AlertBannerButton 18.76KB 18.79KB +30B 🔺
AlertBannerLink 15.24KB 15.21KB -25B 🟢
AlertBannerText 63.91KB 63.92KB +7B 🔺
AttentionBox 74.33KB 74.29KB -40B 🟢
Avatar 66.71KB 66.73KB +24B 🔺
AvatarGroup 93.37KB 93.2KB -176B 🟢
Badge 43.16KB 43.18KB +21B 🔺
BreadcrumbItem 64.66KB 64.61KB -54B 🟢
BreadcrumbMenu 68.64KB 68.57KB -76B 🟢
BreadcrumbMenuItem 77.07KB 76.99KB -83B 🟢
BreadcrumbsBar 5.66KB 5.68KB +16B 🔺
ButtonGroup 68.41KB 68.27KB -144B 🟢
Checkbox 66.91KB 66.87KB -37B 🟢
Chips 75.11KB 74.93KB -180B 🟢
ColorPicker 74.43KB 74.29KB -140B 🟢
ColorPickerContent 73.75KB 73.59KB -165B 🟢
Combobox 84.17KB 84KB -169B 🟢
Counter 42.23KB 42.23KB +4B 🔺
DatePicker 112.43KB 112.27KB -166B 🟢
Divider 5.45KB 5.46KB +12B 🔺
Dropdown 95.37KB 95.08KB -297B 🟢
EditableHeading 66.48KB 66.41KB -70B 🟢
EditableText 66.37KB 66.31KB -63B 🟢
EmptyState 70.38KB 70.3KB -88B 🟢
ExpandCollapse 66.26KB 66.17KB -94B 🟢
FormattedNumber 5.83KB 5.82KB -11B 🟢
GridKeyboardNavigationContext 4.67KB 4.65KB -22B 🟢
HiddenText 5.41KB 5.39KB -17B 🟢
Info 72.08KB 71.98KB -105B 🟢
Label 68.7KB 68.63KB -72B 🟢
Link 14.88KB 14.89KB +14B 🔺
List 72.97KB 72.84KB -133B 🟢
ListItem 65.6KB 65.48KB -130B 🟢
ListItemAvatar 66.98KB 66.9KB -83B 🟢
ListItemIcon 14.06KB 13.97KB -91B 🟢
ListTitle 65.06KB 64.96KB -103B 🟢
Menu 8.64KB 8.63KB -3B 🟢
MenuDivider 5.55KB 5.59KB +38B 🔺
MenuGridItem 7.17KB 7.19KB +25B 🔺
MenuItem 77.03KB 76.8KB -244B 🟢
MenuItemButton 70.15KB 69.99KB -165B 🟢
MenuTitle 65.33KB 65.3KB -34B 🟢
MenuButton 66.16KB 66.09KB -71B 🟢
Modal 79.23KB 79.02KB -215B 🟢
ModalContent 4.72KB 4.71KB -1B 🟢
ModalHeader 65.85KB 65.84KB -10B 🟢
ModalMedia 7.51KB 7.49KB -18B 🟢
ModalFooter 67.65KB 67.64KB -11B 🟢
ModalFooterWizard 68.64KB 68.54KB -103B 🟢
ModalBasicLayout 8.91KB 8.91KB -5B 🟢
ModalMediaLayout 8.06KB 8.08KB +17B 🔺
ModalSideBySideLayout 6.3KB 6.31KB +8B 🔺
MultiStepIndicator 53.04KB 52.93KB -107B 🟢
NumberField 72.9KB 72.78KB -119B 🟢
ProgressBar 7.36KB 7.34KB -22B 🟢
RadioButton 65.91KB 65.88KB -30B 🟢
Search 70.68KB 70.57KB -116B 🟢
Skeleton 5.99KB 5.98KB -5B 🟢
Slider 73.93KB 73.85KB -78B 🟢
SplitButton 66.71KB 66.56KB -151B 🟢
SplitButtonMenu 8.82KB 8.8KB -22B 🟢
Steps 71.39KB 71.32KB -76B 🟢
Table 7.24KB 7.28KB +37B 🔺
TableBody 66.77KB 66.69KB -88B 🟢
TableCell 65.23KB 65.2KB -33B 🟢
TableContainer 5.31KB 5.31KB +8B 🔺
TableHeader 5.63KB 5.66KB +29B 🔺
TableHeaderCell 72.2KB 72.18KB -29B 🟢
TableRow 5.56KB 5.56KB +1B 🔺
TableRowMenu 68.95KB 68.84KB -111B 🟢
TableVirtualizedBody 71.4KB 71.35KB -49B 🟢
Tab 64.07KB 63.96KB -110B 🟢
TabList 8.87KB 8.86KB -14B 🟢
TabPanel 5.3KB 5.29KB -14B 🟢
TabPanels 5.85KB 5.84KB -13B 🟢
TabsContext 5.48KB 5.51KB +32B 🔺
TextArea 66.41KB 66.37KB -41B 🟢
TextField 69.39KB 69.43KB +42B 🔺
TextWithHighlight 64.35KB 64.25KB -106B 🟢
ThemeProvider 4.36KB 4.36KB 0B ➖
Tipseen 71.21KB 71.11KB -108B 🟢
TipseenContent 71.52KB 71.65KB +136B 🔺
TipseenMedia 71.4KB 71.29KB -108B 🟢
TipseenWizard 73.87KB 73.86KB -10B 🟢
Toast 74KB 73.97KB -27B 🟢
ToastButton 18.64KB 18.6KB -34B 🟢
ToastLink 15.07KB 15.07KB -3B 🟢
Toggle 66.71KB 66.61KB -105B 🟢
TransitionView 5.45KB 5.43KB -18B 🟢
VirtualizedGrid 12.54KB 12.53KB -4B 🟢
VirtualizedList 12.27KB 12.25KB -17B 🟢
List (Next) 8.15KB 8.17KB +23B 🔺
ListItem (Next) 69.9KB 69.92KB +18B 🔺
ListTitle (Next) 65.33KB 65.29KB -42B 🟢

📊 Summary:

  • Total Base Size: 4.75MB
  • Total PR Size: 4.75MB
  • Total Difference: 4.92KB

@talkor talkor merged commit 15e14cf into master Mar 24, 2026
17 checks passed
@talkor talkor deleted the chore/shared-cleanup branch March 24, 2026 15:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants