@react-native-reusables/cli 0.1.2 → 0.2.1
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.
- package/README.md +1 -1
- package/__generated/components/ui/button.tsx +1 -1
- package/__generated/components/ui/card.tsx +1 -1
- package/__generated/components/ui/context-menu.tsx +2 -2
- package/__generated/components/ui/dropdown-menu.tsx +2 -2
- package/__generated/components/ui/hover-card.tsx +4 -4
- package/__generated/components/ui/menubar.tsx +2 -2
- package/__generated/components/ui/progress.tsx +1 -1
- package/__generated/components/ui/select.tsx +1 -1
- package/__generated/components/ui/text.tsx +1 -1
- package/__generated/components/ui/toggle-group.tsx +1 -1
- package/__generated/components/ui/typography.tsx +2 -1
- package/__generated/starter-base/README.md +16 -0
- package/__generated/starter-base/app/+not-found.tsx +18 -0
- package/__generated/starter-base/app/_layout.tsx +69 -0
- package/__generated/starter-base/app/index.tsx +95 -0
- package/__generated/starter-base/app.json +40 -0
- package/__generated/starter-base/assets/images/adaptive-icon.png +0 -0
- package/__generated/starter-base/assets/images/favicon.png +0 -0
- package/__generated/starter-base/assets/images/icon.png +0 -0
- package/__generated/starter-base/assets/images/splash.png +0 -0
- package/__generated/starter-base/babel.config.js +6 -0
- package/__generated/starter-base/components/ThemeToggle.tsx +38 -0
- package/__generated/starter-base/components/ui/avatar.tsx +45 -0
- package/__generated/starter-base/components/ui/button.tsx +88 -0
- package/__generated/starter-base/components/ui/card.tsx +57 -0
- package/__generated/starter-base/components/ui/progress.tsx +61 -0
- package/__generated/starter-base/components/ui/text.tsx +24 -0
- package/__generated/starter-base/components/ui/tooltip.tsx +39 -0
- package/__generated/starter-base/global.css +49 -0
- package/__generated/starter-base/index.js +12 -0
- package/__generated/starter-base/lib/android-navigation-bar.ts +11 -0
- package/__generated/starter-base/lib/constants.ts +18 -0
- package/__generated/starter-base/lib/icons/Info.tsx +4 -0
- package/__generated/starter-base/lib/icons/MoonStar.tsx +4 -0
- package/__generated/starter-base/lib/icons/Sun.tsx +4 -0
- package/__generated/starter-base/lib/icons/iconWithClassName.ts +14 -0
- package/__generated/starter-base/lib/useColorScheme.tsx +11 -0
- package/__generated/starter-base/lib/utils.ts +6 -0
- package/__generated/starter-base/metro.config.js +6 -0
- package/__generated/starter-base/nativewind-env.d.ts +1 -0
- package/__generated/starter-base/package.json +53 -0
- package/__generated/starter-base/tailwind.config.js +65 -0
- package/__generated/starter-base/tsconfig.json +19 -0
- package/dist/index.js +5 -4
- package/dist/index.js.map +1 -1
- package/package.json +5 -4
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import * as ProgressPrimitive from '@rn-primitives/progress';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { Platform, View } from 'react-native';
|
|
4
|
+
import Animated, {
|
|
5
|
+
Extrapolation,
|
|
6
|
+
interpolate,
|
|
7
|
+
useAnimatedStyle,
|
|
8
|
+
useDerivedValue,
|
|
9
|
+
withSpring,
|
|
10
|
+
} from 'react-native-reanimated';
|
|
11
|
+
import { cn } from '~/lib/utils';
|
|
12
|
+
|
|
13
|
+
const Progress = React.forwardRef<
|
|
14
|
+
ProgressPrimitive.RootRef,
|
|
15
|
+
ProgressPrimitive.RootProps & {
|
|
16
|
+
indicatorClassName?: string;
|
|
17
|
+
}
|
|
18
|
+
>(({ className, value, indicatorClassName, ...props }, ref) => {
|
|
19
|
+
return (
|
|
20
|
+
<ProgressPrimitive.Root
|
|
21
|
+
ref={ref}
|
|
22
|
+
className={cn('relative h-4 w-full overflow-hidden rounded-full bg-secondary', className)}
|
|
23
|
+
{...props}
|
|
24
|
+
>
|
|
25
|
+
<Indicator value={value} className={indicatorClassName} />
|
|
26
|
+
</ProgressPrimitive.Root>
|
|
27
|
+
);
|
|
28
|
+
});
|
|
29
|
+
Progress.displayName = ProgressPrimitive.Root.displayName;
|
|
30
|
+
|
|
31
|
+
export { Progress };
|
|
32
|
+
|
|
33
|
+
function Indicator({ value, className }: { value: number | undefined | null; className?: string }) {
|
|
34
|
+
const progress = useDerivedValue(() => value ?? 0);
|
|
35
|
+
|
|
36
|
+
const indicator = useAnimatedStyle(() => {
|
|
37
|
+
return {
|
|
38
|
+
width: withSpring(
|
|
39
|
+
`${interpolate(progress.value, [0, 100], [1, 100], Extrapolation.CLAMP)}%`,
|
|
40
|
+
{ overshootClamping: true }
|
|
41
|
+
),
|
|
42
|
+
};
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
if (Platform.OS === 'web') {
|
|
46
|
+
return (
|
|
47
|
+
<View
|
|
48
|
+
className={cn('h-full w-full flex-1 bg-primary web:transition-all', className)}
|
|
49
|
+
style={{ transform: `translateX(-${100 - (value ?? 0)}%)` }}
|
|
50
|
+
>
|
|
51
|
+
<ProgressPrimitive.Indicator className={cn('h-full w-full ', className)} />
|
|
52
|
+
</View>
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return (
|
|
57
|
+
<ProgressPrimitive.Indicator asChild>
|
|
58
|
+
<Animated.View style={indicator} className={cn('h-full bg-foreground', className)} />
|
|
59
|
+
</ProgressPrimitive.Indicator>
|
|
60
|
+
);
|
|
61
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import * as Slot from '@rn-primitives/slot';
|
|
2
|
+
import type { SlottableTextProps, TextRef } from '@rn-primitives/types';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { Text as RNText } from 'react-native';
|
|
5
|
+
import { cn } from '~/lib/utils';
|
|
6
|
+
|
|
7
|
+
const TextClassContext = React.createContext<string | undefined>(undefined);
|
|
8
|
+
|
|
9
|
+
const Text = React.forwardRef<TextRef, SlottableTextProps>(
|
|
10
|
+
({ className, asChild = false, ...props }, ref) => {
|
|
11
|
+
const textClass = React.useContext(TextClassContext);
|
|
12
|
+
const Component = asChild ? Slot.Text : RNText;
|
|
13
|
+
return (
|
|
14
|
+
<Component
|
|
15
|
+
className={cn('text-base text-foreground web:select-text', textClass, className)}
|
|
16
|
+
ref={ref}
|
|
17
|
+
{...props}
|
|
18
|
+
/>
|
|
19
|
+
);
|
|
20
|
+
}
|
|
21
|
+
);
|
|
22
|
+
Text.displayName = 'Text';
|
|
23
|
+
|
|
24
|
+
export { Text, TextClassContext };
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import * as TooltipPrimitive from '@rn-primitives/tooltip';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { Platform, StyleSheet } from 'react-native';
|
|
4
|
+
import Animated, { FadeIn, FadeOut } from 'react-native-reanimated';
|
|
5
|
+
import { TextClassContext } from '~/components/ui/text';
|
|
6
|
+
import { cn } from '~/lib/utils';
|
|
7
|
+
|
|
8
|
+
const Tooltip = TooltipPrimitive.Root;
|
|
9
|
+
|
|
10
|
+
const TooltipTrigger = TooltipPrimitive.Trigger;
|
|
11
|
+
|
|
12
|
+
const TooltipContent = React.forwardRef<
|
|
13
|
+
TooltipPrimitive.ContentRef,
|
|
14
|
+
TooltipPrimitive.ContentProps & { portalHost?: string }
|
|
15
|
+
>(({ className, sideOffset = 4, portalHost, ...props }, ref) => (
|
|
16
|
+
<TooltipPrimitive.Portal hostName={portalHost}>
|
|
17
|
+
<TooltipPrimitive.Overlay style={Platform.OS !== 'web' ? StyleSheet.absoluteFill : undefined}>
|
|
18
|
+
<Animated.View
|
|
19
|
+
entering={Platform.select({ web: undefined, default: FadeIn })}
|
|
20
|
+
exiting={Platform.select({ web: undefined, default: FadeOut })}
|
|
21
|
+
>
|
|
22
|
+
<TextClassContext.Provider value='text-sm native:text-base text-popover-foreground'>
|
|
23
|
+
<TooltipPrimitive.Content
|
|
24
|
+
ref={ref}
|
|
25
|
+
sideOffset={sideOffset}
|
|
26
|
+
className={cn(
|
|
27
|
+
'z-50 overflow-hidden rounded-md border border-border bg-popover px-3 py-1.5 shadow-md shadow-foreground/5 web:animate-in web:fade-in-0 web:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
|
|
28
|
+
className
|
|
29
|
+
)}
|
|
30
|
+
{...props}
|
|
31
|
+
/>
|
|
32
|
+
</TextClassContext.Provider>
|
|
33
|
+
</Animated.View>
|
|
34
|
+
</TooltipPrimitive.Overlay>
|
|
35
|
+
</TooltipPrimitive.Portal>
|
|
36
|
+
));
|
|
37
|
+
TooltipContent.displayName = TooltipPrimitive.Content.displayName;
|
|
38
|
+
|
|
39
|
+
export { Tooltip, TooltipContent, TooltipTrigger };
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
@tailwind base;
|
|
2
|
+
@tailwind components;
|
|
3
|
+
@tailwind utilities;
|
|
4
|
+
|
|
5
|
+
@layer base {
|
|
6
|
+
:root {
|
|
7
|
+
--background: 0 0% 100%;
|
|
8
|
+
--foreground: 240 10% 3.9%;
|
|
9
|
+
--card: 0 0% 100%;
|
|
10
|
+
--card-foreground: 240 10% 3.9%;
|
|
11
|
+
--popover: 0 0% 100%;
|
|
12
|
+
--popover-foreground: 240 10% 3.9%;
|
|
13
|
+
--primary: 240 5.9% 10%;
|
|
14
|
+
--primary-foreground: 0 0% 98%;
|
|
15
|
+
--secondary: 240 4.8% 95.9%;
|
|
16
|
+
--secondary-foreground: 240 5.9% 10%;
|
|
17
|
+
--muted: 240 4.8% 95.9%;
|
|
18
|
+
--muted-foreground: 240 3.8% 46.1%;
|
|
19
|
+
--accent: 240 4.8% 95.9%;
|
|
20
|
+
--accent-foreground: 240 5.9% 10%;
|
|
21
|
+
--destructive: 0 84.2% 60.2%;
|
|
22
|
+
--destructive-foreground: 0 0% 98%;
|
|
23
|
+
--border: 240 5.9% 90%;
|
|
24
|
+
--input: 240 5.9% 90%;
|
|
25
|
+
--ring: 240 5.9% 10%;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.dark:root {
|
|
29
|
+
--background: 240 10% 3.9%;
|
|
30
|
+
--foreground: 0 0% 98%;
|
|
31
|
+
--card: 240 10% 3.9%;
|
|
32
|
+
--card-foreground: 0 0% 98%;
|
|
33
|
+
--popover: 240 10% 3.9%;
|
|
34
|
+
--popover-foreground: 0 0% 98%;
|
|
35
|
+
--primary: 0 0% 98%;
|
|
36
|
+
--primary-foreground: 240 5.9% 10%;
|
|
37
|
+
--secondary: 240 3.7% 15.9%;
|
|
38
|
+
--secondary-foreground: 0 0% 98%;
|
|
39
|
+
--muted: 240 3.7% 15.9%;
|
|
40
|
+
--muted-foreground: 240 5% 64.9%;
|
|
41
|
+
--accent: 240 3.7% 15.9%;
|
|
42
|
+
--accent-foreground: 0 0% 98%;
|
|
43
|
+
--destructive: 0 72% 51%;
|
|
44
|
+
--destructive-foreground: 0 0% 98%;
|
|
45
|
+
--border: 240 3.7% 15.9%;
|
|
46
|
+
--input: 240 3.7% 15.9%;
|
|
47
|
+
--ring: 240 4.9% 83.9%;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { registerRootComponent } from 'expo';
|
|
2
|
+
import { ExpoRoot } from 'expo-router';
|
|
3
|
+
|
|
4
|
+
// https://docs.expo.dev/router/reference/troubleshooting/#expo_router_app_root-not-defined
|
|
5
|
+
|
|
6
|
+
// Must be exported or Fast Refresh won't update the context
|
|
7
|
+
export function App() {
|
|
8
|
+
const ctx = require.context('./app');
|
|
9
|
+
return <ExpoRoot context={ctx} />;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
registerRootComponent(App);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as NavigationBar from 'expo-navigation-bar';
|
|
2
|
+
import { Platform } from 'react-native';
|
|
3
|
+
import { NAV_THEME } from '~/lib/constants';
|
|
4
|
+
|
|
5
|
+
export async function setAndroidNavigationBar(theme: 'light' | 'dark') {
|
|
6
|
+
if (Platform.OS !== 'android') return;
|
|
7
|
+
await NavigationBar.setButtonStyleAsync(theme === 'dark' ? 'light' : 'dark');
|
|
8
|
+
await NavigationBar.setBackgroundColorAsync(
|
|
9
|
+
theme === 'dark' ? NAV_THEME.dark.background : NAV_THEME.light.background
|
|
10
|
+
);
|
|
11
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export const NAV_THEME = {
|
|
2
|
+
light: {
|
|
3
|
+
background: 'hsl(0 0% 100%)', // background
|
|
4
|
+
border: 'hsl(240 5.9% 90%)', // border
|
|
5
|
+
card: 'hsl(0 0% 100%)', // card
|
|
6
|
+
notification: 'hsl(0 84.2% 60.2%)', // destructive
|
|
7
|
+
primary: 'hsl(240 5.9% 10%)', // primary
|
|
8
|
+
text: 'hsl(240 10% 3.9%)', // foreground
|
|
9
|
+
},
|
|
10
|
+
dark: {
|
|
11
|
+
background: 'hsl(240 10% 3.9%)', // background
|
|
12
|
+
border: 'hsl(240 3.7% 15.9%)', // border
|
|
13
|
+
card: 'hsl(240 10% 3.9%)', // card
|
|
14
|
+
notification: 'hsl(0 72% 51%)', // destructive
|
|
15
|
+
primary: 'hsl(0 0% 98%)', // primary
|
|
16
|
+
text: 'hsl(0 0% 98%)', // foreground
|
|
17
|
+
},
|
|
18
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { LucideIcon } from 'lucide-react-native';
|
|
2
|
+
import { cssInterop } from 'nativewind';
|
|
3
|
+
|
|
4
|
+
export function iconWithClassName(icon: LucideIcon) {
|
|
5
|
+
cssInterop(icon, {
|
|
6
|
+
className: {
|
|
7
|
+
target: 'style',
|
|
8
|
+
nativeStyleToProp: {
|
|
9
|
+
color: true,
|
|
10
|
+
opacity: true,
|
|
11
|
+
},
|
|
12
|
+
},
|
|
13
|
+
});
|
|
14
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { useColorScheme as useNativewindColorScheme } from 'nativewind';
|
|
2
|
+
|
|
3
|
+
export function useColorScheme() {
|
|
4
|
+
const { colorScheme, setColorScheme, toggleColorScheme } = useNativewindColorScheme();
|
|
5
|
+
return {
|
|
6
|
+
colorScheme: colorScheme ?? 'dark',
|
|
7
|
+
isDarkColorScheme: colorScheme === 'dark',
|
|
8
|
+
setColorScheme,
|
|
9
|
+
toggleColorScheme,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/// <reference types="nativewind/types" />
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@rnr/starter-base",
|
|
3
|
+
"main": "index.js",
|
|
4
|
+
"version": "1.0.0",
|
|
5
|
+
"scripts": {
|
|
6
|
+
"dev": "expo start -c --ios",
|
|
7
|
+
"dev:web": "expo start -c --web",
|
|
8
|
+
"dev:android": "expo start -c --android",
|
|
9
|
+
"android": "expo start -c --android",
|
|
10
|
+
"ios": "expo start -c --ios",
|
|
11
|
+
"web": "expo start -c --web",
|
|
12
|
+
"clean": "rm -rf .expo node_modules",
|
|
13
|
+
"postinstall": "npx tailwindcss -i ./global.css -o ./node_modules/.cache/nativewind/global.css"
|
|
14
|
+
},
|
|
15
|
+
"dependencies": {
|
|
16
|
+
"@react-navigation/native": "^7.0.0",
|
|
17
|
+
"@rn-primitives/avatar": "~1.1.0",
|
|
18
|
+
"@rn-primitives/portal": "~1.1.0",
|
|
19
|
+
"@rn-primitives/progress": "~1.1.0",
|
|
20
|
+
"@rn-primitives/slot": "~1.1.0",
|
|
21
|
+
"@rn-primitives/tooltip": "~1.1.0",
|
|
22
|
+
"@rn-primitives/types": "~1.1.0",
|
|
23
|
+
"class-variance-authority": "^0.7.0",
|
|
24
|
+
"clsx": "^2.1.0",
|
|
25
|
+
"expo": "^52.0.23",
|
|
26
|
+
"expo-linking": "~7.0.3",
|
|
27
|
+
"expo-navigation-bar": "~4.0.6",
|
|
28
|
+
"expo-router": "~4.0.15",
|
|
29
|
+
"expo-splash-screen": "~0.29.18",
|
|
30
|
+
"expo-status-bar": "~2.0.0",
|
|
31
|
+
"expo-system-ui": "~4.0.6",
|
|
32
|
+
"lucide-react-native": "^0.378.0",
|
|
33
|
+
"nativewind": "^4.1.23",
|
|
34
|
+
"react": "18.3.1",
|
|
35
|
+
"react-dom": "18.3.1",
|
|
36
|
+
"react-native": "0.76.5",
|
|
37
|
+
"react-native-reanimated": "~3.16.1",
|
|
38
|
+
"react-native-safe-area-context": "4.12.0",
|
|
39
|
+
"react-native-screens": "^4.4.0",
|
|
40
|
+
"react-native-svg": "15.8.0",
|
|
41
|
+
"react-native-web": "~0.19.13",
|
|
42
|
+
"tailwind-merge": "^2.2.1",
|
|
43
|
+
"tailwindcss": "3.3.5",
|
|
44
|
+
"tailwindcss-animate": "^1.0.7",
|
|
45
|
+
"zustand": "^4.4.7"
|
|
46
|
+
},
|
|
47
|
+
"devDependencies": {
|
|
48
|
+
"@babel/core": "^7.26.0",
|
|
49
|
+
"@types/react": "~18.3.12",
|
|
50
|
+
"typescript": "^5.3.3"
|
|
51
|
+
},
|
|
52
|
+
"private": true
|
|
53
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
const { hairlineWidth } = require('nativewind/theme');
|
|
2
|
+
|
|
3
|
+
/** @type {import('tailwindcss').Config} */
|
|
4
|
+
module.exports = {
|
|
5
|
+
darkMode: 'class',
|
|
6
|
+
content: ['./app/**/*.{ts,tsx}', './components/**/*.{ts,tsx}'],
|
|
7
|
+
presets: [require('nativewind/preset')],
|
|
8
|
+
theme: {
|
|
9
|
+
extend: {
|
|
10
|
+
colors: {
|
|
11
|
+
border: 'hsl(var(--border))',
|
|
12
|
+
input: 'hsl(var(--input))',
|
|
13
|
+
ring: 'hsl(var(--ring))',
|
|
14
|
+
background: 'hsl(var(--background))',
|
|
15
|
+
foreground: 'hsl(var(--foreground))',
|
|
16
|
+
primary: {
|
|
17
|
+
DEFAULT: 'hsl(var(--primary))',
|
|
18
|
+
foreground: 'hsl(var(--primary-foreground))',
|
|
19
|
+
},
|
|
20
|
+
secondary: {
|
|
21
|
+
DEFAULT: 'hsl(var(--secondary))',
|
|
22
|
+
foreground: 'hsl(var(--secondary-foreground))',
|
|
23
|
+
},
|
|
24
|
+
destructive: {
|
|
25
|
+
DEFAULT: 'hsl(var(--destructive))',
|
|
26
|
+
foreground: 'hsl(var(--destructive-foreground))',
|
|
27
|
+
},
|
|
28
|
+
muted: {
|
|
29
|
+
DEFAULT: 'hsl(var(--muted))',
|
|
30
|
+
foreground: 'hsl(var(--muted-foreground))',
|
|
31
|
+
},
|
|
32
|
+
accent: {
|
|
33
|
+
DEFAULT: 'hsl(var(--accent))',
|
|
34
|
+
foreground: 'hsl(var(--accent-foreground))',
|
|
35
|
+
},
|
|
36
|
+
popover: {
|
|
37
|
+
DEFAULT: 'hsl(var(--popover))',
|
|
38
|
+
foreground: 'hsl(var(--popover-foreground))',
|
|
39
|
+
},
|
|
40
|
+
card: {
|
|
41
|
+
DEFAULT: 'hsl(var(--card))',
|
|
42
|
+
foreground: 'hsl(var(--card-foreground))',
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
borderWidth: {
|
|
46
|
+
hairline: hairlineWidth(),
|
|
47
|
+
},
|
|
48
|
+
keyframes: {
|
|
49
|
+
'accordion-down': {
|
|
50
|
+
from: { height: '0' },
|
|
51
|
+
to: { height: 'var(--radix-accordion-content-height)' },
|
|
52
|
+
},
|
|
53
|
+
'accordion-up': {
|
|
54
|
+
from: { height: 'var(--radix-accordion-content-height)' },
|
|
55
|
+
to: { height: '0' },
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
animation: {
|
|
59
|
+
'accordion-down': 'accordion-down 0.2s ease-out',
|
|
60
|
+
'accordion-up': 'accordion-up 0.2s ease-out',
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
plugins: [require('tailwindcss-animate')],
|
|
65
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "expo/tsconfig.base",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"strict": true,
|
|
5
|
+
"baseUrl": ".",
|
|
6
|
+
"paths": {
|
|
7
|
+
"~/*": [
|
|
8
|
+
"*"
|
|
9
|
+
]
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"include": [
|
|
13
|
+
"**/*.ts",
|
|
14
|
+
"**/*.tsx",
|
|
15
|
+
".expo/types/**/*.ts",
|
|
16
|
+
"expo-env.d.ts",
|
|
17
|
+
"nativewind-env.d.ts"
|
|
18
|
+
]
|
|
19
|
+
}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{createMatchPath as L}from"tsconfig-paths";async function N(e,o){return L(o.absoluteBaseUrl,o.paths)(e,void 0,()=>!0,[".ts",".tsx"])}import{cosmiconfig as W}from"cosmiconfig";import{loadConfig as U}from"tsconfig-paths";import{z as d}from"zod";var S="~/components",$="~/lib",J=W("components",{searchPlaces:["components.json"]}),k=d.object({aliases:d.object({components:d.string(),lib:d.string()})}),z=k.extend({resolvedPaths:d.object({lib:d.string(),components:d.string()})});async function j(e){let o=await B(e);return o?await E(e,o):null}async function E(e,o){let n=await U(e);if(n.resultType==="failed")throw new Error(`Failed to load tsconfig.json. ${n.message??""}`.trim());return z.parse({...o,resolvedPaths:{lib:await N(o.aliases.lib,n),components:await N(o.aliases.components,n)}})}async function B(e){try{let o=await J.search(e);return o?k.parse(o.config):null}catch{throw new Error(`Invalid configuration found in ${e}/components.json.`)}}import{detect as q}from"@antfu/ni";async function I(e){let o=await q({programmatic:!0,cwd:e});return o==="yarn@berry"?"yarn":o==="pnpm@6"?"pnpm":o==="bun"?"bun":o??"npm"}import C from"chalk";var a={error(...e){console.log(C.red(...e))},warn(...e){console.log(C.yellow(...e))},info(...e){console.log(C.cyan(...e))},success(...e){console.log(C.green(...e))},break(){console.log("")}};function x(e){typeof e=="string"&&(a.error(e),process.exit(1)),e instanceof Error&&(a.error(e.message),process.exit(1)),a.error("Something went wrong. Please try again."),process.exit(1)}import u from"chalk";import{Command as G}from"commander";import{execa as V}from"execa";import{existsSync as v,promises as g}from"fs";import F from"ora";import c from"path";import w from"prompts";import{z as h}from"zod";var f=[{name:"accordion",dependencies:["text"],icons:["ChevronDown"],npmPackages:["@rn-primitives/accordion"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/accordion.tsx",to:{folder:"ui",file:"accordion.tsx"}}]},{name:"alert-dialog",dependencies:["button","text"],icons:[],npmPackages:["@rn-primitives/alert-dialog"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/alert-dialog.tsx",to:{folder:"ui",file:"alert-dialog.tsx"}}]},{name:"aspect-ratio",dependencies:[],icons:[],npmPackages:["@rn-primitives/aspect-ratio"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/aspect-ratio.tsx",to:{folder:"ui",file:"aspect-ratio.tsx"}}]},{name:"avatar",dependencies:[],icons:[],npmPackages:["@rn-primitives/avatar"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/avatar.tsx",to:{folder:"ui",file:"avatar.tsx"}}]},{name:"badge",dependencies:[],icons:[],npmPackages:["@rn-primitives/slot","@rn-primitives/types"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/badge.tsx",to:{folder:"ui",file:"badge.tsx"}}]},{name:"button",dependencies:["text"],icons:[],npmPackages:["@rn-primitives/types"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/button.tsx",to:{folder:"ui",file:"button.tsx"}}]},{name:"card",dependencies:["text"],icons:[],npmPackages:["@rn-primitives/types"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/card.tsx",to:{folder:"ui",file:"card.tsx"}}]},{name:"checkbox",dependencies:[],icons:["Check"],npmPackages:["@rn-primitives/checkbox"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/checkbox.tsx",to:{folder:"ui",file:"checkbox.tsx"}}]},{name:"collapsible",dependencies:[],icons:[],npmPackages:["@rn-primitives/collapsible"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/collapsible.tsx",to:{folder:"ui",file:"collapsible.tsx"}}]},{name:"context-menu",dependencies:["text"],icons:["Check","ChevronDown","ChevronRight","ChevronUp"],npmPackages:["@rn-primitives/context-menu"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/context-menu.tsx",to:{folder:"ui",file:"context-menu.tsx"}}]},{name:"dialog",dependencies:[],icons:["X"],npmPackages:["@rn-primitives/dialog"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/dialog.tsx",to:{folder:"ui",file:"dialog.tsx"}}]},{name:"dropdown-menu",dependencies:["text"],icons:["Check","ChevronDown","ChevronRight","ChevronUp"],npmPackages:["@rn-primitives/dropdown-menu"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/dropdown-menu.tsx",to:{folder:"ui",file:"dropdown-menu.tsx"}}]},{name:"hover-card",dependencies:[],icons:[],npmPackages:["@rn-primitives/hover-card"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/hover-card.tsx",to:{folder:"ui",file:"hover-card.tsx"}}]},{name:"input",dependencies:[],icons:[],npmPackages:[],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/input.tsx",to:{folder:"ui",file:"input.tsx"}}]},{name:"label",dependencies:[],icons:[],npmPackages:["@rn-primitives/label"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/label.tsx",to:{folder:"ui",file:"label.tsx"}}]},{name:"menubar",dependencies:["text"],icons:["Check","ChevronDown","ChevronRight","ChevronUp"],npmPackages:["@rn-primitives/menubar"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/menubar.tsx",to:{folder:"ui",file:"menubar.tsx"}}]},{name:"navigation-menu",dependencies:[],icons:["ChevronDown"],npmPackages:["@rn-primitives/navigation-menu"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/navigation-menu.tsx",to:{folder:"ui",file:"navigation-menu.tsx"}}]},{name:"popover",dependencies:["text"],icons:[],npmPackages:["@rn-primitives/popover"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/popover.tsx",to:{folder:"ui",file:"popover.tsx"}}]},{name:"progress",dependencies:[],icons:[],npmPackages:["@rn-primitives/progress"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/progress.tsx",to:{folder:"ui",file:"progress.tsx"}}]},{name:"radio-group",dependencies:[],icons:[],npmPackages:["@rn-primitives/radio-group"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/radio-group.tsx",to:{folder:"ui",file:"radio-group.tsx"}}]},{name:"select",dependencies:[],icons:["Check","ChevronDown","ChevronUp"],npmPackages:["@rn-primitives/select"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/select.tsx",to:{folder:"ui",file:"select.tsx"}}]},{name:"separator",dependencies:[],icons:[],npmPackages:["@rn-primitives/separator"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/separator.tsx",to:{folder:"ui",file:"separator.tsx"}}]},{name:"skeleton",dependencies:[],icons:[],npmPackages:[],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/skeleton.tsx",to:{folder:"ui",file:"skeleton.tsx"}}]},{name:"switch",dependencies:[],icons:[],npmPackages:["@rn-primitives/switch"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/switch.tsx",to:{folder:"ui",file:"switch.tsx"}}]},{name:"table",dependencies:["text"],icons:[],npmPackages:["@rn-primitives/table"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/table.tsx",to:{folder:"ui",file:"table.tsx"}}]},{name:"tabs",dependencies:["text"],icons:[],npmPackages:["@rn-primitives/tabs"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/tabs.tsx",to:{folder:"ui",file:"tabs.tsx"}}]},{name:"text",dependencies:[],icons:[],npmPackages:["@rn-primitives/slot","@rn-primitives/types"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/text.tsx",to:{folder:"ui",file:"text.tsx"}}]},{name:"textarea",dependencies:[],icons:[],npmPackages:[],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/textarea.tsx",to:{folder:"ui",file:"textarea.tsx"}}]},{name:"toggle",dependencies:["text"],icons:[],npmPackages:["@rn-primitives/toggle"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/toggle.tsx",to:{folder:"ui",file:"toggle.tsx"}}]},{name:"toggle-group",dependencies:["text"],icons:[],npmPackages:["@rn-primitives/toggle-group"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/toggle-group.tsx",to:{folder:"ui",file:"toggle-group.tsx"}}]},{name:"tooltip",dependencies:["text"],icons:[],npmPackages:["@rn-primitives/tooltip"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/tooltip.tsx",to:{folder:"ui",file:"tooltip.tsx"}}]},{name:"typography",dependencies:[],icons:[],npmPackages:["@rn-primitives/slot","@rn-primitives/types"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/typography.tsx",to:{folder:"ui",file:"typography.tsx"}}]}];function O(e,o=new Set){let n=f.find(i=>i.name===e);if(!n)return[];o.add(e);let r=n.dependencies.slice();return n.dependencies.forEach(i=>{if(!o.has(i)){let t=O(i,o);r=r.concat(t)}}),r}var P="invalid component";function T(e){let o=new Set;if(e.some(n=>!f.find(r=>r.name===n)))throw new Error(P);return e.forEach(n=>{let r=O(n);r.unshift(n),r.forEach(i=>{o.add(i)})}),Array.from(o).map(n=>{let r=f.find(i=>i.name===n);if(!r)throw new Error(P);return r})}import{fileURLToPath as X}from"url";var H=X(import.meta.url),D=c.dirname(H),K=h.object({components:h.array(h.string()).optional(),overwrite:h.boolean(),cwd:h.string(),path:h.string().optional()}),R=new G().name("add").description("add components to your project").argument("[components...]","the components to add").option("-o, --overwrite","overwrite existing files.",!1).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,o)=>{try{let n=K.parse({components:e,...o}),r=c.resolve(n.cwd);v(r)||(a.error(`The path ${r} does not exist. Please try again.`),process.exit(1));let i=await j(r);i||(i=await Z(r));let t=n.components??[];if(!t?.length){let{components:l}=await w({type:"multiselect",name:"components",message:"Which components would you like to add?",hint:"Space to select. A to toggle all. Enter to submit.",instructions:!1,choices:f.map(y=>({title:y.name,value:y.name,selected:!1}))});t=l}t?.length||(a.warn("No components selected. Exiting."),process.exit(0));let s=F("Installing components...").start(),m=[];try{m=T(t)}catch(l){l instanceof Error&&l.message===P&&(a.error(`Invalid component(s): ${t.filter(y=>!f.find(M=>M.name===y)).join(", ")}`),process.exit(1)),a.error(l)}let p=[];for(let l of m)s.text=`Installing ${l.name}...`,await Q(l,l.paths,i,s,n.overwrite),p.push(...l.npmPackages);let b=await I(r),_=Array.from(new Set(p));_.length&&(s.text=`Installing ${_.join(", ")}...`,await V(b,[b==="npm"?"install":"add",..._],{cwd:r})),s.succeed("Done.")}catch(n){x(n)}});async function Q(e,o,n,r,i){for(let t of o){let s=c.join(n.resolvedPaths.components,t.to.folder);if(v(s)||await g.mkdir(s,{recursive:!0}),r.stop(),v(c.join(s,t.to.file))){let p=[t.to.folder,t.to.file].join("/");if(!i){a.info(`File already exists: ${u.bgCyan(p)} was skipped. To overwrite, run with the ${u.green("--overwrite")} flag.`);continue}let{overwrite:b}=await w({type:"confirm",name:"overwrite",message:`File already exists: ${u.yellow(p)}. Would you like to overwrite?`,initial:!1});if(!b){a.info("Skipped");continue}}r.start(`Installing ${e.name}...`);let m=t.distFrom?c.join(D,"../__generated/components",t.distFrom):c.join(D,"../__generated/components",t.to.folder,t.to.file);try{let p=await g.readFile(c.resolve(m),"utf8");await g.writeFile(c.join(s,t.to.file),Y(p,n.aliases.components,n.aliases.lib))}catch(p){x(p)}}for(let t of e.icons??[]){let s=c.resolve(n.resolvedPaths.lib,"icons");if(!v(s)){await g.mkdir(s,{recursive:!0});try{await g.writeFile(c.join(s,"iconWithClassName.ts"),`import type { LucideIcon } from 'lucide-react-native';
|
|
2
|
+
import{createMatchPath as Q}from"tsconfig-paths";async function D(e,o){return Q(o.absoluteBaseUrl,o.paths)(e,void 0,()=>!0,[".ts",".tsx"])}import{cosmiconfig as X}from"cosmiconfig";import{loadConfig as K}from"tsconfig-paths";import{z as u}from"zod";var b="~/components",P="~/lib",Y=X("components",{searchPlaces:["components.json"]}),y=u.object({aliases:u.object({components:u.string(),lib:u.string()})}),Z=y.extend({resolvedPaths:u.object({lib:u.string(),components:u.string()})});async function N(e){let o=await ee(e);return o?await C(e,o):null}async function C(e,o){let t=await K(e);if(t.resultType==="failed")throw new Error(`Failed to load tsconfig.json. ${t.message??""}`.trim());return Z.parse({...o,resolvedPaths:{lib:await D(o.aliases.lib,t),components:await D(o.aliases.components,t)}})}async function ee(e){try{let o=await Y.search(e);return o?y.parse(o.config):null}catch{throw new Error(`Invalid configuration found in ${e}/components.json.`)}}import{detect as oe}from"@antfu/ni";async function R(e){let o=await oe({programmatic:!0,cwd:e});return o==="yarn@berry"?"yarn":o==="pnpm@6"?"pnpm":o==="bun"?"bun":o??"npm"}import E from"chalk";var a={error(...e){console.log(E.red(...e))},warn(...e){console.log(E.yellow(...e))},info(...e){console.log(E.cyan(...e))},success(...e){console.log(E.green(...e))},break(){console.log("")}};function m(e){typeof e=="string"&&(a.error(e),process.exit(1)),e instanceof Error&&(a.error(e.message),process.exit(1)),a.error("Something went wrong. Please try again."),process.exit(1)}import h from"chalk";import{Command as te}from"commander";import{execa as ne}from"execa";import{existsSync as k,promises as x}from"fs";import M from"ora";import p from"path";import _ from"prompts";import{z as v}from"zod";var g=[{name:"accordion",dependencies:["text"],icons:["ChevronDown"],npmPackages:["@rn-primitives/accordion"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/accordion.tsx",to:{folder:"ui",file:"accordion.tsx"}}]},{name:"alert-dialog",dependencies:["button","text"],icons:[],npmPackages:["@rn-primitives/alert-dialog"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/alert-dialog.tsx",to:{folder:"ui",file:"alert-dialog.tsx"}}]},{name:"aspect-ratio",dependencies:[],icons:[],npmPackages:["@rn-primitives/aspect-ratio"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/aspect-ratio.tsx",to:{folder:"ui",file:"aspect-ratio.tsx"}}]},{name:"avatar",dependencies:[],icons:[],npmPackages:["@rn-primitives/avatar"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/avatar.tsx",to:{folder:"ui",file:"avatar.tsx"}}]},{name:"badge",dependencies:[],icons:[],npmPackages:["@rn-primitives/slot","@rn-primitives/types"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/badge.tsx",to:{folder:"ui",file:"badge.tsx"}}]},{name:"button",dependencies:["text"],icons:[],npmPackages:["@rn-primitives/types"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/button.tsx",to:{folder:"ui",file:"button.tsx"}}]},{name:"card",dependencies:["text"],icons:[],npmPackages:["@rn-primitives/types"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/card.tsx",to:{folder:"ui",file:"card.tsx"}}]},{name:"checkbox",dependencies:[],icons:["Check"],npmPackages:["@rn-primitives/checkbox"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/checkbox.tsx",to:{folder:"ui",file:"checkbox.tsx"}}]},{name:"collapsible",dependencies:[],icons:[],npmPackages:["@rn-primitives/collapsible"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/collapsible.tsx",to:{folder:"ui",file:"collapsible.tsx"}}]},{name:"context-menu",dependencies:["text"],icons:["Check","ChevronDown","ChevronRight","ChevronUp"],npmPackages:["@rn-primitives/context-menu"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/context-menu.tsx",to:{folder:"ui",file:"context-menu.tsx"}}]},{name:"dialog",dependencies:[],icons:["X"],npmPackages:["@rn-primitives/dialog"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/dialog.tsx",to:{folder:"ui",file:"dialog.tsx"}}]},{name:"dropdown-menu",dependencies:["text"],icons:["Check","ChevronDown","ChevronRight","ChevronUp"],npmPackages:["@rn-primitives/dropdown-menu"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/dropdown-menu.tsx",to:{folder:"ui",file:"dropdown-menu.tsx"}}]},{name:"hover-card",dependencies:[],icons:[],npmPackages:["@rn-primitives/hover-card"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/hover-card.tsx",to:{folder:"ui",file:"hover-card.tsx"}}]},{name:"input",dependencies:[],icons:[],npmPackages:[],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/input.tsx",to:{folder:"ui",file:"input.tsx"}}]},{name:"label",dependencies:[],icons:[],npmPackages:["@rn-primitives/label"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/label.tsx",to:{folder:"ui",file:"label.tsx"}}]},{name:"menubar",dependencies:["text"],icons:["Check","ChevronDown","ChevronRight","ChevronUp"],npmPackages:["@rn-primitives/menubar"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/menubar.tsx",to:{folder:"ui",file:"menubar.tsx"}}]},{name:"navigation-menu",dependencies:[],icons:["ChevronDown"],npmPackages:["@rn-primitives/navigation-menu"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/navigation-menu.tsx",to:{folder:"ui",file:"navigation-menu.tsx"}}]},{name:"popover",dependencies:["text"],icons:[],npmPackages:["@rn-primitives/popover"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/popover.tsx",to:{folder:"ui",file:"popover.tsx"}}]},{name:"progress",dependencies:[],icons:[],npmPackages:["@rn-primitives/progress"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/progress.tsx",to:{folder:"ui",file:"progress.tsx"}}]},{name:"radio-group",dependencies:[],icons:[],npmPackages:["@rn-primitives/radio-group"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/radio-group.tsx",to:{folder:"ui",file:"radio-group.tsx"}}]},{name:"select",dependencies:[],icons:["Check","ChevronDown","ChevronUp"],npmPackages:["@rn-primitives/select"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/select.tsx",to:{folder:"ui",file:"select.tsx"}}]},{name:"separator",dependencies:[],icons:[],npmPackages:["@rn-primitives/separator"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/separator.tsx",to:{folder:"ui",file:"separator.tsx"}}]},{name:"skeleton",dependencies:[],icons:[],npmPackages:[],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/skeleton.tsx",to:{folder:"ui",file:"skeleton.tsx"}}]},{name:"switch",dependencies:[],icons:[],npmPackages:["@rn-primitives/switch"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/switch.tsx",to:{folder:"ui",file:"switch.tsx"}}]},{name:"table",dependencies:["text"],icons:[],npmPackages:["@rn-primitives/table"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/table.tsx",to:{folder:"ui",file:"table.tsx"}}]},{name:"tabs",dependencies:["text"],icons:[],npmPackages:["@rn-primitives/tabs"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/tabs.tsx",to:{folder:"ui",file:"tabs.tsx"}}]},{name:"text",dependencies:[],icons:[],npmPackages:["@rn-primitives/slot","@rn-primitives/types"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/text.tsx",to:{folder:"ui",file:"text.tsx"}}]},{name:"textarea",dependencies:[],icons:[],npmPackages:[],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/textarea.tsx",to:{folder:"ui",file:"textarea.tsx"}}]},{name:"toggle",dependencies:["text"],icons:[],npmPackages:["@rn-primitives/toggle"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/toggle.tsx",to:{folder:"ui",file:"toggle.tsx"}}]},{name:"toggle-group",dependencies:["text"],icons:[],npmPackages:["@rn-primitives/toggle-group"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/toggle-group.tsx",to:{folder:"ui",file:"toggle-group.tsx"}}]},{name:"tooltip",dependencies:["text"],icons:[],npmPackages:["@rn-primitives/tooltip"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/tooltip.tsx",to:{folder:"ui",file:"tooltip.tsx"}}]},{name:"typography",dependencies:[],icons:[],npmPackages:["@rn-primitives/slot","@rn-primitives/types"],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/typography.tsx",to:{folder:"ui",file:"typography.tsx"}}]}];function L(e,o=new Set){let t=g.find(i=>i.name===e);if(!t)return[];o.add(e);let n=t.dependencies.slice();return t.dependencies.forEach(i=>{if(!o.has(i)){let r=L(i,o);n=n.concat(r)}}),n}var O="invalid component";function U(e){let o=new Set;if(e.some(t=>!g.find(n=>n.name===t)))throw new Error(O);return e.forEach(t=>{let n=L(t);n.unshift(t),n.forEach(i=>{o.add(i)})}),Array.from(o).map(t=>{let n=g.find(i=>i.name===t);if(!n)throw new Error(O);return n})}import{fileURLToPath as re}from"url";var ie=re(import.meta.url),W=p.dirname(ie),se=v.object({components:v.array(v.string()).optional(),overwrite:v.boolean(),cwd:v.string(),path:v.string().optional()}),z=new te().name("add").description("add components to your project").argument("[components...]","the components to add").option("-o, --overwrite","overwrite existing files.",!1).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,o)=>{try{let t=se.parse({components:e,...o}),n=p.resolve(t.cwd);k(n)||(a.error(`The path ${n} does not exist. Please try again.`),process.exit(1));let i=await N(n);i||(i=await pe(n));let r=t.components??[];if(!r?.length){let{components:d}=await _({type:"multiselect",name:"components",message:"Which components would you like to add?",hint:"Space to select. A to toggle all. Enter to submit.",instructions:!1,choices:g.map(S=>({title:S.name,value:S.name,selected:!1}))});r=d}r?.length||(a.warn("No components selected. Exiting."),process.exit(0));let s=M("Installing components...").start(),c=[];try{c=U(r)}catch(d){d instanceof Error&&d.message===O&&(a.error(`Invalid component(s): ${r.filter(S=>!g.find(H=>H.name===S)).join(", ")}`),process.exit(1)),a.error(d)}let l=[];for(let d of c)s.text=`Installing ${d.name}...`,await ae(d,d.paths,i,s,t.overwrite),l.push(...d.npmPackages);let j=await R(n),T=Array.from(new Set(l));T.length&&(s.text=`Installing ${T.join(", ")}...`,await ne(j,[j==="npm"?"install":"add",...T],{cwd:n})),s.succeed("Done.")}catch(t){m(t)}});async function ae(e,o,t,n,i){for(let r of o){let s=p.join(t.resolvedPaths.components,r.to.folder);if(k(s)||await x.mkdir(s,{recursive:!0}),n.stop(),k(p.join(s,r.to.file))){let l=[r.to.folder,r.to.file].join("/");if(!i){a.info(`File already exists: ${h.bgCyan(l)} was skipped. To overwrite, run with the ${h.green("--overwrite")} flag.`);continue}let{overwrite:j}=await _({type:"confirm",name:"overwrite",message:`File already exists: ${h.yellow(l)}. Would you like to overwrite?`,initial:!1});if(!j){a.info("Skipped");continue}}n.start(`Installing ${e.name}...`);let c=r.distFrom?p.join(W,"../__generated/components",r.distFrom):p.join(W,"../__generated/components",r.to.folder,r.to.file);try{let l=await x.readFile(p.resolve(c),"utf8");await x.writeFile(p.join(s,r.to.file),ce(l,t.aliases.components,t.aliases.lib))}catch(l){m(l)}}for(let r of e.icons??[]){let s=p.resolve(t.resolvedPaths.lib,"icons");if(!k(s)){await x.mkdir(s,{recursive:!0});try{await x.writeFile(p.join(s,"iconWithClassName.ts"),`import type { LucideIcon } from 'lucide-react-native';
|
|
3
3
|
import { cssInterop } from 'nativewind';
|
|
4
4
|
|
|
5
5
|
export function iconWithClassName(icon: LucideIcon) {
|
|
@@ -12,8 +12,9 @@ cssInterop(icon, {
|
|
|
12
12
|
},
|
|
13
13
|
},
|
|
14
14
|
});
|
|
15
|
-
}`)}catch(
|
|
15
|
+
}`)}catch(c){m(c)}}if(k(p.join(s,`${r}.tsx`))){let c=p.join(s,`${r}.tsx`);if(!i){a.info(`File already exists: ${h.bgCyan(`${r}.tsx`)} was skipped. To overwrite, run with the ${h.green("--overwrite")} flag.`);continue}let{overwrite:l}=await _({type:"confirm",name:"overwrite",message:`File already exists: ${h.yellow(c)}. Would you like to overwrite?`,initial:!1});if(!l){a.info(`Skipped ${r}.tsx`);continue}}n.start(`Adding the ${r} icon...`);try{await x.writeFile(p.join(s,`${r}.tsx`),`import { ${r} } from 'lucide-react-native';
|
|
16
16
|
import { iconWithClassName } from './iconWithClassName';
|
|
17
|
-
iconWithClassName(${
|
|
18
|
-
export { ${
|
|
17
|
+
iconWithClassName(${r});
|
|
18
|
+
export { ${r} };`)}catch(c){m(c)}}}function ce(e,o,t){return e.replace("./typography",`${o}/ui/typography`).replace("./text",`${o}/ui/text`).replaceAll("../../components",o).replaceAll("../../lib",t)}async function pe(e){let o=r=>h.cyan(r),t=await _([{type:"text",name:"components",message:`Configure the import alias for ${o("components")}:`,initial:b},{type:"text",name:"lib",message:`Configure the import alias for ${o("lib")}:`,initial:P}]),n=y.parse({aliases:{lib:t.lib,components:t.components}}),{proceed:i}=await _({type:"confirm",name:"proceed",message:`Write configuration to ${o("components.json")}. Proceed?`,initial:!0});if(i){a.info("");let r=M("Writing components.json...").start(),s=p.resolve(e,"components.json");await x.writeFile(s,JSON.stringify(n,null,2),"utf8"),r.succeed()}return await C(e,n)}import $ from"chalk";import{execSync as B}from"child_process";import{Command as le}from"commander";import{execa as me}from"execa";import de from"fast-glob";import{existsSync as F,promises as w}from"fs";import G from"ora";import f from"path";import I from"prompts";import{fileURLToPath as fe}from"url";import{z as A}from"zod";var ue=fe(import.meta.url),ge=f.dirname(ue),he=A.object({cwd:A.string(),overwrite:A.boolean()}),xe=["nativewind","expo-navigation-bar","tailwindcss-animate","@react-native-async-storage/async-storage","class-variance-authority","clsx","tailwind-merge","react-native-svg","lucide-react-native","@rn-primitives/portal"],we=["tailwind.config.js","nativewind-env.d.ts","global.css","babel.config.js","metro.config.js","lib/utils.ts","lib/useColorScheme.tsx","lib/constants.ts","lib/android-navigation-bar.ts","lib/icons/iconWithClassName.ts"];async function ye(e,o){try{o.text="Installing dependencies...",await me("npx",["expo","install",...xe],{cwd:e,stdio:"inherit"}),o.text="Dependencies installed successfully"}catch(t){o.fail("Failed to install dependencies"),m(t),process.exit(1)}}async function ve(e){let o=t=>$.cyan(t);try{let t=await I([{type:"text",name:"components",message:`Configure the import alias for ${o("components")}:`,initial:b},{type:"text",name:"lib",message:`Configure the import alias for ${o("lib")}:`,initial:P}]),n=t.components||b,i=t.lib||P,r=y.parse({aliases:{components:n,lib:i}}),{proceed:s}=await I({type:"confirm",name:"proceed",message:`Write configuration to ${o("components.json")}. Proceed?`,initial:!0});if(s){a.info("");let c=G("Writing components.json...").start(),l=f.resolve(e,"components.json");await w.writeFile(l,JSON.stringify(r,null,2),"utf8"),c.succeed()}return await C(e,r)}catch{a.error("Failed to configure project."),process.exit(1)}}var J=["",".","/"];async function be(e,o,t){try{let n=f.join(e,"tsconfig.json"),i=F(n)?JSON.parse(await w.readFile(n,"utf8")):{},r=o.aliases.components.split("/")[0],s=o.aliases.lib.split("/")[0];if(J.includes(r)||J.includes(s))return;let c=i.compilerOptions?.paths??{};if(c[`${r}/*`]?.[0]==="*"&&c[`${s}/*`]?.[0]==="*"){t.succeed("Path aliases already configured");return}t.text="Updating path aliases...",i.compilerOptions={...i.compilerOptions,baseUrl:".",paths:{[`${r}/*`]:["*"],[`${s}/*`]:["*"],...i.compilerOptions?.paths}},await w.writeFile(n,JSON.stringify(i,null,2))}catch(n){t.fail("Failed to update tsconfig.json"),m(n)}}async function Pe(e,o,t,n,i){let r=f.join(t,e);if(n.stop(),F(r)){if(!i){a.info(`File already exists: ${$.bgCyan(e)} was skipped. To overwrite, run with the ${$.green("--overwrite")} flag.`);return}let{overwrite:s}=await I({type:"confirm",name:"overwrite",message:`File already exists: ${$.yellow(e)}. Would you like to overwrite?`,initial:!1});if(!s){a.info("Skipped");return}}n.start(`Installing ${e}...`),await w.mkdir(f.dirname(r),{recursive:!0}),await w.copyFile(f.join(o,e),r)}async function Ce(e,o){try{let t=await de(["app/_layout.{ts,tsx,js,jsx}","(app)/_layout.{ts,tsx,js,jsx}"],{cwd:e,ignore:["node_modules/**"]});if(!t.length){o.warn("Could not find the root _layout file");return}let n=f.join(e,t[0]),i=await w.readFile(n,"utf8");i.includes('import "../global.css"')||(o.text="Updating layout file...",await w.writeFile(n,`import "../global.css";
|
|
19
|
+
${i}`),o.succeed(`Updated ${t[0]} with global CSS import`))}catch(t){o.fail("Failed to update layout file"),m(t)}}async function ke(e){try{return B("git rev-parse --is-inside-work-tree",{cwd:e}),!!B("git status --porcelain",{cwd:e}).toString()}catch{return!1}}async function _e(e){F(e)||(a.error(`The path ${e} does not exist. Please try again.`),process.exit(1)),F(f.join(e,"package.json"))||(a.error("No package.json found. Please run this command in a React Native project directory."),process.exit(1))}async function je(e){if(await ke(e)){let{proceed:o}=await I({type:"confirm",name:"proceed",message:"The Git repository is dirty (uncommitted changes). It is recommended to commit your changes before proceeding. Do you want to continue?",initial:!1});o||(a.info("Installation cancelled."),process.exit(0))}}async function Se(e,o){let t=G("Initializing project...").start();try{let n=await N(e);n||(t.stop(),n=await ve(e),t.start());let i=f.join(ge,"../__generated/starter-base");await ye(e,t),await be(e,n,t),t.text="Adding config and utility files...";for(let r of we)await Pe(r,i,e,t,o);await Ce(e,t),t.succeed("Initialization completed successfully!")}catch(n){t.fail("Initialization failed"),m(n),process.exit(1)}}var q=new le().name("init").description("Initialize the required configuration for your React Native project").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-o, --overwrite","overwrite existing files",!1).action(async e=>{try{let o=he.parse(e),t=f.resolve(o.cwd);await _e(t),await je(t),await Se(t,o.overwrite)}catch(o){m(o)}});import{Command as Oe}from"commander";import Ne from"path";import Ee from"fs-extra";function V(){let e=Ne.join("package.json");return Ee.readJSONSync(e)}process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function $e(){let e=await V(),o=new Oe().name("rnr-cli").description("add components and dependencies to your project").version(e.version||"0.0.0-rc.0","-v, --version","display the version number");o.addCommand(z),o.addCommand(q),o.parse()}$e();
|
|
19
20
|
//# sourceMappingURL=index.js.map
|