import { expectError, expectType } from 'tsd'; import envSchema, { EnvSchemaData, EnvSchemaOpt, keywords, envSchema as envSchemaNamed, default as envSchemaDefault, } from '..'; import Ajv, { KeywordDefinition, JSONSchemaType } from 'ajv'; import { z } from 'zod/v4'; interface EnvData { PORT: number; } const schemaWithType: JSONSchemaType = { type: 'object', required: ['PORT'], properties: { PORT: { type: 'number', default: 3000, }, }, }; const schemaZod = z.object({ PORT: z.number().default(3000), }); type SchemaZod = z.infer; const data = { foo: 'bar', }; expectType(envSchema()); expectType(envSchemaNamed()); expectType(envSchemaDefault()); const emptyOpt: EnvSchemaOpt = {}; expectType(emptyOpt); const optWithSchemaZod: EnvSchemaOpt = { schema: z.toJSONSchema(schemaZod), }; expectType(optWithSchemaZod); const optWithSchemaWithType: EnvSchemaOpt = { schema: schemaWithType, }; expectType>(optWithSchemaWithType); const optWithData: EnvSchemaOpt = { data, }; expectType(optWithData); expectError({ data: [], // min 1 item }); const optWithArrayData: EnvSchemaOpt = { data: [{}], }; expectType(optWithArrayData); const optWithMultipleItemArrayData: EnvSchemaOpt = { data: [{}, {}], }; expectType(optWithMultipleItemArrayData); const optWithDotEnvBoolean: EnvSchemaOpt = { dotenv: true, }; expectType(optWithDotEnvBoolean); const optWithDotEnvOpt: EnvSchemaOpt = { dotenv: {}, }; expectType(optWithDotEnvOpt); const optWithAjvInstance: EnvSchemaOpt = { ajv: new Ajv(), }; expectType(optWithAjvInstance); expectType(envSchema.keywords.separator); const optWithAjvCustomOptions: EnvSchemaOpt = { ajv: { customOptions(ajvInstance: Ajv): Ajv { return new Ajv(); }, }, }; expectType(optWithAjvCustomOptions); expectError({ ajv: { customOptions(ajvInstance: Ajv) {}, }, }); const envSchemaWithType = envSchema({ schema: schemaWithType }); expectType(envSchemaWithType); const envSchemaZod = envSchema({ schema: z.toJSONSchema(schemaZod), }); expectType(envSchemaZod); expectType(keywords.separator); expectType(envSchema.keywords.separator);