UNPKG

crapifyme

Version:

Ultra-fast developer productivity CLI tools - remove comments, logs, and more

305 lines 10.1 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.FrameworkDetector = void 0; const fs_1 = __importDefault(require("fs")); const path_1 = __importDefault(require("path")); class FrameworkDetector { constructor(projectRoot = process.cwd()) { this.projectRoot = projectRoot; } detectFramework() { const frameworks = [ this.detectNextJs(), this.detectVite(), this.detectSvelte(), this.detectVue(), this.detectReact(), this.detectAngular(), this.detectNuxt() ]; return frameworks.find(f => f !== null) || null; } getFrameworkByName(name) { const normalizedName = name.toLowerCase(); switch (normalizedName) { case 'nextjs': case 'next': return this.createNextJsConfig(); case 'vite': return this.createViteConfig(); case 'svelte': case 'sveltekit': return this.createSvelteConfig(); case 'vue': case 'vuejs': return this.createVueConfig(); case 'react': return this.createReactConfig(); case 'angular': return this.createAngularConfig(); case 'nuxt': return this.createNuxtConfig(); default: return null; } } detectNextJs() { const indicators = ['next.config.js', 'next.config.ts', 'next.config.mjs']; if (this.hasAnyFile(indicators) || this.hasDependency('next')) { return this.createNextJsConfig(); } return null; } detectVite() { const indicators = ['vite.config.js', 'vite.config.ts', 'vite.config.mjs']; if (this.hasAnyFile(indicators) || this.hasDependency('vite')) { return this.createViteConfig(); } return null; } detectSvelte() { const indicators = ['svelte.config.js', 'svelte.config.ts']; if (this.hasAnyFile(indicators) || this.hasDependency('svelte') || this.hasDependency('@sveltejs/kit')) { return this.createSvelteConfig(); } return null; } detectVue() { const indicators = ['vue.config.js', 'vue.config.ts']; if (this.hasAnyFile(indicators) || this.hasDependency('vue') || this.hasDependency('@vue/cli-service')) { return this.createVueConfig(); } return null; } detectReact() { if (this.hasDependency('react') || this.hasDependency('create-react-app')) { return this.createReactConfig(); } return null; } detectAngular() { const indicators = ['angular.json', 'angular-cli.json']; if (this.hasAnyFile(indicators) || this.hasDependency('@angular/core')) { return this.createAngularConfig(); } return null; } detectNuxt() { const indicators = ['nuxt.config.js', 'nuxt.config.ts']; if (this.hasAnyFile(indicators) || this.hasDependency('nuxt')) { return this.createNuxtConfig(); } return null; } createNextJsConfig() { const aliases = [ { pattern: '@/*', replacement: './src/*', regex: /^@\/(.*)/ }, { pattern: '~/*', replacement: './*', regex: /^~\/(.*)/ } ]; const nextConfigPath = this.findNextConfig(); if (nextConfigPath) { const customAliases = this.parseNextConfig(nextConfigPath); aliases.push(...customAliases); } return { name: 'Next.js', aliases, importExtensions: ['.js', '.jsx', '.ts', '.tsx'], specialPatterns: [/^next\//, /^react/, /^@next\//] }; } createViteConfig() { const aliases = [ { pattern: '@/*', replacement: './src/*', regex: /^@\/(.*)/ }, { pattern: '~/*', replacement: './*', regex: /^~\/(.*)/ } ]; return { name: 'Vite', aliases, importExtensions: ['.js', '.jsx', '.ts', '.tsx', '.vue'], specialPatterns: [/^vite/, /^\?/, /^virtual:/] }; } createSvelteConfig() { return { name: 'Svelte', aliases: [ { pattern: '$lib/*', replacement: './src/lib/*', regex: /^\$lib\/(.*)/ }, { pattern: '$app/*', replacement: '@sveltejs/kit/app/*', regex: /^\$app\/(.*)/ } ], importExtensions: ['.js', '.ts', '.svelte'], specialPatterns: [/^svelte/, /^\$lib/, /^\$app/, /^\$env/] }; } createVueConfig() { return { name: 'Vue', aliases: [ { pattern: '@/*', replacement: './src/*', regex: /^@\/(.*)/ } ], importExtensions: ['.js', '.ts', '.vue'], specialPatterns: [/^vue/, /^@vue\//] }; } createReactConfig() { return { name: 'React', aliases: [ { pattern: '@/*', replacement: './src/*', regex: /^@\/(.*)/ } ], importExtensions: ['.js', '.jsx', '.ts', '.tsx'], specialPatterns: [/^react/, /^@react\//] }; } createAngularConfig() { return { name: 'Angular', aliases: [ { pattern: '@/*', replacement: './src/*', regex: /^@\/(.*)/ }, { pattern: '@environments/*', replacement: './src/environments/*', regex: /^@environments\/(.*)/ } ], importExtensions: ['.js', '.ts'], specialPatterns: [/^@angular\//, /^rxjs/] }; } createNuxtConfig() { return { name: 'Nuxt', aliases: [ { pattern: '~/*', replacement: './*', regex: /^~\/(.*)/ }, { pattern: '@/*', replacement: './*', regex: /^@\/(.*)/ }, { pattern: '~~/*', replacement: './*', regex: /^~~\/(.*)/ }, { pattern: '@@/*', replacement: './*', regex: /^@@\/(.*)/ } ], importExtensions: ['.js', '.ts', '.vue'], specialPatterns: [/^nuxt/, /^@nuxt\//, /^vue/] }; } hasAnyFile(filenames) { return filenames.some(filename => fs_1.default.existsSync(path_1.default.join(this.projectRoot, filename))); } hasDependency(packageName) { const packageJson = this.getPackageJson(); if (!packageJson) return false; return !!(packageJson.dependencies?.[packageName] || packageJson.devDependencies?.[packageName] || packageJson.peerDependencies?.[packageName]); } getPackageJson() { if (this.packageJsonCache) { return this.packageJsonCache; } const packageJsonPath = path_1.default.join(this.projectRoot, 'package.json'); if (fs_1.default.existsSync(packageJsonPath)) { try { this.packageJsonCache = JSON.parse(fs_1.default.readFileSync(packageJsonPath, 'utf-8')); return this.packageJsonCache; } catch (error) { console.warn(`Warning: Could not parse package.json: ${error.message}`); } } return null; } findNextConfig() { const possibleConfigs = ['next.config.js', 'next.config.ts', 'next.config.mjs']; for (const config of possibleConfigs) { const configPath = path_1.default.join(this.projectRoot, config); if (fs_1.default.existsSync(configPath)) { return configPath; } } return null; } parseNextConfig(configPath) { const aliases = []; try { const configContent = fs_1.default.readFileSync(configPath, 'utf-8'); const aliasMatches = configContent.match(/resolve:\s*{[\s\S]*?alias:\s*{([\s\S]*?)}/); if (aliasMatches && aliasMatches[1]) { const aliasContent = aliasMatches[1]; const aliasLines = aliasContent.split(','); for (const line of aliasLines) { const match = line.match(/['"`]([^'"`]+)['"`]\s*:\s*['"`]([^'"`]+)['"`]/); if (match) { aliases.push({ pattern: match[1], replacement: match[2], regex: new RegExp(`^${match[1].replace(/[.*+?^${}()|[\]\\]/g, '\\$&').replace(/\\\*/g, '(.*)')}`) }); } } } } catch (error) { console.warn(`Warning: Could not parse Next.js config: ${error.message}`); } return aliases; } } exports.FrameworkDetector = FrameworkDetector; //# sourceMappingURL=framework-detector.js.map