@arkenv/cli 0.0.8 → 0.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -0
- package/dist/chunk-i8uDWG73.cjs +1 -0
- package/dist/index.cjs +123 -111
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -21,6 +21,14 @@ npx @arkenv/cli@latest init
|
|
|
21
21
|
- [ArkEnv](https://arkenv.js.org) - Core library and docs
|
|
22
22
|
- [ArkType](https://arktype.io/) - Underlying validator / type system
|
|
23
23
|
|
|
24
|
+
## Architecture
|
|
25
|
+
|
|
26
|
+
This CLI is built with a port-and-adapter architecture to remain flexible and testable.
|
|
27
|
+
|
|
28
|
+
### Local Environment Adapters (`Node*`)
|
|
29
|
+
|
|
30
|
+
Implementations prefixed with `Node` (e.g., `NodeWorkspace`, `NodeProjectScanner`) represent the standard local development environment. They utilize standard `node:*` APIs (like `node:fs` and `node:child_process`) which are universally supported across modern runtimes including Node.js, Bun, and Deno. This naming reflects the API standard used rather than a runtime restriction.
|
|
31
|
+
|
|
24
32
|
## License
|
|
25
33
|
|
|
26
34
|
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),s=(e,n)=>{let r={};for(var i in e)t(r,i,{get:e[i],enumerable:!0});return n||t(r,Symbol.toStringTag,{value:`Module`}),r},c=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},l=(n,r,a)=>(a=n==null?{}:e(i(n)),c(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return o}});
|
package/dist/index.cjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
2
|
+
const e=require(`./chunk-i8uDWG73.cjs`);let t=require(`node:fs/promises`);t=e.r(t,1);let n=require(`node:path`);n=e.r(n,1);let r=require(`dedent`);r=e.r(r,1);let i=require(`node:util`),a=require(`node:process`);a=e.r(a,1);let o=require(`node:readline`);o=e.r(o,1);let s=require(`node:tty`),c=require(`node:fs`);c=e.r(c,1);let l=require(`node:module`),u=require(`jsonc-parser`),d=require(`node:child_process`),f=require(`magicast`),p=require(`radashi`);var m=e.n({safeAppend:()=>g});const h=`// @arkenv-types`;async function g(e,r,i){try{let a=await t.default.readFile(e,`utf-8`),o=i===`vite`?`ImportMetaEnvAugmented`:`ProcessEnvAugmented`;if(a.includes(h)||a.includes(o))return!1;let s=n.default.dirname(e),c=n.default.relative(s,r).replace(/\.(ts|js|tsx|jsx)$/,``).split(n.default.sep).join(`/`),l=c.startsWith(`.`)?c:`./${c}`,u=i===`vite`?_(l):v(l),d=a.endsWith(`
|
|
3
3
|
`)?``:`
|
|
4
|
-
`;return await
|
|
4
|
+
`;return await t.default.appendFile(e,`${d}\n${h}\n${u}\n`,`utf-8`),!0}catch(t){return console.error(`Failed to append to ${e}:`,t),!1}}function _(e){return r.default`
|
|
5
5
|
type ImportMetaEnvAugmented = import("@arkenv/vite-plugin").ImportMetaEnvAugmented<
|
|
6
6
|
typeof import("${e}").Env
|
|
7
7
|
>;
|
|
@@ -11,7 +11,7 @@ var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=
|
|
|
11
11
|
interface ImportMeta {
|
|
12
12
|
readonly env: ImportMetaEnv;
|
|
13
13
|
}
|
|
14
|
-
`}function
|
|
14
|
+
`}function v(e){return r.default`
|
|
15
15
|
type ProcessEnvAugmented = import("@arkenv/bun-plugin").ProcessEnvAugmented<
|
|
16
16
|
typeof import("${e}").Env
|
|
17
17
|
>;
|
|
@@ -19,107 +19,136 @@ var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=
|
|
|
19
19
|
declare namespace NodeJS {
|
|
20
20
|
interface ProcessEnv extends ProcessEnvAugmented {}
|
|
21
21
|
}
|
|
22
|
-
`}var
|
|
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 y=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})),b=e.r(y(),1),x=class{info(e){process.stderr.write(`${b.default.blue(`ℹ ${e}`)}\n`)}warn(e){process.stderr.write(`${b.default.yellow(`⚠ ${e}`)}\n`)}error(e){process.stderr.write(`${b.default.red(`✘ ${e}`)}\n`)}success(e){process.stderr.write(`${b.default.green(`✔ ${e}`)}\n`)}step(e){process.stderr.write(`○ ${e}\n`)}note(e,t){process.stderr.write(`${b.default.dim(`○ ${t?`${t}: `:``}${e}`)}\n`)}log(e){process.stderr.write(`${e}\n`)}spinner(){return{start:e=>process.stderr.write(`${b.default.dim(`○ ${e}...`)}\n`),stop:e=>process.stderr.write(`${b.default.green(`✔ ${e}`)}\n`),message:e=>process.stderr.write(`${b.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())})}},S=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 ee=(()=>{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}})(),te=e=>e===12288||e>=65281&&e<=65376||e>=65504&&e<=65510,ne=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,re=/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]|\u001b\]8;[^;]*;.*?(?:\u0007|\u001b\u005c)/y,C=/[\x00-\x08\x0A-\x1F\x7F-\x9F]{1,1000}/y,w=/(?:(?![\uFF61-\uFF9F\uFF00-\uFFEF])[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Hangul}\p{Script=Tangut}]){1,1000}/uy,ie=/\t{1,1000}/y,T=/[\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,ae=/(?:[\x20-\x7E\xA0-\xFF](?!\uFE0F)){1,1000}/y,oe=/\p{M}+/gu,se={limit:1/0,ellipsis:``},ce=(e,t={},n={})=>{let r=t.limit??1/0,i=t.ellipsis??``,a=t?.ellipsisWidth??(i?ce(i,se,n).width:0),o=n.controlWidth??0,s=n.tabWidth??8,c=n.emojiWidth??2,l=n.regularWidth??1,u=n.wideWidth??2,d=[[ae,l],[re,0],[C,o],[ie,s],[T,c],[w,u]],f=0,p=0,m=e.length,h=0,g=!1,_=m,v=Math.max(0,r-a),y=0,b=0,x=0,S=0;outer:for(;;){if(b>y||p>=m&&p>f){let t=e.slice(y,b)||e.slice(f,p);h=0;for(let e of t.replaceAll(oe,``)){let t=e.codePointAt(0)||0;if(S=te(t)?2:ne(t)?u:l,x+S>v&&(_=Math.min(_,Math.max(y,f)+h)),x+S>r){g=!0;break outer}h+=e.length,x+=S}y=b=0}if(p>=m)break outer;for(let t=0,n=d.length;t<n;t++){let[n,i]=d[t];if(n.lastIndex=p,n.test(e)){if(h=n===w?ee(e.slice(p,n.lastIndex)):n===T?1:n.lastIndex-p,S=h*i,x+S>v&&(_=Math.min(_,p+Math.floor((v-x)/i))),x+S>r){g=!0;break outer}x+=S,y=f,b=p,p=f=n.lastIndex;continue outer}}p+=1}return{width:g?v:x,index:g?_:m,truncated:g,ellipsed:g&&r>=a}},le={limit:1/0,ellipsis:``,ellipsisWidth:0},E=(e,t={})=>ce(e,le,t).width,ue=`]8;;`,de=RegExp(`(?:\\[(?<code>\\d+)m|\\${ue}(?<uri>.*))`,`y`),fe=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},pe=e=>`[${e}m`,me=e=>`${ue}${e}`,D=(e,t,n)=>{let r=t[Symbol.iterator](),i=!1,a=!1,o=e.at(-1),s=o===void 0?0:E(o),c=r.next(),l=r.next(),u=0;for(;!c.done;){let o=c.value,d=E(o);s+d<=n?e[e.length-1]+=o:(e.push(o),s=0),(o===`\x1B`||o===``)&&(i=!0,a=t.startsWith(ue,u+1)),i?a?o===`\x07`&&(i=!1,a=!1):o===`m`&&(i=!1):(s+=d,s===n&&!l.done&&(e.push(``),s=0)),c=l,l=r.next(),u+=o.length}o=e.at(-1),!s&&o!==void 0&&o.length&&e.length>1&&(e[e.length-2]+=e.pop())},he=e=>{let t=e.split(` `),n=t.length;for(;n&&!E(t[n-1]);)n--;return n===t.length?e:t.slice(0,n).join(` `)+t.slice(n).join(``)},ge=(e,t,n={})=>{if(n.trim!==!1&&e.trim()===``)return``;let r=``,i,a,o=e.split(` `),s=[``],c=0;for(let e=0;e<o.length;e++){let r=o[e];if(n.trim!==!1){let e=s.at(-1)??``,t=e.trimStart();e.length!==t.length&&(s[s.length-1]=t,c=E(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=E(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(``),D(s,r,t),c=E(s.at(-1)??``);continue}if(c+i>t&&c&&i){if(n.wordWrap===!1&&c<t){D(s,r,t),c=E(s.at(-1)??``);continue}s.push(``),c=0}if(c+i>t&&n.wordWrap===!1){D(s,r,t),c=E(s.at(-1)??``);continue}s[s.length-1]+=r,c+=i}n.trim!==!1&&(s=s.map(e=>he(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===``){de.lastIndex=e+1;let t=de.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+=me(``));let e=i?fe(i):void 0;i&&e&&(r+=pe(e))}else t===`
|
|
25
|
+
`&&(i&&fe(i)&&(r+=pe(i)),a&&(r+=me(a)))}return r},_e=/\r?\n/;function O(e,t,n){return String(e).normalize().split(_e).map(e=>ge(e,t,n)).join(`
|
|
26
|
+
`)}var k=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 A(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?A(a,t<0?-1:1,n):a}const j={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 ve(e,t){if(typeof e==`string`)return j.aliases.get(e)===t;for(let n of e)if(n!==void 0&&ve(n,t))return!0;return!1}function ye(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 be=globalThis.process.platform.startsWith(`win`),xe=Symbol(`clack:cancel`);function M(e){return e===xe}function N(e,t){let n=e;n.isTTY&&n.setRawMode(t)}function Se({input:e=a.stdin,output:t=a.stdout,overwrite:n=!0,hideCursor:r=!0}={}){let i=o.createInterface({input:e,output:t,prompt:``,tabSize:1});o.emitKeypressEvents(e,i),e instanceof s.ReadStream&&e.isTTY&&e.setRawMode(!0);let c=(i,{name:a,sequence:s})=>{if(ve([String(i),a,s],`cancel`)){r&&t.write(k.cursor.show),process.exit(0);return}if(!n)return;let l=a===`return`?0:-1,u=a===`return`?-1:0;o.moveCursor(t,l,u,()=>{o.clearLine(t,1,()=>{e.once(`keypress`,c)})})};return r&&t.write(k.cursor.hide),e.once(`keypress`,c),()=>{e.off(`keypress`,c),r&&t.write(k.cursor.show),e instanceof s.ReadStream&&e.isTTY&&!be&&e.setRawMode(!1),i.terminal=!1,i.close()}}const P=e=>`columns`in e&&typeof e.columns==`number`?e.columns:80,Ce=e=>`rows`in e&&typeof e.rows==`number`?e.rows:20;function F(e,t,n,r=n,i){return O(t,P(e??a.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
|
|
31
|
-
`),
|
|
32
|
-
`).length-1;this.output.write(
|
|
33
|
-
`);this.output.write(t[a]),this._prevFrame=e,this.output.write(
|
|
30
|
+
`)}let I=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=a.stdin,output:r=a.stdout,render:i,signal:o,...s}=e;this.opts=s,this.onKeypress=this.onKeypress.bind(this),this.close=this.close.bind(this),this.render=this.render.bind(this),this._render=i.bind(this),this._track=t,this._abortSignal=o,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(xe);this._abortSignal.addEventListener(`abort`,()=>{this.state=`cancel`,this.close()},{once:!0})}this.rl=o.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),N(this.input,!0),this.output.on(`resize`,this.render),this.render(),this.once(`submit`,()=>{this.output.write(k.cursor.show),this.output.off(`resize`,this.render),N(this.input,!1),e(this.value)}),this.once(`cancel`,()=>{this.output.write(k.cursor.show),this.output.off(`resize`,this.render),N(this.input,!1),e(xe)})})}_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&&j.aliases.has(t.name)&&this.emit(`cursor`,j.aliases.get(t.name)),j.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`)}ve([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
|
+
`),N(this.input,!1),this.rl?.close(),this.rl=void 0,this.emit(`${this.state}`,this.value),this.unsubscribe()}restoreCursor(){let e=O(this._prevFrame,process.stdout.columns,{hard:!0,trim:!1}).split(`
|
|
32
|
+
`).length-1;this.output.write(k.cursor.move(-999,e*-1))}render(){let e=O(this._render(this)??``,process.stdout.columns,{hard:!0,trim:!1});if(e!==this._prevFrame){if(this.state===`initial`)this.output.write(k.cursor.hide);else{let t=ye(this._prevFrame,e),n=Ce(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(k.cursor.move(0,a-i)),this.output.write(k.erase.lines(1));let t=e.split(`
|
|
33
|
+
`);this.output.write(t[a]),this._prevFrame=e,this.output.write(k.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(k.cursor.move(0,e))}this.output.write(k.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>
|
|
37
|
-
`:``}${
|
|
38
|
-
`,
|
|
39
|
-
${(0,
|
|
40
|
-
${(0,
|
|
41
|
-
`:` ${(0,
|
|
42
|
-
${
|
|
43
|
-
`}}}}).prompt()},
|
|
44
|
-
`);if(
|
|
35
|
+
`)),this._prevFrame=e;return}}this.output.write(k.erase.down())}this.output.write(e),this.state===`initial`&&(this.state=`active`),this._prevFrame=e}}};var we=class extends I{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(k.cursor.move(0,-1)),this.value=e,this.state=`submit`,this.close()}),this.on(`cursor`,()=>{this.value=!this.value})}},Te=class extends I{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?A(n,1,this.options):n,this.changeValue(),this.on(`cursor`,e=>{switch(e){case`left`:case`up`:this.cursor=A(this.cursor,-1,this.options);break;case`down`:case`right`:this.cursor=A(this.cursor,1,this.options);break}this.changeValue()})}},Ee=class extends I{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,i.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 De(){return a.default.platform===`win32`?!!a.default.env.CI||!!a.default.env.WT_SESSION||!!a.default.env.TERMINUS_SUBLIME||a.default.env.ConEmuTask===`{cmd::Cmder}`||a.default.env.TERM_PROGRAM===`Terminus-Sublime`||a.default.env.TERM_PROGRAM===`vscode`||a.default.env.TERM===`xterm-256color`||a.default.env.TERM===`alacritty`||a.default.env.TERMINAL_EMULATOR===`JetBrains-JediTerm`:a.default.env.TERM!==`linux`}const L=De(),Oe=()=>process.env.CI===`true`,R=(e,t)=>L?e:t,ke=R(`◆`,`*`),Ae=R(`■`,`x`),je=R(`▲`,`x`),z=R(`◇`,`o`),B=R(`│`,`|`),V=R(`└`,`—`),Me=R(`●`,`>`),H=R(`○`,` `),Ne=R(`─`,`-`),Pe=R(`╮`,`+`),Fe=R(`├`,`+`),Ie=R(`╯`,`+`),Le=R(`╰`,`+`),Re=R(`●`,`•`),ze=R(`◆`,`*`),Be=R(`▲`,`!`),Ve=R(`■`,`x`),U=e=>{switch(e){case`initial`:case`active`:return(0,i.styleText)(`cyan`,ke);case`cancel`:return(0,i.styleText)(`red`,Ae);case`error`:return(0,i.styleText)(`yellow`,je);case`submit`:return(0,i.styleText)(`green`,z)}},He=e=>{switch(e){case`initial`:case`active`:return(0,i.styleText)(`cyan`,B);case`cancel`:return(0,i.styleText)(`red`,B);case`error`:return(0,i.styleText)(`yellow`,B);case`submit`:return(0,i.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:a=1/0,columnPadding:o=0,rowPadding:s=4})=>{let c=P(r)-o,l=Ce(r),u=(0,i.styleText)(`dim`,`...`),d=Math.max(l-s,0),f=Math.max(Math.min(a,d),5),p=0;e>=f-3&&(p=Math.max(Math.min(e-f+3,t.length-f),0));let m=f<t.length&&p>0,h=f<t.length&&p+f<t.length,g=Math.min(p+f,t.length),_=[],v=0;m&&v++,h&&v++;let y=p+ +!!m,b=g-+!!h;for(let r=y;r<b;r++){let i=O(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},W=e=>{let t=e.active??`Yes`,n=e.inactive??`No`;return new we({active:t,inactive:n,signal:e.signal,input:e.input,output:e.output,initialValue:e.initialValue??!0,render(){let r=e.withGuide??j.withGuide,a=`${U(this.state)} `,o=r?`${(0,i.styleText)(`gray`,B)} `:``,s=F(e.output,e.message,o,a),c=`${r?`${(0,i.styleText)(`gray`,B)}
|
|
37
|
+
`:``}${s}
|
|
38
|
+
`,l=this.value?t:n;switch(this.state){case`submit`:return`${c}${r?`${(0,i.styleText)(`gray`,B)} `:``}${(0,i.styleText)(`dim`,l)}`;case`cancel`:return`${c}${r?`${(0,i.styleText)(`gray`,B)} `:``}${(0,i.styleText)([`strikethrough`,`dim`],l)}${r?`
|
|
39
|
+
${(0,i.styleText)(`gray`,B)}`:``}`;default:{let a=r?`${(0,i.styleText)(`cyan`,B)} `:``,o=r?(0,i.styleText)(`cyan`,V):``;return`${c}${a}${this.value?`${(0,i.styleText)(`green`,Me)} ${t}`:`${(0,i.styleText)(`dim`,H)} ${(0,i.styleText)(`dim`,t)}`}${e.vertical?r?`
|
|
40
|
+
${(0,i.styleText)(`cyan`,B)} `:`
|
|
41
|
+
`:` ${(0,i.styleText)(`dim`,`/`)} `}${this.value?`${(0,i.styleText)(`dim`,H)} ${(0,i.styleText)(`dim`,n)}`:`${(0,i.styleText)(`green`,Me)} ${n}`}
|
|
42
|
+
${o}
|
|
43
|
+
`}}}}).prompt()},G={message:(e=[],{symbol:t=(0,i.styleText)(`gray`,B),secondarySymbol:n=(0,i.styleText)(`gray`,B),output:r=process.stdout,spacing:a=1,withGuide:o}={})=>{let s=[],c=o??j.withGuide,l=c?n:``,u=c?`${t} `:``,d=c?`${n} `:``;for(let e=0;e<a;e++)s.push(l);let f=Array.isArray(e)?e:e.split(`
|
|
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)=>{
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
`)
|
|
52
|
-
`),
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
${(0,
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
`)
|
|
59
|
-
`);let
|
|
60
|
-
`)
|
|
61
|
-
`)
|
|
46
|
+
`)},info:(e,t)=>{G.message(e,{...t,symbol:(0,i.styleText)(`blue`,Re)})},success:(e,t)=>{G.message(e,{...t,symbol:(0,i.styleText)(`green`,ze)})},step:(e,t)=>{G.message(e,{...t,symbol:(0,i.styleText)(`green`,z)})},warn:(e,t)=>{G.message(e,{...t,symbol:(0,i.styleText)(`yellow`,Be)})},warning:(e,t)=>{G.warn(e,t)},error:(e,t)=>{G.message(e,{...t,symbol:(0,i.styleText)(`red`,Ve)})}},Ge=(e=``,t)=>{let n=t?.output??process.stdout,r=t?.withGuide??j.withGuide?`${(0,i.styleText)(`gray`,V)} `:``;n.write(`${r}${(0,i.styleText)(`red`,e)}
|
|
47
|
+
|
|
48
|
+
`)},Ke=(e=``,t)=>{let n=t?.output??process.stdout,r=t?.withGuide??j.withGuide?`${(0,i.styleText)(`gray`,B)}
|
|
49
|
+
${(0,i.styleText)(`gray`,V)} `:``;n.write(`${r}${e}
|
|
50
|
+
|
|
51
|
+
`)},qe=e=>(0,i.styleText)(`dim`,e),Je=(e,t,n)=>{let r={hard:!0,trim:!1},i=O(e,t,r).split(`
|
|
52
|
+
`),a=i.reduce((e,t)=>Math.max(E(t),e),0);return O(e,t-(i.map(n).reduce((e,t)=>Math.max(E(t),e),0)-a),r)},Ye=(e=``,t=``,n)=>{let r=n?.output??a.default.stdout,o=n?.withGuide??j.withGuide,s=n?.format??qe,c=[``,...Je(e,P(r)-6,s).split(`
|
|
53
|
+
`).map(s),``],l=E(t),u=Math.max(c.reduce((e,t)=>{let n=E(t);return n>e?n:e},0),l)+2,d=c.map(e=>`${(0,i.styleText)(`gray`,B)} ${e}${` `.repeat(u-E(e))}${(0,i.styleText)(`gray`,B)}`).join(`
|
|
54
|
+
`),f=o?`${(0,i.styleText)(`gray`,B)}
|
|
55
|
+
`:``,p=o?Fe:Le;r.write(`${f}${(0,i.styleText)(`green`,z)} ${(0,i.styleText)(`reset`,t)} ${(0,i.styleText)(`gray`,Ne.repeat(Math.max(u-l-1,1))+Pe)}
|
|
56
|
+
${d}
|
|
57
|
+
${(0,i.styleText)(`gray`,p+Ne.repeat(u+2)+Ie)}
|
|
58
|
+
`)},Xe=e=>(0,i.styleText)(`magenta`,e),Ze=({indicator:e=`dots`,onCancel:t,output:n=process.stdout,cancelMessage:r,errorMessage:a,frames:o=L?[`◒`,`◐`,`◓`,`◑`]:[`•`,`o`,`O`,`0`],delay:s=L?80:120,signal:c,...l}={})=>{let u=Oe(),d,f,p=!1,m=!1,h=``,g,_=performance.now(),v=P(n),y=l?.styleFrame??Xe,b=e=>{let n=e>1?a??j.messages.error:r??j.messages.cancel;m=e===1,p&&(T(n,e),m&&typeof t==`function`&&t())},x=()=>b(2),S=()=>b(1),ee=()=>{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)},te=()=>{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)},ne=()=>{if(g===void 0)return;u&&n.write(`
|
|
59
|
+
`);let e=O(g,v,{hard:!0,trim:!1}).split(`
|
|
60
|
+
`);e.length>1&&n.write(k.cursor.up(e.length-1)),n.write(k.cursor.to(0)),n.write(k.erase.down())},re=e=>e.replace(/\.+$/,``),C=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]`},w=l.withGuide??j.withGuide,ie=(t=``)=>{p=!0,d=Se({output:n}),h=re(t),_=performance.now(),w&&n.write(`${(0,i.styleText)(`gray`,B)}
|
|
61
|
+
`);let r=0,a=0;ee(),f=setInterval(()=>{if(u&&h===g)return;ne(),g=h;let t=y(o[r]),i;if(u)i=`${t} ${h}...`;else if(e===`timer`)i=`${t} ${h} ${C(_)}`;else{let e=`.`.repeat(Math.floor(a)).slice(0,3);i=`${t} ${h}${e}`}let s=O(i,v,{hard:!0,trim:!1});n.write(s),r=r+1<o.length?r+1:0,a=a<4?a+.125:0},s)},T=(t=``,r=0,a=!1)=>{if(!p)return;p=!1,clearInterval(f),ne();let o=r===0?(0,i.styleText)(`green`,z):r===1?(0,i.styleText)(`red`,Ae):(0,i.styleText)(`red`,je);h=t??h,a||(e===`timer`?n.write(`${o} ${h} ${C(_)}
|
|
62
|
+
`):n.write(`${o} ${h}
|
|
63
|
+
`)),te(),d()};return{start:ie,stop:(e=``)=>T(e,0),message:(e=``)=>{h=re(e??h)},cancel:(e=``)=>T(e,1),error:(e=``)=>T(e,2),clear:()=>T(``,0,!0),get isCancelled(){return m}}},K=(e,t)=>e.includes(`
|
|
62
64
|
`)?e.split(`
|
|
63
65
|
`).map(e=>t(e)).join(`
|
|
64
|
-
`):t(e),
|
|
65
|
-
`:``}${
|
|
66
|
-
`;switch(this.state){case`submit`:{let r=n?`${(0,
|
|
67
|
-
${(0,
|
|
68
|
-
`).length,
|
|
66
|
+
`):t(e),q=e=>{let t=(e,t)=>{let n=e.label??String(e.value);switch(t){case`disabled`:return`${(0,i.styleText)(`gray`,H)} ${K(n,e=>(0,i.styleText)(`gray`,e))}${e.hint?` ${(0,i.styleText)(`dim`,`(${e.hint??`disabled`})`)}`:``}`;case`selected`:return`${K(n,e=>(0,i.styleText)(`dim`,e))}`;case`active`:return`${(0,i.styleText)(`green`,Me)} ${n}${e.hint?` ${(0,i.styleText)(`dim`,`(${e.hint})`)}`:``}`;case`cancelled`:return`${K(n,e=>(0,i.styleText)([`strikethrough`,`dim`],e))}`;default:return`${(0,i.styleText)(`dim`,H)} ${K(n,e=>(0,i.styleText)(`dim`,e))}`}};return new Te({options:e.options,signal:e.signal,input:e.input,output:e.output,initialValue:e.initialValue,render(){let n=e.withGuide??j.withGuide,r=`${U(this.state)} `,a=`${He(this.state)} `,o=F(e.output,e.message,a,r),s=`${n?`${(0,i.styleText)(`gray`,B)}
|
|
67
|
+
`:``}${o}
|
|
68
|
+
`;switch(this.state){case`submit`:{let r=n?`${(0,i.styleText)(`gray`,B)} `:``;return`${s}${F(e.output,t(this.options[this.cursor],`selected`),r)}`}case`cancel`:{let r=n?`${(0,i.styleText)(`gray`,B)} `:``;return`${s}${F(e.output,t(this.options[this.cursor],`cancelled`),r)}${n?`
|
|
69
|
+
${(0,i.styleText)(`gray`,B)}`:``}`}default:{let r=n?`${(0,i.styleText)(`cyan`,B)} `:``,a=n?(0,i.styleText)(`cyan`,V):``,o=s.split(`
|
|
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(`
|
|
69
71
|
${r}`)}
|
|
70
|
-
${
|
|
71
|
-
`}}}}).prompt()},
|
|
72
|
+
${a}
|
|
73
|
+
`}}}}).prompt()},Qe=`${(0,i.styleText)(`gray`,B)} `,J={message:async(e,{symbol:t=(0,i.styleText)(`gray`,B)}={})=>{process.stdout.write(`${(0,i.styleText)(`gray`,B)}
|
|
72
74
|
${t} `);let n=3;for await(let t of e){t=t.replace(/\n/g,`
|
|
73
|
-
${
|
|
74
|
-
`)&&(n=3+(0,
|
|
75
|
-
`))).length);let e=(0,
|
|
76
|
-
${
|
|
77
|
-
`)},info:e=>
|
|
78
|
-
`:``}${
|
|
79
|
-
`,r=e.placeholder?(0,
|
|
80
|
-
${r}${
|
|
81
|
-
${
|
|
82
|
-
`}case`submit`:{let e=
|
|
83
|
-
${r}`:``}`}default:return`${n}${t?`${(0,
|
|
84
|
-
${t?(0,
|
|
85
|
-
`}}}).prompt();var it=class{info(e){process.stdout.write(`${w.default.blue(`ℹ ${e}`)}\n`)}warn(e){process.stderr.write(`${w.default.yellow(`⚠ ${e}`)}\n`)}error(e){process.stderr.write(`${w.default.red(`✘ ${e}`)}\n`)}success(e){process.stdout.write(`${w.default.green(`✔ ${e}`)}\n`)}step(e){process.stdout.write(`○ ${e}\n`)}note(e,t){Qe(e,t)}log(e){process.stdout.write(`${e}\n`)}spinner(){return et()}json(e){process.stdout.write(`${JSON.stringify(e,null,2)}\n`)}cancel(e){process.stderr.write(`${w.default.red(`✘ ${e}`)}\n`,()=>process.exit(1))}fatal(e,t){let n=`${w.default.red(`✘ ${e}`)}\n`;if(t){let e=`${w.default.red(t instanceof Error?t.stack??String(t):String(t))}\n`;process.stderr.write(n,()=>{process.stderr.write(e,()=>process.exit(1))})}else process.stderr.write(n,()=>process.exit(1))}finish(e,t){Ye(e)}async flush(){return new Promise(e=>{process.stderr.write(``,()=>e())})}},at=class{constructor(e){this.options=e,this.originalStdoutWrite=process.stdout.write,e.isJson?this.reporter=new T:e.isQuiet?this.reporter=new ne:this.reporter=new it}info(e){this.reporter.info(e)}warn(e){this.reporter.warn(e)}error(e){this.reporter.error(e)}success(e){this.reporter.success(e)}step(e){this.reporter.step(e)}note(e,t){this.reporter.note(e,t)}log(e){this.reporter.log(e)}spinner(){return this.reporter.spinner()}json(e){this.reporter.json(e)}get stdio(){return this.options.isJson?[process.stdin,process.stderr,process.stderr]:`inherit`}interactiveStdout(e){!this.options.isJson||this.options.isYes||(e?process.stdout.write=process.stderr.write.bind(process.stderr):process.stdout.write=this.originalStdoutWrite)}cancel(e){this.reporter.cancel(e)}fatal(e,t){this.reporter.fatal(e,t)}finish(e,t){this.reporter.finish(e,t)}async flush(){await this.reporter.flush()}};const Z=e=>w.default.cyan(e),ot=w.default.blue(`⛯`);function st(e){try{let t=(0,y.parseModule)(e.code),n=e.code,r=t.exports.default;if(r&&typeof r==`object`&&`$type`in r&&r.$type===`function-call`){let e=r;if((e.$callee||JSON.stringify(r))===`defineConfig`&&e.$args){let t=e.$args[0];if(t&&typeof t==`object`&&`$type`in t&&(t.$type===`arrow-function-expression`||t.$type===`function-expression`))return{success:!1,updated:!1,error:`The 'defineConfig' callback form is currently not supported for automatic mutation. Please add the plugin manually.`};r=t}}if(!r||typeof r!=`object`||typeof r==`object`&&`$type`in r)return{success:!1,updated:!1,error:`Could not find default export object in Vite config`};if(r.plugins||=[],Array.isArray(r.plugins))if(!/\barkenv(?:Vite)?Plugin\b/.test(n))t.imports.$add({from:`@arkenv/vite-plugin`,local:`arkenvVitePlugin`,imported:`default`}),e.envImportPath&&t.imports.$add({from:e.envImportPath,imported:`Env`}),r.plugins.push(`__ARK_PLUGIN_PLACEHOLDER__`);else return{success:!0,updated:!1};else return{success:!1,updated:!1,error:`The 'plugins' property in your Vite config is not an array.`};let i=(0,y.generateCode)(t,{format:(0,y.detectCodeFormat)(n)}).code,a=e.envImportPath?`arkenvVitePlugin(Env)`:`arkenvVitePlugin()`;return i=i.replace(/['"]__ARK_PLUGIN_PLACEHOLDER__['"]/g,a),{success:!0,updated:!0,code:i}}catch(e){return{success:!1,updated:!1,error:`Failed to parse Vite config: ${e instanceof Error?e.message:String(e)}`}}}function ct(e){let t=[],n=e.split(/\r?\n/);for(let e of n){let n=e.trim();if(!n||n.startsWith(`#`))continue;let r=n.match(/^([A-Z_][A-Z0-9_]*)\s*=/i);r?.[1]&&t.push(r[1])}return Array.from(new Set(t))}async function lt(){let e=d.default.join(process.cwd(),`.env.example`);try{let t=ct(await u.default.readFile(e,`utf-8`));return t.length>0?t:null}catch{return null}}const ut=(e,t)=>{let n=e?.length?e.map(e=>`\t\t${e}: "string = ''",`).join(`
|
|
75
|
+
${Qe}`),t.includes(`
|
|
76
|
+
`)&&(n=3+(0,i.stripVTControlCharacters)(t.slice(t.lastIndexOf(`
|
|
77
|
+
`))).length);let e=(0,i.stripVTControlCharacters)(t).length;n+e<process.stdout.columns?(n+=e,process.stdout.write(t)):(process.stdout.write(`
|
|
78
|
+
${Qe}${t.trimStart()}`),n=3+(0,i.stripVTControlCharacters)(t.trimStart()).length)}process.stdout.write(`
|
|
79
|
+
`)},info:e=>J.message(e,{symbol:(0,i.styleText)(`blue`,Re)}),success:e=>J.message(e,{symbol:(0,i.styleText)(`green`,ze)}),step:e=>J.message(e,{symbol:(0,i.styleText)(`green`,z)}),warn:e=>J.message(e,{symbol:(0,i.styleText)(`yellow`,Be)}),warning:e=>J.warn(e),error:e=>J.message(e,{symbol:(0,i.styleText)(`red`,Ve)})},$e=e=>new Ee({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??j.withGuide,n=`${`${t?`${(0,i.styleText)(`gray`,B)}
|
|
80
|
+
`:``}${U(this.state)} `}${e.message}
|
|
81
|
+
`,r=e.placeholder?(0,i.styleText)(`inverse`,e.placeholder[0])+(0,i.styleText)(`dim`,e.placeholder.slice(1)):(0,i.styleText)([`inverse`,`hidden`],`_`),a=this.userInput?this.userInputWithCursor:r,o=this.value??``;switch(this.state){case`error`:{let e=this.error?` ${(0,i.styleText)(`yellow`,this.error)}`:``,r=t?`${(0,i.styleText)(`yellow`,B)} `:``,o=t?(0,i.styleText)(`yellow`,V):``;return`${n.trim()}
|
|
82
|
+
${r}${a}
|
|
83
|
+
${o}${e}
|
|
84
|
+
`}case`submit`:{let e=o?` ${(0,i.styleText)(`dim`,o)}`:``;return`${n}${t?(0,i.styleText)(`gray`,B):``}${e}`}case`cancel`:{let e=o?` ${(0,i.styleText)([`strikethrough`,`dim`],o)}`:``,r=t?(0,i.styleText)(`gray`,B):``;return`${n}${r}${e}${o.trim()?`
|
|
85
|
+
${r}`:``}`}default:return`${n}${t?`${(0,i.styleText)(`cyan`,B)} `:``}${a}
|
|
86
|
+
${t?(0,i.styleText)(`cyan`,V):``}
|
|
87
|
+
`}}}).prompt();var et=class{info(e){process.stdout.write(`${b.default.blue(`ℹ ${e}`)}\n`)}warn(e){process.stderr.write(`${b.default.yellow(`⚠ ${e}`)}\n`)}error(e){process.stderr.write(`${b.default.red(`✘ ${e}`)}\n`)}success(e){process.stdout.write(`${b.default.green(`✔ ${e}`)}\n`)}step(e){process.stdout.write(`○ ${e}\n`)}note(e,t){Ye(e,t)}log(e){process.stdout.write(`${e}\n`)}spinner(){return Ze()}json(e){process.stdout.write(`${JSON.stringify(e,null,2)}\n`)}cancel(e){process.stderr.write(`${b.default.red(`✘ ${e}`)}\n`)}fatal(e,t){if(process.stderr.write(`${b.default.red(`✘ ${e}`)}\n`),t){let e=`${b.default.red(t instanceof Error?t.stack??String(t):String(t))}\n`;process.stderr.write(e)}throw t instanceof Error?t:Error(e)}finish(e,t){Ke(e)}async flush(){return new Promise(e=>{process.stderr.write(``,()=>e())})}},tt=class{constructor(e){this.options=e,this.originalStdoutWrite=process.stdout.write,e.isJson?this.reporter=new x:e.isQuiet?this.reporter=new S:this.reporter=new et}info(e){this.reporter.info(e)}warn(e){this.reporter.warn(e)}error(e){this.reporter.error(e)}success(e){this.reporter.success(e)}step(e){this.reporter.step(e)}note(e,t){this.reporter.note(e,t)}log(e){this.reporter.log(e)}spinner(){return this.reporter.spinner()}json(e){this.reporter.json(e)}get stdio(){return this.options.isJson?[process.stdin,process.stderr,process.stderr]:`inherit`}interactiveStdout(e){!this.options.isJson||this.options.isYes||(e?process.stdout.write=process.stderr.write.bind(process.stderr):process.stdout.write=this.originalStdoutWrite)}cancel(e){this.reporter.cancel(e)}fatal(e,t){this.reporter.fatal(e,t)}finish(e,t){this.reporter.finish(e,t)}async flush(){await this.reporter.flush()}};async function nt(e=process.cwd(),r){if(r?.compilerOptions?.types){let e=r.compilerOptions.types;if(e.includes(`vite`)||e.includes(`vite/client`))return`vite`}try{let r=n.default.join(e,`package.json`),i=await t.default.readFile(r,`utf-8`),a=JSON.parse(i);if({...a.dependencies,...a.devDependencies}.vite)return`vite`}catch{}try{return await t.default.access(n.default.join(e,`vite.config.ts`)),`vite`}catch{}try{return await t.default.access(n.default.join(e,`vite.config.js`)),`vite`}catch{}return(await rt(e,r)).length>0?`bun-fullstack`:`vanilla`}async function rt(e=process.cwd(),r){let i=[];try{let r=n.default.join(e,`bunfig.toml`),a=await t.default.readFile(r,`utf-8`);(a.includes(`[serve]`)||a.includes(`[serve.static]`))&&i.push(`serve`),a.includes(`[build]`)&&i.push(`build`)}catch{}if(i.includes(`serve`)&&i.includes(`build`))return i;let{walk:a}=await Promise.resolve().then(()=>ot),o=await a(e),s=i.includes(`serve`),c=i.includes(`build`);for(let e of o)try{let n=await t.default.readFile(e,`utf-8`);if(!s&&(n.includes(`Bun.serve`)||n.includes(`serve(`))&&(/from\s+['"]bun['"]/.test(n)||n.includes(`Bun.serve`))&&(s=!0,i.push(`serve`)),!c&&(n.includes(`Bun.build`)||n.includes(`build(`))&&(/from\s+['"]bun['"]/.test(n)||n.includes(`Bun.build`))&&(c=!0,i.push(`build`)),s&&c)break}catch{}return i}async function it(e=process.cwd(),r){let i=process.env.npm_config_user_agent?.toString()||``;if(i.includes(`pnpm`))return`pnpm`;if(i.includes(`yarn`))return`yarn`;if(i.includes(`bun`))return`bun`;if(i.includes(`npm`))return`npm`;let a=r?.path?n.default.dirname(r.path):e;for(;a!==n.default.parse(a).root;){try{let e=n.default.join(a,`package.json`),r=await t.default.readFile(e,`utf-8`),i=JSON.parse(r);if(i.packageManager){if(i.packageManager.startsWith(`pnpm`))return`pnpm`;if(i.packageManager.startsWith(`yarn`))return`yarn`;if(i.packageManager.startsWith(`bun`))return`bun`}}catch{}let e=[];try{e=await t.default.readdir(a)}catch{}if(e.includes(`pnpm-lock.yaml`))return`pnpm`;if(e.includes(`yarn.lock`))return`yarn`;if(e.includes(`bun.lockb`))return`bun`;if(e.includes(`package-lock.json`))return`npm`;a=n.default.dirname(a)}return`npm`}async function at(e=process.cwd(),r){let i=r;if(!i){let{findTsConfig:t,loadTsConfig:n}=await Promise.resolve().then(()=>ft),r=await t(e);r&&(i=await n(r))}if(i?.compilerOptions?.rootDir){let t=i.compilerOptions.rootDir,r=n.default.relative(e,t);return r&&r!==`.`&&!r.startsWith(`..`)&&!n.default.isAbsolute(r)?`./${r}/env.ts`:`./env.ts`}try{return await t.default.access(n.default.join(e,`src`)),`./src/env.ts`}catch{return`./env.ts`}}var ot=e.n({getEnvExampleKeys:()=>dt,parseEnvExample:()=>ct,resolveImportPaths:()=>lt,scanProjectEnvKeys:()=>ut,walk:()=>st});async function st(e,r=[]){try{let i=await t.default.readdir(e,{withFileTypes:!0});for(let t of i)if(t.isDirectory()){let i=t.name;if(i===`node_modules`||i===`dist`||i===`build`||i===`.git`||i===`.turbo`||i===`scratch`)continue;await st(n.default.join(e,i),r)}else t.isFile()&&/\.(ts|tsx|js|jsx)$/.test(t.name)&&!t.name.endsWith(`.d.ts`)&&r.push(n.default.join(e,t.name))}catch{}return r}function ct(e){let t=[],n=e.split(/\r?\n/);for(let e of n){let n=e.trim();if(!n||n.startsWith(`#`))continue;let r=n.match(/^([A-Z_][A-Z0-9_]*)\s*=/i);r?.[1]&&t.push(r[1])}return Array.from(new Set(t))}function lt(e,t,r){if(e.startsWith(`.`))return[n.default.resolve(n.default.dirname(r),e)];if(n.default.isAbsolute(e))return[e];let i=t.compilerOptions||{},a=i.baseUrl||n.default.dirname(t.path),o=i.paths||{},s=[];for(let[e,t]of Object.entries(o)){let n=e.endsWith(`*`),r=e.replace(/\*$/,``);s.push({cleanPattern:r,targets:Array.isArray(t)?t:[t],hadStar:n})}s.sort((e,t)=>t.cleanPattern.length-e.cleanPattern.length);for(let{cleanPattern:t,targets:r,hadStar:i}of s)if(i&&e.startsWith(t)||!i&&e===t){let i=e.slice(t.length);return r.map(e=>{let t=`${e.replace(/\*$/,``)}${i}`;return n.default.resolve(a,t)})}return i.baseUrl?[n.default.resolve(a,e)]:[]}async function ut(e,r,i){let a=[],o=await st(e),s=i?i.replace(/\.(ts|js|tsx|jsx)$/,``):null;for(let e of o)try{let i=await t.default.readFile(e,`utf-8`),o=i.matchAll(/process\.env\.([A-Z_][A-Z0-9_]*)/g);for(let e of o)e[1]&&a.push(e[1]);let c=i.matchAll(/import\.meta\.env\.([A-Z_][A-Z0-9_]*)/g);for(let e of c)e[1]&&a.push(e[1]);if(s){let t=i.matchAll(/import\s+[^;]*from\s+['"]([^'"]+)['"]/g);for(let o of t){let t=o[1],c=[];if(r?c=lt(t,r,e):t.startsWith(`.`)&&(c=[n.default.resolve(n.default.dirname(e),t)]),c.some(e=>e.replace(/\.(ts|js|tsx|jsx)$/,``)===s)){let e=i.matchAll(/\benv\.([A-Z_][A-Z0-9_]*)/g);for(let t of e)t[1]&&a.push(t[1])}}}}catch{}return Array.from(new Set(a))}async function dt(e=process.cwd(),r,i){let a=n.default.join(e,`.env.example`);try{let e=ct(await t.default.readFile(a,`utf-8`));if(e.length>0)return{keys:e,source:`.env.example`}}catch{}let o=await ut(e,r,i);return o.length>0?{keys:o,source:`project`}:null}var ft=e.n({checkTsConfig:()=>mt,findTsConfig:()=>Y,loadTsConfig:()=>X});const pt=(0,l.createRequire)(require(`url`).pathToFileURL(__filename).href).resolve;async function Y(e=process.cwd()){let r=[`tsconfig.app.json`,`tsconfig.json`,`tsconfig.base.json`,`tsconfig.node.json`],i=e;for(;i!==n.default.parse(i).root;){for(let e of r){let r=n.default.join(i,e);try{return await t.default.access(r),r}catch{}}i=n.default.dirname(i)}return null}async function X(e,r=new Set){let i=n.default.resolve(e);if(r.has(i))throw Error(`Circular extends dependency detected in tsconfig.json: ${i}`);r.add(i);let a=``;try{a=await t.default.readFile(e,`utf-8`)}catch{return{path:e,compilerOptions:{}}}let o=(0,u.parse)(a)||{},s=o.compilerOptions||{},c={};if(o.extends){let t=Array.isArray(o.extends)?o.extends:[o.extends];for(let i of t){let t;if(i.startsWith(`.`)||n.default.isAbsolute(i))t=n.default.resolve(n.default.dirname(e),i);else try{t=pt(i,{paths:[n.default.dirname(e)]})}catch{t=n.default.resolve(n.default.dirname(e),`node_modules`,i)}let a={...(await X(t,r)).compilerOptions};a.baseUrl&&=n.default.resolve(n.default.dirname(t),a.baseUrl),a.rootDir&&=n.default.resolve(n.default.dirname(t),a.rootDir),c={...c,...a}}}let l={...s};return l.baseUrl&&=n.default.resolve(n.default.dirname(e),l.baseUrl),l.rootDir&&=n.default.resolve(n.default.dirname(e),l.rootDir),c={...c,...l},{...o,path:e,compilerOptions:c}}async function mt(e=process.cwd()){let t=await Y(e);if(!t)return{status:`not_found`};let r=n.default.basename(t);try{let e=await X(t);return e?.compilerOptions?.strict===!0?{status:`strict`,file:r,parsed:e}:{status:`not_strict`,file:r,parsed:e}}catch{return{status:`not_found`}}}var ht=class{async findTsConfig(e=process.cwd()){return Y(e)}async loadTsConfig(e,t=new Set){return X(e,t)}async getEnvExampleKeys(e=process.cwd(),t,n){return dt(e,t,n)}async suggestDefaultEnvPath(e=process.cwd(),t){return at(e,t)}async checkTsConfig(e=process.cwd()){return mt(e)}async detectFramework(e=process.cwd(),t){return nt(e,t)}async detectBunFeatures(e=process.cwd(),t){return rt(e,t)}async detectPackageManager(e=process.cwd(),t){return it(e,t)}};const Z=e=>b.default.cyan(e),gt=b.default.blue(`⛯`);function _t(e){try{let t=(0,f.parseModule)(e.code),n=e.code,r=t.exports.default;if(r&&typeof r==`object`&&`$type`in r&&r.$type===`function-call`){let e=r;if((e.$callee||JSON.stringify(r))===`defineConfig`&&e.$args){let t=e.$args[0];if(t&&typeof t==`object`&&`$type`in t&&(t.$type===`arrow-function-expression`||t.$type===`function-expression`))return{success:!1,updated:!1,error:`The 'defineConfig' callback form is currently not supported for automatic mutation. Please add the plugin manually.`};r=t}}if(!r||typeof r!=`object`||typeof r==`object`&&`$type`in r)return{success:!1,updated:!1,error:`Could not find default export object in Vite config`};if(r.plugins||=[],Array.isArray(r.plugins))if(!/\barkenv(?:Vite)?Plugin\b/.test(n))t.imports.$add({from:`@arkenv/vite-plugin`,local:`arkenvVitePlugin`,imported:`default`}),e.envImportPath&&t.imports.$add({from:e.envImportPath,imported:`Env`}),r.plugins.push(`__ARK_PLUGIN_PLACEHOLDER__`);else return{success:!0,updated:!1};else return{success:!1,updated:!1,error:`The 'plugins' property in your Vite config is not an array.`};let i=(0,f.generateCode)(t,{format:(0,f.detectCodeFormat)(n)}).code,a=e.envImportPath?`arkenvVitePlugin(Env)`:`arkenvVitePlugin()`;return i=i.replace(/['"]__ARK_PLUGIN_PLACEHOLDER__['"]/g,a),{success:!0,updated:!0,code:i}}catch(e){return{success:!1,updated:!1,error:`Failed to parse Vite config: ${e instanceof Error?e.message:String(e)}`}}}async function vt(){for(let e of[`vite.config.ts`,`vite.config.js`,`vite.config.mts`,`vite.config.mjs`]){let r=n.default.resolve(process.cwd(),e);try{return await t.default.access(r),r}catch{}}return null}async function yt(){for(let e of[`bunfig.toml`,`bun.setup.ts`,`bun.setup.js`]){let r=n.default.resolve(process.cwd(),e);try{return await t.default.access(r),r}catch{}}return null}async function bt(e,t,n){try{let r=_t({code:await e.readFile(t),envImportPath:n});return r.success&&r.updated&&r.code&&await e.writeFile(t,r.code),r.success?r.updated===void 0?{success:!0}:{success:!0,updated:r.updated}:{success:!1,error:r.error}}catch(e){return{success:!1,error:e instanceof Error?e.message:String(e)}}}async function xt(e,t){if(!t||t.length===0)return{success:!0,instructions:r.default`
|
|
88
|
+
${b.default.green(`✔`)} Use ${b.default.bold(`Vanilla`)} Bun runtime integration.
|
|
89
|
+
Access validated variables via your ${Z(`env`)} object for typesafety.
|
|
90
|
+
Primarily used for ${b.default.cyan(`server-side`)} or runtime-only validation.
|
|
91
|
+
No plugins are required.
|
|
92
|
+
`};let n=t.includes(`serve`),i=t.includes(`build`),a=``;return n&&(a+=r.default`
|
|
93
|
+
${b.default.bold(`Bun Fullstack (Bun.serve) Integration:`)}
|
|
94
|
+
To inline environment variables (e.g. ${Z(`PUBLIC_*`)}) in your ${b.default.cyan(`client-side`)} code, add the plugin to ${Z(`bunfig.toml`)}:
|
|
95
|
+
|
|
96
|
+
[serve.static]
|
|
97
|
+
plugins = ["@arkenv/bun-plugin"]
|
|
98
|
+
|
|
99
|
+
`),i&&(a&&(a+=`
|
|
100
|
+
`),a+=r.default`
|
|
101
|
+
${b.default.bold(`Bun Fullstack programmatic bundling (Bun.build):`)}
|
|
102
|
+
To inline environment variables (e.g. ${Z(`PUBLIC_*`)}) in your custom ${b.default.cyan(`client-side`)} build script, add the plugin to your ${Z(`Bun.build`)} call:
|
|
103
|
+
|
|
104
|
+
${Z(`import arkenv from "@arkenv/bun-plugin";`)}
|
|
105
|
+
|
|
106
|
+
await Bun.build({
|
|
107
|
+
entrypoints: ["./index.ts"],
|
|
108
|
+
outdir: "./dist",
|
|
109
|
+
${b.default.green(`plugins: [arkenv]`)}
|
|
110
|
+
});
|
|
111
|
+
`),{success:!0,instructions:a.trim()}}async function St(e,t){let r=t||await Y();if(!r)return{status:`not_found`};let i=n.default.basename(r);try{let t=await e.readFile(r);if((0,u.parse)(t)?.compilerOptions?.strict===!0)return{status:`already_strict`,file:i};let n=(0,u.applyEdits)(t,(0,u.modify)(t,[`compilerOptions`,`strict`],!0,{formattingOptions:{insertSpaces:!0,tabSize:2}}));return await e.writeFile(r,n),{status:`updated`,file:i}}catch{return{status:`error`,file:i}}}var Ct=class{constructor(e,t){this.isQuiet=e,this.stdio=t}async exists(e){try{return await t.default.access(e),!0}catch{return!1}}async readFile(e){return t.default.readFile(e,`utf-8`)}async writeFile(e,n){await t.default.writeFile(e,n,`utf-8`)}async mkdir(e,n){await t.default.mkdir(e,{recursive:n})}async execute(e,t=[]){return new Promise((n,r)=>{let i=(0,d.spawn)(e,t,{stdio:this.isQuiet?`pipe`:this.stdio,shell:!1}),a=``,o=``,s=1e4;this.isQuiet&&(i.stdout?.on(`data`,e=>{a=(a+e.toString()).slice(-s)}),i.stderr?.on(`data`,e=>{o=(o+e.toString()).slice(-s)})),i.on(`close`,(e,t)=>{if(e===0)n();else{let n=e===null?`Command terminated by signal ${t}`:`Command failed with code ${e}`;this.isQuiet&&(a&&(n+=`\n${b.default.dim(`STDOUT:`)}\n${a}`),o&&(n+=`\n${b.default.red(`STDERR:`)}\n${o}`)),r(Error(n))}}),i.on(`error`,r)})}async updateTsConfigToStrict(e){return St(this,e)}async findViteConfig(){return vt()}async findBunConfig(){return yt()}async bootstrapViteConfig(e,t){return bt(this,e,t)}async bootstrapBunConfig(e,t){return xt(e,t)}async safeAppend(e,t,n){let{safeAppend:r}=await Promise.resolve().then(()=>m);return r(e,t,n)}};const Q={overwriteEnvSchemaFile:(e=`./src/env.ts`)=>async()=>{if((0,c.existsSync)(n.default.resolve(process.cwd(),e))){let t=await W({message:b.default.yellow(`An existing ArkEnv configuration was found at ${Z(e)}. Do you want to overwrite it?`),initialValue:!1,active:`Yes (override my configuration)`,inactive:`No (abort)`});return M(t)||!t?null:t}return!0},framework:e=>async()=>{let t=await q({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`}]});return M(t)?null:t},bunBuild:(e=!1)=>async()=>{let t=await W({message:`Optional: Would you also like to bootstrap a custom Bun.build script for programmatic bundling?`,initialValue:e});return M(t)?null:t},useDefaultPath:(e=`./src/env.ts`)=>async()=>{let t=await W({message:`Use default config path (${Z(e)})?`,initialValue:!0,active:`Yes (Recommended)`,inactive:`No, let me customize it`});return M(t)?null:t},path:(e=`./src/env.ts`)=>async({results:t})=>{if(t.useDefaultPath===null)return null;if(!t.useDefaultPath){let t=await $e({message:`Where should we create the ArkEnv config?`,placeholder:e,initialValue:e});if(M(t))return null;let n=typeof t==`string`?t.trim():``;return n===``?e:n}return e},installTypeDefinitions:async({results:e})=>{if(e.framework===null)return null;if(e.framework===`vite`||e.framework===`bun`){let t=e.framework===`vite`?`vite-env.d.ts`:`bun-env.d.ts`,r=n.default.dirname(n.default.resolve(process.cwd(),e.path||`./src/env.ts`)),i=n.default.join(r,t);if(c.default.existsSync(i))return!0;let a=await W({message:`Establish ${Z(t)} for typesafe environment variables?`,initialValue:!0,active:`Yes (Recommended)`,inactive:`No`});return M(a)?null:a}return!0},envDtsHandling:async({results:e})=>{if(e.installTypeDefinitions===null)return null;if(!e.installTypeDefinitions||e.framework!==`vite`&&e.framework!==`bun`)return`skip`;let t=e.framework===`vite`?`vite-env.d.ts`:`bun-env.d.ts`,r=n.default.dirname(n.default.resolve(process.cwd(),e.path||`./src/env.ts`)),i=n.default.join(r,t);if(c.default.existsSync(i)){let e=await q({message:`Found existing ${Z(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 M(e)?null:e}return`overwrite`},validator:async()=>{let e=await q({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 M(e)?null:e},useEnvExample:(e,t=`.env.example`)=>async()=>{if(e&&e.length>0){let n=await W({message:t===`.env.example`?`Detected ${Z(`.env.example`)} with ${e.length} keys. Use them for your schema?`:`Detected ${e.length} environment variables used in your project. Use them for your schema?`,active:`Yes (Recommended)`,initialValue:!0});return M(n)?null:n}return!1}};async function wt(e,t=!1){let n=e?.defaultEnvPath||`./src/env.ts`,r=e?.envKeys||null,i=e?.envKeysSource||`.env.example`;if(t){let t=e?.framework||`vanilla`,i;return(t===`vite`||t===`bun-fullstack`)&&(i=e?.hasTypeFile?`append`:`overwrite`),(0,p.shake)({path:n,validator:`arktype`,framework:t,bunFeatures:t===`bun-fullstack`?e?.bunFeatures??[`serve`]:void 0,language:`ts`,overwriteEnvSchemaFile:!0,installTypeDefinitions:t!==`vanilla`,installSkill:!1,envDtsHandling:i,envKeys:r??void 0})}let a={},o=[{key:`overwriteEnvSchemaFile`,fn:()=>Q.overwriteEnvSchemaFile(n)()},{key:`framework`,fn:()=>Q.framework(e)()},{key:`bunBuild`,fn:({results:t})=>t.framework===`bun-fullstack`?Q.bunBuild(e?.bunFeatures?.includes(`build`)||t.framework===`bun-fullstack`&&e?.framework===`bun-fullstack`&&e?.bunFeatures?.includes(`build`))():Promise.resolve(void 0)},{key:`useDefaultPath`,fn:()=>Q.useDefaultPath(n)()},{key:`path`,fn:e=>Q.path(n)(e)},{key:`installTypeDefinitions`,fn:e=>Q.installTypeDefinitions(e)},{key:`envDtsHandling`,fn:e=>Q.envDtsHandling(e)},{key:`validator`,fn:()=>Q.validator()},{key:`useEnvExample`,fn:()=>Q.useEnvExample(r,i)()}];for(let{key:e,fn:t}of o){let n=await t({results:a});if(n===null||typeof n==`symbol`&&M(n))return Ge(`Operation cancelled`),null;a[e]=n}let s=a.framework===`bun-fullstack`?a.bunBuild?[`serve`,`build`]:[`serve`]:void 0;return(0,p.shake)({...a,bunFeatures:s,language:`ts`,installSkill:!1,envKeys:a.useEnvExample?r??void 0:void 0})}var Tt=class{async confirm(e,t=!0,n,r){let i=await W((0,p.shake)({message:e,initialValue:t,active:n,inactive:r}));return M(i)?null:i}async runWizard(e,t=!1){return wt(e,t)}},Et=class{constructor(e,t={}){this.args=e.slice(2),this.command=this.args[0],this.isYes=this.args.includes(`--yes`)||this.args.includes(`-y`),this.isQuiet=this.args.includes(`--quiet`)||this.args.includes(`-q`),this.isJson=this.args.includes(`--json`)||this.args.includes(`-j`),this.isAgent=this.args.includes(`--agent`)||this.args.includes(`-a`),this.helpRequested=this.args.includes(`--help`)||this.args.includes(`-h`),this.isAgent&&(this.isYes=!0,this.isQuiet=!0,this.isJson=!0),this.logger=t.logger||new tt({isQuiet:this.isQuiet,isJson:this.isJson,isYes:this.isYes})}},Dt=`0.0.10`,Ot=class{constructor(e){this.logger=e}async execute(){this.logger.log(`ArkEnv CLI v${Dt}`),this.logger.log(`\n${b.default.bold(`Usage:`)}`),this.logger.log(` arkenv init Set up ArkEnv in your project`),this.logger.log(`\n${b.default.bold(`Options:`)}`),this.logger.log(` --yes, -y Skip prompts and use defaults (also passed to skill processes)`),this.logger.log(` --agent, -a Agent mode: --yes --quiet --json`),this.logger.log(` --quiet, -q Quiet mode: Suppress output, capture logs on failure`),this.logger.log(` --json, -j Output structured JSON to stdout`),this.logger.log(` --help, -h Show this help message`)}};const kt=(e,t)=>{let n=e?.length?e.map(e=>`\t\t${e}: "string = ''",`).join(`
|
|
86
112
|
`):` NODE_ENV: "'development' | 'production' | 'test' = 'development'",
|
|
87
|
-
PORT: "number.port = 3000",`;return t===`vite`?
|
|
113
|
+
PORT: "number.port = 3000",`;return t===`vite`?r.default`
|
|
88
114
|
import { type } from "arkenv";
|
|
89
115
|
|
|
90
116
|
/**
|
|
91
117
|
* Environment variable schema.
|
|
92
118
|
* In Vite, use \`@arkenv/vite-plugin\` to validate these at build-time
|
|
93
|
-
* and provide typesafety for \`import.meta.env
|
|
119
|
+
* and provide typesafety for \`import.meta.env\` on the client-side.
|
|
94
120
|
*/
|
|
95
121
|
export const Env = type({
|
|
96
122
|
${n}
|
|
97
123
|
});
|
|
98
|
-
`:t===`bun`?
|
|
124
|
+
`:t===`bun-fullstack`?r.default`
|
|
99
125
|
import { type } from "arkenv";
|
|
100
126
|
|
|
101
127
|
/**
|
|
102
128
|
* Environment variable schema.
|
|
103
|
-
* In Bun, use \`@arkenv/bun-plugin\` to validate these at build-time
|
|
104
|
-
* and provide typesafety for \`process.env
|
|
129
|
+
* In Bun Fullstack, use \`@arkenv/bun-plugin\` to validate these at build-time
|
|
130
|
+
* and provide typesafety for \`process.env\` on the client-side.
|
|
105
131
|
*/
|
|
106
132
|
export const Env = type({
|
|
107
133
|
${n}
|
|
108
134
|
});
|
|
109
|
-
`:
|
|
135
|
+
`:r.default`
|
|
110
136
|
import arkenv, { type } from "arkenv";
|
|
111
137
|
|
|
138
|
+
/**
|
|
139
|
+
* Environment variable schema for server-side or runtime-only validation.
|
|
140
|
+
*/
|
|
112
141
|
export const Env = type({
|
|
113
142
|
${n}
|
|
114
143
|
});
|
|
115
144
|
|
|
116
145
|
export const env = arkenv(Env);
|
|
117
|
-
`},
|
|
146
|
+
`},At=e=>r.default`
|
|
118
147
|
/// <reference types="vite/client" />
|
|
119
148
|
|
|
120
149
|
type ImportMetaEnvAugmented =
|
|
121
150
|
import("@arkenv/vite-plugin").ImportMetaEnvAugmented<
|
|
122
|
-
typeof import("./${
|
|
151
|
+
typeof import("./${n.default.basename(e).replace(/\.(ts|js|tsx|jsx)$/,``)}").Env
|
|
123
152
|
>;
|
|
124
153
|
|
|
125
154
|
interface ImportMetaEnv extends ImportMetaEnvAugmented {}
|
|
@@ -127,111 +156,94 @@ ${n}
|
|
|
127
156
|
interface ImportMeta {
|
|
128
157
|
readonly env: ImportMetaEnv;
|
|
129
158
|
}
|
|
130
|
-
`,
|
|
159
|
+
`,jt=e=>r.default`
|
|
131
160
|
/// <reference types="bun-types" />
|
|
132
161
|
|
|
133
162
|
type ProcessEnvAugmented = import("@arkenv/bun-plugin").ProcessEnvAugmented<
|
|
134
|
-
typeof import("./${
|
|
163
|
+
typeof import("./${n.default.basename(e).replace(/\.(ts|js|tsx|jsx)$/,``)}").Env
|
|
135
164
|
>;
|
|
136
165
|
|
|
137
166
|
declare namespace NodeJS {
|
|
138
167
|
interface ProcessEnv extends ProcessEnvAugmented {}
|
|
139
168
|
}
|
|
140
|
-
`,
|
|
169
|
+
`,Mt=(e,t)=>{let n=e?.length?e.map(e=>`\t\t${e}: v.optional(v.string(), ""),`).join(`
|
|
141
170
|
`):` NODE_ENV: v.optional(v.picklist(["development", "production", "test"]), "development"),
|
|
142
|
-
PORT: v.optional(v.pipe(v.string(), v.transform(Number), v.number(), v.integer(), v.minValue(1), v.maxValue(65535)), 3000),`;return t===`vite`?
|
|
171
|
+
PORT: v.optional(v.pipe(v.string(), v.transform(Number), v.number(), v.integer(), v.minValue(1), v.maxValue(65535)), 3000),`;return t===`vite`?r.default`
|
|
143
172
|
import * as v from "valibot";
|
|
144
173
|
|
|
145
174
|
/**
|
|
146
175
|
* Environment variable schema.
|
|
147
176
|
* In Vite, use \`@arkenv/vite-plugin\` to validate these at build-time
|
|
148
|
-
* and provide typesafety for \`import.meta.env
|
|
177
|
+
* and provide typesafety for \`import.meta.env\` on the client-side.
|
|
149
178
|
*/
|
|
150
179
|
export const Env = v.object({
|
|
151
180
|
${n}
|
|
152
181
|
});
|
|
153
|
-
`:t===`bun`?
|
|
182
|
+
`:t===`bun-fullstack`?r.default`
|
|
154
183
|
import * as v from "valibot";
|
|
155
184
|
|
|
156
185
|
/**
|
|
157
186
|
* Environment variable schema.
|
|
158
|
-
* In Bun, use \`@arkenv/bun-plugin\` to validate these at build-time
|
|
159
|
-
* and provide typesafety for \`process.env
|
|
187
|
+
* In Bun Fullstack, use \`@arkenv/bun-plugin\` to validate these at build-time
|
|
188
|
+
* and provide typesafety for \`process.env\` on the client-side.
|
|
160
189
|
*/
|
|
161
190
|
export const Env = v.object({
|
|
162
191
|
${n}
|
|
163
192
|
});
|
|
164
|
-
`:
|
|
193
|
+
`:r.default`
|
|
165
194
|
import arkenv from "arkenv/standard";
|
|
166
195
|
import * as v from "valibot";
|
|
167
196
|
|
|
197
|
+
/**
|
|
198
|
+
* Environment variable schema for server-side or runtime-only validation.
|
|
199
|
+
*/
|
|
168
200
|
export const Env = v.object({
|
|
169
201
|
${n}
|
|
170
202
|
});
|
|
171
203
|
|
|
172
204
|
export const env = arkenv(Env);
|
|
173
|
-
`},
|
|
205
|
+
`},Nt=(e,t)=>{let n=e?.length?e.map(e=>`\t\t${e}: z.string().default(""),`).join(`
|
|
174
206
|
`):` NODE_ENV: z.enum(["development", "production", "test"]).default("development"),
|
|
175
|
-
PORT: z.coerce.number().int().min(1).max(65535).default(3000),`;return t===`vite`?
|
|
207
|
+
PORT: z.coerce.number().int().min(1).max(65535).default(3000),`;return t===`vite`?r.default`
|
|
176
208
|
import { z } from "zod";
|
|
177
209
|
|
|
178
210
|
/**
|
|
179
211
|
* Environment variable schema.
|
|
180
212
|
* In Vite, use \`@arkenv/vite-plugin\` to validate these at build-time
|
|
181
|
-
* and provide typesafety for \`import.meta.env
|
|
213
|
+
* and provide typesafety for \`import.meta.env\` on the client-side.
|
|
182
214
|
*/
|
|
183
215
|
export const Env = z.object({
|
|
184
216
|
${n}
|
|
185
217
|
});
|
|
186
|
-
`:t===`bun`?
|
|
218
|
+
`:t===`bun-fullstack`?r.default`
|
|
187
219
|
import { z } from "zod";
|
|
188
220
|
|
|
189
221
|
/**
|
|
190
222
|
* Environment variable schema.
|
|
191
|
-
* In Bun, use \`@arkenv/bun-plugin\` to validate these at build-time
|
|
192
|
-
* and provide typesafety for \`process.env
|
|
223
|
+
* In Bun Fullstack, use \`@arkenv/bun-plugin\` to validate these at build-time
|
|
224
|
+
* and provide typesafety for \`process.env\` on the client-side.
|
|
193
225
|
*/
|
|
194
226
|
export const Env = z.object({
|
|
195
227
|
${n}
|
|
196
228
|
});
|
|
197
|
-
`:
|
|
229
|
+
`:r.default`
|
|
198
230
|
import arkenv from "arkenv/standard";
|
|
199
231
|
import { z } from "zod";
|
|
200
232
|
|
|
233
|
+
/**
|
|
234
|
+
* Environment variable schema for server-side or runtime-only validation.
|
|
235
|
+
*/
|
|
201
236
|
export const Env = z.object({
|
|
202
237
|
${n}
|
|
203
238
|
});
|
|
204
239
|
|
|
205
240
|
export const env = arkenv(Env);
|
|
206
|
-
`};function
|
|
241
|
+
`};function Pt(e){let{validator:t,envKeys:n,framework:r}=e;switch(t){case`arktype`:return`${kt(n,r)}\n`;case`zod`:return`${Nt(n,r)}\n`;case`valibot`:return`${Mt(n,r)}\n`;default:throw Error(`Unsupported validator: ${t}`)}}function Ft(e,t){switch(e){case`pnpm`:return[`pnpm`,[`add`,...t]];case`yarn`:return[`yarn`,[`add`,...t]];case`bun`:return[`bun`,[`add`,...t]];default:return[`npm`,[`install`,...t]]}}function It(e){return e.metadata.framework===`vite`?`2. Access via ${Z(`import.meta.env.YOUR_VAR`)}`:e.metadata.framework===`bun`?`2. Access via ${Z(`process.env.YOUR_VAR`)}`:`2. Import and use: import { env } from "${Z(e.metadata.importPath)}"`}function Lt(e,t){if(t)return{message:r.default`
|
|
207
242
|
Inside your AI assistant (e.g. Claude Code), use:
|
|
208
243
|
${Z(`/arkenv`)} - automatically refine your schema and configure integrations.
|
|
209
|
-
|
|
244
|
+
`,title:`Next steps`};let n=e.skill?.dlxCommand.join(` `)||`npx`,i=e.skill?.packageName||`yamcodes/arkenv`,a=It(e);return{message:r.default`
|
|
210
245
|
1. Check ${Z(e.metadata.displayPath)} and refine your environment schema.
|
|
211
|
-
${
|
|
212
|
-
3. (Recommended) Install the AI skill: ${Z(`${
|
|
246
|
+
${a}
|
|
247
|
+
3. (Recommended) Install the AI skill: ${Z(`${n} skills add ${i}`)}
|
|
213
248
|
Then run ${Z(`/arkenv`)} inside your AI assistant to finish.
|
|
214
|
-
|
|
215
|
-
To complete Bun integration, ensure your ${Z(`bunfig.toml`)} includes a preload file:
|
|
216
|
-
|
|
217
|
-
[preload]
|
|
218
|
-
preload = ["./bun.setup.ts"]
|
|
219
|
-
|
|
220
|
-
Then, in your setup file, import the ArkEnv plugin.
|
|
221
|
-
`}:e?.endsWith(`bun.setup.ts`)||e?.endsWith(`bun.setup.js`)?{success:!0,instructions:f.default`
|
|
222
|
-
To complete Bun integration, add the ArkEnv plugin to your setup file:
|
|
223
|
-
|
|
224
|
-
import arkenv from "@arkenv/bun-plugin";
|
|
225
|
-
|
|
226
|
-
// If using Bun.build or similar:
|
|
227
|
-
// plugins: [arkenv]
|
|
228
|
-
`}:{success:!0,instructions:f.default`
|
|
229
|
-
To complete Bun integration, we recommend creating a ${Z(`bun.setup.ts`)} file and adding it to your ${Z(`bunfig.toml`)}:
|
|
230
|
-
|
|
231
|
-
${w.default.dim(`[preload]`)}
|
|
232
|
-
${w.default.dim(`preload = ["./bun.setup.ts"]`)}
|
|
233
|
-
|
|
234
|
-
In your setup file, import the ArkEnv plugin:
|
|
235
|
-
|
|
236
|
-
${Z(`import arkenv from "@arkenv/bun-plugin";`)}
|
|
237
|
-
`}}async safeAppend(e,t,n){let{safeAppend:r}=await Promise.resolve().then(()=>x);return r(e,t,n)}};const Q={overwriteEnvSchemaFile:async()=>{let e=`./src/env.ts`;if(_.default.existsSync(d.default.resolve(process.cwd(),e))){let t=await q({message:w.default.yellow(`An existing ArkEnv configuration was found at ${Z(e)}. Do you want to overwrite it?`),initialValue:!1,active:`Yes (override my configuration)`,inactive:`No (abort)`});return P(t)||!t?null:t}return!0},framework:async e=>{let t=await tt({message:`Select your framework or runtime:`,initialValue:e?.framework,options:[{value:`vite`,label:`Vite${e?.framework===`vite`?` (Detected)`:``}`},{value:`bun`,label:`Bun${e?.framework===`bun`?` (Detected)`:``}`},{value:`node`,label:`Node.js${e?.framework===`node`?` (Detected)`:``}`}]});return P(t)?null:t},useDefaultPath:async()=>{let e=await q({message:`Use default config path (${Z(`./src/env.ts`)})?`,initialValue:!0,active:`Yes (Recommended)`,inactive:`No, let me customize it`});return P(e)?null:e},path:async({results:e})=>{if(e.useDefaultPath===null)return null;if(!e.useDefaultPath){let e=await rt({message:`Where should we create the ArkEnv config?`,placeholder:`./src/env.ts`,initialValue:`./src/env.ts`});return P(e)?null:e}return`./src/env.ts`},installTypeDefinitions:async({results:e})=>{if(e.framework===null)return null;if(e.framework===`vite`||e.framework===`bun`){let t=e.framework===`vite`?`vite-env.d.ts`:`bun-env.d.ts`,n=d.default.dirname(d.default.resolve(process.cwd(),e.path||`./src/env.ts`)),r=d.default.join(n,t);if(_.default.existsSync(r))return!0;let i=await q({message:`Establish ${Z(t)} for typesafe environment variables?`,initialValue:!0,active:`Yes (Recommended)`,inactive:`No`});return P(i)?null:i}return!0},envDtsHandling:async({results:e})=>{if(e.installTypeDefinitions===null)return null;if(!e.installTypeDefinitions||e.framework!==`vite`&&e.framework!==`bun`)return`skip`;let t=e.framework===`vite`?`vite-env.d.ts`:`bun-env.d.ts`,n=d.default.dirname(d.default.resolve(process.cwd(),e.path||`./src/env.ts`)),r=d.default.join(n,t);if(_.default.existsSync(r)){let e=await tt({message:`Found existing ${Z(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`},validator:async()=>{let e=await tt({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},useEnvExample:async e=>{if(e&&e.length>0){let t=await q({message:`Detected ${Z(`.env.example`)} with ${e.length} keys. Use them for your schema?`,active:`Yes (Recommended)`,initialValue:!0});return P(t)?null:t}return!1}};async function Tt(e,t=!1){let n=await lt();if(t){let t=e?.framework||`node`,r;if(t===`vite`||t===`bun`){let e=t===`vite`?`vite-env.d.ts`:`bun-env.d.ts`,n=d.default.dirname(d.default.resolve(process.cwd(),`./src/env.ts`)),i=d.default.join(n,e);r=_.default.existsSync(i)?`append`:`overwrite`}return{path:`./src/env.ts`,validator:`arktype`,framework:t,language:`ts`,overwriteEnvSchemaFile:!0,envDtsHandling:r,installTypeDefinitions:t!==`node`,envKeys:n||void 0,installSkill:!1}}let r=await Je({overwriteEnvSchemaFile:Q.overwriteEnvSchemaFile,framework:()=>Q.framework(e),useDefaultPath:Q.useDefaultPath,path:Q.path,installTypeDefinitions:Q.installTypeDefinitions,envDtsHandling:Q.envDtsHandling,validator:Q.validator,useEnvExample:()=>Q.useEnvExample(n)},{onCancel:()=>{}});return P(r)||Object.values(r).some(e=>e===null)?null:{path:r.path||`./src/env.ts`,validator:r.validator,framework:r.framework,language:`ts`,overwriteEnvSchemaFile:r.overwriteEnvSchemaFile,envDtsHandling:r.envDtsHandling,installTypeDefinitions:r.installTypeDefinitions,envKeys:r.useEnvExample?n:void 0,installSkill:!1}}var Et=class{async confirm(e,t=!0){let n=await q({message:e,initialValue:t});return P(n)?null:n}async runWizard(e,t=!1){return Tt(e,t)}},Dt=class{constructor(e,t={}){this.args=e.slice(2),this.command=this.args[0],this.isYes=this.args.includes(`--yes`)||this.args.includes(`-y`),this.isQuiet=this.args.includes(`--quiet`)||this.args.includes(`-q`),this.isJson=this.args.includes(`--json`)||this.args.includes(`-j`),this.isAgent=this.args.includes(`--agent`)||this.args.includes(`-a`),this.helpRequested=this.args.includes(`--help`)||this.args.includes(`-h`),this.isAgent&&(this.isYes=!0,this.isQuiet=!0,this.isJson=!0),this.logger=t.logger||new at({isQuiet:this.isQuiet,isJson:this.isJson,isYes:this.isYes})}},Ot=`0.0.8`,kt=class{constructor(e){this.logger=e}async execute(){this.logger.log(`ArkEnv CLI v${Ot}`),this.logger.log(`\n${w.default.bold(`Usage:`)}`),this.logger.log(` arkenv init Set up ArkEnv in your project`),this.logger.log(`\n${w.default.bold(`Options:`)}`),this.logger.log(` --yes, -y Skip prompts and use defaults (also passed to skill processes)`),this.logger.log(` --agent, -a Agent mode: --yes --quiet --json`),this.logger.log(` --quiet, -q Quiet mode: Suppress output, capture logs on failure`),this.logger.log(` --json, -j Output structured JSON to stdout`),this.logger.log(` --help, -h Show this help message`)}},At=class{constructor(e,t,n){this.logger=e,this.workspace=t,this.prompt=n}async execute(e){let t=await this.collect(e);if(!t)return;let n=Ct(t),r=new gt(this.workspace,this.logger);try{await r.execute(n)}catch(e){this.logger.fatal(`Scaffolding failed.`,e)}}async collect(e){let{isYes:t,isAgent:n}=e;this.logger.interactiveStdout(!0);try{let e=!1,r=await yt();if(r.status===`not_strict`)if(t)e=!0;else{if(this.logger.warn(`TypeScript strict mode is not enabled in your ${Z(r.file)}.`),!await this.prompt.confirm(`ArkEnv requires ${w.default.dim(`strict`)} mode in your ${Z(r.file)}. Would you like to enable it now?`,!0))return this.logger.cancel(`Operation cancelled.`),null;e=!0}let i=await xt(),a=await this.prompt.runWizard({framework:i},t);if(!a)return this.logger.cancel(`Operation cancelled.`),null;if(n)a.installSkill=!1;else if(t)a.installSkill=!0;else{let e=await this.prompt.confirm(`Would you like to install the ArkEnv agent skill?`,!0);if(e===null)return this.logger.cancel(`Operation cancelled.`),null;a.installSkill=e}let o=d.default.resolve(process.cwd(),a.path);if(await this.workspace.exists(o)&&a.overwriteEnvSchemaFile===void 0){let e=await this.prompt.confirm(`File ${Z(d.default.basename(o))} already exists. Overwrite?`,!1);if(!e)return this.logger.cancel(`Operation cancelled.`),null;a.overwriteEnvSchemaFile=e}let s=await St(),c=[];await this.workspace.exists(o)&&c.push(o);let l;if(a.framework===`vite`?l=`vite-env.d.ts`:a.framework===`bun`&&(l=`bun-env.d.ts`),l){let e=d.default.dirname(o),t=d.default.join(e,l);await this.workspace.exists(t)&&c.push(t)}return{cwd:process.cwd(),options:a,detectedFramework:i,packageManager:s,tsConfig:r,shouldUpdateTsConfig:e,existingFiles:c,isYes:t}}finally{this.logger.interactiveStdout(!1)}}};function jt(e){let t=new Dt(e),n=t.logger,r=new wt(t.isQuiet,n.stdio),i=new Et;return{cli:t,logger:n,workspace:r,prompt:i,initUseCase:new At(n,r,i),helpUseCase:new kt(n)}}let $;async function Mt(){let{cli:e,logger:t,initUseCase:n,helpUseCase:r}=jt(process.argv);$=t,e.helpRequested&&(await r.execute(),await t.flush(),process.exit(0)),e.command!==`init`&&(e.command?t.error(`Unknown command: ${e.command}`):t.error(`Missing command.`),await r.execute(),await t.flush(),process.exit(1));try{await n.execute({isYes:e.isYes,isQuiet:e.isQuiet,isAgent:e.isAgent})}catch(e){t.fatal(`An unexpected error occurred`,e),await t.flush(),process.exit(1)}}Mt(),process.on(`unhandledRejection`,async e=>{$?($.fatal(`Unhandled rejection`,e),await $.flush()):console.error(`Unhandled rejection`,e),process.exit(1)}),process.on(`uncaughtException`,async e=>{$?($.fatal(`Uncaught exception`,e),await $.flush()):console.error(`Uncaught exception`,e),process.exit(1)});
|
|
249
|
+
`,title:`Next steps`}}var Rt=class{constructor(e,t){this.workspace=e,this.reporter=t}async execute(e){let t=this.reporter.spinner();t.start(`Scaffolding ArkEnv configuration...`);try{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 ${Z(n.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 ${Z(n.default.basename(t.path))}.`):this.reporter.info(`${Z(n.default.basename(t.path))} already contains ArkEnv types.`);continue}if(await this.workspace.mkdir(n.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} ${Z(n.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 ${Z(e.install.packageManager)}...`);let[t,n]=Ft(e.install.packageManager,e.install.dependencies);await this.workspace.execute(t,n)}let r=!1;if(e.tsConfig){let t=await this.workspace.updateTsConfigToStrict(e.tsConfig.path);t.status===`updated`?(this.reporter.info(`Enforced strict: true in your ${Z(t.file)}`),r=!0):t.status===`error`&&this.reporter.warn(`Could not automatically update ${Z(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();if(t){this.reporter.step(`Bootstrapping Vite plugin...`);let r=await this.workspace.bootstrapViteConfig(t,e.bootstrap.importPath||`./src/env`);r.success?r.updated&&this.reporter.info(`Updated ${Z(n.default.basename(t))}`):(this.reporter.warn(`Could not automatically update ${Z(n.default.basename(t))}: ${r.error}`),this.reporter.info(`Please add ${Z(`@arkenv/vite-plugin`)} manually.`))}else this.reporter.info(`No Vite config found — please add ${Z(`@arkenv/vite-plugin`)} to your Vite config manually.`)}else if(e.bootstrap.framework===`bun-fullstack`){let t=await this.workspace.findBunConfig(),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),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=Lt(e,i);this.reporter.note(a.message,a.title),this.reporter.finish(`${gt} ArkEnv scaffolding complete. Happy coding!`,{path:e.metadata.displayPath,framework:e.metadata.framework,validator:e.metadata.validator,packageManager:e.metadata.packageManager,tsConfigUpdated:r,skillInstalled:i})}catch(e){throw t.stop(`Scaffolding failed.`),e}}};function zt(e){switch(e){case`pnpm`:return[`pnpm`,`dlx`];case`yarn`:return[`yarn`,`dlx`];case`bun`:return[`bunx`];default:return[`npx`]}}function Bt(e){let{options:t,packageManager:r,tsConfig:i,shouldUpdateTsConfig:a,cwd:o,existingFiles:s}=e,c=n.default.resolve(o,t.path),l=n.default.dirname(c),u={files:[],metadata:{displayPath:``,framework:t.framework,validator:t.validator,packageManager:r,importPath:``}},d=Pt(t),f=s.includes(c);(!f||t.overwriteEnvSchemaFile!==!1)&&u.files.push({path:c,content:d,action:f?`overwrite`:`create`,label:`environment schema`});let m=[`arkenv`,t.validator];if(t.framework===`vite`&&m.push(`@arkenv/vite-plugin`),t.framework===`bun-fullstack`&&t.bunFeatures?.length&&m.push(`@arkenv/bun-plugin`),u.install={packageManager:r,dependencies:m},a&&i.file&&(u.tsConfig={path:n.default.resolve(o,i.file),action:`strict`}),(t.framework===`vite`||t.framework===`bun-fullstack`&&t.bunFeatures?.length)&&t.installTypeDefinitions!==!1){let e=t.framework===`vite`?`vite-env.d.ts`:`bun-env.d.ts`,r=n.default.join(l,e),i=s.includes(r);if(t.envDtsHandling!==`skip`)if(t.envDtsHandling===`append`||!t.envDtsHandling&&i)u.files.push({path:r,content:c,action:`append`,label:`${t.framework} types`});else{let e=t.framework===`vite`?At(t.path):jt(t.path);u.files.push({path:r,content:e,action:i?`overwrite`:`create`,label:`${t.framework} types`})}}(t.framework===`vite`||t.framework===`bun-fullstack`)&&(u.bootstrap=(0,p.shake)({framework:t.framework,bunFeatures:t.framework===`bun-fullstack`?t.bunFeatures:void 0})),t.installSkill&&(u.skill={dlxCommand:zt(r),packageName:`yamcodes/arkenv`,isYes:e.isYes});let h=n.default.relative(o,c).replace(/\\/g,`/`),g=h.startsWith(`.`)?h:`./${h}`,_=g.replace(/\.(ts|js|tsx|jsx)$/,``);return u.metadata.displayPath=g,u.metadata.importPath=_,u.bootstrap&&(u.bootstrap.importPath=_),u}var Vt=class{constructor(e,t,n,r){this.logger=e,this.workspace=t,this.prompt=n,this.scanner=r}async execute(e){let t=await this.collect(e);if(!t)return;let n=Bt(t),r=new Rt(this.workspace,this.logger);try{await r.execute(n)}catch(e){this.logger.fatal(`Scaffolding failed.`,e)}}async collect(e){let{isYes:t,isAgent:r}=e;this.logger.interactiveStdout(!0);try{let e=!1,i=await this.scanner.checkTsConfig();if(i.status===`not_strict`)if(t)e=!0;else{this.logger.warn(`TypeScript strict mode is not enabled in your ${Z(i.file)}.`);let t=await this.prompt.confirm(`ArkEnv requires ${Z(`strict`)} mode in your ${Z(i.file)}. Would you like to enable it now?`,!0,`Yes (Recommended)`);if(t===null)return null;if(!t)return this.logger.cancel(`Operation cancelled.`),null;e=!0}let a=await this.scanner.detectFramework(process.cwd(),i.parsed),o=a===`bun-fullstack`?await this.scanner.detectBunFeatures(process.cwd(),i.parsed):void 0,s=await this.scanner.suggestDefaultEnvPath(process.cwd(),i.parsed),c=n.default.resolve(process.cwd(),s),l=await this.scanner.getEnvExampleKeys(process.cwd(),i.parsed,c),u=!1;if(a===`vite`||a===`bun-fullstack`){let e=a===`vite`?`vite-env.d.ts`:`bun-env.d.ts`,t=n.default.dirname(c),r=n.default.join(t,e);u=await this.workspace.exists(r)}let d=await this.prompt.runWizard((0,p.shake)({framework:a,bunFeatures:o,defaultEnvPath:s,tsConfig:i.parsed??null,envKeys:l?.keys,envKeysSource:l?.source,hasTypeFile:u}),t);if(d===null)return null;if(r)d.installSkill=!1;else if(t)d.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;d.installSkill=e}let f=n.default.resolve(process.cwd(),d.path);if(await this.workspace.exists(f)&&d.overwriteEnvSchemaFile===void 0){let e=await this.prompt.confirm(`File ${Z(n.default.basename(f))} already exists. Overwrite?`,!1);if(e===null)return null;if(!e)return this.logger.cancel(`Operation cancelled.`),null;d.overwriteEnvSchemaFile=e}let m=await this.scanner.detectPackageManager(process.cwd(),i.parsed),h=[];await this.workspace.exists(f)&&h.push(f);let g;if(d.framework===`vite`?g=`vite-env.d.ts`:d.framework===`bun-fullstack`&&(g=`bun-env.d.ts`),g){let e=n.default.dirname(f),t=n.default.join(e,g);await this.workspace.exists(t)&&h.push(t)}return(0,p.shake)({cwd:process.cwd(),options:d,detectedFramework:a,detectedBunFeatures:o,packageManager:m,tsConfig:i,shouldUpdateTsConfig:e,existingFiles:h,isYes:t})}finally{this.logger.interactiveStdout(!1)}}};function Ht(e){let t=new Et(e),n=t.logger,r=new Ct(t.isQuiet,n.stdio),i=new Tt;return{cli:t,logger:n,workspace:r,prompt:i,initUseCase:new Vt(n,r,i,new ht),helpUseCase:new Ot(n)}}let $,Ut=!1;async function Wt(){let{cli:e,logger:t,initUseCase:n,helpUseCase:r}=Ht(process.argv);$=t,Gt(t),e.helpRequested&&(await r.execute(),await t.flush(),process.exit(0)),e.command!==`init`&&(e.command?t.error(`Unknown command: ${e.command}`):t.error(`Missing command.`),await r.execute(),await t.flush(),process.exit(1));try{await n.execute({isYes:e.isYes,isQuiet:e.isQuiet,isAgent:e.isAgent})}catch(e){try{t.fatal(`An unexpected error occurred`,e)}catch{}await t.flush(),process.exit(1)}}function Gt(e){let t=async t=>{Ut&&process.exit(t),Ut=!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))}Wt(),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)});
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@arkenv/cli",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.10",
|
|
5
5
|
"description": "Interactive CLI for scaffolding ArkEnv projects",
|
|
6
6
|
"bin": {
|
|
7
7
|
"arkenv": "./dist/index.cjs"
|
|
@@ -38,7 +38,8 @@
|
|
|
38
38
|
"dedent": "^1.7.2",
|
|
39
39
|
"jsonc-parser": "^3.3.1",
|
|
40
40
|
"magicast": "^0.5.2",
|
|
41
|
-
"picocolors": "^1.1.1"
|
|
41
|
+
"picocolors": "^1.1.1",
|
|
42
|
+
"radashi": "^12.9.1"
|
|
42
43
|
},
|
|
43
44
|
"devDependencies": {
|
|
44
45
|
"@types/node": "24.12.2",
|