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 • 24.3 kB
JavaScript
;var commander=require('commander'),F=require('path'),Ve=require('fs'),be=require('fs/promises'),st=require('readline'),colorette=require('colorette'),xt=require('chokidar'),yt=require('lodash.debounce');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var F__default=/*#__PURE__*/_interopDefault(F);var Ve__default=/*#__PURE__*/_interopDefault(Ve);var be__default=/*#__PURE__*/_interopDefault(be);var st__default=/*#__PURE__*/_interopDefault(st);var xt__default=/*#__PURE__*/_interopDefault(xt);var yt__default=/*#__PURE__*/_interopDefault(yt);var De=Object.defineProperty;var Ce=(e,t,n)=>t in e?De(e,t,{enumerable:true,configurable:true,writable:true,value:n}):e[t]=n;var O=(e,t,n)=>Ce(e,typeof t!="symbol"?t+"":t,n);var ee={version:"0.1.12"};var S="envx.meta.json",D="envx.config.json",C=".env",U=".envx";var b={input:"./.envx",outputs:{env:"./.env",types:"./types/envx.ts",metaFilePath:"."},overwrite:false};function Je(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 M(){let e=F__default.default.resolve(D);if(Ve.existsSync(e)){let t=Ve.readFileSync(e,"utf-8");try{let n=JSON.parse(t);return Je(n)?{...b,...n,outputs:{...b.outputs,...n.outputs}}:(console.warn("[envx:info:config] Invalid config structure, falling back to default."),b)}catch(n){let r=n instanceof Error?n.message:String(n);return console.warn(`[envx:warn:config] Could not parse ${D}: ${r}`),b}}return b}var l=class extends Error{constructor(t){super(t),this.name="EnvxError";}};var te={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 p={lib:te,cli:{}};var V=/^\s*\$\{([^}]+)\}(?:\s*(==|!=)\s*(["'])?([^"']+)\3)?\s*\?\s*(["'])?([^"']+?)\5?\s*:\s*(["'])?([^"']+?)\7?\s*$/,ne=/^[a-zA-Z0-9_\-\.]+$/,re=/^\[.*\]$/,ie=/^[a-zA-Z0-9_\-\.]+$/;function oe(e){return ne.test(e)}function se(e){return re.test(e)}var ae=(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 B(e,t,n){let{type:r,values:i}=n;if(!r)throw new l(p.lib.parser.typeRequiredBeforeDefault(t));switch(r){case "number":let o=Number(e);if(isNaN(o))throw new l(p.lib.parser.defaultMustBeNumber(t));n.default=o;break;case "boolean":if(e!=="true"&&e!=="false")throw new l(p.lib.parser.defaultMustBeBoolean(t));n.default=e==="true";break;case "enum":if(!i||!i.includes(e))throw new l(p.lib.parser.defaultNotInEnum(t,e));n.default=e;break;default:n.default=e;}}function G(e,t){let n=e.indexOf("=");if(n===-1)throw new l(p.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 ce(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 le(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 ue=["string","number","boolean","enum","email","url"],I={};function pe(e,t,n,r){let[i,o]=G(e,t),a=i.trim(),s=j(o.trim());if(a==="description"&&o.trim().startsWith('"""')){let c=[],f=o.trim().slice(3);if(f.endsWith('"""')){n.description=f.slice(0,-3);return}for(c.push(f);r;){let d=r();if(d===null)throw new l(`Line ${t+1}: Unterminated multiline description.`);if(d.endsWith('"""')){c.push(d.slice(0,-3));break}else c.push(d);}n.description=c.join(`
`);return}switch(a){case "required":n.required=s==="true";break;case "type":if(n.type!==void 0)throw new l(p.lib.parser.typeAlreadyDefined(t));if(!ue.includes(s))throw new l(p.lib.unsupportedType(t,s));n.type=s;break;case "default":n.type=="enum"&&!n.values?n.__pendingDefault=s:B(s,t,n);break;case "values":try{let c=JSON.parse(s);if(!(Array.isArray(c)&&c.length<=25&&c.every(d=>typeof d=="string"&&oe(d))))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&&B(n.__pendingDefault,t,n);}catch{throw new l(p.lib.parser.invalidValuesJson(t))}break;case "deprecated":n.deprecated=s;break;case "description":n.description=s;break;default:throw new l(p.lib.parser.unknownSchemaProperty(t,a))}}function fe(e,t,n){let r=e.slice(1,-1).trim();if(!r)throw new l(p.lib.parser.schemaBlockEmpty(t));if(!ie.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(p.lib.parser.schemaKeyDuplicate(t,r));return n[r]=n[r]??{},r}function me(e,t){let[n,r]=G(e,t),i=n.trim();if(!i)throw new l(p.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}:(ae(o,t),{key:i,value:j(o),isMultilineStart:false})}function $(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],f=c.trim();if(!f||f.startsWith("#"))continue;if(o){let g=le(c,o,a,n);a=g.multilineBuffer,o=g.multilineKey;continue}let d=ce(c);if(d!==-1&&(c=c.slice(0,d)),f=c.trim(),se(f)){if(d>-1&&d>c.indexOf("]"))throw new l(`[envx:error] Line ${s+1}: Schema header line cannot contain inline comments.`);i=fe(f,s,r);continue}if(i){pe(f,s,r[i],()=>(s++,s>=t.length?null:t[s].trim()));continue}let{key:h,value:T,isMultilineStart:R}=me(f,s);R?(o=h,a.push(T)):n.push({key:h,value:T});}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 P(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(p.lib.validator.invalidBoolean(t||"",e));return false}return i===true||i==="true"||i===1}var de=e=>/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e);function qe(e){return P(e,"",false,true)?"boolean":!isNaN(Number(e))&&e!==""&&e!==null?"number":"string"}function A(e,t){let n={...I,...t};return e.forEach(({key:r,value:i})=>{n[r]||(n[r]={type:qe(i),required:false});}),n}function ge(e,t,n,r){switch(n){case "string":return t;case "number":{let i=Number(t);if(isNaN(i))throw new l(p.lib.validator.invalidNumber(e,t));return i}case "boolean":return P(t,e,true);case "enum":{if(!r?.length)throw new l(p.lib.validator.missingEnumValues(e));if(!r.includes(t))throw new l(p.lib.validator.invalidEnum(e,t,r));return t}case "email":{if(!de(t))throw new l(p.lib.validator.invalidEmail(e,t));return t}case "url":try{return new URL(t),t}catch{throw new l(p.lib.validator.invalidUrl(e,t))}default:throw new l(p.lib.validator.unsupportedType(e,n))}}function J(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],f=r.get(i);if(f!==void 0){n[i]=ge(i,f,o,o==="enum"?c:void 0);continue}if(s!==void 0){n[i]=ge(i,String(s),o,o==="enum"?c:void 0);continue}if(a)throw new l(p.lib.validator.requiredMissing(i))}for(let[i,o]of r.entries())i in n||(n[i]=o);return n}var We=new Set(["NODE_ENV","CI","VERCEL_ENV"]);function he(e){if(We.has(e)&&typeof process<"u"&&process.env)return process.env[e]}function v(e,t,n){let{env:r,schema:i}=$(e),o=A(r,i),a=t?{...o,...t}:Object.keys(o).length>0?o:void 0,s=q(r,a),c=Object.fromEntries(Object.entries(s).filter(([f])=>a?.[f]!==void 0));return a&&!n?{result:J(Object.entries(c).map(([d,h])=>({key:d,value:h})),a),schema:a,rawEnv:[]}:{result:c,schema:a,rawEnv:r}}function ve(e){let t=e.trim();return V.test(t)}function Ee(e){return typeof e=="string"&&e.includes("${")}function ye(e,t,n,r,i,o="interpolation"){if(n[e]!==void 0)return n[e];if(t[e]!==void 0)return we(t[e],t,n,r,e,i+1);{let a=he(e);if(a!==void 0)return n[e]=a,a;throw new l(p.lib.resolver.interpolationFailed(e,o))}}function q(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]=we(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(p.lib.resolver.requiredMissingInResolve(o))}return r}function we(e,t,n,r,i,o=0){if(typeof e!="string")return e;if(r.has(i))throw new l(p.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,ve(s)){s=Ke(s,t,n,r,o+1);continue}if(Ee(s)){s=He(s,t,n,r,o+1);continue}if(s===c)break}return r.delete(i),s}function He(e,t,n,r,i){return e.replace(/\${([^}]+)}/g,(o,a)=>{let s=a.trim();return String(ye(s,t,n,r,i))})}function Ke(e,t,n,r,i){let a=(e?.trim()).match(V);if(!a)return e;let[,s,c,,f,,d,,h]=a,T=s?.trim(),R=ye(T,t,n,r,i,"ternary"),g=f?.trim();(g?.startsWith('"')&&g?.endsWith('"')||g?.startsWith("'")&&g?.endsWith("'"))&&(g=g.slice(1,-1));let Ae=String(R),k;if(c==="=="||c==="!="){let Z=Ae===g;k=c==="=="?Z:!Z;}else k=P(R);let Ne=d.trim(),ke=h.trim();return xe(k?Ne:ke)}function xe(e){return e==="true"?true:e==="false"?false:isNaN(Number(e))?e:Number(e)}function Xe(e,t){return t?null:{key:e,message:`Missing required environment variable "${e}".`,severity:"error"}}function Ye(e,t,n){return t.deprecated&&n?{key:e,message:`Environment variable "${e}" is deprecated. ${t.deprecated}`,severity:"warning"}:null}function ze(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 W(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);[Xe(i,a),Ye(i,o,a),ze(i,s,o)].forEach(f=>{f&&n.push(f);});}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 Se(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 N=async(e,t)=>{let n=Se(e);await L(t,n);};function $e(e){let t=e.replace(/\r?\n/g,"\\n");return t.includes('"')&&!t.includes("'")?`'${t}'`:'"'+t.replace(/\\/g,"\\\\").replace(/"/g,'\\"')+'"'}async function L(e,t){let n=F__default.default.dirname(e);try{await be__default.default.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 be__default.default.writeFile(e,t);}catch(r){throw new Error(`Failed to write file "${e}": ${r instanceof Error?r.message:String(r)}`)}}var H=class{constructor(t){O(this,"silent");O(this,"showPrefix");O(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 colorette.blue(colorette.bold(s));case "success":return colorette.green(colorette.bold(s));case "error":return colorette.red(colorette.bold(s));case "warn":return colorette.yellow(colorette.bold(s));default:return colorette.whiteBright(colorette.bold(i))}}log(t,n){if(this.silent)return;let{showPrefix:r=false,addSpace:i=""}=n||{},o=r?colorette.whiteBright(colorette.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?colorette.gray(colorette.bold(n)):"";console.log(`
${o}${a} ${colorette.bold(t)}`.trim());}},m=new H({silent:false});async function at(e){return new Promise(t=>{let n=st__default.default.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 x(e,t){let n=F__default.default.resolve(process.cwd(),e.input),r=F__default.default.resolve(process.cwd(),e.output),i=F__default.default.relative(process.cwd(),r),o=e.overwrite,a=e?.noTypes??false;!o&&Ve.existsSync(r)&&(await at(i)||(m.info("\u2716 Operation cancelled."),process.exit(0)));let s=await be__default.default.readFile(n,"utf-8"),c=v(s),f=Object.entries(c.result).map(([d,h])=>`${d}=${$e(String(h))}`).join(`
`);if(await L(r,f),m.success("Env file created \u2192 "+colorette.green(i),t),!a){let d=F__default.default.join(e.metaFilePath||".",S);await N(c.schema||I,d),m.success(`Meta JSON schema generated \u2192 ${colorette.green(F__default.default.relative(process.cwd(),d))}`,t);}}async function K(e){try{let t=F__default.default.resolve(process.cwd(),e.input),n=await be__default.default.readFile(t,"utf-8"),r=v(n);console.log(ht(r.result));}catch(t){m.error(`Error reading .envx file: ${t.message||t}`),process.exit(1);}}function gt(e){return e===null?colorette.magenta("null"):typeof e=="string"?colorette.green(`"${e}"`):typeof e=="number"?colorette.yellow(e.toString()):typeof e=="boolean"?colorette.magenta(e.toString()):colorette.white(String(e))}function ht(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)}${colorette.bold(colorette.cyan(`"${c}"`))}: ${r(i[c],o+1)}`).join(`,
`)}
${n.repeat(o)}}`}else return gt(i)}return r(e,0)}function vt(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 _e(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=vt(r,e[n]),a=i?"":"?";t.push(` ${n}${a}: ${o};`);}return t.push(`}
`),t.join(`
`)}async function y(e,t){try{let n=F__default.default.resolve(process.cwd(),e.input),r=F__default.default.resolve(process.cwd(),e.typesOutput),i=F__default.default.relative(process.cwd(),r),o=await be__default.default.readFile(n,"utf-8"),{env:a,schema:s}=$(o),c=A(a,s),f=_e(c);await L(r,f);let d=F__default.default.join(e.metaFilePath||".",S);await N(c,d),m.success(`TypeScript types created \u2192 ${colorette.green(i)}`,t),m.success(`Meta JSON schema generated \u2192 ${colorette.green(F__default.default.relative(process.cwd(),d))}`,t);}catch(n){m.error(`Error generating types: ${n.message||n}`),process.exit(1);}}async function X(e){try{m.block("\u2699\uFE0F Building environment..."),await x(e,{showPrefix:!1,addSpace:" "}),console.log(),m.block("\u2699\uFE0F Generating types..."),await y({...e,typesOutput:e.typesOutput},{showPrefix:!1,addSpace:" "}),console.log(),m.success(`\u2705 Generation completed successfully.
`,{showPrefixIcon:!1});}catch(t){m.error(`Error during generation: ${t.message||t}`);}}var Pt=750,Me=" ";async function z(e){let t=e.input||U,n=e.metaFilePath||".",r=e.output||C,i=e.typesOutput||"envx.ts";e.silent||m.block(`${colorette.bold(colorette.cyan("\u{1F331} Starting watcher"))}
${colorette.gray(`Watching for changes on ${colorette.white(colorette.bgMagenta(t))}
`)}`);async function o(){e.noBuild||(e.silent||m.log(colorette.bold(colorette.cyan("[Build]"))),await x({input:t,output:r,metaFilePath:n,overwrite:true},{showPrefix:false,addSpace:Me})),e.noTypes||(e.silent||m.log(colorette.bold(colorette.cyan("[Types]"))),await y({input:t,typesOutput:i,metaFilePath:n},{showPrefix:false,addSpace:Me}));}try{await o();}catch(s){m.error(`${colorette.red("\u2716")} Initial generation failed: ${colorette.bold(s instanceof Error?s.message:String(s))}`);}let a=yt__default.default(async()=>{e.silent||(m.log(colorette.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
`)),m.log(colorette.bold(colorette.yellow(`\u26A1 Change detected! Regenerating...
`))));try{await o(),e.silent||m.log(colorette.bold(colorette.whiteBright(`
\u2705 Regeneration completed successfully!
`)));}catch(s){m.error(`${colorette.red("\u2716")} Error during regeneration: ${colorette.bold(s instanceof Error?s.message:String(s))}`);}},Pt);xt__default.default.watch(t,{ignoreInitial:true}).on("change",a);}M();function Ie(e){try{if(!Ve__default.default.existsSync(e))throw new l(p.lib.fileDoesNotExist(e));return Ve__default.default.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 Q(e){let t=F__default.default.resolve(process.cwd(),e.input);try{let n=await Ie(t),{result:r,schema:i}=v(n,{},!0),{valid:o,errors:a}=W(r,i);o?m.success("\u2705 No validation errors found in .envx file."):(console.log(a),process.exit(1));}catch(n){m.error(`\u274C Failed to validate .envx file: ${n.message||n}`),process.exit(1);}}async function _t(){let e=new commander.Command,t=M(),n=ee.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(x),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 X(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(z),e.command("validate").description("Validate your .envx file against its schema to catch errors early").option(...r(t.input||".envx")).action(Q),e.command("print").description("Print the parsed .envx file content as JSON for inspection").option(...r(t.input||".envx")).action(K),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(y),await e.parseAsync();}_t();//# sourceMappingURL=index.js.map
//# sourceMappingURL=index.js.map