Files
web/update-dotenv.mjs
2024-05-22 11:50:29 +02:00

72 lines
2.8 KiB
JavaScript

/**
* Build time environment variables are not available in Netlify functions at
* runtime. The official workaround is to create an artifact and include that
* in the bundled functions so that the function can load/read it at runtime.
* In other words, during the build fill the .env file with the environment
* variables needed and then instruct Netlify to include the .env file together
* with the bundled function.
*
* This works but has two things to consider:
*
* 1. Any environment variable created in the Netlify UI will be considered
* defined. Even if the variable is set to "empty" in the Netlify UI it is
* still an empty string and therefore defined.
*
* 2. Next.js uses @next/env to automatically read the .env
* file into the process environment. @next/env does NOT override any
* defined variables, empty strings are also considered defined. So for
* @next/env to automatically pick up the .env file in the bundled functions
* we need to make sure that none of the variables in the .env file are
* defined in the Netlify UI. @next/env does not have any "override=true"
* option, like dotenv package. So rather than introduce dotenv and manually
* use it in *every* function, we can delegate to @next/env if we keep the
* environment variables in Netlify UI in check.
*
* We only run this on Netlify build.
*
* We define PUBLIC_URL and use that because we are behind Akamai reverse proxy.
* For the stable environments (test, stage, production) these are defined. For
* any other environment (branch deploys and deploy previews) we use the
* predefined Netlify environment variable DEPLOY_PRIME_URL.
*
* Both AUTH_URL and NEXTAUTH_URL is set to point to the PUBLIC_URL.
* We set both as a precaution as next-auth v5 is transitioning to AUTH_* but we
* have seen several occurences in the auth.js codebase that are not using both.
*/
import fs from "node:fs"
if (process.env.NETLIFY) {
const PUBLIC_URLS = {
production: "https://www.scandichotels.com",
stage: "https://stage.scandichotels.com",
test: "https://test2.scandichotels.com",
}
let PUBLIC_URL
if (PUBLIC_URLS[process.env.CONTEXT]) {
PUBLIC_URL = PUBLIC_URLS[process.env.CONTEXT]
} else if (PUBLIC_URLS[process.env.BRANCH]) {
PUBLIC_URL = PUBLIC_URLS[process.env.BRANCH]
} else {
PUBLIC_URL = process.env.DEPLOY_PRIME_URL
}
const AUTH_URL = `${PUBLIC_URL}/api/web/auth`
const NEXTAUTH_URL = AUTH_URL
const replaceMap = {
AUTH_URL,
NEXTAUTH_URL,
PUBLIC_URL,
}
let contents = fs.readFileSync("./.env", { encoding: "utf-8" })
for (const [key, value] of Object.entries(replaceMap)) {
contents = contents.replace(new RegExp(`${key}=.*`), `${key}="${value}"`)
}
fs.writeFileSync("./.env", contents, { encoding: "utf-8" })
}