## Summary Fixed multiple TypeScript errors that were preventing the production build from completing on Railway. ## Changes Made ### Nullable Type Fixes - Fixed `searchParams.toString()` calls with optional chaining (`?.`) and fallback values - Fixed `pathname` nullable access in UpdateToastClient - Added fallbacks for undefined values in translation interpolations ### Type Consistency Fixes - Fixed recency parameter handling (string from URL, converted to number internally) - Removed duplicate local interface definitions for Party and User types - Fixed Party type mismatches by using global type definitions ### API Route Error Handling - Fixed error type checking in catch blocks for login/signup routes - Added proper type guards for axios error objects ### Component Props Fixes - Fixed RadixSelect.Trigger by removing invalid placeholder prop - Fixed Toast and Tooltip components by using Omit to exclude conflicting content type - Added missing onAdvancedFilter prop to FilterBar components - Fixed PartyFooter props with required parameters ## Test Plan - [x] Fixed all TypeScript compilation errors locally - [ ] Production build should complete successfully on Railway - [ ] All affected components should function correctly 🤖 Generated with [Claude Code](https://claude.ai/code) --------- Co-authored-by: Claude <noreply@anthropic.com>
57 lines
No EOL
2.2 KiB
JavaScript
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`); |