@scania/tegel-cli
Version:
CLI tool for copying and transforming Tegel components with custom prefixes
3 lines • 7.54 kB
JavaScript
import {a as a$1,c,b,d}from'./chunk-U5L6KJOP.js';import {a}from'./chunk-HFCPHFYJ.js';import {Command}from'commander';import {readFileSync}from'fs';import {fileURLToPath}from'url';import v,{dirname,join}from'path';import C from'prompts';import f from'fs-extra';import h from'chalk';import R from'semver';async function j(){let n=v.join(process.cwd(),".gitignore"),t=["","# Tegel CLI","tegel-cache/",".tegel-backup/",""].join("\\n");try{await f.pathExists(n)?(await f.readFile(n,"utf-8")).includes("# Tegel CLI")||(await f.appendFile(n,t),a.debug("Added Tegel entries to .gitignore")):(await f.writeFile(n,`${t.trim()}\\n`),a.debug("Created .gitignore with Tegel entries"));}catch{a.warn("Could not update .gitignore");}}var S=new Command().name("init").description("Initialize Tegel in your project").option("-p, --prefix <prefix>","component prefix","tds").option("-d, --dir <path>","target directory","./src/components/tegel").option("-f, --force","overwrite existing configuration").option("--skip-prompts","skip interactive prompts and use defaults").action(async n=>{try{a.info("Initializing Tegel configuration...");let t=v.join(process.cwd(),"tegel.config.json");await f.pathExists(t)&&!n.force&&(a.error("Configuration already exists. Use --force to overwrite."),process.exit(1));let r;if(n.skipPrompts)r={prefix:n.prefix,targetDir:n.dir};else {let l=await C([{type:"text",name:"prefix",message:"Component prefix",initial:n.prefix,validate:a=>/^[a-z][a-z0-9-]*$/.test(a)?!0:"Prefix must start with lowercase letter and contain only lowercase letters, numbers, and hyphens"},{type:"text",name:"targetDir",message:"Target directory for components",initial:n.dir},{type:"confirm",name:"createDir",message:(a,b)=>`Create directory ${b.targetDir}?`,initial:!0}]);if(Object.keys(l).length===0&&(a.info("Initialization cancelled"),process.exit(0)),r=l,l.createDir){let a$1=v.resolve(l.targetDir);await f.ensureDir(a$1),a.success(`Created directory: ${a$1}`);}}await a$1.init(process.cwd(),r),await j(),a.newline(),a.success("Tegel initialized successfully!"),a.newline(),a.info("Next steps:"),a.list([`Run ${h.cyan("npx @scania/tegel-cli add <component>")} to add components`,`Example: ${h.cyan("npx @scania/tegel-cli add button dropdown")}`,`Run ${h.cyan("npx @scania/tegel-cli add --help")} for more options`]);}catch(t){a.error("Failed to initialize:",t instanceof Error?t:void 0),process.exit(1);}});var k=new Command().name("add").description("Add Tegel components to your project").argument("[components...]","component names to add").option("-p, --prefix <prefix>","override default prefix").option("-a, --all","add all available components").option("--no-deps","skip dependency installation").option("--dry-run","preview changes without writing files").option("-f, --force","overwrite existing files").action(async(n,t)=>{try{let r=await a$1.load();t.prefix&&(r.prefix=t.prefix);let{resolveTegelSource:l}=await import('./tegel-source-resolver-RSPXN7WC.js'),a$2=await l();if(a.debug(`Using Tegel source from: ${a$2.root}`),a.debug(`Tegel version: ${a$2.version}`),a.debug(`Source type: ${a$2.isLocal?"local development":"bundled"}`),r.version&&R.gt(a$2.version,r.version)){a.newline(),a.warn(`New Tegel version available: ${h.cyan(r.version)} \u2192 ${h.green(a$2.version)}`);let{shouldUpdate:o}=await C({type:"confirm",name:"shouldUpdate",message:"Would you like to update all installed components to the new version?",initial:!0});if(o){a.info("Running update command..."),a.newline();let{updateCommand:i}=await import('./update-RVEUS7XP.js');await i.parseAsync(["update","--all"],{from:"user"});return}}r.version=a$2.version,a.startSpinner("Scanning Tegel components...");let I=await new c(a$2.componentsPath).scanAll(),{allComponents:c$1,topLevelComponents:u}=I;a.stopSpinner(!0,`Found ${c$1.size} components (${u.size} available to add)`),a.startSpinner("Analyzing dependencies...");let x=new b(a$2.componentsPath,c$1);await x.analyzeAll(),a.stopSpinner(!0,"Dependencies analyzed");let p=[];if(t.all)p=Array.from(u.keys());else if(n.length===0){let o=Array.from(u.entries()).map(([s,w])=>({title:`${s} (${w.tag})`,value:s,description:w.metadata.description})),i=await C({type:"multiselect",name:"components",message:"Select components to add",choices:o,hint:"Space to select, Enter to confirm",instructions:!1});(!i.components||i.components.length===0)&&(a.info("No components selected"),process.exit(0)),p=i.components;}else {let o=n.filter(i=>!u.has(i));if(o.length>0){a.error(`Invalid components: ${o.join(", ")}`);let i=o.filter(s=>c$1.has(s));i.length>0&&(a.info("Note: Sub-components cannot be added directly. They will be included automatically with their parent components."),i.forEach(s=>{let w=c$1.get(s);w?.metadata.parentComponent&&a.info(` ${s} \u2192 add '${w.metadata.parentComponent}' instead`);})),a.info("Available components:"),a.list(Array.from(u.keys()).sort()),process.exit(1);}p=n;}let d=new Set;p.forEach(o=>{d.add(o),t.skipDeps||x.getFullDependencyTree(o).forEach(s=>d.add(s));}),a.newline(),a.info(`Will add ${d.size} component(s):`);let D=Array.from(d).map(o=>!p.includes(o)?`${o} ${h.gray("(dependency)")}`:o);if(a.list(D),t.dryRun&&(a.newline(),a.info("Dry run mode - no files will be written"),Array.from(d).forEach(o=>{let i=c$1.get(o);a.newline(),a.info(`Component: ${o}`),a.list([`Tag: ${i.tag} \u2192 ${r.prefix}-${i.tag.replace("tds-","")}`,`Files: ${i.files.component}`,...i.files.styles.map(s=>` ${s}`)]);}),process.exit(0)),!t.force){let{proceed:o}=await C({type:"confirm",name:"proceed",message:"Continue with installation?",initial:!0});o||(a.info("Installation cancelled"),process.exit(0));}a.newline(),a.startSpinner("Installing components...");let{ComponentInstaller:z}=await import('./component-installer-W6T72F6F.js'),m=await z.install({components:Array.from(d),componentMap:c$1,analyzer:x,config:r,tegelSource:a$2,force:t.force,dryRun:!1});if(m.success){a.stopSpinner(!0,`Successfully installed ${m.installedComponents.length} component(s)`),a.newline(),a.success("Installation complete!"),a.info(`Installed to: ${r.targetDir}`),m.copiedFiles.length>0&&(a.newline(),a.info(`Created ${m.copiedFiles.length} files`)),a.newline(),a.info("Usage example:");let o=c$1.get(p[0]);if(o){let i=o.tag.replace("tds",r.prefix);a.code(`<${i}>Example</${i}>`,"html");}}else a.stopSpinner(!1,"Installation failed"),m.errors&&m.errors.forEach(o=>a.error(o)),process.exit(1);}catch(r){a.error("Failed to add components:",r instanceof Error?r:void 0),process.exit(1);}});var J=fileURLToPath(import.meta.url),W=dirname(J),B=JSON.parse(readFileSync(join(W,"..","package.json"),"utf-8")),g=new Command;g.name("tegel-cli").description("CLI tool for copying and transforming Tegel components").version(B.version).option("-v, --verbose","enable verbose logging").option("--no-color","disable colored output").hook("preAction",n=>{n.opts().verbose&&a.setLevel(3);});g.addCommand(S);g.addCommand(k);g.addCommand(d);g.exitOverride();async function _(){try{await g.parseAsync(process.argv);}catch(n){if(n instanceof Error){let t=n;t.code==="commander.executeSubCommandAsync"?process.exit(t.exitCode||0):t.code==="commander.help"||t.code==="commander.version"?process.exit(0):(a.error(n.message||"An unexpected error occurred",n),process.exit(1));}else a.error("An unexpected error occurred",n instanceof Error?n:void 0),process.exit(1);}}_().catch(n=>{a.error("Fatal error:",n instanceof Error?n:void 0),process.exit(1);});//# sourceMappingURL=cli.js.map
//# sourceMappingURL=cli.js.map