arkenv 1.0.0-alpha.1 → 1.0.0-alpha.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -80
- package/dist/chunk-i8uDWG73.cjs +1 -0
- package/dist/index.cjs +297 -8
- package/dist/index.d.cts +1 -185
- package/package.json +34 -79
- package/dist/core-B0IkKRzg.mjs +0 -6
- package/dist/core-B0IkKRzg.mjs.map +0 -1
- package/dist/core-BftJnV8f.cjs +0 -11
- package/dist/core.cjs +0 -8
- package/dist/core.d.cts +0 -46
- package/dist/core.d.cts.map +0 -1
- package/dist/core.d.mts +0 -40
- package/dist/core.d.mts.map +0 -1
- package/dist/core.mjs +0 -1
- package/dist/index-Br22fqkz.d.mts +0 -204
- package/dist/index-Br22fqkz.d.mts.map +0 -1
- package/dist/index-CzNfOanV.d.cts +0 -210
- package/dist/index-CzNfOanV.d.cts.map +0 -1
- package/dist/index.d.cts.map +0 -1
- package/dist/index.d.mts +0 -179
- package/dist/index.d.mts.map +0 -1
- package/dist/index.mjs +0 -3
- package/dist/index.mjs.map +0 -1
- package/dist/shared-B7lIFzfk.mjs +0 -3
- package/dist/shared-B7lIFzfk.mjs.map +0 -1
- package/dist/shared-Bx3sbEJf.cjs +0 -8
- package/dist/standard.cjs +0 -8
- package/dist/standard.d.cts +0 -92
- package/dist/standard.d.cts.map +0 -1
- package/dist/standard.d.mts +0 -86
- package/dist/standard.d.mts.map +0 -1
- package/dist/standard.mjs +0 -3
- package/dist/standard.mjs.map +0 -1
package/dist/index.cjs
CHANGED
|
@@ -1,8 +1,297 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
}
|
|
8
|
-
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
const e=require(`./chunk-i8uDWG73.cjs`);let t=require(`radashi`),n=require(`node:util`),r=require(`node:process`);r=e.r(r,1);let i=require(`node:readline`);i=e.r(i,1);let a=require(`node:tty`);require(`node:fs`);let o=require(`node:path`);o=e.r(o,1);let s=require(`node:fs/promises`);s=e.r(s,1);let c=require(`dedent`);c=e.r(c,1);let l=require(`node:child_process`),u=require(`node:module`),d=require(`jsonc-parser`),f=require(`magicast`),p=require(`yaml`);const m=(e,t=2,{dontDetectNewlines:n=!1}={})=>n?`${` `.repeat(t)}${e}`:e.split(`
|
|
3
|
+
`).map(e=>`${` `.repeat(t)}${e}`).join(`
|
|
4
|
+
`),h={red:`\x1B[31m`,yellow:`\x1B[33m`,cyan:`\x1B[36m`,reset:`\x1B[0m`},g=()=>typeof process<`u`&&process.versions!=null&&process.versions.node!=null,_=()=>!!(!g()||process.env.NO_COLOR!==void 0||process.env.CI!==void 0||process.stdout&&!process.stdout.isTTY),v=(e,t)=>g()&&!_()?`${h[e]}${t}${h.reset}`:t;function y(e){return e.map(e=>`${v(`yellow`,e.path)} ${e.message.trimStart()}`).join(`
|
|
5
|
+
`)}Object.defineProperty(class extends Error{constructor(e,t=`Errors found while validating environment variables`){let n=y(e);super(`${v(`red`,t)}\n${m(n)}\n`),this.name=`ArkEnvError`,this.issues=e}},`name`,{value:`ArkEnvError`});function b(e){return`[ArkEnv] ${e}`}var x=e.t(((e,t)=>{let n=process||{},r=n.argv||[],i=n.env||{},a=!(i.NO_COLOR||r.includes(`--no-color`))&&(!!i.FORCE_COLOR||r.includes(`--color`)||n.platform===`win32`||(n.stdout||{}).isTTY&&i.TERM!==`dumb`||!!i.CI),o=(e,t,n=e)=>r=>{let i=``+r,a=i.indexOf(t,e.length);return~a?e+s(i,t,n,a)+t:e+i+t},s=(e,t,n,r)=>{let i=``,a=0;do i+=e.substring(a,r)+n,a=r+t.length,r=e.indexOf(t,a);while(~r);return i+e.substring(a)},c=(e=a)=>{let t=e?o:()=>String;return{isColorSupported:e,reset:t(`\x1B[0m`,`\x1B[0m`),bold:t(`\x1B[1m`,`\x1B[22m`,`\x1B[22m\x1B[1m`),dim:t(`\x1B[2m`,`\x1B[22m`,`\x1B[22m\x1B[2m`),italic:t(`\x1B[3m`,`\x1B[23m`),underline:t(`\x1B[4m`,`\x1B[24m`),inverse:t(`\x1B[7m`,`\x1B[27m`),hidden:t(`\x1B[8m`,`\x1B[28m`),strikethrough:t(`\x1B[9m`,`\x1B[29m`),black:t(`\x1B[30m`,`\x1B[39m`),red:t(`\x1B[31m`,`\x1B[39m`),green:t(`\x1B[32m`,`\x1B[39m`),yellow:t(`\x1B[33m`,`\x1B[39m`),blue:t(`\x1B[34m`,`\x1B[39m`),magenta:t(`\x1B[35m`,`\x1B[39m`),cyan:t(`\x1B[36m`,`\x1B[39m`),white:t(`\x1B[37m`,`\x1B[39m`),gray:t(`\x1B[90m`,`\x1B[39m`),bgBlack:t(`\x1B[40m`,`\x1B[49m`),bgRed:t(`\x1B[41m`,`\x1B[49m`),bgGreen:t(`\x1B[42m`,`\x1B[49m`),bgYellow:t(`\x1B[43m`,`\x1B[49m`),bgBlue:t(`\x1B[44m`,`\x1B[49m`),bgMagenta:t(`\x1B[45m`,`\x1B[49m`),bgCyan:t(`\x1B[46m`,`\x1B[49m`),bgWhite:t(`\x1B[47m`,`\x1B[49m`),blackBright:t(`\x1B[90m`,`\x1B[39m`),redBright:t(`\x1B[91m`,`\x1B[39m`),greenBright:t(`\x1B[92m`,`\x1B[39m`),yellowBright:t(`\x1B[93m`,`\x1B[39m`),blueBright:t(`\x1B[94m`,`\x1B[39m`),magentaBright:t(`\x1B[95m`,`\x1B[39m`),cyanBright:t(`\x1B[96m`,`\x1B[39m`),whiteBright:t(`\x1B[97m`,`\x1B[39m`),bgBlackBright:t(`\x1B[100m`,`\x1B[49m`),bgRedBright:t(`\x1B[101m`,`\x1B[49m`),bgGreenBright:t(`\x1B[102m`,`\x1B[49m`),bgYellowBright:t(`\x1B[103m`,`\x1B[49m`),bgBlueBright:t(`\x1B[104m`,`\x1B[49m`),bgMagentaBright:t(`\x1B[105m`,`\x1B[49m`),bgCyanBright:t(`\x1B[106m`,`\x1B[49m`),bgWhiteBright:t(`\x1B[107m`,`\x1B[49m`)}};t.exports=c(),t.exports.createColors=c})),S=e.r(x(),1);const C={REQUIREMENTS_NOT_MET:`REQUIREMENTS_NOT_MET`,GIT_TREE_DIRTY:`GIT_TREE_DIRTY`,NON_EMPTY_DIR:`NON_EMPTY_DIR`,INTERNAL:`INTERNAL`};var ee=class{info(e){process.stderr.write(`${S.default.blue(`ℹ ${e}`)}\n`)}warn(e){process.stderr.write(`${S.default.yellow(`⚠ ${e}`)}\n`)}error(e){process.stderr.write(`${S.default.red(`✘ ${e}`)}\n`)}success(e){process.stderr.write(`${S.default.green(`✔ ${e}`)}\n`)}step(e){process.stderr.write(`○ ${e}\n`)}note(e,t){process.stderr.write(`${S.default.dim(`○ ${t?`${t}: `:``}${e}`)}\n`)}log(e){process.stderr.write(`${e}\n`)}spinner(){return{start:e=>process.stderr.write(`${S.default.dim(`○ ${e}...`)}\n`),stop:e=>process.stderr.write(`${S.default.green(`✔ ${e}`)}\n`),message:e=>process.stderr.write(`${S.default.dim(`○ ${e}...`)}\n`)}}json(e){process.stdout.write(`${JSON.stringify(e,null,2)}\n`)}cancel(e){this.json({status:`cancelled`,message:e})}fatal(e,t){let n=t instanceof Error?t.message:t?String(t):void 0;throw this.json({status:`error`,code:C.INTERNAL,message:e,retryWith:[],...n===void 0?{}:{details:{error:n}}}),t instanceof Error?t:Error(e)}refuse(e){this.json({status:`error`,code:e.code,message:e.message,retryWith:e.retryWith,...e.details===void 0?{}:{details:e.details}})}finish(e,t){this.json({status:`success`,message:e,details:t})}async flush(){return new Promise(e=>{process.stdout.write(``,()=>e())})}},w=class{stripAnsi(e){return e.replace(/\x1B\[[0-9;]*[JKmsu]/g,``)}info(e){}warn(e){}error(e){}success(e){}step(e){}note(e,t){}log(e){process.stdout.write(`${this.stripAnsi(e)}\n`)}spinner(){return{start:e=>{},stop:e=>{},message:e=>{}}}json(e){process.stdout.write(`${JSON.stringify(e,null,2)}\n`)}cancel(e){process.stderr.write(`✘ Cancelled: ${e}\n`)}fatal(e,t){throw process.stderr.write(`✘ Fatal: ${e}\n`),t&&process.stderr.write(`${t instanceof Error?t.stack??t.message:String(t)}\n`),t instanceof Error?t:Error(e)}refuse(e){}finish(e,t){}async flush(){return new Promise(e=>{process.stderr.write(``,()=>e())})}};const te=(()=>{let e=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g;return t=>{let n=0;for(e.lastIndex=0;e.test(t);)n+=1;return t.length-n}})(),T=e=>e===12288||e>=65281&&e<=65376||e>=65504&&e<=65510,E=e=>e===8987||e===9001||e>=12272&&e<=12287||e>=12289&&e<=12350||e>=12441&&e<=12543||e>=12549&&e<=12591||e>=12593&&e<=12686||e>=12688&&e<=12771||e>=12783&&e<=12830||e>=12832&&e<=12871||e>=12880&&e<=19903||e>=65040&&e<=65049||e>=65072&&e<=65106||e>=65108&&e<=65126||e>=65128&&e<=65131||e>=127488&&e<=127490||e>=127504&&e<=127547||e>=127552&&e<=127560||e>=131072&&e<=196605||e>=196608&&e<=262141,ne=/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]|\u001b\]8;[^;]*;.*?(?:\u0007|\u001b\u005c)/y,D=/[\x00-\x08\x0A-\x1F\x7F-\x9F]{1,1000}/y,O=/(?:(?![\uFF61-\uFF9F\uFF00-\uFFEF])[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Hangul}\p{Script=Tangut}]){1,1000}/uy,re=/\t{1,1000}/y,k=/[\u{1F1E6}-\u{1F1FF}]{2}|\u{1F3F4}[\u{E0061}-\u{E007A}]{2}[\u{E0030}-\u{E0039}\u{E0061}-\u{E007A}]{1,3}\u{E007F}|(?:\p{Emoji}\uFE0F\u20E3?|\p{Emoji_Modifier_Base}\p{Emoji_Modifier}?|\p{Emoji_Presentation})(?:\u200D(?:\p{Emoji_Modifier_Base}\p{Emoji_Modifier}?|\p{Emoji_Presentation}|\p{Emoji}\uFE0F\u20E3?))*/uy,ie=/(?:[\x20-\x7E\xA0-\xFF](?!\uFE0F)){1,1000}/y,ae=/\p{M}+/gu,oe={limit:1/0,ellipsis:``},se=(e,t={},n={})=>{let r=t.limit??1/0,i=t.ellipsis??``,a=t?.ellipsisWidth??(i?se(i,oe,n).width:0),o=n.controlWidth??0,s=n.tabWidth??8,c=n.emojiWidth??2,l=n.regularWidth??1,u=n.wideWidth??2,d=[[ie,l],[ne,0],[D,o],[re,s],[k,c],[O,u]],f=0,p=0,m=e.length,h=0,g=!1,_=m,v=Math.max(0,r-a),y=0,b=0,x=0,S=0;outer:for(;;){if(b>y||p>=m&&p>f){let t=e.slice(y,b)||e.slice(f,p);h=0;for(let e of t.replaceAll(ae,``)){let t=e.codePointAt(0)||0;if(S=T(t)?2:E(t)?u:l,x+S>v&&(_=Math.min(_,Math.max(y,f)+h)),x+S>r){g=!0;break outer}h+=e.length,x+=S}y=b=0}if(p>=m)break outer;for(let t=0,n=d.length;t<n;t++){let[n,i]=d[t];if(n.lastIndex=p,n.test(e)){if(h=n===O?te(e.slice(p,n.lastIndex)):n===k?1:n.lastIndex-p,S=h*i,x+S>v&&(_=Math.min(_,p+Math.floor((v-x)/i))),x+S>r){g=!0;break outer}x+=S,y=f,b=p,p=f=n.lastIndex;continue outer}}p+=1}return{width:g?v:x,index:g?_:m,truncated:g,ellipsed:g&&r>=a}},ce={limit:1/0,ellipsis:``,ellipsisWidth:0},A=(e,t={})=>se(e,ce,t).width,le=`]8;;`,ue=RegExp(`(?:\\[(?<code>\\d+)m|\\${le}(?<uri>.*))`,`y`),de=e=>{if(e>=30&&e<=37||e>=90&&e<=97)return 39;if(e>=40&&e<=47||e>=100&&e<=107)return 49;if(e===1||e===2)return 22;if(e===3)return 23;if(e===4)return 24;if(e===7)return 27;if(e===8)return 28;if(e===9)return 29;if(e===0)return 0},fe=e=>`[${e}m`,pe=e=>`${le}${e}`,me=(e,t,n)=>{let r=t[Symbol.iterator](),i=!1,a=!1,o=e.at(-1),s=o===void 0?0:A(o),c=r.next(),l=r.next(),u=0;for(;!c.done;){let o=c.value,d=A(o);s+d<=n?e[e.length-1]+=o:(e.push(o),s=0),(o===`\x1B`||o===``)&&(i=!0,a=t.startsWith(le,u+1)),i?a?o===`\x07`&&(i=!1,a=!1):o===`m`&&(i=!1):(s+=d,s===n&&!l.done&&(e.push(``),s=0)),c=l,l=r.next(),u+=o.length}o=e.at(-1),!s&&o!==void 0&&o.length&&e.length>1&&(e[e.length-2]+=e.pop())},he=e=>{let t=e.split(` `),n=t.length;for(;n&&!A(t[n-1]);)n--;return n===t.length?e:t.slice(0,n).join(` `)+t.slice(n).join(``)},ge=(e,t,n={})=>{if(n.trim!==!1&&e.trim()===``)return``;let r=``,i,a,o=e.split(` `),s=[``],c=0;for(let e=0;e<o.length;e++){let r=o[e];if(n.trim!==!1){let e=s.at(-1)??``,t=e.trimStart();e.length!==t.length&&(s[s.length-1]=t,c=A(t))}e!==0&&(c>=t&&(n.wordWrap===!1||n.trim===!1)&&(s.push(``),c=0),(c||n.trim===!1)&&(s[s.length-1]+=` `,c++));let i=A(r);if(n.hard&&i>t){let e=t-c,n=1+Math.floor((i-e-1)/t);Math.floor((i-1)/t)<n&&s.push(``),me(s,r,t),c=A(s.at(-1)??``);continue}if(c+i>t&&c&&i){if(n.wordWrap===!1&&c<t){me(s,r,t),c=A(s.at(-1)??``);continue}s.push(``),c=0}if(c+i>t&&n.wordWrap===!1){me(s,r,t),c=A(s.at(-1)??``);continue}s[s.length-1]+=r,c+=i}n.trim!==!1&&(s=s.map(e=>he(e)));let l=s.join(`
|
|
6
|
+
`),u=!1;for(let e=0;e<l.length;e++){let t=l[e];if(r+=t,u)u=!1;else if(u=t>=`\ud800`&&t<=`\udbff`,u)continue;if(t===`\x1B`||t===``){ue.lastIndex=e+1;let t=ue.exec(l)?.groups;if(t?.code!==void 0){let e=Number.parseFloat(t.code);i=e===39?void 0:e}else t?.uri!==void 0&&(a=t.uri.length===0?void 0:t.uri)}if(l[e+1]===`
|
|
7
|
+
`){a&&(r+=pe(``));let e=i?de(i):void 0;i&&e&&(r+=fe(e))}else t===`
|
|
8
|
+
`&&(i&&de(i)&&(r+=fe(i)),a&&(r+=pe(a)))}return r},_e=/\r?\n/;function j(e,t,n){return String(e).normalize().split(_e).map(e=>ge(e,t,n)).join(`
|
|
9
|
+
`)}var M=e.t(((e,t)=>{let n={to(e,t){return t?`[${t+1};${e+1}H`:`[${e+1}G`},move(e,t){let n=``;return e<0?n+=`[${-e}D`:e>0&&(n+=`[${e}C`),t<0?n+=`[${-t}A`:t>0&&(n+=`[${t}B`),n},up:(e=1)=>`[${e}A`,down:(e=1)=>`[${e}B`,forward:(e=1)=>`[${e}C`,backward:(e=1)=>`[${e}D`,nextLine:(e=1)=>`\x1B[E`.repeat(e),prevLine:(e=1)=>`\x1B[F`.repeat(e),left:`\x1B[G`,hide:`\x1B[?25l`,show:`\x1B[?25h`,save:`\x1B7`,restore:`\x1B8`};t.exports={cursor:n,scroll:{up:(e=1)=>`\x1B[S`.repeat(e),down:(e=1)=>`\x1B[T`.repeat(e)},erase:{screen:`\x1B[2J`,up:(e=1)=>`\x1B[1J`.repeat(e),down:(e=1)=>`\x1B[J`.repeat(e),line:`\x1B[2K`,lineEnd:`\x1B[K`,lineStart:`\x1B[1K`,lines(e){let t=``;for(let r=0;r<e;r++)t+=this.line+(r<e-1?n.up():``);return e&&(t+=n.left),t}},beep:`\x07`}}))();function ve(e,t,n){if(!n.some(e=>!e.disabled))return e;let r=e+t,i=Math.max(n.length-1,0),a=r<0?i:r>i?0:r;return n[a].disabled?ve(a,t<0?-1:1,n):a}const N={actions:new Set([`up`,`down`,`left`,`right`,`space`,`enter`,`cancel`]),aliases:new Map([[`k`,`up`],[`j`,`down`],[`h`,`left`],[`l`,`right`],[``,`cancel`],[`escape`,`cancel`]]),messages:{cancel:`Canceled`,error:`Something went wrong`},withGuide:!0,date:{monthNames:[...[`January`,`February`,`March`,`April`,`May`,`June`,`July`,`August`,`September`,`October`,`November`,`December`]],messages:{required:`Please enter a valid date`,invalidMonth:`There are only 12 months in a year`,invalidDay:(e,t)=>`There are only ${e} days in ${t}`,afterMin:e=>`Date must be on or after ${e.toISOString().slice(0,10)}`,beforeMax:e=>`Date must be on or before ${e.toISOString().slice(0,10)}`}}};function ye(e,t){if(typeof e==`string`)return N.aliases.get(e)===t;for(let n of e)if(n!==void 0&&ye(n,t))return!0;return!1}function be(e,t){if(e===t)return;let n=e.split(`
|
|
10
|
+
`),r=t.split(`
|
|
11
|
+
`),i=Math.max(n.length,r.length),a=[];for(let e=0;e<i;e++)n[e]!==r[e]&&a.push(e);return{lines:a,numLinesBefore:n.length,numLinesAfter:r.length,numLines:i}}const xe=globalThis.process.platform.startsWith(`win`),Se=Symbol(`clack:cancel`);function P(e){return e===Se}function Ce(e,t){let n=e;n.isTTY&&n.setRawMode(t)}function we({input:e=r.stdin,output:t=r.stdout,overwrite:n=!0,hideCursor:o=!0}={}){let s=i.createInterface({input:e,output:t,prompt:``,tabSize:1});i.emitKeypressEvents(e,s),e instanceof a.ReadStream&&e.isTTY&&e.setRawMode(!0);let c=(r,{name:a,sequence:s})=>{if(ye([String(r),a,s],`cancel`)){o&&t.write(M.cursor.show),process.exit(0);return}if(!n)return;let l=a===`return`?0:-1,u=a===`return`?-1:0;i.moveCursor(t,l,u,()=>{i.clearLine(t,1,()=>{e.once(`keypress`,c)})})};return o&&t.write(M.cursor.hide),e.once(`keypress`,c),()=>{e.off(`keypress`,c),o&&t.write(M.cursor.show),e instanceof a.ReadStream&&e.isTTY&&!xe&&e.setRawMode(!1),s.terminal=!1,s.close()}}const Te=e=>`columns`in e&&typeof e.columns==`number`?e.columns:80,Ee=e=>`rows`in e&&typeof e.rows==`number`?e.rows:20;function De(e,t,n,i=n,a){return j(t,Te(e??r.stdout)-n.length,{hard:!0,trim:!1}).split(`
|
|
12
|
+
`).map((e,t)=>{let r=a?a(e,t):e;return`${t===0?i:n}${r}`}).join(`
|
|
13
|
+
`)}let Oe=class{input;output;_abortSignal;rl;opts;_render;_track=!1;_prevFrame=``;_subscribers=new Map;_cursor=0;state=`initial`;error=``;value;userInput=``;constructor(e,t=!0){let{input:n=r.stdin,output:i=r.stdout,render:a,signal:o,...s}=e;this.opts=s,this.onKeypress=this.onKeypress.bind(this),this.close=this.close.bind(this),this.render=this.render.bind(this),this._render=a.bind(this),this._track=t,this._abortSignal=o,this.input=n,this.output=i}unsubscribe(){this._subscribers.clear()}setSubscriber(e,t){let n=this._subscribers.get(e)??[];n.push(t),this._subscribers.set(e,n)}on(e,t){this.setSubscriber(e,{cb:t})}once(e,t){this.setSubscriber(e,{cb:t,once:!0})}emit(e,...t){let n=this._subscribers.get(e)??[],r=[];for(let e of n)e.cb(...t),e.once&&r.push(()=>n.splice(n.indexOf(e),1));for(let e of r)e()}prompt(){return new Promise(e=>{if(this._abortSignal){if(this._abortSignal.aborted)return this.state=`cancel`,this.close(),e(Se);this._abortSignal.addEventListener(`abort`,()=>{this.state=`cancel`,this.close()},{once:!0})}this.rl=i.default.createInterface({input:this.input,tabSize:2,prompt:``,escapeCodeTimeout:50,terminal:!0}),this.rl.prompt(),this.opts.initialUserInput!==void 0&&this._setUserInput(this.opts.initialUserInput,!0),this.input.on(`keypress`,this.onKeypress),Ce(this.input,!0),this.output.on(`resize`,this.render),this.render(),this.once(`submit`,()=>{this.output.write(M.cursor.show),this.output.off(`resize`,this.render),Ce(this.input,!1),e(this.value)}),this.once(`cancel`,()=>{this.output.write(M.cursor.show),this.output.off(`resize`,this.render),Ce(this.input,!1),e(Se)})})}_isActionKey(e,t){return e===` `}_shouldSubmit(e,t){return!0}_setValue(e){this.value=e,this.emit(`value`,this.value)}_setUserInput(e,t){this.userInput=e??``,this.emit(`userInput`,this.userInput),t&&this._track&&this.rl&&(this.rl.write(this.userInput),this._cursor=this.rl.cursor)}_clearUserInput(){this.rl?.write(null,{ctrl:!0,name:`u`}),this._setUserInput(``)}onKeypress(e,t){if(this._track&&t.name!==`return`&&(t.name&&this._isActionKey(e,t)&&this.rl?.write(null,{ctrl:!0,name:`h`}),this._cursor=this.rl?.cursor??0,this._setUserInput(this.rl?.line)),this.state===`error`&&(this.state=`active`),t?.name&&(!this._track&&N.aliases.has(t.name)&&this.emit(`cursor`,N.aliases.get(t.name)),N.actions.has(t.name)&&this.emit(`cursor`,t.name)),e&&(e.toLowerCase()===`y`||e.toLowerCase()===`n`)&&this.emit(`confirm`,e.toLowerCase()===`y`),this.emit(`key`,e?.toLowerCase(),t),t?.name===`return`&&this._shouldSubmit(e,t)){if(this.opts.validate){let e=this.opts.validate(this.value);e&&(this.error=e instanceof Error?e.message:e,this.state=`error`,this.rl?.write(this.userInput))}this.state!==`error`&&(this.state=`submit`)}ye([e,t?.name,t?.sequence],`cancel`)&&(this.state=`cancel`),(this.state===`submit`||this.state===`cancel`)&&this.emit(`finalize`),this.render(),(this.state===`submit`||this.state===`cancel`)&&this.close()}close(){this.input.unpipe(),this.input.removeListener(`keypress`,this.onKeypress),this.output.write(`
|
|
14
|
+
`),Ce(this.input,!1),this.rl?.close(),this.rl=void 0,this.emit(`${this.state}`,this.value),this.unsubscribe()}restoreCursor(){let e=j(this._prevFrame,process.stdout.columns,{hard:!0,trim:!1}).split(`
|
|
15
|
+
`).length-1;this.output.write(M.cursor.move(-999,e*-1))}render(){let e=j(this._render(this)??``,process.stdout.columns,{hard:!0,trim:!1});if(e!==this._prevFrame){if(this.state===`initial`)this.output.write(M.cursor.hide);else{let t=be(this._prevFrame,e),n=Ee(this.output);if(this.restoreCursor(),t){let r=Math.max(0,t.numLinesAfter-n),i=Math.max(0,t.numLinesBefore-n),a=t.lines.find(e=>e>=r);if(a===void 0){this._prevFrame=e;return}if(t.lines.length===1){this.output.write(M.cursor.move(0,a-i)),this.output.write(M.erase.lines(1));let t=e.split(`
|
|
16
|
+
`);this.output.write(t[a]),this._prevFrame=e,this.output.write(M.cursor.move(0,t.length-a-1));return}else if(t.lines.length>1){if(r<i)a=r;else{let e=a-i;e>0&&this.output.write(M.cursor.move(0,e))}this.output.write(M.erase.down());let t=e.split(`
|
|
17
|
+
`).slice(a);this.output.write(t.join(`
|
|
18
|
+
`)),this._prevFrame=e;return}}this.output.write(M.erase.down())}this.output.write(e),this.state===`initial`&&(this.state=`active`),this._prevFrame=e}}};var ke=class extends Oe{get cursor(){return+!this.value}get _value(){return this.cursor===0}constructor(e){super(e,!1),this.value=!!e.initialValue,this.on(`userInput`,()=>{this.value=this._value}),this.on(`confirm`,e=>{this.output.write(M.cursor.move(0,-1)),this.value=e,this.state=`submit`,this.close()}),this.on(`cursor`,()=>{this.value=!this.value})}},Ae=class extends Oe{options;cursor=0;get _selectedValue(){return this.options[this.cursor]}changeValue(){this.value=this._selectedValue.value}constructor(e){super(e,!1),this.options=e.options;let t=this.options.findIndex(({value:t})=>t===e.initialValue),n=t===-1?0:t;this.cursor=this.options[n].disabled?ve(n,1,this.options):n,this.changeValue(),this.on(`cursor`,e=>{switch(e){case`left`:case`up`:this.cursor=ve(this.cursor,-1,this.options);break;case`down`:case`right`:this.cursor=ve(this.cursor,1,this.options);break}this.changeValue()})}},je=class extends Oe{get userInputWithCursor(){if(this.state===`submit`)return this.userInput;let e=this.userInput;if(this.cursor>=e.length)return`${this.userInput}\u2588`;let t=e.slice(0,this.cursor),[r,...i]=e.slice(this.cursor);return`${t}${(0,n.styleText)(`inverse`,r)}${i.join(``)}`}get cursor(){return this._cursor}constructor(e){super({...e,initialUserInput:e.initialUserInput??e.initialValue}),this.on(`userInput`,e=>{this._setValue(e)}),this.on(`finalize`,()=>{this.value||=e.defaultValue,this.value===void 0&&(this.value=``)})}};function Me(){return r.default.platform===`win32`?!!r.default.env.CI||!!r.default.env.WT_SESSION||!!r.default.env.TERMINUS_SUBLIME||r.default.env.ConEmuTask===`{cmd::Cmder}`||r.default.env.TERM_PROGRAM===`Terminus-Sublime`||r.default.env.TERM_PROGRAM===`vscode`||r.default.env.TERM===`xterm-256color`||r.default.env.TERM===`alacritty`||r.default.env.TERMINAL_EMULATOR===`JetBrains-JediTerm`:r.default.env.TERM!==`linux`}const Ne=Me(),Pe=()=>process.env.CI===`true`,F=(e,t)=>Ne?e:t,Fe=F(`◆`,`*`),Ie=F(`■`,`x`),Le=F(`▲`,`x`),I=F(`◇`,`o`),L=F(`│`,`|`),R=F(`└`,`—`),Re=F(`●`,`>`),ze=F(`○`,` `),Be=F(`─`,`-`),Ve=F(`╮`,`+`),He=F(`├`,`+`),Ue=F(`╯`,`+`),We=F(`╰`,`+`),Ge=F(`●`,`•`),Ke=F(`◆`,`*`),qe=F(`▲`,`!`),Je=F(`■`,`x`),Ye=e=>{switch(e){case`initial`:case`active`:return(0,n.styleText)(`cyan`,Fe);case`cancel`:return(0,n.styleText)(`red`,Ie);case`error`:return(0,n.styleText)(`yellow`,Le);case`submit`:return(0,n.styleText)(`green`,I)}},Xe=e=>{switch(e){case`initial`:case`active`:return(0,n.styleText)(`cyan`,L);case`cancel`:return(0,n.styleText)(`red`,L);case`error`:return(0,n.styleText)(`yellow`,L);case`submit`:return(0,n.styleText)(`green`,L)}},Ze=(e,t,n,r,i)=>{let a=t,o=0;for(let t=n;t<r;t++){let n=e[t];if(a-=n.length,o++,a<=i)break}return{lineCount:a,removals:o}},Qe=({cursor:e,options:t,style:r,output:i=process.stdout,maxItems:a=1/0,columnPadding:o=0,rowPadding:s=4})=>{let c=Te(i)-o,l=Ee(i),u=(0,n.styleText)(`dim`,`...`),d=Math.max(l-s,0),f=Math.max(Math.min(a,d),5),p=0;e>=f-3&&(p=Math.max(Math.min(e-f+3,t.length-f),0));let m=f<t.length&&p>0,h=f<t.length&&p+f<t.length,g=Math.min(p+f,t.length),_=[],v=0;m&&v++,h&&v++;let y=p+ +!!m,b=g-+!!h;for(let n=y;n<b;n++){let i=j(r(t[n],n===e),c,{hard:!0,trim:!1}).split(`
|
|
19
|
+
`);_.push(i),v+=i.length}if(v>d){let t=0,n=0,r=v,i=e-y,a=(e,t)=>Ze(_,r,e,t,d);m?({lineCount:r,removals:t}=a(0,i),r>d&&({lineCount:r,removals:n}=a(i+1,_.length))):({lineCount:r,removals:n}=a(i+1,_.length),r>d&&({lineCount:r,removals:t}=a(0,i))),t>0&&(m=!0,_.splice(0,t)),n>0&&(h=!0,_.splice(_.length-n,n))}let x=[];m&&x.push(u);for(let e of _)for(let t of e)x.push(t);return h&&x.push(u),x},z=e=>{let t=e.active??`Yes`,r=e.inactive??`No`;return new ke({active:t,inactive:r,signal:e.signal,input:e.input,output:e.output,initialValue:e.initialValue??!0,render(){let i=e.withGuide??N.withGuide,a=`${Ye(this.state)} `,o=i?`${(0,n.styleText)(`gray`,L)} `:``,s=De(e.output,e.message,o,a),c=`${i?`${(0,n.styleText)(`gray`,L)}
|
|
20
|
+
`:``}${s}
|
|
21
|
+
`,l=this.value?t:r;switch(this.state){case`submit`:return`${c}${i?`${(0,n.styleText)(`gray`,L)} `:``}${(0,n.styleText)(`dim`,l)}`;case`cancel`:return`${c}${i?`${(0,n.styleText)(`gray`,L)} `:``}${(0,n.styleText)([`strikethrough`,`dim`],l)}${i?`
|
|
22
|
+
${(0,n.styleText)(`gray`,L)}`:``}`;default:{let a=i?`${(0,n.styleText)(`cyan`,L)} `:``,o=i?(0,n.styleText)(`cyan`,R):``;return`${c}${a}${this.value?`${(0,n.styleText)(`green`,Re)} ${t}`:`${(0,n.styleText)(`dim`,ze)} ${(0,n.styleText)(`dim`,t)}`}${e.vertical?i?`
|
|
23
|
+
${(0,n.styleText)(`cyan`,L)} `:`
|
|
24
|
+
`:` ${(0,n.styleText)(`dim`,`/`)} `}${this.value?`${(0,n.styleText)(`dim`,ze)} ${(0,n.styleText)(`dim`,r)}`:`${(0,n.styleText)(`green`,Re)} ${r}`}
|
|
25
|
+
${o}
|
|
26
|
+
`}}}}).prompt()},B={message:(e=[],{symbol:t=(0,n.styleText)(`gray`,L),secondarySymbol:r=(0,n.styleText)(`gray`,L),output:i=process.stdout,spacing:a=1,withGuide:o}={})=>{let s=[],c=o??N.withGuide,l=c?r:``,u=c?`${t} `:``,d=c?`${r} `:``;for(let e=0;e<a;e++)s.push(l);let f=Array.isArray(e)?e:e.split(`
|
|
27
|
+
`);if(f.length>0){let[e,...n]=f;e.length>0?s.push(`${u}${e}`):s.push(c?t:``);for(let e of n)e.length>0?s.push(`${d}${e}`):s.push(c?r:``)}i.write(`${s.join(`
|
|
28
|
+
`)}
|
|
29
|
+
`)},info:(e,t)=>{B.message(e,{...t,symbol:(0,n.styleText)(`blue`,Ge)})},success:(e,t)=>{B.message(e,{...t,symbol:(0,n.styleText)(`green`,Ke)})},step:(e,t)=>{B.message(e,{...t,symbol:(0,n.styleText)(`green`,I)})},warn:(e,t)=>{B.message(e,{...t,symbol:(0,n.styleText)(`yellow`,qe)})},warning:(e,t)=>{B.warn(e,t)},error:(e,t)=>{B.message(e,{...t,symbol:(0,n.styleText)(`red`,Je)})}},$e=(e=``,t)=>{let r=t?.output??process.stdout,i=t?.withGuide??N.withGuide?`${(0,n.styleText)(`gray`,R)} `:``;r.write(`${i}${(0,n.styleText)(`red`,e)}
|
|
30
|
+
|
|
31
|
+
`)},et=(e=``,t)=>{let r=t?.output??process.stdout,i=t?.withGuide??N.withGuide?`${(0,n.styleText)(`gray`,L)}
|
|
32
|
+
${(0,n.styleText)(`gray`,R)} `:``;r.write(`${i}${e}
|
|
33
|
+
|
|
34
|
+
`)},tt=e=>(0,n.styleText)(`dim`,e),nt=(e,t,n)=>{let r={hard:!0,trim:!1},i=j(e,t,r).split(`
|
|
35
|
+
`),a=i.reduce((e,t)=>Math.max(A(t),e),0);return j(e,t-(i.map(n).reduce((e,t)=>Math.max(A(t),e),0)-a),r)},rt=(e=``,t=``,i)=>{let a=i?.output??r.default.stdout,o=i?.withGuide??N.withGuide,s=i?.format??tt,c=[``,...nt(e,Te(a)-6,s).split(`
|
|
36
|
+
`).map(s),``],l=A(t),u=Math.max(c.reduce((e,t)=>{let n=A(t);return n>e?n:e},0),l)+2,d=c.map(e=>`${(0,n.styleText)(`gray`,L)} ${e}${` `.repeat(u-A(e))}${(0,n.styleText)(`gray`,L)}`).join(`
|
|
37
|
+
`),f=o?`${(0,n.styleText)(`gray`,L)}
|
|
38
|
+
`:``,p=o?He:We;a.write(`${f}${(0,n.styleText)(`green`,I)} ${(0,n.styleText)(`reset`,t)} ${(0,n.styleText)(`gray`,Be.repeat(Math.max(u-l-1,1))+Ve)}
|
|
39
|
+
${d}
|
|
40
|
+
${(0,n.styleText)(`gray`,p+Be.repeat(u+2)+Ue)}
|
|
41
|
+
`)},it=e=>(0,n.styleText)(`magenta`,e),at=({indicator:e=`dots`,onCancel:t,output:r=process.stdout,cancelMessage:i,errorMessage:a,frames:o=Ne?[`◒`,`◐`,`◓`,`◑`]:[`•`,`o`,`O`,`0`],delay:s=Ne?80:120,signal:c,...l}={})=>{let u=Pe(),d,f,p=!1,m=!1,h=``,g,_=performance.now(),v=Te(r),y=l?.styleFrame??it,b=e=>{let n=e>1?a??N.messages.error:i??N.messages.cancel;m=e===1,p&&(D(n,e),m&&typeof t==`function`&&t())},x=()=>b(2),S=()=>b(1),C=()=>{process.on(`uncaughtExceptionMonitor`,x),process.on(`unhandledRejection`,x),process.on(`SIGINT`,S),process.on(`SIGTERM`,S),process.on(`exit`,b),c&&c.addEventListener(`abort`,S)},ee=()=>{process.removeListener(`uncaughtExceptionMonitor`,x),process.removeListener(`unhandledRejection`,x),process.removeListener(`SIGINT`,S),process.removeListener(`SIGTERM`,S),process.removeListener(`exit`,b),c&&c.removeEventListener(`abort`,S)},w=()=>{if(g===void 0)return;u&&r.write(`
|
|
42
|
+
`);let e=j(g,v,{hard:!0,trim:!1}).split(`
|
|
43
|
+
`);e.length>1&&r.write(M.cursor.up(e.length-1)),r.write(M.cursor.to(0)),r.write(M.erase.down())},te=e=>e.replace(/\.+$/,``),T=e=>{let t=(performance.now()-e)/1e3,n=Math.floor(t/60),r=Math.floor(t%60);return n>0?`[${n}m ${r}s]`:`[${r}s]`},E=l.withGuide??N.withGuide,ne=(t=``)=>{p=!0,d=we({output:r}),h=te(t),_=performance.now(),E&&r.write(`${(0,n.styleText)(`gray`,L)}
|
|
44
|
+
`);let i=0,a=0;C(),f=setInterval(()=>{if(u&&h===g)return;w(),g=h;let t=y(o[i]),n;if(u)n=`${t} ${h}...`;else if(e===`timer`)n=`${t} ${h} ${T(_)}`;else{let e=`.`.repeat(Math.floor(a)).slice(0,3);n=`${t} ${h}${e}`}let s=j(n,v,{hard:!0,trim:!1});r.write(s),i=i+1<o.length?i+1:0,a=a<4?a+.125:0},s)},D=(t=``,i=0,a=!1)=>{if(!p)return;p=!1,clearInterval(f),w();let o=i===0?(0,n.styleText)(`green`,I):i===1?(0,n.styleText)(`red`,Ie):(0,n.styleText)(`red`,Le);h=t??h,a||(e===`timer`?r.write(`${o} ${h} ${T(_)}
|
|
45
|
+
`):r.write(`${o} ${h}
|
|
46
|
+
`)),ee(),d()};return{start:ne,stop:(e=``)=>D(e,0),message:(e=``)=>{h=te(e??h)},cancel:(e=``)=>D(e,1),error:(e=``)=>D(e,2),clear:()=>D(``,0,!0),get isCancelled(){return m}}},ot=(e,t)=>e.includes(`
|
|
47
|
+
`)?e.split(`
|
|
48
|
+
`).map(e=>t(e)).join(`
|
|
49
|
+
`):t(e),V=e=>{let t=(e,t)=>{let r=e.label??String(e.value);switch(t){case`disabled`:return`${(0,n.styleText)(`gray`,ze)} ${ot(r,e=>(0,n.styleText)(`gray`,e))}${e.hint?` ${(0,n.styleText)(`dim`,`(${e.hint??`disabled`})`)}`:``}`;case`selected`:return`${ot(r,e=>(0,n.styleText)(`dim`,e))}`;case`active`:return`${(0,n.styleText)(`green`,Re)} ${r}${e.hint?` ${(0,n.styleText)(`dim`,`(${e.hint})`)}`:``}`;case`cancelled`:return`${ot(r,e=>(0,n.styleText)([`strikethrough`,`dim`],e))}`;default:return`${(0,n.styleText)(`dim`,ze)} ${ot(r,e=>(0,n.styleText)(`dim`,e))}`}};return new Ae({options:e.options,signal:e.signal,input:e.input,output:e.output,initialValue:e.initialValue,render(){let r=e.withGuide??N.withGuide,i=`${Ye(this.state)} `,a=`${Xe(this.state)} `,o=De(e.output,e.message,a,i),s=`${r?`${(0,n.styleText)(`gray`,L)}
|
|
50
|
+
`:``}${o}
|
|
51
|
+
`;switch(this.state){case`submit`:{let i=r?`${(0,n.styleText)(`gray`,L)} `:``;return`${s}${De(e.output,t(this.options[this.cursor],`selected`),i)}`}case`cancel`:{let i=r?`${(0,n.styleText)(`gray`,L)} `:``;return`${s}${De(e.output,t(this.options[this.cursor],`cancelled`),i)}${r?`
|
|
52
|
+
${(0,n.styleText)(`gray`,L)}`:``}`}default:{let i=r?`${(0,n.styleText)(`cyan`,L)} `:``,a=r?(0,n.styleText)(`cyan`,R):``,o=s.split(`
|
|
53
|
+
`).length,c=r?2:1;return`${s}${i}${Qe({output:e.output,cursor:this.cursor,options:this.options,maxItems:e.maxItems,columnPadding:i.length,rowPadding:o+c,style:(e,n)=>t(e,e.disabled?`disabled`:n?`active`:`inactive`)}).join(`
|
|
54
|
+
${i}`)}
|
|
55
|
+
${a}
|
|
56
|
+
`}}}}).prompt()},st=`${(0,n.styleText)(`gray`,L)} `,H={message:async(e,{symbol:t=(0,n.styleText)(`gray`,L)}={})=>{process.stdout.write(`${(0,n.styleText)(`gray`,L)}
|
|
57
|
+
${t} `);let r=3;for await(let t of e){t=t.replace(/\n/g,`
|
|
58
|
+
${st}`),t.includes(`
|
|
59
|
+
`)&&(r=3+(0,n.stripVTControlCharacters)(t.slice(t.lastIndexOf(`
|
|
60
|
+
`))).length);let e=(0,n.stripVTControlCharacters)(t).length;r+e<process.stdout.columns?(r+=e,process.stdout.write(t)):(process.stdout.write(`
|
|
61
|
+
${st}${t.trimStart()}`),r=3+(0,n.stripVTControlCharacters)(t.trimStart()).length)}process.stdout.write(`
|
|
62
|
+
`)},info:e=>H.message(e,{symbol:(0,n.styleText)(`blue`,Ge)}),success:e=>H.message(e,{symbol:(0,n.styleText)(`green`,Ke)}),step:e=>H.message(e,{symbol:(0,n.styleText)(`green`,I)}),warn:e=>H.message(e,{symbol:(0,n.styleText)(`yellow`,qe)}),warning:e=>H.warn(e),error:e=>H.message(e,{symbol:(0,n.styleText)(`red`,Je)})},ct=e=>new je({validate:e.validate,placeholder:e.placeholder,defaultValue:e.defaultValue,initialValue:e.initialValue,output:e.output,signal:e.signal,input:e.input,render(){let t=e?.withGuide??N.withGuide,r=`${`${t?`${(0,n.styleText)(`gray`,L)}
|
|
63
|
+
`:``}${Ye(this.state)} `}${e.message}
|
|
64
|
+
`,i=e.placeholder?(0,n.styleText)(`inverse`,e.placeholder[0])+(0,n.styleText)(`dim`,e.placeholder.slice(1)):(0,n.styleText)([`inverse`,`hidden`],`_`),a=this.userInput?this.userInputWithCursor:i,o=this.value??``;switch(this.state){case`error`:{let e=this.error?` ${(0,n.styleText)(`yellow`,this.error)}`:``,i=t?`${(0,n.styleText)(`yellow`,L)} `:``,o=t?(0,n.styleText)(`yellow`,R):``;return`${r.trim()}
|
|
65
|
+
${i}${a}
|
|
66
|
+
${o}${e}
|
|
67
|
+
`}case`submit`:{let e=o?` ${(0,n.styleText)(`dim`,o)}`:``;return`${r}${t?(0,n.styleText)(`gray`,L):``}${e}`}case`cancel`:{let e=o?` ${(0,n.styleText)([`strikethrough`,`dim`],o)}`:``,i=t?(0,n.styleText)(`gray`,L):``;return`${r}${i}${e}${o.trim()?`
|
|
68
|
+
${i}`:``}`}default:return`${r}${t?`${(0,n.styleText)(`cyan`,L)} `:``}${a}
|
|
69
|
+
${t?(0,n.styleText)(`cyan`,R):``}
|
|
70
|
+
`}}}).prompt();var lt=class{info(e){process.stdout.write(`${S.default.blue(`ℹ ${e}`)}\n`)}warn(e){process.stderr.write(`${S.default.yellow(`⚠ ${e}`)}\n`)}error(e){process.stderr.write(`${S.default.red(`✘ ${e}`)}\n`)}success(e){process.stdout.write(`${S.default.green(`✔ ${e}`)}\n`)}step(e){process.stdout.write(`○ ${e}\n`)}note(e,t){rt(e,t)}log(e){process.stdout.write(`${e}\n`)}spinner(){return at()}json(e){process.stdout.write(`${JSON.stringify(e,null,2)}\n`)}cancel(e){process.stderr.write(`${S.default.red(`✘ ${e}`)}\n`)}fatal(e,t){if(process.stderr.write(`${S.default.red(`✘ ${e}`)}\n`),t){let e=`${S.default.red(t instanceof Error?t.stack??String(t):String(t))}\n`;process.stderr.write(e)}throw t instanceof Error?t:Error(e)}refuse(e){}finish(e,t){et(e)}async flush(){return new Promise(e=>{process.stderr.write(``,()=>e())})}},ut=class{constructor(e){this.options=e,this.originalStdoutWrite=process.stdout.write,e.isJson?this.reporter=new ee:e.isQuiet?this.reporter=new w:this.reporter=new lt}debug(e){this.reporter.log(e)}info(e){this.reporter.info(e)}warn(e){this.reporter.warn(e)}error(e){this.reporter.error(e)}success(e){this.reporter.success(e)}step(e){this.reporter.step(e)}note(e,t){this.reporter.note(e,t)}log(e){this.reporter.log(e)}spinner(){return this.reporter.spinner()}json(e){this.reporter.json(e)}get stdio(){return this.options.isJson?[process.stdin,process.stderr,process.stderr]:`inherit`}interactiveStdout(e){!this.options.isJson||this.options.isYes||(e?process.stdout.write=process.stderr.write.bind(process.stderr):process.stdout.write=this.originalStdoutWrite)}cancel(e){this.reporter.cancel(e)}fatal(e,t){this.reporter.fatal(e,t)}refuse(e){this.reporter.refuse(e)}finish(e,t){this.reporter.finish(e,t)}async flush(){await this.reporter.flush()}};function dt(e){return e instanceof Error?e.stack??e.message:String(e)}function ft(e,t,n){e(`${t}: ${n instanceof Error?n.message:String(n)}`),n instanceof Error&&n.stack&&e(n.stack)}const pt={debug:0,info:1,warn:2,error:3},mt=new Set([`debug`,`info`,`warn`,`error`,`silent`]);function ht(e){if(!e)return;let t=e.trim().toLowerCase();if(mt.has(t))return t}function gt(){if(!(typeof process>`u`))return ht(process.env?.ARKENV_LOG_LEVEL)}function _t(e){return e?.level??gt()??`info`}function vt(e,t){return e===`silent`?!1:pt[t]>=pt[e]}function yt(e,t,n){return(r,...i)=>{vt(e,t)&&console[n](r,...i)}}function bt(e){let t=_t(e);return{debug:yt(t,`debug`,`debug`),info:yt(t,`info`,`info`),warn:yt(t,`warn`,`warn`),error:yt(t,`error`,`error`)}}let xt=bt();const St=`[ArkEnv]`,Ct=`[ArkEnv Watcher]`;function wt(e){return{logBuildWarning(t){e.warn(`⚠️ ${St} ${t}`)},logBuildError(t){e.error(`❌ ${St} ${t}`)},logBuildErrorDetail(t){e.error(t)},logBuildErrorBlankLine(){e.error(``)},logBuildErrorWithCause(t,n){e.error(`❌ ${St} ${t}`),e.error(dt(n))},logWatcherError(t){e.error(`${Ct} ${t}`)},logWatcherErrorWithCause(t,n){e.error(`${Ct} ${t}`),e.error(dt(n))}}}let Tt=wt(xt);function Et(e,t){Tt.logBuildErrorWithCause(e,t)}var Dt=e.n({safeAppend:()=>kt});const Ot=`// @arkenv-types`;async function kt(e,t,n,r){try{let r=await s.default.readFile(e,`utf-8`),i=n===`vite`?`ImportMetaEnvAugmented`:`ProcessEnvAugmented`;if(r.includes(Ot)||r.includes(i))return!1;let a=o.default.dirname(e),c=o.default.relative(a,t).replace(/\.(ts|js|tsx|jsx)$/,``).split(o.default.sep).join(`/`),l=c.startsWith(`.`)?c:`./${c}`,u=n===`vite`?At(l):jt(l),d=r.endsWith(`
|
|
71
|
+
`)?``:`
|
|
72
|
+
`;return await s.default.appendFile(e,`${d}\n${Ot}\n${u}\n`,`utf-8`),!0}catch(t){let n=`Failed to append to ${e}`;return r?ft(r.error.bind(r),n,t):Et(n,t),!1}}function At(e){return c.default`
|
|
73
|
+
type ImportMetaEnvAugmented = import("@arkenv/vite-plugin").ImportMetaEnvAugmented<
|
|
74
|
+
typeof import("${e}").Env
|
|
75
|
+
>;
|
|
76
|
+
|
|
77
|
+
interface ImportMetaEnv extends ImportMetaEnvAugmented {}
|
|
78
|
+
|
|
79
|
+
interface ImportMeta {
|
|
80
|
+
readonly env: ImportMetaEnv;
|
|
81
|
+
}
|
|
82
|
+
`}function jt(e){return c.default`
|
|
83
|
+
type ProcessEnvAugmented = import("@arkenv/bun-plugin").ProcessEnvAugmented<
|
|
84
|
+
typeof import("${e}").Env
|
|
85
|
+
>;
|
|
86
|
+
|
|
87
|
+
declare namespace NodeJS {
|
|
88
|
+
interface ProcessEnv extends ProcessEnvAugmented {}
|
|
89
|
+
}
|
|
90
|
+
`}async function Mt(e,t){for(let n of t)try{return await s.default.access(o.default.join(e,n)),!0}catch{}return!1}async function Nt(e=process.cwd(),t){if(t?.compilerOptions?.types){let e=t.compilerOptions.types;if(e.includes(`vite`)||e.includes(`vite/client`))return`vite`}try{let t=o.default.join(e,`package.json`),n=await s.default.readFile(t,`utf-8`),r=JSON.parse(n),i={...r.dependencies,...r.devDependencies};if(i.vite)return`vite`;if(i.next)return`nextjs`;if(i.nuxt)return`nuxt`}catch{}return await Mt(e,[`vite.config.ts`,`vite.config.js`])?`vite`:await Mt(e,[`next.config.ts`,`next.config.js`,`next.config.mjs`,`next.config.cjs`])?`nextjs`:await Mt(e,[`nuxt.config.ts`,`nuxt.config.js`,`nuxt.config.mts`,`nuxt.config.mjs`,`nuxt.config.cjs`])?`nuxt`:(await Pt(e,t)).length>0?`bun-fullstack`:`vanilla`}async function Pt(e=process.cwd(),t){let n=[];try{let t=o.default.join(e,`bunfig.toml`),r=await s.default.readFile(t,`utf-8`);(r.includes(`[serve]`)||r.includes(`[serve.static]`))&&n.push(`serve`),r.includes(`[build]`)&&n.push(`build`)}catch{}if(n.includes(`serve`)&&n.includes(`build`))return n;let{walk:r}=await Promise.resolve().then(()=>Lt),i=await r(e),a=n.includes(`serve`),c=n.includes(`build`);for(let e of i)try{let t=await s.default.readFile(e,`utf-8`);if(!a&&(t.includes(`Bun.serve`)||t.includes(`serve(`))&&(/from\s+['"]bun['"]/.test(t)||t.includes(`Bun.serve`))&&(a=!0,n.push(`serve`)),!c&&(t.includes(`Bun.build`)||t.includes(`build(`))&&(/from\s+['"]bun['"]/.test(t)||t.includes(`Bun.build`))&&(c=!0,n.push(`build`)),a&&c)break}catch{}return n}async function Ft(e=process.cwd(),t){let n=process.env.npm_config_user_agent?.toString()||``;if(n.includes(`pnpm`))return`pnpm`;if(n.includes(`yarn`))return`yarn`;if(n.includes(`bun`))return`bun`;if(n.includes(`npm`))return`npm`;let r=t?.path?o.default.dirname(t.path):e;for(;r!==o.default.parse(r).root;){try{let e=o.default.join(r,`package.json`),t=await s.default.readFile(e,`utf-8`),n=JSON.parse(t);if(n.packageManager){if(n.packageManager.startsWith(`pnpm`))return`pnpm`;if(n.packageManager.startsWith(`yarn`))return`yarn`;if(n.packageManager.startsWith(`bun`))return`bun`}}catch{}let e=[];try{e=await s.default.readdir(r)}catch{}if(e.includes(`pnpm-lock.yaml`))return`pnpm`;if(e.includes(`yarn.lock`))return`yarn`;if(e.includes(`bun.lockb`))return`bun`;if(e.includes(`package-lock.json`))return`npm`;r=o.default.dirname(r)}return`npm`}async function It(e=process.cwd(),t){let n=t;if(!n){let{findTsConfig:t,loadTsConfig:r}=await Promise.resolve().then(()=>Ut),i=await t(e);i&&(n=await r(i))}if(n?.compilerOptions?.rootDir){let t=n.compilerOptions.rootDir,r=o.default.relative(e,t);return r&&r!==`.`&&!r.startsWith(`..`)&&!o.default.isAbsolute(r)?`./${r}/env.ts`:`./env.ts`}try{return await s.default.access(o.default.join(e,`src`)),`./src/env.ts`}catch{return`./env.ts`}}var Lt=e.n({getEnvExampleKeys:()=>Ht,parseEnvExample:()=>zt,resolveImportPaths:()=>Bt,scanProjectEnvKeys:()=>Vt,walk:()=>Rt});async function Rt(e,t=[]){try{let n=await s.default.readdir(e,{withFileTypes:!0});for(let r of n)if(r.isDirectory()){let n=r.name;if(n===`node_modules`||n===`dist`||n===`build`||n===`.git`||n===`.turbo`||n===`scratch`)continue;await Rt(o.default.join(e,n),t)}else r.isFile()&&/\.(ts|tsx|js|jsx)$/.test(r.name)&&!r.name.endsWith(`.d.ts`)&&t.push(o.default.join(e,r.name))}catch{}return t}function zt(e){let t=[],n=e.split(/\r?\n/);for(let e of n){let n=e.trim();if(!n||n.startsWith(`#`))continue;let r=n.match(/^([A-Z_][A-Z0-9_]*)\s*=/i);r?.[1]&&t.push(r[1])}return Array.from(new Set(t))}function Bt(e,t,n){if(e.startsWith(`.`))return[o.default.resolve(o.default.dirname(n),e)];if(o.default.isAbsolute(e))return[e];let r=t.compilerOptions||{},i=r.baseUrl||o.default.dirname(t.path),a=r.paths||{},s=[];for(let[e,t]of Object.entries(a)){let n=e.endsWith(`*`),r=e.replace(/\*$/,``);s.push({cleanPattern:r,targets:Array.isArray(t)?t:[t],hadStar:n})}s.sort((e,t)=>t.cleanPattern.length-e.cleanPattern.length);for(let{cleanPattern:t,targets:n,hadStar:r}of s)if(r&&e.startsWith(t)||!r&&e===t){let r=e.slice(t.length);return n.map(e=>{let t=`${e.replace(/\*$/,``)}${r}`;return o.default.resolve(i,t)})}return r.baseUrl?[o.default.resolve(i,e)]:[]}async function Vt(e,t,n){let r=[],i=await Rt(e),a=n?n.replace(/\.(ts|js|tsx|jsx)$/,``):null;for(let e of i)try{let n=await s.default.readFile(e,`utf-8`),i=n.matchAll(/process\.env\.([A-Z_][A-Z0-9_]*)/g);for(let e of i)e[1]&&r.push(e[1]);let c=n.matchAll(/import\.meta\.env\.([A-Z_][A-Z0-9_]*)/g);for(let e of c)e[1]&&r.push(e[1]);if(a){let i=n.matchAll(/import\s+[^;]*from\s+['"]([^'"]+)['"]/g);for(let s of i){let i=s[1],c=[];if(t?c=Bt(i,t,e):i.startsWith(`.`)&&(c=[o.default.resolve(o.default.dirname(e),i)]),c.some(e=>e.replace(/\.(ts|js|tsx|jsx)$/,``)===a)){let e=n.matchAll(/\benv\.([A-Z_][A-Z0-9_]*)/g);for(let t of e)t[1]&&r.push(t[1])}}}}catch{}return Array.from(new Set(r))}async function Ht(e=process.cwd(),t,n){let r=o.default.join(e,`.env.example`);try{let e=zt(await s.default.readFile(r,`utf-8`));if(e.length>0)return{keys:e,source:`.env.example`}}catch{}let i=await Vt(e,t,n);return i.length>0?{keys:i,source:`project`}:null}var Ut=e.n({checkTsConfig:()=>Kt,findTsConfig:()=>Gt,loadTsConfig:()=>U});const Wt=(0,u.createRequire)(require(`url`).pathToFileURL(__filename).href).resolve;async function Gt(e=process.cwd()){let t=[`tsconfig.app.json`,`tsconfig.json`,`tsconfig.base.json`,`tsconfig.node.json`],n=e;for(;n!==o.default.parse(n).root;){for(let e of t){let t=o.default.join(n,e);try{return await s.default.access(t),t}catch{}}n=o.default.dirname(n)}return null}async function U(e,t=new Set){let n=o.default.resolve(e);if(t.has(n))throw Error(`Circular extends dependency detected in tsconfig.json: ${n}`);t.add(n);let r=``;try{r=await s.default.readFile(e,`utf-8`)}catch{return{path:e,compilerOptions:{}}}let i=(0,d.parse)(r)||{},a=i.compilerOptions||{},c={};if(i.extends){let n=Array.isArray(i.extends)?i.extends:[i.extends];for(let r of n){let n;if(r.startsWith(`.`)||o.default.isAbsolute(r))n=o.default.resolve(o.default.dirname(e),r);else try{n=Wt(r,{paths:[o.default.dirname(e)]})}catch{n=o.default.resolve(o.default.dirname(e),`node_modules`,r)}let i={...(await U(n,t)).compilerOptions};i.baseUrl&&=o.default.resolve(o.default.dirname(n),i.baseUrl),i.rootDir&&=o.default.resolve(o.default.dirname(n),i.rootDir),c={...c,...i}}}let l={...a};return l.baseUrl&&=o.default.resolve(o.default.dirname(e),l.baseUrl),l.rootDir&&=o.default.resolve(o.default.dirname(e),l.rootDir),c={...c,...l},{...i,path:e,compilerOptions:c}}async function Kt(e=process.cwd()){let t=await Gt(e);if(!t)return{status:`not_found`};let n=o.default.basename(t);try{let e=await U(t);return e?.compilerOptions?.strict===!0?{status:`strict`,file:n,parsed:e}:{status:`not_strict`,file:n,parsed:e}}catch{return{status:`not_found`}}}function qt(e,t){let n=e.replace(/^v/,``).split(`.`).map(Number),r=t.replace(/^v/,``).split(`.`).map(Number);for(let e=0;e<3;e++){let t=n[e]||0,i=r[e]||0;if(t>i)return 1;if(t<i)return-1}return 0}function Jt(e){let t=e.trim().match(/^v?(\d+)(?:\.(\d+))?(?:\.(\d+))?/);return t?[t[1],t[2]??`0`,t[3]??`0`].join(`.`):null}function Yt(e,t){let n=e.trim(),r=n.match(/^[\^~]?\s*(v?\d+(?:\.\d+){0,2})$/);if(r){let e=Jt(r[1]);return e!==null&&qt(e,t)>=0}let i=n.match(/(?:>=|>|<=|<|=)\s*v?\d+(?:\.\d+){0,2}/g);return!i||i.join(` `)!==n.replace(/\s+/g,` `)?!1:i.some(e=>{let n=e.match(/^(>=|>|<=|<|=)\s*(v?\d+(?:\.\d+){0,2})$/);if(!n)return!1;let[,r,i]=n,a=Jt(i);return a&&(r===`>=`||r===`>`||r===`=`)?qt(a,t)>=0:!1})}async function Xt(e=process.cwd()){let t=[],n=process.version,r=`22.0.0`;qt(n,r)===-1?t.push({status:`fail`,requirement:`Node.js Version`,message:`Node.js version must be >= ${r}.`,current:n,expected:`>= ${r}`}):t.push({status:`pass`,requirement:`Node.js Version`,message:`Node.js version is compatible.`});let i=null;try{let n=o.default.join(e,`package.json`),r=await s.default.readFile(n,`utf-8`);i=JSON.parse(r),t.push({status:`pass`,requirement:`package.json`,message:`package.json found.`})}catch{t.push({status:`warn`,requirement:`package.json`,message:`package.json not found in the current directory.`})}if(i){let e={...i.dependencies,...i.devDependencies}.typescript,n=`5.1.0`;e?Yt(e,n)?t.push({status:`pass`,requirement:`TypeScript Version`,message:`TypeScript version is compatible.`}):t.push({status:`fail`,requirement:`TypeScript Version`,message:`TypeScript version should be >= ${n}.`,current:e,expected:`>= ${n}`}):t.push({status:`warn`,requirement:`TypeScript Version`,message:`TypeScript not found in package.json dependencies.`})}let a=await Kt(e);if(a.status===`not_found`)t.push({status:`warn`,requirement:`tsconfig.json`,message:`tsconfig.json not found.`});else{let e=a.parsed.compilerOptions||{};e.strict===!0?t.push({status:`pass`,requirement:`TypeScript Strict Mode`,message:`Strict mode is enabled.`}):t.push({status:`fail`,requirement:`TypeScript Strict Mode`,message:`Strict mode must be enabled.`,current:`false`,expected:`true`});let n=e.moduleResolution?.toLowerCase(),r=e.module?.toLowerCase();[`bundler`,`node16`,`nodenext`].includes(n||``)||!n&&(r===`node16`||r===`nodenext`)?t.push({status:`pass`,requirement:`TypeScript moduleResolution`,message:`moduleResolution is set to ${n||`implicit`}.`}):t.push({status:`fail`,requirement:`TypeScript moduleResolution`,message:`moduleResolution must be set to 'bundler', 'node16', or 'nodenext'.`,current:n||`default`,expected:`bundler, node16, or nodenext`})}return t}var Zt=class{constructor(e){this.logger=e}async isEmptyDirectory(e=process.cwd()){try{return(await s.default.readdir(e)).length===0}catch{return!1}}async hasPackageJson(e=process.cwd()){try{return await s.default.access(o.default.join(e,`package.json`)),!0}catch{return!1}}async findTsConfig(e=process.cwd()){return Gt(e)}async loadTsConfig(e,t=new Set){return U(e,t)}async getEnvExampleKeys(e=process.cwd(),t,n){return Ht(e,t,n)}async suggestDefaultEnvPath(e=process.cwd(),t){return It(e,t)}async checkTsConfig(e=process.cwd()){return Kt(e)}async checkRequirements(e=process.cwd()){return Xt(e)}async detectFramework(e=process.cwd(),t){return Nt(e,t)}async detectBunFeatures(e=process.cwd(),t){return Pt(e,t)}async detectPackageManager(e=process.cwd(),t){return Ft(e,t)}async hasSkill(e=process.cwd()){try{let t=o.default.join(e,`skills-lock.json`),n=await s.default.readFile(t,`utf-8`),r=JSON.parse(n);if(r&&typeof r==`object`&&r.skills&&typeof r.skills==`object`&&`arkenv`in r.skills)return!0}catch{}for(let t of[`skills/arkenv/SKILL.md`,`.agent/skills/arkenv/SKILL.md`,`.agents/skills/arkenv/SKILL.md`])try{return await s.default.access(o.default.join(e,t)),!0}catch{}return!1}async checkGitStatus(e=process.cwd()){try{return(0,l.execSync)(`git status --porcelain`,{cwd:e,encoding:`utf-8`}).trim().length===0?{status:`clean`}:{status:`dirty`}}catch(e){let t=e;return t.code===`ENOENT`?(this.logger?.log(`Git is not installed on this system. Skipping git status check.`),{status:`not_a_repo`}):typeof t.stderr==`string`&&t.stderr.includes(`not a git repository`)?{status:`not_a_repo`}:{status:`unknown`}}}};const W=e=>S.default.cyan(e),Qt=S.default.blue(`⛯`),$t=e=>c.default`
|
|
91
|
+
/// <reference types="vite/client" />
|
|
92
|
+
|
|
93
|
+
type ImportMetaEnvAugmented =
|
|
94
|
+
import("@arkenv/vite-plugin").ImportMetaEnvAugmented<
|
|
95
|
+
typeof import("./${o.default.basename(e).replace(/\.(ts|js|tsx|jsx)$/,``)}").Env
|
|
96
|
+
>;
|
|
97
|
+
|
|
98
|
+
interface ImportMetaEnv extends ImportMetaEnvAugmented {}
|
|
99
|
+
|
|
100
|
+
interface ImportMeta {
|
|
101
|
+
readonly env: ImportMetaEnv;
|
|
102
|
+
}
|
|
103
|
+
`,en=e=>c.default`
|
|
104
|
+
/// <reference types="bun-types" />
|
|
105
|
+
|
|
106
|
+
type ProcessEnvAugmented = import("@arkenv/bun-plugin").ProcessEnvAugmented<
|
|
107
|
+
typeof import("./${o.default.basename(e).replace(/\.(ts|js|tsx|jsx)$/,``)}").Env
|
|
108
|
+
>;
|
|
109
|
+
|
|
110
|
+
declare namespace NodeJS {
|
|
111
|
+
interface ProcessEnv extends ProcessEnvAugmented {}
|
|
112
|
+
}
|
|
113
|
+
`,G={nextjs:{id:`nextjs`,packageName:`@arkenv/nextjs`,clientPrefix:`NEXT_PUBLIC_`,displayName:`Next.js`,supportsWrapNextjsConfig:!0},nuxt:{id:`nuxt`,packageName:`@arkenv/nuxt`,clientPrefix:`NUXT_PUBLIC_`,displayName:`Nuxt`,supportsWrapNextjsConfig:!1}};function tn(e){if(e===`nextjs`||e===`nuxt`)return G[e]}function nn(e){return e===`nextjs`||e===`nuxt`}const K={nextjs:G.nextjs.clientPrefix,nuxt:G.nuxt.clientPrefix,vite:`VITE_`,"bun-fullstack":`BUN_PUBLIC_`,vanilla:``};function rn(e){let{typeFilePath:t,typeFileExists:n,envDtsHandling:r,templateContent:i,appendContent:a,overwriteLabel:o,appendLabel:s}=e;return r===`skip`?[]:r===`append`||!r&&n?[{path:t,content:a,action:`append`,label:s}]:[{path:t,content:i,action:n?`overwrite`:`create`,label:o}]}function an(e,t){let n=tn(e.framework);return{framework:e.framework,clientPrefix:K[e.framework],...n?.packageName!==void 0&&{packageName:n.packageName},disableCodegen:e.disableCodegen===!0,...e.layout!==void 0&&{layout:e.layout},...t!==void 0&&{nextjsImportPath:t},...e.hostPreset!==void 0&&{hostPreset:e.hostPreset}}}const on={NODE_ENV:`development`,PORT:`3000`,DATABASE_URL:`postgres://localhost:5432/mydb`},sn=`generated`;function cn(e){let t={};for(let n of e)t[n]=on[n]??``;return t}function ln(e,t,n){if(!n)return;let r=((n.compilerOptions||{}).paths||{})[`@/*`];if(!r)return;let i=n.path?o.default.dirname(n.path):e,a=o.default.relative(i,t).replace(/\\/g,`/`);for(let e of r){let t=e.replace(/^\.\//,``).replace(/\*$/,``);if(t===``||a.startsWith(t)){let e=a;return t!==``&&a.startsWith(t)&&(e=a.substring(t.length)),e=e.replace(/^\/+/,``).replace(/\/+$/,``),`@/${e}/env.gen`.replace(/\/+/g,`/`)}}}function un(e,t,n){if(!(!nn(n.framework)||n.disableCodegen||!e.tsConfig?.parsed))return ln(e.cwd,t,e.tsConfig.parsed)}function dn(e,t){return un(e,o.default.join(e.targetDir,sn),t)}function fn(e,t,n){return un(e,o.default.join(t,sn),n)}function pn(e,t,n,r){let i=an(t,r),a=e.getSimpleTemplate(t.envKeys??[],i),o=n.existingFiles.includes(n.targetPath);return!o||t.overwriteEnvSchemaFile!==!1?[{path:n.targetPath,content:a,action:o?`overwrite`:`create`,label:`environment schema`}]:[]}function mn(e,t,n,r){let i=o.default.extname(n.targetPath),a=n.targetPath.slice(0,-i.length),s=o.default.join(a,`internal`,`shared${i}`),c=o.default.join(a,`client${i}`),l=o.default.join(a,`server${i}`),u=an(t,r),d=e.getStrictTemplates(t.envKeys??[],u),f=n.existingFiles.includes(s),p=n.existingFiles.includes(c),m=n.existingFiles.includes(l),h=[];return(!f||t.overwriteEnvSchemaFile!==!1)&&h.push({path:s,content:d.shared,action:f?`overwrite`:`create`,label:`shared environment schema`}),(!p||t.overwriteEnvSchemaFile!==!1)&&h.push({path:c,content:d.client,action:p?`overwrite`:`create`,label:`client environment schema`}),(!m||t.overwriteEnvSchemaFile!==!1)&&h.push({path:l,content:d.server,action:m?`overwrite`:`create`,label:`server environment schema`}),h}const hn={clientPrefix:K[`bun-fullstack`],getEnvDefaults(e){return e&&e.length>0?cn(e):{BUN_PUBLIC_API_URL:`https://api.example.com`,NODE_ENV:`development`}},getDependencies(e){return e.bunFeatures?.length?[`@arkenv/bun-plugin`]:[]},requiresArktypePeer(e){return!!e.bunFeatures?.length},bootstrap(e){return(0,t.shake)({framework:`bun-fullstack`,bunFeatures:e.bunFeatures})},getSchemaFiles(e,t,n){return pn(e,t,n)},getTypeDefinitionFiles(e,t){if(!e.bunFeatures?.length||e.installTypeDefinitions===!1)return[];let n=o.default.join(t.targetDir,`bun-env.d.ts`);return rn({typeFilePath:n,typeFileExists:t.existingFiles.includes(n),envDtsHandling:e.envDtsHandling,templateContent:en(e.path),appendContent:t.targetPath,overwriteLabel:`bun-fullstack types`,appendLabel:`${e.framework} types`})}};function gn(e){let{id:n,packageName:r,clientPrefix:i,supportsWrapNextjsConfig:a}=e,s=`${i}API_URL`;return{clientPrefix:i,getEnvDefaults(e){return e&&e.length>0?cn(e):{DATABASE_URL:`postgres://localhost:5432/mydb`,[s]:`https://api.example.com`,NODE_ENV:`development`}},getDependencies(){return[r]},requiresArktypePeer(){return!0},bootstrap(e){return(0,t.shake)({framework:n,...a&&{wrapNextjsConfig:e.wrapNextjsConfig!==!1},disableCodegen:e.disableCodegen})},getSchemaFiles(e,t,n){if(t.layout===`strict`){let r=o.default.extname(n.targetPath);return mn(e,t,n,fn(n,n.targetPath.slice(0,-r.length),t))}return pn(e,t,n,dn(n,t))},getTypeDefinitionFiles(){return[]}}}const _n=gn(G.nextjs),vn=gn(G.nuxt),yn={clientPrefix:K.vanilla,getEnvDefaults(e){return e&&e.length>0?cn(e):{PORT:`3000`,NODE_ENV:`development`}},getDependencies(){return[]},requiresArktypePeer(){return!1},bootstrap(){},getSchemaFiles(e,t,n){return pn(e,t,n)},getTypeDefinitionFiles(){return[]}},bn={vite:{clientPrefix:K.vite,getEnvDefaults(e){return e&&e.length>0?cn(e):{PORT:`3000`,VITE_API_URL:`https://api.example.com`}},getDependencies(){return[`@arkenv/vite-plugin`]},requiresArktypePeer(){return!0},bootstrap(e){return(0,t.shake)({framework:`vite`})},getSchemaFiles(e,t,n){return pn(e,t,n)},getTypeDefinitionFiles(e,t){return e.installTypeDefinitions===!1?[]:rn({typeFilePath:o.default.join(t.targetDir,`vite-env.d.ts`),typeFileExists:t.existingFiles.includes(o.default.join(t.targetDir,`vite-env.d.ts`)),envDtsHandling:e.envDtsHandling,templateContent:$t(e.path),appendContent:t.targetPath,overwriteLabel:`vite types`,appendLabel:`${e.framework} types`})}},"bun-fullstack":hn,nextjs:_n,nuxt:vn,vanilla:yn},q={vercel:{label:`Vercel`,hint:`Add VERCEL, VERCEL_ENV, VERCEL_URL, etc.`,serverOnlyKeys:[`VERCEL`],clientExposedKeys:[`VERCEL_ENV`,`VERCEL_URL`],fields:{VERCEL:{type:`string`},VERCEL_ENV:{type:`enum`,values:[`production`,`preview`,`development`]},VERCEL_URL:{type:`string`}}},netlify:{label:`Netlify`,hint:`Add NETLIFY, CONTEXT, URL, DEPLOY_URL, etc.`,serverOnlyKeys:[`NETLIFY`,`DEPLOY_URL`],clientExposedKeys:[`CONTEXT`,`URL`],fields:{NETLIFY:{type:`string`},DEPLOY_URL:{type:`string`},CONTEXT:{type:`enum`,values:[`production`,`deploy-preview`,`branch-deploy`]},URL:{type:`string`}}},cloudflare:{label:`Cloudflare Pages/Workers`,hint:`Add CF_PAGES, CF_PAGES_COMMIT_SHA, CF_PAGES_BRANCH, CF_PAGES_URL, etc.`,serverOnlyKeys:[`CF_PAGES`,`CF_PAGES_COMMIT_SHA`],clientExposedKeys:[`CF_PAGES_BRANCH`,`CF_PAGES_URL`],fields:{CF_PAGES:{type:`string`},CF_PAGES_COMMIT_SHA:{type:`string`},CF_PAGES_BRANCH:{type:`string`},CF_PAGES_URL:{type:`string`}}},railway:{label:`Railway`,hint:`Add RAILWAY_ENVIRONMENT_NAME, RAILWAY_PUBLIC_DOMAIN, RAILWAY_GIT_COMMIT_SHA, etc.`,serverOnlyKeys:[`RAILWAY_ENVIRONMENT_NAME`,`RAILWAY_PUBLIC_DOMAIN`,`RAILWAY_SERVICE_NAME`,`RAILWAY_GIT_COMMIT_SHA`],clientExposedKeys:[],fields:{RAILWAY_ENVIRONMENT_NAME:{type:`string`},RAILWAY_PUBLIC_DOMAIN:{type:`string`},RAILWAY_SERVICE_NAME:{type:`string`},RAILWAY_GIT_COMMIT_SHA:{type:`string`}}},render:{label:`Render`,hint:`Add RENDER, RENDER_SERVICE_ID, RENDER_SERVICE_TYPE, RENDER_EXTERNAL_URL, etc.`,serverOnlyKeys:[`RENDER`,`RENDER_SERVICE_ID`,`RENDER_SERVICE_TYPE`,`RENDER_EXTERNAL_URL`],clientExposedKeys:[],fields:{RENDER:{type:`string`},RENDER_SERVICE_ID:{type:`string`},RENDER_SERVICE_TYPE:{type:`string`},RENDER_EXTERNAL_URL:{type:`string`}}},fly:{label:`Fly.io`,hint:`Add FLY_APP_NAME, FLY_REGION, FLY_ALLOC_ID, etc.`,serverOnlyKeys:[`FLY_APP_NAME`,`FLY_REGION`,`FLY_ALLOC_ID`],clientExposedKeys:[],fields:{FLY_APP_NAME:{type:`string`},FLY_REGION:{type:`string`},FLY_ALLOC_ID:{type:`string`}}}};function xn(e){return e===`none`||Object.keys(q).includes(e)}function Sn(e){return Object.keys(q).includes(e)}function J(e,t){if(e===`none`)return[];let n=q[e],r=[...n.serverOnlyKeys,...n.clientExposedKeys];if(t)for(let e of n.clientExposedKeys)r.push(`${t}${e}`);return r}function Cn(e,t){if(e===`none`)return{clientKeys:[],serverKeys:[]};let n=q[e],r=[...n.serverOnlyKeys,...n.clientExposedKeys],i=[];if(t)for(let e of n.clientExposedKeys)i.push(`${t}${e}`);return{clientKeys:i,serverKeys:r}}function wn(e,t,n){if(!n||n===`none`)return;let r=t&&e.startsWith(t)?e.slice(t.length):e,i=q[n].fields;return r in i?i[r]:void 0}function Tn(e,t,n){let r=J(t??`none`,n);if(!(!e?.length&&r.length===0))return Array.from(new Set([...e??[],...r]))}function En(e,t){return t.type===`string`?e.formatOptionalString():e.formatOptionalEnum(t.values)}function Y(e,t,n,r){let i=wn(t,n,r);if(i)return En(e,i)}const Dn={formatOptionalString(){return`"string?"`},formatOptionalEnum(e){return`"'${e.join(`' | '`)}'?"`},formatStrictField(e,t,n=``,r=void 0){if(t===`shared`)return`${e}: "'development' | 'production' | 'test' = 'development'",`;if(t===`server`&&e===`PORT`)return`PORT: "number.port = 3000",`;let i=Y(Dn,e,n,r);return i?`${e}: ${i},`:`${e}: "string?",`},formatCodegenField(e,t,n=``,r=void 0){if(t===`shared`)return`${e}: "'development' | 'production' | 'test' = 'development'",`;let i=Y(Dn,e,n,r);return i?`${e}: ${i},`:`${e}: "string?",`},defaultSimpleSchemaFields:` NODE_ENV: "'development' | 'production' | 'test' = 'development'",
|
|
114
|
+
PORT: "number.port = 3000",`,formatSimpleSchemaFields(e,t=``,n=void 0){return e.map(e=>`\t\t${e}: ${Y(Dn,e,t,n)??`"string?"`},`).join(`
|
|
115
|
+
`)},getDefaultStrictFields(e){let t=`${e}API_URL`;return{serverFields:[`DATABASE_URL: "string = 'postgres://localhost:5432/mydb'",`],clientFields:[`${t}: "string = 'https://api.example.com'",`],sharedFields:[`NODE_ENV: "'development' | 'production' | 'test' = 'development'",`],runtimeEnvFields:[`${t}: process.env.${t},`,`NODE_ENV: process.env.NODE_ENV,`]}},getDefaultCodegenFields(e){return{serverFields:[` DATABASE_URL: "string = 'postgres://localhost:5432/mydb'",`],clientFields:[`\t\t${e}API_URL: "string = 'https://api.example.com'",`],sharedFields:[` NODE_ENV: "'development' | 'production' | 'test' = 'development'",`]}},sharedImports:`import { type } from "@arkenv/core";`,wrapSharedSchema(e){return`type(${e})`},strictExtraImports:``,assembleVanilla(e){return c.default`
|
|
116
|
+
import arkenv, { type } from "@arkenv/core";
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Environment variable schema for server-side or runtime-only validation.
|
|
120
|
+
*/
|
|
121
|
+
export const Env = type({
|
|
122
|
+
${e}
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
export const env = arkenv(Env);
|
|
126
|
+
`},pluginEnvImports:`import { type } from "@arkenv/core";`},On={extraImport:`import * as v from "valibot";`,formatOptionalString(){return`v.optional(v.string())`},formatOptionalEnum(e){return`v.optional(v.picklist([${e.map(e=>`"${e}"`).join(`, `)}]))`},formatStrictField(e,t,n=``,r=void 0){if(t===`shared`)return`${e}: v.optional(v.picklist(["development", "production", "test"]), "development"),`;if(t===`server`&&e===`PORT`)return`PORT: v.optional(v.pipe(v.string(), v.transform(Number), v.number(), v.integer(), v.minValue(1), v.maxValue(65535)), 3000),`;let i=Y(On,e,n,r);return i?`${e}: ${i},`:`${e}: v.optional(v.string()),`},formatCodegenField(e,t,n=``,r=void 0){if(t===`shared`)return`${e}: v.optional(v.picklist(["development", "production", "test"]), "development"),`;let i=Y(On,e,n,r);return i?`${e}: ${i},`:`${e}: v.optional(v.string()),`},defaultSimpleSchemaFields:` NODE_ENV: v.optional(v.picklist(["development", "production", "test"]), "development"),
|
|
127
|
+
PORT: v.optional(v.pipe(v.string(), v.transform(Number), v.number(), v.integer(), v.minValue(1), v.maxValue(65535)), 3000),`,formatSimpleSchemaFields(e,t=``,n=void 0){return e.map(e=>`\t\t${e}: ${Y(On,e,t,n)??`v.optional(v.string())`},`).join(`
|
|
128
|
+
`)},getDefaultStrictFields(e){let t=`${e}API_URL`;return{serverFields:[`DATABASE_URL: v.optional(v.pipe(v.string(), v.url()), "postgres://localhost:5432/mydb"),`],clientFields:[`${t}: v.optional(v.pipe(v.string(), v.url()), "https://api.example.com"),`],sharedFields:[`NODE_ENV: v.optional(v.picklist(["development", "production", "test"]), "development"),`],runtimeEnvFields:[`${t}: process.env.${t},`,`NODE_ENV: process.env.NODE_ENV,`]}},getDefaultCodegenFields(e){return{serverFields:[` DATABASE_URL: v.optional(v.pipe(v.string(), v.url()), "postgres://localhost:5432/mydb"),`],clientFields:[`\t\t${e}API_URL: v.optional(v.pipe(v.string(), v.url()), "https://api.example.com"),`],sharedFields:[` NODE_ENV: v.optional(v.picklist(["development", "production", "test"]), "development"),`]}},sharedImports:`import * as v from "valibot";`,wrapSharedSchema(e){return`v.object(${e})`},strictExtraImports:`import * as v from "valibot";
|
|
129
|
+
`,assembleVanilla(e){return c.default`
|
|
130
|
+
import arkenv from "@arkenv/standard";
|
|
131
|
+
import * as v from "valibot";
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Environment variable schema for server-side or runtime-only validation.
|
|
135
|
+
*/
|
|
136
|
+
export const env = arkenv({
|
|
137
|
+
${e}
|
|
138
|
+
});
|
|
139
|
+
`},pluginEnvImports:`import { type } from "@arkenv/core";
|
|
140
|
+
import * as v from "valibot";`},kn={extraImport:`import { z } from "zod";`,formatOptionalString(){return`z.string().optional()`},formatOptionalEnum(e){return`z.enum([${e.map(e=>`"${e}"`).join(`, `)}]).optional()`},formatStrictField(e,t,n=``,r=void 0){if(t===`shared`)return`${e}: z.enum(["development", "production", "test"]).default("development"),`;if(t===`server`&&e===`PORT`)return`PORT: z.coerce.number().int().min(1).max(65535).default(3000),`;let i=Y(kn,e,n,r);return i?`${e}: ${i},`:`${e}: z.string().optional(),`},formatCodegenField(e,t,n=``,r=void 0){if(t===`shared`)return`${e}: z.enum(["development", "production", "test"]).default("development"),`;let i=Y(kn,e,n,r);return i?`${e}: ${i},`:`${e}: z.string().optional(),`},defaultSimpleSchemaFields:` NODE_ENV: z.enum(["development", "production", "test"]).default("development"),
|
|
141
|
+
PORT: z.coerce.number().int().min(1).max(65535).default(3000),`,formatSimpleSchemaFields(e,t=``,n=void 0){return e.map(e=>`\t\t${e}: ${Y(kn,e,t,n)??`z.string().optional()`},`).join(`
|
|
142
|
+
`)},getDefaultStrictFields(e){let t=`${e}API_URL`;return{serverFields:[`DATABASE_URL: z.string().url().default("postgres://localhost:5432/mydb"),`],clientFields:[`${t}: z.string().url().default("https://api.example.com"),`],sharedFields:[`NODE_ENV: z.enum(["development", "production", "test"]).default("development"),`],runtimeEnvFields:[`${t}: process.env.${t},`,`NODE_ENV: process.env.NODE_ENV,`]}},getDefaultCodegenFields(e){return{serverFields:[` DATABASE_URL: z.string().url().default("postgres://localhost:5432/mydb"),`],clientFields:[`\t\t${e}API_URL: z.string().url().default("https://api.example.com"),`],sharedFields:[` NODE_ENV: z.enum(["development", "production", "test"]).default("development"),`]}},sharedImports:`import { z } from "zod";`,wrapSharedSchema(e){return`z.object(${e})`},strictExtraImports:`import { z } from "zod";
|
|
143
|
+
`,assembleVanilla(e){return c.default`
|
|
144
|
+
import arkenv from "@arkenv/standard";
|
|
145
|
+
import { z } from "zod";
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Environment variable schema for server-side or runtime-only validation.
|
|
149
|
+
*/
|
|
150
|
+
export const env = arkenv({
|
|
151
|
+
${e}
|
|
152
|
+
});
|
|
153
|
+
`},pluginEnvImports:`import { type } from "@arkenv/core";
|
|
154
|
+
import { z } from "zod";`},An={arktype:Dn,zod:kn,valibot:On};function jn(e){return e.replace(/import\s*\{([^\n}]*)\}\s*from/g,(e,t)=>`import { ${t.trim()} } from`)}function Mn(e,t){return t.endsWith(`
|
|
155
|
+
`)&&!e.endsWith(`
|
|
156
|
+
`)?`${e}\n`:e}function Nn(e){try{let t=(0,f.parseModule)(e.code),n=e.code,r=t.exports.default;if(r&&typeof r==`object`&&`$type`in r&&r.$type===`function-call`){let e=r;if((e.$callee||JSON.stringify(r))===`defineConfig`&&e.$args){let t=e.$args[0];if(t&&typeof t==`object`&&`$type`in t&&(t.$type===`arrow-function-expression`||t.$type===`function-expression`))return{success:!1,updated:!1,error:`The 'defineConfig' callback form is currently not supported for automatic mutation. Please add the plugin manually.`};r=t}}if(!r||typeof r!=`object`||typeof r==`object`&&`$type`in r)return{success:!1,updated:!1,error:`Could not find default export object in Vite config`};if(r.plugins||=[],Array.isArray(r.plugins))if(!/\barkenv(?:Vite)?Plugin\b/.test(n))t.imports.$add({from:`@arkenv/vite-plugin`,local:`arkenvVitePlugin`,imported:`default`}),e.envImportPath&&t.imports.$add({from:e.envImportPath,imported:`Env`}),r.plugins.push(`__ARK_PLUGIN_PLACEHOLDER__`);else return{success:!0,updated:!1};else return{success:!1,updated:!1,error:`The 'plugins' property in your Vite config is not an array.`};let i=(0,f.generateCode)(t,{format:(0,f.detectCodeFormat)(n)}).code,a=e.envImportPath?`arkenvVitePlugin(Env)`:`arkenvVitePlugin()`;return i=i.replace(/['"]__ARK_PLUGIN_PLACEHOLDER__['"]/g,a),i=jn(i),i=Mn(i,n),{success:!0,updated:!0,code:i}}catch(e){return{success:!1,updated:!1,error:`Failed to parse Vite config: ${e instanceof Error?e.message:String(e)}`}}}function Pn(e){try{let t=e.code;if(/module\.exports\b/.test(t))return{success:!1,updated:!1,error:"CommonJS is not supported for automatic mutation. Please wrap your config with `withArkEnv` manually."};let n=(0,f.parseModule)(t);if(!n.exports.default)return{success:!1,updated:!1,error:`Could not find default export in Next.js config`};if(typeof n.exports.default==`object`&&`$type`in n.exports.default&&n.exports.default.$type===`function-call`&&n.exports.default.$callee===`withArkEnv`||/\bwithArkEnv\b/.test(t))return{success:!0,updated:!1};n.imports.$add({from:`@arkenv/nextjs/config`,imported:`withArkEnv`}),e.disableCodegen?n.exports.default=f.builders.functionCall(`withArkEnv`,n.exports.default,{codegen:!1}):n.exports.default=f.builders.functionCall(`withArkEnv`,n.exports.default);let r=(0,f.generateCode)(n,{format:(0,f.detectCodeFormat)(t)}).code;return r=jn(r),r=Mn(r,t),{success:!0,updated:!0,code:r}}catch(e){return{success:!1,updated:!1,error:`Failed to parse Next.js config: ${e instanceof Error?e.message:String(e)}`}}}function Fn(e){try{let t=e.code,n=(0,f.parseModule)(t),r=n.exports.default;if(r&&typeof r==`object`&&`$type`in r&&r.$type===`function-call`){let e=r;(e.$callee||JSON.stringify(r))===`defineNuxtConfig`&&e.$args&&(r=e.$args[0])}if(!r||typeof r!=`object`||typeof r==`object`&&`$type`in r)return{success:!1,updated:!1,error:`Could not find default export object in Nuxt config`};if(r.modules||=[],Array.isArray(r.modules))if(!r.modules.includes(`@arkenv/nuxt/module`))r.modules.push(`@arkenv/nuxt/module`);else return{success:!0,updated:!1};else return{success:!1,updated:!1,error:`The 'modules' property in your Nuxt config is not an array.`};let i=(0,f.generateCode)(n,{format:(0,f.detectCodeFormat)(t)}).code;return i=jn(i),i=Mn(i,t),{success:!0,updated:!0,code:i}}catch(e){return{success:!1,updated:!1,error:`Failed to parse Nuxt config: ${e instanceof Error?e.message:String(e)}`}}}function X(e,t,n,r){let i=An[t];return Y(i,e,n,r)??i.formatOptionalString()}function In(e,t,n,r,i){let a=K[n],o=i??J(t,a),s={};for(let e of o)s[e]=X(e,r,a,t);try{let t=(0,f.parseModule)(e),n=t.exports.env||t.exports.Env||t.exports.SharedSchema;if(!n||n.$type!==`function-call`||n.$callee!==`arkenv`&&n.$callee!==`type`&&n.$callee!==`z.object`&&n.$callee!==`v.object`)return{success:!1,updated:!1,error:`Could not find arkenv or type schema call in env.ts`,proposedFields:s};let r=n.$args[0];if(!r||typeof r!=`object`||`$type`in r)return{success:!1,updated:!1,error:`Could not find schema object literal inside arkenv/type call`,proposedFields:s};let i=!1,a={};for(let e of o)if(!(e in r)){let t=`__ARK_PRESET_PLACEHOLDER_${e}__`;r[e]=t,a[t]=s[e],i=!0}if(!i)return{success:!0,updated:!1,code:e,proposedFields:s};let c=(0,f.generateCode)(t,{format:(0,f.detectCodeFormat)(e)}).code;for(let[e,t]of Object.entries(a))c=c.replace(RegExp(`['"]${e}['"]`,`g`),t);return c=jn(c),c=Mn(c,e),{success:!0,updated:!0,code:c,proposedFields:s}}catch(e){return{success:!1,updated:!1,error:`Failed to parse env.ts: ${e instanceof Error?e.message:String(e)}`,proposedFields:s}}}async function Ln(e=process.cwd()){for(let t of[`vite.config.ts`,`vite.config.js`,`vite.config.mts`,`vite.config.mjs`]){let n=o.default.resolve(e,t);try{return await s.default.access(n),n}catch{}}return null}async function Rn(e=process.cwd()){for(let t of[`bunfig.toml`,`bun.setup.ts`,`bun.setup.js`]){let n=o.default.resolve(e,t);try{return await s.default.access(n),n}catch{}}return null}async function zn(e=process.cwd()){for(let t of[`next.config.ts`,`next.config.js`,`next.config.mts`,`next.config.mjs`]){let n=o.default.resolve(e,t);try{return await s.default.access(n),n}catch{}}return null}async function Bn(e,t,n){try{let r=Pn({code:await e.readFile(t),disableCodegen:n});return r.success&&r.updated&&r.code&&await e.writeFile(t,r.code),r.success?r.updated===void 0?{success:!0}:{success:!0,updated:r.updated}:{success:!1,error:r.error}}catch(e){return{success:!1,error:e instanceof Error?e.message:String(e)}}}async function Vn(e=process.cwd()){for(let t of[`nuxt.config.ts`,`nuxt.config.js`,`nuxt.config.mts`,`nuxt.config.mjs`,`nuxt.config.cjs`]){let n=o.default.resolve(e,t);try{return await s.default.access(n),n}catch{}}return null}async function Hn(e,t){try{let n=Fn({code:await e.readFile(t)});return n.success&&n.updated&&n.code&&await e.writeFile(t,n.code),n.success?n.updated===void 0?{success:!0}:{success:!0,updated:n.updated}:{success:!1,error:n.error}}catch(e){return{success:!1,error:e instanceof Error?e.message:String(e)}}}async function Un(e,t,n){try{let r=Nn({code:await e.readFile(t),envImportPath:n});return r.success&&r.updated&&r.code&&await e.writeFile(t,r.code),r.success?r.updated===void 0?{success:!0}:{success:!0,updated:r.updated}:{success:!1,error:r.error}}catch(e){return{success:!1,error:e instanceof Error?e.message:String(e)}}}async function Wn(e,t){if(!t||t.length===0)return{success:!0,instructions:c.default`
|
|
157
|
+
${S.default.green(`✔`)} Use ${S.default.bold(`Vanilla`)} Bun runtime integration.
|
|
158
|
+
Access validated variables via your ${W(`env`)} object for typesafety.
|
|
159
|
+
Primarily used for ${S.default.cyan(`server-side`)} or runtime-only validation.
|
|
160
|
+
No plugins are required.
|
|
161
|
+
`};let n=t.includes(`serve`),r=t.includes(`build`),i=``;return n&&(i+=c.default`
|
|
162
|
+
${S.default.bold(`Bun Fullstack (Bun.serve) Integration:`)}
|
|
163
|
+
To inline environment variables (e.g. ${W(`PUBLIC_*`)}) in your ${S.default.cyan(`client-side`)} code, add the plugin to ${W(`bunfig.toml`)}:
|
|
164
|
+
|
|
165
|
+
[serve.static]
|
|
166
|
+
plugins = ["@arkenv/bun-plugin"]
|
|
167
|
+
|
|
168
|
+
`),r&&(i&&(i+=`
|
|
169
|
+
`),i+=c.default`
|
|
170
|
+
${S.default.bold(`Bun Fullstack programmatic bundling (Bun.build):`)}
|
|
171
|
+
To inline environment variables (e.g. ${W(`PUBLIC_*`)}) in your custom ${S.default.cyan(`client-side`)} build script, add the plugin to your ${W(`Bun.build`)} call:
|
|
172
|
+
|
|
173
|
+
${W(`import arkenv from "@arkenv/bun-plugin";`)}
|
|
174
|
+
|
|
175
|
+
await Bun.build({
|
|
176
|
+
entrypoints: ["./index.ts"],
|
|
177
|
+
outdir: "./dist",
|
|
178
|
+
${S.default.green(`plugins: [arkenv]`)}
|
|
179
|
+
});
|
|
180
|
+
`),{success:!0,instructions:i.trim()}}async function Gn(e,t){let n=t||await Gt();if(!n)return{status:`not_found`};let r=o.default.basename(n);try{let t=await e.readFile(n);if((0,d.parse)(t)?.compilerOptions?.strict===!0)return{status:`already_strict`,file:r};let i=(0,d.applyEdits)(t,(0,d.modify)(t,[`compilerOptions`,`strict`],!0,{formattingOptions:{insertSpaces:!0,tabSize:2}}));return await e.writeFile(n,i),{status:`updated`,file:r}}catch{return{status:`error`,file:r}}}var Kn=class{constructor(e,t,n){this.isQuiet=e,this.stdio=t,this.logger=n}async exists(e){try{return await s.default.access(e),!0}catch{return!1}}async readFile(e){return s.default.readFile(e,`utf-8`)}async writeFile(e,t){await s.default.writeFile(e,t,`utf-8`)}async mkdir(e,t){await s.default.mkdir(e,{recursive:t})}async execute(e,t=[],n){return new Promise((r,i)=>{let a=(0,l.spawn)(e,t,{cwd:n,stdio:this.isQuiet?`pipe`:this.stdio,shell:!1}),o=``,s=``,c=1e4;this.isQuiet&&(a.stdout?.on(`data`,e=>{o=(o+e.toString()).slice(-c)}),a.stderr?.on(`data`,e=>{s=(s+e.toString()).slice(-c)})),a.on(`close`,(e,t)=>{if(e===0)r();else{let n=e===null?`Command terminated by signal ${t}`:`Command failed with code ${e}`;this.isQuiet&&(o&&(n+=`\n${S.default.dim(`STDOUT:`)}\n${o}`),s&&(n+=`\n${S.default.red(`STDERR:`)}\n${s}`)),i(Error(n))}}),a.on(`error`,i)})}async updateTsConfigToStrict(e){return Gn(this,e)}async findViteConfig(e){return Ln(e)}async findBunConfig(e){return Rn(e)}async findNextjsConfig(e){return zn(e)}async findNuxtConfig(e){return Vn(e)}async bootstrapViteConfig(e,t){return Un(this,e,t)}async bootstrapBunConfig(e,t){return Wn(e,t)}async bootstrapNextjsConfig(e,t){return Bn(this,e,t)}async bootstrapNuxtConfig(e){return Hn(this,e)}async safeAppend(e,t,n){let{safeAppend:r}=await Promise.resolve().then(()=>Dt);return r(e,t,n,this.logger)}};async function qn(e){let t=e.defaultPath||`./src/env.ts`;if(e.hasEnvSchemaFile){let e=await z({message:S.default.yellow(`An existing ArkEnv configuration was found at ${W(t)}. Do you want to overwrite it?`),initialValue:!1,active:`Yes (override my configuration)`,inactive:`No (abort)`});return P(e)||!e?null:e}return!0}async function Jn(e){let t=e.detectedKeys,n=e.keysSource||`.env.example`;if(t&&t.length>0){let e=t.length,r=e===1,i=await z({message:n===`.env.example`?`Detected ${W(`.env.example`)} with ${e} ${r?`key`:`keys`}. Use ${r?`it`:`them`} for your schema?`:`Detected ${e} environment variable${r?``:`s`} used in your project. Use ${r?`it`:`them`} for your schema?`,active:`Yes (Recommended)`,initialValue:!0});return P(i)?null:i}return!1}async function Yn(e){if(e.framework===`vite`||e.framework===`bun-fullstack`){let t=e.framework===`vite`?`vite-env.d.ts`:`bun-env.d.ts`;if(e.hasTypeFile)return!0;let n=await z({message:`Establish ${W(t)} for typesafe environment variables?`,initialValue:!0,active:`Yes (Recommended)`,inactive:`No`});return P(n)?null:n}return!0}async function Xn(e){if(!e.installTypeDefinitions||e.framework!==`vite`&&e.framework!==`bun-fullstack`)return`skip`;let t=e.framework===`vite`?`vite-env.d.ts`:`bun-env.d.ts`;if(e.hasTypeFile){let e=await V({message:`Found existing ${W(t)}. How should we handle ArkEnv types?`,options:[{value:`append`,label:`Append types safely (if needed)`,hint:`Recommended`},{value:`overwrite`,label:`Overwrite entirely`,hint:`Destructive`},{value:`skip`,label:`Skip`}]});return P(e)?null:e}return`overwrite`}async function Zn(e){let t=await V({message:`Select an example:`,options:e.examples.map(e=>({value:e.id,label:e.name,...e.description?{hint:e.description}:{}}))});return P(t)?null:t}async function Qn(e){let t=await V({message:`Select your framework or build tool:`,initialValue:e.framework,options:[{value:`vanilla`,label:`Vanilla${e.framework===`vanilla`?` (Detected)`:``}`,hint:`Node.js, Bun, server-side or runtime-only validation`},{value:`vite`,label:`Vite${e.framework===`vite`?` (Detected)`:``}`,hint:`Client-side and static inlining validation`},{value:`bun-fullstack`,label:`Bun fullstack dev server${e.framework===`bun-fullstack`?` (Detected)`:``}`,hint:`Client-side bundling and Bun.serve integration`},{value:`nextjs`,label:`Next.js${e.framework===`nextjs`?` (Detected)`:``}`,hint:`Next.js App or Pages Router with build and runtime validation`},{value:`nuxt`,label:`Nuxt${e.framework===`nuxt`?` (Detected)`:``}`,hint:`Nuxt with build and runtime validation`}]});return P(t)?null:t}async function $n(e){let t=await z({message:`Optional: Would you also like to bootstrap a custom Bun.build script for programmatic bundling?`,initialValue:e.initialValue??!1});return P(t)?null:t}async function er(){let e=await V({message:`Select your preferred validator library:`,options:[{value:`arktype`,label:`ArkType (Recommended)`,hint:`TypeScript's 1:1 validator, optimized from editor to runtime`},{value:`zod`,label:`Zod`,hint:`TypeScript-first schema validation with static type inference`},{value:`valibot`,label:`Valibot`,hint:`The modular and type safe schema library`}]});return P(e)?null:e}async function tr(e){let t=await V({message:`How would you like to structure your environment variables?`,options:(e?.framework,[{value:`flat`,label:`Flat (Recommended)`,hint:`A single flat env.ts file for the best DX`},{value:`strict`,label:`Strict`,hint:`Separate shared, client, and server files for hard bundle boundaries.`}])});return P(t)?null:t}async function nr(e){let t=await z({message:`Enable automated ${e.framework===`nuxt`?`Nuxt`:`Next.js`} code generation for environment variables?`,initialValue:e.initialValue??!0,active:`Yes (Recommended)`,inactive:`No`});return P(t)?null:t}async function rr(e){let t=[{value:`none`,label:`None`,hint:`Do not add any hosting-specific environment variables`},...Object.entries(q).map(([e,t])=>({value:e,label:t.label,hint:t.hint}))],n=await V({message:`Select a hosting provider preset (optional):`,initialValue:e?.initialValue??`none`,options:t});return P(n)?null:n}async function ir(e){let t=await z({message:`Use default config path (${W(e.defaultEnvPath||`./src/env.ts`)})?`,initialValue:!0,active:`Yes (Recommended)`,inactive:`No, let me customize it`});return P(t)?null:t}async function ar(e){let t=e.defaultEnvPath||`./src/env.ts`;if(!e.useDefaultPath){let e=await ct({message:`Where should we create the ArkEnv config?`,placeholder:t,initialValue:t,defaultValue:t});if(P(e))return null;let n=typeof e==`string`?e.trim():``;return n===``?t:n}return t}const Z={example:Zn,overwriteEnvSchemaFile:qn,framework:Qn,bunBuild:$n,layout:tr,nextjsCodegen:nr,useDefaultPath:ir,path:ar,installTypeDefinitions:Yn,envDtsHandling:Xn,validator:er,hostPreset:rr,useEnvExample:Jn};async function or(e,t=!1){return(e?.mode||`existing`)===`new`?sr(e,t):cr(e,t)}async function sr(e,t=!1){let n=e?.examples||[],r=`arkenv-project`;try{let i;if(e?.name){let t=e.name.trim();i=t===`.`||t===`./`||o.default.resolve(process.cwd(),t)===process.cwd()?`.`:t}else if(t)i=r;else{let e=(Q(await ct({message:`Project name:`,placeholder:r,defaultValue:r}))||r).trim();i=e===`.`||e===`./`||o.default.resolve(process.cwd(),e)===process.cwd()?`.`:e}let a=e?.example;!a&&!t?a=Q(await Z.example({examples:n})):!a&&t&&(a=`basic`);let s=n.find(e=>e.id===a);if(!s){let e=n.map(e=>e.id).join(`, `);throw Error(`Unknown example ${a}. Available examples: ${e}`)}return{mode:`new`,example:s.id,name:i,path:`./src/env.ts`,validator:`arktype`,framework:s.framework,language:`ts`,installSkill:!1}}catch(e){if(e instanceof ur)return null;throw e}}async function cr(e,n=!1){let r=e?.defaultEnvPath||`./src/env.ts`,i=e?.envKeys||null,a=e?.envKeysSource||`.env.example`;if(n){let n=e?.framework||`vanilla`,a;(n===`nextjs`||n===`nuxt`)&&(a=e?.isStrict?`strict`:e?.isSimple?`simple`:(e?.isFlat,`flat`));let o=await lr(e,n,r),s;return(n===`vite`||n===`bun-fullstack`)&&(s=o?`append`:`overwrite`),(0,t.shake)({mode:`existing`,path:r,validator:`arktype`,framework:n,layout:a,bunFeatures:n===`bun-fullstack`?e?.bunFeatures??[`serve`]:void 0,language:`ts`,overwriteEnvSchemaFile:!0,installTypeDefinitions:n===`vite`||n===`bun-fullstack`,installSkill:!1,envDtsHandling:s,envKeys:i??void 0,disableCodegen:e?.disableCodegen??!1,wrapNextjsConfig:n===`nextjs`?!0:void 0,hostPreset:e?.hostPreset||`none`})}try{let n=Q(await Z.overwriteEnvSchemaFile({hasEnvSchemaFile:e?.hasEnvSchemaFile??!1,defaultPath:r})),o=Q(await Z.framework({framework:e?.framework})),s;(o===`nextjs`||o===`nuxt`)&&(s=e?.isStrict?`strict`:e?.isSimple?`simple`:e?.isFlat?`flat`:Q(await Z.layout({framework:o})));let c;if(o===`bun-fullstack`){let t=!!e?.bunFeatures?.includes(`build`);c=Q(await Z.bunBuild({initialValue:t}))}let l=e?.disableCodegen;o===`nuxt`?l=!0:o===`nextjs`&&l===void 0&&(l=!Q(await Z.nextjsCodegen({initialValue:!0,framework:o})));let u;if(o===`nextjs`&&!l){let e=await z({message:`Would you like to wrap your Next.js config with ${W(`withArkEnv`)}?`,initialValue:!0,active:`Yes (Recommended)`,inactive:`No`});if(P(e))throw $e(`Operation cancelled`),new ur;u=e}let d=Q(await Z.useDefaultPath({defaultEnvPath:r})),f=Q(await Z.path({useDefaultPath:d,defaultEnvPath:r})),p=await lr(e,o,f),m=Q(await Z.installTypeDefinitions({framework:o,hasTypeFile:p})),h=Q(await Z.envDtsHandling({framework:o,installTypeDefinitions:m,hasTypeFile:p})),g=Q(await Z.validator()),_=e?.hostPreset===void 0?Q(await Z.hostPreset({initialValue:e?.hostPreset})):e.hostPreset,v=Q(await Z.useEnvExample({detectedKeys:i,keysSource:a}));return(0,t.shake)({mode:`existing`,overwriteEnvSchemaFile:n,framework:o,layout:s,path:f,installTypeDefinitions:m,envDtsHandling:h,validator:g,hostPreset:_,bunFeatures:o===`bun-fullstack`?c?[`serve`,`build`]:[`serve`]:void 0,language:`ts`,installSkill:!1,envKeys:v?i??void 0:void 0,disableCodegen:l,wrapNextjsConfig:u})}catch(e){if(e instanceof ur)return null;throw e}}async function lr(e,t,n){return await e?.hasTypeFileAtPath?.({framework:t,envPath:n})??e?.hasTypeFile??!1}var ur=class extends Error{constructor(){super(`Operation cancelled`)}};function Q(e){if(e===null||P(e))throw $e(`Operation cancelled`),new ur;return e}var dr=class{async confirm(e,n=!0,r,i){let a=await z((0,t.shake)({message:e,initialValue:n,active:r,inactive:i}));return P(a)?null:a}async runWizard(e,t=!1){return or(e,t)}async select(e,t,n){let r=await V({message:e,options:t,initialValue:n});return P(r)?null:r}};const $={isYes:{long:`--yes`,short:`-y`,kind:`boolean`},isForce:{long:`--force`,short:`-f`,kind:`boolean`},isQuiet:{long:`--quiet`,short:`-q`,kind:`boolean`},isJson:{long:`--json`,short:`-j`,kind:`boolean`},isAgent:{long:`--agent`,short:``,kind:`boolean`},helpRequested:{long:`--help`,short:`-h`,kind:`boolean`},example:{long:`--example`,short:``,kind:`value`},isStrict:{long:`--strict`,short:``,kind:`boolean`},isSimple:{long:`--simple`,short:``,kind:`boolean`},isFlat:{long:`--flat`,short:``,kind:`boolean`},noCodegen:{long:`--no-codegen`,short:``,kind:`boolean`},hostPreset:{long:`--host-preset`,short:`-H`,kind:`value`}},fr=new Set(Object.values($).flatMap(e=>[e.long,e.short].filter(Boolean))),pr=new Set(Object.values($).filter(e=>e.kind===`value`).flatMap(e=>[e.long,e.short].filter(Boolean)));var mr=class{constructor(e,t={}){let n=e.slice(2),r=[],i=!1;for(let e of n){if(i){r.push(e),i=!1;continue}if(pr.has(e)){r.push(e),i=!0;continue}if(/^-[a-zA-Z]{2,}$/.test(e)){let t=e.slice(1).split(``);for(let e of t)r.push(`-${e}`);pr.has(`-${t[t.length-1]}`)&&(i=!0)}else r.push(e)}this.args=r,this.command=this.args[0];let a=1,o=[];for(this.validationError=void 0;a<this.args.length;){let e=this.args[a];if(e.startsWith(`-`)){if(!fr.has(e)){this.validationError=`Unknown argument: ${e}`;break}if(pr.has(e))if(a+1<this.args.length&&!this.args[a+1].startsWith(`-`))a+=2;else{this.validationError=`Missing value for option: ${e}`;break}else a+=1}else o.push(e),a+=1}if(!this.validationError){let e=$.hostPreset,t=this.getFlagValue(e.long,e.short);t!==void 0&&!xn(t)&&(this.validationError=`Invalid host preset: ${t}`)}if(this.positionalArgs=o,!this.validationError)if(this.command===`add`)if(!o[0])this.validationError=`Missing subcommand`;else if(o[0]!==`host`)this.validationError=`Unknown argument: ${o[0]}`;else if(o.length>2)this.validationError=`Unknown argument: ${o[2]}`;else{let e=o[1];e!==void 0&&!Sn(e)&&(this.validationError=`Invalid host preset: ${e}`)}else o.length>1?this.validationError=`Unknown argument: ${o[1]}`:this.name=o[0];this.logger=t.logger||new ut({isQuiet:this.isQuiet,isJson:this.isJson,isYes:this.isYes})}get isAgent(){return this.hasFlag(`isAgent`)}get isYes(){return this.isAgent||this.hasFlag(`isYes`)}get isQuiet(){return this.isAgent||this.hasFlag(`isQuiet`)}get isJson(){return this.isAgent||this.hasFlag(`isJson`)}get isForce(){return this.hasFlag(`isForce`)}get helpRequested(){return this.hasFlag(`helpRequested`)}get example(){let e=$.example;return this.getFlagValue(e.long,e.short)}get isStrict(){return this.hasFlag(`isStrict`)}get isSimple(){return this.hasFlag(`isSimple`)}get isFlat(){return this.hasFlag(`isFlat`)}get noCodegen(){return this.hasFlag(`noCodegen`)}get hostPreset(){let e=$.hostPreset,t=this.getFlagValue(e.long,e.short);if(t!==void 0&&xn(t))return t}hasFlag(e){let t=$[e];return this.args.includes(t.long)||!!t.short&&this.args.includes(t.short)}get initInput(){let e={isYes:this.isYes,isForce:this.isForce,isQuiet:this.isQuiet,isAgent:this.isAgent,isStrict:this.isStrict,isSimple:this.isSimple,isFlat:this.isFlat};return this.example!==void 0&&(e.example=this.example),this.name!==void 0&&(e.name=this.name),this.noCodegen&&(e.noCodegen=!0),this.hostPreset!==void 0&&(e.hostPreset=this.hostPreset),e}get addInput(){let e=this.positionalArgs[1],t=this.isYes;return e!==void 0&&Sn(e)?{provider:e,isYes:t}:{isYes:t}}getFlagValue(e,t){let n=this.args.findIndex(n=>n===e||n===t);if(n!==-1&&this.args[n+1]&&!this.args[n+1].startsWith(`-`))return this.args[n+1]}},hr=class{constructor(e,t,n,r){this.logger=e,this.workspace=t,this.prompt=n,this.scanner=r}async execute(e){this.logger.interactiveStdout(!0);try{let t=e.provider;if(!t)if(e.isYes)t=`vercel`;else{let e=await this.prompt.select(`Select a hosting provider preset:`,Object.entries(q).map(([e,t])=>({value:e,label:t.label,hint:t.hint})),`vercel`);if(e&&e!==`none`)t=e;else return!1}let n=process.cwd(),r=(await this.scanner.checkTsConfig(n)).parsed||null,i=await this.scanner.detectFramework(n,r),a=await this.scanner.suggestDefaultEnvPath(n,r),s=K[i],c=o.default.resolve(n,o.default.dirname(a),`env`),l=[...new Set([c,o.default.resolve(n,`env`),o.default.resolve(n,`src/env`)])],u=null;for(let e of l){let t=o.default.join(e,`client.ts`),n=o.default.join(e,`server.ts`);if(await this.workspace.exists(t)&&await this.workspace.exists(n)){u=e;break}}if(u){let e=o.default.join(u,`client.ts`),r=o.default.join(u,`server.ts`),a=o.default.relative(n,e),c=o.default.relative(n,r),{clientKeys:l,serverKeys:d}=Cn(t,s),f=await this.workspace.readFile(e),p=await this.workspace.readFile(r),m=gr(f),h=gr(p),g=In(f,t,i,m,l),_=In(p,t,i,h,d),v=()=>`// ${a}\n{\n${l.map(e=>`\t${e}: ${X(e,m,s,t)},`).join(`
|
|
181
|
+
`)}\n}\n\n// ${c}\n{\n${d.map(e=>`\t${e}: ${X(e,h,s,t)},`).join(`
|
|
182
|
+
`)}\n}`;if(!g.success||!g.code||!_.success||!_.code)return this.logger.error(`Failed to mutate strict layout schema files.`),this.logger.log(`
|
|
183
|
+
Please add the following environment variables to your schemas manually:
|
|
184
|
+
`),this.logger.log(v()),!0;let y=!1;g.updated&&(await this.workspace.writeFile(e,g.code),y=!0),_.updated&&(await this.workspace.writeFile(r,_.code),y=!0);let b=q[t].label;return y?this.logger.success(`Added ${b} environment variables to ${a} and ${c}`):this.logger.info(`All ${b} environment variables are already present in ${a} and ${c}`),!0}let d=[o.default.resolve(n,`env.ts`),o.default.resolve(n,`src/env.ts`),o.default.resolve(n,a)],f=null;for(let e of d)if(await this.workspace.exists(e)){f=e;break}let p=J(t,s),m=e=>p.map(n=>`\t${n}: ${X(n,e,s,t)},`).join(`
|
|
185
|
+
`);if(!f)return this.logger.error(`Could not locate your env.ts file.`),this.logger.log(`
|
|
186
|
+
Please add the following environment variables to your schema manually:
|
|
187
|
+
`),this.logger.log(`{\n${m(`arktype`)}\n}`),!0;let h=await this.workspace.readFile(f),g=gr(h),_=In(h,t,i,g),v=o.default.relative(n,f);return!_.success||!_.code?(this.logger.error(_.error||`Failed to mutate ${v}.`),this.logger.log(`
|
|
188
|
+
Please add the following environment variables to your schema manually:
|
|
189
|
+
`),this.logger.log(`{\n${m(g)}\n}`),!0):(_.updated?(await this.workspace.writeFile(f,_.code),this.logger.success(`Added ${q[t].label} environment variables to ${v}`)):this.logger.info(`All ${q[t].label} environment variables are already present in ${v}`),!0)}finally{this.logger.interactiveStdout(!1)}}};function gr(e){let t=e.replace(/\/\/.*/g,``).replace(/\/\*[\s\S]*?\*\//g,``);return/(?:^|\n)\s*import\s+[\s\S]*?from\s+['"]zod['"]/.test(t)?`zod`:/(?:^|\n)\s*import\s+[\s\S]*?from\s+['"]valibot['"]/.test(t)?`valibot`:`arktype`}var _r=`1.0.0-alpha.11`;function vr(e,t=2,n=4){let r=Math.max(...e.map(e=>e.left.length),0),i=` `.repeat(t);return e.map(e=>{let t=` `.repeat(r-e.left.length+n);return`${i}${e.left}${t}${e.right}`})}var yr=class{constructor(e){this.logger=e}async execute(){let e=[{left:`arkenv init [project-name]`,right:`Set up ArkEnv in your project`},{left:`arkenv add host [provider]`,right:`Add hosting provider preset (vercel, netlify, cloudflare, railway, render, fly) to schema`}],t=[{left:`--yes, -y`,right:`Skip prompts and use defaults (also passed to subprocesses)`},{left:`--quiet, -q`,right:`Quiet mode: Suppress output, capture logs on failure`},{left:`--json, -j`,right:`Output structured JSON to stdout`},{left:`--agent`,right:`Enable non-interactive, machine-readable mode for AI agents. Bypasses all prompts and outputs structured JSON. Macro for --yes --quiet --json`},{left:`--help, -h`,right:`Show this help message`}],n=[{left:`--example`,right:`Specify an example name when creating a new project`},{left:`--force, -f`,right:`Bypass technical requirement checks and dirty git working tree check, then force scaffolding`},{left:`--no-codegen`,right:`Disable automatic env.gen.ts code generation for Next.js`},{left:`--host-preset, -H <preset>`,right:`Specify a hosting provider preset (none, vercel, netlify, cloudflare, railway, render, fly)`}];this.logger.log(`ArkEnv CLI v${_r}`),this.logger.log(`\n${S.default.bold(`Usage:`)}`);for(let t of vr(e))this.logger.log(t);this.logger.log(`\n${S.default.bold(`Global options:`)}`);for(let e of vr(t))this.logger.log(e);this.logger.log(`\n${S.default.bold(`init options:`)}`);for(let e of vr(n))this.logger.log(e)}};async function br(e,t){let n=t.targetDir??process.cwd(),r=o.default.join(process.cwd(),`.arkenv-temp`);await e.mkdir(r,!0),t.targetDir&&await e.mkdir(n,!0);try{await e.execute(`git`,[`clone`,`--filter=blob:none`,`--sparse`,t.repository,r]);let i=`examples/${t.example}`;await e.execute(`git`,[`-C`,r,`sparse-checkout`,`set`,i]);let a=o.default.join(r,i),c=await s.default.readdir(a),l=[];for(let t of c){let r=o.default.join(n,t);await e.exists(r)&&l.push(t)}if(l.length>0)throw Error(`Scaffolding into a non-empty directory failed. The following paths already exist: ${l.join(`, `)}`);await xr(a,n);for(let e of[`package-lock.json`,`pnpm-lock.yaml`,`yarn.lock`,`bun.lockb`,`bun.lock`])await s.default.rm(o.default.join(n,e),{force:!0});let u=o.default.join(n,`package.json`);if(await e.exists(u)){let n=await e.readFile(u),r=JSON.parse(n);r.name=t.targetName,delete r.packageManager,await e.writeFile(u,JSON.stringify(r,null,2))}}finally{await s.default.rm(r,{recursive:!0,force:!0})}}async function xr(e,t){let n=await s.default.readdir(e);await Promise.all(n.map(n=>s.default.cp(o.default.join(e,n),o.default.join(t,n),{recursive:!0,force:!1})))}function Sr(e,t){let n=t.length>0;switch(e){case`pnpm`:return[`pnpm`,[n?`add`:`install`,...t]];case`yarn`:return[`yarn`,[n?`add`:`install`,...t]];case`bun`:return[`bun`,[n?`add`:`install`,...t]];default:return[`npm`,[`install`,...t]]}}function Cr(e,t,n){if(t||e.metadata.skillDetected){let t=e.metadata.framework===`nextjs`&&!e.metadata.disableCodegen,r=e.metadata.framework===`nuxt`&&!e.metadata.disableCodegen,i=t&&!n,a=c.default`
|
|
190
|
+
Inside your AI assistant (e.g. Claude Code), use:
|
|
191
|
+
${W(`/arkenv`)} - automatically refine your schema and configure integrations.
|
|
192
|
+
`;return i?(a+=`
|
|
193
|
+
|
|
194
|
+
`,a+=`Also, wrap your Next.js config with ${W(`withArkEnv`)}:\n`,a+=` ${W(`import { withArkEnv } from "@arkenv/nextjs/config";`)}\n`,e.metadata.layout===`strict`?(a+=` ${W(`export default withArkEnv(nextConfig);`)}\n`,a+=`Import and use: ${W(`import { env } from "${e.metadata.importPath}/client"`)} (client) or ${W(`import { env } from "${e.metadata.importPath}/server"`)} (server)\n`):(a+=` ${W(`export default withArkEnv(nextConfig);`)}\n`,a+=`Import and use: ${W(`import { env } from "${e.metadata.importPath}"`)}\n`)):r&&(a+=`
|
|
195
|
+
|
|
196
|
+
`,e.metadata.layout===`strict`?a+=`Import and use: ${W(`import { env } from "${e.metadata.importPath}/client"`)} (client) or ${W(`import { env } from "${e.metadata.importPath}/server"`)} (server)\n`:a+=`Import and use: ${W(`import { env } from "${e.metadata.importPath}"`)}\n`),{message:a,title:`Next steps`}}let r=e.skill?.dlxCommand.join(` `)||`npx`,i=e.skill?.packageName||`yamcodes/arkenv`,a=``,o=1,s=e.metadata.displayPath;if(e.metadata.layout===`strict`){let e=s.lastIndexOf(`.`),t=e===-1?s:s.slice(0,e);s=`${t}/client.ts, ${t}/server.ts, and ${t}/internal/shared.ts`}a+=`${o++}. Check ${W(s)} and refine your environment schema.\n`;let l=e.metadata.framework===`nextjs`&&!e.metadata.disableCodegen&&!n;return e.metadata.framework===`vite`?a+=`${o++}. Access via ${W(`import.meta.env.YOUR_VAR`)}\n`:e.metadata.framework===`bun-fullstack`?a+=`${o++}. Access via ${W(`process.env.YOUR_VAR`)}\n`:e.metadata.framework===`nextjs`?e.metadata.layout===`strict`?(e.metadata.disableCodegen||l&&(a+=`${o++}. Wrap your Next.js config with ${W(`withArkEnv`)} inside ${W(`next.config.ts`)}:\n`,a+=` ${W(`import { withArkEnv } from "@arkenv/nextjs/config";`)}\n`,a+=` ${W(`export default withArkEnv(nextConfig);`)}\n`),a+=`${o++}. Import and use: ${W(`import { env } from "${e.metadata.importPath}/client"`)} (client) or ${W(`import { env } from "${e.metadata.importPath}/server"`)} (server)\n`):(e.metadata.disableCodegen||l&&(a+=`${o++}. Wrap your Next.js config with ${W(`withArkEnv`)} inside ${W(`next.config.ts`)}:\n`,a+=` ${W(`import { withArkEnv } from "@arkenv/nextjs/config";`)}\n`,a+=` ${W(`export default withArkEnv(nextConfig);`)}\n`),a+=`${o++}. Import and use: ${W(`import { env } from "${e.metadata.importPath}"`)}\n`):e.metadata.framework===`nuxt`&&e.metadata.layout===`strict`?a+=`${o++}. Import and use: ${W(`import { env } from "${e.metadata.importPath}/client"`)} (client) or ${W(`import { env } from "${e.metadata.importPath}/server"`)} (server)\n`:a+=`${o++}. Import and use: ${W(`import { env } from "${e.metadata.importPath}"`)}\n`,a+=`${o++}. (Recommended) Install the AI skill: ${W(`${r} skills add ${i}`)}\n`,a+=` Then run ${W(`/arkenv`)} inside your AI assistant to finish.`,{message:a,title:`Next steps`}}const wr=[`esbuild`];var Tr=class{constructor(e,t){this.workspace=e,this.reporter=t}async execute(e){let t=this.reporter.spinner();t.start(`Scaffolding ArkEnv configuration...`);try{e.clone&&(t.stop(`Starting new project scaffolding...`),this.reporter.step(`Cloning example ${W(e.clone.example)}...`),await br(this.workspace,e.clone),t.start(`Scaffolding complete, finalizing...`));for(let t of e.files){if(t.action===`append`){if(!e.bootstrap||e.bootstrap.framework!==`vite`&&e.bootstrap.framework!==`bun-fullstack`){this.reporter.warn(`Skipping safe-append for ${W(o.default.basename(t.path))}: unsupported framework.`);continue}await this.workspace.safeAppend(t.path,t.content,e.bootstrap.framework)?this.reporter.info(`Appended ArkEnv types to ${W(o.default.basename(t.path))}.`):this.reporter.info(`${W(o.default.basename(t.path))} already contains ArkEnv types.`);continue}if(!(t.action===`create`&&await this.workspace.exists(t.path))&&(await this.workspace.mkdir(o.default.dirname(t.path),!0),await this.workspace.writeFile(t.path,t.content),t.label!==`environment schema`&&t.label?.includes(`types`))){let e=t.action===`overwrite`?`Updated`:`Created`;this.reporter.info(`${e} ${W(o.default.basename(t.path))} for typesafe environment variables.`)}}if(t.stop(`Configuration scaffolded!`),e.install&&process.env.SKIP_INSTALL!==`true`){e.install.packageManager===`pnpm`&&await this.configurePnpmBuilds(e.install.cwd??e.cwd),this.reporter.step(`Installing dependencies with ${W(e.install.packageManager)}...`);let[t,n]=Sr(e.install.packageManager,e.install.dependencies);await this.workspace.execute(t,n,e.install.cwd??e.cwd)}let n=!1;if(e.tsConfig){let t=await this.workspace.updateTsConfigToStrict(e.tsConfig.path);t.status===`updated`?(this.reporter.info(`Enforced strict: true in your ${W(t.file)}`),n=!0):t.status===`error`&&this.reporter.warn(`Could not automatically update ${W(t.file||`tsconfig.json`)}. Please ensure 'strict: true' is set manually.`)}let r=!1;if(e.bootstrap){if(e.bootstrap.framework===`vite`){let t=await this.workspace.findViteConfig(e.cwd);if(t){this.reporter.step(`Bootstrapping Vite plugin...`);let n=await this.workspace.bootstrapViteConfig(t,e.bootstrap.importPath||`./src/env`);n.success?n.updated&&this.reporter.info(`Updated ${W(o.default.basename(t))}`):(this.reporter.warn(`Could not automatically update ${W(o.default.basename(t))}: ${n.error}`),this.reporter.info(`Please add ${W(`@arkenv/vite-plugin`)} manually.`))}else this.reporter.info(`No Vite config found - please add ${W(`@arkenv/vite-plugin`)} to your Vite config manually.`)}else if(e.bootstrap.framework===`bun-fullstack`){let t=await this.workspace.findBunConfig(e.cwd),n=await this.workspace.bootstrapBunConfig(t,e.bootstrap.bunFeatures);n.success&&n.instructions?this.reporter.info(n.instructions):n.success||this.reporter.error(n.error||`Bun bootstrap failed`)}else if(e.bootstrap.framework===`nextjs`){if(!e.bootstrap.disableCodegen){this.reporter.step(`Generating Next.js environment bindings...`);let t=`import('@arkenv/nextjs/config').then(({ runCodegen }) => { const path = require('path'); const schemaPath = path.resolve(process.cwd(), '${e.metadata.displayPath}'); const outputPath = path.join(path.dirname(schemaPath), 'generated', 'env.gen.ts'); runCodegen(schemaPath, outputPath); }).catch(err => { console.error(err); process.exit(1); });`;try{await this.workspace.execute(`node`,[`-e`,t],e.cwd),this.reporter.info(`Generated ${W(`env.gen.ts`)} for Next.js`)}catch{this.reporter.warn(`Failed to automatically generate ${W(`env.gen.ts`)}. It will be generated when you start your dev server.`)}}if(e.bootstrap.wrapNextjsConfig!==!1){this.reporter.step(`Bootstrapping Next.js config...`);let t=await this.workspace.findNextjsConfig(e.cwd);if(t){let n=await this.workspace.bootstrapNextjsConfig(t,e.bootstrap.disableCodegen);n.success?n.updated?(this.reporter.info(`Updated ${W(o.default.basename(t))}`),r=!0):(this.reporter.info(`${W(o.default.basename(t))} already uses withArkEnv`),r=!0):this.reporter.warn(`Could not automatically update ${W(o.default.basename(t))}: ${n.error}`)}else this.reporter.info(`No Next.js config found. Please wrap your config with ${W(`withArkEnv`)} manually.`)}}else if(e.bootstrap.framework===`nuxt`){this.reporter.step(`Bootstrapping Nuxt config...`);let t=await this.workspace.findNuxtConfig(e.cwd);if(t){let e=await this.workspace.bootstrapNuxtConfig(t);e.success?(e.updated?this.reporter.info(`Updated ${W(o.default.basename(t))}`):this.reporter.info(`${W(o.default.basename(t))} already registers @arkenv/nuxt/module`),r=!0):this.reporter.warn(`Could not automatically update ${W(o.default.basename(t))}: ${e.error}`)}else this.reporter.info(`No Nuxt config found. Please register ${W(`@arkenv/nuxt/module`)} manually.`)}}let i=!1;if(e.skill&&process.env.SKIP_INSTALL!==`true`){this.reporter.step(`Installing ArkEnv agent skill...`);try{let[t,...n]=e.skill.dlxCommand,r=[...n,`skills`,`add`,e.skill.packageName];e.skill.isYes&&r.push(`--yes`),await this.workspace.execute(t,r,e.cwd),i=!0}catch(e){let t=e instanceof Error?e.message:String(e);this.reporter.warn(`Failed to install ArkEnv AI skill: ${t}`)}}let a=Cr(e,i,r);if(this.reporter.note(a.message,a.title),e.metadata.layout===`strict`){let t=o.default.resolve(e.cwd,e.metadata.displayPath);if(await this.workspace.exists(t)){let t=e.metadata.displayPath,n=o.default.basename(t,o.default.extname(t));this.reporter.warn(`Found existing single-file schema at ${W(t)}. You can delete it after updating your imports to point to your new ${W(`${n}/client`)} and ${W(`${n}/server`)}.`)}}this.reporter.finish(`${Qt} ArkEnv scaffolding complete. Happy coding!`,{path:e.metadata.displayPath,framework:e.metadata.framework,validator:e.metadata.validator,packageManager:e.metadata.packageManager,tsConfigUpdated:n,skillInstalled:i})}catch(e){throw t.stop(`Scaffolding failed.`),e}}async configurePnpmBuilds(e){let t=o.default.join(e,`package.json`);if(await this.workspace.exists(t))try{let e=await this.workspace.readFile(t),n=JSON.parse(e);n.pnpm=n.pnpm||{},n.pnpm.onlyBuiltDependencies=n.pnpm.onlyBuiltDependencies||[];for(let e of wr)n.pnpm.onlyBuiltDependencies.includes(e)||n.pnpm.onlyBuiltDependencies.push(e);await this.workspace.writeFile(t,JSON.stringify(n,null,2)+`
|
|
197
|
+
`)}catch(e){this.reporter.warn(`Could not update package.json with pnpm whitelisting: ${e}`)}let n=o.default.join(e,`pnpm-workspace.yaml`),r=``;if(await this.workspace.exists(n))try{r=await this.workspace.readFile(n)}catch{}let i=this.updatePnpmWorkspaceYaml(r);try{await this.workspace.writeFile(n,i)}catch(e){this.reporter.warn(`Could not write pnpm-workspace.yaml: ${e}`)}}updatePnpmWorkspaceYaml(e){let t=(0,p.parseDocument)(e||``);t.has(`allowBuilds`)||t.set(`allowBuilds`,t.createNode({}));let n=t.get(`allowBuilds`);if((0,p.isMap)(n)||(t.set(`allowBuilds`,t.createNode({})),n=t.get(`allowBuilds`)),(0,p.isMap)(n))for(let e of wr)n.get(e)!==!0&&n.set(e,!0);return String(t)}};const Er={basic:{HOST:`localhost`,PORT:`3000`,NODE_ENV:`development`},"basic-js":{HOST:`localhost`,PORT:`3000`,NODE_ENV:`development`},"with-bun":{HOST:`localhost`,PORT:`3000`,NODE_ENV:`development`},"with-nextjs":{DATABASE_URL:`postgres://localhost:5432/mydb`,NEXT_PUBLIC_API_URL:`https://api.example.com`,NODE_ENV:`development`},"with-nextjs-strict":{DATABASE_URL:`postgres://localhost:5432/mydb`,NEXT_PUBLIC_API_URL:`https://api.example.com`,NODE_ENV:`development`},"with-nuxt":{DATABASE_URL:`postgres://localhost:5432/mydb`,NUXT_PUBLIC_API_URL:`https://api.example.com`,NODE_ENV:`development`},"with-vite-react":{PORT:`3000`,VITE_MY_VAR:`hello`,VITE_MY_NUMBER:`42`,VITE_MY_BOOLEAN:`true`},"with-bun-react":{BUN_PUBLIC_API_URL:`https://api.example.com`,BUN_PUBLIC_DEBUG:`true`,NODE_ENV:`development`},"with-zod":{HOST:`localhost`,PORT:`3000`,NODE_ENV:`development`},"with-valibot":{HOST:`localhost`,PORT:`3000`,NODE_ENV:`development`},"with-standard-schema":{HOST:`localhost`,PORT:`3000`,NODE_ENV:`development`}};function Dr(e,t){return Er[e]??t()}function Or(e){switch(e){case`pnpm`:return[`pnpm`,`dlx`];case`yarn`:return[`yarn`,`dlx`];case`bun`:return[`bunx`];default:return[`npx`]}}function kr(e,t,n,r){let i=J(r??`none`,n);for(let a of i)n&&a.startsWith(n)?e.clientFields.push(`\t\t${t.formatCodegenField(a,`client`,n,r)}`):e.serverFields.push(`\t\t${t.formatCodegenField(a,`server`,n,r)}`)}function Ar(e){let t=[];for(let n of e){let e=n.trim().match(/^([a-zA-Z0-9_]+)\s*:/);e&&t.push(e[1])}return t}function jr(e,t,n,r=[]){let i=[],a=new Set,o=e=>{a.has(e)||(a.add(e),i.push(`\t\t${e}: process.env.${e},`))};if(e&&e.length>0){for(let n of e)(n.startsWith(t)||n===`NODE_ENV`||r.includes(n))&&o(n);return i}o(`${t}API_URL`),o(`NODE_ENV`);for(let e of Ar(n))o(e);for(let e of r)o(e);return i}function Mr(e){let{envKeys:t,dialect:n,config:r,importPath:i,disableCodegen:a,layout:o,hostPreset:s}=e,{clientPrefix:c}=r,l=[],u=[],d=[];if(t&&t.length>0)for(let e of t)e.startsWith(c)?u.push(`\t\t${n.formatCodegenField(e,`client`,c,s)}`):e===`NODE_ENV`?d.push(`\t\t${n.formatCodegenField(e,`shared`,c,s)}`):l.push(`\t\t${n.formatCodegenField(e,`server`,c,s)}`);else{let e=n.getDefaultCodegenFields(c);l.push(...e.serverFields),u.push(...e.clientFields),d.push(...e.sharedFields),kr({serverFields:l,clientFields:u},n,c,s)}return o!==`simple`&&o!==`strict`?Nr({serverFields:l,clientFields:u,sharedFields:d,envKeys:t,dialect:n,config:r,nextjsImportPath:i,disableCodegen:a}):Pr({serverFields:l,clientFields:u,sharedFields:d,envKeys:t,dialect:n,config:r,nextjsImportPath:i,disableCodegen:a,layout:o})}function Nr(e){let{serverFields:t,clientFields:n,sharedFields:r,envKeys:i,dialect:a,config:o,nextjsImportPath:s,disableCodegen:c}=e,{clientPrefix:l,packageName:u,displayName:d}=o,f=o.id,p=a.extraImport,m=[...t,...n,...r].map(e=>e.replace(/^\t\t/,` `)),h=[];for(let e of r){let t=e.trim().match(/^([a-zA-Z0-9_]+)\s*:/);if(t){let e=t[1];e!==`NODE_ENV`&&h.push(e)}}let g=[];if(h.length>0&&g.push(`\texposeToClient: [${h.map(e=>`"${e}"`).join(`, `)}]`),c&&f===`nextjs`){let e=jr(i,l,n,h);g.push(`\truntimeEnv: {\n${e.join(`
|
|
198
|
+
`)}\n\t}`)}let _=g.length>0?`, {\n${g.join(`,
|
|
199
|
+
`)}\n}`:``;return`${[`import arkenv from "${f===`nuxt`||c?u:s||`./generated/env.gen`}";`,...p?[p]:[]].join(`
|
|
200
|
+
`)}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Environment variable schema.
|
|
204
|
+
* ${f===`nuxt`?`In ${d}, use \`${u}\` to validate variables at build-time and runtime.`:`In ${d}, use the generated \`arkenv\` from \`env.gen.ts\` to validate variables.`}
|
|
205
|
+
* Enforces client/server separation and prevents secret leaks.
|
|
206
|
+
*/
|
|
207
|
+
export const env = arkenv({
|
|
208
|
+
${m.join(`
|
|
209
|
+
`)}
|
|
210
|
+
}${_});
|
|
211
|
+
`}function Pr(e){let{serverFields:t,clientFields:n,sharedFields:r,envKeys:i,dialect:a,config:o,nextjsImportPath:s,disableCodegen:c,layout:l}=e,{clientPrefix:u,packageName:d,displayName:f}=o,p=o.id,m=a.extraImport,h=[];if(t.length>0&&h.push(`\tserver: {\n${t.join(`
|
|
212
|
+
`)}\n\t}`),n.length>0&&h.push(`\tclient: {\n${n.join(`
|
|
213
|
+
`)}\n\t}`),r.length>0&&h.push(`\tshared: {\n${r.join(`
|
|
214
|
+
`)}\n\t}`),c||p===`nuxt`&&l===`simple`){let e=jr(i,u,n);return p!==`nuxt`&&h.push(`\truntimeEnv: {\n${e.join(`
|
|
215
|
+
`)}\n\t}`),`${[`import arkenv from "${d}";`,...m?[m]:[]].join(`
|
|
216
|
+
`)}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Environment variable schema.
|
|
220
|
+
* In ${f}, use \`${d}\` to validate variables at build-time and runtime.
|
|
221
|
+
* Enforces client/server separation and prevents secret leaks.
|
|
222
|
+
*/
|
|
223
|
+
export const env = arkenv({
|
|
224
|
+
${h.join(`,
|
|
225
|
+
`)},
|
|
226
|
+
});
|
|
227
|
+
`}return`${[`import arkenv from "${s||`./generated/env.gen`}";`,...m?[m]:[]].join(`
|
|
228
|
+
`)}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Environment variable schema.
|
|
232
|
+
* In ${f}, use the generated \`arkenv\` from \`env.gen.ts\` to validate variables.
|
|
233
|
+
* Enforces client/server separation and prevents secret leaks.
|
|
234
|
+
*/
|
|
235
|
+
export const env = arkenv({
|
|
236
|
+
${h.join(`,
|
|
237
|
+
`)},
|
|
238
|
+
});
|
|
239
|
+
`}function Fr(e,t,n){return c.default`
|
|
240
|
+
${e.pluginEnvImports.split(`
|
|
241
|
+
`).map(e=>`\t${e}`).join(`
|
|
242
|
+
`)}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* ${t===`vite`?"Environment variable schema.\n * In Vite, use `@arkenv/vite-plugin` to validate these at build-time\n * and provide typesafety for `import.meta.env` on the client-side.":"Environment variable schema.\n * In Bun Fullstack, use `@arkenv/bun-plugin` to validate these at build-time\n * and provide typesafety for `process.env` on the client-side."}
|
|
246
|
+
*/
|
|
247
|
+
export const Env = type({
|
|
248
|
+
${n}
|
|
249
|
+
});
|
|
250
|
+
`}function Ir(e,t,n){let r=J(n.hostPreset??`none`,n.clientPrefix),i=tn(n.framework);if(i){let a=t.length>0?Array.from(new Set([...t,...r])):void 0;return`${Mr({...a===void 0?{}:{envKeys:a},dialect:e,config:i,...n.nextjsImportPath!==void 0&&{importPath:n.nextjsImportPath},disableCodegen:n.disableCodegen,...n.layout!==void 0&&{layout:n.layout},...n.hostPreset!==void 0&&{hostPreset:n.hostPreset}})}\n`}let a;if(t.length>0){let i=Array.from(new Set([...t,...r]));a=e.formatSimpleSchemaFields(i,n.clientPrefix,n.hostPreset)}else a=r.length>0?`${e.defaultSimpleSchemaFields}\n${e.formatSimpleSchemaFields(r,n.clientPrefix,n.hostPreset)}`:e.defaultSimpleSchemaFields;return n.framework===`vite`||n.framework===`bun-fullstack`?`${Fr(e,n.framework,a)}\n`:`${e.assembleVanilla(a)}\n`}function Lr(e,t=` `){return e.length===0?`{}`:`{\n${t}${e.map(e=>e.trim()).join(`\n${t}`)}\n${t.slice(1)}}`}function Rr(e,t,n){let r=[],i=[],a=[],o=[];for(let s of e)s.startsWith(t.clientPrefix)?(i.push(n(s,`client`,t)),o.push(`${s}: process.env.${s},`)):s===`NODE_ENV`?(a.push(n(s,`shared`,t)),o.push(`${s}: process.env.${s},`)):r.push(n(s,`server`,t));return{serverFields:r,clientFields:i,sharedFields:a,runtimeEnvFields:o}}function zr(e,t){return{shared:`${e.shared}\n`,client:`${Hr(t)?e.clientNoCodegen:e.clientCodegen}\n`,server:`${e.server}\n`}}function Br(e){return e.packageName??tn(e.framework)?.packageName??`@arkenv/nextjs`}function Vr(e,t){return t.framework===`nuxt`?``:`,\n\t\truntimeEnv: {\n\t\t\t${e.map(e=>e.trim()).join(`
|
|
251
|
+
`)}\n\t\t}`}function Hr(e){return e.disableCodegen||e.framework===`nuxt`}function Ur(e){return Hr(e)?`${Br(e)}/client`:e.nextjsImportPath||`./generated/env.gen`}function Wr(e,t,n){let r=J(n.hostPreset??`none`,n.clientPrefix);for(let i of r)n.clientPrefix&&i.startsWith(n.clientPrefix)?(e.clientFields.push(t.formatStrictField(i,`client`,n.clientPrefix,n.hostPreset)),e.runtimeEnvFields.push(`${i}: process.env.${i},`)):e.serverFields.push(t.formatStrictField(i,`server`,n.clientPrefix,n.hostPreset))}function Gr(e,t,n){let r=Br(n),i=Ur(n),a=J(n.hostPreset??`none`,n.clientPrefix),{serverFields:o,clientFields:s,sharedFields:c,runtimeEnvFields:l}=t.length>0?Rr(Array.from(new Set([...t,...a])),n,(t,r)=>e.formatStrictField(t,r,n.clientPrefix,n.hostPreset)):(()=>{let t=e.getDefaultStrictFields(n.clientPrefix);return Wr(t,e,n),t})(),u=Vr(l,n),d=Lr(c,` `),f=Lr(s,` `),p=Lr(o,` `),m=e.strictExtraImports,h=`import arkenv from "${i}";
|
|
252
|
+
${m}
|
|
253
|
+
export const env = arkenv(
|
|
254
|
+
${f},
|
|
255
|
+
);`,g=`import arkenv from "${i}";
|
|
256
|
+
${m}import { SharedSchema } from "./internal/shared";
|
|
257
|
+
|
|
258
|
+
export const env = arkenv(
|
|
259
|
+
${f},
|
|
260
|
+
{
|
|
261
|
+
extends: [SharedSchema],
|
|
262
|
+
},
|
|
263
|
+
);`,_=`import arkenv from "${i}";
|
|
264
|
+
${m}import { SharedSchema } from "./internal/shared";
|
|
265
|
+
|
|
266
|
+
export const env = arkenv(
|
|
267
|
+
${f},
|
|
268
|
+
{
|
|
269
|
+
extends: [SharedSchema]${u}
|
|
270
|
+
},
|
|
271
|
+
);`,v=n.framework===`nuxt`?"/**\n * @internal 🛑 INTERNAL SCHEMA ONLY.\n * Do not import this directly. Import `env` from `./client` or `./server` instead.\n * Automatically picked up by `@arkenv/nuxt/client` when `extends` is omitted;\n * `@arkenv/nuxt/server` includes it through the composed client env.\n */":"/**\n * @internal 🛑 INTERNAL SCHEMA ONLY.\n * Do not import this directly. Import `env` from `./client` or `./server` instead.\n */";return zr({shared:`${e.sharedImports}
|
|
272
|
+
|
|
273
|
+
${v}
|
|
274
|
+
export const SharedSchema = ${e.wrapSharedSchema(d)};`,clientCodegen:n.framework===`nuxt`?h:g,clientNoCodegen:n.framework===`nuxt`?h:_,server:n.framework===`nuxt`?`import arkenv from "${r}/server";
|
|
275
|
+
${m}
|
|
276
|
+
export const env = arkenv(
|
|
277
|
+
${p},
|
|
278
|
+
);`:`import arkenv from "${r}/server";
|
|
279
|
+
${m}import { env as clientEnv } from "./client";
|
|
280
|
+
|
|
281
|
+
export const env = arkenv(
|
|
282
|
+
${p},
|
|
283
|
+
{
|
|
284
|
+
extends: [clientEnv],
|
|
285
|
+
},
|
|
286
|
+
);`},n)}function Kr(e){return{formatField(t,n,r){return e.formatStrictField(t,n,r.clientPrefix,r.hostPreset)},getSimpleTemplate(t,n){return Ir(e,t,n)},getStrictTemplates(t,n){return Gr(e,t,n)}}}const qr={arktype:Kr(An.arktype),zod:Kr(An.zod),valibot:Kr(An.valibot)};function Jr(e){return e.mode===`new`?ni(e):ri(e)}function Yr(e){let t=e.split(/\r?\n/),n=[],r=null;for(let e of t){let t=e.replace(/\\"/g,``).replace(/\\'/g,``);if(r){(t.match(new RegExp(r,`g`))||[]).length%2!=0&&(r=null);continue}let i=e.trim();if(!i||i.startsWith(`#`)){n.push(e);continue}let a=e.match(/^(\s*(?:export\s+)?)([A-Z_][A-Z0-9_]*)\s*=\s*(.*)$/i);if(a){let e=a[1],t=a[2],i=a[3].trim();n.push(`${e}${t}=`);let o=i.replace(/\\"/g,``).replace(/\\'/g,``);i.startsWith(`"`)?(o.match(/"/g)||[]).length%2!=0&&(r=`"`):i.startsWith(`'`)&&(o.match(/'/g)||[]).length%2!=0&&(r=`'`)}else n.push(e)}return n.join(`
|
|
287
|
+
`)}function Xr(e,t){return e.some(e=>{let n=e.indexOf(`#`),r=(n===-1?e:e.slice(0,n)).trim();if(!r)return!1;if(r===t||r===`/${t}`)return!0;if(r.includes(`*`)){let e=`^${r.replace(/\./g,`\\.`).replace(/\*/g,`.*`).replace(/^\//,`/?`)}$`;try{let n=new RegExp(e);return n.test(t)||n.test(`/${t}`)}catch{return!1}}return!1})}function Zr(e){return Object.entries(e).map(([e,t])=>`${e}=${t}`).join(`
|
|
288
|
+
`)+`
|
|
289
|
+
`}function Qr(e,t){let{cwd:n,options:r,existingFiles:i}=e,a=bn[r.framework],s=o.default.join(n,`.env`),c=o.default.join(n,`.env.example`),l=i.includes(s),u=i.includes(c),d=Tn(r.envKeys,r.hostPreset,a.clientPrefix);if(!l){let e=r.envExampleContent===void 0?Zr(a.getEnvDefaults(d)):r.envExampleContent;t.files.push({path:s,content:e,action:`create`,label:`local environment variables`})}if(!u){let e=r.envContent===void 0?Zr(a.getEnvDefaults(d)):Yr(r.envContent);t.files.push({path:c,content:e,action:`create`,label:`environment variables template`})}}function $r(e,t){let{cwd:n,options:r,existingFiles:i}=e,a=o.default.join(n,`.gitignore`),s=i.includes(a);if(s&&r.gitignoreContent!==void 0){let e=r.gitignoreContent.split(/\r?\n/),n=Xr(e,`.env`),i=Xr(e,`.env.local`);if(!n||!i){let e=`
|
|
290
|
+
# Environment variables
|
|
291
|
+
`;n||(e+=`.env
|
|
292
|
+
`),i||(e+=`.env.local
|
|
293
|
+
`);let o=r.gitignoreContent.endsWith(`
|
|
294
|
+
`)?`${r.gitignoreContent}${e.trim()}\n`:`${r.gitignoreContent}\n${e.trim()}\n`;t.files.push({path:a,content:o,action:`overwrite`,label:`.gitignore update`})}}else s||t.files.push({path:a,content:`# Environment variables
|
|
295
|
+
.env
|
|
296
|
+
.env.local
|
|
297
|
+
`,action:`create`,label:`.gitignore file`})}function ei(e){let{mode:n,options:r,packageManager:i}=e,a=r.name&&r.name!==`.`?o.default.basename(r.name):void 0;return(0,t.shake)({displayPath:``,framework:r.framework,validator:r.validator,packageManager:i,importPath:``,mode:n,example:r.example,name:a,layout:r.layout,skillDetected:r.skillDetected,disableCodegen:r.disableCodegen})}function ti(e,t){e.options.installSkill&&(t.skill={dlxCommand:Or(e.packageManager),packageName:`yamcodes/arkenv`,isYes:e.isYes})}function ni(e){let{options:t,packageManager:n,cwd:r}=e;if(!t.example)throw Error(`New project scaffolding requires an example.`);let i=t.name&&t.name!==`.`?o.default.join(r,t.name):void 0,a=t.name&&t.name!==`.`?o.default.basename(t.name):o.default.basename(r),s={files:[],cwd:r,metadata:ei(e),clone:{repository:`https://github.com/yamcodes/arkenv.git`,example:t.example,targetName:a,...i!==void 0&&{targetDir:i}},install:{packageManager:n,dependencies:[],...i!==void 0&&{cwd:i}}};ti(e,s);let c=Zr(Dr(t.example,()=>bn[t.framework].getEnvDefaults())),l=i??r;return s.files.push({path:o.default.join(l,`.env`),content:c,action:`create`,label:`local environment variables`},{path:o.default.join(l,`.env.example`),content:c,action:`create`,label:`environment variables template`}),s.metadata.displayPath=`./src/env.ts`,s.metadata.importPath=`./src/env`,s}function ri(e){let{options:t,packageManager:n,tsConfig:r,shouldUpdateTsConfig:i,cwd:a,existingFiles:s}=e,c=bn[t.framework],l=qr[t.validator],u=o.default.resolve(a,t.path),d=o.default.dirname(u),f={files:[],cwd:a,metadata:ei(e)},p={targetPath:u,targetDir:d,cwd:a,existingFiles:s,overwriteEnvSchemaFile:t.overwriteEnvSchemaFile,installTypeDefinitions:t.installTypeDefinitions,envDtsHandling:t.envDtsHandling,path:t.path,tsConfig:r};f.files.push(...c.getSchemaFiles(l,t,p)),Qr(e,f),$r(e,f);let m=[`arkenv`,t.validator,...c.getDependencies(t)];c.requiresArktypePeer(t)&&!m.includes(`arktype`)&&m.push(`arktype`),f.install={packageManager:n,dependencies:m},i&&r.file&&(f.tsConfig={path:o.default.resolve(a,r.file),action:`strict`}),f.files.push(...c.getTypeDefinitionFiles(t,p));let h=c.bootstrap(t);h&&(f.bootstrap=h),ti(e,f);let g=o.default.relative(a,u).replace(/\\/g,`/`),_=g.startsWith(`.`)?g:`./${g}`,v=_.replace(/\.(ts|js|tsx|jsx)$/,``);return f.metadata.displayPath=_,f.metadata.importPath=v,f.bootstrap&&(f.bootstrap.importPath=v),f}var ii=class{async fetchRegistry(){try{let e=await fetch(`https://raw.githubusercontent.com/yamcodes/arkenv/main/examples/registry.json`);if(!e.ok)throw Error(`Failed to fetch registry: ${e.statusText}`);return await e.json()}catch{return{examples:[{id:`basic`,name:`Basic`,description:`A minimal ArkEnv setup in Node.js`,framework:`vanilla`},{id:`with-nextjs`,name:`Next.js`,description:`Minimal Next.js project with ArkType`,framework:`nextjs`},{id:`with-vite-react`,name:`React + Vite`,framework:`vite`},{id:`with-bun`,name:`Bun (Vanilla)`,description:`Minimal Bun project with ArkType`,framework:`vanilla`},{id:`with-bun-react`,name:`React + Bun fullstack dev server`,framework:`bun-fullstack`},{id:`with-zod`,name:`Zod`,description:`ArkEnv with Zod in Node.js`,framework:`vanilla`},{id:`with-valibot`,name:`Valibot`,description:`ArkEnv with Valibot in Node.js`,framework:`vanilla`}]}}}},ai=class{constructor(e,t,n,r,i=new ii){this.logger=e,this.workspace=t,this.prompt=n,this.scanner=r,this.registry=i}async execute(e){let t=await this.collect(e);if(!t)return!1;let n=Jr(t),r=new Tr(this.workspace,this.logger);try{await r.execute(n)}catch(e){this.logger.fatal(`Scaffolding failed.`,e)}return!0}async collect(e){this.logger.interactiveStdout(!0);try{let t=e.name;t&&o.default.resolve(process.cwd(),t)===process.cwd()&&(t=`.`);let n={...e,...t!==void 0&&{name:t}},r=t&&t!==`.`?o.default.resolve(process.cwd(),t):process.cwd(),i=await this.workspace.exists(r),a=i?await this.scanner.hasPackageJson(r):!1,s=i?await this.scanner.isEmptyDirectory(r):!0;return n.example===void 0?a?await this.collectExistingProject(n,r):s||n.isForce?await this.collectNewProject(n,s):(this.logger.error(`Directory is not empty and no ${W(`package.json`)} was found.`),this.logger.info(`To scaffold a new project, run ${W(`arkenv init`)} in an empty directory or use ${W(`--force`)} to proceed anyway.`),this.logger.refuse({code:C.NON_EMPTY_DIR,message:`Directory is not empty and no package.json was found.`,retryWith:[`--force`]}),null):await this.collectNewProject(n,s)}finally{this.logger.interactiveStdout(!1)}}async collectExistingProject(e,n){let{isYes:r,isForce:i,isQuiet:a,isAgent:s}=e,c=await this.scanner.checkRequirements(n),l=c.filter(e=>e.status===`fail`),u=c.filter(e=>e.status===`warn`);for(let e of u)this.logger.warn(`${e.requirement}: ${e.message}`);if(l.length>0)if(i){this.logger.warn(`Technical requirements not met, but continuing due to --force flag.`);for(let e of l)this.logger.warn(`${e.requirement}: ${e.message}`)}else{this.logger.error(`Technical requirements not met:`);for(let e of l)this.logger.error(`- ${e.requirement}: ${e.message}${e.current?` (Current: ${e.current}, Expected: ${e.expected})`:``}`);return this.logger.info(`Use --force to bypass these checks.`),this.logger.refuse({code:C.REQUIREMENTS_NOT_MET,message:`Technical requirements not met.`,retryWith:[`--force`],details:{requirements:l.map(e=>(0,t.shake)({requirement:e.requirement,message:e.message,current:e.current,expected:e.expected}))}}),null}let d=await this.scanner.checkGitStatus(n);if(d.status===`dirty`)if(i)this.logger.warn(`Git working tree is not clean, but continuing due to --force flag.`);else return this.logger.error(`Git working tree is not clean. Commit or stash your changes (use 'git stash -u' for untracked files) before running arkenv init.`),this.logger.info(`Use --force to bypass this check.`),this.logger.refuse({code:C.GIT_TREE_DIRTY,message:`Git working tree is not clean.`,retryWith:[`--force`]}),null;d.status===`unknown`&&this.logger.warn(`Git working tree status could not be determined. Proceeding with caution.`);let f=!1,p=await this.scanner.checkTsConfig(n);if(p.status===`not_strict`)if(r)f=!0;else{this.logger.warn(`TypeScript strict mode is not enabled in your ${W(p.file)}.`);let e=await this.prompt.confirm(`ArkEnv requires ${W(`strict`)} mode in your ${W(p.file)}. Would you like to enable it now?`,!0,`Yes (Recommended)`);if(e===null)return null;if(!e)return this.logger.cancel(`Operation cancelled.`),null;f=!0}let m=await this.scanner.detectFramework(n,p.parsed);if(e.isSimple&&m===`nextjs`)return this.logger.error(`❌ Error: The --simple layout is deprecated and no longer supported by the CLI. Arkenv now exclusively uses the Flat Layout. Run npx arkenv init without this flag.`),null;let h=m===`bun-fullstack`?await this.scanner.detectBunFeatures(n,p.parsed):void 0,g=await this.scanner.suggestDefaultEnvPath(n,p.parsed),_=o.default.resolve(n,g),v=await this.scanner.getEnvExampleKeys(n,p.parsed,_),y=await(async()=>{if(e.isStrict){let e=o.default.extname(_),t=_.slice(0,-e.length),n=[o.default.join(t,`internal`,`shared${e}`),o.default.join(t,`client${e}`),o.default.join(t,`server${e}`)];if((await Promise.all(n.map(e=>this.workspace.exists(e)))).some(Boolean))return!0}return this.workspace.exists(_)})(),b=async({framework:e,envPath:t})=>{if(e!==`vite`&&e!==`bun-fullstack`)return!1;let r=e===`vite`?`vite-env.d.ts`:`bun-env.d.ts`,i=o.default.resolve(n,t),a=o.default.dirname(i),s=o.default.join(a,r);return this.workspace.exists(s)},x=await b({framework:m,envPath:g}),S=await this.prompt.runWizard((0,t.shake)({mode:`existing`,framework:m,bunFeatures:h,defaultEnvPath:g,tsConfig:p.parsed??null,envKeys:v?.keys,envKeysSource:v?.source,hasTypeFileAtPath:b,hasTypeFile:x,hasEnvSchemaFile:y,isStrict:e.isStrict,isSimple:e.isSimple,isFlat:e.isFlat,disableCodegen:e.noCodegen,hostPreset:e.hostPreset}),r);if(S===null)return null;let ee=await this.scanner.hasSkill(n);if(ee&&(S.skillDetected=!0,!a&&!s&&this.logger.info(`ArkEnv agent skill detected.`)),ee)S.installSkill=!1;else if(s)S.installSkill=!1;else if(r)S.installSkill=!0;else{let e=await this.prompt.confirm(`Would you like to install the ArkEnv agent skill?`,!0,`Yes (Recommended)`);if(e===null)return null;S.installSkill=e}let w=o.default.resolve(n,S.path);if(S.overwriteEnvSchemaFile===void 0&&(S.layout===`strict`?await(async()=>{let e=o.default.extname(w),t=w.slice(0,-e.length);return(await Promise.all([this.workspace.exists(o.default.join(t,`internal`,`shared${e}`)),this.workspace.exists(o.default.join(t,`client${e}`)),this.workspace.exists(o.default.join(t,`server${e}`))])).some(Boolean)})():await this.workspace.exists(w))){let e=S.layout===`strict`?`Strict layout files (client, server, internal/shared)`:o.default.basename(w),t=await this.prompt.confirm(`${e} already exist. Overwrite?`,!1);if(t===null)return null;if(!t)return this.logger.cancel(`Operation cancelled.`),null;S.overwriteEnvSchemaFile=t}let te=await this.scanner.detectPackageManager(n,p.parsed),T=o.default.extname(w),E=w.slice(0,-T.length),ne=S.layout===`strict`?[o.default.join(E,`internal`,`shared${T}`),o.default.join(E,`client${T}`),o.default.join(E,`server${T}`)]:[w],D=[];for(let e of ne)await this.workspace.exists(e)&&D.push(e);let O;if(S.framework===`vite`?O=`vite-env.d.ts`:S.framework===`bun-fullstack`&&(O=`bun-env.d.ts`),O){let e=o.default.dirname(w),t=o.default.join(e,O);await this.workspace.exists(t)&&D.push(t)}let re=o.default.join(n,`.env`),k=o.default.join(n,`.env.example`);await this.workspace.exists(re)&&(D.push(re),S.envContent=await this.workspace.readFile(re)),await this.workspace.exists(k)&&(D.push(k),S.envExampleContent=await this.workspace.readFile(k));let ie=o.default.join(n,`.gitignore`);return await this.workspace.exists(ie)&&(D.push(ie),S.gitignoreContent=await this.workspace.readFile(ie)),(0,t.shake)({mode:`existing`,cwd:n,options:S,detectedFramework:m,detectedBunFeatures:h,packageManager:te,tsConfig:p,shouldUpdateTsConfig:f,existingFiles:D,isYes:r})}async collectNewProject(e,n=!0){let{isYes:r,example:i,name:a,isForce:o}=e,s=await this.registry.fetchRegistry(),c=await this.prompt.runWizard((0,t.shake)({mode:`new`,examples:s.examples,example:i,name:a}),r);if(c===null)return null;if(c.name===`.`&&!n&&!o)return this.logger.error(`Cannot scaffold into ${W(`.`)} because the current directory is not empty.`),this.logger.info(`Run ${W(`arkenv init`)} in an empty directory or choose a sub-directory name instead.`),this.logger.refuse({code:C.NON_EMPTY_DIR,message:`Cannot scaffold into the current directory because it is not empty.`,retryWith:[`--force`]}),null;let l=this.detectPackageManager();return(0,t.shake)({mode:`new`,cwd:process.cwd(),options:c,detectedFramework:c.framework,packageManager:l,tsConfig:{status:`not_found`},shouldUpdateTsConfig:!1,existingFiles:[],isYes:r})}detectPackageManager(){let e=process.env.npm_config_user_agent||``;return e.includes(`pnpm`)?`pnpm`:e.includes(`yarn`)?`yarn`:e.includes(`bun`)?`bun`:`npm`}};function oi(e){let t=new mr(e),n=t.logger,r=new Kn(t.isQuiet,n.stdio,n),i=new dr,a=new Zt(n);return{cli:t,logger:n,workspace:r,prompt:i,initUseCase:new ai(n,r,i,a),addUseCase:new hr(n,r,i,a),helpUseCase:new yr(n)}}if(typeof require<`u`&&require.main!==module)throw Error(`🚨 ${b(`You imported the 'arkenv' package as a library. Starting with v1.0.0, the 'arkenv' package is exclusively the interactive CLI. If you want to validate environment variables in your code, please install and import '@arkenv/core' instead.`)}`);const si=new ut({isQuiet:!1,isJson:!1});let ci,li=!1;async function ui(){if(process.env.INIT_CWD)try{process.chdir(process.env.INIT_CWD)}catch{}let{cli:e,logger:n,initUseCase:r,addUseCase:i,helpUseCase:a}=oi(process.argv);ci=n,di(n),e.validationError&&(n.error(e.validationError),await a.execute(),await n.flush(),process.exit(1)),e.helpRequested&&(await a.execute(),await n.flush(),process.exit(0));let o=e.command?{init:()=>r.execute((0,t.shake)(e.initInput)),add:()=>i.execute(e.addInput)}[e.command]:void 0;o||(e.command?n.error(`Unknown command: ${e.command}`):n.error(`Missing command.`),await a.execute(),await n.flush(),process.exit(1));try{await o()||(await n.flush(),process.exit(1))}catch(e){try{n.fatal(`An unexpected error occurred`,e)}catch{}await n.flush(),process.exit(1)}}function di(e){let t=async t=>{li&&process.exit(t),li=!0,setTimeout(()=>{process.exit(t)},2e3).unref(),e.interactiveStdout&&e.interactiveStdout(!1);try{e.cancel(`Operation cancelled.`),await e.flush()}catch(t){e.error&&e.error(`Logger failed during shutdown`,t)}finally{process.exit(t)}};process.on(`SIGINT`,()=>t(130)),process.on(`SIGTERM`,()=>t(143))}ui(),process.on(`unhandledRejection`,async e=>{let t=ci??si;try{t.fatal(`Unhandled rejection`,e)}catch{}await t.flush(),process.exit(1)}),process.on(`uncaughtException`,async e=>{let t=ci??si;try{t.fatal(`Uncaught exception`,e)}catch{}await t.flush(),process.exit(1)});
|