UNPKG

@hairy/lnv

Version:
257 lines (202 loc) 7.95 kB
# @hairy/lnv [![npm version][npm-version-src]][npm-version-href] [![npm downloads][npm-downloads-src]][npm-downloads-href] [![bundle][bundle-src]][bundle-href] [![JSDocs][jsdocs-src]][jsdocs-href] [![License][license-src]][license-href] Loading environment variables in Next.js and other frameworks can be quite cumbersome, and using dotenv or vault at runtime is also inconvenient. That's why my created this tool I think it can solve some of the problems you encounter in next.js or dotenv or more. 🛠️ ## ✅ Features - 🔄 Multi-mode support, allowing you to load `.env|.env.prod|.env.local` simultaneously - 🔐 Support for [vault.dotenv](https://vault.dotenv.org/ui/ui1/project/b0Cgew/env-vault) remote environment variable loading and multi-environment switching - 🛡️ Direct writing to process.env, no local storage, more secure and reliable - 📁 Environment variables lookup, naturally supports monorepo architecture - 🏃‍♂️ Run any JS and scripts with environment variables - 📜 Define your integration config with `lnv.config.ts` ## 📦 Install ```bash npm install @hairy/lnv # or globally npm install -g @hairy/lnv ``` ## 🚀 Usage Modify the scripts field in your `package.json`: ```json { "scripts": { "dev": "lnv staging -- next dev" } } ``` This will launch `next dev` with the `.env.staging` environment variables. ✨ You can also include any run parameters, for example: ```sh lnv prod -- next dev --turbopack ``` ## 🌿 Default Environment Variables You don't need any action, the `.env.local` and `.env` environment variables will be automatically loaded by default. ## 🔒 Vault Environment Variables <details> <summary>Before loading variables from vault, you need to connect to the vault environment variable repository in your project</summary><br> ```sh npx dotenv-vault@latest new npx dotenv-vault@latest vlt_... ``` ```sh npx dotenv-vault@latest pull npx dotenv-vault@latest build ```sh # Create and connect to vault repository npx dotenv-vault@latest new # Connect to an existing vault repository npx dotenv-vault@latest vlt_... # And encrypt your environment variables: npx dotenv-vault@latest pull # or npx dotenv-vault@latest build ``` Next, you need to create a `.env.key` or `.env.keys` file in your project root directory and write the [DOTENV_KEY](https://www.dotenv.org/docs/security/dotenv-key): ```sh # .env.key DOTENV_KEY = dotenv://...?environment=development # or # .env.keys DOTENV_KEY_DEVELOPMENT = dotenv://...?environment=development DOTENV_KEY_CI = dotenv://:...?environment=ci DOTENV_KEY_STAGING = dotenv://:...?environment=staging DOTENV_KEY_PRODUCTION = dotenv://:...?environment=production ``` Finally, you can use the `lnv` command to include vault environment variables: ```sh # Load environment variables based on .env.vault and .env.key lnv vault -- node index.js # Load ci environment variables based on .env.vault and .env.keys lnv vault:ci -- node index.js ``` <br></details> ## 🚢 Vercel with Vault If you need to deploy on Vercel, you need to add environment variables in your Vercel project: ```sh npx vercel@latest env add DOTENV_KEY ``` lnv vault will automatically load environment variables based on .env.vault. 🎉 ## ✍️ Manual with environment variables You can manual load environment variables with the `-v|--value` parameter: ```sh lnv -v KEY1=value1 -v KEY2=value2 -- node index.js ``` By adding the $prefix, you can reference the value of an environment variable in the settings or command line: ```sh lnv -v KEY1=value1 -v KEY2=value1 -v KEY3=$KEY1_$KEY2 -- node index.js ## or lnv -v KEY1=value1 -- node -e 'console.log($KEY1)' ``` ## 📝 Define Your integration Config `lnv.config.ts ` is used to add actionable command-line scripts and default injected environment variables. ```ts import fs from 'node:fs/promises' import { defineConfig } from '@hairy/lnv' const config = defineConfig({ /** * Environment variable injection, applied to all LNV scripts */ injects: { /** * Inject before reading environment variables */ before: { DB_TYPE: 'mysql', DB_HOST: 'localhost', DB_PORT: '3306', DB_USER: 'root', }, /** * Default loaded environment variable entries */ entries: ['local', 'vault', 'remote'], /** * Inject after reading environment variables */ after: { DATABASE_URL: '$DB_TYPE://$DB_USER:$DB_PASSWORD@$DB_HOST:$DB_PORT/$DB_NAME', }, }, }) export default config ``` The 'scripts' field is used to define operable command-line scripts, which can be understood as scripts in `package.json`, but with more powerful capabilities. ```ts const config = defineConfig({ scripts: { // command: npm run lnv deploy deploy: { message: 'Deploy the application', prompts: [ { key: 'network', message: 'Select Your Network', options: [ { value: 'moonchain', label: 'Moonchain' }, { value: 'moonchainGeneva', label: 'Moonchain Geneva' }, ], }, { key: 'modulePath', message: 'Select the module you want to deploy', options: async () => { const files = await fs.readdir('./ignition/modules') return files.map(file => ({ value: `./ignition/modules/${file}`, label: file.replace('.ts', ''), })) }, }, ], command: 'hardhat --build-profile production ignition deploy $modulePath --network $network', }, // command: npm run lnv dev dev: { message: 'Run the development server', command: { message: 'Select the project you want to run', options: [ { value: 'cd packages/project-1 && npm run dev', label: 'project-1', }, { value: 'cd packages/project-2 && npm run dev', label: 'project-2', }, ], }, }, }, }) export default config ``` ## 🔍️ Options ```sh lnv <entry|script> [args] args: --version show version [boolean] -v, --value set environment variables [array] -e, --entry Explicit loading of entry, same as lnv <entry> [string] -r, --run load runtime environment and run any scripts [string] --write expose and write environment variables [boolean] -d, --depth depth find and merge environment variables [boolean] -h, --help show help [boolean] ``` ## 📄 License [MIT](./LICENSE) License © [Hairyf](https://github.com/hairyf) <!-- Badges --> [npm-version-src]: https://img.shields.io/npm/v/@hairy/lnv?style=flat&colorA=080f12&colorB=1fa669 [npm-version-href]: https://npmjs.com/package/@hairy/lnv [npm-downloads-src]: https://img.shields.io/npm/dm/@hairy/lnv?style=flat&colorA=080f12&colorB=1fa669 [npm-downloads-href]: https://npmjs.com/package/@hairy/lnv [bundle-src]: https://img.shields.io/bundlephobia/minzip/@hairy/lnv?style=flat&colorA=080f12&colorB=1fa669&label=minzip [bundle-href]: https://bundlephobia.com/result?p=@hairy/lnv [license-src]: https://img.shields.io/github/license/hairyf/lnv.svg?style=flat&colorA=080f12&colorB=1fa669 [license-href]: https://github.com/hairyf/lnv/blob/main/LICENSE.md [jsdocs-src]: https://img.shields.io/badge/jsdocs-reference-080f12?style=flat&colorA=080f12&colorB=1fa669 [jsdocs-href]: https://www.jsdocs.io/package/@hairy/lnv