@seed-design/cli 1.4.0-alpha.0 → 1.4.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 +25 -12
- package/package.json +6 -4
- package/src/commands/add-all.ts +33 -4
- package/src/commands/add.ts +33 -4
- package/src/commands/compat.ts +53 -7
- package/src/commands/docs.ts +353 -79
- package/src/commands/init.ts +32 -3
- package/src/index.ts +1 -0
- package/src/tests/analytics.test.ts +95 -0
- package/src/tests/command-telemetry.test.ts +195 -0
- package/src/tests/docs-command.test.ts +150 -0
- package/src/types/shims.d.ts +11 -0
- package/src/utils/analytics.ts +65 -1
- package/src/utils/compatibility.ts +0 -3
- package/src/utils/fetch.ts +92 -0
- package/src/utils/install.ts +1 -1
- package/src/utils/resolve-dependencies.ts +2 -2
package/bin/index.mjs
CHANGED
|
@@ -1,17 +1,30 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import*as
|
|
3
|
-
[verbose] stack trace`)),
|
|
4
|
-
`,"utf-8"),{relativePath:
|
|
5
|
-
${
|
|
6
|
-
`)}`
|
|
7
|
-
${
|
|
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")}
|
|
2
|
+
import*as le from"@clack/prompts";import{cosmiconfig as $t}from"cosmiconfig";import{z as ce}from"zod";import*as Z from"@clack/prompts";import{ZodError as ft}from"zod";import dt from"picocolors";var l=e=>dt.cyan(e);var $=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}},D=class extends Error{constructor(t="\uC791\uC5C5\uC774 \uCDE8\uC18C\uB410\uC5B4\uC694."){super(t),this.name="CliCancelError"}};function G(e){return e instanceof D}function W(e){return!e||typeof e!="object"||!("verbose"in e)?!1:e.verbose===!0}function gt(e,t){if(e instanceof $)return{reason:e.message,hint:e.hint??t,details:e.details,stack:ut(e.cause??e)};if(e instanceof ft){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 ut(e){if(e instanceof Error)return e.stack}function Y(e,{defaultMessage:t,defaultHint:r,verbose:n=!1}){let o=gt(e,r);Z.log.error(t),Z.log.error(`\uC6D0\uC778: ${o.reason}`);for(let i of o.details)Z.log.info(i);o.hint&&Z.log.info(`\uD574\uACB0 \uD78C\uD2B8: ${o.hint}`),n&&o.stack&&(Z.log.message(l(`
|
|
3
|
+
[verbose] stack trace`)),Z.log.message(o.stack)),Z.outro(l("\uC791\uC5C5\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694."))}import*as Q from"@clack/prompts";import Ct from"fs-extra";import je from"path";import yt from"findup-sync";import ht from"fs-extra";var wt="package.json";function bt(e=process.cwd()){let t=yt(wt,{cwd:e});if(!t)throw new Error("No package.json file found in the project.");return t}function se(e=process.cwd()){let t=bt(e);return ht.readJSONSync(t)}var H={rsc:!1,tsx:!0,framework:"react",path:"./seed-design",telemetry:!0};function Ee(e){try{let t=se(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 Ae(e){let t=Ee(e);return await Q.group({tsx:()=>Q.confirm({message:`${l("TypeScript")}\uB97C \uC0AC\uC6A9\uC911\uC774\uC2E0\uAC00\uC694?`,initialValue:H.tsx}),rsc:()=>Q.confirm({message:`${l("React Server Components")}\uB97C \uC0AC\uC6A9\uC911\uC774\uC2E0\uAC00\uC694?`,initialValue:H.rsc}),framework:()=>Q.select({message:`\uC5B4\uB5A4 ${l("\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:`${l("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:H.path,defaultValue:H.path,placeholder:H.path}),telemetry:()=>Q.confirm({message:`\uAC1C\uC120\uC744 \uC704\uD574 ${l("\uC775\uBA85 \uC0AC\uC6A9 \uB370\uC774\uD130")}\uB97C \uC218\uC9D1\uD560\uAE4C\uC694?`,initialValue:H.telemetry})},{onCancel:()=>{throw new D}})}async function Ce({cwd:e,config:t}){let r=je.resolve(e,"seed-design.json");return await Ct.writeFile(r,`${JSON.stringify(t,null,2)}
|
|
4
|
+
`,"utf-8"),{relativePath:je.relative(process.cwd(),r),targetPath:r}}var De="seed-design",xt=$t(De,{searchPlaces:[`${De}.json`]}),Oe=ce.object({$schema:ce.string().optional(),rsc:ce.coerce.boolean().default(!1),tsx:ce.coerce.boolean().default(!0),framework:ce.enum(["react","lynx"]).default("react"),path:ce.string(),telemetry:ce.coerce.boolean().optional().default(!0)}).strict();async function $e(e){let t=await oe(e);if(t)return t;le.log.error("\uD504\uB85C\uC81D\uD2B8 \uB8E8\uD2B8 \uACBD\uB85C\uC5D0 `seed-design.json` \uD30C\uC77C\uC774 \uC5C6\uC5B4\uC694.");let r=await le.confirm({message:"seed-design.json \uD30C\uC77C\uC744 \uC0DD\uC131\uD558\uC2DC\uACA0\uC5B4\uC694?"});if(le.isCancel(r)||!r)throw new D;try{return await Ce({cwd:e,config:H}),le.log.message("seed-design.json \uD30C\uC77C\uC774 \uC0DD\uC131\uB410\uC5B4\uC694."),Oe.parse(H)}catch(n){throw new $({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 xt.search(e);if(!t||t.isEmpty)return null;try{return Oe.parse(t.config)}catch(r){throw new $({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 xe({selectedItemKeys:e,publicRegistries:t}){let r=[],n=new Set;function o(i,s){let a=r.find(c=>c.registryId===i);if(!a?.items.some(c=>c.id===s.id)){if(a?a.items.push(s):r.push({registryId:i,items:[s]}),s.dependencies?.length)for(let c of s.dependencies)n.add(c);if(s.innerDependencies?.length)for(let c of s.innerDependencies)for(let m of c.itemIds){let y=t.find(g=>g.id===c.registryId)?.items.find(g=>g.id===m);if(!y)throw new Error(`Cannot find dependency item: ${c.registryId}:${m}`);o(c.registryId,y)}}}for(let i of e){let[s,...a]=i.split(":"),c=a.join(":");if(!s||!c)throw new Error(`Invalid snippet format: "${i}"`);let m=t.find(y=>y.id===s)?.items.find(y=>y.id===c);if(!m)throw new Error(`Cannot find snippet: "${i}"`);o(s,m)}return{registryItemsToAdd:r,npmDependenciesToAdd:n}}import*as ve from"@clack/prompts";import{z as f}from"zod";var Re=f.object({id:f.string(),description:f.string().optional(),deprecated:f.boolean().optional(),hideFromCLICatalog:f.boolean().optional(),dependencies:f.array(f.string()).optional(),innerDependencies:f.array(f.object({registryId:f.string(),itemIds:f.array(f.string())})).optional(),snippets:f.array(f.object({path:f.string(),dependencies:f.record(f.string(),f.string()).optional(),content:f.string()}))}),Te=f.object({id:f.string(),hideFromCLICatalog:f.boolean().optional(),items:f.array(Re.omit({snippets:!0}).extend({snippets:f.array(f.object({path:f.string(),dependencies:f.record(f.string(),f.string()).optional()}))}))}),Me=f.array(f.object({id:f.string()})),It=f.object({label:f.string(),path:f.string()}),kt=f.object({id:f.string(),title:f.string(),description:f.string().optional(),docUrl:f.string(),deprecated:f.boolean().optional(),snippetKey:f.string().optional(),snippets:f.array(It).optional()}),Pt=f.object({id:f.string(),label:f.string(),items:f.array(kt)}),St=f.object({id:f.string(),label:f.string(),sections:f.array(Pt)}),Le=f.object({categories:f.array(St)});var Et=1e4;async function Fe(e,t=Et){let r=new AbortController,n=setTimeout(()=>r.abort(),t);try{return await fetch(e,{signal:r.signal})}catch(o){throw o instanceof Error&&o.name==="AbortError"?new $({message:`\uC694\uCCAD \uC2DC\uAC04\uC774 \uCD08\uACFC\uB418\uC5C8\uC5B4\uC694 (${t}ms): ${e}`,hint:"\uB124\uD2B8\uC6CC\uD06C \uC0C1\uD0DC\uB97C \uD655\uC778\uD558\uACE0 \uB2E4\uC2DC \uC2DC\uB3C4\uD574\uC8FC\uC138\uC694."}):o}finally{clearTimeout(n)}}async function _e({baseUrl:e}){let t=await fetch(`${e}/__docs__/index.json`);if(!t.ok)throw new $({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:i}=Le.safeParse(r);if(!n)throw new $({message:`\uBB38\uC11C \uBAA9\uB85D \uD30C\uC2F1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694: ${i?.message}`});return o}async function pe({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:i,error:s}=Me.safeParse(n);if(!o)throw new Error(`Failed to parse registries: ${s?.message}`);return i}async function de({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:i,data:s,error:a}=Te.safeParse(o);if(!i)throw new Error(`Failed to parse ${r} registry: ${a?.message}`);return s}async function Rt({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 i=await o.json(),{success:s,data:a,error:c}=Re.safeParse(i);if(!s)throw new Error(`Failed to parse ${n}: ${c?.message}`);return a}async function Ue({url:e}){let t=await Fe(e);if(!t.ok)throw new $({message:`llms.txt\uB97C \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694: ${t.status} ${t.statusText}`,hint:`${e} \uC5D0 \uC811\uADFC\uD560 \uC218 \uC788\uB294\uC9C0 \uD655\uC778\uD574\uC8FC\uC138\uC694.`});return t.text()}async function Ke({baseUrl:e,query:t}){let r=t.startsWith("/")?t.slice(1):t,n=[`${e}/llms/${r}.txt`,`${e}/llms/${r}/llms.txt`],o;for(let i of n){let s;try{s=await Fe(i)}catch(a){o=a;continue}if(s.ok)return s.text();if(s.status===404){o=new $({message:`llms.txt\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694: ${r}`,hint:`\uB2E4\uC74C \uACBD\uB85C\uB97C \uC2DC\uB3C4\uD588\uC5B4\uC694:
|
|
5
|
+
${n.map(a=>` - ${a}`).join(`
|
|
6
|
+
`)}`});continue}throw new $({message:`llms.txt \uC694\uCCAD\uC774 \uC2E4\uD328\uD588\uC5B4\uC694: ${s.status} ${s.statusText}`,hint:`URL: ${i}`})}throw o??new $({message:`llms.txt\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694: ${r}`,hint:`\uB2E4\uC74C \uACBD\uB85C\uB97C \uC2DC\uB3C4\uD588\uC5B4\uC694:
|
|
7
|
+
${n.map(i=>` - ${i}`).join(`
|
|
8
|
+
`)}`})}async function Ne({baseUrl:e,framework:t,registryId:r,registryItemIds:n}){return await Promise.all(n.map(async o=>{try{return await Rt({baseUrl:e,framework:t,registryId:r,registryItemId:o})}catch(i){let s=await fetch(`${e}/__registry__/${t}/${r}/index.json`);if(!s.ok)throw new Error(`${r} \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uB97C \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694: ${s.status} ${s.statusText}`);let a=await s.json(),{success:c,data:m}=Te.safeParse(a);throw c?(ve.log.error(`${o} \uC2A4\uB2C8\uD3AB\uC774 ${r} \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC5D0 \uC5C6\uC5B4\uC694.`),ve.log.info(`${r} \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC5D0 \uC874\uC7AC\uD558\uB294 \uC2A4\uB2C8\uD3AB:
|
|
9
|
+
${m.items.map(y=>y.id).join(`
|
|
10
|
+
`)}`),i):new Error(`Failed to parse registry index for ${r}`)}}))}import{promises as Dt}from"fs";import{tmpdir as Ot}from"os";import Be from"path";import{transformFromAstSync as Tt}from"@babel/core";import vt from"@babel/plugin-transform-typescript";import*as Ie from"recast";import{parse as _t}from"@babel/parser";var jt={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"]},ze=async({sourceFile:e,config:t})=>{let r=e.getFullText();if(t.tsx)return r;let n=Ie.parse(r,{parser:{parse:i=>_t(i,jt)}}),o=Tt(n,r,{cloneInputAst:!1,code:!1,ast:!0,plugins:[vt],configFile:!1});if(!o||!o.ast)throw new Error("Failed to transform JSX");return Ie.print(o.ast).code};import{SyntaxKind as At}from"ts-morph";var Ve=async({sourceFile:e,config:t})=>{if(t.rsc)return e;let r=e.getFirstChildByKind(At.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 i=r.getText(),s=r.getFullText();if(i.trim()===s.trim())return e;let c=s.replace(i,"").replace(/^\s*\n/,"").replace(/\n\s*$/,"");return r.replaceWithText(c),e};import{Project as Mt,ScriptKind as Lt}from"ts-morph";var Ft=[Ve],Ut=new Mt({compilerOptions:{}});async function Kt(e){let t=await Dt.mkdtemp(Be.join(Ot(),"seed-design-"));return Be.join(t,e)}async function qe(e){let t=await Kt(e.filename),r=Ut.createSourceFile(t,e.raw,{scriptKind:Lt.TSX});for(let n of Ft)n({sourceFile:r,...e});return await ze({sourceFile:r,...e})}import*as J from"@clack/prompts";import fe from"fs-extra";import X from"path";import{createPatch as Nt}from"diff";import zt from"@npmcli/disparity-colors";async function ke({registryItemsToAdd:e,rootPath:t,cwd:r,baseUrl:n,framework:o,config:i,onDiff:s}){let a=[];for(let{registryId:c,items:m}of e){let y=X.join(t,c);fe.ensureDirSync(y);let g=await Ne({baseUrl:n,framework:o,registryId:c,registryItemIds:m.map(u=>u.id)});for(let{id:u,snippets:k}of g){let I=await Promise.all(k.map(async E=>{let C=await qe({filename:E.path,config:i,raw:E.content}),h=X.join(y,E.path);return i.tsx||(h=h.replace(/\.tsx$/,".jsx"),h=h.replace(/\.ts$/,".js")),{filePath:h,content:C,relativePath:X.relative(r,h),name:`${c}:${u}`}})),S=[];for(let E of I){let{filePath:C,content:h,relativePath:w}=E;if(await fe.ensureDir(X.dirname(C)),fe.existsSync(C)){let b=await fe.readFile(C,"utf-8");if(b===h){J.log.info(`${l(w)}: \uC774\uBBF8 \uCD5C\uC2E0 \uC0C1\uD0DC\uC608\uC694.`);continue}let P=X.basename(C),U=X.extname(C),B=X.basename(C,U),R=Date.now(),q=`legacy-${B}-${R}${U}`,x=await(async()=>{if(s)return s;let p=Nt(w,b,h),d=zt(p);return J.log.message(`
|
|
11
|
+
${l(w)}: \uD604\uC7AC \uD30C\uC77C\uACFC \uBC1B\uC73C\uB824\uB294 \uD30C\uC77C\uC758 \uB0B4\uC6A9\uC774 \uB2EC\uB77C\uC694.
|
|
12
|
+
`),J.log.message(d),J.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 ${q}\uC73C\uB85C \uC62E\uAE30\uACE0 ${P} \uBC1B\uAE30`},{value:"skip",label:"\uC0C8 \uD30C\uC77C \uBC1B\uC9C0 \uC54A\uACE0 \uADF8\uB300\uB85C \uB450\uAE30"}]})})();if(J.isCancel(x)||x==="skip"){J.log.info(`${l(w)}: \uD30C\uC77C\uC744 \uBC1B\uC9C0 \uC54A\uACE0 \uAC74\uB108\uB6F0\uC5C8\uC5B4\uC694.`);continue}if(x==="backup"){let p=X.dirname(C),d=X.join(p,q);await fe.rename(C,d),J.log.info(`${l(w)}: \uAE30\uC874 \uD30C\uC77C\uC744 ${l(X.relative(r,d))}\uB85C \uC62E\uACBC\uC5B4\uC694.`)}}await fe.writeFile(C,h),S.push(E)}if(S.length>0){let E=S.map(({name:C,relativePath:h})=>({name:C,path:h}));a.push(...E),J.log.success(`${l(`${c}:${u}`)} \uAD00\uB828 \uC2A4\uB2C8\uD3AB \uB2E4\uC6B4\uB85C\uB4DC \uC644\uB8CC: ${l(E.map(C=>C.path).join(", "))}`)}}}}import*as j from"@clack/prompts";import mr from"path";import{z as ne}from"zod";var K="https://seed-design.io";import*as He from"@clack/prompts";import{execa as Bt}from"execa";import{detect as Vt}from"@antfu/ni";async function Ge(e){let t=await Vt({programmatic:!0,cwd:e});return t==="yarn@berry"?"yarn":t==="pnpm@6"?"pnpm":t==="bun"?"bun":t==="deno"?"deno":t??"npm"}async function Pe({cwd:e,deps:t,dev:r=!1}){let{start:n,stop:o}=He.spinner(),i=await Ge(e),a={...se(e).dependencies},c=new Set(t.filter(I=>!a[I])),m=new Set(t.filter(I=>a[I]));if(!c.size)return{installed:new Set,filtered:c};n("\uC758\uC874\uC131 \uC124\uCE58\uC911...");let u=[i==="npm"?"install":"add",r?"-D":null,...c].filter(I=>!!I),k=`${i} ${u.join(" ")}`;try{await Bt(i,u,{cwd:e})}catch(I){throw o("\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: ${k}`],cause:I})}return o("\uC758\uC874\uC131 \uC124\uCE58\uAC00 \uC644\uB8CC\uB410\uC5B4\uC694."),{installed:c,filtered:m}}import{randomUUID as qt}from"node:crypto";import*as We from"@clack/prompts";var Gt="seed_cli";async function Ht(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 Jt(){return qt()}var Wt=Jt(),Je=!1;function Ye(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}function Yt(e){return e instanceof Error&&e.name?e.name:typeof e=="object"&&e!==null?e.constructor?.name??"Object":typeof e}async function Qe(e,{event:t,properties:r={}}){if(!await Ht(e))return;let o=`${Gt}.${t}`;Je||(We.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)"),Je=!0);try{let i="https://us.i.posthog.com/capture",s={"Content-Type":"application/json"},a={api_key:"phc_seod8HhifElOP1R92KmvsQybrtUmkOTgZBsq0mfCelR",event:o,distinct_id:Wt,properties:{...r,$process_person_profile:!1},timestamp:new Date().toISOString()},c=new AbortController,m=setTimeout(()=>c.abort(),5e3);try{await fetch(i,{method:"POST",headers:s,body:JSON.stringify(a),signal:c.signal})}finally{clearTimeout(m)}}catch{}}async function Xe(e,{command:t,status:r,result:n,properties:o={}}){await Qe(e,{event:t,properties:Ye({status:r,result:n,...o})})}async function Qt(e,{command:t,error:r,result:n,properties:o={}}){await Xe(e,{command:t,status:"failed",result:n,properties:Ye({error_type:Yt(r),...o})})}var _={track:Qe,trackCommandFailure:Qt,trackCommandOutcome:Xe};import*as me from"@clack/prompts";import Xt from"fs-extra";import Zt from"path";import{intersects as er,satisfies as tr,valid as et,validRange as tt}from"semver";var rr=["@seed-design/react","@seed-design/css"],sr=["@seed-design/lynx-react","@seed-design/lynx-css"];function ie(e){return e==="lynx"?sr:rr}var Ze="workspace:",or="npm:";function ge(e,t="react"){try{let r=se(e),n={...r.dependencies,...r.devDependencies,...r.peerDependencies,...r.optionalDependencies},o={},i=ie(t);for(let s of i){let a=n[s];typeof a=="string"&&(o[s]=a)}return o}catch{return{}}}function ue({publicRegistries:e,itemKeys:t,projectPackageVersions:r,framework:n="react"}){let o=Array.from(new Set(t)),i=new Map(e.flatMap(c=>c.items.map(m=>[`${c.id}:${m.id}`,m]))),s=[],a=ie(n);for(let c of o){let m=i.get(c);if(!m)continue;let y=ir(m,n);for(let g of a){let u=Array.from(y[g]??[]);if(!u.length)continue;let k=r[g];if(!k){s.push({itemKey:c,packageName:g,requiredRanges:u,type:"missing-package"});continue}let I=nr(k);if(!I){s.push({itemKey:c,packageName:g,requiredRanges:u,installedVersionSpec:k,type:"invalid-version-spec"});continue}u.every(E=>ar({currentVersionSpec:I,requiredRange:E}))||s.push({itemKey:c,packageName:g,requiredRanges:u,installedVersionSpec:k,type:"incompatible-version"})}}return{checkedItemKeys:o,projectPackageVersions:r,issues:s}}function ye({report:e,title:t,framework:r="react"}){if(!e.issues.length)return;let n=ie(r);me.log.warn(t),me.log.info(`\uD604\uC7AC \uD504\uB85C\uC81D\uD2B8 \uBC84\uC804: ${n.map(i=>`${i}@${l(e.projectPackageVersions[i]??"\uBBF8\uC124\uCE58")}`).join(", ")}`);let o=new Map;for(let i of e.issues){let s=o.get(i.itemKey)??[];s.push(i),o.set(i.itemKey,s)}for(let[i,s]of o.entries()){me.log.warn(l(i));for(let a of s){let c=a.requiredRanges.join(" | ");if(a.type==="missing-package"){me.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"){me.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}me.log.info(` - ${a.packageName}: \uD604\uC7AC ${a.installedVersionSpec}, \uD544\uC694 \uBC94\uC704 ${c}`)}}}function rt({publicRegistries:e,rootPath:t}){let r=[];for(let n of e)for(let o of n.items)o.snippets.some(s=>cr(s.path).some(a=>Xt.existsSync(Zt.join(t,n.id,a))))&&r.push(`${n.id}:${o.id}`);return r}function ir(e,t="react"){let r=ie(t),n=Object.fromEntries(r.map(o=>[o,new Set]));for(let o of e.snippets)for(let[i,s]of Object.entries(o.dependencies??{}))lr(i,t)&&n[i].add(s);return n}function nr(e){let t=e.trim();if(t.startsWith(Ze)&&(t=t.slice(Ze.length).trim()),t.startsWith(or)){let r=t.split("@").at(-1);if(!r)return null;t=r}return!t||t==="*"?null:et(t)||tt(t)?t:null}function ar({currentVersionSpec:e,requiredRange:t}){let r=tt(t);return r?et(e)?tr(e,r,{includePrerelease:!0}):er(e,r,{includePrerelease:!0}):!1}function cr(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 lr(e,t="react"){return ie(t).includes(e)}var pr=ne.object({itemIds:ne.array(ne.string()).optional(),all:ne.boolean(),cwd:ne.string(),baseUrl:ne.string().default(K),framework:ne.enum(["react","lynx"]).optional(),onDiff:ne.enum(["overwrite","backup"]).optional()}),st=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:K}).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=W(r),i=typeof r?.cwd=="string"?r.cwd:process.cwd();j.intro("seed-design add");try{let s=pr.safeParse({itemIds:t,...r});if(!s.success)throw s.error;let{data:{all:a,...c}}=s;if(a)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,g=await $e(m),u=c.framework??g.framework,k=mr.resolve(m,g.path),{start:I,stop:S}=j.spinner();I("Registry\uB97C \uAC00\uC838\uC624\uACE0 \uC788\uC5B4\uC694...");let E=await(async()=>{try{let p=await Promise.all((await pe({baseUrl:y,framework:u})).map(async({id:d})=>de({baseUrl:y,framework:u,registryId:d})));return S("Registry\uB97C \uAC00\uC838\uC654\uC5B4\uC694."),p}catch(p){throw S("Registry\uB97C \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694."),p}})(),C=await(async()=>{if(c.itemIds?.length)return c.itemIds;let p=await j.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:E.filter(({hideFromCLICatalog:d})=>!d).flatMap(({id:d,items:T})=>T.filter(({hideFromCLICatalog:M})=>!M).sort((M,v)=>M.id.localeCompare(v.id)).map(({id:M,description:v,deprecated:L})=>({label:`${L?"(deprecated) ":""}${l(d)}:${M}`,value:`${d}:${M}`,hint:v,deprecated:L,registryItemCount:T.length}))).sort((d,T)=>d.deprecated!==T.deprecated?d.deprecated?1:-1:T.registryItemCount-d.registryItemCount)});if(j.isCancel(p))throw new D;return p})();if(!C?.length)throw new D("\uCD94\uAC00\uD560 \uD56D\uBAA9\uC774 \uC120\uD0DD\uB418\uC9C0 \uC54A\uC558\uC5B4\uC694.");j.log.message(`\uC120\uD0DD\uB41C \uD56D\uBAA9: ${l(C.join(", "))}`);let h=[];for(let p of C){let[d,...T]=p.split(":"),M=T.join(":");if(!d||!M)throw new $({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 v=E.find(L=>L.id===d)?.items.find(L=>L.id===M);if(!v)throw new $({message:`${l(p)}: \uD56D\uBAA9\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.`});if(v.deprecated){let L=await j.confirm({message:`${l(v.id)}: deprecated \uB418\uC5C8\uC5B4\uC694. \uCD94\uAC00\uD560\uAE4C\uC694?`,initialValue:!1});if(j.isCancel(L))throw new D;if(L===!1){j.log.info(`${l(v.id)}: \uCD94\uAC00\uD558\uC9C0 \uC54A\uC744\uAC8C\uC694.`);continue}}h.push(p)}let{registryItemsToAdd:w,npmDependenciesToAdd:b}=xe({selectedItemKeys:h,publicRegistries:E}),P=ue({publicRegistries:E,itemKeys:w.flatMap(({registryId:p,items:d})=>d.map(T=>`${p}:${T.id}`)),projectPackageVersions:ge(c.cwd,u),framework:u});ye({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.",framework:u}),j.log.info(`\uCD94\uAC00\uD560 \uD56D\uBAA9: ${l(w.map(p=>p.items.map(d=>`${p.registryId}:${d.id}`).join(", ")).join(", ")||"\uC5C6\uC74C")}
|
|
9
13
|
|
|
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
|
|
14
|
+
\uC124\uCE58\uD560 \uC758\uC874\uC131: ${l(Array.from(b).join(", ")||"\uC5C6\uC74C")}`),await ke({registryItemsToAdd:w,rootPath:k,cwd:m,baseUrl:y,framework:u,config:g,onDiff:c.onDiff});let{installed:U,filtered:B}=await Pe({cwd:m,deps:Array.from(b)});U.size===0&&j.log.message("\uBAA8\uB4E0 \uC758\uC874\uC131\uC774 \uC774\uBBF8 \uC124\uCE58\uB418\uC5B4 \uC788\uC5B4\uC694."),U.size&&(j.log.message(`\uC758\uC874\uC131 \uC124\uCE58 \uC644\uB8CC: ${l(Array.from(U).join(", "))}`),B.size&&j.log.message(`\uC124\uCE58\uD558\uC9C0 \uC54A\uC740 \uC758\uC874\uC131 (\uC774\uBBF8 \uC124\uCE58\uB428): ${l(Array.from(B).join(", "))}`)),j.outro("\uC644\uB8CC\uD588\uC5B4\uC694.");let R=Date.now()-n,q=new Set(w.map(p=>p.registryId)),x=C.some(p=>{let[d,...T]=p.split(":"),M=T.join(":");return E.find(v=>v.id===d)?.items.find(v=>v.id===M)?.deprecated});try{await _.trackCommandOutcome(c.cwd,{command:"add",status:"completed",properties:{items_count:h.length,registries:Array.from(q),has_deprecated:x,dependencies_count:b.size,duration_ms:R}})}catch(p){o&&console.error("[Telemetry] add \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",p)}}catch(s){if(G(s)){try{await _.trackCommandOutcome(i,{command:"add",status:"cancelled",properties:{duration_ms:Date.now()-n}})}catch(a){o&&console.error("[Telemetry] add \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",a)}j.outro(l(s.message)),process.exit(0)}try{await _.trackCommandFailure(i,{command:"add",error:s,properties:{duration_ms:Date.now()-n}})}catch(a){o&&console.error("[Telemetry] add \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",a)}Y(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 O from"@clack/prompts";import dr from"path";import{z as ee}from"zod";var fr=ee.object({registryIds:ee.array(ee.string()).optional(),all:ee.boolean(),includeDeprecated:ee.boolean().optional(),cwd:ee.string(),baseUrl:ee.string().default(K),framework:ee.enum(["react","lynx"]).optional(),onDiff:ee.enum(["overwrite","backup"]).optional()}),ot=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:K}).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=W(r),i=typeof r?.cwd=="string"?r.cwd:process.cwd();O.intro("seed-design add-all");try{let s=fr.safeParse({registryIds:t,...r});if(!s.success)throw s.error;let{data:a}=s,c=a.cwd,m=a.baseUrl,y=await $e(c),g=a.framework??y.framework,u=dr.resolve(c,y.path),{start:k,stop:I}=O.spinner();k("Registry\uB97C \uAC00\uC838\uC624\uACE0 \uC788\uC5B4\uC694...");let S=await(async()=>{try{let x=await Promise.all((await pe({baseUrl:m,framework:g})).map(async({id:p})=>de({baseUrl:m,framework:g,registryId:p})));return I("Registry\uB97C \uAC00\uC838\uC654\uC5B4\uC694."),x}catch(x){throw I("Registry\uB97C \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694."),x}})(),E=await(async()=>{if(a.all){let p=S.map(d=>d.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(a.registryIds?.length){let p=S.map(d=>d.id);for(let d of a.registryIds)if(!p.includes(d))throw new $({message:`\uB808\uC9C0\uC2A4\uD2B8\uB9AC '${d}'\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(a.registryIds.join(", "))}`),a.registryIds}let x=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:S.filter(({hideFromCLICatalog:p})=>!p).sort((p,d)=>d.items.length-p.items.length).map(p=>{let d=p.items[0]?.id,T=d?`${p.items.length}\uAC1C \uD56D\uBAA9 (${d} \uB4F1)`:`${p.items.length}\uAC1C \uD56D\uBAA9 (\uD56D\uBAA9 \uC5C6\uC74C)`;return{label:p.id,value:p.id,hint:T}})});if(O.isCancel(x))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(x.join(", "))}`),x})(),C=S.filter(x=>E.includes(x.id)),h=C.flatMap(x=>x.items.filter(p=>p.deprecated?a.includeDeprecated:!0).map(p=>`${x.id}:${p.id}`)),w=C.reduce((x,p)=>x+p.items.filter(d=>d.deprecated).length,0);if(!a.includeDeprecated&&w>0&&O.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.`),!h.length)throw new D("\uCD94\uAC00\uD560 \uD56D\uBAA9\uC774 \uC5C6\uC5B4\uC694.");O.log.message(`\uCD1D ${l(h.length.toString())}\uAC1C\uC758 \uD56D\uBAA9\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4.`);let{registryItemsToAdd:b,npmDependenciesToAdd:P}=xe({selectedItemKeys:h,publicRegistries:S}),U=ue({publicRegistries:S,itemKeys:b.flatMap(({registryId:x,items:p})=>p.map(d=>`${x}:${d.id}`)),projectPackageVersions:ge(a.cwd,g),framework:g});ye({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:g}),await ke({registryItemsToAdd:b,rootPath:u,cwd:c,baseUrl:m,framework:g,config:y,onDiff:a.onDiff});let{installed:B,filtered:R}=await Pe({cwd:c,deps:Array.from(P)});B.size===0&&O.log.message("\uBAA8\uB4E0 \uC758\uC874\uC131\uC774 \uC774\uBBF8 \uC124\uCE58\uB418\uC5B4 \uC788\uC5B4\uC694."),B.size&&(O.log.message(`\uC758\uC874\uC131 \uC124\uCE58 \uC644\uB8CC: ${l(Array.from(B).join(", "))}`),R.size&&O.log.message(`\uC124\uCE58\uD558\uC9C0 \uC54A\uC740 \uC758\uC874\uC131 (\uC774\uBBF8 \uC124\uCE58\uB428): ${l(Array.from(R).join(", "))}`)),O.outro("\uC644\uB8CC\uD588\uC5B4\uC694.");let q=Date.now()-n;try{await _.trackCommandOutcome(a.cwd,{command:"add-all",status:"completed",properties:{registries:E,items_count:h.length,include_deprecated:a.includeDeprecated||!1,dependencies_count:P.size,duration_ms:q}})}catch(x){o&&console.error("[Telemetry] add-all \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",x)}}catch(s){if(G(s)){try{await _.trackCommandOutcome(i,{command:"add-all",status:"cancelled",properties:{duration_ms:Date.now()-n}})}catch(a){o&&console.error("[Telemetry] add-all \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",a)}O.outro(l(s.message)),process.exit(0)}try{await _.trackCommandFailure(i,{command:"add-all",error:s,properties:{duration_ms:Date.now()-n}})}catch(a){o&&console.error("[Telemetry] add-all \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",a)}Y(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 N from"@clack/prompts";import it from"path";import{z}from"zod";var gr=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(K),framework:z.enum(["react","lynx"]).optional()});function ur({itemIds:e,component:t}){let r=i=>i.trim().replace(/\s+/g,"-"),n=(e??[]).map(r).filter(Boolean),o=(Array.isArray(t)?t:[t]).filter(i=>!!i).flatMap(i=>i.split(",")).map(r).filter(Boolean);return Array.from(new Set([...n,...o]))}function yr({publicRegistries:e,targetInputs:t,defaultRegistry:r}){let n=e.filter(i=>typeof i.id=="string"&&Array.isArray(i.items)).flatMap(i=>i.items.filter(s=>typeof s.id=="string").map(s=>`${i.id}:${s.id}`)),o=new Set;for(let i of t){let s=i.includes(":")?i:r?`${r}:${i}`:(()=>{let a=n.filter(c=>c.endsWith(`:${i}`));if(!a.length)throw new $({message:`${l(i)}: \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 $({message:`${l(i)}: \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(!n.includes(s))throw new $({message:`${l(s)}: \uD56D\uBAA9\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.`});o.add(s)}return Array.from(o)}var nt=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:K}).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=W(r),i=typeof r?.cwd=="string"?r.cwd:process.cwd();N.intro("seed-design compat");try{let s=gr.safeParse({itemIds:t,...r});if(!s.success)throw s.error;let{data:a}=s,c=await oe(a.cwd),m=a.framework??c?.framework??"react",{start:y,stop:g}=N.spinner();y("Registry\uB97C \uAC00\uC838\uC624\uACE0 \uC788\uC5B4\uC694...");let u=await(async()=>{try{let w=await Promise.all((await pe({baseUrl:a.baseUrl,framework:m})).map(async({id:b})=>de({baseUrl:a.baseUrl,framework:m,registryId:b})));return g("Registry\uB97C \uAC00\uC838\uC654\uC5B4\uC694."),w}catch(w){throw g("Registry\uB97C \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694."),w}})(),k=ur({itemIds:a.itemIds,component:a.component}),I=a.all?u.flatMap(b=>b.items.map(P=>`${b.id}:${P.id}`)):k.length>0?yr({publicRegistries:u,targetInputs:k,defaultRegistry:a.registry}):oe(a.cwd),S=Array.isArray(I)?I:await(async()=>{let w=await I;if(!w)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 b=it.resolve(a.cwd,w.path),P=rt({publicRegistries:u,rootPath:b});return P.length?P:(N.log.info(`${l(it.relative(a.cwd,b)||w.path)}\uC5D0\uC11C \uC124\uCE58\uB41C \uC2A4\uB2C8\uD3AB\uC744 \uCC3E\uC9C0 \uBABB\uD588\uC5B4\uC694.`),[])})();if(!S.length){try{await _.trackCommandOutcome(a.cwd,{command:"compat",status:"completed",result:"empty",properties:{duration_ms:Date.now()-n}})}catch(w){o&&console.error("[Telemetry] compat \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",w)}N.outro("\uAC80\uC0AC\uD560 \uC2A4\uB2C8\uD3AB\uC774 \uC5C6\uC5B4\uC694."),process.exit(0)}let E=ge(a.cwd,m),C=ue({publicRegistries:u,itemKeys:S,projectPackageVersions:E,framework:m});if(N.log.info(`\uAC80\uC0AC \uB300\uC0C1: ${l(C.checkedItemKeys.join(", "))}`),!C.issues.length){let w=ie(m);N.outro(`\uBAA8\uB4E0 \uC2A4\uB2C8\uD3AB\uC774 \uD604\uC7AC ${w.join(", ")}\uC640 \uD638\uD658\uB3FC\uC694.`);try{await _.trackCommandOutcome(a.cwd,{command:"compat",status:"completed",result:"compatible",properties:{checked_items_count:C.checkedItemKeys.length,incompatible_items_count:0,duration_ms:Date.now()-n}})}catch(b){o&&console.error("[Telemetry] compat \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",b)}process.exit(0)}ye({report:C,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 h=ie(m);N.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.`),N.outro("\uD638\uD658\uC131 \uC774\uC288\uAC00 \uC788\uC5B4\uC694.");try{await _.trackCommandOutcome(a.cwd,{command:"compat",status:"completed",result:"incompatible",properties:{checked_items_count:C.checkedItemKeys.length,incompatible_items_count:new Set(C.issues.map(w=>w.itemKey)).size,issue_count:C.issues.length,duration_ms:Date.now()-n}})}catch(w){o&&console.error("[Telemetry] compat \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",w)}process.exit(1)}catch(s){if(G(s)){try{await _.trackCommandOutcome(i,{command:"compat",status:"cancelled",properties:{duration_ms:Date.now()-n}})}catch(a){o&&console.error("[Telemetry] compat \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",a)}N.outro(l(s.message)),process.exit(0)}try{await _.trackCommandFailure(i,{command:"compat",error:s,properties:{duration_ms:Date.now()-n}})}catch(a){o&&console.error("[Telemetry] compat \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",a)}Y(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 A from"@clack/prompts";import{z as te}from"zod";var hr="https://raw.githubusercontent.com/daangn/seed-design/refs/heads/dev/docs/registry",wr=te.object({query:te.union([te.string(),te.array(te.string())]).optional().transform(e=>{let r=(Array.isArray(e)?e.join(" "):e)?.trim();return r||void 0}),baseUrl:te.string().optional(),cwd:te.string().default(process.cwd()),framework:te.enum(["react","lynx"]).optional(),raw:te.boolean()});function at(e,t){return`${hr}/${e}/${t}`}function br(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[i]=e.snippetKey.split(":");if(i)if(e.snippets.length===1)o.push(`- snippet: ${at(i,e.snippets[0].path)}`);else{o.push("- snippet:");for(let s of e.snippets)o.push(` - ${s.label}: ${at(i,s.path)}`)}}A.log.message(o.join(`
|
|
15
|
+
`))}function Cr(e,t){let r=e.length,n=t.length,o=Array.from({length:r+1},(i,s)=>Array.from({length:n+1},(a,c)=>s===0?c:c===0?s:0));for(let i=1;i<=r;i++)for(let s=1;s<=n;s++)o[i][s]=Math.min(o[i-1][s]+1,o[i][s-1]+1,o[i-1][s-1]+(e[i-1]!==t[s-1]?1:0));return o[r][n]}function ae(e,t,r=3){let n=e.toLowerCase();return t.map(o=>({value:o,dist:Cr(n,o.toLowerCase())})).filter(({dist:o})=>o>0&&o<=r).sort((o,i)=>o.dist-i.dist).map(({value:o})=>o)}function $r(e,t){if(e.length===0)return;let r=[],n=t.map(s=>s.id),o=ae(e[0],n);if(o.length===0){let s=t.flatMap(m=>m.sections.flatMap(y=>y.items.map(g=>`${m.id}/${y.id}/${g.id}`))),a=e.join("/"),c=ae(a,s,5);c.length>0&&r.push(...c.slice(0,3))}else{let s=t.find(a=>a.id===o[0]);if(s&&e.length>=2){let a=s.sections.map(m=>m.id),c=ae(e[1],a);if(c.length>0){let m=s.sections.find(y=>y.id===c[0]);if(m&&e.length>=3){let y=m.items.map(u=>u.id),g=ae(e[2],y);for(let u of g.slice(0,3))r.push(`${s.id}/${m.id}/${u}`)}else for(let y of c.slice(0,3))r.push(`${s.id}/${y}`)}else{let m=s.sections.flatMap(g=>g.items.map(u=>({path:`${s.id}/${g.id}/${u.id}`,id:u.id}))),y=ae(e[1],m.map(g=>g.id));for(let g of y.slice(0,3)){let u=m.find(k=>k.id===g);u&&r.push(u.path)}}}else for(let a of o.slice(0,3))r.push(a)}if(r.length===0)return;let i=["","\u{1F4A1} \uC774\uAC83\uC744 \uC758\uBBF8\uD588\uB098\uC694?"];for(let s of r)i.push(` - ${s}`);return i.join(`
|
|
16
|
+
`)}function lt(e){return e.split(/[\/\s]+/).map(t=>t.trim()).filter(Boolean)}function xr(e){let[,t]=e.split(":");return t??e}function Ir({query:e,framework:t,categoryIds:r}){if(!e)return;let n=lt(e).map(xr);if(!n.length)return;let[o]=n;return!r.includes(o)&&t&&r.includes(t)?[t,...n].join("/"):n.join("/")}function kr(e,t){let r=t.toLowerCase();return e.flatMap(n=>n.sections.flatMap(o=>o.items.filter(i=>i.id.toLowerCase().includes(r)||i.title.toLowerCase().includes(r)).map(i=>({item:i,categoryLabel:n.label,sectionLabel:o.label}))))}async function we(e){let t=await A.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(A.isCancel(t))throw new D;return t}async function ct(e){let t=await A.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(A.isCancel(t))throw new D;return t}async function Pr(e){let t=await A.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(A.isCancel(t))throw new D;return t}var mt=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: ${K})`,{default:K}).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(t,r)=>{let n=Date.now(),o=W(r),i=r.raw??!1,s=process.cwd();i||A.intro("seed-design docs");try{let a=wr.safeParse({query:t,...r});if(!a.success)throw a.error;let{data:c}=a;s=c.cwd;let m=c.baseUrl??K,y=await oe(c.cwd).catch(()=>null),g=c.framework??y?.framework;if(c.raw&&!c.query)throw new $({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(i)return await _e({baseUrl:m});let{start:h,stop:w}=A.spinner();h("\uBB38\uC11C \uBAA9\uB85D\uC744 \uAC00\uC838\uC624\uACE0 \uC788\uC5B4\uC694...");try{let b=await _e({baseUrl:m});return w("\uBB38\uC11C \uBAA9\uB85D\uC744 \uAC00\uC838\uC654\uC5B4\uC694."),b}catch(b){throw w("\uBB38\uC11C \uBAA9\uB85D\uC744 \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694."),b}})(),{categories:k}=u,I=Ir({query:c.query,framework:g,categoryIds:k.map(h=>h.id)}),S,E=async()=>{if(I){let b=lt(I);if(i&&b.length>3)return;let P=k.find(R=>R.id===b[0]);if(P&&b.length>=2){let R=P.sections.find(d=>d.id===b[1]);if(R&&b.length>=3){let d=R.items.find(v=>v.id===b[2]);if(d)return d;let T=b[2].toLowerCase(),M=R.items.filter(v=>v.id.toLowerCase().includes(T)||v.title.toLowerCase().includes(T));if(M.length===0){let v=ae(b[2],R.items.map(he=>he.id)),L=v.length>0?`
|
|
17
|
+
|
|
18
|
+
\u{1F4A1} \uC774\uAC83\uC744 \uC758\uBBF8\uD588\uB098\uC694?
|
|
19
|
+
${v.slice(0,3).map(he=>` - ${P.id}/${R.id}/${he}`).join(`
|
|
20
|
+
`)}`:"";throw new $({message:`${l(I)}: \uBB38\uC11C\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.${L}`,hint:`\`seed-design docs ${P.id}/${R.id}\`\uB85C \uBAA9\uB85D\uC744 \uD655\uC778\uD574\uBCF4\uC138\uC694.`})}return M.length===1?M[0]:await we(M)}if(R)return await we(R.items);let q=b[1].toLowerCase(),x=P.sections.flatMap(d=>d.items.filter(T=>T.id.toLowerCase().includes(q)||T.title.toLowerCase().includes(q)).map(T=>({item:T,sectionLabel:d.label})));if(x.length===0){let d=P.sections.map(F=>F.id),T=ae(b[1],d),M=P.sections.flatMap(F=>F.items.map(be=>({path:`${P.id}/${F.id}/${be.id}`,id:be.id}))),v=ae(b[1],M.map(F=>F.id)),L=[...T.slice(0,2).map(F=>`${P.id}/${F}`),...v.slice(0,2).map(F=>M.find(be=>be.id===F)?.path).filter(F=>F!=null)],he=L.length>0?`
|
|
21
|
+
|
|
22
|
+
\u{1F4A1} \uC774\uAC83\uC744 \uC758\uBBF8\uD588\uB098\uC694?
|
|
23
|
+
${L.map(F=>` - ${F}`).join(`
|
|
24
|
+
`)}`:"";throw new $({message:`${l(I)}: \uBB38\uC11C\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.${he}`,hint:`\`seed-design docs ${P.id}\`\uB85C \uBAA9\uB85D\uC744 \uD655\uC778\uD574\uBCF4\uC138\uC694.`})}if(x.length===1)return x[0].item;let p=await A.select({message:`${l(b[1])}\uC5D0 \uD574\uB2F9\uD558\uB294 \uD56D\uBAA9\uC744 \uC120\uD0DD\uD574\uC8FC\uC138\uC694`,options:x.map(({item:d,sectionLabel:T})=>({label:`[${T}] ${d.title}`,value:d,hint:d.description}))});if(A.isCancel(p))throw new D;return p}if(P){if(P.sections.length===1)return await we(P.sections[0].items);let R=await ct(P.sections);return await we(R.items)}let U=kr(k,I);if(U.length===0){let R=$r(b,k);throw new $({message:`${l(I)}: \uBB38\uC11C\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.${R??""}`,hint:"`seed-design docs`\uB85C \uC804\uCCB4 \uBAA9\uB85D\uC744 \uD655\uC778\uD574\uBCF4\uC138\uC694."})}if(U.length===1)return U[0].item;let B=await A.select({message:`${l(I)}\uC5D0 \uD574\uB2F9\uD558\uB294 \uD56D\uBAA9\uC744 \uC120\uD0DD\uD574\uC8FC\uC138\uC694`,options:U.map(({item:R,categoryLabel:q,sectionLabel:x})=>({label:`[${q} > ${x}] ${R.title}`,value:R,hint:R.description}))});if(A.isCancel(B))throw new D;return B}let h=await Pr(k),w;return h.sections.length===1?w=h.sections[0]:w=await ct(h.sections),await we(w.items)};if(i)try{S=await E()}catch(h){if(G(h))throw h}else S=await E();if(i){let h;if(S){let w=`${m}/llms${S.docUrl}.txt`;h=await Ue({url:w})}else h=await Ke({baseUrl:m,query:I});console.log(h)}else br(S,m),A.outro("\uC644\uB8CC\uD588\uC5B4\uC694.");let C=Date.now()-n;try{await _.trackCommandOutcome(s,{command:"docs",status:"completed",properties:{query:c.query??null,item_id:S?.id??c.query??null,has_snippet:!!(S?.snippets&&S.snippets.length>0),raw_mode:i,duration_ms:C}})}catch(h){o&&console.error("[Telemetry] docs \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",h)}}catch(a){if(G(a)){try{await _.trackCommandOutcome(s,{command:"docs",status:"cancelled",properties:{raw_mode:i,duration_ms:Date.now()-n}})}catch(c){o&&console.error("[Telemetry] docs \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",c)}i||A.outro(l(a.message)),process.exit(0)}try{await _.trackCommandFailure(s,{command:"docs",error:a,properties:{raw_mode:i,duration_ms:Date.now()-n}})}catch(c){o&&console.error("[Telemetry] docs \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",c)}if(i){let c=a instanceof Error?a.message:String(a);console.error(c),process.exit(1)}Y(a,{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 V from"@clack/prompts";import{z as Se}from"zod";import Sr from"dedent";var Er=Se.object({cwd:Se.string(),yes:Se.boolean().optional(),default:Se.boolean().optional()}),pt=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=W(t),o=typeof t?.cwd=="string"?t.cwd:process.cwd();V.intro("seed-design.json \uD30C\uC77C \uC0DD\uC131");try{let i=Er.safeParse(t);if(!i.success)throw i.error;let s=i.data,a=s.yes||s.default,c=a?{...H,framework:Ee(s.cwd)}:await Ae(s.cwd),{start:m,stop:y}=V.spinner();m("seed-design.json \uD30C\uC77C \uC0DD\uC131\uC911...");let g=await(async()=>{try{return(await Ce({cwd:s.cwd,config:c})).relativePath}catch(k){throw y("seed-design.json \uD30C\uC77C \uC0DD\uC131\uC774 \uC911\uB2E8\uB410\uC5B4\uC694."),k}})();y(`seed-design.json \uD30C\uC77C\uC774 ${l(g)}\uC5D0 \uC0DD\uC131\uB410\uC5B4\uC694.`),V.log.info(l("seed-design add {component} \uBA85\uB839\uC5B4\uB85C \uCEF4\uD3EC\uB10C\uD2B8\uB97C \uCD94\uAC00\uD574\uBCF4\uC138\uC694!")),V.log.info(l("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.")),V.note(Sr(`SEED Design CLI\uB294 \uAC1C\uC120\uC744 \uC704\uD574 \uC775\uBA85 \uC0AC\uC6A9 \uB370\uC774\uD130\uB97C \uC218\uC9D1\uD574\uC694.
|
|
12
25
|
|
|
13
26
|
\uBE44\uD65C\uC131\uD654\uD558\uB824\uBA74:
|
|
14
|
-
\u2022 seed-design.json\uC5D0\uC11C ${
|
|
15
|
-
\u2022 ${
|
|
27
|
+
\u2022 seed-design.json\uC5D0\uC11C ${l('"telemetry": false')}\uB85C \uC124\uC815
|
|
28
|
+
\u2022 ${l("DISABLE_TELEMETRY=true")} \uD658\uACBD \uBCC0\uC218 \uC124\uC815
|
|
16
29
|
|
|
17
|
-
\uC790\uC138\uD55C \uB0B4\uC6A9: https://seed-design.com/react/getting-started/cli/configuration#telemetry`),"Telemetry \uC548\uB0B4"),
|
|
30
|
+
\uC790\uC138\uD55C \uB0B4\uC6A9: https://seed-design.com/react/getting-started/cli/configuration#telemetry`),"Telemetry \uC548\uB0B4"),V.outro("\uC791\uC5C5\uC774 \uC644\uB8CC\uB410\uC5B4\uC694.");let u=Date.now()-r;try{await _.trackCommandOutcome(s.cwd,{command:"init",status:"completed",properties:{tsx:c.tsx,rsc:c.rsc,telemetry:c.telemetry,yes_option:a,duration_ms:u}})}catch(k){n&&console.error("[Telemetry] init \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",k)}}catch(i){if(G(i)){try{await _.trackCommandOutcome(o,{command:"init",status:"cancelled",properties:{duration_ms:Date.now()-r}})}catch(s){n&&console.error("[Telemetry] init \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",s)}V.outro(l(i.message)),process.exit(0)}try{await _.trackCommandFailure(o,{command:"init",error:i,properties:{duration_ms:Date.now()-r}})}catch(s){n&&console.error("[Telemetry] init \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",s)}Y(i,{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 Rr}from"cac";var Tr="seed-design",re=Rr(Tr);async function vr(){let e=se();re.option("--verbose","\uC624\uB958 \uC0C1\uC138 \uC815\uBCF4\uB97C \uCD9C\uB825\uD569\uB2C8\uB2E4."),st(re),ot(re),nt(re),mt(re),pt(re),re.version(e.version||"1.0.0","-v, --version"),re.help(),re.parse()}vr();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seed-design/cli",
|
|
3
|
-
"version": "1.4.0
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"src"
|
|
17
17
|
],
|
|
18
18
|
"engines": {
|
|
19
|
-
"node": ">=
|
|
19
|
+
"node": ">=20.19.0"
|
|
20
20
|
},
|
|
21
21
|
"scripts": {
|
|
22
22
|
"build": "ENV=prod bun ./build.mjs",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"@babel/plugin-transform-typescript": "^7.27.0",
|
|
31
31
|
"@clack/prompts": "^1.0.0",
|
|
32
32
|
"@npmcli/disparity-colors": "^3.0.1",
|
|
33
|
-
"cac": "^
|
|
33
|
+
"cac": "^7.0.0",
|
|
34
34
|
"cosmiconfig": "^9.0.0",
|
|
35
35
|
"dedent": "^1.7.0",
|
|
36
36
|
"diff": "^8.0.3",
|
|
@@ -45,11 +45,13 @@
|
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
47
47
|
"@types/babel__core": "^7.20.5",
|
|
48
|
+
"@types/findup-sync": "^4.0.5",
|
|
48
49
|
"@types/fs-extra": "^11.0.4",
|
|
50
|
+
"@types/node": "^25.0.0",
|
|
49
51
|
"dotenv": "^17.2.3",
|
|
50
52
|
"esbuild": "^0.27.0",
|
|
51
53
|
"type-fest": "^5.0.0",
|
|
52
|
-
"typescript": "^
|
|
54
|
+
"typescript": "^6.0.0"
|
|
53
55
|
},
|
|
54
56
|
"publishConfig": {
|
|
55
57
|
"access": "public"
|
package/src/commands/add-all.ts
CHANGED
|
@@ -29,7 +29,7 @@ const addAllOptionsSchema = z.object({
|
|
|
29
29
|
all: z.boolean(),
|
|
30
30
|
includeDeprecated: z.boolean().optional(),
|
|
31
31
|
cwd: z.string(),
|
|
32
|
-
baseUrl: z.string().
|
|
32
|
+
baseUrl: z.string().default(BASE_URL),
|
|
33
33
|
framework: z.enum(["react", "lynx"]).optional(),
|
|
34
34
|
onDiff: z.enum(["overwrite", "backup"]).optional(),
|
|
35
35
|
});
|
|
@@ -58,6 +58,7 @@ export const addAllCommand = (cli: CAC) => {
|
|
|
58
58
|
.action(async (registryIds, opts) => {
|
|
59
59
|
const startTime = Date.now();
|
|
60
60
|
const verbose = isVerboseMode(opts);
|
|
61
|
+
const trackCwd = typeof opts?.cwd === "string" ? opts.cwd : process.cwd();
|
|
61
62
|
p.intro("seed-design add-all");
|
|
62
63
|
|
|
63
64
|
try {
|
|
@@ -233,8 +234,9 @@ export const addAllCommand = (cli: CAC) => {
|
|
|
233
234
|
// add-all 성공 이벤트 추적
|
|
234
235
|
const duration = Date.now() - startTime;
|
|
235
236
|
try {
|
|
236
|
-
await analytics.
|
|
237
|
-
|
|
237
|
+
await analytics.trackCommandOutcome(options.cwd, {
|
|
238
|
+
command: "add-all",
|
|
239
|
+
status: "completed",
|
|
238
240
|
properties: {
|
|
239
241
|
registries: selectedRegistryIds,
|
|
240
242
|
items_count: itemKeys.length,
|
|
@@ -245,15 +247,42 @@ export const addAllCommand = (cli: CAC) => {
|
|
|
245
247
|
});
|
|
246
248
|
} catch (telemetryError) {
|
|
247
249
|
if (verbose) {
|
|
248
|
-
console.error("[Telemetry] add-all
|
|
250
|
+
console.error("[Telemetry] add-all 이벤트 전송에 실패했어요:", telemetryError);
|
|
249
251
|
}
|
|
250
252
|
}
|
|
251
253
|
} catch (error) {
|
|
252
254
|
if (isCliCancelError(error)) {
|
|
255
|
+
try {
|
|
256
|
+
await analytics.trackCommandOutcome(trackCwd, {
|
|
257
|
+
command: "add-all",
|
|
258
|
+
status: "cancelled",
|
|
259
|
+
properties: {
|
|
260
|
+
duration_ms: Date.now() - startTime,
|
|
261
|
+
},
|
|
262
|
+
});
|
|
263
|
+
} catch (telemetryError) {
|
|
264
|
+
if (verbose) {
|
|
265
|
+
console.error("[Telemetry] add-all 이벤트 전송에 실패했어요:", telemetryError);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
253
268
|
p.outro(highlight(error.message));
|
|
254
269
|
process.exit(0);
|
|
255
270
|
}
|
|
256
271
|
|
|
272
|
+
try {
|
|
273
|
+
await analytics.trackCommandFailure(trackCwd, {
|
|
274
|
+
command: "add-all",
|
|
275
|
+
error,
|
|
276
|
+
properties: {
|
|
277
|
+
duration_ms: Date.now() - startTime,
|
|
278
|
+
},
|
|
279
|
+
});
|
|
280
|
+
} catch (telemetryError) {
|
|
281
|
+
if (verbose) {
|
|
282
|
+
console.error("[Telemetry] add-all 이벤트 전송에 실패했어요:", telemetryError);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
257
286
|
handleCliError(error, {
|
|
258
287
|
defaultMessage: "추가에 실패했어요.",
|
|
259
288
|
defaultHint: "`--verbose` 옵션으로 상세 오류를 확인해보세요.",
|
package/src/commands/add.ts
CHANGED
|
@@ -31,7 +31,7 @@ const addOptionsSchema = z.object({
|
|
|
31
31
|
*/
|
|
32
32
|
all: z.boolean(),
|
|
33
33
|
cwd: z.string(),
|
|
34
|
-
baseUrl: z.string().
|
|
34
|
+
baseUrl: z.string().default(BASE_URL),
|
|
35
35
|
framework: z.enum(["react", "lynx"]).optional(),
|
|
36
36
|
onDiff: z.enum(["overwrite", "backup"]).optional(),
|
|
37
37
|
});
|
|
@@ -57,6 +57,7 @@ export const addCommand = (cli: CAC) => {
|
|
|
57
57
|
.action(async (itemIds, opts) => {
|
|
58
58
|
const startTime = Date.now();
|
|
59
59
|
const verbose = isVerboseMode(opts);
|
|
60
|
+
const trackCwd = typeof opts?.cwd === "string" ? opts.cwd : process.cwd();
|
|
60
61
|
p.intro("seed-design add");
|
|
61
62
|
|
|
62
63
|
try {
|
|
@@ -254,8 +255,9 @@ export const addCommand = (cli: CAC) => {
|
|
|
254
255
|
});
|
|
255
256
|
|
|
256
257
|
try {
|
|
257
|
-
await analytics.
|
|
258
|
-
|
|
258
|
+
await analytics.trackCommandOutcome(options.cwd, {
|
|
259
|
+
command: "add",
|
|
260
|
+
status: "completed",
|
|
259
261
|
properties: {
|
|
260
262
|
items_count: filteredItemKeys.length,
|
|
261
263
|
registries: Array.from(uniqueRegistries),
|
|
@@ -266,15 +268,42 @@ export const addCommand = (cli: CAC) => {
|
|
|
266
268
|
});
|
|
267
269
|
} catch (telemetryError) {
|
|
268
270
|
if (verbose) {
|
|
269
|
-
console.error("[Telemetry] add
|
|
271
|
+
console.error("[Telemetry] add 이벤트 전송에 실패했어요:", telemetryError);
|
|
270
272
|
}
|
|
271
273
|
}
|
|
272
274
|
} catch (error) {
|
|
273
275
|
if (isCliCancelError(error)) {
|
|
276
|
+
try {
|
|
277
|
+
await analytics.trackCommandOutcome(trackCwd, {
|
|
278
|
+
command: "add",
|
|
279
|
+
status: "cancelled",
|
|
280
|
+
properties: {
|
|
281
|
+
duration_ms: Date.now() - startTime,
|
|
282
|
+
},
|
|
283
|
+
});
|
|
284
|
+
} catch (telemetryError) {
|
|
285
|
+
if (verbose) {
|
|
286
|
+
console.error("[Telemetry] add 이벤트 전송에 실패했어요:", telemetryError);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
274
289
|
p.outro(highlight(error.message));
|
|
275
290
|
process.exit(0);
|
|
276
291
|
}
|
|
277
292
|
|
|
293
|
+
try {
|
|
294
|
+
await analytics.trackCommandFailure(trackCwd, {
|
|
295
|
+
command: "add",
|
|
296
|
+
error,
|
|
297
|
+
properties: {
|
|
298
|
+
duration_ms: Date.now() - startTime,
|
|
299
|
+
},
|
|
300
|
+
});
|
|
301
|
+
} catch (telemetryError) {
|
|
302
|
+
if (verbose) {
|
|
303
|
+
console.error("[Telemetry] add 이벤트 전송에 실패했어요:", telemetryError);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
|
|
278
307
|
handleCliError(error, {
|
|
279
308
|
defaultMessage: "추가에 실패했어요.",
|
|
280
309
|
defaultHint: "`--verbose` 옵션으로 상세 오류를 확인해보세요.",
|
package/src/commands/compat.ts
CHANGED
|
@@ -23,7 +23,7 @@ const compatOptionsSchema = z.object({
|
|
|
23
23
|
all: z.boolean(),
|
|
24
24
|
registry: z.string().optional(),
|
|
25
25
|
cwd: z.string(),
|
|
26
|
-
baseUrl: z.string().
|
|
26
|
+
baseUrl: z.string().default(BASE_URL),
|
|
27
27
|
framework: z.enum(["react", "lynx"]).optional(),
|
|
28
28
|
});
|
|
29
29
|
|
|
@@ -126,6 +126,7 @@ export const compatCommand = (cli: CAC) => {
|
|
|
126
126
|
.action(async (itemIds, opts) => {
|
|
127
127
|
const startTime = Date.now();
|
|
128
128
|
const verbose = isVerboseMode(opts);
|
|
129
|
+
const trackCwd = typeof opts?.cwd === "string" ? opts.cwd : process.cwd();
|
|
129
130
|
p.intro("seed-design compat");
|
|
130
131
|
|
|
131
132
|
try {
|
|
@@ -208,6 +209,20 @@ export const compatCommand = (cli: CAC) => {
|
|
|
208
209
|
})();
|
|
209
210
|
|
|
210
211
|
if (!resolvedTargetItemKeys.length) {
|
|
212
|
+
try {
|
|
213
|
+
await analytics.trackCommandOutcome(options.cwd, {
|
|
214
|
+
command: "compat",
|
|
215
|
+
status: "completed",
|
|
216
|
+
result: "empty",
|
|
217
|
+
properties: {
|
|
218
|
+
duration_ms: Date.now() - startTime,
|
|
219
|
+
},
|
|
220
|
+
});
|
|
221
|
+
} catch (telemetryError) {
|
|
222
|
+
if (verbose) {
|
|
223
|
+
console.error("[Telemetry] compat 이벤트 전송에 실패했어요:", telemetryError);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
211
226
|
p.outro("검사할 스니펫이 없어요.");
|
|
212
227
|
process.exit(0);
|
|
213
228
|
}
|
|
@@ -227,8 +242,10 @@ export const compatCommand = (cli: CAC) => {
|
|
|
227
242
|
p.outro(`모든 스니펫이 현재 ${compatPkgNames.join(", ")}와 호환돼요.`);
|
|
228
243
|
|
|
229
244
|
try {
|
|
230
|
-
await analytics.
|
|
231
|
-
|
|
245
|
+
await analytics.trackCommandOutcome(options.cwd, {
|
|
246
|
+
command: "compat",
|
|
247
|
+
status: "completed",
|
|
248
|
+
result: "compatible",
|
|
232
249
|
properties: {
|
|
233
250
|
checked_items_count: compatibilityReport.checkedItemKeys.length,
|
|
234
251
|
incompatible_items_count: 0,
|
|
@@ -237,7 +254,7 @@ export const compatCommand = (cli: CAC) => {
|
|
|
237
254
|
});
|
|
238
255
|
} catch (telemetryError) {
|
|
239
256
|
if (verbose) {
|
|
240
|
-
console.error("[Telemetry] compat
|
|
257
|
+
console.error("[Telemetry] compat 이벤트 전송에 실패했어요:", telemetryError);
|
|
241
258
|
}
|
|
242
259
|
}
|
|
243
260
|
|
|
@@ -254,8 +271,10 @@ export const compatCommand = (cli: CAC) => {
|
|
|
254
271
|
p.outro("호환성 이슈가 있어요.");
|
|
255
272
|
|
|
256
273
|
try {
|
|
257
|
-
await analytics.
|
|
258
|
-
|
|
274
|
+
await analytics.trackCommandOutcome(options.cwd, {
|
|
275
|
+
command: "compat",
|
|
276
|
+
status: "completed",
|
|
277
|
+
result: "incompatible",
|
|
259
278
|
properties: {
|
|
260
279
|
checked_items_count: compatibilityReport.checkedItemKeys.length,
|
|
261
280
|
incompatible_items_count: new Set(
|
|
@@ -267,17 +286,44 @@ export const compatCommand = (cli: CAC) => {
|
|
|
267
286
|
});
|
|
268
287
|
} catch (telemetryError) {
|
|
269
288
|
if (verbose) {
|
|
270
|
-
console.error("[Telemetry] compat
|
|
289
|
+
console.error("[Telemetry] compat 이벤트 전송에 실패했어요:", telemetryError);
|
|
271
290
|
}
|
|
272
291
|
}
|
|
273
292
|
|
|
274
293
|
process.exit(1);
|
|
275
294
|
} catch (error) {
|
|
276
295
|
if (isCliCancelError(error)) {
|
|
296
|
+
try {
|
|
297
|
+
await analytics.trackCommandOutcome(trackCwd, {
|
|
298
|
+
command: "compat",
|
|
299
|
+
status: "cancelled",
|
|
300
|
+
properties: {
|
|
301
|
+
duration_ms: Date.now() - startTime,
|
|
302
|
+
},
|
|
303
|
+
});
|
|
304
|
+
} catch (telemetryError) {
|
|
305
|
+
if (verbose) {
|
|
306
|
+
console.error("[Telemetry] compat 이벤트 전송에 실패했어요:", telemetryError);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
277
309
|
p.outro(highlight(error.message));
|
|
278
310
|
process.exit(0);
|
|
279
311
|
}
|
|
280
312
|
|
|
313
|
+
try {
|
|
314
|
+
await analytics.trackCommandFailure(trackCwd, {
|
|
315
|
+
command: "compat",
|
|
316
|
+
error,
|
|
317
|
+
properties: {
|
|
318
|
+
duration_ms: Date.now() - startTime,
|
|
319
|
+
},
|
|
320
|
+
});
|
|
321
|
+
} catch (telemetryError) {
|
|
322
|
+
if (verbose) {
|
|
323
|
+
console.error("[Telemetry] compat 이벤트 전송에 실패했어요:", telemetryError);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
|
|
281
327
|
handleCliError(error, {
|
|
282
328
|
defaultMessage: "호환성 검사에 실패했어요.",
|
|
283
329
|
defaultHint: "`--verbose` 옵션으로 상세 오류를 확인해보세요.",
|