generated from SocialGouv/template
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnext.config.mjs
118 lines (108 loc) · 3.04 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
import createMDX from "@next/mdx";
import remarkFrontmatter from "remark-frontmatter";
import remarkGfm from "remark-gfm";
import remarkMdxFrontmatter from "remark-mdx-frontmatter";
import packageJson from "./package.json" assert { type: "json" };
const { version } = packageJson;
const isDeployment = !!process.env.VERCEL_URL;
const env = {
NEXT_PUBLIC_APP_VERSION: version,
NEXT_PUBLIC_APP_VERSION_COMMIT: isDeployment ? process.env.SOURCE_VERSION : "dev",
};
const csp = {
"default-src": ["'none'"],
"connect-src": ["'self'", "https://*.gouv.fr", process.env.NODE_ENV === "development" && "http://localhost"],
"font-src": ["'self'"],
"media-src": ["'self'"],
"img-src": ["'self'", "data:"],
"script-src": [
"'self'",
"'unsafe-inline'",
"https://stats.beta.gouv.fr",
process.env.NODE_ENV === "development" && "'unsafe-eval' http://localhost",
],
"style-src": ["'self'", "'unsafe-inline'"],
"object-src": ["'self'", "data:"],
"frame-ancestors": ["'self'"],
"base-uri": ["'self'", "https://*.gouv.fr"],
"form-action": ["'self'", "https://*.gouv.fr"],
"block-all-mixed-content": [],
"upgrade-insecure-requests": [],
"frame-src": ["'none'"],
};
const ContentSecurityPolicy = Object.entries(csp)
.map(([key, value]) => `${key} ${value.filter(Boolean).join(" ")};`)
.join(" ");
/** @type {import('next').NextConfig} */
const config = {
poweredByHeader: false,
swcMinify: true,
output: "standalone",
webpack: config => {
config.module.rules.push({
test: /\.(woff2|webmanifest|ttf)$/,
type: "asset/resource",
});
return config;
},
experimental: {
typedRoutes: true,
},
eslint: {
ignoreDuringBuilds: true,
},
env,
pageExtensions: ["js", "jsx", "md", "mdx", "ts", "tsx"],
async headers() {
return [
{
source: "/(.*)",
headers: [
{
key: "Content-Security-Policy",
value: ContentSecurityPolicy,
},
{
key: "X-Frame-Options",
value: "DENY",
},
{
key: "X-Content-Type-Options",
value: "nosniff",
},
{
key: "X-XSS-Protection",
value: "1; mode=block",
},
{
key: "Referrer-Policy",
value: "no-referrer, strict-origin-when-cross-origin",
},
{
key: "Permissions-Policy",
value: "fullscreen=(), display-capture=(), camera=(), microphone=(), geolocation=()",
},
{
key: "Cross-Origin-Embedder-Policy",
value: "credentialless",
},
{
key: "Cross-Origin-Opener-Policy",
value: "same-origin",
},
{
key: "Cross-Origin-Resource-Policy",
value: "cross-origin",
},
],
},
];
},
};
const withMDX = createMDX({
extension: /\.mdx?$/,
options: {
remarkPlugins: [remarkFrontmatter, remarkGfm, [remarkMdxFrontmatter, { name: "metadata" }]],
},
});
export default withMDX(config);