@seed-design/cli 0.0.2 → 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 +2 -2
- package/package.json +4 -4
- package/src/commands/add.ts +46 -21
- package/src/schema.ts +5 -0
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://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(),
|
|
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.
|
|
3
|
+
"version": "0.0.3",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -25,11 +25,11 @@
|
|
|
25
25
|
"lint:publish": "bun publint"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@antfu/ni": "^
|
|
28
|
+
"@antfu/ni": "^25.0.0",
|
|
29
29
|
"@babel/core": "^7.26.10",
|
|
30
30
|
"@babel/parser": "^7.27.0",
|
|
31
31
|
"@babel/plugin-transform-typescript": "^7.27.0",
|
|
32
|
-
"@clack/prompts": "^0.
|
|
32
|
+
"@clack/prompts": "^0.11.0",
|
|
33
33
|
"cac": "^6.7.14",
|
|
34
34
|
"cosmiconfig": "^9.0.0",
|
|
35
35
|
"execa": "^9.5.2",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"fs-extra": "^11.3.0",
|
|
38
38
|
"picocolors": "^1.1.1",
|
|
39
39
|
"recast": "^0.23.11",
|
|
40
|
-
"ts-morph": "^
|
|
40
|
+
"ts-morph": "^26.0.0",
|
|
41
41
|
"zod": "^3.24.3"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
package/src/commands/add.ts
CHANGED
|
@@ -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
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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
|
|
70
|
-
|
|
71
|
-
label:
|
|
72
|
-
value:
|
|
73
|
-
hint:
|
|
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(
|
|
90
|
+
if (p.isCancel(selected)) {
|
|
79
91
|
p.log.error("취소되었어요.");
|
|
80
92
|
process.exit(0);
|
|
81
93
|
}
|
|
82
94
|
|
|
83
|
-
|
|
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/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
|
|