freshroute-server
Version:
Local development server for FreshRoute extension with API mocking and extended functionality
110 lines (89 loc) • 3.39 kB
JavaScript
import { fileURLToPath } from 'url';
import { dirname, join } from 'path';
import fs from 'fs/promises';
import { promisify } from 'util';
import { exec } from 'child_process';
const execAsync = promisify(exec);
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
// Paths
const mockServerRoot = join(__dirname, '..');
const projectRoot = join(mockServerRoot, '..');
const extensionBuildPath = join(mockServerRoot, 'extension');
export async function buildExtension() {
console.log('🔨 Building Chrome extension for packaging...');
try {
// Check if we're in the development environment (parent project exists)
const parentPackageExists = await fs.access(join(projectRoot, 'package.json')).then(() => true).catch(() => false);
if (!parentPackageExists) {
console.log('⚠️ Parent project not found - using pre-built extension');
return extensionBuildPath;
}
// Change to project root and build extension
console.log('📦 Running build:prod in parent directory...');
const { stdout, stderr } = await execAsync('npm run build:prod', {
cwd: projectRoot,
maxBuffer: 1024 * 1024 * 10 // 10MB buffer
});
if (stderr && !stderr.includes('Warning')) {
console.warn('Build warnings:', stderr);
}
console.log('✅ Extension built successfully');
// Copy built extension to mock-server package
const distPath = join(projectRoot, 'dist');
// Remove existing extension directory
try {
await fs.rm(extensionBuildPath, { recursive: true, force: true });
} catch (error) {
// Directory might not exist, that's ok
}
// Copy dist to extension directory
console.log('📁 Copying extension files...');
await copyDirectory(distPath, extensionBuildPath);
console.log('✅ Extension copied to mock-server package');
// Create extension info file
const extensionInfo = {
name: 'FreshRoute Chrome Extension',
version: '1.0.1',
builtAt: new Date().toISOString(),
buildPath: extensionBuildPath,
source: 'freshroute-server npm package',
preBuilt: true
};
await fs.writeFile(
join(extensionBuildPath, 'extension-info.json'),
JSON.stringify(extensionInfo, null, 2)
);
return extensionBuildPath;
} catch (error) {
console.error('❌ Failed to build extension:', error.message);
console.log('💡 This is expected if you\'re not in the development environment');
console.log('💡 The extension should be pre-built in the npm package');
throw error;
}
}
async function copyDirectory(src, dest) {
await fs.mkdir(dest, { recursive: true });
const entries = await fs.readdir(src, { withFileTypes: true });
for (const entry of entries) {
const srcPath = join(src, entry.name);
const destPath = join(dest, entry.name);
if (entry.isDirectory()) {
await copyDirectory(srcPath, destPath);
} else {
await fs.copyFile(srcPath, destPath);
}
}
}
// If run directly
if (import.meta.url === `file://${process.argv[1]}`) {
buildExtension()
.then(() => {
console.log('🎉 Extension build complete!');
process.exit(0);
})
.catch((error) => {
console.error('💥 Build failed:', error);
process.exit(1);
});
}