mirror of
https://github.com/langgenius/dify.git
synced 2025-12-19 17:27:16 -05:00
186 lines
5.4 KiB
JavaScript
186 lines
5.4 KiB
JavaScript
const { codeInspectorPlugin } = require('code-inspector-plugin')
|
|
const fs = require('fs')
|
|
const path = require('path')
|
|
const withPWA = require('next-pwa')({
|
|
dest: 'public',
|
|
register: true,
|
|
skipWaiting: true,
|
|
disable: process.env.NODE_ENV === 'development',
|
|
fallbacks: {
|
|
document: '/_offline.html',
|
|
},
|
|
runtimeCaching: [
|
|
{
|
|
urlPattern: /^https:\/\/fonts\.googleapis\.com\/.*/i,
|
|
handler: 'CacheFirst',
|
|
options: {
|
|
cacheName: 'google-fonts',
|
|
expiration: {
|
|
maxEntries: 4,
|
|
maxAgeSeconds: 365 * 24 * 60 * 60 // 1 year
|
|
}
|
|
}
|
|
},
|
|
{
|
|
urlPattern: /^https:\/\/fonts\.gstatic\.com\/.*/i,
|
|
handler: 'CacheFirst',
|
|
options: {
|
|
cacheName: 'google-fonts-webfonts',
|
|
expiration: {
|
|
maxEntries: 4,
|
|
maxAgeSeconds: 365 * 24 * 60 * 60 // 1 year
|
|
}
|
|
}
|
|
},
|
|
{
|
|
urlPattern: /\.(?:png|jpg|jpeg|svg|gif|webp|avif)$/i,
|
|
handler: 'CacheFirst',
|
|
options: {
|
|
cacheName: 'images',
|
|
expiration: {
|
|
maxEntries: 64,
|
|
maxAgeSeconds: 30 * 24 * 60 * 60 // 30 days
|
|
}
|
|
}
|
|
},
|
|
{
|
|
urlPattern: /\.(?:js|css)$/i,
|
|
handler: 'StaleWhileRevalidate',
|
|
options: {
|
|
cacheName: 'static-resources',
|
|
expiration: {
|
|
maxEntries: 32,
|
|
maxAgeSeconds: 24 * 60 * 60 // 1 day
|
|
}
|
|
}
|
|
},
|
|
{
|
|
urlPattern: /^\/api\/.*/i,
|
|
handler: 'NetworkFirst',
|
|
options: {
|
|
cacheName: 'api-cache',
|
|
networkTimeoutSeconds: 10,
|
|
expiration: {
|
|
maxEntries: 16,
|
|
maxAgeSeconds: 60 * 60 // 1 hour
|
|
}
|
|
}
|
|
}
|
|
]
|
|
})
|
|
const withMDX = require('@next/mdx')({
|
|
extension: /\.mdx?$/,
|
|
options: {
|
|
// If you use remark-gfm, you'll need to use next.config.mjs
|
|
// as the package is ESM only
|
|
// https://github.com/remarkjs/remark-gfm#install
|
|
remarkPlugins: [],
|
|
rehypePlugins: [],
|
|
// If you use `MDXProvider`, uncomment the following line.
|
|
// providerImportSource: "@mdx-js/react",
|
|
},
|
|
})
|
|
const withBundleAnalyzer = require('@next/bundle-analyzer')({
|
|
enabled: process.env.ANALYZE === 'true',
|
|
})
|
|
|
|
// the default url to prevent parse url error when running jest
|
|
const hasSetWebPrefix = process.env.NEXT_PUBLIC_WEB_PREFIX
|
|
const port = process.env.PORT || 3000
|
|
const locImageURLs = !hasSetWebPrefix ? [new URL(`http://localhost:${port}/**`), new URL(`http://127.0.0.1:${port}/**`)] : []
|
|
const remoteImageURLs = [hasSetWebPrefix ? new URL(`${process.env.NEXT_PUBLIC_WEB_PREFIX}/**`) : '', ...locImageURLs].filter(item => !!item)
|
|
|
|
const isSaaS = process.env.NEXT_PUBLIC_EDITION === 'CLOUD'
|
|
console.log(isSaaS)
|
|
const supportPostfixReg = /\.(ts|tsx|css|svg|jpg|jpeg|png)$/
|
|
const editionPaths = (() => {
|
|
const editionDir = `./app/edition/${isSaaS ? 'saas' : 'community'}`
|
|
|
|
const result = {}
|
|
|
|
function walk(dir) {
|
|
const files = fs.readdirSync(dir)
|
|
for (const file of files) {
|
|
const fullPath = path.join(dir, file)
|
|
const stat = fs.statSync(fullPath)
|
|
if (stat.isDirectory()) {
|
|
walk(fullPath)
|
|
} else if (supportPostfixReg.test(file)) {
|
|
const relPath = path.relative(editionDir, fullPath)
|
|
const key = `@edition/${relPath.replace(/\\/g, '/')}`.replace(supportPostfixReg, '')
|
|
const fullPathWithoutPrefix = `./${fullPath.replace(supportPostfixReg, '')}`
|
|
result[key] = fullPathWithoutPrefix
|
|
if (key.endsWith('/index')) {
|
|
const dirKey = key.replace(/\/index$/, '')
|
|
result[dirKey] = fullPathWithoutPrefix
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (fs.existsSync(editionDir)) {
|
|
walk(editionDir)
|
|
}
|
|
|
|
return result
|
|
})()
|
|
|
|
// console.log(JSON.stringify(editionPaths, null, 2))
|
|
|
|
/** @type {import('next').NextConfig} */
|
|
const nextConfig = {
|
|
basePath: process.env.NEXT_PUBLIC_BASE_PATH || '',
|
|
transpilePackages: ['echarts', 'zrender'],
|
|
turbopack: {
|
|
rules: codeInspectorPlugin({
|
|
bundler: 'turbopack'
|
|
}),
|
|
// resolveAlias: {
|
|
// ...editionPaths,
|
|
// }
|
|
},
|
|
productionBrowserSourceMaps: false, // enable browser source map generation during the production build
|
|
// Configure pageExtensions to include md and mdx
|
|
pageExtensions: ['ts', 'tsx', 'js', 'jsx', 'md', 'mdx'],
|
|
// https://nextjs.org/docs/messages/next-image-unconfigured-host
|
|
images: {
|
|
remotePatterns: remoteImageURLs.map(remoteImageURL => ({
|
|
protocol: remoteImageURL.protocol.replace(':', ''),
|
|
hostname: remoteImageURL.hostname,
|
|
port: remoteImageURL.port,
|
|
pathname: remoteImageURL.pathname,
|
|
search: '',
|
|
})),
|
|
},
|
|
experimental: {
|
|
optimizePackageImports: [
|
|
'@heroicons/react'
|
|
],
|
|
},
|
|
// fix all before production. Now it slow the develop speed.
|
|
eslint: {
|
|
// Warning: This allows production builds to successfully complete even if
|
|
// your project has ESLint errors.
|
|
ignoreDuringBuilds: true,
|
|
dirs: ['app', 'bin', 'config', 'context', 'hooks', 'i18n', 'models', 'service', 'test', 'types', 'utils'],
|
|
},
|
|
typescript: {
|
|
// https://nextjs.org/docs/api-reference/next.config.js/ignoring-typescript-errors
|
|
ignoreBuildErrors: true,
|
|
tsconfigPath: isSaaS ? 'tsconfig.json' : 'tsconfig.ce.json',
|
|
},
|
|
reactStrictMode: true,
|
|
async redirects() {
|
|
return [
|
|
{
|
|
source: '/',
|
|
destination: '/apps',
|
|
permanent: false,
|
|
},
|
|
]
|
|
},
|
|
output: 'standalone',
|
|
}
|
|
|
|
module.exports = withPWA(withBundleAnalyzer(withMDX(nextConfig)))
|