@seed-design/cli 1.6.1 → 1.7.1

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
@@ -9,9 +9,9 @@ ${i.map(n=>` - ${n}`).join(`
9
9
  ${m.items.map(g=>g.id).join(`
10
10
  `)}`),n):new Error(`Failed to parse registry index for ${t}`)}}))}import{promises as Ft}from"fs";import{tmpdir as Kt}from"os";import Ye from"path";import{transformFromAstSync as Dt}from"@babel/core";import Ot from"@babel/plugin-transform-typescript";import*as Ie from"recast";import{parse as Lt}from"@babel/parser";var Mt={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"]},He=async({sourceFile:e,config:r})=>{let t=e.getFullText();if(r.tsx)return t;let i=Ie.parse(t,{parser:{parse:n=>Lt(n,Mt)}}),s=Dt(i,t,{cloneInputAst:!1,code:!1,ast:!0,plugins:[Ot],configFile:!1});if(!s||!s.ast)throw new Error("Failed to transform JSX");return Ie.print(s.ast).code};import{SyntaxKind as Ut}from"ts-morph";var We=async({sourceFile:e,config:r})=>{if(r.rsc)return e;let t=e.getFirstChildByKind(Ut.ExpressionStatement);if(!t)return e;let i=t.getExpression();if(!i)return e;let s=i.getText().trim();if(s!=='"use client"'&&s!=="'use client'")return e;let n=t.getText(),o=t.getFullText();if(n.trim()===o.trim())return e;let c=o.replace(n,"").replace(/^\s*\n/,"").replace(/\n\s*$/,"");return t.replaceWithText(c),e};import{Project as Nt,ScriptKind as Vt}from"ts-morph";var zt=[We],Bt=new Nt({compilerOptions:{}});async function qt(e){let r=await Ft.mkdtemp(Ye.join(Kt(),"seed-design-"));return Ye.join(r,e)}async function Qe(e){let r=await qt(e.filename),t=Bt.createSourceFile(r,e.raw,{scriptKind:Vt.TSX});for(let i of zt)i({sourceFile:t,...e});return await He({sourceFile:t,...e})}import*as G from"@clack/prompts";import ge from"fs-extra";import X from"path";import{createPatch as Jt}from"diff";import Gt from"@npmcli/disparity-colors";async function ke({registryItemsToAdd:e,rootPath:r,cwd:t,baseUrl:i,framework:s,config:n,onDiff:o}){let a=[];for(let{registryId:c,items:m}of e){let g=X.join(r,c);ge.ensureDirSync(g);let C=await Ge({baseUrl:i,framework:s,registryId:c,registryItemIds:m.map(u=>u.id)});for(let{id:u,snippets:$}of C){let I=await Promise.all($.map(async T=>{let x=await Qe({filename:T.path,config:n,raw:T.content}),y=X.join(g,T.path);return n.tsx||(y=y.replace(/\.tsx$/,".jsx"),y=y.replace(/\.ts$/,".js")),{filePath:y,content:x,relativePath:X.relative(t,y),name:`${c}:${u}`}})),A=[];for(let T of I){let{filePath:x,content:y,relativePath:h}=T;if(await ge.ensureDir(X.dirname(x)),ge.existsSync(x)){let w=await ge.readFile(x,"utf-8");if(w===y){G.log.info(`${l(h)}: \uC774\uBBF8 \uCD5C\uC2E0 \uC0C1\uD0DC\uC608\uC694.`);continue}let P=X.basename(x),F=X.extname(x),ee=X.basename(x,F),S=Date.now(),K=`legacy-${ee}-${S}${F}`,U=await(async()=>{if(o)return o;let H=Jt(h,w,y),b=Gt(H);return G.log.message(`
11
11
  ${l(h)}: \uD604\uC7AC \uD30C\uC77C\uACFC \uBC1B\uC73C\uB824\uB294 \uD30C\uC77C\uC758 \uB0B4\uC6A9\uC774 \uB2EC\uB77C\uC694.
12
- `),G.log.message(b),G.select({message:"\uD604\uC7AC \uD30C\uC77C\uC5D0 \uC2A4\uD0C0\uC77C \uBCC0\uACBD, \uB85C\uAE45 \uB4F1 \uCEE4\uC2A4\uD130\uB9C8\uC774\uC9D5\uC774 \uC801\uC6A9\uB418\uC5B4 \uC788\uB294 \uACBD\uC6B0 \uC2E0\uADDC \uD30C\uC77C\uC5D0 \uB3D9\uC77C\uD55C \uCEE4\uC2A4\uD130\uB9C8\uC774\uC9D5\uC744 \uC801\uC6A9\uD558\uB294 \uAC83\uC744 \uAC80\uD1A0\uD574\uBCF4\uC138\uC694.",options:[{value:"overwrite",label:`${P} \uB36E\uC5B4\uC4F0\uAE30`},{value:"backup",label:`\uAE30\uC874 \uD30C\uC77C \uB0B4\uC6A9\uC744 ${K}\uC73C\uB85C \uC62E\uAE30\uACE0 ${P} \uBC1B\uAE30`},{value:"skip",label:"\uC0C8 \uD30C\uC77C \uBC1B\uC9C0 \uC54A\uACE0 \uADF8\uB300\uB85C \uB450\uAE30"}]})})();if(G.isCancel(U)||U==="skip"){G.log.info(`${l(h)}: \uD30C\uC77C\uC744 \uBC1B\uC9C0 \uC54A\uACE0 \uAC74\uB108\uB6F0\uC5C8\uC5B4\uC694.`);continue}if(U==="backup"){let H=X.dirname(x),b=X.join(H,K);await ge.rename(x,b),G.log.info(`${l(h)}: \uAE30\uC874 \uD30C\uC77C\uC744 ${l(X.relative(t,b))}\uB85C \uC62E\uACBC\uC5B4\uC694.`)}}await ge.writeFile(x,y),A.push(T)}if(A.length>0){let T=A.map(({name:x,relativePath:y})=>({name:x,path:y}));a.push(...T),G.log.success(`${l(`${c}:${u}`)} \uAD00\uB828 \uC2A4\uB2C8\uD3AB \uB2E4\uC6B4\uB85C\uB4DC \uC644\uB8CC: ${l(T.map(x=>x.path).join(", "))}`)}}}}import*as _ from"@clack/prompts";import ur from"path";import{z as re}from"zod";var N="https://seed-design.io";var Xe={"1.0":"https://v1-0.seed-design.io","1.1":"https://v1-1.seed-design.io","1.2":"https://v1-2.seed-design.io"};function Pe(e){let r=e.seedReactVersion?.trim();if(!r)return null;let t=Xe[r];if(!t)throw new k({message:`\uC9C0\uC6D0\uD558\uC9C0 \uC54A\uB294 SEED React \uBC84\uC804\uC774\uC5D0\uC694: "${e.seedReactVersion}"`,hint:`\uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uBC84\uC804: ${Object.keys(Xe).join(", ")}`});return{framework:"react",baseUrl:t}}function Se(e,r){for(let t=0;t<e.length;t++){let i=e[t];if(i===r)return e[t+1];if(i.startsWith(`${r}=`))return i.slice(r.length+1)}}import*as et from"@clack/prompts";import{execa as Wt}from"execa";import{detect as Ht}from"@antfu/ni";async function Ze(e){let r=await Ht({programmatic:!0,cwd:e});return r==="yarn@berry"?"yarn":r==="pnpm@6"?"pnpm":r==="bun"?"bun":r==="deno"?"deno":r??"npm"}async function Re({cwd:e,deps:r,dev:t=!1}){let{start:i,stop:s}=et.spinner(),n=await Ze(e),a={...ne(e).dependencies},c=new Set(r.filter(I=>!a[I])),m=new Set(r.filter(I=>a[I]));if(!c.size)return{installed:new Set,filtered:c};i("\uC758\uC874\uC131 \uC124\uCE58\uC911...");let u=[n==="npm"?"install":"add",t?"-D":null,...c].filter(I=>!!I),$=`${n} ${u.join(" ")}`;try{await Wt(n,u,{cwd:e})}catch(I){throw s("\uC758\uC874\uC131 \uC124\uCE58\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694."),new k({message:"\uC758\uC874\uC131 \uC124\uCE58\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694.",hint:"\uB124\uD2B8\uC6CC\uD06C \uC0C1\uD0DC\uB97C \uD655\uC778\uD558\uACE0, \uC124\uCE58 \uBA85\uB839\uC5B4\uB97C \uC9C1\uC811 \uC2E4\uD589\uD574 \uC0C1\uC138 \uC624\uB958\uB97C \uD655\uC778\uD574\uBCF4\uC138\uC694.",details:[`\uC2E4\uD589 \uBA85\uB839\uC5B4: ${$}`],cause:I})}return s("\uC758\uC874\uC131 \uC124\uCE58\uAC00 \uC644\uB8CC\uB410\uC5B4\uC694."),{installed:c,filtered:m}}import{randomUUID as Yt}from"node:crypto";import*as rt from"@clack/prompts";var Qt="seed_cli";async function Xt(e){if(process.env.DISABLE_TELEMETRY==="true"||process.env.SEED_DISABLE_TELEMETRY==="true")return!1;try{if((await ie(e))?.telemetry===!1)return!1}catch{}return!0}function Zt(){return Yt()}var er=Zt(),tt=!1;function st(e){return Object.fromEntries(Object.entries(e).filter(([,r])=>r!==void 0))}function tr(e){return e instanceof Error&&e.name?e.name:typeof e=="object"&&e!==null?e.constructor?.name??"Object":typeof e}async function ot(e,{event:r,properties:t={}}){if(!await Xt(e))return;let s=`${Qt}.${r}`;tt||(rt.log.info("\u{1F4CA} \uC0AC\uC6A9 \uB370\uC774\uD130 \uC218\uC9D1 \uC911 (\uBE44\uD65C\uC131\uD654: seed-design.json \uB610\uB294 DISABLE_TELEMETRY \uD658\uACBD \uBCC0\uC218)"),tt=!0);try{let n="https://us.i.posthog.com/capture",o={"Content-Type":"application/json"},a={api_key:"phc_seod8HhifElOP1R92KmvsQybrtUmkOTgZBsq0mfCelR",event:s,distinct_id:er,properties:{...t,$process_person_profile:!1},timestamp:new Date().toISOString()},c=new AbortController,m=setTimeout(()=>c.abort(),5e3);try{await fetch(n,{method:"POST",headers:o,body:JSON.stringify(a),signal:c.signal})}finally{clearTimeout(m)}}catch{}}async function nt(e,{command:r,status:t,result:i,properties:s={}}){await ot(e,{event:r,properties:st({status:t,result:i,...s})})}async function rr(e,{command:r,error:t,result:i,properties:s={}}){await nt(e,{command:r,status:"failed",result:i,properties:st({error_type:tr(t),...s})})}var v={track:ot,trackCommandFailure:rr,trackCommandOutcome:nt};import*as pe from"@clack/prompts";import sr from"fs-extra";import or from"path";import{intersects as nr,satisfies as ir,valid as at,validRange as ct}from"semver";var ar=["@seed-design/react","@seed-design/css"],cr=["@seed-design/lynx-react","@seed-design/lynx-css"];function ae(e){return e==="lynx"?cr:ar}var it="workspace:",lr="npm:";function ue(e,r="react"){try{let t=ne(e),i={...t.dependencies,...t.devDependencies,...t.peerDependencies,...t.optionalDependencies},s={},n=ae(r);for(let o of n){let a=i[o];if(typeof a=="string"){s[o]=a;continue}let c=Me(o,e)?.version;typeof c=="string"&&(s[o]=c)}return s}catch{return{}}}function ye({publicRegistries:e,itemKeys:r,projectPackageVersions:t,framework:i="react"}){let s=Array.from(new Set(r)),n=new Map(e.flatMap(c=>c.items.map(m=>[`${c.id}:${m.id}`,m]))),o=[],a=ae(i);for(let c of s){let m=n.get(c);if(!m)continue;let g=mr(m,i);for(let C of a){let u=Array.from(g[C]??[]);if(!u.length)continue;let $=t[C];if(!$){o.push({itemKey:c,packageName:C,requiredRanges:u,type:"missing-package"});continue}let I=pr($);if(!I){o.push({itemKey:c,packageName:C,requiredRanges:u,installedVersionSpec:$,type:"invalid-version-spec"});continue}u.every(T=>dr({currentVersionSpec:I,requiredRange:T}))||o.push({itemKey:c,packageName:C,requiredRanges:u,installedVersionSpec:$,type:"incompatible-version"})}}return{checkedItemKeys:s,projectPackageVersions:t,issues:o}}function he({report:e,title:r,framework:t="react"}){if(!e.issues.length)return;let i=ae(t);pe.log.warn(r),pe.log.info(`\uD604\uC7AC \uD504\uB85C\uC81D\uD2B8 \uBC84\uC804: ${i.map(n=>`${n}@${l(e.projectPackageVersions[n]??"\uBBF8\uC124\uCE58")}`).join(", ")}`);let s=new Map;for(let n of e.issues){let o=s.get(n.itemKey)??[];o.push(n),s.set(n.itemKey,o)}for(let[n,o]of s.entries()){pe.log.warn(l(n));for(let a of o){let c=a.requiredRanges.join(" | ");if(a.type==="missing-package"){pe.log.info(` - ${a.packageName}: \uD328\uD0A4\uC9C0\uAC00 \uC124\uCE58\uB418\uC5B4 \uC788\uC9C0 \uC54A\uC544\uC694. \uD544\uC694 \uBC94\uC704: ${c}`);continue}if(a.type==="invalid-version-spec"){pe.log.info(` - ${a.packageName}: \uD604\uC7AC \uBC84\uC804 \uD615\uC2DD\uC744 \uD574\uC11D\uD558\uC9C0 \uBABB\uD588\uC5B4\uC694 (${a.installedVersionSpec}). \uD544\uC694 \uBC94\uC704: ${c}`);continue}pe.log.info(` - ${a.packageName}: \uD604\uC7AC ${a.installedVersionSpec}, \uD544\uC694 \uBC94\uC704 ${c}`)}}}function lt({publicRegistries:e,rootPath:r}){let t=[];for(let i of e)for(let s of i.items)s.snippets.some(o=>fr(o.path).some(a=>sr.existsSync(or.join(r,i.id,a))))&&t.push(`${i.id}:${s.id}`);return t}function mr(e,r="react"){let t=ae(r),i=Object.fromEntries(t.map(s=>[s,new Set]));for(let s of e.snippets)for(let[n,o]of Object.entries(s.dependencies??{}))gr(n,r)&&i[n].add(o);return i}function pr(e){let r=e.trim();if(r.startsWith(it)&&(r=r.slice(it.length).trim()),r.startsWith(lr)){let t=r.split("@").at(-1);if(!t)return null;r=t}return!r||r==="*"?null:at(r)||ct(r)?r:null}function dr({currentVersionSpec:e,requiredRange:r}){let t=ct(r);return t?at(e)?ir(e,t,{includePrerelease:!0}):nr(e,t,{includePrerelease:!0}):!1}function fr(e){let r=new Set([e]);return e.endsWith(".tsx")&&r.add(`${e.slice(0,-4)}.jsx`),e.endsWith(".ts")&&r.add(`${e.slice(0,-3)}.js`),e.endsWith(".jsx")&&r.add(`${e.slice(0,-4)}.tsx`),e.endsWith(".js")&&r.add(`${e.slice(0,-3)}.ts`),Array.from(r)}function gr(e,r="react"){return ae(r).includes(e)}var yr=re.object({itemIds:re.array(re.string()).optional(),all:re.boolean(),cwd:re.string(),baseUrl:re.string().default(N),seedReactVersion:re.string().optional(),framework:re.enum(["react","lynx"]).optional(),onDiff:re.enum(["overwrite","backup"]).optional()}),mt=e=>{e.command("add [...item-ids]","add items").option("-a, --all","[Deprecated] Add all items",{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:N}).option("--seed-react-version <version>","\uC9C0\uC815\uD55C SEED React \uBC84\uC804\uC758 \uB808\uC9C0\uC2A4\uD2B8\uB9AC \uC0AC\uC6A9 (\uC608: 1.2)").option("-f, --framework <framework>","\uD504\uB808\uC784\uC6CC\uD06C (react \uB610\uB294 lynx)").option("--on-diff <mode>","Action when file differs: overwrite or backup").example("seed-design add ui:action-button").example("seed-design add ui:alert-dialog").action(async(r,t)=>{let i=Date.now(),s=W(t),n=typeof t?.cwd=="string"?t.cwd:process.cwd();_.intro("seed-design add");try{let o=Se(e.rawArgs,"--seed-react-version"),a=yr.safeParse({itemIds:r,...t,seedReactVersion:o});if(!a.success)throw a.error;let{data:{all:c,...m}}=a;if(c)throw new k({message:"`--all` \uC635\uC158\uC740 \uB354 \uC774\uC0C1 \uC9C0\uC6D0\uB418\uC9C0 \uC54A\uC544\uC694. \uB300\uC2E0 `seed-design add-all` \uBA85\uB839\uC5B4\uB97C \uC0AC\uC6A9\uD574\uC8FC\uC138\uC694."});let g=m.cwd,C=Pe(m),u=C?.baseUrl??m.baseUrl,$=await $e(g),I=C?.framework??m.framework??$.framework,A=ur.resolve(g,$.path),{start:T,stop:x}=_.spinner();T("Registry\uB97C \uAC00\uC838\uC624\uACE0 \uC788\uC5B4\uC694...");let y=await(async()=>{try{let p=await Promise.all((await de({baseUrl:u,framework:I})).map(async({id:f})=>fe({baseUrl:u,framework:I,registryId:f})));return x("Registry\uB97C \uAC00\uC838\uC654\uC5B4\uC694."),p}catch(p){throw x("Registry\uB97C \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694."),p}})(),h=await(async()=>{if(m.itemIds?.length)return m.itemIds;let p=await _.multiselect({message:"\uCD94\uAC00\uD560 \uD56D\uBAA9\uC744 \uC120\uD0DD\uD574\uC8FC\uC138\uC694 (\uC2A4\uD398\uC774\uC2A4 \uBC14\uB85C \uC5EC\uB7EC \uAC1C \uC120\uD0DD \uAC00\uB2A5)",options:y.filter(({hideFromCLICatalog:f})=>!f).flatMap(({id:f,items:E})=>E.filter(({hideFromCLICatalog:M})=>!M).sort((M,L)=>M.id.localeCompare(L.id)).map(({id:M,description:L,deprecated:R})=>({label:`${R?"(deprecated) ":""}${l(f)}:${M}`,value:`${f}:${M}`,hint:L,deprecated:R,registryItemCount:E.length}))).sort((f,E)=>f.deprecated!==E.deprecated?f.deprecated?1:-1:E.registryItemCount-f.registryItemCount)});if(_.isCancel(p))throw new D;return p})();if(!h?.length)throw new D("\uCD94\uAC00\uD560 \uD56D\uBAA9\uC774 \uC120\uD0DD\uB418\uC9C0 \uC54A\uC558\uC5B4\uC694.");_.log.message(`\uC120\uD0DD\uB41C \uD56D\uBAA9: ${l(h.join(", "))}`);let w=[];for(let p of h){let[f,...E]=p.split(":"),M=E.join(":");if(!f||!M)throw new k({message:`${l(p)}: \uD56D\uBAA9 \uC774\uB984\uC774 \uC798\uBABB\uB418\uC5C8\uC5B4\uC694.`,hint:`${l("ui:action-button")}\uACFC \uAC19\uC740 \uD615\uC2DD\uC73C\uB85C \uC785\uB825\uD574\uBCF4\uC138\uC694.`});let L=y.find(R=>R.id===f)?.items.find(R=>R.id===M);if(!L)throw new k({message:`${l(p)}: \uD56D\uBAA9\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.`});if(L.deprecated){let R=await _.confirm({message:`${l(L.id)}: deprecated \uB418\uC5C8\uC5B4\uC694. \uCD94\uAC00\uD560\uAE4C\uC694?`,initialValue:!1});if(_.isCancel(R))throw new D;if(R===!1){_.log.info(`${l(L.id)}: \uCD94\uAC00\uD558\uC9C0 \uC54A\uC744\uAC8C\uC694.`);continue}}w.push(p)}let{registryItemsToAdd:P,npmDependenciesToAdd:F}=xe({selectedItemKeys:w,publicRegistries:y}),ee=ye({publicRegistries:y,itemKeys:P.flatMap(({registryId:p,items:f})=>f.map(E=>`${p}:${E.id}`)),projectPackageVersions:ue(m.cwd,I),framework:I});he({report:ee,title:"\uD604\uC7AC \uD504\uB85C\uC81D\uD2B8 \uBC84\uC804\uACFC \uD638\uD658\uB418\uC9C0 \uC54A\uC744 \uC218 \uC788\uB294 \uC2A4\uB2C8\uD3AB\uC774 \uC788\uC5B4\uC694.",framework:I}),_.log.info(`\uCD94\uAC00\uD560 \uD56D\uBAA9: ${l(P.map(p=>p.items.map(f=>`${p.registryId}:${f.id}`).join(", ")).join(", ")||"\uC5C6\uC74C")}
12
+ `),G.log.message(b),G.select({message:"\uD604\uC7AC \uD30C\uC77C\uC5D0 \uC2A4\uD0C0\uC77C \uBCC0\uACBD, \uB85C\uAE45 \uB4F1 \uCEE4\uC2A4\uD130\uB9C8\uC774\uC9D5\uC774 \uC801\uC6A9\uB418\uC5B4 \uC788\uB294 \uACBD\uC6B0 \uC2E0\uADDC \uD30C\uC77C\uC5D0 \uB3D9\uC77C\uD55C \uCEE4\uC2A4\uD130\uB9C8\uC774\uC9D5\uC744 \uC801\uC6A9\uD558\uB294 \uAC83\uC744 \uAC80\uD1A0\uD574\uBCF4\uC138\uC694.",options:[{value:"overwrite",label:`${P} \uB36E\uC5B4\uC4F0\uAE30`},{value:"backup",label:`\uAE30\uC874 \uD30C\uC77C \uB0B4\uC6A9\uC744 ${K}\uC73C\uB85C \uC62E\uAE30\uACE0 ${P} \uBC1B\uAE30`},{value:"skip",label:"\uC0C8 \uD30C\uC77C \uBC1B\uC9C0 \uC54A\uACE0 \uADF8\uB300\uB85C \uB450\uAE30"}]})})();if(G.isCancel(U)||U==="skip"){G.log.info(`${l(h)}: \uD30C\uC77C\uC744 \uBC1B\uC9C0 \uC54A\uACE0 \uAC74\uB108\uB6F0\uC5C8\uC5B4\uC694.`);continue}if(U==="backup"){let H=X.dirname(x),b=X.join(H,K);await ge.rename(x,b),G.log.info(`${l(h)}: \uAE30\uC874 \uD30C\uC77C\uC744 ${l(X.relative(t,b))}\uB85C \uC62E\uACBC\uC5B4\uC694.`)}}await ge.writeFile(x,y),A.push(T)}if(A.length>0){let T=A.map(({name:x,relativePath:y})=>({name:x,path:y}));a.push(...T),G.log.success(`${l(`${c}:${u}`)} \uAD00\uB828 \uC2A4\uB2C8\uD3AB \uB2E4\uC6B4\uB85C\uB4DC \uC644\uB8CC: ${l(T.map(x=>x.path).join(", "))}`)}}}}import*as _ from"@clack/prompts";import ur from"path";import{z as re}from"zod";var N="https://seed-design.io";var Xe={"1.0":"https://v1-0.seed-design.io","1.1":"https://v1-1.seed-design.io","1.2":"https://v1-2.seed-design.io",2:"https://seed-design.io/react/v2"};function Pe(e){let r=e.seedReactVersion?.trim();if(!r)return null;let t=Xe[r];if(!t)throw new k({message:`\uC9C0\uC6D0\uD558\uC9C0 \uC54A\uB294 SEED React \uBC84\uC804\uC774\uC5D0\uC694: "${e.seedReactVersion}"`,hint:`\uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uBC84\uC804: ${Object.keys(Xe).join(", ")}`});return{framework:"react",baseUrl:t}}function Se(e,r){for(let t=0;t<e.length;t++){let i=e[t];if(i===r)return e[t+1];if(i.startsWith(`${r}=`))return i.slice(r.length+1)}}import*as et from"@clack/prompts";import{execa as Wt}from"execa";import{detect as Ht}from"@antfu/ni";async function Ze(e){let r=await Ht({programmatic:!0,cwd:e});return r==="yarn@berry"?"yarn":r==="pnpm@6"?"pnpm":r==="bun"?"bun":r==="deno"?"deno":r??"npm"}async function Re({cwd:e,deps:r,dev:t=!1}){let{start:i,stop:s}=et.spinner(),n=await Ze(e),a={...ne(e).dependencies},c=new Set(r.filter(I=>!a[I])),m=new Set(r.filter(I=>a[I]));if(!c.size)return{installed:new Set,filtered:c};i("\uC758\uC874\uC131 \uC124\uCE58\uC911...");let u=[n==="npm"?"install":"add",t?"-D":null,...c].filter(I=>!!I),$=`${n} ${u.join(" ")}`;try{await Wt(n,u,{cwd:e})}catch(I){throw s("\uC758\uC874\uC131 \uC124\uCE58\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694."),new k({message:"\uC758\uC874\uC131 \uC124\uCE58\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694.",hint:"\uB124\uD2B8\uC6CC\uD06C \uC0C1\uD0DC\uB97C \uD655\uC778\uD558\uACE0, \uC124\uCE58 \uBA85\uB839\uC5B4\uB97C \uC9C1\uC811 \uC2E4\uD589\uD574 \uC0C1\uC138 \uC624\uB958\uB97C \uD655\uC778\uD574\uBCF4\uC138\uC694.",details:[`\uC2E4\uD589 \uBA85\uB839\uC5B4: ${$}`],cause:I})}return s("\uC758\uC874\uC131 \uC124\uCE58\uAC00 \uC644\uB8CC\uB410\uC5B4\uC694."),{installed:c,filtered:m}}import{randomUUID as Yt}from"node:crypto";import*as rt from"@clack/prompts";var Qt="seed_cli";async function Xt(e){if(process.env.DISABLE_TELEMETRY==="true"||process.env.SEED_DISABLE_TELEMETRY==="true")return!1;try{if((await ie(e))?.telemetry===!1)return!1}catch{}return!0}function Zt(){return Yt()}var er=Zt(),tt=!1;function st(e){return Object.fromEntries(Object.entries(e).filter(([,r])=>r!==void 0))}function tr(e){return e instanceof Error&&e.name?e.name:typeof e=="object"&&e!==null?e.constructor?.name??"Object":typeof e}async function ot(e,{event:r,properties:t={}}){if(!await Xt(e))return;let s=`${Qt}.${r}`;tt||(rt.log.info("\u{1F4CA} \uC0AC\uC6A9 \uB370\uC774\uD130 \uC218\uC9D1 \uC911 (\uBE44\uD65C\uC131\uD654: seed-design.json \uB610\uB294 DISABLE_TELEMETRY \uD658\uACBD \uBCC0\uC218)"),tt=!0);try{let n="https://us.i.posthog.com/capture",o={"Content-Type":"application/json"},a={api_key:"phc_seod8HhifElOP1R92KmvsQybrtUmkOTgZBsq0mfCelR",event:s,distinct_id:er,properties:{...t,$process_person_profile:!1},timestamp:new Date().toISOString()},c=new AbortController,m=setTimeout(()=>c.abort(),5e3);try{await fetch(n,{method:"POST",headers:o,body:JSON.stringify(a),signal:c.signal})}finally{clearTimeout(m)}}catch{}}async function nt(e,{command:r,status:t,result:i,properties:s={}}){await ot(e,{event:r,properties:st({status:t,result:i,...s})})}async function rr(e,{command:r,error:t,result:i,properties:s={}}){await nt(e,{command:r,status:"failed",result:i,properties:st({error_type:tr(t),...s})})}var v={track:ot,trackCommandFailure:rr,trackCommandOutcome:nt};import*as pe from"@clack/prompts";import sr from"fs-extra";import or from"path";import{intersects as nr,satisfies as ir,valid as at,validRange as ct}from"semver";var ar=["@seed-design/react","@seed-design/css"],cr=["@seed-design/lynx-react","@seed-design/lynx-css"];function ae(e){return e==="lynx"?cr:ar}var it="workspace:",lr="npm:";function ue(e,r="react"){try{let t=ne(e),i={...t.dependencies,...t.devDependencies,...t.peerDependencies,...t.optionalDependencies},s={},n=ae(r);for(let o of n){let a=i[o];if(typeof a=="string"){s[o]=a;continue}let c=Me(o,e)?.version;typeof c=="string"&&(s[o]=c)}return s}catch{return{}}}function ye({publicRegistries:e,itemKeys:r,projectPackageVersions:t,framework:i="react"}){let s=Array.from(new Set(r)),n=new Map(e.flatMap(c=>c.items.map(m=>[`${c.id}:${m.id}`,m]))),o=[],a=ae(i);for(let c of s){let m=n.get(c);if(!m)continue;let g=mr(m,i);for(let C of a){let u=Array.from(g[C]??[]);if(!u.length)continue;let $=t[C];if(!$){o.push({itemKey:c,packageName:C,requiredRanges:u,type:"missing-package"});continue}let I=pr($);if(!I){o.push({itemKey:c,packageName:C,requiredRanges:u,installedVersionSpec:$,type:"invalid-version-spec"});continue}u.every(T=>dr({currentVersionSpec:I,requiredRange:T}))||o.push({itemKey:c,packageName:C,requiredRanges:u,installedVersionSpec:$,type:"incompatible-version"})}}return{checkedItemKeys:s,projectPackageVersions:t,issues:o}}function he({report:e,title:r,framework:t="react"}){if(!e.issues.length)return;let i=ae(t);pe.log.warn(r),pe.log.info(`\uD604\uC7AC \uD504\uB85C\uC81D\uD2B8 \uBC84\uC804: ${i.map(n=>`${n}@${l(e.projectPackageVersions[n]??"\uBBF8\uC124\uCE58")}`).join(", ")}`);let s=new Map;for(let n of e.issues){let o=s.get(n.itemKey)??[];o.push(n),s.set(n.itemKey,o)}for(let[n,o]of s.entries()){pe.log.warn(l(n));for(let a of o){let c=a.requiredRanges.join(" | ");if(a.type==="missing-package"){pe.log.info(` - ${a.packageName}: \uD328\uD0A4\uC9C0\uAC00 \uC124\uCE58\uB418\uC5B4 \uC788\uC9C0 \uC54A\uC544\uC694. \uD544\uC694 \uBC94\uC704: ${c}`);continue}if(a.type==="invalid-version-spec"){pe.log.info(` - ${a.packageName}: \uD604\uC7AC \uBC84\uC804 \uD615\uC2DD\uC744 \uD574\uC11D\uD558\uC9C0 \uBABB\uD588\uC5B4\uC694 (${a.installedVersionSpec}). \uD544\uC694 \uBC94\uC704: ${c}`);continue}pe.log.info(` - ${a.packageName}: \uD604\uC7AC ${a.installedVersionSpec}, \uD544\uC694 \uBC94\uC704 ${c}`)}}}function lt({publicRegistries:e,rootPath:r}){let t=[];for(let i of e)for(let s of i.items)s.snippets.some(o=>fr(o.path).some(a=>sr.existsSync(or.join(r,i.id,a))))&&t.push(`${i.id}:${s.id}`);return t}function mr(e,r="react"){let t=ae(r),i=Object.fromEntries(t.map(s=>[s,new Set]));for(let s of e.snippets)for(let[n,o]of Object.entries(s.dependencies??{}))gr(n,r)&&i[n].add(o);return i}function pr(e){let r=e.trim();if(r.startsWith(it)&&(r=r.slice(it.length).trim()),r.startsWith(lr)){let t=r.split("@").at(-1);if(!t)return null;r=t}return!r||r==="*"?null:at(r)||ct(r)?r:null}function dr({currentVersionSpec:e,requiredRange:r}){let t=ct(r);return t?at(e)?ir(e,t,{includePrerelease:!0}):nr(e,t,{includePrerelease:!0}):!1}function fr(e){let r=new Set([e]);return e.endsWith(".tsx")&&r.add(`${e.slice(0,-4)}.jsx`),e.endsWith(".ts")&&r.add(`${e.slice(0,-3)}.js`),e.endsWith(".jsx")&&r.add(`${e.slice(0,-4)}.tsx`),e.endsWith(".js")&&r.add(`${e.slice(0,-3)}.ts`),Array.from(r)}function gr(e,r="react"){return ae(r).includes(e)}var yr=re.object({itemIds:re.array(re.string()).optional(),all:re.boolean(),cwd:re.string(),baseUrl:re.string().default(N),seedReactVersion:re.string().optional(),framework:re.enum(["react","lynx"]).optional(),onDiff:re.enum(["overwrite","backup"]).optional()}),mt=e=>{e.command("add [...item-ids]","add items").option("-a, --all","[Deprecated] Add all items",{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:N}).option("--seed-react-version <version>","\uC9C0\uC815\uD55C SEED React \uBC84\uC804\uC758 \uB808\uC9C0\uC2A4\uD2B8\uB9AC \uC0AC\uC6A9 (\uC608: 2)").option("-f, --framework <framework>","\uD504\uB808\uC784\uC6CC\uD06C (react \uB610\uB294 lynx)").option("--on-diff <mode>","Action when file differs: overwrite or backup").example("seed-design add ui:action-button").example("seed-design add ui:alert-dialog").action(async(r,t)=>{let i=Date.now(),s=W(t),n=typeof t?.cwd=="string"?t.cwd:process.cwd();_.intro("seed-design add");try{let o=Se(e.rawArgs,"--seed-react-version"),a=yr.safeParse({itemIds:r,...t,seedReactVersion:o});if(!a.success)throw a.error;let{data:{all:c,...m}}=a;if(c)throw new k({message:"`--all` \uC635\uC158\uC740 \uB354 \uC774\uC0C1 \uC9C0\uC6D0\uB418\uC9C0 \uC54A\uC544\uC694. \uB300\uC2E0 `seed-design add-all` \uBA85\uB839\uC5B4\uB97C \uC0AC\uC6A9\uD574\uC8FC\uC138\uC694."});let g=m.cwd,C=Pe(m),u=C?.baseUrl??m.baseUrl,$=await $e(g),I=C?.framework??m.framework??$.framework,A=ur.resolve(g,$.path),{start:T,stop:x}=_.spinner();T("Registry\uB97C \uAC00\uC838\uC624\uACE0 \uC788\uC5B4\uC694...");let y=await(async()=>{try{let p=await Promise.all((await de({baseUrl:u,framework:I})).map(async({id:f})=>fe({baseUrl:u,framework:I,registryId:f})));return x("Registry\uB97C \uAC00\uC838\uC654\uC5B4\uC694."),p}catch(p){throw x("Registry\uB97C \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694."),p}})(),h=await(async()=>{if(m.itemIds?.length)return m.itemIds;let p=await _.multiselect({message:"\uCD94\uAC00\uD560 \uD56D\uBAA9\uC744 \uC120\uD0DD\uD574\uC8FC\uC138\uC694 (\uC2A4\uD398\uC774\uC2A4 \uBC14\uB85C \uC5EC\uB7EC \uAC1C \uC120\uD0DD \uAC00\uB2A5)",options:y.filter(({hideFromCLICatalog:f})=>!f).flatMap(({id:f,items:E})=>E.filter(({hideFromCLICatalog:M})=>!M).sort((M,L)=>M.id.localeCompare(L.id)).map(({id:M,description:L,deprecated:R})=>({label:`${R?"(deprecated) ":""}${l(f)}:${M}`,value:`${f}:${M}`,hint:L,deprecated:R,registryItemCount:E.length}))).sort((f,E)=>f.deprecated!==E.deprecated?f.deprecated?1:-1:E.registryItemCount-f.registryItemCount)});if(_.isCancel(p))throw new D;return p})();if(!h?.length)throw new D("\uCD94\uAC00\uD560 \uD56D\uBAA9\uC774 \uC120\uD0DD\uB418\uC9C0 \uC54A\uC558\uC5B4\uC694.");_.log.message(`\uC120\uD0DD\uB41C \uD56D\uBAA9: ${l(h.join(", "))}`);let w=[];for(let p of h){let[f,...E]=p.split(":"),M=E.join(":");if(!f||!M)throw new k({message:`${l(p)}: \uD56D\uBAA9 \uC774\uB984\uC774 \uC798\uBABB\uB418\uC5C8\uC5B4\uC694.`,hint:`${l("ui:action-button")}\uACFC \uAC19\uC740 \uD615\uC2DD\uC73C\uB85C \uC785\uB825\uD574\uBCF4\uC138\uC694.`});let L=y.find(R=>R.id===f)?.items.find(R=>R.id===M);if(!L)throw new k({message:`${l(p)}: \uD56D\uBAA9\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.`});if(L.deprecated){let R=await _.confirm({message:`${l(L.id)}: deprecated \uB418\uC5C8\uC5B4\uC694. \uCD94\uAC00\uD560\uAE4C\uC694?`,initialValue:!1});if(_.isCancel(R))throw new D;if(R===!1){_.log.info(`${l(L.id)}: \uCD94\uAC00\uD558\uC9C0 \uC54A\uC744\uAC8C\uC694.`);continue}}w.push(p)}let{registryItemsToAdd:P,npmDependenciesToAdd:F}=xe({selectedItemKeys:w,publicRegistries:y}),ee=ye({publicRegistries:y,itemKeys:P.flatMap(({registryId:p,items:f})=>f.map(E=>`${p}:${E.id}`)),projectPackageVersions:ue(m.cwd,I),framework:I});he({report:ee,title:"\uD604\uC7AC \uD504\uB85C\uC81D\uD2B8 \uBC84\uC804\uACFC \uD638\uD658\uB418\uC9C0 \uC54A\uC744 \uC218 \uC788\uB294 \uC2A4\uB2C8\uD3AB\uC774 \uC788\uC5B4\uC694.",framework:I}),_.log.info(`\uCD94\uAC00\uD560 \uD56D\uBAA9: ${l(P.map(p=>p.items.map(f=>`${p.registryId}:${f.id}`).join(", ")).join(", ")||"\uC5C6\uC74C")}
13
13
 
14
- \uC124\uCE58\uD560 \uC758\uC874\uC131: ${l(Array.from(F).join(", ")||"\uC5C6\uC74C")}`),await ke({registryItemsToAdd:P,rootPath:A,cwd:g,baseUrl:u,framework:I,config:$,onDiff:m.onDiff});let{installed:S,filtered:K}=await Re({cwd:g,deps:Array.from(F)});S.size===0&&_.log.message("\uBAA8\uB4E0 \uC758\uC874\uC131\uC774 \uC774\uBBF8 \uC124\uCE58\uB418\uC5B4 \uC788\uC5B4\uC694."),S.size&&(_.log.message(`\uC758\uC874\uC131 \uC124\uCE58 \uC644\uB8CC: ${l(Array.from(S).join(", "))}`),K.size&&_.log.message(`\uC124\uCE58\uD558\uC9C0 \uC54A\uC740 \uC758\uC874\uC131 (\uC774\uBBF8 \uC124\uCE58\uB428): ${l(Array.from(K).join(", "))}`)),_.outro("\uC644\uB8CC\uD588\uC5B4\uC694.");let U=Date.now()-i,H=new Set(P.map(p=>p.registryId)),b=h.some(p=>{let[f,...E]=p.split(":"),M=E.join(":");return y.find(L=>L.id===f)?.items.find(L=>L.id===M)?.deprecated});try{await v.trackCommandOutcome(m.cwd,{command:"add",status:"completed",properties:{items_count:w.length,registries:Array.from(H),has_deprecated:b,dependencies_count:F.size,duration_ms:U}})}catch(p){s&&console.error("[Telemetry] add \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",p)}}catch(o){if(q(o)){try{await v.trackCommandOutcome(n,{command:"add",status:"cancelled",properties:{duration_ms:Date.now()-i}})}catch(a){s&&console.error("[Telemetry] add \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",a)}_.outro(l(o.message)),process.exit(0)}try{await v.trackCommandFailure(n,{command:"add",error:o,properties:{duration_ms:Date.now()-i}})}catch(a){s&&console.error("[Telemetry] add \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",a)}Y(o,{defaultMessage:"\uCD94\uAC00\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694.",defaultHint:"`--verbose` \uC635\uC158\uC73C\uB85C \uC0C1\uC138 \uC624\uB958\uB97C \uD655\uC778\uD574\uBCF4\uC138\uC694.",verbose:s}),process.exit(1)}})};import*as O from"@clack/prompts";import hr from"path";import{z as Z}from"zod";var wr=Z.object({registryIds:Z.array(Z.string()).optional(),all:Z.boolean(),includeDeprecated:Z.boolean().optional(),cwd:Z.string(),baseUrl:Z.string().default(N),seedReactVersion:Z.string().optional(),framework:Z.enum(["react","lynx"]).optional(),onDiff:Z.enum(["overwrite","backup"]).optional()}),pt=e=>{e.command("add-all [...registry-ids]","add all items from registries").option("-a, --all","Add all items from all registries",{default:!1}).option("--include-deprecated","Include deprecated items 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:N}).option("--seed-react-version <version>","\uC9C0\uC815\uD55C SEED React \uBC84\uC804\uC758 \uB808\uC9C0\uC2A4\uD2B8\uB9AC \uC0AC\uC6A9 (\uC608: 1.2)").option("-f, --framework <framework>","\uD504\uB808\uC784\uC6CC\uD06C (react \uB610\uB294 lynx)").option("--on-diff <mode>","Action when file differs: overwrite or backup").example("seed-design add-all ui --include-deprecated").example("seed-design add-all ui lib breeze").action(async(r,t)=>{let i=Date.now(),s=W(t),n=typeof t?.cwd=="string"?t.cwd:process.cwd();O.intro("seed-design add-all");try{let o=Se(e.rawArgs,"--seed-react-version"),a=wr.safeParse({registryIds:r,...t,seedReactVersion:o});if(!a.success)throw a.error;let{data:c}=a,m=c.cwd,g=Pe(c),C=g?.baseUrl??c.baseUrl,u=await $e(m),$=g?.framework??c.framework??u.framework,I=hr.resolve(m,u.path),{start:A,stop:T}=O.spinner();A("Registry\uB97C \uAC00\uC838\uC624\uACE0 \uC788\uC5B4\uC694...");let x=await(async()=>{try{let b=await Promise.all((await de({baseUrl:C,framework:$})).map(async({id:p})=>fe({baseUrl:C,framework:$,registryId:p})));return T("Registry\uB97C \uAC00\uC838\uC654\uC5B4\uC694."),b}catch(b){throw T("Registry\uB97C \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694."),b}})(),y=await(async()=>{if(c.all){let p=x.map(f=>f.id);return O.log.message(`\uBAA8\uB4E0 \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC758 \uBAA8\uB4E0 \uD56D\uBAA9\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4: ${l(p.join(", "))}`),p}if(c.registryIds?.length){let p=x.map(f=>f.id);for(let f of c.registryIds)if(!p.includes(f))throw new k({message:`\uB808\uC9C0\uC2A4\uD2B8\uB9AC '${f}'\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.`,details:[`\uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uB808\uC9C0\uC2A4\uD2B8\uB9AC: ${p.join(", ")}`]});return O.log.message(`\uC120\uD0DD\uB41C \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC758 \uBAA8\uB4E0 \uD56D\uBAA9\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4: ${l(c.registryIds.join(", "))}`),c.registryIds}let b=await O.multiselect({message:"\uCD94\uAC00\uD560 \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uB97C \uC120\uD0DD\uD574\uC8FC\uC138\uC694 (\uC2A4\uD398\uC774\uC2A4 \uBC14\uB85C \uC5EC\uB7EC \uAC1C \uC120\uD0DD \uAC00\uB2A5)",options:x.filter(({hideFromCLICatalog:p})=>!p).sort((p,f)=>f.items.length-p.items.length).map(p=>{let f=p.items[0]?.id,E=f?`${p.items.length}\uAC1C \uD56D\uBAA9 (${f} \uB4F1)`:`${p.items.length}\uAC1C \uD56D\uBAA9 (\uD56D\uBAA9 \uC5C6\uC74C)`;return{label:p.id,value:p.id,hint:E}})});if(O.isCancel(b))throw new D;return O.log.message(`\uC120\uD0DD\uB41C \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC758 \uD56D\uBAA9\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4: ${l(b.join(", "))}`),b})(),h=x.filter(b=>y.includes(b.id)),w=h.flatMap(b=>b.items.filter(p=>p.deprecated?c.includeDeprecated:!0).map(p=>`${b.id}:${p.id}`)),P=h.reduce((b,p)=>b+p.items.filter(f=>f.deprecated).length,0);if(!c.includeDeprecated&&P>0&&O.log.info(`${P}\uAC1C\uC758 deprecated \uD56D\uBAA9\uC740 \uC81C\uC678\uB418\uC5C8\uC5B4\uC694. --include-deprecated \uC635\uC158\uC744 \uC0AC\uC6A9\uD558\uBA74 \uCD94\uAC00\uD560 \uC218 \uC788\uC5B4\uC694.`),!w.length)throw new D("\uCD94\uAC00\uD560 \uD56D\uBAA9\uC774 \uC5C6\uC5B4\uC694.");O.log.message(`\uCD1D ${l(w.length.toString())}\uAC1C\uC758 \uD56D\uBAA9\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4.`);let{registryItemsToAdd:F,npmDependenciesToAdd:ee}=xe({selectedItemKeys:w,publicRegistries:x}),S=ye({publicRegistries:x,itemKeys:F.flatMap(({registryId:b,items:p})=>p.map(f=>`${b}:${f.id}`)),projectPackageVersions:ue(c.cwd,$),framework:$});he({report:S,title:"\uD604\uC7AC \uD504\uB85C\uC81D\uD2B8 \uBC84\uC804\uACFC \uD638\uD658\uB418\uC9C0 \uC54A\uC744 \uC218 \uC788\uB294 \uC2A4\uB2C8\uD3AB\uC774 \uC788\uC5B4\uC694.",framework:$}),await ke({registryItemsToAdd:F,rootPath:I,cwd:m,baseUrl:C,framework:$,config:u,onDiff:c.onDiff});let{installed:K,filtered:U}=await Re({cwd:m,deps:Array.from(ee)});K.size===0&&O.log.message("\uBAA8\uB4E0 \uC758\uC874\uC131\uC774 \uC774\uBBF8 \uC124\uCE58\uB418\uC5B4 \uC788\uC5B4\uC694."),K.size&&(O.log.message(`\uC758\uC874\uC131 \uC124\uCE58 \uC644\uB8CC: ${l(Array.from(K).join(", "))}`),U.size&&O.log.message(`\uC124\uCE58\uD558\uC9C0 \uC54A\uC740 \uC758\uC874\uC131 (\uC774\uBBF8 \uC124\uCE58\uB428): ${l(Array.from(U).join(", "))}`)),O.outro("\uC644\uB8CC\uD588\uC5B4\uC694.");let H=Date.now()-i;try{await v.trackCommandOutcome(c.cwd,{command:"add-all",status:"completed",properties:{registries:y,items_count:w.length,include_deprecated:c.includeDeprecated||!1,dependencies_count:ee.size,duration_ms:H}})}catch(b){s&&console.error("[Telemetry] add-all \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",b)}}catch(o){if(q(o)){try{await v.trackCommandOutcome(n,{command:"add-all",status:"cancelled",properties:{duration_ms:Date.now()-i}})}catch(a){s&&console.error("[Telemetry] add-all \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",a)}O.outro(l(o.message)),process.exit(0)}try{await v.trackCommandFailure(n,{command:"add-all",error:o,properties:{duration_ms:Date.now()-i}})}catch(a){s&&console.error("[Telemetry] add-all \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",a)}Y(o,{defaultMessage:"\uCD94\uAC00\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694.",defaultHint:"`--verbose` \uC635\uC158\uC73C\uB85C \uC0C1\uC138 \uC624\uB958\uB97C \uD655\uC778\uD574\uBCF4\uC138\uC694.",verbose:s}),process.exit(1)}})};import*as V from"@clack/prompts";import dt from"path";import{z}from"zod";var br=z.object({itemIds:z.array(z.string()).optional(),component:z.union([z.string(),z.array(z.string())]).optional(),all:z.boolean(),registry:z.string().optional(),cwd:z.string(),baseUrl:z.string().default(N),framework:z.enum(["react","lynx"]).optional()});function Cr({itemIds:e,component:r}){let t=n=>n.trim().replace(/\s+/g,"-"),i=(e??[]).map(t).filter(Boolean),s=(Array.isArray(r)?r:[r]).filter(n=>!!n).flatMap(n=>n.split(",")).map(t).filter(Boolean);return Array.from(new Set([...i,...s]))}function $r({publicRegistries:e,targetInputs:r,defaultRegistry:t}){let i=e.filter(n=>typeof n.id=="string"&&Array.isArray(n.items)).flatMap(n=>n.items.filter(o=>typeof o.id=="string").map(o=>`${n.id}:${o.id}`)),s=new Set;for(let n of r){let o=n.includes(":")?n:t?`${t}:${n}`:(()=>{let a=i.filter(c=>c.endsWith(`:${n}`));if(!a.length)throw new k({message:`${l(n)}: \uD56D\uBAA9\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.`,hint:`${l("ui:action-button")}\uCC98\uB7FC registry\uB97C \uD3EC\uD568\uD574\uC11C \uC785\uB825\uD574\uBCF4\uC138\uC694.`});if(a.length>1)throw new k({message:`${l(n)}: \uAC19\uC740 \uC774\uB984\uC758 \uD56D\uBAA9\uC774 \uC5EC\uB7EC \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC5D0 \uC788\uC5B4\uC694.`,details:a.map(c=>`- ${c}`),hint:`${l("ui:action-button")}\uCC98\uB7FC registry\uB97C \uD3EC\uD568\uD574\uC11C \uC785\uB825\uD574\uBCF4\uC138\uC694.`});return a[0]})();if(!i.includes(o))throw new k({message:`${l(o)}: \uD56D\uBAA9\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.`});s.add(o)}return Array.from(s)}var ft=e=>{e.command("compat [...item-ids]","check snippet compatibility").option("-c, --component <component>","\uAC80\uC0AC\uD560 \uCEF4\uD3EC\uB10C\uD2B8. \uC5EC\uB7EC \uBC88 \uB610\uB294 \uC27C\uD45C\uB85C \uC9C0\uC815 \uAC00\uB2A5").option("-a, --all","\uBAA8\uB4E0 registry \uD56D\uBAA9\uC744 \uAC80\uC0AC",{default:!1}).option("-r, --registry <registryId>","\uCEF4\uD3EC\uB10C\uD2B8 shorthand \uC785\uB825 \uC2DC \uAE30\uBCF8 registry").option("--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:N}).option("-f, --framework <framework>","\uD504\uB808\uC784\uC6CC\uD06C (react \uB610\uB294 lynx)").example("seed-design compat").example("seed-design compat -c action-button").example("seed-design compat ui:action-button ui:alert-dialog").example("seed-design compat --all").action(async(r,t)=>{let i=Date.now(),s=W(t),n=typeof t?.cwd=="string"?t.cwd:process.cwd();V.intro("seed-design compat");try{let o=br.safeParse({itemIds:r,...t});if(!o.success)throw o.error;let{data:a}=o,c=await ie(a.cwd),m=a.framework??c?.framework??"react",{start:g,stop:C}=V.spinner();g("Registry\uB97C \uAC00\uC838\uC624\uACE0 \uC788\uC5B4\uC694...");let u=await(async()=>{try{let h=await Promise.all((await de({baseUrl:a.baseUrl,framework:m})).map(async({id:w})=>fe({baseUrl:a.baseUrl,framework:m,registryId:w})));return C("Registry\uB97C \uAC00\uC838\uC654\uC5B4\uC694."),h}catch(h){throw C("Registry\uB97C \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694."),h}})(),$=Cr({itemIds:a.itemIds,component:a.component}),I=a.all?u.flatMap(w=>w.items.map(P=>`${w.id}:${P.id}`)):$.length>0?$r({publicRegistries:u,targetInputs:$,defaultRegistry:a.registry}):ie(a.cwd),A=Array.isArray(I)?I:await(async()=>{let h=await I;if(!h)throw new k({message:"seed-design.json \uD30C\uC77C\uC774 \uC5C6\uC5B4 \uC124\uCE58\uB41C \uC2A4\uB2C8\uD3AB \uACBD\uB85C\uB97C \uC54C \uC218 \uC5C6\uC5B4\uC694.",hint:"`seed-design init`\uC73C\uB85C \uC124\uC815\uC744 \uB9CC\uB4E0 \uB4A4 \uC2E4\uD589\uD558\uAC70\uB098, `--all`/`-c`\uB85C \uAC80\uC0AC \uB300\uC0C1\uC744 \uC9C1\uC811 \uC9C0\uC815\uD574\uC8FC\uC138\uC694."});let w=dt.resolve(a.cwd,h.path),P=lt({publicRegistries:u,rootPath:w});return P.length?P:(V.log.info(`${l(dt.relative(a.cwd,w)||h.path)}\uC5D0\uC11C \uC124\uCE58\uB41C \uC2A4\uB2C8\uD3AB\uC744 \uCC3E\uC9C0 \uBABB\uD588\uC5B4\uC694.`),[])})();if(!A.length){try{await v.trackCommandOutcome(a.cwd,{command:"compat",status:"completed",result:"empty",properties:{duration_ms:Date.now()-i}})}catch(h){s&&console.error("[Telemetry] compat \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",h)}V.outro("\uAC80\uC0AC\uD560 \uC2A4\uB2C8\uD3AB\uC774 \uC5C6\uC5B4\uC694."),process.exit(0)}let T=ue(a.cwd,m),x=ye({publicRegistries:u,itemKeys:A,projectPackageVersions:T,framework:m});if(V.log.info(`\uAC80\uC0AC \uB300\uC0C1: ${l(x.checkedItemKeys.join(", "))}`),!x.issues.length){let h=ae(m);V.outro(`\uBAA8\uB4E0 \uC2A4\uB2C8\uD3AB\uC774 \uD604\uC7AC ${h.join(", ")}\uC640 \uD638\uD658\uB3FC\uC694.`);try{await v.trackCommandOutcome(a.cwd,{command:"compat",status:"completed",result:"compatible",properties:{checked_items_count:x.checkedItemKeys.length,incompatible_items_count:0,duration_ms:Date.now()-i}})}catch(w){s&&console.error("[Telemetry] compat \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",w)}process.exit(0)}he({report:x,title:"\uD604\uC7AC \uD504\uB85C\uC81D\uD2B8 \uBC84\uC804\uACFC \uD638\uD658\uB418\uC9C0 \uC54A\uB294 \uC2A4\uB2C8\uD3AB\uC744 \uCC3E\uC558\uC5B4\uC694.",framework:m});let y=ae(m);V.log.info(`\uD544\uC694\uD55C \uBC84\uC804\uC73C\uB85C ${y.join(" \uB610\uB294 ")}\uB97C \uB9DE\uCD98 \uB4A4 \uB2E4\uC2DC \uC2E4\uD589\uD574\uBCF4\uC138\uC694.`),V.outro("\uD638\uD658\uC131 \uC774\uC288\uAC00 \uC788\uC5B4\uC694.");try{await v.trackCommandOutcome(a.cwd,{command:"compat",status:"completed",result:"incompatible",properties:{checked_items_count:x.checkedItemKeys.length,incompatible_items_count:new Set(x.issues.map(h=>h.itemKey)).size,issue_count:x.issues.length,duration_ms:Date.now()-i}})}catch(h){s&&console.error("[Telemetry] compat \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",h)}process.exit(1)}catch(o){if(q(o)){try{await v.trackCommandOutcome(n,{command:"compat",status:"cancelled",properties:{duration_ms:Date.now()-i}})}catch(a){s&&console.error("[Telemetry] compat \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",a)}V.outro(l(o.message)),process.exit(0)}try{await v.trackCommandFailure(n,{command:"compat",error:o,properties:{duration_ms:Date.now()-i}})}catch(a){s&&console.error("[Telemetry] compat \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",a)}Y(o,{defaultMessage:"\uD638\uD658\uC131 \uAC80\uC0AC\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694.",defaultHint:"`--verbose` \uC635\uC158\uC73C\uB85C \uC0C1\uC138 \uC624\uB958\uB97C \uD655\uC778\uD574\uBCF4\uC138\uC694.",verbose:s}),process.exit(1)}})};import*as j from"@clack/prompts";import{z as se}from"zod";var xr="https://raw.githubusercontent.com/daangn/seed-design/refs/heads/dev/docs/registry",Ir=se.object({query:se.union([se.string(),se.array(se.string())]).optional().transform(e=>{let t=(Array.isArray(e)?e.join(" "):e)?.trim();return t||void 0}),baseUrl:se.string().optional(),cwd:se.string().default(process.cwd()),framework:se.enum(["react","lynx"]).optional(),raw:se.boolean()});function gt(e,r){return`${xr}/${e}/${r}`}function kr(e,r){let t=`${r}${e.docUrl}`,i=`${r}/llms${e.docUrl}.txt`,s=[e.id,`- docs: ${t}`,`- llms.txt: ${i}`];if(e.snippetKey&&e.snippets&&e.snippets.length>0){let[n]=e.snippetKey.split(":");if(n)if(e.snippets.length===1)s.push(`- snippet: ${gt(n,e.snippets[0].path)}`);else{s.push("- snippet:");for(let o of e.snippets)s.push(` - ${o.label}: ${gt(n,o.path)}`)}}j.log.message(s.join(`
14
+ \uC124\uCE58\uD560 \uC758\uC874\uC131: ${l(Array.from(F).join(", ")||"\uC5C6\uC74C")}`),await ke({registryItemsToAdd:P,rootPath:A,cwd:g,baseUrl:u,framework:I,config:$,onDiff:m.onDiff});let{installed:S,filtered:K}=await Re({cwd:g,deps:Array.from(F)});S.size===0&&_.log.message("\uBAA8\uB4E0 \uC758\uC874\uC131\uC774 \uC774\uBBF8 \uC124\uCE58\uB418\uC5B4 \uC788\uC5B4\uC694."),S.size&&(_.log.message(`\uC758\uC874\uC131 \uC124\uCE58 \uC644\uB8CC: ${l(Array.from(S).join(", "))}`),K.size&&_.log.message(`\uC124\uCE58\uD558\uC9C0 \uC54A\uC740 \uC758\uC874\uC131 (\uC774\uBBF8 \uC124\uCE58\uB428): ${l(Array.from(K).join(", "))}`)),_.outro("\uC644\uB8CC\uD588\uC5B4\uC694.");let U=Date.now()-i,H=new Set(P.map(p=>p.registryId)),b=h.some(p=>{let[f,...E]=p.split(":"),M=E.join(":");return y.find(L=>L.id===f)?.items.find(L=>L.id===M)?.deprecated});try{await v.trackCommandOutcome(m.cwd,{command:"add",status:"completed",properties:{items_count:w.length,registries:Array.from(H),has_deprecated:b,dependencies_count:F.size,duration_ms:U}})}catch(p){s&&console.error("[Telemetry] add \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",p)}}catch(o){if(q(o)){try{await v.trackCommandOutcome(n,{command:"add",status:"cancelled",properties:{duration_ms:Date.now()-i}})}catch(a){s&&console.error("[Telemetry] add \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",a)}_.outro(l(o.message)),process.exit(0)}try{await v.trackCommandFailure(n,{command:"add",error:o,properties:{duration_ms:Date.now()-i}})}catch(a){s&&console.error("[Telemetry] add \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",a)}Y(o,{defaultMessage:"\uCD94\uAC00\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694.",defaultHint:"`--verbose` \uC635\uC158\uC73C\uB85C \uC0C1\uC138 \uC624\uB958\uB97C \uD655\uC778\uD574\uBCF4\uC138\uC694.",verbose:s}),process.exit(1)}})};import*as O from"@clack/prompts";import hr from"path";import{z as Z}from"zod";var wr=Z.object({registryIds:Z.array(Z.string()).optional(),all:Z.boolean(),includeDeprecated:Z.boolean().optional(),cwd:Z.string(),baseUrl:Z.string().default(N),seedReactVersion:Z.string().optional(),framework:Z.enum(["react","lynx"]).optional(),onDiff:Z.enum(["overwrite","backup"]).optional()}),pt=e=>{e.command("add-all [...registry-ids]","add all items from registries").option("-a, --all","Add all items from all registries",{default:!1}).option("--include-deprecated","Include deprecated items 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:N}).option("--seed-react-version <version>","\uC9C0\uC815\uD55C SEED React \uBC84\uC804\uC758 \uB808\uC9C0\uC2A4\uD2B8\uB9AC \uC0AC\uC6A9 (\uC608: 2)").option("-f, --framework <framework>","\uD504\uB808\uC784\uC6CC\uD06C (react \uB610\uB294 lynx)").option("--on-diff <mode>","Action when file differs: overwrite or backup").example("seed-design add-all ui --include-deprecated").example("seed-design add-all ui lib breeze").action(async(r,t)=>{let i=Date.now(),s=W(t),n=typeof t?.cwd=="string"?t.cwd:process.cwd();O.intro("seed-design add-all");try{let o=Se(e.rawArgs,"--seed-react-version"),a=wr.safeParse({registryIds:r,...t,seedReactVersion:o});if(!a.success)throw a.error;let{data:c}=a,m=c.cwd,g=Pe(c),C=g?.baseUrl??c.baseUrl,u=await $e(m),$=g?.framework??c.framework??u.framework,I=hr.resolve(m,u.path),{start:A,stop:T}=O.spinner();A("Registry\uB97C \uAC00\uC838\uC624\uACE0 \uC788\uC5B4\uC694...");let x=await(async()=>{try{let b=await Promise.all((await de({baseUrl:C,framework:$})).map(async({id:p})=>fe({baseUrl:C,framework:$,registryId:p})));return T("Registry\uB97C \uAC00\uC838\uC654\uC5B4\uC694."),b}catch(b){throw T("Registry\uB97C \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694."),b}})(),y=await(async()=>{if(c.all){let p=x.map(f=>f.id);return O.log.message(`\uBAA8\uB4E0 \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC758 \uBAA8\uB4E0 \uD56D\uBAA9\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4: ${l(p.join(", "))}`),p}if(c.registryIds?.length){let p=x.map(f=>f.id);for(let f of c.registryIds)if(!p.includes(f))throw new k({message:`\uB808\uC9C0\uC2A4\uD2B8\uB9AC '${f}'\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.`,details:[`\uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uB808\uC9C0\uC2A4\uD2B8\uB9AC: ${p.join(", ")}`]});return O.log.message(`\uC120\uD0DD\uB41C \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC758 \uBAA8\uB4E0 \uD56D\uBAA9\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4: ${l(c.registryIds.join(", "))}`),c.registryIds}let b=await O.multiselect({message:"\uCD94\uAC00\uD560 \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uB97C \uC120\uD0DD\uD574\uC8FC\uC138\uC694 (\uC2A4\uD398\uC774\uC2A4 \uBC14\uB85C \uC5EC\uB7EC \uAC1C \uC120\uD0DD \uAC00\uB2A5)",options:x.filter(({hideFromCLICatalog:p})=>!p).sort((p,f)=>f.items.length-p.items.length).map(p=>{let f=p.items[0]?.id,E=f?`${p.items.length}\uAC1C \uD56D\uBAA9 (${f} \uB4F1)`:`${p.items.length}\uAC1C \uD56D\uBAA9 (\uD56D\uBAA9 \uC5C6\uC74C)`;return{label:p.id,value:p.id,hint:E}})});if(O.isCancel(b))throw new D;return O.log.message(`\uC120\uD0DD\uB41C \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC758 \uD56D\uBAA9\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4: ${l(b.join(", "))}`),b})(),h=x.filter(b=>y.includes(b.id)),w=h.flatMap(b=>b.items.filter(p=>p.deprecated?c.includeDeprecated:!0).map(p=>`${b.id}:${p.id}`)),P=h.reduce((b,p)=>b+p.items.filter(f=>f.deprecated).length,0);if(!c.includeDeprecated&&P>0&&O.log.info(`${P}\uAC1C\uC758 deprecated \uD56D\uBAA9\uC740 \uC81C\uC678\uB418\uC5C8\uC5B4\uC694. --include-deprecated \uC635\uC158\uC744 \uC0AC\uC6A9\uD558\uBA74 \uCD94\uAC00\uD560 \uC218 \uC788\uC5B4\uC694.`),!w.length)throw new D("\uCD94\uAC00\uD560 \uD56D\uBAA9\uC774 \uC5C6\uC5B4\uC694.");O.log.message(`\uCD1D ${l(w.length.toString())}\uAC1C\uC758 \uD56D\uBAA9\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4.`);let{registryItemsToAdd:F,npmDependenciesToAdd:ee}=xe({selectedItemKeys:w,publicRegistries:x}),S=ye({publicRegistries:x,itemKeys:F.flatMap(({registryId:b,items:p})=>p.map(f=>`${b}:${f.id}`)),projectPackageVersions:ue(c.cwd,$),framework:$});he({report:S,title:"\uD604\uC7AC \uD504\uB85C\uC81D\uD2B8 \uBC84\uC804\uACFC \uD638\uD658\uB418\uC9C0 \uC54A\uC744 \uC218 \uC788\uB294 \uC2A4\uB2C8\uD3AB\uC774 \uC788\uC5B4\uC694.",framework:$}),await ke({registryItemsToAdd:F,rootPath:I,cwd:m,baseUrl:C,framework:$,config:u,onDiff:c.onDiff});let{installed:K,filtered:U}=await Re({cwd:m,deps:Array.from(ee)});K.size===0&&O.log.message("\uBAA8\uB4E0 \uC758\uC874\uC131\uC774 \uC774\uBBF8 \uC124\uCE58\uB418\uC5B4 \uC788\uC5B4\uC694."),K.size&&(O.log.message(`\uC758\uC874\uC131 \uC124\uCE58 \uC644\uB8CC: ${l(Array.from(K).join(", "))}`),U.size&&O.log.message(`\uC124\uCE58\uD558\uC9C0 \uC54A\uC740 \uC758\uC874\uC131 (\uC774\uBBF8 \uC124\uCE58\uB428): ${l(Array.from(U).join(", "))}`)),O.outro("\uC644\uB8CC\uD588\uC5B4\uC694.");let H=Date.now()-i;try{await v.trackCommandOutcome(c.cwd,{command:"add-all",status:"completed",properties:{registries:y,items_count:w.length,include_deprecated:c.includeDeprecated||!1,dependencies_count:ee.size,duration_ms:H}})}catch(b){s&&console.error("[Telemetry] add-all \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",b)}}catch(o){if(q(o)){try{await v.trackCommandOutcome(n,{command:"add-all",status:"cancelled",properties:{duration_ms:Date.now()-i}})}catch(a){s&&console.error("[Telemetry] add-all \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",a)}O.outro(l(o.message)),process.exit(0)}try{await v.trackCommandFailure(n,{command:"add-all",error:o,properties:{duration_ms:Date.now()-i}})}catch(a){s&&console.error("[Telemetry] add-all \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",a)}Y(o,{defaultMessage:"\uCD94\uAC00\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694.",defaultHint:"`--verbose` \uC635\uC158\uC73C\uB85C \uC0C1\uC138 \uC624\uB958\uB97C \uD655\uC778\uD574\uBCF4\uC138\uC694.",verbose:s}),process.exit(1)}})};import*as V from"@clack/prompts";import dt from"path";import{z}from"zod";var br=z.object({itemIds:z.array(z.string()).optional(),component:z.union([z.string(),z.array(z.string())]).optional(),all:z.boolean(),registry:z.string().optional(),cwd:z.string(),baseUrl:z.string().default(N),framework:z.enum(["react","lynx"]).optional()});function Cr({itemIds:e,component:r}){let t=n=>n.trim().replace(/\s+/g,"-"),i=(e??[]).map(t).filter(Boolean),s=(Array.isArray(r)?r:[r]).filter(n=>!!n).flatMap(n=>n.split(",")).map(t).filter(Boolean);return Array.from(new Set([...i,...s]))}function $r({publicRegistries:e,targetInputs:r,defaultRegistry:t}){let i=e.filter(n=>typeof n.id=="string"&&Array.isArray(n.items)).flatMap(n=>n.items.filter(o=>typeof o.id=="string").map(o=>`${n.id}:${o.id}`)),s=new Set;for(let n of r){let o=n.includes(":")?n:t?`${t}:${n}`:(()=>{let a=i.filter(c=>c.endsWith(`:${n}`));if(!a.length)throw new k({message:`${l(n)}: \uD56D\uBAA9\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.`,hint:`${l("ui:action-button")}\uCC98\uB7FC registry\uB97C \uD3EC\uD568\uD574\uC11C \uC785\uB825\uD574\uBCF4\uC138\uC694.`});if(a.length>1)throw new k({message:`${l(n)}: \uAC19\uC740 \uC774\uB984\uC758 \uD56D\uBAA9\uC774 \uC5EC\uB7EC \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC5D0 \uC788\uC5B4\uC694.`,details:a.map(c=>`- ${c}`),hint:`${l("ui:action-button")}\uCC98\uB7FC registry\uB97C \uD3EC\uD568\uD574\uC11C \uC785\uB825\uD574\uBCF4\uC138\uC694.`});return a[0]})();if(!i.includes(o))throw new k({message:`${l(o)}: \uD56D\uBAA9\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.`});s.add(o)}return Array.from(s)}var ft=e=>{e.command("compat [...item-ids]","check snippet compatibility").option("-c, --component <component>","\uAC80\uC0AC\uD560 \uCEF4\uD3EC\uB10C\uD2B8. \uC5EC\uB7EC \uBC88 \uB610\uB294 \uC27C\uD45C\uB85C \uC9C0\uC815 \uAC00\uB2A5").option("-a, --all","\uBAA8\uB4E0 registry \uD56D\uBAA9\uC744 \uAC80\uC0AC",{default:!1}).option("-r, --registry <registryId>","\uCEF4\uD3EC\uB10C\uD2B8 shorthand \uC785\uB825 \uC2DC \uAE30\uBCF8 registry").option("--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:N}).option("-f, --framework <framework>","\uD504\uB808\uC784\uC6CC\uD06C (react \uB610\uB294 lynx)").example("seed-design compat").example("seed-design compat -c action-button").example("seed-design compat ui:action-button ui:alert-dialog").example("seed-design compat --all").action(async(r,t)=>{let i=Date.now(),s=W(t),n=typeof t?.cwd=="string"?t.cwd:process.cwd();V.intro("seed-design compat");try{let o=br.safeParse({itemIds:r,...t});if(!o.success)throw o.error;let{data:a}=o,c=await ie(a.cwd),m=a.framework??c?.framework??"react",{start:g,stop:C}=V.spinner();g("Registry\uB97C \uAC00\uC838\uC624\uACE0 \uC788\uC5B4\uC694...");let u=await(async()=>{try{let h=await Promise.all((await de({baseUrl:a.baseUrl,framework:m})).map(async({id:w})=>fe({baseUrl:a.baseUrl,framework:m,registryId:w})));return C("Registry\uB97C \uAC00\uC838\uC654\uC5B4\uC694."),h}catch(h){throw C("Registry\uB97C \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694."),h}})(),$=Cr({itemIds:a.itemIds,component:a.component}),I=a.all?u.flatMap(w=>w.items.map(P=>`${w.id}:${P.id}`)):$.length>0?$r({publicRegistries:u,targetInputs:$,defaultRegistry:a.registry}):ie(a.cwd),A=Array.isArray(I)?I:await(async()=>{let h=await I;if(!h)throw new k({message:"seed-design.json \uD30C\uC77C\uC774 \uC5C6\uC5B4 \uC124\uCE58\uB41C \uC2A4\uB2C8\uD3AB \uACBD\uB85C\uB97C \uC54C \uC218 \uC5C6\uC5B4\uC694.",hint:"`seed-design init`\uC73C\uB85C \uC124\uC815\uC744 \uB9CC\uB4E0 \uB4A4 \uC2E4\uD589\uD558\uAC70\uB098, `--all`/`-c`\uB85C \uAC80\uC0AC \uB300\uC0C1\uC744 \uC9C1\uC811 \uC9C0\uC815\uD574\uC8FC\uC138\uC694."});let w=dt.resolve(a.cwd,h.path),P=lt({publicRegistries:u,rootPath:w});return P.length?P:(V.log.info(`${l(dt.relative(a.cwd,w)||h.path)}\uC5D0\uC11C \uC124\uCE58\uB41C \uC2A4\uB2C8\uD3AB\uC744 \uCC3E\uC9C0 \uBABB\uD588\uC5B4\uC694.`),[])})();if(!A.length){try{await v.trackCommandOutcome(a.cwd,{command:"compat",status:"completed",result:"empty",properties:{duration_ms:Date.now()-i}})}catch(h){s&&console.error("[Telemetry] compat \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",h)}V.outro("\uAC80\uC0AC\uD560 \uC2A4\uB2C8\uD3AB\uC774 \uC5C6\uC5B4\uC694."),process.exit(0)}let T=ue(a.cwd,m),x=ye({publicRegistries:u,itemKeys:A,projectPackageVersions:T,framework:m});if(V.log.info(`\uAC80\uC0AC \uB300\uC0C1: ${l(x.checkedItemKeys.join(", "))}`),!x.issues.length){let h=ae(m);V.outro(`\uBAA8\uB4E0 \uC2A4\uB2C8\uD3AB\uC774 \uD604\uC7AC ${h.join(", ")}\uC640 \uD638\uD658\uB3FC\uC694.`);try{await v.trackCommandOutcome(a.cwd,{command:"compat",status:"completed",result:"compatible",properties:{checked_items_count:x.checkedItemKeys.length,incompatible_items_count:0,duration_ms:Date.now()-i}})}catch(w){s&&console.error("[Telemetry] compat \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",w)}process.exit(0)}he({report:x,title:"\uD604\uC7AC \uD504\uB85C\uC81D\uD2B8 \uBC84\uC804\uACFC \uD638\uD658\uB418\uC9C0 \uC54A\uB294 \uC2A4\uB2C8\uD3AB\uC744 \uCC3E\uC558\uC5B4\uC694.",framework:m});let y=ae(m);V.log.info(`\uD544\uC694\uD55C \uBC84\uC804\uC73C\uB85C ${y.join(" \uB610\uB294 ")}\uB97C \uB9DE\uCD98 \uB4A4 \uB2E4\uC2DC \uC2E4\uD589\uD574\uBCF4\uC138\uC694.`),V.outro("\uD638\uD658\uC131 \uC774\uC288\uAC00 \uC788\uC5B4\uC694.");try{await v.trackCommandOutcome(a.cwd,{command:"compat",status:"completed",result:"incompatible",properties:{checked_items_count:x.checkedItemKeys.length,incompatible_items_count:new Set(x.issues.map(h=>h.itemKey)).size,issue_count:x.issues.length,duration_ms:Date.now()-i}})}catch(h){s&&console.error("[Telemetry] compat \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",h)}process.exit(1)}catch(o){if(q(o)){try{await v.trackCommandOutcome(n,{command:"compat",status:"cancelled",properties:{duration_ms:Date.now()-i}})}catch(a){s&&console.error("[Telemetry] compat \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",a)}V.outro(l(o.message)),process.exit(0)}try{await v.trackCommandFailure(n,{command:"compat",error:o,properties:{duration_ms:Date.now()-i}})}catch(a){s&&console.error("[Telemetry] compat \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",a)}Y(o,{defaultMessage:"\uD638\uD658\uC131 \uAC80\uC0AC\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694.",defaultHint:"`--verbose` \uC635\uC158\uC73C\uB85C \uC0C1\uC138 \uC624\uB958\uB97C \uD655\uC778\uD574\uBCF4\uC138\uC694.",verbose:s}),process.exit(1)}})};import*as j from"@clack/prompts";import{z as se}from"zod";var xr="https://raw.githubusercontent.com/daangn/seed-design/refs/heads/dev/docs/registry",Ir=se.object({query:se.union([se.string(),se.array(se.string())]).optional().transform(e=>{let t=(Array.isArray(e)?e.join(" "):e)?.trim();return t||void 0}),baseUrl:se.string().optional(),cwd:se.string().default(process.cwd()),framework:se.enum(["react","lynx"]).optional(),raw:se.boolean()});function gt(e,r){return`${xr}/${e}/${r}`}function kr(e,r){let t=`${r}${e.docUrl}`,i=`${r}/llms${e.docUrl}.txt`,s=[e.id,`- docs: ${t}`,`- llms.txt: ${i}`];if(e.snippetKey&&e.snippets&&e.snippets.length>0){let[n]=e.snippetKey.split(":");if(n)if(e.snippets.length===1)s.push(`- snippet: ${gt(n,e.snippets[0].path)}`);else{s.push("- snippet:");for(let o of e.snippets)s.push(` - ${o.label}: ${gt(n,o.path)}`)}}j.log.message(s.join(`
15
15
  `))}function Pr(e,r){let t=e.length,i=r.length,s=Array.from({length:t+1},(n,o)=>Array.from({length:i+1},(a,c)=>o===0?c:c===0?o:0));for(let n=1;n<=t;n++)for(let o=1;o<=i;o++)s[n][o]=Math.min(s[n-1][o]+1,s[n][o-1]+1,s[n-1][o-1]+(e[n-1]!==r[o-1]?1:0));return s[t][i]}function ce(e,r,t=3){let i=e.toLowerCase();return r.map(s=>({value:s,dist:Pr(i,s.toLowerCase())})).filter(({dist:s})=>s>0&&s<=t).sort((s,n)=>s.dist-n.dist).map(({value:s})=>s)}function Sr(e,r){if(e.length===0)return;let t=[],i=r.map(o=>o.id),s=ce(e[0],i);if(s.length===0){let o=r.flatMap(m=>m.sections.flatMap(g=>g.items.map(C=>`${m.id}/${g.id}/${C.id}`))),a=e.join("/"),c=ce(a,o,5);c.length>0&&t.push(...c.slice(0,3))}else{let o=r.find(a=>a.id===s[0]);if(o&&e.length>=2){let a=o.sections.map(m=>m.id),c=ce(e[1],a);if(c.length>0){let m=o.sections.find(g=>g.id===c[0]);if(m&&e.length>=3){let g=m.items.map(u=>u.id),C=ce(e[2],g);for(let u of C.slice(0,3))t.push(`${o.id}/${m.id}/${u}`)}else for(let g of c.slice(0,3))t.push(`${o.id}/${g}`)}else{let m=o.sections.flatMap(C=>C.items.map(u=>({path:`${o.id}/${C.id}/${u.id}`,id:u.id}))),g=ce(e[1],m.map(C=>C.id));for(let C of g.slice(0,3)){let u=m.find($=>$.id===C);u&&t.push(u.path)}}}else for(let a of s.slice(0,3))t.push(a)}if(t.length===0)return;let n=["","\u{1F4A1} \uC774\uAC83\uC744 \uC758\uBBF8\uD588\uB098\uC694?"];for(let o of t)n.push(` - ${o}`);return n.join(`
16
16
  `)}function yt(e){return e.split(/[\/\s]+/).map(r=>r.trim()).filter(Boolean)}function Rr(e){let[,r]=e.split(":");return r??e}function Er({query:e,framework:r,categoryIds:t}){if(!e)return;let i=yt(e).map(Rr);if(!i.length)return;let[s]=i;return!t.includes(s)&&r&&t.includes(r)?[r,...i].join("/"):i.join("/")}function vr(e,r){let t=r.toLowerCase();return e.flatMap(i=>i.sections.flatMap(s=>s.items.filter(n=>n.id.toLowerCase().includes(t)||n.title.toLowerCase().includes(t)).map(n=>({item:n,categoryLabel:i.label,sectionLabel:s.label}))))}async function we(e){let r=await j.select({message:"\uD56D\uBAA9\uC744 \uC120\uD0DD\uD574\uC8FC\uC138\uC694",options:e.map(t=>({label:`${t.deprecated?"(deprecated) ":""}${t.title}`,value:t,hint:t.description}))});if(j.isCancel(r))throw new D;return r}async function ut(e){let r=await j.select({message:"\uC139\uC158\uC744 \uC120\uD0DD\uD574\uC8FC\uC138\uC694",options:e.map(t=>({label:t.label,value:t,hint:`${t.items.length}\uAC1C \uD56D\uBAA9`}))});if(j.isCancel(r))throw new D;return r}async function Tr(e){let r=await j.select({message:"\uCE74\uD14C\uACE0\uB9AC\uB97C \uC120\uD0DD\uD574\uC8FC\uC138\uC694",options:e.map(t=>({label:t.label,value:t,hint:`${t.sections.reduce((i,s)=>i+s.items.length,0)}\uAC1C \uD56D\uBAA9`}))});if(j.isCancel(r))throw new D;return r}var ht=e=>{e.command("docs [...query]","\uBB38\uC11C \uB9C1\uD06C, llms.txt \uB9C1\uD06C, \uC2A4\uB2C8\uD3AB \uB9C1\uD06C\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4").option("-u, --baseUrl <baseUrl>",`\uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC758 \uAE30\uBCF8 URL (\uAE30\uBCF8\uAC12: ${N})`,{default:N}).option("--cwd <cwd>","the working directory. defaults to the current directory.",{default:process.cwd()}).option("-f, --framework <framework>","\uD504\uB808\uC784\uC6CC\uD06C (react \uB610\uB294 lynx)").option("--raw","llms.txt \uB0B4\uC6A9\uC744 \uC9C1\uC811 \uAC00\uC838\uC640 \uCD9C\uB825\uD569\uB2C8\uB2E4. LLM \uD30C\uC774\uD504\uC5D0 \uC720\uC6A9\uD569\uB2C8\uB2E4.",{default:!1}).example("seed-design docs").example("seed-design docs action-button").example("seed-design docs react").example("seed-design docs lynx action-button").example("seed-design docs react/components").example("seed-design docs react/components/action-button").example("seed-design docs react/updates/changelog --raw").action(async(r,t)=>{let i=Date.now(),s=W(t),n=t.raw??!1,o=process.cwd();n||j.intro("seed-design docs");try{let a=Ir.safeParse({query:r,...t});if(!a.success)throw a.error;let{data:c}=a;o=c.cwd;let m=c.baseUrl??N,g=await ie(c.cwd).catch(()=>null),C=c.framework??g?.framework;if(c.raw&&!c.query)throw new k({message:"--raw \uBAA8\uB4DC\uC5D0\uC11C\uB294 \uCFFC\uB9AC\uAC00 \uD544\uC694\uD574\uC694.",hint:"\uC608: `seed-design docs react/updates/changelog --raw`"});let u=await(async()=>{if(n)return await Ae({baseUrl:m});let{start:y,stop:h}=j.spinner();y("\uBB38\uC11C \uBAA9\uB85D\uC744 \uAC00\uC838\uC624\uACE0 \uC788\uC5B4\uC694...");try{let w=await Ae({baseUrl:m});return h("\uBB38\uC11C \uBAA9\uB85D\uC744 \uAC00\uC838\uC654\uC5B4\uC694."),w}catch(w){throw h("\uBB38\uC11C \uBAA9\uB85D\uC744 \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694."),w}})(),{categories:$}=u,I=Er({query:c.query,framework:C,categoryIds:$.map(y=>y.id)}),A,T=async()=>{if(I){let w=yt(I);if(n&&w.length>3)return;let P=$.find(S=>S.id===w[0]);if(P&&w.length>=2){let S=P.sections.find(b=>b.id===w[1]);if(S&&w.length>=3){let b=S.items.find(E=>E.id===w[2]);if(b)return b;let p=w[2].toLowerCase(),f=S.items.filter(E=>E.id.toLowerCase().includes(p)||E.title.toLowerCase().includes(p));if(f.length===0){let E=ce(w[2],S.items.map(L=>L.id)),M=E.length>0?`
17
17
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seed-design/cli",
3
- "version": "1.6.1",
3
+ "version": "1.7.1",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",
@@ -26,7 +26,7 @@
26
26
  "lint:publish": "bun publint"
27
27
  },
28
28
  "dependencies": {
29
- "@antfu/ni": "^28.0.0",
29
+ "@antfu/ni": "^30.0.0",
30
30
  "@babel/core": "^7.26.10",
31
31
  "@babel/parser": "^7.27.0",
32
32
  "@babel/plugin-transform-typescript": "^7.27.0",
@@ -53,7 +53,7 @@
53
53
  "dotenv": "^17.2.3",
54
54
  "esbuild": "^0.27.0",
55
55
  "type-fest": "^5.0.0",
56
- "typescript": "^6.0.0"
56
+ "typescript": "^7.0.2"
57
57
  },
58
58
  "publishConfig": {
59
59
  "access": "public"
package/src/AGENTS.md CHANGED
@@ -1,17 +1,17 @@
1
- ## 디렉토리 개요
1
+ # packages/cli/src
2
2
 
3
- `packages/cli/src`는 CLI 실행 엔트리, 명령어 구현, 공통 유틸, 테스트를 포함한다. 상위 규칙은 `packages/cli/AGENTS.md`를 따르고, 이 문서는 `src` 내부 구조 전용 컨벤션만 정의한다.
3
+ CLI 진입점(`index.ts`), 명령(`commands/`), 공유 로직(`utils/`), 테스트(`tests/`)가 있다. 오류 처리·`process.exit` 경계는 `packages/cli/AGENTS.md`를 따른다.
4
4
 
5
- ## 파일 작성 컨벤션
5
+ ## 규칙
6
6
 
7
- - `commands/`: 사용자가 직접 호출하는 커맨드 액션(`init`, `add`, `add-all`, `compat`)
8
- - `utils/`: 명령 간 공유 로직(설정, fetch, write, install, analytics, error)
9
- - `tests/`: 독립 단위 테스트
10
- - 파일명은 역할 중심 소문자 kebab-case를 유지하고, barrel file은 만들지 않는다.
7
+ - 파일명은 kebab-case로 쓴다. 재수출만 하는 barrel 파일을 만들지 않는다 → 사용처에서 파일을 직접 import한다.
8
+ - 테스트는 구현 옆이 아니라 `tests/<대상>.test.ts`에 둔다.
11
9
 
12
- ## 코드 작성 컨벤션
10
+ ## 작업 절차
13
11
 
14
- - 명령어 파일에서 사용자 입출력(`@clack/prompts`)과 종료 코드(`process.exit`)를 최종 처리한다.
15
- - 유틸 파일은 사이드이펙트 종료 대신 예외를 throw하고, 명령어 계층에서 공통 핸들러로 변환한다.
16
- - 사용자 취소는 `CliCancelError`, 오류는 `CliError`로 구분한다.
17
- - 옵션 검증은 zod schema를 명령어 파일 상단에 정의하고 `safeParse/parse`로 검증한다.
12
+ 새 명령을 추가할 때:
13
+
14
+ 1. `commands/<명령>.ts`에 `CAC` 인스턴스를 받는 `<명령>Command` 함수를 export한다. 예: `commands/add.ts`의 `addCommand`.
15
+ 2. 같은 파일 상단에 옵션 zod schema를 두고 action 안에서 `safeParse`로 검증한다. 예: `addOptionsSchema`.
16
+ 3. `index.ts`의 `/* Commands */` 목록에 등록한다.
17
+ 4. telemetry와 문서 갱신은 `packages/cli/TECH.md`「Telemetry」와 `packages/cli/AGENTS.md`「함께 갱신할 문서」를 따른다.
@@ -53,7 +53,7 @@ export const addAllCommand = (cli: CAC) => {
53
53
  "the base url of the registry. defaults to the current directory.",
54
54
  { default: BASE_URL },
55
55
  )
56
- .option("--seed-react-version <version>", "지정한 SEED React 버전의 레지스트리 사용 (예: 1.2)")
56
+ .option("--seed-react-version <version>", "지정한 SEED React 버전의 레지스트리 사용 (예: 2)")
57
57
  .option("-f, --framework <framework>", "프레임워크 (react 또는 lynx)")
58
58
  .option("--on-diff <mode>", "Action when file differs: overwrite or backup")
59
59
  .example("seed-design add-all ui --include-deprecated")
@@ -52,7 +52,7 @@ export const addCommand = (cli: CAC) => {
52
52
  "the base url of the registry. defaults to the current directory.",
53
53
  { default: BASE_URL },
54
54
  )
55
- .option("--seed-react-version <version>", "지정한 SEED React 버전의 레지스트리 사용 (예: 1.2)")
55
+ .option("--seed-react-version <version>", "지정한 SEED React 버전의 레지스트리 사용 (예: 2)")
56
56
  .option("-f, --framework <framework>", "프레임워크 (react 또는 lynx)")
57
57
  .option("--on-diff <mode>", "Action when file differs: overwrite or backup")
58
58
  .example("seed-design add ui:action-button")
@@ -24,6 +24,19 @@ describe("readRawOptionValue", () => {
24
24
  it("플래그가 없으면 undefined를 반환한다", () => {
25
25
  expect(readRawOptionValue(["node", "cli", "add"], "--seed-react-version")).toBeUndefined();
26
26
  });
27
+
28
+ it.each(["add", "add-all"])("%s의 두 옵션 형식에서 v2 아카이브를 선택한다", (command) => {
29
+ for (const args of [["--seed-react-version", "2"], ["--seed-react-version=2"]]) {
30
+ const seedReactVersion = readRawOptionValue(
31
+ ["node", "cli", command, ...args],
32
+ "--seed-react-version",
33
+ );
34
+ expect(resolveSeedVersion({ seedReactVersion })).toEqual({
35
+ framework: "react",
36
+ baseUrl: "https://seed-design.io/react/v2",
37
+ });
38
+ }
39
+ });
27
40
  });
28
41
 
29
42
  describe("resolveSeedVersion", () => {
@@ -32,6 +45,10 @@ describe("resolveSeedVersion", () => {
32
45
  framework: "react",
33
46
  baseUrl: "https://v1-0.seed-design.io",
34
47
  });
48
+ expect(resolveSeedVersion({ seedReactVersion: "1.1" })).toEqual({
49
+ framework: "react",
50
+ baseUrl: "https://v1-1.seed-design.io",
51
+ });
35
52
  expect(resolveSeedVersion({ seedReactVersion: "1.2" })).toEqual({
36
53
  framework: "react",
37
54
  baseUrl: "https://v1-2.seed-design.io",
@@ -1,15 +1,16 @@
1
1
  import { CliError } from "./error";
2
2
 
3
3
  /**
4
- * 아카이브된 SEED React 버전별 레지스트리 도메인.
4
+ * 아카이브된 SEED React 버전별 레지스트리 주소.
5
5
  *
6
- * 모든 minor 버전이 아니라 보존(아카이브)된 버전만 서브도메인으로 배포되어 있어,
6
+ * 보존(아카이브)된 버전만 서브도메인 또는 버전 경로로 배포되어 있어,
7
7
  * 동적으로 URL을 만들지 않고 알려진 버전만 하드코딩한다. 새 버전을 아카이브하면 여기 추가한다.
8
8
  */
9
9
  const SEED_REACT_VERSION_BASE_URLS: Record<string, string> = {
10
10
  "1.0": "https://v1-0.seed-design.io",
11
11
  "1.1": "https://v1-1.seed-design.io",
12
12
  "1.2": "https://v1-2.seed-design.io",
13
+ "2": "https://seed-design.io/react/v2",
13
14
  };
14
15
 
15
16
  /**