@arkenv/cli 0.0.9 → 0.1.0
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 +2 -2
- package/dist/index.cjs +73 -71
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -21,9 +21,9 @@ 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
|
|
24
|
+
## Architecture & Development
|
|
25
25
|
|
|
26
|
-
This CLI is built with a port-and-adapter architecture to remain flexible and testable.
|
|
26
|
+
This CLI is built with a port-and-adapter architecture to remain flexible and testable. See [ARCHITECTURE.md](./ARCHITECTURE.md) for details on the codebase design, architecture rules, and how to use the interactive testing scripts.
|
|
27
27
|
|
|
28
28
|
### Local Environment Adapters (`Node*`)
|
|
29
29
|
|
package/dist/index.cjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
const e=require(`./chunk-i8uDWG73.cjs`);let t=require(`node:fs/promises`);
|
|
2
|
+
const e=require(`./chunk-i8uDWG73.cjs`);let t=require(`radashi`),n=require(`node:fs/promises`);n=e.r(n,1);let r=require(`node:path`);r=e.r(r,1);let i=require(`dedent`);i=e.r(i,1);let a=require(`node:util`),o=require(`node:process`);o=e.r(o,1);let s=require(`node:readline`);s=e.r(s,1);let c=require(`node:tty`),l=require(`node:fs`);l=e.r(l,1);let u=require(`node:module`),d=require(`jsonc-parser`),f=require(`node:child_process`),p=require(`magicast`);var m=e.n({safeAppend:()=>g});const h=`// @arkenv-types`;async function g(e,t,i){try{let a=await n.default.readFile(e,`utf-8`),o=i===`vite`?`ImportMetaEnvAugmented`:`ProcessEnvAugmented`;if(a.includes(h)||a.includes(o))return!1;let s=r.default.dirname(e),c=r.default.relative(s,t).replace(/\.(ts|js|tsx|jsx)$/,``).split(r.default.sep).join(`/`),l=c.startsWith(`.`)?c:`./${c}`,u=i===`vite`?_(l):v(l),d=a.endsWith(`
|
|
3
3
|
`)?``:`
|
|
4
|
-
`;return await
|
|
4
|
+
`;return await n.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 i.default`
|
|
5
5
|
type ImportMetaEnvAugmented = import("@arkenv/vite-plugin").ImportMetaEnvAugmented<
|
|
6
6
|
typeof import("${e}").Env
|
|
7
7
|
>;
|
|
@@ -11,7 +11,7 @@ const e=require(`./chunk-i8uDWG73.cjs`);let t=require(`node:fs/promises`);t=e.r(
|
|
|
11
11
|
interface ImportMeta {
|
|
12
12
|
readonly env: ImportMetaEnv;
|
|
13
13
|
}
|
|
14
|
-
`}function v(e){return
|
|
14
|
+
`}function v(e){return i.default`
|
|
15
15
|
type ProcessEnvAugmented = import("@arkenv/bun-plugin").ProcessEnvAugmented<
|
|
16
16
|
typeof import("${e}").Env
|
|
17
17
|
>;
|
|
@@ -19,83 +19,85 @@ const e=require(`./chunk-i8uDWG73.cjs`);let t=require(`node:fs/promises`);t=e.r(
|
|
|
19
19
|
declare namespace NodeJS {
|
|
20
20
|
interface ProcessEnv extends ProcessEnvAugmented {}
|
|
21
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,
|
|
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,C=e=>e===8987||e===9001||e>=12272&&e<=12287||e>=12289&&e<=12350||e>=12441&&e<=12543||e>=12549&&e<=12591||e>=12593&&e<=12686||e>=12688&&e<=12771||e>=12783&&e<=12830||e>=12832&&e<=12871||e>=12880&&e<=19903||e>=65040&&e<=65049||e>=65072&&e<=65106||e>=65108&&e<=65126||e>=65128&&e<=65131||e>=127488&&e<=127490||e>=127504&&e<=127547||e>=127552&&e<=127560||e>=131072&&e<=196605||e>=196608&&e<=262141,w=/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]|\u001b\]8;[^;]*;.*?(?:\u0007|\u001b\u005c)/y,ne=/[\x00-\x08\x0A-\x1F\x7F-\x9F]{1,1000}/y,re=/(?:(?![\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],[w,0],[ne,o],[ie,s],[T,c],[re,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:C(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===re?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}`,he=(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())},ge=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(``)},_e=(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(``),he(s,r,t),c=E(s.at(-1)??``);continue}if(c+i>t&&c&&i){if(n.wordWrap===!1&&c<t){he(s,r,t),c=E(s.at(-1)??``);continue}s.push(``),c=0}if(c+i>t&&n.wordWrap===!1){he(s,r,t),c=E(s.at(-1)??``);continue}s[s.length-1]+=r,c+=i}n.trim!==!1&&(s=s.map(e=>ge(e)));let l=s.join(`
|
|
23
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
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},
|
|
26
|
-
`)}var
|
|
25
|
+
`&&(i&&fe(i)&&(r+=pe(i)),a&&(r+=me(a)))}return r},ve=/\r?\n/;function D(e,t,n){return String(e).normalize().split(ve).map(e=>_e(e,t,n)).join(`
|
|
26
|
+
`)}var O=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 k(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?k(a,t<0?-1:1,n):a}const A={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 j(e,t){if(typeof e==`string`)return A.aliases.get(e)===t;for(let n of e)if(n!==void 0&&j(n,t))return!0;return!1}function ye(e,t){if(e===t)return;let n=e.split(`
|
|
27
27
|
`),r=t.split(`
|
|
28
|
-
`),i=Math.max(n.length,r.length),a=[];for(let e=0;e<i;e++)n[e]!==r[e]&&a.push(e);return{lines:a,numLinesBefore:n.length,numLinesAfter:r.length,numLines:i}}const be=globalThis.process.platform.startsWith(`win`),
|
|
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`),M=Symbol(`clack:cancel`);function N(e){return e===M}function P(e,t){let n=e;n.isTTY&&n.setRawMode(t)}function xe({input:e=o.stdin,output:t=o.stdout,overwrite:n=!0,hideCursor:r=!0}={}){let i=s.createInterface({input:e,output:t,prompt:``,tabSize:1});s.emitKeypressEvents(e,i),e instanceof c.ReadStream&&e.isTTY&&e.setRawMode(!0);let a=(i,{name:o,sequence:c})=>{if(j([String(i),o,c],`cancel`)){r&&t.write(O.cursor.show),process.exit(0);return}if(!n)return;let l=o===`return`?0:-1,u=o===`return`?-1:0;s.moveCursor(t,l,u,()=>{s.clearLine(t,1,()=>{e.once(`keypress`,a)})})};return r&&t.write(O.cursor.hide),e.once(`keypress`,a),()=>{e.off(`keypress`,a),r&&t.write(O.cursor.show),e instanceof c.ReadStream&&e.isTTY&&!be&&e.setRawMode(!1),i.terminal=!1,i.close()}}const F=e=>`columns`in e&&typeof e.columns==`number`?e.columns:80,Se=e=>`rows`in e&&typeof e.rows==`number`?e.rows:20;function I(e,t,n,r=n,i){return D(t,F(e??o.stdout)-n.length,{hard:!0,trim:!1}).split(`
|
|
29
29
|
`).map((e,t)=>{let a=i?i(e,t):e;return`${t===0?r:n}${a}`}).join(`
|
|
30
|
-
`)}let
|
|
31
|
-
`),
|
|
32
|
-
`).length-1;this.output.write(
|
|
33
|
-
`);this.output.write(t[a]),this._prevFrame=e,this.output.write(
|
|
30
|
+
`)}let L=class{input;output;_abortSignal;rl;opts;_render;_track=!1;_prevFrame=``;_subscribers=new Map;_cursor=0;state=`initial`;error=``;value;userInput=``;constructor(e,t=!0){let{input:n=o.stdin,output:r=o.stdout,render:i,signal:a,...s}=e;this.opts=s,this.onKeypress=this.onKeypress.bind(this),this.close=this.close.bind(this),this.render=this.render.bind(this),this._render=i.bind(this),this._track=t,this._abortSignal=a,this.input=n,this.output=r}unsubscribe(){this._subscribers.clear()}setSubscriber(e,t){let n=this._subscribers.get(e)??[];n.push(t),this._subscribers.set(e,n)}on(e,t){this.setSubscriber(e,{cb:t})}once(e,t){this.setSubscriber(e,{cb:t,once:!0})}emit(e,...t){let n=this._subscribers.get(e)??[],r=[];for(let e of n)e.cb(...t),e.once&&r.push(()=>n.splice(n.indexOf(e),1));for(let e of r)e()}prompt(){return new Promise(e=>{if(this._abortSignal){if(this._abortSignal.aborted)return this.state=`cancel`,this.close(),e(M);this._abortSignal.addEventListener(`abort`,()=>{this.state=`cancel`,this.close()},{once:!0})}this.rl=s.default.createInterface({input:this.input,tabSize:2,prompt:``,escapeCodeTimeout:50,terminal:!0}),this.rl.prompt(),this.opts.initialUserInput!==void 0&&this._setUserInput(this.opts.initialUserInput,!0),this.input.on(`keypress`,this.onKeypress),P(this.input,!0),this.output.on(`resize`,this.render),this.render(),this.once(`submit`,()=>{this.output.write(O.cursor.show),this.output.off(`resize`,this.render),P(this.input,!1),e(this.value)}),this.once(`cancel`,()=>{this.output.write(O.cursor.show),this.output.off(`resize`,this.render),P(this.input,!1),e(M)})})}_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&&A.aliases.has(t.name)&&this.emit(`cursor`,A.aliases.get(t.name)),A.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`)}j([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
|
+
`),P(this.input,!1),this.rl?.close(),this.rl=void 0,this.emit(`${this.state}`,this.value),this.unsubscribe()}restoreCursor(){let e=D(this._prevFrame,process.stdout.columns,{hard:!0,trim:!1}).split(`
|
|
32
|
+
`).length-1;this.output.write(O.cursor.move(-999,e*-1))}render(){let e=D(this._render(this)??``,process.stdout.columns,{hard:!0,trim:!1});if(e!==this._prevFrame){if(this.state===`initial`)this.output.write(O.cursor.hide);else{let t=ye(this._prevFrame,e),n=Se(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(O.cursor.move(0,a-i)),this.output.write(O.erase.lines(1));let t=e.split(`
|
|
33
|
+
`);this.output.write(t[a]),this._prevFrame=e,this.output.write(O.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(O.cursor.move(0,e))}this.output.write(O.erase.down());let t=e.split(`
|
|
34
34
|
`).slice(a);this.output.write(t.join(`
|
|
35
|
-
`)),this._prevFrame=e;return}}this.output.write(
|
|
36
|
-
`);_.push(i),v+=i.length}if(v>d){let t=0,n=0,r=v,i=e-y,a=(e,t)=>Ue(_,r,e,t,d);m?({lineCount:r,removals:t}=a(0,i),r>d&&({lineCount:r,removals:n}=a(i+1,_.length))):({lineCount:r,removals:n}=a(i+1,_.length),r>d&&({lineCount:r,removals:t}=a(0,i))),t>0&&(m=!0,_.splice(0,t)),n>0&&(h=!0,_.splice(_.length-n,n))}let x=[];m&&x.push(u);for(let e of _)for(let t of e)x.push(t);return h&&x.push(u),x},W=e=>{let t=e.active??`Yes`,n=e.inactive??`No`;return new
|
|
35
|
+
`)),this._prevFrame=e;return}}this.output.write(O.erase.down())}this.output.write(e),this.state===`initial`&&(this.state=`active`),this._prevFrame=e}}};var Ce=class extends L{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(O.cursor.move(0,-1)),this.value=e,this.state=`submit`,this.close()}),this.on(`cursor`,()=>{this.value=!this.value})}},we=class extends L{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?k(n,1,this.options):n,this.changeValue(),this.on(`cursor`,e=>{switch(e){case`left`:case`up`:this.cursor=k(this.cursor,-1,this.options);break;case`down`:case`right`:this.cursor=k(this.cursor,1,this.options);break}this.changeValue()})}},Te=class extends L{get userInputWithCursor(){if(this.state===`submit`)return this.userInput;let e=this.userInput;if(this.cursor>=e.length)return`${this.userInput}\u2588`;let t=e.slice(0,this.cursor),[n,...r]=e.slice(this.cursor);return`${t}${(0,a.styleText)(`inverse`,n)}${r.join(``)}`}get cursor(){return this._cursor}constructor(e){super({...e,initialUserInput:e.initialUserInput??e.initialValue}),this.on(`userInput`,e=>{this._setValue(e)}),this.on(`finalize`,()=>{this.value||=e.defaultValue,this.value===void 0&&(this.value=``)})}};function Ee(){return o.default.platform===`win32`?!!o.default.env.CI||!!o.default.env.WT_SESSION||!!o.default.env.TERMINUS_SUBLIME||o.default.env.ConEmuTask===`{cmd::Cmder}`||o.default.env.TERM_PROGRAM===`Terminus-Sublime`||o.default.env.TERM_PROGRAM===`vscode`||o.default.env.TERM===`xterm-256color`||o.default.env.TERM===`alacritty`||o.default.env.TERMINAL_EMULATOR===`JetBrains-JediTerm`:o.default.env.TERM!==`linux`}const R=Ee(),De=()=>process.env.CI===`true`,z=(e,t)=>R?e:t,Oe=z(`◆`,`*`),ke=z(`■`,`x`),Ae=z(`▲`,`x`),B=z(`◇`,`o`),V=z(`│`,`|`),H=z(`└`,`—`),je=z(`●`,`>`),U=z(`○`,` `),Me=z(`─`,`-`),Ne=z(`╮`,`+`),Pe=z(`├`,`+`),Fe=z(`╯`,`+`),Ie=z(`╰`,`+`),Le=z(`●`,`•`),Re=z(`◆`,`*`),ze=z(`▲`,`!`),Be=z(`■`,`x`),Ve=e=>{switch(e){case`initial`:case`active`:return(0,a.styleText)(`cyan`,Oe);case`cancel`:return(0,a.styleText)(`red`,ke);case`error`:return(0,a.styleText)(`yellow`,Ae);case`submit`:return(0,a.styleText)(`green`,B)}},He=e=>{switch(e){case`initial`:case`active`:return(0,a.styleText)(`cyan`,V);case`cancel`:return(0,a.styleText)(`red`,V);case`error`:return(0,a.styleText)(`yellow`,V);case`submit`:return(0,a.styleText)(`green`,V)}},Ue=(e,t,n,r,i)=>{let a=t,o=0;for(let t=n;t<r;t++){let n=e[t];if(a-=n.length,o++,a<=i)break}return{lineCount:a,removals:o}},We=({cursor:e,options:t,style:n,output:r=process.stdout,maxItems:i=1/0,columnPadding:o=0,rowPadding:s=4})=>{let c=F(r)-o,l=Se(r),u=(0,a.styleText)(`dim`,`...`),d=Math.max(l-s,0),f=Math.max(Math.min(i,d),5),p=0;e>=f-3&&(p=Math.max(Math.min(e-f+3,t.length-f),0));let m=f<t.length&&p>0,h=f<t.length&&p+f<t.length,g=Math.min(p+f,t.length),_=[],v=0;m&&v++,h&&v++;let y=p+ +!!m,b=g-+!!h;for(let r=y;r<b;r++){let i=D(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 Ce({active:t,inactive:n,signal:e.signal,input:e.input,output:e.output,initialValue:e.initialValue??!0,render(){let r=e.withGuide??A.withGuide,i=`${Ve(this.state)} `,o=r?`${(0,a.styleText)(`gray`,V)} `:``,s=I(e.output,e.message,o,i),c=`${r?`${(0,a.styleText)(`gray`,V)}
|
|
37
37
|
`:``}${s}
|
|
38
|
-
`,l=this.value?t:n;switch(this.state){case`submit`:return`${c}${r?`${(0,
|
|
39
|
-
${(0,
|
|
40
|
-
${(0,
|
|
41
|
-
`:` ${(0,
|
|
38
|
+
`,l=this.value?t:n;switch(this.state){case`submit`:return`${c}${r?`${(0,a.styleText)(`gray`,V)} `:``}${(0,a.styleText)(`dim`,l)}`;case`cancel`:return`${c}${r?`${(0,a.styleText)(`gray`,V)} `:``}${(0,a.styleText)([`strikethrough`,`dim`],l)}${r?`
|
|
39
|
+
${(0,a.styleText)(`gray`,V)}`:``}`;default:{let i=r?`${(0,a.styleText)(`cyan`,V)} `:``,o=r?(0,a.styleText)(`cyan`,H):``;return`${c}${i}${this.value?`${(0,a.styleText)(`green`,je)} ${t}`:`${(0,a.styleText)(`dim`,U)} ${(0,a.styleText)(`dim`,t)}`}${e.vertical?r?`
|
|
40
|
+
${(0,a.styleText)(`cyan`,V)} `:`
|
|
41
|
+
`:` ${(0,a.styleText)(`dim`,`/`)} `}${this.value?`${(0,a.styleText)(`dim`,U)} ${(0,a.styleText)(`dim`,n)}`:`${(0,a.styleText)(`green`,je)} ${n}`}
|
|
42
42
|
${o}
|
|
43
|
-
`}}}}).prompt()},
|
|
43
|
+
`}}}}).prompt()},G={message:(e=[],{symbol:t=(0,a.styleText)(`gray`,V),secondarySymbol:n=(0,a.styleText)(`gray`,V),output:r=process.stdout,spacing:i=1,withGuide:o}={})=>{let s=[],c=o??A.withGuide,l=c?n:``,u=c?`${t} `:``,d=c?`${n} `:``;for(let e=0;e<i;e++)s.push(l);let f=Array.isArray(e)?e:e.split(`
|
|
44
44
|
`);if(f.length>0){let[e,...r]=f;e.length>0?s.push(`${u}${e}`):s.push(c?t:``);for(let e of r)e.length>0?s.push(`${d}${e}`):s.push(c?n:``)}r.write(`${s.join(`
|
|
45
45
|
`)}
|
|
46
|
-
`)},info:(e,t)=>{G.message(e,{...t,symbol:(0,
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
`)
|
|
52
|
-
`),
|
|
53
|
-
|
|
46
|
+
`)},info:(e,t)=>{G.message(e,{...t,symbol:(0,a.styleText)(`blue`,Le)})},success:(e,t)=>{G.message(e,{...t,symbol:(0,a.styleText)(`green`,Re)})},step:(e,t)=>{G.message(e,{...t,symbol:(0,a.styleText)(`green`,B)})},warn:(e,t)=>{G.message(e,{...t,symbol:(0,a.styleText)(`yellow`,ze)})},warning:(e,t)=>{G.warn(e,t)},error:(e,t)=>{G.message(e,{...t,symbol:(0,a.styleText)(`red`,Be)})}},Ge=(e=``,t)=>{let n=t?.output??process.stdout,r=t?.withGuide??A.withGuide?`${(0,a.styleText)(`gray`,H)} `:``;n.write(`${r}${(0,a.styleText)(`red`,e)}
|
|
47
|
+
|
|
48
|
+
`)},Ke=(e=``,t)=>{let n=t?.output??process.stdout,r=t?.withGuide??A.withGuide?`${(0,a.styleText)(`gray`,V)}
|
|
49
|
+
${(0,a.styleText)(`gray`,H)} `:``;n.write(`${r}${e}
|
|
50
|
+
|
|
51
|
+
`)},qe=e=>(0,a.styleText)(`dim`,e),Je=(e,t,n)=>{let r={hard:!0,trim:!1},i=D(e,t,r).split(`
|
|
52
|
+
`),a=i.reduce((e,t)=>Math.max(E(t),e),0);return D(e,t-(i.map(n).reduce((e,t)=>Math.max(E(t),e),0)-a),r)},Ye=(e=``,t=``,n)=>{let r=n?.output??o.default.stdout,i=n?.withGuide??A.withGuide,s=n?.format??qe,c=[``,...Je(e,F(r)-6,s).split(`
|
|
53
|
+
`).map(s),``],l=E(t),u=Math.max(c.reduce((e,t)=>{let n=E(t);return n>e?n:e},0),l)+2,d=c.map(e=>`${(0,a.styleText)(`gray`,V)} ${e}${` `.repeat(u-E(e))}${(0,a.styleText)(`gray`,V)}`).join(`
|
|
54
|
+
`),f=i?`${(0,a.styleText)(`gray`,V)}
|
|
55
|
+
`:``,p=i?Pe:Ie;r.write(`${f}${(0,a.styleText)(`green`,B)} ${(0,a.styleText)(`reset`,t)} ${(0,a.styleText)(`gray`,Me.repeat(Math.max(u-l-1,1))+Ne)}
|
|
54
56
|
${d}
|
|
55
|
-
${(0,
|
|
56
|
-
`)},Xe=e=>(0,
|
|
57
|
-
`);let e=
|
|
58
|
-
`);e.length>1&&n.write(
|
|
59
|
-
`);let r=0,
|
|
57
|
+
${(0,a.styleText)(`gray`,p+Me.repeat(u+2)+Fe)}
|
|
58
|
+
`)},Xe=e=>(0,a.styleText)(`magenta`,e),Ze=({indicator:e=`dots`,onCancel:t,output:n=process.stdout,cancelMessage:r,errorMessage:i,frames:o=R?[`◒`,`◐`,`◓`,`◑`]:[`•`,`o`,`O`,`0`],delay:s=R?80:120,signal:c,...l}={})=>{let u=De(),d,f,p=!1,m=!1,h=``,g,_=performance.now(),v=F(n),y=l?.styleFrame??Xe,b=e=>{let n=e>1?i??A.messages.error:r??A.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)},C=()=>{if(g===void 0)return;u&&n.write(`
|
|
59
|
+
`);let e=D(g,v,{hard:!0,trim:!1}).split(`
|
|
60
|
+
`);e.length>1&&n.write(O.cursor.up(e.length-1)),n.write(O.cursor.to(0)),n.write(O.erase.down())},w=e=>e.replace(/\.+$/,``),ne=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=l.withGuide??A.withGuide,ie=(t=``)=>{p=!0,d=xe({output:n}),h=w(t),_=performance.now(),re&&n.write(`${(0,a.styleText)(`gray`,V)}
|
|
61
|
+
`);let r=0,i=0;ee(),f=setInterval(()=>{if(u&&h===g)return;C(),g=h;let t=y(o[r]),a;if(u)a=`${t} ${h}...`;else if(e===`timer`)a=`${t} ${h} ${ne(_)}`;else{let e=`.`.repeat(Math.floor(i)).slice(0,3);a=`${t} ${h}${e}`}let s=D(a,v,{hard:!0,trim:!1});n.write(s),r=r+1<o.length?r+1:0,i=i<4?i+.125:0},s)},T=(t=``,r=0,i=!1)=>{if(!p)return;p=!1,clearInterval(f),C();let o=r===0?(0,a.styleText)(`green`,B):r===1?(0,a.styleText)(`red`,ke):(0,a.styleText)(`red`,Ae);h=t??h,i||(e===`timer`?n.write(`${o} ${h} ${ne(_)}
|
|
60
62
|
`):n.write(`${o} ${h}
|
|
61
|
-
`)),te(),d()};return{start:ie,stop:(e=``)=>T(e,0),message:(e=``)=>{h=
|
|
63
|
+
`)),te(),d()};return{start:ie,stop:(e=``)=>T(e,0),message:(e=``)=>{h=w(e??h)},cancel:(e=``)=>T(e,1),error:(e=``)=>T(e,2),clear:()=>T(``,0,!0),get isCancelled(){return m}}},K=(e,t)=>e.includes(`
|
|
62
64
|
`)?e.split(`
|
|
63
65
|
`).map(e=>t(e)).join(`
|
|
64
|
-
`):t(e),q=e=>{let t=(e,t)=>{let n=e.label??String(e.value);switch(t){case`disabled`:return`${(0,
|
|
66
|
+
`):t(e),q=e=>{let t=(e,t)=>{let n=e.label??String(e.value);switch(t){case`disabled`:return`${(0,a.styleText)(`gray`,U)} ${K(n,e=>(0,a.styleText)(`gray`,e))}${e.hint?` ${(0,a.styleText)(`dim`,`(${e.hint??`disabled`})`)}`:``}`;case`selected`:return`${K(n,e=>(0,a.styleText)(`dim`,e))}`;case`active`:return`${(0,a.styleText)(`green`,je)} ${n}${e.hint?` ${(0,a.styleText)(`dim`,`(${e.hint})`)}`:``}`;case`cancelled`:return`${K(n,e=>(0,a.styleText)([`strikethrough`,`dim`],e))}`;default:return`${(0,a.styleText)(`dim`,U)} ${K(n,e=>(0,a.styleText)(`dim`,e))}`}};return new we({options:e.options,signal:e.signal,input:e.input,output:e.output,initialValue:e.initialValue,render(){let n=e.withGuide??A.withGuide,r=`${Ve(this.state)} `,i=`${He(this.state)} `,o=I(e.output,e.message,i,r),s=`${n?`${(0,a.styleText)(`gray`,V)}
|
|
65
67
|
`:``}${o}
|
|
66
|
-
`;switch(this.state){case`submit`:{let r=n?`${(0,
|
|
67
|
-
${(0,
|
|
68
|
+
`;switch(this.state){case`submit`:{let r=n?`${(0,a.styleText)(`gray`,V)} `:``;return`${s}${I(e.output,t(this.options[this.cursor],`selected`),r)}`}case`cancel`:{let r=n?`${(0,a.styleText)(`gray`,V)} `:``;return`${s}${I(e.output,t(this.options[this.cursor],`cancelled`),r)}${n?`
|
|
69
|
+
${(0,a.styleText)(`gray`,V)}`:``}`}default:{let r=n?`${(0,a.styleText)(`cyan`,V)} `:``,i=n?(0,a.styleText)(`cyan`,H):``,o=s.split(`
|
|
68
70
|
`).length,c=n?2:1;return`${s}${r}${We({output:e.output,cursor:this.cursor,options:this.options,maxItems:e.maxItems,columnPadding:r.length,rowPadding:o+c,style:(e,n)=>t(e,e.disabled?`disabled`:n?`active`:`inactive`)}).join(`
|
|
69
71
|
${r}`)}
|
|
70
|
-
${
|
|
71
|
-
`}}}}).prompt()},Qe=`${(0,
|
|
72
|
+
${i}
|
|
73
|
+
`}}}}).prompt()},Qe=`${(0,a.styleText)(`gray`,V)} `,J={message:async(e,{symbol:t=(0,a.styleText)(`gray`,V)}={})=>{process.stdout.write(`${(0,a.styleText)(`gray`,V)}
|
|
72
74
|
${t} `);let n=3;for await(let t of e){t=t.replace(/\n/g,`
|
|
73
75
|
${Qe}`),t.includes(`
|
|
74
|
-
`)&&(n=3+(0,
|
|
75
|
-
`))).length);let e=(0,
|
|
76
|
-
${Qe}${t.trimStart()}`),n=3+(0,
|
|
77
|
-
`)},info:e=>J.message(e,{symbol:(0,
|
|
78
|
-
`:``}${
|
|
79
|
-
`,r=e.placeholder?(0,
|
|
80
|
-
${r}${
|
|
76
|
+
`)&&(n=3+(0,a.stripVTControlCharacters)(t.slice(t.lastIndexOf(`
|
|
77
|
+
`))).length);let e=(0,a.stripVTControlCharacters)(t).length;n+e<process.stdout.columns?(n+=e,process.stdout.write(t)):(process.stdout.write(`
|
|
78
|
+
${Qe}${t.trimStart()}`),n=3+(0,a.stripVTControlCharacters)(t.trimStart()).length)}process.stdout.write(`
|
|
79
|
+
`)},info:e=>J.message(e,{symbol:(0,a.styleText)(`blue`,Le)}),success:e=>J.message(e,{symbol:(0,a.styleText)(`green`,Re)}),step:e=>J.message(e,{symbol:(0,a.styleText)(`green`,B)}),warn:e=>J.message(e,{symbol:(0,a.styleText)(`yellow`,ze)}),warning:e=>J.warn(e),error:e=>J.message(e,{symbol:(0,a.styleText)(`red`,Be)})},$e=e=>new Te({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??A.withGuide,n=`${`${t?`${(0,a.styleText)(`gray`,V)}
|
|
80
|
+
`:``}${Ve(this.state)} `}${e.message}
|
|
81
|
+
`,r=e.placeholder?(0,a.styleText)(`inverse`,e.placeholder[0])+(0,a.styleText)(`dim`,e.placeholder.slice(1)):(0,a.styleText)([`inverse`,`hidden`],`_`),i=this.userInput?this.userInputWithCursor:r,o=this.value??``;switch(this.state){case`error`:{let e=this.error?` ${(0,a.styleText)(`yellow`,this.error)}`:``,r=t?`${(0,a.styleText)(`yellow`,V)} `:``,o=t?(0,a.styleText)(`yellow`,H):``;return`${n.trim()}
|
|
82
|
+
${r}${i}
|
|
81
83
|
${o}${e}
|
|
82
|
-
`}case`submit`:{let e=o?` ${(0,
|
|
83
|
-
${r}`:``}`}default:return`${n}${t?`${(0,
|
|
84
|
-
${t?(0,
|
|
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`
|
|
84
|
+
`}case`submit`:{let e=o?` ${(0,a.styleText)(`dim`,o)}`:``;return`${n}${t?(0,a.styleText)(`gray`,V):``}${e}`}case`cancel`:{let e=o?` ${(0,a.styleText)([`strikethrough`,`dim`],o)}`:``,r=t?(0,a.styleText)(`gray`,V):``;return`${n}${r}${e}${o.trim()?`
|
|
85
|
+
${r}`:``}`}default:return`${n}${t?`${(0,a.styleText)(`cyan`,V)} `:``}${i}
|
|
86
|
+
${t?(0,a.styleText)(`cyan`,H):``}
|
|
87
|
+
`}}}).prompt();var et=class{info(e){process.stdout.write(`${b.default.blue(`ℹ ${e}`)}\n`)}warn(e){process.stderr.write(`${b.default.yellow(`⚠ ${e}`)}\n`)}error(e){process.stderr.write(`${b.default.red(`✘ ${e}`)}\n`)}success(e){process.stdout.write(`${b.default.green(`✔ ${e}`)}\n`)}step(e){process.stdout.write(`○ ${e}\n`)}note(e,t){Ye(e,t)}log(e){process.stdout.write(`${e}\n`)}spinner(){return Ze()}json(e){process.stdout.write(`${JSON.stringify(e,null,2)}\n`)}cancel(e){process.stderr.write(`${b.default.red(`✘ ${e}`)}\n`)}fatal(e,t){if(process.stderr.write(`${b.default.red(`✘ ${e}`)}\n`),t){let e=`${b.default.red(t instanceof Error?t.stack??String(t):String(t))}\n`;process.stderr.write(e)}throw t instanceof Error?t:Error(e)}finish(e,t){Ke(e)}async flush(){return new Promise(e=>{process.stderr.write(``,()=>e())})}},tt=class{constructor(e){this.options=e,this.originalStdoutWrite=process.stdout.write,e.isJson?this.reporter=new x:e.isQuiet?this.reporter=new S:this.reporter=new et}info(e){this.reporter.info(e)}warn(e){this.reporter.warn(e)}error(e){this.reporter.error(e)}success(e){this.reporter.success(e)}step(e){this.reporter.step(e)}note(e,t){this.reporter.note(e,t)}log(e){this.reporter.log(e)}spinner(){return this.reporter.spinner()}json(e){this.reporter.json(e)}get stdio(){return this.options.isJson?[process.stdin,process.stderr,process.stderr]:`inherit`}interactiveStdout(e){!this.options.isJson||this.options.isYes||(e?process.stdout.write=process.stderr.write.bind(process.stderr):process.stdout.write=this.originalStdoutWrite)}cancel(e){this.reporter.cancel(e)}fatal(e,t){this.reporter.fatal(e,t)}finish(e,t){this.reporter.finish(e,t)}async flush(){await this.reporter.flush()}};async function nt(e=process.cwd(),t){if(t?.compilerOptions?.types){let e=t.compilerOptions.types;if(e.includes(`vite`)||e.includes(`vite/client`))return`vite`}try{let t=r.default.join(e,`package.json`),i=await n.default.readFile(t,`utf-8`),a=JSON.parse(i);if({...a.dependencies,...a.devDependencies}.vite)return`vite`}catch{}try{return await n.default.access(r.default.join(e,`vite.config.ts`)),`vite`}catch{}try{return await n.default.access(r.default.join(e,`vite.config.js`)),`vite`}catch{}return(await rt(e,t)).length>0?`bun-fullstack`:`vanilla`}async function rt(e=process.cwd(),t){let i=[];try{let t=r.default.join(e,`bunfig.toml`),a=await n.default.readFile(t,`utf-8`);(a.includes(`[serve]`)||a.includes(`[serve.static]`))&&i.push(`serve`),a.includes(`[build]`)&&i.push(`build`)}catch{}if(i.includes(`serve`)&&i.includes(`build`))return i;let{walk:a}=await Promise.resolve().then(()=>ot),o=await a(e),s=i.includes(`serve`),c=i.includes(`build`);for(let e of o)try{let t=await n.default.readFile(e,`utf-8`);if(!s&&(t.includes(`Bun.serve`)||t.includes(`serve(`))&&(/from\s+['"]bun['"]/.test(t)||t.includes(`Bun.serve`))&&(s=!0,i.push(`serve`)),!c&&(t.includes(`Bun.build`)||t.includes(`build(`))&&(/from\s+['"]bun['"]/.test(t)||t.includes(`Bun.build`))&&(c=!0,i.push(`build`)),s&&c)break}catch{}return i}async function it(e=process.cwd(),t){let i=process.env.npm_config_user_agent?.toString()||``;if(i.includes(`pnpm`))return`pnpm`;if(i.includes(`yarn`))return`yarn`;if(i.includes(`bun`))return`bun`;if(i.includes(`npm`))return`npm`;let a=t?.path?r.default.dirname(t.path):e;for(;a!==r.default.parse(a).root;){try{let e=r.default.join(a,`package.json`),t=await n.default.readFile(e,`utf-8`),i=JSON.parse(t);if(i.packageManager){if(i.packageManager.startsWith(`pnpm`))return`pnpm`;if(i.packageManager.startsWith(`yarn`))return`yarn`;if(i.packageManager.startsWith(`bun`))return`bun`}}catch{}let e=[];try{e=await n.default.readdir(a)}catch{}if(e.includes(`pnpm-lock.yaml`))return`pnpm`;if(e.includes(`yarn.lock`))return`yarn`;if(e.includes(`bun.lockb`))return`bun`;if(e.includes(`package-lock.json`))return`npm`;a=r.default.dirname(a)}return`npm`}async function at(e=process.cwd(),t){let i=t;if(!i){let{findTsConfig:t,loadTsConfig:n}=await Promise.resolve().then(()=>ft),r=await t(e);r&&(i=await n(r))}if(i?.compilerOptions?.rootDir){let t=i.compilerOptions.rootDir,n=r.default.relative(e,t);return n&&n!==`.`&&!n.startsWith(`..`)&&!r.default.isAbsolute(n)?`./${n}/env.ts`:`./env.ts`}try{return await n.default.access(r.default.join(e,`src`)),`./src/env.ts`}catch{return`./env.ts`}}var ot=e.n({getEnvExampleKeys:()=>dt,parseEnvExample:()=>ct,resolveImportPaths:()=>lt,scanProjectEnvKeys:()=>ut,walk:()=>st});async function st(e,t=[]){try{let i=await n.default.readdir(e,{withFileTypes:!0});for(let n of i)if(n.isDirectory()){let i=n.name;if(i===`node_modules`||i===`dist`||i===`build`||i===`.git`||i===`.turbo`||i===`scratch`)continue;await st(r.default.join(e,i),t)}else n.isFile()&&/\.(ts|tsx|js|jsx)$/.test(n.name)&&!n.name.endsWith(`.d.ts`)&&t.push(r.default.join(e,n.name))}catch{}return t}function ct(e){let t=[],n=e.split(/\r?\n/);for(let e of n){let n=e.trim();if(!n||n.startsWith(`#`))continue;let r=n.match(/^([A-Z_][A-Z0-9_]*)\s*=/i);r?.[1]&&t.push(r[1])}return Array.from(new Set(t))}function lt(e,t,n){if(e.startsWith(`.`))return[r.default.resolve(r.default.dirname(n),e)];if(r.default.isAbsolute(e))return[e];let i=t.compilerOptions||{},a=i.baseUrl||r.default.dirname(t.path),o=i.paths||{},s=[];for(let[e,t]of Object.entries(o)){let n=e.endsWith(`*`),r=e.replace(/\*$/,``);s.push({cleanPattern:r,targets:Array.isArray(t)?t:[t],hadStar:n})}s.sort((e,t)=>t.cleanPattern.length-e.cleanPattern.length);for(let{cleanPattern:t,targets:n,hadStar:i}of s)if(i&&e.startsWith(t)||!i&&e===t){let i=e.slice(t.length);return n.map(e=>{let t=`${e.replace(/\*$/,``)}${i}`;return r.default.resolve(a,t)})}return i.baseUrl?[r.default.resolve(a,e)]:[]}async function ut(e,t,i){let a=[],o=await st(e),s=i?i.replace(/\.(ts|js|tsx|jsx)$/,``):null;for(let e of o)try{let i=await n.default.readFile(e,`utf-8`),o=i.matchAll(/process\.env\.([A-Z_][A-Z0-9_]*)/g);for(let e of o)e[1]&&a.push(e[1]);let c=i.matchAll(/import\.meta\.env\.([A-Z_][A-Z0-9_]*)/g);for(let e of c)e[1]&&a.push(e[1]);if(s){let n=i.matchAll(/import\s+[^;]*from\s+['"]([^'"]+)['"]/g);for(let o of n){let n=o[1],c=[];if(t?c=lt(n,t,e):n.startsWith(`.`)&&(c=[r.default.resolve(r.default.dirname(e),n)]),c.some(e=>e.replace(/\.(ts|js|tsx|jsx)$/,``)===s)){let e=i.matchAll(/\benv\.([A-Z_][A-Z0-9_]*)/g);for(let t of e)t[1]&&a.push(t[1])}}}}catch{}return Array.from(new Set(a))}async function dt(e=process.cwd(),t,i){let a=r.default.join(e,`.env.example`);try{let e=ct(await n.default.readFile(a,`utf-8`));if(e.length>0)return{keys:e,source:`.env.example`}}catch{}let o=await ut(e,t,i);return o.length>0?{keys:o,source:`project`}:null}var ft=e.n({checkTsConfig:()=>mt,findTsConfig:()=>Y,loadTsConfig:()=>X});const pt=(0,u.createRequire)(require(`url`).pathToFileURL(__filename).href).resolve;async function Y(e=process.cwd()){let t=[`tsconfig.app.json`,`tsconfig.json`,`tsconfig.base.json`,`tsconfig.node.json`],i=e;for(;i!==r.default.parse(i).root;){for(let e of t){let t=r.default.join(i,e);try{return await n.default.access(t),t}catch{}}i=r.default.dirname(i)}return null}async function X(e,t=new Set){let i=r.default.resolve(e);if(t.has(i))throw Error(`Circular extends dependency detected in tsconfig.json: ${i}`);t.add(i);let a=``;try{a=await n.default.readFile(e,`utf-8`)}catch{return{path:e,compilerOptions:{}}}let o=(0,d.parse)(a)||{},s=o.compilerOptions||{},c={};if(o.extends){let n=Array.isArray(o.extends)?o.extends:[o.extends];for(let i of n){let n;if(i.startsWith(`.`)||r.default.isAbsolute(i))n=r.default.resolve(r.default.dirname(e),i);else try{n=pt(i,{paths:[r.default.dirname(e)]})}catch{n=r.default.resolve(r.default.dirname(e),`node_modules`,i)}let a={...(await X(n,t)).compilerOptions};a.baseUrl&&=r.default.resolve(r.default.dirname(n),a.baseUrl),a.rootDir&&=r.default.resolve(r.default.dirname(n),a.rootDir),c={...c,...a}}}let l={...s};return l.baseUrl&&=r.default.resolve(r.default.dirname(e),l.baseUrl),l.rootDir&&=r.default.resolve(r.default.dirname(e),l.rootDir),c={...c,...l},{...o,path:e,compilerOptions:c}}async function mt(e=process.cwd()){let t=await Y(e);if(!t)return{status:`not_found`};let n=r.default.basename(t);try{let e=await X(t);return e?.compilerOptions?.strict===!0?{status:`strict`,file:n,parsed:e}:{status:`not_strict`,file:n,parsed:e}}catch{return{status:`not_found`}}}function ht(e,t){let n=e.replace(/^v/,``).split(`.`).map(Number),r=t.replace(/^v/,``).split(`.`).map(Number);for(let e=0;e<3;e++){let t=n[e]||0,i=r[e]||0;if(t>i)return 1;if(t<i)return-1}return 0}function gt(e){let t=e.trim().match(/^v?(\d+)(?:\.(\d+))?(?:\.(\d+))?/);return t?[t[1],t[2]??`0`,t[3]??`0`].join(`.`):null}function _t(e,t){let n=e.trim(),r=n.match(/^[\^~]?\s*(v?\d+(?:\.\d+){0,2})$/);if(r){let e=gt(r[1]);return e!==null&&ht(e,t)>=0}let i=n.match(/(?:>=|>|<=|<|=)\s*v?\d+(?:\.\d+){0,2}/g);return!i||i.join(` `)!==n.replace(/\s+/g,` `)?!1:i.some(e=>{let n=e.match(/^(>=|>|<=|<|=)\s*(v?\d+(?:\.\d+){0,2})$/);if(!n)return!1;let[,r,i]=n,a=gt(i);return a&&(r===`>=`||r===`>`||r===`=`)?ht(a,t)>=0:!1})}async function vt(e=process.cwd()){let t=[],i=process.version,a=`22.0.0`;ht(i,a)===-1?t.push({status:`fail`,requirement:`Node.js Version`,message:`Node.js version must be >= ${a}.`,current:i,expected:`>= ${a}`}):t.push({status:`pass`,requirement:`Node.js Version`,message:`Node.js version is compatible.`});let o=null;try{let i=r.default.join(e,`package.json`),a=await n.default.readFile(i,`utf-8`);o=JSON.parse(a),t.push({status:`pass`,requirement:`package.json`,message:`package.json found.`})}catch{t.push({status:`warn`,requirement:`package.json`,message:`package.json not found in the current directory.`})}if(o){let e={...o.dependencies,...o.devDependencies}.typescript,n=`5.1.0`;e?_t(e,n)?t.push({status:`pass`,requirement:`TypeScript Version`,message:`TypeScript version is compatible.`}):t.push({status:`fail`,requirement:`TypeScript Version`,message:`TypeScript version should be >= ${n}.`,current:e,expected:`>= ${n}`}):t.push({status:`warn`,requirement:`TypeScript Version`,message:`TypeScript not found in package.json dependencies.`})}let s=await mt(e);if(s.status===`not_found`)t.push({status:`warn`,requirement:`tsconfig.json`,message:`tsconfig.json not found.`});else{let e=s.parsed.compilerOptions||{};e.strict===!0?t.push({status:`pass`,requirement:`TypeScript Strict Mode`,message:`Strict mode is enabled.`}):t.push({status:`fail`,requirement:`TypeScript Strict Mode`,message:`Strict mode must be enabled.`,current:`false`,expected:`true`});let n=e.moduleResolution?.toLowerCase(),r=e.module?.toLowerCase();[`bundler`,`node16`,`nodenext`].includes(n||``)||!n&&(r===`node16`||r===`nodenext`)?t.push({status:`pass`,requirement:`TypeScript moduleResolution`,message:`moduleResolution is set to ${n||`implicit`}.`}):t.push({status:`fail`,requirement:`TypeScript moduleResolution`,message:`moduleResolution must be set to 'bundler', 'node16', or 'nodenext'.`,current:n||`default`,expected:`bundler, node16, or nodenext`})}return t}var yt=class{async isEmptyDirectory(e=process.cwd()){try{return(await n.default.readdir(e)).length===0}catch{return!1}}async hasPackageJson(e=process.cwd()){try{return await n.default.access(r.default.join(e,`package.json`)),!0}catch{return!1}}async findTsConfig(e=process.cwd()){return 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 checkRequirements(e=process.cwd()){return vt(e)}async detectFramework(e=process.cwd(),t){return nt(e,t)}async detectBunFeatures(e=process.cwd(),t){return rt(e,t)}async detectPackageManager(e=process.cwd(),t){return it(e,t)}};const Z=e=>b.default.cyan(e),bt=b.default.blue(`⛯`);function xt(e){try{let t=(0,p.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,p.generateCode)(t,{format:(0,p.detectCodeFormat)(n)}).code,a=e.envImportPath?`arkenvVitePlugin(Env)`:`arkenvVitePlugin()`;return i=i.replace(/['"]__ARK_PLUGIN_PLACEHOLDER__['"]/g,a),{success:!0,updated:!0,code:i}}catch(e){return{success:!1,updated:!1,error:`Failed to parse Vite config: ${e instanceof Error?e.message:String(e)}`}}}async function St(){for(let e of[`vite.config.ts`,`vite.config.js`,`vite.config.mts`,`vite.config.mjs`]){let t=r.default.resolve(process.cwd(),e);try{return await n.default.access(t),t}catch{}}return null}async function Ct(){for(let e of[`bunfig.toml`,`bun.setup.ts`,`bun.setup.js`]){let t=r.default.resolve(process.cwd(),e);try{return await n.default.access(t),t}catch{}}return null}async function wt(e,t,n){try{let r=xt({code:await e.readFile(t),envImportPath:n});return r.success&&r.updated&&r.code&&await e.writeFile(t,r.code),r.success?r.updated===void 0?{success:!0}:{success:!0,updated:r.updated}:{success:!1,error:r.error}}catch(e){return{success:!1,error:e instanceof Error?e.message:String(e)}}}async function Tt(e,t){if(!t||t.length===0)return{success:!0,instructions:i.default`
|
|
86
88
|
${b.default.green(`✔`)} Use ${b.default.bold(`Vanilla`)} Bun runtime integration.
|
|
87
89
|
Access validated variables via your ${Z(`env`)} object for typesafety.
|
|
88
90
|
Primarily used for ${b.default.cyan(`server-side`)} or runtime-only validation.
|
|
89
91
|
No plugins are required.
|
|
90
|
-
`};let n=t.includes(`serve`),
|
|
92
|
+
`};let n=t.includes(`serve`),r=t.includes(`build`),a=``;return n&&(a+=i.default`
|
|
91
93
|
${b.default.bold(`Bun Fullstack (Bun.serve) Integration:`)}
|
|
92
94
|
To inline environment variables (e.g. ${Z(`PUBLIC_*`)}) in your ${b.default.cyan(`client-side`)} code, add the plugin to ${Z(`bunfig.toml`)}:
|
|
93
95
|
|
|
94
96
|
[serve.static]
|
|
95
97
|
plugins = ["@arkenv/bun-plugin"]
|
|
96
98
|
|
|
97
|
-
`),
|
|
98
|
-
`),a+=
|
|
99
|
+
`),r&&(a&&(a+=`
|
|
100
|
+
`),a+=i.default`
|
|
99
101
|
${b.default.bold(`Bun Fullstack programmatic bundling (Bun.build):`)}
|
|
100
102
|
To inline environment variables (e.g. ${Z(`PUBLIC_*`)}) in your custom ${b.default.cyan(`client-side`)} build script, add the plugin to your ${Z(`Bun.build`)} call:
|
|
101
103
|
|
|
@@ -106,9 +108,9 @@ ${t?(0,i.styleText)(`cyan`,V):``}
|
|
|
106
108
|
outdir: "./dist",
|
|
107
109
|
${b.default.green(`plugins: [arkenv]`)}
|
|
108
110
|
});
|
|
109
|
-
`),{success:!0,instructions:a.trim()}}async function
|
|
111
|
+
`),{success:!0,instructions:a.trim()}}async function Et(e,t){let n=t||await Y();if(!n)return{status:`not_found`};let i=r.default.basename(n);try{let t=await e.readFile(n);if((0,d.parse)(t)?.compilerOptions?.strict===!0)return{status:`already_strict`,file:i};let r=(0,d.applyEdits)(t,(0,d.modify)(t,[`compilerOptions`,`strict`],!0,{formattingOptions:{insertSpaces:!0,tabSize:2}}));return await e.writeFile(n,r),{status:`updated`,file:i}}catch{return{status:`error`,file:i}}}var Dt=class{constructor(e,t){this.isQuiet=e,this.stdio=t}async exists(e){try{return await n.default.access(e),!0}catch{return!1}}async readFile(e){return n.default.readFile(e,`utf-8`)}async writeFile(e,t){await n.default.writeFile(e,t,`utf-8`)}async mkdir(e,t){await n.default.mkdir(e,{recursive:t})}async execute(e,t=[]){return new Promise((n,r)=>{let i=(0,f.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 Et(this,e)}async findViteConfig(){return St()}async findBunConfig(){return Ct()}async bootstrapViteConfig(e,t){return wt(this,e,t)}async bootstrapBunConfig(e,t){return Tt(e,t)}async safeAppend(e,t,n){let{safeAppend:r}=await Promise.resolve().then(()=>m);return r(e,t,n)}};const Q={example:e=>async()=>q({message:`Select an example:`,options:e.map(e=>({value:e.id,label:e.name,...e.description?{hint:e.description}:{}}))}),overwriteEnvSchemaFile:(e=`./src/env.ts`)=>async()=>{if((0,l.existsSync)(r.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 N(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 N(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 N(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 N(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(N(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-fullstack`){let t=e.framework===`vite`?`vite-env.d.ts`:`bun-env.d.ts`,n=r.default.dirname(r.default.resolve(process.cwd(),e.path||`./src/env.ts`)),i=r.default.join(n,t);if(l.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 N(a)?null:a}return!0},envDtsHandling:async({results:e})=>{if(e.installTypeDefinitions===null)return null;if(!e.installTypeDefinitions||e.framework!==`vite`&&e.framework!==`bun-fullstack`)return`skip`;let t=e.framework===`vite`?`vite-env.d.ts`:`bun-env.d.ts`,n=r.default.dirname(r.default.resolve(process.cwd(),e.path||`./src/env.ts`)),i=r.default.join(n,t);if(l.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 N(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 N(e)?null:e},useEnvExample:(e,t=`.env.example`)=>async()=>{if(e&&e.length>0){let n=e.length,r=n===1,i=await W({message:t===`.env.example`?`Detected ${Z(`.env.example`)} with ${n} ${r?`key`:`keys`}. Use ${r?`it`:`them`} for your schema?`:`Detected ${n} environment variable${r?``:`s`} used in your project. Use ${r?`it`:`them`} for your schema?`,active:`Yes (Recommended)`,initialValue:!0});return N(i)?null:i}return!1}};async function Ot(e,t=!1){return(e?.mode||`existing`)===`new`?kt(e,t):At(e,t)}async function kt(e,t=!1){let n=e?.examples||[],i=r.default.basename(process.cwd()),a;if(e?.name)a=e.name;else if(t)a=i;else{let e=jt(await $e({message:`Project name:`,placeholder:i,initialValue:``}));if(e===null)return null;a=e||i}a===`.`&&(a=i);let o=e?.example;if(!o&&!t){let e=jt(await Q.example(n)());if(e===null)return null;o=e}else !o&&t&&(o=`basic`);let s=n.find(e=>e.id===o);if(!s){let e=n.map(e=>e.id).join(`, `);throw Error(`Unknown example ${o}. Available examples: ${e}`)}return{mode:`new`,example:s.id,name:a,path:`./src/env.ts`,validator:`arktype`,framework:s.framework,language:`ts`,installSkill:!1}}async function At(e,n=!1){let r=e?.defaultEnvPath||`./src/env.ts`,i=e?.envKeys||null,a=e?.envKeysSource||`.env.example`;if(n){let n=e?.framework||`vanilla`,a;return(n===`vite`||n===`bun-fullstack`)&&(a=e?.hasTypeFile?`append`:`overwrite`),(0,t.shake)({mode:`existing`,path:r,validator:`arktype`,framework:n,bunFeatures:n===`bun-fullstack`?e?.bunFeatures??[`serve`]:void 0,language:`ts`,overwriteEnvSchemaFile:!0,installTypeDefinitions:n!==`vanilla`,installSkill:!1,envDtsHandling:a,envKeys:i??void 0})}let o={mode:`existing`},s=[{key:`overwriteEnvSchemaFile`,fn:()=>Q.overwriteEnvSchemaFile(r)()},{key:`framework`,fn:()=>Q.framework(e)()},{key:`bunBuild`,fn:({results:t})=>t.framework===`bun-fullstack`?Q.bunBuild(e?.bunFeatures?.includes(`build`)||t.framework===`bun-fullstack`&&e?.framework===`bun-fullstack`&&e?.bunFeatures?.includes(`build`))():Promise.resolve(void 0)},{key:`useDefaultPath`,fn:()=>Q.useDefaultPath(r)()},{key:`path`,fn:e=>Q.path(r)(e)},{key:`installTypeDefinitions`,fn:e=>Q.installTypeDefinitions(e)},{key:`envDtsHandling`,fn:e=>Q.envDtsHandling(e)},{key:`validator`,fn:()=>Q.validator()},{key:`useEnvExample`,fn:()=>Q.useEnvExample(i,a)()}];for(let{key:e,fn:t}of s){let n=jt(await t({results:o}));if(n===null)return null;o[e]=n}let c=o.framework===`bun-fullstack`?o.bunBuild?[`serve`,`build`]:[`serve`]:void 0;return(0,t.shake)({...o,bunFeatures:c,language:`ts`,installSkill:!1,envKeys:o.useEnvExample?i??void 0:void 0})}function jt(e){return e===null||N(e)?(Ge(`Operation cancelled`),null):e}var Mt=class{async confirm(e,n=!0,r,i){let a=await W((0,t.shake)({message:e,initialValue:n,active:r,inactive:i}));return N(a)?null:a}async runWizard(e,t=!1){return Ot(e,t)}},Nt=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.isForce=this.args.includes(`--force`)||this.args.includes(`-f`),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.example=this.getFlagValue(`--example`,`-e`),this.name=this.getFlagValue(`--name`,`-n`),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})}get initInput(){let e={isYes:this.isYes,isForce:this.isForce,isQuiet:this.isQuiet,isAgent:this.isAgent};return this.example!==void 0&&(e.example=this.example),this.name!==void 0&&(e.name=this.name),e}getFlagValue(e,t){let n=this.args.findIndex(n=>n===e||n===t);if(n!==-1&&this.args[n+1]&&!this.args[n+1].startsWith(`-`))return this.args[n+1]}},Pt=`0.1.0`,Ft=class{constructor(e){this.logger=e}async execute(){this.logger.log(`ArkEnv CLI v${Pt}`),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(` --force, -f Bypass technical requirement checks and force scaffolding`),this.logger.log(` --agent, -a Agent mode: --yes --quiet --json`),this.logger.log(` --example, -e Specify an example ID to scaffold from (when creating a new project)`),this.logger.log(` --name, -n Specify the project name (when creating a new project)`),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 It=(e,t)=>{let n=e?.length?e.map(e=>`\t\t${e}: "string = ''",`).join(`
|
|
110
112
|
`):` NODE_ENV: "'development' | 'production' | 'test' = 'development'",
|
|
111
|
-
PORT: "number.port = 3000",`;return t===`vite`?
|
|
113
|
+
PORT: "number.port = 3000",`;return t===`vite`?i.default`
|
|
112
114
|
import { type } from "arkenv";
|
|
113
115
|
|
|
114
116
|
/**
|
|
@@ -119,7 +121,7 @@ ${t?(0,i.styleText)(`cyan`,V):``}
|
|
|
119
121
|
export const Env = type({
|
|
120
122
|
${n}
|
|
121
123
|
});
|
|
122
|
-
`:t===`bun-fullstack`?
|
|
124
|
+
`:t===`bun-fullstack`?i.default`
|
|
123
125
|
import { type } from "arkenv";
|
|
124
126
|
|
|
125
127
|
/**
|
|
@@ -130,7 +132,7 @@ ${n}
|
|
|
130
132
|
export const Env = type({
|
|
131
133
|
${n}
|
|
132
134
|
});
|
|
133
|
-
`:
|
|
135
|
+
`:i.default`
|
|
134
136
|
import arkenv, { type } from "arkenv";
|
|
135
137
|
|
|
136
138
|
/**
|
|
@@ -141,12 +143,12 @@ ${n}
|
|
|
141
143
|
});
|
|
142
144
|
|
|
143
145
|
export const env = arkenv(Env);
|
|
144
|
-
`},
|
|
146
|
+
`},Lt=e=>i.default`
|
|
145
147
|
/// <reference types="vite/client" />
|
|
146
148
|
|
|
147
149
|
type ImportMetaEnvAugmented =
|
|
148
150
|
import("@arkenv/vite-plugin").ImportMetaEnvAugmented<
|
|
149
|
-
typeof import("./${
|
|
151
|
+
typeof import("./${r.default.basename(e).replace(/\.(ts|js|tsx|jsx)$/,``)}").Env
|
|
150
152
|
>;
|
|
151
153
|
|
|
152
154
|
interface ImportMetaEnv extends ImportMetaEnvAugmented {}
|
|
@@ -154,19 +156,19 @@ ${n}
|
|
|
154
156
|
interface ImportMeta {
|
|
155
157
|
readonly env: ImportMetaEnv;
|
|
156
158
|
}
|
|
157
|
-
`,
|
|
159
|
+
`,Rt=e=>i.default`
|
|
158
160
|
/// <reference types="bun-types" />
|
|
159
161
|
|
|
160
162
|
type ProcessEnvAugmented = import("@arkenv/bun-plugin").ProcessEnvAugmented<
|
|
161
|
-
typeof import("./${
|
|
163
|
+
typeof import("./${r.default.basename(e).replace(/\.(ts|js|tsx|jsx)$/,``)}").Env
|
|
162
164
|
>;
|
|
163
165
|
|
|
164
166
|
declare namespace NodeJS {
|
|
165
167
|
interface ProcessEnv extends ProcessEnvAugmented {}
|
|
166
168
|
}
|
|
167
|
-
`,
|
|
169
|
+
`,zt=(e,t)=>{let n=e?.length?e.map(e=>`\t\t${e}: v.optional(v.string(), ""),`).join(`
|
|
168
170
|
`):` NODE_ENV: v.optional(v.picklist(["development", "production", "test"]), "development"),
|
|
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`?
|
|
171
|
+
PORT: v.optional(v.pipe(v.string(), v.transform(Number), v.number(), v.integer(), v.minValue(1), v.maxValue(65535)), 3000),`;return t===`vite`?i.default`
|
|
170
172
|
import * as v from "valibot";
|
|
171
173
|
|
|
172
174
|
/**
|
|
@@ -177,7 +179,7 @@ ${n}
|
|
|
177
179
|
export const Env = v.object({
|
|
178
180
|
${n}
|
|
179
181
|
});
|
|
180
|
-
`:t===`bun-fullstack`?
|
|
182
|
+
`:t===`bun-fullstack`?i.default`
|
|
181
183
|
import * as v from "valibot";
|
|
182
184
|
|
|
183
185
|
/**
|
|
@@ -188,7 +190,7 @@ ${n}
|
|
|
188
190
|
export const Env = v.object({
|
|
189
191
|
${n}
|
|
190
192
|
});
|
|
191
|
-
`:
|
|
193
|
+
`:i.default`
|
|
192
194
|
import arkenv from "arkenv/standard";
|
|
193
195
|
import * as v from "valibot";
|
|
194
196
|
|
|
@@ -200,9 +202,9 @@ ${n}
|
|
|
200
202
|
});
|
|
201
203
|
|
|
202
204
|
export const env = arkenv(Env);
|
|
203
|
-
`},
|
|
205
|
+
`},Bt=(e,t)=>{let n=e?.length?e.map(e=>`\t\t${e}: z.string().default(""),`).join(`
|
|
204
206
|
`):` NODE_ENV: z.enum(["development", "production", "test"]).default("development"),
|
|
205
|
-
PORT: z.coerce.number().int().min(1).max(65535).default(3000),`;return t===`vite`?
|
|
207
|
+
PORT: z.coerce.number().int().min(1).max(65535).default(3000),`;return t===`vite`?i.default`
|
|
206
208
|
import { z } from "zod";
|
|
207
209
|
|
|
208
210
|
/**
|
|
@@ -213,7 +215,7 @@ ${n}
|
|
|
213
215
|
export const Env = z.object({
|
|
214
216
|
${n}
|
|
215
217
|
});
|
|
216
|
-
`:t===`bun-fullstack`?
|
|
218
|
+
`:t===`bun-fullstack`?i.default`
|
|
217
219
|
import { z } from "zod";
|
|
218
220
|
|
|
219
221
|
/**
|
|
@@ -224,7 +226,7 @@ ${n}
|
|
|
224
226
|
export const Env = z.object({
|
|
225
227
|
${n}
|
|
226
228
|
});
|
|
227
|
-
`:
|
|
229
|
+
`:i.default`
|
|
228
230
|
import arkenv from "arkenv/standard";
|
|
229
231
|
import { z } from "zod";
|
|
230
232
|
|
|
@@ -236,12 +238,12 @@ ${n}
|
|
|
236
238
|
});
|
|
237
239
|
|
|
238
240
|
export const env = arkenv(Env);
|
|
239
|
-
`};function
|
|
241
|
+
`};function Vt(e){let{validator:t,envKeys:n,framework:r}=e;switch(t){case`arktype`:return`${It(n,r)}\n`;case`zod`:return`${Bt(n,r)}\n`;case`valibot`:return`${zt(n,r)}\n`;default:throw Error(`Unsupported validator: ${t}`)}}async function Ht(e,t){let i=r.default.join(process.cwd(),`.arkenv-temp`);await e.mkdir(i,!0);try{await e.execute(`git`,[`clone`,`--filter=blob:none`,`--sparse`,t.repository,i]);let a=`examples/${t.example}`;await e.execute(`git`,[`-C`,i,`sparse-checkout`,`set`,a]),await Ut(r.default.join(i,a),process.cwd());for(let e of[`package-lock.json`,`pnpm-lock.yaml`,`yarn.lock`,`bun.lockb`,`bun.lock`])await n.default.rm(r.default.join(process.cwd(),e),{force:!0});let o=r.default.join(process.cwd(),`package.json`);if(await e.exists(o)){let n=await e.readFile(o),r=JSON.parse(n);r.name=t.targetName,await e.writeFile(o,JSON.stringify(r,null,2))}}finally{await n.default.rm(i,{recursive:!0,force:!0})}}async function Ut(e,t){let i=await n.default.readdir(e);await Promise.all(i.map(i=>n.default.cp(r.default.join(e,i),r.default.join(t,i),{recursive:!0,force:!1})))}function Wt(e,t){let n=t.length>0;switch(e){case`pnpm`:return[`pnpm`,[n?`add`:`install`,...t]];case`yarn`:return[`yarn`,[n?`add`:`install`,...t]];case`bun`:return[`bun`,[n?`add`:`install`,...t]];default:return[`npm`,[`install`,...t]]}}function Gt(e){return e.metadata.framework===`vite`?`2. Access via ${Z(`import.meta.env.YOUR_VAR`)}`:e.metadata.framework===`bun-fullstack`?`2. Access via ${Z(`process.env.YOUR_VAR`)}`:`2. Import and use: ${Z(`import { env } from "${e.metadata.importPath}"`)}`}function Kt(e,t){if(t)return{message:i.default`
|
|
240
242
|
Inside your AI assistant (e.g. Claude Code), use:
|
|
241
243
|
${Z(`/arkenv`)} - automatically refine your schema and configure integrations.
|
|
242
|
-
`,title:`Next steps`};let n=e.skill?.dlxCommand.join(` `)||`npx`,
|
|
244
|
+
`,title:`Next steps`};let n=e.skill?.dlxCommand.join(` `)||`npx`,r=e.skill?.packageName||`yamcodes/arkenv`,a=Gt(e);return{message:i.default`
|
|
243
245
|
1. Check ${Z(e.metadata.displayPath)} and refine your environment schema.
|
|
244
246
|
${a}
|
|
245
|
-
3. (Recommended) Install the AI skill: ${Z(`${n} skills add ${
|
|
247
|
+
3. (Recommended) Install the AI skill: ${Z(`${n} skills add ${r}`)}
|
|
246
248
|
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)});
|
|
249
|
+
`,title:`Next steps`}}var qt=class{constructor(e,t){this.workspace=e,this.reporter=t}async execute(e){let t=this.reporter.spinner();t.start(`Scaffolding ArkEnv configuration...`);try{e.clone&&(t.stop(`Starting new project scaffolding...`),this.reporter.step(`Cloning example ${Z(e.clone.example)}...`),await Ht(this.workspace,e.clone),t.start(`Scaffolding complete, finalizing...`));for(let t of e.files){if(t.action===`append`){if(!e.bootstrap||e.bootstrap.framework!==`vite`&&e.bootstrap.framework!==`bun-fullstack`){this.reporter.warn(`Skipping safe-append for ${Z(r.default.basename(t.path))}: unsupported framework.`);continue}await this.workspace.safeAppend(t.path,t.content,e.bootstrap.framework)?this.reporter.info(`Appended ArkEnv types to ${Z(r.default.basename(t.path))}.`):this.reporter.info(`${Z(r.default.basename(t.path))} already contains ArkEnv types.`);continue}if(await this.workspace.mkdir(r.default.dirname(t.path),!0),await this.workspace.writeFile(t.path,t.content),t.label!==`environment schema`&&t.label?.includes(`types`)){let e=t.action===`overwrite`?`Updated`:`Created`;this.reporter.info(`${e} ${Z(r.default.basename(t.path))} for typesafe environment variables.`)}}if(t.stop(`Configuration scaffolded!`),e.install&&process.env.SKIP_INSTALL!==`true`){this.reporter.step(`Installing dependencies with ${Z(e.install.packageManager)}...`);let[t,n]=Wt(e.install.packageManager,e.install.dependencies);await this.workspace.execute(t,n)}let n=!1;if(e.tsConfig){let t=await this.workspace.updateTsConfigToStrict(e.tsConfig.path);t.status===`updated`?(this.reporter.info(`Enforced strict: true in your ${Z(t.file)}`),n=!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 n=await this.workspace.bootstrapViteConfig(t,e.bootstrap.importPath||`./src/env`);n.success?n.updated&&this.reporter.info(`Updated ${Z(r.default.basename(t))}`):(this.reporter.warn(`Could not automatically update ${Z(r.default.basename(t))}: ${n.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=Kt(e,i);this.reporter.note(a.message,a.title),this.reporter.finish(`${bt} ArkEnv scaffolding complete. Happy coding!`,{path:e.metadata.displayPath,framework:e.metadata.framework,validator:e.metadata.validator,packageManager:e.metadata.packageManager,tsConfigUpdated:n,skillInstalled:i})}catch(e){throw t.stop(`Scaffolding failed.`),e}}};function Jt(e){switch(e){case`pnpm`:return[`pnpm`,`dlx`];case`yarn`:return[`yarn`,`dlx`];case`bun`:return[`bunx`];default:return[`npx`]}}function Yt(e){let{mode:n,options:i,packageManager:a,tsConfig:o,shouldUpdateTsConfig:s,cwd:c,existingFiles:l}=e,u={files:[],metadata:(0,t.shake)({displayPath:``,framework:i.framework,validator:i.validator,packageManager:a,importPath:``,mode:n,example:i.example,name:i.name})};if(n===`new`)return u.clone={repository:`https://github.com/yamcodes/arkenv.git`,example:i.example,targetName:i.name},u.install={packageManager:a,dependencies:[]},i.installSkill&&(u.skill={dlxCommand:Jt(a),packageName:`yamcodes/arkenv`,isYes:e.isYes}),u.metadata.displayPath=`./src/env.ts`,u.metadata.importPath=`./src/env`,u;let d=r.default.resolve(c,i.path),f=r.default.dirname(d),p=Vt(i),m=l.includes(d);(!m||i.overwriteEnvSchemaFile!==!1)&&u.files.push({path:d,content:p,action:m?`overwrite`:`create`,label:`environment schema`});let h=[`arkenv`,i.validator];if(i.framework===`vite`&&h.push(`@arkenv/vite-plugin`),i.framework===`bun-fullstack`&&i.bunFeatures?.length&&h.push(`@arkenv/bun-plugin`),u.install={packageManager:a,dependencies:h},s&&o.file&&(u.tsConfig={path:r.default.resolve(c,o.file),action:`strict`}),(i.framework===`vite`||i.framework===`bun-fullstack`&&i.bunFeatures?.length)&&i.installTypeDefinitions!==!1){let e=i.framework===`vite`?`vite-env.d.ts`:`bun-env.d.ts`,t=r.default.join(f,e),n=l.includes(t);if(i.envDtsHandling!==`skip`)if(i.envDtsHandling===`append`||!i.envDtsHandling&&n)u.files.push({path:t,content:d,action:`append`,label:`${i.framework} types`});else{let e=i.framework===`vite`?Lt(i.path):Rt(i.path);u.files.push({path:t,content:e,action:n?`overwrite`:`create`,label:`${i.framework} types`})}}(i.framework===`vite`||i.framework===`bun-fullstack`)&&(u.bootstrap=(0,t.shake)({framework:i.framework,bunFeatures:i.framework===`bun-fullstack`?i.bunFeatures:void 0})),i.installSkill&&(u.skill={dlxCommand:Jt(a),packageName:`yamcodes/arkenv`,isYes:e.isYes});let g=r.default.relative(c,d).replace(/\\/g,`/`),_=g.startsWith(`.`)?g:`./${g}`,v=_.replace(/\.(ts|js|tsx|jsx)$/,``);return u.metadata.displayPath=_,u.metadata.importPath=v,u.bootstrap&&(u.bootstrap.importPath=v),u}var Xt=class{async fetchRegistry(){try{let e=await fetch(`https://raw.githubusercontent.com/yamcodes/arkenv/main/examples/registry.json`);if(!e.ok)throw Error(`Failed to fetch registry: ${e.statusText}`);return await e.json()}catch{return{examples:[{id:`basic`,name:`Basic`,description:`A minimal ArkEnv setup in Node.js`,framework:`vanilla`},{id:`with-vite-react`,name:`React + Vite`,framework:`vite`},{id:`with-bun-react`,name:`React + Bun fullstack dev server`,framework:`bun-fullstack`},{id:`with-zod`,name:`Zod`,description:`ArkEnv with Zod in Node.js`,framework:`vanilla`}]}}}},Zt=class{constructor(e,t,n,r,i=new Xt){this.logger=e,this.workspace=t,this.prompt=n,this.scanner=r,this.registry=i}async execute(e){let t=await this.collect(e);if(!t)return!1;let n=Yt(t),r=new qt(this.workspace,this.logger);try{await r.execute(n)}catch(e){this.logger.fatal(`Scaffolding failed.`,e)}return!0}async collect(e){this.logger.interactiveStdout(!0);try{let t=await this.scanner.hasPackageJson(),n=await this.scanner.isEmptyDirectory();return t?await this.collectExistingProject(e):n||e.isForce?await this.collectNewProject(e):(this.logger.error(`Directory is not empty and no ${Z(`package.json`)} was found.`),this.logger.info(`To scaffold a new project, run ${Z(`arkenv init`)} in an empty directory or use ${Z(`--force`)} to proceed anyway.`),null)}finally{this.logger.interactiveStdout(!1)}}async collectExistingProject(e){let{isYes:n,isForce:i,isAgent:a}=e,o=await this.scanner.checkRequirements(process.cwd()),s=o.filter(e=>e.status===`fail`),c=o.filter(e=>e.status===`warn`);for(let e of c)this.logger.warn(`${e.requirement}: ${e.message}`);if(s.length>0)if(i){this.logger.warn(`Technical requirements not met, but continuing due to --force flag.`);for(let e of s)this.logger.warn(`${e.requirement}: ${e.message}`)}else{this.logger.error(`Technical requirements not met:`);for(let e of s)this.logger.error(`- ${e.requirement}: ${e.message}${e.current?` (Current: ${e.current}, Expected: ${e.expected})`:``}`);return this.logger.info(`Use --force to bypass these checks.`),null}let l=!1,u=await this.scanner.checkTsConfig();if(u.status===`not_strict`)if(n)l=!0;else{this.logger.warn(`TypeScript strict mode is not enabled in your ${Z(u.file)}.`);let e=await this.prompt.confirm(`ArkEnv requires ${Z(`strict`)} mode in your ${Z(u.file)}. Would you like to enable it now?`,!0,`Yes (Recommended)`);if(e===null)return null;if(!e)return this.logger.cancel(`Operation cancelled.`),null;l=!0}let d=await this.scanner.detectFramework(process.cwd(),u.parsed),f=d===`bun-fullstack`?await this.scanner.detectBunFeatures(process.cwd(),u.parsed):void 0,p=await this.scanner.suggestDefaultEnvPath(process.cwd(),u.parsed),m=r.default.resolve(process.cwd(),p),h=await this.scanner.getEnvExampleKeys(process.cwd(),u.parsed,m),g=!1;if(d===`vite`||d===`bun-fullstack`){let e=d===`vite`?`vite-env.d.ts`:`bun-env.d.ts`,t=r.default.dirname(m),n=r.default.join(t,e);g=await this.workspace.exists(n)}let _=await this.prompt.runWizard((0,t.shake)({mode:`existing`,framework:d,bunFeatures:f,defaultEnvPath:p,tsConfig:u.parsed??null,envKeys:h?.keys,envKeysSource:h?.source,hasTypeFile:g}),n);if(_===null)return null;if(a)_.installSkill=!1;else if(n)_.installSkill=!0;else{let e=await this.prompt.confirm(`Would you like to install the ArkEnv agent skill?`,!0,`Yes (Recommended)`);if(e===null)return null;_.installSkill=e}let v=r.default.resolve(process.cwd(),_.path);if(await this.workspace.exists(v)&&_.overwriteEnvSchemaFile===void 0){let e=await this.prompt.confirm(`File ${Z(r.default.basename(v))} already exists. Overwrite?`,!1);if(e===null)return null;if(!e)return this.logger.cancel(`Operation cancelled.`),null;_.overwriteEnvSchemaFile=e}let y=await this.scanner.detectPackageManager(process.cwd(),u.parsed),b=[];await this.workspace.exists(v)&&b.push(v);let x;if(_.framework===`vite`?x=`vite-env.d.ts`:_.framework===`bun-fullstack`&&(x=`bun-env.d.ts`),x){let e=r.default.dirname(v),t=r.default.join(e,x);await this.workspace.exists(t)&&b.push(t)}return(0,t.shake)({mode:`existing`,cwd:process.cwd(),options:_,detectedFramework:d,detectedBunFeatures:f,packageManager:y,tsConfig:u,shouldUpdateTsConfig:l,existingFiles:b,isYes:n})}async collectNewProject(e){let{isYes:n,isAgent:r,example:i,name:a}=e,o=await this.registry.fetchRegistry(),s=await this.prompt.runWizard((0,t.shake)({mode:`new`,examples:o.examples,example:i,name:a}),n);if(s===null)return null;let c=this.detectPackageManager();return(0,t.shake)({mode:`new`,cwd:process.cwd(),options:s,detectedFramework:s.framework,packageManager:c,tsConfig:{status:`not_found`},shouldUpdateTsConfig:!1,existingFiles:[],isYes:n})}detectPackageManager(){let e=process.env.npm_config_user_agent||``;return e.includes(`pnpm`)?`pnpm`:e.includes(`yarn`)?`yarn`:e.includes(`bun`)?`bun`:`npm`}};function Qt(e){let t=new Nt(e),n=t.logger,r=new Dt(t.isQuiet,n.stdio),i=new Mt;return{cli:t,logger:n,workspace:r,prompt:i,initUseCase:new Zt(n,r,i,new yt),helpUseCase:new Ft(n)}}let $,$t=!1;async function en(){let{cli:e,logger:n,initUseCase:r,helpUseCase:i}=Qt(process.argv);$=n,tn(n),e.helpRequested&&(await i.execute(),await n.flush(),process.exit(0)),e.command!==`init`&&(e.command?n.error(`Unknown command: ${e.command}`):n.error(`Missing command.`),await i.execute(),await n.flush(),process.exit(1));try{await r.execute((0,t.shake)(e.initInput))||(await n.flush(),process.exit(1))}catch(e){try{n.fatal(`An unexpected error occurred`,e)}catch{}await n.flush(),process.exit(1)}}function tn(e){let t=async t=>{$t&&process.exit(t),$t=!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))}en(),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)});
|