env-schema
Version:
Validate your env variables using Ajv with .env file support using Node.js built-in parseEnv
118 lines (95 loc) • 2.81 kB
text/typescript
import { expect } from 'tstyche'
import envSchema, {
EnvSchemaData,
EnvSchemaOpt,
keywords,
envSchema as envSchemaNamed,
default as envSchemaDefault,
} from '.'
import Ajv, { KeywordDefinition, JSONSchemaType } from 'ajv'
import { Static, Type } from 'typebox'
interface EnvData {
PORT: number;
}
const schemaWithType: JSONSchemaType<EnvData> = {
type: 'object',
required: ['PORT'],
properties: {
PORT: {
type: 'number',
default: 3000,
},
},
}
const schemaTypebox = Type.Object({
PORT: Type.Number({ default: 3000 }),
})
type SchemaTypebox = Static<typeof schemaTypebox>
const data = {
foo: 'bar',
}
expect(envSchema()).type.toBe<EnvSchemaData | unknown>()
expect(envSchemaNamed()).type.toBe<EnvSchemaData | unknown>()
expect(envSchemaDefault()).type.toBe<EnvSchemaData | unknown>()
const emptyOpt: EnvSchemaOpt = {}
expect(emptyOpt).type.toBe<EnvSchemaOpt>()
const optWithSchemaTypebox: EnvSchemaOpt = {
schema: schemaTypebox,
}
expect(optWithSchemaTypebox).type.toBe<EnvSchemaOpt>()
const optWithSchemaWithType: EnvSchemaOpt<EnvData> = {
schema: schemaWithType,
}
expect(optWithSchemaWithType).type.toBe<EnvSchemaOpt<EnvData>>()
const optWithData: EnvSchemaOpt = {
data,
}
expect(optWithData).type.toBe<EnvSchemaOpt>()
expect<EnvSchemaOpt>().type.not.toBeAssignableFrom({
data: [],
})
const optWithArrayData: EnvSchemaOpt = {
data: [{}],
}
expect(optWithArrayData).type.toBe<EnvSchemaOpt>()
const optWithMultipleItemArrayData: EnvSchemaOpt = {
data: [{}, {}],
}
expect(optWithMultipleItemArrayData).type.toBe<EnvSchemaOpt>()
const optWithDotEnvBoolean: EnvSchemaOpt = {
dotenv: true,
}
expect(optWithDotEnvBoolean).type.toBe<EnvSchemaOpt>()
const optWithDotEnvOpt: EnvSchemaOpt = {
dotenv: {},
}
expect(optWithDotEnvOpt).type.toBe<EnvSchemaOpt>()
const optWithEnvExpand: EnvSchemaOpt = {
expandEnv: true,
}
expect(optWithEnvExpand).type.toBe<EnvSchemaOpt>()
const optWithAjvInstance: EnvSchemaOpt = {
ajv: new Ajv(),
}
expect(optWithAjvInstance).type.toBe<EnvSchemaOpt>()
expect(envSchema.keywords.separator).type.toBe<KeywordDefinition>()
const optWithAjvCustomOptions: EnvSchemaOpt = {
ajv: {
customOptions (_ajvInstance: Ajv): Ajv {
return new Ajv()
},
},
}
expect(optWithAjvCustomOptions).type.toBe<EnvSchemaOpt>()
expect<EnvSchemaOpt>()
.type.not.toBeAssignableFrom({
ajv: {
customOptions (_ajvInstance: Ajv) {}
}
})
const envSchemaWithType = envSchema({ schema: schemaWithType })
expect(envSchemaWithType).type.toBe<EnvData>()
const envSchemaTypebox = envSchema<SchemaTypebox>({ schema: schemaTypebox })
expect(envSchemaTypebox).type.toBe<SchemaTypebox>()
expect(keywords.separator).type.toBe<KeywordDefinition>()
expect(envSchema.keywords.separator).type.toBe<KeywordDefinition>()