You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
2.1 KiB
JavaScript
78 lines
2.1 KiB
JavaScript
const fs = require('fs');
|
|
const path = require('path');
|
|
|
|
const COMPONENTS_DIR = path.join(__dirname, 'src/components');
|
|
const APP_DIR = path.join(__dirname, 'src/app');
|
|
|
|
function getComponentType(filePath) {
|
|
try {
|
|
const content = fs.readFileSync(filePath, 'utf-8').trim();
|
|
|
|
// Only check the first 2 lines for 'use client'
|
|
const firstLines = content.split('\n').slice(0, 2).join('\n');
|
|
|
|
if (firstLines.startsWith("'use client'") || firstLines.startsWith('"use client"')) {
|
|
return 'Client Component';
|
|
}
|
|
|
|
return 'Server Component';
|
|
} catch (error) {
|
|
console.error(`Error reading file: ${filePath}`, error);
|
|
return 'Unknown';
|
|
}
|
|
}
|
|
|
|
function getRenderingStrategy(filePath, componentType) {
|
|
if (filePath.includes('/app/')) {
|
|
if (filePath.includes('/api/')) return 'Server Only (API Route)';
|
|
if (filePath.endsWith('layout.tsx')) return 'Server Only (Layout)';
|
|
if (filePath.endsWith('page.tsx')) return componentType === 'Client Component'
|
|
? 'Client-Side Page'
|
|
: 'Server Only (Page)';
|
|
return 'Server Component (Default)';
|
|
}
|
|
|
|
if (filePath.includes('/components/')) {
|
|
return 'Client-Side or Shared';
|
|
}
|
|
|
|
return 'Unknown';
|
|
}
|
|
|
|
function scanDirectory(directory) {
|
|
let results = [];
|
|
|
|
function scan(dir) {
|
|
const files = fs.readdirSync(dir);
|
|
for (const file of files) {
|
|
const fullPath = path.join(dir, file);
|
|
const stat = fs.statSync(fullPath);
|
|
|
|
if (stat.isDirectory()) {
|
|
scan(fullPath);
|
|
} else if (file.endsWith('.tsx')) {
|
|
const componentType = getComponentType(fullPath);
|
|
const renderingStrategy = getRenderingStrategy(fullPath, componentType);
|
|
|
|
results.push({
|
|
file: fullPath.replace(__dirname, ''), // Make paths relative
|
|
type: componentType,
|
|
rendering: renderingStrategy,
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
scan(directory);
|
|
return results;
|
|
}
|
|
|
|
// Scan app and components directories
|
|
const componentsAnalysis = [
|
|
...scanDirectory(COMPONENTS_DIR),
|
|
...scanDirectory(APP_DIR),
|
|
];
|
|
|
|
// Display results
|
|
console.table(componentsAnalysis);
|