Files
supabase/apps/docs/next.config.mjs
2026-03-04 16:31:02 +01:00

217 lines
5.9 KiB
JavaScript

// @ts-check
import configureBundleAnalyzer from '@next/bundle-analyzer'
import nextMdx from '@next/mdx'
import { withSentryConfig } from '@sentry/nextjs'
import withYaml from 'next-plugin-yaml'
import rehypeSlug from 'rehype-slug'
import remarkGfm from 'remark-gfm'
import { parse as parseToml } from 'smol-toml'
import remotePatterns from './lib/remotePatterns.js'
const withBundleAnalyzer = configureBundleAnalyzer({
enabled: process.env.ANALYZE === 'true',
})
const withMDX = nextMdx({
extension: /\.mdx?$/,
options: {
remarkPlugins: [remarkGfm],
rehypePlugins: [rehypeSlug],
providerImportSource: '@mdx-js/react',
},
})
/** @type {import('next').NextConfig} nextConfig */
const nextConfig = {
assetPrefix: getAssetPrefix(),
// Append the default value with md extensions
pageExtensions: ['ts', 'tsx', 'js', 'jsx', 'md', 'mdx'],
// reactStrictMode: true,
// swcMinify: true,
basePath: process.env.NEXT_PUBLIC_BASE_PATH || '/docs',
images: {
dangerouslyAllowSVG: false,
// @ts-ignore
remotePatterns,
},
webpack: (config) => {
config.module.rules.push({
test: /\.include$/,
type: 'asset/source',
})
config.module.rules.push({
test: /\.toml$/,
type: 'json',
parser: {
parse: parseToml,
},
})
return config
},
transpilePackages: [
'ui',
'ui-patterns',
'common',
'dayjs',
'shared-data',
'api-types',
'icons',
'next-mdx-remote',
],
outputFileTracingIncludes: {
'/api/crawlers': ['./features/docs/generated/**/*', './docs/ref/**/*'],
'/api/guides-md/**/*': ['./public/docs/guides/**/*'],
'/guides/**/*': ['./content/guides/**/*', './content/troubleshooting/**/*', './examples/**/*'],
'/reference/**/*': ['./features/docs/generated/**/*', './docs/ref/**/*'],
},
serverExternalPackages: ['libpg-query', 'twoslash'],
async headers() {
return [
{
source: '/:path*',
headers: [
{
key: 'Strict-Transport-Security',
value: process.env.VERCEL === '1' ? 'max-age=31536000; includeSubDomains; preload' : '',
},
{
key: 'X-Robots-Tag',
value: 'all',
},
{
key: 'X-Frame-Options',
value: 'DENY',
},
],
has: [
{
type: 'host',
value: 'supabase.com',
},
],
},
{
source: '/:path*',
headers: [
{
key: 'Strict-Transport-Security',
value: process.env.VERCEL === '1' ? 'max-age=31536000; includeSubDomains; preload' : '',
},
{
key: 'X-Robots-Tag',
value: 'noindex',
},
{
key: 'X-Frame-Options',
value: 'DENY',
},
],
has: [
{
type: 'host',
value: '(?:.+\\.vercel\\.app)',
},
],
},
{
source: '/favicon/:slug*',
headers: [{ key: 'cache-control', value: 'public, max-age=86400' }],
},
]
},
/**
* Doc rewrites and redirects are
* handled by the `www` nextjs config:
*
* ./apps/www/lib/redirects.js
*
* Only add dev/preview specific redirects
* in this config.
*/
async redirects() {
return [
// Redirect root to docs base path in dev/preview envs
{
source: '/',
destination: '/docs',
basePath: false,
permanent: false,
},
// Redirect dashboard links in dev/preview envs
{
source: '/dashboard/:path*',
destination: 'https://supabase.com/dashboard/:path*',
basePath: false,
permanent: false,
},
// Redirect blog links in dev/preview envs
{
source: '/blog/:path*',
destination: 'https://supabase.com/blog/:path*',
basePath: false,
permanent: false,
},
]
},
typescript: {
// On previews, typechecking is run via GitHub Action only for efficiency
// On production, we turn it on to prevent errors from conflicting PRs getting into
// prod
ignoreBuildErrors: process.env.NEXT_PUBLIC_VERCEL_ENV === 'production' ? false : true,
},
eslint: {
// We are already running linting via GH action, this will skip linting during production build on Vercel
ignoreDuringBuilds: true,
},
}
const configExport = () => {
const plugins = [withMDX, withYaml, withBundleAnalyzer]
// @ts-ignore
return plugins.reduce((acc, next) => next(acc), nextConfig)
}
export default withSentryConfig(configExport, {
// For all available options, see:
// https://www.npmjs.com/package/@sentry/webpack-plugin#options
org: 'supabase',
project: 'docs',
// Only print logs for uploading source maps in CI
silent: !process.env.CI,
// For all available options, see:
// https://docs.sentry.io/platforms/javascript/guides/nextjs/manual-setup/
// Upload a larger set of source maps for prettier stack traces (increases build time)
widenClientFileUpload: true,
// Uncomment to route browser requests to Sentry through a Next.js rewrite to circumvent ad-blockers.
// This can increase your server load as well as your hosting bill.
// Note: Check that the configured route will not match with your Next.js middleware, otherwise reporting of client-
// side errors will fail.
// tunnelRoute: "/monitoring",
// Automatically tree-shake Sentry logger statements to reduce bundle size
disableLogger: true,
})
function getAssetPrefix() {
// If not force enabled, but not production env, disable CDN
if (process.env.FORCE_ASSET_CDN !== '1' && process.env.VERCEL_ENV !== 'production') {
return undefined
}
// Force disable CDN
if (process.env.FORCE_ASSET_CDN === '-1') {
return undefined
}
// @ts-ignore
return `https://frontend-assets.supabase.com/${process.env.SITE_NAME}/${process.env.VERCEL_GIT_COMMIT_SHA.substring(0, 12)}`
}