@scania/tegel-cli
Version:
CLI tool for copying and transforming Tegel components with custom prefixes
4 lines • 22.4 kB
JavaScript
import {a}from'./chunk-HFCPHFYJ.js';import c from'path';import u from'fs-extra';import O from'prompts';var P=class w{context;rules=[];constructor(r){this.context=r,this.initializeRules();}initializeRules(){let{config:r}=this.context,t="tds",s=r.prefix;if(this.rules=[{pattern:new RegExp(`from\\s+['"]@/lib/tegel/([^'"]+)['"]`,"g"),replacement:(i,e)=>{let o=r.targetDir.replace(/^\.\//,"");return e.startsWith("types/")?`from '@/${o}/types/${e.replace("types/","")}'`:e.startsWith("utils/")?`from '@/${o}/utils/${e.replace("utils/","")}'`:e.startsWith("mixins/")?`from '@/${o}/mixins/${e.replace("mixins/","")}'`:e.startsWith("components/")?`from '@/${o}/${e.replace("components/","")}'`:`from '@/${o}/${e}'`},description:"Convert absolute Tegel imports to project paths",priority:1},{pattern:new RegExp(`import\\s+type\\s+{[^}]+}\\s+from\\s+['"]@/lib/tegel/([^'"]+)['"]`,"g"),replacement:(i,e)=>{let o=r.targetDir.replace(/^\.\//,""),n=i.match(/import\s+type\s+({[^}]+})\s+from/);if(!n)return i;let a=n[1];return e.startsWith("types/")?`import type ${a} from '@/${o}/types/${e.replace("types/","")}'`:`import type ${a} from '@/${o}/${e}'`},description:"Convert type-only Tegel imports to project paths",priority:1},{pattern:new RegExp(`from\\s+['"]\\.\\./\\.\\./utils/([^'"]+)['"]`,"g"),replacement:(i,e)=>{let o=r.aliases["@tegel/utils"];return o?`from '${o}/${e}'`:`from '@/${r.targetDir.replace(/^\.\//,"")}/utils/${e}'`},description:"Convert relative utility imports to aliased paths",priority:2},{pattern:new RegExp(`from\\s+['"]\\.\\./\\.\\./types/([^'"]+)['"]`,"g"),replacement:(i,e)=>{let o=r.aliases["@tegel/types"];return o?`from '${o}/${e}'`:`from '@/${r.targetDir.replace(/^\.\//,"")}/types/${e}'`},description:"Convert relative type imports to aliased paths",priority:2},{pattern:new RegExp(`from\\s+['"]\\.\\./\\.\\./mixins/([^'"]+)['"]`,"g"),replacement:(i,e)=>{let o=r.aliases["@tegel/mixins"];return o?`from '${o}/${e}'`:`from '@/${r.targetDir.replace(/^\.\//,"")}/mixins/${e}'`},description:"Convert relative mixin imports to aliased paths",priority:2}],t!==s&&this.rules.push({pattern:new RegExp(`tag:\\s*['"]${t}-([^'"]+)['"]`,"g"),replacement:`tag: '${s}-$1'`,description:"Transform StencilJS component tag definitions",priority:3},{pattern:new RegExp(`querySelector(All)?\\s*\\(\\s*['"]${t}-([^'"]+)['"]`,"g"),replacement:`querySelector$1('${s}-$2'`,description:"Transform querySelector calls",priority:4},{pattern:new RegExp(`getElementsByTagName\\s*\\(\\s*['"]${t}-([^'"]+)['"]`,"g"),replacement:`getElementsByTagName('${s}-$1'`,description:"Transform getElementsByTagName calls",priority:4},{pattern:new RegExp(`closest\\s*\\(\\s*['"]${t}-([^'"]+)['"]`,"g"),replacement:`closest('${s}-$1'`,description:"Transform closest() calls",priority:4},{pattern:new RegExp(`tagName\\.toLowerCase\\(\\)\\s*===\\s*['"]${t}-([^'"]+)['"]`,"g"),replacement:`tagName.toLowerCase() === '${s}-$1'`,description:"Transform tag name comparisons",priority:4},{pattern:new RegExp(`<(${t}-[a-z-]+)`,"g"),replacement:(i,e)=>`<${e.replace(t,s)}`,description:"Transform JSX/TSX opening tags",priority:5},{pattern:new RegExp(`</(${t}-[a-z-]+)>`,"g"),replacement:(i,e)=>`</${e.replace(t,s)}>`,description:"Transform JSX/TSX closing tags",priority:5},{pattern:new RegExp(`HTML${w.toPascalCase(t)}([A-Z][a-zA-Z]+)Element`,"g"),replacement:`HTML${w.toPascalCase(s)}$1Element`,description:"Transform HTML element type definitions",priority:6},{pattern:new RegExp(`['"]${t}-([a-z-]+)['"]`,"g"),replacement:(i,e)=>w.isLikelyComponentName(e)?i.replace(t,s):i,description:"Transform component name string literals",priority:10}),r.transforms.customRules){let i=r.transforms.customRules.filter(e=>e.fileTypes?e.fileTypes.some(o=>["ts","tsx","js","jsx"].includes(o)):true);this.rules.push(...i);}this.rules.sort((i,e)=>(i.priority||999)-(e.priority||999));}transform(r,t){a.debug(`Transforming TypeScript file: ${t}`);let s=r,i=[];return this.rules.forEach(e=>{let o=s;e.replacement,s=s.replace(e.pattern,e.replacement),o!==s&&e.description&&i.push(e.description);}),i.length>0&&a.debug(`Applied transformations: ${i.join(", ")}`),s}static toPascalCase(r){return r.split("-").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}static isLikelyComponentName(r){return ["accordion","accordion-item","badge","banner","block","button","card","checkbox","chip","datetime","divider","dropdown","dropdown-option","footer","header","icon","link","message","modal","popover","radio-button","slider","spinner","stepper","step","table","table-header","table-body","table-footer","table-row","tabs","tag","textarea","text-field","toast","toggle","tooltip","side-menu","inline-tabs","navigation-tabs","folder-tabs"].some(s=>r.startsWith(s))}preview(r){let t=[];return this.rules.forEach(s=>{let i=r.match(s.pattern);i&&i.length>0&&t.push(`${s.description}: ${i.length} occurrence(s)`);}),t}};var S=class{context;rules=[];currentFilePath="";constructor(r){this.context=r,this.initializeRules();}initializeRules(){let{config:r}=this.context,t="tds",s=r.prefix;if(this.rules=[{pattern:new RegExp(`@import\\s+['"]@/lib/tegel/([^'"]+)['"](?:\\s+as\\s+[^;]+)?`,"g"),replacement:(i,e)=>{let o=this.calculateRelativePath(e),n=i.match(/(\s+as\s+[^;]+)$/),a=n?n[1]:"";return `@import '${o}'${a}`},description:"Convert absolute Tegel imports to relative paths",priority:1},{pattern:new RegExp(`@use\\s+['"]@/lib/tegel/([^'"]+)['"](?:\\s+as\\s+[^;]+)?`,"g"),replacement:(i,e)=>{let o=this.calculateRelativePath(e),n=i.match(/(\s+as\s+[^;]+)$/),a=n?n[1]:"";return `@use '${o}'${a}`},description:"Convert absolute Tegel @use to relative paths",priority:1},{pattern:new RegExp(`@forward\\s+['"]@/lib/tegel/([^'"]+)['"](?:\\s+(?:as\\s+[^;]+|hide\\s+[^;]+|show\\s+[^;]+))?`,"g"),replacement:(i,e)=>{let o=this.calculateRelativePath(e),n=i.match(/(\s+(?:as|hide|show)\s+[^;]+)$/),a=n?n[1]:"";return `@forward '${o}'${a}`},description:"Convert absolute Tegel @forward to relative paths",priority:1}],t!==s&&this.rules.push({pattern:new RegExp(`(?<![-\\.%@])(?<!@mixin\\s+)(?<!@keyframes\\s+)${t}-([a-z-]+)(?=[\\s\\[\\{\\,\\:\\)\\>\\+\\~]|$)`,"g"),replacement:`${s}-$1`,description:"Transform component tag prefixes in selectors",priority:2},{pattern:new RegExp(`\\[([^\\]]*?)${t}-([a-z-]+)([^\\]]*?)\\]`,"g"),replacement:`[$1${s}-$2$3]`,description:"Transform component tag prefixes in attribute selectors",priority:3}),r.transforms.customRules){let i=r.transforms.customRules.filter(e=>e.fileTypes?.includes("scss")??true);this.rules.push(...i);}this.rules.sort((i,e)=>(i.priority||999)-(e.priority||999));}transform(r,t){a.debug(`Transforming SCSS file: ${t}`),this.currentFilePath=t;let s=r,i=[];for(let e of this.rules){let o=s;e.replacement,s=s.replace(e.pattern,e.replacement),o!==s&&e.description&&i.push(e.description);}return i.length>0&&a.debug(`Applied transformations: ${i.join(", ")}`),this.context.config.prefix!=="tds"&&(s=this.addTransformationComment(s)),s}addTransformationComment(r){let t=`/* Transformed by Tegel CLI - prefix: ${this.context.config.prefix} */
`;return r.includes("Transformed by Tegel CLI")?r:t+r}preview(r){let t=[];for(let s of this.rules){let i=r.match(s.pattern);i&&i.length>0&&t.push(`${s.description}: ${i.length} occurrence(s)`);}return t}calculateRelativePath(r){let t;r.startsWith("mixins/")?t=c.join("mixins",r.replace("mixins/","")):r.startsWith("utils/")?t=c.join("utils",r.replace("utils/","")):r.startsWith("types/")?t=c.join("types",r.replace("types/","")):r.startsWith("components/")?t=r.replace("components/",""):t=r;let s=this.context.config.targetDir.replace(/^\.\//,""),i=c.relative(s,this.currentFilePath),e=c.dirname(i),o=e==="."?"":e,n=t,p=c.relative(o,n).split(c.sep).join("/");return p.startsWith(".")?p:`./${p}`}validateTransformation(r){let t=[],s=(r.match(/{/g)||[]).length,i=(r.match(/}/g)||[]).length;s!==i&&t.push(`Mismatched braces: ${s} open, ${i} close`);let e=(r.match(/\(/g)||[]).length,o=(r.match(/\)/g)||[]).length;e!==o&&t.push(`Mismatched parentheses: ${e} open, ${o} close`);let n=(r.match(/'/g)||[]).length,a=(r.match(/"/g)||[]).length;return n%2!==0&&t.push("Unclosed single quote detected"),a%2!==0&&t.push("Unclosed double quote detected"),{valid:t.length===0,errors:t.length>0?t:void 0}}};var F=class{context;tsTransformer;scssTransformer;constructor(r){this.context=r,this.tsTransformer=new P(r),this.scssTransformer=new S(r);}async transformFile(r,t,s){let i=c.extname(t).toLowerCase(),e=[],o=r;try{switch(i){case ".ts":case ".tsx":case ".js":case ".jsx":o=this.tsTransformer.transform(r,t);break;case ".scss":case ".sass":{o=this.scssTransformer.transform(r,t);let n=this.scssTransformer.validateTransformation(o);!n.valid&&n.errors&&n.errors.forEach(a=>{e.push({file:s,message:a,code:"SCSS_VALIDATION_ERROR"});});break}case ".css":o=this.transformCss(r,t);break;default:a.debug(`No transformation for file type: ${i}`);}o=this.updateImportPaths(o,t,s);}catch(n){e.push({file:s,message:n instanceof Error?n.message:"Unknown transformation error",code:"TRANSFORMATION_ERROR"});}return {content:o,errors:e.length>0?e:void 0}}transformCss(r,t){a.debug(`Transforming CSS file: ${t}`);let s="tds",i=this.context.config.prefix;if(s===i)return r;let e=r;return e=e.replace(new RegExp(`@import\\s+['"]@/lib/tegel/([^'"]+)['"]`,"g"),(o,n)=>`@import '${this.calculateRelativePath(t,n)}'`),e=e.replace(new RegExp(`(?<![-\\.])${s}-([a-z-]+)(?=[\\s\\[\\{\\,\\:\\)\\>\\+\\~]|$)`,"g"),`${i}-$1`),e=e.replace(new RegExp(`\\[([^\\]]*?)${s}-([a-z-]+)([^\\]]*?)\\]`,"g"),`[$1${i}-$2$3]`),e}updateImportPaths(r,t,s){let i=c.dirname(t),e=c.dirname(s),o=i.split(c.sep).length,n=e.split(c.sep).length;if(o===n)return r;let a=n-o,p=r;if(a>0){let g="../".repeat(a);p=p.replace(/from\s+['"](\.\.[^'"]+)['"]/g,($,h)=>`from '${g}${h}'`);}else if(a<0){let g=Math.abs(a);p=p.replace(/from\s+['"](\.\.[^'"]+)['"]/g,($,h)=>(h.match(/\.\.\//g)||[]).length>g?`from '${h.replace(new RegExp(`(\\.\\./){${g}}`),"")}'`:$);}return p}previewFile(r,t){switch(c.extname(t).toLowerCase()){case ".ts":case ".tsx":case ".js":case ".jsx":return this.tsTransformer.preview(r);case ".scss":case ".sass":return this.scssTransformer.preview(r);case ".css":return ["CSS class and selector transformations"];default:return []}}async transformFiles(r){let t=[],s=[],i=[];for(let e of r){let o=await this.transformFile(e.content,e.sourcePath,e.targetPath);o.errors&&s.push(...o.errors),t.push(e.targetPath),this.previewFile(e.content,e.sourcePath).length===0&&this.shouldTransform(e.sourcePath)&&i.push(`No transformations found for ${c.basename(e.sourcePath)}`);}return {success:s.length===0,transformedFiles:t,errors:s.length>0?s:void 0,warnings:i.length>0?i:void 0}}shouldTransform(r){let t=c.extname(r).toLowerCase();return [".ts",".tsx",".js",".jsx",".scss",".sass",".css"].includes(t)}calculateRelativePath(r,t){let s;t.startsWith("mixins/")?s=c.join("mixins",t.replace("mixins/","")):t.startsWith("utils/")?s=c.join("utils",t.replace("utils/","")):t.startsWith("types/")?s=c.join("types",t.replace("types/","")):t.startsWith("components/")?s=t.replace("components/",""):s=t;let i=this.context.config.targetDir.replace(/^\.\//,""),e=c.relative(i,r),o=c.dirname(e),n=o==="."?"":o,a=s,g=c.relative(n,a).split(c.sep).join("/");return g.startsWith(".")?g:`./${g}`}};var j=class{constructor(r,t,s={}){this.context=r;this.tegelSource=t;this.options=s;this.transformationEngine=new F(r);}transformationEngine;copiedFiles=new Set;actualCopiedFiles=new Set;overrideDecisions=new Map;filesToCheck=new Map;getActualCopiedFiles(){return Array.from(this.actualCopiedFiles)}async collectExistingFiles(r,t){if(this.filesToCheck.clear(),await Promise.all(r.map(async s=>{let i=c.join(this.context.sourceRoot,s.files.component),e=this.getTargetPath(s.files.component);await u.pathExists(e)&&this.filesToCheck.set(e,i),await Promise.all(s.files.styles.map(async o=>{let n=c.join(this.context.sourceRoot,o),a=this.getTargetPath(o);await u.pathExists(a)&&this.filesToCheck.set(a,n);})),s.files.types&&await Promise.all(s.files.types.map(async o=>{let n=c.join(this.context.sourceRoot,o),a=this.getTargetPath(o);await u.pathExists(a)&&this.filesToCheck.set(a,n);})),this.context.config.includeTests&&s.files.tests&&await Promise.all(s.files.tests.map(async o=>{let n=c.join(this.context.sourceRoot,o),a=this.getTargetPath(o);await u.pathExists(a)&&this.filesToCheck.set(a,n);}));})),t&&(t.utilities&&await Promise.all(Array.from(t.utilities).map(async s=>{let i=c.join(this.context.targetRoot,"utils",`${s}.ts`);if(await u.pathExists(i)){let e=c.join(this.tegelSource.utilsPath,`${s}.ts`);this.filesToCheck.set(i,e);}})),t.mixins&&await Promise.all(Array.from(t.mixins).map(async s=>{let i=c.join(this.context.targetRoot,"mixins",`_${s}.scss`);if(await u.pathExists(i)){let e=c.join(this.tegelSource.mixinsPath,`_${s}.scss`);this.filesToCheck.set(i,e);}})),t.assets&&await Promise.all(Array.from(t.assets).map(async([s,i])=>{let e=c.dirname(this.getTargetPath(i)),o=c.join(e,`${s}.js`);if(await u.pathExists(o)){let n=c.dirname(c.join(this.context.sourceRoot,i)),a=c.join(n,`${s}.js`);this.filesToCheck.set(o,a);}})),t.types?.has("icons"))){let s=c.join(this.context.targetRoot,"types","icons.ts");if(await u.pathExists(s)){let i=c.join(this.tegelSource.typesPath,"icons.ts");this.filesToCheck.set(s,i);}}}async promptForOverrides(){if(this.filesToCheck.size===0||this.options.force||this.options.update||this.options.skipPrompts)return;let r=Array.from(this.filesToCheck.keys()).map(s=>({title:c.relative(this.context.targetRoot,s),value:s,selected:false}));a.newline(),a.warn(`Found ${r.length} existing file(s)`);let t=await O({type:"multiselect",name:"filesToOverride",message:"Select files to override (Space to select, Enter to confirm, a to toggle all)",choices:r,hint:"Use arrow keys to navigate, Space to toggle selection",instructions:false});t.filesToOverride||(a.info("Operation cancelled by user"),process.exit(0)),Array.from(this.filesToCheck.keys()).forEach(s=>{this.overrideDecisions.set(s,t.filesToOverride.includes(s));});}async copyComponent(r){let t=[],s=[];try{let i=c.join(this.context.sourceRoot,r.files.component),e=this.getTargetPath(r.files.component);await this.copyAndTransform(i,e)&&s.push(e);for(let n of r.files.styles){let a=c.join(this.context.sourceRoot,n),p=this.getTargetPath(n);await this.copyAndTransform(a,p)&&s.push(p);}if(r.files.types)for(let n of r.files.types){let a=c.join(this.context.sourceRoot,n),p=this.getTargetPath(n);await this.copyAndTransform(a,p)&&s.push(p);}if(this.context.config.includeTests&&r.files.tests)for(let n of r.files.tests){let a=c.join(this.context.sourceRoot,n),p=this.getTargetPath(n);await this.copyAndTransform(a,p)&&s.push(p);}return {success:!0,copiedFiles:s}}catch(i){return t.push(`Failed to copy component ${r.name}: ${i instanceof Error?i.message:String(i)}`),{success:false,copiedFiles:s,errors:t}}}async copyUtility(r,t){let s=c.join(this.tegelSource.utilsPath,t),i=c.join(this.context.targetRoot,"utils",t);if(this.copiedFiles.has(i))return false;let e=await this.copyAndTransform(s,i);return e&&this.copiedFiles.add(i),e}async copyMixin(r,t){let s=c.join(this.tegelSource.mixinsPath,t),i=c.join(this.context.targetRoot,"mixins",t);if(this.copiedFiles.has(i))return false;let e=await this.copyAndTransform(s,i);return e&&this.copiedFiles.add(i),e}async copyGlobalStyles(){let r=["global.scss","global-vars.scss","scania.scss","scania-vars.scss"],t=0;for(let s of r){let i=c.join(this.tegelSource.globalPath,s),e=c.join(this.context.targetRoot,"global",s);await u.pathExists(i)&&await this.copyAndTransform(i,e)&&(this.copiedFiles.add(e),t+=1);}return t}async copyIconTypes(){let r=c.join(this.tegelSource.typesPath,"icons.ts"),t=c.join(this.context.targetRoot,"types","icons.ts");if(await u.pathExists(r)){let s=await u.readFile(r,"utf-8"),i=this.extractTypeImports(s);for(let o of i){let n=c.join(this.tegelSource.typesPath,`${o}.ts`),a$1=c.join(this.context.targetRoot,"types",`${o}.ts`);await u.pathExists(n)&&!this.copiedFiles.has(a$1)&&await this.copyAndTransform(n,a$1)&&(this.copiedFiles.add(a$1),a.debug(`Copied type dependency: ${o}.ts`));}let e=await this.copyAndTransform(r,t);return e&&this.copiedFiles.add(t),e}return false}extractTypeImports(r){let t=[],s=/import\s+(?:type\s+)?{[^}]+}\s+from\s+['"]\.\/([^'"]+)['"]/g,i;for(;(i=s.exec(r))!==null;)t.push(i[1]);return t}async copyAsset(r,t){let s=c.dirname(c.join(this.context.sourceRoot,t)),i=c.join(s,`${r}.js`),e=c.dirname(this.getTargetPath(t)),o=c.join(e,`${r}.js`);return this.copiedFiles.has(o)?false:await u.pathExists(i)?await u.pathExists(o)&&!await this.shouldOverrideFile(o)?(a.debug(`Skipped asset: ${r}.js (user declined override)`),false):(await u.ensureDir(c.dirname(o)),await u.copyFile(i,o),this.copiedFiles.add(o),this.actualCopiedFiles.add(o),a.debug(`Copied asset: ${r}.js`),true):(a.warn(`Asset file not found: ${i}`),false)}async copyAndTransform(r,t){if(await u.pathExists(t)&&!await this.shouldOverrideFile(t))return a.debug(`Skipped: ${c.basename(t)} (user declined override)`),false;await u.ensureDir(c.dirname(t));let s=await u.readFile(r,"utf-8"),i=this.applyImportAliases(s),{content:e,errors:o}=await this.transformationEngine.transformFile(i,t,t);return o&&o.length>0&&o.forEach(n=>{a.warn(`Transformation warning in ${n.file}: ${n.message}`);}),await u.writeFile(t,e,"utf-8"),this.actualCopiedFiles.add(t),a.debug(`Copied and transformed: ${c.basename(r)} \u2192 ${c.basename(t)}`),true}async shouldOverrideFile(r){return this.options.force||this.options.update?true:this.options.skipPrompts?false:this.overrideDecisions.has(r)?this.overrideDecisions.get(r):(a.debug(`No override decision found for ${r}, skipping`),false)}applyImportAliases(r){let t=r;return t=t.replace(/from\s+['"](\.\.\/)+utils\/([^'"]+)['"]/g,"from '@/lib/tegel/utils/$2'"),t=t.replace(/from\s+['"](\.\.\/)+components\/([^'"]+)['"]/g,"from '@/lib/tegel/components/$2'"),t=t.replace(/from\s+['"](\.\.\/)+mixins\/([^'"]+)['"]/g,"from '@/lib/tegel/mixins/$2'"),t=t.replace(/from\s+['"](\.\.\/)+types\/([^'"]+)['"]/g,"from '@/lib/tegel/types/$2'"),t=t.replace(/from\s+['"](\.\.\/)+global\/([^'"]+)['"]/g,"from '@/lib/tegel/global/$2'"),t=t.replace(/@import\s+['"](\.\.\/)+mixins\/([^'"]+)['"]/g,"@import '@/lib/tegel/mixins/$2'"),t=t.replace(/@import\s+['"](\.\.\/)+global\/([^'"]+)['"]/g,"@import '@/lib/tegel/global/$2'"),t=t.replace(/@use\s+['"](\.\.\/)+mixins\/([^'"]+)['"]/g,"@use '@/lib/tegel/mixins/$2'"),t=t.replace(/@use\s+['"](\.\.\/)+global\/([^'"]+)['"]/g,"@use '@/lib/tegel/global/$2'"),t}getTargetPath(r){return c.join(this.context.targetRoot,r)}};var I=class w{static async install(r){let{components:t,componentMap:s,analyzer:i,config:e,tegelSource:o,force:n=false,dryRun:a$1=false}=r,p=[],g=[],$={config:e,component:null,sourceRoot:o.componentsPath,targetRoot:c.resolve(e.targetDir)},h=new j($,o,{force:n,update:r.update,skipPrompts:a$1});try{a$1||await u.ensureDir($.targetRoot);let C=t.map(l=>s.get(l)).filter(l=>l!==void 0),v=new Set,b=new Set,R=new Set,E=new Map;for(let l of t){let m=s.get(l);if(!m)continue;let d=i.getAllUtilities(l),A=i.getAllMixins(l),D=i.getAllTypes(l),k=m.dependencies.assets||[];d.forEach(y=>v.add(y)),A.forEach(y=>b.add(y)),D.forEach(y=>R.add(y)),k.forEach(y=>E.set(y,m.files.component));}!a$1&&!n&&!r.update&&(await h.collectExistingFiles(C,{utilities:v,mixins:b,types:R,assets:E}),await h.promptForOverrides());for(let l of t){let m=s.get(l);if(!m){p.push(`Component not found: ${l}`);continue}if(a.info(`Installing ${l}...`),$.component=m,a$1)a.info(`Would copy component: ${l}`),a.list([`Main: ${m.files.component}`,...m.files.styles.map(d=>`Style: ${d}`)]);else {let d=await h.copyComponent(m);d.success&&d.copiedFiles.length>0?g.push(l):d.errors?p.push(...d.errors):d.copiedFiles.length===0&&a.debug(`No files were copied for ${l} (user declined all overrides)`);}}if(!a$1&&g.length>0){v.clear(),b.clear(),R.clear(),E.clear();for(let l of g){let m=s.get(l);if(!m)continue;let d=i.getAllUtilities(l),A=i.getAllMixins(l),D=i.getAllTypes(l),k=m.dependencies.assets||[];d.forEach(y=>v.add(y)),A.forEach(y=>b.add(y)),D.forEach(y=>R.add(y)),k.forEach(y=>E.set(y,m.files.component));}for(let l of v){a.debug(`Copying utility: ${l}`);try{await h.copyUtility(l,`${l}.ts`);}catch(m){a.warn(`Failed to copy utility ${l}: ${m instanceof Error?m.message:String(m)}`);}}for(let l of b){a.debug(`Copying mixin: ${l}`);try{await h.copyMixin(l,`_${l}.scss`);}catch(m){a.warn(`Failed to copy mixin ${l}: ${m instanceof Error?m.message:String(m)}`);}}for(let[l,m]of E){a.debug(`Copying asset: ${l}`);try{await h.copyAsset(l,m);}catch(d){a.warn(`Failed to copy asset ${l}: ${d instanceof Error?d.message:String(d)}`);}}if(R.has("icons")){a.debug("Copying icon types...");try{await h.copyIconTypes();}catch(l){a.warn(`Failed to copy icon types: ${l instanceof Error?l.message:String(l)}`);}}if(g.length>0&&!await w.hasExistingComponents($.targetRoot)){a.debug("Copying global styles...");let m=await h.copyGlobalStyles();a.debug(`Copied ${m} global style files`);}}let z=h.getActualCopiedFiles();return {success:p.length===0,installedComponents:g,copiedFiles:z,errors:p.length>0?p:void 0}}catch(C){return p.push(`Installation failed: ${C instanceof Error?C.message:String(C)}`),{success:false,installedComponents:g,copiedFiles:h.getActualCopiedFiles(),errors:p}}}static async hasExistingComponents(r){try{return (await u.readdir(r)).some(s=>!s.startsWith("_")&&!s.startsWith("."))}catch{return false}}static async generateInstallSummary(r){let{components:t,componentMap:s,analyzer:i}=r,e=[];e.push("Installation Summary:"),e.push(""),e.push("Components to install:");for(let n of t){let a=s.get(n);if(a){e.push(` - ${n} (${a.tag})`);let p=i.getFullDependencyTree(n),g=i.getAllUtilities(n),$=i.getAllMixins(n),h=i.getAllTypes(n);p.size>0&&e.push(` Component deps: ${Array.from(p).join(", ")}`),g.size>0&&e.push(` Utilities: ${Array.from(g).join(", ")}`),$.size>0&&e.push(` Mixins: ${Array.from($).join(", ")}`),h.size>0&&e.push(` Types: ${Array.from(h).join(", ")}`);}}let o=t.reduce((n,a)=>{let p=s.get(a);if(p){let g=1+p.files.styles.length;return p.files.types&&(g+=p.files.types.length),n+g}return n},0);return e.push(""),e.push(`Total files to copy: ~${o}`),e}};
export{I as ComponentInstaller};//# sourceMappingURL=component-installer-W6T72F6F.js.map
//# sourceMappingURL=component-installer-W6T72F6F.js.map