Skip to content

Commit a68e005

Browse files
authored
chore: make all exports from v5 component modules explicit (#3808)
## Description While doing #3785 I've encountered a problem, where I could not export any non-type symbol from `src/components/tabs/index.ts` because such symbol would be exported twice - once from `src/index.ts:'export type * from './types'` and once from `src/index.ts:<my added symbol export>` resulting in duplicated exports error. This made me notice that our API export structure is wrong. This PR changes that to one consistent structure across all of our new components. It should not be a breaking change unless somebody used deep-imports. I'll create a doc describing the new system later, but here me out here first. 1. Each component module should be responsible for defining it's own public API at `src/components/<component-name>/index.ts` boundary. Anything not directly importable from that file is not a part of public API. 2. Root `src/index.tsx` file just reexports all the symbols exported at the component module level. 3. No `export * from ...` type exports on the component module boundary level. Only explicit exports are allowed. It's better to not ship some symbol and add it later, than publish something by accident and remove it later. 4. No default exports neither from component module boundary level nor component implementation modules. Such setup will also allow for easier library modularisation down the line. ## Changes Replaces wildcard (`export *` / `export type *`) re-exports with explicit named exports across all v5 (experimental) component modules: `Tabs`, `Stack`, `Split`, `SafeAreaView`, and `ScrollViewMarker`. Also converts default exports to named exports for these components so that each module's public surface is clearly declared in one place. - **`src/components/tabs/index.ts`** — explicit type exports, `export const Tabs` instead of `export default` - **`src/components/gamma/stack/index.ts`** — explicit type exports, `export const Stack` instead of `export default` - **`src/components/gamma/split/index.ts`** — explicit type exports, `export const Split` instead of `export default` - **`src/components/safe-area/SafeAreaView.tsx`** — named export instead of default - **`src/components/safe-area/index.ts`** — new barrel with explicit exports - **`src/components/gamma/scroll-view-marker/`** — named export, explicit re-exports - **`src/experimental/index.ts`** — simplified to `export *` from each component index (which now have explicit surfaces) - **`src/experimental/types.ts`** — deleted; types are now owned by their respective component index files - **`src/index.tsx`** — `export type *` for v4 types; `export * from './components/tabs'` to correctly expose `SCREEN_KEY_MORE_NAV_CTRL` and `Tabs` as a named export - **`src/types.tsx`** — removed stale re-exports of tabs & shared types (moved to `src/index.tsx`) ## Test plan - Verified that `Tabs`, `Stack`, `Split`, `SafeAreaView`, `ScrollViewMarker` remain importable from their respective entry points. ## Checklist - [ ] Included code example that can be used to test this change. - [ ] Updated / created local changelog entries in relevant test files. - [ ] For visual changes, included screenshots / GIFs / recordings documenting the change. - [ ] For API changes, updated relevant public types. - [ ] Ensured that CI passes
1 parent 8fe7607 commit a68e005

13 files changed

Lines changed: 86 additions & 49 deletions

File tree

src/components/ScreenStackItem.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import ScreenStack from './ScreenStack';
2020
import { RNSScreensRefContext } from '../contexts';
2121
import { FooterComponent } from './ScreenFooter';
2222
import { SafeAreaViewProps } from './safe-area/SafeAreaView.types';
23-
import SafeAreaView from './safe-area/SafeAreaView';
23+
import { SafeAreaView } from './safe-area/SafeAreaView';
2424
import { featureFlags } from '../flags';
2525
import { isIOS26OrHigher } from './helpers/PlatformUtils';
2626

src/components/gamma/scroll-view-marker/ScrollViewMarker.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React from 'react';
22
import ScrollViewMarkerNativeComponent from '../../../fabric/gamma/ScrollViewMarkerNativeComponent';
33
import type { ScrollViewMarkerProps } from './ScrollViewMarker.types';
44

5-
export default function ScrollViewMarker(props: ScrollViewMarkerProps) {
5+
export function ScrollViewMarker(props: ScrollViewMarkerProps) {
66
const { scrollEdgeEffects, ...rest } = props;
77

88
return (

src/components/gamma/scroll-view-marker/ScrollViewMarker.types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { ViewProps } from 'react-native';
2-
import type { ScrollEdgeEffect } from '../../../types';
2+
import type { ScrollEdgeEffect } from '../../shared/types';
33

44
export interface ScrollViewMarkerProps {
55
children: ViewProps['children'];
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
export type * from './ScrollViewMarker.types';
1+
export type { ScrollViewMarkerProps } from './ScrollViewMarker.types';
22

3-
export { default as ScrollViewMarker } from './ScrollViewMarker';
3+
export { ScrollViewMarker } from './ScrollViewMarker';

src/components/gamma/split/index.ts

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,30 @@
11
import SplitHost from './SplitHost';
22
import SplitScreen from './SplitScreen';
33

4-
export * from './SplitHost.types';
5-
export * from './SplitScreen.types';
4+
export type {
5+
DisplayModeWillChangeEvent, // TODO: This event should be renamed to match the convention
6+
SplitDisplayModeButtonVisibility,
7+
SplitBehavior,
8+
SplitPrimaryEdge,
9+
SplitPrimaryBackgroundStyle,
10+
SplitDisplayMode,
11+
SplitHostOrientation,
12+
SplitColumnMetrics,
13+
SplitNavigableColumn,
14+
SplitHostCommands,
15+
SplitHostProps,
16+
} from './SplitHost.types';
17+
18+
export type {
19+
SplitScreenColumnType,
20+
SplitScreenProps,
21+
} from './SplitScreen.types';
622

723
/**
824
* EXPERIMENTAL API, MIGHT CHANGE W/O ANY NOTICE
925
*/
10-
const Split = {
26+
export const Split = {
1127
Host: SplitHost,
1228
Column: SplitScreen.Column,
1329
Inspector: SplitScreen.Inspector,
1430
};
15-
16-
export default Split;

src/components/gamma/stack/index.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,21 @@
11
import StackHost from './StackHost';
22
import StackScreen from './StackScreen';
33

4-
export * from './StackHost.types';
5-
export * from './StackScreen.types';
4+
export type { StackHostProps } from './StackHost.types';
5+
6+
export type {
7+
OnDismissEventPayload,
8+
EmptyEventPayload, // TODO: Remove this from public types (we need one shared type for this)
9+
OnDismissEvent,
10+
StackScreenActivityMode,
11+
StackScreenEventHandler,
12+
StackScreenProps,
13+
} from './StackScreen.types';
614

715
/**
816
* EXPERIMENTAL API, MIGHT CHANGE W/O ANY NOTICE
917
*/
10-
const Stack = {
18+
export const Stack = {
1119
Host: StackHost,
1220
Screen: StackScreen,
1321
};
14-
15-
export default Stack;

src/components/safe-area/SafeAreaView.tsx

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import SafeAreaViewNativeComponent, {
99
} from '../../fabric/safe-area/SafeAreaViewNativeComponent';
1010
import { StyleSheet } from 'react-native';
1111

12-
function SafeAreaView(props: SafeAreaViewProps) {
12+
export function SafeAreaView(props: SafeAreaViewProps) {
1313
return (
1414
<SafeAreaViewNativeComponent
1515
{...props}
@@ -19,8 +19,6 @@ function SafeAreaView(props: SafeAreaViewProps) {
1919
);
2020
}
2121

22-
export default SafeAreaView;
23-
2422
function getNativeEdgesProp(
2523
edges: SafeAreaViewProps['edges'],
2624
): SafeAreaViewNativeComponentProps['edges'] {

src/components/safe-area/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export { SafeAreaView } from './SafeAreaView';
2+
3+
export type { Edge, InsetType, SafeAreaViewProps } from './SafeAreaView.types';

src/components/tabs/index.ts

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,48 @@
11
import { TabsHost } from './host';
22
import { TabsScreen } from './screen';
33

4-
export type * from './host';
5-
export type * from './screen';
4+
export type {
5+
TabsHostNavState,
6+
TabChangeEvent,
7+
TabsHostColorScheme,
8+
TabsHostDirection,
9+
TabsHostNativeContainerStyleProps,
10+
TabsHostPropsBase,
11+
TabsHostProps,
12+
// Android
13+
TabsHostPropsAndroid,
14+
// iOS
15+
TabsBottomAccessoryComponentFactory,
16+
TabBarMinimizeBehavior,
17+
TabBarControllerMode,
18+
TabsHostPropsIOS,
19+
} from './host';
20+
21+
export type {
22+
TabsScreenEventHandler,
23+
TabsScreenOrientation,
24+
TabsScreenPropsBase,
25+
TabsScreenProps,
26+
// Android
27+
TabBarItemLabelVisibilityMode,
28+
TabsScreenItemStateAppearanceAndroid,
29+
TabsScreenAppearanceAndroid,
30+
TabsScreenPropsAndroid,
31+
// iOS
32+
TabsScreenBlurEffect,
33+
TabsScreenSystemItem,
34+
TabsScreenAppearanceIOS,
35+
TabsScreenItemAppearanceIOS,
36+
TabsScreenItemStateAppearanceIOS,
37+
TabsScreenPropsIOS,
38+
} from './screen';
639

740
export type { TabsBottomAccessoryEnvironment } from './bottom-accessory';
841

942
/**
1043
* EXPERIMENTAL API, MIGHT CHANGE W/O ANY NOTICE
1144
*/
12-
const Tabs = {
45+
export const Tabs = {
1346
Host: TabsHost,
1447
Screen: TabsScreen,
1548
};
16-
17-
export default Tabs;

src/experimental/index.ts

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,9 @@
33
* BE SUBJECT TO BREAKING CHANGES WITHOUT NOTICE OR LIBRARY MAJOR VERSION CHANGE.
44
*/
55

6-
// Types
7-
export type * from './types';
6+
// Components & types
87

9-
// Components
10-
11-
export { default as Stack } from '../components/gamma/stack';
12-
13-
export { default as Split } from '../components/gamma/split';
14-
export { default as SafeAreaView } from '../components/safe-area/SafeAreaView';
15-
16-
export { default as ScrollViewMarker } from '../components/gamma/scroll-view-marker/ScrollViewMarker';
8+
export * from '../components/gamma/stack';
9+
export * from '../components/gamma/split';
10+
export * from '../components/safe-area';
11+
export * from '../components/gamma/scroll-view-marker';

0 commit comments

Comments
 (0)