figue
Version:
Platform agnostic configuration management library, with environmental variables and validation, like convict but cross-env and zod schemas
54 lines (49 loc) • 1.92 kB
TypeScript
import { ZodType, z } from 'zod';
type ConfigDefinitionElement<T = unknown> = {
schema: ZodType<T>;
env?: string;
doc?: string;
default?: T;
};
type ConfigDefinition = {
[P in keyof any]: ConfigDefinitionElement | ConfigDefinitionObject;
};
type ConfigDefinitionObject = {
[K in keyof any]: ConfigDefinitionElement | ConfigDefinition;
};
type InferSchemaType<T extends ConfigDefinition> = {
[P in keyof T]: T[P] extends ConfigDefinitionElement ? T[P]['schema']['_output'] : T[P] extends ConfigDefinition ? InferSchemaType<T[P]> : never;
};
type EnvRecord = Record<string, unknown>;
type DeepPartial<T> = T extends object ? {
[P in keyof T]?: DeepPartial<T[P]>;
} : T;
type Falsy = false | 0 | '' | null | undefined;
declare function buildConfigSchema({ configDefinition }: {
configDefinition: ConfigDefinition;
}): z.ZodObject<any, "strip", z.ZodTypeAny, {
[x: string]: any;
}, {
[x: string]: any;
}>;
declare function defineConfig<T extends ConfigDefinition, Config extends Record<string, unknown> = InferSchemaType<T>>(configDefinition: T, { envSources, envSource, defaults: rawDefaults, priority, getDefaults, }?: {
envSources?: EnvRecord[];
envSource?: EnvRecord;
defaults?: (Record<string, unknown> | Falsy)[] | Record<string, unknown>;
getDefaults?: ((args: {
configDefaults: Record<string, unknown>;
envConfig: Record<string, unknown>;
config: Record<string, unknown>;
}) => (Record<string, unknown> | Falsy)[] | Record<string, unknown>);
priority?: 'env' | 'defaults';
}): {
config: Config;
env: EnvRecord;
envConfig: DeepPartial<Config>;
schema: z.ZodObject<any, "strip", z.ZodTypeAny, {
[x: string]: any;
}, {
[x: string]: any;
}>;
};
export { type ConfigDefinition, type ConfigDefinitionElement, type ConfigDefinitionObject, type EnvRecord, buildConfigSchema, defineConfig };