Upgrade all packages to latest major versions; fix two pre-existing bugs

Frontend:
- next 15 → 16.2.6, react 19.0 → 19.2.6, eslint-config-next updated to match
- Add missing axios dependency (was implicit, broke build)
- Fix VideoPlayer.tsx broken absolute import path (pre-existing bug)
- Fix uploads route handler params to async (Next.js 16 breaking change)
- Remove deprecated images.domains → remotePatterns in next.config.js
- Remove experimental.serverActions (promoted to stable, then removed in v16)
- Update lint script: next lint removed in v16, now uses eslint directly

Backend:
- express 4 → 5.2.1, mongoose 8 → 9.6.2
- bcrypt 5 → 6, helmet 7 → 8, zod 3 → 4
This commit is contained in:
Chris Haulmark 2026-05-24 13:05:38 -06:00
parent e2e33764d3
commit dd9c48f6cd
9 changed files with 1607 additions and 1231 deletions

1136
backend/package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -13,21 +13,21 @@
"dependencies": { "dependencies": {
"@ffprobe-installer/ffprobe": "^2.1.2", "@ffprobe-installer/ffprobe": "^2.1.2",
"@types/multer": "^1.4.12", "@types/multer": "^1.4.12",
"bcrypt": "^5.1.1", "bcrypt": "^6.0.0",
"cors": "^2.8.5", "cors": "^2.8.5",
"dotenv": "^16.4.0", "dotenv": "^16.4.0",
"express": "^4.18.2", "express": "^5.2.1",
"express-rate-limit": "^7.1.5", "express-rate-limit": "^7.1.5",
"fluent-ffmpeg": "^2.1.3", "fluent-ffmpeg": "^2.1.3",
"fs-extra": "^11.3.0", "fs-extra": "^11.3.0",
"helmet": "^7.1.0", "helmet": "^8.2.0",
"jsonwebtoken": "^9.0.2", "jsonwebtoken": "^9.0.2",
"mongoose": "^8.1.0", "mongoose": "^9.6.2",
"morgan": "^1.10.0", "morgan": "^1.10.0",
"multer": "^1.4.5-lts.2", "multer": "^1.4.5-lts.2",
"nodemailer": "^6.9.9", "nodemailer": "^6.9.9",
"redis": "^4.6.12", "redis": "^4.6.12",
"zod": "^3.22.4" "zod": "^4.4.3"
}, },
"devDependencies": { "devDependencies": {
"@types/bcrypt": "^5.0.2", "@types/bcrypt": "^5.0.2",

View file

@ -1,5 +1,6 @@
/// <reference types="next" /> /// <reference types="next" />
/// <reference types="next/image-types/global" /> /// <reference types="next/image-types/global" />
import "./.next/types/routes.d.ts";
// NOTE: This file should not be edited // NOTE: This file should not be edited
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information. // see https://nextjs.org/docs/app/api-reference/config/typescript for more information.

View file

@ -2,14 +2,12 @@
const nextConfig = { const nextConfig = {
reactStrictMode: true, reactStrictMode: true,
images: { images: {
domains: ['localhost'], remotePatterns: [
{ protocol: 'http', hostname: 'localhost' },
{ protocol: 'https', hostname: 'lad1908.org' },
],
formats: ['image/avif', 'image/webp'], formats: ['image/avif', 'image/webp'],
}, },
experimental: {
serverActions: {
allowedOrigins: ['localhost:3000', 'olathedeafclub.com'],
},
},
headers: async () => { headers: async () => {
return [ return [
{ {

File diff suppressed because it is too large Load diff

View file

@ -7,23 +7,24 @@
"dev": "next dev", "dev": "next dev",
"build": "next build", "build": "next build",
"start": "next start", "start": "next start",
"lint": "next lint" "lint": "eslint ."
}, },
"dependencies": { "dependencies": {
"axios": "^1.16.1",
"framer-motion": "^12.6.0", "framer-motion": "^12.6.0",
"next": "^15.3.3", "next": "^16.2.6",
"next-themes": "^0.4.6", "next-themes": "^0.4.6",
"react": "19.0.0", "react": "^19.2.6",
"react-dom": "19.0.0" "react-dom": "^19.2.6"
}, },
"devDependencies": { "devDependencies": {
"@tailwindcss/postcss": "^4.0.15", "@tailwindcss/postcss": "^4.0.15",
"@types/node": "^20.0.0", "@types/node": "^20.0.0",
"@types/react": "^19.0.12", "@types/react": "^19.2.15",
"@types/react-dom": "^19.0.4", "@types/react-dom": "^19.2.3",
"autoprefixer": "^10.4.0", "autoprefixer": "^10.4.0",
"eslint": "^9.0.0", "eslint": "^9.0.0",
"eslint-config-next": "^15.2.3", "eslint-config-next": "^16.2.6",
"postcss": "^8.4.0", "postcss": "^8.4.0",
"tailwindcss": "^4.0.0", "tailwindcss": "^4.0.0",
"typescript": "^5.8.0" "typescript": "^5.8.0"

View file

@ -8,11 +8,11 @@ import fs from 'fs';
*/ */
export async function GET( export async function GET(
request: NextRequest, request: NextRequest,
{ params }: { params: { path: string[] } } { params }: { params: Promise<{ path: string[] }> }
) { ) {
try { try {
// Get the file path from the URL const { path: pathSegments } = await params;
const filePath = params.path.join('/'); const filePath = pathSegments.join('/');
// Construct the absolute path to the file // Construct the absolute path to the file
// This assumes the backend is in the same directory as the frontend // This assumes the backend is in the same directory as the frontend

View file

@ -1,7 +1,7 @@
'use client'; 'use client';
import React, { useState, useRef, useEffect } from 'react'; import React, { useState, useRef, useEffect } from 'react';
import { PlayIcon, PauseIcon } from 'frontend/src/components/atoms/Icons'; import { PlayIcon, PauseIcon } from '../atoms/Icons';
interface VideoPlayerProps { interface VideoPlayerProps {
videoUrl: string; videoUrl: string;

View file

@ -13,10 +13,10 @@
"incremental": true, "incremental": true,
"module": "esnext", "module": "esnext",
"esModuleInterop": true, "esModuleInterop": true,
"moduleResolution": "node", "moduleResolution": "bundler",
"resolveJsonModule": true, "resolveJsonModule": true,
"isolatedModules": true, "isolatedModules": true,
"jsx": "preserve", "jsx": "react-jsx",
"plugins": [ "plugins": [
{ {
"name": "next" "name": "next"
@ -24,14 +24,17 @@
], ],
"baseUrl": ".", "baseUrl": ".",
"paths": { "paths": {
"@/*": ["src/*"] "@/*": [
"src/*"
]
} }
}, },
"include": [ "include": [
"next-env.d.ts", "next-env.d.ts",
".next/types/**/*.ts", ".next/types/**/*.ts",
"**/*.ts", "**/*.ts",
"**/*.tsx" "**/*.tsx",
".next/dev/types/**/*.ts"
], ],
"exclude": [ "exclude": [
"node_modules" "node_modules"