@seed-design/cli 1.3.0 → 1.4.0-alpha.0
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 +12 -12
- package/package.json +1 -1
- package/src/commands/add-all.ts +9 -3
- package/src/commands/add.ts +9 -3
- package/src/commands/compat.ts +15 -7
- package/src/commands/init.ts +9 -2
- package/src/utils/compatibility.ts +38 -11
- package/src/utils/fetch.ts +17 -6
- package/src/utils/get-config.ts +1 -0
- package/src/utils/init-config.ts +29 -1
- package/src/utils/write.ts +3 -0
package/bin/index.mjs
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import*as
|
|
3
|
-
[verbose] stack trace`)),
|
|
4
|
-
`,"utf-8"),{relativePath:
|
|
5
|
-
${
|
|
6
|
-
`)}`),
|
|
7
|
-
${
|
|
8
|
-
`),L.log.message(A),L.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 ${x}\uC73C\uB85C \uC62E\uAE30\uACE0 ${P} \uBC1B\uAE30`},{value:"skip",label:"\uC0C8 \uD30C\uC77C \uBC1B\uC9C0 \uC54A\uACE0 \uADF8\uB300\uB85C \uB450\uAE30"}]})})();if(L.isCancel(l)||l==="skip"){L.log.info(`${a(I)}: \uD30C\uC77C\uC744 \uBC1B\uC9C0 \uC54A\uACE0 \uAC74\uB108\uB6F0\uC5C8\uC5B4\uC694.`);continue}if(l==="backup"){let u=q.dirname(d),A=q.join(u,x);await ie.rename(d,A),L.log.info(`${a(I)}: \uAE30\uC874 \uD30C\uC77C\uC744 ${a(q.relative(s,A))}\uB85C \uC62E\uACBC\uC5B4\uC694.`)}}await ie.writeFile(d,w),f.push(g)}if(f.length>0){let g=f.map(({name:d,relativePath:w})=>({name:d,path:w}));i.push(...g),L.log.success(`${a(`${c}:${b}`)} \uAD00\uB828 \uC2A4\uB2C8\uD3AB \uB2E4\uC6B4\uB85C\uB4DC \uC644\uB8CC: ${a(g.map(d=>d.path).join(", "))}`)}}}}import*as S from"@clack/prompts";import Gt from"path";import{z as Z}from"zod";var B="https://seed-design.io";import*as Ke from"@clack/prompts";import{execa as vt}from"execa";import{detect as Pt}from"@antfu/ni";async function Me(e){let t=await Pt({programmatic:!0,cwd:e});return t==="yarn@berry"?"yarn":t==="pnpm@6"?"pnpm":t==="bun"?"bun":t==="deno"?"deno":t??"npm"}import St from"findup-sync";import Rt from"fs-extra";var Et="package.json";function kt(e=process.cwd()){let t=St(Et,{cwd:e});if(!t)throw new Error("No package.json file found in the project.");return t}function oe(e=process.cwd()){let t=kt(e);return Rt.readJSONSync(t)}async function we({cwd:e,deps:t,dev:s=!1}){let{start:o,stop:n}=Ke.spinner(),r=await Me(e),c={...oe(e).dependencies},m=new Set(t.filter(f=>!c[f])),y=new Set(t.filter(f=>c[f]));if(!m.size)return{installed:new Set,filtered:m};o("\uC758\uC874\uC131 \uC124\uCE58\uC911...");let h=[r==="npm"?"install":"add",s?"-D":null,...m].filter(Boolean),j=`${r} ${h.join(" ")}`;try{await vt(r,h,{cwd:e})}catch(f){throw n("\uC758\uC874\uC131 \uC124\uCE58\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694."),new $({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: ${j}`],cause:f})}return n("\uC758\uC874\uC131 \uC124\uCE58\uAC00 \uC644\uB8CC\uB410\uC5B4\uC694."),{installed:m,filtered:y}}import{randomUUID as jt}from"node:crypto";import*as Ue from"@clack/prompts";var At="seed_cli";async function Dt(e){if(process.env.DISABLE_TELEMETRY==="true"||process.env.SEED_DISABLE_TELEMETRY==="true")return!1;try{if((await le(e))?.telemetry===!1)return!1}catch{}return!0}function Tt(){return jt()}var _t=Tt(),Le=!1;async function Ot(e,{event:t,properties:s={}}){if(!await Dt(e))return;let n=`${At}.${t}`;Le||(Ue.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)"),Le=!0);try{let r="https://us.i.posthog.com/capture",i={"Content-Type":"application/json"},c={api_key:"phc_seod8HhifElOP1R92KmvsQybrtUmkOTgZBsq0mfCelR",event:n,distinct_id:_t,properties:{...s,$process_person_profile:!1},timestamp:new Date().toISOString()},m=new AbortController,y=setTimeout(()=>m.abort(),5e3);try{await fetch(r,{method:"POST",headers:i,body:JSON.stringify(c),signal:m.signal})}finally{clearTimeout(y)}}catch{}}var U={track:Ot};import*as Q from"@clack/prompts";import Mt from"fs-extra";import Kt from"path";import{intersects as Lt,satisfies as Ut,valid as ze,validRange as Fe}from"semver";var me=["@seed-design/react","@seed-design/css"],Ne="workspace:",Nt="npm:";function ne(e){try{let t=oe(e),s={...t.dependencies,...t.devDependencies,...t.peerDependencies,...t.optionalDependencies},o={};for(let n of me){let r=s[n];typeof r=="string"&&(o[n]=r)}return o}catch{return{}}}function ae({publicRegistries:e,itemKeys:t,projectPackageVersions:s}){let o=Array.from(new Set(t)),n=new Map(e.flatMap(i=>i.items.map(c=>[`${i.id}:${c.id}`,c]))),r=[];for(let i of o){let c=n.get(i);if(!c)continue;let m=zt(c);for(let y of me){let C=Array.from(m[y]??[]);if(!C.length)continue;let b=s[y];if(!b){r.push({itemKey:i,packageName:y,requiredRanges:C,type:"missing-package"});continue}let h=Ft(b);if(!h){r.push({itemKey:i,packageName:y,requiredRanges:C,installedVersionSpec:b,type:"invalid-version-spec"});continue}C.every(f=>Vt({currentVersionSpec:h,requiredRange:f}))||r.push({itemKey:i,packageName:y,requiredRanges:C,installedVersionSpec:b,type:"incompatible-version"})}}return{checkedItemKeys:o,projectPackageVersions:s,issues:r}}function ce({report:e,title:t}){if(!e.issues.length)return;Q.log.warn(t),Q.log.info(`\uD604\uC7AC \uD504\uB85C\uC81D\uD2B8 \uBC84\uC804: ${me.map(o=>`${o}@${a(e.projectPackageVersions[o]??"\uBBF8\uC124\uCE58")}`).join(", ")}`);let s=new Map;for(let o of e.issues){let n=s.get(o.itemKey)??[];n.push(o),s.set(o.itemKey,n)}for(let[o,n]of s.entries()){Q.log.warn(a(o));for(let r of n){let i=r.requiredRanges.join(" | ");if(r.type==="missing-package"){Q.log.info(` - ${r.packageName}: \uD328\uD0A4\uC9C0\uAC00 \uC124\uCE58\uB418\uC5B4 \uC788\uC9C0 \uC54A\uC544\uC694. \uD544\uC694 \uBC94\uC704: ${i}`);continue}if(r.type==="invalid-version-spec"){Q.log.info(` - ${r.packageName}: \uD604\uC7AC \uBC84\uC804 \uD615\uC2DD\uC744 \uD574\uC11D\uD558\uC9C0 \uBABB\uD588\uC5B4\uC694 (${r.installedVersionSpec}). \uD544\uC694 \uBC94\uC704: ${i}`);continue}Q.log.info(` - ${r.packageName}: \uD604\uC7AC ${r.installedVersionSpec}, \uD544\uC694 \uBC94\uC704 ${i}`)}}}function Ve({publicRegistries:e,rootPath:t}){let s=[];for(let o of e)for(let n of o.items)n.snippets.some(i=>qt(i.path).some(c=>Mt.existsSync(Kt.join(t,o.id,c))))&&s.push(`${o.id}:${n.id}`);return s}function zt(e){let t=Object.fromEntries(me.map(s=>[s,new Set]));for(let s of e.snippets)for(let[o,n]of Object.entries(s.dependencies??{}))Bt(o)&&t[o].add(n);return t}function Ft(e){let t=e.trim();if(t.startsWith(Ne)&&(t=t.slice(Ne.length).trim()),t.startsWith(Nt)){let s=t.split("@").at(-1);if(!s)return null;t=s}return!t||t==="*"?null:ze(t)||Fe(t)?t:null}function Vt({currentVersionSpec:e,requiredRange:t}){let s=Fe(t);return s?ze(e)?Ut(e,s,{includePrerelease:!0}):Lt(e,s,{includePrerelease:!0}):!1}function qt(e){let t=new Set([e]);return e.endsWith(".tsx")&&t.add(`${e.slice(0,-4)}.jsx`),e.endsWith(".ts")&&t.add(`${e.slice(0,-3)}.js`),e.endsWith(".jsx")&&t.add(`${e.slice(0,-4)}.tsx`),e.endsWith(".js")&&t.add(`${e.slice(0,-3)}.ts`),Array.from(t)}function Bt(e){return me.includes(e)}var Ht=Z.object({itemIds:Z.array(Z.string()).optional(),all:Z.boolean(),cwd:Z.string(),baseUrl:Z.string().optional(),onDiff:Z.enum(["overwrite","backup"]).optional()}),qe=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:B}).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(t,s)=>{let o=Date.now(),n=F(s);S.intro("seed-design add");try{let r=Ht.safeParse({itemIds:t,...s});if(!r.success)throw r.error;let{data:{all:i,...c}}=r;if(i)throw new $({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 m=c.cwd,y=c.baseUrl,C=await ge(m),b=Gt.resolve(m,C.path),{start:h,stop:j}=S.spinner();h("Registry\uB97C \uAC00\uC838\uC624\uACE0 \uC788\uC5B4\uC694...");let f=await(async()=>{try{let l=await Promise.all((await se({baseUrl:y})).map(async({id:u})=>re({baseUrl:y,registryId:u})));return j("Registry\uB97C \uAC00\uC838\uC654\uC5B4\uC694."),l}catch(l){throw j("Registry\uB97C \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694."),l}})(),g=await(async()=>{if(c.itemIds?.length)return c.itemIds;let l=await S.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:f.filter(({hideFromCLICatalog:u})=>!u).flatMap(({id:u,items:A})=>A.filter(({hideFromCLICatalog:M})=>!M).sort((M,T)=>M.id.localeCompare(T.id)).map(({id:M,description:T,deprecated:G})=>({label:`${G?"(deprecated) ":""}${a(u)}:${M}`,value:`${u}:${M}`,hint:T,deprecated:G,registryItemCount:A.length}))).sort((u,A)=>u.deprecated!==A.deprecated?u.deprecated?1:-1:A.registryItemCount-u.registryItemCount)});if(S.isCancel(l))throw new k;return l})();if(!g?.length)throw new k("\uCD94\uAC00\uD560 \uD56D\uBAA9\uC774 \uC120\uD0DD\uB418\uC9C0 \uC54A\uC558\uC5B4\uC694.");S.log.message(`\uC120\uD0DD\uB41C \uD56D\uBAA9: ${a(g.join(", "))}`);let d=[];for(let l of g){let[u,...A]=l.split(":"),M=A.join(":");if(!u||!M)throw new $({message:`${a(l)}: \uD56D\uBAA9 \uC774\uB984\uC774 \uC798\uBABB\uB418\uC5C8\uC5B4\uC694.`,hint:`${a("ui:action-button")}\uACFC \uAC19\uC740 \uD615\uC2DD\uC73C\uB85C \uC785\uB825\uD574\uBCF4\uC138\uC694.`});let T=f.find(G=>G.id===u)?.items.find(G=>G.id===M);if(!T)throw new $({message:`${a(l)}: \uD56D\uBAA9\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.`});if(T.deprecated){let G=await S.confirm({message:`${a(T.id)}: deprecated \uB418\uC5C8\uC5B4\uC694. \uCD94\uAC00\uD560\uAE4C\uC694?`,initialValue:!1});if(S.isCancel(G))throw new k;if(G===!1){S.log.info(`${a(T.id)}: \uCD94\uAC00\uD558\uC9C0 \uC54A\uC744\uAC8C\uC694.`);continue}}d.push(l)}let{registryItemsToAdd:w,npmDependenciesToAdd:I}=ue({selectedItemKeys:d,publicRegistries:f}),E=ae({publicRegistries:f,itemKeys:w.flatMap(({registryId:l,items:u})=>u.map(A=>`${l}:${A.id}`)),projectPackageVersions:ne(c.cwd)});ce({report:E,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."}),S.log.info(`\uCD94\uAC00\uD560 \uD56D\uBAA9: ${a(w.map(l=>l.items.map(u=>`${l.registryId}:${u.id}`).join(", ")).join(", ")||"\uC5C6\uC74C")}
|
|
2
|
+
import*as re from"@clack/prompts";import{cosmiconfig as pt}from"cosmiconfig";import{z as te}from"zod";import*as W from"@clack/prompts";import{ZodError as tt}from"zod";import et from"picocolors";var p=e=>et.cyan(e);var P=class extends Error{hint;details;constructor({message:t,hint:r,details:n=[],cause:o}){super(t,{cause:o}),this.name="CliError",this.hint=r,this.details=n}},E=class extends Error{constructor(t="\uC791\uC5C5\uC774 \uCDE8\uC18C\uB410\uC5B4\uC694."){super(t),this.name="CliCancelError"}};function F(e){return e instanceof E}function z(e){return!e||typeof e!="object"||!("verbose"in e)?!1:e.verbose===!0}function rt(e,t){if(e instanceof P)return{reason:e.message,hint:e.hint??t,details:e.details,stack:st(e.cause??e)};if(e instanceof tt){let r=e.issues.map(n=>`${n.path.join(".")||"(root)"}: ${n.message}`);return{reason:"\uC785\uB825\uAC12 \uB610\uB294 \uC124\uC815 \uD30C\uC77C \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC544\uC694.",hint:t,details:r,stack:e.stack}}if(e instanceof Error){let r=e,n=[];return(r.escapedCommand||r.command)&&n.push(`\uC2E4\uD589 \uBA85\uB839\uC5B4: ${r.escapedCommand??r.command}`),typeof r.exitCode=="number"&&n.push(`\uC885\uB8CC \uCF54\uB4DC: ${r.exitCode}`),r.stderr?.trim()?n.push(`stderr: ${r.stderr.trim()}`):r.stdout?.trim()&&n.push(`stdout: ${r.stdout.trim()}`),{reason:r.shortMessage??e.message,hint:t,details:n,stack:e.stack}}return typeof e=="string"?{reason:e,hint:t,details:[]}:{reason:"\uC54C \uC218 \uC5C6\uB294 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC5B4\uC694.",hint:t,details:[]}}function st(e){if(e instanceof Error)return e.stack}function V(e,{defaultMessage:t,defaultHint:r,verbose:n=!1}){let o=rt(e,r);W.log.error(t),W.log.error(`\uC6D0\uC778: ${o.reason}`);for(let s of o.details)W.log.info(s);o.hint&&W.log.info(`\uD574\uACB0 \uD78C\uD2B8: ${o.hint}`),n&&o.stack&&(W.log.message(p(`
|
|
3
|
+
[verbose] stack trace`)),W.log.message(o.stack)),W.outro(p("\uC791\uC5C5\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694."))}import*as q from"@clack/prompts";import ct from"fs-extra";import Se from"path";import it from"findup-sync";import ot from"fs-extra";var nt="package.json";function at(e=process.cwd()){let t=it(nt,{cwd:e});if(!t)throw new Error("No package.json file found in the project.");return t}function Q(e=process.cwd()){let t=at(e);return ot.readJSONSync(t)}var K={rsc:!1,tsx:!0,framework:"react",path:"./seed-design",telemetry:!0};function $e(e){try{let t=Q(e),r={...t.dependencies,...t.devDependencies,...t.peerDependencies};if("@lynx-js/react"in r||"@seed-design/lynx-react"in r)return"lynx"}catch{}return"react"}async function Re(e){let t=$e(e);return await q.group({tsx:()=>q.confirm({message:`${p("TypeScript")}\uB97C \uC0AC\uC6A9\uC911\uC774\uC2E0\uAC00\uC694?`,initialValue:K.tsx}),rsc:()=>q.confirm({message:`${p("React Server Components")}\uB97C \uC0AC\uC6A9\uC911\uC774\uC2E0\uAC00\uC694?`,initialValue:K.rsc}),framework:()=>q.select({message:`\uC5B4\uB5A4 ${p("\uD504\uB808\uC784\uC6CC\uD06C")}\uB97C \uC0AC\uC6A9\uD558\uC2DC\uB098\uC694?`,initialValue:t,options:[{value:"react",label:"React"},{value:"lynx",label:"Lynx"}]}),path:()=>q.text({message:`${p("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:K.path,defaultValue:K.path,placeholder:K.path}),telemetry:()=>q.confirm({message:`\uAC1C\uC120\uC744 \uC704\uD574 ${p("\uC775\uBA85 \uC0AC\uC6A9 \uB370\uC774\uD130")}\uB97C \uC218\uC9D1\uD560\uAE4C\uC694?`,initialValue:K.telemetry})},{onCancel:()=>{throw new E}})}async function ge({cwd:e,config:t}){let r=Se.resolve(e,"seed-design.json");return await ct.writeFile(r,`${JSON.stringify(t,null,2)}
|
|
4
|
+
`,"utf-8"),{relativePath:Se.relative(process.cwd(),r),targetPath:r}}var Ee="seed-design",lt=pt(Ee,{searchPlaces:[`${Ee}.json`]}),ve=te.object({$schema:te.string().optional(),rsc:te.coerce.boolean().default(!1),tsx:te.coerce.boolean().default(!0),framework:te.enum(["react","lynx"]).default("react"),path:te.string(),telemetry:te.coerce.boolean().optional().default(!0)}).strict();async function ue(e){let t=await oe(e);if(t)return t;re.log.error("\uD504\uB85C\uC81D\uD2B8 \uB8E8\uD2B8 \uACBD\uB85C\uC5D0 `seed-design.json` \uD30C\uC77C\uC774 \uC5C6\uC5B4\uC694.");let r=await re.confirm({message:"seed-design.json \uD30C\uC77C\uC744 \uC0DD\uC131\uD558\uC2DC\uACA0\uC5B4\uC694?"});if(re.isCancel(r)||!r)throw new E;try{return await ge({cwd:e,config:K}),re.log.message("seed-design.json \uD30C\uC77C\uC774 \uC0DD\uC131\uB410\uC5B4\uC694."),ve.parse(K)}catch(n){throw new P({message:"seed-design.json \uD30C\uC77C \uC0DD\uC131\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694.",hint:"\uB514\uB809\uD1A0\uB9AC \uC4F0\uAE30 \uAD8C\uD55C\uACFC \uACBD\uB85C\uB97C \uD655\uC778\uD55C \uB4A4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574\uBCF4\uC138\uC694.",cause:n})}}async function oe(e){let t=await lt.search(e);if(!t||t.isEmpty)return null;try{return ve.parse(t.config)}catch(r){throw new P({message:"seed-design.json \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC544\uC694.",hint:"https://seed-design.com/react/getting-started/cli/configuration \uBB38\uC11C\uB97C \uCC38\uACE0\uD574 \uC8FC\uC138\uC694.",cause:r})}}function ye({selectedItemKeys:e,publicRegistries:t}){let r=[],n=new Set;function o(s,i){let c=r.find(a=>a.registryId===s);if(!c?.items.some(a=>a.id===i.id)){if(c?c.items.push(i):r.push({registryId:s,items:[i]}),i.dependencies?.length)for(let a of i.dependencies)n.add(a);if(i.innerDependencies?.length)for(let a of i.innerDependencies)for(let w of a.itemIds){let C=t.find($=>$.id===a.registryId)?.items.find($=>$.id===w);if(!C)throw new Error(`Cannot find dependency item: ${a.registryId}:${w}`);o(a.registryId,C)}}}for(let s of e){let[i,...c]=s.split(":"),a=c.join(":");if(!i||!a)throw new Error(`Invalid snippet format: "${s}"`);let w=t.find(C=>C.id===i)?.items.find(C=>C.id===a);if(!w)throw new Error(`Cannot find snippet: "${s}"`);o(i,w)}return{registryItemsToAdd:r,npmDependenciesToAdd:n}}import*as Pe from"@clack/prompts";import{z as l}from"zod";var xe=l.object({id:l.string(),description:l.string().optional(),deprecated:l.boolean().optional(),hideFromCLICatalog:l.boolean().optional(),dependencies:l.array(l.string()).optional(),innerDependencies:l.array(l.object({registryId:l.string(),itemIds:l.array(l.string())})).optional(),snippets:l.array(l.object({path:l.string(),dependencies:l.record(l.string(),l.string()).optional(),content:l.string()}))}),Ie=l.object({id:l.string(),hideFromCLICatalog:l.boolean().optional(),items:l.array(xe.omit({snippets:!0}).extend({snippets:l.array(l.object({path:l.string(),dependencies:l.record(l.string(),l.string()).optional()}))}))}),Ae=l.array(l.object({id:l.string()})),mt=l.object({label:l.string(),path:l.string()}),dt=l.object({id:l.string(),title:l.string(),description:l.string().optional(),docUrl:l.string(),deprecated:l.boolean().optional(),snippetKey:l.string().optional(),snippets:l.array(mt).optional()}),ft=l.object({id:l.string(),label:l.string(),items:l.array(dt)}),gt=l.object({id:l.string(),label:l.string(),sections:l.array(ft)}),je=l.object({categories:l.array(gt)});async function Te({baseUrl:e}){let t=await fetch(`${e}/__docs__/index.json`);if(!t.ok)throw new P({message:`\uBB38\uC11C \uBAA9\uB85D\uC744 \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694: ${t.status} ${t.statusText}`});let r=await t.json(),{success:n,data:o,error:s}=je.safeParse(r);if(!n)throw new P({message:`\uBB38\uC11C \uBAA9\uB85D \uD30C\uC2F1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694: ${s?.message}`});return o}async function ne({baseUrl:e,framework:t}){let r=await fetch(`${e}/__registry__/${t}/index.json`);if(!r.ok)throw new Error(`Failed to fetch registries: ${r.status} ${r.statusText}`);let n=await r.json(),{success:o,data:s,error:i}=Ae.safeParse(n);if(!o)throw new Error(`Failed to parse registries: ${i?.message}`);return s}async function ae({baseUrl:e,framework:t,registryId:r}){let n=await fetch(`${e}/__registry__/${t}/${r}/index.json`);if(!n.ok)throw new Error(`Failed to fetch ${r} registry: ${n.status} ${n.statusText}`);let o=await n.json(),{success:s,data:i,error:c}=Ie.safeParse(o);if(!s)throw new Error(`Failed to parse ${r} registry: ${c?.message}`);return i}async function ut({baseUrl:e,framework:t,registryId:r,registryItemId:n}){let o=await fetch(`${e}/__registry__/${t}/${r}/${n}.json`);if(!o.ok)throw new Error(`Failed to fetch ${n}: ${o.status} ${o.statusText}`);let s=await o.json(),{success:i,data:c,error:a}=xe.safeParse(s);if(!i)throw new Error(`Failed to parse ${n}: ${a?.message}`);return c}async function _e({baseUrl:e,framework:t,registryId:r,registryItemIds:n}){return await Promise.all(n.map(async o=>{try{return await ut({baseUrl:e,framework:t,registryId:r,registryItemId:o})}catch(s){let i=await fetch(`${e}/__registry__/${t}/${r}/index.json`);if(!i.ok)throw new Error(`${r} \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uB97C \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694: ${i.status} ${i.statusText}`);let c=await i.json(),{success:a,data:w}=Ie.safeParse(c);throw a?(Pe.log.error(`${o} \uC2A4\uB2C8\uD3AB\uC774 ${r} \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC5D0 \uC5C6\uC5B4\uC694.`),Pe.log.info(`${r} \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC5D0 \uC874\uC7AC\uD558\uB294 \uC2A4\uB2C8\uD3AB:
|
|
5
|
+
${w.items.map(C=>C.id).join(`
|
|
6
|
+
`)}`),s):new Error(`Failed to parse registry index for ${r}`)}}))}import{promises as $t}from"fs";import{tmpdir as xt}from"os";import Me from"path";import{transformFromAstSync as yt}from"@babel/core";import ht from"@babel/plugin-transform-typescript";import*as he from"recast";import{parse as wt}from"@babel/parser";var bt={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"]},De=async({sourceFile:e,config:t})=>{let r=e.getFullText();if(t.tsx)return r;let n=he.parse(r,{parser:{parse:s=>wt(s,bt)}}),o=yt(n,r,{cloneInputAst:!1,code:!1,ast:!0,plugins:[ht],configFile:!1});if(!o||!o.ast)throw new Error("Failed to transform JSX");return he.print(o.ast).code};import{SyntaxKind as Ct}from"ts-morph";var Oe=async({sourceFile:e,config:t})=>{if(t.rsc)return e;let r=e.getFirstChildByKind(Ct.ExpressionStatement);if(!r)return e;let n=r.getExpression();if(!n)return e;let o=n.getText().trim();if(o!=='"use client"'&&o!=="'use client'")return e;let s=r.getText(),i=r.getFullText();if(s.trim()===i.trim())return e;let a=i.replace(s,"").replace(/^\s*\n/,"").replace(/\n\s*$/,"");return r.replaceWithText(a),e};import{Project as It,ScriptKind as Pt}from"ts-morph";var kt=[Oe],St=new It({compilerOptions:{}});async function Rt(e){let t=await $t.mkdtemp(Me.join(xt(),"seed-design-"));return Me.join(t,e)}async function Ke(e){let t=await Rt(e.filename),r=St.createSourceFile(t,e.raw,{scriptKind:Pt.TSX});for(let n of kt)n({sourceFile:r,...e});return await De({sourceFile:r,...e})}import*as L from"@clack/prompts";import ce from"fs-extra";import B from"path";import{createPatch as Et}from"diff";import vt from"@npmcli/disparity-colors";async function we({registryItemsToAdd:e,rootPath:t,cwd:r,baseUrl:n,framework:o,config:s,onDiff:i}){let c=[];for(let{registryId:a,items:w}of e){let C=B.join(t,a);ce.ensureDirSync(C);let $=await _e({baseUrl:n,framework:o,registryId:a,registryItemIds:w.map(u=>u.id)});for(let{id:u,snippets:A}of $){let g=await Promise.all(A.map(async f=>{let h=await Ke({filename:f.path,config:s,raw:f.content}),d=B.join(C,f.path);return s.tsx||(d=d.replace(/\.tsx$/,".jsx"),d=d.replace(/\.ts$/,".js")),{filePath:d,content:h,relativePath:B.relative(r,d),name:`${a}:${u}`}})),x=[];for(let f of g){let{filePath:h,content:d,relativePath:b}=f;if(await ce.ensureDir(B.dirname(h)),ce.existsSync(h)){let I=await ce.readFile(h,"utf-8");if(I===d){L.log.info(`${p(b)}: \uC774\uBBF8 \uCD5C\uC2E0 \uC0C1\uD0DC\uC608\uC694.`);continue}let U=B.basename(h),H=B.extname(h),ie=B.basename(h,H),de=Date.now(),k=`legacy-${ie}-${de}${H}`,m=await(async()=>{if(i)return i;let y=Et(b,I,d),j=vt(y);return L.log.message(`
|
|
7
|
+
${p(b)}: \uD604\uC7AC \uD30C\uC77C\uACFC \uBC1B\uC73C\uB824\uB294 \uD30C\uC77C\uC758 \uB0B4\uC6A9\uC774 \uB2EC\uB77C\uC694.
|
|
8
|
+
`),L.log.message(j),L.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:`${U} \uB36E\uC5B4\uC4F0\uAE30`},{value:"backup",label:`\uAE30\uC874 \uD30C\uC77C \uB0B4\uC6A9\uC744 ${k}\uC73C\uB85C \uC62E\uAE30\uACE0 ${U} \uBC1B\uAE30`},{value:"skip",label:"\uC0C8 \uD30C\uC77C \uBC1B\uC9C0 \uC54A\uACE0 \uADF8\uB300\uB85C \uB450\uAE30"}]})})();if(L.isCancel(m)||m==="skip"){L.log.info(`${p(b)}: \uD30C\uC77C\uC744 \uBC1B\uC9C0 \uC54A\uACE0 \uAC74\uB108\uB6F0\uC5C8\uC5B4\uC694.`);continue}if(m==="backup"){let y=B.dirname(h),j=B.join(y,k);await ce.rename(h,j),L.log.info(`${p(b)}: \uAE30\uC874 \uD30C\uC77C\uC744 ${p(B.relative(r,j))}\uB85C \uC62E\uACBC\uC5B4\uC694.`)}}await ce.writeFile(h,d),x.push(f)}if(x.length>0){let f=x.map(({name:h,relativePath:d})=>({name:h,path:d}));c.push(...f),L.log.success(`${p(`${a}:${u}`)} \uAD00\uB828 \uC2A4\uB2C8\uD3AB \uB2E4\uC6B4\uB85C\uB4DC \uC644\uB8CC: ${p(f.map(h=>h.path).join(", "))}`)}}}}import*as S from"@clack/prompts";import Yt from"path";import{z as ee}from"zod";var G="https://seed-design.io";import*as Ne from"@clack/prompts";import{execa as jt}from"execa";import{detect as At}from"@antfu/ni";async function Le(e){let t=await At({programmatic:!0,cwd:e});return t==="yarn@berry"?"yarn":t==="pnpm@6"?"pnpm":t==="bun"?"bun":t==="deno"?"deno":t??"npm"}async function be({cwd:e,deps:t,dev:r=!1}){let{start:n,stop:o}=Ne.spinner(),s=await Le(e),c={...Q(e).dependencies},a=new Set(t.filter(g=>!c[g])),w=new Set(t.filter(g=>c[g]));if(!a.size)return{installed:new Set,filtered:a};n("\uC758\uC874\uC131 \uC124\uCE58\uC911...");let u=[s==="npm"?"install":"add",r?"-D":null,...a].filter(Boolean),A=`${s} ${u.join(" ")}`;try{await jt(s,u,{cwd:e})}catch(g){throw o("\uC758\uC874\uC131 \uC124\uCE58\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694."),new P({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: ${A}`],cause:g})}return o("\uC758\uC874\uC131 \uC124\uCE58\uAC00 \uC644\uB8CC\uB410\uC5B4\uC694."),{installed:a,filtered:w}}import{randomUUID as Tt}from"node:crypto";import*as Fe from"@clack/prompts";var _t="seed_cli";async function Dt(e){if(process.env.DISABLE_TELEMETRY==="true"||process.env.SEED_DISABLE_TELEMETRY==="true")return!1;try{if((await oe(e))?.telemetry===!1)return!1}catch{}return!0}function Ot(){return Tt()}var Mt=Ot(),Ue=!1;async function Kt(e,{event:t,properties:r={}}){if(!await Dt(e))return;let o=`${_t}.${t}`;Ue||(Fe.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)"),Ue=!0);try{let s="https://us.i.posthog.com/capture",i={"Content-Type":"application/json"},c={api_key:"phc_seod8HhifElOP1R92KmvsQybrtUmkOTgZBsq0mfCelR",event:o,distinct_id:Mt,properties:{...r,$process_person_profile:!1},timestamp:new Date().toISOString()},a=new AbortController,w=setTimeout(()=>a.abort(),5e3);try{await fetch(s,{method:"POST",headers:i,body:JSON.stringify(c),signal:a.signal})}finally{clearTimeout(w)}}catch{}}var N={track:Kt};import*as se from"@clack/prompts";import Lt from"fs-extra";import Nt from"path";import{intersects as Ut,satisfies as Ft,valid as Ve,validRange as qe}from"semver";var zt=["@seed-design/react","@seed-design/css"],Vt=["@seed-design/lynx-react","@seed-design/lynx-css"];function Z(e){return e==="lynx"?Vt:zt}var ze="workspace:",qt="npm:";function pe(e,t="react"){try{let r=Q(e),n={...r.dependencies,...r.devDependencies,...r.peerDependencies,...r.optionalDependencies},o={},s=Z(t);for(let i of s){let c=n[i];typeof c=="string"&&(o[i]=c)}return o}catch{return{}}}function le({publicRegistries:e,itemKeys:t,projectPackageVersions:r,framework:n="react"}){let o=Array.from(new Set(t)),s=new Map(e.flatMap(a=>a.items.map(w=>[`${a.id}:${w.id}`,w]))),i=[],c=Z(n);for(let a of o){let w=s.get(a);if(!w)continue;let C=Bt(w,n);for(let $ of c){let u=Array.from(C[$]??[]);if(!u.length)continue;let A=r[$];if(!A){i.push({itemKey:a,packageName:$,requiredRanges:u,type:"missing-package"});continue}let g=Gt(A);if(!g){i.push({itemKey:a,packageName:$,requiredRanges:u,installedVersionSpec:A,type:"invalid-version-spec"});continue}u.every(f=>Ht({currentVersionSpec:g,requiredRange:f}))||i.push({itemKey:a,packageName:$,requiredRanges:u,installedVersionSpec:A,type:"incompatible-version"})}}return{checkedItemKeys:o,projectPackageVersions:r,issues:i}}function me({report:e,title:t,framework:r="react"}){if(!e.issues.length)return;let n=Z(r);se.log.warn(t),se.log.info(`\uD604\uC7AC \uD504\uB85C\uC81D\uD2B8 \uBC84\uC804: ${n.map(s=>`${s}@${p(e.projectPackageVersions[s]??"\uBBF8\uC124\uCE58")}`).join(", ")}`);let o=new Map;for(let s of e.issues){let i=o.get(s.itemKey)??[];i.push(s),o.set(s.itemKey,i)}for(let[s,i]of o.entries()){se.log.warn(p(s));for(let c of i){let a=c.requiredRanges.join(" | ");if(c.type==="missing-package"){se.log.info(` - ${c.packageName}: \uD328\uD0A4\uC9C0\uAC00 \uC124\uCE58\uB418\uC5B4 \uC788\uC9C0 \uC54A\uC544\uC694. \uD544\uC694 \uBC94\uC704: ${a}`);continue}if(c.type==="invalid-version-spec"){se.log.info(` - ${c.packageName}: \uD604\uC7AC \uBC84\uC804 \uD615\uC2DD\uC744 \uD574\uC11D\uD558\uC9C0 \uBABB\uD588\uC5B4\uC694 (${c.installedVersionSpec}). \uD544\uC694 \uBC94\uC704: ${a}`);continue}se.log.info(` - ${c.packageName}: \uD604\uC7AC ${c.installedVersionSpec}, \uD544\uC694 \uBC94\uC704 ${a}`)}}}function Be({publicRegistries:e,rootPath:t}){let r=[];for(let n of e)for(let o of n.items)o.snippets.some(i=>Jt(i.path).some(c=>Lt.existsSync(Nt.join(t,n.id,c))))&&r.push(`${n.id}:${o.id}`);return r}function Bt(e,t="react"){let r=Z(t),n=Object.fromEntries(r.map(o=>[o,new Set]));for(let o of e.snippets)for(let[s,i]of Object.entries(o.dependencies??{}))Wt(s,t)&&n[s].add(i);return n}function Gt(e){let t=e.trim();if(t.startsWith(ze)&&(t=t.slice(ze.length).trim()),t.startsWith(qt)){let r=t.split("@").at(-1);if(!r)return null;t=r}return!t||t==="*"?null:Ve(t)||qe(t)?t:null}function Ht({currentVersionSpec:e,requiredRange:t}){let r=qe(t);return r?Ve(e)?Ft(e,r,{includePrerelease:!0}):Ut(e,r,{includePrerelease:!0}):!1}function Jt(e){let t=new Set([e]);return e.endsWith(".tsx")&&t.add(`${e.slice(0,-4)}.jsx`),e.endsWith(".ts")&&t.add(`${e.slice(0,-3)}.js`),e.endsWith(".jsx")&&t.add(`${e.slice(0,-4)}.tsx`),e.endsWith(".js")&&t.add(`${e.slice(0,-3)}.ts`),Array.from(t)}function Wt(e,t="react"){return Z(t).includes(e)}var Xt=ee.object({itemIds:ee.array(ee.string()).optional(),all:ee.boolean(),cwd:ee.string(),baseUrl:ee.string().optional(),framework:ee.enum(["react","lynx"]).optional(),onDiff:ee.enum(["overwrite","backup"]).optional()}),Ge=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:G}).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(t,r)=>{let n=Date.now(),o=z(r);S.intro("seed-design add");try{let s=Xt.safeParse({itemIds:t,...r});if(!s.success)throw s.error;let{data:{all:i,...c}}=s;if(i)throw new P({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 a=c.cwd,w=c.baseUrl,C=await ue(a),$=c.framework??C.framework,u=Yt.resolve(a,C.path),{start:A,stop:g}=S.spinner();A("Registry\uB97C \uAC00\uC838\uC624\uACE0 \uC788\uC5B4\uC694...");let x=await(async()=>{try{let m=await Promise.all((await ne({baseUrl:w,framework:$})).map(async({id:y})=>ae({baseUrl:w,framework:$,registryId:y})));return g("Registry\uB97C \uAC00\uC838\uC654\uC5B4\uC694."),m}catch(m){throw g("Registry\uB97C \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694."),m}})(),f=await(async()=>{if(c.itemIds?.length)return c.itemIds;let m=await S.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:x.filter(({hideFromCLICatalog:y})=>!y).flatMap(({id:y,items:j})=>j.filter(({hideFromCLICatalog:M})=>!M).sort((M,_)=>M.id.localeCompare(_.id)).map(({id:M,description:_,deprecated:J})=>({label:`${J?"(deprecated) ":""}${p(y)}:${M}`,value:`${y}:${M}`,hint:_,deprecated:J,registryItemCount:j.length}))).sort((y,j)=>y.deprecated!==j.deprecated?y.deprecated?1:-1:j.registryItemCount-y.registryItemCount)});if(S.isCancel(m))throw new E;return m})();if(!f?.length)throw new E("\uCD94\uAC00\uD560 \uD56D\uBAA9\uC774 \uC120\uD0DD\uB418\uC9C0 \uC54A\uC558\uC5B4\uC694.");S.log.message(`\uC120\uD0DD\uB41C \uD56D\uBAA9: ${p(f.join(", "))}`);let h=[];for(let m of f){let[y,...j]=m.split(":"),M=j.join(":");if(!y||!M)throw new P({message:`${p(m)}: \uD56D\uBAA9 \uC774\uB984\uC774 \uC798\uBABB\uB418\uC5C8\uC5B4\uC694.`,hint:`${p("ui:action-button")}\uACFC \uAC19\uC740 \uD615\uC2DD\uC73C\uB85C \uC785\uB825\uD574\uBCF4\uC138\uC694.`});let _=x.find(J=>J.id===y)?.items.find(J=>J.id===M);if(!_)throw new P({message:`${p(m)}: \uD56D\uBAA9\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.`});if(_.deprecated){let J=await S.confirm({message:`${p(_.id)}: deprecated \uB418\uC5C8\uC5B4\uC694. \uCD94\uAC00\uD560\uAE4C\uC694?`,initialValue:!1});if(S.isCancel(J))throw new E;if(J===!1){S.log.info(`${p(_.id)}: \uCD94\uAC00\uD558\uC9C0 \uC54A\uC744\uAC8C\uC694.`);continue}}h.push(m)}let{registryItemsToAdd:d,npmDependenciesToAdd:b}=ye({selectedItemKeys:h,publicRegistries:x}),I=le({publicRegistries:x,itemKeys:d.flatMap(({registryId:m,items:y})=>y.map(j=>`${m}:${j.id}`)),projectPackageVersions:pe(c.cwd,$),framework:$});me({report:I,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:$}),S.log.info(`\uCD94\uAC00\uD560 \uD56D\uBAA9: ${p(d.map(m=>m.items.map(y=>`${m.registryId}:${y.id}`).join(", ")).join(", ")||"\uC5C6\uC74C")}
|
|
9
9
|
|
|
10
|
-
\uC124\uCE58\uD560 \uC758\uC874\uC131: ${a(Array.from(I).join(", ")||"\uC5C6\uC74C")}`),await he({registryItemsToAdd:w,rootPath:b,cwd:m,baseUrl:y,config:C,onDiff:c.onDiff});let{installed:P,filtered:O}=await we({cwd:m,deps:Array.from(I)});P.size===0&&S.log.message("\uBAA8\uB4E0 \uC758\uC874\uC131\uC774 \uC774\uBBF8 \uC124\uCE58\uB418\uC5B4 \uC788\uC5B4\uC694."),P.size&&(S.log.message(`\uC758\uC874\uC131 \uC124\uCE58 \uC644\uB8CC: ${a(Array.from(P).join(", "))}`),O.size&&S.log.message(`\uC124\uCE58\uD558\uC9C0 \uC54A\uC740 \uC758\uC874\uC131 (\uC774\uBBF8 \uC124\uCE58\uB428): ${a(Array.from(O).join(", "))}`)),S.outro("\uC644\uB8CC\uD588\uC5B4\uC694.");let ee=Date.now()-o,pe=new Set(w.map(l=>l.registryId)),x=g.some(l=>{let[u,...A]=l.split(":"),M=A.join(":");return f.find(T=>T.id===u)?.items.find(T=>T.id===M)?.deprecated});try{await U.track(c.cwd,{event:"add",properties:{items_count:d.length,registries:Array.from(pe),has_deprecated:x,dependencies_count:I.size,duration_ms:ee}})}catch(l){n&&console.error("[Telemetry] add tracking failed:",l)}}catch(r){z(r)&&(S.outro(a(r.message)),process.exit(0)),V(r,{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:n}),process.exit(1)}})};import*as v from"@clack/prompts";import Jt from"path";import{z as Y}from"zod";var Wt=Y.object({registryIds:Y.array(Y.string()).optional(),all:Y.boolean(),includeDeprecated:Y.boolean().optional(),cwd:Y.string(),baseUrl:Y.string().optional(),onDiff:Y.enum(["overwrite","backup"]).optional()}),Be=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:B}).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(t,s)=>{let o=Date.now(),n=F(s);v.intro("seed-design add-all");try{let r=Wt.safeParse({registryIds:t,...s});if(!r.success)throw r.error;let{data:i}=r,c=i.cwd,m=i.baseUrl,y=await ge(c),C=Jt.resolve(c,y.path),{start:b,stop:h}=v.spinner();b("Registry\uB97C \uAC00\uC838\uC624\uACE0 \uC788\uC5B4\uC694...");let j=await(async()=>{try{let x=await Promise.all((await se({baseUrl:m})).map(async({id:l})=>re({baseUrl:m,registryId:l})));return h("Registry\uB97C \uAC00\uC838\uC654\uC5B4\uC694."),x}catch(x){throw h("Registry\uB97C \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694."),x}})(),f=await(async()=>{if(i.all){let l=j.map(u=>u.id);return v.log.message(`\uBAA8\uB4E0 \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC758 \uBAA8\uB4E0 \uD56D\uBAA9\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4: ${a(l.join(", "))}`),l}if(i.registryIds?.length){let l=j.map(u=>u.id);for(let u of i.registryIds)if(!l.includes(u))throw new $({message:`\uB808\uC9C0\uC2A4\uD2B8\uB9AC '${u}'\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.`,details:[`\uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uB808\uC9C0\uC2A4\uD2B8\uB9AC: ${l.join(", ")}`]});return v.log.message(`\uC120\uD0DD\uB41C \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC758 \uBAA8\uB4E0 \uD56D\uBAA9\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4: ${a(i.registryIds.join(", "))}`),i.registryIds}let x=await v.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:j.filter(({hideFromCLICatalog:l})=>!l).sort((l,u)=>u.items.length-l.items.length).map(l=>{let u=l.items[0]?.id,A=u?`${l.items.length}\uAC1C \uD56D\uBAA9 (${u} \uB4F1)`:`${l.items.length}\uAC1C \uD56D\uBAA9 (\uD56D\uBAA9 \uC5C6\uC74C)`;return{label:l.id,value:l.id,hint:A}})});if(v.isCancel(x))throw new k;return v.log.message(`\uC120\uD0DD\uB41C \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC758 \uD56D\uBAA9\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4: ${a(x.join(", "))}`),x})(),g=j.filter(x=>f.includes(x.id)),d=g.flatMap(x=>x.items.filter(l=>l.deprecated?i.includeDeprecated:!0).map(l=>`${x.id}:${l.id}`)),w=g.reduce((x,l)=>x+l.items.filter(u=>u.deprecated).length,0);if(!i.includeDeprecated&&w>0&&v.log.info(`${w}\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.`),!d.length)throw new k("\uCD94\uAC00\uD560 \uD56D\uBAA9\uC774 \uC5C6\uC5B4\uC694.");v.log.message(`\uCD1D ${a(d.length.toString())}\uAC1C\uC758 \uD56D\uBAA9\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4.`);let{registryItemsToAdd:I,npmDependenciesToAdd:E}=ue({selectedItemKeys:d,publicRegistries:j}),P=ae({publicRegistries:j,itemKeys:I.flatMap(({registryId:x,items:l})=>l.map(u=>`${x}:${u.id}`)),projectPackageVersions:ne(i.cwd)});ce({report:P,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."}),await he({registryItemsToAdd:I,rootPath:C,cwd:c,baseUrl:m,config:y,onDiff:i.onDiff});let{installed:O,filtered:ee}=await we({cwd:c,deps:Array.from(E)});O.size===0&&v.log.message("\uBAA8\uB4E0 \uC758\uC874\uC131\uC774 \uC774\uBBF8 \uC124\uCE58\uB418\uC5B4 \uC788\uC5B4\uC694."),O.size&&(v.log.message(`\uC758\uC874\uC131 \uC124\uCE58 \uC644\uB8CC: ${a(Array.from(O).join(", "))}`),ee.size&&v.log.message(`\uC124\uCE58\uD558\uC9C0 \uC54A\uC740 \uC758\uC874\uC131 (\uC774\uBBF8 \uC124\uCE58\uB428): ${a(Array.from(ee).join(", "))}`)),v.outro("\uC644\uB8CC\uD588\uC5B4\uC694.");let pe=Date.now()-o;try{await U.track(i.cwd,{event:"add-all",properties:{registries:f,items_count:d.length,include_deprecated:i.includeDeprecated||!1,dependencies_count:E.size,duration_ms:pe}})}catch(x){n&&console.error("[Telemetry] add-all tracking failed:",x)}}catch(r){z(r)&&(v.outro(a(r.message)),process.exit(0)),V(r,{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:n}),process.exit(1)}})};import*as D from"@clack/prompts";import Ge from"path";import{z as N}from"zod";var Yt=N.object({itemIds:N.array(N.string()).optional(),component:N.union([N.string(),N.array(N.string())]).optional(),all:N.boolean(),registry:N.string().optional(),cwd:N.string(),baseUrl:N.string().optional()});function Xt({itemIds:e,component:t}){let s=r=>r.trim().replace(/\s+/g,"-"),o=(e??[]).map(s).filter(Boolean),n=(Array.isArray(t)?t:[t]).filter(r=>!!r).flatMap(r=>r.split(",")).map(s).filter(Boolean);return Array.from(new Set([...o,...n]))}function Qt({publicRegistries:e,targetInputs:t,defaultRegistry:s}){let o=e.filter(r=>typeof r.id=="string"&&Array.isArray(r.items)).flatMap(r=>r.items.filter(i=>typeof i.id=="string").map(i=>`${r.id}:${i.id}`)),n=new Set;for(let r of t){let i=r.includes(":")?r:s?`${s}:${r}`:(()=>{let c=o.filter(m=>m.endsWith(`:${r}`));if(!c.length)throw new $({message:`${a(r)}: \uD56D\uBAA9\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.`,hint:`${a("ui:action-button")}\uCC98\uB7FC registry\uB97C \uD3EC\uD568\uD574\uC11C \uC785\uB825\uD574\uBCF4\uC138\uC694.`});if(c.length>1)throw new $({message:`${a(r)}: \uAC19\uC740 \uC774\uB984\uC758 \uD56D\uBAA9\uC774 \uC5EC\uB7EC \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC5D0 \uC788\uC5B4\uC694.`,details:c.map(m=>`- ${m}`),hint:`${a("ui:action-button")}\uCC98\uB7FC registry\uB97C \uD3EC\uD568\uD574\uC11C \uC785\uB825\uD574\uBCF4\uC138\uC694.`});return c[0]})();if(!o.includes(i))throw new $({message:`${a(i)}: \uD56D\uBAA9\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.`});n.add(i)}return Array.from(n)}var He=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:B}).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(t,s)=>{let o=Date.now(),n=F(s);D.intro("seed-design compat");try{let r=Yt.safeParse({itemIds:t,...s});if(!r.success)throw r.error;let{data:i}=r,{start:c,stop:m}=D.spinner();c("Registry\uB97C \uAC00\uC838\uC624\uACE0 \uC788\uC5B4\uC694...");let y=await(async()=>{try{let g=await Promise.all((await se({baseUrl:i.baseUrl})).map(async({id:d})=>re({baseUrl:i.baseUrl,registryId:d})));return m("Registry\uB97C \uAC00\uC838\uC654\uC5B4\uC694."),g}catch(g){throw m("Registry\uB97C \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694."),g}})(),C=Xt({itemIds:i.itemIds,component:i.component}),b=i.all?y.flatMap(d=>d.items.map(w=>`${d.id}:${w.id}`)):C.length>0?Qt({publicRegistries:y,targetInputs:C,defaultRegistry:i.registry}):le(i.cwd),h=Array.isArray(b)?b:await(async()=>{let g=await b;if(!g)throw new $({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 d=Ge.resolve(i.cwd,g.path),w=Ve({publicRegistries:y,rootPath:d});return w.length?w:(D.log.info(`${a(Ge.relative(i.cwd,d)||g.path)}\uC5D0\uC11C \uC124\uCE58\uB41C \uC2A4\uB2C8\uD3AB\uC744 \uCC3E\uC9C0 \uBABB\uD588\uC5B4\uC694.`),[])})();h.length||(D.outro("\uAC80\uC0AC\uD560 \uC2A4\uB2C8\uD3AB\uC774 \uC5C6\uC5B4\uC694."),process.exit(0));let j=ne(i.cwd),f=ae({publicRegistries:y,itemKeys:h,projectPackageVersions:j});if(D.log.info(`\uAC80\uC0AC \uB300\uC0C1: ${a(f.checkedItemKeys.join(", "))}`),!f.issues.length){D.outro("\uBAA8\uB4E0 \uC2A4\uB2C8\uD3AB\uC774 \uD604\uC7AC @seed-design/react, @seed-design/css\uC640 \uD638\uD658\uB3FC\uC694.");try{await U.track(i.cwd,{event:"compat",properties:{checked_items_count:f.checkedItemKeys.length,incompatible_items_count:0,duration_ms:Date.now()-o}})}catch(g){n&&console.error("[Telemetry] compat tracking failed:",g)}process.exit(0)}ce({report:f,title:"\uD604\uC7AC \uD504\uB85C\uC81D\uD2B8 \uBC84\uC804\uACFC \uD638\uD658\uB418\uC9C0 \uC54A\uB294 \uC2A4\uB2C8\uD3AB\uC744 \uCC3E\uC558\uC5B4\uC694."}),D.log.info("\uD544\uC694\uD55C \uBC84\uC804\uC73C\uB85C @seed-design/react \uB610\uB294 @seed-design/css\uB97C \uB9DE\uCD98 \uB4A4 \uB2E4\uC2DC \uC2E4\uD589\uD574\uBCF4\uC138\uC694."),D.outro("\uD638\uD658\uC131 \uC774\uC288\uAC00 \uC788\uC5B4\uC694.");try{await U.track(i.cwd,{event:"compat",properties:{checked_items_count:f.checkedItemKeys.length,incompatible_items_count:new Set(f.issues.map(g=>g.itemKey)).size,issue_count:f.issues.length,duration_ms:Date.now()-o}})}catch(g){n&&console.error("[Telemetry] compat tracking failed:",g)}process.exit(1)}catch(r){z(r)&&(D.outro(a(r.message)),process.exit(0)),V(r,{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:n}),process.exit(1)}})};import*as R from"@clack/prompts";import{z as xe}from"zod";var Zt="https://raw.githubusercontent.com/daangn/seed-design/refs/heads/dev/docs/registry",es=xe.object({query:xe.string().optional(),baseUrl:xe.string().optional()});function Je(e,t){return`${Zt}/${e}/${t}`}function ts(e,t){let s=`${t}${e.docUrl}`,o=`${t}/llms${e.docUrl}.txt`,n=[e.id,`- docs: ${s}`,`- llms.txt: ${o}`];if(e.snippetKey&&e.snippets&&e.snippets.length>0){let[r]=e.snippetKey.split(":");if(r==="ui"||r==="breeze")if(e.snippets.length===1)n.push(`- snippet: ${Je(r,e.snippets[0].path)}`);else{n.push("- snippet:");for(let i of e.snippets)n.push(` - ${i.label}: ${Je(r,i.path)}`)}}R.log.message(n.join(`
|
|
11
|
-
`))}function
|
|
10
|
+
\uC124\uCE58\uD560 \uC758\uC874\uC131: ${p(Array.from(b).join(", ")||"\uC5C6\uC74C")}`),await we({registryItemsToAdd:d,rootPath:u,cwd:a,baseUrl:w,framework:$,config:C,onDiff:c.onDiff});let{installed:U,filtered:H}=await be({cwd:a,deps:Array.from(b)});U.size===0&&S.log.message("\uBAA8\uB4E0 \uC758\uC874\uC131\uC774 \uC774\uBBF8 \uC124\uCE58\uB418\uC5B4 \uC788\uC5B4\uC694."),U.size&&(S.log.message(`\uC758\uC874\uC131 \uC124\uCE58 \uC644\uB8CC: ${p(Array.from(U).join(", "))}`),H.size&&S.log.message(`\uC124\uCE58\uD558\uC9C0 \uC54A\uC740 \uC758\uC874\uC131 (\uC774\uBBF8 \uC124\uCE58\uB428): ${p(Array.from(H).join(", "))}`)),S.outro("\uC644\uB8CC\uD588\uC5B4\uC694.");let ie=Date.now()-n,de=new Set(d.map(m=>m.registryId)),k=f.some(m=>{let[y,...j]=m.split(":"),M=j.join(":");return x.find(_=>_.id===y)?.items.find(_=>_.id===M)?.deprecated});try{await N.track(c.cwd,{event:"add",properties:{items_count:h.length,registries:Array.from(de),has_deprecated:k,dependencies_count:b.size,duration_ms:ie}})}catch(m){o&&console.error("[Telemetry] add tracking failed:",m)}}catch(s){F(s)&&(S.outro(p(s.message)),process.exit(0)),V(s,{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:o}),process.exit(1)}})};import*as v from"@clack/prompts";import Qt from"path";import{z as Y}from"zod";var Zt=Y.object({registryIds:Y.array(Y.string()).optional(),all:Y.boolean(),includeDeprecated:Y.boolean().optional(),cwd:Y.string(),baseUrl:Y.string().optional(),framework:Y.enum(["react","lynx"]).optional(),onDiff:Y.enum(["overwrite","backup"]).optional()}),He=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:G}).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(t,r)=>{let n=Date.now(),o=z(r);v.intro("seed-design add-all");try{let s=Zt.safeParse({registryIds:t,...r});if(!s.success)throw s.error;let{data:i}=s,c=i.cwd,a=i.baseUrl,w=await ue(c),C=i.framework??w.framework,$=Qt.resolve(c,w.path),{start:u,stop:A}=v.spinner();u("Registry\uB97C \uAC00\uC838\uC624\uACE0 \uC788\uC5B4\uC694...");let g=await(async()=>{try{let k=await Promise.all((await ne({baseUrl:a,framework:C})).map(async({id:m})=>ae({baseUrl:a,framework:C,registryId:m})));return A("Registry\uB97C \uAC00\uC838\uC654\uC5B4\uC694."),k}catch(k){throw A("Registry\uB97C \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694."),k}})(),x=await(async()=>{if(i.all){let m=g.map(y=>y.id);return v.log.message(`\uBAA8\uB4E0 \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC758 \uBAA8\uB4E0 \uD56D\uBAA9\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4: ${p(m.join(", "))}`),m}if(i.registryIds?.length){let m=g.map(y=>y.id);for(let y of i.registryIds)if(!m.includes(y))throw new P({message:`\uB808\uC9C0\uC2A4\uD2B8\uB9AC '${y}'\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.`,details:[`\uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uB808\uC9C0\uC2A4\uD2B8\uB9AC: ${m.join(", ")}`]});return v.log.message(`\uC120\uD0DD\uB41C \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC758 \uBAA8\uB4E0 \uD56D\uBAA9\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4: ${p(i.registryIds.join(", "))}`),i.registryIds}let k=await v.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:g.filter(({hideFromCLICatalog:m})=>!m).sort((m,y)=>y.items.length-m.items.length).map(m=>{let y=m.items[0]?.id,j=y?`${m.items.length}\uAC1C \uD56D\uBAA9 (${y} \uB4F1)`:`${m.items.length}\uAC1C \uD56D\uBAA9 (\uD56D\uBAA9 \uC5C6\uC74C)`;return{label:m.id,value:m.id,hint:j}})});if(v.isCancel(k))throw new E;return v.log.message(`\uC120\uD0DD\uB41C \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC758 \uD56D\uBAA9\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4: ${p(k.join(", "))}`),k})(),f=g.filter(k=>x.includes(k.id)),h=f.flatMap(k=>k.items.filter(m=>m.deprecated?i.includeDeprecated:!0).map(m=>`${k.id}:${m.id}`)),d=f.reduce((k,m)=>k+m.items.filter(y=>y.deprecated).length,0);if(!i.includeDeprecated&&d>0&&v.log.info(`${d}\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.`),!h.length)throw new E("\uCD94\uAC00\uD560 \uD56D\uBAA9\uC774 \uC5C6\uC5B4\uC694.");v.log.message(`\uCD1D ${p(h.length.toString())}\uAC1C\uC758 \uD56D\uBAA9\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4.`);let{registryItemsToAdd:b,npmDependenciesToAdd:I}=ye({selectedItemKeys:h,publicRegistries:g}),U=le({publicRegistries:g,itemKeys:b.flatMap(({registryId:k,items:m})=>m.map(y=>`${k}:${y.id}`)),projectPackageVersions:pe(i.cwd,C),framework:C});me({report:U,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:C}),await we({registryItemsToAdd:b,rootPath:$,cwd:c,baseUrl:a,framework:C,config:w,onDiff:i.onDiff});let{installed:H,filtered:ie}=await be({cwd:c,deps:Array.from(I)});H.size===0&&v.log.message("\uBAA8\uB4E0 \uC758\uC874\uC131\uC774 \uC774\uBBF8 \uC124\uCE58\uB418\uC5B4 \uC788\uC5B4\uC694."),H.size&&(v.log.message(`\uC758\uC874\uC131 \uC124\uCE58 \uC644\uB8CC: ${p(Array.from(H).join(", "))}`),ie.size&&v.log.message(`\uC124\uCE58\uD558\uC9C0 \uC54A\uC740 \uC758\uC874\uC131 (\uC774\uBBF8 \uC124\uCE58\uB428): ${p(Array.from(ie).join(", "))}`)),v.outro("\uC644\uB8CC\uD588\uC5B4\uC694.");let de=Date.now()-n;try{await N.track(i.cwd,{event:"add-all",properties:{registries:x,items_count:h.length,include_deprecated:i.includeDeprecated||!1,dependencies_count:I.size,duration_ms:de}})}catch(k){o&&console.error("[Telemetry] add-all tracking failed:",k)}}catch(s){F(s)&&(v.outro(p(s.message)),process.exit(0)),V(s,{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:o}),process.exit(1)}})};import*as T from"@clack/prompts";import Je from"path";import{z as D}from"zod";var er=D.object({itemIds:D.array(D.string()).optional(),component:D.union([D.string(),D.array(D.string())]).optional(),all:D.boolean(),registry:D.string().optional(),cwd:D.string(),baseUrl:D.string().optional(),framework:D.enum(["react","lynx"]).optional()});function tr({itemIds:e,component:t}){let r=s=>s.trim().replace(/\s+/g,"-"),n=(e??[]).map(r).filter(Boolean),o=(Array.isArray(t)?t:[t]).filter(s=>!!s).flatMap(s=>s.split(",")).map(r).filter(Boolean);return Array.from(new Set([...n,...o]))}function rr({publicRegistries:e,targetInputs:t,defaultRegistry:r}){let n=e.filter(s=>typeof s.id=="string"&&Array.isArray(s.items)).flatMap(s=>s.items.filter(i=>typeof i.id=="string").map(i=>`${s.id}:${i.id}`)),o=new Set;for(let s of t){let i=s.includes(":")?s:r?`${r}:${s}`:(()=>{let c=n.filter(a=>a.endsWith(`:${s}`));if(!c.length)throw new P({message:`${p(s)}: \uD56D\uBAA9\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.`,hint:`${p("ui:action-button")}\uCC98\uB7FC registry\uB97C \uD3EC\uD568\uD574\uC11C \uC785\uB825\uD574\uBCF4\uC138\uC694.`});if(c.length>1)throw new P({message:`${p(s)}: \uAC19\uC740 \uC774\uB984\uC758 \uD56D\uBAA9\uC774 \uC5EC\uB7EC \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC5D0 \uC788\uC5B4\uC694.`,details:c.map(a=>`- ${a}`),hint:`${p("ui:action-button")}\uCC98\uB7FC registry\uB97C \uD3EC\uD568\uD574\uC11C \uC785\uB825\uD574\uBCF4\uC138\uC694.`});return c[0]})();if(!n.includes(i))throw new P({message:`${p(i)}: \uD56D\uBAA9\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.`});o.add(i)}return Array.from(o)}var We=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:G}).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(t,r)=>{let n=Date.now(),o=z(r);T.intro("seed-design compat");try{let s=er.safeParse({itemIds:t,...r});if(!s.success)throw s.error;let{data:i}=s,c=await oe(i.cwd),a=i.framework??c?.framework??"react",{start:w,stop:C}=T.spinner();w("Registry\uB97C \uAC00\uC838\uC624\uACE0 \uC788\uC5B4\uC694...");let $=await(async()=>{try{let d=await Promise.all((await ne({baseUrl:i.baseUrl,framework:a})).map(async({id:b})=>ae({baseUrl:i.baseUrl,framework:a,registryId:b})));return C("Registry\uB97C \uAC00\uC838\uC654\uC5B4\uC694."),d}catch(d){throw C("Registry\uB97C \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694."),d}})(),u=tr({itemIds:i.itemIds,component:i.component}),A=i.all?$.flatMap(b=>b.items.map(I=>`${b.id}:${I.id}`)):u.length>0?rr({publicRegistries:$,targetInputs:u,defaultRegistry:i.registry}):oe(i.cwd),g=Array.isArray(A)?A:await(async()=>{let d=await A;if(!d)throw new P({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 b=Je.resolve(i.cwd,d.path),I=Be({publicRegistries:$,rootPath:b});return I.length?I:(T.log.info(`${p(Je.relative(i.cwd,b)||d.path)}\uC5D0\uC11C \uC124\uCE58\uB41C \uC2A4\uB2C8\uD3AB\uC744 \uCC3E\uC9C0 \uBABB\uD588\uC5B4\uC694.`),[])})();g.length||(T.outro("\uAC80\uC0AC\uD560 \uC2A4\uB2C8\uD3AB\uC774 \uC5C6\uC5B4\uC694."),process.exit(0));let x=pe(i.cwd,a),f=le({publicRegistries:$,itemKeys:g,projectPackageVersions:x,framework:a});if(T.log.info(`\uAC80\uC0AC \uB300\uC0C1: ${p(f.checkedItemKeys.join(", "))}`),!f.issues.length){let d=Z(a);T.outro(`\uBAA8\uB4E0 \uC2A4\uB2C8\uD3AB\uC774 \uD604\uC7AC ${d.join(", ")}\uC640 \uD638\uD658\uB3FC\uC694.`);try{await N.track(i.cwd,{event:"compat",properties:{checked_items_count:f.checkedItemKeys.length,incompatible_items_count:0,duration_ms:Date.now()-n}})}catch(b){o&&console.error("[Telemetry] compat tracking failed:",b)}process.exit(0)}me({report:f,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:a});let h=Z(a);T.log.info(`\uD544\uC694\uD55C \uBC84\uC804\uC73C\uB85C ${h.join(" \uB610\uB294 ")}\uB97C \uB9DE\uCD98 \uB4A4 \uB2E4\uC2DC \uC2E4\uD589\uD574\uBCF4\uC138\uC694.`),T.outro("\uD638\uD658\uC131 \uC774\uC288\uAC00 \uC788\uC5B4\uC694.");try{await N.track(i.cwd,{event:"compat",properties:{checked_items_count:f.checkedItemKeys.length,incompatible_items_count:new Set(f.issues.map(d=>d.itemKey)).size,issue_count:f.issues.length,duration_ms:Date.now()-n}})}catch(d){o&&console.error("[Telemetry] compat tracking failed:",d)}process.exit(1)}catch(s){F(s)&&(T.outro(p(s.message)),process.exit(0)),V(s,{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:o}),process.exit(1)}})};import*as R from"@clack/prompts";import{z as ke}from"zod";var sr="https://raw.githubusercontent.com/daangn/seed-design/refs/heads/dev/docs/registry",ir=ke.object({query:ke.string().optional(),baseUrl:ke.string().optional()});function Ye(e,t){return`${sr}/${e}/${t}`}function or(e,t){let r=`${t}${e.docUrl}`,n=`${t}/llms${e.docUrl}.txt`,o=[e.id,`- docs: ${r}`,`- llms.txt: ${n}`];if(e.snippetKey&&e.snippets&&e.snippets.length>0){let[s]=e.snippetKey.split(":");if(s==="ui"||s==="breeze")if(e.snippets.length===1)o.push(`- snippet: ${Ye(s,e.snippets[0].path)}`);else{o.push("- snippet:");for(let i of e.snippets)o.push(` - ${i.label}: ${Ye(s,i.path)}`)}}R.log.message(o.join(`
|
|
11
|
+
`))}function nr(e){return e.split("/").map(t=>t.trim()).filter(Boolean)}function ar(e,t){let r=t.toLowerCase();return e.flatMap(n=>n.sections.flatMap(o=>o.items.filter(s=>s.id.toLowerCase().includes(r)||s.title.toLowerCase().includes(r)).map(s=>({item:s,categoryLabel:n.label,sectionLabel:o.label}))))}async function fe(e){let t=await R.select({message:"\uD56D\uBAA9\uC744 \uC120\uD0DD\uD574\uC8FC\uC138\uC694",options:e.map(r=>({label:`${r.deprecated?"(deprecated) ":""}${r.title}`,value:r,hint:r.description}))});if(R.isCancel(t))throw new E;return t}async function Xe(e){let t=await R.select({message:"\uC139\uC158\uC744 \uC120\uD0DD\uD574\uC8FC\uC138\uC694",options:e.map(r=>({label:r.label,value:r,hint:`${r.items.length}\uAC1C \uD56D\uBAA9`}))});if(R.isCancel(t))throw new E;return t}async function cr(e){let t=await R.select({message:"\uCE74\uD14C\uACE0\uB9AC\uB97C \uC120\uD0DD\uD574\uC8FC\uC138\uC694",options:e.map(r=>({label:r.label,value:r,hint:`${r.sections.reduce((n,o)=>n+o.items.length,0)}\uAC1C \uD56D\uBAA9`}))});if(R.isCancel(t))throw new E;return t}var Qe=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: ${G})`,{default:G}).example("seed-design docs").example("seed-design docs action-button").example("seed-design docs react").example("seed-design docs react/components").example("seed-design docs react/components/action-button").action(async(t,r)=>{let n=Date.now(),o=z(r);R.intro("seed-design docs");try{let s=ir.safeParse({query:t,...r});if(!s.success)throw s.error;let{data:i}=s,c=i.baseUrl??G,{start:a,stop:w}=R.spinner();a("\uBB38\uC11C \uBAA9\uB85D\uC744 \uAC00\uC838\uC624\uACE0 \uC788\uC5B4\uC694...");let C=await(async()=>{try{let g=await Te({baseUrl:c});return w("\uBB38\uC11C \uBAA9\uB85D\uC744 \uAC00\uC838\uC654\uC5B4\uC694."),g}catch(g){throw w("\uBB38\uC11C \uBAA9\uB85D\uC744 \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694."),g}})(),{categories:$}=C,u;if(i.query){let g=nr(i.query),x=$.find(f=>f.id===g[0]);if(x&&g.length>=2){let f=x.sections.find(h=>h.id===g[1]);if(f&&g.length>=3){let h=f.items.find(d=>d.id===g[2]);if(h)u=h;else{let d=g[2].toLowerCase(),b=f.items.filter(I=>I.id.toLowerCase().includes(d)||I.title.toLowerCase().includes(d));if(b.length===0)throw new P({message:`${p(i.query)}: \uBB38\uC11C\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.`,hint:`\`seed-design docs ${x.id}/${f.id}\`\uB85C \uBAA9\uB85D\uC744 \uD655\uC778\uD574\uBCF4\uC138\uC694.`});b.length===1?u=b[0]:u=await fe(b)}}else if(f)u=await fe(f.items);else{let h=g[1].toLowerCase(),d=x.sections.flatMap(b=>b.items.filter(I=>I.id.toLowerCase().includes(h)||I.title.toLowerCase().includes(h)).map(I=>({item:I,sectionLabel:b.label})));if(d.length===0)throw new P({message:`${p(i.query)}: \uBB38\uC11C\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.`,hint:`\`seed-design docs ${x.id}\`\uB85C \uBAA9\uB85D\uC744 \uD655\uC778\uD574\uBCF4\uC138\uC694.`});if(d.length===1)u=d[0].item;else{let b=await R.select({message:`${p(g[1])}\uC5D0 \uD574\uB2F9\uD558\uB294 \uD56D\uBAA9\uC744 \uC120\uD0DD\uD574\uC8FC\uC138\uC694`,options:d.map(({item:I,sectionLabel:U})=>({label:`[${U}] ${I.title}`,value:I,hint:I.description}))});if(R.isCancel(b))throw new E;u=b}}}else if(x)if(x.sections.length===1)u=await fe(x.sections[0].items);else{let f=await Xe(x.sections);u=await fe(f.items)}else{let f=ar($,i.query);if(f.length===0)throw new P({message:`${p(i.query)}: \uBB38\uC11C\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.`,hint:"`seed-design docs`\uB85C \uC804\uCCB4 \uBAA9\uB85D\uC744 \uD655\uC778\uD574\uBCF4\uC138\uC694."});if(f.length===1)u=f[0].item;else{let h=await R.select({message:`${p(i.query)}\uC5D0 \uD574\uB2F9\uD558\uB294 \uD56D\uBAA9\uC744 \uC120\uD0DD\uD574\uC8FC\uC138\uC694`,options:f.map(({item:d,categoryLabel:b,sectionLabel:I})=>({label:`[${b} > ${I}] ${d.title}`,value:d,hint:d.description}))});if(R.isCancel(h))throw new E;u=h}}}else{let g=await cr($),x;g.sections.length===1?x=g.sections[0]:x=await Xe(g.sections),u=await fe(x.items)}or(u,c),R.outro("\uC644\uB8CC\uD588\uC5B4\uC694.");let A=Date.now()-n;try{await N.track(process.cwd(),{event:"docs",properties:{query:i.query??null,item_id:u.id,has_snippet:!!(u.snippets&&u.snippets.length>0),duration_ms:A}})}catch(g){o&&console.error("[Telemetry] docs tracking failed:",g)}}catch(s){F(s)&&(R.outro(p(s.message)),process.exit(0)),V(s,{defaultMessage:"\uBB38\uC11C \uC870\uD68C\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694.",defaultHint:"`--verbose` \uC635\uC158\uC73C\uB85C \uC0C1\uC138 \uC624\uB958\uB97C \uD655\uC778\uD574\uBCF4\uC138\uC694.",verbose:o}),process.exit(1)}})};import*as O from"@clack/prompts";import{z as Ce}from"zod";import pr from"dedent";var lr=Ce.object({cwd:Ce.string(),yes:Ce.boolean().optional(),default:Ce.boolean().optional()}),Ze=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.").option("--default","Deprecated. --yes\uC640 \uB3D9\uC77C\uD558\uAC8C \uAE30\uBCF8\uAC12\uC73C\uB85C \uC0DD\uC131\uD569\uB2C8\uB2E4.").action(async t=>{let r=Date.now(),n=z(t);O.intro("seed-design.json \uD30C\uC77C \uC0DD\uC131");try{let o=lr.safeParse(t);if(!o.success)throw o.error;let s=o.data,i=s.yes||s.default,c=i?{...K,framework:$e(s.cwd)}:await Re(s.cwd),{start:a,stop:w}=O.spinner();a("seed-design.json \uD30C\uC77C \uC0DD\uC131\uC911...");let C=await(async()=>{try{return(await ge({cwd:s.cwd,config:c})).relativePath}catch(u){throw w("seed-design.json \uD30C\uC77C \uC0DD\uC131\uC774 \uC911\uB2E8\uB410\uC5B4\uC694."),u}})();w(`seed-design.json \uD30C\uC77C\uC774 ${p(C)}\uC5D0 \uC0DD\uC131\uB410\uC5B4\uC694.`),O.log.info(p("seed-design add {component} \uBA85\uB839\uC5B4\uB85C \uCEF4\uD3EC\uB10C\uD2B8\uB97C \uCD94\uAC00\uD574\uBCF4\uC138\uC694!")),O.log.info(p("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.")),O.note(pr(`SEED Design CLI\uB294 \uAC1C\uC120\uC744 \uC704\uD574 \uC775\uBA85 \uC0AC\uC6A9 \uB370\uC774\uD130\uB97C \uC218\uC9D1\uD574\uC694.
|
|
12
12
|
|
|
13
13
|
\uBE44\uD65C\uC131\uD654\uD558\uB824\uBA74:
|
|
14
|
-
\u2022 seed-design.json\uC5D0\uC11C ${
|
|
15
|
-
\u2022 ${
|
|
14
|
+
\u2022 seed-design.json\uC5D0\uC11C ${p('"telemetry": false')}\uB85C \uC124\uC815
|
|
15
|
+
\u2022 ${p("DISABLE_TELEMETRY=true")} \uD658\uACBD \uBCC0\uC218 \uC124\uC815
|
|
16
16
|
|
|
17
|
-
\uC790\uC138\uD55C \uB0B4\uC6A9: https://seed-design.com/react/getting-started/cli/configuration#telemetry`),"Telemetry \uC548\uB0B4"),
|
|
17
|
+
\uC790\uC138\uD55C \uB0B4\uC6A9: https://seed-design.com/react/getting-started/cli/configuration#telemetry`),"Telemetry \uC548\uB0B4"),O.outro("\uC791\uC5C5\uC774 \uC644\uB8CC\uB410\uC5B4\uC694.");let $=Date.now()-r;try{await N.track(s.cwd,{event:"init",properties:{tsx:c.tsx,rsc:c.rsc,telemetry:c.telemetry,yes_option:i,duration_ms:$}})}catch(u){n&&console.error("[Telemetry] init tracking failed:",u)}}catch(o){F(o)&&(O.outro(p(o.message)),process.exit(0)),V(o,{defaultMessage:"seed-design.json \uD30C\uC77C \uC0DD\uC131\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694.",defaultHint:"`--verbose` \uC635\uC158\uC73C\uB85C \uC0C1\uC138 \uC624\uB958\uB97C \uD655\uC778\uD574\uBCF4\uC138\uC694.",verbose:n}),process.exit(1)}})};import{cac as mr}from"cac";var dr="seed-design",X=mr(dr);async function fr(){let e=Q();X.option("--verbose","\uC624\uB958 \uC0C1\uC138 \uC815\uBCF4\uB97C \uCD9C\uB825\uD569\uB2C8\uB2E4."),Ge(X),He(X),We(X),Qe(X),Ze(X),X.version(e.version||"1.0.0","-v, --version"),X.help(),X.parse()}fr();
|
package/package.json
CHANGED
package/src/commands/add-all.ts
CHANGED
|
@@ -30,6 +30,7 @@ const addAllOptionsSchema = z.object({
|
|
|
30
30
|
includeDeprecated: z.boolean().optional(),
|
|
31
31
|
cwd: z.string(),
|
|
32
32
|
baseUrl: z.string().optional(),
|
|
33
|
+
framework: z.enum(["react", "lynx"]).optional(),
|
|
33
34
|
onDiff: z.enum(["overwrite", "backup"]).optional(),
|
|
34
35
|
});
|
|
35
36
|
|
|
@@ -50,6 +51,7 @@ export const addAllCommand = (cli: CAC) => {
|
|
|
50
51
|
"the base url of the registry. defaults to the current directory.",
|
|
51
52
|
{ default: BASE_URL },
|
|
52
53
|
)
|
|
54
|
+
.option("-f, --framework <framework>", "프레임워크 (react 또는 lynx)")
|
|
53
55
|
.option("--on-diff <mode>", "Action when file differs: overwrite or backup")
|
|
54
56
|
.example("seed-design add-all ui --include-deprecated")
|
|
55
57
|
.example("seed-design add-all ui lib breeze")
|
|
@@ -69,6 +71,7 @@ export const addAllCommand = (cli: CAC) => {
|
|
|
69
71
|
const cwd = options.cwd;
|
|
70
72
|
const baseUrl = options.baseUrl;
|
|
71
73
|
const config = await getConfig(cwd);
|
|
74
|
+
const framework = options.framework ?? config.framework;
|
|
72
75
|
const rootPath = path.resolve(cwd, config.path);
|
|
73
76
|
|
|
74
77
|
const { start, stop } = p.spinner();
|
|
@@ -77,8 +80,8 @@ export const addAllCommand = (cli: CAC) => {
|
|
|
77
80
|
const publicRegistries = await (async () => {
|
|
78
81
|
try {
|
|
79
82
|
const registries = await Promise.all(
|
|
80
|
-
(await fetchAvailableRegistries({ baseUrl })).map(async ({ id }) =>
|
|
81
|
-
fetchRegistry({ baseUrl, registryId: id }),
|
|
83
|
+
(await fetchAvailableRegistries({ baseUrl, framework })).map(async ({ id }) =>
|
|
84
|
+
fetchRegistry({ baseUrl, framework, registryId: id }),
|
|
82
85
|
),
|
|
83
86
|
);
|
|
84
87
|
stop("Registry를 가져왔어요.");
|
|
@@ -186,12 +189,14 @@ export const addAllCommand = (cli: CAC) => {
|
|
|
186
189
|
itemKeys: registryItemsToAdd.flatMap(({ registryId, items }) =>
|
|
187
190
|
items.map((item) => `${registryId}:${item.id}`),
|
|
188
191
|
),
|
|
189
|
-
projectPackageVersions: getProjectSeedPackageVersionSpecs(options.cwd),
|
|
192
|
+
projectPackageVersions: getProjectSeedPackageVersionSpecs(options.cwd, framework),
|
|
193
|
+
framework,
|
|
190
194
|
});
|
|
191
195
|
|
|
192
196
|
logCompatibilityReport({
|
|
193
197
|
report: compatibilityReport,
|
|
194
198
|
title: "현재 프로젝트 버전과 호환되지 않을 수 있는 스니펫이 있어요.",
|
|
199
|
+
framework,
|
|
195
200
|
});
|
|
196
201
|
|
|
197
202
|
await writeRegistryItemSnippets({
|
|
@@ -199,6 +204,7 @@ export const addAllCommand = (cli: CAC) => {
|
|
|
199
204
|
rootPath,
|
|
200
205
|
cwd,
|
|
201
206
|
baseUrl,
|
|
207
|
+
framework,
|
|
202
208
|
config,
|
|
203
209
|
onDiff: options.onDiff,
|
|
204
210
|
});
|
package/src/commands/add.ts
CHANGED
|
@@ -32,6 +32,7 @@ const addOptionsSchema = z.object({
|
|
|
32
32
|
all: z.boolean(),
|
|
33
33
|
cwd: z.string(),
|
|
34
34
|
baseUrl: z.string().optional(),
|
|
35
|
+
framework: z.enum(["react", "lynx"]).optional(),
|
|
35
36
|
onDiff: z.enum(["overwrite", "backup"]).optional(),
|
|
36
37
|
});
|
|
37
38
|
|
|
@@ -49,6 +50,7 @@ export const addCommand = (cli: CAC) => {
|
|
|
49
50
|
"the base url of the registry. defaults to the current directory.",
|
|
50
51
|
{ default: BASE_URL },
|
|
51
52
|
)
|
|
53
|
+
.option("-f, --framework <framework>", "프레임워크 (react 또는 lynx)")
|
|
52
54
|
.option("--on-diff <mode>", "Action when file differs: overwrite or backup")
|
|
53
55
|
.example("seed-design add ui:action-button")
|
|
54
56
|
.example("seed-design add ui:alert-dialog")
|
|
@@ -77,6 +79,7 @@ export const addCommand = (cli: CAC) => {
|
|
|
77
79
|
const cwd = options.cwd;
|
|
78
80
|
const baseUrl = options.baseUrl;
|
|
79
81
|
const config = await getConfig(cwd);
|
|
82
|
+
const framework = options.framework ?? config.framework;
|
|
80
83
|
const rootPath = path.resolve(cwd, config.path);
|
|
81
84
|
|
|
82
85
|
const { start, stop } = p.spinner();
|
|
@@ -85,8 +88,8 @@ export const addCommand = (cli: CAC) => {
|
|
|
85
88
|
const publicRegistries = await (async () => {
|
|
86
89
|
try {
|
|
87
90
|
const registries = await Promise.all(
|
|
88
|
-
(await fetchAvailableRegistries({ baseUrl })).map(async ({ id }) =>
|
|
89
|
-
fetchRegistry({ baseUrl, registryId: id }),
|
|
91
|
+
(await fetchAvailableRegistries({ baseUrl, framework })).map(async ({ id }) =>
|
|
92
|
+
fetchRegistry({ baseUrl, framework, registryId: id }),
|
|
90
93
|
),
|
|
91
94
|
);
|
|
92
95
|
stop("Registry를 가져왔어요.");
|
|
@@ -193,12 +196,14 @@ export const addCommand = (cli: CAC) => {
|
|
|
193
196
|
itemKeys: registryItemsToAdd.flatMap(({ registryId, items }) =>
|
|
194
197
|
items.map((item) => `${registryId}:${item.id}`),
|
|
195
198
|
),
|
|
196
|
-
projectPackageVersions: getProjectSeedPackageVersionSpecs(options.cwd),
|
|
199
|
+
projectPackageVersions: getProjectSeedPackageVersionSpecs(options.cwd, framework),
|
|
200
|
+
framework,
|
|
197
201
|
});
|
|
198
202
|
|
|
199
203
|
logCompatibilityReport({
|
|
200
204
|
report: compatibilityReport,
|
|
201
205
|
title: "현재 프로젝트 버전과 호환되지 않을 수 있는 스니펫이 있어요.",
|
|
206
|
+
framework,
|
|
202
207
|
});
|
|
203
208
|
|
|
204
209
|
p.log.info(
|
|
@@ -212,6 +217,7 @@ export const addCommand = (cli: CAC) => {
|
|
|
212
217
|
rootPath,
|
|
213
218
|
cwd,
|
|
214
219
|
baseUrl,
|
|
220
|
+
framework,
|
|
215
221
|
config,
|
|
216
222
|
onDiff: options.onDiff,
|
|
217
223
|
});
|
package/src/commands/compat.ts
CHANGED
|
@@ -11,6 +11,7 @@ import { highlight } from "../utils/color";
|
|
|
11
11
|
import {
|
|
12
12
|
analyzeRegistryItemCompatibility,
|
|
13
13
|
findInstalledSnippetItemKeys,
|
|
14
|
+
getCompatPackageNames,
|
|
14
15
|
getProjectSeedPackageVersionSpecs,
|
|
15
16
|
logCompatibilityReport,
|
|
16
17
|
} from "../utils/compatibility";
|
|
@@ -23,6 +24,7 @@ const compatOptionsSchema = z.object({
|
|
|
23
24
|
registry: z.string().optional(),
|
|
24
25
|
cwd: z.string(),
|
|
25
26
|
baseUrl: z.string().optional(),
|
|
27
|
+
framework: z.enum(["react", "lynx"]).optional(),
|
|
26
28
|
});
|
|
27
29
|
|
|
28
30
|
function parseTargetInputs({
|
|
@@ -116,6 +118,7 @@ export const compatCommand = (cli: CAC) => {
|
|
|
116
118
|
"the base url of the registry. defaults to the current directory.",
|
|
117
119
|
{ default: BASE_URL },
|
|
118
120
|
)
|
|
121
|
+
.option("-f, --framework <framework>", "프레임워크 (react 또는 lynx)")
|
|
119
122
|
.example("seed-design compat")
|
|
120
123
|
.example("seed-design compat -c action-button")
|
|
121
124
|
.example("seed-design compat ui:action-button ui:alert-dialog")
|
|
@@ -132,14 +135,17 @@ export const compatCommand = (cli: CAC) => {
|
|
|
132
135
|
}
|
|
133
136
|
|
|
134
137
|
const { data: options } = parsed;
|
|
138
|
+
const rawConfig = await getRawConfig(options.cwd);
|
|
139
|
+
const framework = options.framework ?? rawConfig?.framework ?? "react";
|
|
135
140
|
const { start, stop } = p.spinner();
|
|
136
141
|
|
|
137
142
|
start("Registry를 가져오고 있어요...");
|
|
138
143
|
const publicRegistries = await (async () => {
|
|
139
144
|
try {
|
|
140
145
|
const registries = await Promise.all(
|
|
141
|
-
(await fetchAvailableRegistries({ baseUrl: options.baseUrl })).map(
|
|
142
|
-
|
|
146
|
+
(await fetchAvailableRegistries({ baseUrl: options.baseUrl, framework })).map(
|
|
147
|
+
async ({ id }) =>
|
|
148
|
+
fetchRegistry({ baseUrl: options.baseUrl, framework, registryId: id }),
|
|
143
149
|
),
|
|
144
150
|
);
|
|
145
151
|
stop("Registry를 가져왔어요.");
|
|
@@ -206,17 +212,19 @@ export const compatCommand = (cli: CAC) => {
|
|
|
206
212
|
process.exit(0);
|
|
207
213
|
}
|
|
208
214
|
|
|
209
|
-
const projectPackageVersions = getProjectSeedPackageVersionSpecs(options.cwd);
|
|
215
|
+
const projectPackageVersions = getProjectSeedPackageVersionSpecs(options.cwd, framework);
|
|
210
216
|
const compatibilityReport = analyzeRegistryItemCompatibility({
|
|
211
217
|
publicRegistries,
|
|
212
218
|
itemKeys: resolvedTargetItemKeys,
|
|
213
219
|
projectPackageVersions,
|
|
220
|
+
framework,
|
|
214
221
|
});
|
|
215
222
|
|
|
216
223
|
p.log.info(`검사 대상: ${highlight(compatibilityReport.checkedItemKeys.join(", "))}`);
|
|
217
224
|
|
|
218
225
|
if (!compatibilityReport.issues.length) {
|
|
219
|
-
|
|
226
|
+
const compatPkgNames = getCompatPackageNames(framework);
|
|
227
|
+
p.outro(`모든 스니펫이 현재 ${compatPkgNames.join(", ")}와 호환돼요.`);
|
|
220
228
|
|
|
221
229
|
try {
|
|
222
230
|
await analytics.track(options.cwd, {
|
|
@@ -239,10 +247,10 @@ export const compatCommand = (cli: CAC) => {
|
|
|
239
247
|
logCompatibilityReport({
|
|
240
248
|
report: compatibilityReport,
|
|
241
249
|
title: "현재 프로젝트 버전과 호환되지 않는 스니펫을 찾았어요.",
|
|
250
|
+
framework,
|
|
242
251
|
});
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
);
|
|
252
|
+
const compatPkgList = getCompatPackageNames(framework);
|
|
253
|
+
p.log.info(`필요한 버전으로 ${compatPkgList.join(" 또는 ")}를 맞춘 뒤 다시 실행해보세요.`);
|
|
246
254
|
p.outro("호환성 이슈가 있어요.");
|
|
247
255
|
|
|
248
256
|
try {
|
package/src/commands/init.ts
CHANGED
|
@@ -3,7 +3,12 @@ import { z } from "zod";
|
|
|
3
3
|
import { analytics } from "../utils/analytics";
|
|
4
4
|
import { highlight } from "../utils/color";
|
|
5
5
|
import { handleCliError, isCliCancelError, isVerboseMode } from "../utils/error";
|
|
6
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
DEFAULT_INIT_CONFIG,
|
|
8
|
+
detectFramework,
|
|
9
|
+
promptInitConfig,
|
|
10
|
+
writeInitConfigFile,
|
|
11
|
+
} from "../utils/init-config";
|
|
7
12
|
|
|
8
13
|
import type { Config } from "@/src/utils/get-config";
|
|
9
14
|
|
|
@@ -37,7 +42,9 @@ export const initCommand = (cli: CAC) => {
|
|
|
37
42
|
|
|
38
43
|
const options = parsed.data;
|
|
39
44
|
const isDefaultMode = options.yes || options.default;
|
|
40
|
-
const config: Config = isDefaultMode
|
|
45
|
+
const config: Config = isDefaultMode
|
|
46
|
+
? { ...DEFAULT_INIT_CONFIG, framework: detectFramework(options.cwd) }
|
|
47
|
+
: await promptInitConfig(options.cwd);
|
|
41
48
|
|
|
42
49
|
const { start, stop } = p.spinner();
|
|
43
50
|
start("seed-design.json 파일 생성중...");
|
|
@@ -6,8 +6,19 @@ import path from "path";
|
|
|
6
6
|
import { intersects, satisfies, valid, validRange } from "semver";
|
|
7
7
|
import { highlight } from "./color";
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
const REACT_COMPAT_PACKAGES = ["@seed-design/react", "@seed-design/css"] as const;
|
|
10
|
+
const LYNX_COMPAT_PACKAGES = ["@seed-design/lynx-react", "@seed-design/lynx-css"] as const;
|
|
11
|
+
|
|
12
|
+
/** @deprecated Use getCompatPackageNames(framework) instead */
|
|
13
|
+
export const COMPAT_PACKAGE_NAMES = REACT_COMPAT_PACKAGES;
|
|
14
|
+
|
|
15
|
+
export type CompatPackageName =
|
|
16
|
+
| (typeof REACT_COMPAT_PACKAGES)[number]
|
|
17
|
+
| (typeof LYNX_COMPAT_PACKAGES)[number];
|
|
18
|
+
|
|
19
|
+
export function getCompatPackageNames(framework: string): readonly CompatPackageName[] {
|
|
20
|
+
return framework === "lynx" ? LYNX_COMPAT_PACKAGES : REACT_COMPAT_PACKAGES;
|
|
21
|
+
}
|
|
11
22
|
|
|
12
23
|
const WORKSPACE_VERSION_PREFIX = "workspace:";
|
|
13
24
|
const NPM_ALIAS_PREFIX = "npm:";
|
|
@@ -28,6 +39,7 @@ export interface CompatibilityReport {
|
|
|
28
39
|
|
|
29
40
|
export function getProjectSeedPackageVersionSpecs(
|
|
30
41
|
cwd: string,
|
|
42
|
+
framework = "react",
|
|
31
43
|
): Partial<Record<CompatPackageName, string>> {
|
|
32
44
|
try {
|
|
33
45
|
const packageInfo = getPackageInfo(cwd);
|
|
@@ -38,8 +50,9 @@ export function getProjectSeedPackageVersionSpecs(
|
|
|
38
50
|
...packageInfo.optionalDependencies,
|
|
39
51
|
};
|
|
40
52
|
const result: Partial<Record<CompatPackageName, string>> = {};
|
|
53
|
+
const compatPackages = getCompatPackageNames(framework);
|
|
41
54
|
|
|
42
|
-
for (const packageName of
|
|
55
|
+
for (const packageName of compatPackages) {
|
|
43
56
|
const value = packageDeps[packageName];
|
|
44
57
|
if (typeof value === "string") {
|
|
45
58
|
result[packageName] = value;
|
|
@@ -56,10 +69,12 @@ export function analyzeRegistryItemCompatibility({
|
|
|
56
69
|
publicRegistries,
|
|
57
70
|
itemKeys,
|
|
58
71
|
projectPackageVersions,
|
|
72
|
+
framework = "react",
|
|
59
73
|
}: {
|
|
60
74
|
publicRegistries: PublicRegistry[];
|
|
61
75
|
itemKeys: string[];
|
|
62
76
|
projectPackageVersions: Partial<Record<CompatPackageName, string>>;
|
|
77
|
+
framework?: string;
|
|
63
78
|
}): CompatibilityReport {
|
|
64
79
|
const checkedItemKeys = Array.from(new Set(itemKeys));
|
|
65
80
|
const itemMap = new Map<string, PublicRegistry["items"][number]>(
|
|
@@ -69,14 +84,15 @@ export function analyzeRegistryItemCompatibility({
|
|
|
69
84
|
);
|
|
70
85
|
|
|
71
86
|
const issues: CompatibilityIssue[] = [];
|
|
87
|
+
const compatPackages = getCompatPackageNames(framework);
|
|
72
88
|
|
|
73
89
|
for (const itemKey of checkedItemKeys) {
|
|
74
90
|
const item = itemMap.get(itemKey);
|
|
75
91
|
if (!item) continue;
|
|
76
92
|
|
|
77
|
-
const requiredRangesByPackage = collectRequiredRangesByPackage(item);
|
|
93
|
+
const requiredRangesByPackage = collectRequiredRangesByPackage(item, framework);
|
|
78
94
|
|
|
79
|
-
for (const packageName of
|
|
95
|
+
for (const packageName of compatPackages) {
|
|
80
96
|
const requiredRanges = Array.from(requiredRangesByPackage[packageName] ?? []);
|
|
81
97
|
|
|
82
98
|
if (!requiredRanges.length) continue;
|
|
@@ -135,15 +151,19 @@ export function analyzeRegistryItemCompatibility({
|
|
|
135
151
|
export function logCompatibilityReport({
|
|
136
152
|
report,
|
|
137
153
|
title,
|
|
154
|
+
framework = "react",
|
|
138
155
|
}: {
|
|
139
156
|
report: CompatibilityReport;
|
|
140
157
|
title: string;
|
|
158
|
+
framework?: string;
|
|
141
159
|
}) {
|
|
142
160
|
if (!report.issues.length) return;
|
|
143
161
|
|
|
162
|
+
const compatPackages = getCompatPackageNames(framework);
|
|
163
|
+
|
|
144
164
|
p.log.warn(title);
|
|
145
165
|
p.log.info(
|
|
146
|
-
`현재 프로젝트 버전: ${
|
|
166
|
+
`현재 프로젝트 버전: ${compatPackages.map((packageName) => `${packageName}@${highlight(report.projectPackageVersions[packageName] ?? "미설치")}`).join(", ")}`,
|
|
147
167
|
);
|
|
148
168
|
|
|
149
169
|
const issuesByItem = new Map<string, CompatibilityIssue[]>();
|
|
@@ -207,14 +227,18 @@ export function findInstalledSnippetItemKeys({
|
|
|
207
227
|
return installedItemKeys;
|
|
208
228
|
}
|
|
209
229
|
|
|
210
|
-
function collectRequiredRangesByPackage(
|
|
230
|
+
function collectRequiredRangesByPackage(
|
|
231
|
+
item: PublicRegistry["items"][number],
|
|
232
|
+
framework = "react",
|
|
233
|
+
) {
|
|
234
|
+
const compatPackages = getCompatPackageNames(framework);
|
|
211
235
|
const requiredRangesByPackage = Object.fromEntries(
|
|
212
|
-
|
|
236
|
+
compatPackages.map((packageName) => [packageName, new Set<string>()]),
|
|
213
237
|
) as Record<CompatPackageName, Set<string>>;
|
|
214
238
|
|
|
215
239
|
for (const snippet of item.snippets) {
|
|
216
240
|
for (const [packageName, requiredRange] of Object.entries(snippet.dependencies ?? {})) {
|
|
217
|
-
if (!isCompatPackageName(packageName)) continue;
|
|
241
|
+
if (!isCompatPackageName(packageName, framework)) continue;
|
|
218
242
|
requiredRangesByPackage[packageName].add(requiredRange);
|
|
219
243
|
}
|
|
220
244
|
}
|
|
@@ -286,6 +310,9 @@ function getSnippetPathCandidates(originalPath: string): string[] {
|
|
|
286
310
|
return Array.from(candidates);
|
|
287
311
|
}
|
|
288
312
|
|
|
289
|
-
function isCompatPackageName(
|
|
290
|
-
|
|
313
|
+
function isCompatPackageName(
|
|
314
|
+
packageName: string,
|
|
315
|
+
framework = "react",
|
|
316
|
+
): packageName is CompatPackageName {
|
|
317
|
+
return (getCompatPackageNames(framework) as readonly string[]).includes(packageName);
|
|
291
318
|
}
|
package/src/utils/fetch.ts
CHANGED
|
@@ -33,11 +33,12 @@ export async function fetchDocsIndex({ baseUrl }: { baseUrl: string }): Promise<
|
|
|
33
33
|
|
|
34
34
|
export async function fetchAvailableRegistries({
|
|
35
35
|
baseUrl,
|
|
36
|
+
framework,
|
|
36
37
|
}: {
|
|
37
38
|
baseUrl: string;
|
|
39
|
+
framework: string;
|
|
38
40
|
}): Promise<PublicAvailableRegistries> {
|
|
39
|
-
|
|
40
|
-
const response = await fetch(`${baseUrl}/__registry__/index.json`);
|
|
41
|
+
const response = await fetch(`${baseUrl}/__registry__/${framework}/index.json`);
|
|
41
42
|
|
|
42
43
|
if (!response.ok)
|
|
43
44
|
throw new Error(`Failed to fetch registries: ${response.status} ${response.statusText}`);
|
|
@@ -56,12 +57,14 @@ export async function fetchAvailableRegistries({
|
|
|
56
57
|
|
|
57
58
|
export async function fetchRegistry({
|
|
58
59
|
baseUrl,
|
|
60
|
+
framework,
|
|
59
61
|
registryId,
|
|
60
62
|
}: {
|
|
61
63
|
baseUrl: string;
|
|
64
|
+
framework: string;
|
|
62
65
|
registryId: PublicRegistry["id"];
|
|
63
66
|
}): Promise<PublicRegistry> {
|
|
64
|
-
const response = await fetch(`${baseUrl}/__registry__/${registryId}/index.json`);
|
|
67
|
+
const response = await fetch(`${baseUrl}/__registry__/${framework}/${registryId}/index.json`);
|
|
65
68
|
|
|
66
69
|
if (!response.ok)
|
|
67
70
|
throw new Error(
|
|
@@ -78,14 +81,18 @@ export async function fetchRegistry({
|
|
|
78
81
|
|
|
79
82
|
async function fetchRegistryItem({
|
|
80
83
|
baseUrl,
|
|
84
|
+
framework,
|
|
81
85
|
registryId,
|
|
82
86
|
registryItemId,
|
|
83
87
|
}: {
|
|
84
88
|
baseUrl: string;
|
|
89
|
+
framework: string;
|
|
85
90
|
registryId: PublicRegistry["id"];
|
|
86
91
|
registryItemId: PublicRegistryItem["id"];
|
|
87
92
|
}): Promise<PublicRegistryItem> {
|
|
88
|
-
const response = await fetch(
|
|
93
|
+
const response = await fetch(
|
|
94
|
+
`${baseUrl}/__registry__/${framework}/${registryId}/${registryItemId}.json`,
|
|
95
|
+
);
|
|
89
96
|
|
|
90
97
|
if (!response.ok) {
|
|
91
98
|
throw new Error(`Failed to fetch ${registryItemId}: ${response.status} ${response.statusText}`);
|
|
@@ -103,20 +110,24 @@ async function fetchRegistryItem({
|
|
|
103
110
|
|
|
104
111
|
export async function fetchRegistryItems({
|
|
105
112
|
baseUrl,
|
|
113
|
+
framework,
|
|
106
114
|
registryId,
|
|
107
115
|
registryItemIds,
|
|
108
116
|
}: {
|
|
109
117
|
baseUrl: string;
|
|
118
|
+
framework: string;
|
|
110
119
|
registryId: PublicRegistry["id"];
|
|
111
120
|
registryItemIds: PublicRegistryItem["id"][];
|
|
112
121
|
}): Promise<PublicRegistryItem[]> {
|
|
113
122
|
return await Promise.all(
|
|
114
123
|
registryItemIds.map(async (itemId) => {
|
|
115
124
|
try {
|
|
116
|
-
return await fetchRegistryItem({ baseUrl, registryId, registryItemId: itemId });
|
|
125
|
+
return await fetchRegistryItem({ baseUrl, framework, registryId, registryItemId: itemId });
|
|
117
126
|
} catch (error) {
|
|
118
127
|
// show available registry items in the registry
|
|
119
|
-
const response = await fetch(
|
|
128
|
+
const response = await fetch(
|
|
129
|
+
`${baseUrl}/__registry__/${framework}/${registryId}/index.json`,
|
|
130
|
+
);
|
|
120
131
|
|
|
121
132
|
if (!response.ok)
|
|
122
133
|
throw new Error(
|
package/src/utils/get-config.ts
CHANGED
|
@@ -15,6 +15,7 @@ export const configSchema = z
|
|
|
15
15
|
$schema: z.string().optional(),
|
|
16
16
|
rsc: z.coerce.boolean().default(false),
|
|
17
17
|
tsx: z.coerce.boolean().default(true),
|
|
18
|
+
framework: z.enum(["react", "lynx"]).default("react"),
|
|
18
19
|
path: z.string(),
|
|
19
20
|
telemetry: z.coerce.boolean().optional().default(true),
|
|
20
21
|
})
|
package/src/utils/init-config.ts
CHANGED
|
@@ -3,17 +3,36 @@ import fs from "fs-extra";
|
|
|
3
3
|
import path from "path";
|
|
4
4
|
import { highlight } from "./color";
|
|
5
5
|
import { CliCancelError } from "./error";
|
|
6
|
+
import { getPackageInfo } from "./get-package-info";
|
|
6
7
|
|
|
7
8
|
import type { Config } from "./get-config";
|
|
8
9
|
|
|
9
10
|
export const DEFAULT_INIT_CONFIG: Config = {
|
|
10
11
|
rsc: false,
|
|
11
12
|
tsx: true,
|
|
13
|
+
framework: "react",
|
|
12
14
|
path: "./seed-design",
|
|
13
15
|
telemetry: true,
|
|
14
16
|
};
|
|
15
17
|
|
|
16
|
-
export
|
|
18
|
+
export function detectFramework(cwd: string): "react" | "lynx" {
|
|
19
|
+
try {
|
|
20
|
+
const pkg = getPackageInfo(cwd);
|
|
21
|
+
const allDeps = {
|
|
22
|
+
...pkg.dependencies,
|
|
23
|
+
...pkg.devDependencies,
|
|
24
|
+
...pkg.peerDependencies,
|
|
25
|
+
};
|
|
26
|
+
if ("@lynx-js/react" in allDeps || "@seed-design/lynx-react" in allDeps) {
|
|
27
|
+
return "lynx";
|
|
28
|
+
}
|
|
29
|
+
} catch {}
|
|
30
|
+
return "react";
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export async function promptInitConfig(cwd: string): Promise<Config> {
|
|
34
|
+
const detectedFramework = detectFramework(cwd);
|
|
35
|
+
|
|
17
36
|
const group = await p.group(
|
|
18
37
|
{
|
|
19
38
|
tsx: () =>
|
|
@@ -26,6 +45,15 @@ export async function promptInitConfig(): Promise<Config> {
|
|
|
26
45
|
message: `${highlight("React Server Components")}를 사용중이신가요?`,
|
|
27
46
|
initialValue: DEFAULT_INIT_CONFIG.rsc,
|
|
28
47
|
}),
|
|
48
|
+
framework: () =>
|
|
49
|
+
p.select({
|
|
50
|
+
message: `어떤 ${highlight("프레임워크")}를 사용하시나요?`,
|
|
51
|
+
initialValue: detectedFramework,
|
|
52
|
+
options: [
|
|
53
|
+
{ value: "react" as const, label: "React" },
|
|
54
|
+
{ value: "lynx" as const, label: "Lynx" },
|
|
55
|
+
],
|
|
56
|
+
}),
|
|
29
57
|
path: () =>
|
|
30
58
|
p.text({
|
|
31
59
|
message: `${highlight("seed-design 폴더")} 경로를 입력해주세요. (기본값은 프로젝트 루트에 생성됩니다.)`,
|
package/src/utils/write.ts
CHANGED
|
@@ -14,6 +14,7 @@ export async function writeRegistryItemSnippets({
|
|
|
14
14
|
rootPath,
|
|
15
15
|
cwd,
|
|
16
16
|
baseUrl,
|
|
17
|
+
framework,
|
|
17
18
|
config,
|
|
18
19
|
onDiff,
|
|
19
20
|
}: {
|
|
@@ -21,6 +22,7 @@ export async function writeRegistryItemSnippets({
|
|
|
21
22
|
rootPath: string;
|
|
22
23
|
cwd: string;
|
|
23
24
|
baseUrl: string;
|
|
25
|
+
framework: string;
|
|
24
26
|
config: Config;
|
|
25
27
|
onDiff?: "overwrite" | "backup";
|
|
26
28
|
}) {
|
|
@@ -33,6 +35,7 @@ export async function writeRegistryItemSnippets({
|
|
|
33
35
|
|
|
34
36
|
const registryItems = await fetchRegistryItems({
|
|
35
37
|
baseUrl,
|
|
38
|
+
framework,
|
|
36
39
|
registryId,
|
|
37
40
|
registryItemIds: items.map((i) => i.id),
|
|
38
41
|
});
|