@arkenv/cli 0.0.3 → 0.0.5
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 +11 -49
- package/dist/index.cjs +162 -59
- package/package.json +4 -2
package/README.md
CHANGED
|
@@ -1,63 +1,25 @@
|
|
|
1
|
-
#
|
|
1
|
+
# `@arkenv/cli`
|
|
2
2
|
|
|
3
|
-
The interactive, zero-dependency scaffolding experience for the [ArkEnv](https://arkenv.
|
|
3
|
+
The interactive, zero-dependency scaffolding experience for the [ArkEnv](https://arkenv.js.org) ecosystem.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
<br />
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
<br />
|
|
8
8
|
|
|
9
|
-
<
|
|
10
|
-
<summary>npm</summary>
|
|
9
|
+
<br />
|
|
11
10
|
|
|
12
|
-
|
|
13
|
-
npx @arkenv/cli@latest init
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
</details>
|
|
17
|
-
|
|
18
|
-
<details>
|
|
19
|
-
<summary>pnpm</summary>
|
|
20
|
-
|
|
21
|
-
```sh
|
|
22
|
-
pnpm dlx @arkenv/cli@latest init
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
</details>
|
|
26
|
-
|
|
27
|
-
<details>
|
|
28
|
-
<summary>Yarn</summary>
|
|
11
|
+
## [Read the docs →](https://arkenv.js.org/docs/cli)
|
|
29
12
|
|
|
30
|
-
|
|
31
|
-
yarn dlx @arkenv/cli@latest init
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
</details>
|
|
35
|
-
|
|
36
|
-
<details>
|
|
37
|
-
<summary>Bun</summary>
|
|
13
|
+
<br />
|
|
38
14
|
|
|
39
15
|
```sh
|
|
40
|
-
|
|
16
|
+
npx @arkenv/cli@latest init
|
|
41
17
|
```
|
|
42
18
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
## Features
|
|
46
|
-
|
|
47
|
-
- **Interactive Scaffolding**: A guided setup process using `@clack/prompts`.
|
|
48
|
-
- **Zero Dependencies**: Lightweight and fast, perfect for one-off project initialization.
|
|
49
|
-
- **Multiple Validation Libraries**: Support for [ArkType](https://arktype.io), [Zod](https://zod.dev), and [Valibot](https://valibot.dev).
|
|
50
|
-
- **Framework Detection**: Automatically detects your runtime (Node, Bun) and framework (Vite, Solid-Start).
|
|
51
|
-
|
|
52
|
-
## Usage
|
|
53
|
-
|
|
54
|
-
The primary command is `init`, which guides you through:
|
|
55
|
-
|
|
56
|
-
1. Selecting your preferred validation library.
|
|
57
|
-
2. Configuring your environment schema.
|
|
58
|
-
3. Setting up project-specific options like strict mode and configuration paths.
|
|
19
|
+
## Related
|
|
59
20
|
|
|
60
|
-
|
|
21
|
+
- [ArkEnv](https://arkenv.js.org) - Core library and docs
|
|
22
|
+
- [ArkType](https://arktype.io/) - Underlying validator / type system
|
|
61
23
|
|
|
62
24
|
## License
|
|
63
25
|
|
package/dist/index.cjs
CHANGED
|
@@ -1,97 +1,200 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
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,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},c=(n,r,a)=>(a=n==null?{}:e(i(n)),s(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let l=require(`node:
|
|
3
|
-
`),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===``){
|
|
4
|
-
`){a&&(r+=
|
|
5
|
-
`&&(i&&
|
|
6
|
-
`)}var j=o(((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 M(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?M(a,t<0?-1:1,n):a}const N={actions:new Set([`up`,`down`,`left`,`right`,`space`,`enter`,`cancel`]),aliases:new Map([[`k`,`up`],[`j`,`down`],[`h`,`left`],[`l`,`right`],[``,`cancel`],[`escape`,`cancel`]]),messages:{cancel:`Canceled`,error:`Something went wrong`},withGuide:!0,date:{monthNames:[...[`January`,`February`,`March`,`April`,`May`,`June`,`July`,`August`,`September`,`October`,`November`,`December`]],messages:{required:`Please enter a valid date`,invalidMonth:`There are only 12 months in a year`,invalidDay:(e,t)=>`There are only ${e} days in ${t}`,afterMin:e=>`Date must be on or after ${e.toISOString().slice(0,10)}`,beforeMax:e=>`Date must be on or before ${e.toISOString().slice(0,10)}`}}};function P(e,t){if(typeof e==`string`)return N.aliases.get(e)===t;for(let n of e)if(n!==void 0&&P(n,t))return!0;return!1}function
|
|
2
|
+
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,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},c=(n,r,a)=>(a=n==null?{}:e(i(n)),s(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let l=require(`node:util`),u=require(`node:process`);u=c(u,1);let d=require(`node:readline`);d=c(d,1);let f=require(`node:tty`),p=require(`node:fs`);p=c(p,1);let m=require(`node:path`);m=c(m,1);let h=require(`node:child_process`),g=require(`dedent`);g=c(g,1);let _=require(`node:fs/promises`);_=c(_,1);let v=require(`magicast`),y=require(`jsonc-parser`);const b=(()=>{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}})(),x=e=>e===12288||e>=65281&&e<=65376||e>=65504&&e<=65510,S=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,ee=/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]|\u001b\]8;[^;]*;.*?(?:\u0007|\u001b\u005c)/y,te=/[\x00-\x08\x0A-\x1F\x7F-\x9F]{1,1000}/y,C=/(?:(?![\uFF61-\uFF9F\uFF00-\uFFEF])[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Hangul}\p{Script=Tangut}]){1,1000}/uy,ne=/\t{1,1000}/y,w=/[\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,re=/(?:[\x20-\x7E\xA0-\xFF](?!\uFE0F)){1,1000}/y,ie=/\p{M}+/gu,T={limit:1/0,ellipsis:``},ae=(e,t={},n={})=>{let r=t.limit??1/0,i=t.ellipsis??``,a=t?.ellipsisWidth??(i?ae(i,T,n).width:0),o=n.controlWidth??0,s=n.tabWidth??8,c=n.emojiWidth??2,l=n.regularWidth??1,u=n.wideWidth??2,d=[[re,l],[ee,0],[te,o],[ne,s],[w,c],[C,u]],f=0,p=0,m=e.length,h=0,g=!1,_=m,v=Math.max(0,r-a),y=0,E=0,D=0,O=0;outer:for(;;){if(E>y||p>=m&&p>f){let t=e.slice(y,E)||e.slice(f,p);h=0;for(let e of t.replaceAll(ie,``)){let t=e.codePointAt(0)||0;if(O=x(t)?2:S(t)?u:l,D+O>v&&(_=Math.min(_,Math.max(y,f)+h)),D+O>r){g=!0;break outer}h+=e.length,D+=O}y=E=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===C?b(e.slice(p,n.lastIndex)):n===w?1:n.lastIndex-p,O=h*i,D+O>v&&(_=Math.min(_,p+Math.floor((v-D)/i))),D+O>r){g=!0;break outer}D+=O,y=f,E=p,p=f=n.lastIndex;continue outer}}p+=1}return{width:g?v:D,index:g?_:m,truncated:g,ellipsed:g&&r>=a}},E={limit:1/0,ellipsis:``,ellipsisWidth:0},D=(e,t={})=>ae(e,E,t).width,O=`]8;;`,oe=RegExp(`(?:\\[(?<code>\\d+)m|\\${O}(?<uri>.*))`,`y`),se=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},ce=e=>`[${e}m`,le=e=>`${O}${e}`,k=(e,t,n)=>{let r=t[Symbol.iterator](),i=!1,a=!1,o=e.at(-1),s=o===void 0?0:D(o),c=r.next(),l=r.next(),u=0;for(;!c.done;){let o=c.value,d=D(o);s+d<=n?e[e.length-1]+=o:(e.push(o),s=0),(o===`\x1B`||o===``)&&(i=!0,a=t.startsWith(O,u+1)),i?a?o===`\x07`&&(i=!1,a=!1):o===`m`&&(i=!1):(s+=d,s===n&&!l.done&&(e.push(``),s=0)),c=l,l=r.next(),u+=o.length}o=e.at(-1),!s&&o!==void 0&&o.length&&e.length>1&&(e[e.length-2]+=e.pop())},ue=e=>{let t=e.split(` `),n=t.length;for(;n&&!D(t[n-1]);)n--;return n===t.length?e:t.slice(0,n).join(` `)+t.slice(n).join(``)},de=(e,t,n={})=>{if(n.trim!==!1&&e.trim()===``)return``;let r=``,i,a,o=e.split(` `),s=[``],c=0;for(let e=0;e<o.length;e++){let r=o[e];if(n.trim!==!1){let e=s.at(-1)??``,t=e.trimStart();e.length!==t.length&&(s[s.length-1]=t,c=D(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=D(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(``),k(s,r,t),c=D(s.at(-1)??``);continue}if(c+i>t&&c&&i){if(n.wordWrap===!1&&c<t){k(s,r,t),c=D(s.at(-1)??``);continue}s.push(``),c=0}if(c+i>t&&n.wordWrap===!1){k(s,r,t),c=D(s.at(-1)??``);continue}s[s.length-1]+=r,c+=i}n.trim!==!1&&(s=s.map(e=>ue(e)));let l=s.join(`
|
|
3
|
+
`),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===``){oe.lastIndex=e+1;let t=oe.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]===`
|
|
4
|
+
`){a&&(r+=le(``));let e=i?se(i):void 0;i&&e&&(r+=ce(e))}else t===`
|
|
5
|
+
`&&(i&&se(i)&&(r+=ce(i)),a&&(r+=le(a)))}return r},fe=/\r?\n/;function A(e,t,n){return String(e).normalize().split(fe).map(e=>de(e,t,n)).join(`
|
|
6
|
+
`)}var j=o(((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 M(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?M(a,t<0?-1:1,n):a}const N={actions:new Set([`up`,`down`,`left`,`right`,`space`,`enter`,`cancel`]),aliases:new Map([[`k`,`up`],[`j`,`down`],[`h`,`left`],[`l`,`right`],[``,`cancel`],[`escape`,`cancel`]]),messages:{cancel:`Canceled`,error:`Something went wrong`},withGuide:!0,date:{monthNames:[...[`January`,`February`,`March`,`April`,`May`,`June`,`July`,`August`,`September`,`October`,`November`,`December`]],messages:{required:`Please enter a valid date`,invalidMonth:`There are only 12 months in a year`,invalidDay:(e,t)=>`There are only ${e} days in ${t}`,afterMin:e=>`Date must be on or after ${e.toISOString().slice(0,10)}`,beforeMax:e=>`Date must be on or before ${e.toISOString().slice(0,10)}`}}};function P(e,t){if(typeof e==`string`)return N.aliases.get(e)===t;for(let n of e)if(n!==void 0&&P(n,t))return!0;return!1}function pe(e,t){if(e===t)return;let n=e.split(`
|
|
7
7
|
`),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
|
|
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 me=globalThis.process.platform.startsWith(`win`),F=Symbol(`clack:cancel`);function I(e){return e===F}function L(e,t){let n=e;n.isTTY&&n.setRawMode(t)}function he({input:e=u.stdin,output:t=u.stdout,overwrite:n=!0,hideCursor:r=!0}={}){let i=d.createInterface({input:e,output:t,prompt:``,tabSize:1});d.emitKeypressEvents(e,i),e instanceof f.ReadStream&&e.isTTY&&e.setRawMode(!0);let a=(i,{name:o,sequence:s})=>{if(P([String(i),o,s],`cancel`)){r&&t.write(j.cursor.show),process.exit(0);return}if(!n)return;let c=o===`return`?0:-1,l=o===`return`?-1:0;d.moveCursor(t,c,l,()=>{d.clearLine(t,1,()=>{e.once(`keypress`,a)})})};return r&&t.write(j.cursor.hide),e.once(`keypress`,a),()=>{e.off(`keypress`,a),r&&t.write(j.cursor.show),e instanceof f.ReadStream&&e.isTTY&&!me&&e.setRawMode(!1),i.terminal=!1,i.close()}}const R=e=>`columns`in e&&typeof e.columns==`number`?e.columns:80,ge=e=>`rows`in e&&typeof e.rows==`number`?e.rows:20;function z(e,t,n,r=n,i){return A(t,R(e??u.stdout)-n.length,{hard:!0,trim:!1}).split(`
|
|
9
9
|
`).map((e,t)=>{let a=i?i(e,t):e;return`${t===0?r:n}${a}`}).join(`
|
|
10
|
-
`)}let B=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=
|
|
10
|
+
`)}let B=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=u.stdin,output:r=u.stdout,render:i,signal:a,...o}=e;this.opts=o,this.onKeypress=this.onKeypress.bind(this),this.close=this.close.bind(this),this.render=this.render.bind(this),this._render=i.bind(this),this._track=t,this._abortSignal=a,this.input=n,this.output=r}unsubscribe(){this._subscribers.clear()}setSubscriber(e,t){let n=this._subscribers.get(e)??[];n.push(t),this._subscribers.set(e,n)}on(e,t){this.setSubscriber(e,{cb:t})}once(e,t){this.setSubscriber(e,{cb:t,once:!0})}emit(e,...t){let n=this._subscribers.get(e)??[],r=[];for(let e of n)e.cb(...t),e.once&&r.push(()=>n.splice(n.indexOf(e),1));for(let e of r)e()}prompt(){return new Promise(e=>{if(this._abortSignal){if(this._abortSignal.aborted)return this.state=`cancel`,this.close(),e(F);this._abortSignal.addEventListener(`abort`,()=>{this.state=`cancel`,this.close()},{once:!0})}this.rl=d.default.createInterface({input:this.input,tabSize:2,prompt:``,escapeCodeTimeout:50,terminal:!0}),this.rl.prompt(),this.opts.initialUserInput!==void 0&&this._setUserInput(this.opts.initialUserInput,!0),this.input.on(`keypress`,this.onKeypress),L(this.input,!0),this.output.on(`resize`,this.render),this.render(),this.once(`submit`,()=>{this.output.write(j.cursor.show),this.output.off(`resize`,this.render),L(this.input,!1),e(this.value)}),this.once(`cancel`,()=>{this.output.write(j.cursor.show),this.output.off(`resize`,this.render),L(this.input,!1),e(F)})})}_isActionKey(e,t){return e===` `}_shouldSubmit(e,t){return!0}_setValue(e){this.value=e,this.emit(`value`,this.value)}_setUserInput(e,t){this.userInput=e??``,this.emit(`userInput`,this.userInput),t&&this._track&&this.rl&&(this.rl.write(this.userInput),this._cursor=this.rl.cursor)}_clearUserInput(){this.rl?.write(null,{ctrl:!0,name:`u`}),this._setUserInput(``)}onKeypress(e,t){if(this._track&&t.name!==`return`&&(t.name&&this._isActionKey(e,t)&&this.rl?.write(null,{ctrl:!0,name:`h`}),this._cursor=this.rl?.cursor??0,this._setUserInput(this.rl?.line)),this.state===`error`&&(this.state=`active`),t?.name&&(!this._track&&N.aliases.has(t.name)&&this.emit(`cursor`,N.aliases.get(t.name)),N.actions.has(t.name)&&this.emit(`cursor`,t.name)),e&&(e.toLowerCase()===`y`||e.toLowerCase()===`n`)&&this.emit(`confirm`,e.toLowerCase()===`y`),this.emit(`key`,e?.toLowerCase(),t),t?.name===`return`&&this._shouldSubmit(e,t)){if(this.opts.validate){let e=this.opts.validate(this.value);e&&(this.error=e instanceof Error?e.message:e,this.state=`error`,this.rl?.write(this.userInput))}this.state!==`error`&&(this.state=`submit`)}P([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(`
|
|
11
11
|
`),L(this.input,!1),this.rl?.close(),this.rl=void 0,this.emit(`${this.state}`,this.value),this.unsubscribe()}restoreCursor(){let e=A(this._prevFrame,process.stdout.columns,{hard:!0,trim:!1}).split(`
|
|
12
|
-
`).length-1;this.output.write(j.cursor.move(-999,e*-1))}render(){let e=A(this._render(this)??``,process.stdout.columns,{hard:!0,trim:!1});if(e!==this._prevFrame){if(this.state===`initial`)this.output.write(j.cursor.hide);else{let t=
|
|
12
|
+
`).length-1;this.output.write(j.cursor.move(-999,e*-1))}render(){let e=A(this._render(this)??``,process.stdout.columns,{hard:!0,trim:!1});if(e!==this._prevFrame){if(this.state===`initial`)this.output.write(j.cursor.hide);else{let t=pe(this._prevFrame,e),n=ge(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(j.cursor.move(0,a-i)),this.output.write(j.erase.lines(1));let t=e.split(`
|
|
13
13
|
`);this.output.write(t[a]),this._prevFrame=e,this.output.write(j.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(j.cursor.move(0,e))}this.output.write(j.erase.down());let t=e.split(`
|
|
14
14
|
`).slice(a);this.output.write(t.join(`
|
|
15
|
-
`)),this._prevFrame=e;return}}this.output.write(j.erase.down())}this.output.write(e),this.state===`initial`&&(this.state=`active`),this._prevFrame=e}}};var
|
|
16
|
-
`);_.push(i),v+=i.length}if(v>
|
|
15
|
+
`)),this._prevFrame=e;return}}this.output.write(j.erase.down())}this.output.write(e),this.state===`initial`&&(this.state=`active`),this._prevFrame=e}}};var _e=class extends B{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(j.cursor.move(0,-1)),this.value=e,this.state=`submit`,this.close()}),this.on(`cursor`,()=>{this.value=!this.value})}},ve=class extends B{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?M(n,1,this.options):n,this.changeValue(),this.on(`cursor`,e=>{switch(e){case`left`:case`up`:this.cursor=M(this.cursor,-1,this.options);break;case`down`:case`right`:this.cursor=M(this.cursor,1,this.options);break}this.changeValue()})}},ye=class extends B{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,l.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 be(){return u.default.platform===`win32`?!!u.default.env.CI||!!u.default.env.WT_SESSION||!!u.default.env.TERMINUS_SUBLIME||u.default.env.ConEmuTask===`{cmd::Cmder}`||u.default.env.TERM_PROGRAM===`Terminus-Sublime`||u.default.env.TERM_PROGRAM===`vscode`||u.default.env.TERM===`xterm-256color`||u.default.env.TERM===`alacritty`||u.default.env.TERMINAL_EMULATOR===`JetBrains-JediTerm`:u.default.env.TERM!==`linux`}const V=be(),xe=()=>process.env.CI===`true`,H=(e,t)=>V?e:t,Se=H(`◆`,`*`),Ce=H(`■`,`x`),we=H(`▲`,`x`),U=H(`◇`,`o`),W=H(`│`,`|`),G=H(`└`,`—`),Te=H(`●`,`>`),K=H(`○`,` `),Ee=H(`─`,`-`),De=H(`╮`,`+`),Oe=H(`├`,`+`),ke=H(`╯`,`+`),Ae=H(`╰`,`+`),je=H(`●`,`•`),Me=H(`◆`,`*`),Ne=H(`▲`,`!`),Pe=H(`■`,`x`),Fe=e=>{switch(e){case`initial`:case`active`:return(0,l.styleText)(`cyan`,Se);case`cancel`:return(0,l.styleText)(`red`,Ce);case`error`:return(0,l.styleText)(`yellow`,we);case`submit`:return(0,l.styleText)(`green`,U)}},Ie=e=>{switch(e){case`initial`:case`active`:return(0,l.styleText)(`cyan`,W);case`cancel`:return(0,l.styleText)(`red`,W);case`error`:return(0,l.styleText)(`yellow`,W);case`submit`:return(0,l.styleText)(`green`,W)}},Le=(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}},Re=({cursor:e,options:t,style:n,output:r=process.stdout,maxItems:i=1/0,columnPadding:a=0,rowPadding:o=4})=>{let s=R(r)-a,c=ge(r),u=(0,l.styleText)(`dim`,`...`),d=Math.max(c-o,0),f=Math.max(Math.min(i,d),5),p=0;e>=f-3&&(p=Math.max(Math.min(e-f+3,t.length-f),0));let m=f<t.length&&p>0,h=f<t.length&&p+f<t.length,g=Math.min(p+f,t.length),_=[],v=0;m&&v++,h&&v++;let y=p+ +!!m,b=g-+!!h;for(let r=y;r<b;r++){let i=A(n(t[r],r===e),s,{hard:!0,trim:!1}).split(`
|
|
16
|
+
`);_.push(i),v+=i.length}if(v>d){let t=0,n=0,r=v,i=e-y,a=(e,t)=>Le(_,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},q=e=>{let t=e.active??`Yes`,n=e.inactive??`No`;return new _e({active:t,inactive:n,signal:e.signal,input:e.input,output:e.output,initialValue:e.initialValue??!0,render(){let r=e.withGuide??N.withGuide,i=`${Fe(this.state)} `,a=r?`${(0,l.styleText)(`gray`,W)} `:``,o=z(e.output,e.message,a,i),s=`${r?`${(0,l.styleText)(`gray`,W)}
|
|
17
17
|
`:``}${o}
|
|
18
|
-
`,c=this.value?t:n;switch(this.state){case`submit`:return`${s}${r?`${(0,
|
|
19
|
-
${(0,
|
|
20
|
-
${(0,
|
|
21
|
-
`:` ${(0,
|
|
18
|
+
`,c=this.value?t:n;switch(this.state){case`submit`:return`${s}${r?`${(0,l.styleText)(`gray`,W)} `:``}${(0,l.styleText)(`dim`,c)}`;case`cancel`:return`${s}${r?`${(0,l.styleText)(`gray`,W)} `:``}${(0,l.styleText)([`strikethrough`,`dim`],c)}${r?`
|
|
19
|
+
${(0,l.styleText)(`gray`,W)}`:``}`;default:{let i=r?`${(0,l.styleText)(`cyan`,W)} `:``,a=r?(0,l.styleText)(`cyan`,G):``;return`${s}${i}${this.value?`${(0,l.styleText)(`green`,Te)} ${t}`:`${(0,l.styleText)(`dim`,K)} ${(0,l.styleText)(`dim`,t)}`}${e.vertical?r?`
|
|
20
|
+
${(0,l.styleText)(`cyan`,W)} `:`
|
|
21
|
+
`:` ${(0,l.styleText)(`dim`,`/`)} `}${this.value?`${(0,l.styleText)(`dim`,K)} ${(0,l.styleText)(`dim`,n)}`:`${(0,l.styleText)(`green`,Te)} ${n}`}
|
|
22
22
|
${a}
|
|
23
|
-
`}}}}).prompt()},
|
|
24
|
-
`);if(f.length>0){let[e,...r]=f;e.length>0?o.push(`${
|
|
23
|
+
`}}}}).prompt()},ze=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`&&I(a)){n[i]=`canceled`,t.onCancel({results:n});continue}n[i]=a}return n},J={message:(e=[],{symbol:t=(0,l.styleText)(`gray`,W),secondarySymbol:n=(0,l.styleText)(`gray`,W),output:r=process.stdout,spacing:i=1,withGuide:a}={})=>{let o=[],s=a??N.withGuide,c=s?n:``,u=s?`${t} `:``,d=s?`${n} `:``;for(let e=0;e<i;e++)o.push(c);let f=Array.isArray(e)?e:e.split(`
|
|
24
|
+
`);if(f.length>0){let[e,...r]=f;e.length>0?o.push(`${u}${e}`):o.push(s?t:``);for(let e of r)e.length>0?o.push(`${d}${e}`):o.push(s?n:``)}r.write(`${o.join(`
|
|
25
25
|
`)}
|
|
26
|
-
`)},info:(e,t)=>{J.message(e,{...t,symbol:(0,
|
|
26
|
+
`)},info:(e,t)=>{J.message(e,{...t,symbol:(0,l.styleText)(`blue`,je)})},success:(e,t)=>{J.message(e,{...t,symbol:(0,l.styleText)(`green`,Me)})},step:(e,t)=>{J.message(e,{...t,symbol:(0,l.styleText)(`green`,U)})},warn:(e,t)=>{J.message(e,{...t,symbol:(0,l.styleText)(`yellow`,Ne)})},warning:(e,t)=>{J.warn(e,t)},error:(e,t)=>{J.message(e,{...t,symbol:(0,l.styleText)(`red`,Pe)})}},Y=(e=``,t)=>{let n=t?.output??process.stdout,r=t?.withGuide??N.withGuide?`${(0,l.styleText)(`gray`,G)} `:``;n.write(`${r}${(0,l.styleText)(`red`,e)}
|
|
27
27
|
|
|
28
|
-
`)},
|
|
29
|
-
${(0,
|
|
28
|
+
`)},Be=(e=``,t)=>{let n=t?.output??process.stdout,r=t?.withGuide??N.withGuide?`${(0,l.styleText)(`gray`,W)}
|
|
29
|
+
${(0,l.styleText)(`gray`,G)} `:``;n.write(`${r}${e}
|
|
30
30
|
|
|
31
|
-
`)},
|
|
31
|
+
`)},Ve=e=>(0,l.styleText)(`dim`,e),He=(e,t,n)=>{let r={hard:!0,trim:!1},i=A(e,t,r).split(`
|
|
32
|
+
`),a=i.reduce((e,t)=>Math.max(D(t),e),0);return A(e,t-(i.map(n).reduce((e,t)=>Math.max(D(t),e),0)-a),r)},Ue=(e=``,t=``,n)=>{let r=n?.output??u.default.stdout,i=n?.withGuide??N.withGuide,a=n?.format??Ve,o=[``,...He(e,R(r)-6,a).split(`
|
|
33
|
+
`).map(a),``],s=D(t),c=Math.max(o.reduce((e,t)=>{let n=D(t);return n>e?n:e},0),s)+2,d=o.map(e=>`${(0,l.styleText)(`gray`,W)} ${e}${` `.repeat(c-D(e))}${(0,l.styleText)(`gray`,W)}`).join(`
|
|
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)}
|
|
36
|
+
${d}
|
|
37
|
+
${(0,l.styleText)(`gray`,p+Ee.repeat(c+2)+ke)}
|
|
38
|
+
`)},We=e=>(0,l.styleText)(`magenta`,e),Ge=({indicator:e=`dots`,onCancel:t,output:n=process.stdout,cancelMessage:r,errorMessage:i,frames:a=V?[`◒`,`◐`,`◓`,`◑`]:[`•`,`o`,`O`,`0`],delay:o=V?80:120,signal:s,...c}={})=>{let u=xe(),d,f,p=!1,m=!1,h=``,g,_=performance.now(),v=R(n),y=c?.styleFrame??We,b=e=>{let n=e>1?i??N.messages.error:r??N.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),s&&s.addEventListener(`abort`,S)},te=()=>{process.removeListener(`uncaughtExceptionMonitor`,x),process.removeListener(`unhandledRejection`,x),process.removeListener(`SIGINT`,S),process.removeListener(`SIGTERM`,S),process.removeListener(`exit`,b),s&&s.removeEventListener(`abort`,S)},C=()=>{if(g===void 0)return;u&&n.write(`
|
|
32
39
|
`);let e=A(g,v,{hard:!0,trim:!1}).split(`
|
|
33
|
-
`);e.length>1&&n.write(j.cursor.up(e.length-1)),n.write(j.cursor.to(0)),n.write(j.erase.down())},
|
|
34
|
-
`);let r=0,i=0;ee(),f=setInterval(()=>{if(
|
|
40
|
+
`);e.length>1&&n.write(j.cursor.up(e.length-1)),n.write(j.cursor.to(0)),n.write(j.erase.down())},ne=e=>e.replace(/\.+$/,``),w=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]`},re=c.withGuide??N.withGuide,ie=(t=``)=>{p=!0,d=he({output:n}),h=ne(t),_=performance.now(),re&&n.write(`${(0,l.styleText)(`gray`,W)}
|
|
41
|
+
`);let r=0,i=0;ee(),f=setInterval(()=>{if(u&&h===g)return;C(),g=h;let t=y(a[r]),o;if(u)o=`${t} ${h}...`;else if(e===`timer`)o=`${t} ${h} ${w(_)}`;else{let e=`.`.repeat(Math.floor(i)).slice(0,3);o=`${t} ${h}${e}`}let s=A(o,v,{hard:!0,trim:!1});n.write(s),r=r+1<a.length?r+1:0,i=i<4?i+.125:0},o)},T=(t=``,r=0,i=!1)=>{if(!p)return;p=!1,clearInterval(f),C();let a=r===0?(0,l.styleText)(`green`,U):r===1?(0,l.styleText)(`red`,Ce):(0,l.styleText)(`red`,we);h=t??h,i||(e===`timer`?n.write(`${a} ${h} ${w(_)}
|
|
35
42
|
`):n.write(`${a} ${h}
|
|
36
|
-
`)),
|
|
43
|
+
`)),te(),d()};return{start:ie,stop:(e=``)=>T(e,0),message:(e=``)=>{h=ne(e??h)},cancel:(e=``)=>T(e,1),error:(e=``)=>T(e,2),clear:()=>T(``,0,!0),get isCancelled(){return m}}},X=(e,t)=>e.includes(`
|
|
37
44
|
`)?e.split(`
|
|
38
45
|
`).map(e=>t(e)).join(`
|
|
39
|
-
`):t(e),
|
|
46
|
+
`):t(e),Ke=e=>{let t=(e,t)=>{let n=e.label??String(e.value);switch(t){case`disabled`:return`${(0,l.styleText)(`gray`,K)} ${X(n,e=>(0,l.styleText)(`gray`,e))}${e.hint?` ${(0,l.styleText)(`dim`,`(${e.hint??`disabled`})`)}`:``}`;case`selected`:return`${X(n,e=>(0,l.styleText)(`dim`,e))}`;case`active`:return`${(0,l.styleText)(`green`,Te)} ${n}${e.hint?` ${(0,l.styleText)(`dim`,`(${e.hint})`)}`:``}`;case`cancelled`:return`${X(n,e=>(0,l.styleText)([`strikethrough`,`dim`],e))}`;default:return`${(0,l.styleText)(`dim`,K)} ${X(n,e=>(0,l.styleText)(`dim`,e))}`}};return new ve({options:e.options,signal:e.signal,input:e.input,output:e.output,initialValue:e.initialValue,render(){let n=e.withGuide??N.withGuide,r=`${Fe(this.state)} `,i=`${Ie(this.state)} `,a=z(e.output,e.message,i,r),o=`${n?`${(0,l.styleText)(`gray`,W)}
|
|
40
47
|
`:``}${a}
|
|
41
|
-
`;switch(this.state){case`submit`:{let r=n?`${(0,
|
|
42
|
-
${(0,
|
|
43
|
-
`).length,s=n?2:1;return`${o}${r}${
|
|
48
|
+
`;switch(this.state){case`submit`:{let r=n?`${(0,l.styleText)(`gray`,W)} `:``;return`${o}${z(e.output,t(this.options[this.cursor],`selected`),r)}`}case`cancel`:{let r=n?`${(0,l.styleText)(`gray`,W)} `:``;return`${o}${z(e.output,t(this.options[this.cursor],`cancelled`),r)}${n?`
|
|
49
|
+
${(0,l.styleText)(`gray`,W)}`:``}`}default:{let r=n?`${(0,l.styleText)(`cyan`,W)} `:``,i=n?(0,l.styleText)(`cyan`,G):``,a=o.split(`
|
|
50
|
+
`).length,s=n?2:1;return`${o}${r}${Re({output:e.output,cursor:this.cursor,options:this.options,maxItems:e.maxItems,columnPadding:r.length,rowPadding:a+s,style:(e,n)=>t(e,e.disabled?`disabled`:n?`active`:`inactive`)}).join(`
|
|
44
51
|
${r}`)}
|
|
45
52
|
${i}
|
|
46
|
-
`}}}}).prompt()},
|
|
53
|
+
`}}}}).prompt()},qe=`${(0,l.styleText)(`gray`,W)} `,Z={message:async(e,{symbol:t=(0,l.styleText)(`gray`,W)}={})=>{process.stdout.write(`${(0,l.styleText)(`gray`,W)}
|
|
47
54
|
${t} `);let n=3;for await(let t of e){t=t.replace(/\n/g,`
|
|
48
|
-
${
|
|
49
|
-
`)&&(n=3+(0,
|
|
50
|
-
`))).length);let e=(0,
|
|
51
|
-
${
|
|
52
|
-
`)},info:e=>Z.message(e,{symbol:(0,
|
|
53
|
-
`:``}${
|
|
54
|
-
`,r=e.placeholder?(0,
|
|
55
|
+
${qe}`),t.includes(`
|
|
56
|
+
`)&&(n=3+(0,l.stripVTControlCharacters)(t.slice(t.lastIndexOf(`
|
|
57
|
+
`))).length);let e=(0,l.stripVTControlCharacters)(t).length;n+e<process.stdout.columns?(n+=e,process.stdout.write(t)):(process.stdout.write(`
|
|
58
|
+
${qe}${t.trimStart()}`),n=3+(0,l.stripVTControlCharacters)(t.trimStart()).length)}process.stdout.write(`
|
|
59
|
+
`)},info:e=>Z.message(e,{symbol:(0,l.styleText)(`blue`,je)}),success:e=>Z.message(e,{symbol:(0,l.styleText)(`green`,Me)}),step:e=>Z.message(e,{symbol:(0,l.styleText)(`green`,U)}),warn:e=>Z.message(e,{symbol:(0,l.styleText)(`yellow`,Ne)}),warning:e=>Z.warn(e),error:e=>Z.message(e,{symbol:(0,l.styleText)(`red`,Pe)})},Je=e=>new ye({validate:e.validate,placeholder:e.placeholder,defaultValue:e.defaultValue,initialValue:e.initialValue,output:e.output,signal:e.signal,input:e.input,render(){let t=e?.withGuide??N.withGuide,n=`${`${t?`${(0,l.styleText)(`gray`,W)}
|
|
60
|
+
`:``}${Fe(this.state)} `}${e.message}
|
|
61
|
+
`,r=e.placeholder?(0,l.styleText)(`inverse`,e.placeholder[0])+(0,l.styleText)(`dim`,e.placeholder.slice(1)):(0,l.styleText)([`inverse`,`hidden`],`_`),i=this.userInput?this.userInputWithCursor:r,a=this.value??``;switch(this.state){case`error`:{let e=this.error?` ${(0,l.styleText)(`yellow`,this.error)}`:``,r=t?`${(0,l.styleText)(`yellow`,W)} `:``,a=t?(0,l.styleText)(`yellow`,G):``;return`${n.trim()}
|
|
55
62
|
${r}${i}
|
|
56
63
|
${a}${e}
|
|
57
|
-
`}case`submit`:{let e=a?` ${(0,
|
|
58
|
-
${r}`:``}`}default:return`${n}${t?`${(0,
|
|
59
|
-
${t?(0,
|
|
60
|
-
`}}}).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),
|
|
61
|
-
|
|
64
|
+
`}case`submit`:{let e=a?` ${(0,l.styleText)(`dim`,a)}`:``;return`${n}${t?(0,l.styleText)(`gray`,W):``}${e}`}case`cancel`:{let e=a?` ${(0,l.styleText)([`strikethrough`,`dim`],a)}`:``,r=t?(0,l.styleText)(`gray`,W):``;return`${n}${r}${e}${a.trim()?`
|
|
65
|
+
${r}`:``}`}default:return`${n}${t?`${(0,l.styleText)(`cyan`,W)} `:``}${i}
|
|
66
|
+
${t?(0,l.styleText)(`cyan`,G):``}
|
|
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.5`,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,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};else return{success:!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}}catch(t){let n=t instanceof Error?t.message:String(t);return{success:!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
|
+
[preload]
|
|
69
|
+
preload = ["./bun.setup.ts"]
|
|
70
|
+
`}:e?.endsWith(`bun.setup.ts`)||e?.endsWith(`bun.setup.js`)?{success:!0,instructions:g.default`
|
|
71
|
+
import arkenv from "@arkenv/bun-plugin";
|
|
62
72
|
|
|
63
|
-
|
|
64
|
-
|
|
73
|
+
Bun.build({
|
|
74
|
+
// ... other config
|
|
75
|
+
plugins: [arkenv],
|
|
76
|
+
});
|
|
77
|
+
`}:{success:!0,instructions:g.default`
|
|
78
|
+
To complete Bun integration, add the following to your setup/preload file:
|
|
79
|
+
|
|
80
|
+
import arkenv from "@arkenv/bun-plugin";
|
|
81
|
+
|
|
82
|
+
Bun.build({
|
|
83
|
+
// ... other config
|
|
84
|
+
plugins: [arkenv],
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
If you don't have a setup file, create one (e.g., bun.setup.ts) and add it to your bunfig.toml:
|
|
88
|
+
|
|
89
|
+
[preload]
|
|
90
|
+
preload = ["./bun.setup.ts"]
|
|
91
|
+
`}}function it(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 at(){let e=m.default.join(process.cwd(),`.env.example`);try{let t=it(await _.default.readFile(e,`utf-8`));return t.length>0?t:null}catch{return null}}const $=e=>Q.default.cyan(e),ot=Q.default.blue(`⛯`);async function st(e,t=!1,n=!1){let r=await at();if(t)return{path:`./src/env.ts`,validator:`arktype`,framework:e?.framework||`node`,language:`ts`,overwrite:!0,envKeys:r||void 0,installSkill:!1};let i=await ze({overwrite:async()=>{let e=`./src/env.ts`;if(p.default.existsSync(m.default.resolve(process.cwd(),e))){let t=await q({message:Q.default.yellow(`An existing ArkEnv configuration was found at ${$(e)}. Do you want to overwrite it?`),initialValue:!1,active:`Yes (override my configuration)`,inactive:`No (abort)`});return I(t)&&(Y(`Operation cancelled.`),process.exit(0)),t||(Y(`Operation cancelled.`),process.exit(0)),t}return!0},framework:()=>Ke({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)`:``}`}]}),validator:()=>Ke({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`}]}),useEnvExample:async()=>r?q({message:`Detected ${Q.default.cyan(`.env.example`)} with ${r.length} keys. Use them for your schema?`,active:`Yes (Recommended)`,initialValue:!0}):!1,useDefaultPath:()=>q({message:`Use default config path (./src/env.ts)?`,initialValue:!0,active:`Yes (Recommended)`,inactive:`No, let me customize it`}),path:({results:e})=>{if(!e.useDefaultPath)return Je({message:`Where should we create the ArkEnv config?`,placeholder:`./src/env.ts`,initialValue:`./src/env.ts`})},installSkill:()=>{if(!n)return q({message:`Would you like to install the ArkEnv agent skill?`,initialValue:!0,active:`Yes (Recommended)`,inactive:`No`})}},{onCancel:()=>{Y(`Operation cancelled.`),process.exit(0)}});return I(i)&&(Y(`Operation cancelled.`),process.exit(0)),{path:i.path||`./src/env.ts`,validator:i.validator,framework:i.framework,language:`ts`,overwrite:i.overwrite,envKeys:i.useEnvExample?r:void 0,installSkill:i.installSkill}}const ct=(e,t)=>{let n=e?.length?e.map(e=>`\t\t${e}: "string",`).join(`
|
|
65
92
|
`):` NODE_ENV: "'development' | 'production' | 'test'",
|
|
66
|
-
PORT: "number.port"
|
|
93
|
+
PORT: "number.port",`;return t===`vite`?g.default`
|
|
94
|
+
import { type } from "arkenv";
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Environment variable schema.
|
|
98
|
+
* In Vite, use \`@arkenv/vite-plugin\` to validate these at build-time
|
|
99
|
+
* and provide typesafety for \`import.meta.env\`.
|
|
100
|
+
*/
|
|
101
|
+
export const Env = type({
|
|
102
|
+
${n}
|
|
103
|
+
});
|
|
104
|
+
`:t===`bun`?g.default`
|
|
105
|
+
import { type } from "arkenv";
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Environment variable schema.
|
|
109
|
+
* In Bun, use \`@arkenv/bun-plugin\` to validate these at build-time
|
|
110
|
+
* and provide typesafety for \`process.env\`.
|
|
111
|
+
*/
|
|
112
|
+
export const Env = type({
|
|
113
|
+
${n}
|
|
114
|
+
});
|
|
115
|
+
`:g.default`
|
|
116
|
+
import arkenv, { type } from "arkenv";
|
|
117
|
+
|
|
118
|
+
export const Env = type({
|
|
119
|
+
${n}
|
|
67
120
|
});
|
|
68
121
|
|
|
69
122
|
export const env = arkenv(Env);
|
|
70
|
-
|
|
123
|
+
`},lt=(e,t)=>{let n=e?.length?e.map(e=>`\t\t${e}: v.string(),`).join(`
|
|
124
|
+
`):` NODE_ENV: v.picklist(["development", "production", "test"]),
|
|
125
|
+
PORT: v.pipe(v.string(), v.transform(Number), v.number(), v.integer(), v.minValue(1), v.maxValue(65535)),`;return t===`vite`?g.default`
|
|
126
|
+
import * as v from "valibot";
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Environment variable schema.
|
|
130
|
+
* In Vite, use \`@arkenv/vite-plugin\` to validate these at build-time
|
|
131
|
+
* and provide typesafety for \`import.meta.env\`.
|
|
132
|
+
*/
|
|
133
|
+
export const Env = v.object({
|
|
134
|
+
${n}
|
|
135
|
+
});
|
|
136
|
+
`:t===`bun`?g.default`
|
|
137
|
+
import * as v from "valibot";
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Environment variable schema.
|
|
141
|
+
* In Bun, use \`@arkenv/bun-plugin\` to validate these at build-time
|
|
142
|
+
* and provide typesafety for \`process.env\`.
|
|
143
|
+
*/
|
|
144
|
+
export const Env = v.object({
|
|
145
|
+
${n}
|
|
146
|
+
});
|
|
147
|
+
`:g.default`
|
|
71
148
|
import arkenv from "arkenv/standard";
|
|
72
149
|
import * as v from "valibot";
|
|
73
150
|
|
|
74
|
-
const Env = v.object({
|
|
75
|
-
${
|
|
76
|
-
`):` NODE_ENV: v.picklist(["development", "production", "test"]),
|
|
77
|
-
PORT: v.pipe(v.string(), v.transform(Number), v.number(), v.minValue(1)),`}
|
|
151
|
+
export const Env = v.object({
|
|
152
|
+
${n}
|
|
78
153
|
});
|
|
79
154
|
|
|
80
155
|
export const env = arkenv(Env);
|
|
81
|
-
|
|
156
|
+
`},ut=(e,t)=>{let n=e?.length?e.map(e=>`\t\t${e}: z.string(),`).join(`
|
|
157
|
+
`):` NODE_ENV: z.enum(["development", "production", "test"]),
|
|
158
|
+
PORT: z.coerce.number().int().min(1).max(65535),`;return t===`vite`?g.default`
|
|
159
|
+
import { z } from "zod";
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Environment variable schema.
|
|
163
|
+
* In Vite, use \`@arkenv/vite-plugin\` to validate these at build-time
|
|
164
|
+
* and provide typesafety for \`import.meta.env\`.
|
|
165
|
+
*/
|
|
166
|
+
export const Env = z.object({
|
|
167
|
+
${n}
|
|
168
|
+
});
|
|
169
|
+
`:t===`bun`?g.default`
|
|
170
|
+
import { z } from "zod";
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Environment variable schema.
|
|
174
|
+
* In Bun, use \`@arkenv/bun-plugin\` to validate these at build-time
|
|
175
|
+
* and provide typesafety for \`process.env\`.
|
|
176
|
+
*/
|
|
177
|
+
export const Env = z.object({
|
|
178
|
+
${n}
|
|
179
|
+
});
|
|
180
|
+
`:g.default`
|
|
82
181
|
import arkenv from "arkenv/standard";
|
|
83
182
|
import { z } from "zod";
|
|
84
183
|
|
|
85
|
-
const Env = z.object({
|
|
86
|
-
${
|
|
87
|
-
`):` NODE_ENV: z.enum(["development", "production", "test"]),
|
|
88
|
-
PORT: z.coerce.number().positive(),`}
|
|
184
|
+
export const Env = z.object({
|
|
185
|
+
${n}
|
|
89
186
|
});
|
|
90
187
|
|
|
91
188
|
export const env = arkenv(Env);
|
|
92
|
-
|
|
93
|
-
`;case`zod`:return
|
|
94
|
-
`;case`valibot`:return
|
|
95
|
-
`;default:throw Error(`Unsupported validator: ${t}`)}}async function
|
|
96
|
-
|
|
97
|
-
|
|
189
|
+
`};function dt(e){let{validator:t,envKeys:n,framework:r}=e;switch(t){case`arktype`:return ct(n,r)+`
|
|
190
|
+
`;case`zod`:return ut(n,r)+`
|
|
191
|
+
`;case`valibot`:return lt(n,r)+`
|
|
192
|
+
`;default:throw Error(`Unsupported validator: ${t}`)}}async function ft(e){let t=m.default.resolve(process.cwd(),e.path),n=m.default.dirname(t);await _.default.mkdir(n,{recursive:!0});let r=await vt(),i=[`arkenv`,e.validator];e.framework===`vite`&&i.push(`@arkenv/vite-plugin`),e.framework===`bun`&&i.push(`@arkenv/bun-plugin`);let a=yt(r,i),o=dt(e);if((0,p.existsSync)(t)){if(e.overwrite===!1)return{tsConfigResult:{status:`already_strict`},packageManager:r,installCmd:void 0};if(e.overwrite===void 0){let e=await q({message:`File ${m.default.basename(t)} already exists. Overwrite?`,initialValue:!1});if(I(e)&&(Y(`Operation cancelled.`),process.exit(0)),!e)return{tsConfigResult:{status:`already_strict`},packageManager:r,installCmd:void 0}}await _.default.writeFile(t,o,`utf-8`)}else await _.default.writeFile(t,o,`utf-8`);let s={status:`already_strict`};return e.shouldUpdateTsConfig&&(s=await gt()),{tsConfigResult:s,installCmd:a,packageManager:r}}function pt(e){switch(e){case`pnpm`:return`pnpm dlx`;case`yarn`:return`yarn dlx`;case`bun`:return`bunx`;default:return`npx`}}async function mt(){let e=[`tsconfig.app.json`,`tsconfig.json`,`tsconfig.base.json`,`tsconfig.node.json`],t=process.cwd();for(;t!==m.default.parse(t).root;){for(let n of e){let e=m.default.join(t,n);try{return await _.default.access(e),e}catch{}}t=m.default.dirname(t)}return null}async function ht(){let e=await mt();if(!e)return{status:`not_found`};let t=m.default.basename(e);try{return(0,y.parse)(await _.default.readFile(e,`utf-8`))?.compilerOptions?.strict===!0?{status:`strict`,file:t}:{status:`not_strict`,file:t}}catch{return{status:`not_found`}}}async function gt(){let e=await mt();if(!e)return{status:`not_found`};let t=m.default.basename(e);try{let n=await _.default.readFile(e,`utf-8`);if((0,y.parse)(n)?.compilerOptions?.strict===!0)return{status:`already_strict`,file:t};let r=(0,y.applyEdits)(n,(0,y.modify)(n,[`compilerOptions`,`strict`],!0,{formattingOptions:{insertSpaces:!0,tabSize:2}}));return await _.default.writeFile(e,r,`utf-8`),{status:`updated`,file:t}}catch{return{status:`error`,file:t}}}async function _t(){try{let e=m.default.join(process.cwd(),`package.json`),t=await _.default.readFile(e,`utf-8`),n=JSON.parse(t),r={...n.dependencies,...n.devDependencies};if(r.vite)return`vite`;if(r[`@types/bun`]||r.bun)return`bun`}catch{}try{return await _.default.access(m.default.join(process.cwd(),`vite.config.ts`)),`vite`}catch{}try{return await _.default.access(m.default.join(process.cwd(),`vite.config.js`)),`vite`}catch{}return`bun`in process.versions?`bun`:`node`}async function vt(){let e=process.env.npm_config_user_agent?.toString()||``;if(e.includes(`pnpm`))return`pnpm`;if(e.includes(`yarn`))return`yarn`;if(e.includes(`bun`))return`bun`;if(e.includes(`npm`))return`npm`;let t=process.cwd();for(;t!==m.default.parse(t).root;){try{let e=m.default.join(t,`package.json`),n=await _.default.readFile(e,`utf-8`),r=JSON.parse(n);if(r.packageManager){if(r.packageManager.startsWith(`pnpm`))return`pnpm`;if(r.packageManager.startsWith(`yarn`))return`yarn`;if(r.packageManager.startsWith(`bun`))return`bun`}}catch{}let e=await _.default.readdir(t);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`;t=m.default.dirname(t)}return`npm`}function yt(e,t){switch(e){case`pnpm`:return`pnpm add ${t.join(` `)}`;case`yarn`:return`yarn add ${t.join(` `)}`;case`bun`:return`bun add ${t.join(` `)}`;default:return`npm install ${t.join(` `)}`}}var bt=class{constructor(e){this.cli=e}async run(){let{logger:e,isYes:t}=this.cli;e.interactiveStdout(!0);let n=!1,r=null;try{let i=await ht();if(i.status===`not_strict`)if(t)n=!0;else{e.warn(`TypeScript strict mode is not enabled in your ${$(i.file)}.`);let t=await q({message:`ArkEnv requires ${Q.default.dim(`strict`)} mode in your ${$(i.file)}. Would you like to enable it now?`,initialValue:!0,active:`Yes (Recommended)`,inactive:`No`});I(t)&&e.cancel(`Operation cancelled.`),t&&(n=!0)}r=await st({framework:await _t()},t,this.cli.isAgent)}finally{e.interactiveStdout(!1)}if(!r){e.cancel(`Operation cancelled.`);return}let i=e.spinner();i.start(`Scaffolding ArkEnv configuration...`);try{let{tsConfigResult:t,installCmd:a,packageManager:o}=await ft({...r,shouldUpdateTsConfig:n});i.stop(`Configuration scaffolded!`),a&&process.env.SKIP_INSTALL!==`true`&&(e.step(`Installing dependencies with ${o}...`),await this.execute(a)),t.status===`updated`?e.info(`Enforced strict: true in your ${$(t.file)}`):t.status===`error`&&e.warn(`Could not automatically update ${$(t.file||`tsconfig.json`)}. Please ensure 'strict: true' is set manually.`);let s=m.default.relative(process.cwd(),m.default.resolve(r.path)),c=s.startsWith(`.`)?s:`./${s}`,l=c.replace(/\.(ts|js|tsx|jsx)$/,``);if(r.framework===`vite`){let t=await et();if(t){e.step(`Bootstrapping Vite plugin...`);let n=await nt(t,l);n.success?e.info(`Updated ${$(m.default.basename(t))}`):(e.warn(`Could not automatically update ${$(m.default.basename(t))}: ${n.error}`),e.info(`Please add '@arkenv/vite-plugin' manually.`))}else e.info(`No Vite config found — please add '@arkenv/vite-plugin' to your Vite config manually.`)}else if(r.framework===`bun`){let t=await rt(await tt());t.success&&t.instructions?e.info(t.instructions):t.success||e.error(t.error||`Bun bootstrap failed`)}let u=pt(o),d=this.cli.isYes?` --yes`:``,f=!1;if(r.installSkill&&process.env.SKIP_INSTALL!==`true`){e.step(`Installing ArkEnv agent skill...`);try{await this.execute(`${u} skills add yamcodes/arkenv${d}`),f=!0}catch(t){e.warn(`Failed to install ArkEnv AI skill: ${t.message}`)}}f?e.note(g.default`
|
|
193
|
+
Inside your AI assistant (e.g. Claude Code), use:
|
|
194
|
+
${Q.default.cyan(`/arkenv`)} - automatically refine your schema and configure integrations.
|
|
195
|
+
`,`Next steps`):e.note(g.default`
|
|
196
|
+
1. Check ${$(c)} and refine your environment schema.
|
|
197
|
+
2. Import and use: ${$(`import { env } from "${l}"`)}
|
|
198
|
+
3. (Recommended) Install the AI skill: ${$(`${u} skills add yamcodes/arkenv`)}
|
|
199
|
+
Then run ${Q.default.cyan(`/arkenv`)} inside your AI assistant to finish.
|
|
200
|
+
`,`Next steps`),e.finish(`${ot} ArkEnv scaffolding complete. ${Q.default.dim(`Happy coding!`)}`,{path:c,framework:r.framework,validator:r.validator,packageManager:o,tsConfigUpdated:t.status===`updated`,skillInstalled:f})}catch(t){i.stop(`Scaffolding failed.`),e.fatal(`Scaffolding failed.`,t)}}async execute(e){let{logger:t,isQuiet:n}=this.cli,r=n?`pipe`:t.stdio;return new Promise((t,i)=>{let a=(0,h.spawn)(e,[],{stdio:r,shell:!0}),o=``,s=``,c=1e4;n&&(a.stdout?.on(`data`,e=>{o=(o+e.toString()).slice(-c)}),a.stderr?.on(`data`,e=>{s=(s+e.toString()).slice(-c)})),a.on(`close`,(e,r)=>{if(e===0)t();else{let t=e===null?`Command terminated by signal ${r}`:`Command failed with code ${e}`;n&&(o&&(t+=`\n${Q.default.dim(`STDOUT:`)}\n${o}`),s&&(t+=`\n${Q.default.red(`STDERR:`)}\n${s}`)),i(Error(t))}}),a.on(`error`,i)})}};async function xt(){let e=new Xe(process.argv);e.helpRequested&&(await new Qe(e).run(),process.exit(0)),e.command!==`init`&&(e.command?e.logger.error(`Unknown command: ${e.command}`):e.logger.error(`Missing command.`),await new Qe(e).run(),process.exit(1));try{await new bt(e).run()}catch(t){e.logger.fatal(`An unexpected error occurred`,t)}}xt(),process.on(`unhandledRejection`,e=>{new Xe(process.argv).logger.fatal(`Unhandled rejection`,e)});
|
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.5",
|
|
5
5
|
"description": "Interactive CLI for scaffolding ArkEnv projects",
|
|
6
6
|
"bin": {
|
|
7
7
|
"arkenv": "./dist/index.cjs"
|
|
@@ -37,6 +37,7 @@
|
|
|
37
37
|
"@clack/prompts": "^1.3.0",
|
|
38
38
|
"dedent": "^1.7.2",
|
|
39
39
|
"jsonc-parser": "^3.3.1",
|
|
40
|
+
"magicast": "^0.5.2",
|
|
40
41
|
"picocolors": "^1.1.1"
|
|
41
42
|
},
|
|
42
43
|
"devDependencies": {
|
|
@@ -49,6 +50,7 @@
|
|
|
49
50
|
"start": "node ./dist/index.cjs init",
|
|
50
51
|
"dev": "tsdown --watch",
|
|
51
52
|
"test": "vitest",
|
|
52
|
-
"test:run": "vitest run"
|
|
53
|
+
"test:run": "vitest run",
|
|
54
|
+
"typecheck": "tsc --noEmit"
|
|
53
55
|
}
|
|
54
56
|
}
|