@arkenv/cli 0.0.7 → 0.0.9
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 +141 -114
- package/package.json +3 -2
- package/dist/injection-DY0QfjVh.cjs +0 -21
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,131 +1,152 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
`)
|
|
4
|
-
`)
|
|
5
|
-
|
|
6
|
-
|
|
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
|
+
`)?``:`
|
|
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
|
+
type ImportMetaEnvAugmented = import("@arkenv/vite-plugin").ImportMetaEnvAugmented<
|
|
6
|
+
typeof import("${e}").Env
|
|
7
|
+
>;
|
|
8
|
+
|
|
9
|
+
interface ImportMetaEnv extends ImportMetaEnvAugmented {}
|
|
10
|
+
|
|
11
|
+
interface ImportMeta {
|
|
12
|
+
readonly env: ImportMetaEnv;
|
|
13
|
+
}
|
|
14
|
+
`}function v(e){return r.default`
|
|
15
|
+
type ProcessEnvAugmented = import("@arkenv/bun-plugin").ProcessEnvAugmented<
|
|
16
|
+
typeof import("${e}").Env
|
|
17
|
+
>;
|
|
18
|
+
|
|
19
|
+
declare namespace NodeJS {
|
|
20
|
+
interface ProcessEnv extends ProcessEnvAugmented {}
|
|
21
|
+
}
|
|
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(`
|
|
7
27
|
`),r=t.split(`
|
|
8
|
-
`),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(`
|
|
9
29
|
`).map((e,t)=>{let a=i?i(e,t):e;return`${t===0?r:n}${a}`}).join(`
|
|
10
|
-
`)}let
|
|
11
|
-
`),
|
|
12
|
-
`).length-1;this.output.write(
|
|
13
|
-
`);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(`
|
|
14
34
|
`).slice(a);this.output.write(t.join(`
|
|
15
|
-
`)),this._prevFrame=e;return}}this.output.write(
|
|
16
|
-
`);_.push(i),v+=i.length}if(v>d){let t=0,n=0,r=v,i=e-y,a=(e,t)=>
|
|
17
|
-
`:``}${
|
|
18
|
-
`,
|
|
19
|
-
${(0,
|
|
20
|
-
${(0,
|
|
21
|
-
`:` ${(0,
|
|
22
|
-
${
|
|
23
|
-
`}}}}).prompt()},
|
|
24
|
-
`);if(f.length>0){let[e,...r]=f;e.length>0?
|
|
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()},Ge=async(e,t)=>{let n={},r=Object.keys(e);for(let i of r){let r=e[i],a=await r({results:n})?.catch(e=>{throw e});if(typeof t?.onCancel==`function`&&M(a)){n[i]=`canceled`,t.onCancel({results:n});continue}n[i]=a}return n},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(`
|
|
25
45
|
`)}
|
|
26
|
-
`)},info:(e,t)=>{
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
`)
|
|
32
|
-
`),
|
|
33
|
-
|
|
34
|
-
`),f=i?`${(0,l.styleText)(`gray`,W)}
|
|
35
|
-
`:``,p=i?Oe:Ae;r.write(`${f}${(0,l.styleText)(`green`,U)} ${(0,l.styleText)(`reset`,t)} ${(0,l.styleText)(`gray`,Ee.repeat(Math.max(c-s-1,1))+De)}
|
|
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)})}},Ke=(e=``,t)=>{let n=t?.output??process.stdout,r=t?.withGuide??j.withGuide?`${(0,i.styleText)(`gray`,B)}
|
|
47
|
+
${(0,i.styleText)(`gray`,V)} `:``;n.write(`${r}${e}
|
|
48
|
+
|
|
49
|
+
`)},qe=e=>(0,i.styleText)(`dim`,e),Je=(e,t,n)=>{let r={hard:!0,trim:!1},i=O(e,t,r).split(`
|
|
50
|
+
`),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(`
|
|
51
|
+
`).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(`
|
|
52
|
+
`),f=o?`${(0,i.styleText)(`gray`,B)}
|
|
53
|
+
`:``,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)}
|
|
36
54
|
${d}
|
|
37
|
-
${(0,
|
|
38
|
-
`)},
|
|
39
|
-
`);let e=
|
|
40
|
-
`);e.length>1&&n.write(
|
|
41
|
-
`);let r=0,
|
|
42
|
-
`):n.write(`${
|
|
43
|
-
`)),te(),d()};return{start:ie,stop:(e=``)=>T(e,0),message:(e=``)=>{h=
|
|
55
|
+
${(0,i.styleText)(`gray`,p+Ne.repeat(u+2)+Ie)}
|
|
56
|
+
`)},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(`
|
|
57
|
+
`);let e=O(g,v,{hard:!0,trim:!1}).split(`
|
|
58
|
+
`);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)}
|
|
59
|
+
`);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(_)}
|
|
60
|
+
`):n.write(`${o} ${h}
|
|
61
|
+
`)),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(`
|
|
44
62
|
`)?e.split(`
|
|
45
63
|
`).map(e=>t(e)).join(`
|
|
46
|
-
`):t(e),
|
|
47
|
-
`:``}${
|
|
48
|
-
`;switch(this.state){case`submit`:{let r=n?`${(0,
|
|
49
|
-
${(0,
|
|
50
|
-
`).length,
|
|
64
|
+
`):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)}
|
|
65
|
+
`:``}${o}
|
|
66
|
+
`;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?`
|
|
67
|
+
${(0,i.styleText)(`gray`,B)}`:``}`}default:{let r=n?`${(0,i.styleText)(`cyan`,B)} `:``,a=n?(0,i.styleText)(`cyan`,V):``,o=s.split(`
|
|
68
|
+
`).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(`
|
|
51
69
|
${r}`)}
|
|
52
|
-
${
|
|
53
|
-
`}}}}).prompt()},
|
|
70
|
+
${a}
|
|
71
|
+
`}}}}).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)}
|
|
54
72
|
${t} `);let n=3;for await(let t of e){t=t.replace(/\n/g,`
|
|
55
|
-
${
|
|
56
|
-
`)&&(n=3+(0,
|
|
57
|
-
`))).length);let e=(0,
|
|
58
|
-
${
|
|
59
|
-
`)},info:e=>
|
|
60
|
-
`:``}${
|
|
61
|
-
`,r=e.placeholder?(0,
|
|
62
|
-
${r}${
|
|
63
|
-
${
|
|
64
|
-
`}case`submit`:{let e=
|
|
65
|
-
${r}`:``}`}default:return`${n}${t?`${(0,
|
|
66
|
-
${t?(0,
|
|
67
|
-
`}}}).prompt();var Q=c(o(((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}))(),1),Ye=class{constructor(e){this.options=e,this.originalStdoutWrite=process.stdout.write}format(e){return this.options.isQuiet?e.replace(/\x1B\[[0-9;]*[JKmsu]/g,``):e}write(e,t=`stdout`){let n=this.format(e);this.options.isJson||t===`stderr`?process.stderr.write(`${n}\n`):process.stdout.write(`${n}\n`)}info(e){this.write(Q.default.blue(`ℹ ${e}`))}warn(e){this.write(Q.default.yellow(`⚠ ${e}`),`stderr`)}error(e){this.write(Q.default.red(`✘ ${e}`),`stderr`)}success(e){this.write(Q.default.green(`✔ ${e}`))}step(e){this.write(`○ ${e}`)}note(e,t){this.options.isQuiet||this.options.isJson?this.write(Q.default.dim(`○ ${t?`${t}: `:``}${e}`)):Ue(e,t)}log(e){this.write(e)}spinner(){return this.options.isQuiet||this.options.isJson?{start:e=>this.write(Q.default.dim(`○ ${e}...`)),stop:e=>this.write(Q.default.green(`✔ ${e}`)),message:e=>this.write(Q.default.dim(`○ ${e}...`))}:Ge()}json(e){process.stdout.write(`${JSON.stringify(e,null,2)}\n`)}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.options.isJson?this.json({status:`error`,message:e}):Y(e),process.exit(0)}fatal(e,t){this.options.isJson?this.json({status:`error`,details:{message:e,error:t instanceof Error?t.message:t?String(t):void 0}}):(this.error(e),t&&this.log(Q.default.red(t instanceof Error?t.stack:String(t)))),process.exit(1)}finish(e,t){this.options.isJson?this.json({status:`success`,message:e,details:t}):Be(e)}},Xe=class{constructor(e){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=new Ye({isQuiet:this.isQuiet,isJson:this.isJson,isYes:this.isYes})}},Ze=`0.0.7`,Qe=class{constructor(e){this.cli=e}async run(){let{logger:e}=this.cli;e.log(`ArkEnv CLI v${Ze}`),e.log(`\n${Q.default.bold(`Usage:`)}`),e.log(` arkenv init Set up ArkEnv in your project`),e.log(`\n${Q.default.bold(`Options:`)}`),e.log(` --yes, -y Skip prompts and use defaults (also passed to skill processes)`),e.log(` --agent, -a Agent mode: --yes --quiet --json`),e.log(` --quiet, -q Quiet mode: Suppress output, capture logs on failure`),e.log(` --json, -j Output structured JSON to stdout`),e.log(` --help, -h Show this help message`)}};async function $e(e){let t=process.cwd();for(let n of e){let e=m.default.join(t,n);try{return await _.default.access(e),e}catch{}}return null}async function et(){return $e([`vite.config.ts`,`vite.config.js`,`vite.config.mts`,`vite.config.mjs`])}async function tt(){return $e([`bunfig.toml`,`bun.setup.ts`,`bun.setup.js`])}async function nt(e,t){try{let n=await(0,v.loadFile)(e),r=(0,v.generateCode)(n).code,i=n.exports.default;if(i&&typeof i==`object`&&`$type`in i&&i.$type===`function-call`&&(i.$callee||i.$name||JSON.stringify(i))===`defineConfig`&&(i=i.$args[0]),!i||typeof i!=`object`)return{success:!1,updated:!1,error:`Could not find default export in Vite config`};if(i.plugins||=[],Array.isArray(i.plugins))if(!(r.includes(`arkenvVitePlugin`)||r.includes(`arkenvPlugin`)))n.imports.$add({from:`@arkenv/vite-plugin`,local:`arkenvVitePlugin`,imported:`default`}),t&&n.imports.$add({from:t,imported:`Env`}),i.plugins.push(`__ARK_PLUGIN_PLACEHOLDER__`);else return{success:!0,updated:!1};else return{success:!1,updated:!1,error:`The 'plugins' property in ${m.default.basename(e)} is not an array.`};let a=(0,v.generateCode)(n,{format:(0,v.detectCodeFormat)(r)}).code,o=t?`arkenvVitePlugin(Env)`:`arkenvVitePlugin()`;return a=a.replace(/['"]__ARK_PLUGIN_PLACEHOLDER__['"]/g,o),await _.default.writeFile(e,a,`utf-8`),{success:!0,updated:!0}}catch(t){let n=t instanceof Error?t.message:String(t);return{success:!1,updated:!1,error:`Failed to parse ${m.default.basename(e)}: ${n}`}}}async function rt(e){return e?.endsWith(`bunfig.toml`)?{success:!0,instructions:g.default`
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
73
|
+
${Qe}`),t.includes(`
|
|
74
|
+
`)&&(n=3+(0,i.stripVTControlCharacters)(t.slice(t.lastIndexOf(`
|
|
75
|
+
`))).length);let e=(0,i.stripVTControlCharacters)(t).length;n+e<process.stdout.columns?(n+=e,process.stdout.write(t)):(process.stdout.write(`
|
|
76
|
+
${Qe}${t.trimStart()}`),n=3+(0,i.stripVTControlCharacters)(t.trimStart()).length)}process.stdout.write(`
|
|
77
|
+
`)},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)}
|
|
78
|
+
`:``}${U(this.state)} `}${e.message}
|
|
79
|
+
`,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()}
|
|
80
|
+
${r}${a}
|
|
81
|
+
${o}${e}
|
|
82
|
+
`}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()?`
|
|
83
|
+
${r}`:``}`}default:return`${n}${t?`${(0,i.styleText)(`cyan`,B)} `:``}${a}
|
|
84
|
+
${t?(0,i.styleText)(`cyan`,V):``}
|
|
85
|
+
`}}}).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`
|
|
86
|
+
${b.default.green(`✔`)} Use ${b.default.bold(`Vanilla`)} Bun runtime integration.
|
|
87
|
+
Access validated variables via your ${Z(`env`)} object for typesafety.
|
|
88
|
+
Primarily used for ${b.default.cyan(`server-side`)} or runtime-only validation.
|
|
89
|
+
No plugins are required.
|
|
90
|
+
`};let n=t.includes(`serve`),i=t.includes(`build`),a=``;return n&&(a+=r.default`
|
|
91
|
+
${b.default.bold(`Bun Fullstack (Bun.serve) Integration:`)}
|
|
92
|
+
To inline environment variables (e.g. ${Z(`PUBLIC_*`)}) in your ${b.default.cyan(`client-side`)} code, add the plugin to ${Z(`bunfig.toml`)}:
|
|
93
|
+
|
|
94
|
+
[serve.static]
|
|
95
|
+
plugins = ["@arkenv/bun-plugin"]
|
|
96
|
+
|
|
97
|
+
`),i&&(a&&(a+=`
|
|
98
|
+
`),a+=r.default`
|
|
99
|
+
${b.default.bold(`Bun Fullstack programmatic bundling (Bun.build):`)}
|
|
100
|
+
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:
|
|
101
|
+
|
|
102
|
+
${Z(`import arkenv from "@arkenv/bun-plugin";`)}
|
|
103
|
+
|
|
104
|
+
await Bun.build({
|
|
105
|
+
entrypoints: ["./index.ts"],
|
|
106
|
+
outdir: "./dist",
|
|
107
|
+
${b.default.green(`plugins: [arkenv]`)}
|
|
108
|
+
});
|
|
109
|
+
`),{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)}};function wt(e){return!M(e)&&Object.values(e).every(e=>e!==null)}const Q={overwriteEnvSchemaFile:(e=`./src/env.ts`)=>async()=>{if(c.default.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 Tt(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=await Ge({overwriteEnvSchemaFile:Q.overwriteEnvSchemaFile(n),framework:Q.framework(e),bunBuild:({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),useDefaultPath:Q.useDefaultPath(n),path:Q.path(n),installTypeDefinitions:Q.installTypeDefinitions,envDtsHandling:Q.envDtsHandling,validator:Q.validator,useEnvExample:Q.useEnvExample(r,i)},{onCancel:()=>{}});if(!wt(a))return null;let o=a.framework===`bun-fullstack`?a.bunBuild?[`serve`,`build`]:[`serve`]:void 0;return(0,p.shake)({...a,bunFeatures:o,language:`ts`,installSkill:!1,envKeys:a.useEnvExample?r??void 0:void 0})}var Et=class{async confirm(e,t=!0){let n=await W({message:e,initialValue:t});return M(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 tt({isQuiet:this.isQuiet,isJson:this.isJson,isYes:this.isYes})}},Ot=`0.0.9`,kt=class{constructor(e){this.logger=e}async execute(){this.logger.log(`ArkEnv CLI v${Ot}`),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 At=(e,t)=>{let n=e?.length?e.map(e=>`\t\t${e}: "string = ''",`).join(`
|
|
92
110
|
`):` NODE_ENV: "'development' | 'production' | 'test' = 'development'",
|
|
93
|
-
PORT: "number.port = 3000",`;return t===`vite`?
|
|
111
|
+
PORT: "number.port = 3000",`;return t===`vite`?r.default`
|
|
94
112
|
import { type } from "arkenv";
|
|
95
113
|
|
|
96
114
|
/**
|
|
97
115
|
* Environment variable schema.
|
|
98
116
|
* In Vite, use \`@arkenv/vite-plugin\` to validate these at build-time
|
|
99
|
-
* and provide typesafety for \`import.meta.env
|
|
117
|
+
* and provide typesafety for \`import.meta.env\` on the client-side.
|
|
100
118
|
*/
|
|
101
119
|
export const Env = type({
|
|
102
120
|
${n}
|
|
103
121
|
});
|
|
104
|
-
`:t===`bun`?
|
|
122
|
+
`:t===`bun-fullstack`?r.default`
|
|
105
123
|
import { type } from "arkenv";
|
|
106
124
|
|
|
107
125
|
/**
|
|
108
126
|
* Environment variable schema.
|
|
109
|
-
* In Bun, use \`@arkenv/bun-plugin\` to validate these at build-time
|
|
110
|
-
* and provide typesafety for \`process.env
|
|
127
|
+
* In Bun Fullstack, use \`@arkenv/bun-plugin\` to validate these at build-time
|
|
128
|
+
* and provide typesafety for \`process.env\` on the client-side.
|
|
111
129
|
*/
|
|
112
130
|
export const Env = type({
|
|
113
131
|
${n}
|
|
114
132
|
});
|
|
115
|
-
`:
|
|
133
|
+
`:r.default`
|
|
116
134
|
import arkenv, { type } from "arkenv";
|
|
117
135
|
|
|
136
|
+
/**
|
|
137
|
+
* Environment variable schema for server-side or runtime-only validation.
|
|
138
|
+
*/
|
|
118
139
|
export const Env = type({
|
|
119
140
|
${n}
|
|
120
141
|
});
|
|
121
142
|
|
|
122
143
|
export const env = arkenv(Env);
|
|
123
|
-
`},
|
|
144
|
+
`},jt=e=>r.default`
|
|
124
145
|
/// <reference types="vite/client" />
|
|
125
146
|
|
|
126
147
|
type ImportMetaEnvAugmented =
|
|
127
148
|
import("@arkenv/vite-plugin").ImportMetaEnvAugmented<
|
|
128
|
-
typeof import("./${
|
|
149
|
+
typeof import("./${n.default.basename(e).replace(/\.(ts|js|tsx|jsx)$/,``)}").Env
|
|
129
150
|
>;
|
|
130
151
|
|
|
131
152
|
interface ImportMetaEnv extends ImportMetaEnvAugmented {}
|
|
@@ -133,88 +154,94 @@ ${n}
|
|
|
133
154
|
interface ImportMeta {
|
|
134
155
|
readonly env: ImportMetaEnv;
|
|
135
156
|
}
|
|
136
|
-
`,
|
|
157
|
+
`,Mt=e=>r.default`
|
|
137
158
|
/// <reference types="bun-types" />
|
|
138
159
|
|
|
139
160
|
type ProcessEnvAugmented = import("@arkenv/bun-plugin").ProcessEnvAugmented<
|
|
140
|
-
typeof import("./${
|
|
161
|
+
typeof import("./${n.default.basename(e).replace(/\.(ts|js|tsx|jsx)$/,``)}").Env
|
|
141
162
|
>;
|
|
142
163
|
|
|
143
164
|
declare namespace NodeJS {
|
|
144
165
|
interface ProcessEnv extends ProcessEnvAugmented {}
|
|
145
166
|
}
|
|
146
|
-
`,
|
|
167
|
+
`,Nt=(e,t)=>{let n=e?.length?e.map(e=>`\t\t${e}: v.optional(v.string(), ""),`).join(`
|
|
147
168
|
`):` NODE_ENV: v.optional(v.picklist(["development", "production", "test"]), "development"),
|
|
148
|
-
PORT: v.optional(v.pipe(v.string(), v.transform(Number), v.number(), v.integer(), v.minValue(1), v.maxValue(65535)), 3000),`;return t===`vite`?
|
|
169
|
+
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`
|
|
149
170
|
import * as v from "valibot";
|
|
150
171
|
|
|
151
172
|
/**
|
|
152
173
|
* Environment variable schema.
|
|
153
174
|
* In Vite, use \`@arkenv/vite-plugin\` to validate these at build-time
|
|
154
|
-
* and provide typesafety for \`import.meta.env
|
|
175
|
+
* and provide typesafety for \`import.meta.env\` on the client-side.
|
|
155
176
|
*/
|
|
156
177
|
export const Env = v.object({
|
|
157
178
|
${n}
|
|
158
179
|
});
|
|
159
|
-
`:t===`bun`?
|
|
180
|
+
`:t===`bun-fullstack`?r.default`
|
|
160
181
|
import * as v from "valibot";
|
|
161
182
|
|
|
162
183
|
/**
|
|
163
184
|
* Environment variable schema.
|
|
164
|
-
* In Bun, use \`@arkenv/bun-plugin\` to validate these at build-time
|
|
165
|
-
* and provide typesafety for \`process.env
|
|
185
|
+
* In Bun Fullstack, use \`@arkenv/bun-plugin\` to validate these at build-time
|
|
186
|
+
* and provide typesafety for \`process.env\` on the client-side.
|
|
166
187
|
*/
|
|
167
188
|
export const Env = v.object({
|
|
168
189
|
${n}
|
|
169
190
|
});
|
|
170
|
-
`:
|
|
191
|
+
`:r.default`
|
|
171
192
|
import arkenv from "arkenv/standard";
|
|
172
193
|
import * as v from "valibot";
|
|
173
194
|
|
|
195
|
+
/**
|
|
196
|
+
* Environment variable schema for server-side or runtime-only validation.
|
|
197
|
+
*/
|
|
174
198
|
export const Env = v.object({
|
|
175
199
|
${n}
|
|
176
200
|
});
|
|
177
201
|
|
|
178
202
|
export const env = arkenv(Env);
|
|
179
|
-
`},
|
|
203
|
+
`},Pt=(e,t)=>{let n=e?.length?e.map(e=>`\t\t${e}: z.string().default(""),`).join(`
|
|
180
204
|
`):` NODE_ENV: z.enum(["development", "production", "test"]).default("development"),
|
|
181
|
-
PORT: z.coerce.number().int().min(1).max(65535).default(3000),`;return t===`vite`?
|
|
205
|
+
PORT: z.coerce.number().int().min(1).max(65535).default(3000),`;return t===`vite`?r.default`
|
|
182
206
|
import { z } from "zod";
|
|
183
207
|
|
|
184
208
|
/**
|
|
185
209
|
* Environment variable schema.
|
|
186
210
|
* In Vite, use \`@arkenv/vite-plugin\` to validate these at build-time
|
|
187
|
-
* and provide typesafety for \`import.meta.env
|
|
211
|
+
* and provide typesafety for \`import.meta.env\` on the client-side.
|
|
188
212
|
*/
|
|
189
213
|
export const Env = z.object({
|
|
190
214
|
${n}
|
|
191
215
|
});
|
|
192
|
-
`:t===`bun`?
|
|
216
|
+
`:t===`bun-fullstack`?r.default`
|
|
193
217
|
import { z } from "zod";
|
|
194
218
|
|
|
195
219
|
/**
|
|
196
220
|
* Environment variable schema.
|
|
197
|
-
* In Bun, use \`@arkenv/bun-plugin\` to validate these at build-time
|
|
198
|
-
* and provide typesafety for \`process.env
|
|
221
|
+
* In Bun Fullstack, use \`@arkenv/bun-plugin\` to validate these at build-time
|
|
222
|
+
* and provide typesafety for \`process.env\` on the client-side.
|
|
199
223
|
*/
|
|
200
224
|
export const Env = z.object({
|
|
201
225
|
${n}
|
|
202
226
|
});
|
|
203
|
-
`:
|
|
227
|
+
`:r.default`
|
|
204
228
|
import arkenv from "arkenv/standard";
|
|
205
229
|
import { z } from "zod";
|
|
206
230
|
|
|
231
|
+
/**
|
|
232
|
+
* Environment variable schema for server-side or runtime-only validation.
|
|
233
|
+
*/
|
|
207
234
|
export const Env = z.object({
|
|
208
235
|
${n}
|
|
209
236
|
});
|
|
210
237
|
|
|
211
238
|
export const env = arkenv(Env);
|
|
212
|
-
`};function
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
239
|
+
`};function Ft(e){let{validator:t,envKeys:n,framework:r}=e;switch(t){case`arktype`:return`${At(n,r)}\n`;case`zod`:return`${Pt(n,r)}\n`;case`valibot`:return`${Nt(n,r)}\n`;default:throw Error(`Unsupported validator: ${t}`)}}function It(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 Lt(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 Rt(e,t){if(t)return{message:r.default`
|
|
240
|
+
Inside your AI assistant (e.g. Claude Code), use:
|
|
241
|
+
${Z(`/arkenv`)} - automatically refine your schema and configure integrations.
|
|
242
|
+
`,title:`Next steps`};let n=e.skill?.dlxCommand.join(` `)||`npx`,i=e.skill?.packageName||`yamcodes/arkenv`,a=Lt(e);return{message:r.default`
|
|
243
|
+
1. Check ${Z(e.metadata.displayPath)} and refine your environment schema.
|
|
244
|
+
${a}
|
|
245
|
+
3. (Recommended) Install the AI skill: ${Z(`${n} skills add ${i}`)}
|
|
246
|
+
Then run ${Z(`/arkenv`)} inside your AI assistant to finish.
|
|
247
|
+
`,title:`Next steps`}}var zt=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]=It(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=Rt(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 Bt(e){switch(e){case`pnpm`:return[`pnpm`,`dlx`];case`yarn`:return[`yarn`,`dlx`];case`bun`:return[`bunx`];default:return[`npx`]}}function Vt(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=Ft(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`?jt(t.path):Mt(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:Bt(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 Ht=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=Vt(t),r=new zt(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 ${b.default.dim(`strict`)} mode in your ${Z(i.file)}. Would you like to enable it now?`,!0);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);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 Ut(e){let t=new Dt(e),n=t.logger,r=new Ct(t.isQuiet,n.stdio),i=new Et;return{cli:t,logger:n,workspace:r,prompt:i,initUseCase:new Ht(n,r,i,new ht),helpUseCase:new kt(n)}}let $,Wt=!1;async function Gt(){let{cli:e,logger:t,initUseCase:n,helpUseCase:r}=Ut(process.argv);$=t,Kt(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 Kt(e){let t=async t=>{Wt&&process.exit(t),Wt=!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))}Gt(),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.9",
|
|
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",
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
const e=require(`./index.cjs`);let t=require(`node:path`);t=e.t(t,1);let n=require(`dedent`);n=e.t(n,1);let r=require(`node:fs/promises`);r=e.t(r,1);const i=`// @arkenv-types`;async function a(e,n,a){try{let c=await r.default.readFile(e,`utf-8`),l=a===`vite`?`ImportMetaEnvAugmented`:`ProcessEnvAugmented`;if(c.includes(i)||c.includes(l))return!1;let u=t.default.dirname(e),d=t.default.relative(u,n).replace(/\.(ts|js|tsx|jsx)$/,``).split(t.default.sep).join(`/`),f=d.startsWith(`.`)?d:`./${d}`,p=a===`vite`?o(f):s(f),m=c.endsWith(`
|
|
2
|
-
`)?``:`
|
|
3
|
-
`;return await r.default.appendFile(e,`${m}\n${i}\n${p}\n`,`utf-8`),!0}catch(t){return console.error(`Failed to append to ${e}:`,t),!1}}function o(e){return n.default`
|
|
4
|
-
type ImportMetaEnvAugmented = import("@arkenv/vite-plugin").ImportMetaEnvAugmented<
|
|
5
|
-
typeof import("${e}").Env
|
|
6
|
-
>;
|
|
7
|
-
|
|
8
|
-
interface ImportMetaEnv extends ImportMetaEnvAugmented {}
|
|
9
|
-
|
|
10
|
-
interface ImportMeta {
|
|
11
|
-
readonly env: ImportMetaEnv;
|
|
12
|
-
}
|
|
13
|
-
`}function s(e){return n.default`
|
|
14
|
-
type ProcessEnvAugmented = import("@arkenv/bun-plugin").ProcessEnvAugmented<
|
|
15
|
-
typeof import("${e}").Env
|
|
16
|
-
>;
|
|
17
|
-
|
|
18
|
-
declare namespace NodeJS {
|
|
19
|
-
interface ProcessEnv extends ProcessEnvAugmented {}
|
|
20
|
-
}
|
|
21
|
-
`}exports.safeAppend=a;
|