You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							241 lines
						
					
					
						
							4.9 KiB
						
					
					
				
			
		
		
	
	
							241 lines
						
					
					
						
							4.9 KiB
						
					
					
				| # env-schema
 | |
| 
 | |
| 
 | |
| [](https://www.npmjs.com/package/env-schema)
 | |
| [](https://snyk.io/test/github/fastify/env-schema)
 | |
| [](https://coveralls.io/github/fastify/env-schema?branch=master)
 | |
| [](https://standardjs.com/)
 | |
| 
 | |
| Utility to check environment variables using [JSON schema](https://json-schema.org/), [Ajv](http://npm.im/ajv), and
 | |
| [dotenv](http://npm.im/dotenv).
 | |
| 
 | |
| ## Install
 | |
| 
 | |
| ```
 | |
| npm install --save env-schema
 | |
| ```
 | |
| 
 | |
| ## Usage
 | |
| 
 | |
| ```js
 | |
| const envSchema = require('env-schema')
 | |
| 
 | |
| const schema = {
 | |
|   type: 'object',
 | |
|   required: [ 'PORT' ],
 | |
|   properties: {
 | |
|     PORT: {
 | |
|       type: 'number',
 | |
|       default: 3000
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| const config = envSchema({
 | |
|   schema: schema,
 | |
|   data: data, // optional, default: process.env
 | |
|   dotenv: true // load .env if it is there, default: false
 | |
|   // or you can pass DotenvConfigOptions
 | |
|   // dotenv: {
 | |
|   //   path: '/custom/path/to/.env'
 | |
|   // }
 | |
| })
 | |
| 
 | |
| console.log(config)
 | |
| // output: { PORT: 3000 }
 | |
| ```
 | |
| 
 | |
| see [DotenvConfigOptions](https://github.com/motdotla/dotenv#options)
 | |
| 
 | |
| ### Custom ajv instance
 | |
| 
 | |
| Optionally, the user can supply their own ajv instance:
 | |
| 
 | |
| ```js
 | |
| const envSchema = require('env-schema')
 | |
| const Ajv = require('ajv')
 | |
| 
 | |
| const schema = {
 | |
|   type: 'object',
 | |
|   required: [ 'PORT' ],
 | |
|   properties: {
 | |
|     PORT: {
 | |
|       type: 'number',
 | |
|       default: 3000
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| const config = envSchema({
 | |
|   schema: schema,
 | |
|   data: data,
 | |
|   dotenv: true,
 | |
|   ajv: new Ajv({
 | |
|     allErrors: true,
 | |
|     removeAdditional: true,
 | |
|     useDefaults: true,
 | |
|     coerceTypes: true,
 | |
|     allowUnionTypes: true
 | |
|   })
 | |
| })
 | |
| 
 | |
| console.log(config)
 | |
| // output: { PORT: 3000 }
 | |
| ```
 | |
| 
 | |
| It is possible to enhance the default ajv instance providing the `customOptions` function parameter.
 | |
| This example shows how to use the `format` keyword in your schemas.
 | |
| 
 | |
| ```js
 | |
| const config = envSchema({
 | |
|   schema: schema,
 | |
|   data: data,
 | |
|   dotenv: true,
 | |
|   ajv: {
 | |
|     customOptions (ajvInstance) {
 | |
|       require('ajv-formats')(ajvInstance)
 | |
|       return ajvInstance
 | |
|     }
 | |
|   }
 | |
| })
 | |
| ```
 | |
| 
 | |
| Note that it is mandatory returning the ajv instance.
 | |
| 
 | |
| ### Fluent-Schema API
 | |
| 
 | |
| It is also possible to use [fluent-json-schema](http://npm.im/fluent-json-schema):
 | |
| 
 | |
| ```js
 | |
| const envSchema = require('env-schema')
 | |
| const S = require('fluent-json-schema')
 | |
| 
 | |
| const config = envSchema({
 | |
|   schema: S.object().prop('port', S.number().default(3000).required()),
 | |
|   data: data, // optional, default: process.env
 | |
|   dotenv: true, // load .env if it is there, default: false
 | |
|   expandEnv: true, // use dotenv-expand, default: false
 | |
| })
 | |
| 
 | |
| console.log(config)
 | |
| // output: { PORT: 3000 }
 | |
| ```
 | |
| 
 | |
| **NB** Support for additional properties in the schema is disabled for this plugin, with the `additionalProperties` flag set to `false` internally.
 | |
| 
 | |
| ### Custom keywords
 | |
| This library supports the following Ajv custom keywords:
 | |
| 
 | |
| #### `separator`
 | |
| Type: `string`
 | |
| 
 | |
| Applies to type: `string`
 | |
| 
 | |
| When present, the provided schema value will be split on this value.
 | |
| 
 | |
| Example:
 | |
| ```js
 | |
| const envSchema = require('env-schema')
 | |
| 
 | |
| const schema = {
 | |
|   type: 'object',
 | |
|   required: [ 'ALLOWED_HOSTS' ],
 | |
|   properties: {
 | |
|     ALLOWED_HOSTS: {
 | |
|       type: 'string',
 | |
|       separator: ','
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| const data = {
 | |
|   ALLOWED_HOSTS: '127.0.0.1,0.0.0.0'
 | |
| }
 | |
| 
 | |
| const config = envSchema({
 | |
|   schema: schema,
 | |
|   data: data, // optional, default: process.env
 | |
|   dotenv: true // load .env if it is there, default: false
 | |
| }) 
 | |
| 
 | |
| // config.data => ['127.0.0.1', '0.0.0.0']
 | |
| ```
 | |
| 
 | |
| The ajv keyword definition objects can be accessed through the property `keywords` on the `envSchema` function:
 | |
| 
 | |
| ```js
 | |
| const envSchema = require('env-schema')
 | |
| const Ajv = require('ajv')
 | |
| 
 | |
| const schema = {
 | |
|   type: 'object',
 | |
|   properties: {
 | |
|     names: {
 | |
|       type: 'string',
 | |
|       separator: ','
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| const config = envSchema({
 | |
|   schema: schema,
 | |
|   data: data,
 | |
|   dotenv: true,
 | |
|   ajv: new Ajv({
 | |
|     allErrors: true,
 | |
|     removeAdditional: true,
 | |
|     useDefaults: true,
 | |
|     coerceTypes: true,
 | |
|     allowUnionTypes: true,
 | |
|     keywords: [envSchema.keywords.separator]
 | |
|   })
 | |
| })
 | |
| 
 | |
| console.log(config)
 | |
| // output: { names: ['foo', 'bar'] }
 | |
| ```
 | |
| 
 | |
| ### TypeScript
 | |
| 
 | |
| You can specify the type of your `config`:
 | |
| 
 | |
| ```ts
 | |
| import envSchema from 'env-schema';
 | |
| 
 | |
| interface Env {
 | |
|   PORT: number;
 | |
| }
 | |
| 
 | |
| const schema = {
 | |
|   type: 'object',
 | |
|   required: [ 'PORT' ],
 | |
|   properties: {
 | |
|     PORT: {
 | |
|       type: 'number',
 | |
|       default: 3000
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| const config = envSchema<Env>({
 | |
|   schema,
 | |
| })
 | |
| ```
 | |
| 
 | |
| If no type is specified the `config` will have the `EnvSchemaData` type.
 | |
| 
 | |
| ```ts
 | |
| export type EnvSchemaData = {
 | |
|   [key: string]: unknown;
 | |
| }
 | |
| ```
 | |
| 
 | |
| ## Acknowledgements
 | |
| 
 | |
| Kindly sponsored by [Mia Platform](https://www.mia-platform.eu/) and
 | |
| [NearForm](https://nearform.com).
 | |
| 
 | |
| ## License
 | |
| 
 | |
| MIT
 |