/// import { URL } from 'url'; type PublicAccessors = { /** * Converts a number to an integer and verifies it's in port ranges 0-65535 */ asPortNumber: (input: string) => number /** * Attempt to parse the variable to a float. Throws an exception if parsing fails. */ asFloat: (input: string) => number; /** * Performs the same task as asFloat(), but also verifies that the number is positive (greater than or equal to zero). */ asFloatPositive: (input: string) => number; /** * Performs the same task as asFloat(), but also verifies that the number is negative (less than or equal to zero). */ asFloatNegative: (input: string) => number; /** * Attempt to parse the variable to an integer. Throws an exception if parsing fails. * This is a strict check, meaning that if the process.env value is 1.2, an exception will be raised rather than rounding up/down. */ asInt: (input: string) => number; /** * Performs the same task as asInt(), but also verifies that the number is positive (greater than or equal to zero). */ asIntPositive: (input: string) => number; /** * Performs the same task as asInt(), but also verifies that the number is negative (less than or equal to zero). */ asIntNegative: (input: string) => number; /** * Return the variable value as a String. Throws an exception if value is not a String. * It's highly unlikely that a variable will not be a String since all process.env entries you set in bash are Strings by default. */ asString: (input: string) => string; /** * Return the variable value as an Email. Throws an exception if value is not an Email. */ asEmailString: (input: string) => string; /** * Attempt to parse the variable to a JSON Object or Array. Throws an exception if parsing fails. */ asJson: (input: string) => Object|Array; /** * The same as asJson but checks that the data is a JSON Array, e.g [1,2]. */ asJsonArray: (input: string) => Array; /** * The same as asJson but checks that the data is a JSON Object, e.g {a: 1}. */ asJsonObject: (input: string) => Object; /** * Reads an environment variable as a string, then splits it on each occurrence of the specified delimiter. * By default a comma is used as the delimiter. For example a var set to "1,2,3" would become ['1', '2', '3']. */ asArray: (input: string, delimiter?: string) => Array; /** * Reads an environment variable as a string, then splits it on each occurrence of the specified delimiter. * By default a comma is used as the delimiter. For example a var set to "1,2,3" would become new Set(['1', '2', '3']). */ asSet: (input: string, delimiter?: string) => Set; /** * Attempt to parse the variable to a Boolean. Throws an exception if parsing fails. * The var must be set to either "true", "false" (upper or lowercase), 0 or 1 to succeed. */ asBool: (input: string) => boolean; /** * Attempt to parse the variable to a Boolean. Throws an exception if parsing fails. * The var must be set to either "true" or "false" (upper or lowercase) to succeed. */ asBoolStrict: (input: string) => boolean; /** * Verifies that the variable is a valid URL string and returns the validated * string. The validation is performed by passing the URL string to the * Node.js URL constructor. * * Note that URLs without paths will have a default path `/` appended when read, e.g. * `https://api.acme.org` would become `https://api.acme.org/`. Always use URL * safe utilities included in the Node.js URL module to create * valid URL strings, instead of error prone string concatenation. */ asUrlString: (input: string) => string; /** * Verifies that the variable is a valid URL string using the same method as * `asUrlString()`, but instead returns the resulting URL instance. */ asUrlObject: (input: string) => URL; /** * Verifies that the var being accessed is one of the given values */ asEnum: (input: string, validValues: readonly T[]|T[]) => T; } interface VariableAccessors { /** * Converts a number to an integer and verifies it's in port ranges 0-65535 */ asPortNumber: () => AlternateType extends undefined ? undefined|number : number /** * Attempt to parse the variable to a float. Throws an exception if parsing fails. */ asFloat: () => AlternateType extends undefined ? undefined|number : number; /** * Performs the same task as asFloat(), but also verifies that the number is positive (greater than or equal to zero). */ asFloatPositive: () => AlternateType extends undefined ? undefined|number : number; /** * Performs the same task as asFloat(), but also verifies that the number is negative (less than or equal to zero). */ asFloatNegative: () => AlternateType extends undefined ? undefined|number : number; /** * Attempt to parse the variable to an integer. Throws an exception if parsing fails. * This is a strict check, meaning that if the process.env value is 1.2, an exception will be raised rather than rounding up/down. */ asInt: () => AlternateType extends undefined ? undefined|number : number; /** * Performs the same task as asInt(), but also verifies that the number is positive (greater than or equal to zero). */ asIntPositive: () => AlternateType extends undefined ? undefined|number : number; /** * Performs the same task as asInt(), but also verifies that the number is negative (less than or equal to zero). */ asIntNegative: () => AlternateType extends undefined ? undefined|number : number; /** * Return the variable value as a String. Throws an exception if value is not a String. * It's highly unlikely that a variable will not be a String since all process.env entries you set in bash are Strings by default. */ asString: () => AlternateType extends undefined ? undefined|string : string; /** * Return the variable value as an Email. Throws an exception if value is not an Email. */ asEmailString: () => AlternateType extends undefined ? undefined|string : string; /** * Attempt to parse the variable to a JSON Object or Array. Throws an exception if parsing fails. */ asJson: () => AlternateType extends undefined ? undefined|Object|Array : Object|Array; /** * The same as asJson but checks that the data is a JSON Array, e.g [1,2]. */ asJsonArray: () => AlternateType extends undefined ? undefined|Array : Array; /** * The same as asJson but checks that the data is a JSON Object, e.g {a: 1}. */ asJsonObject: () => AlternateType extends undefined ? undefined|Object : Object; /** * Reads an environment variable as a string, then splits it on each occurrence of the specified delimiter. * By default a comma is used as the delimiter. For example a var set to "1,2,3" would become ['1', '2', '3']. */ asArray: (delimiter?: string) => AlternateType extends undefined ? undefined|Array : Array; /** * Reads an environment variable as a string, then splits it on each occurrence of the specified delimiter. * By default a comma is used as the delimiter. For example a var set to "1,2,3" would become new Set(['1', '2', '3']). */ asSet: (delimiter?: string) => AlternateType extends undefined ? undefined|Set : Set; /** * Attempt to parse the variable to a Boolean. Throws an exception if parsing fails. * The var must be set to either "true", "false" (upper or lowercase), 0 or 1 to succeed. */ asBool: () => AlternateType extends undefined ? undefined|boolean : boolean; /** * Attempt to parse the variable to a Boolean. Throws an exception if parsing fails. * The var must be set to either "true" or "false" (upper or lowercase) to succeed. */ asBoolStrict: () => AlternateType extends undefined ? undefined|boolean : boolean; /** * Verifies that the variable is a valid URL string and returns the validated * string. The validation is performed by passing the URL string to the * Node.js URL constructor. * * Note that URLs without paths will have a default path `/` appended when read, e.g. * `https://api.acme.org` would become `https://api.acme.org/`. Always use URL * safe utilities included in the Node.js URL module to create * valid URL strings, instead of error prone string concatenation. */ asUrlString: () => AlternateType extends undefined ? undefined|string : string; /** * Verifies that the variable is a valid URL string using the same method as * `asUrlString()`, but instead returns the resulting URL instance. */ asUrlObject: () => AlternateType extends undefined ? undefined|URL : URL; /** * Verifies that the var being accessed is one of the given values */ asEnum: (validValues: readonly T[]|T[]) => AlternateType extends undefined ? undefined|T : T; /** * Verifies that the variable is a valid regular expression and returns the * validated expression as a RegExp instance. */ asRegExp: (flags?: string) => AlternateType extends undefined ? undefined|RegExp : RegExp; } interface IPresentVariable extends VariableAccessors { /** * Converts a bas64 environment variable to ut8 */ convertFromBase64: () => IPresentVariable & ExtenderType /** * Provide an example value that can be used in error output if the variable * is not set, or is set to an invalid value */ example: (example: string) => IPresentVariable & ExtenderType /** * Set a default value for this variable. This will be used if a value is not * set in the process environment */ default: (value: string|number|Record|Array) => IPresentVariable & ExtenderType; /** * Ensures the variable is set on process.env. If it's not set an exception * will be thrown. Can pass false to bypass the check. */ required: (isRequired?: boolean) => IPresentVariable & ExtenderType; } interface IOptionalVariable extends VariableAccessors { /** * Decodes a base64-encoded environment variable */ convertFromBase64: () => IOptionalVariable & ExtenderTypeOptional; /** * Provide an example value that can be used in error output if the variable * is not set, or is set to an invalid value */ example: (value: string) => IOptionalVariable & ExtenderTypeOptional; /** * Set a default value for this variable. This will be used if a value is not * set in the process environment */ default: (value: string|number|Record|Array) => IPresentVariable & ExtenderType; /** * Ensures the variable is set on process.env. If it's not set an exception will be thrown. * Can pass false to bypass the check */ required: (isRequired?: boolean) => IPresentVariable & ExtenderType; } export class EnvVarError extends Error {} interface IEnv { /** * Returns an object containing all current environment variables */ get (): Container, /** * Gets an environment variable that is possibly not set to a value */ get (varName: keyof Container): OptionalVariable; /** * Returns a new env-var instance, where the given object is used for the environment variable mapping. * Use this when writing unit tests or in environments outside node.js. */ from(values: V, extensions?: T, logger?: LoggerFn): IEnv< IOptionalVariable & ExtenderTypeOptional, V >; accessors: PublicAccessors /** * This is the error type used to represent error returned by this module. * Useful for filtering errors and responding appropriately. */ EnvVarError: EnvVarError } // Used internally only to support extension fns type RestParams any> = F extends (value: string, ...args: infer P) => any ? P : any[]; type ExtenderType = { [P in keyof T]: (...args: RestParams) => ReturnType } type ExtenderTypeOptional = { [P in keyof T]: (...args: RestParams) => ReturnType|undefined } export type Extensions = { [key: string]: ExtensionFn } export type LoggerFn = (varname: string, str: string) => void export type RaiseErrorFn = (error: string) => void export type ExtensionFn = (value: string, ...args: any[]) => T export const accessors: PublicAccessors export function logger (varname: string, str: string): void type IDefaultEnv = IEnv export const get: IDefaultEnv['get'] export const from: IDefaultEnv['from']