env-validated 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.
Files changed (45) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +833 -0
  3. package/dist/adapters/arktype.cjs +38 -0
  4. package/dist/adapters/arktype.d.cts +1 -0
  5. package/dist/adapters/arktype.d.ts +1 -0
  6. package/dist/adapters/arktype.js +11 -0
  7. package/dist/adapters/effect.cjs +38 -0
  8. package/dist/adapters/effect.d.cts +1 -0
  9. package/dist/adapters/effect.d.ts +1 -0
  10. package/dist/adapters/effect.js +11 -0
  11. package/dist/adapters/joi.cjs +57 -0
  12. package/dist/adapters/joi.d.cts +55 -0
  13. package/dist/adapters/joi.d.ts +55 -0
  14. package/dist/adapters/joi.js +35 -0
  15. package/dist/adapters/runtypes.cjs +38 -0
  16. package/dist/adapters/runtypes.d.cts +1 -0
  17. package/dist/adapters/runtypes.d.ts +1 -0
  18. package/dist/adapters/runtypes.js +11 -0
  19. package/dist/adapters/superstruct.cjs +38 -0
  20. package/dist/adapters/superstruct.d.cts +1 -0
  21. package/dist/adapters/superstruct.d.ts +1 -0
  22. package/dist/adapters/superstruct.js +11 -0
  23. package/dist/adapters/typebox.cjs +38 -0
  24. package/dist/adapters/typebox.d.cts +1 -0
  25. package/dist/adapters/typebox.d.ts +1 -0
  26. package/dist/adapters/typebox.js +11 -0
  27. package/dist/adapters/valibot.cjs +38 -0
  28. package/dist/adapters/valibot.d.cts +1 -0
  29. package/dist/adapters/valibot.d.ts +1 -0
  30. package/dist/adapters/valibot.js +11 -0
  31. package/dist/adapters/yup.cjs +38 -0
  32. package/dist/adapters/yup.d.cts +1 -0
  33. package/dist/adapters/yup.d.ts +1 -0
  34. package/dist/adapters/yup.js +11 -0
  35. package/dist/adapters/zod.cjs +38 -0
  36. package/dist/adapters/zod.d.cts +1 -0
  37. package/dist/adapters/zod.d.ts +1 -0
  38. package/dist/adapters/zod.js +11 -0
  39. package/dist/effect-DIhhk_ck.d.cts +222 -0
  40. package/dist/effect-DIhhk_ck.d.ts +222 -0
  41. package/dist/index.cjs +737 -0
  42. package/dist/index.d.cts +8 -0
  43. package/dist/index.d.ts +8 -0
  44. package/dist/index.js +714 -0
  45. package/package.json +215 -0
package/dist/index.cjs ADDED
@@ -0,0 +1,737 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var src_exports = {};
22
+ __export(src_exports, {
23
+ EnvSafeError: () => EnvSafeError,
24
+ createEnv: () => createEnv,
25
+ registerAdapter: () => registerAdapter
26
+ });
27
+ module.exports = __toCommonJS(src_exports);
28
+
29
+ // src/built-in/types.ts
30
+ var BUILT_IN_TYPES = /* @__PURE__ */ new Set([
31
+ "string",
32
+ "number",
33
+ "boolean",
34
+ "url",
35
+ "port",
36
+ "enum",
37
+ "json"
38
+ ]);
39
+ function isBuiltInField(field) {
40
+ return field != null && typeof field === "object" && "type" in field && typeof field.type === "string" && BUILT_IN_TYPES.has(field.type);
41
+ }
42
+
43
+ // src/built-in/validators.ts
44
+ function parseBuiltIn(field, raw, _key) {
45
+ if (raw === void 0 || raw === "") {
46
+ if ("default" in field && field.default !== void 0) {
47
+ return field.default;
48
+ }
49
+ if (field.required === false) {
50
+ return void 0;
51
+ }
52
+ throw new Error("required, was not set");
53
+ }
54
+ switch (field.type) {
55
+ case "string":
56
+ return parseString(raw, field);
57
+ case "number":
58
+ return parseNumber(raw, field);
59
+ case "boolean":
60
+ return parseBoolean(raw);
61
+ case "url":
62
+ return parseUrl(raw);
63
+ case "port":
64
+ return parsePort(raw);
65
+ case "enum":
66
+ return parseEnum(raw, field);
67
+ case "json":
68
+ return parseJson(raw);
69
+ }
70
+ }
71
+ function parseString(raw, field) {
72
+ if (field.minLength !== void 0 && raw.length < field.minLength) {
73
+ throw new Error(
74
+ `must be at least ${field.minLength} characters (got ${raw.length})`
75
+ );
76
+ }
77
+ if (field.maxLength !== void 0 && raw.length > field.maxLength) {
78
+ throw new Error(
79
+ `must be at most ${field.maxLength} characters (got ${raw.length})`
80
+ );
81
+ }
82
+ if (field.pattern !== void 0 && !field.pattern.test(raw)) {
83
+ throw new Error(`must match pattern ${field.pattern}`);
84
+ }
85
+ return raw;
86
+ }
87
+ function parseNumber(raw, field) {
88
+ const num = Number(raw);
89
+ if (Number.isNaN(num)) {
90
+ throw new Error(`must be a number (got "${raw}")`);
91
+ }
92
+ if (field.min !== void 0 && num < field.min) {
93
+ throw new Error(`must be >= ${field.min} (got ${num})`);
94
+ }
95
+ if (field.max !== void 0 && num > field.max) {
96
+ throw new Error(`must be <= ${field.max} (got ${num})`);
97
+ }
98
+ return num;
99
+ }
100
+ function parseBoolean(raw) {
101
+ const lower = raw.toLowerCase();
102
+ if (lower === "true" || lower === "1" || lower === "yes") {
103
+ return true;
104
+ }
105
+ if (lower === "false" || lower === "0" || lower === "no") {
106
+ return false;
107
+ }
108
+ throw new Error(`must be a boolean (true/false/1/0/yes/no) (got "${raw}")`);
109
+ }
110
+ function parseUrl(raw) {
111
+ try {
112
+ new URL(raw);
113
+ return raw;
114
+ } catch {
115
+ throw new Error(`must be a valid URL (got "${raw}")`);
116
+ }
117
+ }
118
+ function parsePort(raw) {
119
+ const num = Number.parseInt(raw, 10);
120
+ if (Number.isNaN(num) || num < 1 || num > 65535) {
121
+ throw new Error(`must be a valid port (1-65535) (got "${raw}")`);
122
+ }
123
+ return num;
124
+ }
125
+ function parseEnum(raw, field) {
126
+ if (!field.values.includes(raw)) {
127
+ throw new Error(
128
+ `must be one of: ${field.values.join(", ")} (got "${raw}")`
129
+ );
130
+ }
131
+ return raw;
132
+ }
133
+ function parseJson(raw) {
134
+ try {
135
+ return JSON.parse(raw);
136
+ } catch {
137
+ throw new Error(`must be valid JSON (got "${raw}")`);
138
+ }
139
+ }
140
+
141
+ // src/error.ts
142
+ var SENSITIVE_PATTERN = /_KEY$|_SECRET$|_TOKEN$|_PASSWORD$|_PASS$/i;
143
+ function isSensitiveKey(key) {
144
+ return SENSITIVE_PATTERN.test(key);
145
+ }
146
+ function redactValue(key, value) {
147
+ if (value === void 0) return "(not set)";
148
+ if (isSensitiveKey(key)) return "*****";
149
+ return `"${value}"`;
150
+ }
151
+
152
+ // src/adapters/detect.ts
153
+ var adapters = [];
154
+ function registerAdapter(adapter) {
155
+ if (!adapters.some((a) => a.name === adapter.name)) {
156
+ adapters.push(adapter);
157
+ }
158
+ }
159
+ function isZodSchema(field) {
160
+ return field != null && typeof field === "object" && ("_zod" in field || "_def" in field);
161
+ }
162
+ function isJoiSchema(field) {
163
+ return field != null && typeof field === "object" && "$_root" in field;
164
+ }
165
+ function isYupSchema(field) {
166
+ return field != null && typeof field === "object" && "spec" in field && "tests" in field && "transforms" in field;
167
+ }
168
+ function isValibotSchema(field) {
169
+ return field != null && typeof field === "object" && "kind" in field && field.kind === "schema" && "~run" in field;
170
+ }
171
+ function isTypeboxSchema(field) {
172
+ return field != null && typeof field === "object" && /* @__PURE__ */ Symbol.for("TypeBox.Kind") in field;
173
+ }
174
+ function isArkTypeSchema(field) {
175
+ return typeof field === "function" && "traverse" in field && "expression" in field;
176
+ }
177
+ function isSuperstructSchema(field) {
178
+ return field != null && typeof field === "object" && "refiner" in field && "coercer" in field && "validator" in field;
179
+ }
180
+ function isRuntypesSchema(field) {
181
+ return field != null && typeof field === "object" && "check" in field && "guard" in field && "tag" in field;
182
+ }
183
+ function isEffectSchema(field) {
184
+ return field != null && (typeof field === "object" || typeof field === "function") && "ast" in field && "annotations" in field && "pipe" in field;
185
+ }
186
+ function isCustomValidateField(field) {
187
+ return field != null && typeof field === "object" && "validate" in field && typeof field.validate === "function";
188
+ }
189
+ function parseZod(field, raw, key) {
190
+ const schema = field;
191
+ try {
192
+ const result = schema.safeParse(raw);
193
+ if (result.success) {
194
+ return { success: true, value: result.data };
195
+ }
196
+ const msg = result.error?.issues?.[0]?.message ?? `invalid value (got ${redactValue(key, raw)})`;
197
+ return { success: false, error: msg };
198
+ } catch (e) {
199
+ return {
200
+ success: false,
201
+ error: e instanceof Error ? e.message : String(e)
202
+ };
203
+ }
204
+ }
205
+ function parseJoi(field, raw, _key) {
206
+ const schema = field;
207
+ const result = schema.validate(raw);
208
+ if (result.error) {
209
+ return { success: false, error: result.error.message };
210
+ }
211
+ return { success: true, value: result.value };
212
+ }
213
+ function parseYup(field, raw, _key) {
214
+ const schema = field;
215
+ try {
216
+ let input = raw;
217
+ if (raw !== void 0) {
218
+ if (schema.type === "number") {
219
+ input = Number(raw);
220
+ } else if (schema.type === "boolean") {
221
+ const lower = raw.toLowerCase();
222
+ if (lower === "true" || lower === "1") input = true;
223
+ else if (lower === "false" || lower === "0") input = false;
224
+ }
225
+ }
226
+ const value = schema.validateSync(input);
227
+ return { success: true, value };
228
+ } catch (e) {
229
+ return {
230
+ success: false,
231
+ error: e instanceof Error ? e.message : String(e)
232
+ };
233
+ }
234
+ }
235
+ function parseValibot(field, raw, _key) {
236
+ const schema = field;
237
+ try {
238
+ const result = schema["~run"]({
239
+ value: raw,
240
+ typed: false,
241
+ issues: void 0
242
+ });
243
+ if (result.issues && result.issues.length > 0) {
244
+ const firstIssue = result.issues[0];
245
+ return {
246
+ success: false,
247
+ error: firstIssue?.message ?? "validation failed"
248
+ };
249
+ }
250
+ return { success: true, value: result.value };
251
+ } catch (e) {
252
+ return {
253
+ success: false,
254
+ error: e instanceof Error ? e.message : String(e)
255
+ };
256
+ }
257
+ }
258
+ function parseTypebox(field, raw, key) {
259
+ try {
260
+ let Value;
261
+ try {
262
+ Value = require("@sinclair/typebox/value").Value;
263
+ } catch {
264
+ return {
265
+ success: false,
266
+ error: "TypeBox adapter requires @sinclair/typebox to be installed"
267
+ };
268
+ }
269
+ const converted = Value.Convert(field, raw);
270
+ if (Value.Check(field, converted)) {
271
+ return { success: true, value: Value.Decode(field, converted) };
272
+ }
273
+ return {
274
+ success: false,
275
+ error: `invalid value (got ${redactValue(key, raw)})`
276
+ };
277
+ } catch (e) {
278
+ return {
279
+ success: false,
280
+ error: e instanceof Error ? e.message : String(e)
281
+ };
282
+ }
283
+ }
284
+ function parseArkType(field, raw, key) {
285
+ const t = field;
286
+ const result = t(raw);
287
+ if (result instanceof Error || result != null && typeof result === "object" && "summary" in result) {
288
+ const msg = result instanceof Error ? result.message : typeof result.summary === "string" ? result.summary : `invalid value (got ${redactValue(key, raw)})`;
289
+ return { success: false, error: msg };
290
+ }
291
+ return { success: true, value: result };
292
+ }
293
+ function parseSuperstruct(field, raw, _key) {
294
+ const struct = field;
295
+ try {
296
+ const coerced = struct.coercer(raw, null);
297
+ for (const failure of struct.validator(coerced, null)) {
298
+ return { success: false, error: failure.message };
299
+ }
300
+ for (const failure of struct.refiner(coerced, null)) {
301
+ return { success: false, error: failure.message };
302
+ }
303
+ return { success: true, value: coerced };
304
+ } catch (e) {
305
+ return {
306
+ success: false,
307
+ error: e instanceof Error ? e.message : String(e)
308
+ };
309
+ }
310
+ }
311
+ function parseRuntypes(field, raw, _key) {
312
+ const rt = field;
313
+ try {
314
+ const value = rt.check(raw);
315
+ return { success: true, value };
316
+ } catch (e) {
317
+ return {
318
+ success: false,
319
+ error: e instanceof Error ? e.message : String(e)
320
+ };
321
+ }
322
+ }
323
+ function parseEffect(field, raw, _key) {
324
+ try {
325
+ let SchemaModule;
326
+ try {
327
+ const effect = require("effect");
328
+ SchemaModule = effect.Schema;
329
+ } catch {
330
+ try {
331
+ SchemaModule = require("@effect/schema/Schema");
332
+ } catch {
333
+ return {
334
+ success: false,
335
+ error: "Effect adapter requires effect or @effect/schema to be installed"
336
+ };
337
+ }
338
+ }
339
+ const value = SchemaModule.decodeUnknownSync(field)(raw);
340
+ return { success: true, value };
341
+ } catch (e) {
342
+ return {
343
+ success: false,
344
+ error: e instanceof Error ? e.message : String(e)
345
+ };
346
+ }
347
+ }
348
+ function isObjectSchema(schema) {
349
+ if (isZodSchema(schema)) {
350
+ const s = schema;
351
+ if (typeof s.shape === "object" && s.shape !== null) return true;
352
+ const def = s._def;
353
+ if (def && typeof def.shape === "object") return true;
354
+ }
355
+ if (isJoiSchema(schema)) {
356
+ return schema.type === "object";
357
+ }
358
+ if (isYupSchema(schema)) {
359
+ return "fields" in schema;
360
+ }
361
+ if (isValibotSchema(schema)) {
362
+ return schema.type === "object";
363
+ }
364
+ if (isTypeboxSchema(schema)) {
365
+ return schema[/* @__PURE__ */ Symbol.for("TypeBox.Kind")] === "Object" && "properties" in schema;
366
+ }
367
+ if (isArkTypeSchema(schema)) {
368
+ const expr = schema.expression ?? "";
369
+ return expr.includes("{") && expr.includes("}");
370
+ }
371
+ if (isSuperstructSchema(schema)) {
372
+ return "schema" in schema && typeof schema.schema === "object" && schema.schema !== null;
373
+ }
374
+ if (isRuntypesSchema(schema)) {
375
+ return schema.tag === "object" && "fields" in schema;
376
+ }
377
+ if (isEffectSchema(schema)) {
378
+ return "fields" in schema;
379
+ }
380
+ return false;
381
+ }
382
+ function resolveObjectSchema(schema) {
383
+ if (!isObjectSchema(schema)) return null;
384
+ if (isZodSchema(schema)) {
385
+ return {
386
+ adapter: "zod",
387
+ validate: (source) => {
388
+ const s = schema;
389
+ const result = s.safeParse(source);
390
+ if (result.success) {
391
+ return {
392
+ success: true,
393
+ value: result.data
394
+ };
395
+ }
396
+ const issues = result.error?.issues ?? [];
397
+ const msg = issues.map((i) => {
398
+ const path = Array.isArray(i.path) ? i.path.join(".") : "?";
399
+ return `${path}: ${i.message}`;
400
+ }).join("; ");
401
+ return { success: false, error: msg };
402
+ }
403
+ };
404
+ }
405
+ if (isJoiSchema(schema)) {
406
+ return {
407
+ adapter: "joi",
408
+ validate: (source) => {
409
+ const s = schema;
410
+ const result = s.validate(source);
411
+ if (result.error) {
412
+ return { success: false, error: result.error.message };
413
+ }
414
+ return {
415
+ success: true,
416
+ value: result.value
417
+ };
418
+ }
419
+ };
420
+ }
421
+ if (isYupSchema(schema)) {
422
+ return {
423
+ adapter: "yup",
424
+ validate: (source) => {
425
+ const s = schema;
426
+ try {
427
+ const value = s.validateSync(source);
428
+ return { success: true, value };
429
+ } catch (e) {
430
+ return {
431
+ success: false,
432
+ error: e instanceof Error ? e.message : String(e)
433
+ };
434
+ }
435
+ }
436
+ };
437
+ }
438
+ if (isValibotSchema(schema)) {
439
+ return {
440
+ adapter: "valibot",
441
+ validate: (source) => {
442
+ const s = schema;
443
+ try {
444
+ const result = s["~run"]({
445
+ value: source,
446
+ typed: false,
447
+ issues: void 0
448
+ });
449
+ if (result.issues && result.issues.length > 0) {
450
+ const firstIssue = result.issues[0];
451
+ return {
452
+ success: false,
453
+ error: firstIssue?.message ?? "validation failed"
454
+ };
455
+ }
456
+ return {
457
+ success: true,
458
+ value: result.value
459
+ };
460
+ } catch (e) {
461
+ return {
462
+ success: false,
463
+ error: e instanceof Error ? e.message : String(e)
464
+ };
465
+ }
466
+ }
467
+ };
468
+ }
469
+ if (isTypeboxSchema(schema)) {
470
+ return {
471
+ adapter: "typebox",
472
+ validate: (source) => {
473
+ try {
474
+ let Value;
475
+ try {
476
+ Value = require("@sinclair/typebox/value").Value;
477
+ } catch {
478
+ return {
479
+ success: false,
480
+ error: "TypeBox adapter requires @sinclair/typebox to be installed"
481
+ };
482
+ }
483
+ const converted = Value.Convert(schema, source);
484
+ if (Value.Check(schema, converted)) {
485
+ return {
486
+ success: true,
487
+ value: Value.Decode(schema, converted)
488
+ };
489
+ }
490
+ return {
491
+ success: false,
492
+ error: "TypeBox object schema validation failed"
493
+ };
494
+ } catch (e) {
495
+ return {
496
+ success: false,
497
+ error: e instanceof Error ? e.message : String(e)
498
+ };
499
+ }
500
+ }
501
+ };
502
+ }
503
+ if (isArkTypeSchema(schema)) {
504
+ return {
505
+ adapter: "arktype",
506
+ validate: (source) => {
507
+ const t = schema;
508
+ const result = t(source);
509
+ if (result instanceof Error || result != null && typeof result === "object" && "summary" in result) {
510
+ const msg = result instanceof Error ? result.message : typeof result.summary === "string" ? result.summary : "ArkType object schema validation failed";
511
+ return { success: false, error: msg };
512
+ }
513
+ return { success: true, value: result };
514
+ }
515
+ };
516
+ }
517
+ if (isSuperstructSchema(schema)) {
518
+ return {
519
+ adapter: "superstruct",
520
+ validate: (source) => {
521
+ try {
522
+ let ssModule;
523
+ try {
524
+ ssModule = require("superstruct");
525
+ } catch {
526
+ return {
527
+ success: false,
528
+ error: "Superstruct adapter requires superstruct to be installed"
529
+ };
530
+ }
531
+ const [error, value] = ssModule.validate(source, schema);
532
+ if (error) {
533
+ return { success: false, error: error.message };
534
+ }
535
+ return { success: true, value };
536
+ } catch (e) {
537
+ return {
538
+ success: false,
539
+ error: e instanceof Error ? e.message : String(e)
540
+ };
541
+ }
542
+ }
543
+ };
544
+ }
545
+ if (isRuntypesSchema(schema)) {
546
+ return {
547
+ adapter: "runtypes",
548
+ validate: (source) => {
549
+ const rt = schema;
550
+ try {
551
+ const value = rt.check(source);
552
+ return { success: true, value };
553
+ } catch (e) {
554
+ return {
555
+ success: false,
556
+ error: e instanceof Error ? e.message : String(e)
557
+ };
558
+ }
559
+ }
560
+ };
561
+ }
562
+ if (isEffectSchema(schema)) {
563
+ return {
564
+ adapter: "effect",
565
+ validate: (source) => {
566
+ try {
567
+ let SchemaModule;
568
+ try {
569
+ const effect = require("effect");
570
+ SchemaModule = effect.Schema;
571
+ } catch {
572
+ try {
573
+ SchemaModule = require("@effect/schema/Schema");
574
+ } catch {
575
+ return {
576
+ success: false,
577
+ error: "Effect adapter requires effect or @effect/schema to be installed"
578
+ };
579
+ }
580
+ }
581
+ const value = SchemaModule.decodeUnknownSync(schema)(source);
582
+ return { success: true, value };
583
+ } catch (e) {
584
+ return {
585
+ success: false,
586
+ error: e instanceof Error ? e.message : String(e)
587
+ };
588
+ }
589
+ }
590
+ };
591
+ }
592
+ return null;
593
+ }
594
+ function resolveField(field, raw, key) {
595
+ for (const adapter of adapters) {
596
+ if (adapter.detect(field)) {
597
+ return adapter.validate(field, raw, key);
598
+ }
599
+ }
600
+ if (isZodSchema(field)) return parseZod(field, raw, key);
601
+ if (isJoiSchema(field)) return parseJoi(field, raw, key);
602
+ if (isYupSchema(field)) return parseYup(field, raw, key);
603
+ if (isValibotSchema(field)) return parseValibot(field, raw, key);
604
+ if (isTypeboxSchema(field)) return parseTypebox(field, raw, key);
605
+ if (isArkTypeSchema(field)) return parseArkType(field, raw, key);
606
+ if (isSuperstructSchema(field)) return parseSuperstruct(field, raw, key);
607
+ if (isRuntypesSchema(field)) return parseRuntypes(field, raw, key);
608
+ if (isEffectSchema(field)) return parseEffect(field, raw, key);
609
+ if (isCustomValidateField(field)) {
610
+ return field.validate(raw);
611
+ }
612
+ if (isBuiltInField(field)) {
613
+ try {
614
+ const value = parseBuiltIn(field, raw, key);
615
+ return { success: true, value };
616
+ } catch (e) {
617
+ return {
618
+ success: false,
619
+ error: e instanceof Error ? e.message : String(e)
620
+ };
621
+ }
622
+ }
623
+ return {
624
+ success: false,
625
+ error: `No adapter found for field "${key}". The schema object shape was not recognized.`
626
+ };
627
+ }
628
+
629
+ // src/types.ts
630
+ var EnvSafeError = class extends Error {
631
+ errors;
632
+ constructor(errors) {
633
+ const header = `[env-validated] Missing or invalid environment variables:
634
+ `;
635
+ const lines = errors.map((e) => ` \u2716 ${e.key} \u2014 ${e.message}`).join("\n");
636
+ const footer = "\n\nFix these before starting the app.";
637
+ super(`${header}${lines}${footer}`);
638
+ this.name = "EnvSafeError";
639
+ this.errors = errors;
640
+ }
641
+ };
642
+
643
+ // src/index.ts
644
+ var import_meta = {};
645
+ function resolveSource(options) {
646
+ if (options?.source) {
647
+ return options.source;
648
+ }
649
+ if (options?.dotenv) {
650
+ try {
651
+ const { createRequire } = require("module");
652
+ const req = createRequire(import_meta.url);
653
+ const dotenv = req("dotenv");
654
+ const path = typeof options.dotenv === "string" ? options.dotenv : void 0;
655
+ dotenv.config(path ? { path } : void 0);
656
+ } catch {
657
+ }
658
+ }
659
+ if (typeof process !== "undefined" && process.env) {
660
+ return process.env;
661
+ }
662
+ return {};
663
+ }
664
+ function handleError(error, onError) {
665
+ if (onError === "warn") {
666
+ console.warn(error.message);
667
+ return;
668
+ }
669
+ if (typeof onError === "function") {
670
+ onError(error);
671
+ return;
672
+ }
673
+ throw error;
674
+ }
675
+ function createEnv(config, options) {
676
+ const source = resolveSource(options);
677
+ const prefix = options?.prefix ?? "";
678
+ const errors = [];
679
+ if (isObjectSchema(config.schema)) {
680
+ const objectSchemaInfo = resolveObjectSchema(config.schema);
681
+ if (objectSchemaInfo) {
682
+ let effectiveSource = source;
683
+ if (prefix) {
684
+ effectiveSource = {};
685
+ for (const fullKey of Object.keys(source)) {
686
+ if (fullKey.startsWith(prefix)) {
687
+ effectiveSource[fullKey.slice(prefix.length)] = source[fullKey];
688
+ }
689
+ }
690
+ }
691
+ const validation = objectSchemaInfo.validate(effectiveSource);
692
+ if (validation.success) {
693
+ return Object.freeze(validation.value);
694
+ }
695
+ const envError = new EnvSafeError([
696
+ {
697
+ key: `[${objectSchemaInfo.adapter} schema]`,
698
+ message: validation.error
699
+ }
700
+ ]);
701
+ handleError(envError, options?.onError);
702
+ return Object.freeze({});
703
+ }
704
+ }
705
+ const schema = config.schema;
706
+ const result = {};
707
+ for (const key of Object.keys(schema)) {
708
+ const envKey = prefix ? `${prefix}${key}` : key;
709
+ const raw = source[envKey];
710
+ const field = schema[key];
711
+ const validation = resolveField(field, raw, envKey);
712
+ if (validation.success) {
713
+ result[key] = validation.value;
714
+ } else {
715
+ let errorMsg = validation.error;
716
+ if (isSensitiveKey(envKey) && raw !== void 0 && !errorMsg.includes("*****")) {
717
+ errorMsg = errorMsg.replace(
718
+ new RegExp(raw.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "g"),
719
+ "*****"
720
+ );
721
+ }
722
+ errors.push({ key: envKey, message: errorMsg });
723
+ }
724
+ }
725
+ if (errors.length > 0) {
726
+ const envError = new EnvSafeError(errors);
727
+ handleError(envError, options?.onError);
728
+ }
729
+ return Object.freeze(result);
730
+ }
731
+ // Annotate the CommonJS export names for ESM import in node:
732
+ 0 && (module.exports = {
733
+ EnvSafeError,
734
+ createEnv,
735
+ registerAdapter
736
+ });
737
+ //# sourceMappingURL=index.cjs.map