saaj
Version:
Add Saaj UI components, hooks, types and utilities to your project
3 lines • 7.26 kB
JavaScript
import{Command as ie}from"commander";import{Command as B}from"commander";import o from"chalk";import O from"fs";import y from"yocto-spinner";import{input as f}from"@inquirer/prompts";import C from"shelljs";import{detect as N}from"package-manager-detector";async function w(){return(await N())?.name??"npm"}async function g(...e){let t=await w();return C.exec(`${t} ${t==="npm"?"install":"add"} ${e.join(" ")}`)}async function T(...e){let t=await w();return C.exec(`${t} ${t==="npm"?"install":"add"} -D ${e.join(" ")}`)}import b from"chalk";import j from"fs";import L from"path";import k from"yocto-spinner";import I from"fs";import H from"path";var _=process.env.NEXT_PUBLIC_APP_URL??"https://saaj-ui.vercel.app/schema.json",R="components/ui",S="hooks",E="styles",$="types",D="utils",m=H.join(process.cwd(),"components.json");function r(){return I.existsSync(m)?JSON.parse(I.readFileSync(m,"utf8")):null}function h(e){let t=r();return!t||!e?!1:typeof e=="object"&&"dirs"in e&&typeof e.dirs=="object"&&"components"in e.dirs&&"hooks"in e.dirs&&"styles"in e.dirs&&"types"in e.dirs&&"utils"in e.dirs&&typeof e.$schema=="string"&&e.$schema===t?.$schema}import v from"fs";import J from"path";var A=J.join(process.cwd(),"package.json");function P(){return d()?JSON.parse(v.readFileSync(A,"utf8")):null}function d(){return v.existsSync(A)}var W=process.env.NEXT_PUBLIC_APP_URL??"https://saaj-ui.vercel.app";async function a(e,t){let s=await fetch(`${W}/api/registry/items?names=${e.join(",")}&${t?`type=${t}`:""}`),n=await s.json();return s.ok||(console.error(n?.error||"Error fetching registry items"),process.exit(1)),n}async function c(e,t){let s=t||r();s||(console.error(`No ${b.yellow("components.json")} file found. Please run ${b.cyan("init")} first.`),process.exit(1));for(let n of e)await M(n,s)}async function M(e,t){let s=G(e.type,t);if(j.existsSync(L.join(s,e.name)))return;let u=k({text:`Adding ${e.name}`}).start();if(j.existsSync(s)||j.mkdirSync(s,{recursive:!0}),e.dependencies?.length){let i=Y(...e.dependencies);if(i.length>0){let l=k({text:"Installing dependencies..."}).start();await g(...i),l.success()}}if(e.devDependencies?.length){let i=V(...e.devDependencies);if(i.length>0){let l=k({text:"Installing dev dependencies..."}).start();await T(...i),l.success()}}j.writeFileSync(L.join(s,e.name),e.code,"utf8"),u.success()}function G(e,t){switch(e){case"component":return t.dirs.components;case"hook":return t.dirs.hooks;case"style":return t.dirs.styles;case"type":return t.dirs.types;case"utility":return t.dirs.utils}}function Y(...e){let t=P();return e.filter(s=>t?.dependencies?!t.dependencies[s]:!0)}function V(...e){let t=P();return e.filter(s=>t?.devDependencies?!t.devDependencies[s]:!0)}var K=["react-native-unistyles","@radix-ui/colors"],U=new B().name("init").description("initialize project setup and install dependencies").action(async()=>{try{await X()}catch(e){console.error(e),process.exit(1)}});async function X(){d()||(console.error(`No ${o.yellow("package.json")} file, please create a react-native project first and then run ${o.cyan("init")}.`),process.exit(1)),await q();let e=y({text:"Installing dependencies..."}).start();await g(...K),e.success(),await z(),await Q(),await Z(),await ee(),console.log(`${o.green("Success!")} Setup completed. You may now add components.`)}async function q(){if(O.existsSync(m)){let l=r();if(!h(l))console.error(`Invalid ${o.yellow("components.json")} file found. To start over, remove ${o.yellow("components.json")} file and run ${o.cyan("init")} again.`),process.exit(1);else return console.log(`Valid ${o.cyan("components.json")} file found.`),l}let e=await f({message:`Where would you like to keep your ${o.cyan("components")}?`,default:R}),t=await f({message:`Where would you like to keep your ${o.cyan("hooks")}?`,default:S}),s=await f({message:`Where would you like to keep your ${o.cyan("utils")}?`,default:D}),n=await f({message:`Where would you like to keep your ${o.cyan("themes configuration")}?`,default:E}),u=await f({message:`Where would you like to keep your ${o.cyan("types")}?`,default:$}),i={$schema:_,dirs:{components:e,hooks:t,styles:n,types:u,utils:s}};return O.writeFileSync(m,JSON.stringify(i,null,2)),i}async function z(){let e=y({text:"Configuring types..."}).start(),s=await a(["components.ts"],"type");await c(s),e.success()}async function Q(){let e=y({text:"Configuring styles..."}).start(),s=await a(["tokens.ts","themes.ts","unistyles.ts"],"style");await c(s),e.success()}async function Z(){let e=y({text:"Configuring utils..."}).start(),s=await a(["composeRefs.ts","genericForwardRef.ts"],"utility");await c(s),e.success()}async function ee(){let e=y({text:"Configuring hooks..."}).start(),s=await a(["useControllableState.ts"],"hook");await c(s),e.success()}import{Command as te}from"commander";import p from"chalk";var F=new te().name("add").description("add a component, hook, type, utility, or style to your project").argument("<items...>","the items(components, hooks, types, utils, styles) to add").option("-C, --component","add a component",!1).option("-H, --hook","add a hook",!1).option("-T, --type","add a type",!1).option("-U, --utility","add a utility",!1).option("-S, --style","add a style",!1).action(async(e,t)=>{d()||(console.error(`No ${p.yellow("package.json")} file found, please create a react-native project first and then run ${p.cyan("init")}.`),process.exit(1));let s=se(),n=oe(t),u=await a(e,n);await c(u,s)});function se(){let e=r();if(!e)console.error(`No ${p.yellow("components.json")} file found. Please run ${p.cyan("init")} first.`),process.exit(1);else if(!h(e))console.error(`Invalid ${p.yellow("components.json")} file found. To start over, remove ${p.yellow("components.json")} file and run ${p.cyan("init")} again.`),process.exit(1);else return e}function oe(e){if(e.component)return"component";if(e.hook)return"hook";if(e.type)return"type";if(e.utility)return"utility";if(e.style)return"style"}var x={name:"saaj",version:"1.0.0",description:"Add Saaj UI components, hooks, types and utilities to your project",publishConfig:{access:"public"},author:{name:"sarabjit20s",url:"https://github.com/sarabjit20s"},repository:{type:"git",url:"https://github.com/sarabjit20s/saaj-ui",directory:"packages/cli"},license:"MIT",keywords:["saaj","saaj-ui","components","react-native","expo","react-native-unistyles","unistyles"],type:"module",files:["dist"],exports:"./dist/index.js",bin:"./dist/index.js",scripts:{build:"tsup",dev:"tsup --watch",format:'prettier --write "**/*.{ts,tsx,md}"',"pub:beta":"pnpm build && pnpm publish --no-git-checks --access public --tag beta","pub:latest":"pnpm build && pnpm publish --no-git-checks --access public"},dependencies:{"@inquirer/prompts":"^7.2.3","@saaj-ui/registry":"workspace:*",chalk:"^5.4.1",commander:"^13.0.0","package-manager-detector":"^0.2.8",shelljs:"^0.8.5","yocto-spinner":"^0.1.2"},devDependencies:{"@types/node":"22.10.2","@types/shelljs":"^0.8.15",tsup:"^8.3.5",typescript:"^5.7.3"}};process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function re(){let e=new ie().name(x.name).description(x.description).version(x.version);e.addCommand(U).addCommand(F),await e.parseAsync()}re();
//# sourceMappingURL=index.js.map