UNPKG

typenvx

Version:

Typenv is a modern, type-safe alternative to .env files, providing advanced validation, intelligent interpolation, and conditional logic for better environment management.

26 lines 23.2 kB
#!/usr/bin/env node import {Command}from'commander';import _ from'path';import Ie,{existsSync,readFileSync}from'fs';import $e from'fs/promises';import at from'readline';import {whiteBright,bold,yellow,red,green,blue,gray,cyan,white,bgMagenta,magenta}from'colorette';import yt from'chokidar';import wt from'lodash.debounce';var Ce=Object.defineProperty;var Ue=(e,t,n)=>t in e?Ce(e,t,{enumerable:true,configurable:true,writable:true,value:n}):e[t]=n;var M=(e,t,n)=>Ue(e,typeof t!="symbol"?t+"":t,n);var te={version:"0.1.12"};var b="envx.meta.json",C="envx.config.json",U=".env",B=".envx";var $={input:"./.envx",outputs:{env:"./.env",types:"./types/envx.ts",metaFilePath:"."},overwrite:false};function qe(e){return e&&typeof e=="object"&&typeof e.input=="string"&&(e.outputs===void 0||typeof e.outputs=="object"&&(e.outputs.env===void 0||typeof e.outputs.env=="string")&&(e.outputs.types===void 0||typeof e.outputs.types=="string")&&(e.outputs.metaFilePath===void 0||typeof e.outputs.metaFilePath=="string"))&&(typeof e.overwrite=="boolean"||e.overwrite===void 0)}function V(){let e=_.resolve(C);if(existsSync(e)){let t=readFileSync(e,"utf-8");try{let n=JSON.parse(t);return qe(n)?{...$,...n,outputs:{...$.outputs,...n.outputs}}:(console.warn("[envx:info:config] Invalid config structure, falling back to default."),$)}catch(n){let r=n instanceof Error?n.message:String(n);return console.warn(`[envx:warn:config] Could not parse ${C}: ${r}`),$}}return $}var l=class extends Error{constructor(t){super(t),this.name="EnvxError";}};var ne={fileDoesNotExist:e=>`The specified file does not exist: ${e}`,unsupportedType:(e,t)=>`Line ${e+1}: Unsupported type "${t}".`,validator:{invalidNumber:(e,t)=>`Invalid value for "${e}": expected a number but received "${t}".`,invalidBoolean:(e,t)=>`Invalid boolean for "${e}": expected "true" or "false" but received "${t}".`,missingEnumValues:e=>`Enum values are not defined for "${e}". Please specify allowed values.`,invalidEnum:(e,t,n)=>`Invalid enum value for "${e}": expected one of [${n.join(", ")}] but received "${t}".`,invalidEmail:(e,t)=>`Invalid email format for "${e}": received "${t}". Please provide a valid email address.`,invalidUrl:(e,t)=>`Invalid URL format for "${e}": received "${t}". Please provide a valid URL.`,unsupportedType:(e,t)=>`Unsupported type "${t}" specified for "${e}".`,requiredMissing:e=>`Required environment variable "${e}" is missing and has no default value.`},resolver:{circularDependency:e=>`Circular dependency detected while resolving "${e}". \u2192 Check for variables referencing each other in a loop.`,interpolationFailed:(e,t="interpolation")=>`Failed to resolve variable "${e}". No value found for ${t}.`,requiredMissingInResolve:e=>`Environment variable "${e}" is not set and no default is defined. \u2192 Define "${e}" in your .envx file or provide a default value in the schema.`},parser:{schemaBlockEmpty:e=>`Line ${e+1}: Schema block name cannot be empty.`,schemaKeyDuplicate:(e,t)=>`Line ${e+1}: Schema key "${t}" is already defined. Duplicate schema definitions are not allowed.`,typeAlreadyDefined:e=>`Line ${e+1}: "type" is already defined for this variable. You cannot redefine it.`,unknownSchemaProperty:(e,t)=>`Line ${e+1}: Unknown schema property "${t}".`,missingDelimiter:e=>`Line ${e+1}: Missing "=" delimiter in assignment.`,variableNameEmpty:e=>`Line ${e+1}: Variable name cannot be empty.`,typeRequiredBeforeDefault:e=>`Line ${e+1}: "type" must be defined before "default".`,defaultMustBeNumber:e=>`Line ${e+1}: Default value must be a valid number.`,defaultMustBeBoolean:e=>`Line ${e+1}: Default value must be "true" or "false".`,defaultNotInEnum:(e,t)=>`Line ${e+1}: Default "${t}" is not in enum values.`,invalidValuesJson:e=>`Line ${e+1}: "values" must be a valid JSON string array.`}};var f={lib:ne,cli:{}};var I=/^\s*\$\{([^}]+)\}(?:\s*(==|!=)\s*(["'])?([^"']+)\3)?\s*\?\s*(["'])?([^"']+?)\5?\s*:\s*(["'])?([^"']+?)\7?\s*$/,re=/^[a-zA-Z0-9_\-\.]+$/,ie=/^\[.*\]$/,oe=/^[a-zA-Z0-9_\-\.]+$/;function se(e){return re.test(e)}function ae(e){return ie.test(e)}var ce=(e,t)=>{let n=[",",";",":",".","-","?","!","|","\\","/","(",")","{","<",">","`","~","="],r=e.trimEnd().slice(-1);if(n.includes(r))throw new l(`[envx:error] Line ${t+1}: Value ends with a suspicious character (${r}). Please remove unnecessary character at the end.`)};function G(e,t,n){let{type:r,values:i}=n;if(!r)throw new l(f.lib.parser.typeRequiredBeforeDefault(t));switch(r){case "number":let o=Number(e);if(isNaN(o))throw new l(f.lib.parser.defaultMustBeNumber(t));n.default=o;break;case "boolean":if(e!=="true"&&e!=="false")throw new l(f.lib.parser.defaultMustBeBoolean(t));n.default=e==="true";break;case "enum":if(!i||!i.includes(e))throw new l(f.lib.parser.defaultNotInEnum(t,e));n.default=e;break;default:n.default=e;}}function j(e,t){let n=e.indexOf("=");if(n===-1)throw new l(f.lib.parser.missingDelimiter(t));return [e.slice(0,n),e.slice(n+1)]}function J(e){let t=e[0],n=e[e.length-1];return t==='"'&&n==='"'||t==="'"&&n==="'"?e.slice(1,-1):e}function le(e){let t=false,n=false;for(let r=0;r<e.length;r++){let i=e[r];if(i==='"'&&!t)n=!n;else if(i==="'"&&!n)t=!t;else if(i==="#"&&!t&&!n)return r}return -1}function ue(e,t,n,r){let i=e.trim();if(i.includes('"""')){let o=i.indexOf('"""'),a=i.slice(0,o);return n.push(a.trimEnd()),r.push({key:t,value:n.join(` `)}),{multilineKey:null,multilineBuffer:[]}}else return n.push(e),{multilineKey:t,multilineBuffer:n}}var pe=["string","number","boolean","enum","email","url"],A={};function fe(e,t,n,r){let[i,o]=j(e,t),a=i.trim(),s=J(o.trim());if(a==="description"&&o.trim().startsWith('"""')){let c=[],m=o.trim().slice(3);if(m.endsWith('"""')){n.description=m.slice(0,-3);return}for(c.push(m);r;){let g=r();if(g===null)throw new l(`Line ${t+1}: Unterminated multiline description.`);if(g.endsWith('"""')){c.push(g.slice(0,-3));break}else c.push(g);}n.description=c.join(` `);return}switch(a){case "required":n.required=s==="true";break;case "type":if(n.type!==void 0)throw new l(f.lib.parser.typeAlreadyDefined(t));if(!pe.includes(s))throw new l(f.lib.unsupportedType(t,s));n.type=s;break;case "default":n.type=="enum"&&!n.values?n.__pendingDefault=s:G(s,t,n);break;case "values":try{let c=JSON.parse(s);if(!(Array.isArray(c)&&c.length<=25&&c.every(g=>typeof g=="string"&&se(g))))throw new l(`[envx:error] Line ${t+1}: "values" must be a JSON array (max 25) of safe strings. Allowed characters: a-z, A-Z, 0-9, _, -, .`);n.values=c,n.__pendingDefault&&G(n.__pendingDefault,t,n);}catch{throw new l(f.lib.parser.invalidValuesJson(t))}break;case "deprecated":n.deprecated=s;break;case "description":n.description=s;break;default:throw new l(f.lib.parser.unknownSchemaProperty(t,a))}}function me(e,t,n){let r=e.slice(1,-1).trim();if(!r)throw new l(f.lib.parser.schemaBlockEmpty(t));if(!oe.test(r))throw new l(`[envx:error] Line ${t+1}: Schema block name "${r}" contains invalid characters. Only letters, numbers, underscore (_), hyphen (-), and dot (.) are allowed.`);if(n[r])throw new l(f.lib.parser.schemaKeyDuplicate(t,r));return n[r]=n[r]??{},r}function de(e,t){let[n,r]=j(e,t),i=n.trim();if(!i)throw new l(f.lib.parser.variableNameEmpty(t));let o=r.trim();return o.startsWith('"""')?o.endsWith('"""')&&o.length>6?{key:i,value:o.slice(3,-3),isMultilineStart:false}:{key:i,value:o.slice(3),isMultilineStart:true}:(ce(o,t),{key:i,value:J(o),isMultilineStart:false})}function P(e){let t=e.split(/\r?\n/),n=[],r={},i=null,o=null,a=[];for(let s=0;s<t.length;s++){let c=t[s],m=c.trim();if(!m||m.startsWith("#"))continue;if(o){let h=ue(c,o,a,n);a=h.multilineBuffer,o=h.multilineKey;continue}let g=le(c);if(g!==-1&&(c=c.slice(0,g)),m=c.trim(),ae(m)){if(g>-1&&g>c.indexOf("]"))throw new l(`[envx:error] Line ${s+1}: Schema header line cannot contain inline comments.`);i=me(m,s,r);continue}if(i){fe(m,s,r[i],()=>(s++,s>=t.length?null:t[s].trim()));continue}let{key:v,value:R,isMultilineStart:O}=de(m,s);O?(o=v,a.push(R)):n.push({key:v,value:R});}if(o)throw new l(`[envx:error] End of file reached but multiline value for key "${o}" was not closed with triple quotes (""").`);return {env:n,schema:r}}function L(e,t,n=false,r=false){let i=typeof e=="string"?e.toLowerCase():e,o=i===true||i===false||i==="true"||i==="false"||i===1||i===0;if(r)return o;if(!o){if(n)throw new l(f.lib.validator.invalidBoolean(t||"",e));return false}return i===true||i==="true"||i===1}var ge=e=>/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e);function We(e){return L(e,"",false,true)?"boolean":!isNaN(Number(e))&&e!==""&&e!==null?"number":"string"}function N(e,t){let n={...A,...t};return e.forEach(({key:r,value:i})=>{n[r]||(n[r]={type:We(i),required:false});}),n}function he(e,t,n,r){switch(n){case "string":return t;case "number":{let i=Number(t);if(isNaN(i))throw new l(f.lib.validator.invalidNumber(e,t));return i}case "boolean":return L(t,e,true);case "enum":{if(!r?.length)throw new l(f.lib.validator.missingEnumValues(e));if(!r.includes(t))throw new l(f.lib.validator.invalidEnum(e,t,r));return t}case "email":{if(!ge(t))throw new l(f.lib.validator.invalidEmail(e,t));return t}case "url":try{return new URL(t),t}catch{throw new l(f.lib.validator.invalidUrl(e,t))}default:throw new l(f.lib.validator.unsupportedType(e,n))}}function q(e,t){let n={},r=new Map(e.map(({key:i,value:o})=>[i,o]));for(let i in t){let{type:o,required:a,default:s,values:c}=t[i],m=r.get(i);if(m!==void 0){n[i]=he(i,m,o,o==="enum"?c:void 0);continue}if(s!==void 0){n[i]=he(i,String(s),o,o==="enum"?c:void 0);continue}if(a)throw new l(f.lib.validator.requiredMissing(i))}for(let[i,o]of r.entries())i in n||(n[i]=o);return n}var He=new Set(["NODE_ENV","CI","VERCEL_ENV"]);function ve(e){if(He.has(e)&&typeof process<"u"&&process.env)return process.env[e]}function E(e,t,n){let{env:r,schema:i}=P(e),o=N(r,i),a=t?{...o,...t}:Object.keys(o).length>0?o:void 0,s=W(r,a),c=Object.fromEntries(Object.entries(s).filter(([m])=>a?.[m]!==void 0));return a&&!n?{result:q(Object.entries(c).map(([g,v])=>({key:g,value:v})),a),schema:a,rawEnv:[]}:{result:c,schema:a,rawEnv:r}}function Ee(e){let t=e.trim();return I.test(t)}function xe(e){return typeof e=="string"&&e.includes("${")}function we(e,t,n,r,i,o="interpolation"){if(n[e]!==void 0)return n[e];if(t[e]!==void 0)return Se(t[e],t,n,r,e,i+1);{let a=ve(e);if(a!==void 0)return n[e]=a,a;throw new l(f.lib.resolver.interpolationFailed(e,o))}}function W(e,t){let n={},r={};for(let o of e)n[o.key]=o.value;if(t)for(let o in t)n[o]===void 0&&t[o].default!==void 0&&(n[o]=t[o].default);let i=new Set;for(let o of Object.keys(n))r[o]=Se(n[o],n,r,i,o,0);if(t){for(let o in t)if(t[o].required&&n[o]===void 0)throw new l(f.lib.resolver.requiredMissingInResolve(o))}return r}function Se(e,t,n,r,i,o=0){if(typeof e!="string")return e;if(r.has(i))throw new l(f.lib.resolver.circularDependency(i));if(o>10)throw new l(`[envx:error] Max resolution depth exceeded while resolving "${i}".`);r.add(i);let s=e,c;for(;typeof s=="string";){if(c=s,Ee(s)){s=Xe(s,t,n,r,o+1);continue}if(xe(s)){s=Ke(s,t,n,r,o+1);continue}if(s===c)break}return r.delete(i),s}function Ke(e,t,n,r,i){return e.replace(/\${([^}]+)}/g,(o,a)=>{let s=a.trim();return String(we(s,t,n,r,i))})}function Xe(e,t,n,r,i){let a=(e?.trim()).match(I);if(!a)return e;let[,s,c,,m,,g,,v]=a,R=s?.trim(),O=we(R,t,n,r,i,"ternary"),h=m?.trim();(h?.startsWith('"')&&h?.endsWith('"')||h?.startsWith("'")&&h?.endsWith("'"))&&(h=h.slice(1,-1));let Ne=String(O),D;if(c==="=="||c==="!="){let ee=Ne===h;D=c==="=="?ee:!ee;}else D=L(O);let ke=g.trim(),De=v.trim();return ye(D?ke:De)}function ye(e){return e==="true"?true:e==="false"?false:isNaN(Number(e))?e:Number(e)}function Ye(e,t){return t?null:{key:e,message:`Missing required environment variable "${e}".`,severity:"error"}}function ze(e,t,n){return t.deprecated&&n?{key:e,message:`Environment variable "${e}" is deprecated. ${t.deprecated}`,severity:"warning"}:null}function Qe(e,t,n){if(t==null)return null;switch(n.type){case "number":if(typeof t=="string"&&isNaN(Number(t)))return {key:e,message:`Environment variable "${e}" should be a number.`,severity:"error"};break;case "boolean":if(t!==true&&t!==false&&t!=="true"&&t!=="false")return {key:e,message:`Environment variable "${e}" should be a boolean ("true" or "false").`,severity:"error"};break;case "enum":if(n.values&&!n.values.includes(String(t)))return {key:e,message:`Environment variable "${e}" has invalid value "${t}". Expected one of: ${n.values.join(", ")}.`,severity:"error"};break;}return null}function H(e,t){let n=[];if(!t)return {valid:true,errors:[]};let r=new Map(Object.entries(e));for(let[i,o]of Object.entries(t)){let a=r.has(i),s=r.get(i);[Ye(i,a),ze(i,o,a),Qe(i,s,o)].forEach(m=>{m&&n.push(m);});}for(let i of Object.keys(e))t[i]||n.push({key:i,message:`Environment variable "${i}" is not defined in the schema.`,severity:"warning"});return {valid:n.length===0,errors:n}}function be(e){let t={};for(let n in e){t[n]={type:e[n].type||"string",required:e[n].required||false,description:e[n].description||void 0,values:e[n].values||void 0};for(let r in t[n])t[n][r]===void 0&&delete t[n][r];}return JSON.stringify(t,null,2)}var k=async(e,t)=>{let n=be(e);await F(t,n);};function Pe(e){let t=e.replace(/\r?\n/g,"\\n");return t.includes('"')&&!t.includes("'")?`'${t}'`:'"'+t.replace(/\\/g,"\\\\").replace(/"/g,'\\"')+'"'}async function F(e,t){let n=_.dirname(e);try{await $e.mkdir(n,{recursive:!0});}catch(r){throw new Error(`Failed to create directory "${n}" for file "${e}": ${r instanceof Error?r.message:String(r)}`)}try{await $e.writeFile(e,t);}catch(r){throw new Error(`Failed to write file "${e}": ${r instanceof Error?r.message:String(r)}`)}}var K=class{constructor(t){M(this,"silent");M(this,"showPrefix");M(this,"showPrefixIcon");this.silent=t?.silent??false,this.showPrefix=t?.showPrefix??true,this.showPrefixIcon=t?.showPrefixIcon??true;}prefix(t,n=true,r=true){let i=n?`[envx:${t}]`:"",a=r?{info:"[INFO]",success:"[OK]",error:"[ERR]",warn:"[WARN]",debug:"[DBG]"}[t]:"",s=`${i} ${a} `.trim();switch(t){case "info":case "debug":return blue(bold(s));case "success":return green(bold(s));case "error":return red(bold(s));case "warn":return yellow(bold(s));default:return whiteBright(bold(i))}}log(t,n){if(this.silent)return;let{showPrefix:r=false,addSpace:i=""}=n||{},o=r?whiteBright(bold("[envx]")):"";console.log(`${i}${o} ${t}`.trim());}info(t,n){if(this.silent)return;let{showPrefix:r=this.showPrefix,showPrefixIcon:i=this.showPrefixIcon,addSpace:o=""}=n||{};console.log(`${o}${this.prefix("info",r,i)} ${t}`);}success(t,n){if(this.silent)return;let{showPrefix:r=this.showPrefix,showPrefixIcon:i=this.showPrefixIcon,addSpace:o=""}=n||{};console.log(`${o}${this.prefix("success",r,i)} ${t}`);}error(t,n){if(this.silent)return;let{showPrefix:r=this.showPrefix,showPrefixIcon:i=this.showPrefixIcon,addSpace:o=""}=n||{},a=typeof t=="string"?t:t.message;console.error(`${o}${this.prefix("error",r,i)} ${a}`);}warn(t,n){if(this.silent)return;let{showPrefix:r=this.showPrefix,showPrefixIcon:i=this.showPrefixIcon,addSpace:o=""}=n||{};console.warn(`${o}${this.prefix("warn",r,i)} ${t}`);}debug(t,n){if(this.silent)return;let{showPrefix:r=this.showPrefix,showPrefixIcon:i=this.showPrefixIcon,addSpace:o=""}=n||{};console.debug(`${o}${this.prefix("debug",r,i)} ${t}`);}block(t,n="[envx]",r){if(this.silent)return;let{showPrefix:i=this.showPrefix,addSpace:o=""}=r||{},a=i?gray(bold(n)):"";console.log(` ${o}${a} ${bold(t)}`.trim());}},d=new K({silent:false});async function ct(e){return new Promise(t=>{let n=at.createInterface({input:process.stdin,output:process.stdout,terminal:true});n.question(`\u26A0\uFE0F "${e}" exists. Overwrite? (y/N): `,r=>{n.close(),t(r.trim().toLowerCase()==="y");});})}async function y(e,t){let n=_.resolve(process.cwd(),e.input),r=_.resolve(process.cwd(),e.output),i=_.relative(process.cwd(),r),o=e.overwrite,a=e?.noTypes??false;!o&&existsSync(r)&&(await ct(i)||(d.info("\u2716 Operation cancelled."),process.exit(0)));let s=await $e.readFile(n,"utf-8"),c=E(s),m=Object.entries(c.result).map(([g,v])=>`${g}=${Pe(String(v))}`).join(` `);if(await F(r,m),d.success("Env file created \u2192 "+green(i),t),!a){let g=_.join(e.metaFilePath||".",b);await k(c.schema||A,g),d.success(`Meta JSON schema generated \u2192 ${green(_.relative(process.cwd(),g))}`,t);}}async function X(e){try{let t=_.resolve(process.cwd(),e.input),n=await $e.readFile(t,"utf-8"),r=E(n);console.log(vt(r.result));}catch(t){d.error(`Error reading .envx file: ${t.message||t}`),process.exit(1);}}function ht(e){return e===null?magenta("null"):typeof e=="string"?green(`"${e}"`):typeof e=="number"?yellow(e.toString()):typeof e=="boolean"?magenta(e.toString()):white(String(e))}function vt(e,t=2){let n=" ".repeat(t);function r(i,o){if(Array.isArray(i))return i.length===0?"[]":`[ ${i.map(s=>n.repeat(o+1)+r(s,o+1)).join(`, `)} ${n.repeat(o)}]`;if(i&&typeof i=="object"){let a=Object.keys(i);return a.length===0?"{}":`{ ${a.map(c=>`${n.repeat(o+1)}${bold(cyan(`"${c}"`))}: ${r(i[c],o+1)}`).join(`, `)} ${n.repeat(o)}}`}else return ht(i)}return r(e,0)}function Et(e,t){switch(e){case "string":case "email":case "url":return "string";case "number":return "number";case "boolean":return "boolean";case "enum":return t.values&&t.values.length>1?t.values.map(n=>`"${n}"`).join(" | "):"string";default:return "any"}}function Te(e){let t=[];t.push("// AUTO GENERATED FILE - DO NOT EDIT"),t.push("//"),t.push("// This file is auto-generated from your environment schema (.envx)."),t.push("// It defines the TypeScript interface for your environment variables,"),t.push("// allowing you to use it with getEnvx or similar functions to get"),t.push("// fully typed and validated environment configs."),t.push("//"),t.push("// Usage example:"),t.push("//"),t.push('// import { getEnv } from "typenvx";'),t.push('// import type { EnvVars } from "./envx.ts";'),t.push("//"),t.push("// const env = getEnv<EnvVars>();"),t.push("// console.log(env.API_URL); // typed as string"),t.push("//"),t.push("// NOTE:"),t.push("// - Optional variables are marked with '?'."),t.push("// - Enum variables are typed as string literals."),t.push("//"),t.push("// Keep this file updated by regenerating after schema changes."),t.push(` export interface EnvVars {`);for(let n in e){let{type:r="string",required:i}=e[n],o=Et(r,e[n]),a=i?"":"?";t.push(` ${n}${a}: ${o};`);}return t.push(`} `),t.join(` `)}async function w(e,t){try{let n=_.resolve(process.cwd(),e.input),r=_.resolve(process.cwd(),e.typesOutput),i=_.relative(process.cwd(),r),o=await $e.readFile(n,"utf-8"),{env:a,schema:s}=P(o),c=N(a,s),m=Te(c);await F(r,m);let g=_.join(e.metaFilePath||".",b);await k(c,g),d.success(`TypeScript types created \u2192 ${green(i)}`,t),d.success(`Meta JSON schema generated \u2192 ${green(_.relative(process.cwd(),g))}`,t);}catch(n){d.error(`Error generating types: ${n.message||n}`),process.exit(1);}}async function Y(e){try{d.block("\u2699\uFE0F Building environment..."),await y(e,{showPrefix:!1,addSpace:" "}),console.log(),d.block("\u2699\uFE0F Generating types..."),await w({...e,typesOutput:e.typesOutput},{showPrefix:!1,addSpace:" "}),console.log(),d.success(`\u2705 Generation completed successfully. `,{showPrefixIcon:!1});}catch(t){d.error(`Error during generation: ${t.message||t}`);}}var Lt=750,Ve=" ";async function Q(e){let t=e.input||B,n=e.metaFilePath||".",r=e.output||U,i=e.typesOutput||"envx.ts";e.silent||d.block(`${bold(cyan("\u{1F331} Starting watcher"))} ${gray(`Watching for changes on ${white(bgMagenta(t))} `)}`);async function o(){e.noBuild||(e.silent||d.log(bold(cyan("[Build]"))),await y({input:t,output:r,metaFilePath:n,overwrite:true},{showPrefix:false,addSpace:Ve})),e.noTypes||(e.silent||d.log(bold(cyan("[Types]"))),await w({input:t,typesOutput:i,metaFilePath:n},{showPrefix:false,addSpace:Ve}));}try{await o();}catch(s){d.error(`${red("\u2716")} Initial generation failed: ${bold(s instanceof Error?s.message:String(s))}`);}let a=wt(async()=>{e.silent||(d.log(gray(` \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 `)),d.log(bold(yellow(`\u26A1 Change detected! Regenerating... `))));try{await o(),e.silent||d.log(bold(whiteBright(` \u2705 Regeneration completed successfully! `)));}catch(s){d.error(`${red("\u2716")} Error during regeneration: ${bold(s instanceof Error?s.message:String(s))}`);}},Lt);yt.watch(t,{ignoreInitial:true}).on("change",a);}V();function Ae(e){try{if(!Ie.existsSync(e))throw new l(f.lib.fileDoesNotExist(e));return Ie.readFileSync(e,"utf-8")}catch(t){let n=t instanceof Error?t.message:String(t);throw new l(`Failed to read file at ${e}: ${n}`)}}async function Z(e){let t=_.resolve(process.cwd(),e.input);try{let n=await Ae(t),{result:r,schema:i}=E(n,{},!0),{valid:o,errors:a}=H(r,i);o?d.success("\u2705 No validation errors found in .envx file."):(console.log(a),process.exit(1));}catch(n){d.error(`\u274C Failed to validate .envx file: ${n.message||n}`),process.exit(1);}}async function Tt(){let e=new Command,t=V(),n=te.version,r=s=>["-i, --input <file>","Input .envx file",s],i=s=>["-o, --output <file>","Output .env file",s],o=s=>["-m, --metaFilePath <file>","Output metaJsonFile Folder Path (envx.meta.json)",s],a=s=>["-t, --typesOutput <file>","Output .ts file",s];e.name("typenv").description("Enhanced CLI for .envx - Manage .envx files effortlessly").version(n),e.command("build").description("Create a standard .env file by compiling your .envx configuration").option(...r(t.input||".envx")).option(...i(t.outputs?.env||".env")).option(...o(t.outputs?.metaFilePath||".")).option("--overwrite","Overwrite output files if they exist",t.overwrite||false).action(y),e.command("generate").alias("gen").description("Generate TypeScript types and build .env file from .envx").option(...r(t.input||".envx")).option(...i(t.outputs?.env||".env")).option(...a(t.outputs?.types||"types/envx.ts")).option(...o(t.outputs?.metaFilePath||".")).option("--overwrite","Overwrite output files if they exist",t.overwrite||false).action(async s=>{let c={...s,noTypes:true};return await Y(c)}),e.command("watch").description("Watch .envx file and automatically regenerate .env and types on changes").option(...r(t.input||".envx")).option(...i(t.outputs?.env||".env")).option(...a(t.outputs?.types||"types/envx.ts")).option(...o(t.outputs?.metaFilePath||".")).option("--no-types","Skip generating TypeScript types during watch").option("--no-build","Skip generating .env file during watch").option("--silent","Suppress console output while watching").action(Q),e.command("validate").description("Validate your .envx file against its schema to catch errors early").option(...r(t.input||".envx")).action(Z),e.command("print").description("Print the parsed .envx file content as JSON for inspection").option(...r(t.input||".envx")).action(X),e.command("types").description("Generate TypeScript definitions based on your schema for type safety").option(...r(t.input||".envx")).option(...a(t.outputs?.types||"types/envx.ts")).option(...o(t.outputs?.metaFilePath||".")).action(w),await e.parseAsync();}Tt();//# sourceMappingURL=index.mjs.map //# sourceMappingURL=index.mjs.map