envguard-ts 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +363 -0
- package/bin/envx.js +11 -0
- package/dist/cjs/cli.js +153 -0
- package/dist/cjs/cli.js.map +1 -0
- package/dist/cjs/core.js +134 -0
- package/dist/cjs/core.js.map +1 -0
- package/dist/cjs/errors.js +26 -0
- package/dist/cjs/errors.js.map +1 -0
- package/dist/cjs/index.js +26 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/validators.js +134 -0
- package/dist/cjs/validators.js.map +1 -0
- package/dist/esm/cli.js +151 -0
- package/dist/esm/cli.js.map +1 -0
- package/dist/esm/core.js +129 -0
- package/dist/esm/core.js.map +1 -0
- package/dist/esm/errors.js +22 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/index.js +11 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/validators.js +124 -0
- package/dist/esm/validators.js.map +1 -0
- package/dist/types/cli.d.ts +2 -0
- package/dist/types/cli.d.ts.map +1 -0
- package/dist/types/core.d.ts +70 -0
- package/dist/types/core.d.ts.map +1 -0
- package/dist/types/errors.d.ts +19 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/index.d.ts +11 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/validators.d.ts +157 -0
- package/dist/types/validators.d.ts.map +1 -0
- package/package.json +79 -0
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
function makeSpec(parse, validate, opts) {
|
|
2
|
+
return {
|
|
3
|
+
_type: undefined,
|
|
4
|
+
_required: opts.required,
|
|
5
|
+
_default: opts.default,
|
|
6
|
+
_secret: opts.secret ?? false,
|
|
7
|
+
_description: opts.description,
|
|
8
|
+
_parse: parse,
|
|
9
|
+
_validate: validate,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export function str(opts = {}) {
|
|
13
|
+
return makeSpec((raw) => raw, (value, field) => {
|
|
14
|
+
if (opts.choices && !opts.choices.includes(value)) {
|
|
15
|
+
throw new Error(`must be one of [${opts.choices.map((c) => JSON.stringify(c)).join(', ')}], got ${JSON.stringify(value)} for ${field}`);
|
|
16
|
+
}
|
|
17
|
+
if (opts.minLength !== undefined && value.length < opts.minLength) {
|
|
18
|
+
throw new Error(`must be at least ${opts.minLength} characters for ${field}`);
|
|
19
|
+
}
|
|
20
|
+
if (opts.maxLength !== undefined && value.length > opts.maxLength) {
|
|
21
|
+
throw new Error(`must be at most ${opts.maxLength} characters for ${field}`);
|
|
22
|
+
}
|
|
23
|
+
if (opts.pattern && !opts.pattern.test(value)) {
|
|
24
|
+
throw new Error(`must match pattern ${opts.pattern} for ${field}`);
|
|
25
|
+
}
|
|
26
|
+
}, { ...opts, required: opts.default === undefined });
|
|
27
|
+
}
|
|
28
|
+
export function num(opts = {}) {
|
|
29
|
+
return makeSpec((raw, field) => {
|
|
30
|
+
const n = Number(raw);
|
|
31
|
+
if (!Number.isFinite(n))
|
|
32
|
+
throw new Error(`must be a finite number for ${field}`);
|
|
33
|
+
return n;
|
|
34
|
+
}, (value, field) => {
|
|
35
|
+
if (opts.min !== undefined && value < opts.min) {
|
|
36
|
+
throw new Error(`must be >= ${opts.min} for ${field}`);
|
|
37
|
+
}
|
|
38
|
+
if (opts.max !== undefined && value > opts.max) {
|
|
39
|
+
throw new Error(`must be <= ${opts.max} for ${field}`);
|
|
40
|
+
}
|
|
41
|
+
}, { ...opts, required: opts.default === undefined });
|
|
42
|
+
}
|
|
43
|
+
const TRUTHY = new Set(['true', '1', 'yes', 'on']);
|
|
44
|
+
const FALSY = new Set(['false', '0', 'no', 'off']);
|
|
45
|
+
export function bool(opts = {}) {
|
|
46
|
+
return makeSpec((raw, field) => {
|
|
47
|
+
const lower = raw.toLowerCase();
|
|
48
|
+
if (TRUTHY.has(lower))
|
|
49
|
+
return true;
|
|
50
|
+
if (FALSY.has(lower))
|
|
51
|
+
return false;
|
|
52
|
+
throw new Error(`must be a boolean (true/false/1/0/yes/no/on/off) for ${field}, got ${JSON.stringify(raw)}`);
|
|
53
|
+
}, () => { }, { ...opts, required: opts.default === undefined });
|
|
54
|
+
}
|
|
55
|
+
export function url(opts = {}) {
|
|
56
|
+
return makeSpec((raw, field) => {
|
|
57
|
+
try {
|
|
58
|
+
const parsed = new URL(raw);
|
|
59
|
+
if (opts.protocols && !opts.protocols.includes(parsed.protocol)) {
|
|
60
|
+
throw new Error(`protocol must be one of [${opts.protocols.join(', ')}] for ${field}, got ${parsed.protocol}`);
|
|
61
|
+
}
|
|
62
|
+
return raw;
|
|
63
|
+
}
|
|
64
|
+
catch (e) {
|
|
65
|
+
if (e instanceof Error && e.message.includes('for ' + field))
|
|
66
|
+
throw e;
|
|
67
|
+
throw new Error(`must be a valid URL for ${field}`);
|
|
68
|
+
}
|
|
69
|
+
}, () => { }, { ...opts, required: opts.default === undefined });
|
|
70
|
+
}
|
|
71
|
+
export function port(opts = {}) {
|
|
72
|
+
return makeSpec((raw, field) => {
|
|
73
|
+
const n = parseInt(raw, 10);
|
|
74
|
+
if (Number.isNaN(n) || String(n) !== raw.trim()) {
|
|
75
|
+
throw new Error(`must be an integer port number for ${field}`);
|
|
76
|
+
}
|
|
77
|
+
if (n < 1 || n > 65535) {
|
|
78
|
+
throw new Error(`must be between 1 and 65535 for ${field}`);
|
|
79
|
+
}
|
|
80
|
+
return n;
|
|
81
|
+
}, () => { }, { ...opts, required: opts.default === undefined });
|
|
82
|
+
}
|
|
83
|
+
// RFC-5321-compatible simplified regex — fast and covers 99%+ real addresses
|
|
84
|
+
const EMAIL_RE = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*\.[a-zA-Z]{2,}$/;
|
|
85
|
+
export function email(opts = {}) {
|
|
86
|
+
return makeSpec((raw, field) => {
|
|
87
|
+
if (!EMAIL_RE.test(raw)) {
|
|
88
|
+
throw new Error(`must be a valid email address for ${field}`);
|
|
89
|
+
}
|
|
90
|
+
return raw;
|
|
91
|
+
}, () => { }, { ...opts, required: opts.default === undefined });
|
|
92
|
+
}
|
|
93
|
+
export function json(opts = {}) {
|
|
94
|
+
return makeSpec((raw, field) => {
|
|
95
|
+
try {
|
|
96
|
+
return JSON.parse(raw);
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
throw new Error(`must be valid JSON for ${field}`);
|
|
100
|
+
}
|
|
101
|
+
}, () => { }, { ...opts, required: opts.default === undefined });
|
|
102
|
+
}
|
|
103
|
+
// ---------------------------------------------------------------------------
|
|
104
|
+
// enums (string union)
|
|
105
|
+
// ---------------------------------------------------------------------------
|
|
106
|
+
/**
|
|
107
|
+
* Validates that a variable matches one value from a const-asserted tuple.
|
|
108
|
+
* Provides a narrower return type than `str({ choices })`.
|
|
109
|
+
*
|
|
110
|
+
* @example
|
|
111
|
+
* ```ts
|
|
112
|
+
* LOG_LEVEL: enums(['debug', 'info', 'warn', 'error'] as const)
|
|
113
|
+
* ```
|
|
114
|
+
*/
|
|
115
|
+
export function enums(values, opts) {
|
|
116
|
+
const base = opts ?? {};
|
|
117
|
+
return makeSpec((raw, field) => {
|
|
118
|
+
if (!values.includes(raw)) {
|
|
119
|
+
throw new Error(`must be one of [${values.map((v) => JSON.stringify(v)).join(', ')}] for ${field}`);
|
|
120
|
+
}
|
|
121
|
+
return raw;
|
|
122
|
+
}, () => { }, { ...base, required: base.default === undefined });
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=validators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/validators.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { type FieldError } from './errors.js';
|
|
2
|
+
import type { ValidatorSpec } from './validators.js';
|
|
3
|
+
/** A schema maps env var names to their validator specs. */
|
|
4
|
+
export type Schema = Record<string, ValidatorSpec<any>>;
|
|
5
|
+
/**
|
|
6
|
+
* Infer the output type from a schema.
|
|
7
|
+
* Required validators produce `T`, optional ones produce `T` (since the
|
|
8
|
+
* default fills the gap — callers never receive `undefined`).
|
|
9
|
+
*/
|
|
10
|
+
export type InferEnv<S extends Schema> = {
|
|
11
|
+
readonly [K in keyof S]: S[K] extends ValidatorSpec<infer T> ? T : never;
|
|
12
|
+
};
|
|
13
|
+
/** Options accepted by {@link createEnv}. */
|
|
14
|
+
export interface CreateEnvOptions<S extends Schema> {
|
|
15
|
+
/** The schema describing every expected variable and its validator. */
|
|
16
|
+
schema: S;
|
|
17
|
+
/**
|
|
18
|
+
* Source of raw string values. Defaults to `process.env`.
|
|
19
|
+
* Override for testing or edge-runtime environments.
|
|
20
|
+
*/
|
|
21
|
+
env?: Record<string, string | undefined>;
|
|
22
|
+
/**
|
|
23
|
+
* When `true`, `createEnv` returns `null` instead of throwing on failure.
|
|
24
|
+
* Useful for unit tests that want to inspect the error.
|
|
25
|
+
* @default false
|
|
26
|
+
*/
|
|
27
|
+
skipValidation?: boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Custom reporter called before throwing {@link EnvValidationError}.
|
|
30
|
+
* Receives the structured list of errors so you can log them however you like.
|
|
31
|
+
*/
|
|
32
|
+
onError?: (errors: FieldError[]) => void;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Validates environment variables against the provided schema and returns a
|
|
36
|
+
* fully-typed, frozen object. Throws {@link EnvValidationError} on failure.
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```ts
|
|
40
|
+
* export const env = createEnv({
|
|
41
|
+
* schema: {
|
|
42
|
+
* DATABASE_URL: url(),
|
|
43
|
+
* PORT: port({ default: 3000 }),
|
|
44
|
+
* NODE_ENV: str({ choices: ['development', 'production', 'test'], default: 'development' }),
|
|
45
|
+
* DEBUG: bool({ default: false }),
|
|
46
|
+
* API_KEY: str({ secret: true }),
|
|
47
|
+
* },
|
|
48
|
+
* })
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export declare function createEnv<S extends Schema>(options: CreateEnvOptions<S>): InferEnv<S>;
|
|
52
|
+
/**
|
|
53
|
+
* Generates the text content of a `.env.example` file from a schema.
|
|
54
|
+
* Variables without defaults are left blank; those with defaults show the default.
|
|
55
|
+
* Secrets are shown as `[secret]`.
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```ts
|
|
59
|
+
* import { schema } from './env'
|
|
60
|
+
* import { generateExample } from 'envx'
|
|
61
|
+
* fs.writeFileSync('.env.example', generateExample(schema))
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
export declare function generateExample(schema: Schema): string;
|
|
65
|
+
/**
|
|
66
|
+
* Given the parsed key=value pairs from a `.env` file and a schema, returns
|
|
67
|
+
* any validation errors without throwing. Useful in CI/pre-deploy checks.
|
|
68
|
+
*/
|
|
69
|
+
export declare function validateEnvFile(parsed: Record<string, string>, schema: Schema): FieldError[];
|
|
70
|
+
//# sourceMappingURL=core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/core.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,UAAU,EAAE,MAAM,aAAa,CAAA;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAMpD,4DAA4D;AAE5D,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAA;AAEvD;;;;GAIG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,MAAM,IAAI;IACvC,QAAQ,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;CACzE,CAAA;AAMD,6CAA6C;AAC7C,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,MAAM;IAChD,uEAAuE;IACvE,MAAM,EAAE,CAAC,CAAA;IACT;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;IACxC;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB;;;OAGG;IACH,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,IAAI,CAAA;CACzC;AAMD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAyCrF;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAwBtD;AAMD;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,MAAM,EAAE,MAAM,GACb,UAAU,EAAE,CAyBd"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** A single field-level validation failure. */
|
|
2
|
+
export interface FieldError {
|
|
3
|
+
/** The environment variable name. */
|
|
4
|
+
field: string;
|
|
5
|
+
/** Human-readable description of what went wrong. */
|
|
6
|
+
message: string;
|
|
7
|
+
/** The raw value that failed validation (undefined if variable was missing). */
|
|
8
|
+
received: string | undefined;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Thrown when one or more environment variables fail validation.
|
|
12
|
+
* Provides a structured list of field errors and a formatted human-readable message.
|
|
13
|
+
*/
|
|
14
|
+
export declare class EnvValidationError extends Error {
|
|
15
|
+
/** Structured list of every field that failed. */
|
|
16
|
+
readonly errors: readonly FieldError[];
|
|
17
|
+
constructor(errors: FieldError[]);
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,MAAM,WAAW,UAAU;IACzB,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAA;IACb,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAA;IACf,gFAAgF;IAChF,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;CAC7B;AAED;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,kDAAkD;IAClD,QAAQ,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,CAAA;gBAE1B,MAAM,EAAE,UAAU,EAAE;CAkBjC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* envx — Zero-dependency TypeScript env variable validator
|
|
3
|
+
* @module envx
|
|
4
|
+
*/
|
|
5
|
+
export { createEnv, generateExample, validateEnvFile } from './core.js';
|
|
6
|
+
export type { Schema, InferEnv, CreateEnvOptions } from './core.js';
|
|
7
|
+
export { str, num, bool, url, port, email, json, enums } from './validators.js';
|
|
8
|
+
export type { ValidatorSpec, BaseOptions, StrOptions, NumOptions, BoolOptions, UrlOptions, PortOptions, EmailOptions, JsonOptions, } from './validators.js';
|
|
9
|
+
export { EnvValidationError } from './errors.js';
|
|
10
|
+
export type { FieldError } from './errors.js';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AACvE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAGnE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAC/E,YAAY,EACV,aAAa,EACb,WAAW,EACX,UAAU,EACV,UAAU,EACV,WAAW,EACX,UAAU,EACV,WAAW,EACX,YAAY,EACZ,WAAW,GACZ,MAAM,iBAAiB,CAAA;AAGxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAChD,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/** Options shared by every validator. */
|
|
2
|
+
export interface BaseOptions<T> {
|
|
3
|
+
/**
|
|
4
|
+
* Default value used when the env var is absent.
|
|
5
|
+
* When provided, the variable becomes optional in validation.
|
|
6
|
+
*/
|
|
7
|
+
default?: T;
|
|
8
|
+
/**
|
|
9
|
+
* Human-readable description shown in generated .env.example files.
|
|
10
|
+
*/
|
|
11
|
+
description?: string;
|
|
12
|
+
/**
|
|
13
|
+
* When true, the value is masked as `[secret]` in log output.
|
|
14
|
+
*/
|
|
15
|
+
secret?: boolean;
|
|
16
|
+
}
|
|
17
|
+
/** Marker interface carried by every validator spec. */
|
|
18
|
+
export interface ValidatorSpec<T> {
|
|
19
|
+
readonly _type: T;
|
|
20
|
+
readonly _required: boolean;
|
|
21
|
+
readonly _default: T | undefined;
|
|
22
|
+
readonly _secret: boolean;
|
|
23
|
+
readonly _description: string | undefined;
|
|
24
|
+
/** @internal */
|
|
25
|
+
readonly _parse: (raw: string, field: string) => T;
|
|
26
|
+
/** @internal */
|
|
27
|
+
readonly _validate: (value: T, field: string) => void;
|
|
28
|
+
}
|
|
29
|
+
/** Options for {@link str}. */
|
|
30
|
+
export interface StrOptions extends BaseOptions<string> {
|
|
31
|
+
/** Restrict to a specific set of allowed values. */
|
|
32
|
+
choices?: readonly string[];
|
|
33
|
+
/** Minimum string length (inclusive). */
|
|
34
|
+
minLength?: number;
|
|
35
|
+
/** Maximum string length (inclusive). */
|
|
36
|
+
maxLength?: number;
|
|
37
|
+
/** Regex the value must match. */
|
|
38
|
+
pattern?: RegExp;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Validates a string environment variable.
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```ts
|
|
45
|
+
* NODE_ENV: str({ choices: ['development', 'production', 'test'], default: 'development' })
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
export declare function str(opts: StrOptions & {
|
|
49
|
+
default: string;
|
|
50
|
+
}): ValidatorSpec<string>;
|
|
51
|
+
export declare function str(opts?: StrOptions): ValidatorSpec<string>;
|
|
52
|
+
/** Options for {@link num}. */
|
|
53
|
+
export interface NumOptions extends BaseOptions<number> {
|
|
54
|
+
/** Minimum value (inclusive). */
|
|
55
|
+
min?: number;
|
|
56
|
+
/** Maximum value (inclusive). */
|
|
57
|
+
max?: number;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Validates a numeric environment variable. Accepts integers and floats.
|
|
61
|
+
*
|
|
62
|
+
* @example
|
|
63
|
+
* ```ts
|
|
64
|
+
* TIMEOUT_MS: num({ default: 5000, min: 0 })
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
export declare function num(opts: NumOptions & {
|
|
68
|
+
default: number;
|
|
69
|
+
}): ValidatorSpec<number>;
|
|
70
|
+
export declare function num(opts?: NumOptions): ValidatorSpec<number>;
|
|
71
|
+
/** Options for {@link bool}. */
|
|
72
|
+
export type BoolOptions = BaseOptions<boolean>;
|
|
73
|
+
/**
|
|
74
|
+
* Validates a boolean environment variable.
|
|
75
|
+
* Accepts: `true`, `false`, `1`, `0`, `yes`, `no`, `on`, `off` (case-insensitive).
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* ```ts
|
|
79
|
+
* DEBUG: bool({ default: false })
|
|
80
|
+
* ```
|
|
81
|
+
*/
|
|
82
|
+
export declare function bool(opts: BoolOptions & {
|
|
83
|
+
default: boolean;
|
|
84
|
+
}): ValidatorSpec<boolean>;
|
|
85
|
+
export declare function bool(opts?: BoolOptions): ValidatorSpec<boolean>;
|
|
86
|
+
/** Options for {@link url}. */
|
|
87
|
+
export interface UrlOptions extends BaseOptions<string> {
|
|
88
|
+
/** Restrict allowed URL protocols, e.g. `['https:']`. */
|
|
89
|
+
protocols?: readonly string[];
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Validates that an environment variable is a valid URL.
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* ```ts
|
|
96
|
+
* DATABASE_URL: url({ protocols: ['postgresql:', 'postgres:'] })
|
|
97
|
+
* ```
|
|
98
|
+
*/
|
|
99
|
+
export declare function url(opts: UrlOptions & {
|
|
100
|
+
default: string;
|
|
101
|
+
}): ValidatorSpec<string>;
|
|
102
|
+
export declare function url(opts?: UrlOptions): ValidatorSpec<string>;
|
|
103
|
+
/** Options for {@link port}. */
|
|
104
|
+
export type PortOptions = BaseOptions<number>;
|
|
105
|
+
/**
|
|
106
|
+
* Validates a TCP/UDP port number (1–65535).
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* ```ts
|
|
110
|
+
* PORT: port({ default: 3000 })
|
|
111
|
+
* ```
|
|
112
|
+
*/
|
|
113
|
+
export declare function port(opts: PortOptions & {
|
|
114
|
+
default: number;
|
|
115
|
+
}): ValidatorSpec<number>;
|
|
116
|
+
export declare function port(opts?: PortOptions): ValidatorSpec<number>;
|
|
117
|
+
/** Options for {@link email}. */
|
|
118
|
+
export type EmailOptions = BaseOptions<string>;
|
|
119
|
+
/**
|
|
120
|
+
* Validates an email address environment variable.
|
|
121
|
+
*
|
|
122
|
+
* @example
|
|
123
|
+
* ```ts
|
|
124
|
+
* SMTP_FROM: email({ default: 'no-reply@example.com' })
|
|
125
|
+
* ```
|
|
126
|
+
*/
|
|
127
|
+
export declare function email(opts: EmailOptions & {
|
|
128
|
+
default: string;
|
|
129
|
+
}): ValidatorSpec<string>;
|
|
130
|
+
export declare function email(opts?: EmailOptions): ValidatorSpec<string>;
|
|
131
|
+
/** Options for {@link json}. */
|
|
132
|
+
export interface JsonOptions<T> extends BaseOptions<T> {
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Parses a JSON-encoded environment variable into type `T`.
|
|
136
|
+
* The generic parameter should match the expected shape of the parsed value.
|
|
137
|
+
*
|
|
138
|
+
* @example
|
|
139
|
+
* ```ts
|
|
140
|
+
* FEATURE_FLAGS: json<{ betaUsers: boolean }>()
|
|
141
|
+
* ```
|
|
142
|
+
*/
|
|
143
|
+
export declare function json<T = unknown>(opts: JsonOptions<T> & {
|
|
144
|
+
default: T;
|
|
145
|
+
}): ValidatorSpec<T>;
|
|
146
|
+
export declare function json<T = unknown>(opts?: JsonOptions<T>): ValidatorSpec<T>;
|
|
147
|
+
/**
|
|
148
|
+
* Validates that a variable matches one value from a const-asserted tuple.
|
|
149
|
+
* Provides a narrower return type than `str({ choices })`.
|
|
150
|
+
*
|
|
151
|
+
* @example
|
|
152
|
+
* ```ts
|
|
153
|
+
* LOG_LEVEL: enums(['debug', 'info', 'warn', 'error'] as const)
|
|
154
|
+
* ```
|
|
155
|
+
*/
|
|
156
|
+
export declare function enums<const T extends readonly string[]>(values: T, opts?: BaseOptions<T[number]>): ValidatorSpec<T[number]>;
|
|
157
|
+
//# sourceMappingURL=validators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/validators.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "envguard-ts",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Zero-dependency TypeScript environment variable validator with compile-time type inference",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"env",
|
|
7
|
+
"environment",
|
|
8
|
+
"validation",
|
|
9
|
+
"typescript",
|
|
10
|
+
"zod",
|
|
11
|
+
"dotenv",
|
|
12
|
+
"config",
|
|
13
|
+
"schema",
|
|
14
|
+
"type-safe"
|
|
15
|
+
],
|
|
16
|
+
"author": "Mehulbirare",
|
|
17
|
+
"license": "MIT",
|
|
18
|
+
"homepage": "https://github.com/Mehulbirare/envguard-ts#readme",
|
|
19
|
+
"repository": {
|
|
20
|
+
"type": "git",
|
|
21
|
+
"url": "https://github.com/Mehulbirare/envguard-ts.git"
|
|
22
|
+
},
|
|
23
|
+
"bugs": {
|
|
24
|
+
"url": "https://github.com/Mehulbirare/envguard-ts/issues"
|
|
25
|
+
},
|
|
26
|
+
"main": "./dist/cjs/index.js",
|
|
27
|
+
"module": "./dist/esm/index.js",
|
|
28
|
+
"types": "./dist/types/index.d.ts",
|
|
29
|
+
"exports": {
|
|
30
|
+
".": {
|
|
31
|
+
"import": {
|
|
32
|
+
"types": "./dist/types/index.d.ts",
|
|
33
|
+
"default": "./dist/esm/index.js"
|
|
34
|
+
},
|
|
35
|
+
"require": {
|
|
36
|
+
"types": "./dist/types/index.d.ts",
|
|
37
|
+
"default": "./dist/cjs/index.js"
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
"bin": {
|
|
42
|
+
"envx": "./bin/envx.js"
|
|
43
|
+
},
|
|
44
|
+
"files": [
|
|
45
|
+
"dist",
|
|
46
|
+
"bin",
|
|
47
|
+
"README.md",
|
|
48
|
+
"LICENSE"
|
|
49
|
+
],
|
|
50
|
+
"scripts": {
|
|
51
|
+
"build": "npm run build:esm && npm run build:cjs && npm run build:types",
|
|
52
|
+
"build:esm": "tsc -p tsconfig.esm.json",
|
|
53
|
+
"build:cjs": "tsc -p tsconfig.cjs.json",
|
|
54
|
+
"build:types": "tsc -p tsconfig.types.json",
|
|
55
|
+
"test": "jest",
|
|
56
|
+
"test:coverage": "jest --coverage",
|
|
57
|
+
"test:watch": "jest --watch",
|
|
58
|
+
"lint": "tsc --noEmit",
|
|
59
|
+
"prepublishOnly": "npm run build && npm run test:coverage",
|
|
60
|
+
"size": "npx bundlesize"
|
|
61
|
+
},
|
|
62
|
+
"devDependencies": {
|
|
63
|
+
"@types/jest": "^29.5.12",
|
|
64
|
+
"@types/node": "^20.14.0",
|
|
65
|
+
"jest": "^29.7.0",
|
|
66
|
+
"ts-jest": "^29.1.4",
|
|
67
|
+
"typescript": "^5.5.2"
|
|
68
|
+
},
|
|
69
|
+
"engines": {
|
|
70
|
+
"node": ">=18.0.0"
|
|
71
|
+
},
|
|
72
|
+
"sideEffects": false,
|
|
73
|
+
"bundlesize": [
|
|
74
|
+
{
|
|
75
|
+
"path": "./dist/esm/index.js",
|
|
76
|
+
"maxSize": "3 kB"
|
|
77
|
+
}
|
|
78
|
+
]
|
|
79
|
+
}
|