@sliit-foss/env-guard 1.1.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 (67) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cli.d.ts +8 -0
  3. package/dist/cli.js +5 -0
  4. package/dist/cli.js.map +7 -0
  5. package/dist/create-env.d.ts +8 -0
  6. package/dist/create-env.js +2 -0
  7. package/dist/create-env.js.map +7 -0
  8. package/dist/errors/env-validation-error.d.ts +5 -0
  9. package/dist/errors/env-validation-error.js +2 -0
  10. package/dist/errors/env-validation-error.js.map +7 -0
  11. package/dist/errors/format-errors.d.ts +2 -0
  12. package/dist/errors/format-errors.js +6 -0
  13. package/dist/errors/format-errors.js.map +7 -0
  14. package/dist/index.d.ts +6 -0
  15. package/dist/index.js +2 -0
  16. package/dist/index.js.map +7 -0
  17. package/dist/utils/generate-env-example.d.ts +2 -0
  18. package/dist/utils/generate-env-example.js +5 -0
  19. package/dist/utils/generate-env-example.js.map +7 -0
  20. package/dist/utils/is-secret-key.d.ts +1 -0
  21. package/dist/utils/is-secret-key.js +2 -0
  22. package/dist/utils/is-secret-key.js.map +7 -0
  23. package/dist/utils/parse-boolean.d.ts +1 -0
  24. package/dist/utils/parse-boolean.js +2 -0
  25. package/dist/utils/parse-boolean.js.map +7 -0
  26. package/dist/utils/redact.d.ts +1 -0
  27. package/dist/utils/redact.js +2 -0
  28. package/dist/utils/redact.js.map +7 -0
  29. package/dist/validators/array.d.ts +2 -0
  30. package/dist/validators/array.js +2 -0
  31. package/dist/validators/array.js.map +7 -0
  32. package/dist/validators/base-validator.d.ts +48 -0
  33. package/dist/validators/base-validator.js +2 -0
  34. package/dist/validators/base-validator.js.map +7 -0
  35. package/dist/validators/boolean.d.ts +2 -0
  36. package/dist/validators/boolean.js +2 -0
  37. package/dist/validators/boolean.js.map +7 -0
  38. package/dist/validators/email.d.ts +2 -0
  39. package/dist/validators/email.js +2 -0
  40. package/dist/validators/email.js.map +7 -0
  41. package/dist/validators/enum.d.ts +2 -0
  42. package/dist/validators/enum.js +2 -0
  43. package/dist/validators/enum.js.map +7 -0
  44. package/dist/validators/index.d.ts +14 -0
  45. package/dist/validators/index.js +2 -0
  46. package/dist/validators/index.js.map +7 -0
  47. package/dist/validators/json.d.ts +2 -0
  48. package/dist/validators/json.js +2 -0
  49. package/dist/validators/json.js.map +7 -0
  50. package/dist/validators/number.d.ts +3 -0
  51. package/dist/validators/number.js +2 -0
  52. package/dist/validators/number.js.map +7 -0
  53. package/dist/validators/port.d.ts +2 -0
  54. package/dist/validators/port.js +2 -0
  55. package/dist/validators/port.js.map +7 -0
  56. package/dist/validators/secret.d.ts +7 -0
  57. package/dist/validators/secret.js +2 -0
  58. package/dist/validators/secret.js.map +7 -0
  59. package/dist/validators/string.d.ts +2 -0
  60. package/dist/validators/string.js +2 -0
  61. package/dist/validators/string.js.map +7 -0
  62. package/dist/validators/url.d.ts +2 -0
  63. package/dist/validators/url.js +2 -0
  64. package/dist/validators/url.js.map +7 -0
  65. package/package.json +41 -0
  66. package/readme.md +179 -0
  67. package/tsconfig.json +8 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2023 SLIIT FOSS Community
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/dist/cli.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ type CliRunOptions = {
3
+ cwd?: string;
4
+ stdout?: Pick<typeof process.stdout, "write">;
5
+ stderr?: Pick<typeof process.stderr, "write">;
6
+ };
7
+ export declare const runCli: (argv?: string[], options?: CliRunOptions) => Promise<number>;
8
+ export {};
package/dist/cli.js ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+ var M=Object.create;var c=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var P=Object.getPrototypeOf,q=Object.prototype.hasOwnProperty;var a=(e,t)=>c(e,"name",{value:t,configurable:!0});var F=(e,t)=>{for(var r in t)c(e,r,{get:t[r],enumerable:!0})},v=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of k(t))!q.call(e,s)&&s!==r&&c(e,s,{get:()=>t[s],enumerable:!(n=b(t,s))||n.enumerable});return e};var h=(e,t,r)=>(r=e!=null?M(P(e)):{},v(t||!e||!e.__esModule?c(r,"default",{value:e,enumerable:!0}):r,e)),R=e=>v(c({},"__esModule",{value:!0}),e);var j={};F(j,{runCli:()=>J});module.exports=R(j);var f=h(require("node:fs")),u=h(require("node:path")),g=require("node:url"),w=require("commander"),y=h(require("dotenv")),E=require("./create-env"),x=require("./errors/env-validation-error"),C=require("./utils/generate-env-example");const V="1.0.0",p=a((e,t)=>{e.write(`${t}
3
+ `)},"writeLine"),l=a((e,t)=>u.default.isAbsolute(e)?e:u.default.resolve(t,e),"resolvePath"),S=a(async(e,t)=>{const r=l(e,t),n=u.default.extname(r)===".mjs"?await import((0,g.pathToFileURL)(r).href):require(r);return"default"in n&&n.default?n.default:"schema"in n&&n.schema?n.schema:"envSchema"in n&&n.envSchema?n.envSchema:n},"loadSchema"),$=a((e,t)=>{if(!e)return process.env;const r=l(e,t);return y.default.parse(f.default.readFileSync(r))},"loadEnvFile"),J=a(async(e=process.argv,t={})=>{const r=t.cwd??process.cwd(),n=t.stdout??process.stdout,s=t.stderr??process.stderr,m=new w.Command;m.name("env-guard").description("Validate environment variables with an env-guard schema").version(V).exitOverride(),m.command("validate").description("Validate an environment file with a schema").requiredOption("-s, --schema <path>","path to a JS, CJS, or MJS schema module").option("-f, --file <path>","path to an env file").action(async o=>{const i=await S(o.schema,r),d=$(o.file,r);(0,E.createEnv)(i,{source:d}),p(n,"Environment validation passed")}),m.command("example").description("Generate .env.example content from a schema").requiredOption("-s, --schema <path>","path to a JS, CJS, or MJS schema module").option("-o, --output <path>","write the generated example to a file").action(async o=>{const i=await S(o.schema,r),d=`${(0,C.generateEnvExample)(i)}
4
+ `;if(o.output){f.default.writeFileSync(l(o.output,r),d),p(n,`Wrote ${o.output}`);return}n.write(d)});try{return await m.parseAsync(e),0}catch(o){if(o instanceof x.EnvValidationError)return p(s,o.message),1;if(o&&typeof o=="object"&&"code"in o&&o.code==="commander.helpDisplayed")return 0;const i=o instanceof Error?o.message:String(o);return p(s,i),1}},"runCli");require.main===module&&J().then(e=>{process.exitCode=e});0&&(module.exports={runCli});
5
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/cli.ts"],
4
+ "sourcesContent": ["#!/usr/bin/env node\n\n/* eslint-disable no-console */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { Command } from \"commander\";\nimport dotenv from \"dotenv\";\nimport { createEnv } from \"./create-env\";\nimport { EnvValidationError } from \"./errors/env-validation-error\";\nimport { generateEnvExample } from \"./utils/generate-env-example\";\nimport { EnvSchema } from \"./validators\";\n\nconst packageVersion = \"1.0.0\";\n\ntype CliRunOptions = {\n cwd?: string;\n stdout?: Pick<typeof process.stdout, \"write\">;\n stderr?: Pick<typeof process.stderr, \"write\">;\n};\n\ntype SchemaModule = {\n default?: EnvSchema;\n schema?: EnvSchema;\n envSchema?: EnvSchema;\n};\n\nconst writeLine = (stream: Pick<typeof process.stdout, \"write\">, message: string) => {\n stream.write(`${message}\\n`);\n};\n\nconst resolvePath = (filePath: string, cwd: string): string => {\n if (path.isAbsolute(filePath)) return filePath;\n return path.resolve(cwd, filePath);\n};\n\nconst loadSchema = async (schemaPath: string, cwd: string): Promise<EnvSchema> => {\n const resolvedPath = resolvePath(schemaPath, cwd);\n const schemaModule =\n path.extname(resolvedPath) === \".mjs\"\n ? ((await import(pathToFileURL(resolvedPath).href)) as SchemaModule)\n : (require(resolvedPath) as SchemaModule);\n\n if (\"default\" in schemaModule && schemaModule.default) return schemaModule.default;\n if (\"schema\" in schemaModule && schemaModule.schema) return schemaModule.schema;\n if (\"envSchema\" in schemaModule && schemaModule.envSchema) return schemaModule.envSchema;\n\n return schemaModule as unknown as EnvSchema;\n};\n\nconst loadEnvFile = (filePath: string | undefined, cwd: string): Record<string, string | undefined> => {\n if (!filePath) return process.env;\n\n const resolvedPath = resolvePath(filePath, cwd);\n const parsed = dotenv.parse(fs.readFileSync(resolvedPath));\n\n return parsed;\n};\n\nexport const runCli = async (argv = process.argv, options: CliRunOptions = {}): Promise<number> => {\n const cwd = options.cwd ?? process.cwd();\n const stdout = options.stdout ?? process.stdout;\n const stderr = options.stderr ?? process.stderr;\n const program = new Command();\n\n program\n .name(\"env-guard\")\n .description(\"Validate environment variables with an env-guard schema\")\n .version(packageVersion)\n .exitOverride();\n\n program\n .command(\"validate\")\n .description(\"Validate an environment file with a schema\")\n .requiredOption(\"-s, --schema <path>\", \"path to a JS, CJS, or MJS schema module\")\n .option(\"-f, --file <path>\", \"path to an env file\")\n .action(async (commandOptions) => {\n const schema = await loadSchema(commandOptions.schema, cwd);\n const source = loadEnvFile(commandOptions.file, cwd);\n\n createEnv(schema, { source });\n writeLine(stdout, \"Environment validation passed\");\n });\n\n program\n .command(\"example\")\n .description(\"Generate .env.example content from a schema\")\n .requiredOption(\"-s, --schema <path>\", \"path to a JS, CJS, or MJS schema module\")\n .option(\"-o, --output <path>\", \"write the generated example to a file\")\n .action(async (commandOptions) => {\n const schema = await loadSchema(commandOptions.schema, cwd);\n const output = `${generateEnvExample(schema)}\\n`;\n\n if (commandOptions.output) {\n fs.writeFileSync(resolvePath(commandOptions.output, cwd), output);\n writeLine(stdout, `Wrote ${commandOptions.output}`);\n return;\n }\n\n stdout.write(output);\n });\n\n try {\n await program.parseAsync(argv);\n return 0;\n } catch (error) {\n if (error instanceof EnvValidationError) {\n writeLine(stderr, error.message);\n return 1;\n }\n\n if (error && typeof error === \"object\" && \"code\" in error && error.code === \"commander.helpDisplayed\") {\n return 0;\n }\n\n const message = error instanceof Error ? error.message : String(error);\n writeLine(stderr, message);\n return 1;\n }\n};\n\nif (require.main === module) {\n runCli().then((code) => {\n process.exitCode = code;\n });\n}\n"],
5
+ "mappings": ";gmBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,YAAAE,IAAA,eAAAC,EAAAH,GAIA,IAAAI,EAAe,sBACfC,EAAiB,wBACjBC,EAA8B,oBAC9BC,EAAwB,qBACxBC,EAAmB,qBACnBC,EAA0B,wBAC1BC,EAAmC,yCACnCC,EAAmC,wCAGnC,MAAMC,EAAiB,QAcjBC,EAAYC,EAAA,CAACC,EAA8CC,IAAoB,CACnFD,EAAO,MAAM,GAAGC;AAAA,CAAW,CAC7B,EAFkB,aAIZC,EAAcH,EAAA,CAACI,EAAkBC,IACjC,EAAAC,QAAK,WAAWF,CAAQ,EAAUA,EAC/B,EAAAE,QAAK,QAAQD,EAAKD,CAAQ,EAFf,eAKdG,EAAaP,EAAA,MAAOQ,EAAoBH,IAAoC,CAChF,MAAMI,EAAeN,EAAYK,EAAYH,CAAG,EAC1CK,EACJ,EAAAJ,QAAK,QAAQG,CAAY,IAAM,OACzB,MAAM,UAAO,iBAAcA,CAAY,EAAE,MAC1C,QAAQA,CAAY,EAE3B,MAAI,YAAaC,GAAgBA,EAAa,QAAgBA,EAAa,QACvE,WAAYA,GAAgBA,EAAa,OAAeA,EAAa,OACrE,cAAeA,GAAgBA,EAAa,UAAkBA,EAAa,UAExEA,CACT,EAZmB,cAcbC,EAAcX,EAAA,CAACI,EAA8BC,IAAoD,CACrG,GAAI,CAACD,EAAU,OAAO,QAAQ,IAE9B,MAAMK,EAAeN,EAAYC,EAAUC,CAAG,EAG9C,OAFe,EAAAO,QAAO,MAAM,EAAAC,QAAG,aAAaJ,CAAY,CAAC,CAG3D,EAPoB,eASPK,EAASd,EAAA,MAAOe,EAAO,QAAQ,KAAMC,EAAyB,CAAC,IAAuB,CACjG,MAAMX,EAAMW,EAAQ,KAAO,QAAQ,IAAI,EACjCC,EAASD,EAAQ,QAAU,QAAQ,OACnCE,EAASF,EAAQ,QAAU,QAAQ,OACnCG,EAAU,IAAI,UAEpBA,EACG,KAAK,WAAW,EAChB,YAAY,yDAAyD,EACrE,QAAQrB,CAAc,EACtB,aAAa,EAEhBqB,EACG,QAAQ,UAAU,EAClB,YAAY,4CAA4C,EACxD,eAAe,sBAAuB,yCAAyC,EAC/E,OAAO,oBAAqB,qBAAqB,EACjD,OAAO,MAAOC,GAAmB,CAChC,MAAMC,EAAS,MAAMd,EAAWa,EAAe,OAAQf,CAAG,EACpDiB,EAASX,EAAYS,EAAe,KAAMf,CAAG,KAEnD,aAAUgB,EAAQ,CAAE,OAAAC,CAAO,CAAC,EAC5BvB,EAAUkB,EAAQ,+BAA+B,CACnD,CAAC,EAEHE,EACG,QAAQ,SAAS,EACjB,YAAY,6CAA6C,EACzD,eAAe,sBAAuB,yCAAyC,EAC/E,OAAO,sBAAuB,uCAAuC,EACrE,OAAO,MAAOC,GAAmB,CAChC,MAAMC,EAAS,MAAMd,EAAWa,EAAe,OAAQf,CAAG,EACpDkB,EAAS,MAAG,sBAAmBF,CAAM;AAAA,EAE3C,GAAID,EAAe,OAAQ,CACzB,EAAAP,QAAG,cAAcV,EAAYiB,EAAe,OAAQf,CAAG,EAAGkB,CAAM,EAChExB,EAAUkB,EAAQ,SAASG,EAAe,QAAQ,EAClD,MACF,CAEAH,EAAO,MAAMM,CAAM,CACrB,CAAC,EAEH,GAAI,CACF,aAAMJ,EAAQ,WAAWJ,CAAI,EACtB,CACT,OAASS,EAAP,CACA,GAAIA,aAAiB,qBACnB,OAAAzB,EAAUmB,EAAQM,EAAM,OAAO,EACxB,EAGT,GAAIA,GAAS,OAAOA,GAAU,UAAY,SAAUA,GAASA,EAAM,OAAS,0BAC1E,MAAO,GAGT,MAAMtB,EAAUsB,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,EACrE,OAAAzB,EAAUmB,EAAQhB,CAAO,EAClB,CACT,CACF,EA5DsB,UA8DlB,QAAQ,OAAS,QACnBY,EAAO,EAAE,KAAMW,GAAS,CACtB,QAAQ,SAAWA,CACrB,CAAC",
6
+ "names": ["cli_exports", "__export", "runCli", "__toCommonJS", "import_node_fs", "import_node_path", "import_node_url", "import_commander", "import_dotenv", "import_create_env", "import_env_validation_error", "import_generate_env_example", "packageVersion", "writeLine", "__name", "stream", "message", "resolvePath", "filePath", "cwd", "path", "loadSchema", "schemaPath", "resolvedPath", "schemaModule", "loadEnvFile", "dotenv", "fs", "runCli", "argv", "options", "stdout", "stderr", "program", "commandOptions", "schema", "source", "output", "error", "code"]
7
+ }
@@ -0,0 +1,8 @@
1
+ import { EnvSchema, EnvValueSource, InferEnv } from "./validators/base-validator";
2
+ export type CreateEnvOptions = {
3
+ source?: EnvValueSource;
4
+ throwOnError?: boolean;
5
+ redactSecrets?: boolean;
6
+ allowUnknown?: boolean;
7
+ };
8
+ export declare function createEnv<TSchema extends EnvSchema>(schema: TSchema, { source, throwOnError, redactSecrets, allowUnknown }?: CreateEnvOptions): InferEnv<TSchema>;
@@ -0,0 +1,2 @@
1
+ var u=Object.defineProperty;var S=Object.getOwnPropertyDescriptor;var w=Object.getOwnPropertyNames;var V=Object.prototype.hasOwnProperty;var v=(e,n)=>u(e,"name",{value:n,configurable:!0});var b=(e,n)=>{for(var t in n)u(e,t,{get:n[t],enumerable:!0})},O=(e,n,t,o)=>{if(n&&typeof n=="object"||typeof n=="function")for(let s of w(n))!V.call(e,s)&&s!==t&&u(e,s,{get:()=>n[s],enumerable:!(o=S(n,s))||o.enumerable});return e};var I=e=>O(u({},"__esModule",{value:!0}),e);var j={};b(j,{createEnv:()=>T});module.exports=I(j);var E=require("./errors/env-validation-error"),p=require("./errors/format-errors"),l=require("./utils/is-secret-key");const x=v(e=>e===void 0||e.trim().length===0,"isMissing");function T(e,{source:n=process.env,throwOnError:t=!0,redactSecrets:o=!0,allowUnknown:s=!0}={}){const a={},i=[],g=new Set(Object.keys(e));if(Object.entries(e).forEach(([r,d])=>{const c=d.getMeta(),f=n[r],h=o&&(c.sensitive||(0,l.isSecretKey)(r));if(x(f)){if(c.hasDefault){a[r]=c.defaultValue;return}if(!c.required){a[r]=void 0;return}i.push({key:r,message:`${r} is required`,type:"missing",sensitive:h});return}const m=d.parse(f,r);if("message"in m){i.push({key:r,message:m.message,received:f,type:"invalid",sensitive:h});return}a[r]=m.value}),s||Object.keys(n).forEach(r=>{g.has(r)||i.push({key:r,message:`${r} is not defined in the environment schema`,received:n[r],type:"invalid",sensitive:o&&(0,l.isSecretKey)(r)})}),i.length){if(t)throw new E.EnvValidationError(i);console.error((0,p.formatEnvValidationErrors)(i)),process.exit(1)}return a}v(T,"createEnv");0&&(module.exports={createEnv});
2
+ //# sourceMappingURL=create-env.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/create-env.ts"],
4
+ "sourcesContent": ["/* eslint-disable no-console */\n\nimport { EnvValidationError } from \"./errors/env-validation-error\";\nimport { formatEnvValidationErrors } from \"./errors/format-errors\";\nimport { EnvSchema, EnvValueSource, EnvValidationIssue, InferEnv } from \"./validators/base-validator\";\nimport { isSecretKey } from \"./utils/is-secret-key\";\n\nexport type CreateEnvOptions = {\n source?: EnvValueSource;\n throwOnError?: boolean;\n redactSecrets?: boolean;\n allowUnknown?: boolean;\n};\n\nconst isMissing = (value: string | undefined): boolean => value === undefined || value.trim().length === 0;\n\nexport function createEnv<TSchema extends EnvSchema>(\n schema: TSchema,\n { source = process.env, throwOnError = true, redactSecrets = true, allowUnknown = true }: CreateEnvOptions = {}\n): InferEnv<TSchema> {\n const env: Record<string, unknown> = {};\n const issues: EnvValidationIssue[] = [];\n const schemaKeys = new Set(Object.keys(schema));\n\n Object.entries(schema).forEach(([key, validator]) => {\n const meta = validator.getMeta();\n const rawValue = source[key];\n const sensitive = redactSecrets && (meta.sensitive || isSecretKey(key));\n\n if (isMissing(rawValue)) {\n if (meta.hasDefault) {\n env[key] = meta.defaultValue;\n return;\n }\n\n if (!meta.required) {\n env[key] = undefined;\n return;\n }\n\n issues.push({\n key,\n message: `${key} is required`,\n type: \"missing\",\n sensitive\n });\n return;\n }\n\n const result = validator.parse(rawValue as string, key);\n\n if (\"message\" in result) {\n issues.push({\n key,\n message: result.message,\n received: rawValue,\n type: \"invalid\",\n sensitive\n });\n return;\n }\n\n env[key] = result.value;\n });\n\n if (!allowUnknown) {\n Object.keys(source).forEach((key) => {\n if (!schemaKeys.has(key)) {\n issues.push({\n key,\n message: `${key} is not defined in the environment schema`,\n received: source[key],\n type: \"invalid\",\n sensitive: redactSecrets && isSecretKey(key)\n });\n }\n });\n }\n\n if (issues.length) {\n if (throwOnError) {\n throw new EnvValidationError(issues);\n }\n\n console.error(formatEnvValidationErrors(issues));\n process.exit(1);\n }\n\n return env as InferEnv<TSchema>;\n}\n"],
5
+ "mappings": "+cAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,eAAAE,IAAA,eAAAC,EAAAH,GAEA,IAAAI,EAAmC,yCACnCC,EAA0C,kCAE1CC,EAA4B,iCAS5B,MAAMC,EAAYC,EAACC,GAAuCA,IAAU,QAAaA,EAAM,KAAK,EAAE,SAAW,EAAvF,aAEX,SAASC,EACdC,EACA,CAAE,OAAAC,EAAS,QAAQ,IAAK,aAAAC,EAAe,GAAM,cAAAC,EAAgB,GAAM,aAAAC,EAAe,EAAK,EAAsB,CAAC,EAC3F,CACnB,MAAMC,EAA+B,CAAC,EAChCC,EAA+B,CAAC,EAChCC,EAAa,IAAI,IAAI,OAAO,KAAKP,CAAM,CAAC,EAyD9C,GAvDA,OAAO,QAAQA,CAAM,EAAE,QAAQ,CAAC,CAACQ,EAAKC,CAAS,IAAM,CACnD,MAAMC,EAAOD,EAAU,QAAQ,EACzBE,EAAWV,EAAOO,CAAG,EACrBI,EAAYT,IAAkBO,EAAK,cAAa,eAAYF,CAAG,GAErE,GAAIZ,EAAUe,CAAQ,EAAG,CACvB,GAAID,EAAK,WAAY,CACnBL,EAAIG,CAAG,EAAIE,EAAK,aAChB,MACF,CAEA,GAAI,CAACA,EAAK,SAAU,CAClBL,EAAIG,CAAG,EAAI,OACX,MACF,CAEAF,EAAO,KAAK,CACV,IAAAE,EACA,QAAS,GAAGA,gBACZ,KAAM,UACN,UAAAI,CACF,CAAC,EACD,MACF,CAEA,MAAMC,EAASJ,EAAU,MAAME,EAAoBH,CAAG,EAEtD,GAAI,YAAaK,EAAQ,CACvBP,EAAO,KAAK,CACV,IAAAE,EACA,QAASK,EAAO,QAChB,SAAUF,EACV,KAAM,UACN,UAAAC,CACF,CAAC,EACD,MACF,CAEAP,EAAIG,CAAG,EAAIK,EAAO,KACpB,CAAC,EAEIT,GACH,OAAO,KAAKH,CAAM,EAAE,QAASO,GAAQ,CAC9BD,EAAW,IAAIC,CAAG,GACrBF,EAAO,KAAK,CACV,IAAAE,EACA,QAAS,GAAGA,6CACZ,SAAUP,EAAOO,CAAG,EACpB,KAAM,UACN,UAAWL,MAAiB,eAAYK,CAAG,CAC7C,CAAC,CAEL,CAAC,EAGCF,EAAO,OAAQ,CACjB,GAAIJ,EACF,MAAM,IAAI,qBAAmBI,CAAM,EAGrC,QAAQ,SAAM,6BAA0BA,CAAM,CAAC,EAC/C,QAAQ,KAAK,CAAC,CAChB,CAEA,OAAOD,CACT,CAzEgBR,EAAAE,EAAA",
6
+ "names": ["create_env_exports", "__export", "createEnv", "__toCommonJS", "import_env_validation_error", "import_format_errors", "import_is_secret_key", "isMissing", "__name", "value", "createEnv", "schema", "source", "throwOnError", "redactSecrets", "allowUnknown", "env", "issues", "schemaKeys", "key", "validator", "meta", "rawValue", "sensitive", "result"]
7
+ }
@@ -0,0 +1,5 @@
1
+ import { EnvValidationIssue } from "../validators";
2
+ export declare class EnvValidationError extends Error {
3
+ issues: EnvValidationIssue[];
4
+ constructor(issues: EnvValidationIssue[]);
5
+ }
@@ -0,0 +1,2 @@
1
+ var t=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var m=Object.prototype.hasOwnProperty;var n=(s,r)=>t(s,"name",{value:r,configurable:!0});var u=(s,r)=>{for(var i in r)t(s,i,{get:r[i],enumerable:!0})},v=(s,r,i,a)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of l(r))!m.call(s,o)&&o!==i&&t(s,o,{get:()=>r[o],enumerable:!(a=d(r,o))||a.enumerable});return s};var V=s=>v(t({},"__esModule",{value:!0}),s);var p={};u(p,{EnvValidationError:()=>E});module.exports=V(p);var e=require("./format-errors");class E extends Error{issues;constructor(r){super((0,e.formatEnvValidationErrors)(r)),this.name="EnvValidationError",this.issues=r}}n(E,"EnvValidationError");0&&(module.exports={EnvValidationError});
2
+ //# sourceMappingURL=env-validation-error.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/errors/env-validation-error.ts"],
4
+ "sourcesContent": ["import { EnvValidationIssue } from \"../validators\";\nimport { formatEnvValidationErrors } from \"./format-errors\";\n\nexport class EnvValidationError extends Error {\n issues: EnvValidationIssue[];\n\n constructor(issues: EnvValidationIssue[]) {\n super(formatEnvValidationErrors(issues));\n this.name = \"EnvValidationError\";\n this.issues = issues;\n }\n}\n"],
5
+ "mappings": "+cAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,wBAAAE,IAAA,eAAAC,EAAAH,GACA,IAAAI,EAA0C,2BAEnC,MAAMC,UAA2B,KAAM,CAC5C,OAEA,YAAYC,EAA8B,CACxC,SAAM,6BAA0BA,CAAM,CAAC,EACvC,KAAK,KAAO,qBACZ,KAAK,OAASA,CAChB,CACF,CARaC,EAAAF,EAAA",
6
+ "names": ["env_validation_error_exports", "__export", "EnvValidationError", "__toCommonJS", "import_format_errors", "EnvValidationError", "issues", "__name"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import { EnvValidationIssue } from "../validators";
2
+ export declare const formatEnvValidationErrors: (issues: EnvValidationIssue[]) => string;
@@ -0,0 +1,6 @@
1
+ var a=Object.defineProperty;var v=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var m=Object.prototype.hasOwnProperty;var o=(n,i)=>a(n,"name",{value:i,configurable:!0});var g=(n,i)=>{for(var t in i)a(n,t,{get:i[t],enumerable:!0})},f=(n,i,t,r)=>{if(i&&typeof i=="object"||typeof i=="function")for(let e of c(i))!m.call(n,e)&&e!==t&&a(n,e,{get:()=>i[e],enumerable:!(r=v(i,e))||r.enumerable});return n};var p=n=>f(a({},"__esModule",{value:!0}),n);var I={};g(I,{formatEnvValidationErrors:()=>E});module.exports=p(I);var l=require("../utils/redact");const s="- None",d=o(n=>{const i=n.received===void 0?"":`. Received: "${n.sensitive?(0,l.redact)(n.received):n.received}"`;return`- ${n.message}${i}`},"formatIssue"),E=o(n=>{const i=n.filter(e=>e.type==="missing"),t=n.filter(e=>e.type==="invalid"),r=n.filter(e=>e.type==="warning");return["Environment validation failed","","Missing variables:",i.length?i.map(d).join(`
2
+ `):s,"","Invalid variables:",t.length?t.map(d).join(`
3
+ `):s,"","Security warnings:",r.length?r.map(d).join(`
4
+ `):s].join(`
5
+ `)},"formatEnvValidationErrors");0&&(module.exports={formatEnvValidationErrors});
6
+ //# sourceMappingURL=format-errors.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/errors/format-errors.ts"],
4
+ "sourcesContent": ["import { EnvValidationIssue } from \"../validators\";\nimport { redact } from \"../utils/redact\";\n\nconst none = \"- None\";\n\nconst formatIssue = (issue: EnvValidationIssue): string => {\n const received =\n issue.received === undefined ? \"\" : `. Received: \"${issue.sensitive ? redact(issue.received) : issue.received}\"`;\n return `- ${issue.message}${received}`;\n};\n\nexport const formatEnvValidationErrors = (issues: EnvValidationIssue[]): string => {\n const missing = issues.filter((issue) => issue.type === \"missing\");\n const invalid = issues.filter((issue) => issue.type === \"invalid\");\n const warnings = issues.filter((issue) => issue.type === \"warning\");\n\n return [\n \"Environment validation failed\",\n \"\",\n \"Missing variables:\",\n missing.length ? missing.map(formatIssue).join(\"\\n\") : none,\n \"\",\n \"Invalid variables:\",\n invalid.length ? invalid.map(formatIssue).join(\"\\n\") : none,\n \"\",\n \"Security warnings:\",\n warnings.length ? warnings.map(formatIssue).join(\"\\n\") : none\n ].join(\"\\n\");\n};\n"],
5
+ "mappings": "+cAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,+BAAAE,IAAA,eAAAC,EAAAH,GACA,IAAAI,EAAuB,2BAEvB,MAAMC,EAAO,SAEPC,EAAcC,EAACC,GAAsC,CACzD,MAAMC,EACJD,EAAM,WAAa,OAAY,GAAK,gBAAgBA,EAAM,aAAY,UAAOA,EAAM,QAAQ,EAAIA,EAAM,YACvG,MAAO,KAAKA,EAAM,UAAUC,GAC9B,EAJoB,eAMPC,EAA4BH,EAACI,GAAyC,CACjF,MAAMC,EAAUD,EAAO,OAAQH,GAAUA,EAAM,OAAS,SAAS,EAC3DK,EAAUF,EAAO,OAAQH,GAAUA,EAAM,OAAS,SAAS,EAC3DM,EAAWH,EAAO,OAAQH,GAAUA,EAAM,OAAS,SAAS,EAElE,MAAO,CACL,gCACA,GACA,qBACAI,EAAQ,OAASA,EAAQ,IAAIN,CAAW,EAAE,KAAK;AAAA,CAAI,EAAID,EACvD,GACA,qBACAQ,EAAQ,OAASA,EAAQ,IAAIP,CAAW,EAAE,KAAK;AAAA,CAAI,EAAID,EACvD,GACA,qBACAS,EAAS,OAASA,EAAS,IAAIR,CAAW,EAAE,KAAK;AAAA,CAAI,EAAID,CAC3D,EAAE,KAAK;AAAA,CAAI,CACb,EAjByC",
6
+ "names": ["format_errors_exports", "__export", "formatEnvValidationErrors", "__toCommonJS", "import_redact", "none", "formatIssue", "__name", "issue", "received", "formatEnvValidationErrors", "issues", "missing", "invalid", "warnings"]
7
+ }
@@ -0,0 +1,6 @@
1
+ export { createEnv, type CreateEnvOptions } from "./create-env";
2
+ export { EnvValidationError } from "./errors/env-validation-error";
3
+ export { formatEnvValidationErrors } from "./errors/format-errors";
4
+ export { generateEnvExample } from "./utils/generate-env-example";
5
+ export { runCli } from "./cli";
6
+ export { BaseValidator, validators, type EnvSchema, type EnvValidationIssue, type InferEnv, type InferValidator } from "./validators";
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ var n=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var x=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var s=(e,r)=>{for(var t in r)n(e,t,{get:r[t],enumerable:!0})},y=(e,r,t,p)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of x(r))!d.call(e,o)&&o!==t&&n(e,o,{get:()=>r[o],enumerable:!(p=l(r,o))||p.enumerable});return e};var V=e=>y(n({},"__esModule",{value:!0}),e);var I={};s(I,{BaseValidator:()=>a.BaseValidator,EnvValidationError:()=>E.EnvValidationError,createEnv:()=>i.createEnv,formatEnvValidationErrors:()=>f.formatEnvValidationErrors,generateEnvExample:()=>m.generateEnvExample,runCli:()=>v.runCli,validators:()=>a.validators});module.exports=V(I);var i=require("./create-env"),E=require("./errors/env-validation-error"),f=require("./errors/format-errors"),m=require("./utils/generate-env-example"),v=require("./cli"),a=require("./validators");0&&(module.exports={BaseValidator,EnvValidationError,createEnv,formatEnvValidationErrors,generateEnvExample,runCli,validators});
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/index.ts"],
4
+ "sourcesContent": ["export { createEnv, type CreateEnvOptions } from \"./create-env\";\nexport { EnvValidationError } from \"./errors/env-validation-error\";\nexport { formatEnvValidationErrors } from \"./errors/format-errors\";\nexport { generateEnvExample } from \"./utils/generate-env-example\";\nexport { runCli } from \"./cli\";\nexport {\n BaseValidator,\n validators,\n type EnvSchema,\n type EnvValidationIssue,\n type InferEnv,\n type InferValidator\n} from \"./validators\";\n"],
5
+ "mappings": "4ZAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,gRAAAE,EAAAF,GAAA,IAAAG,EAAiD,wBACjDC,EAAmC,yCACnCC,EAA0C,kCAC1CC,EAAmC,wCACnCC,EAAuB,iBACvBC,EAOO",
6
+ "names": ["src_exports", "__export", "__toCommonJS", "import_create_env", "import_env_validation_error", "import_format_errors", "import_generate_env_example", "import_cli", "import_validators"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import { EnvSchema } from "../validators/base-validator";
2
+ export declare const generateEnvExample: (schema: EnvSchema) => string;
@@ -0,0 +1,5 @@
1
+ var s=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var p=(e,n)=>s(e,"name",{value:n,configurable:!0});var m=(e,n)=>{for(var i in n)s(e,i,{get:n[i],enumerable:!0})},l=(e,n,i,t)=>{if(n&&typeof n=="object"||typeof n=="function")for(let r of a(n))!c.call(e,r)&&r!==i&&s(e,r,{get:()=>n[r],enumerable:!(t=u(n,r))||t.enumerable});return e};var g=e=>l(s({},"__esModule",{value:!0}),e);var d={};m(d,{generateEnvExample:()=>h});module.exports=g(d);const f=p(e=>e===void 0?"":typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):JSON.stringify(e),"stringify"),h=p(e=>Object.entries(e).map(([n,i])=>{const t=i.getMeta(),r=[];t.description&&r.push(`# ${t.description}`),t.hasDefault&&r.push(`# Default: ${f(t.defaultValue)}`),t.example!==void 0&&r.push(`# Example: ${f(t.example)}`),t.typeName==="secret"&&r.push(t.typeDescription?`# Secret value. ${t.typeDescription}`:"# Secret value");const o=t.hasDefault?f(t.defaultValue):"";return r.push(`${n}=${o}`),r.join(`
2
+ `)}).join(`
3
+
4
+ `),"generateEnvExample");0&&(module.exports={generateEnvExample});
5
+ //# sourceMappingURL=generate-env-example.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/generate-env-example.ts"],
4
+ "sourcesContent": ["import { EnvSchema } from \"../validators/base-validator\";\n\nconst stringify = (value: unknown): string => {\n if (value === undefined) return \"\";\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n return JSON.stringify(value);\n};\n\nexport const generateEnvExample = (schema: EnvSchema): string => {\n return Object.entries(schema)\n .map(([key, validator]) => {\n const meta = validator.getMeta();\n const lines: string[] = [];\n\n if (meta.description) lines.push(`# ${meta.description}`);\n if (meta.hasDefault) lines.push(`# Default: ${stringify(meta.defaultValue)}`);\n if (meta.example !== undefined) lines.push(`# Example: ${stringify(meta.example)}`);\n if (meta.typeName === \"secret\") {\n lines.push(meta.typeDescription ? `# Secret value. ${meta.typeDescription}` : \"# Secret value\");\n }\n\n const value = meta.hasDefault ? stringify(meta.defaultValue) : \"\";\n lines.push(`${key}=${value}`);\n\n return lines.join(\"\\n\");\n })\n .join(\"\\n\\n\");\n};\n"],
5
+ "mappings": "+cAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,wBAAAE,IAAA,eAAAC,EAAAH,GAEA,MAAMI,EAAYC,EAACC,GACbA,IAAU,OAAkB,GAC5B,OAAOA,GAAU,SAAiBA,EAClC,OAAOA,GAAU,UAAY,OAAOA,GAAU,UAAkB,OAAOA,CAAK,EACzE,KAAK,UAAUA,CAAK,EAJX,aAOLC,EAAqBF,EAACG,GAC1B,OAAO,QAAQA,CAAM,EACzB,IAAI,CAAC,CAACC,EAAKC,CAAS,IAAM,CACzB,MAAMC,EAAOD,EAAU,QAAQ,EACzBE,EAAkB,CAAC,EAErBD,EAAK,aAAaC,EAAM,KAAK,KAAKD,EAAK,aAAa,EACpDA,EAAK,YAAYC,EAAM,KAAK,cAAcR,EAAUO,EAAK,YAAY,GAAG,EACxEA,EAAK,UAAY,QAAWC,EAAM,KAAK,cAAcR,EAAUO,EAAK,OAAO,GAAG,EAC9EA,EAAK,WAAa,UACpBC,EAAM,KAAKD,EAAK,gBAAkB,mBAAmBA,EAAK,kBAAoB,gBAAgB,EAGhG,MAAML,EAAQK,EAAK,WAAaP,EAAUO,EAAK,YAAY,EAAI,GAC/D,OAAAC,EAAM,KAAK,GAAGH,KAAOH,GAAO,EAErBM,EAAM,KAAK;AAAA,CAAI,CACxB,CAAC,EACA,KAAK;AAAA;AAAA,CAAM,EAlBkB",
6
+ "names": ["generate_env_example_exports", "__export", "generateEnvExample", "__toCommonJS", "stringify", "__name", "value", "generateEnvExample", "schema", "key", "validator", "meta", "lines"]
7
+ }
@@ -0,0 +1 @@
1
+ export declare const isSecretKey: (key: string) => boolean;
@@ -0,0 +1,2 @@
1
+ var n=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var K=Object.getOwnPropertyNames;var T=Object.prototype.hasOwnProperty;var r=(e,t)=>n(e,"name",{value:t,configurable:!0});var c=(e,t)=>{for(var s in t)n(e,s,{get:t[s],enumerable:!0})},P=(e,t,s,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let E of K(t))!T.call(e,E)&&E!==s&&n(e,E,{get:()=>t[E],enumerable:!(o=A(t,E))||o.enumerable});return e};var R=e=>P(n({},"__esModule",{value:!0}),e);var I={};c(I,{isSecretKey:()=>i});module.exports=R(I);const S=/(SECRET|TOKEN|PASSWORD|PRIVATE_KEY|API_KEY|AUTH|CREDENTIAL)/i,i=r(e=>S.test(e),"isSecretKey");0&&(module.exports={isSecretKey});
2
+ //# sourceMappingURL=is-secret-key.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/is-secret-key.ts"],
4
+ "sourcesContent": ["const secretKeyPattern = /(SECRET|TOKEN|PASSWORD|PRIVATE_KEY|API_KEY|AUTH|CREDENTIAL)/i;\n\nexport const isSecretKey = (key: string): boolean => secretKeyPattern.test(key);\n"],
5
+ "mappings": "+cAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,iBAAAE,IAAA,eAAAC,EAAAH,GAAA,MAAMI,EAAmB,+DAEZC,EAAcC,EAACC,GAAyBH,EAAiB,KAAKG,CAAG,EAAnD",
6
+ "names": ["is_secret_key_exports", "__export", "isSecretKey", "__toCommonJS", "secretKeyPattern", "isSecretKey", "__name", "key"]
7
+ }
@@ -0,0 +1 @@
1
+ export declare const parseBoolean: (value: string) => boolean | undefined;
@@ -0,0 +1,2 @@
1
+ var t=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var u=Object.prototype.hasOwnProperty;var s=(o,e)=>t(o,"name",{value:e,configurable:!0});var i=(o,e)=>{for(var r in e)t(o,r,{get:e[r],enumerable:!0})},c=(o,e,r,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of f(e))!u.call(o,n)&&n!==r&&t(o,n,{get:()=>e[n],enumerable:!(a=l(e,n))||a.enumerable});return o};var d=o=>c(t({},"__esModule",{value:!0}),o);var g={};i(g,{parseBoolean:()=>p});module.exports=d(g);const b={0:!1,1:!0,false:!1,no:!1,off:!1,on:!0,true:!0,yes:!0},p=s(o=>{const e=o.trim().toLowerCase();return b[e]},"parseBoolean");0&&(module.exports={parseBoolean});
2
+ //# sourceMappingURL=parse-boolean.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/parse-boolean.ts"],
4
+ "sourcesContent": ["const booleanMap: Record<string, boolean> = {\n \"0\": false,\n \"1\": true,\n \"false\": false,\n \"no\": false,\n \"off\": false,\n \"on\": true,\n \"true\": true,\n \"yes\": true\n};\n\nexport const parseBoolean = (value: string): boolean | undefined => {\n const normalized = value.trim().toLowerCase();\n return booleanMap[normalized];\n};\n"],
5
+ "mappings": "+cAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,kBAAAE,IAAA,eAAAC,EAAAH,GAAA,MAAMI,EAAsC,CAC1C,EAAK,GACL,EAAK,GACL,MAAS,GACT,GAAM,GACN,IAAO,GACP,GAAM,GACN,KAAQ,GACR,IAAO,EACT,EAEaC,EAAeC,EAACC,GAAuC,CAClE,MAAMC,EAAaD,EAAM,KAAK,EAAE,YAAY,EAC5C,OAAOH,EAAWI,CAAU,CAC9B,EAH4B",
6
+ "names": ["parse_boolean_exports", "__export", "parseBoolean", "__toCommonJS", "booleanMap", "parseBoolean", "__name", "value", "normalized"]
7
+ }
@@ -0,0 +1 @@
1
+ export declare const redact: (value?: string) => string;
@@ -0,0 +1,2 @@
1
+ var i=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var u=Object.prototype.hasOwnProperty;var E=(r,n)=>i(r,"name",{value:n,configurable:!0});var c=(r,n)=>{for(var e in n)i(r,e,{get:n[e],enumerable:!0})},f=(r,n,e,D)=>{if(n&&typeof n=="object"||typeof n=="function")for(let t of s(n))!u.call(r,t)&&t!==e&&i(r,t,{get:()=>n[t],enumerable:!(D=d(n,t))||D.enumerable});return r};var g=r=>f(i({},"__esModule",{value:!0}),r);var A={};c(A,{redact:()=>o});module.exports=g(A);const o=E(r=>(r===void 0,"[REDACTED]"),"redact");0&&(module.exports={redact});
2
+ //# sourceMappingURL=redact.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/redact.ts"],
4
+ "sourcesContent": ["export const redact = (value?: string): string => {\n if (value === undefined) return \"[REDACTED]\";\n return \"[REDACTED]\";\n};\n"],
5
+ "mappings": "+cAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,YAAAE,IAAA,eAAAC,EAAAH,GAAO,MAAMI,EAASC,EAACC,IACjBA,IAAU,OAAkB,cADZ",
6
+ "names": ["redact_exports", "__export", "redact", "__toCommonJS", "redact", "__name", "value"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import { BaseValidator } from "./base-validator";
2
+ export declare const array: (separator?: string) => BaseValidator<string[]>;
@@ -0,0 +1,2 @@
1
+ var i=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var n=(t,r)=>i(t,"name",{value:r,configurable:!0});var s=(t,r)=>{for(var a in r)i(t,a,{get:r[a],enumerable:!0})},f=(t,r,a,o)=>{if(r&&typeof r=="object"||typeof r=="function")for(let e of l(r))!p.call(t,e)&&e!==a&&i(t,e,{get:()=>r[e],enumerable:!(o=u(r,e))||o.enumerable});return t};var g=t=>f(i({},"__esModule",{value:!0}),t);var y={};s(y,{array:()=>k});module.exports=g(y);var m=require("./base-validator");const k=n((t=",")=>new m.BaseValidator("array",r=>r.trim().length===0?{ok:!0,value:[]}:{ok:!0,value:r.split(t).map(a=>a.trim())}),"array");0&&(module.exports={array});
2
+ //# sourceMappingURL=array.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/validators/array.ts"],
4
+ "sourcesContent": ["import { BaseValidator } from \"./base-validator\";\n\nexport const array = (separator = \",\") =>\n new BaseValidator<string[]>(\"array\", (value) => {\n if (value.trim().length === 0) {\n return { ok: true, value: [] };\n }\n\n return {\n ok: true,\n value: value.split(separator).map((item) => item.trim())\n };\n });\n"],
5
+ "mappings": "+cAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,WAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAA8B,4BAEvB,MAAMC,EAAQC,EAAA,CAACC,EAAY,MAChC,IAAI,gBAAwB,QAAUC,GAChCA,EAAM,KAAK,EAAE,SAAW,EACnB,CAAE,GAAI,GAAM,MAAO,CAAC,CAAE,EAGxB,CACL,GAAI,GACJ,MAAOA,EAAM,MAAMD,CAAS,EAAE,IAAKE,GAASA,EAAK,KAAK,CAAC,CACzD,CACD,EAVkB",
6
+ "names": ["array_exports", "__export", "array", "__toCommonJS", "import_base_validator", "array", "__name", "separator", "value", "item"]
7
+ }
@@ -0,0 +1,48 @@
1
+ export type EnvValueSource = Record<string, string | undefined>;
2
+ export type EnvValidationIssueType = "missing" | "invalid" | "warning";
3
+ export type EnvValidationIssue = {
4
+ key: string;
5
+ message: string;
6
+ received?: string;
7
+ type: EnvValidationIssueType;
8
+ sensitive?: boolean;
9
+ };
10
+ export type ValidatorResult<T> = {
11
+ ok: true;
12
+ value: T;
13
+ } | {
14
+ ok: false;
15
+ message: string;
16
+ };
17
+ export type ValidatorMeta<T> = {
18
+ required: boolean;
19
+ defaultValue?: T;
20
+ hasDefault: boolean;
21
+ description?: string;
22
+ example?: T;
23
+ sensitive: boolean;
24
+ typeName: string;
25
+ typeDescription?: string;
26
+ };
27
+ type Parser<T> = (value: string, key: string) => ValidatorResult<T>;
28
+ export declare class BaseValidator<TOutput> {
29
+ private readonly parser;
30
+ private readonly meta;
31
+ constructor(typeName: string, parser: Parser<TOutput>, meta?: Partial<ValidatorMeta<TOutput>>);
32
+ required(): BaseValidator<TOutput>;
33
+ optional(): BaseValidator<TOutput | undefined>;
34
+ default(value: TOutput): BaseValidator<TOutput>;
35
+ description(text: string): BaseValidator<TOutput>;
36
+ example(value: TOutput): BaseValidator<TOutput>;
37
+ sensitive(): BaseValidator<TOutput>;
38
+ parse(value: string, key: string): ValidatorResult<TOutput>;
39
+ getMeta(): ValidatorMeta<TOutput>;
40
+ private clone;
41
+ }
42
+ export type AnyValidator = BaseValidator<any>;
43
+ export type InferValidator<TValidator> = TValidator extends BaseValidator<infer TOutput> ? TOutput : never;
44
+ export type EnvSchema = Record<string, AnyValidator>;
45
+ export type InferEnv<TSchema extends EnvSchema> = {
46
+ [K in keyof TSchema]: InferValidator<TSchema[K]>;
47
+ };
48
+ export {};
@@ -0,0 +1,2 @@
1
+ var s=Object.defineProperty;var o=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var u=(t,e)=>s(t,"name",{value:e,configurable:!0});var d=(t,e)=>{for(var a in e)s(t,a,{get:e[a],enumerable:!0})},T=(t,e,a,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of l(e))!p.call(t,r)&&r!==a&&s(t,r,{get:()=>e[r],enumerable:!(i=o(e,r))||i.enumerable});return t};var V=t=>T(s({},"__esModule",{value:!0}),t);var y={};d(y,{BaseValidator:()=>n});module.exports=V(y);class n{parser;meta;constructor(e,a,i){this.parser=a,this.meta={required:!0,hasDefault:!1,sensitive:!1,typeName:e,...i}}required(){return this.clone({required:!0})}optional(){return this.clone({required:!1})}default(e){return this.clone({defaultValue:e,hasDefault:!0,required:!1})}description(e){return this.clone({description:e})}example(e){return this.clone({example:e})}sensitive(){return this.clone({sensitive:!0})}parse(e,a){return this.parser(e,a)}getMeta(){return{...this.meta}}clone(e){return new n(this.meta.typeName,this.parser,{...this.meta,...e})}}u(n,"BaseValidator");0&&(module.exports={BaseValidator});
2
+ //# sourceMappingURL=base-validator.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/validators/base-validator.ts"],
4
+ "sourcesContent": ["export type EnvValueSource = Record<string, string | undefined>;\n\nexport type EnvValidationIssueType = \"missing\" | \"invalid\" | \"warning\";\n\nexport type EnvValidationIssue = {\n key: string;\n message: string;\n received?: string;\n type: EnvValidationIssueType;\n sensitive?: boolean;\n};\n\nexport type ValidatorResult<T> =\n | {\n ok: true;\n value: T;\n }\n | {\n ok: false;\n message: string;\n };\n\nexport type ValidatorMeta<T> = {\n required: boolean;\n defaultValue?: T;\n hasDefault: boolean;\n description?: string;\n example?: T;\n sensitive: boolean;\n typeName: string;\n typeDescription?: string;\n};\n\ntype Parser<T> = (value: string, key: string) => ValidatorResult<T>;\n\nexport class BaseValidator<TOutput> {\n private readonly parser: Parser<TOutput>;\n private readonly meta: ValidatorMeta<TOutput>;\n\n constructor(typeName: string, parser: Parser<TOutput>, meta?: Partial<ValidatorMeta<TOutput>>) {\n this.parser = parser;\n this.meta = {\n required: true,\n hasDefault: false,\n sensitive: false,\n typeName,\n ...meta\n };\n }\n\n required(): BaseValidator<TOutput> {\n return this.clone({ required: true });\n }\n\n optional(): BaseValidator<TOutput | undefined> {\n return this.clone<TOutput | undefined>({ required: false });\n }\n\n default(value: TOutput): BaseValidator<TOutput> {\n return this.clone({ defaultValue: value, hasDefault: true, required: false });\n }\n\n description(text: string): BaseValidator<TOutput> {\n return this.clone({ description: text });\n }\n\n example(value: TOutput): BaseValidator<TOutput> {\n return this.clone({ example: value });\n }\n\n sensitive(): BaseValidator<TOutput> {\n return this.clone({ sensitive: true });\n }\n\n parse(value: string, key: string): ValidatorResult<TOutput> {\n return this.parser(value, key);\n }\n\n getMeta(): ValidatorMeta<TOutput> {\n return { ...this.meta };\n }\n\n private clone<TNext = TOutput>(meta: Partial<ValidatorMeta<TNext>>): BaseValidator<TNext> {\n return new BaseValidator<TNext>(this.meta.typeName, this.parser as unknown as Parser<TNext>, {\n ...(this.meta as unknown as ValidatorMeta<TNext>),\n ...meta\n });\n }\n}\n\nexport type AnyValidator = BaseValidator<any>;\nexport type InferValidator<TValidator> = TValidator extends BaseValidator<infer TOutput> ? TOutput : never;\nexport type EnvSchema = Record<string, AnyValidator>;\nexport type InferEnv<TSchema extends EnvSchema> = {\n [K in keyof TSchema]: InferValidator<TSchema[K]>;\n};\n"],
5
+ "mappings": "+cAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,mBAAAE,IAAA,eAAAC,EAAAH,GAmCO,MAAMI,CAAuB,CACjB,OACA,KAEjB,YAAYC,EAAkBC,EAAyBC,EAAwC,CAC7F,KAAK,OAASD,EACd,KAAK,KAAO,CACV,SAAU,GACV,WAAY,GACZ,UAAW,GACX,SAAAD,EACA,GAAGE,CACL,CACF,CAEA,UAAmC,CACjC,OAAO,KAAK,MAAM,CAAE,SAAU,EAAK,CAAC,CACtC,CAEA,UAA+C,CAC7C,OAAO,KAAK,MAA2B,CAAE,SAAU,EAAM,CAAC,CAC5D,CAEA,QAAQC,EAAwC,CAC9C,OAAO,KAAK,MAAM,CAAE,aAAcA,EAAO,WAAY,GAAM,SAAU,EAAM,CAAC,CAC9E,CAEA,YAAYC,EAAsC,CAChD,OAAO,KAAK,MAAM,CAAE,YAAaA,CAAK,CAAC,CACzC,CAEA,QAAQD,EAAwC,CAC9C,OAAO,KAAK,MAAM,CAAE,QAASA,CAAM,CAAC,CACtC,CAEA,WAAoC,CAClC,OAAO,KAAK,MAAM,CAAE,UAAW,EAAK,CAAC,CACvC,CAEA,MAAMA,EAAeE,EAAuC,CAC1D,OAAO,KAAK,OAAOF,EAAOE,CAAG,CAC/B,CAEA,SAAkC,CAChC,MAAO,CAAE,GAAG,KAAK,IAAK,CACxB,CAEQ,MAAuBH,EAA2D,CACxF,OAAO,IAAIH,EAAqB,KAAK,KAAK,SAAU,KAAK,OAAoC,CAC3F,GAAI,KAAK,KACT,GAAGG,CACL,CAAC,CACH,CACF,CArDaI,EAAAP,EAAA",
6
+ "names": ["base_validator_exports", "__export", "BaseValidator", "__toCommonJS", "BaseValidator", "typeName", "parser", "meta", "value", "text", "key", "__name"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import { BaseValidator } from "./base-validator";
2
+ export declare const boolean: () => BaseValidator<boolean>;
@@ -0,0 +1,2 @@
1
+ var n=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var b=Object.getOwnPropertyNames;var f=Object.prototype.hasOwnProperty;var l=(o,e)=>n(o,"name",{value:e,configurable:!0});var i=(o,e)=>{for(var a in e)n(o,a,{get:e[a],enumerable:!0})},p=(o,e,a,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of b(e))!f.call(o,r)&&r!==a&&n(o,r,{get:()=>e[r],enumerable:!(t=m(e,r))||t.enumerable});return o};var d=o=>p(n({},"__esModule",{value:!0}),o);var k={};i(k,{boolean:()=>c});module.exports=d(k);var s=require("../utils/parse-boolean"),u=require("./base-validator");const c=l(()=>new u.BaseValidator("boolean",(o,e)=>{const a=(0,s.parseBoolean)(o);return a===void 0?{ok:!1,message:`${e} must be a boolean value`}:{ok:!0,value:a}}),"boolean");0&&(module.exports={boolean});
2
+ //# sourceMappingURL=boolean.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/validators/boolean.ts"],
4
+ "sourcesContent": ["import { parseBoolean } from \"../utils/parse-boolean\";\nimport { BaseValidator } from \"./base-validator\";\n\nexport const boolean = () =>\n new BaseValidator<boolean>(\"boolean\", (value, key) => {\n const parsed = parseBoolean(value);\n\n if (parsed === undefined) {\n return {\n ok: false,\n message: `${key} must be a boolean value`\n };\n }\n\n return { ok: true, value: parsed };\n });\n"],
5
+ "mappings": "+cAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,aAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAA6B,kCAC7BC,EAA8B,4BAEvB,MAAMC,EAAUC,EAAA,IACrB,IAAI,gBAAuB,UAAW,CAACC,EAAOC,IAAQ,CACpD,MAAMC,KAAS,gBAAaF,CAAK,EAEjC,OAAIE,IAAW,OACN,CACL,GAAI,GACJ,QAAS,GAAGD,2BACd,EAGK,CAAE,GAAI,GAAM,MAAOC,CAAO,CACnC,CAAC,EAZoB",
6
+ "names": ["boolean_exports", "__export", "boolean", "__toCommonJS", "import_parse_boolean", "import_base_validator", "boolean", "__name", "value", "key", "parsed"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import { BaseValidator } from "./base-validator";
2
+ export declare const email: () => BaseValidator<string>;
@@ -0,0 +1,2 @@
1
+ var r=Object.defineProperty;var n=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var m=(s,e)=>r(s,"name",{value:e,configurable:!0});var f=(s,e)=>{for(var a in e)r(s,a,{get:e[a],enumerable:!0})},u=(s,e,a,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of l(e))!d.call(s,t)&&t!==a&&r(s,t,{get:()=>e[t],enumerable:!(i=n(e,t))||i.enumerable});return s};var c=s=>u(r({},"__esModule",{value:!0}),s);var p={};f(p,{email:()=>k});module.exports=c(p);var o=require("./base-validator");const g=/^[^\s@]+@[^\s@]+\.[^\s@]+$/,k=m(()=>new o.BaseValidator("email",(s,e)=>g.test(s)?{ok:!0,value:s}:{ok:!1,message:`${e} must be a valid email address`}),"email");0&&(module.exports={email});
2
+ //# sourceMappingURL=email.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/validators/email.ts"],
4
+ "sourcesContent": ["import { BaseValidator } from \"./base-validator\";\n\nconst emailPattern = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\nexport const email = () =>\n new BaseValidator<string>(\"email\", (value, key) => {\n if (!emailPattern.test(value)) {\n return {\n ok: false,\n message: `${key} must be a valid email address`\n };\n }\n\n return { ok: true, value };\n });\n"],
5
+ "mappings": "+cAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,WAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAA8B,4BAE9B,MAAMC,EAAe,6BAERC,EAAQC,EAAA,IACnB,IAAI,gBAAsB,QAAS,CAACC,EAAOC,IACpCJ,EAAa,KAAKG,CAAK,EAOrB,CAAE,GAAI,GAAM,MAAAA,CAAM,EANhB,CACL,GAAI,GACJ,QAAS,GAAGC,iCACd,CAIH,EAVkB",
6
+ "names": ["email_exports", "__export", "email", "__toCommonJS", "import_base_validator", "emailPattern", "email", "__name", "value", "key"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import { BaseValidator } from "./base-validator";
2
+ export declare const enumValue: <TValue extends string>(values: readonly TValue[]) => BaseValidator<TValue>;
@@ -0,0 +1,2 @@
1
+ var o=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var m=Object.prototype.hasOwnProperty;var s=(a,e)=>o(a,"name",{value:e,configurable:!0});var d=(a,e)=>{for(var n in e)o(a,n,{get:e[n],enumerable:!0})},f=(a,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of i(e))!m.call(a,t)&&t!==n&&o(a,t,{get:()=>e[t],enumerable:!(r=u(e,t))||r.enumerable});return a};var V=a=>f(o({},"__esModule",{value:!0}),a);var T={};d(T,{enumValue:()=>g});module.exports=V(T);var l=require("./base-validator");const g=s(a=>new l.BaseValidator("enum",(e,n)=>a.length?a.includes(e)?{ok:!0,value:e}:{ok:!1,message:`${n} must be one of: ${a.join(", ")}`}:{ok:!1,message:`${n} must define at least one allowed value`}),"enumValue");0&&(module.exports={enumValue});
2
+ //# sourceMappingURL=enum.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/validators/enum.ts"],
4
+ "sourcesContent": ["import { BaseValidator } from \"./base-validator\";\n\nexport const enumValue = <TValue extends string>(values: readonly TValue[]) =>\n new BaseValidator<TValue>(\"enum\", (value, key) => {\n if (!values.length) {\n return {\n ok: false,\n message: `${key} must define at least one allowed value`\n };\n }\n\n if (!(values as readonly string[]).includes(value)) {\n return {\n ok: false,\n message: `${key} must be one of: ${values.join(\", \")}`\n };\n }\n\n return { ok: true, value: value as TValue };\n });\n"],
5
+ "mappings": "+cAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,eAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAA8B,4BAEvB,MAAMC,EAAYC,EAAwBC,GAC/C,IAAI,gBAAsB,OAAQ,CAACC,EAAOC,IACnCF,EAAO,OAONA,EAA6B,SAASC,CAAK,EAO1C,CAAE,GAAI,GAAM,MAAOA,CAAgB,EANjC,CACL,GAAI,GACJ,QAAS,GAAGC,qBAAuBF,EAAO,KAAK,IAAI,GACrD,EAVO,CACL,GAAI,GACJ,QAAS,GAAGE,0CACd,CAWH,EAjBsB",
6
+ "names": ["enum_exports", "__export", "enumValue", "__toCommonJS", "import_base_validator", "enumValue", "__name", "values", "value", "key"]
7
+ }
@@ -0,0 +1,14 @@
1
+ export { BaseValidator, type AnyValidator, type EnvSchema, type EnvValidationIssue, type InferEnv, type InferValidator } from "./base-validator";
2
+ export declare const validators: {
3
+ array: (separator?: string) => import("./base-validator").BaseValidator<string[]>;
4
+ boolean: () => import("./base-validator").BaseValidator<boolean>;
5
+ email: () => import("./base-validator").BaseValidator<string>;
6
+ enum: <TValue extends string>(values: readonly TValue[]) => import("./base-validator").BaseValidator<TValue>;
7
+ integer: () => import("./base-validator").BaseValidator<number>;
8
+ json: <TOutput = unknown>() => import("./base-validator").BaseValidator<TOutput>;
9
+ number: () => import("./base-validator").BaseValidator<number>;
10
+ port: () => import("./base-validator").BaseValidator<number>;
11
+ secret: ({ minLength }?: import("./secret").SecretValidatorOptions) => import("./base-validator").BaseValidator<string>;
12
+ string: () => import("./base-validator").BaseValidator<string>;
13
+ url: () => import("./base-validator").BaseValidator<string>;
14
+ };
@@ -0,0 +1,2 @@
1
+ var i=Object.defineProperty;var c=Object.getOwnPropertyDescriptor;var E=Object.getOwnPropertyNames;var I=Object.prototype.hasOwnProperty;var b=(o,r)=>{for(var m in r)i(o,m,{get:r[m],enumerable:!0})},g=(o,r,m,p)=>{if(r&&typeof r=="object"||typeof r=="function")for(let t of E(r))!I.call(o,t)&&t!==m&&i(o,t,{get:()=>r[t],enumerable:!(p=c(r,t))||p.enumerable});return o};var x=o=>g(i({},"__esModule",{value:!0}),o);var j={};b(j,{BaseValidator:()=>v.BaseValidator,validators:()=>h});module.exports=x(j);var a=require("./array"),n=require("./boolean"),f=require("./email"),l=require("./enum"),s=require("./json"),e=require("./number"),y=require("./port"),u=require("./secret"),d=require("./string"),V=require("./url"),v=require("./base-validator");const h={array:a.array,boolean:n.boolean,email:f.email,enum:l.enumValue,integer:e.integer,json:s.json,number:e.number,port:y.port,secret:u.secret,string:d.string,url:V.url};0&&(module.exports={BaseValidator,validators});
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/validators/index.ts"],
4
+ "sourcesContent": ["import { array } from \"./array\";\nimport { boolean } from \"./boolean\";\nimport { email } from \"./email\";\nimport { enumValue } from \"./enum\";\nimport { json } from \"./json\";\nimport { integer, number } from \"./number\";\nimport { port } from \"./port\";\nimport { secret } from \"./secret\";\nimport { string } from \"./string\";\nimport { url } from \"./url\";\n\nexport {\n BaseValidator,\n type AnyValidator,\n type EnvSchema,\n type EnvValidationIssue,\n type InferEnv,\n type InferValidator\n} from \"./base-validator\";\n\nexport const validators = {\n array,\n boolean,\n email,\n enum: enumValue,\n integer,\n json,\n number,\n port,\n secret,\n string,\n url\n};\n"],
5
+ "mappings": "4ZAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,kDAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAsB,mBACtBC,EAAwB,qBACxBC,EAAsB,mBACtBC,EAA0B,kBAC1BC,EAAqB,kBACrBC,EAAgC,oBAChCC,EAAqB,kBACrBC,EAAuB,oBACvBC,EAAuB,oBACvBC,EAAoB,iBAEpBC,EAOO,4BAEA,MAAMZ,EAAa,CACxB,cACA,kBACA,cACA,KAAM,YACN,kBACA,YACA,gBACA,YACA,gBACA,gBACA,SACF",
6
+ "names": ["validators_exports", "__export", "validators", "__toCommonJS", "import_array", "import_boolean", "import_email", "import_enum", "import_json", "import_number", "import_port", "import_secret", "import_string", "import_url", "import_base_validator"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import { BaseValidator } from "./base-validator";
2
+ export declare const json: <TOutput = unknown>() => BaseValidator<TOutput>;
@@ -0,0 +1,2 @@
1
+ var a=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var O=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var s=(e,t)=>a(e,"name",{value:t,configurable:!0});var m=(e,t)=>{for(var r in t)a(e,r,{get:t[r],enumerable:!0})},c=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let u of O(t))!l.call(e,u)&&u!==r&&a(e,u,{get:()=>t[u],enumerable:!(o=p(t,u))||o.enumerable});return e};var i=e=>c(a({},"__esModule",{value:!0}),e);var T={};m(T,{json:()=>k});module.exports=i(T);var n=require("./base-validator");const k=s(()=>new n.BaseValidator("json",(e,t)=>{try{return{ok:!0,value:JSON.parse(e)}}catch{return{ok:!1,message:`${t} must be valid JSON`}}}),"json");0&&(module.exports={json});
2
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/validators/json.ts"],
4
+ "sourcesContent": ["import { BaseValidator } from \"./base-validator\";\n\nexport const json = <TOutput = unknown>() =>\n new BaseValidator<TOutput>(\"json\", (value, key) => {\n try {\n return { ok: true, value: JSON.parse(value) as TOutput };\n } catch {\n return {\n ok: false,\n message: `${key} must be valid JSON`\n };\n }\n });\n"],
5
+ "mappings": "+cAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,UAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAA8B,4BAEvB,MAAMC,EAAOC,EAAA,IAClB,IAAI,gBAAuB,OAAQ,CAACC,EAAOC,IAAQ,CACjD,GAAI,CACF,MAAO,CAAE,GAAI,GAAM,MAAO,KAAK,MAAMD,CAAK,CAAa,CACzD,MAAE,CACA,MAAO,CACL,GAAI,GACJ,QAAS,GAAGC,sBACd,CACF,CACF,CAAC,EAViB",
6
+ "names": ["json_exports", "__export", "json", "__toCommonJS", "import_base_validator", "json", "__name", "value", "key"]
7
+ }
@@ -0,0 +1,3 @@
1
+ import { BaseValidator } from "./base-validator";
2
+ export declare const number: () => BaseValidator<number>;
3
+ export declare const integer: () => BaseValidator<number>;
@@ -0,0 +1,2 @@
1
+ var u=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var o=Object.getOwnPropertyNames;var b=Object.prototype.hasOwnProperty;var s=(r,e)=>u(r,"name",{value:e,configurable:!0});var l=(r,e)=>{for(var t in e)u(r,t,{get:e[t],enumerable:!0})},g=(r,e,t,m)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of o(e))!b.call(r,n)&&n!==t&&u(r,n,{get:()=>e[n],enumerable:!(m=i(e,n))||m.enumerable});return r};var d=r=>g(u({},"__esModule",{value:!0}),r);var c={};l(c,{integer:()=>p,number:()=>f});module.exports=d(c);var a=require("./base-validator");const f=s(()=>new a.BaseValidator("number",(r,e)=>{const t=Number(r);return Number.isFinite(t)?{ok:!0,value:t}:{ok:!1,message:`${e} must be a valid number`}}),"number"),p=s(()=>new a.BaseValidator("integer",(r,e)=>{const t=Number(r);return Number.isInteger(t)?{ok:!0,value:t}:{ok:!1,message:`${e} must be a valid integer`}}),"integer");0&&(module.exports={integer,number});
2
+ //# sourceMappingURL=number.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/validators/number.ts"],
4
+ "sourcesContent": ["import { BaseValidator } from \"./base-validator\";\n\nexport const number = () =>\n new BaseValidator<number>(\"number\", (value, key) => {\n const parsed = Number(value);\n\n if (!Number.isFinite(parsed)) {\n return {\n ok: false,\n message: `${key} must be a valid number`\n };\n }\n\n return { ok: true, value: parsed };\n });\n\nexport const integer = () =>\n new BaseValidator<number>(\"integer\", (value, key) => {\n const parsed = Number(value);\n\n if (!Number.isInteger(parsed)) {\n return {\n ok: false,\n message: `${key} must be a valid integer`\n };\n }\n\n return { ok: true, value: parsed };\n });\n"],
5
+ "mappings": "+cAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,aAAAE,EAAA,WAAAC,IAAA,eAAAC,EAAAJ,GAAA,IAAAK,EAA8B,4BAEvB,MAAMC,EAASC,EAAA,IACpB,IAAI,gBAAsB,SAAU,CAACC,EAAOC,IAAQ,CAClD,MAAMC,EAAS,OAAOF,CAAK,EAE3B,OAAK,OAAO,SAASE,CAAM,EAOpB,CAAE,GAAI,GAAM,MAAOA,CAAO,EANxB,CACL,GAAI,GACJ,QAAS,GAAGD,0BACd,CAIJ,CAAC,EAZmB,UAcTE,EAAUJ,EAAA,IACrB,IAAI,gBAAsB,UAAW,CAACC,EAAOC,IAAQ,CACnD,MAAMC,EAAS,OAAOF,CAAK,EAE3B,OAAK,OAAO,UAAUE,CAAM,EAOrB,CAAE,GAAI,GAAM,MAAOA,CAAO,EANxB,CACL,GAAI,GACJ,QAAS,GAAGD,2BACd,CAIJ,CAAC,EAZoB",
6
+ "names": ["number_exports", "__export", "integer", "number", "__toCommonJS", "import_base_validator", "number", "__name", "value", "key", "parsed", "integer"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import { BaseValidator } from "./base-validator";
2
+ export declare const port: () => BaseValidator<number>;
@@ -0,0 +1,2 @@
1
+ var a=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var b=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var s=(r,e)=>a(r,"name",{value:e,configurable:!0});var i=(r,e)=>{for(var t in e)a(r,t,{get:e[t],enumerable:!0})},d=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of b(e))!p.call(r,o)&&o!==t&&a(r,o,{get:()=>e[o],enumerable:!(n=m(e,o))||n.enumerable});return r};var l=r=>d(a({},"__esModule",{value:!0}),r);var c={};i(c,{port:()=>f});module.exports=l(c);var u=require("./base-validator");const f=s(()=>new u.BaseValidator("port",(r,e)=>{const t=Number(r);return!Number.isInteger(t)||t<1||t>65535?{ok:!1,message:`${e} must be a valid port number between 1 and 65535`}:{ok:!0,value:t}}),"port");0&&(module.exports={port});
2
+ //# sourceMappingURL=port.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/validators/port.ts"],
4
+ "sourcesContent": ["import { BaseValidator } from \"./base-validator\";\n\nexport const port = () =>\n new BaseValidator<number>(\"port\", (value, key) => {\n const parsed = Number(value);\n\n if (!Number.isInteger(parsed) || parsed < 1 || parsed > 65535) {\n return {\n ok: false,\n message: `${key} must be a valid port number between 1 and 65535`\n };\n }\n\n return { ok: true, value: parsed };\n });\n"],
5
+ "mappings": "+cAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,UAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAA8B,4BAEvB,MAAMC,EAAOC,EAAA,IAClB,IAAI,gBAAsB,OAAQ,CAACC,EAAOC,IAAQ,CAChD,MAAMC,EAAS,OAAOF,CAAK,EAE3B,MAAI,CAAC,OAAO,UAAUE,CAAM,GAAKA,EAAS,GAAKA,EAAS,MAC/C,CACL,GAAI,GACJ,QAAS,GAAGD,mDACd,EAGK,CAAE,GAAI,GAAM,MAAOC,CAAO,CACnC,CAAC,EAZiB",
6
+ "names": ["port_exports", "__export", "port", "__toCommonJS", "import_base_validator", "port", "__name", "value", "key", "parsed"]
7
+ }
@@ -0,0 +1,7 @@
1
+ import { BaseValidator } from "./base-validator";
2
+ export type SecretValidatorOptions = {
3
+ minLength?: number;
4
+ requireNumber?: boolean;
5
+ requireSpecialCharacter?: boolean;
6
+ };
7
+ export declare const secret: ({ minLength }?: SecretValidatorOptions) => BaseValidator<string>;
@@ -0,0 +1,2 @@
1
+ var a=Object.defineProperty;var c=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var s=(e,r)=>a(e,"name",{value:r,configurable:!0});var u=(e,r)=>{for(var t in r)a(e,t,{get:r[t],enumerable:!0})},m=(e,r,t,i)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of l(r))!p.call(e,o)&&o!==t&&a(e,o,{get:()=>r[o],enumerable:!(i=c(r,o))||i.enumerable});return e};var b=e=>m(a({},"__esModule",{value:!0}),e);var f={};u(f,{secret:()=>d});module.exports=b(f);var n=require("./base-validator");const d=s(({minLength:e=1}={})=>new n.BaseValidator("secret",(r,t)=>r.length<e?{ok:!1,message:`${t} must be at least ${e} characters long`}:{ok:!0,value:r},{typeDescription:e>1?`Minimum length: ${e}`:void 0}).sensitive(),"secret");0&&(module.exports={secret});
2
+ //# sourceMappingURL=secret.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/validators/secret.ts"],
4
+ "sourcesContent": ["import { BaseValidator } from \"./base-validator\";\n\nexport type SecretValidatorOptions = {\n minLength?: number;\n requireNumber?: boolean;\n requireSpecialCharacter?: boolean;\n};\n\nexport const secret = ({ minLength = 1 }: SecretValidatorOptions = {}) =>\n new BaseValidator<string>(\n \"secret\",\n (value, key) => {\n if (value.length < minLength) {\n return {\n ok: false,\n message: `${key} must be at least ${minLength} characters long`\n };\n }\n\n return { ok: true, value };\n },\n {\n typeDescription: minLength > 1 ? `Minimum length: ${minLength}` : undefined\n }\n ).sensitive();\n"],
5
+ "mappings": "+cAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,YAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAA8B,4BAQvB,MAAMC,EAASC,EAAA,CAAC,CAAE,UAAAC,EAAY,CAAE,EAA4B,CAAC,IAClE,IAAI,gBACF,SACA,CAACC,EAAOC,IACFD,EAAM,OAASD,EACV,CACL,GAAI,GACJ,QAAS,GAAGE,sBAAwBF,mBACtC,EAGK,CAAE,GAAI,GAAM,MAAAC,CAAM,EAE3B,CACE,gBAAiBD,EAAY,EAAI,mBAAmBA,IAAc,MACpE,CACF,EAAE,UAAU,EAhBQ",
6
+ "names": ["secret_exports", "__export", "secret", "__toCommonJS", "import_base_validator", "secret", "__name", "minLength", "value", "key"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import { BaseValidator } from "./base-validator";
2
+ export declare const string: () => BaseValidator<string>;
@@ -0,0 +1,2 @@
1
+ var s=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var f=Object.prototype.hasOwnProperty;var i=(r,t)=>s(r,"name",{value:t,configurable:!0});var p=(r,t)=>{for(var n in t)s(r,n,{get:t[n],enumerable:!0})},u=(r,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of m(t))!f.call(r,e)&&e!==n&&s(r,e,{get:()=>t[e],enumerable:!(o=a(t,e))||o.enumerable});return r};var k=r=>u(s({},"__esModule",{value:!0}),r);var b={};p(b,{string:()=>l});module.exports=k(b);var g=require("./base-validator");const l=i(()=>new g.BaseValidator("string",(r,t)=>r.length===0?{ok:!1,message:`${t} must be a non-empty string`}:{ok:!0,value:r}),"string");0&&(module.exports={string});
2
+ //# sourceMappingURL=string.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/validators/string.ts"],
4
+ "sourcesContent": ["import { BaseValidator } from \"./base-validator\";\n\nexport const string = () =>\n new BaseValidator<string>(\"string\", (value, key) => {\n if (value.length === 0) {\n return {\n ok: false,\n message: `${key} must be a non-empty string`\n };\n }\n\n return { ok: true, value };\n });\n"],
5
+ "mappings": "+cAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,YAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAA8B,4BAEvB,MAAMC,EAASC,EAAA,IACpB,IAAI,gBAAsB,SAAU,CAACC,EAAOC,IACtCD,EAAM,SAAW,EACZ,CACL,GAAI,GACJ,QAAS,GAAGC,8BACd,EAGK,CAAE,GAAI,GAAM,MAAAD,CAAM,CAC1B,EAVmB",
6
+ "names": ["string_exports", "__export", "string", "__toCommonJS", "import_base_validator", "string", "__name", "value", "key"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import { BaseValidator } from "./base-validator";
2
+ export declare const url: () => BaseValidator<string>;
@@ -0,0 +1,2 @@
1
+ var o=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var m=Object.prototype.hasOwnProperty;var n=(t,r)=>o(t,"name",{value:r,configurable:!0});var c=(t,r)=>{for(var a in r)o(t,a,{get:r[a],enumerable:!0})},d=(t,r,a,s)=>{if(r&&typeof r=="object"||typeof r=="function")for(let e of l(r))!m.call(t,e)&&e!==a&&o(t,e,{get:()=>r[e],enumerable:!(s=i(r,e))||s.enumerable});return t};var f=t=>d(o({},"__esModule",{value:!0}),t);var k={};c(k,{url:()=>g});module.exports=f(k);var u=require("./base-validator");const g=n(()=>new u.BaseValidator("url",(t,r)=>{try{return new URL(t),{ok:!0,value:t}}catch{return{ok:!1,message:`${r} must be a valid URL`}}}),"url");0&&(module.exports={url});
2
+ //# sourceMappingURL=url.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/validators/url.ts"],
4
+ "sourcesContent": ["import { BaseValidator } from \"./base-validator\";\n\nexport const url = () =>\n new BaseValidator<string>(\"url\", (value, key) => {\n try {\n new URL(value);\n return { ok: true, value };\n } catch {\n return {\n ok: false,\n message: `${key} must be a valid URL`\n };\n }\n });\n"],
5
+ "mappings": "+cAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,SAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAA8B,4BAEvB,MAAMC,EAAMC,EAAA,IACjB,IAAI,gBAAsB,MAAO,CAACC,EAAOC,IAAQ,CAC/C,GAAI,CACF,WAAI,IAAID,CAAK,EACN,CAAE,GAAI,GAAM,MAAAA,CAAM,CAC3B,MAAE,CACA,MAAO,CACL,GAAI,GACJ,QAAS,GAAGC,uBACd,CACF,CACF,CAAC,EAXgB",
6
+ "names": ["url_exports", "__export", "url", "__toCommonJS", "import_base_validator", "url", "__name", "value", "key"]
7
+ }
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "@sliit-foss/env-guard",
3
+ "version": "1.1.0",
4
+ "description": "Type-safe environment variable validation and configuration guard for Node.js applications.",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "bin": {
8
+ "env-guard": "dist/cli.js"
9
+ },
10
+ "dependencies": {
11
+ "commander": "11.1.0",
12
+ "dotenv": "16.5.0"
13
+ },
14
+ "author": "SLIIT FOSS",
15
+ "license": "MIT",
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "git+https://github.com/sliit-foss/npm-catalogue.git"
19
+ },
20
+ "homepage": "https://github.com/sliit-foss/npm-catalogue/blob/main/packages/env-guard/readme.md",
21
+ "keywords": [
22
+ "env",
23
+ "environment",
24
+ "config",
25
+ "dotenv",
26
+ "validation",
27
+ "typescript",
28
+ "nodejs"
29
+ ],
30
+ "bugs": {
31
+ "url": "https://github.com/sliit-foss/npm-catalogue/issues"
32
+ },
33
+ "scripts": {
34
+ "build": "node ../../scripts/esbuild.config.js && bash ../../scripts/build-types.sh",
35
+ "build:watch": "bash ../../scripts/esbuild.watch.sh",
36
+ "bump-version": "bash ../../scripts/bump-version.sh --name=@sliit-foss/env-guard",
37
+ "lint": "bash ../../scripts/lint.sh",
38
+ "release": "bash ../../scripts/release.sh",
39
+ "test": "bash ../../scripts/test/test.sh"
40
+ }
41
+ }
package/readme.md ADDED
@@ -0,0 +1,179 @@
1
+ # @sliit-foss/env-guard
2
+
3
+ Type-safe environment variable validation and configuration guard for Node.js applications.
4
+
5
+ ## Why?
6
+
7
+ Environment variables are usually read as raw strings from `process.env`. This can cause runtime failures when required values are missing, mistyped, or too weak for production. `env-guard` validates your environment configuration at startup and returns a typed config object.
8
+
9
+ ## Installation
10
+
11
+ ```bash
12
+ pnpm add @sliit-foss/env-guard
13
+ ```
14
+
15
+ ## Basic Usage
16
+
17
+ ```ts
18
+ import { createEnv, validators } from "@sliit-foss/env-guard";
19
+
20
+ export const env = createEnv({
21
+ NODE_ENV: validators.enum(["development", "test", "production"]).default("development"),
22
+ PORT: validators.port().default(3000),
23
+ DATABASE_URL: validators.url(),
24
+ JWT_SECRET: validators.secret({ minLength: 32 }),
25
+ ENABLE_EMAILS: validators.boolean().default(false),
26
+ ALLOWED_ORIGINS: validators.array(",").default([])
27
+ });
28
+ ```
29
+
30
+ `env.PORT` is typed as `number`, `env.ENABLE_EMAILS` is typed as `boolean`, and `env.DATABASE_URL` is typed as `string`.
31
+
32
+ ## Advanced Usage
33
+
34
+ ```ts
35
+ const env = createEnv(
36
+ {
37
+ PORT: validators.port().default(3000),
38
+ DATABASE_URL: validators.url()
39
+ },
40
+ {
41
+ source: process.env,
42
+ throwOnError: true,
43
+ redactSecrets: true,
44
+ allowUnknown: true
45
+ }
46
+ );
47
+ ```
48
+
49
+ ## Validators
50
+
51
+ ```ts
52
+ validators.string();
53
+ validators.number();
54
+ validators.integer();
55
+ validators.boolean();
56
+ validators.array(",");
57
+ validators.json();
58
+ validators.url();
59
+ validators.email();
60
+ validators.enum(["development", "production"]);
61
+ validators.port();
62
+ validators.secret({ minLength: 32 });
63
+ ```
64
+
65
+ Each validator is required by default and supports:
66
+
67
+ ```ts
68
+ validators.string().required();
69
+ validators.string().optional();
70
+ validators.string().default("hello");
71
+ validators.string().description("Application name");
72
+ validators.string().example("Student API");
73
+ validators.string().sensitive();
74
+ ```
75
+
76
+ ## Default And Optional Values
77
+
78
+ ```ts
79
+ const env = createEnv({
80
+ PORT: validators.port().default(3000),
81
+ SENTRY_DSN: validators.url().optional()
82
+ });
83
+ ```
84
+
85
+ Missing variables with defaults use the default value. Missing optional variables return `undefined`.
86
+
87
+ ## Secret Redaction
88
+
89
+ Sensitive validators and secret-like keys are redacted in error messages. Keys containing `SECRET`, `TOKEN`, `PASSWORD`, `PRIVATE_KEY`, `API_KEY`, `AUTH`, or `CREDENTIAL` are treated as sensitive.
90
+
91
+ ```txt
92
+ JWT_SECRET must be at least 32 characters long. Received: "[REDACTED]"
93
+ ```
94
+
95
+ ## Generate .env.example
96
+
97
+ ```ts
98
+ import { generateEnvExample, validators } from "@sliit-foss/env-guard";
99
+
100
+ const schema = {
101
+ DATABASE_URL: validators.url().description("Database connection string"),
102
+ PORT: validators.port().default(3000),
103
+ JWT_SECRET: validators.secret({ minLength: 32 })
104
+ };
105
+
106
+ console.log(generateEnvExample(schema));
107
+ ```
108
+
109
+ Output:
110
+
111
+ ```env
112
+ # Database connection string
113
+ DATABASE_URL=
114
+
115
+ # Default: 3000
116
+ PORT=3000
117
+
118
+ # Secret value. Minimum length: 32
119
+ JWT_SECRET=
120
+ ```
121
+
122
+ ## CLI Usage
123
+
124
+ Create a schema file:
125
+
126
+ ```js
127
+ const { validators } = require("@sliit-foss/env-guard");
128
+
129
+ module.exports = {
130
+ PORT: validators.port().default(3000),
131
+ DATABASE_URL: validators.url(),
132
+ JWT_SECRET: validators.secret({ minLength: 32 })
133
+ };
134
+ ```
135
+
136
+ Validate an env file:
137
+
138
+ ```bash
139
+ env-guard validate --schema ./env.schema.js --file .env
140
+ ```
141
+
142
+ Generate example content:
143
+
144
+ ```bash
145
+ env-guard example --schema ./env.schema.js --output .env.example
146
+ ```
147
+
148
+ ## Error Output
149
+
150
+ ```txt
151
+ Environment validation failed
152
+
153
+ Missing variables:
154
+ - DATABASE_URL is required
155
+ - JWT_SECRET is required
156
+
157
+ Invalid variables:
158
+ - PORT must be a valid port number between 1 and 65535. Received: "abc"
159
+ - NODE_ENV must be one of: development, test, production. Received: "prod"
160
+
161
+ Security warnings:
162
+ - None
163
+ ```
164
+
165
+ ## TypeScript Support
166
+
167
+ `createEnv` infers types from the schema:
168
+
169
+ ```ts
170
+ const env = createEnv({
171
+ PORT: validators.port().default(3000),
172
+ ENABLE_EMAILS: validators.boolean().default(false),
173
+ DATABASE_URL: validators.url()
174
+ });
175
+
176
+ env.PORT; // number
177
+ env.ENABLE_EMAILS; // boolean
178
+ env.DATABASE_URL; // string
179
+ ```
package/tsconfig.json ADDED
@@ -0,0 +1,8 @@
1
+ {
2
+ "extends": "../../tsconfig.json",
3
+ "compilerOptions": {
4
+ "rootDir": "src",
5
+ "outDir": "dist"
6
+ },
7
+ "include": ["src/**/*.ts", "test/**/*.ts"]
8
+ }