/** * @module middleware * @description hooks-up `next-auth` into the page processing pipeline */ import { auth, authConfig, myAuth } from '@/app/lib/auth' import createIntlMiddleware from 'next-intl/middleware'; import { NextRequest, NextResponse } from 'next/server'; import { locales, defaultLocale } from '@/app/i18n'; import { Session } from 'next-auth'; // http://localhost:3000/share/location/675c41b227d0df76a35f106e const publicPages = ['/terms', '/policy', '/login', '/share/location/.*', '/share/bill/.*', '/share/attachment/.*']; const intlMiddleware = createIntlMiddleware({ locales, localePrefix: 'as-needed', defaultLocale }); export default async function middleware(req: NextRequest) { const publicPathnameRegex = RegExp( `^(/(${locales.join('|')}))?(${publicPages .flatMap((p) => (p === '/' ? ['', '/'] : p)) .join('|')})/?$`, 'i' ); const isPublicPage = publicPathnameRegex.test(req.nextUrl.pathname); // for public pages we call only localisation middleware // this is not an official way to do it - it's a hack // based on https://github.com/nextauthjs/next-auth/discussions/8961 // The official way of chaining middlewares in AuthJS v5 does not work and is not fully documented if (!isPublicPage) { const session = await myAuth(); if (!session) { const signInUrl = `${req.nextUrl.protocol}//${req.nextUrl.hostname}${req.nextUrl.port ? `:${req.nextUrl.port}` : ''}${authConfig.pages?.signIn as string}`; return NextResponse.redirect( signInUrl ); } } return intlMiddleware(req); } export const config = { // for these paths middleware will not be called // `pdf.worker.min.mjs` is a web worker code used by pdf.js matcher: [ '/((?!api|_next/static|_next/image|.*\\.png$|pdf.worker.min.mjs$|.*\\.webm$).*)', ], };