@incidental/project-templates
Version:
Claude Code template library for JavaScript projects with framework auto-detection
126 lines (103 loc) • 3.02 kB
JavaScript
import { readPackageJson, fileExists } from '../utils/file-ops.js';
import { CONFIG } from '../utils/config.js';
import path from 'path';
/**
* Detect if Next.js is being used
*/
export async function detectNextJS() {
const packageJson = await readPackageJson();
if (!packageJson) {
return false;
}
// Check for Next.js in dependencies
const hasNextDependency =
(packageJson.dependencies && packageJson.dependencies.next) ||
(packageJson.devDependencies && packageJson.devDependencies.next);
if (hasNextDependency) {
return true;
}
// Check for Next.js config files
for (const indicator of CONFIG.FRAMEWORK_INDICATORS.nextjs) {
const filePath = path.join(CONFIG.TARGET_DIR, indicator);
if (await fileExists(filePath)) {
return true;
}
}
return false;
}
/**
* Detect if React is being used (without Next.js)
*/
export async function detectReact() {
const packageJson = await readPackageJson();
if (!packageJson) {
return false;
}
// Check for React in dependencies (but not Next.js)
const hasReactDependency =
(packageJson.dependencies && packageJson.dependencies.react) ||
(packageJson.devDependencies && packageJson.devDependencies.react);
const hasNextDependency =
(packageJson.dependencies && packageJson.dependencies.next) ||
(packageJson.devDependencies && packageJson.devDependencies.next);
if (hasReactDependency && !hasNextDependency) {
// Check for React-specific files
for (const indicator of CONFIG.FRAMEWORK_INDICATORS.react) {
const filePath = path.join(CONFIG.TARGET_DIR, indicator);
if (await fileExists(filePath)) {
return true;
}
}
// If has React dependency, assume it's a React project even without specific files
return true;
}
return false;
}
/**
* Detect vanilla JavaScript (no framework)
*/
export async function detectVanilla() {
const packageJson = await readPackageJson();
// If no package.json, it's vanilla
if (!packageJson) {
return true;
}
// If no React, Next.js, or other major frameworks, it's vanilla
const hasFramework =
(packageJson.dependencies && (
packageJson.dependencies.react ||
packageJson.dependencies.next ||
packageJson.dependencies.vue ||
packageJson.dependencies.angular
)) ||
(packageJson.devDependencies && (
packageJson.devDependencies.react ||
packageJson.devDependencies.next ||
packageJson.devDependencies.vue ||
packageJson.devDependencies.angular
));
return !hasFramework;
}
/**
* Auto-detect the framework being used
* Returns: 'nextjs', 'react', 'vanilla', or null
*/
export async function detectFramework() {
// Check in order of specificity
if (await detectNextJS()) {
return 'nextjs';
}
if (await detectReact()) {
return 'react';
}
if (await detectVanilla()) {
return 'vanilla';
}
return null;
}
export default {
detectNextJS,
detectReact,
detectVanilla,
detectFramework
};