crapifyme
Version:
Ultra-fast developer productivity CLI tools - remove comments, logs, and more
305 lines • 10.1 kB
JavaScript
"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/, /^\//]
};
}
createReactConfig() {
return {
name: 'React',
aliases: [
{
pattern: '@/*',
replacement: './src/*',
regex: /^@\/(.*)/
}
],
importExtensions: ['.js', '.jsx', '.ts', '.tsx'],
specialPatterns: [/^react/, /^\//]
};
}
createAngularConfig() {
return {
name: 'Angular',
aliases: [
{
pattern: '@/*',
replacement: './src/*',
regex: /^@\/(.*)/
},
{
pattern: '@environments/*',
replacement: './src/environments/*',
regex: /^\/(.*)/
}
],
importExtensions: ['.js', '.ts'],
specialPatterns: [/^\//, /^rxjs/]
};
}
createNuxtConfig() {
return {
name: 'Nuxt',
aliases: [
{
pattern: '~/*',
replacement: './*',
regex: /^~\/(.*)/
},
{
pattern: '@/*',
replacement: './*',
regex: /^@\/(.*)/
},
{
pattern: '~~/*',
replacement: './*',
regex: /^~~\/(.*)/
},
{
pattern: '@@/*',
replacement: './*',
regex: /^@@\/(.*)/
}
],
importExtensions: ['.js', '.ts', '.vue'],
specialPatterns: [/^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