Configure webpack to treat @napi-rs/canvas as an external dependency under the 'canvas' module name when building the server bundle. This adjustment ensures proper module resolution and avoids bundling native dependencies directly, improving deployment reliability for environments requiring @napi-rs/canvas.
103 lines
2.9 KiB
TypeScript
103 lines
2.9 KiB
TypeScript
import type { NextConfig } from "next";
|
|
|
|
const securityHeaders = [
|
|
{ key: 'X-Content-Type-Options', value: 'nosniff' },
|
|
{ key: 'X-Frame-Options', value: 'SAMEORIGIN' },
|
|
{
|
|
key: 'Content-Security-Policy',
|
|
value: "frame-ancestors 'self' https://*.huggingface.co https://huggingface.co",
|
|
},
|
|
{ key: 'Referrer-Policy', value: 'strict-origin-when-cross-origin' },
|
|
{ key: 'Permissions-Policy', value: 'camera=(), microphone=(), geolocation=()' },
|
|
{
|
|
key: 'Strict-Transport-Security',
|
|
value: 'max-age=63072000; includeSubDomains; preload',
|
|
},
|
|
];
|
|
|
|
const bundleWorkerCompute = true;
|
|
const pdfjsTraceFiles = [
|
|
'./node_modules/pdfjs-dist/package.json',
|
|
'./node_modules/pdfjs-dist/legacy/build/pdf.mjs',
|
|
'./node_modules/pdfjs-dist/legacy/build/pdf.worker.mjs',
|
|
'./node_modules/pdfjs-dist/standard_fonts/**/*',
|
|
];
|
|
const serverExternalPackages = [
|
|
'@napi-rs/canvas',
|
|
'better-sqlite3',
|
|
'ffmpeg-static',
|
|
// Keep pdfjs-dist as a real package in node_modules. Server-side preview
|
|
// rendering resolves pdf.js runtime assets from the filesystem at runtime.
|
|
'pdfjs-dist',
|
|
...(!bundleWorkerCompute ? ['onnxruntime-node', '@huggingface/tokenizers'] : []),
|
|
];
|
|
|
|
const nextConfig: NextConfig = {
|
|
output: 'standalone',
|
|
async headers() {
|
|
return [
|
|
{
|
|
// Apply security headers to all routes
|
|
source: '/(.*)',
|
|
headers: securityHeaders,
|
|
},
|
|
];
|
|
},
|
|
turbopack: {
|
|
resolveAlias: {
|
|
canvas: '@napi-rs/canvas',
|
|
},
|
|
},
|
|
transpilePackages: [],
|
|
serverExternalPackages,
|
|
outputFileTracingIncludes: {
|
|
'/api/audiobook': [
|
|
'./node_modules/ffmpeg-static/ffmpeg',
|
|
],
|
|
'/api/audiobook/chapter': [
|
|
'./node_modules/ffmpeg-static/ffmpeg',
|
|
],
|
|
'/api/tts/segments/ensure': [
|
|
'./node_modules/ffmpeg-static/ffmpeg',
|
|
],
|
|
'/api/documents/blob/preview/ensure': [
|
|
// pdf.js runtime assets are resolved through filesystem paths at runtime,
|
|
// so trace them explicitly for Vercel/standalone serverless bundles.
|
|
...pdfjsTraceFiles,
|
|
],
|
|
'/api/documents/blob/preview/presign': [
|
|
...pdfjsTraceFiles,
|
|
],
|
|
'/api/documents/blob/preview/fallback': [
|
|
...pdfjsTraceFiles,
|
|
],
|
|
},
|
|
outputFileTracingExcludes: {
|
|
'/*': [
|
|
'./docstore/**/*',
|
|
'./node_modules/onnxruntime-node/**/*',
|
|
'./node_modules/@huggingface/tokenizers/**/*',
|
|
],
|
|
},
|
|
webpack: (config, { isServer }) => {
|
|
if (isServer) {
|
|
config.externals = [
|
|
...(config.externals || []),
|
|
{
|
|
canvas: 'commonjs @napi-rs/canvas',
|
|
},
|
|
];
|
|
}
|
|
if (isServer && bundleWorkerCompute) {
|
|
config.resolve.alias = {
|
|
...(config.resolve.alias || {}),
|
|
'@openreader/compute-core/local-runtime$': false,
|
|
'onnxruntime-node$': false,
|
|
'@huggingface/tokenizers$': false,
|
|
};
|
|
}
|
|
return config;
|
|
},
|
|
};
|
|
|
|
export default nextConfig;
|