@arkenv/cli 0.2.6 → 0.2.7
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/dist/index.cjs +72 -73
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -25,15 +25,15 @@ const e=require(`./chunk-i8uDWG73.cjs`);let t=require(`radashi`),n=require(`node
|
|
|
25
25
|
`&&(i&&oe(i)&&(r+=se(i)),a&&(r+=ce(a)))}return r},fe=/\r?\n/;function M(e,t,n){return String(e).normalize().split(fe).map(e=>de(e,t,n)).join(`
|
|
26
26
|
`)}var N=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 P(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?P(a,t<0?-1:1,n):a}const F={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 pe(e,t){if(typeof e==`string`)return F.aliases.get(e)===t;for(let n of e)if(n!==void 0&&pe(n,t))return!0;return!1}function me(e,t){if(e===t)return;let n=e.split(`
|
|
27
27
|
`),r=t.split(`
|
|
28
|
-
`),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 he=globalThis.process.platform.startsWith(`win`),ge=Symbol(`clack:cancel`);function I(e){return e===ge}function
|
|
28
|
+
`),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 he=globalThis.process.platform.startsWith(`win`),ge=Symbol(`clack:cancel`);function I(e){return e===ge}function _e(e,t){let n=e;n.isTTY&&n.setRawMode(t)}function ve({input:e=o.stdin,output:t=o.stdout,overwrite:n=!0,hideCursor:r=!0}={}){let i=s.createInterface({input:e,output:t,prompt:``,tabSize:1});s.emitKeypressEvents(e,i),e instanceof c.ReadStream&&e.isTTY&&e.setRawMode(!0);let a=(i,{name:o,sequence:c})=>{if(pe([String(i),o,c],`cancel`)){r&&t.write(N.cursor.show),process.exit(0);return}if(!n)return;let l=o===`return`?0:-1,u=o===`return`?-1:0;s.moveCursor(t,l,u,()=>{s.clearLine(t,1,()=>{e.once(`keypress`,a)})})};return r&&t.write(N.cursor.hide),e.once(`keypress`,a),()=>{e.off(`keypress`,a),r&&t.write(N.cursor.show),e instanceof c.ReadStream&&e.isTTY&&!he&&e.setRawMode(!1),i.terminal=!1,i.close()}}const ye=e=>`columns`in e&&typeof e.columns==`number`?e.columns:80,be=e=>`rows`in e&&typeof e.rows==`number`?e.rows:20;function L(e,t,n,r=n,i){return M(t,ye(e??o.stdout)-n.length,{hard:!0,trim:!1}).split(`
|
|
29
29
|
`).map((e,t)=>{let a=i?i(e,t):e;return`${t===0?r:n}${a}`}).join(`
|
|
30
|
-
`)}let xe=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=o.stdin,output:r=o.stdout,render:i,signal:a,...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=i.bind(this),this._track=t,this._abortSignal=a,this.input=n,this.output=r}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(ge);this._abortSignal.addEventListener(`abort`,()=>{this.state=`cancel`,this.close()},{once:!0})}this.rl=s.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),
|
|
31
|
-
`),
|
|
32
|
-
`).length-1;this.output.write(N.cursor.move(-999,e*-1))}render(){let e=M(this._render(this)??``,process.stdout.columns,{hard:!0,trim:!1});if(e!==this._prevFrame){if(this.state===`initial`)this.output.write(N.cursor.hide);else{let t=me(this._prevFrame,e),n=
|
|
30
|
+
`)}let xe=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=o.stdin,output:r=o.stdout,render:i,signal:a,...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=i.bind(this),this._track=t,this._abortSignal=a,this.input=n,this.output=r}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(ge);this._abortSignal.addEventListener(`abort`,()=>{this.state=`cancel`,this.close()},{once:!0})}this.rl=s.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),_e(this.input,!0),this.output.on(`resize`,this.render),this.render(),this.once(`submit`,()=>{this.output.write(N.cursor.show),this.output.off(`resize`,this.render),_e(this.input,!1),e(this.value)}),this.once(`cancel`,()=>{this.output.write(N.cursor.show),this.output.off(`resize`,this.render),_e(this.input,!1),e(ge)})})}_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&&F.aliases.has(t.name)&&this.emit(`cursor`,F.aliases.get(t.name)),F.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`)}pe([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(`
|
|
31
|
+
`),_e(this.input,!1),this.rl?.close(),this.rl=void 0,this.emit(`${this.state}`,this.value),this.unsubscribe()}restoreCursor(){let e=M(this._prevFrame,process.stdout.columns,{hard:!0,trim:!1}).split(`
|
|
32
|
+
`).length-1;this.output.write(N.cursor.move(-999,e*-1))}render(){let e=M(this._render(this)??``,process.stdout.columns,{hard:!0,trim:!1});if(e!==this._prevFrame){if(this.state===`initial`)this.output.write(N.cursor.hide);else{let t=me(this._prevFrame,e),n=be(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(N.cursor.move(0,a-i)),this.output.write(N.erase.lines(1));let t=e.split(`
|
|
33
33
|
`);this.output.write(t[a]),this._prevFrame=e,this.output.write(N.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(N.cursor.move(0,e))}this.output.write(N.erase.down());let t=e.split(`
|
|
34
34
|
`).slice(a);this.output.write(t.join(`
|
|
35
|
-
`)),this._prevFrame=e;return}}this.output.write(N.erase.down())}this.output.write(e),this.state===`initial`&&(this.state=`active`),this._prevFrame=e}}};var Se=class extends xe{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(N.cursor.move(0,-1)),this.value=e,this.state=`submit`,this.close()}),this.on(`cursor`,()=>{this.value=!this.value})}},Ce=class extends xe{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?P(n,1,this.options):n,this.changeValue(),this.on(`cursor`,e=>{switch(e){case`left`:case`up`:this.cursor=P(this.cursor,-1,this.options);break;case`down`:case`right`:this.cursor=P(this.cursor,1,this.options);break}this.changeValue()})}},we=class extends xe{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),[n,...r]=e.slice(this.cursor);return`${t}${(0,a.styleText)(`inverse`,n)}${r.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 Te(){return o.default.platform===`win32`?!!o.default.env.CI||!!o.default.env.WT_SESSION||!!o.default.env.TERMINUS_SUBLIME||o.default.env.ConEmuTask===`{cmd::Cmder}`||o.default.env.TERM_PROGRAM===`Terminus-Sublime`||o.default.env.TERM_PROGRAM===`vscode`||o.default.env.TERM===`xterm-256color`||o.default.env.TERM===`alacritty`||o.default.env.TERMINAL_EMULATOR===`JetBrains-JediTerm`:o.default.env.TERM!==`linux`}const Ee=Te(),De=()=>process.env.CI===`true`,R=(e,t)=>Ee?e:t,Oe=R(`◆`,`*`),ke=R(`■`,`x`),Ae=R(`▲`,`x`),z=R(`◇`,`o`),B=R(`│`,`|`),V=R(`└`,`—`),je=R(`●`,`>`),H=R(`○`,` `),Me=R(`─`,`-`),Ne=R(`╮`,`+`),Pe=R(`├`,`+`),Fe=R(`╯`,`+`),Ie=R(`╰`,`+`),Le=R(`●`,`•`),Re=R(`◆`,`*`),ze=R(`▲`,`!`),Be=R(`■`,`x`),Ve=e=>{switch(e){case`initial`:case`active`:return(0,a.styleText)(`cyan`,Oe);case`cancel`:return(0,a.styleText)(`red`,ke);case`error`:return(0,a.styleText)(`yellow`,Ae);case`submit`:return(0,a.styleText)(`green`,z)}},He=e=>{switch(e){case`initial`:case`active`:return(0,a.styleText)(`cyan`,B);case`cancel`:return(0,a.styleText)(`red`,B);case`error`:return(0,a.styleText)(`yellow`,B);case`submit`:return(0,a.styleText)(`green`,B)}},Ue=(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}},We=({cursor:e,options:t,style:n,output:r=process.stdout,maxItems:i=1/0,columnPadding:o=0,rowPadding:s=4})=>{let c=
|
|
36
|
-
`);_.push(i),v+=i.length}if(v>d){let t=0,n=0,r=v,i=e-y,a=(e,t)=>Ue(_,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},U=e=>{let t=e.active??`Yes`,n=e.inactive??`No`;return new Se({active:t,inactive:n,signal:e.signal,input:e.input,output:e.output,initialValue:e.initialValue??!0,render(){let r=e.withGuide??F.withGuide,i=`${Ve(this.state)} `,o=r?`${(0,a.styleText)(`gray`,B)} `:``,s=
|
|
35
|
+
`)),this._prevFrame=e;return}}this.output.write(N.erase.down())}this.output.write(e),this.state===`initial`&&(this.state=`active`),this._prevFrame=e}}};var Se=class extends xe{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(N.cursor.move(0,-1)),this.value=e,this.state=`submit`,this.close()}),this.on(`cursor`,()=>{this.value=!this.value})}},Ce=class extends xe{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?P(n,1,this.options):n,this.changeValue(),this.on(`cursor`,e=>{switch(e){case`left`:case`up`:this.cursor=P(this.cursor,-1,this.options);break;case`down`:case`right`:this.cursor=P(this.cursor,1,this.options);break}this.changeValue()})}},we=class extends xe{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),[n,...r]=e.slice(this.cursor);return`${t}${(0,a.styleText)(`inverse`,n)}${r.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 Te(){return o.default.platform===`win32`?!!o.default.env.CI||!!o.default.env.WT_SESSION||!!o.default.env.TERMINUS_SUBLIME||o.default.env.ConEmuTask===`{cmd::Cmder}`||o.default.env.TERM_PROGRAM===`Terminus-Sublime`||o.default.env.TERM_PROGRAM===`vscode`||o.default.env.TERM===`xterm-256color`||o.default.env.TERM===`alacritty`||o.default.env.TERMINAL_EMULATOR===`JetBrains-JediTerm`:o.default.env.TERM!==`linux`}const Ee=Te(),De=()=>process.env.CI===`true`,R=(e,t)=>Ee?e:t,Oe=R(`◆`,`*`),ke=R(`■`,`x`),Ae=R(`▲`,`x`),z=R(`◇`,`o`),B=R(`│`,`|`),V=R(`└`,`—`),je=R(`●`,`>`),H=R(`○`,` `),Me=R(`─`,`-`),Ne=R(`╮`,`+`),Pe=R(`├`,`+`),Fe=R(`╯`,`+`),Ie=R(`╰`,`+`),Le=R(`●`,`•`),Re=R(`◆`,`*`),ze=R(`▲`,`!`),Be=R(`■`,`x`),Ve=e=>{switch(e){case`initial`:case`active`:return(0,a.styleText)(`cyan`,Oe);case`cancel`:return(0,a.styleText)(`red`,ke);case`error`:return(0,a.styleText)(`yellow`,Ae);case`submit`:return(0,a.styleText)(`green`,z)}},He=e=>{switch(e){case`initial`:case`active`:return(0,a.styleText)(`cyan`,B);case`cancel`:return(0,a.styleText)(`red`,B);case`error`:return(0,a.styleText)(`yellow`,B);case`submit`:return(0,a.styleText)(`green`,B)}},Ue=(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}},We=({cursor:e,options:t,style:n,output:r=process.stdout,maxItems:i=1/0,columnPadding:o=0,rowPadding:s=4})=>{let c=ye(r)-o,l=be(r),u=(0,a.styleText)(`dim`,`...`),d=Math.max(l-s,0),f=Math.max(Math.min(i,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 r=y;r<b;r++){let i=M(n(t[r],r===e),c,{hard:!0,trim:!1}).split(`
|
|
36
|
+
`);_.push(i),v+=i.length}if(v>d){let t=0,n=0,r=v,i=e-y,a=(e,t)=>Ue(_,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},U=e=>{let t=e.active??`Yes`,n=e.inactive??`No`;return new Se({active:t,inactive:n,signal:e.signal,input:e.input,output:e.output,initialValue:e.initialValue??!0,render(){let r=e.withGuide??F.withGuide,i=`${Ve(this.state)} `,o=r?`${(0,a.styleText)(`gray`,B)} `:``,s=L(e.output,e.message,o,i),c=`${r?`${(0,a.styleText)(`gray`,B)}
|
|
37
37
|
`:``}${s}
|
|
38
38
|
`,l=this.value?t:n;switch(this.state){case`submit`:return`${c}${r?`${(0,a.styleText)(`gray`,B)} `:``}${(0,a.styleText)(`dim`,l)}`;case`cancel`:return`${c}${r?`${(0,a.styleText)(`gray`,B)} `:``}${(0,a.styleText)([`strikethrough`,`dim`],l)}${r?`
|
|
39
39
|
${(0,a.styleText)(`gray`,B)}`:``}`;default:{let i=r?`${(0,a.styleText)(`cyan`,B)} `:``,o=r?(0,a.styleText)(`cyan`,V):``;return`${c}${i}${this.value?`${(0,a.styleText)(`green`,je)} ${t}`:`${(0,a.styleText)(`dim`,H)} ${(0,a.styleText)(`dim`,t)}`}${e.vertical?r?`
|
|
@@ -49,23 +49,23 @@ ${o}
|
|
|
49
49
|
${(0,a.styleText)(`gray`,V)} `:``;n.write(`${r}${e}
|
|
50
50
|
|
|
51
51
|
`)},qe=e=>(0,a.styleText)(`dim`,e),Je=(e,t,n)=>{let r={hard:!0,trim:!1},i=M(e,t,r).split(`
|
|
52
|
-
`),a=i.reduce((e,t)=>Math.max(j(t),e),0);return M(e,t-(i.map(n).reduce((e,t)=>Math.max(j(t),e),0)-a),r)},Ye=(e=``,t=``,n)=>{let r=n?.output??o.default.stdout,i=n?.withGuide??F.withGuide,s=n?.format??qe,c=[``,...Je(e,
|
|
52
|
+
`),a=i.reduce((e,t)=>Math.max(j(t),e),0);return M(e,t-(i.map(n).reduce((e,t)=>Math.max(j(t),e),0)-a),r)},Ye=(e=``,t=``,n)=>{let r=n?.output??o.default.stdout,i=n?.withGuide??F.withGuide,s=n?.format??qe,c=[``,...Je(e,ye(r)-6,s).split(`
|
|
53
53
|
`).map(s),``],l=j(t),u=Math.max(c.reduce((e,t)=>{let n=j(t);return n>e?n:e},0),l)+2,d=c.map(e=>`${(0,a.styleText)(`gray`,B)} ${e}${` `.repeat(u-j(e))}${(0,a.styleText)(`gray`,B)}`).join(`
|
|
54
54
|
`),f=i?`${(0,a.styleText)(`gray`,B)}
|
|
55
55
|
`:``,p=i?Pe:Ie;r.write(`${f}${(0,a.styleText)(`green`,z)} ${(0,a.styleText)(`reset`,t)} ${(0,a.styleText)(`gray`,Me.repeat(Math.max(u-l-1,1))+Ne)}
|
|
56
56
|
${d}
|
|
57
57
|
${(0,a.styleText)(`gray`,p+Me.repeat(u+2)+Fe)}
|
|
58
|
-
`)},Xe=e=>(0,a.styleText)(`magenta`,e),Ze=({indicator:e=`dots`,onCancel:t,output:n=process.stdout,cancelMessage:r,errorMessage:i,frames:o=Ee?[`◒`,`◐`,`◓`,`◑`]:[`•`,`o`,`O`,`0`],delay:s=Ee?80:120,signal:c,...l}={})=>{let u=De(),d,f,p=!1,m=!1,h=``,g,_=performance.now(),v=
|
|
58
|
+
`)},Xe=e=>(0,a.styleText)(`magenta`,e),Ze=({indicator:e=`dots`,onCancel:t,output:n=process.stdout,cancelMessage:r,errorMessage:i,frames:o=Ee?[`◒`,`◐`,`◓`,`◑`]:[`•`,`o`,`O`,`0`],delay:s=Ee?80:120,signal:c,...l}={})=>{let u=De(),d,f,p=!1,m=!1,h=``,g,_=performance.now(),v=ye(n),y=l?.styleFrame??Xe,b=e=>{let n=e>1?i??F.messages.error:r??F.messages.cancel;m=e===1,p&&(k(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&&n.write(`
|
|
59
59
|
`);let e=M(g,v,{hard:!0,trim:!1}).split(`
|
|
60
|
-
`);e.length>1&&n.write(N.cursor.up(e.length-1)),n.write(N.cursor.to(0)),n.write(N.erase.down())},T=e=>e.replace(/\.+$/,``),E=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]`},D=l.withGuide??F.withGuide,O=(t=``)=>{p=!0,d=
|
|
60
|
+
`);e.length>1&&n.write(N.cursor.up(e.length-1)),n.write(N.cursor.to(0)),n.write(N.erase.down())},T=e=>e.replace(/\.+$/,``),E=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]`},D=l.withGuide??F.withGuide,O=(t=``)=>{p=!0,d=ve({output:n}),h=T(t),_=performance.now(),D&&n.write(`${(0,a.styleText)(`gray`,B)}
|
|
61
61
|
`);let r=0,i=0;C(),f=setInterval(()=>{if(u&&h===g)return;w(),g=h;let t=y(o[r]),a;if(u)a=`${t} ${h}...`;else if(e===`timer`)a=`${t} ${h} ${E(_)}`;else{let e=`.`.repeat(Math.floor(i)).slice(0,3);a=`${t} ${h}${e}`}let s=M(a,v,{hard:!0,trim:!1});n.write(s),r=r+1<o.length?r+1:0,i=i<4?i+.125:0},s)},k=(t=``,r=0,i=!1)=>{if(!p)return;p=!1,clearInterval(f),w();let o=r===0?(0,a.styleText)(`green`,z):r===1?(0,a.styleText)(`red`,ke):(0,a.styleText)(`red`,Ae);h=t??h,i||(e===`timer`?n.write(`${o} ${h} ${E(_)}
|
|
62
62
|
`):n.write(`${o} ${h}
|
|
63
63
|
`)),ee(),d()};return{start:O,stop:(e=``)=>k(e,0),message:(e=``)=>{h=T(e??h)},cancel:(e=``)=>k(e,1),error:(e=``)=>k(e,2),clear:()=>k(``,0,!0),get isCancelled(){return m}}},G=(e,t)=>e.includes(`
|
|
64
64
|
`)?e.split(`
|
|
65
65
|
`).map(e=>t(e)).join(`
|
|
66
|
-
`):t(e),K=e=>{let t=(e,t)=>{let n=e.label??String(e.value);switch(t){case`disabled`:return`${(0,a.styleText)(`gray`,H)} ${G(n,e=>(0,a.styleText)(`gray`,e))}${e.hint?` ${(0,a.styleText)(`dim`,`(${e.hint??`disabled`})`)}`:``}`;case`selected`:return`${G(n,e=>(0,a.styleText)(`dim`,e))}`;case`active`:return`${(0,a.styleText)(`green`,je)} ${n}${e.hint?` ${(0,a.styleText)(`dim`,`(${e.hint})`)}`:``}`;case`cancelled`:return`${G(n,e=>(0,a.styleText)([`strikethrough`,`dim`],e))}`;default:return`${(0,a.styleText)(`dim`,H)} ${G(n,e=>(0,a.styleText)(`dim`,e))}`}};return new Ce({options:e.options,signal:e.signal,input:e.input,output:e.output,initialValue:e.initialValue,render(){let n=e.withGuide??F.withGuide,r=`${Ve(this.state)} `,i=`${He(this.state)} `,o=
|
|
66
|
+
`):t(e),K=e=>{let t=(e,t)=>{let n=e.label??String(e.value);switch(t){case`disabled`:return`${(0,a.styleText)(`gray`,H)} ${G(n,e=>(0,a.styleText)(`gray`,e))}${e.hint?` ${(0,a.styleText)(`dim`,`(${e.hint??`disabled`})`)}`:``}`;case`selected`:return`${G(n,e=>(0,a.styleText)(`dim`,e))}`;case`active`:return`${(0,a.styleText)(`green`,je)} ${n}${e.hint?` ${(0,a.styleText)(`dim`,`(${e.hint})`)}`:``}`;case`cancelled`:return`${G(n,e=>(0,a.styleText)([`strikethrough`,`dim`],e))}`;default:return`${(0,a.styleText)(`dim`,H)} ${G(n,e=>(0,a.styleText)(`dim`,e))}`}};return new Ce({options:e.options,signal:e.signal,input:e.input,output:e.output,initialValue:e.initialValue,render(){let n=e.withGuide??F.withGuide,r=`${Ve(this.state)} `,i=`${He(this.state)} `,o=L(e.output,e.message,i,r),s=`${n?`${(0,a.styleText)(`gray`,B)}
|
|
67
67
|
`:``}${o}
|
|
68
|
-
`;switch(this.state){case`submit`:{let r=n?`${(0,a.styleText)(`gray`,B)} `:``;return`${s}${
|
|
68
|
+
`;switch(this.state){case`submit`:{let r=n?`${(0,a.styleText)(`gray`,B)} `:``;return`${s}${L(e.output,t(this.options[this.cursor],`selected`),r)}`}case`cancel`:{let r=n?`${(0,a.styleText)(`gray`,B)} `:``;return`${s}${L(e.output,t(this.options[this.cursor],`cancelled`),r)}${n?`
|
|
69
69
|
${(0,a.styleText)(`gray`,B)}`:``}`}default:{let r=n?`${(0,a.styleText)(`cyan`,B)} `:``,i=n?(0,a.styleText)(`cyan`,V):``,o=s.split(`
|
|
70
70
|
`).length,c=n?2:1;return`${s}${r}${We({output:e.output,cursor:this.cursor,options:this.options,maxItems:e.maxItems,columnPadding:r.length,rowPadding:o+c,style:(e,n)=>t(e,e.disabled?`disabled`:n?`active`:`inactive`)}).join(`
|
|
71
71
|
${r}`)}
|
|
@@ -84,14 +84,14 @@ ${o}${e}
|
|
|
84
84
|
`}case`submit`:{let e=o?` ${(0,a.styleText)(`dim`,o)}`:``;return`${n}${t?(0,a.styleText)(`gray`,B):``}${e}`}case`cancel`:{let e=o?` ${(0,a.styleText)([`strikethrough`,`dim`],o)}`:``,r=t?(0,a.styleText)(`gray`,B):``;return`${n}${r}${e}${o.trim()?`
|
|
85
85
|
${r}`:``}`}default:return`${n}${t?`${(0,a.styleText)(`cyan`,B)} `:``}${i}
|
|
86
86
|
${t?(0,a.styleText)(`cyan`,V):``}
|
|
87
|
-
`}}}).prompt();var et=class{info(e){process.stdout.write(`${y.default.blue(`ℹ ${e}`)}\n`)}warn(e){process.stderr.write(`${y.default.yellow(`⚠ ${e}`)}\n`)}error(e){process.stderr.write(`${y.default.red(`✘ ${e}`)}\n`)}success(e){process.stdout.write(`${y.default.green(`✔ ${e}`)}\n`)}step(e){process.stdout.write(`○ ${e}\n`)}note(e,t){Ye(e,t)}log(e){process.stdout.write(`${e}\n`)}spinner(){return Ze()}json(e){process.stdout.write(`${JSON.stringify(e,null,2)}\n`)}cancel(e){process.stderr.write(`${y.default.red(`✘ ${e}`)}\n`)}fatal(e,t){if(process.stderr.write(`${y.default.red(`✘ ${e}`)}\n`),t){let e=`${y.default.red(t instanceof Error?t.stack??String(t):String(t))}\n`;process.stderr.write(e)}throw t instanceof Error?t:Error(e)}finish(e,t){Ke(e)}async flush(){return new Promise(e=>{process.stderr.write(``,()=>e())})}},tt=class{constructor(e){this.options=e,this.originalStdoutWrite=process.stdout.write,e.isJson?this.reporter=new b:e.isQuiet?this.reporter=new x:this.reporter=new et}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)}finish(e,t){this.reporter.finish(e,t)}async flush(){await this.reporter.flush()}};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=r.default.join(e,`package.json`),i=await n.default.readFile(t,`utf-8`),a=JSON.parse(i),o={...a.dependencies,...a.devDependencies};if(o.vite)return`vite`;if(o.next)return`nextjs`}catch{}try{return await n.default.access(r.default.join(e,`vite.config.ts`)),`vite`}catch{}try{return await n.default.access(r.default.join(e,`vite.config.js`)),`vite`}catch{}try{return await n.default.access(r.default.join(e,`next.config.ts`)),`nextjs`}catch{}try{return await n.default.access(r.default.join(e,`next.config.js`)),`nextjs`}catch{}try{return await n.default.access(r.default.join(e,`next.config.mjs`)),`nextjs`}catch{}try{return await n.default.access(r.default.join(e,`next.config.cjs`)),`nextjs`}catch{}return(await rt(e,t)).length>0?`bun-fullstack`:`vanilla`}async function rt(e=process.cwd(),t){let i=[];try{let t=r.default.join(e,`bunfig.toml`),a=await n.default.readFile(t,`utf-8`);(a.includes(`[serve]`)||a.includes(`[serve.static]`))&&i.push(`serve`),a.includes(`[build]`)&&i.push(`build`)}catch{}if(i.includes(`serve`)&&i.includes(`build`))return i;let{walk:a}=await Promise.resolve().then(()=>ot),o=await a(e),s=i.includes(`serve`),c=i.includes(`build`);for(let e of o)try{let t=await n.default.readFile(e,`utf-8`);if(!s&&(t.includes(`Bun.serve`)||t.includes(`serve(`))&&(/from\s+['"]bun['"]/.test(t)||t.includes(`Bun.serve`))&&(s=!0,i.push(`serve`)),!c&&(t.includes(`Bun.build`)||t.includes(`build(`))&&(/from\s+['"]bun['"]/.test(t)||t.includes(`Bun.build`))&&(c=!0,i.push(`build`)),s&&c)break}catch{}return i}async function it(e=process.cwd(),t){let i=process.env.npm_config_user_agent?.toString()||``;if(i.includes(`pnpm`))return`pnpm`;if(i.includes(`yarn`))return`yarn`;if(i.includes(`bun`))return`bun`;if(i.includes(`npm`))return`npm`;let a=t?.path?r.default.dirname(t.path):e;for(;a!==r.default.parse(a).root;){try{let e=r.default.join(a,`package.json`),t=await n.default.readFile(e,`utf-8`),i=JSON.parse(t);if(i.packageManager){if(i.packageManager.startsWith(`pnpm`))return`pnpm`;if(i.packageManager.startsWith(`yarn`))return`yarn`;if(i.packageManager.startsWith(`bun`))return`bun`}}catch{}let e=[];try{e=await n.default.readdir(a)}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`;a=r.default.dirname(a)}return`npm`}async function at(e=process.cwd(),t){let i=t;if(!i){let{findTsConfig:t,loadTsConfig:n}=await Promise.resolve().then(()=>ft),r=await t(e);r&&(i=await n(r))}if(i?.compilerOptions?.rootDir){let t=i.compilerOptions.rootDir,n=r.default.relative(e,t);return n&&n!==`.`&&!n.startsWith(`..`)&&!r.default.isAbsolute(n)?`./${n}/env.ts`:`./env.ts`}try{return await n.default.access(r.default.join(e,`src`)),`./src/env.ts`}catch{return`./env.ts`}}var ot=e.n({getEnvExampleKeys:()=>dt,parseEnvExample:()=>ct,resolveImportPaths:()=>lt,scanProjectEnvKeys:()=>ut,walk:()=>st});async function st(e,t=[]){try{let i=await n.default.readdir(e,{withFileTypes:!0});for(let n of i)if(n.isDirectory()){let i=n.name;if(i===`node_modules`||i===`dist`||i===`build`||i===`.git`||i===`.turbo`||i===`scratch`)continue;await st(r.default.join(e,i),t)}else n.isFile()&&/\.(ts|tsx|js|jsx)$/.test(n.name)&&!n.name.endsWith(`.d.ts`)&&t.push(r.default.join(e,n.name))}catch{}return t}function ct(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 lt(e,t,n){if(e.startsWith(`.`))return[r.default.resolve(r.default.dirname(n),e)];if(r.default.isAbsolute(e))return[e];let i=t.compilerOptions||{},a=i.baseUrl||r.default.dirname(t.path),o=i.paths||{},s=[];for(let[e,t]of Object.entries(o)){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:i}of s)if(i&&e.startsWith(t)||!i&&e===t){let i=e.slice(t.length);return n.map(e=>{let t=`${e.replace(/\*$/,``)}${i}`;return r.default.resolve(a,t)})}return i.baseUrl?[r.default.resolve(a,e)]:[]}async function ut(e,t,i){let a=[],o=await st(e),s=i?i.replace(/\.(ts|js|tsx|jsx)$/,``):null;for(let e of o)try{let i=await n.default.readFile(e,`utf-8`),o=i.matchAll(/process\.env\.([A-Z_][A-Z0-9_]*)/g);for(let e of o)e[1]&&a.push(e[1]);let c=i.matchAll(/import\.meta\.env\.([A-Z_][A-Z0-9_]*)/g);for(let e of c)e[1]&&a.push(e[1]);if(s){let n=i.matchAll(/import\s+[^;]*from\s+['"]([^'"]+)['"]/g);for(let o of n){let n=o[1],c=[];if(t?c=lt(n,t,e):n.startsWith(`.`)&&(c=[r.default.resolve(r.default.dirname(e),n)]),c.some(e=>e.replace(/\.(ts|js|tsx|jsx)$/,``)===s)){let e=i.matchAll(/\benv\.([A-Z_][A-Z0-9_]*)/g);for(let t of e)t[1]&&a.push(t[1])}}}}catch{}return Array.from(new Set(a))}async function dt(e=process.cwd(),t,i){let a=r.default.join(e,`.env.example`);try{let e=ct(await n.default.readFile(a,`utf-8`));if(e.length>0)return{keys:e,source:`.env.example`}}catch{}let o=await ut(e,t,i);return o.length>0?{keys:o,source:`project`}:null}var ft=e.n({checkTsConfig:()=>mt,findTsConfig:()=>J,loadTsConfig:()=>Y});const pt=(0,l.createRequire)(require(`url`).pathToFileURL(__filename).href).resolve;async function J(e=process.cwd()){let t=[`tsconfig.app.json`,`tsconfig.json`,`tsconfig.base.json`,`tsconfig.node.json`],i=e;for(;i!==r.default.parse(i).root;){for(let e of t){let t=r.default.join(i,e);try{return await n.default.access(t),t}catch{}}i=r.default.dirname(i)}return null}async function Y(e,t=new Set){let i=r.default.resolve(e);if(t.has(i))throw Error(`Circular extends dependency detected in tsconfig.json: ${i}`);t.add(i);let a=``;try{a=await n.default.readFile(e,`utf-8`)}catch{return{path:e,compilerOptions:{}}}let o=(0,u.parse)(a)||{},s=o.compilerOptions||{},c={};if(o.extends){let n=Array.isArray(o.extends)?o.extends:[o.extends];for(let i of n){let n;if(i.startsWith(`.`)||r.default.isAbsolute(i))n=r.default.resolve(r.default.dirname(e),i);else try{n=pt(i,{paths:[r.default.dirname(e)]})}catch{n=r.default.resolve(r.default.dirname(e),`node_modules`,i)}let a={...(await Y(n,t)).compilerOptions};a.baseUrl&&=r.default.resolve(r.default.dirname(n),a.baseUrl),a.rootDir&&=r.default.resolve(r.default.dirname(n),a.rootDir),c={...c,...a}}}let l={...s};return l.baseUrl&&=r.default.resolve(r.default.dirname(e),l.baseUrl),l.rootDir&&=r.default.resolve(r.default.dirname(e),l.rootDir),c={...c,...l},{...o,path:e,compilerOptions:c}}async function mt(e=process.cwd()){let t=await J(e);if(!t)return{status:`not_found`};let n=r.default.basename(t);try{let e=await Y(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 ht(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 gt(e){let t=e.trim().match(/^v?(\d+)(?:\.(\d+))?(?:\.(\d+))?/);return t?[t[1],t[2]??`0`,t[3]??`0`].join(`.`):null}function _t(e,t){let n=e.trim(),r=n.match(/^[\^~]?\s*(v?\d+(?:\.\d+){0,2})$/);if(r){let e=gt(r[1]);return e!==null&&ht(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=gt(i);return a&&(r===`>=`||r===`>`||r===`=`)?ht(a,t)>=0:!1})}async function vt(e=process.cwd()){let t=[],i=process.version,a=`22.0.0`;ht(i,a)===-1?t.push({status:`fail`,requirement:`Node.js Version`,message:`Node.js version must be >= ${a}.`,current:i,expected:`>= ${a}`}):t.push({status:`pass`,requirement:`Node.js Version`,message:`Node.js version is compatible.`});let o=null;try{let i=r.default.join(e,`package.json`),a=await n.default.readFile(i,`utf-8`);o=JSON.parse(a),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(o){let e={...o.dependencies,...o.devDependencies}.typescript,n=`5.1.0`;e?_t(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 s=await mt(e);if(s.status===`not_found`)t.push({status:`warn`,requirement:`tsconfig.json`,message:`tsconfig.json not found.`});else{let e=s.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 yt=class{async isEmptyDirectory(e=process.cwd()){try{return(await n.default.readdir(e)).length===0}catch{return!1}}async hasPackageJson(e=process.cwd()){try{return await n.default.access(r.default.join(e,`package.json`)),!0}catch{return!1}}async findTsConfig(e=process.cwd()){return J(e)}async loadTsConfig(e,t=new Set){return Y(e,t)}async getEnvExampleKeys(e=process.cwd(),t,n){return dt(e,t,n)}async suggestDefaultEnvPath(e=process.cwd(),t){return at(e,t)}async checkTsConfig(e=process.cwd()){return mt(e)}async checkRequirements(e=process.cwd()){return vt(e)}async detectFramework(e=process.cwd(),t){return nt(e,t)}async detectBunFeatures(e=process.cwd(),t){return rt(e,t)}async detectPackageManager(e=process.cwd(),t){return it(e,t)}async hasSkill(e=process.cwd()){try{let t=r.default.join(e,`skills-lock.json`),i=await n.default.readFile(t,`utf-8`),a=JSON.parse(i);if(a&&typeof a==`object`&&a.skills&&typeof a.skills==`object`&&`arkenv`in a.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 n.default.access(r.default.join(e,t)),!0}catch{}return!1}};const X=e=>y.default.cyan(e),bt=y.default.blue(`⛯`);function xt(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),{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)}`}}}async function St(e=process.cwd()){for(let t of[`vite.config.ts`,`vite.config.js`,`vite.config.mts`,`vite.config.mjs`]){let i=r.default.resolve(e,t);try{return await n.default.access(i),i}catch{}}return null}async function Ct(e=process.cwd()){for(let t of[`bunfig.toml`,`bun.setup.ts`,`bun.setup.js`]){let i=r.default.resolve(e,t);try{return await n.default.access(i),i}catch{}}return null}async function wt(e,t,n){try{let r=xt({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 Tt(e,t){if(!t||t.length===0)return{success:!0,instructions:i.default`
|
|
87
|
+
`}}}).prompt();var et=class{info(e){process.stdout.write(`${y.default.blue(`ℹ ${e}`)}\n`)}warn(e){process.stderr.write(`${y.default.yellow(`⚠ ${e}`)}\n`)}error(e){process.stderr.write(`${y.default.red(`✘ ${e}`)}\n`)}success(e){process.stdout.write(`${y.default.green(`✔ ${e}`)}\n`)}step(e){process.stdout.write(`○ ${e}\n`)}note(e,t){Ye(e,t)}log(e){process.stdout.write(`${e}\n`)}spinner(){return Ze()}json(e){process.stdout.write(`${JSON.stringify(e,null,2)}\n`)}cancel(e){process.stderr.write(`${y.default.red(`✘ ${e}`)}\n`)}fatal(e,t){if(process.stderr.write(`${y.default.red(`✘ ${e}`)}\n`),t){let e=`${y.default.red(t instanceof Error?t.stack??String(t):String(t))}\n`;process.stderr.write(e)}throw t instanceof Error?t:Error(e)}finish(e,t){Ke(e)}async flush(){return new Promise(e=>{process.stderr.write(``,()=>e())})}},tt=class{constructor(e){this.options=e,this.originalStdoutWrite=process.stdout.write,e.isJson?this.reporter=new b:e.isQuiet?this.reporter=new x:this.reporter=new et}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)}finish(e,t){this.reporter.finish(e,t)}async flush(){await this.reporter.flush()}};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=r.default.join(e,`package.json`),i=await n.default.readFile(t,`utf-8`),a=JSON.parse(i),o={...a.dependencies,...a.devDependencies};if(o.vite)return`vite`;if(o.next)return`nextjs`}catch{}try{return await n.default.access(r.default.join(e,`vite.config.ts`)),`vite`}catch{}try{return await n.default.access(r.default.join(e,`vite.config.js`)),`vite`}catch{}try{return await n.default.access(r.default.join(e,`next.config.ts`)),`nextjs`}catch{}try{return await n.default.access(r.default.join(e,`next.config.js`)),`nextjs`}catch{}try{return await n.default.access(r.default.join(e,`next.config.mjs`)),`nextjs`}catch{}try{return await n.default.access(r.default.join(e,`next.config.cjs`)),`nextjs`}catch{}return(await rt(e,t)).length>0?`bun-fullstack`:`vanilla`}async function rt(e=process.cwd(),t){let i=[];try{let t=r.default.join(e,`bunfig.toml`),a=await n.default.readFile(t,`utf-8`);(a.includes(`[serve]`)||a.includes(`[serve.static]`))&&i.push(`serve`),a.includes(`[build]`)&&i.push(`build`)}catch{}if(i.includes(`serve`)&&i.includes(`build`))return i;let{walk:a}=await Promise.resolve().then(()=>ot),o=await a(e),s=i.includes(`serve`),c=i.includes(`build`);for(let e of o)try{let t=await n.default.readFile(e,`utf-8`);if(!s&&(t.includes(`Bun.serve`)||t.includes(`serve(`))&&(/from\s+['"]bun['"]/.test(t)||t.includes(`Bun.serve`))&&(s=!0,i.push(`serve`)),!c&&(t.includes(`Bun.build`)||t.includes(`build(`))&&(/from\s+['"]bun['"]/.test(t)||t.includes(`Bun.build`))&&(c=!0,i.push(`build`)),s&&c)break}catch{}return i}async function it(e=process.cwd(),t){let i=process.env.npm_config_user_agent?.toString()||``;if(i.includes(`pnpm`))return`pnpm`;if(i.includes(`yarn`))return`yarn`;if(i.includes(`bun`))return`bun`;if(i.includes(`npm`))return`npm`;let a=t?.path?r.default.dirname(t.path):e;for(;a!==r.default.parse(a).root;){try{let e=r.default.join(a,`package.json`),t=await n.default.readFile(e,`utf-8`),i=JSON.parse(t);if(i.packageManager){if(i.packageManager.startsWith(`pnpm`))return`pnpm`;if(i.packageManager.startsWith(`yarn`))return`yarn`;if(i.packageManager.startsWith(`bun`))return`bun`}}catch{}let e=[];try{e=await n.default.readdir(a)}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`;a=r.default.dirname(a)}return`npm`}async function at(e=process.cwd(),t){let i=t;if(!i){let{findTsConfig:t,loadTsConfig:n}=await Promise.resolve().then(()=>ft),r=await t(e);r&&(i=await n(r))}if(i?.compilerOptions?.rootDir){let t=i.compilerOptions.rootDir,n=r.default.relative(e,t);return n&&n!==`.`&&!n.startsWith(`..`)&&!r.default.isAbsolute(n)?`./${n}/env.ts`:`./env.ts`}try{return await n.default.access(r.default.join(e,`src`)),`./src/env.ts`}catch{return`./env.ts`}}var ot=e.n({getEnvExampleKeys:()=>dt,parseEnvExample:()=>ct,resolveImportPaths:()=>lt,scanProjectEnvKeys:()=>ut,walk:()=>st});async function st(e,t=[]){try{let i=await n.default.readdir(e,{withFileTypes:!0});for(let n of i)if(n.isDirectory()){let i=n.name;if(i===`node_modules`||i===`dist`||i===`build`||i===`.git`||i===`.turbo`||i===`scratch`)continue;await st(r.default.join(e,i),t)}else n.isFile()&&/\.(ts|tsx|js|jsx)$/.test(n.name)&&!n.name.endsWith(`.d.ts`)&&t.push(r.default.join(e,n.name))}catch{}return t}function ct(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 lt(e,t,n){if(e.startsWith(`.`))return[r.default.resolve(r.default.dirname(n),e)];if(r.default.isAbsolute(e))return[e];let i=t.compilerOptions||{},a=i.baseUrl||r.default.dirname(t.path),o=i.paths||{},s=[];for(let[e,t]of Object.entries(o)){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:i}of s)if(i&&e.startsWith(t)||!i&&e===t){let i=e.slice(t.length);return n.map(e=>{let t=`${e.replace(/\*$/,``)}${i}`;return r.default.resolve(a,t)})}return i.baseUrl?[r.default.resolve(a,e)]:[]}async function ut(e,t,i){let a=[],o=await st(e),s=i?i.replace(/\.(ts|js|tsx|jsx)$/,``):null;for(let e of o)try{let i=await n.default.readFile(e,`utf-8`),o=i.matchAll(/process\.env\.([A-Z_][A-Z0-9_]*)/g);for(let e of o)e[1]&&a.push(e[1]);let c=i.matchAll(/import\.meta\.env\.([A-Z_][A-Z0-9_]*)/g);for(let e of c)e[1]&&a.push(e[1]);if(s){let n=i.matchAll(/import\s+[^;]*from\s+['"]([^'"]+)['"]/g);for(let o of n){let n=o[1],c=[];if(t?c=lt(n,t,e):n.startsWith(`.`)&&(c=[r.default.resolve(r.default.dirname(e),n)]),c.some(e=>e.replace(/\.(ts|js|tsx|jsx)$/,``)===s)){let e=i.matchAll(/\benv\.([A-Z_][A-Z0-9_]*)/g);for(let t of e)t[1]&&a.push(t[1])}}}}catch{}return Array.from(new Set(a))}async function dt(e=process.cwd(),t,i){let a=r.default.join(e,`.env.example`);try{let e=ct(await n.default.readFile(a,`utf-8`));if(e.length>0)return{keys:e,source:`.env.example`}}catch{}let o=await ut(e,t,i);return o.length>0?{keys:o,source:`project`}:null}var ft=e.n({checkTsConfig:()=>ht,findTsConfig:()=>J,loadTsConfig:()=>mt});const pt=(0,l.createRequire)(require(`url`).pathToFileURL(__filename).href).resolve;async function J(e=process.cwd()){let t=[`tsconfig.app.json`,`tsconfig.json`,`tsconfig.base.json`,`tsconfig.node.json`],i=e;for(;i!==r.default.parse(i).root;){for(let e of t){let t=r.default.join(i,e);try{return await n.default.access(t),t}catch{}}i=r.default.dirname(i)}return null}async function mt(e,t=new Set){let i=r.default.resolve(e);if(t.has(i))throw Error(`Circular extends dependency detected in tsconfig.json: ${i}`);t.add(i);let a=``;try{a=await n.default.readFile(e,`utf-8`)}catch{return{path:e,compilerOptions:{}}}let o=(0,u.parse)(a)||{},s=o.compilerOptions||{},c={};if(o.extends){let n=Array.isArray(o.extends)?o.extends:[o.extends];for(let i of n){let n;if(i.startsWith(`.`)||r.default.isAbsolute(i))n=r.default.resolve(r.default.dirname(e),i);else try{n=pt(i,{paths:[r.default.dirname(e)]})}catch{n=r.default.resolve(r.default.dirname(e),`node_modules`,i)}let a={...(await mt(n,t)).compilerOptions};a.baseUrl&&=r.default.resolve(r.default.dirname(n),a.baseUrl),a.rootDir&&=r.default.resolve(r.default.dirname(n),a.rootDir),c={...c,...a}}}let l={...s};return l.baseUrl&&=r.default.resolve(r.default.dirname(e),l.baseUrl),l.rootDir&&=r.default.resolve(r.default.dirname(e),l.rootDir),c={...c,...l},{...o,path:e,compilerOptions:c}}async function ht(e=process.cwd()){let t=await J(e);if(!t)return{status:`not_found`};let n=r.default.basename(t);try{let e=await mt(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 gt(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 _t(e){let t=e.trim().match(/^v?(\d+)(?:\.(\d+))?(?:\.(\d+))?/);return t?[t[1],t[2]??`0`,t[3]??`0`].join(`.`):null}function vt(e,t){let n=e.trim(),r=n.match(/^[\^~]?\s*(v?\d+(?:\.\d+){0,2})$/);if(r){let e=_t(r[1]);return e!==null&>(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=_t(i);return a&&(r===`>=`||r===`>`||r===`=`)?gt(a,t)>=0:!1})}async function yt(e=process.cwd()){let t=[],i=process.version,a=`22.0.0`;gt(i,a)===-1?t.push({status:`fail`,requirement:`Node.js Version`,message:`Node.js version must be >= ${a}.`,current:i,expected:`>= ${a}`}):t.push({status:`pass`,requirement:`Node.js Version`,message:`Node.js version is compatible.`});let o=null;try{let i=r.default.join(e,`package.json`),a=await n.default.readFile(i,`utf-8`);o=JSON.parse(a),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(o){let e={...o.dependencies,...o.devDependencies}.typescript,n=`5.1.0`;e?vt(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 s=await ht(e);if(s.status===`not_found`)t.push({status:`warn`,requirement:`tsconfig.json`,message:`tsconfig.json not found.`});else{let e=s.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 bt=class{async isEmptyDirectory(e=process.cwd()){try{return(await n.default.readdir(e)).length===0}catch{return!1}}async hasPackageJson(e=process.cwd()){try{return await n.default.access(r.default.join(e,`package.json`)),!0}catch{return!1}}async findTsConfig(e=process.cwd()){return J(e)}async loadTsConfig(e,t=new Set){return mt(e,t)}async getEnvExampleKeys(e=process.cwd(),t,n){return dt(e,t,n)}async suggestDefaultEnvPath(e=process.cwd(),t){return at(e,t)}async checkTsConfig(e=process.cwd()){return ht(e)}async checkRequirements(e=process.cwd()){return yt(e)}async detectFramework(e=process.cwd(),t){return nt(e,t)}async detectBunFeatures(e=process.cwd(),t){return rt(e,t)}async detectPackageManager(e=process.cwd(),t){return it(e,t)}async hasSkill(e=process.cwd()){try{let t=r.default.join(e,`skills-lock.json`),i=await n.default.readFile(t,`utf-8`),a=JSON.parse(i);if(a&&typeof a==`object`&&a.skills&&typeof a.skills==`object`&&`arkenv`in a.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 n.default.access(r.default.join(e,t)),!0}catch{}return!1}};const Y=e=>y.default.cyan(e),xt=y.default.blue(`⛯`);function St(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),{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)}`}}}async function Ct(e=process.cwd()){for(let t of[`vite.config.ts`,`vite.config.js`,`vite.config.mts`,`vite.config.mjs`]){let i=r.default.resolve(e,t);try{return await n.default.access(i),i}catch{}}return null}async function wt(e=process.cwd()){for(let t of[`bunfig.toml`,`bun.setup.ts`,`bun.setup.js`]){let i=r.default.resolve(e,t);try{return await n.default.access(i),i}catch{}}return null}async function Tt(e,t,n){try{let r=St({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 Et(e,t){if(!t||t.length===0)return{success:!0,instructions:i.default`
|
|
88
88
|
${y.default.green(`✔`)} Use ${y.default.bold(`Vanilla`)} Bun runtime integration.
|
|
89
|
-
Access validated variables via your ${
|
|
89
|
+
Access validated variables via your ${Y(`env`)} object for typesafety.
|
|
90
90
|
Primarily used for ${y.default.cyan(`server-side`)} or runtime-only validation.
|
|
91
91
|
No plugins are required.
|
|
92
92
|
`};let n=t.includes(`serve`),r=t.includes(`build`),a=``;return n&&(a+=i.default`
|
|
93
93
|
${y.default.bold(`Bun Fullstack (Bun.serve) Integration:`)}
|
|
94
|
-
To inline environment variables (e.g. ${
|
|
94
|
+
To inline environment variables (e.g. ${Y(`PUBLIC_*`)}) in your ${y.default.cyan(`client-side`)} code, add the plugin to ${Y(`bunfig.toml`)}:
|
|
95
95
|
|
|
96
96
|
[serve.static]
|
|
97
97
|
plugins = ["@arkenv/bun-plugin"]
|
|
@@ -99,16 +99,16 @@ ${t?(0,a.styleText)(`cyan`,V):``}
|
|
|
99
99
|
`),r&&(a&&(a+=`
|
|
100
100
|
`),a+=i.default`
|
|
101
101
|
${y.default.bold(`Bun Fullstack programmatic bundling (Bun.build):`)}
|
|
102
|
-
To inline environment variables (e.g. ${
|
|
102
|
+
To inline environment variables (e.g. ${Y(`PUBLIC_*`)}) in your custom ${y.default.cyan(`client-side`)} build script, add the plugin to your ${Y(`Bun.build`)} call:
|
|
103
103
|
|
|
104
|
-
${
|
|
104
|
+
${Y(`import arkenv from "@arkenv/bun-plugin";`)}
|
|
105
105
|
|
|
106
106
|
await Bun.build({
|
|
107
107
|
entrypoints: ["./index.ts"],
|
|
108
108
|
outdir: "./dist",
|
|
109
109
|
${y.default.green(`plugins: [arkenv]`)}
|
|
110
110
|
});
|
|
111
|
-
`),{success:!0,instructions:a.trim()}}async function Et(e,t){let n=t||await J();if(!n)return{status:`not_found`};let i=r.default.basename(n);try{let t=await e.readFile(n);if((0,u.parse)(t)?.compilerOptions?.strict===!0)return{status:`already_strict`,file:i};let r=(0,u.applyEdits)(t,(0,u.modify)(t,[`compilerOptions`,`strict`],!0,{formattingOptions:{insertSpaces:!0,tabSize:2}}));return await e.writeFile(n,r),{status:`updated`,file:i}}catch{return{status:`error`,file:i}}}var Dt=class{constructor(e,t){this.isQuiet=e,this.stdio=t}async exists(e){try{return await n.default.access(e),!0}catch{return!1}}async readFile(e){return n.default.readFile(e,`utf-8`)}async writeFile(e,t){await n.default.writeFile(e,t,`utf-8`)}async mkdir(e,t){await n.default.mkdir(e,{recursive:t})}async execute(e,t=[],n){return new Promise((r,i)=>{let a=(0,d.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${y.default.dim(`STDOUT:`)}\n${o}`),s&&(n+=`\n${y.default.red(`STDERR:`)}\n${s}`)),i(Error(n))}}),a.on(`error`,i)})}async updateTsConfigToStrict(e){return Et(this,e)}async findViteConfig(e){return St(e)}async findBunConfig(e){return Ct(e)}async bootstrapViteConfig(e,t){return wt(this,e,t)}async bootstrapBunConfig(e,t){return Tt(e,t)}async safeAppend(e,t,n){let{safeAppend:r}=await Promise.resolve().then(()=>p);return r(e,t,n)}};async function Ot(e){let t=e.defaultPath||`./src/env.ts`;if(e.hasEnvSchemaFile){let e=await U({message:y.default.yellow(`An existing ArkEnv configuration was found at ${X(t)}. Do you want to overwrite it?`),initialValue:!1,active:`Yes (override my configuration)`,inactive:`No (abort)`});return I(e)||!e?null:e}return!0}async function kt(e){let t=e.detectedKeys,n=e.keysSource||`.env.example`;if(t&&t.length>0){let e=t.length,r=e===1,i=await U({message:n===`.env.example`?`Detected ${X(`.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 I(i)?null:i}return!1}async function At(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 U({message:`Establish ${X(t)} for typesafe environment variables?`,initialValue:!0,active:`Yes (Recommended)`,inactive:`No`});return I(n)?null:n}return!0}async function jt(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 K({message:`Found existing ${X(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 I(e)?null:e}return`overwrite`}async function Mt(e){let t=await K({message:`Select an example:`,options:e.examples.map(e=>({value:e.id,label:e.name,...e.description?{hint:e.description}:{}}))});return I(t)?null:t}async function Nt(e){let t=await K({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`}]});return I(t)?null:t}async function Pt(e){let t=await U({message:`Optional: Would you also like to bootstrap a custom Bun.build script for programmatic bundling?`,initialValue:e.initialValue??!1});return I(t)?null:t}async function Ft(){let e=await K({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 I(e)?null:e}async function It(){let e=await K({message:`How would you like to structure your environment variables?`,options:[{value:`strict`,label:`Strict (Recommended)`,hint:`Generates separate shared, client, and server files for maximum security`},{value:`simple`,label:`Simple`,hint:`Generates a single unified file for quick prototyping`}]});return I(e)?null:e}async function Lt(e){let t=await U({message:`Enable automated Next.js code generation for environment variables?`,initialValue:e.initialValue??!0,active:`Yes (Recommended)`,inactive:`No`});return I(t)?null:t}async function Rt(e){let t=await U({message:`Use default config path (${X(e.defaultEnvPath||`./src/env.ts`)})?`,initialValue:!0,active:`Yes (Recommended)`,inactive:`No, let me customize it`});return I(t)?null:t}async function zt(e){let t=e.defaultEnvPath||`./src/env.ts`;if(!e.useDefaultPath){let e=await $e({message:`Where should we create the ArkEnv config?`,placeholder:t,initialValue:t,defaultValue:t});if(I(e))return null;let n=typeof e==`string`?e.trim():``;return n===``?t:n}return t}const Z={example:Mt,overwriteEnvSchemaFile:Ot,framework:Nt,bunBuild:Pt,layout:It,nextjsCodegen:Lt,useDefaultPath:Rt,path:zt,installTypeDefinitions:At,envDtsHandling:jt,validator:Ft,useEnvExample:kt};async function Bt(e,t=!1){return(e?.mode||`existing`)===`new`?Vt(e,t):Ht(e,t)}async function Vt(e,t=!1){let n=e?.examples||[],i=`arkenv-project`;try{let a;if(e?.name){let t=e.name.trim();a=t===`.`||t===`./`||r.default.resolve(process.cwd(),t)===process.cwd()?`.`:t}else if(t)a=i;else{let e=(Q(await $e({message:`Project name:`,placeholder:i,defaultValue:i}))||i).trim();a=e===`.`||e===`./`||r.default.resolve(process.cwd(),e)===process.cwd()?`.`:e}let o=e?.example;!o&&!t?o=Q(await Z.example({examples:n})):!o&&t&&(o=`basic`);let s=n.find(e=>e.id===o);if(!s){let e=n.map(e=>e.id).join(`, `);throw Error(`Unknown example ${o}. Available examples: ${e}`)}return{mode:`new`,example:s.id,name:a,path:`./src/env.ts`,validator:`arktype`,framework:s.framework,language:`ts`,installSkill:!1}}catch(e){if(e instanceof Wt)return null;throw e}}async function Ht(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`&&(a=e?.isStrict?`strict`:e?.isSimple?`simple`:`strict`);let o=await Ut(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})}try{let n=Q(await Z.overwriteEnvSchemaFile({hasEnvSchemaFile:e?.hasEnvSchemaFile??!1,defaultPath:r})),o=Q(await Z.framework({framework:e?.framework})),s;o===`nextjs`&&(s=e?.isStrict?`strict`:e?.isSimple?`simple`:Q(await Z.layout()));let c;if(o===`bun-fullstack`){let t=!!e?.bunFeatures?.includes(`build`);c=Q(await Z.bunBuild({initialValue:t}))}let l=e?.disableCodegen;o===`nextjs`&&l===void 0&&(l=!Q(await Z.nextjsCodegen({initialValue:!0})));let u=Q(await Z.useDefaultPath({defaultEnvPath:r})),d=Q(await Z.path({useDefaultPath:u,defaultEnvPath:r})),f=await Ut(e,o,d),p=Q(await Z.installTypeDefinitions({framework:o,hasTypeFile:f})),m=Q(await Z.envDtsHandling({framework:o,installTypeDefinitions:p,hasTypeFile:f})),h=Q(await Z.validator()),g=Q(await Z.useEnvExample({detectedKeys:i,keysSource:a}));return(0,t.shake)({mode:`existing`,overwriteEnvSchemaFile:n,framework:o,layout:s,path:d,installTypeDefinitions:p,envDtsHandling:m,validator:h,bunFeatures:o===`bun-fullstack`?c?[`serve`,`build`]:[`serve`]:void 0,language:`ts`,installSkill:!1,envKeys:g?i??void 0:void 0,disableCodegen:l})}catch(e){if(e instanceof Wt)return null;throw e}}async function Ut(e,t,n){return await e?.hasTypeFileAtPath?.({framework:t,envPath:n})??e?.hasTypeFile??!1}var Wt=class extends Error{constructor(){super(`Operation cancelled`)}};function Q(e){if(e===null||I(e))throw Ge(`Operation cancelled`),new Wt;return e}var Gt=class{async confirm(e,n=!0,r,i){let a=await U((0,t.shake)({message:e,initialValue:n,active:r,inactive:i}));return I(a)?null:a}async runWizard(e,t=!1){return Bt(e,t)}};const Kt={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:`-a`,kind:`boolean`},helpRequested:{long:`--help`,short:`-h`,kind:`boolean`},example:{long:`--example`,short:`-e`,kind:`value`},isStrict:{long:`--strict`,short:``,kind:`boolean`},isSimple:{long:`--simple`,short:``,kind:`boolean`},noCodegen:{long:`--no-codegen`,short:`-C`,kind:`boolean`}},qt=new Set(Object.values(Kt).flatMap(e=>[e.long,e.short].filter(Boolean))),Jt=new Set(Object.values(Kt).filter(e=>e.kind===`value`).flatMap(e=>[e.long,e.short].filter(Boolean)));var Yt=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(Jt.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}`);Jt.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(!qt.has(e)){this.validationError=`Unknown argument: ${e}`;break}if(Jt.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}this.validationError||(o.length>1?this.validationError=`Unknown argument: ${o[1]}`:this.name=o[0]),this.logger=t.logger||new tt({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=Kt.example;return this.getFlagValue(e.long,e.short)}get isStrict(){return this.hasFlag(`isStrict`)}get isSimple(){return this.hasFlag(`isSimple`)}get noCodegen(){return this.hasFlag(`noCodegen`)}hasFlag(e){let t=Kt[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};return this.example!==void 0&&(e.example=this.example),this.name!==void 0&&(e.name=this.name),this.noCodegen&&(e.noCodegen=!0),e}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]}},Xt=`0.2.6`;function Zt(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 Qt=class{constructor(e){this.logger=e}async execute(){let e=[{left:`arkenv init [project-name]`,right:`Set up ArkEnv in your project`}],t=[{left:`--yes, -y`,right:`Skip prompts and use defaults (also passed to subprocesses)`},{left:`--force, -f`,right:`Bypass technical requirement checks and force scaffolding`},{left:`--agent, -a`,right:`Enable non-interactive, machine-readable mode for AI agents. Bypasses all prompts and outputs structured JSON. Macro for --yes --quiet --json`},{left:`--example, -e`,right:`Specify an example name when creating a new project`},{left:`--quiet, -q`,right:`Quiet mode: Suppress output, capture logs on failure`},{left:`--json, -j`,right:`Output structured JSON to stdout`},{left:`--no-codegen, -C`,right:`Disable automatic env.gen.ts code generation for Next.js`},{left:`--help, -h`,right:`Show this help message`}];this.logger.log(`ArkEnv CLI v${Xt}`),this.logger.log(`\n${y.default.bold(`Usage:`)}`);for(let t of Zt(e))this.logger.log(t);this.logger.log(`\n${y.default.bold(`Options:`)}`);for(let e of Zt(t))this.logger.log(e)}};function $t(e,t,n,r){let{extraImports:i,serverField:a,clientField:o,sharedField:s,defaultServerFields:c,defaultClientFields:l,defaultSharedFields:u}=t,d=[],f=[],p=[];if(e&&e.length>0)for(let t of e)t.startsWith(`NEXT_PUBLIC_`)?f.push(o(t)):t===`NODE_ENV`||t===`PORT`?p.push(s(t,t===`PORT`)):d.push(a(t));else d.push(...c),f.push(...l),p.push(...u);let m=[];if(d.length>0&&m.push(`\tserver: {\n${d.join(`
|
|
111
|
+
`),{success:!0,instructions:a.trim()}}async function Dt(e,t){let n=t||await J();if(!n)return{status:`not_found`};let i=r.default.basename(n);try{let t=await e.readFile(n);if((0,u.parse)(t)?.compilerOptions?.strict===!0)return{status:`already_strict`,file:i};let r=(0,u.applyEdits)(t,(0,u.modify)(t,[`compilerOptions`,`strict`],!0,{formattingOptions:{insertSpaces:!0,tabSize:2}}));return await e.writeFile(n,r),{status:`updated`,file:i}}catch{return{status:`error`,file:i}}}var Ot=class{constructor(e,t){this.isQuiet=e,this.stdio=t}async exists(e){try{return await n.default.access(e),!0}catch{return!1}}async readFile(e){return n.default.readFile(e,`utf-8`)}async writeFile(e,t){await n.default.writeFile(e,t,`utf-8`)}async mkdir(e,t){await n.default.mkdir(e,{recursive:t})}async execute(e,t=[],n){return new Promise((r,i)=>{let a=(0,d.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${y.default.dim(`STDOUT:`)}\n${o}`),s&&(n+=`\n${y.default.red(`STDERR:`)}\n${s}`)),i(Error(n))}}),a.on(`error`,i)})}async updateTsConfigToStrict(e){return Dt(this,e)}async findViteConfig(e){return Ct(e)}async findBunConfig(e){return wt(e)}async bootstrapViteConfig(e,t){return Tt(this,e,t)}async bootstrapBunConfig(e,t){return Et(e,t)}async safeAppend(e,t,n){let{safeAppend:r}=await Promise.resolve().then(()=>p);return r(e,t,n)}};async function kt(e){let t=e.defaultPath||`./src/env.ts`;if(e.hasEnvSchemaFile){let e=await U({message:y.default.yellow(`An existing ArkEnv configuration was found at ${Y(t)}. Do you want to overwrite it?`),initialValue:!1,active:`Yes (override my configuration)`,inactive:`No (abort)`});return I(e)||!e?null:e}return!0}async function At(e){let t=e.detectedKeys,n=e.keysSource||`.env.example`;if(t&&t.length>0){let e=t.length,r=e===1,i=await U({message:n===`.env.example`?`Detected ${Y(`.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 I(i)?null:i}return!1}async function jt(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 U({message:`Establish ${Y(t)} for typesafe environment variables?`,initialValue:!0,active:`Yes (Recommended)`,inactive:`No`});return I(n)?null:n}return!0}async function Mt(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 K({message:`Found existing ${Y(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 I(e)?null:e}return`overwrite`}async function Nt(e){let t=await K({message:`Select an example:`,options:e.examples.map(e=>({value:e.id,label:e.name,...e.description?{hint:e.description}:{}}))});return I(t)?null:t}async function Pt(e){let t=await K({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`}]});return I(t)?null:t}async function Ft(e){let t=await U({message:`Optional: Would you also like to bootstrap a custom Bun.build script for programmatic bundling?`,initialValue:e.initialValue??!1});return I(t)?null:t}async function It(){let e=await K({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 I(e)?null:e}async function Lt(){let e=await K({message:`How would you like to structure your environment variables?`,options:[{value:`strict`,label:`Strict (Recommended)`,hint:`Generates separate shared, client, and server files for maximum security`},{value:`simple`,label:`Simple`,hint:`Generates a single unified file for quick prototyping`}]});return I(e)?null:e}async function Rt(e){let t=await U({message:`Enable automated Next.js code generation for environment variables?`,initialValue:e.initialValue??!0,active:`Yes (Recommended)`,inactive:`No`});return I(t)?null:t}async function zt(e){let t=await U({message:`Use default config path (${Y(e.defaultEnvPath||`./src/env.ts`)})?`,initialValue:!0,active:`Yes (Recommended)`,inactive:`No, let me customize it`});return I(t)?null:t}async function Bt(e){let t=e.defaultEnvPath||`./src/env.ts`;if(!e.useDefaultPath){let e=await $e({message:`Where should we create the ArkEnv config?`,placeholder:t,initialValue:t,defaultValue:t});if(I(e))return null;let n=typeof e==`string`?e.trim():``;return n===``?t:n}return t}const X={example:Nt,overwriteEnvSchemaFile:kt,framework:Pt,bunBuild:Ft,layout:Lt,nextjsCodegen:Rt,useDefaultPath:zt,path:Bt,installTypeDefinitions:jt,envDtsHandling:Mt,validator:It,useEnvExample:At};async function Vt(e,t=!1){return(e?.mode||`existing`)===`new`?Ht(e,t):Ut(e,t)}async function Ht(e,t=!1){let n=e?.examples||[],i=`arkenv-project`;try{let a;if(e?.name){let t=e.name.trim();a=t===`.`||t===`./`||r.default.resolve(process.cwd(),t)===process.cwd()?`.`:t}else if(t)a=i;else{let e=(Z(await $e({message:`Project name:`,placeholder:i,defaultValue:i}))||i).trim();a=e===`.`||e===`./`||r.default.resolve(process.cwd(),e)===process.cwd()?`.`:e}let o=e?.example;!o&&!t?o=Z(await X.example({examples:n})):!o&&t&&(o=`basic`);let s=n.find(e=>e.id===o);if(!s){let e=n.map(e=>e.id).join(`, `);throw Error(`Unknown example ${o}. Available examples: ${e}`)}return{mode:`new`,example:s.id,name:a,path:`./src/env.ts`,validator:`arktype`,framework:s.framework,language:`ts`,installSkill:!1}}catch(e){if(e instanceof Gt)return null;throw e}}async function Ut(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`&&(a=e?.isStrict?`strict`:e?.isSimple?`simple`:`strict`);let o=await Wt(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})}try{let n=Z(await X.overwriteEnvSchemaFile({hasEnvSchemaFile:e?.hasEnvSchemaFile??!1,defaultPath:r})),o=Z(await X.framework({framework:e?.framework})),s;o===`nextjs`&&(s=e?.isStrict?`strict`:e?.isSimple?`simple`:Z(await X.layout()));let c;if(o===`bun-fullstack`){let t=!!e?.bunFeatures?.includes(`build`);c=Z(await X.bunBuild({initialValue:t}))}let l=e?.disableCodegen;o===`nextjs`&&l===void 0&&(l=!Z(await X.nextjsCodegen({initialValue:!0})));let u=Z(await X.useDefaultPath({defaultEnvPath:r})),d=Z(await X.path({useDefaultPath:u,defaultEnvPath:r})),f=await Wt(e,o,d),p=Z(await X.installTypeDefinitions({framework:o,hasTypeFile:f})),m=Z(await X.envDtsHandling({framework:o,installTypeDefinitions:p,hasTypeFile:f})),h=Z(await X.validator()),g=Z(await X.useEnvExample({detectedKeys:i,keysSource:a}));return(0,t.shake)({mode:`existing`,overwriteEnvSchemaFile:n,framework:o,layout:s,path:d,installTypeDefinitions:p,envDtsHandling:m,validator:h,bunFeatures:o===`bun-fullstack`?c?[`serve`,`build`]:[`serve`]:void 0,language:`ts`,installSkill:!1,envKeys:g?i??void 0:void 0,disableCodegen:l})}catch(e){if(e instanceof Gt)return null;throw e}}async function Wt(e,t,n){return await e?.hasTypeFileAtPath?.({framework:t,envPath:n})??e?.hasTypeFile??!1}var Gt=class extends Error{constructor(){super(`Operation cancelled`)}};function Z(e){if(e===null||I(e))throw Ge(`Operation cancelled`),new Gt;return e}var Kt=class{async confirm(e,n=!0,r,i){let a=await U((0,t.shake)({message:e,initialValue:n,active:r,inactive:i}));return I(a)?null:a}async runWizard(e,t=!1){return Vt(e,t)}};const qt={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:`-a`,kind:`boolean`},helpRequested:{long:`--help`,short:`-h`,kind:`boolean`},example:{long:`--example`,short:`-e`,kind:`value`},isStrict:{long:`--strict`,short:``,kind:`boolean`},isSimple:{long:`--simple`,short:``,kind:`boolean`},noCodegen:{long:`--no-codegen`,short:`-C`,kind:`boolean`}},Jt=new Set(Object.values(qt).flatMap(e=>[e.long,e.short].filter(Boolean))),Yt=new Set(Object.values(qt).filter(e=>e.kind===`value`).flatMap(e=>[e.long,e.short].filter(Boolean)));var Xt=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(Yt.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}`);Yt.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(!Jt.has(e)){this.validationError=`Unknown argument: ${e}`;break}if(Yt.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}this.validationError||(o.length>1?this.validationError=`Unknown argument: ${o[1]}`:this.name=o[0]),this.logger=t.logger||new tt({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=qt.example;return this.getFlagValue(e.long,e.short)}get isStrict(){return this.hasFlag(`isStrict`)}get isSimple(){return this.hasFlag(`isSimple`)}get noCodegen(){return this.hasFlag(`noCodegen`)}hasFlag(e){let t=qt[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};return this.example!==void 0&&(e.example=this.example),this.name!==void 0&&(e.name=this.name),this.noCodegen&&(e.noCodegen=!0),e}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]}},Zt=`0.2.7`;function Qt(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 $t=class{constructor(e){this.logger=e}async execute(){let e=[{left:`arkenv init [project-name]`,right:`Set up ArkEnv in your project`}],t=[{left:`--yes, -y`,right:`Skip prompts and use defaults (also passed to subprocesses)`},{left:`--force, -f`,right:`Bypass technical requirement checks and force scaffolding`},{left:`--agent, -a`,right:`Enable non-interactive, machine-readable mode for AI agents. Bypasses all prompts and outputs structured JSON. Macro for --yes --quiet --json`},{left:`--example, -e`,right:`Specify an example name when creating a new project`},{left:`--quiet, -q`,right:`Quiet mode: Suppress output, capture logs on failure`},{left:`--json, -j`,right:`Output structured JSON to stdout`},{left:`--no-codegen, -C`,right:`Disable automatic env.gen.ts code generation for Next.js`},{left:`--help, -h`,right:`Show this help message`}];this.logger.log(`ArkEnv CLI v${Zt}`),this.logger.log(`\n${y.default.bold(`Usage:`)}`);for(let t of Qt(e))this.logger.log(t);this.logger.log(`\n${y.default.bold(`Options:`)}`);for(let e of Qt(t))this.logger.log(e)}};function en(e,t,n,r){let{extraImports:i,serverField:a,clientField:o,sharedField:s,defaultServerFields:c,defaultClientFields:l,defaultSharedFields:u}=t,d=[],f=[],p=[];if(e&&e.length>0)for(let t of e)t.startsWith(`NEXT_PUBLIC_`)?f.push(o(t)):t===`NODE_ENV`||t===`PORT`?p.push(s(t,t===`PORT`)):d.push(a(t));else d.push(...c),f.push(...l),p.push(...u);let m=[];if(d.length>0&&m.push(`\tserver: {\n${d.join(`
|
|
112
112
|
`)}\n\t}`),f.length>0&&m.push(`\tclient: {\n${f.join(`
|
|
113
113
|
`)}\n\t}`),p.length>0&&m.push(`\tshared: {\n${p.join(`
|
|
114
114
|
`)}\n\t}`),r){let t=[];if(e&&e.length>0)for(let n of e)(n.startsWith(`NEXT_PUBLIC_`)||n===`NODE_ENV`||n===`PORT`)&&t.push(`\t\t${n}: process.env.${n},`);else t.push(` NEXT_PUBLIC_API_URL: process.env.NEXT_PUBLIC_API_URL,`,` NODE_ENV: process.env.NODE_ENV,`);return m.push(`\truntimeEnv: {\n${t.join(`
|
|
@@ -136,7 +136,7 @@ export const env = createEnv({
|
|
|
136
136
|
${m.join(`,
|
|
137
137
|
`)},
|
|
138
138
|
});
|
|
139
|
-
`}const
|
|
139
|
+
`}const tn=(e,t,n,r)=>{let a=e?.length?e.map(e=>`\t\t${e}: "string?",`).join(`
|
|
140
140
|
`):` NODE_ENV: "'development' | 'production' | 'test' = 'development'",
|
|
141
141
|
PORT: "number.port = 3000",`;return t===`vite`?i.default`
|
|
142
142
|
import { type } from "arkenv";
|
|
@@ -160,7 +160,7 @@ ${m.join(`,
|
|
|
160
160
|
export const Env = type({
|
|
161
161
|
${a}
|
|
162
162
|
});
|
|
163
|
-
`:t===`nextjs
|
|
163
|
+
`:t===`nextjs`?en(e,{serverField:e=>`\t\t${e}: "string?",`,clientField:e=>`\t\t${e}: "string?",`,sharedField:(e,t)=>`\t\t${e}: "${t?`number.port = 3000`:`'development' | 'production' | 'test' = 'development'`}",`,defaultServerFields:[` DATABASE_URL: "string = 'postgres://localhost:5432/mydb'",`],defaultClientFields:[` NEXT_PUBLIC_API_URL: "string = 'https://api.example.com'",`],defaultSharedFields:[` NODE_ENV: "'development' | 'production' | 'test' = 'development'",`]},n,r):i.default`
|
|
164
164
|
import arkenv, { type } from "arkenv";
|
|
165
165
|
|
|
166
166
|
/**
|
|
@@ -171,7 +171,7 @@ ${a}
|
|
|
171
171
|
});
|
|
172
172
|
|
|
173
173
|
export const env = arkenv(Env);
|
|
174
|
-
`},
|
|
174
|
+
`},nn=e=>i.default`
|
|
175
175
|
/// <reference types="vite/client" />
|
|
176
176
|
|
|
177
177
|
type ImportMetaEnvAugmented =
|
|
@@ -184,7 +184,7 @@ ${a}
|
|
|
184
184
|
interface ImportMeta {
|
|
185
185
|
readonly env: ImportMetaEnv;
|
|
186
186
|
}
|
|
187
|
-
`,
|
|
187
|
+
`,rn=e=>i.default`
|
|
188
188
|
/// <reference types="bun-types" />
|
|
189
189
|
|
|
190
190
|
type ProcessEnvAugmented = import("@arkenv/bun-plugin").ProcessEnvAugmented<
|
|
@@ -194,7 +194,7 @@ ${a}
|
|
|
194
194
|
declare namespace NodeJS {
|
|
195
195
|
interface ProcessEnv extends ProcessEnvAugmented {}
|
|
196
196
|
}
|
|
197
|
-
`,
|
|
197
|
+
`,an=(e,t,n,r)=>{let a=e?.length?e.map(e=>`\t\t${e}: v.optional(v.string()),`).join(`
|
|
198
198
|
`):` NODE_ENV: v.optional(v.picklist(["development", "production", "test"]), "development"),
|
|
199
199
|
PORT: v.optional(v.pipe(v.string(), v.transform(Number), v.number(), v.integer(), v.minValue(1), v.maxValue(65535)), 3000),`;return t===`vite`?i.default`
|
|
200
200
|
import { type } from "arkenv";
|
|
@@ -220,7 +220,7 @@ ${a}
|
|
|
220
220
|
export const Env = type({
|
|
221
221
|
${a}
|
|
222
222
|
});
|
|
223
|
-
`:t===`nextjs
|
|
223
|
+
`:t===`nextjs`?en(e,{extraImports:`import * as v from "valibot";`,serverField:e=>`\t\t${e}: v.optional(v.string()),`,clientField:e=>`\t\t${e}: v.optional(v.string()),`,sharedField:(e,t)=>`\t\t${e}: ${t?`v.optional(v.pipe(v.string(), v.transform(Number), v.number(), v.integer(), v.minValue(1), v.maxValue(65535)), 3000)`:`v.optional(v.picklist(["development", "production", "test"]), "development")`},`,defaultServerFields:[` DATABASE_URL: v.optional(v.pipe(v.string(), v.url()), "postgres://localhost:5432/mydb"),`],defaultClientFields:[` NEXT_PUBLIC_API_URL: v.optional(v.pipe(v.string(), v.url()), "https://api.example.com"),`],defaultSharedFields:[` NODE_ENV: v.optional(v.picklist(["development", "production", "test"]), "development"),`]},n,r):i.default`
|
|
224
224
|
import arkenv from "arkenv/standard";
|
|
225
225
|
import * as v from "valibot";
|
|
226
226
|
|
|
@@ -230,7 +230,7 @@ ${a}
|
|
|
230
230
|
export const env = arkenv({
|
|
231
231
|
${a}
|
|
232
232
|
});
|
|
233
|
-
`},
|
|
233
|
+
`},on=(e,t,n,r)=>{let a=e?.length?e.map(e=>`\t\t${e}: z.string().optional(),`).join(`
|
|
234
234
|
`):` NODE_ENV: z.enum(["development", "production", "test"]).default("development"),
|
|
235
235
|
PORT: z.coerce.number().int().min(1).max(65535).default(3000),`;return t===`vite`?i.default`
|
|
236
236
|
import { type } from "arkenv";
|
|
@@ -256,7 +256,7 @@ ${a}
|
|
|
256
256
|
export const Env = type({
|
|
257
257
|
${a}
|
|
258
258
|
});
|
|
259
|
-
`:t===`nextjs
|
|
259
|
+
`:t===`nextjs`?en(e,{extraImports:`import { z } from "zod";`,serverField:e=>`\t\t${e}: z.string().optional(),`,clientField:e=>`\t\t${e}: z.string().optional(),`,sharedField:(e,t)=>`\t\t${e}: ${t?`z.coerce.number().int().min(1).max(65535).default(3000)`:`z.enum(["development", "production", "test"]).default("development")`},`,defaultServerFields:[` DATABASE_URL: z.string().url().default("postgres://localhost:5432/mydb"),`],defaultClientFields:[` NEXT_PUBLIC_API_URL: z.string().url().default("https://api.example.com"),`],defaultSharedFields:[` NODE_ENV: z.enum(["development", "production", "test"]).default("development"),`]},n,r):i.default`
|
|
260
260
|
import arkenv from "arkenv/standard";
|
|
261
261
|
import { z } from "zod";
|
|
262
262
|
|
|
@@ -266,116 +266,115 @@ ${a}
|
|
|
266
266
|
export const env = arkenv({
|
|
267
267
|
${a}
|
|
268
268
|
});
|
|
269
|
-
`};function
|
|
269
|
+
`};function sn(e,t){let{validator:n,envKeys:r,framework:i,disableCodegen:a}=e;switch(n){case`arktype`:return`${tn(r,i,t,a)}\n`;case`zod`:return`${on(r,i,t,a)}\n`;case`valibot`:return`${an(r,i,t,a)}\n`;default:throw Error(`Unsupported validator: ${n}`)}}function Q(e,t=` `){return e.length===0?`{}`:`{\n${t}${e.map(e=>e.trim()).join(`\n${t}`)}\n${t.slice(1)}}`}function cn(e){let{validator:t,envKeys:n,disableCodegen:r}=e,i=[],a=[],o=[],s=[];if(n&&n.length>0)for(let e of n)e.startsWith(`NEXT_PUBLIC_`)?(t===`arktype`?a.push(`${e}: "string?",`):t===`zod`?a.push(`${e}: z.string().optional(),`):t===`valibot`&&a.push(`${e}: v.optional(v.string()),`),s.push(`${e}: process.env.${e},`)):e===`NODE_ENV`||e===`PORT`?(t===`arktype`?o.push(`${e}: "${e===`PORT`?`number.port = 3000`:`'development' | 'production' | 'test' = 'development'`}",`):t===`zod`?o.push(`${e}: ${e===`PORT`?`z.coerce.number().int().min(1).max(65535).default(3000)`:`z.enum(["development", "production", "test"]).default("development")`},`):t===`valibot`&&o.push(`${e}: ${e===`PORT`?`v.optional(v.pipe(v.string(), v.transform(Number), v.number(), v.integer(), v.minValue(1), v.maxValue(65535)), 3000)`:`v.optional(v.picklist(["development", "production", "test"]), "development")`},`),s.push(`${e}: process.env.${e},`)):t===`arktype`?i.push(`${e}: "string?",`):t===`zod`?i.push(`${e}: z.string().optional(),`):t===`valibot`&&i.push(`${e}: v.optional(v.string()),`);else t===`arktype`?(i.push(`DATABASE_URL: "string = 'postgres://localhost:5432/mydb'",`),a.push(`NEXT_PUBLIC_API_URL: "string = 'https://api.example.com'",`),o.push(`NODE_ENV: "'development' | 'production' | 'test' = 'development'",`)):t===`zod`?(i.push(`DATABASE_URL: z.string().url().default("postgres://localhost:5432/mydb"),`),a.push(`NEXT_PUBLIC_API_URL: z.string().url().default("https://api.example.com"),`),o.push(`NODE_ENV: z.enum(["development", "production", "test"]).default("development"),`)):t===`valibot`&&(i.push(`DATABASE_URL: v.optional(v.pipe(v.string(), v.url()), "postgres://localhost:5432/mydb"),`),a.push(`NEXT_PUBLIC_API_URL: v.optional(v.pipe(v.string(), v.url()), "https://api.example.com"),`),o.push(`NODE_ENV: v.optional(v.picklist(["development", "production", "test"]), "development"),`)),s.push(`NEXT_PUBLIC_API_URL: process.env.NEXT_PUBLIC_API_URL,`,`NODE_ENV: process.env.NODE_ENV,`);let c=``,l=``,u=``;return t===`arktype`?(c=`import { type } from "@arkenv/nextjs/shared";
|
|
270
270
|
|
|
271
271
|
/**
|
|
272
272
|
* @internal 🛑 INTERNAL SCHEMA ONLY.
|
|
273
273
|
* Do not import this directly. Import \`env\` from \`./client\` or \`./server\` instead.
|
|
274
274
|
*/
|
|
275
|
-
export const SharedSchema = type({
|
|
276
|
-
${a.map(e=>e.trim()).join(`
|
|
277
|
-
`)}
|
|
278
|
-
});`,c=`import arkenv from "@arkenv/nextjs/client";
|
|
275
|
+
export const SharedSchema = type(${Q(o,` `)});`,l=r?`import arkenv from "@arkenv/nextjs/client";
|
|
279
276
|
import { SharedSchema } from "./internal/shared";
|
|
280
277
|
|
|
281
278
|
export const env = arkenv(
|
|
282
|
-
{
|
|
283
|
-
${i.map(e=>e.trim()).join(`
|
|
284
|
-
`)}
|
|
285
|
-
},
|
|
279
|
+
${Q(a,` `)},
|
|
286
280
|
{
|
|
287
281
|
extends: [SharedSchema],
|
|
288
282
|
runtimeEnv: {
|
|
289
|
-
${
|
|
283
|
+
${s.map(e=>e.trim()).join(`
|
|
290
284
|
`)}
|
|
291
285
|
},
|
|
292
286
|
},
|
|
293
|
-
)
|
|
294
|
-
import {
|
|
287
|
+
);`:`import { createEnv } from "./generated/env.gen";
|
|
288
|
+
import { SharedSchema } from "./internal/shared";
|
|
295
289
|
|
|
296
|
-
export const env =
|
|
290
|
+
export const env = createEnv(
|
|
291
|
+
${Q(a,` `)},
|
|
297
292
|
{
|
|
298
|
-
|
|
299
|
-
`)}
|
|
293
|
+
extends: [SharedSchema],
|
|
300
294
|
},
|
|
295
|
+
);`,u=`import arkenv from "@arkenv/nextjs/server";
|
|
296
|
+
import { env as clientEnv } from "./client";
|
|
297
|
+
|
|
298
|
+
export const env = arkenv(
|
|
299
|
+
${Q(i,` `)},
|
|
301
300
|
{
|
|
302
301
|
extends: [clientEnv],
|
|
303
302
|
},
|
|
304
|
-
);`):t===`zod`?(
|
|
303
|
+
);`):t===`zod`?(c=`import { z } from "zod";
|
|
305
304
|
|
|
306
305
|
/**
|
|
307
306
|
* @internal 🛑 INTERNAL SCHEMA ONLY.
|
|
308
307
|
* Do not import this directly. Import \`env\` from \`./client\` or \`./server\` instead.
|
|
309
308
|
*/
|
|
310
|
-
export const SharedSchema = z.object({
|
|
311
|
-
${a.map(e=>e.trim()).join(`
|
|
312
|
-
`)}
|
|
313
|
-
});`,c=`import arkenv from "@arkenv/nextjs/client";
|
|
309
|
+
export const SharedSchema = z.object(${Q(o,` `)});`,l=r?`import arkenv from "@arkenv/nextjs/client";
|
|
314
310
|
import { z } from "zod";
|
|
315
311
|
import { SharedSchema } from "./internal/shared";
|
|
316
312
|
|
|
317
313
|
export const env = arkenv(
|
|
318
|
-
{
|
|
319
|
-
${i.map(e=>e.trim()).join(`
|
|
320
|
-
`)}
|
|
321
|
-
},
|
|
314
|
+
${Q(a,` `)},
|
|
322
315
|
{
|
|
323
316
|
extends: [SharedSchema],
|
|
324
317
|
runtimeEnv: {
|
|
325
|
-
${
|
|
318
|
+
${s.map(e=>e.trim()).join(`
|
|
326
319
|
`)}
|
|
327
320
|
},
|
|
328
321
|
},
|
|
329
|
-
)
|
|
322
|
+
);`:`import { createEnv } from "./generated/env.gen";
|
|
330
323
|
import { z } from "zod";
|
|
331
|
-
import {
|
|
324
|
+
import { SharedSchema } from "./internal/shared";
|
|
332
325
|
|
|
333
|
-
export const env =
|
|
326
|
+
export const env = createEnv(
|
|
327
|
+
${Q(a,` `)},
|
|
334
328
|
{
|
|
335
|
-
|
|
336
|
-
`)}
|
|
329
|
+
extends: [SharedSchema],
|
|
337
330
|
},
|
|
331
|
+
);`,u=`import arkenv from "@arkenv/nextjs/server";
|
|
332
|
+
import { z } from "zod";
|
|
333
|
+
import { env as clientEnv } from "./client";
|
|
334
|
+
|
|
335
|
+
export const env = arkenv(
|
|
336
|
+
${Q(i,` `)},
|
|
338
337
|
{
|
|
339
338
|
extends: [clientEnv],
|
|
340
339
|
},
|
|
341
|
-
);`):t===`valibot`&&(
|
|
340
|
+
);`):t===`valibot`&&(c=`import * as v from "valibot";
|
|
342
341
|
|
|
343
342
|
/**
|
|
344
343
|
* @internal 🛑 INTERNAL SCHEMA ONLY.
|
|
345
344
|
* Do not import this directly. Import \`env\` from \`./client\` or \`./server\` instead.
|
|
346
345
|
*/
|
|
347
|
-
export const SharedSchema = v.object({
|
|
348
|
-
${a.map(e=>e.trim()).join(`
|
|
349
|
-
`)}
|
|
350
|
-
});`,c=`import arkenv from "@arkenv/nextjs/client";
|
|
346
|
+
export const SharedSchema = v.object(${Q(o,` `)});`,l=r?`import arkenv from "@arkenv/nextjs/client";
|
|
351
347
|
import * as v from "valibot";
|
|
352
348
|
import { SharedSchema } from "./internal/shared";
|
|
353
349
|
|
|
354
350
|
export const env = arkenv(
|
|
355
|
-
{
|
|
356
|
-
${i.map(e=>e.trim()).join(`
|
|
357
|
-
`)}
|
|
358
|
-
},
|
|
351
|
+
${Q(a,` `)},
|
|
359
352
|
{
|
|
360
353
|
extends: [SharedSchema],
|
|
361
354
|
runtimeEnv: {
|
|
362
|
-
${
|
|
355
|
+
${s.map(e=>e.trim()).join(`
|
|
363
356
|
`)}
|
|
364
357
|
},
|
|
365
358
|
},
|
|
366
|
-
)
|
|
359
|
+
);`:`import { createEnv } from "./generated/env.gen";
|
|
367
360
|
import * as v from "valibot";
|
|
368
|
-
import {
|
|
361
|
+
import { SharedSchema } from "./internal/shared";
|
|
369
362
|
|
|
370
|
-
export const env =
|
|
363
|
+
export const env = createEnv(
|
|
364
|
+
${Q(a,` `)},
|
|
371
365
|
{
|
|
372
|
-
|
|
373
|
-
`)}
|
|
366
|
+
extends: [SharedSchema],
|
|
374
367
|
},
|
|
368
|
+
);`,u=`import arkenv from "@arkenv/nextjs/server";
|
|
369
|
+
import * as v from "valibot";
|
|
370
|
+
import { env as clientEnv } from "./client";
|
|
371
|
+
|
|
372
|
+
export const env = arkenv(
|
|
373
|
+
${Q(i,` `)},
|
|
375
374
|
{
|
|
376
375
|
extends: [clientEnv],
|
|
377
376
|
},
|
|
378
|
-
);`),{shared:`${
|
|
377
|
+
);`),{shared:`${c}\n`,client:`${l}\n`,server:`${u}\n`}}async function ln(e,t){let i=t.targetDir??process.cwd(),a=r.default.join(process.cwd(),`.arkenv-temp`);await e.mkdir(a,!0),t.targetDir&&await e.mkdir(i,!0);try{await e.execute(`git`,[`clone`,`--filter=blob:none`,`--sparse`,t.repository,a]);let o=`examples/${t.example}`;await e.execute(`git`,[`-C`,a,`sparse-checkout`,`set`,o]);let s=r.default.join(a,o),c=await n.default.readdir(s),l=[];for(let t of c){let n=r.default.join(i,t);await e.exists(n)&&l.push(t)}if(l.length>0)throw Error(`Scaffolding into a non-empty directory failed. The following paths already exist: ${l.join(`, `)}`);await un(s,i);for(let e of[`package-lock.json`,`pnpm-lock.yaml`,`yarn.lock`,`bun.lockb`,`bun.lock`])await n.default.rm(r.default.join(i,e),{force:!0});let u=r.default.join(i,`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 n.default.rm(a,{recursive:!0,force:!0})}}async function un(e,t){let i=await n.default.readdir(e);await Promise.all(i.map(i=>n.default.cp(r.default.join(e,i),r.default.join(t,i),{recursive:!0,force:!1})))}function dn(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 fn(e,t){if(t||e.metadata.skillDetected)return{message:i.default`
|
|
379
378
|
Inside your AI assistant (e.g. Claude Code), use:
|
|
380
|
-
${
|
|
381
|
-
`,title:`Next steps`};let n=e.skill?.dlxCommand.join(` `)||`npx`,r=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`}return a+=`${o++}. Check ${X(s)} and refine your environment schema.\n`,e.metadata.framework===`vite`?a+=`${o++}. Access via ${X(`import.meta.env.YOUR_VAR`)}\n`:e.metadata.framework===`bun-fullstack`?a+=`${o++}. Access via ${X(`process.env.YOUR_VAR`)}\n`:e.metadata.framework===`nextjs`?e.metadata.layout===`strict`?a+=`${o++}. Import and use: ${X(`import { env } from "${e.metadata.importPath}/client"`)} (client) or ${X(`import { env } from "${e.metadata.importPath}/server"`)} (server)\n`:e.metadata.disableCodegen?a+=`${o++}. Import and use: ${X(`import { env } from "${e.metadata.importPath}"`)}\n`:(a+=`${o++}. Wrap your Next.js config with ${X(`withArkEnv`)} inside ${X(`next.config.ts`)}:\n`,a+=` ${X(`import { withArkEnv } from "@arkenv/nextjs/config";`)}\n`,a+=` ${X(`export default withArkEnv(nextConfig);`)}\n`,a+=`${o++}. Import and use: ${X(`import { env } from "${e.metadata.importPath}"`)}\n`):a+=`${o++}. Import and use: ${X(`import { env } from "${e.metadata.importPath}"`)}\n`,a+=`${o++}. (Recommended) Install the AI skill: ${X(`${n} skills add ${r}`)}\n`,a+=` Then run ${X(`/arkenv`)} inside your AI assistant to finish.`,{message:a,title:`Next steps`}}var fn=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 ${X(e.clone.example)}...`),await cn(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 ${X(r.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 ${X(r.default.basename(t.path))}.`):this.reporter.info(`${X(r.default.basename(t.path))} already contains ArkEnv types.`);continue}if(await this.workspace.mkdir(r.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} ${X(r.default.basename(t.path))} for typesafe environment variables.`)}}if(t.stop(`Configuration scaffolded!`),e.install&&process.env.SKIP_INSTALL!==`true`){this.reporter.step(`Installing dependencies with ${X(e.install.packageManager)}...`);let[t,n]=un(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 ${X(t.file)}`),n=!0):t.status===`error`&&this.reporter.warn(`Could not automatically update ${X(t.file||`tsconfig.json`)}. Please ensure 'strict: true' is set manually.`)}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 ${X(r.default.basename(t))}`):(this.reporter.warn(`Could not automatically update ${X(r.default.basename(t))}: ${n.error}`),this.reporter.info(`Please add ${X(`@arkenv/vite-plugin`)} manually.`))}else this.reporter.info(`No Vite config found — please add ${X(`@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`){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 ${X(`env.gen.ts`)} for Next.js`)}catch{this.reporter.warn(`Failed to automatically generate ${X(`env.gen.ts`)}. It will be generated when you start your dev server.`)}}}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=dn(e,i);if(this.reporter.note(a.message,a.title),e.metadata.layout===`strict`){let t=r.default.resolve(e.cwd,e.metadata.displayPath);if(await this.workspace.exists(t)){let t=e.metadata.displayPath,n=r.default.basename(t,r.default.extname(t));this.reporter.warn(`Found existing single-file schema at ${X(t)}. You can delete it after updating your imports to point to your new ${X(`${n}/client`)} and ${X(`${n}/server`)}.`)}}this.reporter.finish(`${bt} 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}}};function pn(e){switch(e){case`pnpm`:return[`pnpm`,`dlx`];case`yarn`:return[`yarn`,`dlx`];case`bun`:return[`bunx`];default:return[`npx`]}}function mn(e){let{mode:n,options:i,packageManager:a,tsConfig:o,shouldUpdateTsConfig:s,cwd:c,existingFiles:l}=e,u=i.name&&i.name!==`.`?r.default.basename(i.name):void 0,d={files:[],cwd:c,metadata:(0,t.shake)({displayPath:``,framework:i.framework,validator:i.validator,packageManager:a,importPath:``,mode:n,example:i.example,name:u,layout:i.layout,skillDetected:i.skillDetected,disableCodegen:i.disableCodegen})};if(n===`new`){if(!i.example)throw Error(`New project scaffolding requires an example.`);let t=i.name&&i.name!==`.`?r.default.join(c,i.name):void 0,n=i.name&&i.name!==`.`?r.default.basename(i.name):r.default.basename(c);return d.clone={repository:`https://github.com/yamcodes/arkenv.git`,example:i.example,targetName:n,...t!==void 0&&{targetDir:t}},d.install={packageManager:a,dependencies:[],...t!==void 0&&{cwd:t}},i.installSkill&&(d.skill={dlxCommand:pn(a),packageName:`yamcodes/arkenv`,isYes:e.isYes}),d.metadata.displayPath=`./src/env.ts`,d.metadata.importPath=`./src/env`,d}let f=r.default.resolve(c,i.path),p=r.default.dirname(f);if(i.framework===`nextjs`&&i.layout===`strict`){let e=r.default.extname(f),t=f.slice(0,-e.length),n=r.default.join(t,`internal`,`shared${e}`),a=r.default.join(t,`client${e}`),o=r.default.join(t,`server${e}`),s=sn(i),c=l.includes(n),u=l.includes(a),p=l.includes(o);(!c||i.overwriteEnvSchemaFile!==!1)&&d.files.push({path:n,content:s.shared,action:c?`overwrite`:`create`,label:`shared environment schema`}),(!u||i.overwriteEnvSchemaFile!==!1)&&d.files.push({path:a,content:s.client,action:u?`overwrite`:`create`,label:`client environment schema`}),(!p||i.overwriteEnvSchemaFile!==!1)&&d.files.push({path:o,content:s.server,action:p?`overwrite`:`create`,label:`server environment schema`})}else{let e;if(i.framework===`nextjs`&&!i.disableCodegen&&o?.parsed){let t=o.parsed,n=(t.compilerOptions||{}).paths||{};if(n[`@/*`]){let i=t.path?r.default.dirname(t.path):c,a=r.default.join(p,`generated`),o=r.default.relative(i,a).replace(/\\/g,`/`);for(let t of n[`@/*`]){let n=t.replace(/^\.\//,``).replace(/\*$/,``);if(n===``||o.startsWith(n)){let t=o;n!==``&&o.startsWith(n)&&(t=o.substring(n.length)),t=t.replace(/^\/+/,``).replace(/\/+$/,``),e=`@/${t}/env.gen`.replace(/\/+/g,`/`);break}}}}let t=on(i,e),n=l.includes(f);(!n||i.overwriteEnvSchemaFile!==!1)&&d.files.push({path:f,content:t,action:n?`overwrite`:`create`,label:`environment schema`})}let m=[`arkenv`,i.validator];if(i.framework===`vite`&&m.push(`@arkenv/vite-plugin`),i.framework===`bun-fullstack`&&i.bunFeatures?.length&&m.push(`@arkenv/bun-plugin`),i.framework===`nextjs`&&m.push(`@arkenv/nextjs`),(i.framework===`vite`||i.framework===`nextjs`||i.framework===`bun-fullstack`&&i.bunFeatures?.length)&&!m.includes(`arktype`)&&m.push(`arktype`),d.install={packageManager:a,dependencies:m},s&&o.file&&(d.tsConfig={path:r.default.resolve(c,o.file),action:`strict`}),(i.framework===`vite`||i.framework===`bun-fullstack`&&i.bunFeatures?.length)&&i.installTypeDefinitions!==!1){let e=i.framework===`vite`?`vite-env.d.ts`:`bun-env.d.ts`,t=r.default.join(p,e),n=l.includes(t);if(i.envDtsHandling!==`skip`)if(i.envDtsHandling===`append`||!i.envDtsHandling&&n)d.files.push({path:t,content:f,action:`append`,label:`${i.framework} types`});else{let e=i.framework===`vite`?tn(i.path):nn(i.path);d.files.push({path:t,content:e,action:n?`overwrite`:`create`,label:`${i.framework} types`})}}(i.framework===`vite`||i.framework===`bun-fullstack`||i.framework===`nextjs`&&!i.disableCodegen)&&(d.bootstrap=(0,t.shake)({framework:i.framework,bunFeatures:i.framework===`bun-fullstack`?i.bunFeatures:void 0})),i.installSkill&&(d.skill={dlxCommand:pn(a),packageName:`yamcodes/arkenv`,isYes:e.isYes});let h=r.default.relative(c,f).replace(/\\/g,`/`),g=h.startsWith(`.`)?h:`./${h}`,_=g.replace(/\.(ts|js|tsx|jsx)$/,``);return d.metadata.displayPath=g,d.metadata.importPath=_,d.bootstrap&&(d.bootstrap.importPath=_),d}var hn=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`}]}}}},gn=class{constructor(e,t,n,r,i=new hn){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=mn(t),r=new fn(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&&r.default.resolve(process.cwd(),t)===process.cwd()&&(t=`.`);let n={...e,...t!==void 0&&{name:t}},i=t&&t!==`.`?r.default.resolve(process.cwd(),t):process.cwd(),a=await this.workspace.exists(i),o=a?await this.scanner.hasPackageJson(i):!1,s=a?await this.scanner.isEmptyDirectory(i):!0;return n.example===void 0?o?await this.collectExistingProject(n,i):s||n.isForce?await this.collectNewProject(n,s):(this.logger.error(`Directory is not empty and no ${X(`package.json`)} was found.`),this.logger.info(`To scaffold a new project, run ${X(`arkenv init`)} in an empty directory or use ${X(`--force`)} to proceed anyway.`),null):await this.collectNewProject(n,s)}finally{this.logger.interactiveStdout(!1)}}async collectExistingProject(e,n){let{isYes:i,isForce:a,isQuiet:o,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(a){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.`),null}let d=!1,f=await this.scanner.checkTsConfig(n);if(f.status===`not_strict`)if(i)d=!0;else{this.logger.warn(`TypeScript strict mode is not enabled in your ${X(f.file)}.`);let e=await this.prompt.confirm(`ArkEnv requires ${X(`strict`)} mode in your ${X(f.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;d=!0}let p=await this.scanner.detectFramework(n,f.parsed),m=p===`bun-fullstack`?await this.scanner.detectBunFeatures(n,f.parsed):void 0,h=await this.scanner.suggestDefaultEnvPath(n,f.parsed),g=r.default.resolve(n,h),_=await this.scanner.getEnvExampleKeys(n,f.parsed,g),v=await(async()=>{if(e.isStrict){let e=r.default.extname(g),t=g.slice(0,-e.length),n=[r.default.join(t,`internal`,`shared${e}`),r.default.join(t,`client${e}`),r.default.join(t,`server${e}`)];if((await Promise.all(n.map(e=>this.workspace.exists(e)))).some(Boolean))return!0}return this.workspace.exists(g)})(),y=async({framework:e,envPath:t})=>{if(e!==`vite`&&e!==`bun-fullstack`)return!1;let i=e===`vite`?`vite-env.d.ts`:`bun-env.d.ts`,a=r.default.resolve(n,t),o=r.default.dirname(a),s=r.default.join(o,i);return this.workspace.exists(s)},b=await y({framework:p,envPath:h}),x=await this.prompt.runWizard((0,t.shake)({mode:`existing`,framework:p,bunFeatures:m,defaultEnvPath:h,tsConfig:f.parsed??null,envKeys:_?.keys,envKeysSource:_?.source,hasTypeFileAtPath:y,hasTypeFile:b,hasEnvSchemaFile:v,isStrict:e.isStrict,isSimple:e.isSimple,disableCodegen:e.noCodegen}),i);if(x===null)return null;let S=await this.scanner.hasSkill(n);if(S&&(x.skillDetected=!0,!o&&!s&&this.logger.info(`ArkEnv agent skill detected.`)),S)x.installSkill=!1;else if(s)x.installSkill=!1;else if(i)x.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;x.installSkill=e}let C=r.default.resolve(n,x.path);if(x.overwriteEnvSchemaFile===void 0&&(x.layout===`strict`?await(async()=>{let e=r.default.extname(C),t=C.slice(0,-e.length);return(await Promise.all([this.workspace.exists(r.default.join(t,`internal`,`shared${e}`)),this.workspace.exists(r.default.join(t,`client${e}`)),this.workspace.exists(r.default.join(t,`server${e}`))])).some(Boolean)})():await this.workspace.exists(C))){let e=x.layout===`strict`?`Strict layout files (client, server, internal/shared)`:r.default.basename(C),t=await this.prompt.confirm(`${e} already exist. Overwrite?`,!1);if(t===null)return null;if(!t)return this.logger.cancel(`Operation cancelled.`),null;x.overwriteEnvSchemaFile=t}let ee=await this.scanner.detectPackageManager(n,f.parsed),w=r.default.extname(C),T=C.slice(0,-w.length),E=x.layout===`strict`?[r.default.join(T,`internal`,`shared${w}`),r.default.join(T,`client${w}`),r.default.join(T,`server${w}`)]:[C],D=[];for(let e of E)await this.workspace.exists(e)&&D.push(e);let O;if(x.framework===`vite`?O=`vite-env.d.ts`:x.framework===`bun-fullstack`&&(O=`bun-env.d.ts`),O){let e=r.default.dirname(C),t=r.default.join(e,O);await this.workspace.exists(t)&&D.push(t)}return(0,t.shake)({mode:`existing`,cwd:n,options:x,detectedFramework:p,detectedBunFeatures:m,packageManager:ee,tsConfig:f,shouldUpdateTsConfig:d,existingFiles:D,isYes:i})}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 ${X(`.`)} because the current directory is not empty.`),this.logger.info(`Run ${X(`arkenv init`)} in an empty directory or choose a sub-directory name instead.`),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 _n(e){let t=new Yt(e),n=t.logger,r=new Dt(t.isQuiet,n.stdio),i=new Gt;return{cli:t,logger:n,workspace:r,prompt:i,initUseCase:new gn(n,r,i,new yt),helpUseCase:new Qt(n)}}let $,vn=!1;async function yn(){if(process.env.INIT_CWD)try{process.chdir(process.env.INIT_CWD)}catch{}let{cli:e,logger:n,initUseCase:r,helpUseCase:i}=_n(process.argv);$=n,bn(n),e.validationError&&(n.error(e.validationError),await i.execute(),await n.flush(),process.exit(1)),e.helpRequested&&(await i.execute(),await n.flush(),process.exit(0)),e.command!==`init`&&(e.command?n.error(`Unknown command: ${e.command}`):n.error(`Missing command.`),await i.execute(),await n.flush(),process.exit(1));try{await r.execute((0,t.shake)(e.initInput))||(await n.flush(),process.exit(1))}catch(e){try{n.fatal(`An unexpected error occurred`,e)}catch{}await n.flush(),process.exit(1)}}function bn(e){let t=async t=>{vn&&process.exit(t),vn=!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))}yn(),process.on(`unhandledRejection`,async e=>{if($){try{$.fatal(`Unhandled rejection`,e)}catch{}await $.flush()}else console.error(`Unhandled rejection`,e);process.exit(1)}),process.on(`uncaughtException`,async e=>{if($){try{$.fatal(`Uncaught exception`,e)}catch{}await $.flush()}else console.error(`Uncaught exception`,e);process.exit(1)});
|
|
379
|
+
${Y(`/arkenv`)} - automatically refine your schema and configure integrations.
|
|
380
|
+
`,title:`Next steps`};let n=e.skill?.dlxCommand.join(` `)||`npx`,r=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`}return a+=`${o++}. Check ${Y(s)} and refine your environment schema.\n`,e.metadata.framework===`vite`?a+=`${o++}. Access via ${Y(`import.meta.env.YOUR_VAR`)}\n`:e.metadata.framework===`bun-fullstack`?a+=`${o++}. Access via ${Y(`process.env.YOUR_VAR`)}\n`:e.metadata.framework===`nextjs`?e.metadata.layout===`strict`?e.metadata.disableCodegen?a+=`${o++}. Import and use: ${Y(`import { env } from "${e.metadata.importPath}/client"`)} (client) or ${Y(`import { env } from "${e.metadata.importPath}/server"`)} (server)\n`:(a+=`${o++}. Wrap your Next.js config with ${Y(`withArkEnv`)} inside ${Y(`next.config.ts`)}:\n`,a+=` ${Y(`import { withArkEnv } from "@arkenv/nextjs/config";`)}\n`,a+=` ${Y(`export default withArkEnv(nextConfig);`)}\n`,a+=`${o++}. Import and use: ${Y(`import { env } from "${e.metadata.importPath}/client"`)} (client) or ${Y(`import { env } from "${e.metadata.importPath}/server"`)} (server)\n`):e.metadata.disableCodegen?a+=`${o++}. Import and use: ${Y(`import { env } from "${e.metadata.importPath}"`)}\n`:(a+=`${o++}. Wrap your Next.js config with ${Y(`withArkEnv`)} inside ${Y(`next.config.ts`)}:\n`,a+=` ${Y(`import { withArkEnv } from "@arkenv/nextjs/config";`)}\n`,a+=` ${Y(`export default withArkEnv(nextConfig);`)}\n`,a+=`${o++}. Import and use: ${Y(`import { env } from "${e.metadata.importPath}"`)}\n`):a+=`${o++}. Import and use: ${Y(`import { env } from "${e.metadata.importPath}"`)}\n`,a+=`${o++}. (Recommended) Install the AI skill: ${Y(`${n} skills add ${r}`)}\n`,a+=` Then run ${Y(`/arkenv`)} inside your AI assistant to finish.`,{message:a,title:`Next steps`}}var pn=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 ${Y(e.clone.example)}...`),await ln(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 ${Y(r.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 ${Y(r.default.basename(t.path))}.`):this.reporter.info(`${Y(r.default.basename(t.path))} already contains ArkEnv types.`);continue}if(await this.workspace.mkdir(r.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} ${Y(r.default.basename(t.path))} for typesafe environment variables.`)}}if(t.stop(`Configuration scaffolded!`),e.install&&process.env.SKIP_INSTALL!==`true`){this.reporter.step(`Installing dependencies with ${Y(e.install.packageManager)}...`);let[t,n]=dn(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 ${Y(t.file)}`),n=!0):t.status===`error`&&this.reporter.warn(`Could not automatically update ${Y(t.file||`tsconfig.json`)}. Please ensure 'strict: true' is set manually.`)}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 ${Y(r.default.basename(t))}`):(this.reporter.warn(`Could not automatically update ${Y(r.default.basename(t))}: ${n.error}`),this.reporter.info(`Please add ${Y(`@arkenv/vite-plugin`)} manually.`))}else this.reporter.info(`No Vite config found — please add ${Y(`@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`){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 ${Y(`env.gen.ts`)} for Next.js`)}catch{this.reporter.warn(`Failed to automatically generate ${Y(`env.gen.ts`)}. It will be generated when you start your dev server.`)}}}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=fn(e,i);if(this.reporter.note(a.message,a.title),e.metadata.layout===`strict`){let t=r.default.resolve(e.cwd,e.metadata.displayPath);if(await this.workspace.exists(t)){let t=e.metadata.displayPath,n=r.default.basename(t,r.default.extname(t));this.reporter.warn(`Found existing single-file schema at ${Y(t)}. You can delete it after updating your imports to point to your new ${Y(`${n}/client`)} and ${Y(`${n}/server`)}.`)}}this.reporter.finish(`${xt} 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}}};function mn(e){switch(e){case`pnpm`:return[`pnpm`,`dlx`];case`yarn`:return[`yarn`,`dlx`];case`bun`:return[`bunx`];default:return[`npx`]}}function hn(e){let{mode:n,options:i,packageManager:a,tsConfig:o,shouldUpdateTsConfig:s,cwd:c,existingFiles:l}=e,u=i.name&&i.name!==`.`?r.default.basename(i.name):void 0,d={files:[],cwd:c,metadata:(0,t.shake)({displayPath:``,framework:i.framework,validator:i.validator,packageManager:a,importPath:``,mode:n,example:i.example,name:u,layout:i.layout,skillDetected:i.skillDetected,disableCodegen:i.disableCodegen})};if(n===`new`){if(!i.example)throw Error(`New project scaffolding requires an example.`);let t=i.name&&i.name!==`.`?r.default.join(c,i.name):void 0,n=i.name&&i.name!==`.`?r.default.basename(i.name):r.default.basename(c);return d.clone={repository:`https://github.com/yamcodes/arkenv.git`,example:i.example,targetName:n,...t!==void 0&&{targetDir:t}},d.install={packageManager:a,dependencies:[],...t!==void 0&&{cwd:t}},i.installSkill&&(d.skill={dlxCommand:mn(a),packageName:`yamcodes/arkenv`,isYes:e.isYes}),d.metadata.displayPath=`./src/env.ts`,d.metadata.importPath=`./src/env`,d}let f=r.default.resolve(c,i.path),p=r.default.dirname(f);if(i.framework===`nextjs`&&i.layout===`strict`){let e=r.default.extname(f),t=f.slice(0,-e.length),n=r.default.join(t,`internal`,`shared${e}`),a=r.default.join(t,`client${e}`),o=r.default.join(t,`server${e}`),s=cn(i),c=l.includes(n),u=l.includes(a),p=l.includes(o);(!c||i.overwriteEnvSchemaFile!==!1)&&d.files.push({path:n,content:s.shared,action:c?`overwrite`:`create`,label:`shared environment schema`}),(!u||i.overwriteEnvSchemaFile!==!1)&&d.files.push({path:a,content:s.client,action:u?`overwrite`:`create`,label:`client environment schema`}),(!p||i.overwriteEnvSchemaFile!==!1)&&d.files.push({path:o,content:s.server,action:p?`overwrite`:`create`,label:`server environment schema`})}else{let e;if(i.framework===`nextjs`&&!i.disableCodegen&&o?.parsed){let t=o.parsed,n=(t.compilerOptions||{}).paths||{};if(n[`@/*`]){let i=t.path?r.default.dirname(t.path):c,a=r.default.join(p,`generated`),o=r.default.relative(i,a).replace(/\\/g,`/`);for(let t of n[`@/*`]){let n=t.replace(/^\.\//,``).replace(/\*$/,``);if(n===``||o.startsWith(n)){let t=o;n!==``&&o.startsWith(n)&&(t=o.substring(n.length)),t=t.replace(/^\/+/,``).replace(/\/+$/,``),e=`@/${t}/env.gen`.replace(/\/+/g,`/`);break}}}}let t=sn(i,e),n=l.includes(f);(!n||i.overwriteEnvSchemaFile!==!1)&&d.files.push({path:f,content:t,action:n?`overwrite`:`create`,label:`environment schema`})}let m=[`arkenv`,i.validator];if(i.framework===`vite`&&m.push(`@arkenv/vite-plugin`),i.framework===`bun-fullstack`&&i.bunFeatures?.length&&m.push(`@arkenv/bun-plugin`),i.framework===`nextjs`&&m.push(`@arkenv/nextjs`),(i.framework===`vite`||i.framework===`nextjs`||i.framework===`bun-fullstack`&&i.bunFeatures?.length)&&!m.includes(`arktype`)&&m.push(`arktype`),d.install={packageManager:a,dependencies:m},s&&o.file&&(d.tsConfig={path:r.default.resolve(c,o.file),action:`strict`}),(i.framework===`vite`||i.framework===`bun-fullstack`&&i.bunFeatures?.length)&&i.installTypeDefinitions!==!1){let e=i.framework===`vite`?`vite-env.d.ts`:`bun-env.d.ts`,t=r.default.join(p,e),n=l.includes(t);if(i.envDtsHandling!==`skip`)if(i.envDtsHandling===`append`||!i.envDtsHandling&&n)d.files.push({path:t,content:f,action:`append`,label:`${i.framework} types`});else{let e=i.framework===`vite`?nn(i.path):rn(i.path);d.files.push({path:t,content:e,action:n?`overwrite`:`create`,label:`${i.framework} types`})}}(i.framework===`vite`||i.framework===`bun-fullstack`||i.framework===`nextjs`&&!i.disableCodegen)&&(d.bootstrap=(0,t.shake)({framework:i.framework,bunFeatures:i.framework===`bun-fullstack`?i.bunFeatures:void 0})),i.installSkill&&(d.skill={dlxCommand:mn(a),packageName:`yamcodes/arkenv`,isYes:e.isYes});let h=r.default.relative(c,f).replace(/\\/g,`/`),g=h.startsWith(`.`)?h:`./${h}`,_=g.replace(/\.(ts|js|tsx|jsx)$/,``);return d.metadata.displayPath=g,d.metadata.importPath=_,d.bootstrap&&(d.bootstrap.importPath=_),d}var gn=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`}]}}}},_n=class{constructor(e,t,n,r,i=new gn){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=hn(t),r=new pn(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&&r.default.resolve(process.cwd(),t)===process.cwd()&&(t=`.`);let n={...e,...t!==void 0&&{name:t}},i=t&&t!==`.`?r.default.resolve(process.cwd(),t):process.cwd(),a=await this.workspace.exists(i),o=a?await this.scanner.hasPackageJson(i):!1,s=a?await this.scanner.isEmptyDirectory(i):!0;return n.example===void 0?o?await this.collectExistingProject(n,i):s||n.isForce?await this.collectNewProject(n,s):(this.logger.error(`Directory is not empty and no ${Y(`package.json`)} was found.`),this.logger.info(`To scaffold a new project, run ${Y(`arkenv init`)} in an empty directory or use ${Y(`--force`)} to proceed anyway.`),null):await this.collectNewProject(n,s)}finally{this.logger.interactiveStdout(!1)}}async collectExistingProject(e,n){let{isYes:i,isForce:a,isQuiet:o,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(a){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.`),null}let d=!1,f=await this.scanner.checkTsConfig(n);if(f.status===`not_strict`)if(i)d=!0;else{this.logger.warn(`TypeScript strict mode is not enabled in your ${Y(f.file)}.`);let e=await this.prompt.confirm(`ArkEnv requires ${Y(`strict`)} mode in your ${Y(f.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;d=!0}let p=await this.scanner.detectFramework(n,f.parsed),m=p===`bun-fullstack`?await this.scanner.detectBunFeatures(n,f.parsed):void 0,h=await this.scanner.suggestDefaultEnvPath(n,f.parsed),g=r.default.resolve(n,h),_=await this.scanner.getEnvExampleKeys(n,f.parsed,g),v=await(async()=>{if(e.isStrict){let e=r.default.extname(g),t=g.slice(0,-e.length),n=[r.default.join(t,`internal`,`shared${e}`),r.default.join(t,`client${e}`),r.default.join(t,`server${e}`)];if((await Promise.all(n.map(e=>this.workspace.exists(e)))).some(Boolean))return!0}return this.workspace.exists(g)})(),y=async({framework:e,envPath:t})=>{if(e!==`vite`&&e!==`bun-fullstack`)return!1;let i=e===`vite`?`vite-env.d.ts`:`bun-env.d.ts`,a=r.default.resolve(n,t),o=r.default.dirname(a),s=r.default.join(o,i);return this.workspace.exists(s)},b=await y({framework:p,envPath:h}),x=await this.prompt.runWizard((0,t.shake)({mode:`existing`,framework:p,bunFeatures:m,defaultEnvPath:h,tsConfig:f.parsed??null,envKeys:_?.keys,envKeysSource:_?.source,hasTypeFileAtPath:y,hasTypeFile:b,hasEnvSchemaFile:v,isStrict:e.isStrict,isSimple:e.isSimple,disableCodegen:e.noCodegen}),i);if(x===null)return null;let S=await this.scanner.hasSkill(n);if(S&&(x.skillDetected=!0,!o&&!s&&this.logger.info(`ArkEnv agent skill detected.`)),S)x.installSkill=!1;else if(s)x.installSkill=!1;else if(i)x.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;x.installSkill=e}let C=r.default.resolve(n,x.path);if(x.overwriteEnvSchemaFile===void 0&&(x.layout===`strict`?await(async()=>{let e=r.default.extname(C),t=C.slice(0,-e.length);return(await Promise.all([this.workspace.exists(r.default.join(t,`internal`,`shared${e}`)),this.workspace.exists(r.default.join(t,`client${e}`)),this.workspace.exists(r.default.join(t,`server${e}`))])).some(Boolean)})():await this.workspace.exists(C))){let e=x.layout===`strict`?`Strict layout files (client, server, internal/shared)`:r.default.basename(C),t=await this.prompt.confirm(`${e} already exist. Overwrite?`,!1);if(t===null)return null;if(!t)return this.logger.cancel(`Operation cancelled.`),null;x.overwriteEnvSchemaFile=t}let ee=await this.scanner.detectPackageManager(n,f.parsed),w=r.default.extname(C),T=C.slice(0,-w.length),E=x.layout===`strict`?[r.default.join(T,`internal`,`shared${w}`),r.default.join(T,`client${w}`),r.default.join(T,`server${w}`)]:[C],D=[];for(let e of E)await this.workspace.exists(e)&&D.push(e);let O;if(x.framework===`vite`?O=`vite-env.d.ts`:x.framework===`bun-fullstack`&&(O=`bun-env.d.ts`),O){let e=r.default.dirname(C),t=r.default.join(e,O);await this.workspace.exists(t)&&D.push(t)}return(0,t.shake)({mode:`existing`,cwd:n,options:x,detectedFramework:p,detectedBunFeatures:m,packageManager:ee,tsConfig:f,shouldUpdateTsConfig:d,existingFiles:D,isYes:i})}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 ${Y(`.`)} because the current directory is not empty.`),this.logger.info(`Run ${Y(`arkenv init`)} in an empty directory or choose a sub-directory name instead.`),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 vn(e){let t=new Xt(e),n=t.logger,r=new Ot(t.isQuiet,n.stdio),i=new Kt;return{cli:t,logger:n,workspace:r,prompt:i,initUseCase:new _n(n,r,i,new bt),helpUseCase:new $t(n)}}let $,yn=!1;async function bn(){if(process.env.INIT_CWD)try{process.chdir(process.env.INIT_CWD)}catch{}let{cli:e,logger:n,initUseCase:r,helpUseCase:i}=vn(process.argv);$=n,xn(n),e.validationError&&(n.error(e.validationError),await i.execute(),await n.flush(),process.exit(1)),e.helpRequested&&(await i.execute(),await n.flush(),process.exit(0)),e.command!==`init`&&(e.command?n.error(`Unknown command: ${e.command}`):n.error(`Missing command.`),await i.execute(),await n.flush(),process.exit(1));try{await r.execute((0,t.shake)(e.initInput))||(await n.flush(),process.exit(1))}catch(e){try{n.fatal(`An unexpected error occurred`,e)}catch{}await n.flush(),process.exit(1)}}function xn(e){let t=async t=>{yn&&process.exit(t),yn=!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))}bn(),process.on(`unhandledRejection`,async e=>{if($){try{$.fatal(`Unhandled rejection`,e)}catch{}await $.flush()}else console.error(`Unhandled rejection`,e);process.exit(1)}),process.on(`uncaughtException`,async e=>{if($){try{$.fatal(`Uncaught exception`,e)}catch{}await $.flush()}else console.error(`Uncaught exception`,e);process.exit(1)});
|