@hero-design/rn 8.112.4 → 8.112.5

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 (118) hide show
  1. package/.turbo/turbo-build.log +3 -3
  2. package/CHANGELOG.md +6 -0
  3. package/es/index.js +1760 -1359
  4. package/jest.config.js +1 -1
  5. package/lib/index.js +1760 -1359
  6. package/package.json +2 -2
  7. package/src/components/Accordion/AccordionItem.tsx +1 -1
  8. package/src/components/AnimatedScroller/AnimatedScrollable.tsx +1 -1
  9. package/src/components/AnimatedScroller/SectionListWithFAB.tsx +1 -1
  10. package/src/components/Button/UtilityButton/index.tsx +1 -1
  11. package/src/components/Calendar/CalendarRange.tsx +1 -1
  12. package/src/components/Calendar/CalendarRowItem.tsx +1 -1
  13. package/src/components/Calendar/index.tsx +1 -1
  14. package/src/components/Chart/Line/Line.tsx +3 -4
  15. package/src/components/Chart/index.tsx +0 -2
  16. package/src/components/Chart/shared/ChartHeader.tsx +1 -1
  17. package/src/components/Chart/shared/hooks/useColorScale.ts +2 -2
  18. package/src/components/Chart/shared/hooks/useGenerateTicks.ts +2 -2
  19. package/src/components/Chart/shared/hooks/useScaleBandX.ts +3 -3
  20. package/src/components/Chart/shared/hooks/useScaleLinearY.ts +3 -4
  21. package/src/components/Chart/types.ts +0 -8
  22. package/src/components/Checkbox/utils.ts +1 -1
  23. package/src/components/Chip/index.tsx +1 -1
  24. package/src/components/DatePicker/hooks/__tests__/useFormatDate.spec.ts +7 -5
  25. package/src/components/DatePicker/hooks/useFormatDate.ts +1 -1
  26. package/src/components/DatePicker/types.ts +1 -1
  27. package/src/components/FloatingIsland/index.tsx +1 -1
  28. package/src/components/Illustration/index.tsx +1 -1
  29. package/src/components/List/BasicListItem.tsx +1 -1
  30. package/src/components/List/StyledListItem.tsx +2 -2
  31. package/src/components/LocaleProvider/__tests__/utils.specs.ts +1 -2
  32. package/src/components/LocaleProvider/index.tsx +1 -1
  33. package/src/components/LocaleProvider/utils.ts +2 -3
  34. package/src/components/Portal/index.tsx +1 -1
  35. package/src/components/Portal/types.tsx +2 -2
  36. package/src/components/Radio/Radio.tsx +1 -1
  37. package/src/components/Rate/index.tsx +2 -2
  38. package/src/components/RefreshControl/index.tsx +1 -1
  39. package/src/components/RichTextEditor/RichTextEditor.tsx +1 -1
  40. package/src/components/RichTextEditor/utils/events.ts +1 -1
  41. package/src/components/Search/SearchOneLine.tsx +1 -1
  42. package/src/components/Search/StyledSearch.tsx +1 -1
  43. package/src/components/SectionHeading/index.tsx +1 -1
  44. package/src/components/Select/helpers.tsx +1 -1
  45. package/src/components/Skeleton/index.tsx +1 -1
  46. package/src/components/Slider/RangeSlider.tsx +1 -1
  47. package/src/components/StatusScreens/Success/index.tsx +1 -1
  48. package/src/components/Tabs/ScrollableTabsHeader/ScrollableTabsHeader.tsx +1 -1
  49. package/src/components/Tabs/TabWithBadge.tsx +2 -2
  50. package/src/components/TextInput/index.tsx +2 -2
  51. package/src/components/TimePicker/TimePickerAndroid.tsx +1 -1
  52. package/src/components/TimePicker/TimePickerIOS.tsx +1 -1
  53. package/src/components/TimePicker/types.ts +1 -1
  54. package/src/components/Toast/ToastContext.ts +1 -1
  55. package/src/components/Toolbar/index.tsx +1 -1
  56. package/src/components/Typography/Label/index.tsx +1 -1
  57. package/src/theme/global/colors/types.ts +1 -1
  58. package/src/theme/global/shadows/index.ts +0 -3
  59. package/src/theme/global/shadows/types.ts +1 -1
  60. package/src/theme/global/sizes.ts +1 -0
  61. package/src/theme/global/typography.ts +2 -1
  62. package/types/components/Accordion/AccordionItem.d.ts +1 -1
  63. package/types/components/AnimatedScroller/AnimatedScrollable.d.ts +1 -1
  64. package/types/components/AnimatedScroller/SectionListWithFAB.d.ts +1 -1
  65. package/types/components/Button/UtilityButton/index.d.ts +1 -1
  66. package/types/components/Calendar/CalendarRowItem.d.ts +1 -1
  67. package/types/components/Chart/index.d.ts +0 -3
  68. package/types/components/Chart/shared/ChartHeader.d.ts +1 -1
  69. package/types/components/Chart/shared/hooks/useScaleBandX.d.ts +2 -3
  70. package/types/components/Chart/shared/hooks/useScaleLinearY.d.ts +2 -3
  71. package/types/components/Chart/types.d.ts +1 -7
  72. package/types/components/Checkbox/utils.d.ts +2 -1
  73. package/types/components/Chip/index.d.ts +1 -1
  74. package/types/components/DatePicker/types.d.ts +1 -1
  75. package/types/components/FloatingIsland/index.d.ts +1 -1
  76. package/types/components/Illustration/index.d.ts +1 -1
  77. package/types/components/List/BasicListItem.d.ts +1 -1
  78. package/types/components/List/StyledListItem.d.ts +2 -2
  79. package/types/components/LocaleProvider/utils.d.ts +1 -1
  80. package/types/components/Portal/index.d.ts +1 -1
  81. package/types/components/Portal/types.d.ts +3 -2
  82. package/types/components/Radio/Radio.d.ts +1 -1
  83. package/types/components/Rate/index.d.ts +2 -2
  84. package/types/components/RefreshControl/index.d.ts +1 -1
  85. package/types/components/RichTextEditor/RichTextEditor.d.ts +0 -4
  86. package/types/components/RichTextEditor/utils/events.d.ts +2 -1
  87. package/types/components/Search/SearchOneLine.d.ts +1 -1
  88. package/types/components/Search/StyledSearch.d.ts +2 -1
  89. package/types/components/SectionHeading/index.d.ts +1 -1
  90. package/types/components/Select/helpers.d.ts +2 -1
  91. package/types/components/Skeleton/index.d.ts +1 -1
  92. package/types/components/Slider/RangeSlider.d.ts +1 -1
  93. package/types/components/StatusScreens/Success/index.d.ts +1 -1
  94. package/types/components/Tabs/ScrollableTabsHeader/ScrollableTabsHeader.d.ts +1 -1
  95. package/types/components/Tabs/TabWithBadge.d.ts +2 -2
  96. package/types/components/TextInput/index.d.ts +2 -2
  97. package/types/components/TimePicker/types.d.ts +1 -1
  98. package/types/components/Toast/ToastContext.d.ts +2 -1
  99. package/types/components/Toolbar/index.d.ts +1 -1
  100. package/types/components/Typography/Label/index.d.ts +1 -1
  101. package/types/theme/components/alert.d.ts +10 -1
  102. package/types/theme/components/bottomNavigation.d.ts +10 -1
  103. package/types/theme/components/chip.d.ts +10 -1
  104. package/types/theme/components/fab.d.ts +10 -1
  105. package/types/theme/components/floatingIsland.d.ts +10 -1
  106. package/types/theme/components/list.d.ts +10 -1
  107. package/types/theme/components/search.d.ts +10 -1
  108. package/types/theme/components/segmentedControl.d.ts +10 -1
  109. package/types/theme/components/slider.d.ts +10 -1
  110. package/types/theme/components/toast.d.ts +10 -1
  111. package/types/theme/global/colors/types.d.ts +2 -1
  112. package/types/theme/global/index.d.ts +1 -1
  113. package/types/theme/global/shadows/index.d.ts +0 -2
  114. package/types/theme/global/shadows/types.d.ts +2 -1
  115. package/types/theme/global/typography.d.ts +1 -1
  116. package/.cursor/rules/performance-optimization.mdc +0 -64
  117. package/.cursor/rules/rn-rules.mdc +0 -165
  118. package/.cursor/rules/testing-rules.mdc +0 -114
@@ -50,8 +50,9 @@ export type BrandSystemPalette = {
50
50
  decorativeSecondarySurface?: string;
51
51
  };
52
52
  export type ThemeMode = 'light' | 'dark';
53
- export type ThemeName = 'swagLight' | 'swagLightJobs' | 'ehWorkDark' | 'ehWork' | 'ehJobs';
53
+ type ThemeName = 'swagLight' | 'swagLightJobs' | 'ehWorkDark' | 'ehWork' | 'ehJobs';
54
54
  export type SystemPalette = GlobalSystemPalette & BrandSystemPalette & {
55
55
  themeMode?: ThemeMode;
56
56
  name?: ThemeName;
57
57
  };
58
+ export {};
@@ -62,7 +62,7 @@ declare const getGlobalTheme: (scale: Scale, systemPalette: SystemPalette) => {
62
62
  decorativeSecondary?: string;
63
63
  decorativeSecondarySurface?: string;
64
64
  themeMode?: import("./colors/types").ThemeMode;
65
- name?: import("./colors/types").ThemeName;
65
+ name?: "swagLight" | "swagLightJobs" | "ehWorkDark" | "ehWork" | "ehJobs";
66
66
  };
67
67
  fonts: import("./typography").Fonts;
68
68
  fontSizes: import("./typography").FontSizes;
@@ -1,5 +1,3 @@
1
1
  import type { SystemPalette } from '../colors/types';
2
2
  declare const getShadows: (palette: SystemPalette) => import("./types").ShadowPalette;
3
- type Shadows = ReturnType<typeof getShadows>;
4
3
  export { getShadows };
5
- export type { Shadows };
@@ -1,4 +1,4 @@
1
- export type ShadowStyles = {
1
+ type ShadowStyles = {
2
2
  shadowOffset: {
3
3
  width: number;
4
4
  height: number;
@@ -13,3 +13,4 @@ export type ShadowPalette = {
13
13
  medium: ShadowStyles;
14
14
  deep: ShadowStyles;
15
15
  };
16
+ export {};
@@ -31,4 +31,4 @@ declare const getFonts: ({ neutral, playful, }: {
31
31
  declare const getFontSizes: (baseFontSize: number) => FontSizes;
32
32
  declare const getLineHeights: (fontSizes: FontSizes) => LineHeights;
33
33
  export { getFonts, getFontSizes, getLineHeights };
34
- export type { Fonts, FontSizes, LineHeights };
34
+ export type { Fonts, FontSizes };
@@ -1,64 +0,0 @@
1
- ---
2
- pattern: "**/*.{ts,tsx}"
3
- description: "Performance optimization rules for React Native components in rn package"
4
- ---
5
-
6
- # Performance Optimization Rules for RN Package
7
-
8
- ## React Native Performance Best Practices
9
-
10
- ### Component Optimization
11
- - Use `React.memo()` for components that receive stable props
12
- - Implement `useMemo()` for expensive calculations
13
- - Use `useCallback()` for event handlers passed to child components
14
- - Avoid creating objects/functions in render methods
15
- - Prefer `useState` functional updates when state depends on previous state
16
-
17
- ### List Performance
18
- - Use `FlatList` or `SectionList` instead of `ScrollView` with `map()`
19
- - Implement `getItemLayout` for `FlatList` when item heights are known
20
- - Use `keyExtractor` prop for consistent item identification
21
- - Implement `removeClippedSubviews` for large lists
22
- - Use `windowSize` and `initialNumToRender` for performance tuning
23
-
24
- ### Memory Management
25
- - Clean up subscriptions in `useEffect` cleanup functions
26
- - Use `InteractionManager.runAfterInteractions()` for non-critical operations
27
- - Avoid memory leaks by properly unmounting components
28
- - Use `React.useRef()` instead of `useState` for mutable values
29
- - Implement proper error boundaries to prevent crashes
30
-
31
- ### Animation Performance
32
- - Use `Animated` API for smooth 60fps animations
33
- - Prefer `transform` and `opacity` animations over layout changes
34
- - Use `useNativeDriver: true` when possible
35
- - Avoid animating `width`, `height`, or `top` properties
36
- - Use `LayoutAnimation` for list item changes
37
-
38
- ### Bundle Size Optimization
39
- - Use dynamic imports for large components (`React.lazy()`)
40
- - Implement code splitting for feature modules
41
- - Remove unused dependencies and imports
42
- - Use tree shaking compatible libraries
43
- - Optimize asset sizes and formats
44
-
45
- ### React Native Specific Performance Considerations
46
- - Test with mobile-typical data sizes (large datasets, complex forms)
47
- - Optimize for mobile app's specific use cases
48
- - Ensure smooth performance on older devices
49
- - Test with base theme and custom styling
50
- - Monitor performance metrics in mobile environment
51
-
52
- ### Performance Monitoring
53
- - Use React DevTools Profiler for component analysis
54
- - Implement performance logging for critical paths
55
- - Monitor memory usage during development
56
- - Test performance on various device types
57
- - Use Flipper for React Native debugging
58
-
59
- ### Anti-Patterns to Avoid
60
- - Don't use `console.log` in production builds
61
- - Avoid inline object/function creation in render
62
- - Don't use `setState` in render methods
63
- - Avoid unnecessary re-renders with proper dependency arrays
64
- - Don't ignore performance warnings from React Native
@@ -1,165 +0,0 @@
1
- ---
2
- pattern: "**/*.{ts,tsx}"
3
- description: "General development rules for React Native components in rn package"
4
- ---
5
-
6
- # RN Package Development Rules
7
-
8
- ## Package Context
9
- This is the base React Native component library that provides core components, themes, and utilities for React Native applications.
10
-
11
- ## Component Structure Guidelines
12
-
13
- ### File Organization
14
- - **Component files**: `ComponentName/ComponentName.tsx` (main component)
15
- - **Styled components**: `ComponentName/StyledComponentName.tsx` (e.g., `StyledButton.tsx`)
16
- - **Types**: `ComponentName/types.ts` (if complex types are needed)
17
- - **Tests**: `ComponentName/__tests__/ComponentName.spec.tsx`
18
-
19
- ### Component Structure Example
20
- ```tsx
21
- // Button/Button.tsx
22
- import React from 'react';
23
- import type { StyleProp, ViewStyle } from 'react-native';
24
- import { useTheme } from '../../theme';
25
- import { StyledButtonContainer, StyledButtonText } from './StyledButton';
26
-
27
- export interface ButtonProps {
28
- /** Button label */
29
- text?: ReactChild;
30
- /** Visual intent color */
31
- intent?: 'primary' | 'secondary' | 'danger';
32
- /** Button type */
33
- variant?: 'filled' | 'outlined' | 'text';
34
- /** Loading state */
35
- loading?: boolean;
36
- /** Press handler */
37
- onPress: () => void;
38
- /** Additional style */
39
- style?: StyleProp<ViewStyle>;
40
- }
41
-
42
- const Button = ({ text, intent = 'primary', variant = 'filled', loading, onPress, style }: ButtonProps): JSX.Element => {
43
- const theme = useTheme();
44
- const themeVariant = getThemeVariant(variant, intent);
45
-
46
- return (
47
- <StyledButtonContainer
48
- disabled={loading}
49
- onPress={onPress}
50
- themeButtonVariant={themeVariant}
51
- style={style}
52
- >
53
- {loading ? (
54
- <LoadingIndicator themeVariant={themeVariant} />
55
- ) : (
56
- <StyledButtonText themeButtonVariant={themeVariant}>
57
- {text}
58
- </StyledButtonText>
59
- )}
60
- </StyledButtonContainer>
61
- );
62
- };
63
- ```
64
-
65
- ### Styled Component Conventions
66
- - **Naming**: `const StyledComponentName = styled.View\`\``
67
- - **Props naming**: Use descriptive names like `themeButtonVariant`, `themeIsPressed`, `themeIsCompact`
68
- - **Theme access**: Use component-specific theme tokens via `theme.__hd__.componentName.*` instead of global theme tokens
69
-
70
- ```tsx
71
- // StyledButton.tsx
72
- import styled from '@emotion/native';
73
-
74
- interface StyledButtonProps {
75
- themeButtonVariant: ThemeVariant;
76
- disabled?: boolean;
77
- }
78
-
79
- const StyledButtonContainer = styled.TouchableHighlight<StyledButtonProps>`
80
- ${({ theme, themeButtonVariant, disabled }) => `
81
- background-color: ${theme.__hd__.button.colors.background[themeButtonVariant]};
82
- border-radius: ${theme.__hd__.button.borderRadius};
83
- padding: ${theme.__hd__.button.spacing.default};
84
- opacity: ${disabled ? 0.5 : 1};
85
- `}
86
- `;
87
- ```
88
-
89
- ## Theme Token Usage
90
-
91
- ### Adding Theme Tokens
92
- 1. **Define in theme**: Add new tokens to `theme/global` files
93
- 2. **Use consistently**: Apply tokens across components
94
- 3. **Document usage**: Add JSDoc comments for token purposes
95
-
96
- ### Theme Token Examples
97
- ```tsx
98
- // Using component-specific theme tokens
99
- background-color: ${theme.__hd__.button.colors.background[themeVariant]};
100
- color: ${theme.__hd__.button.colors.text[themeVariant]};
101
- padding: ${theme.__hd__.button.spacing.default};
102
- border-radius: ${theme.__hd__.button.borderRadius};
103
-
104
- // Using global theme tokens when needed
105
- margin: ${theme.spacing.md}; // Global spacing
106
- font-family: ${theme.typography.fontFamily}; // Global typography
107
- ```
108
-
109
- ### Modifying Theme Tokens
110
- - **Global changes**: Update `theme/global` files
111
- - **Component-specific**: Use component theme overrides
112
- - **Testing**: Verify changes across all components
113
-
114
- ## Component Development Rules
115
-
116
- ### Basic Rules
117
- - **Prefer functional components with hooks over class components**
118
- - Import `styled` from `@emotion/native` for styling consistency
119
- - Use `useTheme()` hook instead of prop drilling theme
120
- - Follow React Native design patterns and accessibility requirements
121
- - Use TypeScript strictly - no `any` types without good reason
122
- - Fix linting errors immediately
123
- - Use proper React Native components (`Text`, `View`) instead of HTML elements
124
-
125
- ### Props Interface Guidelines
126
- ```tsx
127
- // Good example from Button component
128
- export interface ButtonProps {
129
- /** Button label */
130
- text?: ReactChild;
131
- /** Visual intent color */
132
- intent?: 'primary' | 'secondary' | 'danger';
133
- /** Button type */
134
- variant?: 'filled' | 'outlined' | 'text';
135
- /** Loading state */
136
- loading?: boolean;
137
- /** Press handler */
138
- onPress: () => void;
139
- /** Additional style */
140
- style?: StyleProp<ViewStyle>;
141
- /** Testing id */
142
- testID?: string;
143
- }
144
- ```
145
-
146
- ## Documentation Rules
147
- - Document Props interfaces with JSDoc comments directly on each property: `/** Description */`
148
- - Use simplified @param comments: `@param props - The component props (see [ComponentName]Props interface for details)`
149
- - Avoid mentioning implementation details like "memoized component" in JSDoc comments
150
- - Focus JSDoc comments on what the component does, not how it's implemented
151
- - Keep type information in the Props interface, not duplicated in @param comments
152
-
153
- ## React Native Specific Patterns
154
- - Components should work with base theme system
155
- - Test with standard React Native color palettes and spacing
156
- - Ensure compatibility with React Native requirements
157
- - Follow React Native accessibility guidelines
158
- - Test performance with typical mobile data sizes
159
-
160
- ## Quality Gates
161
- - All tests must pass with 100% coverage on main components
162
- - No linting errors
163
- - No TypeScript errors
164
- - Components must work with base theme system
165
- - Accessibility compliance for mobile environment
@@ -1,114 +0,0 @@
1
- ---
2
- pattern: "**/*.spec.{ts,tsx}"
3
- description: "Comprehensive testing guidelines for React Native components in rn package"
4
- ---
5
-
6
- # Testing Guidelines for RN Package
7
-
8
- ## Testing Philosophy
9
- - Write user-behavior focused tests that describe what users see and experience
10
- - Use descriptive test names like "when user sees an empty input field" instead of "idle state"
11
- - Group related assertions with explanatory comments about user expectations
12
- - Focus on user interactions and outcomes rather than implementation details
13
- - Test the component's public API, not internal implementation
14
- - Write tests that will catch regressions and ensure reliability
15
-
16
- ## Testing Tools and Setup
17
- - Use `@testing-library/react-native` for all component testing
18
- - Use `renderWithTheme()` from `../testUtils/renderWithTheme` for components that need theme context
19
- - Use semantic matchers like `toBeDisabled()`, `toHaveProp()` when available
20
- - For complex React Native styles, use manual checking when `toHaveStyle()` doesn't work
21
- - Handle React Native's nested style arrays with `StyleSheet.flatten()` or custom helpers
22
- - Use `jest` for test runner and assertion library
23
- - Use `@testing-library/jest-native` for additional React Native matchers
24
-
25
- ## Test Structure and Organization
26
- - Follow AAA pattern: Arrange, Act, Assert
27
- - Use `describe` blocks to group related tests
28
- - Use descriptive `it` statements that explain the expected behavior
29
- - Keep tests focused and test one thing at a time
30
- - Use `beforeEach` and `afterEach` for setup and cleanup
31
- - Mock external dependencies and APIs
32
- - Use `test.each` for parameterized tests when testing multiple scenarios
33
-
34
- ## Test Coverage Requirements
35
- - Aim for 100% line coverage on main component files
36
- - Create dedicated test files for each component (not just integration tests)
37
- - Separate large test files by component responsibility
38
- - Use consistent naming: `ComponentName.spec.tsx`
39
- - Keep test utilities in `testUtils/` directory at package root
40
- - Use snapshot testing for visual regression prevention
41
- - Create README.md files in test directories explaining testing approach
42
-
43
- ## Component Testing Patterns
44
- - Test component rendering with different props
45
- - Test user interactions (press, type, scroll)
46
- - Test component state changes
47
- - Test prop changes and their effects
48
- - Test conditional rendering based on props/state
49
- - Test component lifecycle methods
50
- - Test ref forwarding and imperative APIs
51
-
52
- ## Accessibility Testing
53
- - Test screen reader support with `getByRole`, `getByLabelText`
54
- - Test keyboard navigation and focus management
55
- - Test accessibility props like `accessibilityLabel`, `accessibilityHint`
56
- - Test accessibility states like `accessibilityState`
57
- - Test with accessibility tools and screen readers
58
- - Ensure proper semantic markup and ARIA attributes
59
-
60
- ## Error Handling and Edge Cases
61
- - Test error states and error boundaries
62
- - Test with invalid or missing props
63
- - Test with extreme values (empty strings, null, undefined)
64
- - Test component behavior with network failures
65
- - Test graceful degradation when features are unavailable
66
- - Test component recovery from error states
67
-
68
- ## Performance Testing
69
- - Test component rendering performance with large datasets
70
- - Test memory leaks and cleanup
71
- - Test component re-rendering behavior
72
- - Test with typical mobile data sizes
73
- - Use React DevTools Profiler for performance analysis
74
- - Test component performance on different device types
75
-
76
- ## React Native Specific Testing
77
- - Test with React Native specific APIs and components
78
- - Test component behavior with different screen sizes
79
- - Test component behavior with different orientations
80
- - Test component behavior with different device capabilities
81
- - Test component behavior with different platform-specific features
82
- - Test component behavior with different React Native versions
83
-
84
- ## Mocking and Test Utilities
85
- - Mock React Native modules that aren't available in test environment
86
- - Create custom render functions for common test scenarios
87
- - Use `jest.mock()` for external dependencies
88
- - Create test data factories for consistent test data
89
- - Use `@testing-library/user-event` for user interaction simulation
90
- - Mock navigation and routing for component tests
91
-
92
- ## Test Data Management
93
- - Use consistent test data across tests
94
- - Create reusable test data factories
95
- - Use realistic data that matches production scenarios
96
- - Test with both valid and invalid data
97
- - Use mobile-specific data patterns and structures
98
- - Keep test data minimal but representative
99
-
100
- ## Integration Testing
101
- - Test component integration with other components
102
- - Test component behavior within larger feature flows
103
- - Test component interaction with global state
104
- - Test component behavior with routing and navigation
105
- - Test component behavior with React Native services
106
- - Use integration tests sparingly, prefer unit tests
107
-
108
- ## Continuous Integration
109
- - Ensure all tests pass in CI environment
110
- - Use consistent test commands across environments
111
- - Set up test coverage reporting
112
- - Use parallel test execution for faster CI runs
113
- - Ensure tests are deterministic and don't flake
114
- - Use proper test isolation to avoid test interference