@varlock/nextjs-integration 0.0.14 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/next-env-compat.ts"],"names":["initialEnv","path","fs","execSync","resetRedactionMap","patchGlobalConsole","execSyncVarlock","initVarlockEnv"],"mappings":"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","file":"next-env-compat.js","sourcesContent":["/**\n * Drop-in replacement for @next/env that uses varlock instead of dotenv\n *\n * This must be the default export of the module, and it must stay compatible with @next/env\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { execSync } from 'child_process';\nimport { type SerializedEnvGraph } from 'varlock';\nimport { initVarlockEnv, resetRedactionMap } from 'varlock/env';\nimport { patchGlobalConsole } from 'varlock/patch-console';\nimport { execSyncVarlock } from 'varlock/exec-sync-varlock';\n\nexport type Env = { [key: string]: string | undefined };\nexport type LoadedEnvFiles = Array<{\n path: string\n contents: string\n env: Env\n}>;\n\n/** will store the original values of process.env */\nexport let initialEnv: Env | undefined;\n\nlet lastReloadAt: Date | undefined;\n\nlet varlockLoadedEnv: SerializedEnvGraph;\nlet combinedEnv: Env | undefined;\nlet parsedEnv: Env | undefined;\n// this is used by next just to display the list of .env files in a startup log\nlet loadedEnvFiles: LoadedEnvFiles = [];\nlet rootDir: string | undefined;\n\n// @next/env exports this info and currently it is only used to display\n// a list of filenames loaded, for example: `Environments: .env, .env.development`\nfunction getVarlockSourcesAsLoadedEnvFiles(): LoadedEnvFiles {\n const envFiles = varlockLoadedEnv.sources\n // TODO expose more info so we can filter out disabled sources\n // and maybe show relative paths\n .filter((s) => s.enabled && !s.label.startsWith('directory -'))\n .map((s) => ({\n path: s.label,\n contents: '',\n env: {},\n }));\n if (envFiles.length) {\n // this adds an additional line, below the list of files\n envFiles.push({ path: '\\n ✨ loaded by varlock ✨', contents: '', env: {} });\n }\n return envFiles;\n}\n\nconst IS_WORKER = !!process.env.NEXT_PRIVATE_WORKER;\nfunction debug(...args: Array<any>) {\n if (!process.env.DEBUG_VARLOCK_NEXT_INTEGRATION) return;\n // eslint-disable-next-line no-console\n console.log(\n IS_WORKER ? 'worker -- ' : 'server -- ',\n ...args,\n );\n}\ndebug('✨ LOADED @next/env module!');\n\n\n// Next.js only watches .env, .env.local, .env.development, .env.development.local\n// but we want to trigger reloads when .env.schema changes\n// so we set up an extra watcher, and trigger no-op changes to one of those files\nlet extraWatcherEnabled = false;\nconst NEXT_WATCHED_ENV_FILES = ['.env', '.env.local', '.env.development', '.env.development.local'];\nfunction enableExtraFileWatchers() {\n if (extraWatcherEnabled || IS_WORKER) return;\n extraWatcherEnabled = true;\n\n if (!rootDir) throw new Error('expected rootDir to be set');\n const envSchemaPath = path.join(rootDir, '.env.schema');\n // its faster to update an existing file, so we check if the user has any\n // otherwise we can create and destroy\n let envFilePathToUpdate: string | null = null;\n for (const envFileName of NEXT_WATCHED_ENV_FILES) {\n const filePath = path.join(rootDir, envFileName);\n if (fs.existsSync(filePath)) {\n envFilePathToUpdate = filePath;\n break;\n }\n }\n let destroyFile = false;\n if (!envFilePathToUpdate) {\n envFilePathToUpdate ||= path.join(rootDir, '.env');\n destroyFile = true;\n }\n\n debug('set up extra file watchers', envFilePathToUpdate, destroyFile);\n\n fs.watchFile(envSchemaPath, { interval: 500 }, (_curr, _prev) => {\n debug('.env.schema changed', envFilePathToUpdate, destroyFile);\n if (destroyFile) {\n fs.writeFileSync(envFilePathToUpdate, [\n '# This file was created by @varlock/nextjs-integration',\n '# It is used to trigger Next.js to reload when non-standard .env files change',\n '# You can safely ignore and delete it',\n '# @disable',\n '# ---',\n ].join('\\n'), 'utf-8');\n setTimeout(() => {\n fs.unlinkSync(envFilePathToUpdate);\n }, 1000);\n } else {\n const currentContents = fs.readFileSync(envFilePathToUpdate, 'utf-8');\n fs.writeFileSync(envFilePathToUpdate, currentContents, 'utf-8');\n }\n });\n}\n\nfunction detectOpenNextCloudflareBuild() {\n try {\n // the above works if the build is happening within CI, but we may need to do this for local builds or other CI platforms\n // so we can try to detect if we are within an open-next build by looking at the process info\n\n // we will look at the process tree to try to determine if we are in a opennext build\n // process tree looks like:\n // - opennext-cloudflare build > npm run build > next build\n\n // get grandparent process id\n const pppid = parseInt(execSync(`ps -o ppid= -p ${process.ppid}`).toString().trim());\n // const processInfo = execSync('ps -p '+grandparentPid+' -o command');\n // output looks like\n // ---\n // COMMAND\n // node /.../node_modules/.bin/opennextjs-cloudflare build\n //\n // ---\n const commandName = execSync(`ps -p ${pppid} -o command`).toString().split('\\n')[1];\n if (commandName.endsWith('.bin/opennextjs-cloudflare build')) {\n return true;\n }\n } catch (err) {\n // do nothing\n }\n return false;\n}\n\nfunction writeResolvedEnvFile() {\n // things get complicated on platforms like vercel/cloudflare, they do some of their own magic to load env vars\n // our loader (this file) will run during the _build_ process, but not when the platform is handling server rendered requests\n // also opennext is needed to run outside of vercel, so that adds other changes\n // so we export an additional .env file which the platform itself will automatically load\n\n const dotEnvStrLines = [];\n for (const [itemKey, itemInfo] of Object.entries(varlockLoadedEnv.config)) {\n if (itemInfo.value !== undefined) dotEnvStrLines.push(`${itemKey}=${JSON.stringify(itemInfo.value)}`);\n }\n\n if (\n detectOpenNextCloudflareBuild()\n || process.env.VERCEL || process.env.WORKERS_CI || process.env._VARLOCK_EXPORT_RESOLVED_ENV_FILE\n ) {\n dotEnvStrLines.unshift(`\n# 🛑 DO NOT CHECK THIS FILE INTO VERSION CONTROL 🛑\n# This file was automatically generated by @varlock/nextjs-integration\n# It contains a _fully resolved env_ to pass to platforms (ex: vercel, cloudflare, etc)\n# that are doing their own magic when booting up nextjs in certain scenarios\n#\n# It likely contains sensitive config data and should be deleted after use\n#\n# @disable # tells varlock to ignore this file\n# ---\n `);\n // this is the fully resolved env, which includes additional metadata about each item\n // our runtime code uses this to provide coerced values, redact sensitive values, etc\n dotEnvStrLines.push(`__VARLOCK_ENV=${JSON.stringify(varlockLoadedEnv)}`);\n\n let resolvedEnvFileName = '.env.production.local';\n if (process.env._VARLOCK_EXPORT_RESOLVED_ENV_FILE && !(['true', '1'].includes(process.env._VARLOCK_EXPORT_RESOLVED_ENV_FILE))) {\n resolvedEnvFileName = process.env._VARLOCK_EXPORT_RESOLVED_ENV_FILE;\n }\n if (!rootDir) throw new Error('expected rootDir to be set');\n fs.writeFileSync(path.resolve(rootDir, resolvedEnvFileName), dotEnvStrLines.join('\\n'), 'utf-8');\n }\n}\n\n// - these methods are the same as the original module -----------------\n\nexport function updateInitialEnv(newEnv: Env) {\n if (Object.keys(newEnv).length) {\n debug('updateInitialEnv', newEnv);\n Object.assign(initialEnv || {}, newEnv);\n }\n}\n\ntype Log = {\n info: (...args: Array<any>) => void\n error: (...args: Array<any>) => void\n};\n\nfunction replaceProcessEnv(sourceEnv: Env) {\n Object.keys(process.env).forEach((key) => {\n // Allow mutating internal Next.js env variables after the server has initiated.\n // This is necessary for dynamic things like the IPC server port.\n if (!key.startsWith('__NEXT_PRIVATE')) {\n if (sourceEnv[key] === undefined || sourceEnv[key] === '') {\n delete process.env[key];\n }\n }\n });\n\n Object.entries(sourceEnv).forEach(([key, value]) => {\n process.env[key] = value;\n });\n}\n\n// in original module, but does not appear to be used\nexport function processEnv(\n _loadedEnvFiles: LoadedEnvFiles,\n _dir?: string,\n _log: Log = console,\n _forceReload = false,\n _onReload?: (envFilePath: string) => void,\n) {\n return [process.env];\n}\n\nexport function resetEnv() {\n if (initialEnv) {\n replaceProcessEnv(initialEnv);\n }\n}\n\ntype LoadedEnvConfig = {\n combinedEnv: Env\n parsedEnv: Env | undefined\n loadedEnvFiles: LoadedEnvFiles\n};\n\nlet loadCount = 0;\n\nexport function loadEnvConfig(\n dir: string,\n dev?: boolean,\n _log: Log = console,\n forceReload = false,\n _onReload?: (envFilePath: string) => void,\n): LoadedEnvConfig {\n // store actual process.env so we can restore it later\n initialEnv ||= { ...process.env };\n\n debug('loadEnvConfig!', 'forceReload = ', forceReload);\n\n // onReload is used to show a log of which .env file changed\n // TODO: add similar log to show which env file changed\n\n rootDir ||= dir;\n if (rootDir !== dir) throw new Error('root directory changed');\n\n if (dev) enableExtraFileWatchers();\n\n let useCachedEnv = !!process.env.__VARLOCK_ENV;\n if (forceReload) {\n if (!lastReloadAt) {\n lastReloadAt = new Date();\n } else if (lastReloadAt.getTime() < Date.now() - 1000) {\n lastReloadAt = new Date();\n useCachedEnv = false;\n }\n }\n\n if (useCachedEnv) {\n if (!varlockLoadedEnv) {\n varlockLoadedEnv = JSON.parse(process.env.__VARLOCK_ENV || '{}');\n parsedEnv = Object.fromEntries(\n Object.entries(varlockLoadedEnv.config).map(([key, value]) => [key, value.value]),\n );\n\n resetRedactionMap(varlockLoadedEnv);\n debug('patching console with varlock redactor');\n patchGlobalConsole();\n }\n\n combinedEnv = { ...initialEnv, ...parsedEnv };\n\n debug('>> USING CACHED ENV');\n\n return { combinedEnv, parsedEnv, loadedEnvFiles };\n }\n\n lastReloadAt = new Date();\n\n debug('>> RELOADING ENV');\n replaceProcessEnv(initialEnv);\n\n // we must match @next/env default behaviour for which .env.XXX files to load\n // which is based on the current command (`next dev` vs `next build`) and `NODE_ENV=test`\n // however we will pass it through and let the user ignore it by setting their own `@envFlag`\n let envFromNextCommand = dev ? 'development' : 'production';\n if (process.env.NODE_ENV === 'test') envFromNextCommand = 'test';\n debug('Inferred env mode (to match @next/env):', envFromNextCommand);\n\n try {\n loadCount++;\n const varlockLoadedEnvStr = execSyncVarlock(`load --format json-full --env ${envFromNextCommand}`, {\n // in dev, there are 2 loads up front, so we dont show the first\n showLogsOnError: !dev || loadCount > 1,\n // in a build, we want to fail and exit, while in dev we can keep retrying when changes are detected\n exitOnError: !dev,\n env: initialEnv as any,\n });\n if (loadCount >= 2) {\n // eslint-disable-next-line no-console\n console.log('✅ env reloaded and validated');\n }\n varlockLoadedEnv = JSON.parse(varlockLoadedEnvStr);\n } catch (err) {\n // this error message comes from execSyncVarlock when it cannot find varlock\n if ((err as any).message.includes('Unable to find varlock executable')) {\n // eslint-disable-next-line no-console\n console.error([\n '',\n '❌ ERROR: varlock not found',\n 'varlock is a required peer dependency of @varlock/nextjs-integration',\n '',\n 'Please add varlock as a dependency to your project (e.g., `npm install varlock`)',\n ].join('\\n'));\n process.exit(1);\n }\n\n // if we dont do this, we'll see an error that looks like `process.env.__VARLOCK_ENV is not set` which is misleading.\n // Ideally we would pass through an error of some kind and trigger the webpack runtime error popup\n process.env.__VARLOCK_ENV = JSON.stringify({\n sources: [],\n config: {},\n settings: {},\n });\n\n return { combinedEnv: {}, parsedEnv: {}, loadedEnvFiles: [] };\n }\n\n parsedEnv = {};\n for (const [itemKey, itemInfo] of Object.entries(varlockLoadedEnv.config)) {\n parsedEnv[itemKey] = itemInfo.value;\n }\n debug('LOADED ENV:', parsedEnv);\n process.env.__VARLOCK_ENV = JSON.stringify(varlockLoadedEnv);\n initVarlockEnv(); // calling this will set process.env vars\n\n resetRedactionMap(varlockLoadedEnv);\n debug('patching console with varlock redactor');\n patchGlobalConsole();\n\n combinedEnv = { ...initialEnv, ...parsedEnv };\n loadedEnvFiles = getVarlockSourcesAsLoadedEnvFiles();\n\n // if not a dev build, we may need to write a temp resolved .env file\n if (!dev) writeResolvedEnvFile();\n\n return { combinedEnv, parsedEnv, loadedEnvFiles };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/next-env-compat.ts"],"names":["initialEnv","path","fs","execSync","resetRedactionMap","patchGlobalConsole","execSyncVarlock","initVarlockEnv"],"mappings":"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","file":"next-env-compat.js","sourcesContent":["/**\n * Drop-in replacement for @next/env that uses varlock instead of dotenv\n *\n * This must be the default export of the module, and it must stay compatible with @next/env\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { execSync } from 'child_process';\nimport { type SerializedEnvGraph } from 'varlock';\nimport { initVarlockEnv, resetRedactionMap } from 'varlock/env';\nimport { patchGlobalConsole } from 'varlock/patch-console';\nimport { execSyncVarlock } from 'varlock/exec-sync-varlock';\n\nexport type Env = { [key: string]: string | undefined };\nexport type LoadedEnvFiles = Array<{\n path: string\n contents: string\n env: Env\n}>;\n\n/** will store the original values of process.env */\nexport let initialEnv: Env | undefined;\n\nlet lastReloadAt: Date | undefined;\n\nlet varlockLoadedEnv: SerializedEnvGraph;\nlet combinedEnv: Env | undefined;\nlet parsedEnv: Env | undefined;\n// this is used by next just to display the list of .env files in a startup log\nlet loadedEnvFiles: LoadedEnvFiles = [];\nlet rootDir: string | undefined;\n\n// @next/env exports this info and currently it is only used to display\n// a list of filenames loaded, for example: `Environments: .env, .env.development`\nfunction getVarlockSourcesAsLoadedEnvFiles(): LoadedEnvFiles {\n const envFiles = varlockLoadedEnv.sources\n // TODO expose more info so we can filter out disabled sources\n // and maybe show relative paths\n .filter((s) => s.enabled && !s.label.startsWith('directory -'))\n .map((s) => ({\n path: s.label,\n contents: '',\n env: {},\n }));\n if (envFiles.length) {\n // this adds an additional line, below the list of files\n envFiles.push({ path: '\\n ✨ loaded by varlock ✨', contents: '', env: {} });\n }\n return envFiles;\n}\n\nconst IS_WORKER = !!process.env.NEXT_PRIVATE_WORKER;\nfunction debug(...args: Array<any>) {\n if (!process.env.DEBUG_VARLOCK_NEXT_INTEGRATION) return;\n // eslint-disable-next-line no-console\n console.log(\n IS_WORKER ? 'worker -- ' : 'server -- ',\n ...args,\n );\n}\ndebug('✨ LOADED @next/env module!');\n\n\n// Next.js only watches .env, .env.local, .env.development, .env.development.local\n// but we want to trigger reloads when .env.schema changes\n// so we set up an extra watcher, and trigger no-op changes to one of those files\nlet extraWatcherEnabled = false;\nconst NEXT_WATCHED_ENV_FILES = ['.env', '.env.local', '.env.development', '.env.development.local'];\nfunction enableExtraFileWatchers() {\n if (extraWatcherEnabled || IS_WORKER) return;\n extraWatcherEnabled = true;\n\n if (!rootDir) throw new Error('expected rootDir to be set');\n const envSchemaPath = path.join(rootDir, '.env.schema');\n // its faster to update an existing file, so we check if the user has any\n // otherwise we can create and destroy\n let envFilePathToUpdate: string | null = null;\n for (const envFileName of NEXT_WATCHED_ENV_FILES) {\n const filePath = path.join(rootDir, envFileName);\n if (fs.existsSync(filePath)) {\n envFilePathToUpdate = filePath;\n break;\n }\n }\n let destroyFile = false;\n if (!envFilePathToUpdate) {\n envFilePathToUpdate ||= path.join(rootDir, '.env');\n destroyFile = true;\n }\n\n debug('set up extra file watchers', envFilePathToUpdate, destroyFile);\n\n fs.watchFile(envSchemaPath, { interval: 500 }, (_curr, _prev) => {\n debug('.env.schema changed', envFilePathToUpdate, destroyFile);\n if (destroyFile) {\n fs.writeFileSync(envFilePathToUpdate, [\n '# This file was created by @varlock/nextjs-integration',\n '# It is used to trigger Next.js to reload when non-standard .env files change',\n '# You can safely ignore and delete it',\n '# @disable',\n '# ---',\n ].join('\\n'), 'utf-8');\n setTimeout(() => {\n fs.unlinkSync(envFilePathToUpdate);\n }, 1000);\n } else {\n const currentContents = fs.readFileSync(envFilePathToUpdate, 'utf-8');\n fs.writeFileSync(envFilePathToUpdate, currentContents, 'utf-8');\n }\n });\n}\n\nfunction detectOpenNextCloudflareBuild() {\n try {\n // the above works if the build is happening within CI, but we may need to do this for local builds or other CI platforms\n // so we can try to detect if we are within an open-next build by looking at the process info\n\n // we will look at the process tree to try to determine if we are in a opennext build\n // process tree looks like:\n // - opennext-cloudflare build > npm run build > next build\n\n // get grandparent process id\n const pppid = parseInt(execSync(`ps -o ppid= -p ${process.ppid}`).toString().trim());\n // const processInfo = execSync('ps -p '+grandparentPid+' -o command');\n // output looks like\n // ---\n // COMMAND\n // node /.../node_modules/.bin/opennextjs-cloudflare build\n //\n // ---\n const commandName = execSync(`ps -p ${pppid} -o command`).toString().split('\\n')[1];\n if (commandName.endsWith('.bin/opennextjs-cloudflare build')) {\n return true;\n }\n } catch (err) {\n // do nothing\n }\n return false;\n}\n\nfunction writeResolvedEnvFile() {\n // things get complicated on platforms like vercel/cloudflare, they do some of their own magic to load env vars\n // our loader (this file) will run during the _build_ process, but not when the platform is handling server rendered requests\n // also opennext is needed to run outside of vercel, so that adds other changes\n // so we export an additional .env file which the platform itself will automatically load\n\n const dotEnvStrLines = [];\n for (const [itemKey, itemInfo] of Object.entries(varlockLoadedEnv.config)) {\n if (itemInfo.value !== undefined) dotEnvStrLines.push(`${itemKey}=${JSON.stringify(itemInfo.value)}`);\n }\n\n if (\n detectOpenNextCloudflareBuild()\n || process.env.VERCEL || process.env.WORKERS_CI || process.env._VARLOCK_EXPORT_RESOLVED_ENV_FILE\n ) {\n dotEnvStrLines.unshift(`\n# 🛑 DO NOT CHECK THIS FILE INTO VERSION CONTROL 🛑\n# This file was automatically generated by @varlock/nextjs-integration\n# It contains a _fully resolved env_ to pass to platforms (ex: vercel, cloudflare, etc)\n# that are doing their own magic when booting up nextjs in certain scenarios\n#\n# It likely contains sensitive config data and should be deleted after use\n#\n# @disable # tells varlock to ignore this file\n# ---\n `);\n // this is the fully resolved env, which includes additional metadata about each item\n // our runtime code uses this to provide coerced values, redact sensitive values, etc\n dotEnvStrLines.push(`__VARLOCK_ENV=${JSON.stringify(varlockLoadedEnv)}`);\n\n let resolvedEnvFileName = '.env.production.local';\n if (process.env._VARLOCK_EXPORT_RESOLVED_ENV_FILE && !(['true', '1'].includes(process.env._VARLOCK_EXPORT_RESOLVED_ENV_FILE))) {\n resolvedEnvFileName = process.env._VARLOCK_EXPORT_RESOLVED_ENV_FILE;\n }\n if (!rootDir) throw new Error('expected rootDir to be set');\n fs.writeFileSync(path.resolve(rootDir, resolvedEnvFileName), dotEnvStrLines.join('\\n'), 'utf-8');\n }\n}\n\n// - these methods are the same as the original module -----------------\n\nexport function updateInitialEnv(newEnv: Env) {\n if (Object.keys(newEnv).length) {\n debug('updateInitialEnv', newEnv);\n Object.assign(initialEnv || {}, newEnv);\n }\n}\n\ntype Log = {\n info: (...args: Array<any>) => void\n error: (...args: Array<any>) => void\n};\n\nfunction replaceProcessEnv(sourceEnv: Env) {\n Object.keys(process.env).forEach((key) => {\n // Allow mutating internal Next.js env variables after the server has initiated.\n // This is necessary for dynamic things like the IPC server port.\n if (!key.startsWith('__NEXT_PRIVATE')) {\n if (sourceEnv[key] === undefined || sourceEnv[key] === '') {\n delete process.env[key];\n }\n }\n });\n\n Object.entries(sourceEnv).forEach(([key, value]) => {\n process.env[key] = value;\n });\n}\n\n// in original module, but does not appear to be used\nexport function processEnv(\n _loadedEnvFiles: LoadedEnvFiles,\n _dir?: string,\n _log: Log = console,\n _forceReload = false,\n _onReload?: (envFilePath: string) => void,\n) {\n return [process.env];\n}\n\nexport function resetEnv() {\n if (initialEnv) {\n replaceProcessEnv(initialEnv);\n }\n}\n\ntype LoadedEnvConfig = {\n combinedEnv: Env\n parsedEnv: Env | undefined\n loadedEnvFiles: LoadedEnvFiles\n};\n\nlet loadCount = 0;\n\nexport function loadEnvConfig(\n dir: string,\n dev?: boolean,\n _log: Log = console,\n forceReload = false,\n _onReload?: (envFilePath: string) => void,\n): LoadedEnvConfig {\n // store actual process.env so we can restore it later\n initialEnv ||= { ...process.env };\n\n debug('loadEnvConfig!', 'forceReload = ', forceReload);\n\n // onReload is used to show a log of which .env file changed\n // TODO: add similar log to show which env file changed\n\n rootDir ||= dir;\n if (rootDir !== dir) throw new Error('root directory changed');\n\n if (dev) enableExtraFileWatchers();\n\n let useCachedEnv = !!process.env.__VARLOCK_ENV;\n if (forceReload) {\n if (!lastReloadAt) {\n lastReloadAt = new Date();\n } else if (lastReloadAt.getTime() < Date.now() - 1000) {\n lastReloadAt = new Date();\n useCachedEnv = false;\n }\n }\n\n if (useCachedEnv) {\n if (!varlockLoadedEnv) {\n varlockLoadedEnv = JSON.parse(process.env.__VARLOCK_ENV || '{}');\n parsedEnv = Object.fromEntries(\n Object.entries(varlockLoadedEnv.config).map(([key, value]) => [key, value.value]),\n );\n\n resetRedactionMap(varlockLoadedEnv);\n debug('patching console with varlock redactor');\n patchGlobalConsole();\n }\n\n combinedEnv = { ...initialEnv, ...parsedEnv };\n\n debug('>> USING CACHED ENV');\n\n return { combinedEnv, parsedEnv, loadedEnvFiles };\n }\n\n lastReloadAt = new Date();\n\n debug('>> RELOADING ENV');\n replaceProcessEnv(initialEnv);\n\n // we must match @next/env default behaviour for which .env.XXX files to load\n // which is based on the current command (`next dev` vs `next build`) and `NODE_ENV=test`\n // however we will pass it through and let the user ignore it by setting their own `@currentEnv`\n let envFromNextCommand = dev ? 'development' : 'production';\n if (process.env.NODE_ENV === 'test') envFromNextCommand = 'test';\n debug('Inferred env mode (to match @next/env):', envFromNextCommand);\n\n try {\n loadCount++;\n const varlockLoadedEnvStr = execSyncVarlock(`load --format json-full --env ${envFromNextCommand}`, {\n // in dev, there are 2 loads up front, so we dont show the first\n showLogsOnError: !dev || loadCount > 1,\n // in a build, we want to fail and exit, while in dev we can keep retrying when changes are detected\n exitOnError: !dev,\n env: initialEnv as any,\n });\n if (loadCount >= 2) {\n // eslint-disable-next-line no-console\n console.log('✅ env reloaded and validated');\n }\n varlockLoadedEnv = JSON.parse(varlockLoadedEnvStr);\n } catch (err) {\n // this error message comes from execSyncVarlock when it cannot find varlock\n if ((err as any).message.includes('Unable to find varlock executable')) {\n // eslint-disable-next-line no-console\n console.error([\n '',\n '❌ ERROR: varlock not found',\n 'varlock is a required peer dependency of @varlock/nextjs-integration',\n '',\n 'Please add varlock as a dependency to your project (e.g., `npm install varlock`)',\n ].join('\\n'));\n process.exit(1);\n }\n\n // if we dont do this, we'll see an error that looks like `process.env.__VARLOCK_ENV is not set` which is misleading.\n // Ideally we would pass through an error of some kind and trigger the webpack runtime error popup\n process.env.__VARLOCK_ENV = JSON.stringify({\n sources: [],\n config: {},\n settings: {},\n });\n\n return { combinedEnv: {}, parsedEnv: {}, loadedEnvFiles: [] };\n }\n\n parsedEnv = {};\n for (const [itemKey, itemInfo] of Object.entries(varlockLoadedEnv.config)) {\n parsedEnv[itemKey] = itemInfo.value;\n }\n debug('LOADED ENV:', parsedEnv);\n process.env.__VARLOCK_ENV = JSON.stringify(varlockLoadedEnv);\n initVarlockEnv(); // calling this will set process.env vars\n\n resetRedactionMap(varlockLoadedEnv);\n debug('patching console with varlock redactor');\n patchGlobalConsole();\n\n combinedEnv = { ...initialEnv, ...parsedEnv };\n loadedEnvFiles = getVarlockSourcesAsLoadedEnvFiles();\n\n // if not a dev build, we may need to write a temp resolved .env file\n if (!dev) writeResolvedEnvFile();\n\n return { combinedEnv, parsedEnv, loadedEnvFiles };\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@varlock/nextjs-integration",
|
|
3
3
|
"description": "drop-in replacement for @next/env that uses varlock to load .env files with validation and extra security features",
|
|
4
|
-
"version": "0.0
|
|
4
|
+
"version": "1.0.0",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
7
7
|
"url": "https://github.com/dmno-dev/varlock.git",
|
|
@@ -37,13 +37,13 @@
|
|
|
37
37
|
},
|
|
38
38
|
"peerDependencies": {
|
|
39
39
|
"next": ">=14",
|
|
40
|
-
"varlock": "^0.0
|
|
40
|
+
"varlock": "^0.1.0"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
|
-
"@types/node": "
|
|
43
|
+
"@types/node": "24.9.2",
|
|
44
44
|
"tsup": "^8.5.0",
|
|
45
|
-
"vitest": "^
|
|
46
|
-
"varlock": "^0.0
|
|
45
|
+
"vitest": "^4.0.6",
|
|
46
|
+
"varlock": "^0.1.0"
|
|
47
47
|
},
|
|
48
48
|
"scripts": {
|
|
49
49
|
"dev": "tsup --watch",
|