Vercel/next.config.ts
Strtus d5001c9ee5 Use default export in Next config for EdgeOne compatibility
Switch next.config.ts from CommonJS export to default export so OpenNext wrappers can import the original config during type checking.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-19 00:40:34 +08:00

105 lines
2.7 KiB
TypeScript

import { removeUrlProtocol } from '@/utility/url';
import type { NextConfig } from 'next';
import { RemotePattern } from 'next/dist/shared/lib/image-config';
import path from 'path';
import bundleAnalyzer from '@next/bundle-analyzer';
const VERCEL_BLOB_STORE_ID = process.env.BLOB_READ_WRITE_TOKEN?.match(
/^vercel_blob_rw_([a-z0-9]+)_[a-z0-9]+$/i,
)?.[1].toLowerCase();
const HOSTNAME_VERCEL_BLOB = VERCEL_BLOB_STORE_ID
? `${VERCEL_BLOB_STORE_ID}.public.blob.vercel-storage.com`
: undefined;
const HOSTNAME_CLOUDFLARE_R2 =
process.env.NEXT_PUBLIC_CLOUDFLARE_R2_PUBLIC_DOMAIN;
const HOSTNAME_AWS_S3 =
process.env.NEXT_PUBLIC_AWS_S3_BUCKET &&
process.env.NEXT_PUBLIC_AWS_S3_REGION
// eslint-disable-next-line max-len
? `${process.env.NEXT_PUBLIC_AWS_S3_BUCKET}.s3.${process.env.NEXT_PUBLIC_AWS_S3_REGION}.amazonaws.com`
: undefined;
const HOSTNAME_MINIO =
process.env.NEXT_PUBLIC_MINIO_DOMAIN;
const MINIO_PORT =
process.env.NEXT_PUBLIC_MINIO_PORT;
const MINIO_USE_SSL =
process.env.NEXT_PUBLIC_MINIO_DISABLE_SSL !== '1';
const generateRemotePattern = (
hostname: string,
port?: string,
useSSL = true,
): RemotePattern => ({
protocol: useSSL ? 'https' : 'http',
hostname: removeUrlProtocol(hostname)!,
port,
pathname: '/**',
});
const remotePatterns: RemotePattern[] = [
{
protocol: 'https',
hostname: 'api.qrserver.com',
port: '',
pathname: '/v1/create-qr-code/**',
},
];
if (HOSTNAME_VERCEL_BLOB) {
remotePatterns.push(generateRemotePattern(HOSTNAME_VERCEL_BLOB));
}
if (HOSTNAME_CLOUDFLARE_R2) {
remotePatterns.push(generateRemotePattern(HOSTNAME_CLOUDFLARE_R2));
}
if (HOSTNAME_AWS_S3) {
remotePatterns.push(generateRemotePattern(HOSTNAME_AWS_S3));
}
if (HOSTNAME_MINIO) {
remotePatterns.push(generateRemotePattern(
HOSTNAME_MINIO,
MINIO_PORT,
MINIO_USE_SSL,
));
}
const LOCALE = process.env.NEXT_PUBLIC_LOCALE || 'en-us';
const LOCALE_ALIAS = './date-fns-locale-alias';
const LOCALE_DYNAMIC = `i18n/locales/${LOCALE}`;
const IMAGE_QUALITY =
process.env.NEXT_PUBLIC_IMAGE_QUALITY
? parseInt(process.env.NEXT_PUBLIC_IMAGE_QUALITY)
: 75;
const nextConfig: NextConfig = {
images: {
imageSizes: [200],
qualities: [75, IMAGE_QUALITY],
remotePatterns,
minimumCacheTTL: 31536000,
},
serverExternalPackages: ['exifr'],
turbopack: {
resolveAlias: {
[LOCALE_ALIAS]: `@/${LOCALE_DYNAMIC}`,
},
},
webpack: (config) => {
config.resolve.alias = {
...config.resolve.alias,
[LOCALE_ALIAS]: path.resolve(__dirname, `src/${LOCALE_DYNAMIC}`),
};
return config;
},
};
const withBundleAnalyzer = bundleAnalyzer({
enabled: process.env.ANALYZE === 'true',
});
export default withBundleAnalyzer(nextConfig);