@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.
Files changed (47) hide show
  1. package/README.md +1 -1
  2. package/__generated/components/ui/button.tsx +1 -1
  3. package/__generated/components/ui/card.tsx +1 -1
  4. package/__generated/components/ui/context-menu.tsx +2 -2
  5. package/__generated/components/ui/dropdown-menu.tsx +2 -2
  6. package/__generated/components/ui/hover-card.tsx +4 -4
  7. package/__generated/components/ui/menubar.tsx +2 -2
  8. package/__generated/components/ui/progress.tsx +1 -1
  9. package/__generated/components/ui/select.tsx +1 -1
  10. package/__generated/components/ui/text.tsx +1 -1
  11. package/__generated/components/ui/toggle-group.tsx +1 -1
  12. package/__generated/components/ui/typography.tsx +2 -1
  13. package/__generated/starter-base/README.md +16 -0
  14. package/__generated/starter-base/app/+not-found.tsx +18 -0
  15. package/__generated/starter-base/app/_layout.tsx +69 -0
  16. package/__generated/starter-base/app/index.tsx +95 -0
  17. package/__generated/starter-base/app.json +40 -0
  18. package/__generated/starter-base/assets/images/adaptive-icon.png +0 -0
  19. package/__generated/starter-base/assets/images/favicon.png +0 -0
  20. package/__generated/starter-base/assets/images/icon.png +0 -0
  21. package/__generated/starter-base/assets/images/splash.png +0 -0
  22. package/__generated/starter-base/babel.config.js +6 -0
  23. package/__generated/starter-base/components/ThemeToggle.tsx +38 -0
  24. package/__generated/starter-base/components/ui/avatar.tsx +45 -0
  25. package/__generated/starter-base/components/ui/button.tsx +88 -0
  26. package/__generated/starter-base/components/ui/card.tsx +57 -0
  27. package/__generated/starter-base/components/ui/progress.tsx +61 -0
  28. package/__generated/starter-base/components/ui/text.tsx +24 -0
  29. package/__generated/starter-base/components/ui/tooltip.tsx +39 -0
  30. package/__generated/starter-base/global.css +49 -0
  31. package/__generated/starter-base/index.js +12 -0
  32. package/__generated/starter-base/lib/android-navigation-bar.ts +11 -0
  33. package/__generated/starter-base/lib/constants.ts +18 -0
  34. package/__generated/starter-base/lib/icons/Info.tsx +4 -0
  35. package/__generated/starter-base/lib/icons/MoonStar.tsx +4 -0
  36. package/__generated/starter-base/lib/icons/Sun.tsx +4 -0
  37. package/__generated/starter-base/lib/icons/iconWithClassName.ts +14 -0
  38. package/__generated/starter-base/lib/useColorScheme.tsx +11 -0
  39. package/__generated/starter-base/lib/utils.ts +6 -0
  40. package/__generated/starter-base/metro.config.js +6 -0
  41. package/__generated/starter-base/nativewind-env.d.ts +1 -0
  42. package/__generated/starter-base/package.json +53 -0
  43. package/__generated/starter-base/tailwind.config.js +65 -0
  44. package/__generated/starter-base/tsconfig.json +19 -0
  45. package/dist/index.js +5 -4
  46. package/dist/index.js.map +1 -1
  47. 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,4 @@
1
+ import { Info } from 'lucide-react-native';
2
+ import { iconWithClassName } from './iconWithClassName';
3
+ iconWithClassName(Info);
4
+ export { Info };
@@ -0,0 +1,4 @@
1
+ import { MoonStar } from 'lucide-react-native';
2
+ import { iconWithClassName } from './iconWithClassName';
3
+ iconWithClassName(MoonStar);
4
+ export { MoonStar };
@@ -0,0 +1,4 @@
1
+ import { Sun } from 'lucide-react-native';
2
+ import { iconWithClassName } from './iconWithClassName';
3
+ iconWithClassName(Sun);
4
+ export { Sun };
@@ -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,6 @@
1
+ import { clsx, type ClassValue } from 'clsx';
2
+ import { twMerge } from 'tailwind-merge';
3
+
4
+ export function cn(...inputs: ClassValue[]) {
5
+ return twMerge(clsx(inputs));
6
+ }
@@ -0,0 +1,6 @@
1
+ const { getDefaultConfig } = require('expo/metro-config');
2
+ const { withNativeWind } = require('nativewind/metro');
3
+
4
+ const config = getDefaultConfig(__dirname);
5
+
6
+ module.exports = withNativeWind(config, { input: './global.css' });
@@ -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(m){x(m)}}if(v(c.join(s,`${t}.tsx`))){let m=c.join(s,`${t}.tsx`);if(!i){a.info(`File already exists: ${u.bgCyan(`${t}.tsx`)} was skipped. To overwrite, run with the ${u.green("--overwrite")} flag.`);continue}let{overwrite:p}=await w({type:"confirm",name:"overwrite",message:`File already exists: ${u.yellow(m)}. Would you like to overwrite?`,initial:!1});if(!p){a.info(`Skipped ${t}.tsx`);continue}}r.start(`Adding the ${t} icon...`);try{await g.writeFile(c.join(s,`${t}.tsx`),`import { ${t} } from 'lucide-react-native';
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(${t});
18
- export { ${t} };`)}catch(m){x(m)}}}function Y(e,o,n){return e.replace("./typography",`${o}/ui/typography`).replace("./text",`${o}/ui/text`).replaceAll("../../components",o).replaceAll("../../lib",n)}async function Z(e){let o=t=>u.cyan(t),n=await w([{type:"text",name:"components",message:`Configure the import alias for ${o("components")}:`,initial:S},{type:"text",name:"lib",message:`Configure the import alias for ${o("lib")}:`,initial:$}]),r=k.parse({aliases:{lib:n.lib,components:n.components}}),{proceed:i}=await w({type:"confirm",name:"proceed",message:`Write configuration to ${o("components.json")}. Proceed?`,initial:!0});if(i){a.info("");let t=F("Writing components.json...").start(),s=c.resolve(e,"components.json");await g.writeFile(s,JSON.stringify(r,null,2),"utf8"),t.succeed()}return await E(e,r)}import{Command as ne}from"commander";import ee from"path";import oe from"fs-extra";function A(){let e=ee.join("package.json");return oe.readJSONSync(e)}process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function te(){let e=await A(),o=new ne().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(R),o.parse()}te();
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