@react-native-reusables/cli 0.1.1 → 0.2.0

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 CHANGED
@@ -14,7 +14,7 @@ npx @react-native-reusables/cli@latest add
14
14
 
15
15
  ### Arguments
16
16
 
17
- If you do not add arguments, you will be promted to select the `ui` components you would like to add to your project.
17
+ If you do not add arguments, you will be prompted to select the `ui` components you would like to add to your project.
18
18
 
19
19
  #### UI Components
20
20
 
@@ -15,7 +15,7 @@ const buttonVariants = cva(
15
15
  'border border-input bg-background web:hover:bg-accent web:hover:text-accent-foreground active:bg-accent',
16
16
  secondary: 'bg-secondary web:hover:opacity-80 active:opacity-80',
17
17
  ghost: 'web:hover:bg-accent web:hover:text-accent-foreground active:bg-accent',
18
- link: 'web:underline-offset-4 web:hover:underline web:focus:underline ',
18
+ link: 'web:underline-offset-4 web:hover:underline web:focus:underline',
19
19
  },
20
20
  size: {
21
21
  default: 'h-10 px-4 py-2 native:h-12 native:px-5 native:py-3',
@@ -1,4 +1,4 @@
1
- import { TextRef, ViewRef } from '@rn-primitives/types';
1
+ import type { TextRef, ViewRef } from '@rn-primitives/types';
2
2
  import * as React from 'react';
3
3
  import { Text, type TextProps, View, type ViewProps } from 'react-native';
4
4
  import { cn } from '../../lib/utils';
@@ -67,7 +67,7 @@ const ContextMenuSubContent = React.forwardRef<
67
67
  'z-50 min-w-[8rem] overflow-hidden rounded-md border mt-1 border-border bg-popover p-1 shadow-md shadow-foreground/5 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',
68
68
  open
69
69
  ? 'web:animate-in web:fade-in-0 web:zoom-in-95'
70
- : 'web:animate-out web:fade-out-0 web:zoom-out ',
70
+ : 'web:animate-out web:fade-out-0 web:zoom-out',
71
71
  className
72
72
  )}
73
73
  {...props}
@@ -93,7 +93,7 @@ const ContextMenuContent = React.forwardRef<
93
93
  ? StyleSheet.flatten([
94
94
  Platform.OS !== 'web' ? StyleSheet.absoluteFill : undefined,
95
95
  overlayStyle,
96
- ] as ViewStyle)
96
+ ])
97
97
  : Platform.OS !== 'web'
98
98
  ? StyleSheet.absoluteFill
99
99
  : undefined
@@ -73,7 +73,7 @@ const DropdownMenuSubContent = React.forwardRef<
73
73
  'z-50 min-w-[8rem] overflow-hidden rounded-md border border-border mt-1 bg-popover p-1 shadow-md shadow-foreground/5 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',
74
74
  open
75
75
  ? 'web:animate-in web:fade-in-0 web:zoom-in-95'
76
- : 'web:animate-out web:fade-out-0 web:zoom-out ',
76
+ : 'web:animate-out web:fade-out-0 web:zoom-out',
77
77
  className
78
78
  )}
79
79
  {...props}
@@ -99,7 +99,7 @@ const DropdownMenuContent = React.forwardRef<
99
99
  ? StyleSheet.flatten([
100
100
  Platform.OS !== 'web' ? StyleSheet.absoluteFill : undefined,
101
101
  overlayStyle,
102
- ] as ViewStyle)
102
+ ])
103
103
  : Platform.OS !== 'web'
104
104
  ? StyleSheet.absoluteFill
105
105
  : undefined
@@ -1,9 +1,9 @@
1
+ import * as HoverCardPrimitive from '@rn-primitives/hover-card';
1
2
  import * as React from 'react';
2
3
  import { Platform, StyleSheet } from 'react-native';
3
4
  import Animated, { FadeIn } from 'react-native-reanimated';
4
- import { TextClassContext } from './text';
5
- import * as HoverCardPrimitive from '@rn-primitives/hover-card';
6
5
  import { cn } from '../../lib/utils';
6
+ import { TextClassContext } from './text';
7
7
 
8
8
  const HoverCard = HoverCardPrimitive.Root;
9
9
 
@@ -28,8 +28,8 @@ const HoverCardContent = React.forwardRef<
28
28
  className={cn(
29
29
  'z-50 w-64 rounded-md border border-border bg-popover p-4 shadow-md shadow-foreground/5 web:outline-none web:cursor-auto 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',
30
30
  open
31
- ? 'web:animate-in web:fade-in-0 web:zoom-in-95'
32
- : 'web:animate-out web:fade-out-0 web:zoom-out-95 ',
31
+ ? 'web:animate-in web:fade-in-0 web:zoom-in-95'
32
+ : 'web:animate-out web:fade-out-0 web:zoom-out-95',
33
33
  className
34
34
  )}
35
35
  {...props}
@@ -1,6 +1,6 @@
1
1
  import * as MenubarPrimitive from '@rn-primitives/menubar';
2
2
  import * as React from 'react';
3
- import { Platform, Text, TextProps, View } from 'react-native';
3
+ import { Platform, Text, type TextProps, View } from 'react-native';
4
4
  import { Check } from '../../lib/icons/Check';
5
5
  import { ChevronDown } from '../../lib/icons/ChevronDown';
6
6
  import { ChevronRight } from '../../lib/icons/ChevronRight';
@@ -117,7 +117,7 @@ const MenubarContent = React.forwardRef<
117
117
  <MenubarPrimitive.Content
118
118
  ref={ref}
119
119
  className={cn(
120
- 'z-50 min-w-[8rem] overflow-hidden rounded-md border border-border bg-popover p-1 shadow-md shadow-foreground/5 ',
120
+ 'z-50 min-w-[8rem] overflow-hidden rounded-md border border-border bg-popover p-1 shadow-md shadow-foreground/5',
121
121
  value === itemValue
122
122
  ? 'web:animate-in web:fade-in-0 web:zoom-in-95'
123
123
  : 'web:animate-out web:fade-out-0 web:zoom-out-95',
@@ -48,7 +48,7 @@ function Indicator({ value, className }: { value: number | undefined | null; cla
48
48
  className={cn('h-full w-full flex-1 bg-primary web:transition-all', className)}
49
49
  style={{ transform: `translateX(-${100 - (value ?? 0)}%)` }}
50
50
  >
51
- <ProgressPrimitive.Indicator className={cn('h-full w-full ', className)} />
51
+ <ProgressPrimitive.Indicator className={cn('h-full w-full', className)} />
52
52
  </View>
53
53
  );
54
54
  }
@@ -76,7 +76,7 @@ const SelectContent = React.forwardRef<
76
76
  return (
77
77
  <SelectPrimitive.Portal hostName={portalHost}>
78
78
  <SelectPrimitive.Overlay style={Platform.OS !== 'web' ? StyleSheet.absoluteFill : undefined}>
79
- <Animated.View entering={FadeIn} exiting={FadeOut}>
79
+ <Animated.View className='z-50' entering={FadeIn} exiting={FadeOut}>
80
80
  <SelectPrimitive.Content
81
81
  ref={ref}
82
82
  className={cn(
@@ -1,5 +1,5 @@
1
1
  import * as Slot from '@rn-primitives/slot';
2
- import { SlottableTextProps, TextRef } from '@rn-primitives/types';
2
+ import type { SlottableTextProps, TextRef } from '@rn-primitives/types';
3
3
  import * as React from 'react';
4
4
  import { Text as RNText } from 'react-native';
5
5
  import { cn } from '../../lib/utils';
@@ -1,4 +1,4 @@
1
- import { VariantProps } from 'class-variance-authority';
1
+ import type { VariantProps } from 'class-variance-authority';
2
2
  import type { LucideIcon } from 'lucide-react-native';
3
3
  import * as React from 'react';
4
4
  import { toggleTextVariants, toggleVariants } from '../../components/ui/toggle';
@@ -1,5 +1,5 @@
1
1
  import * as Slot from '@rn-primitives/slot';
2
- import { SlottableTextProps, TextRef } from '@rn-primitives/types';
2
+ import type { SlottableTextProps, TextRef } from '@rn-primitives/types';
3
3
  import * as React from 'react';
4
4
  import { Platform, Text as RNText } from 'react-native';
5
5
  import { cn } from '../../lib/utils';
@@ -96,6 +96,7 @@ const P = React.forwardRef<TextRef, SlottableTextProps>(
96
96
  );
97
97
  }
98
98
  );
99
+
99
100
  P.displayName = 'P';
100
101
 
101
102
  const BlockQuote = React.forwardRef<TextRef, SlottableTextProps>(
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()})}).strict(),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{existsSync as F}from"fs";import{promises as w}from"fs";import{Command as le}from"commander";import{execa as me}from"execa";import G from"ora";import f from"path";import{z as A}from"zod";import $ from"chalk";import I from"prompts";import de from"fast-glob";import{createRequire as fe}from"module";import{execSync as B}from"child_process";var ue=A.object({cwd:A.string(),overwrite:A.boolean()}),ge=["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"],he=["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 xe(e,o){try{o.text="Installing dependencies...",await me("npx",["expo","install",...ge],{cwd:e,stdio:"inherit"}),o.text="Dependencies installed successfully"}catch(t){o.fail("Failed to install dependencies"),m(t),process.exit(1)}}async function we(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 ye(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 ve(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 be(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 Pe(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 Ce(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 ke(e){if(await Pe(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 _e(e,o){let t=G("Initializing project...").start();try{let n=await N(e);n||(t.stop(),n=await we(e),t.start());let i=f.dirname(fe(import.meta.url).resolve("@rnr/starter-base"));await xe(e,t),await ye(e,n,t),t.text="Adding config and utility files...";for(let r of he)await ve(r,i,e,t,o);await be(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=ue.parse(e),t=f.resolve(o.cwd);await Ce(t),await ke(t),await _e(t,o.overwrite)}catch(o){m(o)}});import{Command as Ne}from"commander";import je from"path";import Se from"fs-extra";function V(){let e=je.join("package.json");return Se.readJSONSync(e)}process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function Ee(){let e=await V(),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(z),o.addCommand(q),o.parse()}Ee();
19
20
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/resolve-import.ts","../src/utils/get-config.ts","../src/utils/get-package-manager.ts","../src/utils/logger.ts","../src/utils/handle-error.ts","../src/commands/add.ts","../src/items/components.ts","../src/items/index.ts","../src/index.ts","../src/utils/get-package-info.ts"],"sourcesContent":["import { createMatchPath, type ConfigLoaderSuccessResult } from \"tsconfig-paths\"\n\nexport async function resolveImport(\n importPath: string,\n config: Pick<ConfigLoaderSuccessResult, \"absoluteBaseUrl\" | \"paths\">\n) {\n return createMatchPath(config.absoluteBaseUrl, config.paths)(\n importPath,\n undefined,\n () => true,\n [\".ts\", \".tsx\"]\n )\n}\n","import { resolveImport } from '@/src/utils/resolve-import';\nimport { cosmiconfig } from 'cosmiconfig';\nimport { loadConfig } from 'tsconfig-paths';\nimport { z } from 'zod';\n\nexport const DEFAULT_COMPONENTS = '~/components';\nexport const DEFAULT_LIB = '~/lib';\n\nconst explorer = cosmiconfig('components', {\n searchPlaces: ['components.json'],\n});\n\nexport const rawConfigSchema = z\n .object({\n aliases: z.object({\n components: z.string(),\n lib: z.string(),\n }),\n })\n .strict();\n\nexport type RawConfig = z.infer<typeof rawConfigSchema>;\n\nexport const configSchema = rawConfigSchema.extend({\n resolvedPaths: z.object({\n lib: z.string(),\n components: z.string(),\n }),\n});\n\nexport type Config = z.infer<typeof configSchema>;\n\nexport async function getConfig(cwd: string) {\n const config = await getRawConfig(cwd);\n\n if (!config) {\n return null;\n }\n\n return await resolveConfigPaths(cwd, config);\n}\n\nexport async function resolveConfigPaths(cwd: string, config: RawConfig) {\n // Read tsconfig.json.\n const tsConfig = await loadConfig(cwd);\n\n if (tsConfig.resultType === 'failed') {\n throw new Error(`Failed to load tsconfig.json. ${tsConfig.message ?? ''}`.trim());\n }\n\n return configSchema.parse({\n ...config,\n resolvedPaths: {\n lib: await resolveImport(config.aliases['lib'], tsConfig),\n components: await resolveImport(config.aliases['components'], tsConfig),\n },\n });\n}\n\nexport async function getRawConfig(cwd: string): Promise<RawConfig | null> {\n try {\n const configResult = await explorer.search(cwd);\n\n if (!configResult) {\n return null;\n }\n\n return rawConfigSchema.parse(configResult.config);\n } catch (error) {\n throw new Error(`Invalid configuration found in ${cwd}/components.json.`);\n }\n}\n","import { detect } from '@antfu/ni';\n\nexport async function getPackageManager(\n targetDir: string\n): Promise<'yarn' | 'pnpm' | 'bun' | 'npm'> {\n const packageManager = await detect({ programmatic: true, cwd: targetDir });\n\n if (packageManager === 'yarn@berry') return 'yarn';\n if (packageManager === 'pnpm@6') return 'pnpm';\n if (packageManager === 'bun') return 'bun';\n\n return packageManager ?? 'npm';\n}\n","import chalk from \"chalk\"\n\nexport const logger = {\n error(...args: unknown[]) {\n console.log(chalk.red(...args))\n },\n warn(...args: unknown[]) {\n console.log(chalk.yellow(...args))\n },\n info(...args: unknown[]) {\n console.log(chalk.cyan(...args))\n },\n success(...args: unknown[]) {\n console.log(chalk.green(...args))\n },\n break() {\n console.log(\"\")\n },\n}\n","import { logger } from \"@/src/utils/logger\"\n\nexport function handleError(error: unknown) {\n if (typeof error === \"string\") {\n logger.error(error)\n process.exit(1)\n }\n\n if (error instanceof Error) {\n logger.error(error.message)\n process.exit(1)\n }\n\n logger.error(\"Something went wrong. Please try again.\")\n process.exit(1)\n}\n","import {\n Config,\n DEFAULT_COMPONENTS,\n DEFAULT_LIB,\n getConfig,\n rawConfigSchema,\n resolveConfigPaths,\n} from '@/src/utils/get-config';\nimport { getPackageManager } from '@/src/utils/get-package-manager';\nimport { handleError } from '@/src/utils/handle-error';\nimport { logger } from '@/src/utils/logger';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport { execa } from 'execa';\nimport { existsSync, promises as fs } from 'fs';\nimport ora, { Ora } from 'ora';\nimport path from 'path';\nimport prompts from 'prompts';\nimport { z } from 'zod';\nimport { Component, INVALID_COMPONENT_ERROR, getAllComponentsToWrite } from '../items';\nimport { COMPONENTS } from '../items/components';\nimport { fileURLToPath } from 'url';\n\nconst filePath = fileURLToPath(import.meta.url);\nconst fileDir = path.dirname(filePath);\n\nconst addOptionsSchema = z.object({\n components: z.array(z.string()).optional(),\n overwrite: z.boolean(),\n cwd: z.string(),\n path: z.string().optional(),\n});\n\nexport const add = new Command()\n .name('add')\n .description('add components to your project')\n .argument('[components...]', 'the components to add')\n .option('-o, --overwrite', 'overwrite existing files.', false)\n .option(\n '-c, --cwd <cwd>',\n 'the working directory. defaults to the current directory.',\n process.cwd()\n )\n .action(async (components, opts) => {\n try {\n const options = addOptionsSchema.parse({\n components,\n ...opts,\n });\n\n const cwd = path.resolve(options.cwd);\n\n if (!existsSync(cwd)) {\n logger.error(`The path ${cwd} does not exist. Please try again.`);\n process.exit(1);\n }\n\n let config = await getConfig(cwd);\n\n if (!config) {\n config = await promptForConfig(cwd);\n }\n\n let selectedComponents: Array<string> = options.components ?? [];\n if (!selectedComponents?.length) {\n const { components } = await prompts({\n type: 'multiselect',\n name: 'components',\n message: 'Which components would you like to add?',\n hint: 'Space to select. A to toggle all. Enter to submit.',\n instructions: false,\n choices: COMPONENTS.map((entry) => ({\n title: entry.name,\n value: entry.name,\n selected: false,\n })),\n });\n selectedComponents = components;\n }\n\n if (!selectedComponents?.length) {\n logger.warn('No components selected. Exiting.');\n process.exit(0);\n }\n\n const spinner = ora(`Installing components...`).start();\n\n let componentsToWrite: Array<Component> = [];\n try {\n componentsToWrite = getAllComponentsToWrite(selectedComponents);\n } catch (err) {\n if (err instanceof Error && err.message === INVALID_COMPONENT_ERROR) {\n logger.error(\n `Invalid component(s): ${selectedComponents\n .filter((component) => !COMPONENTS.find((entry) => entry.name === component))\n .join(', ')}`\n );\n process.exit(1);\n }\n logger.error(err);\n }\n\n const npmPackages: Array<string> = [];\n\n for (const comp of componentsToWrite) {\n spinner.text = `Installing ${comp.name}...`;\n\n await writeFiles(comp, comp.paths, config, spinner, options.overwrite);\n\n npmPackages.push(...comp.npmPackages);\n }\n\n const packageManager = await getPackageManager(cwd);\n\n const uniqueNpmPackages = Array.from(new Set(npmPackages));\n\n if (uniqueNpmPackages.length) {\n spinner.text = `Installing ${uniqueNpmPackages.join(', ')}...`;\n await execa(\n packageManager,\n [packageManager === 'npm' ? 'install' : 'add', ...uniqueNpmPackages],\n {\n cwd,\n }\n );\n }\n spinner.succeed(`Done.`);\n } catch (error) {\n handleError(error);\n }\n });\n\nasync function writeFiles(\n comp: Component,\n paths: Array<{ from: string; distFrom?: string; to: { folder: string; file: string } }>,\n config: Config,\n spinner: Ora,\n overwriteFlag: boolean\n) {\n for (const compPath of paths) {\n const targetDir = path.join(config.resolvedPaths.components, compPath.to.folder);\n if (!existsSync(targetDir)) {\n await fs.mkdir(targetDir, { recursive: true });\n }\n\n spinner.stop();\n\n if (existsSync(path.join(targetDir, compPath.to.file))) {\n const filePath = [compPath.to.folder, compPath.to.file].join('/');\n if (!overwriteFlag) {\n logger.info(\n `File already exists: ${chalk.bgCyan(\n filePath\n )} was skipped. To overwrite, run with the ${chalk.green('--overwrite')} flag.`\n );\n continue;\n }\n\n const { overwrite } = await prompts({\n type: 'confirm',\n name: 'overwrite',\n message: `File already exists: ${chalk.yellow(filePath)}. Would you like to overwrite?`,\n initial: false,\n });\n\n if (!overwrite) {\n logger.info(`Skipped`);\n continue;\n }\n }\n\n spinner.start(`Installing ${comp.name}...`);\n const readFromPath = compPath.distFrom\n ? path.join(fileDir, '../__generated/components', compPath.distFrom)\n : path.join(fileDir, '../__generated/components', compPath.to.folder, compPath.to.file);\n try {\n const content = await fs.readFile(path.resolve(readFromPath), 'utf8');\n await fs.writeFile(\n path.join(targetDir, compPath.to.file),\n fixImports(content, config.aliases.components, config.aliases.lib)\n );\n } catch (error) {\n handleError(error);\n }\n }\n\n for (const icon of comp.icons ?? []) {\n const targetDir = path.resolve(config.resolvedPaths.lib, 'icons');\n if (!existsSync(targetDir)) {\n await fs.mkdir(targetDir, { recursive: true });\n try {\n await fs.writeFile(\n path.join(targetDir, `iconWithClassName.ts`),\n `import type { LucideIcon } from 'lucide-react-native';\\nimport { cssInterop } from 'nativewind';\\n\\nexport function iconWithClassName(icon: LucideIcon) {\\ncssInterop(icon, {\\n className: {\\n target: 'style',\\n nativeStyleToProp: {\\n color: true,\\n opacity: true,\\n },\\n },\\n});\\n}`\n );\n } catch (error) {\n handleError(error);\n }\n }\n\n if (existsSync(path.join(targetDir, `${icon}.tsx`))) {\n const filePath = path.join(targetDir, `${icon}.tsx`);\n if (!overwriteFlag) {\n logger.info(\n `File already exists: ${chalk.bgCyan(\n `${icon}.tsx`\n )} was skipped. To overwrite, run with the ${chalk.green('--overwrite')} flag.`\n );\n continue;\n }\n\n const { overwrite } = await prompts({\n type: 'confirm',\n name: 'overwrite',\n message: `File already exists: ${chalk.yellow(filePath)}. Would you like to overwrite?`,\n initial: false,\n });\n\n if (!overwrite) {\n logger.info(`Skipped ${icon}.tsx`);\n continue;\n }\n }\n\n spinner.start(`Adding the ${icon} icon...`);\n\n try {\n await fs.writeFile(\n path.join(targetDir, `${icon}.tsx`),\n `import { ${icon} } from 'lucide-react-native';\\nimport { iconWithClassName } from './iconWithClassName';\\niconWithClassName(${icon});\\nexport { ${icon} };`\n );\n } catch (error) {\n handleError(error);\n }\n }\n}\n\nfunction fixImports(rawfile: string, componentsAlias: string, libAlias: string) {\n return rawfile\n .replace('./typography', `${componentsAlias}/ui/typography`)\n .replace('./text', `${componentsAlias}/ui/text`)\n .replaceAll('../../components', componentsAlias)\n .replaceAll('../../lib', libAlias);\n}\n\nasync function promptForConfig(cwd: string) {\n const highlight = (text: string) => chalk.cyan(text);\n\n const options = await prompts([\n {\n type: 'text',\n name: 'components',\n message: `Configure the import alias for ${highlight('components')}:`,\n initial: DEFAULT_COMPONENTS,\n },\n {\n type: 'text',\n name: 'lib',\n message: `Configure the import alias for ${highlight('lib')}:`,\n initial: DEFAULT_LIB,\n },\n ]);\n\n const config = rawConfigSchema.parse({\n aliases: {\n lib: options.lib,\n components: options.components,\n },\n });\n\n const { proceed } = await prompts({\n type: 'confirm',\n name: 'proceed',\n message: `Write configuration to ${highlight('components.json')}. Proceed?`,\n initial: true,\n });\n\n if (proceed) {\n // Write to file.\n logger.info('');\n const spinner = ora(`Writing components.json...`).start();\n const targetPath = path.resolve(cwd, 'components.json');\n await fs.writeFile(targetPath, JSON.stringify(config, null, 2), 'utf8');\n spinner.succeed();\n }\n\n return await resolveConfigPaths(cwd, config);\n}\n","export const COMPONENTS = [\n {\n name: 'accordion',\n dependencies: ['text'],\n icons: ['ChevronDown'],\n npmPackages: ['@rn-primitives/accordion'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/accordion.tsx',\n to: {\n folder: 'ui',\n file: 'accordion.tsx',\n },\n },\n ],\n },\n {\n name: 'alert-dialog',\n dependencies: ['button', 'text'],\n icons: [],\n npmPackages: ['@rn-primitives/alert-dialog'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/alert-dialog.tsx',\n to: {\n folder: 'ui',\n file: 'alert-dialog.tsx',\n },\n },\n ],\n },\n {\n name: 'aspect-ratio',\n dependencies: [],\n icons: [],\n npmPackages: ['@rn-primitives/aspect-ratio'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/aspect-ratio.tsx',\n to: {\n folder: 'ui',\n file: 'aspect-ratio.tsx',\n },\n },\n ],\n },\n {\n name: 'avatar',\n dependencies: [],\n icons: [],\n npmPackages: ['@rn-primitives/avatar'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/avatar.tsx',\n to: {\n folder: 'ui',\n file: 'avatar.tsx',\n },\n },\n ],\n },\n {\n name: 'badge',\n dependencies: [],\n icons: [],\n npmPackages: ['@rn-primitives/slot', '@rn-primitives/types'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/badge.tsx',\n to: {\n folder: 'ui',\n file: 'badge.tsx',\n },\n },\n ],\n },\n {\n name: 'button',\n dependencies: ['text'],\n icons: [],\n npmPackages: ['@rn-primitives/types'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/button.tsx',\n to: {\n folder: 'ui',\n file: 'button.tsx',\n },\n },\n ],\n },\n {\n name: 'card',\n dependencies: ['text'],\n icons: [],\n npmPackages: ['@rn-primitives/types'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/card.tsx',\n to: {\n folder: 'ui',\n file: 'card.tsx',\n },\n },\n ],\n },\n {\n name: 'checkbox',\n dependencies: [],\n icons: ['Check'],\n npmPackages: ['@rn-primitives/checkbox'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/checkbox.tsx',\n to: {\n folder: 'ui',\n file: 'checkbox.tsx',\n },\n },\n ],\n },\n {\n name: 'collapsible',\n dependencies: [],\n icons: [],\n npmPackages: ['@rn-primitives/collapsible'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/collapsible.tsx',\n to: {\n folder: 'ui',\n file: 'collapsible.tsx',\n },\n },\n ],\n },\n {\n name: 'context-menu',\n dependencies: ['text'],\n icons: ['Check', 'ChevronDown', 'ChevronRight', 'ChevronUp'],\n npmPackages: ['@rn-primitives/context-menu'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/context-menu.tsx',\n to: {\n folder: 'ui',\n file: 'context-menu.tsx',\n },\n },\n ],\n },\n {\n name: 'dialog',\n dependencies: [],\n icons: ['X'],\n npmPackages: ['@rn-primitives/dialog'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/dialog.tsx',\n to: {\n folder: 'ui',\n file: 'dialog.tsx',\n },\n },\n ],\n },\n {\n name: 'dropdown-menu',\n dependencies: ['text'],\n icons: ['Check', 'ChevronDown', 'ChevronRight', 'ChevronUp'],\n npmPackages: ['@rn-primitives/dropdown-menu'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/dropdown-menu.tsx',\n to: {\n folder: 'ui',\n file: 'dropdown-menu.tsx',\n },\n },\n ],\n },\n {\n name: 'hover-card',\n dependencies: [],\n icons: [],\n npmPackages: ['@rn-primitives/hover-card'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/hover-card.tsx',\n to: {\n folder: 'ui',\n file: 'hover-card.tsx',\n },\n },\n ],\n },\n {\n name: 'input',\n dependencies: [],\n icons: [],\n npmPackages: [],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/input.tsx',\n to: {\n folder: 'ui',\n file: 'input.tsx',\n },\n },\n ],\n },\n {\n name: 'label',\n dependencies: [],\n icons: [],\n npmPackages: ['@rn-primitives/label'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/label.tsx',\n to: {\n folder: 'ui',\n file: 'label.tsx',\n },\n },\n ],\n },\n {\n name: 'menubar',\n dependencies: ['text'],\n icons: ['Check', 'ChevronDown', 'ChevronRight', 'ChevronUp'],\n npmPackages: ['@rn-primitives/menubar'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/menubar.tsx',\n to: {\n folder: 'ui',\n file: 'menubar.tsx',\n },\n },\n ],\n },\n {\n name: 'navigation-menu',\n dependencies: [],\n icons: ['ChevronDown'],\n npmPackages: ['@rn-primitives/navigation-menu'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/navigation-menu.tsx',\n to: {\n folder: 'ui',\n file: 'navigation-menu.tsx',\n },\n },\n ],\n },\n {\n name: 'popover',\n dependencies: ['text'],\n icons: [],\n npmPackages: ['@rn-primitives/popover'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/popover.tsx',\n to: {\n folder: 'ui',\n file: 'popover.tsx',\n },\n },\n ],\n },\n {\n name: 'progress',\n dependencies: [],\n icons: [],\n npmPackages: ['@rn-primitives/progress'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/progress.tsx',\n to: {\n folder: 'ui',\n file: 'progress.tsx',\n },\n },\n ],\n },\n {\n name: 'radio-group',\n dependencies: [],\n icons: [],\n npmPackages: ['@rn-primitives/radio-group'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/radio-group.tsx',\n to: {\n folder: 'ui',\n file: 'radio-group.tsx',\n },\n },\n ],\n },\n {\n name: 'select',\n dependencies: [],\n icons: ['Check', 'ChevronDown', 'ChevronUp'],\n npmPackages: ['@rn-primitives/select'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/select.tsx',\n to: {\n folder: 'ui',\n file: 'select.tsx',\n },\n },\n ],\n },\n {\n name: 'separator',\n dependencies: [],\n icons: [],\n npmPackages: ['@rn-primitives/separator'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/separator.tsx',\n to: {\n folder: 'ui',\n file: 'separator.tsx',\n },\n },\n ],\n },\n {\n name: 'skeleton',\n dependencies: [],\n icons: [],\n npmPackages: [],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/skeleton.tsx',\n to: {\n folder: 'ui',\n file: 'skeleton.tsx',\n },\n },\n ],\n },\n {\n name: 'switch',\n dependencies: [],\n icons: [],\n npmPackages: ['@rn-primitives/switch'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/switch.tsx',\n to: {\n folder: 'ui',\n file: 'switch.tsx',\n },\n },\n ],\n },\n {\n name: 'table',\n dependencies: ['text'],\n icons: [],\n npmPackages: ['@rn-primitives/table'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/table.tsx',\n to: {\n folder: 'ui',\n file: 'table.tsx',\n },\n },\n ],\n },\n {\n name: 'tabs',\n dependencies: ['text'],\n icons: [],\n npmPackages: ['@rn-primitives/tabs'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/tabs.tsx',\n to: {\n folder: 'ui',\n file: 'tabs.tsx',\n },\n },\n ],\n },\n {\n name: 'text',\n dependencies: [],\n icons: [],\n npmPackages: ['@rn-primitives/slot', '@rn-primitives/types'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/text.tsx',\n to: { folder: 'ui', file: 'text.tsx' },\n },\n ],\n },\n {\n name: 'textarea',\n dependencies: [],\n icons: [],\n npmPackages: [],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/textarea.tsx',\n to: { folder: 'ui', file: 'textarea.tsx' },\n },\n ],\n },\n {\n name: 'toggle',\n dependencies: ['text'],\n icons: [],\n npmPackages: ['@rn-primitives/toggle'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/toggle.tsx',\n to: { folder: 'ui', file: 'toggle.tsx' },\n },\n ],\n },\n {\n name: 'toggle-group',\n dependencies: ['text'],\n icons: [],\n npmPackages: ['@rn-primitives/toggle-group'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/toggle-group.tsx',\n to: { folder: 'ui', file: 'toggle-group.tsx' },\n },\n ],\n },\n {\n name: 'tooltip',\n dependencies: ['text'],\n icons: [],\n npmPackages: ['@rn-primitives/tooltip'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/tooltip.tsx',\n to: { folder: 'ui', file: 'tooltip.tsx' },\n },\n ],\n },\n {\n name: 'typography',\n dependencies: [],\n icons: [],\n npmPackages: ['@rn-primitives/slot', '@rn-primitives/types'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/typography.tsx',\n to: { folder: 'ui', file: 'typography.tsx' },\n },\n ],\n },\n];\n","import { COMPONENTS } from './components';\n\nexport type Component = (typeof COMPONENTS)[number] & { icons?: string[] };\ntype ComponentName = (typeof COMPONENTS)[number]['name'];\n\nfunction getComponentDependencies(\n componentName: ComponentName,\n visited = new Set<ComponentName>()\n) {\n const component = COMPONENTS.find((comp) => comp.name === componentName);\n if (!component) return [];\n\n visited.add(componentName);\n\n let dependencies: ComponentName[] = component.dependencies.slice();\n\n component.dependencies.forEach((dependency) => {\n if (!visited.has(dependency)) {\n const childDependencies = getComponentDependencies(dependency, visited);\n dependencies = dependencies.concat(childDependencies);\n }\n });\n\n return dependencies;\n}\n\nexport const INVALID_COMPONENT_ERROR = 'invalid component';\n\nexport function getAllComponentsToWrite(componentNames: string[]): Component[] {\n const uniqueComponents = new Set<ComponentName>();\n\n if (\n componentNames.some((componentName) => !COMPONENTS.find((comp) => comp.name === componentName))\n ) {\n throw new Error(INVALID_COMPONENT_ERROR);\n }\n\n componentNames.forEach((componentName) => {\n const allDependencies = getComponentDependencies(componentName as ComponentName);\n allDependencies.unshift(componentName as never); // Add the component itself to the list\n allDependencies.forEach((dep) => {\n uniqueComponents.add(dep);\n });\n });\n\n return Array.from(uniqueComponents).map((dep) => {\n const comp = COMPONENTS.find((comp) => comp.name === dep);\n if (!comp) {\n throw new Error(INVALID_COMPONENT_ERROR);\n }\n return comp;\n });\n}\n","#!/usr/bin/env node\nimport { add } from '@/src/commands/add';\nimport { Command } from 'commander';\n\nimport { getPackageInfo } from './utils/get-package-info';\n\nprocess.on('SIGINT', () => process.exit(0));\nprocess.on('SIGTERM', () => process.exit(0));\n\nasync function main() {\n const packageInfo = await getPackageInfo();\n\n const program = new Command()\n .name('rnr-cli')\n .description('add components and dependencies to your project')\n .version(packageInfo.version || '0.0.0-rc.0', '-v, --version', 'display the version number');\n\n program.addCommand(add);\n\n program.parse();\n}\n\nmain();\n","import path from 'path';\nimport fs from 'fs-extra';\nimport { type PackageJson } from 'type-fest';\n\nexport function getPackageInfo() {\n const packageJsonPath = path.join('package.json');\n\n return fs.readJSONSync(packageJsonPath) as Promise<PackageJson>;\n}\n"],"mappings":"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AAC,EACR,YAAa,CAAC,yBAAyB,EACvC,MAAO,CACL,CACE,KAAM,+DACN,GAAI,CACF,OAAQ,KACR,KAAM,cACR,CACF,CACF,CACF,EACA,CACE,KAAM,cACN,aAAc,CAAC,EACf,MAAO,CAAC,EACR,YAAa,CAAC,4BAA4B,EAC1C,MAAO,CACL,CACE,KAAM,kEACN,GAAI,CACF,OAAQ,KACR,KAAM,iBACR,CACF,CACF,CACF,EACA,CACE,KAAM,SACN,aAAc,CAAC,EACf,MAAO,CAAC,QAAS,cAAe,WAAW,EAC3C,YAAa,CAAC,uBAAuB,EACrC,MAAO,CACL,CACE,KAAM,6DACN,GAAI,CACF,OAAQ,KACR,KAAM,YACR,CACF,CACF,CACF,EACA,CACE,KAAM,YACN,aAAc,CAAC,EACf,MAAO,CAAC,EACR,YAAa,CAAC,0BAA0B,EACxC,MAAO,CACL,CACE,KAAM,gEACN,GAAI,CACF,OAAQ,KACR,KAAM,eACR,CACF,CACF,CACF,EACA,CACE,KAAM,WACN,aAAc,CAAC,EACf,MAAO,CAAC,EACR,YAAa,CAAC,EACd,MAAO,CACL,CACE,KAAM,+DACN,GAAI,CACF,OAAQ,KACR,KAAM,cACR,CACF,CACF,CACF,EACA,CACE,KAAM,SACN,aAAc,CAAC,EACf,MAAO,CAAC,EACR,YAAa,CAAC,uBAAuB,EACrC,MAAO,CACL,CACE,KAAM,6DACN,GAAI,CACF,OAAQ,KACR,KAAM,YACR,CACF,CACF,CACF,EACA,CACE,KAAM,QACN,aAAc,CAAC,MAAM,EACrB,MAAO,CAAC,EACR,YAAa,CAAC,sBAAsB,EACpC,MAAO,CACL,CACE,KAAM,4DACN,GAAI,CACF,OAAQ,KACR,KAAM,WACR,CACF,CACF,CACF,EACA,CACE,KAAM,OACN,aAAc,CAAC,MAAM,EACrB,MAAO,CAAC,EACR,YAAa,CAAC,qBAAqB,EACnC,MAAO,CACL,CACE,KAAM,2DACN,GAAI,CACF,OAAQ,KACR,KAAM,UACR,CACF,CACF,CACF,EACA,CACE,KAAM,OACN,aAAc,CAAC,EACf,MAAO,CAAC,EACR,YAAa,CAAC,sBAAuB,s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","names":["createMatchPath","resolveImport","importPath","config","cosmiconfig","loadConfig","z","DEFAULT_COMPONENTS","DEFAULT_LIB","explorer","rawConfigSchema","configSchema","getConfig","cwd","config","getRawConfig","resolveConfigPaths","tsConfig","resolveImport","configResult","detect","getPackageManager","targetDir","packageManager","chalk","logger","args","handleError","error","logger","chalk","Command","execa","existsSync","fs","ora","path","prompts","z","COMPONENTS","getComponentDependencies","componentName","visited","component","COMPONENTS","comp","dependencies","dependency","childDependencies","INVALID_COMPONENT_ERROR","getAllComponentsToWrite","componentNames","uniqueComponents","allDependencies","dep","fileURLToPath","filePath","fileDir","path","addOptionsSchema","z","add","Command","components","opts","options","cwd","existsSync","logger","config","getConfig","promptForConfig","selectedComponents","prompts","COMPONENTS","entry","spinner","ora","componentsToWrite","getAllComponentsToWrite","err","INVALID_COMPONENT_ERROR","component","npmPackages","comp","writeFiles","packageManager","getPackageManager","uniqueNpmPackages","execa","error","handleError","paths","overwriteFlag","compPath","targetDir","fs","chalk","overwrite","readFromPath","content","fixImports","icon","rawfile","componentsAlias","libAlias","highlight","text","DEFAULT_COMPONENTS","DEFAULT_LIB","rawConfigSchema","proceed","targetPath","resolveConfigPaths","Command","path","fs","getPackageInfo","packageJsonPath","main","packageInfo","getPackageInfo","program","Command","add"]}
1
+ {"version":3,"sources":["../src/utils/resolve-import.ts","../src/utils/get-config.ts","../src/utils/get-package-manager.ts","../src/utils/logger.ts","../src/utils/handle-error.ts","../src/commands/add.ts","../src/items/components.ts","../src/items/index.ts","../src/commands/init.ts","../src/index.ts","../src/utils/get-package-info.ts"],"sourcesContent":["import { createMatchPath, type ConfigLoaderSuccessResult } from \"tsconfig-paths\"\n\nexport async function resolveImport(\n importPath: string,\n config: Pick<ConfigLoaderSuccessResult, \"absoluteBaseUrl\" | \"paths\">\n) {\n return createMatchPath(config.absoluteBaseUrl, config.paths)(\n importPath,\n undefined,\n () => true,\n [\".ts\", \".tsx\"]\n )\n}\n","import { resolveImport } from '@/src/utils/resolve-import';\nimport { cosmiconfig } from 'cosmiconfig';\nimport { loadConfig } from 'tsconfig-paths';\nimport { z } from 'zod';\n\nexport const DEFAULT_COMPONENTS = '~/components';\nexport const DEFAULT_LIB = '~/lib';\n\nconst explorer = cosmiconfig('components', {\n searchPlaces: ['components.json'],\n});\n\nexport const rawConfigSchema = z.object({\n aliases: z.object({\n components: z.string(),\n lib: z.string(),\n }),\n});\n\nexport type RawConfig = z.infer<typeof rawConfigSchema>;\n\nexport const configSchema = rawConfigSchema.extend({\n resolvedPaths: z.object({\n lib: z.string(),\n components: z.string(),\n }),\n});\n\nexport type Config = z.infer<typeof configSchema>;\n\nexport async function getConfig(cwd: string) {\n const config = await getRawConfig(cwd);\n\n if (!config) {\n return null;\n }\n\n return await resolveConfigPaths(cwd, config);\n}\n\nexport async function resolveConfigPaths(cwd: string, config: RawConfig) {\n // Read tsconfig.json.\n const tsConfig = await loadConfig(cwd);\n\n if (tsConfig.resultType === 'failed') {\n throw new Error(`Failed to load tsconfig.json. ${tsConfig.message ?? ''}`.trim());\n }\n\n return configSchema.parse({\n ...config,\n resolvedPaths: {\n lib: await resolveImport(config.aliases['lib'], tsConfig),\n components: await resolveImport(config.aliases['components'], tsConfig),\n },\n });\n}\n\nexport async function getRawConfig(cwd: string): Promise<RawConfig | null> {\n try {\n const configResult = await explorer.search(cwd);\n\n if (!configResult) {\n return null;\n }\n\n return rawConfigSchema.parse(configResult.config);\n } catch (error) {\n throw new Error(`Invalid configuration found in ${cwd}/components.json.`);\n }\n}\n","import { detect } from '@antfu/ni';\n\nexport async function getPackageManager(\n targetDir: string\n): Promise<'yarn' | 'pnpm' | 'bun' | 'npm'> {\n const packageManager = await detect({ programmatic: true, cwd: targetDir });\n\n if (packageManager === 'yarn@berry') return 'yarn';\n if (packageManager === 'pnpm@6') return 'pnpm';\n if (packageManager === 'bun') return 'bun';\n\n return packageManager ?? 'npm';\n}\n","import chalk from \"chalk\"\n\nexport const logger = {\n error(...args: unknown[]) {\n console.log(chalk.red(...args))\n },\n warn(...args: unknown[]) {\n console.log(chalk.yellow(...args))\n },\n info(...args: unknown[]) {\n console.log(chalk.cyan(...args))\n },\n success(...args: unknown[]) {\n console.log(chalk.green(...args))\n },\n break() {\n console.log(\"\")\n },\n}\n","import { logger } from \"@/src/utils/logger\"\n\nexport function handleError(error: unknown) {\n if (typeof error === \"string\") {\n logger.error(error)\n process.exit(1)\n }\n\n if (error instanceof Error) {\n logger.error(error.message)\n process.exit(1)\n }\n\n logger.error(\"Something went wrong. Please try again.\")\n process.exit(1)\n}\n","import {\n Config,\n DEFAULT_COMPONENTS,\n DEFAULT_LIB,\n getConfig,\n rawConfigSchema,\n resolveConfigPaths,\n} from '@/src/utils/get-config';\nimport { getPackageManager } from '@/src/utils/get-package-manager';\nimport { handleError } from '@/src/utils/handle-error';\nimport { logger } from '@/src/utils/logger';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport { execa } from 'execa';\nimport { existsSync, promises as fs } from 'fs';\nimport ora, { Ora } from 'ora';\nimport path from 'path';\nimport prompts from 'prompts';\nimport { z } from 'zod';\nimport { Component, INVALID_COMPONENT_ERROR, getAllComponentsToWrite } from '../items';\nimport { COMPONENTS } from '../items/components';\nimport { fileURLToPath } from 'url';\n\nconst filePath = fileURLToPath(import.meta.url);\nconst fileDir = path.dirname(filePath);\n\nconst addOptionsSchema = z.object({\n components: z.array(z.string()).optional(),\n overwrite: z.boolean(),\n cwd: z.string(),\n path: z.string().optional(),\n});\n\nexport const add = new Command()\n .name('add')\n .description('add components to your project')\n .argument('[components...]', 'the components to add')\n .option('-o, --overwrite', 'overwrite existing files.', false)\n .option(\n '-c, --cwd <cwd>',\n 'the working directory. defaults to the current directory.',\n process.cwd()\n )\n .action(async (components, opts) => {\n try {\n const options = addOptionsSchema.parse({\n components,\n ...opts,\n });\n\n const cwd = path.resolve(options.cwd);\n\n if (!existsSync(cwd)) {\n logger.error(`The path ${cwd} does not exist. Please try again.`);\n process.exit(1);\n }\n\n let config = await getConfig(cwd);\n\n if (!config) {\n config = await promptForConfig(cwd);\n }\n\n let selectedComponents: Array<string> = options.components ?? [];\n if (!selectedComponents?.length) {\n const { components } = await prompts({\n type: 'multiselect',\n name: 'components',\n message: 'Which components would you like to add?',\n hint: 'Space to select. A to toggle all. Enter to submit.',\n instructions: false,\n choices: COMPONENTS.map((entry) => ({\n title: entry.name,\n value: entry.name,\n selected: false,\n })),\n });\n selectedComponents = components;\n }\n\n if (!selectedComponents?.length) {\n logger.warn('No components selected. Exiting.');\n process.exit(0);\n }\n\n const spinner = ora(`Installing components...`).start();\n\n let componentsToWrite: Array<Component> = [];\n try {\n componentsToWrite = getAllComponentsToWrite(selectedComponents);\n } catch (err) {\n if (err instanceof Error && err.message === INVALID_COMPONENT_ERROR) {\n logger.error(\n `Invalid component(s): ${selectedComponents\n .filter((component) => !COMPONENTS.find((entry) => entry.name === component))\n .join(', ')}`\n );\n process.exit(1);\n }\n logger.error(err);\n }\n\n const npmPackages: Array<string> = [];\n\n for (const comp of componentsToWrite) {\n spinner.text = `Installing ${comp.name}...`;\n\n await writeFiles(comp, comp.paths, config, spinner, options.overwrite);\n\n npmPackages.push(...comp.npmPackages);\n }\n\n const packageManager = await getPackageManager(cwd);\n\n const uniqueNpmPackages = Array.from(new Set(npmPackages));\n\n if (uniqueNpmPackages.length) {\n spinner.text = `Installing ${uniqueNpmPackages.join(', ')}...`;\n await execa(\n packageManager,\n [packageManager === 'npm' ? 'install' : 'add', ...uniqueNpmPackages],\n {\n cwd,\n }\n );\n }\n spinner.succeed(`Done.`);\n } catch (error) {\n handleError(error);\n }\n });\n\nasync function writeFiles(\n comp: Component,\n paths: Array<{ from: string; distFrom?: string; to: { folder: string; file: string } }>,\n config: Config,\n spinner: Ora,\n overwriteFlag: boolean\n) {\n for (const compPath of paths) {\n const targetDir = path.join(config.resolvedPaths.components, compPath.to.folder);\n if (!existsSync(targetDir)) {\n await fs.mkdir(targetDir, { recursive: true });\n }\n\n spinner.stop();\n\n if (existsSync(path.join(targetDir, compPath.to.file))) {\n const filePath = [compPath.to.folder, compPath.to.file].join('/');\n if (!overwriteFlag) {\n logger.info(\n `File already exists: ${chalk.bgCyan(\n filePath\n )} was skipped. To overwrite, run with the ${chalk.green('--overwrite')} flag.`\n );\n continue;\n }\n\n const { overwrite } = await prompts({\n type: 'confirm',\n name: 'overwrite',\n message: `File already exists: ${chalk.yellow(filePath)}. Would you like to overwrite?`,\n initial: false,\n });\n\n if (!overwrite) {\n logger.info(`Skipped`);\n continue;\n }\n }\n\n spinner.start(`Installing ${comp.name}...`);\n const readFromPath = compPath.distFrom\n ? path.join(fileDir, '../__generated/components', compPath.distFrom)\n : path.join(fileDir, '../__generated/components', compPath.to.folder, compPath.to.file);\n try {\n const content = await fs.readFile(path.resolve(readFromPath), 'utf8');\n await fs.writeFile(\n path.join(targetDir, compPath.to.file),\n fixImports(content, config.aliases.components, config.aliases.lib)\n );\n } catch (error) {\n handleError(error);\n }\n }\n\n for (const icon of comp.icons ?? []) {\n const targetDir = path.resolve(config.resolvedPaths.lib, 'icons');\n if (!existsSync(targetDir)) {\n await fs.mkdir(targetDir, { recursive: true });\n try {\n await fs.writeFile(\n path.join(targetDir, `iconWithClassName.ts`),\n `import type { LucideIcon } from 'lucide-react-native';\\nimport { cssInterop } from 'nativewind';\\n\\nexport function iconWithClassName(icon: LucideIcon) {\\ncssInterop(icon, {\\n className: {\\n target: 'style',\\n nativeStyleToProp: {\\n color: true,\\n opacity: true,\\n },\\n },\\n});\\n}`\n );\n } catch (error) {\n handleError(error);\n }\n }\n\n if (existsSync(path.join(targetDir, `${icon}.tsx`))) {\n const filePath = path.join(targetDir, `${icon}.tsx`);\n if (!overwriteFlag) {\n logger.info(\n `File already exists: ${chalk.bgCyan(\n `${icon}.tsx`\n )} was skipped. To overwrite, run with the ${chalk.green('--overwrite')} flag.`\n );\n continue;\n }\n\n const { overwrite } = await prompts({\n type: 'confirm',\n name: 'overwrite',\n message: `File already exists: ${chalk.yellow(filePath)}. Would you like to overwrite?`,\n initial: false,\n });\n\n if (!overwrite) {\n logger.info(`Skipped ${icon}.tsx`);\n continue;\n }\n }\n\n spinner.start(`Adding the ${icon} icon...`);\n\n try {\n await fs.writeFile(\n path.join(targetDir, `${icon}.tsx`),\n `import { ${icon} } from 'lucide-react-native';\\nimport { iconWithClassName } from './iconWithClassName';\\niconWithClassName(${icon});\\nexport { ${icon} };`\n );\n } catch (error) {\n handleError(error);\n }\n }\n}\n\nfunction fixImports(rawfile: string, componentsAlias: string, libAlias: string) {\n return rawfile\n .replace('./typography', `${componentsAlias}/ui/typography`)\n .replace('./text', `${componentsAlias}/ui/text`)\n .replaceAll('../../components', componentsAlias)\n .replaceAll('../../lib', libAlias);\n}\n\nasync function promptForConfig(cwd: string) {\n const highlight = (text: string) => chalk.cyan(text);\n\n const options = await prompts([\n {\n type: 'text',\n name: 'components',\n message: `Configure the import alias for ${highlight('components')}:`,\n initial: DEFAULT_COMPONENTS,\n },\n {\n type: 'text',\n name: 'lib',\n message: `Configure the import alias for ${highlight('lib')}:`,\n initial: DEFAULT_LIB,\n },\n ]);\n\n const config = rawConfigSchema.parse({\n aliases: {\n lib: options.lib,\n components: options.components,\n },\n });\n\n const { proceed } = await prompts({\n type: 'confirm',\n name: 'proceed',\n message: `Write configuration to ${highlight('components.json')}. Proceed?`,\n initial: true,\n });\n\n if (proceed) {\n // Write to file.\n logger.info('');\n const spinner = ora(`Writing components.json...`).start();\n const targetPath = path.resolve(cwd, 'components.json');\n await fs.writeFile(targetPath, JSON.stringify(config, null, 2), 'utf8');\n spinner.succeed();\n }\n\n return await resolveConfigPaths(cwd, config);\n}\n","export const COMPONENTS = [\n {\n name: 'accordion',\n dependencies: ['text'],\n icons: ['ChevronDown'],\n npmPackages: ['@rn-primitives/accordion'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/accordion.tsx',\n to: {\n folder: 'ui',\n file: 'accordion.tsx',\n },\n },\n ],\n },\n {\n name: 'alert-dialog',\n dependencies: ['button', 'text'],\n icons: [],\n npmPackages: ['@rn-primitives/alert-dialog'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/alert-dialog.tsx',\n to: {\n folder: 'ui',\n file: 'alert-dialog.tsx',\n },\n },\n ],\n },\n {\n name: 'aspect-ratio',\n dependencies: [],\n icons: [],\n npmPackages: ['@rn-primitives/aspect-ratio'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/aspect-ratio.tsx',\n to: {\n folder: 'ui',\n file: 'aspect-ratio.tsx',\n },\n },\n ],\n },\n {\n name: 'avatar',\n dependencies: [],\n icons: [],\n npmPackages: ['@rn-primitives/avatar'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/avatar.tsx',\n to: {\n folder: 'ui',\n file: 'avatar.tsx',\n },\n },\n ],\n },\n {\n name: 'badge',\n dependencies: [],\n icons: [],\n npmPackages: ['@rn-primitives/slot', '@rn-primitives/types'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/badge.tsx',\n to: {\n folder: 'ui',\n file: 'badge.tsx',\n },\n },\n ],\n },\n {\n name: 'button',\n dependencies: ['text'],\n icons: [],\n npmPackages: ['@rn-primitives/types'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/button.tsx',\n to: {\n folder: 'ui',\n file: 'button.tsx',\n },\n },\n ],\n },\n {\n name: 'card',\n dependencies: ['text'],\n icons: [],\n npmPackages: ['@rn-primitives/types'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/card.tsx',\n to: {\n folder: 'ui',\n file: 'card.tsx',\n },\n },\n ],\n },\n {\n name: 'checkbox',\n dependencies: [],\n icons: ['Check'],\n npmPackages: ['@rn-primitives/checkbox'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/checkbox.tsx',\n to: {\n folder: 'ui',\n file: 'checkbox.tsx',\n },\n },\n ],\n },\n {\n name: 'collapsible',\n dependencies: [],\n icons: [],\n npmPackages: ['@rn-primitives/collapsible'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/collapsible.tsx',\n to: {\n folder: 'ui',\n file: 'collapsible.tsx',\n },\n },\n ],\n },\n {\n name: 'context-menu',\n dependencies: ['text'],\n icons: ['Check', 'ChevronDown', 'ChevronRight', 'ChevronUp'],\n npmPackages: ['@rn-primitives/context-menu'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/context-menu.tsx',\n to: {\n folder: 'ui',\n file: 'context-menu.tsx',\n },\n },\n ],\n },\n {\n name: 'dialog',\n dependencies: [],\n icons: ['X'],\n npmPackages: ['@rn-primitives/dialog'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/dialog.tsx',\n to: {\n folder: 'ui',\n file: 'dialog.tsx',\n },\n },\n ],\n },\n {\n name: 'dropdown-menu',\n dependencies: ['text'],\n icons: ['Check', 'ChevronDown', 'ChevronRight', 'ChevronUp'],\n npmPackages: ['@rn-primitives/dropdown-menu'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/dropdown-menu.tsx',\n to: {\n folder: 'ui',\n file: 'dropdown-menu.tsx',\n },\n },\n ],\n },\n {\n name: 'hover-card',\n dependencies: [],\n icons: [],\n npmPackages: ['@rn-primitives/hover-card'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/hover-card.tsx',\n to: {\n folder: 'ui',\n file: 'hover-card.tsx',\n },\n },\n ],\n },\n {\n name: 'input',\n dependencies: [],\n icons: [],\n npmPackages: [],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/input.tsx',\n to: {\n folder: 'ui',\n file: 'input.tsx',\n },\n },\n ],\n },\n {\n name: 'label',\n dependencies: [],\n icons: [],\n npmPackages: ['@rn-primitives/label'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/label.tsx',\n to: {\n folder: 'ui',\n file: 'label.tsx',\n },\n },\n ],\n },\n {\n name: 'menubar',\n dependencies: ['text'],\n icons: ['Check', 'ChevronDown', 'ChevronRight', 'ChevronUp'],\n npmPackages: ['@rn-primitives/menubar'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/menubar.tsx',\n to: {\n folder: 'ui',\n file: 'menubar.tsx',\n },\n },\n ],\n },\n {\n name: 'navigation-menu',\n dependencies: [],\n icons: ['ChevronDown'],\n npmPackages: ['@rn-primitives/navigation-menu'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/navigation-menu.tsx',\n to: {\n folder: 'ui',\n file: 'navigation-menu.tsx',\n },\n },\n ],\n },\n {\n name: 'popover',\n dependencies: ['text'],\n icons: [],\n npmPackages: ['@rn-primitives/popover'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/popover.tsx',\n to: {\n folder: 'ui',\n file: 'popover.tsx',\n },\n },\n ],\n },\n {\n name: 'progress',\n dependencies: [],\n icons: [],\n npmPackages: ['@rn-primitives/progress'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/progress.tsx',\n to: {\n folder: 'ui',\n file: 'progress.tsx',\n },\n },\n ],\n },\n {\n name: 'radio-group',\n dependencies: [],\n icons: [],\n npmPackages: ['@rn-primitives/radio-group'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/radio-group.tsx',\n to: {\n folder: 'ui',\n file: 'radio-group.tsx',\n },\n },\n ],\n },\n {\n name: 'select',\n dependencies: [],\n icons: ['Check', 'ChevronDown', 'ChevronUp'],\n npmPackages: ['@rn-primitives/select'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/select.tsx',\n to: {\n folder: 'ui',\n file: 'select.tsx',\n },\n },\n ],\n },\n {\n name: 'separator',\n dependencies: [],\n icons: [],\n npmPackages: ['@rn-primitives/separator'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/separator.tsx',\n to: {\n folder: 'ui',\n file: 'separator.tsx',\n },\n },\n ],\n },\n {\n name: 'skeleton',\n dependencies: [],\n icons: [],\n npmPackages: [],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/skeleton.tsx',\n to: {\n folder: 'ui',\n file: 'skeleton.tsx',\n },\n },\n ],\n },\n {\n name: 'switch',\n dependencies: [],\n icons: [],\n npmPackages: ['@rn-primitives/switch'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/switch.tsx',\n to: {\n folder: 'ui',\n file: 'switch.tsx',\n },\n },\n ],\n },\n {\n name: 'table',\n dependencies: ['text'],\n icons: [],\n npmPackages: ['@rn-primitives/table'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/table.tsx',\n to: {\n folder: 'ui',\n file: 'table.tsx',\n },\n },\n ],\n },\n {\n name: 'tabs',\n dependencies: ['text'],\n icons: [],\n npmPackages: ['@rn-primitives/tabs'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/tabs.tsx',\n to: {\n folder: 'ui',\n file: 'tabs.tsx',\n },\n },\n ],\n },\n {\n name: 'text',\n dependencies: [],\n icons: [],\n npmPackages: ['@rn-primitives/slot', '@rn-primitives/types'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/text.tsx',\n to: { folder: 'ui', file: 'text.tsx' },\n },\n ],\n },\n {\n name: 'textarea',\n dependencies: [],\n icons: [],\n npmPackages: [],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/textarea.tsx',\n to: { folder: 'ui', file: 'textarea.tsx' },\n },\n ],\n },\n {\n name: 'toggle',\n dependencies: ['text'],\n icons: [],\n npmPackages: ['@rn-primitives/toggle'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/toggle.tsx',\n to: { folder: 'ui', file: 'toggle.tsx' },\n },\n ],\n },\n {\n name: 'toggle-group',\n dependencies: ['text'],\n icons: [],\n npmPackages: ['@rn-primitives/toggle-group'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/toggle-group.tsx',\n to: { folder: 'ui', file: 'toggle-group.tsx' },\n },\n ],\n },\n {\n name: 'tooltip',\n dependencies: ['text'],\n icons: [],\n npmPackages: ['@rn-primitives/tooltip'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/tooltip.tsx',\n to: { folder: 'ui', file: 'tooltip.tsx' },\n },\n ],\n },\n {\n name: 'typography',\n dependencies: [],\n icons: [],\n npmPackages: ['@rn-primitives/slot', '@rn-primitives/types'],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/typography.tsx',\n to: { folder: 'ui', file: 'typography.tsx' },\n },\n ],\n },\n];\n","import { COMPONENTS } from './components';\n\nexport type Component = (typeof COMPONENTS)[number] & { icons?: string[] };\ntype ComponentName = (typeof COMPONENTS)[number]['name'];\n\nfunction getComponentDependencies(\n componentName: ComponentName,\n visited = new Set<ComponentName>()\n) {\n const component = COMPONENTS.find((comp) => comp.name === componentName);\n if (!component) return [];\n\n visited.add(componentName);\n\n let dependencies: ComponentName[] = component.dependencies.slice();\n\n component.dependencies.forEach((dependency) => {\n if (!visited.has(dependency)) {\n const childDependencies = getComponentDependencies(dependency, visited);\n dependencies = dependencies.concat(childDependencies);\n }\n });\n\n return dependencies;\n}\n\nexport const INVALID_COMPONENT_ERROR = 'invalid component';\n\nexport function getAllComponentsToWrite(componentNames: string[]): Component[] {\n const uniqueComponents = new Set<ComponentName>();\n\n if (\n componentNames.some((componentName) => !COMPONENTS.find((comp) => comp.name === componentName))\n ) {\n throw new Error(INVALID_COMPONENT_ERROR);\n }\n\n componentNames.forEach((componentName) => {\n const allDependencies = getComponentDependencies(componentName as ComponentName);\n allDependencies.unshift(componentName as never); // Add the component itself to the list\n allDependencies.forEach((dep) => {\n uniqueComponents.add(dep);\n });\n });\n\n return Array.from(uniqueComponents).map((dep) => {\n const comp = COMPONENTS.find((comp) => comp.name === dep);\n if (!comp) {\n throw new Error(INVALID_COMPONENT_ERROR);\n }\n return comp;\n });\n}\n","import { existsSync } from 'fs';\nimport { promises as fs } from 'fs';\nimport { Command } from 'commander';\nimport { execa } from 'execa';\nimport ora, { Ora } from 'ora';\nimport path from 'path';\nimport { z } from 'zod';\nimport { handleError } from '@/src/utils/handle-error';\nimport { logger } from '@/src/utils/logger';\nimport chalk from 'chalk';\nimport prompts from 'prompts';\nimport glob from 'fast-glob';\nimport { createRequire } from 'module';\nimport { execSync } from 'child_process';\nimport {\n getConfig,\n rawConfigSchema,\n resolveConfigPaths,\n DEFAULT_COMPONENTS,\n DEFAULT_LIB,\n} from '@/src/utils/get-config';\n\nconst initOptionsSchema = z.object({\n cwd: z.string(),\n overwrite: z.boolean(),\n});\n\nconst REQUIRED_DEPENDENCIES = [\n 'nativewind',\n 'expo-navigation-bar',\n 'tailwindcss-animate',\n '@react-native-async-storage/async-storage',\n 'class-variance-authority',\n 'clsx',\n 'tailwind-merge',\n 'react-native-svg',\n 'lucide-react-native',\n '@rn-primitives/portal',\n] as const;\n\nconst TEMPLATE_FILES = [\n 'tailwind.config.js',\n 'nativewind-env.d.ts',\n 'global.css',\n 'babel.config.js',\n 'metro.config.js',\n 'lib/utils.ts',\n 'lib/useColorScheme.tsx',\n 'lib/constants.ts',\n 'lib/android-navigation-bar.ts',\n 'lib/icons/iconWithClassName.ts',\n] as const;\n\nasync function installDependencies(cwd: string, spinner: Ora) {\n try {\n spinner.text = 'Installing dependencies...';\n await execa('npx', ['expo', 'install', ...REQUIRED_DEPENDENCIES], {\n cwd,\n stdio: 'inherit',\n });\n spinner.text = 'Dependencies installed successfully';\n } catch (error) {\n spinner.fail('Failed to install dependencies');\n handleError(error);\n process.exit(1);\n }\n}\n\nasync function promptForConfig(cwd: string) {\n const highlight = (text: string) => chalk.cyan(text);\n\n try {\n const options = await prompts([\n {\n type: 'text',\n name: 'components',\n message: `Configure the import alias for ${highlight('components')}:`,\n initial: DEFAULT_COMPONENTS,\n },\n {\n type: 'text',\n name: 'lib',\n message: `Configure the import alias for ${highlight('lib')}:`,\n initial: DEFAULT_LIB,\n },\n ]);\n\n const components = options.components || DEFAULT_COMPONENTS;\n const lib = options.lib || DEFAULT_LIB;\n\n const config = rawConfigSchema.parse({\n aliases: {\n components,\n lib,\n },\n });\n\n const { proceed } = await prompts({\n type: 'confirm',\n name: 'proceed',\n message: `Write configuration to ${highlight('components.json')}. Proceed?`,\n initial: true,\n });\n\n if (proceed) {\n logger.info('');\n const spinner = ora(`Writing components.json...`).start();\n const targetPath = path.resolve(cwd, 'components.json');\n await fs.writeFile(targetPath, JSON.stringify(config, null, 2), 'utf8');\n spinner.succeed();\n }\n\n return await resolveConfigPaths(cwd, config);\n } catch (error) {\n logger.error('Failed to configure project.');\n process.exit(1);\n }\n}\n\nconst NON_PATH_ALIAS_BASES = ['', '.', '/'];\n\nasync function updateTsConfig(cwd: string, config: any, spinner: Ora) {\n try {\n const tsconfigPath = path.join(cwd, 'tsconfig.json');\n const tsconfig = existsSync(tsconfigPath)\n ? JSON.parse(await fs.readFile(tsconfigPath, 'utf8'))\n : {};\n\n const componentBase = config.aliases.components.split('/')[0];\n const libBase = config.aliases.lib.split('/')[0];\n\n if (NON_PATH_ALIAS_BASES.includes(componentBase) || NON_PATH_ALIAS_BASES.includes(libBase)) {\n return;\n }\n\n const tsconfigPaths = tsconfig.compilerOptions?.paths ?? {};\n\n if (\n tsconfigPaths[`${componentBase}/*`]?.[0] === '*' &&\n tsconfigPaths[`${libBase}/*`]?.[0] === '*'\n ) {\n spinner.succeed('Path aliases already configured');\n return;\n }\n\n spinner.text = 'Updating path aliases...';\n\n tsconfig.compilerOptions = {\n ...tsconfig.compilerOptions,\n baseUrl: '.',\n paths: {\n [`${componentBase}/*`]: ['*'],\n [`${libBase}/*`]: ['*'],\n ...tsconfig.compilerOptions?.paths,\n },\n };\n\n await fs.writeFile(tsconfigPath, JSON.stringify(tsconfig, null, 2));\n } catch (error) {\n spinner.fail('Failed to update tsconfig.json');\n handleError(error);\n }\n}\n\nasync function copyTemplateFile(\n file: string,\n templatesDir: string,\n targetDir: string,\n spinner: Ora,\n overwriteFlag: boolean\n) {\n const targetPath = path.join(targetDir, file);\n spinner.stop();\n\n if (existsSync(targetPath)) {\n if (!overwriteFlag) {\n logger.info(\n `File already exists: ${chalk.bgCyan(\n file\n )} was skipped. To overwrite, run with the ${chalk.green('--overwrite')} flag.`\n );\n return;\n }\n\n const { overwrite } = await prompts({\n type: 'confirm',\n name: 'overwrite',\n message: `File already exists: ${chalk.yellow(file)}. Would you like to overwrite?`,\n initial: false,\n });\n\n if (!overwrite) {\n logger.info(`Skipped`);\n return;\n }\n }\n\n spinner.start(`Installing ${file}...`);\n await fs.mkdir(path.dirname(targetPath), { recursive: true });\n await fs.copyFile(path.join(templatesDir, file), targetPath);\n}\n\nasync function updateLayoutFile(cwd: string, spinner: Ora) {\n try {\n const layoutFiles = await glob(\n ['app/_layout.{ts,tsx,js,jsx}', '(app)/_layout.{ts,tsx,js,jsx}'],\n {\n cwd,\n ignore: ['node_modules/**'],\n }\n );\n\n if (!layoutFiles.length) {\n spinner.warn('Could not find the root _layout file');\n return;\n }\n\n const layoutPath = path.join(cwd, layoutFiles[0]);\n const content = await fs.readFile(layoutPath, 'utf8');\n\n if (!content.includes('import \"../global.css\"')) {\n spinner.text = 'Updating layout file...';\n await fs.writeFile(layoutPath, `import \"../global.css\";\\n${content}`);\n spinner.succeed(`Updated ${layoutFiles[0]} with global CSS import`);\n }\n } catch (error) {\n spinner.fail('Failed to update layout file');\n handleError(error);\n }\n}\n\nasync function shouldPromptGitWarning(cwd: string): Promise<boolean> {\n try {\n execSync('git rev-parse --is-inside-work-tree', { cwd });\n const status = execSync('git status --porcelain', { cwd }).toString();\n return !!status;\n } catch (error) {\n return false;\n }\n}\n\nasync function validateProjectDirectory(cwd: string) {\n if (!existsSync(cwd)) {\n logger.error(`The path ${cwd} does not exist. Please try again.`);\n process.exit(1);\n }\n\n if (!existsSync(path.join(cwd, 'package.json'))) {\n logger.error(\n 'No package.json found. Please run this command in a React Native project directory.'\n );\n process.exit(1);\n }\n}\n\nasync function checkGitStatus(cwd: string) {\n if (await shouldPromptGitWarning(cwd)) {\n const { proceed } = await prompts({\n type: 'confirm',\n name: 'proceed',\n message:\n 'The Git repository is dirty (uncommitted changes). It is recommended to commit your changes before proceeding. Do you want to continue?',\n initial: false,\n });\n\n if (!proceed) {\n logger.info('Installation cancelled.');\n process.exit(0);\n }\n }\n}\n\nasync function initializeProject(cwd: string, overwrite: boolean) {\n const spinner = ora(`Initializing project...`).start();\n\n try {\n let config = await getConfig(cwd);\n\n if (!config) {\n spinner.stop();\n config = await promptForConfig(cwd);\n spinner.start();\n }\n\n const templatesDir = path.dirname(createRequire(import.meta.url).resolve('@rnr/starter-base'));\n\n await installDependencies(cwd, spinner);\n await updateTsConfig(cwd, config, spinner);\n\n spinner.text = 'Adding config and utility files...';\n for (const file of TEMPLATE_FILES) {\n await copyTemplateFile(file, templatesDir, cwd, spinner, overwrite);\n }\n\n await updateLayoutFile(cwd, spinner);\n\n spinner.succeed('Initialization completed successfully!');\n } catch (error) {\n spinner.fail('Initialization failed');\n handleError(error);\n process.exit(1);\n }\n}\n\nexport const init = new Command()\n .name('init')\n .description('Initialize the required configuration for your React Native project')\n .option(\n '-c, --cwd <cwd>',\n 'the working directory. defaults to the current directory.',\n process.cwd()\n )\n .option('-o, --overwrite', 'overwrite existing files', false)\n .action(async (opts) => {\n try {\n const options = initOptionsSchema.parse(opts);\n const cwd = path.resolve(options.cwd);\n\n await validateProjectDirectory(cwd);\n await checkGitStatus(cwd);\n await initializeProject(cwd, options.overwrite);\n } catch (error) {\n handleError(error);\n }\n });\n","#!/usr/bin/env node\nimport { add } from '@/src/commands/add';\nimport { init } from '@/src/commands/init';\n\nimport { Command } from 'commander';\n\nimport { getPackageInfo } from './utils/get-package-info';\n\nprocess.on('SIGINT', () => process.exit(0));\nprocess.on('SIGTERM', () => process.exit(0));\n\nasync function main() {\n const packageInfo = await getPackageInfo();\n\n const program = new Command()\n .name('rnr-cli')\n .description('add components and dependencies to your project')\n .version(packageInfo.version || '0.0.0-rc.0', '-v, --version', 'display the version number');\n\n program.addCommand(add);\n program.addCommand(init);\n\n program.parse();\n}\n\nmain();\n","import path from 'path';\nimport fs from 'fs-extra';\nimport { type PackageJson } from 'type-fest';\n\nexport function getPackageInfo() {\n const packageJsonPath = path.join('package.json');\n\n return fs.readJSONSync(packageJsonPath) as Promise<PackageJson>;\n}\n"],"mappings":"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AAa,CAAC,yBAAyB,EACvC,MAAO,CACL,CACE,KAAM,+DACN,GAAI,CACF,OAAQ,KACR,KAAM,cACR,CACF,CACF,CACF,EACA,CACE,KAAM,cACN,aAAc,CAAC,EACf,MAAO,CAAC,EACR,YAAa,CAAC,4BAA4B,EAC1C,MAAO,CACL,CACE,KAAM,kEACN,GAAI,CACF,OAAQ,KACR,KAAM,iBACR,CACF,CACF,CACF,EACA,CACE,KAAM,SACN,aAAc,CAAC,EACf,MAAO,CAAC,QAAS,cAAe,WAAW,EAC3C,YAAa,CAAC,uBAAuB,EACrC,MAAO,CACL,CACE,KAAM,6DACN,GAAI,CACF,OAAQ,KACR,KAAM,YACR,CACF,CACF,CACF,EACA,CACE,KAAM,YACN,aAAc,CAAC,EACf,MAAO,CAAC,EACR,YAAa,CAAC,0BAA0B,EACxC,MAAO,CACL,CACE,KAAM,gEACN,GAAI,CACF,OAAQ,KACR,KAAM,eACR,CACF,CACF,CACF,EACA,CACE,KAAM,WACN,aAAc,CAAC,EACf,MAAO,CAAC,EACR,YAAa,CAAC,EACd,MAAO,CACL,CACE,KAAM,+DACN,GAAI,CACF,OAAQ,KACR,KAAM,cACR,CACF,CACF,CACF,EACA,CACE,KAAM,SACN,aAAc,CAAC,EACf,MAAO,CAAC,EACR,YAAa,CAAC,uBAAuB,EACrC,MAAO,CACL,CACE,KAAM,6DACN,GAAI,CACF,OAAQ,KACR,KAAM,YACR,CACF,CACF,CACF,EACA,CACE,KAAM,QACN,aAAc,CAAC,MAAM,EACrB,MAAO,CAAC,EACR,YAAa,CAAC,sBAAsB,EACpC,MAAO,CACL,CACE,KAAM,4DACN,GAAI,CACF,OAAQ,KACR,KAAM,WACR,CACF,CACF,CACF,EACA,CACE,KAAM,OACN,aAAc,CAAC,MAAM,EACrB,MAAO,CAAC,EACR,YAAa,CAAC,qBAAqB,EACnC,MAAO,CACL,CACE,KAAM,2DACN,GAAI,CACF,OAAQ,KACR,KAAM,UACR,CACF,CACF,CACF,EACA,CACE,KAAM,OACN,aAAc,CAAC,EACf,MAAO,CAAC,EACR,YAAa,CAAC,sBAAuB,sBAAsB,EAC3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","names":["createMatchPath","resolveImport","importPath","config","cosmiconfig","loadConfig","z","DEFAULT_COMPONENTS","DEFAULT_LIB","explorer","rawConfigSchema","configSchema","getConfig","cwd","config","getRawConfig","resolveConfigPaths","tsConfig","resolveImport","configResult","detect","getPackageManager","targetDir","packageManager","chalk","logger","args","handleError","error","logger","chalk","Command","execa","existsSync","fs","ora","path","prompts","z","COMPONENTS","getComponentDependencies","componentName","visited","component","COMPONENTS","comp","dependencies","dependency","childDependencies","INVALID_COMPONENT_ERROR","getAllComponentsToWrite","componentNames","uniqueComponents","allDependencies","dep","fileURLToPath","filePath","fileDir","path","addOptionsSchema","z","add","Command","components","opts","options","cwd","existsSync","logger","config","getConfig","promptForConfig","selectedComponents","prompts","COMPONENTS","entry","spinner","ora","componentsToWrite","getAllComponentsToWrite","err","INVALID_COMPONENT_ERROR","component","npmPackages","comp","writeFiles","packageManager","getPackageManager","uniqueNpmPackages","execa","error","handleError","paths","overwriteFlag","compPath","targetDir","fs","chalk","overwrite","readFromPath","content","fixImports","icon","rawfile","componentsAlias","libAlias","highlight","text","DEFAULT_COMPONENTS","DEFAULT_LIB","rawConfigSchema","proceed","targetPath","resolveConfigPaths","existsSync","fs","Command","execa","ora","path","z","chalk","prompts","glob","createRequire","execSync","initOptionsSchema","z","REQUIRED_DEPENDENCIES","TEMPLATE_FILES","installDependencies","cwd","spinner","execa","error","handleError","promptForConfig","highlight","text","chalk","options","prompts","DEFAULT_COMPONENTS","DEFAULT_LIB","components","lib","config","rawConfigSchema","proceed","logger","ora","targetPath","path","fs","resolveConfigPaths","NON_PATH_ALIAS_BASES","updateTsConfig","tsconfigPath","tsconfig","existsSync","componentBase","libBase","tsconfigPaths","copyTemplateFile","file","templatesDir","targetDir","overwriteFlag","overwrite","updateLayoutFile","layoutFiles","glob","layoutPath","content","shouldPromptGitWarning","execSync","validateProjectDirectory","checkGitStatus","initializeProject","getConfig","createRequire","init","Command","opts","Command","path","fs","getPackageInfo","packageJsonPath","main","packageInfo","getPackageInfo","program","Command","add","init"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@react-native-reusables/cli",
3
- "version": "0.1.1",
4
- "description": "Add Universal components and primitives to your React-Native project.",
3
+ "version": "0.2.0",
4
+ "description": "Add react-native-reusables to your project.",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -34,7 +34,7 @@
34
34
  "bin": "./dist/index.js",
35
35
  "dependencies": {
36
36
  "@antfu/ni": "^0.21.4",
37
- "@babel/core": "^7.22.1",
37
+ "@babel/core": "^7.26.0",
38
38
  "@babel/parser": "^7.22.6",
39
39
  "@babel/plugin-transform-typescript": "^7.22.5",
40
40
  "chalk": "5.2.0",
@@ -52,7 +52,8 @@
52
52
  "recast": "^0.23.2",
53
53
  "ts-morph": "^18.0.0",
54
54
  "tsconfig-paths": "^4.2.0",
55
- "zod": "^3.20.2"
55
+ "zod": "^3.20.2",
56
+ "@rnr/starter-base": "1.0.0"
56
57
  },
57
58
  "devDependencies": {
58
59
  "@types/babel__core": "^7.20.1",