diff --git a/src/installers/envVars.ts b/src/installers/envVars.ts index b3f25a7888..a7389d261a 100644 --- a/src/installers/envVars.ts +++ b/src/installers/envVars.ts @@ -16,20 +16,20 @@ export const envVariblesInstaller: Installer = async ({ switch (true) { case usingAuth && usingPrisma: - envFile = "env-prisma-auth.js"; + envFile = "env-prisma-auth.mjs"; break; case usingAuth: - envFile = "env-auth.js"; + envFile = "env-auth.mjs"; break; case usingPrisma: - envFile = "env-prisma.js"; + envFile = "env-prisma.mjs"; break; } if (!envFile) return; const envSchemaSrc = path.join(envAssetDir, envFile); - const envSchemaDest = path.join(projectDir, "src/server/env-schema.js"); + const envSchemaDest = path.join(projectDir, "src/server/env-schema.mjs"); await fs.copy(envSchemaSrc, envSchemaDest, { overwrite: true }); }; diff --git a/template/addons/env/env-auth.js b/template/addons/env/env-auth.mjs similarity index 58% rename from template/addons/env/env-auth.js rename to template/addons/env/env-auth.mjs index d060f1e17b..2a8a4b5d52 100644 --- a/template/addons/env/env-auth.js +++ b/template/addons/env/env-auth.mjs @@ -1,10 +1,8 @@ -const { z } = require("zod"); +import { z } from "zod"; -const envSchema = z.object({ +export const envSchema = z.object({ NEXTAUTH_SECRET: z.string(), NEXTAUTH_URL: z.string().url(), DISCORD_CLIENT_ID: z.string(), DISCORD_CLIENT_SECRET: z.string(), }); - -module.exports.envSchema = envSchema; diff --git a/template/addons/env/env-prisma-auth.js b/template/addons/env/env-prisma-auth.mjs similarity index 70% rename from template/addons/env/env-prisma-auth.js rename to template/addons/env/env-prisma-auth.mjs index 4a56e85c0b..1103bc2d32 100644 --- a/template/addons/env/env-prisma-auth.js +++ b/template/addons/env/env-prisma-auth.mjs @@ -1,6 +1,6 @@ -const { z } = require("zod"); +import { z } from "zod"; -const envSchema = z.object({ +export const envSchema = z.object({ DATABASE_URL: z.string().url(), NODE_ENV: z.enum(["development", "test", "production"]), NEXTAUTH_SECRET: z.string(), @@ -8,5 +8,3 @@ const envSchema = z.object({ DISCORD_CLIENT_ID: z.string(), DISCORD_CLIENT_SECRET: z.string(), }); - -module.exports.envSchema = envSchema; diff --git a/template/addons/env/env-prisma.js b/template/addons/env/env-prisma.mjs similarity index 50% rename from template/addons/env/env-prisma.js rename to template/addons/env/env-prisma.mjs index ca312127d7..fe171bffb7 100644 --- a/template/addons/env/env-prisma.js +++ b/template/addons/env/env-prisma.mjs @@ -1,8 +1,6 @@ -const { z } = require("zod"); +import { z } from "zod"; -const envSchema = z.object({ +export const envSchema = z.object({ DATABASE_URL: z.string().url(), NODE_ENV: z.enum(["development", "test", "production"]), }); - -module.exports.envSchema = envSchema; diff --git a/template/addons/next-auth/api-handler-prisma.ts b/template/addons/next-auth/api-handler-prisma.ts index 33dbeb113f..a93dd90136 100644 --- a/template/addons/next-auth/api-handler-prisma.ts +++ b/template/addons/next-auth/api-handler-prisma.ts @@ -5,7 +5,7 @@ import CredentialsProvider from "next-auth/providers/credentials"; // Prisma adapter for NextAuth, optional and can be removed import { PrismaAdapter } from "@next-auth/prisma-adapter"; import { prisma } from "../../../server/db/client"; -import { env } from "../../../server/env"; +import { env } from "../../../server/env.mjs"; export const authOptions: NextAuthOptions = { // Include user.id on session diff --git a/template/addons/next-auth/api-handler.ts b/template/addons/next-auth/api-handler.ts index 6125cfd4e4..a08b03a7eb 100644 --- a/template/addons/next-auth/api-handler.ts +++ b/template/addons/next-auth/api-handler.ts @@ -1,7 +1,7 @@ import NextAuth, { type NextAuthOptions } from "next-auth"; import DiscordProvider from "next-auth/providers/discord"; import CredentialsProvider from "next-auth/providers/credentials"; -import { env } from "../../../server/env"; +import { env } from "../../../server/env.mjs"; export const authOptions: NextAuthOptions = { // Include user.id on session diff --git a/template/addons/prisma/client.ts b/template/addons/prisma/client.ts index fc97065fcf..90d484597c 100644 --- a/template/addons/prisma/client.ts +++ b/template/addons/prisma/client.ts @@ -1,6 +1,6 @@ // src/server/db/client.ts import { PrismaClient } from "@prisma/client"; -import { env } from "../env"; +import { env } from "../env.mjs"; declare global { var prisma: PrismaClient | undefined; diff --git a/template/base/next.config.js b/template/base/next.config.js deleted file mode 100644 index b08bad63b1..0000000000 --- a/template/base/next.config.js +++ /dev/null @@ -1,8 +0,0 @@ -const { env } = require("./src/server/env"); - -/** @type {import('next').NextConfig} */ -const nextConfig = { - reactStrictMode: true, -}; - -module.exports = nextConfig; diff --git a/template/base/next.config.mjs b/template/base/next.config.mjs new file mode 100644 index 0000000000..3e73395240 --- /dev/null +++ b/template/base/next.config.mjs @@ -0,0 +1,17 @@ +import { env } from "./src/server/env.mjs"; + +/** + * Don't be scared of the generics here. + * All they do is to give us autocompletion when using this. + * + * @template {import('next').NextConfig} T + * @param {T} config - A generic parameter that flows through to the return type + * @constraint {{import('next').NextConfig}} + */ +function defineNextConfig(config) { + return config; +} + +export default defineNextConfig({ + reactStrictMode: true, +}); diff --git a/template/base/src/server/env-schema.js b/template/base/src/server/env-schema.js deleted file mode 100644 index 4998588c02..0000000000 --- a/template/base/src/server/env-schema.js +++ /dev/null @@ -1,7 +0,0 @@ -const { z } = require("zod"); - -const envSchema = z.object({ - // Specify your environment variables schema here -}); - -module.exports.envSchema = envSchema; diff --git a/template/base/src/server/env-schema.mjs b/template/base/src/server/env-schema.mjs new file mode 100644 index 0000000000..e23a0a62a5 --- /dev/null +++ b/template/base/src/server/env-schema.mjs @@ -0,0 +1,5 @@ +import { z } from "zod"; + +export const envSchema = z.object({ + // Specify your environment variables schema here +}); diff --git a/template/base/src/server/env.js b/template/base/src/server/env.mjs similarity index 54% rename from template/base/src/server/env.js rename to template/base/src/server/env.mjs index 5baca953d0..0a2ca7c37a 100644 --- a/template/base/src/server/env.js +++ b/template/base/src/server/env.mjs @@ -1,11 +1,11 @@ // @ts-check /** - * This file is included in `/next.config.js` which ensures the app isn't built with invalid env vars. - * It has to be a `.js`-file to be imported there. + * This file is included in `/next.config.mjs` which ensures the app isn't built with invalid env vars. + * It has to be a `.mjs`-file to be imported there. */ -const { envSchema } = require("./env-schema"); +import { envSchema } from "./env-schema.mjs"; -const env = envSchema.safeParse(process.env); +const _env = envSchema.safeParse(process.env); const formatErrors = ( /** @type {import('zod').ZodFormattedError,string>} */ @@ -18,12 +18,12 @@ const formatErrors = ( }) .filter(Boolean); -if (!env.success) { +if (!_env.success) { console.error( "❌ Invalid environment variables:\n", - ...formatErrors(env.error.format()), + ...formatErrors(_env.error.format()), ); process.exit(1); } -module.exports.env = env.data; +export const env = _env.data;