fix(#1): Address code review findings
- Convert ApiResponse to discriminated union for type-safe error handling - Add HealthStatus type with HealthState literal union - Make BaseEntity fields readonly for immutability - Add GlobalExceptionFilter with structured logging - Add port validation with clear error messages in main.ts - Improve parseDate to log warnings for invalid dates - Add comprehensive Button tests (variants, onClick, disabled) - Add slugify edge case tests (empty, special chars, numbers) - Create ESLint configs for all packages - Remove compiled JS files from src directories - Convert .prettierrc.js to .prettierrc.json Refs #1 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,17 +1,61 @@
|
||||
import { NestFactory } from "@nestjs/core";
|
||||
import { AppModule } from "./app.module";
|
||||
import { GlobalExceptionFilter } from "./filters/global-exception.filter";
|
||||
|
||||
function getPort(): number {
|
||||
const portEnv = process.env.PORT;
|
||||
|
||||
if (portEnv === undefined || portEnv === "") {
|
||||
return 3001;
|
||||
}
|
||||
|
||||
const port = parseInt(portEnv, 10);
|
||||
|
||||
if (isNaN(port)) {
|
||||
throw new Error(`Invalid PORT environment variable: "${portEnv}". PORT must be a number.`);
|
||||
}
|
||||
|
||||
if (port < 1 || port > 65535) {
|
||||
throw new Error(
|
||||
`Invalid PORT environment variable: ${String(port)}. PORT must be between 1 and 65535.`
|
||||
);
|
||||
}
|
||||
|
||||
return port;
|
||||
}
|
||||
|
||||
async function bootstrap() {
|
||||
const app = await NestFactory.create(AppModule);
|
||||
|
||||
app.useGlobalFilters(new GlobalExceptionFilter());
|
||||
app.enableCors();
|
||||
|
||||
const port = process.env["PORT"] ?? 3001;
|
||||
const port = getPort();
|
||||
await app.listen(port);
|
||||
|
||||
console.log(`API running on http://localhost:${port}`);
|
||||
console.log(`API running on http://localhost:${String(port)}`);
|
||||
}
|
||||
|
||||
bootstrap().catch((err: unknown) => {
|
||||
console.error("Failed to start application:", err);
|
||||
const isProduction = process.env.NODE_ENV === "production";
|
||||
const errorMessage = err instanceof Error ? err.message : String(err);
|
||||
const errorStack = err instanceof Error ? err.stack : undefined;
|
||||
|
||||
if (isProduction) {
|
||||
console.error(
|
||||
JSON.stringify({
|
||||
level: "error",
|
||||
message: "Failed to start application",
|
||||
error: errorMessage,
|
||||
timestamp: new Date().toISOString(),
|
||||
})
|
||||
);
|
||||
} else {
|
||||
console.error("Failed to start application:", errorMessage);
|
||||
if (errorStack) {
|
||||
console.error(errorStack);
|
||||
}
|
||||
}
|
||||
|
||||
process.exit(1);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user