hensei-web/scripts/patch-next-intl.js
Justin Edmund e132d31b57 Fix Railway deployment and TypeScript errors
- Add next-intl routing configuration using defineRouting
- Update navigation and middleware to use new routing config
- Fix all TypeScript errors in components
- Add Node.js 20 configuration for Railway (.nvmrc and .mise.toml)
- Add patch script for next-intl ESM compatibility
- Fix nullable types and missing props across components
- Update package.json engines to specify Node.js 20.x

This fixes the deployment failure on Railway by:
1. Resolving all TypeScript compilation errors
2. Working around Node.js ESM module resolution issues with next-intl
3. Specifying Node.js 20 for consistent builds

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-04 01:44:37 -07:00

57 lines
No EOL
2.2 KiB
JavaScript

#!/usr/bin/env node
const fs = require('fs');
const path = require('path');
// Recursively find all .js files in a directory
function findJsFiles(dir, files = []) {
const items = fs.readdirSync(dir);
for (const item of items) {
const fullPath = path.join(dir, item);
const stat = fs.statSync(fullPath);
if (stat.isDirectory()) {
findJsFiles(fullPath, files);
} else if (item.endsWith('.js')) {
files.push(fullPath);
}
}
return files;
}
// Find all JS files in next-intl dist folder
const distPath = path.join(process.cwd(), 'node_modules/next-intl/dist');
const filesToPatch = findJsFiles(distPath);
let patchCount = 0;
filesToPatch.forEach(filePath => {
if (fs.existsSync(filePath)) {
let content = fs.readFileSync(filePath, 'utf8');
const originalContent = content;
// Replace imports from Next.js modules to include .js extension
// Handle both minified and non-minified code
content = content.replace(/from"next\/navigation"/g, 'from"next/navigation.js"');
content = content.replace(/from "next\/navigation"/g, 'from "next/navigation.js"');
content = content.replace(/from'next\/navigation'/g, "from'next/navigation.js'");
content = content.replace(/from 'next\/navigation'/g, "from 'next/navigation.js'");
content = content.replace(/from"next\/link"/g, 'from"next/link.js"');
content = content.replace(/from "next\/link"/g, 'from "next/link.js"');
content = content.replace(/from'next\/link'/g, "from'next/link.js'");
content = content.replace(/from 'next\/link'/g, "from 'next/link.js'");
content = content.replace(/from"next\/headers"/g, 'from"next/headers.js"');
content = content.replace(/from "next\/headers"/g, 'from "next/headers.js"');
content = content.replace(/from'next\/headers'/g, "from'next/headers.js'");
content = content.replace(/from 'next\/headers'/g, "from 'next/headers.js'");
// Only write if content changed
if (content !== originalContent) {
fs.writeFileSync(filePath, content, 'utf8');
patchCount++;
console.log(`✓ Patched ${path.relative(process.cwd(), filePath)}`);
}
}
});
console.log(`✅ Patching complete - ${patchCount} files patched`);