@arkenv/cli 0.2.5 → 0.2.6
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 +172 -56
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -19,53 +19,53 @@ const e=require(`./chunk-i8uDWG73.cjs`);let t=require(`radashi`),n=require(`node
|
|
|
19
19
|
declare namespace NodeJS {
|
|
20
20
|
interface ProcessEnv extends ProcessEnvAugmented {}
|
|
21
21
|
}
|
|
22
|
-
`}var v=e.t(((e,t)=>{let n=process||{},r=n.argv||[],i=n.env||{},a=!(i.NO_COLOR||r.includes(`--no-color`))&&(!!i.FORCE_COLOR||r.includes(`--color`)||n.platform===`win32`||(n.stdout||{}).isTTY&&i.TERM!==`dumb`||!!i.CI),o=(e,t,n=e)=>r=>{let i=``+r,a=i.indexOf(t,e.length);return~a?e+s(i,t,n,a)+t:e+i+t},s=(e,t,n,r)=>{let i=``,a=0;do i+=e.substring(a,r)+n,a=r+t.length,r=e.indexOf(t,a);while(~r);return i+e.substring(a)},c=(e=a)=>{let t=e?o:()=>String;return{isColorSupported:e,reset:t(`\x1B[0m`,`\x1B[0m`),bold:t(`\x1B[1m`,`\x1B[22m`,`\x1B[22m\x1B[1m`),dim:t(`\x1B[2m`,`\x1B[22m`,`\x1B[22m\x1B[2m`),italic:t(`\x1B[3m`,`\x1B[23m`),underline:t(`\x1B[4m`,`\x1B[24m`),inverse:t(`\x1B[7m`,`\x1B[27m`),hidden:t(`\x1B[8m`,`\x1B[28m`),strikethrough:t(`\x1B[9m`,`\x1B[29m`),black:t(`\x1B[30m`,`\x1B[39m`),red:t(`\x1B[31m`,`\x1B[39m`),green:t(`\x1B[32m`,`\x1B[39m`),yellow:t(`\x1B[33m`,`\x1B[39m`),blue:t(`\x1B[34m`,`\x1B[39m`),magenta:t(`\x1B[35m`,`\x1B[39m`),cyan:t(`\x1B[36m`,`\x1B[39m`),white:t(`\x1B[37m`,`\x1B[39m`),gray:t(`\x1B[90m`,`\x1B[39m`),bgBlack:t(`\x1B[40m`,`\x1B[49m`),bgRed:t(`\x1B[41m`,`\x1B[49m`),bgGreen:t(`\x1B[42m`,`\x1B[49m`),bgYellow:t(`\x1B[43m`,`\x1B[49m`),bgBlue:t(`\x1B[44m`,`\x1B[49m`),bgMagenta:t(`\x1B[45m`,`\x1B[49m`),bgCyan:t(`\x1B[46m`,`\x1B[49m`),bgWhite:t(`\x1B[47m`,`\x1B[49m`),blackBright:t(`\x1B[90m`,`\x1B[39m`),redBright:t(`\x1B[91m`,`\x1B[39m`),greenBright:t(`\x1B[92m`,`\x1B[39m`),yellowBright:t(`\x1B[93m`,`\x1B[39m`),blueBright:t(`\x1B[94m`,`\x1B[39m`),magentaBright:t(`\x1B[95m`,`\x1B[39m`),cyanBright:t(`\x1B[96m`,`\x1B[39m`),whiteBright:t(`\x1B[97m`,`\x1B[39m`),bgBlackBright:t(`\x1B[100m`,`\x1B[49m`),bgRedBright:t(`\x1B[101m`,`\x1B[49m`),bgGreenBright:t(`\x1B[102m`,`\x1B[49m`),bgYellowBright:t(`\x1B[103m`,`\x1B[49m`),bgBlueBright:t(`\x1B[104m`,`\x1B[49m`),bgMagentaBright:t(`\x1B[105m`,`\x1B[49m`),bgCyanBright:t(`\x1B[106m`,`\x1B[49m`),bgWhiteBright:t(`\x1B[107m`,`\x1B[49m`)}};t.exports=c(),t.exports.createColors=c})),y=e.r(v(),1),b=class{info(e){process.stderr.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.stderr.write(`${y.default.green(`✔ ${e}`)}\n`)}step(e){process.stderr.write(`○ ${e}\n`)}note(e,t){process.stderr.write(`${y.default.dim(`○ ${t?`${t}: `:``}${e}`)}\n`)}log(e){process.stderr.write(`${e}\n`)}spinner(){return{start:e=>process.stderr.write(`${y.default.dim(`○ ${e}...`)}\n`),stop:e=>process.stderr.write(`${y.default.green(`✔ ${e}`)}\n`),message:e=>process.stderr.write(`${y.default.dim(`○ ${e}...`)}\n`)}}json(e){process.stdout.write(`${JSON.stringify(e,null,2)}\n`)}cancel(e){this.json({status:`cancelled`,message:e})}fatal(e,t){throw this.json({status:`error`,details:{message:e,error:t instanceof Error?t.message:t?String(t):void 0}}),t instanceof Error?t:Error(e)}finish(e,t){this.json({status:`success`,message:e,details:t})}async flush(){return new Promise(e=>{process.stdout.write(``,()=>e())})}},x=class{stripAnsi(e){return e.replace(/\x1B\[[0-9;]*[JKmsu]/g,``)}info(e){}warn(e){}error(e){}success(e){}step(e){}note(e,t){}log(e){process.stdout.write(`${this.stripAnsi(e)}\n`)}spinner(){return{start:e=>{},stop:e=>{},message:e=>{}}}json(e){process.stdout.write(`${JSON.stringify(e,null,2)}\n`)}cancel(e){process.stderr.write(`✘ Cancelled: ${e}\n`)}fatal(e,t){throw process.stderr.write(`✘ Fatal: ${e}\n`),t&&process.stderr.write(`${t instanceof Error?t.stack??t.message:String(t)}\n`),t instanceof Error?t:Error(e)}finish(e,t){}async flush(){return new Promise(e=>{process.stderr.write(``,()=>e())})}};const S=(()=>{let e=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g;return t=>{let n=0;for(e.lastIndex=0;e.test(t);)n+=1;return t.length-n}})(),C=e=>e===12288||e>=65281&&e<=65376||e>=65504&&e<=65510,ee=e=>e===8987||e===9001||e>=12272&&e<=12287||e>=12289&&e<=12350||e>=12441&&e<=12543||e>=12549&&e<=12591||e>=12593&&e<=12686||e>=12688&&e<=12771||e>=12783&&e<=12830||e>=12832&&e<=12871||e>=12880&&e<=19903||e>=65040&&e<=65049||e>=65072&&e<=65106||e>=65108&&e<=65126||e>=65128&&e<=65131||e>=127488&&e<=127490||e>=127504&&e<=127547||e>=127552&&e<=127560||e>=131072&&e<=196605||e>=196608&&e<=262141,w=/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]|\u001b\]8;[^;]*;.*?(?:\u0007|\u001b\u005c)/y,T=/[\x00-\x08\x0A-\x1F\x7F-\x9F]{1,1000}/y,E=/(?:(?![\uFF61-\uFF9F\uFF00-\uFFEF])[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Hangul}\p{Script=Tangut}]){1,1000}/uy,
|
|
23
|
-
`),u=!1;for(let e=0;e<l.length;e++){let t=l[e];if(r+=t,u)u=!1;else if(u=t>=`\ud800`&&t<=`\udbff`,u)continue;if(t===`\x1B`||t===``){
|
|
24
|
-
`){a&&(r+=
|
|
25
|
-
`&&(i&&
|
|
26
|
-
`)}var
|
|
22
|
+
`}var v=e.t(((e,t)=>{let n=process||{},r=n.argv||[],i=n.env||{},a=!(i.NO_COLOR||r.includes(`--no-color`))&&(!!i.FORCE_COLOR||r.includes(`--color`)||n.platform===`win32`||(n.stdout||{}).isTTY&&i.TERM!==`dumb`||!!i.CI),o=(e,t,n=e)=>r=>{let i=``+r,a=i.indexOf(t,e.length);return~a?e+s(i,t,n,a)+t:e+i+t},s=(e,t,n,r)=>{let i=``,a=0;do i+=e.substring(a,r)+n,a=r+t.length,r=e.indexOf(t,a);while(~r);return i+e.substring(a)},c=(e=a)=>{let t=e?o:()=>String;return{isColorSupported:e,reset:t(`\x1B[0m`,`\x1B[0m`),bold:t(`\x1B[1m`,`\x1B[22m`,`\x1B[22m\x1B[1m`),dim:t(`\x1B[2m`,`\x1B[22m`,`\x1B[22m\x1B[2m`),italic:t(`\x1B[3m`,`\x1B[23m`),underline:t(`\x1B[4m`,`\x1B[24m`),inverse:t(`\x1B[7m`,`\x1B[27m`),hidden:t(`\x1B[8m`,`\x1B[28m`),strikethrough:t(`\x1B[9m`,`\x1B[29m`),black:t(`\x1B[30m`,`\x1B[39m`),red:t(`\x1B[31m`,`\x1B[39m`),green:t(`\x1B[32m`,`\x1B[39m`),yellow:t(`\x1B[33m`,`\x1B[39m`),blue:t(`\x1B[34m`,`\x1B[39m`),magenta:t(`\x1B[35m`,`\x1B[39m`),cyan:t(`\x1B[36m`,`\x1B[39m`),white:t(`\x1B[37m`,`\x1B[39m`),gray:t(`\x1B[90m`,`\x1B[39m`),bgBlack:t(`\x1B[40m`,`\x1B[49m`),bgRed:t(`\x1B[41m`,`\x1B[49m`),bgGreen:t(`\x1B[42m`,`\x1B[49m`),bgYellow:t(`\x1B[43m`,`\x1B[49m`),bgBlue:t(`\x1B[44m`,`\x1B[49m`),bgMagenta:t(`\x1B[45m`,`\x1B[49m`),bgCyan:t(`\x1B[46m`,`\x1B[49m`),bgWhite:t(`\x1B[47m`,`\x1B[49m`),blackBright:t(`\x1B[90m`,`\x1B[39m`),redBright:t(`\x1B[91m`,`\x1B[39m`),greenBright:t(`\x1B[92m`,`\x1B[39m`),yellowBright:t(`\x1B[93m`,`\x1B[39m`),blueBright:t(`\x1B[94m`,`\x1B[39m`),magentaBright:t(`\x1B[95m`,`\x1B[39m`),cyanBright:t(`\x1B[96m`,`\x1B[39m`),whiteBright:t(`\x1B[97m`,`\x1B[39m`),bgBlackBright:t(`\x1B[100m`,`\x1B[49m`),bgRedBright:t(`\x1B[101m`,`\x1B[49m`),bgGreenBright:t(`\x1B[102m`,`\x1B[49m`),bgYellowBright:t(`\x1B[103m`,`\x1B[49m`),bgBlueBright:t(`\x1B[104m`,`\x1B[49m`),bgMagentaBright:t(`\x1B[105m`,`\x1B[49m`),bgCyanBright:t(`\x1B[106m`,`\x1B[49m`),bgWhiteBright:t(`\x1B[107m`,`\x1B[49m`)}};t.exports=c(),t.exports.createColors=c})),y=e.r(v(),1),b=class{info(e){process.stderr.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.stderr.write(`${y.default.green(`✔ ${e}`)}\n`)}step(e){process.stderr.write(`○ ${e}\n`)}note(e,t){process.stderr.write(`${y.default.dim(`○ ${t?`${t}: `:``}${e}`)}\n`)}log(e){process.stderr.write(`${e}\n`)}spinner(){return{start:e=>process.stderr.write(`${y.default.dim(`○ ${e}...`)}\n`),stop:e=>process.stderr.write(`${y.default.green(`✔ ${e}`)}\n`),message:e=>process.stderr.write(`${y.default.dim(`○ ${e}...`)}\n`)}}json(e){process.stdout.write(`${JSON.stringify(e,null,2)}\n`)}cancel(e){this.json({status:`cancelled`,message:e})}fatal(e,t){throw this.json({status:`error`,details:{message:e,error:t instanceof Error?t.message:t?String(t):void 0}}),t instanceof Error?t:Error(e)}finish(e,t){this.json({status:`success`,message:e,details:t})}async flush(){return new Promise(e=>{process.stdout.write(``,()=>e())})}},x=class{stripAnsi(e){return e.replace(/\x1B\[[0-9;]*[JKmsu]/g,``)}info(e){}warn(e){}error(e){}success(e){}step(e){}note(e,t){}log(e){process.stdout.write(`${this.stripAnsi(e)}\n`)}spinner(){return{start:e=>{},stop:e=>{},message:e=>{}}}json(e){process.stdout.write(`${JSON.stringify(e,null,2)}\n`)}cancel(e){process.stderr.write(`✘ Cancelled: ${e}\n`)}fatal(e,t){throw process.stderr.write(`✘ Fatal: ${e}\n`),t&&process.stderr.write(`${t instanceof Error?t.stack??t.message:String(t)}\n`),t instanceof Error?t:Error(e)}finish(e,t){}async flush(){return new Promise(e=>{process.stderr.write(``,()=>e())})}};const S=(()=>{let e=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g;return t=>{let n=0;for(e.lastIndex=0;e.test(t);)n+=1;return t.length-n}})(),C=e=>e===12288||e>=65281&&e<=65376||e>=65504&&e<=65510,ee=e=>e===8987||e===9001||e>=12272&&e<=12287||e>=12289&&e<=12350||e>=12441&&e<=12543||e>=12549&&e<=12591||e>=12593&&e<=12686||e>=12688&&e<=12771||e>=12783&&e<=12830||e>=12832&&e<=12871||e>=12880&&e<=19903||e>=65040&&e<=65049||e>=65072&&e<=65106||e>=65108&&e<=65126||e>=65128&&e<=65131||e>=127488&&e<=127490||e>=127504&&e<=127547||e>=127552&&e<=127560||e>=131072&&e<=196605||e>=196608&&e<=262141,w=/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]|\u001b\]8;[^;]*;.*?(?:\u0007|\u001b\u005c)/y,T=/[\x00-\x08\x0A-\x1F\x7F-\x9F]{1,1000}/y,E=/(?:(?![\uFF61-\uFF9F\uFF00-\uFFEF])[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Hangul}\p{Script=Tangut}]){1,1000}/uy,D=/\t{1,1000}/y,O=/[\u{1F1E6}-\u{1F1FF}]{2}|\u{1F3F4}[\u{E0061}-\u{E007A}]{2}[\u{E0030}-\u{E0039}\u{E0061}-\u{E007A}]{1,3}\u{E007F}|(?:\p{Emoji}\uFE0F\u20E3?|\p{Emoji_Modifier_Base}\p{Emoji_Modifier}?|\p{Emoji_Presentation})(?:\u200D(?:\p{Emoji_Modifier_Base}\p{Emoji_Modifier}?|\p{Emoji_Presentation}|\p{Emoji}\uFE0F\u20E3?))*/uy,k=/(?:[\x20-\x7E\xA0-\xFF](?!\uFE0F)){1,1000}/y,te=/\p{M}+/gu,ne={limit:1/0,ellipsis:``},re=(e,t={},n={})=>{let r=t.limit??1/0,i=t.ellipsis??``,a=t?.ellipsisWidth??(i?re(i,ne,n).width:0),o=n.controlWidth??0,s=n.tabWidth??8,c=n.emojiWidth??2,l=n.regularWidth??1,u=n.wideWidth??2,d=[[k,l],[w,0],[T,o],[D,s],[O,c],[E,u]],f=0,p=0,m=e.length,h=0,g=!1,_=m,v=Math.max(0,r-a),y=0,b=0,x=0,A=0;outer:for(;;){if(b>y||p>=m&&p>f){let t=e.slice(y,b)||e.slice(f,p);h=0;for(let e of t.replaceAll(te,``)){let t=e.codePointAt(0)||0;if(A=C(t)?2:ee(t)?u:l,x+A>v&&(_=Math.min(_,Math.max(y,f)+h)),x+A>r){g=!0;break outer}h+=e.length,x+=A}y=b=0}if(p>=m)break outer;for(let t=0,n=d.length;t<n;t++){let[n,i]=d[t];if(n.lastIndex=p,n.test(e)){if(h=n===E?S(e.slice(p,n.lastIndex)):n===O?1:n.lastIndex-p,A=h*i,x+A>v&&(_=Math.min(_,p+Math.floor((v-x)/i))),x+A>r){g=!0;break outer}x+=A,y=f,b=p,p=f=n.lastIndex;continue outer}}p+=1}return{width:g?v:x,index:g?_:m,truncated:g,ellipsed:g&&r>=a}},A={limit:1/0,ellipsis:``,ellipsisWidth:0},j=(e,t={})=>re(e,A,t).width,ie=`]8;;`,ae=RegExp(`(?:\\[(?<code>\\d+)m|\\${ie}(?<uri>.*))`,`y`),oe=e=>{if(e>=30&&e<=37||e>=90&&e<=97)return 39;if(e>=40&&e<=47||e>=100&&e<=107)return 49;if(e===1||e===2)return 22;if(e===3)return 23;if(e===4)return 24;if(e===7)return 27;if(e===8)return 28;if(e===9)return 29;if(e===0)return 0},se=e=>`[${e}m`,ce=e=>`${ie}${e}`,le=(e,t,n)=>{let r=t[Symbol.iterator](),i=!1,a=!1,o=e.at(-1),s=o===void 0?0:j(o),c=r.next(),l=r.next(),u=0;for(;!c.done;){let o=c.value,d=j(o);s+d<=n?e[e.length-1]+=o:(e.push(o),s=0),(o===`\x1B`||o===``)&&(i=!0,a=t.startsWith(ie,u+1)),i?a?o===`\x07`&&(i=!1,a=!1):o===`m`&&(i=!1):(s+=d,s===n&&!l.done&&(e.push(``),s=0)),c=l,l=r.next(),u+=o.length}o=e.at(-1),!s&&o!==void 0&&o.length&&e.length>1&&(e[e.length-2]+=e.pop())},ue=e=>{let t=e.split(` `),n=t.length;for(;n&&!j(t[n-1]);)n--;return n===t.length?e:t.slice(0,n).join(` `)+t.slice(n).join(``)},de=(e,t,n={})=>{if(n.trim!==!1&&e.trim()===``)return``;let r=``,i,a,o=e.split(` `),s=[``],c=0;for(let e=0;e<o.length;e++){let r=o[e];if(n.trim!==!1){let e=s.at(-1)??``,t=e.trimStart();e.length!==t.length&&(s[s.length-1]=t,c=j(t))}e!==0&&(c>=t&&(n.wordWrap===!1||n.trim===!1)&&(s.push(``),c=0),(c||n.trim===!1)&&(s[s.length-1]+=` `,c++));let i=j(r);if(n.hard&&i>t){let e=t-c,n=1+Math.floor((i-e-1)/t);Math.floor((i-1)/t)<n&&s.push(``),le(s,r,t),c=j(s.at(-1)??``);continue}if(c+i>t&&c&&i){if(n.wordWrap===!1&&c<t){le(s,r,t),c=j(s.at(-1)??``);continue}s.push(``),c=0}if(c+i>t&&n.wordWrap===!1){le(s,r,t),c=j(s.at(-1)??``);continue}s[s.length-1]+=r,c+=i}n.trim!==!1&&(s=s.map(e=>ue(e)));let l=s.join(`
|
|
23
|
+
`),u=!1;for(let e=0;e<l.length;e++){let t=l[e];if(r+=t,u)u=!1;else if(u=t>=`\ud800`&&t<=`\udbff`,u)continue;if(t===`\x1B`||t===``){ae.lastIndex=e+1;let t=ae.exec(l)?.groups;if(t?.code!==void 0){let e=Number.parseFloat(t.code);i=e===39?void 0:e}else t?.uri!==void 0&&(a=t.uri.length===0?void 0:t.uri)}if(l[e+1]===`
|
|
24
|
+
`){a&&(r+=ce(``));let e=i?oe(i):void 0;i&&e&&(r+=se(e))}else t===`
|
|
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
|
+
`)}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
|
|
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 L(e,t){let n=e;n.isTTY&&n.setRawMode(t)}function _e({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 ve=e=>`columns`in e&&typeof e.columns==`number`?e.columns:80,ye=e=>`rows`in e&&typeof e.rows==`number`?e.rows:20;function be(e,t,n,r=n,i){return M(t,ve(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(
|
|
31
|
-
`),
|
|
32
|
-
`).length-1;this.output.write(
|
|
33
|
-
`);this.output.write(t[a]),this._prevFrame=e,this.output.write(
|
|
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),L(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),L(this.input,!1),e(this.value)}),this.once(`cancel`,()=>{this.output.write(N.cursor.show),this.output.off(`resize`,this.render),L(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
|
+
`),L(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=ye(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
|
+
`);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(
|
|
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??
|
|
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=ve(r)-o,l=ye(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=be(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?`
|
|
40
40
|
${(0,a.styleText)(`cyan`,B)} `:`
|
|
41
41
|
`:` ${(0,a.styleText)(`dim`,`/`)} `}${this.value?`${(0,a.styleText)(`dim`,H)} ${(0,a.styleText)(`dim`,n)}`:`${(0,a.styleText)(`green`,je)} ${n}`}
|
|
42
42
|
${o}
|
|
43
|
-
`}}}}).prompt()},W={message:(e=[],{symbol:t=(0,a.styleText)(`gray`,B),secondarySymbol:n=(0,a.styleText)(`gray`,B),output:r=process.stdout,spacing:i=1,withGuide:o}={})=>{let s=[],c=o??
|
|
43
|
+
`}}}}).prompt()},W={message:(e=[],{symbol:t=(0,a.styleText)(`gray`,B),secondarySymbol:n=(0,a.styleText)(`gray`,B),output:r=process.stdout,spacing:i=1,withGuide:o}={})=>{let s=[],c=o??F.withGuide,l=c?n:``,u=c?`${t} `:``,d=c?`${n} `:``;for(let e=0;e<i;e++)s.push(l);let f=Array.isArray(e)?e:e.split(`
|
|
44
44
|
`);if(f.length>0){let[e,...r]=f;e.length>0?s.push(`${u}${e}`):s.push(c?t:``);for(let e of r)e.length>0?s.push(`${d}${e}`):s.push(c?n:``)}r.write(`${s.join(`
|
|
45
45
|
`)}
|
|
46
|
-
`)},info:(e,t)=>{W.message(e,{...t,symbol:(0,a.styleText)(`blue`,Le)})},success:(e,t)=>{W.message(e,{...t,symbol:(0,a.styleText)(`green`,Re)})},step:(e,t)=>{W.message(e,{...t,symbol:(0,a.styleText)(`green`,z)})},warn:(e,t)=>{W.message(e,{...t,symbol:(0,a.styleText)(`yellow`,ze)})},warning:(e,t)=>{W.warn(e,t)},error:(e,t)=>{W.message(e,{...t,symbol:(0,a.styleText)(`red`,Be)})}},Ge=(e=``,t)=>{let n=t?.output??process.stdout,r=t?.withGuide??
|
|
46
|
+
`)},info:(e,t)=>{W.message(e,{...t,symbol:(0,a.styleText)(`blue`,Le)})},success:(e,t)=>{W.message(e,{...t,symbol:(0,a.styleText)(`green`,Re)})},step:(e,t)=>{W.message(e,{...t,symbol:(0,a.styleText)(`green`,z)})},warn:(e,t)=>{W.message(e,{...t,symbol:(0,a.styleText)(`yellow`,ze)})},warning:(e,t)=>{W.warn(e,t)},error:(e,t)=>{W.message(e,{...t,symbol:(0,a.styleText)(`red`,Be)})}},Ge=(e=``,t)=>{let n=t?.output??process.stdout,r=t?.withGuide??F.withGuide?`${(0,a.styleText)(`gray`,V)} `:``;n.write(`${r}${(0,a.styleText)(`red`,e)}
|
|
47
47
|
|
|
48
|
-
`)},Ke=(e=``,t)=>{let n=t?.output??process.stdout,r=t?.withGuide??
|
|
48
|
+
`)},Ke=(e=``,t)=>{let n=t?.output??process.stdout,r=t?.withGuide??F.withGuide?`${(0,a.styleText)(`gray`,B)}
|
|
49
49
|
${(0,a.styleText)(`gray`,V)} `:``;n.write(`${r}${e}
|
|
50
50
|
|
|
51
|
-
`)},qe=e=>(0,a.styleText)(`dim`,e),Je=(e,t,n)=>{let r={hard:!0,trim:!1},i=
|
|
52
|
-
`),a=i.reduce((e,t)=>Math.max(
|
|
53
|
-
`).map(s),``],l=
|
|
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,ve(r)-6,s).split(`
|
|
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=
|
|
59
|
-
`);let e=
|
|
60
|
-
`);e.length>1&&n.write(
|
|
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=
|
|
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=ve(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
|
+
`);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=_e({output:n}),h=T(t),_=performance.now(),D&&n.write(`${(0,a.styleText)(`gray`,B)}
|
|
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
|
-
`)),ee(),d()};return{start:
|
|
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??
|
|
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=be(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}${be(e.output,t(this.options[this.cursor],`selected`),r)}`}case`cancel`:{let r=n?`${(0,a.styleText)(`gray`,B)} `:``;return`${s}${be(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}`)}
|
|
@@ -76,7 +76,7 @@ ${Qe}`),t.includes(`
|
|
|
76
76
|
`)&&(n=3+(0,a.stripVTControlCharacters)(t.slice(t.lastIndexOf(`
|
|
77
77
|
`))).length);let e=(0,a.stripVTControlCharacters)(t).length;n+e<process.stdout.columns?(n+=e,process.stdout.write(t)):(process.stdout.write(`
|
|
78
78
|
${Qe}${t.trimStart()}`),n=3+(0,a.stripVTControlCharacters)(t.trimStart()).length)}process.stdout.write(`
|
|
79
|
-
`)},info:e=>q.message(e,{symbol:(0,a.styleText)(`blue`,Le)}),success:e=>q.message(e,{symbol:(0,a.styleText)(`green`,Re)}),step:e=>q.message(e,{symbol:(0,a.styleText)(`green`,z)}),warn:e=>q.message(e,{symbol:(0,a.styleText)(`yellow`,ze)}),warning:e=>q.warn(e),error:e=>q.message(e,{symbol:(0,a.styleText)(`red`,Be)})},$e=e=>new we({validate:e.validate,placeholder:e.placeholder,defaultValue:e.defaultValue,initialValue:e.initialValue,output:e.output,signal:e.signal,input:e.input,render(){let t=e?.withGuide??
|
|
79
|
+
`)},info:e=>q.message(e,{symbol:(0,a.styleText)(`blue`,Le)}),success:e=>q.message(e,{symbol:(0,a.styleText)(`green`,Re)}),step:e=>q.message(e,{symbol:(0,a.styleText)(`green`,z)}),warn:e=>q.message(e,{symbol:(0,a.styleText)(`yellow`,ze)}),warning:e=>q.warn(e),error:e=>q.message(e,{symbol:(0,a.styleText)(`red`,Be)})},$e=e=>new we({validate:e.validate,placeholder:e.placeholder,defaultValue:e.defaultValue,initialValue:e.initialValue,output:e.output,signal:e.signal,input:e.input,render(){let t=e?.withGuide??F.withGuide,n=`${`${t?`${(0,a.styleText)(`gray`,B)}
|
|
80
80
|
`:``}${Ve(this.state)} `}${e.message}
|
|
81
81
|
`,r=e.placeholder?(0,a.styleText)(`inverse`,e.placeholder[0])+(0,a.styleText)(`dim`,e.placeholder.slice(1)):(0,a.styleText)([`inverse`,`hidden`],`_`),i=this.userInput?this.userInputWithCursor:r,o=this.value??``;switch(this.state){case`error`:{let e=this.error?` ${(0,a.styleText)(`yellow`,this.error)}`:``,r=t?`${(0,a.styleText)(`yellow`,B)} `:``,o=t?(0,a.styleText)(`yellow`,V):``;return`${n.trim()}
|
|
82
82
|
${r}${i}
|
|
@@ -108,11 +108,11 @@ ${t?(0,a.styleText)(`cyan`,V):``}
|
|
|
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 P(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 P(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 P(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 P(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 P(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 P(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 P(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 P(e)?null:e}async function It(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 P(t)?null:t}async function Lt(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(P(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,useDefaultPath:It,path:Lt,installTypeDefinitions:At,envDtsHandling:jt,validator:Ft,useEnvExample:kt};async function Rt(e,t=!1){return(e?.mode||`existing`)===`new`?zt(e,t):Bt(e,t)}async function zt(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 Ht)return null;throw e}}async function Bt(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=await Vt(e,n,r),o;return(n===`vite`||n===`bun-fullstack`)&&(o=a?`append`:`overwrite`),(0,t.shake)({mode:`existing`,path:r,validator:`arktype`,framework:n,bunFeatures:n===`bun-fullstack`?e?.bunFeatures??[`serve`]:void 0,language:`ts`,overwriteEnvSchemaFile:!0,installTypeDefinitions:n===`vite`||n===`bun-fullstack`,installSkill:!1,envDtsHandling:o,envKeys:i??void 0})}try{let n=Q(await Z.overwriteEnvSchemaFile({hasEnvSchemaFile:e?.hasEnvSchemaFile??!1,defaultPath:r})),o=Q(await Z.framework({framework:e?.framework})),s;if(o===`bun-fullstack`){let t=!!e?.bunFeatures?.includes(`build`);s=Q(await Z.bunBuild({initialValue:t}))}let c=Q(await Z.useDefaultPath({defaultEnvPath:r})),l=Q(await Z.path({useDefaultPath:c,defaultEnvPath:r})),u=await Vt(e,o,l),d=Q(await Z.installTypeDefinitions({framework:o,hasTypeFile:u})),f=Q(await Z.envDtsHandling({framework:o,installTypeDefinitions:d,hasTypeFile:u})),p=Q(await Z.validator()),m=Q(await Z.useEnvExample({detectedKeys:i,keysSource:a}));return(0,t.shake)({mode:`existing`,overwriteEnvSchemaFile:n,framework:o,path:l,installTypeDefinitions:d,envDtsHandling:f,validator:p,bunFeatures:o===`bun-fullstack`?s?[`serve`,`build`]:[`serve`]:void 0,language:`ts`,installSkill:!1,envKeys:m?i??void 0:void 0})}catch(e){if(e instanceof Ht)return null;throw e}}async function Vt(e,t,n){return await e?.hasTypeFileAtPath?.({framework:t,envPath:n})??e?.hasTypeFile??!1}var Ht=class extends Error{constructor(){super(`Operation cancelled`)}};function Q(e){if(e===null||P(e))throw Ge(`Operation cancelled`),new Ht;return e}var Ut=class{async confirm(e,n=!0,r,i){let a=await U((0,t.shake)({message:e,initialValue:n,active:r,inactive:i}));return P(a)?null:a}async runWizard(e,t=!1){return Rt(e,t)}};const Wt={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`}},Gt=new Set(Object.values(Wt).flatMap(e=>[e.long,e.short])),Kt=new Set(Object.values(Wt).filter(e=>e.kind===`value`).flatMap(e=>[e.long,e.short]));var qt=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(Kt.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}`);Kt.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(!Gt.has(e)){this.validationError=`Unknown argument: ${e}`;break}if(Kt.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=Wt.example;return this.getFlagValue(e.long,e.short)}hasFlag(e){let t=Wt[e];return this.args.includes(t.long)||this.args.includes(t.short)}get initInput(){let e={isYes:this.isYes,isForce:this.isForce,isQuiet:this.isQuiet,isAgent:this.isAgent};return this.example!==void 0&&(e.example=this.example),this.name!==void 0&&(e.name=this.name),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]}},Jt=`0.2.5`;function Yt(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 Xt=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:`Agent mode: --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:`--help, -h`,right:`Show this help message`}];this.logger.log(`ArkEnv CLI v${Jt}`),this.logger.log(`\n${y.default.bold(`Usage:`)}`);for(let t of Yt(e))this.logger.log(t);this.logger.log(`\n${y.default.bold(`Options:`)}`);for(let e of Yt(t))this.logger.log(e)}};function Zt(e,t){let{extraImports:n,serverField:r,clientField:i,sharedField:a,defaultServerFields:o,defaultClientFields:s,defaultSharedFields:c}=t,l=[],u=[],d=[],f=[];if(e&&e.length>0)for(let t of e)t.startsWith(`NEXT_PUBLIC_`)?(u.push(i(t)),f.push(`\t\t${t}: process.env.${t},`)):t===`NODE_ENV`||t===`PORT`?(d.push(a(t,t===`PORT`)),f.push(`\t\t${t}: process.env.${t},`)):l.push(r(t));else l.push(...o),u.push(...s),d.push(...c),f.push(` NEXT_PUBLIC_API_URL: process.env.NEXT_PUBLIC_API_URL,`,` NODE_ENV: process.env.NODE_ENV,`);let p=[];return l.length>0&&p.push(`\tserver: {\n${l.join(`
|
|
112
|
-
`)}\n\t}`),
|
|
113
|
-
`)}\n\t}`),
|
|
114
|
-
`)}\n\t}`),
|
|
115
|
-
`)}\n\t}`),`${[`import arkenv from "@arkenv/nextjs";`,...
|
|
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(`
|
|
112
|
+
`)}\n\t}`),f.length>0&&m.push(`\tclient: {\n${f.join(`
|
|
113
|
+
`)}\n\t}`),p.length>0&&m.push(`\tshared: {\n${p.join(`
|
|
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(`
|
|
115
|
+
`)}\n\t}`),`${[`import arkenv from "@arkenv/nextjs";`,...i?[i]:[]].join(`
|
|
116
116
|
`)}
|
|
117
117
|
|
|
118
118
|
/**
|
|
@@ -121,10 +121,22 @@ ${t?(0,a.styleText)(`cyan`,V):``}
|
|
|
121
121
|
* Enforces client/server separation and prevents secret leaks.
|
|
122
122
|
*/
|
|
123
123
|
export const env = arkenv({
|
|
124
|
-
${
|
|
124
|
+
${m.join(`,
|
|
125
125
|
`)},
|
|
126
126
|
});
|
|
127
|
-
`}
|
|
127
|
+
`}return`${[`import { createEnv } from "${n||`./generated/env.gen`}";`,...i?[i]:[]].join(`
|
|
128
|
+
`)}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Environment variable schema.
|
|
132
|
+
* In Next.js, use the generated \`createEnv\` from \`env.gen.ts\` to validate variables.
|
|
133
|
+
* Enforces client/server separation and prevents secret leaks.
|
|
134
|
+
*/
|
|
135
|
+
export const env = createEnv({
|
|
136
|
+
${m.join(`,
|
|
137
|
+
`)},
|
|
138
|
+
});
|
|
139
|
+
`}const en=(e,t,n,r)=>{let a=e?.length?e.map(e=>`\t\t${e}: "string?",`).join(`
|
|
128
140
|
`):` NODE_ENV: "'development' | 'production' | 'test' = 'development'",
|
|
129
141
|
PORT: "number.port = 3000",`;return t===`vite`?i.default`
|
|
130
142
|
import { type } from "arkenv";
|
|
@@ -135,7 +147,7 @@ ${p.join(`,
|
|
|
135
147
|
* and provide typesafety for \`import.meta.env\` on the client-side.
|
|
136
148
|
*/
|
|
137
149
|
export const Env = type({
|
|
138
|
-
${
|
|
150
|
+
${a}
|
|
139
151
|
});
|
|
140
152
|
`:t===`bun-fullstack`?i.default`
|
|
141
153
|
import { type } from "arkenv";
|
|
@@ -146,20 +158,20 @@ ${n}
|
|
|
146
158
|
* and provide typesafety for \`process.env\` on the client-side.
|
|
147
159
|
*/
|
|
148
160
|
export const Env = type({
|
|
149
|
-
${
|
|
161
|
+
${a}
|
|
150
162
|
});
|
|
151
|
-
`:t===`nextjs
|
|
163
|
+
`:t===`nextjs`?$t(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`
|
|
152
164
|
import arkenv, { type } from "arkenv";
|
|
153
165
|
|
|
154
166
|
/**
|
|
155
167
|
* Environment variable schema for server-side or runtime-only validation.
|
|
156
168
|
*/
|
|
157
169
|
export const Env = type({
|
|
158
|
-
${
|
|
170
|
+
${a}
|
|
159
171
|
});
|
|
160
172
|
|
|
161
173
|
export const env = arkenv(Env);
|
|
162
|
-
`}
|
|
174
|
+
`},tn=e=>i.default`
|
|
163
175
|
/// <reference types="vite/client" />
|
|
164
176
|
|
|
165
177
|
type ImportMetaEnvAugmented =
|
|
@@ -172,7 +184,7 @@ ${n}
|
|
|
172
184
|
interface ImportMeta {
|
|
173
185
|
readonly env: ImportMetaEnv;
|
|
174
186
|
}
|
|
175
|
-
`,
|
|
187
|
+
`,nn=e=>i.default`
|
|
176
188
|
/// <reference types="bun-types" />
|
|
177
189
|
|
|
178
190
|
type ProcessEnvAugmented = import("@arkenv/bun-plugin").ProcessEnvAugmented<
|
|
@@ -182,7 +194,7 @@ ${n}
|
|
|
182
194
|
declare namespace NodeJS {
|
|
183
195
|
interface ProcessEnv extends ProcessEnvAugmented {}
|
|
184
196
|
}
|
|
185
|
-
`,
|
|
197
|
+
`,rn=(e,t,n,r)=>{let a=e?.length?e.map(e=>`\t\t${e}: v.optional(v.string()),`).join(`
|
|
186
198
|
`):` NODE_ENV: v.optional(v.picklist(["development", "production", "test"]), "development"),
|
|
187
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`
|
|
188
200
|
import { type } from "arkenv";
|
|
@@ -194,7 +206,7 @@ ${n}
|
|
|
194
206
|
* and provide typesafety for \`import.meta.env\` on the client-side.
|
|
195
207
|
*/
|
|
196
208
|
export const Env = type({
|
|
197
|
-
${
|
|
209
|
+
${a}
|
|
198
210
|
});
|
|
199
211
|
`:t===`bun-fullstack`?i.default`
|
|
200
212
|
import { type } from "arkenv";
|
|
@@ -206,9 +218,9 @@ ${n}
|
|
|
206
218
|
* and provide typesafety for \`process.env\` on the client-side.
|
|
207
219
|
*/
|
|
208
220
|
export const Env = type({
|
|
209
|
-
${
|
|
221
|
+
${a}
|
|
210
222
|
});
|
|
211
|
-
`:t===`nextjs
|
|
223
|
+
`:t===`nextjs`?$t(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`
|
|
212
224
|
import arkenv from "arkenv/standard";
|
|
213
225
|
import * as v from "valibot";
|
|
214
226
|
|
|
@@ -216,9 +228,9 @@ ${n}
|
|
|
216
228
|
* Environment variable schema for server-side or runtime-only validation.
|
|
217
229
|
*/
|
|
218
230
|
export const env = arkenv({
|
|
219
|
-
${
|
|
231
|
+
${a}
|
|
220
232
|
});
|
|
221
|
-
`},
|
|
233
|
+
`},an=(e,t,n,r)=>{let a=e?.length?e.map(e=>`\t\t${e}: z.string().optional(),`).join(`
|
|
222
234
|
`):` NODE_ENV: z.enum(["development", "production", "test"]).default("development"),
|
|
223
235
|
PORT: z.coerce.number().int().min(1).max(65535).default(3000),`;return t===`vite`?i.default`
|
|
224
236
|
import { type } from "arkenv";
|
|
@@ -230,7 +242,7 @@ ${n}
|
|
|
230
242
|
* and provide typesafety for \`import.meta.env\` on the client-side.
|
|
231
243
|
*/
|
|
232
244
|
export const Env = type({
|
|
233
|
-
${
|
|
245
|
+
${a}
|
|
234
246
|
});
|
|
235
247
|
`:t===`bun-fullstack`?i.default`
|
|
236
248
|
import { type } from "arkenv";
|
|
@@ -242,9 +254,9 @@ ${n}
|
|
|
242
254
|
* and provide typesafety for \`process.env\` on the client-side.
|
|
243
255
|
*/
|
|
244
256
|
export const Env = type({
|
|
245
|
-
${
|
|
257
|
+
${a}
|
|
246
258
|
});
|
|
247
|
-
`:t===`nextjs
|
|
259
|
+
`:t===`nextjs`?$t(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`
|
|
248
260
|
import arkenv from "arkenv/standard";
|
|
249
261
|
import { z } from "zod";
|
|
250
262
|
|
|
@@ -252,14 +264,118 @@ ${n}
|
|
|
252
264
|
* Environment variable schema for server-side or runtime-only validation.
|
|
253
265
|
*/
|
|
254
266
|
export const env = arkenv({
|
|
255
|
-
${
|
|
267
|
+
${a}
|
|
256
268
|
});
|
|
257
|
-
`};function
|
|
269
|
+
`};function on(e,t){let{validator:n,envKeys:r,framework:i,disableCodegen:a}=e;switch(n){case`arktype`:return`${en(r,i,t,a)}\n`;case`zod`:return`${an(r,i,t,a)}\n`;case`valibot`:return`${rn(r,i,t,a)}\n`;default:throw Error(`Unsupported validator: ${n}`)}}function sn(e){let{validator:t,envKeys:n}=e,r=[],i=[],a=[],o=[];if(n&&n.length>0)for(let e of n)e.startsWith(`NEXT_PUBLIC_`)?(t===`arktype`?i.push(`${e}: "string?",`):t===`zod`?i.push(`${e}: z.string().optional(),`):t===`valibot`&&i.push(`${e}: v.optional(v.string()),`),o.push(`${e}: process.env.${e},`)):e===`NODE_ENV`||e===`PORT`?(t===`arktype`?a.push(`${e}: "${e===`PORT`?`number.port = 3000`:`'development' | 'production' | 'test' = 'development'`}",`):t===`zod`?a.push(`${e}: ${e===`PORT`?`z.coerce.number().int().min(1).max(65535).default(3000)`:`z.enum(["development", "production", "test"]).default("development")`},`):t===`valibot`&&a.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")`},`),o.push(`${e}: process.env.${e},`)):t===`arktype`?r.push(`${e}: "string?",`):t===`zod`?r.push(`${e}: z.string().optional(),`):t===`valibot`&&r.push(`${e}: v.optional(v.string()),`);else t===`arktype`?(r.push(`DATABASE_URL: "string = 'postgres://localhost:5432/mydb'",`),i.push(`NEXT_PUBLIC_API_URL: "string = 'https://api.example.com'",`),a.push(`NODE_ENV: "'development' | 'production' | 'test' = 'development'",`)):t===`zod`?(r.push(`DATABASE_URL: z.string().url().default("postgres://localhost:5432/mydb"),`),i.push(`NEXT_PUBLIC_API_URL: z.string().url().default("https://api.example.com"),`),a.push(`NODE_ENV: z.enum(["development", "production", "test"]).default("development"),`)):t===`valibot`&&(r.push(`DATABASE_URL: v.optional(v.pipe(v.string(), v.url()), "postgres://localhost:5432/mydb"),`),i.push(`NEXT_PUBLIC_API_URL: v.optional(v.pipe(v.string(), v.url()), "https://api.example.com"),`),a.push(`NODE_ENV: v.optional(v.picklist(["development", "production", "test"]), "development"),`)),o.push(`NEXT_PUBLIC_API_URL: process.env.NEXT_PUBLIC_API_URL,`,`NODE_ENV: process.env.NODE_ENV,`);let s=``,c=``,l=``;return t===`arktype`?(s=`import { type } from "@arkenv/nextjs/shared";
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* @internal 🛑 INTERNAL SCHEMA ONLY.
|
|
273
|
+
* Do not import this directly. Import \`env\` from \`./client\` or \`./server\` instead.
|
|
274
|
+
*/
|
|
275
|
+
export const SharedSchema = type({
|
|
276
|
+
${a.map(e=>e.trim()).join(`
|
|
277
|
+
`)}
|
|
278
|
+
});`,c=`import arkenv from "@arkenv/nextjs/client";
|
|
279
|
+
import { SharedSchema } from "./internal/shared";
|
|
280
|
+
|
|
281
|
+
export const env = arkenv(
|
|
282
|
+
{
|
|
283
|
+
${i.map(e=>e.trim()).join(`
|
|
284
|
+
`)}
|
|
285
|
+
},
|
|
286
|
+
{
|
|
287
|
+
extends: [SharedSchema],
|
|
288
|
+
runtimeEnv: {
|
|
289
|
+
${o.map(e=>e.trim()).join(`
|
|
290
|
+
`)}
|
|
291
|
+
},
|
|
292
|
+
},
|
|
293
|
+
);`,l=`import arkenv from "@arkenv/nextjs/server";
|
|
294
|
+
import { env as clientEnv } from "./client";
|
|
295
|
+
|
|
296
|
+
export const env = arkenv(
|
|
297
|
+
{
|
|
298
|
+
${r.map(e=>e.trim()).join(`
|
|
299
|
+
`)}
|
|
300
|
+
},
|
|
301
|
+
{
|
|
302
|
+
extends: [clientEnv],
|
|
303
|
+
},
|
|
304
|
+
);`):t===`zod`?(s=`import { z } from "zod";
|
|
305
|
+
|
|
306
|
+
/**
|
|
307
|
+
* @internal 🛑 INTERNAL SCHEMA ONLY.
|
|
308
|
+
* Do not import this directly. Import \`env\` from \`./client\` or \`./server\` instead.
|
|
309
|
+
*/
|
|
310
|
+
export const SharedSchema = z.object({
|
|
311
|
+
${a.map(e=>e.trim()).join(`
|
|
312
|
+
`)}
|
|
313
|
+
});`,c=`import arkenv from "@arkenv/nextjs/client";
|
|
314
|
+
import { z } from "zod";
|
|
315
|
+
import { SharedSchema } from "./internal/shared";
|
|
316
|
+
|
|
317
|
+
export const env = arkenv(
|
|
318
|
+
{
|
|
319
|
+
${i.map(e=>e.trim()).join(`
|
|
320
|
+
`)}
|
|
321
|
+
},
|
|
322
|
+
{
|
|
323
|
+
extends: [SharedSchema],
|
|
324
|
+
runtimeEnv: {
|
|
325
|
+
${o.map(e=>e.trim()).join(`
|
|
326
|
+
`)}
|
|
327
|
+
},
|
|
328
|
+
},
|
|
329
|
+
);`,l=`import arkenv from "@arkenv/nextjs/server";
|
|
330
|
+
import { z } from "zod";
|
|
331
|
+
import { env as clientEnv } from "./client";
|
|
332
|
+
|
|
333
|
+
export const env = arkenv(
|
|
334
|
+
{
|
|
335
|
+
${r.map(e=>e.trim()).join(`
|
|
336
|
+
`)}
|
|
337
|
+
},
|
|
338
|
+
{
|
|
339
|
+
extends: [clientEnv],
|
|
340
|
+
},
|
|
341
|
+
);`):t===`valibot`&&(s=`import * as v from "valibot";
|
|
342
|
+
|
|
343
|
+
/**
|
|
344
|
+
* @internal 🛑 INTERNAL SCHEMA ONLY.
|
|
345
|
+
* Do not import this directly. Import \`env\` from \`./client\` or \`./server\` instead.
|
|
346
|
+
*/
|
|
347
|
+
export const SharedSchema = v.object({
|
|
348
|
+
${a.map(e=>e.trim()).join(`
|
|
349
|
+
`)}
|
|
350
|
+
});`,c=`import arkenv from "@arkenv/nextjs/client";
|
|
351
|
+
import * as v from "valibot";
|
|
352
|
+
import { SharedSchema } from "./internal/shared";
|
|
353
|
+
|
|
354
|
+
export const env = arkenv(
|
|
355
|
+
{
|
|
356
|
+
${i.map(e=>e.trim()).join(`
|
|
357
|
+
`)}
|
|
358
|
+
},
|
|
359
|
+
{
|
|
360
|
+
extends: [SharedSchema],
|
|
361
|
+
runtimeEnv: {
|
|
362
|
+
${o.map(e=>e.trim()).join(`
|
|
363
|
+
`)}
|
|
364
|
+
},
|
|
365
|
+
},
|
|
366
|
+
);`,l=`import arkenv from "@arkenv/nextjs/server";
|
|
367
|
+
import * as v from "valibot";
|
|
368
|
+
import { env as clientEnv } from "./client";
|
|
369
|
+
|
|
370
|
+
export const env = arkenv(
|
|
371
|
+
{
|
|
372
|
+
${r.map(e=>e.trim()).join(`
|
|
373
|
+
`)}
|
|
374
|
+
},
|
|
375
|
+
{
|
|
376
|
+
extends: [clientEnv],
|
|
377
|
+
},
|
|
378
|
+
);`),{shared:`${s}\n`,client:`${c}\n`,server:`${l}\n`}}async function cn(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 ln(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 ln(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 un(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 dn(e,t){if(t||e.metadata.skillDetected)return{message:i.default`
|
|
258
379
|
Inside your AI assistant (e.g. Claude Code), use:
|
|
259
380
|
${X(`/arkenv`)} - automatically refine your schema and configure integrations.
|
|
260
|
-
`,title:`Next steps`};let n=e.skill?.dlxCommand.join(` `)||`npx`,r=e.skill?.packageName||`yamcodes/arkenv`,a=cn(e);return{message:i.default`
|
|
261
|
-
1. Check ${X(e.metadata.displayPath)} and refine your environment schema.
|
|
262
|
-
${a}
|
|
263
|
-
3. (Recommended) Install the AI skill: ${X(`${n} skills add ${r}`)}
|
|
264
|
-
Then run ${X(`/arkenv`)} inside your AI assistant to finish.
|
|
265
|
-
`,title:`Next steps`}}var un=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 an(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]=sn(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`)}}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=ln(e,i);this.reporter.note(a.message,a.title),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 dn(e){switch(e){case`pnpm`:return[`pnpm`,`dlx`];case`yarn`:return[`yarn`,`dlx`];case`bun`:return[`bunx`];default:return[`npx`]}}function fn(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,skillDetected:i.skillDetected})};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:dn(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),m=rn(i),h=l.includes(f);(!h||i.overwriteEnvSchemaFile!==!1)&&d.files.push({path:f,content:m,action:h?`overwrite`:`create`,label:`environment schema`});let g=[`arkenv`,i.validator];if(i.framework===`vite`&&g.push(`@arkenv/vite-plugin`),i.framework===`bun-fullstack`&&i.bunFeatures?.length&&g.push(`@arkenv/bun-plugin`),i.framework===`nextjs`&&g.push(`@arkenv/nextjs`),(i.framework===`vite`||i.framework===`nextjs`||i.framework===`bun-fullstack`&&i.bunFeatures?.length)&&!g.includes(`arktype`)&&g.push(`arktype`),d.install={packageManager:a,dependencies:g},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`?$t(i.path):en(i.path);d.files.push({path:t,content:e,action:n?`overwrite`:`create`,label:`${i.framework} types`})}}(i.framework===`vite`||i.framework===`bun-fullstack`)&&(d.bootstrap=(0,t.shake)({framework:i.framework,bunFeatures:i.framework===`bun-fullstack`?i.bunFeatures:void 0})),i.installSkill&&(d.skill={dlxCommand:dn(a),packageName:`yamcodes/arkenv`,isYes:e.isYes});let _=r.default.relative(c,f).replace(/\\/g,`/`),v=_.startsWith(`.`)?_:`./${_}`,y=v.replace(/\.(ts|js|tsx|jsx)$/,``);return d.metadata.displayPath=v,d.metadata.importPath=y,d.bootstrap&&(d.bootstrap.importPath=y),d}var pn=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`}]}}}},mn=class{constructor(e,t,n,r,i=new pn){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=fn(t),r=new un(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 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}),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(await this.workspace.exists(C)&&x.overwriteEnvSchemaFile===void 0){let e=await this.prompt.confirm(`File ${X(r.default.basename(C))} already exists. Overwrite?`,!1);if(e===null)return null;if(!e)return this.logger.cancel(`Operation cancelled.`),null;x.overwriteEnvSchemaFile=e}let ee=await this.scanner.detectPackageManager(n,f.parsed),w=[];await this.workspace.exists(C)&&w.push(C);let T;if(x.framework===`vite`?T=`vite-env.d.ts`:x.framework===`bun-fullstack`&&(T=`bun-env.d.ts`),T){let e=r.default.dirname(C),t=r.default.join(e,T);await this.workspace.exists(t)&&w.push(t)}return(0,t.shake)({mode:`existing`,cwd:n,options:x,detectedFramework:p,detectedBunFeatures:m,packageManager:ee,tsConfig:f,shouldUpdateTsConfig:d,existingFiles:w,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 hn(e){let t=new qt(e),n=t.logger,r=new Dt(t.isQuiet,n.stdio),i=new Ut;return{cli:t,logger:n,workspace:r,prompt:i,initUseCase:new mn(n,r,i,new yt),helpUseCase:new Xt(n)}}let $,gn=!1;async function _n(){if(process.env.INIT_CWD)try{process.chdir(process.env.INIT_CWD)}catch{}let{cli:e,logger:n,initUseCase:r,helpUseCase:i}=hn(process.argv);$=n,vn(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 vn(e){let t=async t=>{gn&&process.exit(t),gn=!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))}_n(),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)});
|
|
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)});
|