@react-native-reusables/cli 0.3.5 → 0.3.7
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/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{createMatchPath as oe}from"tsconfig-paths";async function O(e,t){return oe(t.absoluteBaseUrl,t.paths)(e,void 0,()=>!0,[".ts",".tsx"])}import{cosmiconfig as ne}from"cosmiconfig";import{loadConfig as ie}from"tsconfig-paths";import{z as g}from"zod";var D="~/components",A="~/lib",re=ne("components",{searchPlaces:["components.json"]}),F=g.object({aliases:g.object({components:g.string(),lib:g.string()})}),se=F.extend({resolvedPaths:g.object({lib:g.string(),components:g.string()})});async function S(e){let t=await ae(e);return t?await R(e,t):null}async function R(e,t){let o=await ie(e);if(o.resultType==="failed")throw new Error(`Failed to load tsconfig.json. ${o.message??""}`.trim());return se.parse({...t,resolvedPaths:{lib:await O(t.aliases.lib,o),components:await O(t.aliases.components,o)}})}async function ae(e){try{let t=await re.search(e);return t?F.parse(t.config):null}catch{throw new Error(`Invalid configuration found in ${e}/components.json.`)}}import{detect as ce}from"@antfu/ni";async function z(e){let t=await ce({programmatic:!0,cwd:e});return t==="yarn@berry"?"yarn":t==="pnpm@6"?"pnpm":t==="bun"?"bun":t??"npm"}import N from"chalk";var a={error(...e){console.log(N.red(...e))},warn(...e){console.log(N.yellow(...e))},info(...e){console.log(N.cyan(...e))},success(...e){console.log(N.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 le from"chalk";import{promises as pe}from"fs";import me from"ora";import de from"path";import B from"prompts";async function $(e){let t=i=>le.cyan(i),o=await B([{type:"text",name:"components",message:`Configure the import alias for ${t("components")}:`,initial:D},{type:"text",name:"lib",message:`Configure the import alias for ${t("lib")}:`,initial:A}]),n=F.parse({aliases:{lib:o.lib||D,components:o.components||A}}),{proceed:r}=await B({type:"confirm",name:"proceed",message:`Write configuration to ${t("components.json")}. Proceed?`,initial:!0});if(r){a.info("");let i=me("Writing components.json...").start(),s=de.resolve(e,"components.json");await pe.writeFile(s,JSON.stringify(n,null,2),"utf8"),i.succeed()}return await R(e,n)}import x from"chalk";import{Command as fe}from"commander";import{execa as ue}from"execa";import{existsSync as b,promises as w}from"fs";import ge from"ora";import l from"path";import L from"prompts";import{fileURLToPath as he}from"url";import{z as y}from"zod";var h=[{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",dependencies:["text"],icons:[],npmPackages:[],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/alert.tsx",to:{folder:"ui",file:"alert.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 V(e,t=new Set){let o=h.find(r=>r.name===e);if(!o)return[];t.add(e);let n=o.dependencies.slice();return o.dependencies.forEach(r=>{if(!t.has(r)){let i=V(r,t);n=n.concat(i)}}),n}var E="invalid component";function G(e){let t=new Set;if(e.some(o=>!h.find(n=>n.name===o)))throw new Error(E);return e.forEach(o=>{let n=V(o);n.unshift(o),n.forEach(r=>{t.add(r)})}),Array.from(t).map(o=>{let n=h.find(r=>r.name===o);if(!n)throw new Error(E);return n})}var xe=he(import.meta.url),J=l.dirname(xe),we=y.object({components:y.array(y.string()).optional(),overwrite:y.boolean(),cwd:y.string(),path:y.string().optional()}),q=new fe().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,t)=>{try{let o=we.parse({components:e,...t}),n=l.resolve(o.cwd);b(n)||(a.error(`The path ${n} does not exist. Please try again.`),process.exit(1));let r=await S(n);r||(r=await $(n));let i=o.components??[];if(!i?.length){let{components:f}=await L({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:h.map(_=>({title:_.name,value:_.name,selected:!1}))});i=f}i?.length||(a.warn("No components selected. Exiting."),process.exit(0));let s=ge("Installing components...").start(),c=[];try{c=G(i)}catch(f){f instanceof Error&&f.message===E&&(a.error(`Invalid component(s): ${i.filter(_=>!h.find(te=>te.name===_)).join(", ")}`),process.exit(1)),a.error(f)}let d=[];for(let f of c)s.text=`Installing ${f.name}...`,await ye(f,f.paths,r,s,o.overwrite),d.push(...f.npmPackages);let j=await z(n),I=Array.from(new Set(d));I.length&&(s.text=`Installing ${I.join(", ")}...`,await ue(j,[j==="npm"?"install":"add",...I],{cwd:n})),s.succeed("Done.")}catch(o){m(o)}});async function ye(e,t,o,n,r){for(let i of t){let s=l.join(o.resolvedPaths.components,i.to.folder);if(b(s)||await w.mkdir(s,{recursive:!0}),n.stop(),b(l.join(s,i.to.file))){let d=[i.to.folder,i.to.file].join("/");if(!r){a.info(`File already exists: ${x.bgCyan(d)} was skipped. To overwrite, run with the ${x.green("--overwrite")} flag.`);continue}let{overwrite:j}=await L({type:"confirm",name:"overwrite",message:`File already exists: ${x.yellow(d)}. Would you like to overwrite?`,initial:!1});if(!j){a.info("Skipped");continue}}n.start(`Installing ${e.name}...`);let c=i.distFrom?l.join(J,"../__generated/components",i.distFrom):l.join(J,"../__generated/components",i.to.folder,i.to.file);try{let d=await w.readFile(l.resolve(c),"utf8");await w.writeFile(l.join(s,i.to.file),ve(d,o.aliases.components,o.aliases.lib))}catch(d){m(d)}}for(let i of e.icons??[]){let s=l.resolve(o.resolvedPaths.lib,"icons");if(!b(s)){await w.mkdir(s,{recursive:!0});try{await w.writeFile(l.join(s,"iconWithClassName.ts"),`import type { LucideIcon } from 'lucide-react-native';
|
|
2
|
+
import{createMatchPath as Y}from"tsconfig-paths";async function I(e,o){return Y(o.absoluteBaseUrl,o.paths)(e,void 0,()=>!0,[".ts",".tsx"])}import{cosmiconfig as Z}from"cosmiconfig";import{loadConfig as ee}from"tsconfig-paths";import{z as f}from"zod";var $="~/components",E="~/lib",oe=Z("components",{searchPlaces:["components.json"]}),C=f.object({aliases:f.object({components:f.string(),lib:f.string()})}),te=C.extend({resolvedPaths:f.object({lib:f.string(),components:f.string()})});async function M(e){let o=await ne(e);return o?await S(e,o):null}async function S(e,o){let t=await ee(e);if(t.resultType==="failed")throw new Error(`Failed to load tsconfig.json. ${t.message??""}`.trim());return te.parse({...o,resolvedPaths:{lib:await I(o.aliases.lib,t),components:await I(o.aliases.components,t)}})}async function ne(e){try{let o=await oe.search(e);return o?C.parse(o.config):null}catch{throw new Error(`Invalid configuration found in ${e}/components.json.`)}}import{detect as re}from"@antfu/ni";async function L(e){let o=await re({programmatic:!0,cwd:e});return o==="yarn@berry"?"yarn":o==="pnpm@6"?"pnpm":o??"npm"}import P from"chalk";var a={error(...e){console.log(P.red(...e))},warn(...e){console.log(P.yellow(...e))},info(...e){console.log(P.cyan(...e))},success(...e){console.log(P.green(...e))},break(){console.log("")}};function d(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 ie from"chalk";import{promises as se}from"fs";import ae from"ora";import ce from"path";import W from"prompts";async function z(e){let o=n=>ie.cyan(n),t=await W([{type:"text",name:"components",message:`Configure the import alias for ${o("components")}:`,initial:$},{type:"text",name:"lib",message:`Configure the import alias for ${o("lib")}:`,initial:E}]),r=C.parse({aliases:{lib:t.lib||$,components:t.components||E}}),{proceed:i}=await W({type:"confirm",name:"proceed",message:`Write configuration to ${o("components.json")}. Proceed?`,initial:!0});if(i){a.info("");let n=ae("Writing components.json...").start(),s=ce.resolve(e,"components.json");await se.writeFile(s,JSON.stringify(r,null,2),"utf8"),n.succeed()}return await S(e,r)}import h from"chalk";import{Command as pe}from"commander";import{execa as me}from"execa";import{existsSync as y,promises as x}from"fs";import le from"ora";import p from"path";import O from"prompts";import{fileURLToPath as de}from"url";import{z as w}from"zod";var u=[{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",dependencies:["text"],icons:[],npmPackages:[],paths:[{from:"./node_modules/@rnr/reusables/src/components/ui/alert.tsx",to:{folder:"ui",file:"alert.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 U(e,o=new Set){let t=u.find(i=>i.name===e);if(!t)return[];o.add(e);let r=t.dependencies.slice();return t.dependencies.forEach(i=>{if(!o.has(i)){let n=U(i,o);r=r.concat(n)}}),r}var j="invalid component";function G(e){let o=new Set;if(e.some(t=>!u.find(r=>r.name===t)))throw new Error(j);return e.forEach(t=>{let r=U(t);r.unshift(t),r.forEach(i=>{o.add(i)})}),Array.from(o).map(t=>{let r=u.find(i=>i.name===t);if(!r)throw new Error(j);return r})}var fe=de(import.meta.url),V=p.dirname(fe),ue=w.object({components:w.array(w.string()).optional(),overwrite:w.boolean(),cwd:w.string(),path:w.string().optional()}),B=new pe().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=ue.parse({components:e,...o}),r=p.resolve(t.cwd);y(r)||(a.error(`The path ${r} does not exist. Please try again.`),process.exit(1));let i=await M(r);i||(i=await z(r));let n=t.components??[];if(!n?.length){let{components:l}=await O({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:u.map(k=>({title:k.name,value:k.name,selected:!1}))});n=l}n?.length||(a.warn("No components selected. Exiting."),process.exit(0));let s=le("Installing components...").start(),m=[];try{m=G(n)}catch(l){l instanceof Error&&l.message===j&&(a.error(`Invalid component(s): ${n.filter(k=>!u.find(Q=>Q.name===k)).join(", ")}`),process.exit(1)),a.error(l)}let c=[];for(let l of m)s.text=`Installing ${l.name}...`,await ge(l,l.paths,i,s,t.overwrite),c.push(...l.npmPackages);let b=await L(r),T=Array.from(new Set(c));T.length&&(s.text=`Installing ${T.join(", ")}...`,await me(b,[b==="npm"?"install":"add",...T],{cwd:r})),s.succeed("Done.")}catch(t){d(t)}});async function ge(e,o,t,r,i){for(let n of o){let s=p.join(t.resolvedPaths.components,n.to.folder);if(y(s)||await x.mkdir(s,{recursive:!0}),r.stop(),y(p.join(s,n.to.file))){let c=[n.to.folder,n.to.file].join("/");if(!i){a.info(`File already exists: ${h.bgCyan(c)} was skipped. To overwrite, run with the ${h.green("--overwrite")} flag.`);continue}let{overwrite:b}=await O({type:"confirm",name:"overwrite",message:`File already exists: ${h.yellow(c)}. Would you like to overwrite?`,initial:!1});if(!b){a.info("Skipped");continue}}r.start(`Installing ${e.name}...`);let m=n.distFrom?p.join(V,"../__generated/components",n.distFrom):p.join(V,"../__generated/components",n.to.folder,n.to.file);try{let c=await x.readFile(p.resolve(m),"utf8");await x.writeFile(p.join(s,n.to.file),he(c,t.aliases.components,t.aliases.lib))}catch(c){d(c)}}for(let n of e.icons??[]){let s=p.resolve(t.resolvedPaths.lib,"icons");if(!y(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,11 +12,11 @@ cssInterop(icon, {
|
|
|
12
12
|
},
|
|
13
13
|
},
|
|
14
14
|
});
|
|
15
|
-
}`)}catch(
|
|
15
|
+
}`)}catch(m){d(m)}}if(y(p.join(s,`${n}.tsx`))){let m=p.join(s,`${n}.tsx`);if(!i){a.info(`File already exists: ${h.bgCyan(`${n}.tsx`)} was skipped. To overwrite, run with the ${h.green("--overwrite")} flag.`);continue}let{overwrite:c}=await O({type:"confirm",name:"overwrite",message:`File already exists: ${h.yellow(m)}. Would you like to overwrite?`,initial:!1});if(!c){a.info(`Skipped ${n}.tsx`);continue}}r.start(`Adding the ${n} icon...`);try{await x.writeFile(p.join(s,`${n}.tsx`),`import { ${n} } from 'lucide-react-native';
|
|
16
16
|
import { iconWithClassName } from './iconWithClassName';
|
|
17
|
-
iconWithClassName(${
|
|
18
|
-
export { ${
|
|
17
|
+
iconWithClassName(${n});
|
|
18
|
+
export { ${n} };`)}catch(m){d(m)}}}function he(e,o,t){return e.replace("./typography",`${o}/ui/typography`).replace("./text",`${o}/ui/text`).replaceAll("../../components",o).replaceAll("../../lib",t)}import{existsSync as q,promises as v}from"fs";import _ from"path";async function R(e,o,t={ignore:[],renameTemplateFiles:!1}){if(!q(e))throw new Error(`Source folder does not exist: ${e}`);q(o)||await v.mkdir(o,{recursive:!0});let r=await v.readdir(e,{withFileTypes:!0});for(let i of r){let n=_.join(e,i.name),s=_.join(o,i.name);t.ignore.includes(i.name)||(i.isDirectory()?await R(n,s,t):i.isFile()&&(t.renameTemplateFiles&&i.name==="gitignore-template"?await v.copyFile(n,_.join(o,".gitignore")):t.renameTemplateFiles&&i.name==="npmrc-template"?await v.copyFile(n,_.join(o,".npmrc")):await v.copyFile(n,s)))}}import J from"chalk";import{execSync as D}from"child_process";import{Command as xe}from"commander";import{execa as H}from"execa";import{existsSync as F,promises as A}from"fs";import we from"ora";import g from"path";import N from"prompts";import{fileURLToPath as ye}from"url";var ve=ye(import.meta.url),be=g.dirname(ve),K=new xe().name("init").description("Initialize a new React Native Reusables project").action(async()=>{try{let e=process.cwd();if(F(e)&&F(g.join(e,"package.json"))){let{option:c}=await N({type:"select",name:"option",message:"Package.json found. How would you like to proceed?",choices:[{title:"Initialize a new project",value:"new-project"},{title:"Cancel",value:"cancel"}],initial:!1});c==="cancel"&&(a.info("Installation cancelled."),process.exit(0))}let{projectPath:o}=await N({type:"text",name:"projectPath",message:"Enter the project name or relative path (e.g., 'my-app' or './apps/my-app'):",initial:"./my-app"}),{packageManager:t}=await N({type:"select",name:"packageManager",message:"Which package manager would you like the CLI to use?",choices:[{title:"npm",value:"npm"},{title:"yarn",value:"yarn"},{title:"pnpm",value:"pnpm"},{title:"bun",value:"bun"},{title:"None.",value:"none"}]}),r=g.basename(o),i=we(`Initializing ${r}...`).start(),n=g.join(e,o);F(n)||await A.mkdir(n,{recursive:!0});let s=[];t!=="pnpm"&&s.push("npmrc-template"),await R(g.join(be,"../__generated/starter-base"),n,{ignore:s,renameTemplateFiles:!0}),await Promise.all([X(g.join(n,"app.json"),"starter-base",r),X(g.join(n,"package.json"),"@rnr/starter-base",r)]),t!=="none"&&(i.start(`Installing dependencies using ${t} (this may take a few minutes)...`),await H(t,["install"],{cwd:n}),i.text="Running expo doctor to ensure package compatibility...",await H("npx",["expo","install","--fix"],{cwd:n})),i.stop();let{gitInit:m}=await N({type:"confirm",name:"gitInit",message:"Would you like to initialize a Git repository?"});if(m){i.start("Initializing Git repository...");try{D("git init",{stdio:"inherit",cwd:n}),D("git add -A",{stdio:"inherit",cwd:n}),D('git commit -m "initialize project with @react-native-reusables/cli"',{stdio:"inherit",cwd:n}),i.succeed("Git repository initialized successfully.")}catch(c){a.error("Failed to initialize Git repository:",c)}}i.succeed("New project initialized successfully!"),console.log(`
|
|
19
19
|
To get started, run the following commands:
|
|
20
|
-
`),console.log(
|
|
21
|
-
|
|
20
|
+
`),console.log(J.cyan(`cd ${o}`)),t!=="none"&&console.log(J.cyan(`${t} ${t==="npm"||t==="bun"?"run ":""}dev`)),t==="none"&&(console.log("Install the dependencies manually using your package manager of choice."),console.log("Then run the dev script.")),console.log(`
|
|
21
|
+
Additional resources:`),console.log("- Documentation: https://rnr-docs.vercel.app"),console.log("- Report issues: https://github.com/mrzachnugent/react-native-reusables/issues"),process.exit(0)}catch(e){d(e)}});async function X(e,o,t){try{F(e)||(a.error(`The path ${e} does not exist.`),process.exit(1));let i=(await A.readFile(e,"utf8")).replaceAll(o,t);await A.writeFile(e,i)}catch(r){d(r)}}import{Command as ke}from"commander";process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function Ce(){let e=new ke().name("@react-native-reusables/cli").description("add components and dependencies to your project");e.addCommand(B),e.addCommand(K),e.parse()}Ce();
|
|
22
22
|
//# 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/utils/prompt-for-config.ts","../src/commands/add.ts","../src/items/components.ts","../src/items/index.ts","../src/utils/copy-folder.ts","../src/commands/init.ts","../src/index.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 DEFAULT_COMPONENTS,\n DEFAULT_LIB,\n rawConfigSchema,\n resolveConfigPaths,\n} from '@/src/utils/get-config';\nimport { logger } from '@/src/utils/logger';\nimport chalk from 'chalk';\nimport { promises as fs } from 'fs';\nimport ora from 'ora';\nimport path from 'path';\nimport prompts from 'prompts';\n\nexport async 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 || DEFAULT_COMPONENTS,\n components: options.components || DEFAULT_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}\n","import { Config, getConfig } 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 { promptForConfig } from '@/src/utils/prompt-for-config';\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 { fileURLToPath } from 'url';\nimport { z } from 'zod';\nimport { Component, INVALID_COMPONENT_ERROR, getAllComponentsToWrite } from '../items';\nimport { COMPONENTS } from '../items/components';\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","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',\n dependencies: ['text'],\n icons: [],\n npmPackages: [],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/alert.tsx',\n to: {\n folder: 'ui',\n file: 'alert.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, promises as fs } from 'fs';\nimport path from 'path';\n\nexport async function copyFolder(\n src: string,\n dest: string,\n options: { ignore: string[]; renameTemplateFiles: boolean } = {\n ignore: [],\n renameTemplateFiles: false,\n }\n) {\n if (!existsSync(src)) {\n throw new Error(`Source folder does not exist: ${src}`);\n }\n\n if (!existsSync(dest)) {\n await fs.mkdir(dest, { recursive: true });\n }\n\n const entries = await fs.readdir(src, { withFileTypes: true });\n\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name);\n const destPath = path.join(dest, entry.name);\n\n if (options.ignore.includes(entry.name)) {\n continue;\n }\n\n if (entry.isDirectory()) {\n await copyFolder(srcPath, destPath, options);\n } else if (entry.isFile()) {\n if (options.renameTemplateFiles && entry.name === 'gitignore-template') {\n await fs.copyFile(srcPath, path.join(dest, '.gitignore'));\n } else if (options.renameTemplateFiles && entry.name === 'npmrc-template') {\n await fs.copyFile(srcPath, path.join(dest, '.npmrc'));\n } else {\n await fs.copyFile(srcPath, destPath);\n }\n }\n }\n}\n","import { copyFolder } from '@/src/utils/copy-folder';\nimport { getConfig } from '@/src/utils/get-config';\nimport { handleError } from '@/src/utils/handle-error';\nimport { logger } from '@/src/utils/logger';\nimport { promptForConfig } from '@/src/utils/prompt-for-config';\nimport chalk from 'chalk';\nimport { execSync } from 'child_process';\nimport { Command } from 'commander';\nimport { execa } from 'execa';\nimport glob from 'fast-glob';\nimport { existsSync, promises as fs } from 'fs';\nimport ora, { Ora } from 'ora';\nimport path from 'path';\nimport prompts from 'prompts';\nimport { fileURLToPath } from 'url';\nimport { z } from 'zod';\n\nconst filePath = fileURLToPath(import.meta.url);\nconst fileDir = path.dirname(filePath);\n\nconst REQUIRED_DEPENDENCIES = [\n 'nativewind',\n 'expo-navigation-bar',\n 'tailwindcss',\n 'tailwindcss-animate',\n 'class-variance-authority',\n 'clsx',\n 'tailwind-merge',\n 'react-native-svg',\n 'react-native-reanimated',\n 'react-native-safe-area-context',\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\nconst initOptionsSchema = z.object({\n cwd: z.string(),\n overwrite: z.boolean(),\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\nasync function validateProjectDirectory(cwd: string) {\n if (existsSync(cwd) && existsSync(path.join(cwd, 'package.json'))) {\n const { option } = await prompts({\n type: 'select',\n name: 'option',\n message:\n 'Package.json found. How would you like to proceed? (Selecting \"Cancel\" will exit the process)',\n choices: [\n { title: 'Automatically configure your existing project', value: 'existing-project' },\n { title: 'Init new project', value: 'new-project' },\n { title: 'Cancel', value: 'cancel' },\n ],\n initial: false,\n });\n\n if (option === 'cancel') {\n logger.info('Installation cancelled.');\n process.exit(0);\n }\n\n if (option === 'existing-project') {\n return;\n }\n }\n\n const { projectName } = await prompts({\n type: 'text',\n name: 'projectName',\n message: `What is the name of your project?`,\n initial: 'starter-base',\n });\n\n const { packageManager } = await prompts({\n type: 'select',\n name: 'packageManager',\n message: 'Which package manager would you like to use?',\n choices: [\n { title: 'npm', value: 'npm' },\n { title: 'yarn', value: 'yarn' },\n { title: 'pnpm', value: 'pnpm' },\n { title: 'bun', value: 'bun' },\n ],\n });\n\n const spinner = ora(`Initializing ${projectName}...`).start();\n\n const projectPath = path.join(cwd, projectName);\n if (!existsSync(projectPath)) {\n await fs.mkdir(projectPath, { recursive: true });\n }\n\n const filesToIgnore = [];\n\n if (packageManager !== 'pnpm') {\n filesToIgnore.push('npmrc-template');\n }\n\n await copyFolder(path.join(fileDir, '../__generated/starter-base'), projectPath, {\n ignore: filesToIgnore,\n renameTemplateFiles: true,\n });\n\n await Promise.all([\n replaceAllInJsonFile(path.join(projectPath, 'app.json'), 'starter-base', projectName),\n replaceAllInJsonFile(path.join(projectPath, 'package.json'), '@rnr/starter-base', projectName),\n ]);\n\n spinner.start('Installing dependencies...');\n await execa(packageManager, ['install'], {\n cwd: projectPath,\n });\n spinner.text = 'Verifying and updating any invalid package versions if needed...';\n await execa('npx', ['expo', 'install', '--fix'], {\n cwd: projectPath,\n });\n\n spinner.succeed('New project initialized successfully!');\n console.log(`\\nTo get started, run the following commands:\\n`);\n console.log(chalk.cyan(`cd ${projectName}`));\n console.log(\n chalk.cyan(\n `${packageManager} ${packageManager === 'npm' || packageManager === 'bun' ? 'run ' : ''}dev`\n )\n );\n process.exit(0);\n}\n\nasync function replaceAllInJsonFile(path: string, searchValue: string, replaceValue: string) {\n try {\n if (!existsSync(path)) {\n logger.error(`The path ${path} does not exist.`);\n process.exit(1);\n }\n\n const jsonValue = await fs.readFile(path, 'utf8');\n const replacedValue = jsonValue.replaceAll(searchValue, replaceValue);\n\n await fs.writeFile(path, replacedValue);\n } catch (error) {\n handleError(error);\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 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 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.join(fileDir, '../__generated/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\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\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","#!/usr/bin/env node\nimport { add } from '@/src/commands/add';\nimport { init } from '@/src/commands/init';\n\nimport { Command } from 'commander';\n\nprocess.on('SIGINT', () => process.exit(0));\nprocess.on('SIGTERM', () => process.exit(0));\n\nasync function main() {\n const program = new Command()\n .name('@react-native-reusables/cli')\n .description('add components and dependencies to your project');\n\n program.addCommand(add);\n program.addCommand(init);\n\n program.parse();\n}\n\nmain();\n"],"mappings":"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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","fs","ora","path","prompts","promptForConfig","cwd","highlight","text","options","DEFAULT_COMPONENTS","DEFAULT_LIB","config","rawConfigSchema","proceed","logger","spinner","targetPath","resolveConfigPaths","chalk","Command","execa","existsSync","fs","ora","path","prompts","fileURLToPath","z","COMPONENTS","getComponentDependencies","componentName","visited","component","COMPONENTS","comp","dependencies","dependency","childDependencies","INVALID_COMPONENT_ERROR","getAllComponentsToWrite","componentNames","uniqueComponents","allDependencies","dep","filePath","fileURLToPath","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","existsSync","fs","path","copyFolder","src","dest","options","entries","entry","srcPath","destPath","chalk","execSync","Command","execa","glob","existsSync","fs","ora","path","prompts","fileURLToPath","z","filePath","fileDir","REQUIRED_DEPENDENCIES","TEMPLATE_FILES","initOptionsSchema","init","opts","options","cwd","validateProjectDirectory","checkGitStatus","initializeProject","error","handleError","option","logger","projectName","packageManager","spinner","projectPath","filesToIgnore","copyFolder","replaceAllInJsonFile","searchValue","replaceValue","replacedValue","shouldPromptGitWarning","proceed","overwrite","config","getConfig","promptForConfig","templatesDir","installDependencies","updateTsConfig","file","copyTemplateFile","updateLayoutFile","NON_PATH_ALIAS_BASES","tsconfigPath","tsconfig","componentBase","libBase","tsconfigPaths","targetDir","overwriteFlag","targetPath","layoutFiles","layoutPath","content","Command","main","program","add","init"]}
|
|
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/utils/prompt-for-config.ts","../src/commands/add.ts","../src/items/components.ts","../src/items/index.ts","../src/utils/copy-folder.ts","../src/commands/init.ts","../src/index.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' | 'deno'> {\n const packageManager = await detect({ programmatic: true, cwd: targetDir });\n\n if (packageManager === 'yarn@berry') {\n return 'yarn';\n }\n if (packageManager === 'pnpm@6') {\n return 'pnpm';\n }\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 DEFAULT_COMPONENTS,\n DEFAULT_LIB,\n rawConfigSchema,\n resolveConfigPaths,\n} from '@/src/utils/get-config';\nimport { logger } from '@/src/utils/logger';\nimport chalk from 'chalk';\nimport { promises as fs } from 'fs';\nimport ora from 'ora';\nimport path from 'path';\nimport prompts from 'prompts';\n\nexport async 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 || DEFAULT_COMPONENTS,\n components: options.components || DEFAULT_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}\n","import { Config, getConfig } 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 { promptForConfig } from '@/src/utils/prompt-for-config';\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 { fileURLToPath } from 'url';\nimport { z } from 'zod';\nimport { Component, INVALID_COMPONENT_ERROR, getAllComponentsToWrite } from '../items';\nimport { COMPONENTS } from '../items/components';\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","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',\n dependencies: ['text'],\n icons: [],\n npmPackages: [],\n paths: [\n {\n from: './node_modules/@rnr/reusables/src/components/ui/alert.tsx',\n to: {\n folder: 'ui',\n file: 'alert.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, promises as fs } from 'fs';\nimport path from 'path';\n\nexport async function copyFolder(\n src: string,\n dest: string,\n options: { ignore: string[]; renameTemplateFiles: boolean } = {\n ignore: [],\n renameTemplateFiles: false,\n }\n) {\n if (!existsSync(src)) {\n throw new Error(`Source folder does not exist: ${src}`);\n }\n\n if (!existsSync(dest)) {\n await fs.mkdir(dest, { recursive: true });\n }\n\n const entries = await fs.readdir(src, { withFileTypes: true });\n\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name);\n const destPath = path.join(dest, entry.name);\n\n if (options.ignore.includes(entry.name)) {\n continue;\n }\n\n if (entry.isDirectory()) {\n await copyFolder(srcPath, destPath, options);\n } else if (entry.isFile()) {\n if (options.renameTemplateFiles && entry.name === 'gitignore-template') {\n await fs.copyFile(srcPath, path.join(dest, '.gitignore'));\n } else if (options.renameTemplateFiles && entry.name === 'npmrc-template') {\n await fs.copyFile(srcPath, path.join(dest, '.npmrc'));\n } else {\n await fs.copyFile(srcPath, destPath);\n }\n }\n }\n}\n","import { copyFolder } from '@/src/utils/copy-folder';\nimport { handleError } from '@/src/utils/handle-error';\nimport { logger } from '@/src/utils/logger';\nimport chalk from 'chalk';\nimport { execSync } from 'child_process';\nimport { Command } from 'commander';\nimport { execa } from 'execa';\nimport { existsSync, promises as fs } from 'fs';\nimport ora from 'ora';\nimport path from 'path';\nimport prompts from 'prompts';\nimport { fileURLToPath } from 'url';\n\nconst filePath = fileURLToPath(import.meta.url);\nconst fileDir = path.dirname(filePath);\n\nexport const init = new Command()\n .name('init')\n .description('Initialize a new React Native Reusables project')\n .action(async () => {\n try {\n const cwd = process.cwd();\n\n if (existsSync(cwd) && existsSync(path.join(cwd, 'package.json'))) {\n const { option } = await prompts({\n type: 'select',\n name: 'option',\n message: 'Package.json found. How would you like to proceed?',\n choices: [\n { title: 'Initialize a new project', value: 'new-project' },\n { title: 'Cancel', value: 'cancel' },\n ],\n initial: false,\n });\n\n if (option === 'cancel') {\n logger.info('Installation cancelled.');\n process.exit(0);\n }\n }\n\n const { projectPath } = await prompts({\n type: 'text',\n name: 'projectPath',\n message: `Enter the project name or relative path (e.g., 'my-app' or './apps/my-app'):`,\n initial: './my-app',\n });\n\n const { packageManager } = await prompts({\n type: 'select',\n name: 'packageManager',\n message: 'Which package manager would you like the CLI to use?',\n choices: [\n { title: 'npm', value: 'npm' },\n { title: 'yarn', value: 'yarn' },\n { title: 'pnpm', value: 'pnpm' },\n { title: 'bun', value: 'bun' },\n { title: 'None.', value: 'none' },\n ],\n });\n\n const projectName = path.basename(projectPath);\n\n const spinner = ora(`Initializing ${projectName}...`).start();\n\n const fullProjectPath = path.join(cwd, projectPath);\n if (!existsSync(fullProjectPath)) {\n await fs.mkdir(fullProjectPath, { recursive: true });\n }\n\n const filesToIgnore = [];\n\n if (packageManager !== 'pnpm') {\n filesToIgnore.push('npmrc-template');\n }\n\n await copyFolder(path.join(fileDir, '../__generated/starter-base'), fullProjectPath, {\n ignore: filesToIgnore,\n renameTemplateFiles: true,\n });\n\n await Promise.all([\n replaceAllInJsonFile(path.join(fullProjectPath, 'app.json'), 'starter-base', projectName),\n replaceAllInJsonFile(\n path.join(fullProjectPath, 'package.json'),\n '@rnr/starter-base',\n projectName\n ),\n ]);\n\n if (packageManager !== 'none') {\n spinner.start(\n `Installing dependencies using ${packageManager} (this may take a few minutes)...`\n );\n await execa(packageManager, ['install'], {\n cwd: fullProjectPath,\n });\n spinner.text = 'Running expo doctor to ensure package compatibility...';\n await execa('npx', ['expo', 'install', '--fix'], {\n cwd: fullProjectPath,\n });\n }\n\n spinner.stop();\n const { gitInit } = await prompts({\n type: 'confirm',\n name: 'gitInit',\n message: 'Would you like to initialize a Git repository?',\n });\n\n if (gitInit) {\n spinner.start('Initializing Git repository...');\n try {\n execSync('git init', { stdio: 'inherit', cwd: fullProjectPath });\n\n execSync('git add -A', { stdio: 'inherit', cwd: fullProjectPath });\n execSync('git commit -m \"initialize project with @react-native-reusables/cli\"', {\n stdio: 'inherit',\n cwd: fullProjectPath,\n });\n\n spinner.succeed('Git repository initialized successfully.');\n } catch (error) {\n logger.error('Failed to initialize Git repository:', error);\n }\n }\n\n spinner.succeed('New project initialized successfully!');\n console.log(`\\nTo get started, run the following commands:\\n`);\n console.log(chalk.cyan(`cd ${projectPath}`));\n if (packageManager !== 'none') {\n console.log(\n chalk.cyan(\n `${packageManager} ${\n packageManager === 'npm' || packageManager === 'bun' ? 'run ' : ''\n }dev`\n )\n );\n }\n if (packageManager === 'none') {\n console.log('Install the dependencies manually using your package manager of choice.');\n console.log('Then run the dev script.');\n }\n console.log('\\nAdditional resources:');\n console.log('- Documentation: https://rnr-docs.vercel.app');\n console.log('- Report issues: https://github.com/mrzachnugent/react-native-reusables/issues');\n process.exit(0);\n } catch (error) {\n handleError(error);\n }\n });\n\nasync function replaceAllInJsonFile(path: string, searchValue: string, replaceValue: string) {\n try {\n if (!existsSync(path)) {\n logger.error(`The path ${path} does not exist.`);\n process.exit(1);\n }\n\n const jsonValue = await fs.readFile(path, 'utf8');\n const replacedValue = jsonValue.replaceAll(searchValue, replaceValue);\n\n await fs.writeFile(path, replacedValue);\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\nprocess.on('SIGINT', () => process.exit(0));\nprocess.on('SIGTERM', () => process.exit(0));\n\nasync function main() {\n const program = new Command()\n .name('@react-native-reusables/cli')\n .description('add components and dependencies to your project');\n\n program.addCommand(add);\n program.addCommand(init);\n\n program.parse();\n}\n\nmain();\n"],"mappings":"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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","fs","ora","path","prompts","promptForConfig","cwd","highlight","text","options","DEFAULT_COMPONENTS","DEFAULT_LIB","config","rawConfigSchema","proceed","logger","spinner","targetPath","resolveConfigPaths","chalk","Command","execa","existsSync","fs","ora","path","prompts","fileURLToPath","z","COMPONENTS","getComponentDependencies","componentName","visited","component","COMPONENTS","comp","dependencies","dependency","childDependencies","INVALID_COMPONENT_ERROR","getAllComponentsToWrite","componentNames","uniqueComponents","allDependencies","dep","filePath","fileURLToPath","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","existsSync","fs","path","copyFolder","src","dest","options","entries","entry","srcPath","destPath","chalk","execSync","Command","execa","existsSync","fs","ora","path","prompts","fileURLToPath","filePath","fileDir","init","cwd","option","logger","projectPath","packageManager","projectName","spinner","fullProjectPath","filesToIgnore","copyFolder","replaceAllInJsonFile","gitInit","error","handleError","searchValue","replaceValue","replacedValue","Command","main","program","add","init"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@react-native-reusables/cli",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.7",
|
|
4
4
|
"description": "Add react-native-reusables to your project.",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"exports": "./dist/index.js",
|
|
34
34
|
"bin": "./dist/index.js",
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@antfu/ni": "^
|
|
36
|
+
"@antfu/ni": "^24.3.0",
|
|
37
37
|
"@babel/core": "^7.26.0",
|
|
38
38
|
"@babel/parser": "^7.22.6",
|
|
39
39
|
"@babel/plugin-transform-typescript": "^7.22.5",
|
|
@@ -65,8 +65,8 @@
|
|
|
65
65
|
"tsx": "^4.7.1",
|
|
66
66
|
"type-fest": "^3.8.0",
|
|
67
67
|
"typescript": "^5.3.3",
|
|
68
|
-
"@rnr/
|
|
69
|
-
"@rnr/
|
|
68
|
+
"@rnr/starter-base": "1.0.0",
|
|
69
|
+
"@rnr/reusables": "0.0.0"
|
|
70
70
|
},
|
|
71
71
|
"scripts": {
|
|
72
72
|
"gen": "rm -rf __generated && tsx scripts/generate-source-files.ts",
|