@seed-design/cli 0.0.1 → 0.0.3

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/bin/index.mjs CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- import*as w from"@clack/prompts";import{cosmiconfig as ce}from"cosmiconfig";import{execa as pe}from"execa";import I from"fs";import D from"path";import{z as x}from"zod";import ie from"picocolors";var y=e=>ie.cyan(e);import{detect as ae}from"@antfu/ni";async function M(e){let t=await ae({programmatic:!0,cwd:e});return t==="yarn@berry"?"yarn":t==="pnpm@6"?"pnpm":t==="bun"?"bun":t==="deno"?"deno":t??"npm"}var F="seed-design",me=ce(F,{searchPlaces:[`${F}.json`]}),_=x.object({$schema:x.string().optional(),rsc:x.coerce.boolean().default(!1),tsx:x.coerce.boolean().default(!0),path:x.string()}).strict(),le=_.extend({resolvedUIPaths:x.string(),resolvedLibPaths:x.string()});async function J(e){let t=await ge(e);return t?await fe(e,t):null}async function fe(e,t){let r=D.resolve(e,t.path);I.existsSync(r)||I.mkdirSync(r,{recursive:!0});let n=D.join(r,"ui"),o=D.join(r,"lib");return I.existsSync(n)||I.mkdirSync(n,{recursive:!0}),I.existsSync(o)||I.mkdirSync(o,{recursive:!0}),le.parse({...t,resolvedUIPaths:n,resolvedLibPaths:o})}async function ge(e){try{let t=await me.search(e);return _.parse(t.config)}catch{if(w.log.error("\uD504\uB85C\uC81D\uD2B8 \uB8E8\uD2B8 \uACBD\uB85C\uC5D0 `seed-design.json` \uD30C\uC77C\uC774 \uC5C6\uC5B4\uC694."),await w.confirm({message:"seed-design.json \uD30C\uC77C\uC744 \uC0DD\uC131\uD558\uC2DC\uACA0\uC5B4\uC694?"})===!0){let r=await M(e);await pe(r,["seed-design","init","--default"],{cwd:e}),w.log.message("seed-design.json \uD30C\uC77C\uC774 \uC0DD\uC131\uB410\uC5B4\uC694.")}else w.outro(y("\uC791\uC5C5\uC774 \uCDE8\uC18C\uB410\uC5B4\uC694.")),process.exit(1)}}import*as R from"@clack/prompts";import{z as c}from"zod";var de=c.union([c.literal("ui"),c.literal("lib")]),N=c.object({name:c.string(),description:c.string().optional(),dependencies:c.array(c.string()).optional(),devDependencies:c.array(c.string()).optional(),innerDependencies:c.array(c.string()).optional(),files:c.array(c.string())}),U=c.array(N),ue=N.omit({files:!0}),ye=ue.extend({registries:c.array(c.object({name:c.string(),type:de,content:c.string()}))}),tt=c.array(ye);async function G(e,t,r="ui"){return await Promise.all(e.map(async o=>{try{return await(await fetch(`${t}/__registry__/${r}/${o}.json`)).json()}catch(s){let a=await fetch(`${t}/__registry__/${r}/index.json`).then(g=>g.json()),m=U.parse(a).map(g=>g.name);R.log.error(`${r}:${o} \uCEF4\uD3EC\uB10C\uD2B8\uB294 \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC5D0 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC544\uC694.`),R.log.info(`\uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uCEF4\uD3EC\uB10C\uD2B8: ${m.join(", ")}`),R.log.info(JSON.stringify({baseUrl:t,error:s.toString()},null,2)),process.exit(1)}}))}async function B(e,t,r="ui"){let[n]=await G([e],t,r);return n}async function K(e){try{let[t]=await G(["index"],e,"ui");return U.parse(t)}catch(t){R.log.error("\uB808\uC9C0\uC2A4\uD2B8\uB9AC \uC778\uB371\uC2A4\uB97C \uAC00\uC838\uC624\uB294 \uB370 \uC2E4\uD328\uD588\uC5B4\uC694."),R.log.info(JSON.stringify({baseUrl:e,error:t.toString()},null,2)),process.exit(1)}}async function V(e){let[t]=await G(["index"],e,"lib");return U.parse(t)}import{promises as Re}from"fs";import{tmpdir as be}from"os";import q from"path";import{transformFromAstSync as he}from"@babel/core";import xe from"@babel/plugin-transform-typescript";import*as $ from"recast";import{parse as we}from"@babel/parser";var Se={sourceType:"module",allowImportExportEverywhere:!0,allowReturnOutsideFunction:!0,startLine:1,tokens:!0,plugins:["asyncGenerators","bigInt","classPrivateMethods","classPrivateProperties","classProperties","classStaticBlock","decimal","decorators-legacy","doExpressions","dynamicImport","exportDefaultFrom","exportNamespaceFrom","functionBind","functionSent","importAssertions","importMeta","nullishCoalescingOperator","numericSeparator","objectRestSpread","optionalCatchBinding","optionalChaining",["pipelineOperator",{proposal:"minimal"}],["recordAndTuple",{syntaxType:"hash"}],"throwExpressions","topLevelAwait","v8intrinsic","typescript","jsx"]},X=async({sourceFile:e,config:t})=>{let r=e.getFullText();if(t.tsx)return r;let n=$.parse(r,{parser:{parse:s=>we(s,Se)}}),o=he(n,r,{cloneInputAst:!1,code:!1,ast:!0,plugins:[xe],configFile:!1});if(!o||!o.ast)throw new Error("Failed to transform JSX");return $.print(o.ast).code};import{SyntaxKind as Ie}from"ts-morph";var Y=async({sourceFile:e,config:t})=>{if(t.rsc)return e;let r=e.getFirstChildByKind(Ie.ExpressionStatement);return r?.getText()==='"use client";'&&r.remove(),e};import{Project as Ce,ScriptKind as ve}from"ts-morph";var Pe=[Y],je=new Ce({compilerOptions:{}});async function ke(e){let t=await Re.mkdtemp(q.join(be(),"seed-deisgn-"));return q.join(t,e)}async function H(e){let t=await ke(e.filename),r=je.createSourceFile(t,e.raw,{scriptKind:ve.TSX});for(let n of Pe)n({sourceFile:r,...e});return await X({sourceFile:r,...e})}import*as l from"@clack/prompts";import z from"fs-extra";import ee from"path";import De from"picocolors";import{z as b}from"zod";var Q="https://v3.seed-design.io";function W({userSelects:e,uiRegistryIndex:t,libRegistryIndex:r}){let n=[];function o({registryName:s,type:a}){if(n.some(m=>m.name===s&&m.type===a))return;n.push({type:a,name:s});let d=a==="ui"?t.find(m=>m.name===s):r.find(m=>m.name===s);if(d&&d.innerDependencies)for(let m of d.innerDependencies){let[g,k]=m.split(":");o({registryName:k,type:g})}}for(let s of e)o({registryName:s,type:"ui"});return Array.from(n)}import*as Z from"@clack/prompts";import{execa as Ae}from"execa";import Te from"picocolors";import Me from"findup-sync";import Ue from"fs-extra";var $e="package.json";function Oe(){let e=Me($e);if(!e)throw new Error("No package.json file found in the project.");return e}function O(){let e=Oe();return Ue.readJSONSync(e)}async function L({cwd:e,deps:t,dev:r=!1}){let{start:n,stop:o}=Z.spinner(),s=await M(e),a=O(),d={...a.dependencies,...a.devDependencies},m=t.filter(h=>!d[h]),g=t.filter(h=>d[h]);if(!m.length)return{installed:new Set,filtered:new Set};n(Te.gray("\uC758\uC874\uC131 \uC124\uCE58\uC911..."));let A=[s==="npm"?"install":"add",r?"-D":null,...m].filter(Boolean);try{await Ae(s,A,{cwd:e})}catch(h){console.error(`\uC758\uC874\uC131 \uC124\uCE58 \uC2E4\uD328: ${h}`),process.exit(1)}return o("\uC758\uC874\uC131 \uC124\uCE58 \uC644\uB8CC."),{installed:m,filtered:g}}var Ge=b.object({components:b.array(b.string()).optional(),cwd:b.string(),all:b.boolean(),baseUrl:b.string().optional()}),te=e=>{e.command("add [...components]","add component").option("-a, --all","Add all components",{default:!1}).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",{default:process.cwd()}).option("-u, --baseUrl <baseUrl>","the base url of the registry. defaults to the current directory.",{default:Q}).example("seed-design add action-button").example("seed-design add alert-dialog").action(async(t,r)=>{l.intro(De.bgCyan("seed-design add"));let n=Ge.parse({components:t,...r}),o=n.cwd,s=n.baseUrl,a=await J(o),d=await K(s),m=await V(s),g=n.all?d.map(f=>f.name):n.components;if(!n.components?.length&&!n.all){let f=await l.multiselect({message:"\uCD94\uAC00\uD560 \uCEF4\uD3EC\uB10C\uD2B8\uB97C \uC120\uD0DD\uD574\uC8FC\uC138\uC694 (\uC2A4\uD398\uC774\uC2A4 \uBC14\uB85C \uC5EC\uB7EC \uAC1C \uC120\uD0DD \uAC00\uB2A5)",options:d.map(i=>({label:i.name,value:i.name,hint:i.description}))});l.isCancel(f)&&(l.log.error("\uCDE8\uC18C\uB418\uC5C8\uC5B4\uC694."),process.exit(0)),g=f}g?.length||(l.log.error("\uCEF4\uD3EC\uB10C\uD2B8\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694."),process.exit(0)),l.log.message(`\uC120\uD0DD\uB41C \uCEF4\uD3EC\uB10C\uD2B8: ${y(g.join(", "))}`);let k=W({userSelects:g,uiRegistryIndex:d,libRegistryIndex:m}),C=[],{start:A,stop:h}=l.spinner();A("Registry\uB97C \uAC00\uC838\uC624\uACE0 \uC788\uC5B4\uC694...");for(let f of k){let i=await B(f.name,s,f.type);C.push(i)}if(h(),C.length){let f=C.filter(i=>!g.includes(i.name));l.log.message(`\uCD94\uAC00\uB85C \uC124\uCE58\uB420 \uB808\uC9C0\uC2A4\uD2B8\uB9AC: ${y(f.map(i=>i.name).join(", "))}`)}let T=[],u={installed:new Set,filtered:new Set};for(let f of C){for(let i of f.registries){let v="";switch(i.type){case"ui":v=a.resolvedUIPaths;break;case"lib":v=a.resolvedLibPaths;break;default:break}z.existsSync(v)||await z.mkdir(v,{recursive:!0});let S=ee.resolve(v,i.name),oe=await H({filename:i.name,config:a,raw:i.content});a.tsx||(S=S.replace(/\.tsx$/,".jsx"),S=S.replace(/\.ts$/,".js")),await z.writeFile(S,oe);let se=ee.relative(o,S);T.push({name:i.name,path:se})}if(f.dependencies?.length){let i=await L({cwd:o,deps:f.dependencies});u.installed=new Set([...u.installed,...i.installed]),u.filtered=new Set([...u.filtered,...i.filtered])}if(f.devDependencies?.length){let i=await L({cwd:o,deps:f.devDependencies,dev:!0});u.installed=new Set([...u.installed,...i.installed]),u.filtered=new Set([...u.filtered,...i.filtered])}l.log.success(`${y(f.name)} \uAD00\uB828 \uD30C\uC77C \uCD94\uAC00 \uC644\uB8CC`)}if(u.installed.size&&l.log.message(`\uC124\uCE58\uB41C \uC758\uC874\uC131: ${y(Array.from(u.installed).join(", "))}`),u.filtered.size&&l.log.message(`\uC774\uBBF8 \uC124\uCE58\uB41C \uC758\uC874\uC131: ${y(Array.from(u.filtered).join(", "))}`),T.length)for(let f of T)l.log.message(`\uCD94\uAC00\uB41C \uD30C\uC77C: ${y(f.path)}`);l.outro("\uCEF4\uD3EC\uB10C\uD2B8 \uCD94\uAC00 \uC644\uB8CC.")})};import*as p from"@clack/prompts";import Le from"fs-extra";import re from"path";import P from"picocolors";import{z as E}from"zod";var ze=E.object({cwd:E.string(),yes:E.boolean().optional()}),ne=e=>{e.command("init","seed-design.json \uD30C\uC77C \uC0DD\uC131").option("-c, --cwd <cwd>","\uC791\uC5C5 \uB514\uB809\uD1A0\uB9AC. \uAE30\uBCF8\uAC12\uC740 \uD604\uC7AC \uB514\uB809\uD1A0\uB9AC.",{default:process.cwd()}).option("-y, --yes","\uBAA8\uB4E0 \uC9C8\uBB38\uC5D0 \uB300\uD574 \uAE30\uBCF8\uAC12\uC73C\uB85C \uB2F5\uBCC0\uD569\uB2C8\uB2E4.").action(async t=>{let r=a=>P.cyan(a);p.intro(P.bgCyan("seed-design.json \uD30C\uC77C \uC0DD\uC131"));let n=ze.parse(t),o=n.yes,s={rsc:!1,tsx:!0,path:"./seed-design"};o||(s={...await p.group({tsx:()=>p.confirm({message:`${r("TypeScript")}\uB97C \uC0AC\uC6A9\uC911\uC774\uC2E0\uAC00\uC694?`,initialValue:!0}),rsc:()=>p.confirm({message:`${r("React Server Components")}\uB97C \uC0AC\uC6A9\uC911\uC774\uC2E0\uAC00\uC694?`,initialValue:!1}),path:()=>p.text({message:`${r("seed-design \uD3F4\uB354")} \uACBD\uB85C\uB97C \uC785\uB825\uD574\uC8FC\uC138\uC694. (\uAE30\uBCF8\uAC12\uC740 \uD504\uB85C\uC81D\uD2B8 \uB8E8\uD2B8\uC5D0 \uC0DD\uC131\uB429\uB2C8\uB2E4.)`,initialValue:"./seed-design",defaultValue:"./seed-design",placeholder:"./seed-design"})},{onCancel:()=>{p.cancel("\uC791\uC5C5\uC774 \uCDE8\uC18C\uB410\uC5B4\uC694."),process.exit(0)}})});try{let{start:a,stop:d}=p.spinner();a("seed-design.json \uD30C\uC77C \uC0DD\uC131\uC911...");let m=re.resolve(n.cwd,"seed-design.json");await Le.writeFile(m,`${JSON.stringify(s,null,2)}
3
- `,"utf-8");let g=re.relative(process.cwd(),m);d(`seed-design.json \uD30C\uC77C\uC774 ${r(g)}\uC5D0 \uC0DD\uC131\uB410\uC5B4\uC694.`),p.log.info(P.gray("seed-design add {component} \uBA85\uB839\uC5B4\uB85C \uCEF4\uD3EC\uB10C\uD2B8\uB97C \uCD94\uAC00\uD574\uBCF4\uC138\uC694!")),p.log.info(P.gray("seed-design add \uBA85\uB839\uC5B4\uB85C \uCD94\uAC00\uD560 \uC218 \uC788\uB294 \uBAA8\uB4E0 \uCEF4\uD3EC\uB10C\uD2B8\uB97C \uD655\uC778\uD574\uBCF4\uC138\uC694.")),p.outro("\uC791\uC5C5\uC774 \uC644\uB8CC\uB410\uC5B4\uC694.")}catch(a){p.log.error(`seed-design.json \uD30C\uC77C \uC0DD\uC131\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694. ${a}`),p.outro(P.bgRed("\uC791\uC5C5\uC774 \uCDE8\uC18C\uB410\uC5B4\uC694.")),process.exit(1)}})};import{cac as Ee}from"cac";var Fe="seed-design",j=Ee(Fe);async function _e(){let e=O();te(j),ne(j),j.version(e.version||"1.0.0","-v, --version"),j.help(),j.parse()}_e();
2
+ import*as S from"@clack/prompts";import{cosmiconfig as ce}from"cosmiconfig";import{execa as pe}from"execa";import b from"fs";import T from"path";import{z as I}from"zod";import se from"picocolors";var y=e=>se.cyan(e);import{detect as ae}from"@antfu/ni";async function U(e){let t=await ae({programmatic:!0,cwd:e});return t==="yarn@berry"?"yarn":t==="pnpm@6"?"pnpm":t==="bun"?"bun":t==="deno"?"deno":t??"npm"}var F="seed-design",me=ce(F,{searchPlaces:[`${F}.json`]}),_=I.object({$schema:I.string().optional(),rsc:I.coerce.boolean().default(!1),tsx:I.coerce.boolean().default(!0),path:I.string()}).strict(),le=_.extend({resolvedUIPaths:I.string(),resolvedLibPaths:I.string()});async function J(e){let t=await fe(e);return t?await de(e,t):null}async function de(e,t){let r=T.resolve(e,t.path);b.existsSync(r)||b.mkdirSync(r,{recursive:!0});let o=T.join(r,"ui"),s=T.join(r,"lib");return b.existsSync(o)||b.mkdirSync(o,{recursive:!0}),b.existsSync(s)||b.mkdirSync(s,{recursive:!0}),le.parse({...t,resolvedUIPaths:o,resolvedLibPaths:s})}async function fe(e){try{let t=await me.search(e);return _.parse(t.config)}catch{if(S.log.error("\uD504\uB85C\uC81D\uD2B8 \uB8E8\uD2B8 \uACBD\uB85C\uC5D0 `seed-design.json` \uD30C\uC77C\uC774 \uC5C6\uC5B4\uC694."),await S.confirm({message:"seed-design.json \uD30C\uC77C\uC744 \uC0DD\uC131\uD558\uC2DC\uACA0\uC5B4\uC694?"})===!0){let r=await U(e);await pe(r,["seed-design","init","--default"],{cwd:e}),S.log.message("seed-design.json \uD30C\uC77C\uC774 \uC0DD\uC131\uB410\uC5B4\uC694.")}else S.outro(y("\uC791\uC5C5\uC774 \uCDE8\uC18C\uB410\uC5B4\uC694.")),process.exit(1)}}import*as C from"@clack/prompts";import{z as c}from"zod";var ge=c.union([c.literal("ui"),c.literal("lib")]),N=c.object({name:c.string(),description:c.string().optional(),dependencies:c.array(c.string()).optional(),devDependencies:c.array(c.string()).optional(),innerDependencies:c.array(c.string()).optional(),files:c.array(c.string()),deprecated:c.literal(!0).optional()}),k=c.array(N),ue=N.omit({files:!0}),ye=ue.extend({registries:c.array(c.object({name:c.string(),type:ge,content:c.string()}))}),tt=c.array(ye);async function G(e,t,r="ui"){return await Promise.all(e.map(async s=>{try{return await(await fetch(`${t}/__registry__/${r}/${s}.json`)).json()}catch(a){let p=await fetch(`${t}/__registry__/${r}/index.json`).then(g=>g.json()),l=k.parse(p).map(g=>g.name);C.log.error(`${r}:${s} \uCEF4\uD3EC\uB10C\uD2B8\uB294 \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC5D0 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC544\uC694.`),C.log.info(`\uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uCEF4\uD3EC\uB10C\uD2B8: ${l.join(", ")}`),C.log.info(JSON.stringify({baseUrl:t,error:a.toString()},null,2)),process.exit(1)}}))}async function B(e,t,r="ui"){let[o]=await G([e],t,r);return o}async function V(e){try{let[t]=await G(["index"],e,"ui");return k.parse(t)}catch(t){C.log.error("\uB808\uC9C0\uC2A4\uD2B8\uB9AC \uC778\uB371\uC2A4\uB97C \uAC00\uC838\uC624\uB294 \uB370 \uC2E4\uD328\uD588\uC5B4\uC694."),C.log.info(JSON.stringify({baseUrl:e,error:t.toString()},null,2)),process.exit(1)}}async function K(e){let[t]=await G(["index"],e,"lib");return k.parse(t)}import{promises as Re}from"fs";import{tmpdir as be}from"os";import q from"path";import{transformFromAstSync as he}from"@babel/core";import xe from"@babel/plugin-transform-typescript";import*as $ from"recast";import{parse as we}from"@babel/parser";var Ie={sourceType:"module",allowImportExportEverywhere:!0,allowReturnOutsideFunction:!0,startLine:1,tokens:!0,plugins:["asyncGenerators","bigInt","classPrivateMethods","classPrivateProperties","classProperties","classStaticBlock","decimal","decorators-legacy","doExpressions","dynamicImport","exportDefaultFrom","exportNamespaceFrom","functionBind","functionSent","importAssertions","importMeta","nullishCoalescingOperator","numericSeparator","objectRestSpread","optionalCatchBinding","optionalChaining",["pipelineOperator",{proposal:"minimal"}],["recordAndTuple",{syntaxType:"hash"}],"throwExpressions","topLevelAwait","v8intrinsic","typescript","jsx"]},X=async({sourceFile:e,config:t})=>{let r=e.getFullText();if(t.tsx)return r;let o=$.parse(r,{parser:{parse:a=>we(a,Ie)}}),s=he(o,r,{cloneInputAst:!1,code:!1,ast:!0,plugins:[xe],configFile:!1});if(!s||!s.ast)throw new Error("Failed to transform JSX");return $.print(s.ast).code};import{SyntaxKind as Se}from"ts-morph";var Y=async({sourceFile:e,config:t})=>{if(t.rsc)return e;let r=e.getFirstChildByKind(Se.ExpressionStatement);return r?.getText()==='"use client";'&&r.remove(),e};import{Project as Ce,ScriptKind as ve}from"ts-morph";var Pe=[Y],je=new Ce({compilerOptions:{}});async function Me(e){let t=await Re.mkdtemp(q.join(be(),"seed-deisgn-"));return q.join(t,e)}async function H(e){let t=await Me(e.filename),r=je.createSourceFile(t,e.raw,{scriptKind:ve.TSX});for(let o of Pe)o({sourceFile:r,...e});return await X({sourceFile:r,...e})}import*as i from"@clack/prompts";import z from"fs-extra";import ee from"path";import Te from"picocolors";import{z as R}from"zod";var Q="https://seed-design.io";function W({userSelects:e,uiRegistryIndex:t,libRegistryIndex:r}){let o=[];function s({registryName:a,type:p}){if(o.some(l=>l.name===a&&l.type===p))return;o.push({type:p,name:a});let f=p==="ui"?t.find(l=>l.name===a):r.find(l=>l.name===a);if(f&&f.innerDependencies)for(let l of f.innerDependencies){let[g,M]=l.split(":");s({registryName:M,type:g})}}for(let a of e)s({registryName:a,type:"ui"});return Array.from(o)}import*as Z from"@clack/prompts";import{execa as Oe}from"execa";import Ae from"picocolors";import Ue from"findup-sync";import ke from"fs-extra";var $e="package.json";function De(){let e=Ue($e);if(!e)throw new Error("No package.json file found in the project.");return e}function D(){let e=De();return ke.readJSONSync(e)}async function L({cwd:e,deps:t,dev:r=!1}){let{start:o,stop:s}=Z.spinner(),a=await U(e),p=D(),f={...p.dependencies,...p.devDependencies},l=t.filter(w=>!f[w]),g=t.filter(w=>f[w]);if(!l.length)return{installed:new Set,filtered:new Set};o(Ae.gray("\uC758\uC874\uC131 \uC124\uCE58\uC911..."));let O=[a==="npm"?"install":"add",r?"-D":null,...l].filter(Boolean);try{await Oe(a,O,{cwd:e})}catch(w){console.error(`\uC758\uC874\uC131 \uC124\uCE58 \uC2E4\uD328: ${w}`),process.exit(1)}return s("\uC758\uC874\uC131 \uC124\uCE58 \uC644\uB8CC."),{installed:l,filtered:g}}var Ge=R.object({components:R.array(R.string()).optional(),all:R.boolean(),includeDeprecated:R.boolean().optional(),cwd:R.string(),baseUrl:R.string().optional()}),te=e=>{e.command("add [...components]","add component").option("-a, --all","Add all components",{default:!1}).option("--include-deprecated","Include deprecated components when used with `--all`",{default:!1}).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",{default:process.cwd()}).option("-u, --baseUrl <baseUrl>","the base url of the registry. defaults to the current directory.",{default:Q}).example("seed-design add action-button").example("seed-design add alert-dialog").action(async(t,r)=>{i.intro(Te.bgCyan("seed-design add"));let o=Ge.parse({components:t,...r}),s=o.cwd,a=o.baseUrl,p=await J(s),f=await V(a),l=await K(a),g=await(async()=>{if(o.all)return o.includeDeprecated?f.map(n=>n.name):f.filter(({deprecated:n})=>!n).map(n=>n.name);if(o.components.length>0)return o.components;let d=await i.multiselect({message:"\uCD94\uAC00\uD560 \uCEF4\uD3EC\uB10C\uD2B8\uB97C \uC120\uD0DD\uD574\uC8FC\uC138\uC694 (\uC2A4\uD398\uC774\uC2A4 \uBC14\uB85C \uC5EC\uB7EC \uAC1C \uC120\uD0DD \uAC00\uB2A5)",options:f.map(({name:n,description:h,deprecated:x})=>({label:`${x?"(deprecated) ":""}${n}`,value:n,hint:h,deprecated:x})).sort((n,h)=>n.deprecated===h.deprecated?n.label.localeCompare(h.label):n.deprecated?1:-1)});return i.isCancel(d)&&(i.log.error("\uCDE8\uC18C\uB418\uC5C8\uC5B4\uC694."),process.exit(0)),d})();g?.length||(i.log.error("\uCEF4\uD3EC\uB10C\uD2B8\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694."),process.exit(0)),i.log.message(`\uC120\uD0DD\uB41C \uCEF4\uD3EC\uB10C\uD2B8: ${y(g.join(", "))}`);let M=W({userSelects:g,uiRegistryIndex:f,libRegistryIndex:l}),v=[],{start:O,stop:w}=i.spinner();O("Registry\uB97C \uAC00\uC838\uC624\uACE0 \uC788\uC5B4\uC694...");for(let d of M){let n=await B(d.name,a,d.type);v.push(n)}if(w(),v.length){let d=v.filter(n=>!g.includes(n.name));i.log.message(`\uCD94\uAC00\uB85C \uC124\uCE58\uB420 \uB808\uC9C0\uC2A4\uD2B8\uB9AC: ${y(d.map(n=>n.name).join(", "))}`)}let A=[],u={installed:new Set,filtered:new Set};for(let d of v){if(d.deprecated&&!o.includeDeprecated){let n=await i.confirm({message:`${y(d.name)}\uB294 deprecated \uB418\uC5C8\uC5B4\uC694. \uCD94\uAC00\uD560\uAE4C\uC694?`,initialValue:!1});if(n===!1||i.isCancel(n)){i.log.info(`${y(d.name)} \uCEF4\uD3EC\uB10C\uD2B8\uB294 \uCD94\uAC00\uD558\uC9C0 \uC54A\uC744\uAC8C\uC694.`);continue}}for(let n of d.registries){let h="";switch(n.type){case"ui":h=p.resolvedUIPaths;break;case"lib":h=p.resolvedLibPaths;break;default:break}z.existsSync(h)||await z.mkdir(h,{recursive:!0});let x=ee.resolve(h,n.name),oe=await H({filename:n.name,config:p,raw:n.content});p.tsx||(x=x.replace(/\.tsx$/,".jsx"),x=x.replace(/\.ts$/,".js")),await z.writeFile(x,oe);let ie=ee.relative(s,x);A.push({name:n.name,path:ie})}if(d.dependencies?.length){let n=await L({cwd:s,deps:d.dependencies});u.installed=new Set([...u.installed,...n.installed]),u.filtered=new Set([...u.filtered,...n.filtered])}if(d.devDependencies?.length){let n=await L({cwd:s,deps:d.devDependencies,dev:!0});u.installed=new Set([...u.installed,...n.installed]),u.filtered=new Set([...u.filtered,...n.filtered])}i.log.success(`${y(d.name)} \uAD00\uB828 \uD30C\uC77C \uCD94\uAC00 \uC644\uB8CC`)}if(u.installed.size&&i.log.message(`\uC124\uCE58\uB41C \uC758\uC874\uC131: ${y(Array.from(u.installed).join(", "))}`),u.filtered.size&&i.log.message(`\uC774\uBBF8 \uC124\uCE58\uB41C \uC758\uC874\uC131: ${y(Array.from(u.filtered).join(", "))}`),A.length)for(let d of A)i.log.message(`\uCD94\uAC00\uB41C \uD30C\uC77C: ${y(d.path)}`);i.outro("\uCEF4\uD3EC\uB10C\uD2B8 \uCD94\uAC00 \uC644\uB8CC.")})};import*as m from"@clack/prompts";import Le from"fs-extra";import re from"path";import P from"picocolors";import{z as E}from"zod";var ze=E.object({cwd:E.string(),yes:E.boolean().optional()}),ne=e=>{e.command("init","seed-design.json \uD30C\uC77C \uC0DD\uC131").option("-c, --cwd <cwd>","\uC791\uC5C5 \uB514\uB809\uD1A0\uB9AC. \uAE30\uBCF8\uAC12\uC740 \uD604\uC7AC \uB514\uB809\uD1A0\uB9AC.",{default:process.cwd()}).option("-y, --yes","\uBAA8\uB4E0 \uC9C8\uBB38\uC5D0 \uB300\uD574 \uAE30\uBCF8\uAC12\uC73C\uB85C \uB2F5\uBCC0\uD569\uB2C8\uB2E4.").action(async t=>{let r=p=>P.cyan(p);m.intro(P.bgCyan("seed-design.json \uD30C\uC77C \uC0DD\uC131"));let o=ze.parse(t),s=o.yes,a={rsc:!1,tsx:!0,path:"./seed-design"};s||(a={...await m.group({tsx:()=>m.confirm({message:`${r("TypeScript")}\uB97C \uC0AC\uC6A9\uC911\uC774\uC2E0\uAC00\uC694?`,initialValue:!0}),rsc:()=>m.confirm({message:`${r("React Server Components")}\uB97C \uC0AC\uC6A9\uC911\uC774\uC2E0\uAC00\uC694?`,initialValue:!1}),path:()=>m.text({message:`${r("seed-design \uD3F4\uB354")} \uACBD\uB85C\uB97C \uC785\uB825\uD574\uC8FC\uC138\uC694. (\uAE30\uBCF8\uAC12\uC740 \uD504\uB85C\uC81D\uD2B8 \uB8E8\uD2B8\uC5D0 \uC0DD\uC131\uB429\uB2C8\uB2E4.)`,initialValue:"./seed-design",defaultValue:"./seed-design",placeholder:"./seed-design"})},{onCancel:()=>{m.cancel("\uC791\uC5C5\uC774 \uCDE8\uC18C\uB410\uC5B4\uC694."),process.exit(0)}})});try{let{start:p,stop:f}=m.spinner();p("seed-design.json \uD30C\uC77C \uC0DD\uC131\uC911...");let l=re.resolve(o.cwd,"seed-design.json");await Le.writeFile(l,`${JSON.stringify(a,null,2)}
3
+ `,"utf-8");let g=re.relative(process.cwd(),l);f(`seed-design.json \uD30C\uC77C\uC774 ${r(g)}\uC5D0 \uC0DD\uC131\uB410\uC5B4\uC694.`),m.log.info(P.gray("seed-design add {component} \uBA85\uB839\uC5B4\uB85C \uCEF4\uD3EC\uB10C\uD2B8\uB97C \uCD94\uAC00\uD574\uBCF4\uC138\uC694!")),m.log.info(P.gray("seed-design add \uBA85\uB839\uC5B4\uB85C \uCD94\uAC00\uD560 \uC218 \uC788\uB294 \uBAA8\uB4E0 \uCEF4\uD3EC\uB10C\uD2B8\uB97C \uD655\uC778\uD574\uBCF4\uC138\uC694.")),m.outro("\uC791\uC5C5\uC774 \uC644\uB8CC\uB410\uC5B4\uC694.")}catch(p){m.log.error(`seed-design.json \uD30C\uC77C \uC0DD\uC131\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694. ${p}`),m.outro(P.bgRed("\uC791\uC5C5\uC774 \uCDE8\uC18C\uB410\uC5B4\uC694.")),process.exit(1)}})};import{cac as Ee}from"cac";var Fe="seed-design",j=Ee(Fe);async function _e(){let e=D();te(j),ne(j),j.version(e.version||"1.0.0","-v, --version"),j.help(),j.parse()}_e();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seed-design/cli",
3
- "version": "0.0.1",
3
+ "version": "0.0.3",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",
@@ -25,28 +25,27 @@
25
25
  "lint:publish": "bun publint"
26
26
  },
27
27
  "dependencies": {
28
- "@antfu/ni": "^23.3.1",
29
- "@babel/core": "^7.24.9",
30
- "@babel/parser": "^7.24.8",
31
- "@babel/plugin-transform-typescript": "^7.24.8",
32
- "@clack/prompts": "^0.7.0",
28
+ "@antfu/ni": "^25.0.0",
29
+ "@babel/core": "^7.26.10",
30
+ "@babel/parser": "^7.27.0",
31
+ "@babel/plugin-transform-typescript": "^7.27.0",
32
+ "@clack/prompts": "^0.11.0",
33
33
  "cac": "^6.7.14",
34
34
  "cosmiconfig": "^9.0.0",
35
- "execa": "^9.3.0",
35
+ "execa": "^9.5.2",
36
36
  "findup-sync": "^5.0.0",
37
- "fs-extra": "^11.2.0",
38
- "mktemp": "^1.0.1",
39
- "picocolors": "^1.0.1",
40
- "recast": "^0.23.9",
41
- "ts-morph": "^23.0.0",
42
- "zod": "^3.23.8"
37
+ "fs-extra": "^11.3.0",
38
+ "picocolors": "^1.1.1",
39
+ "recast": "^0.23.11",
40
+ "ts-morph": "^26.0.0",
41
+ "zod": "^3.24.3"
43
42
  },
44
43
  "devDependencies": {
45
44
  "@types/babel__core": "^7.20.5",
46
45
  "@types/fs-extra": "^11.0.4",
47
- "esbuild": "^0.25.0",
48
- "type-fest": "^4.23.0",
49
- "typescript": "^5.4.5"
46
+ "esbuild": "^0.25.3",
47
+ "type-fest": "^4.40.0",
48
+ "typescript": "^5.8.3"
50
49
  },
51
50
  "publishConfig": {
52
51
  "access": "public"
@@ -16,11 +16,13 @@ import { BASE_URL } from "../constants";
16
16
  import { addRelativeRegistries } from "../utils/add-relative-registries";
17
17
  import { highlight } from "../utils/color";
18
18
  import { installDependencies } from "../utils/install";
19
+ import type { RegistryUIMachineGenerated } from "../schema";
19
20
 
20
21
  const addOptionsSchema = z.object({
21
22
  components: z.array(z.string()).optional(),
22
- cwd: z.string(),
23
23
  all: z.boolean(),
24
+ includeDeprecated: z.boolean().optional(),
25
+ cwd: z.string(),
24
26
  baseUrl: z.string().optional(),
25
27
  // yes: z.boolean(),
26
28
  // overwrite: z.boolean(),
@@ -33,6 +35,9 @@ export const addCommand = (cli: CAC) => {
33
35
  .option("-a, --all", "Add all components", {
34
36
  default: false,
35
37
  })
38
+ .option("--include-deprecated", "Include deprecated components when used with `--all`", {
39
+ default: false,
40
+ })
36
41
  .option("-c, --cwd <cwd>", "the working directory. defaults to the current directory.", {
37
42
  default: process.cwd(),
38
43
  })
@@ -56,32 +61,39 @@ export const addCommand = (cli: CAC) => {
56
61
  const config = await getConfig(cwd);
57
62
  const registryComponentIndex = await getRegistryUIIndex(baseUrl);
58
63
  const libRegistryIndex = await getRegistryLibIndex(baseUrl);
59
- let selectedComponents: string[] = options.all
60
- ? registryComponentIndex.map((registry) => registry.name)
61
- : options.components;
62
-
63
- if (!options.components?.length && !options.all) {
64
- const selects = await p.multiselect<
65
- { label: string; value: string; hint: string }[],
66
- string
67
- >({
64
+
65
+ const selectedComponents: string[] = await (async () => {
66
+ if (options.all) {
67
+ if (options.includeDeprecated) return registryComponentIndex.map((c) => c.name);
68
+
69
+ return registryComponentIndex.filter(({ deprecated }) => !deprecated).map((c) => c.name);
70
+ }
71
+
72
+ if (options.components.length > 0) return options.components;
73
+
74
+ const selected = await p.multiselect({
68
75
  message: "추가할 컴포넌트를 선택해주세요 (스페이스 바로 여러 개 선택 가능)",
69
- options: registryComponentIndex.map((metadata) => {
70
- return {
71
- label: metadata.name,
72
- value: metadata.name,
73
- hint: metadata.description,
74
- };
75
- }),
76
+ options: registryComponentIndex
77
+ .map(({ name, description, deprecated }) => ({
78
+ label: `${deprecated ? "(deprecated) " : ""}${name}`,
79
+ value: name,
80
+ hint: description,
81
+ deprecated,
82
+ }))
83
+ .sort((a, b) => {
84
+ if (a.deprecated === b.deprecated) return a.label.localeCompare(b.label);
85
+
86
+ return a.deprecated ? 1 : -1;
87
+ }),
76
88
  });
77
89
 
78
- if (p.isCancel(selects)) {
90
+ if (p.isCancel(selected)) {
79
91
  p.log.error("취소되었어요.");
80
92
  process.exit(0);
81
93
  }
82
94
 
83
- selectedComponents = selects as string[];
84
- }
95
+ return selected;
96
+ })();
85
97
 
86
98
  if (!selectedComponents?.length) {
87
99
  p.log.error("컴포넌트를 찾을 수 없어요.");
@@ -96,7 +108,7 @@ export const addCommand = (cli: CAC) => {
96
108
  libRegistryIndex,
97
109
  });
98
110
 
99
- const allRegistryItems = [];
111
+ const allRegistryItems: RegistryUIMachineGenerated = [];
100
112
 
101
113
  const { start, stop } = p.spinner();
102
114
  start("Registry를 가져오고 있어요...");
@@ -126,6 +138,19 @@ export const addCommand = (cli: CAC) => {
126
138
  filtered: new Set(),
127
139
  };
128
140
  for (const component of allRegistryItems) {
141
+ if (component.deprecated && !options.includeDeprecated) {
142
+ const confirm = await p.confirm({
143
+ message: `${highlight(component.name)}는 deprecated 되었어요. 추가할까요?`,
144
+ initialValue: false,
145
+ });
146
+
147
+ if (confirm === false || p.isCancel(confirm)) {
148
+ p.log.info(`${highlight(component.name)} 컴포넌트는 추가하지 않을게요.`);
149
+
150
+ continue;
151
+ }
152
+ }
153
+
129
154
  for (const registry of component.registries) {
130
155
  let targetPath = "";
131
156
  switch (registry.type) {
package/src/constants.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  export const BASE_URL =
2
- process.env.NODE_ENV === "prod" ? "https://v3.seed-design.io" : "http://localhost:3000";
2
+ process.env.NODE_ENV === "prod" ? "https://seed-design.io" : "http://localhost:3000";
package/src/schema.ts CHANGED
@@ -39,6 +39,11 @@ export const registryUIItemSchema = z.object({
39
39
  * @example lib:manner-temp-level.ts
40
40
  */
41
41
  files: z.array(z.string()),
42
+
43
+ /**
44
+ * @description 컴포넌트 deprecated 여부
45
+ */
46
+ deprecated: z.literal(true).optional(),
42
47
  });
43
48
  export const registryUISchema = z.array(registryUIItemSchema);
44
49