@jongh/cli 2.0.0 → 2.1.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.
Files changed (2) hide show
  1. package/dist/index.js +2 -2
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {Command}from'commander';import {intro,confirm,outro,spinner,select,log}from'@clack/prompts';import ae from'chalk';import D from'fs-extra';import k from'path';import {z as z$1}from'zod';import Se from'fast-glob';import {loadConfig,createMatchPath}from'tsconfig-paths';import {Project,SyntaxKind}from'ts-morph';import {detect,resolveCommand}from'package-manager-detector';import {packageDirectory}from'pkg-dir';import ze from'handlebars';import {StdioServerTransport}from'@modelcontextprotocol/sdk/server/stdio.js';import {Server}from'@modelcontextprotocol/sdk/server/index.js';import {ListToolsRequestSchema,CallToolRequestSchema,ListPromptsRequestSchema,GetPromptRequestSchema}from'@modelcontextprotocol/sdk/types.js';import {zodToJsonSchema}from'zod-to-json-schema';var V=t=>{let e={};for(let o of t)e[o]=o;return e},N=V(["config_not_found","resolve_path_fail","failed_to_fetch"]);V(["components.json","tsconfig.json","panda.config.*","package.json"]);var b=class extends Error{issue;constructor(e){super(),this.name="NewError",this.issue=e;}get format(){return this.issue.code+`
3
3
  `+this.issue.message?.join(`
4
- `)}},u=t=>{let e;switch(t.code){case N.config_not_found:e=`error occured while config ${t.configFile}`;break;case N.resolve_path_fail:e=`failed to resolve your path, current ${t.cwd}`;break;case N.failed_to_fetch:e=`failed to fetch ${t.target} [${t.statusCode}]`;break;default:e="error occured";}return new b({...t,message:[...t.message||"",e]})};var v={fileName:"components.json",schema:z$1.object({utils:z$1.string(),components:z$1.string(),hooks:z$1.string(),styledsystem:z$1.string()}).strict()},be=["ui","hooks","utils"],ve=z$1.object({name:z$1.string(),content:z$1.string(),type:z$1.enum(be)}),q=z$1.object({name:z$1.string(),dependencies:z$1.array(z$1.string()).optional(),files:z$1.array(ve).optional()});z$1.object({name:z$1.string(),dependencies:z$1.array(z$1.string()).optional(),file:z$1.string()});function Y(t){try{return D.readJsonSync(k.resolve(t,v.fileName))}catch(e){return u({code:"config_not_found",configFile:v.fileName,message:[e instanceof Error?e.message:""]})}}function F(t){let e=loadConfig(t);if(e.resultType==="failed")throw u({code:"config_not_found",configFile:"tsconfig.json",message:["cannot found tsconfig.json"]});return e}async function Q(t){return await D.pathExists(k.join(t,"components.json"))}function X(t,e){let o=["./","./src/","./app/","./src/app"].map(r=>k.resolve(t,r));for(let[r,s]of Object.entries(e.paths)){let a=k.join(t,e.baseUrl||"",s[0].replace(/\/\*$/,""));if(o.some(l=>l===a||l.includes(a)))return r.replace(/\/\*$/,"")}return null}function ee(t,e,o){let r=k.join(t,e);for(let[s,a]of Object.entries(o.paths)){let l=a[0].replace(/\/\*$/,"");if(r===k.join(t,o.baseUrl||"",l))return s.replace(/\/\*$/,"")}return null}async function z(t){try{let e=await Se.glob(["panda.config.*"],{cwd:t,deep:3});if(!e.length)throw u({code:"config_not_found",configFile:"panda.config.*",message:["failed to find panda.config file"]});return e[0]}catch(e){throw u({code:"config_not_found",configFile:"panda.config.*",message:[e instanceof Error?e.message:"unknown error occured finding panda.config"]})}}async function A(t,e){let o=createMatchPath(e.absoluteBaseUrl,e.paths)(t,void 0,()=>true);if(!o)throw u({code:"resolve_path_fail",target:t,cwd:process.cwd(),message:["resolve error"]});return o}async function W(t){let e=t.match(/outdir:\s*["']([^"']+)["']/),o=t.match(/importMap:\s*({[^}]+}|["'][^"']+["'])/),r=e?e[1]:null,s=null;if(o){let a=o[1];if(a.startsWith("{")){let l=a.match(/css:\s*["']([^"']+)["']/);s=l?l[1].replace(/\/css$/,""):null;}else s=a.replace(/["']/g,"");}return {outdir:r,importMap:s}}function te(t,e){let o=t;return [{from:/@utils\//g,to:`${e.utils}/`},{from:/@hooks\//g,to:`${e.hooks}/`},{from:/@styled-system\//g,to:`${e.styledsystem}/`},{from:/@components\//g,to:`${e.components}/`}].forEach(({from:s,to:a})=>{o=o.replace(s,a);}),o}function oe(t){let o=new Project().addSourceFileAtPath(t),r=[{namedImports:[{name:"preset"}],moduleSpecifier:"panda-animation"},{namedImports:[{name:"defaultPreset"}],moduleSpecifier:"./preset"}];o.addImportDeclarations(r);let a=o.getFirstDescendantByKind(SyntaxKind.CallExpression)?.getArguments()[0];a?(a.getProperty("presets")||a.addPropertyAssignment({name:"presets",initializer:'[preset(), "@pandacss/preset-panda", defaultPreset]'}),o.saveSync()):console.warn("Could not modify panda.config.ts. add presets : [preset(), @pandacss/preset-panda, defaultPreset] in your panda.config");}async function re(t,e){let o=await detect({cwd:t}),r=resolveCommand(o?.agent||"npm","add",e);if(r)return r}var $e=z$1.object({components:z$1.array(z$1.string()).optional(),cwd:z$1.string()}),Fe="https://whdgur.shop",C=ae.bold.red,O=ae.bold.blue,ne=new Command().name("add").argument("[components...]").option("-c, --cwd <cwd>","current working directory, default to process.cwd()",process.cwd()).action(async(t,e)=>{try{let o=$e.parse({components:t,...e});intro(O("install components..."));let r=v.schema.parse(Y(o.cwd)),s=F(o.cwd),a=await z(o.cwd),l=await D.readFile(k.resolve(o.cwd,a),"utf-8"),{outdir:f}=await W(l),h=v.schema.parse({utils:await A(r.utils,s),components:await A(r.components,s),hooks:await A(r.hooks,s),styledsystem:k.join(o.cwd,f||"styled-system")},{errorMap:()=>({message:"validation failed at components.json"})}),p=o.components?.map(m=>m.toLowerCase());if(!p?.length)return;let y=await Promise.allSettled(p.map(async m=>{let n=await fetch(`${Fe}/${m}.json`);if(!n.ok)throw u({code:"failed_to_fetch",target:m,statusCode:n.status,message:[n.statusText]});return await n.json()}));for(let[m,n]of y.entries()){if(n.status==="rejected"){n.reason instanceof b?console.log(C(n.reason.format)):console.log(C(n.reason));continue}try{let i=q.parse(n.value,{errorMap:()=>({message:`registry for ${p[m]} is invaliad`})}),g=k.join(h.components,p[m]);if(D.pathExistsSync(g)&&!await confirm({message:`Component ${p[m]} already exists. Do you want to overwrite it?`}))return;i.files?.forEach(x=>{let K=te(x.content,r);x.type==="ui"?D.outputFileSync(k.join(g,x.name),K):D.outputFileSync(k.join(h[x.type],x.name),K,"utf-8");});let d=await re(o.cwd,i.dependencies||[]),$=d?`Run this command in the terminal : ${d.command} ${d.args.join(" ")}`:`Cannot find your package manager, install this dependencies: ${i.dependencies?.join(" ")}`;outro(O(`${p[m]} completed successfully
4
+ `)}},u=t=>{let e;switch(t.code){case N.config_not_found:e=`error occured while config ${t.configFile}`;break;case N.resolve_path_fail:e=`failed to resolve your path, current ${t.cwd}`;break;case N.failed_to_fetch:e=`failed to fetch ${t.target} [${t.statusCode}]`;break;default:e="error occured";}return new b({...t,message:[...t.message||"",e]})};var v={fileName:"components.json",schema:z$1.object({utils:z$1.string(),components:z$1.string(),hooks:z$1.string(),styledsystem:z$1.string()}).strict()},be=["ui","hooks","utils"],ve=z$1.object({name:z$1.string(),content:z$1.string(),type:z$1.enum(be)}),q=z$1.object({name:z$1.string(),dependencies:z$1.array(z$1.string()).optional(),files:z$1.array(ve).optional()});z$1.object({name:z$1.string(),dependencies:z$1.array(z$1.string()).optional(),file:z$1.string()});function Y(t){try{return D.readJsonSync(k.resolve(t,v.fileName))}catch(e){return u({code:"config_not_found",configFile:v.fileName,message:[e instanceof Error?e.message:""]})}}function F(t){let e=loadConfig(t);if(e.resultType==="failed")throw u({code:"config_not_found",configFile:"tsconfig.json",message:["cannot found tsconfig.json"]});return e}async function Q(t){return await D.pathExists(k.join(t,"components.json"))}function X(t,e){let o=["./","./src/","./app/","./src/app"].map(r=>k.resolve(t,r));for(let[r,s]of Object.entries(e.paths)){let a=k.join(t,e.baseUrl||"",s[0].replace(/\/\*$/,""));if(o.some(l=>l===a||l.includes(a)))return r.replace(/\/\*$/,"")}return null}function ee(t,e,o){let r=k.join(t,e);for(let[s,a]of Object.entries(o.paths)){let l=a[0].replace(/\/\*$/,"");if(r===k.join(t,o.baseUrl||"",l))return s.replace(/\/\*$/,"")}return null}async function z(t){try{let e=await Se.glob(["panda.config.*"],{cwd:t,deep:3});if(!e.length)throw u({code:"config_not_found",configFile:"panda.config.*",message:["failed to find panda.config file"]});return e[0]}catch(e){throw u({code:"config_not_found",configFile:"panda.config.*",message:[e instanceof Error?e.message:"unknown error occured finding panda.config"]})}}async function A(t,e){let o=createMatchPath(e.absoluteBaseUrl,e.paths)(t,void 0,()=>true);if(!o)throw u({code:"resolve_path_fail",target:t,cwd:process.cwd(),message:["resolve error"]});return o}async function W(t){let e=t.match(/outdir:\s*["']([^"']+)["']/),o=t.match(/importMap:\s*({[^}]+}|["'][^"']+["'])/),r=e?e[1]:null,s=null;if(o){let a=o[1];if(a.startsWith("{")){let l=a.match(/css:\s*["']([^"']+)["']/);s=l?l[1].replace(/\/css$/,""):null;}else s=a.replace(/["']/g,"");}return {outdir:r,importMap:s}}function te(t,e){let o=t;return [{from:/@utils\//g,to:`${e.utils}/`},{from:/@hooks\//g,to:`${e.hooks}/`},{from:/@styled-system\//g,to:`${e.styledsystem}/`},{from:/@components\//g,to:`${e.components}/`}].forEach(({from:s,to:a})=>{o=o.replace(s,a);}),o}function oe(t){let o=new Project().addSourceFileAtPath(t),r=[{namedImports:[{name:"preset"}],moduleSpecifier:"panda-animation"},{namedImports:[{name:"defaultPreset"}],moduleSpecifier:"./preset"}];o.addImportDeclarations(r);let a=o.getFirstDescendantByKind(SyntaxKind.CallExpression)?.getArguments()[0];a?(a.getProperty("presets")||a.addPropertyAssignment({name:"presets",initializer:'[preset(), "@pandacss/preset-panda", defaultPreset]'}),o.saveSync()):console.warn("Could not modify panda.config.ts. add presets : [preset(), @pandacss/preset-panda, defaultPreset] in your panda.config");}async function re(t,e){let o=await detect({cwd:t}),r=resolveCommand(o?.agent||"npm","add",e);if(r)return r}var $e=z$1.object({components:z$1.array(z$1.string()).optional(),cwd:z$1.string()}),Fe="https://jds-docs.vercel.app",C=ae.bold.red,O=ae.bold.blue,ne=new Command().name("add").argument("[components...]").option("-c, --cwd <cwd>","current working directory, default to process.cwd()",process.cwd()).action(async(t,e)=>{try{let o=$e.parse({components:t,...e});intro(O("install components..."));let r=v.schema.parse(Y(o.cwd)),s=F(o.cwd),a=await z(o.cwd),l=await D.readFile(k.resolve(o.cwd,a),"utf-8"),{outdir:f}=await W(l),h=v.schema.parse({utils:await A(r.utils,s),components:await A(r.components,s),hooks:await A(r.hooks,s),styledsystem:k.join(o.cwd,f||"styled-system")},{errorMap:()=>({message:"validation failed at components.json"})}),p=o.components?.map(m=>m.toLowerCase());if(!p?.length)return;let y=await Promise.allSettled(p.map(async m=>{let n=await fetch(`${Fe}/${m}.json`);if(!n.ok)throw u({code:"failed_to_fetch",target:m,statusCode:n.status,message:[n.statusText]});return await n.json()}));for(let[m,n]of y.entries()){if(n.status==="rejected"){n.reason instanceof b?console.log(C(n.reason.format)):console.log(C(n.reason));continue}try{let i=q.parse(n.value,{errorMap:()=>({message:`registry for ${p[m]} is invaliad`})}),g=k.join(h.components,p[m]);if(D.pathExistsSync(g)&&!await confirm({message:`Component ${p[m]} already exists. Do you want to overwrite it?`}))return;i.files?.forEach(x=>{let K=te(x.content,r);x.type==="ui"?D.outputFileSync(k.join(g,x.name),K):D.outputFileSync(k.join(h[x.type],x.name),K,"utf-8");});let d=await re(o.cwd,i.dependencies||[]),$=d?`Run this command in the terminal : ${d.command} ${d.args.join(" ")}`:`Cannot find your package manager, install this dependencies: ${i.dependencies?.join(" ")}`;outro(O(`${p[m]} completed successfully
5
5
  ${$}`));}catch(i){i instanceof Error&&console.log(C(i.message));}}}catch(o){outro(C(O("error occured"))),o instanceof z$1.ZodError&&console.log(o.message),o instanceof b&&console.log(C(o.format)),o instanceof Error&&console.log(C(o.message)),process.exit(1);}});var ie=`
6
6
  import {
7
7
  definePreset,
@@ -325,4 +325,4 @@ export const defaultPreset = definePreset({
325
325
  - When executing the 'DesignSystemCLI init' tool, color arguments must be passed with the exact names from the list.`}},{role:"user",content:{type:"text",text:"I need to set up the theme colors for my design system. Can you guide me through the process?"}},{role:"assistant",content:{type:"text",text:"I can help you set up the theme colors for your design system. First, you need to select a primary color. Please choose from the following colors: rose, pink, fuchsia, purple, violet, indigo, blue, sky, cyan, teal, emerald, green, lime, yellow, amber, orange, red, neutral, stone, zinc, gray, slate. Which color would you like to use as your primary color?"}}]});var pe=new Command().name("mcp").description("Manage your design system").action(async()=>{try{let t=new StdioServerTransport;await _.connect(t);}catch(t){console.error(t);}});var ge={"@radix-ui/react-accessible-icon":"AccessibleIcon","@radix-ui/react-accordion":"Accordion","@radix-ui/react-alert-dialog":"AlertDialog","@radix-ui/react-aspect-ratio":"AspectRatio","@radix-ui/react-avatar":"Avatar","@radix-ui/react-checkbox":"Checkbox","@radix-ui/react-collapsible":"Collapsible","@radix-ui/react-context-menu":"ContextMenu","@radix-ui/react-dialog":"Dialog","@radix-ui/react-direction":"Direction","@radix-ui/react-dropdown-menu":"DropdownMenu","@radix-ui/react-form":"Form","@radix-ui/react-hover-card":"HoverCard","@radix-ui/react-label":"Label","@radix-ui/react-menubar":"Menubar","@radix-ui/react-navigation-menu":"NavigationMenu","@radix-ui/react-popover":"Popover","@radix-ui/react-portal":"Portal","@radix-ui/react-progress":"Progress","@radix-ui/react-radio-group":"RadioGroup","@radix-ui/react-scroll-area":"ScrollArea","@radix-ui/react-select":"Select","@radix-ui/react-separator":"Separator","@radix-ui/react-slider":"Slider","@radix-ui/react-slot":"Slot","@radix-ui/react-switch":"Switch","@radix-ui/react-tabs":"Tabs","@radix-ui/react-toast":"Toast","@radix-ui/react-toggle":"Toggle","@radix-ui/react-toggle-group":"ToggleGroup","@radix-ui/react-toolbar":"Toolbar","@radix-ui/react-tooltip":"Tooltip","@radix-ui/react-visually-hidden":"VisuallyHidden"};function L(t,e,o){return o?t===o:t===e}function fe(t){return `import {${t}} from "radix-ui"`}function ue(t){let e=[];return t.getImportDeclarations().forEach(o=>{let r=o.getModuleSpecifierValue();if(!(r in ge))return;let s=ge[r];e.push(r);let a=o.getNamespaceImport();if(a){let f=a.getText();s!==f&&(s+=` as ${f}`),o.replaceWithText(fe(s));return}let l=o.getNamedImports();if(l.length){let f=s;l.forEach(h=>{let p=h.getName(),y=h.getAliasNode()?.getText(),m=`${f}.${p}`;for(let n of [SyntaxKind.JsxOpeningElement,SyntaxKind.JsxClosingElement,SyntaxKind.JsxSelfClosingElement])t.getDescendantsOfKind(n).forEach(i=>{let g=i.getTagNameNode().getText();L(g,p,y)&&i.getTagNameNode().replaceWithText(m);});t.getDescendantsOfKind(SyntaxKind.TypeQuery).forEach(n=>{n.getChildren().forEach(i=>{let g=i.getText();L(g,p,y)&&i.replaceWithText(m);});}),t.getDescendantsOfKind(SyntaxKind.ExpressionStatement).forEach(n=>{n.getChildrenOfKind(SyntaxKind.BinaryExpression).forEach(g=>{g.getRight().getChildren().forEach($=>{let x=$.getText();L(x,p,y)&&$.replaceWithText(m);});});}),t.getDescendantsOfKind(SyntaxKind.VariableDeclaration).forEach(n=>{let i=n.getInitializer();i&&i.getChildren().forEach(g=>{let d=g.getText();L(d,p,y)&&g.replaceWithText(m);});});}),o.replaceWithText(fe(f));}}),{source:t.getFullText(),packages:e}}var ye=new Command().name("radix-ui-import").action(()=>{intro("find .tsx files...");let t=Se.sync("**/*.tsx",{ignore:["**/node_modules/**"],dot:false}),e=new Project,o="";t.forEach(r=>{let s=e.addSourceFileAtPathIfExists(k.join(process.cwd(),r));if(s)try{let{packages:a}=ue(s);o+=a.join(" "),s.save();}catch(a){log.error(`failed to transform ${r} ${a}`);}}),o.length?`copy this to delete and install new package
326
326
  <your package manager's delete command> ${o}
327
327
  <your package manager's install command> ${ae.bgGreen("radix-ui")}`.split(`
328
- `).forEach(log.step):outro("no transform occured");});var xe={version:"2.0.0"};async function ot(){new Command().name("design-system").version(xe.version).addCommand(me).addCommand(ne).addCommand(ye).addCommand(pe).parse();}ot();
328
+ `).forEach(log.step):outro("no transform occured");});var xe={version:"2.1.0"};async function ot(){new Command().name("design-system").version(xe.version).addCommand(me).addCommand(ne).addCommand(ye).addCommand(pe).parse();}ot();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jongh/cli",
3
- "version": "2.0.0",
3
+ "version": "2.1.0",
4
4
  "description": "",
5
5
  "bin": "./dist/index.js",
6
6
  "type": "module",