316 lines
9.0 KiB
JavaScript
316 lines
9.0 KiB
JavaScript
import * as Sentry from "@sentry/nextjs"
|
|
import createJiti from "jiti"
|
|
import { fileURLToPath } from "url"
|
|
|
|
import { login, logout } from "./constants/routes/handleAuth.js"
|
|
import { myPages } from "./constants/routes/myPages.js"
|
|
|
|
const path = fileURLToPath(new URL(import.meta.url))
|
|
const jiti = createJiti(path)
|
|
jiti("./env/server")
|
|
jiti("./env/client")
|
|
|
|
/** @type {import('next').NextConfig} */
|
|
const nextConfig = {
|
|
poweredByHeader: false,
|
|
eslint: { ignoreDuringBuilds: true },
|
|
trailingSlash: false,
|
|
experimental: {
|
|
instrumentationHook: true,
|
|
serverActions: {
|
|
allowedOrigins: [
|
|
"*--web-scandic-hotels.netlify.app",
|
|
"develop--web-scandic-hotels.netlify.app",
|
|
"stage--web-scandic-hotels.netlify.app",
|
|
"test--web-scandic-hotels.netlify.app",
|
|
"master--web-scandic-hotels.netlify.app",
|
|
"*.scandichotels.com",
|
|
],
|
|
},
|
|
},
|
|
images: {
|
|
remotePatterns: [
|
|
{
|
|
protocol: "https",
|
|
hostname: "eu-images.contentstack.com",
|
|
pathname: "/v3/assets/**",
|
|
},
|
|
{
|
|
protocol: "https",
|
|
hostname: "scandichotels.com",
|
|
},
|
|
{
|
|
protocol: "https",
|
|
hostname: "*.scandichotels.com",
|
|
},
|
|
],
|
|
},
|
|
|
|
logging: {
|
|
fetches: {
|
|
fullUrl: true,
|
|
},
|
|
},
|
|
|
|
output: "standalone",
|
|
|
|
webpack: function (config, options) {
|
|
config.module.rules.push(
|
|
{
|
|
test: /\.(graphql|gql)/,
|
|
exclude: /node_modules/,
|
|
loader: "graphql-tag/loader",
|
|
},
|
|
{
|
|
test: /\.svg$/,
|
|
use: ["@svgr/webpack"],
|
|
}
|
|
)
|
|
|
|
return config
|
|
},
|
|
|
|
// https://nextjs.org/docs/app/api-reference/next-config-js/redirects#header-cookie-and-query-matching
|
|
redirects() {
|
|
// Param checks needs to be split as Next.js handles everything
|
|
// in the missing array as AND, therefore they need to be separate
|
|
// to handle when one or more are missing.
|
|
//
|
|
// Docs: all missing items must not match for the redirect to be applied.
|
|
return [
|
|
{
|
|
// ----------------------------------------
|
|
// hotel (hotelId) param missing
|
|
// ----------------------------------------
|
|
source:
|
|
"/:lang/hotelreservation/(select-bed|breakfast|details|payment)",
|
|
destination: "/:lang/hotelreservation/select-rate",
|
|
missing: [
|
|
{
|
|
key: "hotel",
|
|
type: "query",
|
|
value: undefined,
|
|
},
|
|
],
|
|
permanent: false,
|
|
},
|
|
{
|
|
// ----------------------------------------
|
|
// hotel (hotelId) param has to be an integer
|
|
// ----------------------------------------
|
|
source:
|
|
"/:lang/hotelreservation/(select-bed|breakfast|details|payment)",
|
|
destination: "/:lang/hotelreservation/select-rate",
|
|
missing: [
|
|
{
|
|
key: "hotel",
|
|
type: "query",
|
|
value: "^[0-9]+$",
|
|
},
|
|
],
|
|
permanent: false,
|
|
},
|
|
{
|
|
// ----------------------------------------
|
|
// fromDate param missing
|
|
// ----------------------------------------
|
|
source:
|
|
"/:lang/hotelreservation/(select-bed|breakfast|details|payment)",
|
|
destination: "/:lang/hotelreservation/select-rate",
|
|
missing: [
|
|
{
|
|
key: "fromDate",
|
|
type: "query",
|
|
value: undefined,
|
|
},
|
|
],
|
|
permanent: false,
|
|
},
|
|
{
|
|
// ----------------------------------------
|
|
// fromDate param has to be a date
|
|
// ----------------------------------------
|
|
source:
|
|
"/:lang/hotelreservation/(select-bed|breakfast|details|payment)",
|
|
destination: "/:lang/hotelreservation/select-rate",
|
|
missing: [
|
|
{
|
|
key: "fromDate",
|
|
type: "query",
|
|
value: "^([12]\\d{3}-(0[1-9]|1[0-2])-(0?[1-9]|[12]\\d|3[01]))$",
|
|
},
|
|
],
|
|
permanent: false,
|
|
},
|
|
{
|
|
// ----------------------------------------
|
|
// toDate param missing
|
|
// ----------------------------------------
|
|
source:
|
|
"/:lang/hotelreservation/(select-bed|breakfast|details|payment)",
|
|
destination: "/:lang/hotelreservation/select-rate",
|
|
missing: [
|
|
{
|
|
key: "toDate",
|
|
type: "query",
|
|
value: undefined,
|
|
},
|
|
],
|
|
permanent: false,
|
|
},
|
|
{
|
|
// ----------------------------------------
|
|
// toDate param has to be a date
|
|
// ----------------------------------------
|
|
source:
|
|
"/:lang/hotelreservation/(select-bed|breakfast|details|payment)",
|
|
destination: "/:lang/hotelreservation/select-rate",
|
|
missing: [
|
|
{
|
|
key: "toDate",
|
|
type: "query",
|
|
value: "^([12]\\d{3}-(0[1-9]|1[0-2])-(0?[1-9]|[12]\\d|3[01]))$",
|
|
},
|
|
],
|
|
permanent: false,
|
|
},
|
|
{
|
|
// ----------------------------------------
|
|
// room[0].adults param missing
|
|
// ----------------------------------------
|
|
source:
|
|
"/:lang/hotelreservation/(select-bed|breakfast|details|payment)",
|
|
destination: "/:lang/hotelreservation/select-rate",
|
|
missing: [
|
|
{
|
|
key: "room[0].adults",
|
|
type: "query",
|
|
value: undefined,
|
|
},
|
|
],
|
|
permanent: false,
|
|
},
|
|
{
|
|
// ----------------------------------------
|
|
// room[0].adults param has to be an integer
|
|
// ----------------------------------------
|
|
source:
|
|
"/:lang/hotelreservation/(select-bed|breakfast|details|payment)",
|
|
destination: "/:lang/hotelreservation/select-rate",
|
|
missing: [
|
|
{
|
|
key: "room[0].adults",
|
|
type: "query",
|
|
value: "^[0-9]+$",
|
|
},
|
|
],
|
|
permanent: false,
|
|
},
|
|
{
|
|
// ----------------------------------------
|
|
// room[0].ratecode param missing
|
|
// ----------------------------------------
|
|
source:
|
|
"/:lang/hotelreservation/(select-bed|breakfast|details|payment)",
|
|
destination: "/:lang/hotelreservation/select-rate",
|
|
missing: [
|
|
{
|
|
key: "room[0].ratecode",
|
|
type: "query",
|
|
value: undefined,
|
|
},
|
|
],
|
|
permanent: false,
|
|
},
|
|
{
|
|
// ----------------------------------------
|
|
// room[0].roomtype param missing
|
|
// ----------------------------------------
|
|
source:
|
|
"/:lang/hotelreservation/(select-bed|breakfast|details|payment)",
|
|
destination: "/:lang/hotelreservation/select-rate",
|
|
missing: [
|
|
{
|
|
key: "room[0].roomtype",
|
|
type: "query",
|
|
value: undefined,
|
|
},
|
|
],
|
|
permanent: false,
|
|
},
|
|
]
|
|
},
|
|
|
|
rewrites() {
|
|
return {
|
|
beforeFiles: [
|
|
{ source: login.da, destination: "/da/login" },
|
|
{ source: login.de, destination: "/de/login" },
|
|
{ source: login.fi, destination: "/fi/login" },
|
|
{ source: login.no, destination: "/no/login" },
|
|
{ source: login.sv, destination: "/sv/login" },
|
|
{ source: logout.da, destination: "/da/logout" },
|
|
{ source: logout.de, destination: "/de/logout" },
|
|
{ source: logout.fi, destination: "/fi/logout" },
|
|
{ source: logout.no, destination: "/no/logout" },
|
|
{ source: logout.sv, destination: "/sv/logout" },
|
|
{
|
|
source: `${myPages.en}/:path*`,
|
|
destination: `/en/my-pages/:path*`,
|
|
},
|
|
{
|
|
source: `${myPages.da}/:path*`,
|
|
destination: `/da/my-pages/:path*`,
|
|
},
|
|
{
|
|
source: `${myPages.de}/:path*`,
|
|
destination: `/de/my-pages/:path*`,
|
|
},
|
|
{
|
|
source: `${myPages.fi}/:path*`,
|
|
destination: `/fi/my-pages/:path*`,
|
|
},
|
|
{
|
|
source: `${myPages.no}/:path*`,
|
|
destination: `/no/my-pages/:path*`,
|
|
},
|
|
{
|
|
source: `${myPages.sv}/:path*`,
|
|
destination: `/sv/my-pages/:path*`,
|
|
},
|
|
{
|
|
source:
|
|
"/:lang/hotelreservation/:step(breakfast|details|payment|select-bed)",
|
|
destination: "/:lang/hotelreservation/step?step=:step",
|
|
},
|
|
{
|
|
source: "/:lang/hotelreservation/payment-callback/:status",
|
|
destination:
|
|
"/:lang/hotelreservation/payment-callback?status=:status",
|
|
},
|
|
],
|
|
}
|
|
},
|
|
}
|
|
|
|
export default Sentry.withSentryConfig(nextConfig, {
|
|
org: "scandic-hotels",
|
|
project: "scandic-web",
|
|
enabled: process.env.NODE_ENV !== "development",
|
|
authToken: process.env.SENTRY_AUTH_TOKEN,
|
|
|
|
// Only print logs for uploading source maps in CI
|
|
silent: !process.env.CI,
|
|
|
|
// 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,
|
|
},
|
|
|
|
hideSourceMaps: true,
|
|
disableLogger: true,
|
|
})
|