-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathnext.config.mjs
129 lines (122 loc) · 3.84 KB
/
next.config.mjs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
// @ts-check
import { join } from "node:path";
import * as url from "node:url";
import analyser from "@next/bundle-analyzer";
import { withSentryConfig } from "@sentry/nextjs";
import { env } from "./src/env.mjs";
import { getVersion } from "./src/modules/baseUtils.mjs";
// @ts-expect-error -- This works because it's only run on node (not browser)
await import("./src/env.mjs");
const ROOT_PATH = url.fileURLToPath(new URL(".", import.meta.url));
const withBundleAnalyzer = analyser({
enabled: process.env.ANALYZE === "true",
});
/** @type {import('next').NextConfig} */
const config = {
reactStrictMode: true,
transpilePackages: ["common"],
// create a smaller bundle
output: "standalone",
// this includes files from the monorepo base two directories up
outputFileTracingRoot: join(ROOT_PATH, "../../"),
// don't block builds use a separate CI step for this
typescript: {
ignoreBuildErrors: true,
},
eslint: {
ignoreDuringBuilds: true,
},
sassOptions: {
includePaths: [join(ROOT_PATH, "src")],
silenceDeprecations: ["legacy-js-api"],
},
i18n: {
locales: ["fi"],
defaultLocale: "fi",
},
basePath: env.NEXT_PUBLIC_BASE_URL,
async rewrites() {
return [
// Do not rewrite API routes
{
source: "/api/:any*",
destination: "/api/:any*",
},
{
source: "/auth/logout/:any*",
destination: "/auth/logout/:any*",
},
// Do not rewrite sentry tunnel
{
source: "/monitoring/:any*",
destination: "/monitoring/:any*",
},
// Rewrite everything else to use `pages/index`
{
source: "/:any*",
destination: "/",
},
];
},
webpack(config) {
// Grab the existing rule that handles SVG imports
// @ts-expect-error -- implicit any, hard to type webpack config
const fileLoaderRule = config.module.rules.find((rule) =>
rule.test?.test?.(".svg")
);
config.module.rules.push(
// Reapply the existing rule, but only for svg imports ending in ?url
{
...fileLoaderRule,
test: /\.svg$/i,
resourceQuery: /url/, // *.svg?url
},
// Convert all other *.svg imports to React components
{
test: /\.svg$/i,
issuer: /\.[jt]sx?$/,
resourceQuery: { not: /url/ }, // exclude if *.svg?url
use: ["@svgr/webpack"],
}
);
// Modify the file loader rule to ignore *.svg, since we have it handled now.
fileLoaderRule.exclude = /\.svg$/i;
return config;
},
// common with user ui
compiler: {
styledComponents: {
ssr: true,
displayName: true,
},
},
};
const nextConfig = withBundleAnalyzer(config);
export default withSentryConfig(nextConfig, {
// For all available options, see:
// https://github.com/getsentry/sentry-webpack-plugin#options
org: "city-of-helsinki",
project: "tilavarauspalvelu-admin-ui",
// only upload source maps to production sentry
sentryUrl: "https://sentry.hel.fi/",
authToken: env.SENTRY_AUTH_TOKEN,
// Only print logs for uploading source maps in CI
silent: !process.env.CI,
// Hides source maps from generated client bundles
hideSourceMaps: true,
// Automatically tree-shake Sentry logger statements to reduce bundle size
disableLogger: true,
// Upload a larger set of source maps for prettier stack traces (increases build time)
widenClientFileUpload: true,
// Automatically annotate React components to show their full name in breadcrumbs and session replay
reactComponentAnnotation: {
enabled: true,
},
release: {
name: getVersion().replace("/", "-"),
},
// Route browser requests to Sentry through a Next.js rewrite to circumvent ad-blockers.
tunnelRoute: "/monitoring",
// Enables automatic instrumentation of Vercel Cron Monitors. (Does not yet work with App Router route handlers.)
automaticVercelMonitors: false,
});