arkenv 1.0.0-alpha.2 → 1.0.0-alpha.20
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/LICENSE +3 -0
- package/README.md +24 -77
- package/dist/bin.cjs +178 -0
- package/dist/bin.d.cts +1 -0
- package/dist/bin.d.ts +1 -0
- package/dist/bin.js +178 -0
- package/dist/chunk-i8uDWG73.cjs +1 -0
- package/dist/dist-CSf6owGv.cjs +4 -0
- package/dist/dist-iC9ZVx-X.js +4 -0
- package/dist/index.cjs +1 -8
- package/dist/index.d.cts +8 -230
- package/dist/index.d.ts +13 -0
- package/dist/index.js +1 -0
- package/package.json +36 -79
- package/dist/core-7-JO-N-w.d.cts +0 -82
- package/dist/core-7-JO-N-w.d.cts.map +0 -1
- package/dist/core-A65KioHX.mjs +0 -6
- package/dist/core-A65KioHX.mjs.map +0 -1
- package/dist/core-BaGd9k2K.d.mts +0 -76
- package/dist/core-BaGd9k2K.d.mts.map +0 -1
- package/dist/core-CA13n2Iu.cjs +0 -11
- package/dist/core.cjs +0 -8
- package/dist/core.d.cts +0 -9
- package/dist/core.d.mts +0 -2
- package/dist/core.mjs +0 -1
- package/dist/errors-C_uh86xh.mjs +0 -3
- package/dist/errors-C_uh86xh.mjs.map +0 -1
- package/dist/errors-Dn6WQ2pP.cjs +0 -8
- package/dist/index-Do-2CL1V.d.cts +0 -210
- package/dist/index-Do-2CL1V.d.cts.map +0 -1
- package/dist/index-NbQAnciD.d.mts +0 -204
- package/dist/index-NbQAnciD.d.mts.map +0 -1
- package/dist/index.d.cts.map +0 -1
- package/dist/index.d.mts +0 -229
- package/dist/index.d.mts.map +0 -1
- package/dist/index.mjs +0 -3
- package/dist/index.mjs.map +0 -1
- package/dist/standard.cjs +0 -8
- package/dist/standard.d.cts +0 -111
- package/dist/standard.d.cts.map +0 -1
- package/dist/standard.d.mts +0 -105
- package/dist/standard.d.mts.map +0 -1
- package/dist/standard.mjs +0 -3
- package/dist/standard.mjs.map +0 -1
package/LICENSE
CHANGED
|
@@ -19,3 +19,6 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
19
19
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
20
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
21
|
SOFTWARE.
|
|
22
|
+
|
|
23
|
+
The `apps/dash` maintainer dashboard is licensed separately under
|
|
24
|
+
AGPL-3.0-or-later. See `apps/dash/LICENSE`.
|
package/README.md
CHANGED
|
@@ -1,104 +1,51 @@
|
|
|
1
|
-
|
|
2
|
-
<a href="https://github.com/yamcodes/arkenv/blob/main/apps/www/public/assets/icon.svg"><img alt="ArkEnv Logo" src="https://arkenv.js.org/assets/icon.svg" width="160px" align="center"/></a>
|
|
3
|
-
<h1 align="center">ArkEnv</h1>
|
|
4
|
-
<div align="center">
|
|
5
|
-
<p align="center">
|
|
6
|
-
Environment variable validation from editor to runtime<br/> for <a href="https://nextjs.org/">Next.js</a>, <a href="https://nuxt.com/">Nuxt</a>, <a href="https://nodejs.org/">Node.js</a>, <a href="https://vite.dev/">Vite</a>, and <a href="https://bun.com/">Bun</a>
|
|
7
|
-
</p>
|
|
8
|
-
<a href="https://github.com/yamcodes/arkenv/actions/workflows/test.yml?query=branch%3Amain"><img alt="Test Status" src="https://github.com/yamcodes/arkenv/actions/workflows/tests-badge.yml/badge.svg?branch=main"></a>
|
|
9
|
-
<a href="https://bundlephobia.com/package/arkenv"><img alt="npm bundle size" src="https://img.shields.io/bundlephobia/minzip/arkenv"></a>
|
|
10
|
-
<a href="https://arktype.io/docs/ecosystem#arkenv"><img alt="ArkType Ecosystem" src="https://custom-icon-badges.demolab.com/badge/ArkType%20Ecosystem-0d1526?logo=arktype2&logoColor=e9eef9"></a>
|
|
11
|
-
<a href="https://pullfrog.com"><img alt="Pullfrog" src="https://custom-icon-badges.demolab.com/badge/Powered%20by%20Pullfrog-2f4032?logo=pullfrog-white"></a>
|
|
12
|
-
</div>
|
|
13
|
-
</p>
|
|
14
|
-
|
|
15
|
-
<div align="center">
|
|
16
|
-
<a href="https://arkenv.js.org/docs/arkenv">Docs</a>
|
|
17
|
-
<span> • </span>
|
|
18
|
-
<a href="https://arkenv.js.org/docs/arkenv/faq">FAQ</a>
|
|
19
|
-
<span> • </span>
|
|
20
|
-
<a href="https://stackblitz.com/github/yamcodes/arkenv/tree/main/examples/stackblitz?file=index.ts">Try on StackBlitz</a>
|
|
21
|
-
<br />
|
|
22
|
-
</div>
|
|
1
|
+
# `arkenv` (CLI)
|
|
23
2
|
|
|
24
|
-
|
|
25
|
-
<br />
|
|
3
|
+
The interactive, zero-dependency scaffolding experience for the [ArkEnv](https://arkenv.js.org) ecosystem.
|
|
26
4
|
|
|
27
|
-
<
|
|
28
|
-
<img alt="ArkEnv Demo" src="https://arkenv.js.org/assets/demo.gif" />
|
|
29
|
-
</p>
|
|
5
|
+
<br />
|
|
30
6
|
|
|
31
7
|
<br />
|
|
32
8
|
|
|
9
|
+
<br />
|
|
33
10
|
|
|
11
|
+
## Quickstart
|
|
34
12
|
|
|
35
|
-
|
|
36
|
-
<summary>npm</summary>
|
|
13
|
+
### Scaffolding (Day 1)
|
|
37
14
|
|
|
38
15
|
```sh
|
|
39
|
-
npx
|
|
16
|
+
npx arkenv init
|
|
40
17
|
```
|
|
41
18
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
<details>
|
|
45
|
-
<summary>pnpm</summary>
|
|
19
|
+
### Local installation (Daily driver & CI)
|
|
46
20
|
|
|
47
21
|
```sh
|
|
48
|
-
|
|
22
|
+
npm install @arkenv/core
|
|
23
|
+
npm install -D arkenv
|
|
49
24
|
```
|
|
50
25
|
|
|
51
|
-
|
|
26
|
+
## Related
|
|
52
27
|
|
|
53
|
-
|
|
54
|
-
|
|
28
|
+
- [ArkEnv](https://arkenv.js.org) - Core library and docs
|
|
29
|
+
- [ArkType](https://arktype.io/) - Underlying validator / type system
|
|
55
30
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
31
|
+
## Architecture & development
|
|
32
|
+
|
|
33
|
+
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.
|
|
59
34
|
|
|
60
|
-
|
|
35
|
+
### Running the local CLI
|
|
61
36
|
|
|
62
|
-
|
|
63
|
-
<summary>Bun</summary>
|
|
37
|
+
To run your local changes to the CLI from anywhere inside this repository:
|
|
64
38
|
|
|
65
39
|
```sh
|
|
66
|
-
|
|
40
|
+
pnpm arkenv [command]
|
|
67
41
|
```
|
|
68
42
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
<br />
|
|
72
|
-
|
|
73
|
-
### [Read the docs →](https://arkenv.js.org/docs/ArkEnv/quickstart)
|
|
74
|
-
|
|
75
|
-
<br />
|
|
76
|
-
|
|
77
|
-
## Supporting ArkEnv
|
|
78
|
-
|
|
79
|
-
If you love ArkEnv, you can support the project by **starring it on GitHub**!
|
|
80
|
-
|
|
81
|
-
You are also welcome to [contribute to the project](https://github.com/yamcodes/arkenv/blob/main/docs/CONTRIBUTING.md) and join the wonderful people who have contributed:
|
|
43
|
+
This root workspace script will automatically rebuild `arkenv` (CLI) and execute the built bundle via Node.
|
|
82
44
|
|
|
83
|
-
|
|
84
|
-
<!-- prettier-ignore-start -->
|
|
85
|
-
<!-- markdownlint-disable -->
|
|
86
|
-
<table>
|
|
87
|
-
<tbody>
|
|
88
|
-
<tr>
|
|
89
|
-
<td align="center" valign="top" width="14.28%"><a href="https://yam.codes"><img src="https://avatars.githubusercontent.com/u/2014360?v=4?s=100" width="100px;" alt="Yam C Borodetsky"/><br /><sub><b>Yam C Borodetsky</b></sub></a><br /><a href="https://github.com/yamcodes/arkenv/commits?author=yamcodes" title="Code">💻</a> <a href="#question-yamcodes" title="Answering Questions">💬</a> <a href="#ideas-yamcodes" title="Ideas, Planning, & Feedback">🤔</a> <a href="#design-yamcodes" title="Design">🎨</a> <a href="https://github.com/yamcodes/arkenv/commits?author=yamcodes" title="Documentation">📖</a> <a href="https://github.com/yamcodes/arkenv/issues?q=author%3Ayamcodes" title="Bug reports">🐛</a> <a href="#example-yamcodes" title="Examples">💡</a> <a href="#infra-yamcodes" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/yamcodes/arkenv/commits?author=yamcodes" title="Tests">⚠️</a></td>
|
|
90
|
-
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aruaycodes"><img src="https://avatars.githubusercontent.com/u/57131628?v=4?s=100" width="100px;" alt="Aruay Berdikulova"/><br /><sub><b>Aruay Berdikulova</b></sub></a><br /><a href="https://github.com/yamcodes/arkenv/commits?author=aruaycodes" title="Code">💻</a> <a href="#ideas-aruaycodes" title="Ideas, Planning, & Feedback">🤔</a></td>
|
|
91
|
-
<td align="center" valign="top" width="14.28%"><a href="https://arktype.io"><img src="https://avatars.githubusercontent.com/u/10645823?v=4?s=100" width="100px;" alt="David Blass"/><br /><sub><b>David Blass</b></sub></a><br /><a href="#ideas-ssalbdivad" title="Ideas, Planning, & Feedback">🤔</a> <a href="#mentoring-ssalbdivad" title="Mentoring">🧑🏫</a> <a href="#question-ssalbdivad" title="Answering Questions">💬</a></td>
|
|
92
|
-
<td align="center" valign="top" width="14.28%"><a href="https://github.com/danciudev"><img src="https://avatars.githubusercontent.com/u/44430251?v=4?s=100" width="100px;" alt="Andrei Danciu"/><br /><sub><b>Andrei Danciu</b></sub></a><br /><a href="https://github.com/yamcodes/arkenv/commits?author=danciudev" title="Code">💻</a></td>
|
|
93
|
-
<td align="center" valign="top" width="14.28%"><a href="https://joakim.beng.se"><img src="https://avatars.githubusercontent.com/u/1427383?v=4?s=100" width="100px;" alt="Joakim Carlstein"/><br /><sub><b>Joakim Carlstein</b></sub></a><br /><a href="https://github.com/yamcodes/arkenv/commits?author=joakimbeng" title="Code">💻</a> <a href="https://github.com/yamcodes/arkenv/commits?author=joakimbeng" title="Documentation">📖</a></td>
|
|
94
|
-
<td align="center" valign="top" width="14.28%"><a href="https://fresh-accordion-06a.notion.site/Jiayi-Du-1817075e92978076b95cf9d90fb5eceb"><img src="https://avatars.githubusercontent.com/u/166608075?v=4?s=100" width="100px;" alt="RoomWithOutRoof"/><br /><sub><b>RoomWithOutRoof</b></sub></a><br /><a href="https://github.com/yamcodes/arkenv/commits?author=Jah-yee" title="Documentation">📖</a></td>
|
|
95
|
-
</tr>
|
|
96
|
-
</tbody>
|
|
97
|
-
</table>
|
|
45
|
+
### Local environment adapters (`Node*`)
|
|
98
46
|
|
|
99
|
-
|
|
100
|
-
<!-- prettier-ignore-end -->
|
|
47
|
+
Implementations prefixed with `Node` (e.g., `NodeWorkspace`, `NodeProjectScanner`) represent the standard local development environment. They utilize standard `node:*` APIs (like `node:fs` and `node:child_process`) which are universally supported across modern runtimes including Node.js, Bun, and Deno. This naming reflects the API standard used rather than a runtime restriction.
|
|
101
48
|
|
|
102
|
-
|
|
49
|
+
## License
|
|
103
50
|
|
|
104
|
-
|
|
51
|
+
MIT
|
package/dist/bin.cjs
ADDED
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
const e=require(`./chunk-i8uDWG73.cjs`),t=require(`./dist-CSf6owGv.cjs`);let n=require(`radashi`),r=require(`node:util`),i=require(`node:process`);i=e.r(i,1);let a=require(`node:readline`);a=e.r(a,1);let o=require(`node:tty`);require(`node:fs`);let s=require(`node:path`);s=e.r(s,1);let c=require(`jiti`),l=require(`node:child_process`),u=require(`node:fs/promises`);u=e.r(u,1);let d=require(`node:module`),f=require(`jsonc-parser`),p=require(`dedent`);p=e.r(p,1);let m=require(`magicast`),h=require(`yaml`);var g=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})),_=e.r(g(),1);const v={REQUIREMENTS_NOT_MET:`CLI.REQUIREMENTS_NOT_MET`,GIT_TREE_DIRTY:`CLI.GIT_TREE_DIRTY`,NON_EMPTY_DIR:`CLI.NON_EMPTY_DIR`,INTERNAL:`CLI.INTERNAL_ERROR`,SCHEMA_NOT_FOUND:`CLI.SCHEMA_NOT_FOUND`,CANCELLED:`CLI.CANCELLED`,UNKNOWN_COMMAND:`CLI.UNKNOWN_COMMAND`,INVALID_ARGUMENT:`CLI.INVALID_ARGUMENT`,VALIDATION_FAILED:`ENV.VALIDATION_FAILED`,INVALID_VALUE:`ENV.INVALID_VALUE`,MISSING_VARIABLE:`ENV.MISSING_VARIABLE`},y={CLI_INTERNAL_ERROR:`CLI.INTERNAL_ERROR`,CLI_SCHEMA_NOT_FOUND:`CLI.SCHEMA_NOT_FOUND`,CLI_REQUIREMENTS_NOT_MET:`CLI.REQUIREMENTS_NOT_MET`,CLI_GIT_TREE_DIRTY:`CLI.GIT_TREE_DIRTY`,CLI_NON_EMPTY_DIR:`CLI.NON_EMPTY_DIR`,CLI_CANCELLED:`CLI.CANCELLED`,CLI_UNKNOWN_COMMAND:`CLI.UNKNOWN_COMMAND`,CLI_INVALID_ARGUMENT:`CLI.INVALID_ARGUMENT`,ENV_VALIDATION_FAILED:`ENV.VALIDATION_FAILED`,ENV_INVALID_VALUE:`ENV.INVALID_VALUE`,ENV_MISSING_VARIABLE:`ENV.MISSING_VARIABLE`};function b(){let e=process.env.npm_config_user_agent||``;if(e.includes(`pnpm`))return process.env.npm_command===`dlx`?`pnpm dlx arkenv`:`pnpm arkenv`;if(e.includes(`bun`))return(process.env._||process.argv[1]||``).includes(`bunx`)||process.env.npm_command===`x`?`bunx arkenv`:`bun arkenv`;if(e.includes(`yarn`))return process.env.npm_command===`dlx`?`yarn dlx arkenv`:`yarn arkenv`;if(e.includes(`npm`))return`npx arkenv`;let t=process.env._||process.argv[1]||``;return t.includes(`npx`)?`npx arkenv`:t.includes(`bunx`)?`bunx arkenv`:t.includes(`pnpm`)?`pnpm arkenv`:t.includes(`yarn`)?`yarn arkenv`:t.includes(`bun`)?`bun arkenv`:`arkenv`}function x(e,t=b()){return e.replace(/\{bin\}/g,t)}function S(e,t=b()){let n={...e};return n.command&&=x(n.command,t),n.commands&&=n.commands.map(e=>x(e,t)),n}function C(e){return e.replace(/\x1B\[\d+m/g,``).replace(/\x1B\[[0-9;]*[a-zA-Z]/g,``)}function w(e,n,r){let i=C(e);return r?.debugSecrets||t.s(r?.debugSecrets)?i:n&&t.l(n)?i.replace(/\(was .*\)/g,`(was [REDACTED])`):i}var ee=class{info(e){process.stderr.write(`${_.default.blue(`ℹ ${e}`)}\n`)}warn(e){process.stderr.write(`${_.default.yellow(`⚠ ${e}`)}\n`)}error(e){process.stderr.write(`${_.default.red(`✘ ${e}`)}\n`)}success(e){process.stderr.write(`${_.default.green(`✔ ${e}`)}\n`)}step(e){process.stderr.write(`○ ${e}\n`)}note(e,t){process.stderr.write(`${_.default.dim(`○ ${t?`${t}: `:``}${e}`)}\n`)}log(e){process.stderr.write(`${e}\n`)}spinner(){return{start:e=>process.stderr.write(`${_.default.dim(`○ ${e}...`)}\n`),stop:e=>process.stderr.write(`${_.default.green(`✔ ${e}`)}\n`),message:e=>process.stderr.write(`${_.default.dim(`○ ${e}...`)}\n`)}}json(e){process.stdout.write(`${JSON.stringify(e,null,2)}\n`)}reportCompleted(e){let t=e.diagnostics.map(e=>({...e,nextActions:(e.nextActions??[]).map(e=>S(e))})),n=(e.nextActions??[]).map(e=>S(e));this.json({ok:!0,commandId:e.commandId,result:e.result,exitCode:e.exitCode,diagnostics:t,nextActions:n})}reportErrored(e){let t=(e.error.nextActions??[]).map(e=>S(e)),n=(e.nextActions??t).map(e=>S(e)),r=(e.diagnostics??[]).map(e=>({...e,nextActions:(e.nextActions??[]).map(e=>S(e))}));this.json({ok:!1,commandId:e.commandId,error:{...e.error,nextActions:t},diagnostics:r,nextActions:n})}cancel(e,t=`cli`){this.reportErrored({ok:!1,commandId:t,error:{code:v.CANCELLED,severity:`info`,summary:w(e),nextActions:[]},diagnostics:[],nextActions:[]})}fatal(e,t,n=`cli`){let r=t instanceof Error?t.message:t?String(t):void 0;throw this.reportErrored({ok:!1,commandId:n,error:{code:v.INTERNAL,severity:`error`,summary:w(e),...r===void 0?{}:{why:w(r)},...r===void 0?{}:{meta:{error:r}},nextActions:[]},diagnostics:[],nextActions:[]}),t instanceof Error?t:Error(e)}refuse(e,t=`init`){let n=e.nextActions??(e.retryWith?.includes(`--force`)?[{kind:`run-command`,label:`Re-run with --force to bypass this check`,command:`{bin} ${t} --force`}]:[]);this.reportErrored({ok:!1,commandId:t,error:{code:e.code,severity:`error`,summary:w(e.message),...e.why?{why:w(e.why)}:{},...e.details===void 0?{}:{meta:e.details},nextActions:n},diagnostics:[],nextActions:n})}finish(e,t,n=`init`){this.reportCompleted({ok:!0,commandId:n,result:{message:e,...t??{}},exitCode:0,diagnostics:[],nextActions:[]})}async flush(){return new Promise(e=>{process.stdout.write(``,()=>e())})}},T=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,t){process.stderr.write(`✘ Cancelled: ${e}\n`)}fatal(e,t,n){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)}refuse(e,t){}finish(e,t,n){}reportCompleted(e){}reportErrored(e){}async flush(){return new Promise(e=>{process.stderr.write(``,()=>e())})}};const E=(()=>{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}})(),D=e=>e===12288||e>=65281&&e<=65376||e>=65504&&e<=65510,O=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,k=/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]|\u001b\]8;[^;]*;.*?(?:\u0007|\u001b\u005c)/y,te=/[\x00-\x08\x0A-\x1F\x7F-\x9F]{1,1000}/y,ne=/(?:(?![\uFF61-\uFF9F\uFF00-\uFFEF])[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Hangul}\p{Script=Tangut}]){1,1000}/uy,re=/\t{1,1000}/y,ie=/[\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],[k,0],[te,o],[re,s],[ie,c],[ne,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=D(t)?2:O(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===ne?E(e.slice(p,n.lastIndex)):n===ie?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},A=(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:A(o),c=r.next(),l=r.next(),u=0;for(;!c.done;){let o=c.value,d=A(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&&!A(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=A(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=A(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=A(s.at(-1)??``);continue}if(c+i>t&&c&&i){if(n.wordWrap===!1&&c<t){he(s,r,t),c=A(s.at(-1)??``);continue}s.push(``),c=0}if(c+i>t&&n.wordWrap===!1){he(s,r,t),c=A(s.at(-1)??``);continue}s[s.length-1]+=r,c+=i}n.trim!==!1&&(s=s.map(e=>ge(e)));let l=s.join(`
|
|
3
|
+
`),u=!1;for(let e=0;e<l.length;e++){let t=l[e];if(r+=t,u)u=!1;else if(u=t>=`\ud800`&&t<=`\udbff`,u)continue;if(t===`\x1B`||t===``){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]===`
|
|
4
|
+
`){a&&(r+=me(``));let e=i?fe(i):void 0;i&&e&&(r+=pe(e))}else t===`
|
|
5
|
+
`&&(i&&fe(i)&&(r+=pe(i)),a&&(r+=me(a)))}return r},ve=/\r?\n/;function j(e,t,n){return String(e).normalize().split(ve).map(e=>_e(e,t,n)).join(`
|
|
6
|
+
`)}var M=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 ye(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?ye(a,t<0?-1:1,n):a}const N={actions:new Set([`up`,`down`,`left`,`right`,`space`,`enter`,`cancel`]),aliases:new Map([[`k`,`up`],[`j`,`down`],[`h`,`left`],[`l`,`right`],[``,`cancel`],[`escape`,`cancel`]]),messages:{cancel:`Canceled`,error:`Something went wrong`},withGuide:!0,date:{monthNames:[...[`January`,`February`,`March`,`April`,`May`,`June`,`July`,`August`,`September`,`October`,`November`,`December`]],messages:{required:`Please enter a valid date`,invalidMonth:`There are only 12 months in a year`,invalidDay:(e,t)=>`There are only ${e} days in ${t}`,afterMin:e=>`Date must be on or after ${e.toISOString().slice(0,10)}`,beforeMax:e=>`Date must be on or before ${e.toISOString().slice(0,10)}`}}};function be(e,t){if(typeof e==`string`)return N.aliases.get(e)===t;for(let n of e)if(n!==void 0&&be(n,t))return!0;return!1}function xe(e,t){if(e===t)return;let n=e.split(`
|
|
7
|
+
`),r=t.split(`
|
|
8
|
+
`),i=Math.max(n.length,r.length),a=[];for(let e=0;e<i;e++)n[e]!==r[e]&&a.push(e);return{lines:a,numLinesBefore:n.length,numLinesAfter:r.length,numLines:i}}const Se=globalThis.process.platform.startsWith(`win`),Ce=Symbol(`clack:cancel`);function P(e){return e===Ce}function we(e,t){let n=e;n.isTTY&&n.setRawMode(t)}function Te({input:e=i.stdin,output:t=i.stdout,overwrite:n=!0,hideCursor:r=!0}={}){let s=a.createInterface({input:e,output:t,prompt:``,tabSize:1});a.emitKeypressEvents(e,s),e instanceof o.ReadStream&&e.isTTY&&e.setRawMode(!0);let c=(i,{name:o,sequence:s})=>{if(be([String(i),o,s],`cancel`)){r&&t.write(M.cursor.show),process.exit(0);return}if(!n)return;let l=o===`return`?0:-1,u=o===`return`?-1:0;a.moveCursor(t,l,u,()=>{a.clearLine(t,1,()=>{e.once(`keypress`,c)})})};return r&&t.write(M.cursor.hide),e.once(`keypress`,c),()=>{e.off(`keypress`,c),r&&t.write(M.cursor.show),e instanceof o.ReadStream&&e.isTTY&&!Se&&e.setRawMode(!1),s.terminal=!1,s.close()}}const Ee=e=>`columns`in e&&typeof e.columns==`number`?e.columns:80,De=e=>`rows`in e&&typeof e.rows==`number`?e.rows:20;function Oe(e,t,n,r=n,a){return j(t,Ee(e??i.stdout)-n.length,{hard:!0,trim:!1}).split(`
|
|
9
|
+
`).map((e,t)=>{let i=a?a(e,t):e;return`${t===0?r:n}${i}`}).join(`
|
|
10
|
+
`)}let ke=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=i.stdin,output:r=i.stdout,render:a,signal:o,...s}=e;this.opts=s,this.onKeypress=this.onKeypress.bind(this),this.close=this.close.bind(this),this.render=this.render.bind(this),this._render=a.bind(this),this._track=t,this._abortSignal=o,this.input=n,this.output=r}unsubscribe(){this._subscribers.clear()}setSubscriber(e,t){let n=this._subscribers.get(e)??[];n.push(t),this._subscribers.set(e,n)}on(e,t){this.setSubscriber(e,{cb:t})}once(e,t){this.setSubscriber(e,{cb:t,once:!0})}emit(e,...t){let n=this._subscribers.get(e)??[],r=[];for(let e of n)e.cb(...t),e.once&&r.push(()=>n.splice(n.indexOf(e),1));for(let e of r)e()}prompt(){return new Promise(e=>{if(this._abortSignal){if(this._abortSignal.aborted)return this.state=`cancel`,this.close(),e(Ce);this._abortSignal.addEventListener(`abort`,()=>{this.state=`cancel`,this.close()},{once:!0})}this.rl=a.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),we(this.input,!0),this.output.on(`resize`,this.render),this.render(),this.once(`submit`,()=>{this.output.write(M.cursor.show),this.output.off(`resize`,this.render),we(this.input,!1),e(this.value)}),this.once(`cancel`,()=>{this.output.write(M.cursor.show),this.output.off(`resize`,this.render),we(this.input,!1),e(Ce)})})}_isActionKey(e,t){return e===` `}_shouldSubmit(e,t){return!0}_setValue(e){this.value=e,this.emit(`value`,this.value)}_setUserInput(e,t){this.userInput=e??``,this.emit(`userInput`,this.userInput),t&&this._track&&this.rl&&(this.rl.write(this.userInput),this._cursor=this.rl.cursor)}_clearUserInput(){this.rl?.write(null,{ctrl:!0,name:`u`}),this._setUserInput(``)}onKeypress(e,t){if(this._track&&t.name!==`return`&&(t.name&&this._isActionKey(e,t)&&this.rl?.write(null,{ctrl:!0,name:`h`}),this._cursor=this.rl?.cursor??0,this._setUserInput(this.rl?.line)),this.state===`error`&&(this.state=`active`),t?.name&&(!this._track&&N.aliases.has(t.name)&&this.emit(`cursor`,N.aliases.get(t.name)),N.actions.has(t.name)&&this.emit(`cursor`,t.name)),e&&(e.toLowerCase()===`y`||e.toLowerCase()===`n`)&&this.emit(`confirm`,e.toLowerCase()===`y`),this.emit(`key`,e?.toLowerCase(),t),t?.name===`return`&&this._shouldSubmit(e,t)){if(this.opts.validate){let e=this.opts.validate(this.value);e&&(this.error=e instanceof Error?e.message:e,this.state=`error`,this.rl?.write(this.userInput))}this.state!==`error`&&(this.state=`submit`)}be([e,t?.name,t?.sequence],`cancel`)&&(this.state=`cancel`),(this.state===`submit`||this.state===`cancel`)&&this.emit(`finalize`),this.render(),(this.state===`submit`||this.state===`cancel`)&&this.close()}close(){this.input.unpipe(),this.input.removeListener(`keypress`,this.onKeypress),this.output.write(`
|
|
11
|
+
`),we(this.input,!1),this.rl?.close(),this.rl=void 0,this.emit(`${this.state}`,this.value),this.unsubscribe()}restoreCursor(){let e=j(this._prevFrame,process.stdout.columns,{hard:!0,trim:!1}).split(`
|
|
12
|
+
`).length-1;this.output.write(M.cursor.move(-999,e*-1))}render(){let e=j(this._render(this)??``,process.stdout.columns,{hard:!0,trim:!1});if(e!==this._prevFrame){if(this.state===`initial`)this.output.write(M.cursor.hide);else{let t=xe(this._prevFrame,e),n=De(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(M.cursor.move(0,a-i)),this.output.write(M.erase.lines(1));let t=e.split(`
|
|
13
|
+
`);this.output.write(t[a]),this._prevFrame=e,this.output.write(M.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(M.cursor.move(0,e))}this.output.write(M.erase.down());let t=e.split(`
|
|
14
|
+
`).slice(a);this.output.write(t.join(`
|
|
15
|
+
`)),this._prevFrame=e;return}}this.output.write(M.erase.down())}this.output.write(e),this.state===`initial`&&(this.state=`active`),this._prevFrame=e}}};var Ae=class extends ke{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(M.cursor.move(0,-1)),this.value=e,this.state=`submit`,this.close()}),this.on(`cursor`,()=>{this.value=!this.value})}},je=class extends ke{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?ye(n,1,this.options):n,this.changeValue(),this.on(`cursor`,e=>{switch(e){case`left`:case`up`:this.cursor=ye(this.cursor,-1,this.options);break;case`down`:case`right`:this.cursor=ye(this.cursor,1,this.options);break}this.changeValue()})}},Me=class extends ke{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,...i]=e.slice(this.cursor);return`${t}${(0,r.styleText)(`inverse`,n)}${i.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 Ne(){return i.default.platform===`win32`?!!i.default.env.CI||!!i.default.env.WT_SESSION||!!i.default.env.TERMINUS_SUBLIME||i.default.env.ConEmuTask===`{cmd::Cmder}`||i.default.env.TERM_PROGRAM===`Terminus-Sublime`||i.default.env.TERM_PROGRAM===`vscode`||i.default.env.TERM===`xterm-256color`||i.default.env.TERM===`alacritty`||i.default.env.TERMINAL_EMULATOR===`JetBrains-JediTerm`:i.default.env.TERM!==`linux`}const Pe=Ne(),Fe=()=>process.env.CI===`true`,F=(e,t)=>Pe?e:t,Ie=F(`◆`,`*`),Le=F(`■`,`x`),Re=F(`▲`,`x`),I=F(`◇`,`o`),L=F(`│`,`|`),R=F(`└`,`—`),ze=F(`●`,`>`),Be=F(`○`,` `),Ve=F(`─`,`-`),He=F(`╮`,`+`),Ue=F(`├`,`+`),We=F(`╯`,`+`),Ge=F(`╰`,`+`),Ke=F(`●`,`•`),qe=F(`◆`,`*`),Je=F(`▲`,`!`),Ye=F(`■`,`x`),Xe=e=>{switch(e){case`initial`:case`active`:return(0,r.styleText)(`cyan`,Ie);case`cancel`:return(0,r.styleText)(`red`,Le);case`error`:return(0,r.styleText)(`yellow`,Re);case`submit`:return(0,r.styleText)(`green`,I)}},Ze=e=>{switch(e){case`initial`:case`active`:return(0,r.styleText)(`cyan`,L);case`cancel`:return(0,r.styleText)(`red`,L);case`error`:return(0,r.styleText)(`yellow`,L);case`submit`:return(0,r.styleText)(`green`,L)}},Qe=(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}},$e=({cursor:e,options:t,style:n,output:i=process.stdout,maxItems:a=1/0,columnPadding:o=0,rowPadding:s=4})=>{let c=Ee(i)-o,l=De(i),u=(0,r.styleText)(`dim`,`...`),d=Math.max(l-s,0),f=Math.max(Math.min(a,d),5),p=0;e>=f-3&&(p=Math.max(Math.min(e-f+3,t.length-f),0));let m=f<t.length&&p>0,h=f<t.length&&p+f<t.length,g=Math.min(p+f,t.length),_=[],v=0;m&&v++,h&&v++;let y=p+ +!!m,b=g-+!!h;for(let r=y;r<b;r++){let i=j(n(t[r],r===e),c,{hard:!0,trim:!1}).split(`
|
|
16
|
+
`);_.push(i),v+=i.length}if(v>d){let t=0,n=0,r=v,i=e-y,a=(e,t)=>Qe(_,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},z=e=>{let t=e.active??`Yes`,n=e.inactive??`No`;return new Ae({active:t,inactive:n,signal:e.signal,input:e.input,output:e.output,initialValue:e.initialValue??!0,render(){let i=e.withGuide??N.withGuide,a=`${Xe(this.state)} `,o=i?`${(0,r.styleText)(`gray`,L)} `:``,s=Oe(e.output,e.message,o,a),c=`${i?`${(0,r.styleText)(`gray`,L)}
|
|
17
|
+
`:``}${s}
|
|
18
|
+
`,l=this.value?t:n;switch(this.state){case`submit`:return`${c}${i?`${(0,r.styleText)(`gray`,L)} `:``}${(0,r.styleText)(`dim`,l)}`;case`cancel`:return`${c}${i?`${(0,r.styleText)(`gray`,L)} `:``}${(0,r.styleText)([`strikethrough`,`dim`],l)}${i?`
|
|
19
|
+
${(0,r.styleText)(`gray`,L)}`:``}`;default:{let a=i?`${(0,r.styleText)(`cyan`,L)} `:``,o=i?(0,r.styleText)(`cyan`,R):``;return`${c}${a}${this.value?`${(0,r.styleText)(`green`,ze)} ${t}`:`${(0,r.styleText)(`dim`,Be)} ${(0,r.styleText)(`dim`,t)}`}${e.vertical?i?`
|
|
20
|
+
${(0,r.styleText)(`cyan`,L)} `:`
|
|
21
|
+
`:` ${(0,r.styleText)(`dim`,`/`)} `}${this.value?`${(0,r.styleText)(`dim`,Be)} ${(0,r.styleText)(`dim`,n)}`:`${(0,r.styleText)(`green`,ze)} ${n}`}
|
|
22
|
+
${o}
|
|
23
|
+
`}}}}).prompt()},B={message:(e=[],{symbol:t=(0,r.styleText)(`gray`,L),secondarySymbol:n=(0,r.styleText)(`gray`,L),output:i=process.stdout,spacing:a=1,withGuide:o}={})=>{let s=[],c=o??N.withGuide,l=c?n:``,u=c?`${t} `:``,d=c?`${n} `:``;for(let e=0;e<a;e++)s.push(l);let f=Array.isArray(e)?e:e.split(`
|
|
24
|
+
`);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:``)}i.write(`${s.join(`
|
|
25
|
+
`)}
|
|
26
|
+
`)},info:(e,t)=>{B.message(e,{...t,symbol:(0,r.styleText)(`blue`,Ke)})},success:(e,t)=>{B.message(e,{...t,symbol:(0,r.styleText)(`green`,qe)})},step:(e,t)=>{B.message(e,{...t,symbol:(0,r.styleText)(`green`,I)})},warn:(e,t)=>{B.message(e,{...t,symbol:(0,r.styleText)(`yellow`,Je)})},warning:(e,t)=>{B.warn(e,t)},error:(e,t)=>{B.message(e,{...t,symbol:(0,r.styleText)(`red`,Ye)})}},et=(e=``,t)=>{let n=t?.output??process.stdout,i=t?.withGuide??N.withGuide?`${(0,r.styleText)(`gray`,R)} `:``;n.write(`${i}${(0,r.styleText)(`red`,e)}
|
|
27
|
+
|
|
28
|
+
`)},tt=(e=``,t)=>{let n=t?.output??process.stdout,i=t?.withGuide??N.withGuide?`${(0,r.styleText)(`gray`,L)}
|
|
29
|
+
${(0,r.styleText)(`gray`,R)} `:``;n.write(`${i}${e}
|
|
30
|
+
|
|
31
|
+
`)},nt=e=>(0,r.styleText)(`dim`,e),rt=(e,t,n)=>{let r={hard:!0,trim:!1},i=j(e,t,r).split(`
|
|
32
|
+
`),a=i.reduce((e,t)=>Math.max(A(t),e),0);return j(e,t-(i.map(n).reduce((e,t)=>Math.max(A(t),e),0)-a),r)},it=(e=``,t=``,n)=>{let a=n?.output??i.default.stdout,o=n?.withGuide??N.withGuide,s=n?.format??nt,c=[``,...rt(e,Ee(a)-6,s).split(`
|
|
33
|
+
`).map(s),``],l=A(t),u=Math.max(c.reduce((e,t)=>{let n=A(t);return n>e?n:e},0),l)+2,d=c.map(e=>`${(0,r.styleText)(`gray`,L)} ${e}${` `.repeat(u-A(e))}${(0,r.styleText)(`gray`,L)}`).join(`
|
|
34
|
+
`),f=o?`${(0,r.styleText)(`gray`,L)}
|
|
35
|
+
`:``,p=o?Ue:Ge;a.write(`${f}${(0,r.styleText)(`green`,I)} ${(0,r.styleText)(`reset`,t)} ${(0,r.styleText)(`gray`,Ve.repeat(Math.max(u-l-1,1))+He)}
|
|
36
|
+
${d}
|
|
37
|
+
${(0,r.styleText)(`gray`,p+Ve.repeat(u+2)+We)}
|
|
38
|
+
`)},at=e=>(0,r.styleText)(`magenta`,e),ot=({indicator:e=`dots`,onCancel:t,output:n=process.stdout,cancelMessage:i,errorMessage:a,frames:o=Pe?[`◒`,`◐`,`◓`,`◑`]:[`•`,`o`,`O`,`0`],delay:s=Pe?80:120,signal:c,...l}={})=>{let u=Fe(),d,f,p=!1,m=!1,h=``,g,_=performance.now(),v=Ee(n),y=l?.styleFrame??at,b=e=>{let n=e>1?a??N.messages.error:i??N.messages.cancel;m=e===1,p&&(k(n,e),m&&typeof t==`function`&&t())},x=()=>b(2),S=()=>b(1),C=()=>{process.on(`uncaughtExceptionMonitor`,x),process.on(`unhandledRejection`,x),process.on(`SIGINT`,S),process.on(`SIGTERM`,S),process.on(`exit`,b),c&&c.addEventListener(`abort`,S)},w=()=>{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)},ee=()=>{if(g===void 0)return;u&&n.write(`
|
|
39
|
+
`);let e=j(g,v,{hard:!0,trim:!1}).split(`
|
|
40
|
+
`);e.length>1&&n.write(M.cursor.up(e.length-1)),n.write(M.cursor.to(0)),n.write(M.erase.down())},T=e=>e.replace(/\.+$/,``),E=e=>{let t=(performance.now()-e)/1e3,n=Math.floor(t/60),r=Math.floor(t%60);return n>0?`[${n}m ${r}s]`:`[${r}s]`},D=l.withGuide??N.withGuide,O=(t=``)=>{p=!0,d=Te({output:n}),h=T(t),_=performance.now(),D&&n.write(`${(0,r.styleText)(`gray`,L)}
|
|
41
|
+
`);let i=0,a=0;C(),f=setInterval(()=>{if(u&&h===g)return;ee(),g=h;let t=y(o[i]),r;if(u)r=`${t} ${h}...`;else if(e===`timer`)r=`${t} ${h} ${E(_)}`;else{let e=`.`.repeat(Math.floor(a)).slice(0,3);r=`${t} ${h}${e}`}let s=j(r,v,{hard:!0,trim:!1});n.write(s),i=i+1<o.length?i+1:0,a=a<4?a+.125:0},s)},k=(t=``,i=0,a=!1)=>{if(!p)return;p=!1,clearInterval(f),ee();let o=i===0?(0,r.styleText)(`green`,I):i===1?(0,r.styleText)(`red`,Le):(0,r.styleText)(`red`,Re);h=t??h,a||(e===`timer`?n.write(`${o} ${h} ${E(_)}
|
|
42
|
+
`):n.write(`${o} ${h}
|
|
43
|
+
`)),w(),d()};return{start:O,stop:(e=``)=>k(e,0),message:(e=``)=>{h=T(e??h)},cancel:(e=``)=>k(e,1),error:(e=``)=>k(e,2),clear:()=>k(``,0,!0),get isCancelled(){return m}}},st=(e,t)=>e.includes(`
|
|
44
|
+
`)?e.split(`
|
|
45
|
+
`).map(e=>t(e)).join(`
|
|
46
|
+
`):t(e),V=e=>{let t=(e,t)=>{let n=e.label??String(e.value);switch(t){case`disabled`:return`${(0,r.styleText)(`gray`,Be)} ${st(n,e=>(0,r.styleText)(`gray`,e))}${e.hint?` ${(0,r.styleText)(`dim`,`(${e.hint??`disabled`})`)}`:``}`;case`selected`:return`${st(n,e=>(0,r.styleText)(`dim`,e))}`;case`active`:return`${(0,r.styleText)(`green`,ze)} ${n}${e.hint?` ${(0,r.styleText)(`dim`,`(${e.hint})`)}`:``}`;case`cancelled`:return`${st(n,e=>(0,r.styleText)([`strikethrough`,`dim`],e))}`;default:return`${(0,r.styleText)(`dim`,Be)} ${st(n,e=>(0,r.styleText)(`dim`,e))}`}};return new je({options:e.options,signal:e.signal,input:e.input,output:e.output,initialValue:e.initialValue,render(){let n=e.withGuide??N.withGuide,i=`${Xe(this.state)} `,a=`${Ze(this.state)} `,o=Oe(e.output,e.message,a,i),s=`${n?`${(0,r.styleText)(`gray`,L)}
|
|
47
|
+
`:``}${o}
|
|
48
|
+
`;switch(this.state){case`submit`:{let i=n?`${(0,r.styleText)(`gray`,L)} `:``;return`${s}${Oe(e.output,t(this.options[this.cursor],`selected`),i)}`}case`cancel`:{let i=n?`${(0,r.styleText)(`gray`,L)} `:``;return`${s}${Oe(e.output,t(this.options[this.cursor],`cancelled`),i)}${n?`
|
|
49
|
+
${(0,r.styleText)(`gray`,L)}`:``}`}default:{let i=n?`${(0,r.styleText)(`cyan`,L)} `:``,a=n?(0,r.styleText)(`cyan`,R):``,o=s.split(`
|
|
50
|
+
`).length,c=n?2:1;return`${s}${i}${$e({output:e.output,cursor:this.cursor,options:this.options,maxItems:e.maxItems,columnPadding:i.length,rowPadding:o+c,style:(e,n)=>t(e,e.disabled?`disabled`:n?`active`:`inactive`)}).join(`
|
|
51
|
+
${i}`)}
|
|
52
|
+
${a}
|
|
53
|
+
`}}}}).prompt()},ct=`${(0,r.styleText)(`gray`,L)} `,H={message:async(e,{symbol:t=(0,r.styleText)(`gray`,L)}={})=>{process.stdout.write(`${(0,r.styleText)(`gray`,L)}
|
|
54
|
+
${t} `);let n=3;for await(let t of e){t=t.replace(/\n/g,`
|
|
55
|
+
${ct}`),t.includes(`
|
|
56
|
+
`)&&(n=3+(0,r.stripVTControlCharacters)(t.slice(t.lastIndexOf(`
|
|
57
|
+
`))).length);let e=(0,r.stripVTControlCharacters)(t).length;n+e<process.stdout.columns?(n+=e,process.stdout.write(t)):(process.stdout.write(`
|
|
58
|
+
${ct}${t.trimStart()}`),n=3+(0,r.stripVTControlCharacters)(t.trimStart()).length)}process.stdout.write(`
|
|
59
|
+
`)},info:e=>H.message(e,{symbol:(0,r.styleText)(`blue`,Ke)}),success:e=>H.message(e,{symbol:(0,r.styleText)(`green`,qe)}),step:e=>H.message(e,{symbol:(0,r.styleText)(`green`,I)}),warn:e=>H.message(e,{symbol:(0,r.styleText)(`yellow`,Je)}),warning:e=>H.warn(e),error:e=>H.message(e,{symbol:(0,r.styleText)(`red`,Ye)})},lt=e=>new Me({validate:e.validate,placeholder:e.placeholder,defaultValue:e.defaultValue,initialValue:e.initialValue,output:e.output,signal:e.signal,input:e.input,render(){let t=e?.withGuide??N.withGuide,n=`${`${t?`${(0,r.styleText)(`gray`,L)}
|
|
60
|
+
`:``}${Xe(this.state)} `}${e.message}
|
|
61
|
+
`,i=e.placeholder?(0,r.styleText)(`inverse`,e.placeholder[0])+(0,r.styleText)(`dim`,e.placeholder.slice(1)):(0,r.styleText)([`inverse`,`hidden`],`_`),a=this.userInput?this.userInputWithCursor:i,o=this.value??``;switch(this.state){case`error`:{let e=this.error?` ${(0,r.styleText)(`yellow`,this.error)}`:``,i=t?`${(0,r.styleText)(`yellow`,L)} `:``,o=t?(0,r.styleText)(`yellow`,R):``;return`${n.trim()}
|
|
62
|
+
${i}${a}
|
|
63
|
+
${o}${e}
|
|
64
|
+
`}case`submit`:{let e=o?` ${(0,r.styleText)(`dim`,o)}`:``;return`${n}${t?(0,r.styleText)(`gray`,L):``}${e}`}case`cancel`:{let e=o?` ${(0,r.styleText)([`strikethrough`,`dim`],o)}`:``,i=t?(0,r.styleText)(`gray`,L):``;return`${n}${i}${e}${o.trim()?`
|
|
65
|
+
${i}`:``}`}default:return`${n}${t?`${(0,r.styleText)(`cyan`,L)} `:``}${a}
|
|
66
|
+
${t?(0,r.styleText)(`cyan`,R):``}
|
|
67
|
+
`}}}).prompt();var ut=class{info(e){process.stdout.write(`${_.default.blue(`ℹ ${e}`)}\n`)}warn(e){process.stderr.write(`${_.default.yellow(`⚠ ${e}`)}\n`)}error(e){process.stderr.write(`${_.default.red(`✘ ${e}`)}\n`)}success(e){process.stdout.write(`${_.default.green(`✔ ${e}`)}\n`)}step(e){process.stdout.write(`○ ${e}\n`)}note(e,t){it(e,t)}log(e){process.stdout.write(`${e}\n`)}spinner(){return ot()}json(e){process.stdout.write(`${JSON.stringify(e,null,2)}\n`)}cancel(e,t){process.stderr.write(`${_.default.red(`✘ ${e}`)}\n`)}fatal(e,t,n){if(process.stderr.write(`${_.default.red(`✘ ${e}`)}\n`),t){let e=`${_.default.red(t instanceof Error?t.stack??String(t):String(t))}\n`;process.stderr.write(e)}throw t instanceof Error?t:Error(e)}refuse(e,t){}finish(e,t,n){tt(e)}reportCompleted(e){e.exitCode===0&&this.success(`Environment variables are valid`)}reportErrored(e){this.error(e.error.summary),e.error.why&&this.warn(e.error.why)}async flush(){return new Promise(e=>{process.stderr.write(``,()=>e())})}},dt=class{constructor(e){this.options=e,this.originalStdoutWrite=process.stdout.write,e.reporter?this.reporter=e.reporter:e.isJson?this.reporter=new ee:e.isQuiet?this.reporter=new T:this.reporter=new ut}get isJson(){return this.options.isJson}debug(e){this.reporter.log(e)}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,t=`cli`){this.reporter.cancel(e,t)}fatal(e,t,n=`cli`){this.reporter.fatal(e,t,n)}refuse(e,t=`init`){this.reporter.refuse(e,t)}finish(e,t,n=`init`){this.reporter.finish(e,t,n)}reportCompleted(e){this.reporter.reportCompleted(e)}reportErrored(e){this.reporter.reportErrored(e)}async flush(){await this.reporter.flush()}};function U(e,t){return Object.keys(e).includes(t)}function ft(e){if(typeof e==`string`)return/=\s*\S/.test(e);if(!e||typeof e!=`object`)return!1;let t=e;if(U(t,`default`)||U(t,`fallback`))return!0;let n=t._def;if(n&&typeof n==`object`){let e=n;if(`defaultValue`in e||e.typeName===`ZodDefault`||e.type===`default`)return!0;if(`innerType`in e)return ft(e.innerType)}return!1}function pt(e){return e.endsWith(`?`)?e.slice(0,-1):e}function mt(e,t,n){if(e){if(Array.isArray(e)){for(let r of e){if(Array.isArray(r)&&typeof r[0]==`string`){t.push({name:r[0],schema:r[1],hasDefault:!1}),n[r[0]]=r[1];continue}if(r&&typeof r==`object`){let e=r,i=e.key;if(typeof i!=`string`)continue;let a=`value`in e?e.value:void 0;t.push({name:i,schema:a,hasDefault:U(e,`default`)}),n[i]=a}}return}if(typeof e==`object`)for(let[r,i]of Object.entries(e)){let e=i&&typeof i==`object`?i:void 0,a=e&&`value`in e?e.value:i;t.push({name:r,schema:a,hasDefault:!!(e&&U(e,`default`))}),n[r]=a}}}function ht(e){return typeof e==`object`&&!!e&&!Array.isArray(e)&&Object.keys(e).length===0}function gt(e){let n=[],r={};for(let i of e){if(!i||typeof i!=`object`&&typeof i!=`function`)return{extractable:!1};let e=i,a=e.json,o=typeof a==`function`?a():a,s=n.length;if(o&&typeof o==`object`){let e=o;if((e.domain===`object`||e.required!==void 0||e.optional!==void 0)&&(mt(e.required,n,r),mt(e.optional,n,r),n.length>s))continue}let c=o?t.a(i):[];if(n.length===s&&c.length>0){for(let e of c)n.push({name:e,schema:void 0,hasDefault:!1}),r[e]=void 0;continue}if(!(n.length>s)){if(typeof i==`function`)return{extractable:!1};if(!ht(i)){if(Object.keys(e).length===0)return{extractable:!1};for(let[t,i]of Object.entries(e)){let e=pt(t);n.push({name:e,schema:i,hasDefault:ft(i)}),r[e]=i}}}}return{extractable:!0,keys:n,schema:r}}async function _t(e,t,n,r){if(r){let n=s.default.resolve(e,r);return await t.exists(n)?n:void 0}if(typeof n.readArkenvConfig==`function`){let r=await n.readArkenvConfig(e);if(r){let n=s.default.resolve(e,r.schema);if(await t.exists(n))return n}}let i=[s.default.resolve(e,`env.ts`),s.default.resolve(e,`src/env.ts`),s.default.resolve(e,`env.js`),s.default.resolve(e,`src/env.js`),s.default.resolve(e,`env.mjs`),s.default.resolve(e,`src/env.mjs`),s.default.resolve(e,`env/server.ts`),s.default.resolve(e,`src/env/server.ts`)],a=await n.suggestDefaultEnvPath(e);a&&i.unshift(s.default.resolve(e,a));for(let e of i)if(await t.exists(e))return e}const W={ERR_INSPECT_NO_CALL:`ERR_INSPECT_NO_CALL`,ERR_INSPECT_UNSUPPORTED:`ERR_INSPECT_UNSUPPORTED`,ERR_INSPECT_UNEXTRACTABLE:`ERR_INSPECT_UNEXTRACTABLE`,ERR_INSPECT_EVAL_THROW:`ERR_INSPECT_EVAL_THROW`};function vt(e){if(e&&typeof e==`object`&&`name`in e&&e.name===`ArkEnvError`)return!0;let t=e instanceof Error?e.message:String(e);return/validating environment variables/i.test(t)}function yt(e){if(!(e instanceof Error)&&typeof e!=`object`)return/cannot read propert/i.test(String(e));let t=e instanceof Error?e.message:String(e);return/cannot read propert/i.test(t)||e instanceof TypeError||/is not a function/i.test(t)}function bt(e){return`No arkenv() schema definition was found in "${e}". No arkenv() definition was found. Ensure arkenv() is called at the top level of the schema module.`}function xt(e,t){return`Failed to inspect schema module at "${e}": ${t instanceof Error?t.message:String(t)} Upgrade @arkenv/core or @arkenv/standard so the CLI can inspect the schema without validating the environment.`}function St(e){return`Failed to inspect schema module at "${e}": Cannot extract keys from the captured definition. Ensure the schema is a supported static map.`}function Ct(e,t){let n=t instanceof Error?t.message:String(t),r=`Failed to load schema module at "${e}": ${n}`;return yt(t)||/missing [A-Z_][A-Z0-9_]*/.test(n)?`${r} Capture mode does not populate env values. Keep the schema module declarative (\`export const env = arkenv({...})\`) and do not read \`env\` at module scope.`:r}var wt=class{constructor(e={}){this.options=e}async load(e){t.t();try{this.evaluateModule(e.schemaPath);let n=t.n();if(n.length===0)return{ok:!1,code:W.ERR_INSPECT_NO_CALL,message:bt(e.schemaPath)};let r=gt(n);return r.extractable?{ok:!0,keys:r.keys,schema:r.schema}:{ok:!1,code:W.ERR_INSPECT_UNEXTRACTABLE,message:St(e.schemaPath)}}catch(n){return t.n(),vt(n)?{ok:!1,code:W.ERR_INSPECT_UNSUPPORTED,message:xt(e.schemaPath,n),cause:n}:{ok:!1,code:W.ERR_INSPECT_EVAL_THROW,message:Ct(e.schemaPath,n),cause:n}}}async validate(e,t){let n={...process.env};for(let e of Object.keys(process.env))(!(e in t)||t[e]===void 0)&&delete process.env[e];for(let[e,n]of Object.entries(t))n!==void 0&&(process.env[e]=n);try{return this.evaluateModule(e.schemaPath),{ok:!0}}catch(t){if(vt(t)){let e=t&&typeof t==`object`&&`issues`in t?t.issues??[]:[];return{ok:!1,kind:`validation`,message:t instanceof Error?t.message:String(t),issues:e}}return{ok:!1,kind:`load`,code:W.ERR_INSPECT_EVAL_THROW,message:Ct(e.schemaPath,t),cause:t}}finally{for(let e of Object.keys(process.env))e in n||delete process.env[e];for(let[e,t]of Object.entries(n))t!==void 0&&(process.env[e]=t)}}evaluateModule(e){let t={moduleCache:!1,fsCache:!1,tsconfigPaths:!0,...this.options.jitiAliases?{alias:this.options.jitiAliases}:{}};try{(0,c.createJiti)(e,t)(e)}catch(n){let r=n instanceof Error?n.message:String(n);if(!(n instanceof Error&&/tsconfig/i.test(r)&&(/not found/i.test(r)||n.code===`ENOENT`)))throw n;(0,c.createJiti)(e,{...t,tsconfigPaths:!1})(e)}}};async function Tt(e,t){for(let n of t)try{return await u.default.access(s.default.join(e,n)),!0}catch{}return!1}async function Et(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=s.default.join(e,`package.json`),n=await u.default.readFile(t,`utf-8`),r=JSON.parse(n),i={...r.dependencies,...r.devDependencies};if(i.vite)return`vite`;if(i.next)return`nextjs`;if(i.nuxt)return`nuxt`}catch{}return await Tt(e,[`vite.config.ts`,`vite.config.js`])?`vite`:await Tt(e,[`next.config.ts`,`next.config.js`,`next.config.mjs`,`next.config.cjs`])?`nextjs`:await Tt(e,[`nuxt.config.ts`,`nuxt.config.js`,`nuxt.config.mts`,`nuxt.config.mjs`,`nuxt.config.cjs`])?`nuxt`:(await Dt(e,t)).length>0?`bun-fullstack`:`vanilla`}async function Dt(e=process.cwd(),t){let n=[];try{let t=s.default.join(e,`bunfig.toml`),r=await u.default.readFile(t,`utf-8`);(r.includes(`[serve]`)||r.includes(`[serve.static]`))&&n.push(`serve`),r.includes(`[build]`)&&n.push(`build`)}catch{}if(n.includes(`serve`)&&n.includes(`build`))return n;let{walk:r}=await Promise.resolve().then(()=>At),i=await r(e),a=n.includes(`serve`),o=n.includes(`build`);for(let e of i)try{let t=await u.default.readFile(e,`utf-8`);if(!a&&(t.includes(`Bun.serve`)||t.includes(`serve(`))&&(/from\s+['"]bun['"]/.test(t)||t.includes(`Bun.serve`))&&(a=!0,n.push(`serve`)),!o&&(t.includes(`Bun.build`)||t.includes(`build(`))&&(/from\s+['"]bun['"]/.test(t)||t.includes(`Bun.build`))&&(o=!0,n.push(`build`)),a&&o)break}catch{}return n}async function Ot(e=process.cwd(),t){let n=process.env.npm_config_user_agent?.toString()||``;if(n.includes(`pnpm`))return`pnpm`;if(n.includes(`yarn`))return`yarn`;if(n.includes(`bun`))return`bun`;if(n.includes(`npm`))return`npm`;let r=t?.path?s.default.dirname(t.path):e;for(;r!==s.default.parse(r).root;){try{let e=s.default.join(r,`package.json`),t=await u.default.readFile(e,`utf-8`),n=JSON.parse(t);if(n.packageManager){if(n.packageManager.startsWith(`pnpm`))return`pnpm`;if(n.packageManager.startsWith(`yarn`))return`yarn`;if(n.packageManager.startsWith(`bun`))return`bun`}}catch{}let e=[];try{e=await u.default.readdir(r)}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`;r=s.default.dirname(r)}return`npm`}async function kt(e=process.cwd(),t){let n=t;if(!n){let{findTsConfig:t,loadTsConfig:r}=await Promise.resolve().then(()=>Rt),i=await t(e);i&&(n=await r(i))}if(n?.compilerOptions?.rootDir){let t=n.compilerOptions.rootDir,r=s.default.relative(e,t);return r&&r!==`.`&&!r.startsWith(`..`)&&!s.default.isAbsolute(r)?`./${r}/env.ts`:`./env.ts`}try{return await u.default.access(s.default.join(e,`src`)),`./src/env.ts`}catch{return`./env.ts`}}var At=e.n({getEnvExampleKeys:()=>Ft,parseEnvExample:()=>Mt,resolveImportPaths:()=>Nt,scanProjectEnvKeys:()=>Pt,walk:()=>jt});async function jt(e,t=[]){try{let n=await u.default.readdir(e,{withFileTypes:!0});for(let r of n)if(r.isDirectory()){let n=r.name;if(n===`node_modules`||n===`dist`||n===`build`||n===`.git`||n===`.turbo`||n===`scratch`)continue;await jt(s.default.join(e,n),t)}else r.isFile()&&/\.(ts|tsx|js|jsx)$/.test(r.name)&&!r.name.endsWith(`.d.ts`)&&t.push(s.default.join(e,r.name))}catch{}return t}function Mt(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 Nt(e,t,n){if(e.startsWith(`.`))return[s.default.resolve(s.default.dirname(n),e)];if(s.default.isAbsolute(e))return[e];let r=t.compilerOptions||{},i=r.baseUrl||s.default.dirname(t.path),a=r.paths||{},o=[];for(let[e,t]of Object.entries(a)){let n=e.endsWith(`*`),r=e.replace(/\*$/,``);o.push({cleanPattern:r,targets:Array.isArray(t)?t:[t],hadStar:n})}o.sort((e,t)=>t.cleanPattern.length-e.cleanPattern.length);for(let{cleanPattern:t,targets:n,hadStar:r}of o)if(r&&e.startsWith(t)||!r&&e===t){let r=e.slice(t.length);return n.map(e=>{let t=`${e.replace(/\*$/,``)}${r}`;return s.default.resolve(i,t)})}return r.baseUrl?[s.default.resolve(i,e)]:[]}async function Pt(e,t,n){let r=[],i=await jt(e),a=n?n.replace(/\.(ts|js|tsx|jsx)$/,``):null;for(let e of i)try{let n=await u.default.readFile(e,`utf-8`),i=n.matchAll(/process\.env\.([A-Z_][A-Z0-9_]*)/g);for(let e of i)e[1]&&r.push(e[1]);let o=n.matchAll(/import\.meta\.env\.([A-Z_][A-Z0-9_]*)/g);for(let e of o)e[1]&&r.push(e[1]);if(a){let i=n.matchAll(/import\s+[^;]*from\s+['"]([^'"]+)['"]/g);for(let o of i){let i=o[1],c=[];if(t?c=Nt(i,t,e):i.startsWith(`.`)&&(c=[s.default.resolve(s.default.dirname(e),i)]),c.some(e=>e.replace(/\.(ts|js|tsx|jsx)$/,``)===a)){let e=n.matchAll(/\benv\.([A-Z_][A-Z0-9_]*)/g);for(let t of e)t[1]&&r.push(t[1])}}}}catch{}return Array.from(new Set(r))}async function Ft(e=process.cwd(),t,n){let r=s.default.join(e,`.env.example`);try{let e=Mt(await u.default.readFile(r,`utf-8`));if(e.length>0)return{keys:e,source:`.env.example`}}catch{}let i=await Pt(e,t,n);return i.length>0?{keys:i,source:`project`}:null}function It(e){let t=e.trim().replace(/^v/,``),n=t.match(/^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+([0-9A-Za-z.-]+))?$/);if(!n){let e=t.match(/^(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:-([0-9A-Za-z.-]+))?(?:\+([0-9A-Za-z.-]+))?$/);if(!e)return null;let n=Number.parseInt(e[1],10),r=e[2]===void 0?0:Number.parseInt(e[2],10),i=e[3]===void 0?0:Number.parseInt(e[3],10),a=e[4],o=e[5];return Number.isNaN(n)||Number.isNaN(r)||Number.isNaN(i)?null:{major:n,minor:r,patch:i,prerelease:a?a.split(`.`).map(e=>/^\d+$/.test(e)?Number.parseInt(e,10):e):[],build:o}}let r=Number.parseInt(n[1],10),i=Number.parseInt(n[2],10),a=Number.parseInt(n[3],10),o=n[4],s=n[5];return Number.isNaN(r)||Number.isNaN(i)||Number.isNaN(a)?null:{major:r,minor:i,patch:a,prerelease:o?o.split(`.`).map(e=>/^\d+$/.test(e)?Number.parseInt(e,10):e):[],build:s}}function Lt(e,t){let n=It(e),r=It(t);if(!n||!r)return 0;if(n.major!==r.major)return n.major>r.major?1:-1;if(n.minor!==r.minor)return n.minor>r.minor?1:-1;if(n.patch!==r.patch)return n.patch>r.patch?1:-1;let i=n.prerelease.length>0,a=r.prerelease.length>0;if(!i&&a)return 1;if(i&&!a)return-1;if(!i&&!a)return 0;let o=Math.min(n.prerelease.length,r.prerelease.length);for(let e=0;e<o;e++){let t=n.prerelease[e],i=r.prerelease[e];if(t===i)continue;let a=typeof t==`number`,o=typeof i==`number`;return a&&!o?-1:!a&&o?1:a&&o?t>i?1:-1:t<i?-1:1}return n.prerelease.length===r.prerelease.length?0:n.prerelease.length>r.prerelease.length?1:-1}var Rt=e.n({checkTsConfig:()=>Vt,findTsConfig:()=>G,loadTsConfig:()=>Bt});const zt=(0,d.createRequire)(require(`url`).pathToFileURL(__filename).href).resolve;async function G(e=process.cwd()){let t=[`tsconfig.app.json`,`tsconfig.json`,`tsconfig.base.json`,`tsconfig.node.json`],n=e;for(;n!==s.default.parse(n).root;){for(let e of t){let t=s.default.join(n,e);try{return await u.default.access(t),t}catch{}}n=s.default.dirname(n)}return null}async function Bt(e,t=new Set){let n=s.default.resolve(e);if(t.has(n))throw Error(`Circular extends dependency detected in tsconfig.json: ${n}`);t.add(n);let r=``;try{r=await u.default.readFile(e,`utf-8`)}catch{return{path:e,compilerOptions:{}}}let i=(0,f.parse)(r)||{},a=i.compilerOptions||{},o={};if(i.extends){let n=Array.isArray(i.extends)?i.extends:[i.extends];for(let r of n){let n;if(r.startsWith(`.`)||s.default.isAbsolute(r))n=s.default.resolve(s.default.dirname(e),r);else try{n=zt(r,{paths:[s.default.dirname(e)]})}catch{n=s.default.resolve(s.default.dirname(e),`node_modules`,r)}let i={...(await Bt(n,t)).compilerOptions};i.baseUrl&&=s.default.resolve(s.default.dirname(n),i.baseUrl),i.rootDir&&=s.default.resolve(s.default.dirname(n),i.rootDir),o={...o,...i}}}let c={...a};return c.baseUrl&&=s.default.resolve(s.default.dirname(e),c.baseUrl),c.rootDir&&=s.default.resolve(s.default.dirname(e),c.rootDir),o={...o,...c},{...i,path:e,compilerOptions:o}}async function Vt(e=process.cwd()){let t=await G(e);if(!t)return{status:`not_found`};let n=s.default.basename(t);try{let e=await Bt(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){let t=e.trim().match(/^v?(\d+)(?:\.(\d+))?(?:\.(\d+))?/);return t?[t[1],t[2]??`0`,t[3]??`0`].join(`.`):null}function Ut(e,t){let n=e.trim(),r=n.match(/^[\^~]?\s*(v?\d+(?:\.\d+){0,2})$/);if(r){let e=Ht(r[1]);return e!==null&&Lt(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=Ht(i);return a&&(r===`>=`||r===`>`||r===`=`)?Lt(a,t)>=0:!1})}async function Wt(e=process.cwd()){let t=[],n=process.version,r=`22.0.0`;Lt(n,r)===-1?t.push({status:`fail`,requirement:`Node.js Version`,message:`Node.js version must be >= ${r}.`,current:n,expected:`>= ${r}`}):t.push({status:`pass`,requirement:`Node.js Version`,message:`Node.js version is compatible.`});let i=null;try{let n=s.default.join(e,`package.json`),r=await u.default.readFile(n,`utf-8`);i=JSON.parse(r),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(i){let e={...i.dependencies,...i.devDependencies}.typescript,n=`5.1.0`;e?Ut(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 a=await Vt(e);if(a.status===`not_found`)t.push({status:`warn`,requirement:`tsconfig.json`,message:`tsconfig.json not found.`});else{let e=a.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 Gt=class{constructor(e){this.logger=e}async isEmptyDirectory(e=process.cwd()){try{return(await u.default.readdir(e)).length===0}catch{return!1}}async hasPackageJson(e=process.cwd()){try{return await u.default.access(s.default.join(e,`package.json`)),!0}catch{return!1}}async findTsConfig(e=process.cwd()){return G(e)}async loadTsConfig(e,t=new Set){return Bt(e,t)}async getEnvExampleKeys(e=process.cwd(),t,n){return Ft(e,t,n)}async suggestDefaultEnvPath(e=process.cwd(),t){return kt(e,t)}async checkTsConfig(e=process.cwd()){return Vt(e)}async checkRequirements(e=process.cwd()){return Wt(e)}async detectFramework(e=process.cwd(),t){return Et(e,t)}async detectBunFeatures(e=process.cwd(),t){return Dt(e,t)}async detectPackageManager(e=process.cwd(),t){return Ot(e,t)}async hasSkill(e=process.cwd()){try{let t=s.default.join(e,`skills-lock.json`),n=await u.default.readFile(t,`utf-8`),r=JSON.parse(n);if(r&&typeof r==`object`&&r.skills&&typeof r.skills==`object`&&`arkenv`in r.skills)return!0}catch{}for(let t of[`skills/arkenv/SKILL.md`,`.agent/skills/arkenv/SKILL.md`,`.agents/skills/arkenv/SKILL.md`])try{return await u.default.access(s.default.join(e,t)),!0}catch{}return!1}async checkGitStatus(e=process.cwd()){try{return(0,l.execSync)(`git status --porcelain`,{cwd:e,encoding:`utf-8`}).trim().length===0?{status:`clean`}:{status:`dirty`}}catch(e){let t=e;return t.code===`ENOENT`?(this.logger?.log(`Git is not installed on this system. Skipping git status check.`),{status:`not_a_repo`}):typeof t.stderr==`string`&&t.stderr.includes(`not a git repository`)?{status:`not_a_repo`}:{status:`unknown`}}}async findPackageJson(e=process.cwd()){let t=s.default.resolve(e);for(;;){let e=s.default.join(t,`package.json`);try{return await u.default.access(e),e}catch{let e=s.default.dirname(t);if(e===t)return null;t=e}}}async readArkenvConfig(e=process.cwd()){let t=await this.findPackageJson(e);if(!t)return null;try{let e=await u.default.readFile(t,`utf-8`),n=JSON.parse(e);return n.arkenv?typeof n.arkenv==`string`?{schema:n.arkenv}:typeof n.arkenv==`object`&&typeof n.arkenv.schema==`string`?{schema:n.arkenv.schema}:null:null}catch{return null}}};const K=e=>_.default.cyan(e),Kt=_.default.blue(`⛯`);function qt(e){return e.replace(/import\s*\{([^\n}]*)\}\s*from/g,(e,t)=>`import { ${t.trim()} } from`)}function Jt(e,t){return t.endsWith(`
|
|
68
|
+
`)&&!e.endsWith(`
|
|
69
|
+
`)?`${e}\n`:e}function Yt(e){try{let t=(0,m.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`){let t=e.$ast?.arguments?.[0];if(t?.type===`ArrowFunctionExpression`||t?.type===`FunctionExpression`)return{success:!1,updated:!1,error:`The 'defineConfig' callback form is currently not supported for automatic mutation. Please add the plugin manually.`};let n=e.$args?.[0];if(n&&typeof n==`object`&&`$type`in n&&(n.$type===`arrow-function-expression`||n.$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=n}}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`}),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,m.generateCode)(t,{format:(0,m.detectCodeFormat)(n)}).code;return i=i.replace(/['"]__ARK_PLUGIN_PLACEHOLDER__['"]/g,`arkenvVitePlugin()`),i=qt(i),i=Jt(i,n),{success:!0,updated:!0,code:i}}catch(e){return{success:!1,updated:!1,error:`Failed to parse Vite config: ${e instanceof Error?e.message:String(e)}`}}}function Xt(e){try{let t=e.code;if(/module\.exports\b/.test(t))return{success:!1,updated:!1,error:"CommonJS is not supported for automatic mutation. Please wrap your config with `withArkEnv` manually."};let n=(0,m.parseModule)(t);if(!n.exports.default)return{success:!1,updated:!1,error:`Could not find default export in Next.js config`};if(typeof n.exports.default==`object`&&`$type`in n.exports.default&&n.exports.default.$type===`function-call`&&n.exports.default.$callee===`withArkEnv`||/\bwithArkEnv\b/.test(t))return{success:!0,updated:!1};n.imports.$add({from:`@arkenv/nextjs/config`,imported:`withArkEnv`}),e.disableCodegen?n.exports.default=m.builders.functionCall(`withArkEnv`,n.exports.default,{codegen:!1}):n.exports.default=m.builders.functionCall(`withArkEnv`,n.exports.default);let r=(0,m.generateCode)(n,{format:(0,m.detectCodeFormat)(t)}).code;return r=qt(r),r=Jt(r,t),{success:!0,updated:!0,code:r}}catch(e){return{success:!1,updated:!1,error:`Failed to parse Next.js config: ${e instanceof Error?e.message:String(e)}`}}}function Zt(e){try{let t=e.code,n=(0,m.parseModule)(t),r=n.exports.default;if(r&&typeof r==`object`&&`$type`in r&&r.$type===`function-call`){let e=r;(e.$callee||JSON.stringify(r))===`defineNuxtConfig`&&e.$args&&(r=e.$args[0])}if(!r||typeof r!=`object`||typeof r==`object`&&`$type`in r)return{success:!1,updated:!1,error:`Could not find default export object in Nuxt config`};if(r.modules||=[],Array.isArray(r.modules))if(!r.modules.includes(`@arkenv/nuxt/module`))r.modules.push(`@arkenv/nuxt/module`);else return{success:!0,updated:!1};else return{success:!1,updated:!1,error:`The 'modules' property in your Nuxt config is not an array.`};let i=(0,m.generateCode)(n,{format:(0,m.detectCodeFormat)(t)}).code;return i=qt(i),i=Jt(i,t),{success:!0,updated:!0,code:i}}catch(e){return{success:!1,updated:!1,error:`Failed to parse Nuxt config: ${e instanceof Error?e.message:String(e)}`}}}async function Qt(e=process.cwd()){for(let t of[`vite.config.ts`,`vite.config.js`,`vite.config.mts`,`vite.config.mjs`]){let n=s.default.resolve(e,t);try{return await u.default.access(n),n}catch{}}return null}async function $t(e=process.cwd()){for(let t of[`bunfig.toml`,`bun.setup.ts`,`bun.setup.js`]){let n=s.default.resolve(e,t);try{return await u.default.access(n),n}catch{}}return null}async function en(e=process.cwd()){for(let t of[`next.config.ts`,`next.config.js`,`next.config.mts`,`next.config.mjs`]){let n=s.default.resolve(e,t);try{return await u.default.access(n),n}catch{}}return null}async function tn(e,t,n){try{let r=Xt({code:await e.readFile(t),disableCodegen: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 nn(e=process.cwd()){for(let t of[`nuxt.config.ts`,`nuxt.config.js`,`nuxt.config.mts`,`nuxt.config.mjs`,`nuxt.config.cjs`]){let n=s.default.resolve(e,t);try{return await u.default.access(n),n}catch{}}return null}async function rn(e,t){try{let n=Zt({code:await e.readFile(t)});return n.success&&n.updated&&n.code&&await e.writeFile(t,n.code),n.success?n.updated===void 0?{success:!0}:{success:!0,updated:n.updated}:{success:!1,error:n.error}}catch(e){return{success:!1,error:e instanceof Error?e.message:String(e)}}}async function an(e,t,n){try{let n=Yt({code:await e.readFile(t)});return n.success&&n.updated&&n.code&&await e.writeFile(t,n.code),n.success?n.updated===void 0?{success:!0}:{success:!0,updated:n.updated}:{success:!1,error:n.error}}catch(e){return{success:!1,error:e instanceof Error?e.message:String(e)}}}async function on(e,t){if(!t||t.length===0)return{success:!0,instructions:p.default`
|
|
70
|
+
${_.default.green(`✔`)} Use ${_.default.bold(`Vanilla`)} Bun runtime integration.
|
|
71
|
+
Access validated variables via your ${K(`env`)} object for typesafety.
|
|
72
|
+
Primarily used for ${_.default.cyan(`server-side`)} or runtime-only validation.
|
|
73
|
+
No plugins are required.
|
|
74
|
+
`};let n=t.includes(`serve`),r=t.includes(`build`),i=``;return n&&(i+=p.default`
|
|
75
|
+
${_.default.bold(`Bun Fullstack (Bun.serve) Integration:`)}
|
|
76
|
+
To inline environment variables (e.g. ${K(`PUBLIC_*`)}) in your ${_.default.cyan(`client-side`)} code, add the plugin to ${K(`bunfig.toml`)}:
|
|
77
|
+
|
|
78
|
+
[serve.static]
|
|
79
|
+
plugins = ["@arkenv/bun-plugin"]
|
|
80
|
+
|
|
81
|
+
`),r&&(i&&(i+=`
|
|
82
|
+
`),i+=p.default`
|
|
83
|
+
${_.default.bold(`Bun Fullstack programmatic bundling (Bun.build):`)}
|
|
84
|
+
To inline environment variables (e.g. ${K(`PUBLIC_*`)}) in your custom ${_.default.cyan(`client-side`)} build script, add the plugin to your ${K(`Bun.build`)} call:
|
|
85
|
+
|
|
86
|
+
${K(`import arkenvPlugin from "@arkenv/bun-plugin";`)}
|
|
87
|
+
|
|
88
|
+
await Bun.build({
|
|
89
|
+
entrypoints: ["./index.ts"],
|
|
90
|
+
outdir: "./dist",
|
|
91
|
+
${_.default.green(`plugins: [arkenvPlugin]`)}
|
|
92
|
+
});
|
|
93
|
+
`),{success:!0,instructions:i.trim()}}async function sn(e,t){let n=t||await G();if(!n)return{status:`not_found`};let r=s.default.basename(n);try{let t=await e.readFile(n);if((0,f.parse)(t)?.compilerOptions?.strict===!0)return{status:`already_strict`,file:r};let i=(0,f.applyEdits)(t,(0,f.modify)(t,[`compilerOptions`,`strict`],!0,{formattingOptions:{insertSpaces:!0,tabSize:2}}));return await e.writeFile(n,i),{status:`updated`,file:r}}catch{return{status:`error`,file:r}}}const cn=`@/.arkenv`,ln=[`./.arkenv/index.ts`],un=`.arkenv/**/*.ts`,dn={insertSpaces:!0,tabSize:2};async function fn(e,t){let n=t||await G();if(!n)return{status:`not_found`};let r=s.default.basename(n);try{let t=await e.readFile(n),i=(0,f.parse)(t),a=!1,o=i?.compilerOptions?.paths?.[cn];if(!o||o[0]!==ln[0]){let e=(0,f.modify)(t,[`compilerOptions`,`paths`,cn],ln,{formattingOptions:dn});t=(0,f.applyEdits)(t,e),a=!0}let s=Array.isArray(i?.include)?i.include:[];if(!s.includes(un)){let e=(0,f.modify)(t,[`include`],[...s,un],{formattingOptions:dn});t=(0,f.applyEdits)(t,e),a=!0}return a?(await e.writeFile(n,t),{status:`updated`,file:r}):{status:`already_configured`,file:r}}catch{return{status:`error`,file:r}}}var pn=class{constructor(e,t,n){this.isQuiet=e,this.stdio=t,this.logger=n}async exists(e){try{return await u.default.access(e),!0}catch{return!1}}async readFile(e){return u.default.readFile(e,`utf-8`)}async writeFile(e,t){await u.default.writeFile(e,t,`utf-8`)}async mkdir(e,t){await u.default.mkdir(e,{recursive:t})}async execute(e,t=[],n){return new Promise((r,i)=>{let a=(0,l.spawn)(e,t,{cwd:n,stdio:this.isQuiet?`pipe`:this.stdio,shell:!1}),o=``,s=``,c=1e4;this.isQuiet&&(a.stdout?.on(`data`,e=>{o=(o+e.toString()).slice(-c)}),a.stderr?.on(`data`,e=>{s=(s+e.toString()).slice(-c)})),a.on(`close`,(e,t)=>{if(e===0)r();else{let n=e===null?`Command terminated by signal ${t}`:`Command failed with code ${e}`;this.isQuiet&&(o&&(n+=`\n${_.default.dim(`STDOUT:`)}\n${o}`),s&&(n+=`\n${_.default.red(`STDERR:`)}\n${s}`)),i(Error(n))}}),a.on(`error`,i)})}async updateTsConfigToStrict(e){return sn(this,e)}async ensureNextjsArkEnvTsConfig(e){return fn(this,e)}async findViteConfig(e){return Qt(e)}async findBunConfig(e){return $t(e)}async findNextjsConfig(e){return en(e)}async findNuxtConfig(e){return nn(e)}async bootstrapViteConfig(e,t){return an(this,e,t)}async bootstrapBunConfig(e,t){return on(e,t)}async bootstrapNextjsConfig(e,t){return tn(this,e,t)}async bootstrapNuxtConfig(e){return rn(this,e)}async appendMissingEnvExampleKeys(e,t){let n=s.default.join(e,`.env.example`);if(!await this.exists(n))return!1;let r=await this.readFile(n),i=new Set;for(let e of r.split(/\r?\n/)){let t=e.match(/^\s*(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)\s*=/);t&&i.add(t[1])}let a=t.filter(e=>!i.has(e));if(a.length===0)return!1;let o=a.map(e=>`${e}=`).join(`
|
|
94
|
+
`)+`
|
|
95
|
+
`,c=r.endsWith(`
|
|
96
|
+
`)||r.length===0?`${r}${o}`:`${r}\n${o}`;return await this.writeFile(n,c),!0}async removeEnvExampleKeys(e,t,n=[]){let r=s.default.join(e,`.env.example`);if(!await this.exists(r))return!1;let i=new Set(t.filter(e=>!n.includes(e)));if(i.size===0)return!1;let a=await this.readFile(r),o=a.split(/\r?\n/).filter(e=>{let t=e.match(/^\s*(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)\s*=/);return!(t&&i.has(t[1]))}).join(`
|
|
97
|
+
`);return a.endsWith(`
|
|
98
|
+
`)&&!o.endsWith(`
|
|
99
|
+
`)&&(o+=`
|
|
100
|
+
`),o===a?!1:(await this.writeFile(r,o),!0)}};async function mn(e){let t=e.defaultPath||`./src/env.ts`;if(e.hasEnvSchemaFile){let e=await z({message:_.default.yellow(`An existing ArkEnv configuration was found at ${K(t)}. Do you want to overwrite it?`),initialValue:!1,active:`Yes (override my configuration)`,inactive:`No (abort)`});return P(e)||!e?null:e}return!0}async function hn(e){let t=e.detectedKeys,n=e.keysSource||`.env.example`;if(t&&t.length>0){let e=t.length,r=e===1,i=await z({message:n===`.env.example`?`Detected ${K(`.env.example`)} with ${e} ${r?`key`:`keys`}. Use ${r?`it`:`them`} for your schema?`:`Detected ${e} environment variable${r?``:`s`} used in your project. Use ${r?`it`:`them`} for your schema?`,active:`Yes (Recommended)`,initialValue:!0});return P(i)?null:i}return!1}async function gn(e){let t=await V({message:`Select an example:`,options:e.examples.map(e=>({value:e.id,label:e.name,...e.description?{hint:e.description}:{}}))});return P(t)?null:t}async function _n(e){let t=await V({message:`Select your framework or build tool:`,initialValue:e.framework,options:[{value:`vanilla`,label:`Vanilla${e.framework===`vanilla`?` (Detected)`:``}`,hint:`Node.js, Bun, server-side or runtime-only validation`},{value:`vite`,label:`Vite${e.framework===`vite`?` (Detected)`:``}`,hint:`Client-side and static inlining validation`},{value:`bun-fullstack`,label:`Bun fullstack dev server${e.framework===`bun-fullstack`?` (Detected)`:``}`,hint:`Client-side bundling and Bun.serve integration`},{value:`nextjs`,label:`Next.js${e.framework===`nextjs`?` (Detected)`:``}`,hint:`Next.js App or Pages Router with build and runtime validation`},{value:`nuxt`,label:`Nuxt${e.framework===`nuxt`?` (Detected)`:``}`,hint:`Nuxt with build and runtime validation`}]});return P(t)?null:t}async function vn(e){let t=await z({message:`Optional: Would you also like to bootstrap a custom Bun.build script for programmatic bundling?`,initialValue:e.initialValue??!1});return P(t)?null:t}async function yn(){let e=await V({message:`Select your preferred validator library:`,options:[{value:`arktype`,label:`ArkType (Recommended)`,hint:`TypeScript's 1:1 validator, optimized from editor to runtime`},{value:`zod`,label:`Zod`,hint:`TypeScript-first schema validation with static type inference`},{value:`valibot`,label:`Valibot`,hint:`The modular and type safe schema library`}]});return P(e)?null:e}async function bn(e){let t=await z({message:`Enable automated ${e.framework===`nuxt`?`Nuxt`:`Next.js`} code generation for environment variables?`,initialValue:e.initialValue??!0,active:`Yes (Recommended)`,inactive:`No`});return P(t)?null:t}const q={vercel:{label:`Vercel`,hint:`Add VERCEL, VERCEL_ENV, VERCEL_URL, etc.`,serverOnlyKeys:[`VERCEL`],clientExposedKeys:[`VERCEL_ENV`,`VERCEL_URL`],fields:{VERCEL:{type:`string`},VERCEL_ENV:{type:`enum`,values:[`production`,`preview`,`development`]},VERCEL_URL:{type:`string`}}},netlify:{label:`Netlify`,hint:`Add NETLIFY, CONTEXT, URL, DEPLOY_URL, etc.`,serverOnlyKeys:[`NETLIFY`,`DEPLOY_URL`],clientExposedKeys:[`CONTEXT`,`URL`],fields:{NETLIFY:{type:`string`},DEPLOY_URL:{type:`string`},CONTEXT:{type:`enum`,values:[`production`,`deploy-preview`,`branch-deploy`]},URL:{type:`string`}}},cloudflare:{label:`Cloudflare Pages/Workers`,hint:`Add CF_PAGES, CF_PAGES_COMMIT_SHA, CF_PAGES_BRANCH, CF_PAGES_URL, etc.`,serverOnlyKeys:[`CF_PAGES`,`CF_PAGES_COMMIT_SHA`],clientExposedKeys:[`CF_PAGES_BRANCH`,`CF_PAGES_URL`],fields:{CF_PAGES:{type:`string`},CF_PAGES_COMMIT_SHA:{type:`string`},CF_PAGES_BRANCH:{type:`string`},CF_PAGES_URL:{type:`string`}}},railway:{label:`Railway`,hint:`Add RAILWAY_ENVIRONMENT_NAME, RAILWAY_PUBLIC_DOMAIN, RAILWAY_GIT_COMMIT_SHA, etc.`,serverOnlyKeys:[`RAILWAY_ENVIRONMENT_NAME`,`RAILWAY_PUBLIC_DOMAIN`,`RAILWAY_SERVICE_NAME`,`RAILWAY_GIT_COMMIT_SHA`],clientExposedKeys:[],fields:{RAILWAY_ENVIRONMENT_NAME:{type:`string`},RAILWAY_PUBLIC_DOMAIN:{type:`string`},RAILWAY_SERVICE_NAME:{type:`string`},RAILWAY_GIT_COMMIT_SHA:{type:`string`}}},render:{label:`Render`,hint:`Add RENDER, RENDER_SERVICE_ID, RENDER_SERVICE_TYPE, RENDER_EXTERNAL_URL, etc.`,serverOnlyKeys:[`RENDER`,`RENDER_SERVICE_ID`,`RENDER_SERVICE_TYPE`,`RENDER_EXTERNAL_URL`],clientExposedKeys:[],fields:{RENDER:{type:`string`},RENDER_SERVICE_ID:{type:`string`},RENDER_SERVICE_TYPE:{type:`string`},RENDER_EXTERNAL_URL:{type:`string`}}},fly:{label:`Fly.io`,hint:`Add FLY_APP_NAME, FLY_REGION, FLY_ALLOC_ID, etc.`,serverOnlyKeys:[`FLY_APP_NAME`,`FLY_REGION`,`FLY_ALLOC_ID`],clientExposedKeys:[],fields:{FLY_APP_NAME:{type:`string`},FLY_REGION:{type:`string`},FLY_ALLOC_ID:{type:`string`}}}};function xn(e){return e===`none`||Object.keys(q).includes(e)}function Sn(e,t){if(e===`none`)return[];let n=q[e],r=[...n.serverOnlyKeys,...n.clientExposedKeys];if(t)for(let e of n.clientExposedKeys)r.push(`${t}${e}`);return r}function Cn(e,t,n){if(!n||n===`none`)return;let r=t&&e.startsWith(t)?e.slice(t.length):e,i=q[n].fields;return r in i?i[r]:void 0}function wn(e,t,n){let r=Sn(t??`none`,n);if(!(!e?.length&&r.length===0))return Array.from(new Set([...e??[],...r]))}async function Tn(e){let t=[{value:`none`,label:`None`,hint:`Do not add any hosting-specific environment variables`},...Object.entries(q).map(([e,t])=>({value:e,label:t.label,hint:t.hint}))],n=await V({message:`Select a hosting provider preset (optional):`,initialValue:e?.initialValue??`none`,options:t});return P(n)?null:n}async function En(e){let t=await z({message:`Use default config path (${K(e.defaultEnvPath||`./src/env.ts`)})?`,initialValue:!0,active:`Yes (Recommended)`,inactive:`No, let me customize it`});return P(t)?null:t}async function Dn(e){let t=e.defaultEnvPath||`./src/env.ts`;if(!e.useDefaultPath){let e=await lt({message:`Where should we create the ArkEnv config?`,placeholder:t,initialValue:t,defaultValue:t});if(P(e))return null;let n=typeof e==`string`?e.trim():``;return n===``?t:n}return t}const J={example:gn,overwriteEnvSchemaFile:mn,framework:_n,bunBuild:vn,nextjsCodegen:bn,useDefaultPath:En,path:Dn,validator:yn,hostPreset:Tn,useEnvExample:hn};async function On(e,t=!1){return(e?.mode||`existing`)===`new`?kn(e,t):An(e,t)}async function kn(e,t=!1){let n=e?.examples||[],r=`arkenv-project`;try{let i;if(e?.name){let t=e.name.trim();i=t===`.`||t===`./`||s.default.resolve(process.cwd(),t)===process.cwd()?`.`:t}else if(t)i=r;else{let e=(Y(await lt({message:`Project name:`,placeholder:r,defaultValue:r}))||r).trim();i=e===`.`||e===`./`||s.default.resolve(process.cwd(),e)===process.cwd()?`.`:e}let a=e?.example;!a&&!t?a=Y(await J.example({examples:n})):!a&&t&&(a=`basic`);let o=n.find(e=>e.id===a);if(!o){let e=n.map(e=>e.id).join(`, `);throw Error(`Unknown example ${a}. Available examples: ${e}`)}return{mode:`new`,example:o.id,name:i,path:`./src/env.ts`,validator:`arktype`,framework:o.framework,language:`ts`,installSkill:!1}}catch(e){if(e instanceof jn)return null;throw e}}async function An(e,t=!1){let r=e?.defaultEnvPath||`./src/env.ts`,i=e?.envKeys||null,a=e?.envKeysSource||`.env.example`;if(t){let t=e?.framework||`vanilla`;return(0,n.shake)({mode:`existing`,path:r,validator:`arktype`,framework:t,bunFeatures:t===`bun-fullstack`?e?.bunFeatures??[`serve`]:void 0,language:`ts`,overwriteEnvSchemaFile:!0,installSkill:!1,envKeys:i??void 0,disableCodegen:e?.disableCodegen??!1,wrapNextjsConfig:t===`nextjs`?!0:void 0,hostPreset:e?.hostPreset||`none`})}try{let t=Y(await J.overwriteEnvSchemaFile({hasEnvSchemaFile:e?.hasEnvSchemaFile??!1,defaultPath:r})),o=Y(await J.framework({framework:e?.framework})),s;if(o===`bun-fullstack`){let t=!!e?.bunFeatures?.includes(`build`);s=Y(await J.bunBuild({initialValue:t}))}let c=e?.disableCodegen;o===`nuxt`?c=!0:o===`nextjs`&&c===void 0&&(c=!Y(await J.nextjsCodegen({initialValue:!0,framework:o})));let l;if(o===`nextjs`&&!c){let e=await z({message:`Would you like to wrap your Next.js config with ${K(`withArkEnv`)}?`,initialValue:!0,active:`Yes (Recommended)`,inactive:`No`});if(P(e))throw et(`Operation cancelled`),new jn;l=e}let u=Y(await J.useDefaultPath({defaultEnvPath:r})),d=Y(await J.path({useDefaultPath:u,defaultEnvPath:r})),f=Y(await J.validator()),p=e?.hostPreset===void 0?Y(await J.hostPreset({initialValue:e?.hostPreset})):e.hostPreset,m=Y(await J.useEnvExample({detectedKeys:i,keysSource:a}));return(0,n.shake)({mode:`existing`,overwriteEnvSchemaFile:t,framework:o,path:d,validator:f,hostPreset:p,bunFeatures:o===`bun-fullstack`?s?[`serve`,`build`]:[`serve`]:void 0,language:`ts`,installSkill:!1,envKeys:m?i??void 0:void 0,disableCodegen:c,wrapNextjsConfig:l})}catch(e){if(e instanceof jn)return null;throw e}}var jn=class extends Error{constructor(){super(`Operation cancelled`)}};function Y(e){if(e===null||P(e))throw et(`Operation cancelled`),new jn;return e}var Mn=class{async confirm(e,t=!0,r,i){let a=await z((0,n.shake)({message:e,initialValue:t,active:r,inactive:i}));return P(a)?null:a}async runWizard(e,t=!1){return On(e,t)}async select(e,t,n){let r=await V({message:e,options:t,initialValue:n});return P(r)?null:r}};const X={isYes:{long:`--yes`,short:`-y`,kind:`boolean`},isForce:{long:`--force`,short:`-f`,kind:`boolean`},isQuiet:{long:`--quiet`,short:`-q`,kind:`boolean`},isJson:{long:`--json`,short:`-j`,kind:`boolean`},isAgent:{long:`--agent`,short:``,kind:`boolean`},helpRequested:{long:`--help`,short:`-h`,kind:`boolean`},example:{long:`--example`,short:``,kind:`value`},noCodegen:{long:`--no-codegen`,short:``,kind:`boolean`},preset:{long:`--preset`,short:`-P`,kind:`value`},hostPreset:{long:`--host-preset`,short:`-H`,kind:`value`},schema:{long:`--schema`,short:`-s`,kind:`value`},envFile:{long:`--env-file`,short:``,kind:`value`},verifyExample:{long:`--verify-example`,short:``,kind:`optional-value`}},Nn=new Set(Object.values(X).flatMap(e=>[e.long,e.short].filter(Boolean))),Pn=new Set(Object.values(X).filter(e=>e.kind===`value`).flatMap(e=>[e.long,e.short].filter(Boolean)));var Fn=class{constructor(e,t={}){let n=e.slice(2),r=[],i=!1;for(let e of n){if(i){r.push(e),i=!1;continue}if(Pn.has(e)){r.push(e),i=!0;continue}if(/^-[a-zA-Z]{2,}$/.test(e)){let t=e.slice(1).split(``);for(let e of t)r.push(`-${e}`);Pn.has(`-${t[t.length-1]}`)&&(i=!0)}else r.push(e)}this.args=r,this.command=this.args[0];let a=1,o=[];for(this.validationError=void 0;a<this.args.length;){let e=this.args[a];if(e.startsWith(`-`)){if(!Nn.has(e)){this.validationError=`Unknown argument: ${e}`;break}if(e===X.verifyExample.long)a+1<this.args.length&&!this.args[a+1].startsWith(`-`)?(this.verifyExampleValue=this.args[a+1],a+=2):(this.verifyExampleValue=!0,a+=1);else if(Pn.has(e))if(a+1<this.args.length&&!this.args[a+1].startsWith(`-`))a+=2;else{this.validationError=`Missing value for option: ${e}`;break}else a+=1}else o.push(e),a+=1}if(!this.validationError){let e=this.getFlagValue(X.preset.long,X.preset.short)??this.getFlagValue(X.hostPreset.long,X.hostPreset.short);e!==void 0&&!xn(e)&&(this.validationError=`Invalid host preset: ${e}`)}this.positionalArgs=o,this.validationError||(this.command===`check`?o.length>0&&(this.validationError=`Unknown argument: ${o[0]}`):o.length>1?this.validationError=`Unknown argument: ${o[1]}`:this.name=o[0]),this.logger=t.logger||new dt({isQuiet:this.isQuiet,isJson:this.isJson,isYes:this.isYes})}get isAgent(){return this.hasFlag(`isAgent`)}get isYes(){return this.isAgent||this.hasFlag(`isYes`)}get isQuiet(){return this.isAgent||this.hasFlag(`isQuiet`)}get isJson(){return this.isAgent||this.hasFlag(`isJson`)}get isForce(){return this.hasFlag(`isForce`)}get helpRequested(){return this.hasFlag(`helpRequested`)}get example(){let e=X.example;return this.getFlagValue(e.long,e.short)}get noCodegen(){return this.hasFlag(`noCodegen`)}get schema(){let e=X.schema;return this.getFlagValue(e.long,e.short)}get envFiles(){let e=X.envFile;return this.getFlagValues(e.long,e.short)}get verifyExample(){return this.verifyExampleValue}get hostPreset(){let e=this.getFlagValue(X.preset.long,X.preset.short)??this.getFlagValue(X.hostPreset.long,X.hostPreset.short);if(e&&xn(e))return e}hasFlag(e){let t=X[e];return this.args.includes(t.long)||!!t.short&&this.args.includes(t.short)}get initInput(){let e={isYes:this.isYes,isForce:this.isForce,isQuiet:this.isQuiet,isAgent:this.isAgent};return this.example!==void 0&&(e.example=this.example),this.name!==void 0&&(e.name=this.name),this.noCodegen&&(e.noCodegen=!0),this.hostPreset!==void 0&&(e.hostPreset=this.hostPreset),e}get checkInput(){return{...this.schema===void 0?{}:{schema:this.schema,file:this.schema},...this.envFiles.length>0?{envFiles:this.envFiles}:{},...this.verifyExample===void 0?{}:{verifyExample:this.verifyExample},isQuiet:this.isQuiet,isJson:this.isJson,isAgent:this.isAgent,isYes:this.isYes,isForce:this.isForce}}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]}getFlagValues(e,t){let n=[];for(let r=0;r<this.args.length-1;r++){let i=this.args[r];(i===e||t&&i===t)&&!this.args[r+1].startsWith(`-`)&&n.push(this.args[r+1])}return n}};function In(e){return e.replace(/\\([nrtbfv0"\\])/g,(e,t)=>{switch(t){case`n`:return`
|
|
101
|
+
`;case`r`:return`\r`;case`t`:return` `;case`b`:return`\b`;case`f`:return`\f`;case`v`:return`\v`;case`0`:return`\0`;case`"`:return`"`;case`\\`:return`\\`;default:return`\\${t}`}})}function Ln(e,t){for(let n=0;n<e.length;n++){if(t===`"`&&e[n]===`\\`){n++;continue}if(e[n]===t)return n}return-1}function Rn(e){let t={},n=e.split(/\r?\n/),r=null,i=``,a=null;for(let e=0;e<n.length;e++){let o=n[e];if(a!==null){let e=Ln(o,a);if(e!==-1){i+=`
|
|
102
|
+
`+o.slice(0,e);let n=a===`"`?In(i):i;r!==null&&(t[r]=n),r=null,i=``,a=null}else i+=`
|
|
103
|
+
`+o;continue}let s=o.trimStart();if(!s||s.startsWith(`#`))continue;s.startsWith(`export `)&&(s=s.slice(7).trimStart());let c=s.indexOf(`=`);if(c===-1)continue;let l=s.slice(0,c).trim();if(!l||!/^[A-Za-z_][A-Za-z0-9_]*$/.test(l))continue;let u=s.slice(c+1).trimStart(),d=u[0];if(d===`"`||d===`'`||d==="`"){let e=u.slice(1),n=Ln(e,d);if(n!==-1){let r=e.slice(0,n);t[l]=d===`"`?In(r):r}else r=l,i=e,a=d}else{let e=u.indexOf(` #`);e!==-1&&(u=u.slice(0,e)),t[l]=u.trimEnd()}}return t}var zn=class{constructor(e,t,n,r){this.logger=e,this.workspace=t,this.scanner=n,this.schemaLoader=r}async execute(e){let n=e.cwd??process.cwd(),r=e.schema??e.file,i=!!(this.logger.isJson||e.isJson||e.isAgent),a=`.env`;try{await this.scanner.detectFramework(n)===`nextjs`&&(a=`.env.local`)}catch{}let o=await _t(n,this.workspace,this.scanner,r);if(!o){let e=r?`Schema file not found at "${s.default.resolve(n,r)}".`:`Could not locate your schema file. Add an 'arkenv' entry to package.json or specify --schema <path>.`,t=[{kind:`run-command`,label:`Initialize a new ArkEnv schema`,command:`{bin} init`}];return i?this.logger.reportErrored({ok:!1,commandId:`check`,error:{code:y.CLI_SCHEMA_NOT_FOUND,severity:`error`,summary:e,why:`The schema file could not be found in package.json or convention paths.`,docsUrl:`https://arkenv.js.org/docs/reference/check`,nextActions:t},diagnostics:[],nextActions:t}):this.logger.error(e),2}let c=s.default.relative(n,o)||o,l=await this.schemaLoader.load({schemaPath:o});if(!l.ok){let e=w(l.message);if(l.code===W.ERR_INSPECT_NO_CALL){let t=[{kind:`run-command`,label:`Initialize a new ArkEnv schema`,command:`{bin} init`}];return i?this.logger.reportErrored({ok:!1,commandId:`check`,error:{code:y.CLI_SCHEMA_NOT_FOUND,severity:`error`,summary:e,where:{path:c},nextActions:t},diagnostics:[],nextActions:t}):this.logger.error(e),2}let t=l.cause?w(l.cause instanceof Error?l.cause.stack??l.cause.message:String(l.cause)):void 0,n=[{kind:`edit-file`,label:`Fix errors in ${c}`,where:{path:c}}];return i?this.logger.reportErrored({ok:!1,commandId:`check`,error:{code:y.CLI_SCHEMA_NOT_FOUND,severity:`error`,summary:e,...t?{why:t}:{},where:{path:c},nextActions:n},diagnostics:[],nextActions:n}):(this.logger.error(e),t&&this.logger.warn(t)),2}if(e.verifyExample!==void 0){let t=typeof e.verifyExample==`string`?e.verifyExample:`.env.example`,r=s.default.resolve(n,t),a=s.default.relative(n,r)||t,o=``;await this.workspace.exists(r)&&(o=await this.workspace.readFile(r));let u=Rn(o),d=l.keys.map(e=>e.name),f=d.filter(e=>!(e in u));if(f.length>0){let e=f.map(e=>{let t=`${e} is declared in schema but missing in ${a}`,n=[{kind:`edit-file`,label:`Add ${e} to ${a}`,where:{path:a},meta:{targetFile:a,key:e}}];return{code:y.ENV_MISSING_VARIABLE,severity:`error`,summary:t,where:{path:a},meta:{key:e,targetFile:a},nextActions:n}}),t=e.flatMap(e=>e.nextActions);if(i)this.logger.reportCompleted({ok:!0,commandId:`check`,result:{schema:{path:c},file:{path:a},keys:{declared:d.length,missing:f.length}},exitCode:4,diagnostics:e,nextActions:t});else{let e=f.length===1?`key`:`keys`,t=f.map(e=>` - ${e}`).join(`
|
|
104
|
+
`);this.logger.error(`Missing ${f.length} ${e} in ${a}:\n${t}\n\nPlease add the missing ${e} to ${a}.`)}return 4}return i?this.logger.reportCompleted({ok:!0,commandId:`check`,result:{schema:{path:c},file:{path:a},keys:{declared:d.length,missing:0}},exitCode:0,diagnostics:[],nextActions:[]}):this.logger.success(`No issues found — ${a} matches the schema`),0}let u={...process.env};if(e.envFiles&&e.envFiles.length>0)for(let t of e.envFiles){let e=s.default.resolve(n,t);if(!await this.workspace.exists(e)){let n=`Environment file not found at "${e}".`;return i?this.logger.reportErrored({ok:!1,commandId:`check`,error:{code:y.CLI_INVALID_ARGUMENT,severity:`error`,summary:n,where:{path:t},nextActions:[]},diagnostics:[],nextActions:[]}):this.logger.error(n),2}let r=Rn(await this.workspace.readFile(e));Object.assign(u,r)}let d=await this.schemaLoader.validate({schemaPath:o},u);if(d.ok)return i?this.logger.reportCompleted({ok:!0,commandId:`check`,result:{schema:{path:c}},exitCode:0,diagnostics:[],nextActions:[]}):this.logger.success(`No issues found — your environment matches the schema`),0;if(d.kind===`validation`){let e=d.issues??[],n=e.map(e=>{let n=e.code===`MISSING_VARIABLE`||e.received===void 0,r=n?y.ENV_MISSING_VARIABLE:y.ENV_INVALID_VALUE,i=t.l(e.path)&&!t.s(),o;o=i?n?`missing`:`[REDACTED]`:n||e.received===void 0?`missing`:typeof e.received==`string`?e.received:t.c(e.received,e.path);let s=w(e.message.startsWith(e.path)?e.message:`${e.path} ${e.message.trimStart()}`,e.path),l=[{kind:`edit-file`,label:`Set ${e.path} in ${a}`,where:{path:a},meta:{targetFile:a,key:e.path,...e.expected===void 0?{}:{expected:e.expected}}}],u={key:e.path,...e.expected===void 0?{}:{expected:e.expected},received:o,issueCode:e.code,...e.meta?e.meta:{}};return{code:r,severity:`error`,summary:s,where:{path:c},meta:u,nextActions:l}}),r=n.flatMap(e=>e.nextActions);return i?this.logger.reportCompleted({ok:!0,commandId:`check`,result:{schema:{path:c}},exitCode:4,diagnostics:n,nextActions:r}):this.logger.error(`Errors found while validating environment variables:\n${t.o(t.i(e))}`),4}let f=d.message,p=w(f);return d.cause&&!(d.cause instanceof SyntaxError)&&!/syntax|cannot find module/i.test(f)?(i?this.logger.reportErrored({ok:!1,commandId:`check`,error:{code:y.CLI_INTERNAL_ERROR,severity:`error`,summary:p,where:{path:c},nextActions:[]},diagnostics:[],nextActions:[]}):this.logger.error(`Failed to validate environment: ${p}`),1):(i?this.logger.reportErrored({ok:!1,commandId:`check`,error:{code:y.CLI_SCHEMA_NOT_FOUND,severity:`error`,summary:p,where:{path:c},nextActions:[]},diagnostics:[],nextActions:[]}):this.logger.error(`Failed to load schema file at ${c}: ${p}`),2)}},Bn=`arkenv`,Vn=`1.0.0-alpha.20`;function Hn(e,t=2,n=4){let r=Math.max(...e.map(e=>e.left.length),0),i=` `.repeat(t);return e.map(e=>{let t=` `.repeat(r-e.left.length+n);return`${i}${e.left}${t}${e.right}`})}var Un=class{constructor(e){this.logger=e}async execute(){let e=[{left:`arkenv init [project-name]`,right:`Set up ArkEnv in your project`},{left:`arkenv check`,right:`Validate the environment against the schema`}],t=[{left:`--yes, -y`,right:`Skip prompts and use defaults (also passed to subprocesses)`},{left:`--quiet, -q`,right:`Quiet mode: Suppress output, capture logs on failure`},{left:`--json, -j`,right:`Output structured JSON to stdout`},{left:`--agent`,right:`Enable non-interactive, machine-readable mode for AI agents. Bypasses all prompts and outputs structured JSON. Macro for --yes --quiet --json`},{left:`--help, -h`,right:`Show this help message`}],n=[{left:`--example`,right:`Specify an example name when creating a new project`},{left:`--force, -f`,right:`Bypass technical requirement checks and dirty git working tree check, then force scaffolding`},{left:`--no-codegen`,right:`Disable automatic env.gen.ts code generation for Next.js`},{left:`--preset, -P <preset>`,right:`Specify a hosting provider preset (none, vercel, netlify, cloudflare, railway, render, fly)`}],r=[{left:`--schema, -s <path>`,right:`Path to schema file (overrides package.json or convention discovery)`},{left:`--env-file <file>`,right:`Path to .env file to load (repeatable; merged in order over process.env)`},{left:`--verify-example [file]`,right:`Verify that all declared schema keys are present in .env.example (or custom file)`}];this.logger.log(`ArkEnv CLI v${Vn}`),this.logger.log(`\n${_.default.bold(`Usage:`)}`);for(let t of Hn(e))this.logger.log(t);this.logger.log(`\n${_.default.bold(`Global options:`)}`);for(let e of Hn(t))this.logger.log(e);this.logger.log(`\n${_.default.bold(`init options:`)}`);for(let e of Hn(n))this.logger.log(e);this.logger.log(`\n${_.default.bold(`check options:`)}`);for(let e of Hn(r))this.logger.log(e)}};async function Wn(e,t){let n=t.targetDir??process.cwd(),r=s.default.join(process.cwd(),`.arkenv-temp`);await e.mkdir(r,!0),t.targetDir&&await e.mkdir(n,!0);try{await e.execute(`git`,[`clone`,`--filter=blob:none`,`--sparse`,t.repository,r]);let i=`examples/${t.example}`;await e.execute(`git`,[`-C`,r,`sparse-checkout`,`set`,i]);let a=s.default.join(r,i),o=await u.default.readdir(a),c=[];for(let t of o){let r=s.default.join(n,t);await e.exists(r)&&c.push(t)}if(c.length>0)throw Error(`Scaffolding into a non-empty directory failed. The following paths already exist: ${c.join(`, `)}`);await Gn(a,n);for(let e of[`package-lock.json`,`pnpm-lock.yaml`,`yarn.lock`,`bun.lockb`,`bun.lock`])await u.default.rm(s.default.join(n,e),{force:!0});let l=s.default.join(n,`package.json`);if(await e.exists(l)){let n=await e.readFile(l),r=JSON.parse(n);r.name=t.targetName,delete r.packageManager,await e.writeFile(l,JSON.stringify(r,null,2))}}finally{await u.default.rm(r,{recursive:!0,force:!0})}}async function Gn(e,t){let n=await u.default.readdir(e);await Promise.all(n.map(n=>u.default.cp(s.default.join(e,n),s.default.join(t,n),{recursive:!0,force:!1})))}function Kn(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 qn(e,t,n){if(t||e.metadata.skillDetected){let t=e.metadata.framework===`nextjs`&&!e.metadata.disableCodegen,r=e.metadata.framework===`nuxt`&&!e.metadata.disableCodegen,i=t&&!n,a=p.default`
|
|
105
|
+
Inside your AI assistant (e.g. Claude Code), use:
|
|
106
|
+
${K(`/arkenv`)} - automatically refine your schema and configure integrations.
|
|
107
|
+
`;return i?(a+=`
|
|
108
|
+
|
|
109
|
+
`,a+=`Also, wrap your Next.js config with ${K(`withArkEnv`)}:\n`,a+=` ${K(`import { withArkEnv } from "@arkenv/nextjs/config";`)}\n`,a+=` ${K(`export default withArkEnv(nextConfig);`)}\n`,a+=`Import and use: ${K(`import { env } from "${e.metadata.importPath}"`)}\n`):r&&(a+=`
|
|
110
|
+
|
|
111
|
+
`,a+=`Import and use: ${K(`import { env } from "${e.metadata.importPath}"`)}\n`),{message:a,title:`Next steps`}}let r=e.skill?.dlxCommand.join(` `)||`npx`,i=e.skill?.packageName||`yamcodes/arkenv`,a=``,o=1,s=e.metadata.displayPath;a+=`${o++}. Check ${K(s)} and refine your environment schema.\n`;let c=e.metadata.framework===`nextjs`&&!e.metadata.disableCodegen&&!n;return e.metadata.framework===`nextjs`&&(e.metadata.disableCodegen||c&&(a+=`${o++}. Wrap your Next.js config with ${K(`withArkEnv`)} inside ${K(`next.config.ts`)}:\n`,a+=` ${K(`import { withArkEnv } from "@arkenv/nextjs/config";`)}\n`,a+=` ${K(`export default withArkEnv(nextConfig);`)}\n`)),a+=`${o++}. Import and use: ${K(`import { env } from "${e.metadata.importPath}"`)}\n`,a+=`${o++}. (Recommended) Install the AI skill: ${K(`${r} skills add ${i}`)}\n`,a+=` Then run ${K(`/arkenv`)} inside your AI assistant to finish.`,{message:a,title:`Next steps`}}const Jn=[`esbuild`];var Yn=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 ${K(e.clone.example)}...`),await Wn(this.workspace,e.clone),t.start(`Scaffolding complete, finalizing...`));for(let t of e.files)t.action===`create`&&await this.workspace.exists(t.path)||(await this.workspace.mkdir(s.default.dirname(t.path),!0),await this.workspace.writeFile(t.path,t.content));if(t.stop(`Configuration scaffolded!`),await this.configurePackageJsonArkenv(e.install?.cwd??e.cwd,e.metadata),e.install&&process.env.SKIP_INSTALL!==`true`){e.install.packageManager===`pnpm`&&await this.configurePnpmBuilds(e.install.cwd??e.cwd),this.reporter.step(`Installing dependencies with ${K(e.install.packageManager)}...`);let[t,n]=Kn(e.install.packageManager,e.install.dependencies);await this.workspace.execute(t,n,e.install.cwd??e.cwd)}let n=!1;if(e.tsConfig){let t=await this.workspace.updateTsConfigToStrict(e.tsConfig.path);t.status===`updated`?(this.reporter.info(`Enforced strict: true in your ${K(t.file)}`),n=!0):t.status===`error`&&this.reporter.warn(`Could not automatically update ${K(t.file||`tsconfig.json`)}. Please ensure 'strict: true' is set manually.`)}let r=!1;if(e.bootstrap){if(e.bootstrap.framework===`vite`){let t=await this.workspace.findViteConfig(e.cwd);if(t){this.reporter.step(`Bootstrapping Vite plugin...`);let n=await this.workspace.bootstrapViteConfig(t,e.bootstrap.importPath||`./src/env`);n.success?n.updated&&this.reporter.info(`Updated ${K(s.default.basename(t))}`):(this.reporter.warn(`Could not automatically update ${K(s.default.basename(t))}: ${n.error}`),this.reporter.info(`Please add ${K(`@arkenv/vite-plugin`)} manually.`))}else this.reporter.info(`No Vite config found - please add ${K(`@arkenv/vite-plugin`)} to your Vite config manually.`)}else if(e.bootstrap.framework===`bun-fullstack`){let t=await this.workspace.findBunConfig(e.cwd),n=await this.workspace.bootstrapBunConfig(t,e.bootstrap.bunFeatures);n.success&&n.instructions?this.reporter.info(n.instructions):n.success||this.reporter.error(n.error||`Bun bootstrap failed`)}else if(e.bootstrap.framework===`nextjs`){if(!e.bootstrap.disableCodegen){this.reporter.step(`Generating Next.js environment bindings...`);let t=`import('@arkenv/nextjs/config').then(({ runCodegen }) => { const path = require('path'); const schemaPath = path.resolve(process.cwd(), '${e.metadata.displayPath}'); const outputPath = path.join(process.cwd(), '.arkenv', 'env.gen.ts'); runCodegen(schemaPath, outputPath); }).catch(err => { console.error(err); process.exit(1); });`;try{await this.workspace.execute(`node`,[`-e`,t],e.cwd),this.reporter.info(`Generated ${K(`.arkenv/env.gen.ts`)} for Next.js`);let n=await this.workspace.ensureNextjsArkEnvTsConfig(e.tsConfig?.path);n.status===`updated`&&this.reporter.info(`Mapped ${K(`@/.arkenv`)} in ${K(n.file||`tsconfig.json`)}`)}catch{this.reporter.warn(`Failed to automatically generate ${K(`.arkenv/env.gen.ts`)}. It will be generated when you start your dev server.`)}}if(e.bootstrap.wrapNextjsConfig!==!1){this.reporter.step(`Bootstrapping Next.js config...`);let t=await this.workspace.findNextjsConfig(e.cwd);if(t){let n=await this.workspace.bootstrapNextjsConfig(t,e.bootstrap.disableCodegen);n.success?n.updated?(this.reporter.info(`Updated ${K(s.default.basename(t))}`),r=!0):(this.reporter.info(`${K(s.default.basename(t))} already uses withArkEnv`),r=!0):this.reporter.warn(`Could not automatically update ${K(s.default.basename(t))}: ${n.error}`)}else this.reporter.info(`No Next.js config found. Please wrap your config with ${K(`withArkEnv`)} manually.`)}}else if(e.bootstrap.framework===`nuxt`){this.reporter.step(`Bootstrapping Nuxt config...`);let t=await this.workspace.findNuxtConfig(e.cwd);if(t){let e=await this.workspace.bootstrapNuxtConfig(t);e.success?(e.updated?this.reporter.info(`Updated ${K(s.default.basename(t))}`):this.reporter.info(`${K(s.default.basename(t))} already registers @arkenv/nuxt/module`),r=!0):this.reporter.warn(`Could not automatically update ${K(s.default.basename(t))}: ${e.error}`)}else this.reporter.info(`No Nuxt config found. Please register ${K(`@arkenv/nuxt/module`)} manually.`)}}let i=!1;if(e.skill&&process.env.SKIP_INSTALL!==`true`){this.reporter.step(`Installing ArkEnv agent skill...`);try{let[t,...n]=e.skill.dlxCommand,r=[...n,`skills`,`add`,e.skill.packageName];e.skill.isYes&&r.push(`--yes`),await this.workspace.execute(t,r,e.cwd),i=!0}catch(e){let t=e instanceof Error?e.message:String(e);this.reporter.warn(`Failed to install ArkEnv AI skill: ${t}`)}}let a=qn(e,i,r);this.reporter.note(a.message,a.title),this.reporter.finish(`${Kt} 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},`init`)}catch(e){throw t.stop(`Scaffolding failed.`),e}}async configurePnpmBuilds(e){let t=s.default.join(e,`package.json`);if(await this.workspace.exists(t))try{let e=await this.workspace.readFile(t),n=JSON.parse(e);n.pnpm=n.pnpm||{},n.pnpm.onlyBuiltDependencies=n.pnpm.onlyBuiltDependencies||[];for(let e of Jn)n.pnpm.onlyBuiltDependencies.includes(e)||n.pnpm.onlyBuiltDependencies.push(e);await this.workspace.writeFile(t,JSON.stringify(n,null,2)+`
|
|
112
|
+
`)}catch(e){this.reporter.warn(`Could not update package.json with pnpm whitelisting: ${e}`)}let n=s.default.join(e,`pnpm-workspace.yaml`),r=``;if(await this.workspace.exists(n))try{r=await this.workspace.readFile(n)}catch{}let i=this.updatePnpmWorkspaceYaml(r);try{await this.workspace.writeFile(n,i)}catch(e){this.reporter.warn(`Could not write pnpm-workspace.yaml: ${e}`)}}updatePnpmWorkspaceYaml(e){let t=(0,h.parseDocument)(e||``);t.has(`allowBuilds`)||t.set(`allowBuilds`,t.createNode({}));let n=t.get(`allowBuilds`);if((0,h.isMap)(n)||(t.set(`allowBuilds`,t.createNode({})),n=t.get(`allowBuilds`)),(0,h.isMap)(n))for(let e of Jn)n.get(e)!==!0&&n.set(e,!0);return String(t)}async configurePackageJsonArkenv(e,t){let n=s.default.join(e,`package.json`);if(await this.workspace.exists(n))try{let e=await this.workspace.readFile(n),r=JSON.parse(e);r.arkenv={schema:t.displayPath},await this.workspace.writeFile(n,JSON.stringify(r,null,2)+`
|
|
113
|
+
`)}catch(e){this.reporter.warn(`Could not update package.json with arkenv schema entry: ${e}`)}}};const Z={nextjs:{id:`nextjs`,packageName:`@arkenv/nextjs`,clientPrefix:`NEXT_PUBLIC_`,displayName:`Next.js`,supportsWrapNextjsConfig:!0},nuxt:{id:`nuxt`,packageName:`@arkenv/nuxt`,clientPrefix:`NUXT_PUBLIC_`,displayName:`Nuxt`,supportsWrapNextjsConfig:!1}};function Xn(e){if(e===`nextjs`||e===`nuxt`)return Z[e]}function Zn(e){return e===`nextjs`||e===`nuxt`}const Qn={nextjs:Z.nextjs.clientPrefix,nuxt:Z.nuxt.clientPrefix,vite:`VITE_`,"bun-fullstack":`BUN_PUBLIC_`,vanilla:``};function $n(e,t){let n=Xn(e.framework);return{framework:e.framework,clientPrefix:Qn[e.framework],...n?.packageName!==void 0&&{packageName:n.packageName},disableCodegen:e.disableCodegen===!0,...t!==void 0&&{nextjsImportPath:t},...e.hostPreset!==void 0&&{hostPreset:e.hostPreset}}}const er={NODE_ENV:`development`,PORT:`3000`,DATABASE_URL:`postgres://localhost:5432/mydb`};function tr(e){let t={};for(let n of e)t[n]=er[n]??``;return t}function nr(e,t,n){if(!n)return;let r=((n.compilerOptions||{}).paths||{})[`@/*`];if(!r)return;let i=n.path?s.default.dirname(n.path):e,a=s.default.relative(i,t).replace(/\\/g,`/`);for(let e of r){let t=e.replace(/^\.\//,``).replace(/\*$/,``);if(t===``||a.startsWith(t)){let e=a;return t!==``&&a.startsWith(t)&&(e=a.substring(t.length)),e=e.replace(/^\/+/,``).replace(/\/+$/,``),`@/${e}/env.gen`.replace(/\/+/g,`/`)}}}function rr(e,t){if(!(!Zn(t.framework)||t.disableCodegen)){if(t.framework===`nextjs`)return`@/.arkenv`;if(e.tsConfig?.parsed)return nr(e.cwd,s.default.join(e.targetDir,`generated`),e.tsConfig.parsed)}}function ir(e,t,n,r){let i=$n(t,r),a=e.getSimpleTemplate(t.envKeys??[],i),o=n.existingFiles.includes(n.targetPath);return!o||t.overwriteEnvSchemaFile!==!1?[{path:n.targetPath,content:a,action:o?`overwrite`:`create`,label:`environment schema`}]:[]}const ar={clientPrefix:Qn[`bun-fullstack`],getEnvDefaults(e){return e&&e.length>0?tr(e):{DATABASE_URL:`postgres://localhost:5432/mydb`,BUN_PUBLIC_API_URL:`https://api.example.com`,NODE_ENV:`development`}},getDependencies(e){return e.bunFeatures?.length?[`@arkenv/bun-plugin`]:[]},requiresArktypePeer(e){return!!e.bunFeatures?.length},bootstrap(e){return(0,n.shake)({framework:`bun-fullstack`,bunFeatures:e.bunFeatures})},getSchemaFiles(e,t,n){return ir(e,t,n)}};function or(e){let{id:t,packageName:r,clientPrefix:i,supportsWrapNextjsConfig:a}=e,o=`${i}API_URL`;return{clientPrefix:i,getEnvDefaults(e){return e&&e.length>0?tr(e):{DATABASE_URL:`postgres://localhost:5432/mydb`,[o]:`https://api.example.com`,NODE_ENV:`development`}},getDependencies(){return[r]},requiresArktypePeer(){return!0},bootstrap(e){return(0,n.shake)({framework:t,...a&&{wrapNextjsConfig:e.wrapNextjsConfig!==!1},disableCodegen:e.disableCodegen})},getSchemaFiles(e,t,n){return ir(e,t,n,rr(n,t))}}}const sr=or(Z.nextjs),cr=or(Z.nuxt),lr={clientPrefix:Qn.vanilla,getEnvDefaults(e){return e&&e.length>0?tr(e):{PORT:`3000`,NODE_ENV:`development`}},getDependencies(){return[]},requiresArktypePeer(){return!1},bootstrap(){},getSchemaFiles(e,t,n){return ir(e,t,n)}},ur={vite:{clientPrefix:Qn.vite,getEnvDefaults(e){return e&&e.length>0?tr(e):{DATABASE_URL:`postgres://localhost:5432/mydb`,VITE_API_URL:`https://api.example.com`,NODE_ENV:`development`}},getDependencies(){return[`@arkenv/vite-plugin`]},requiresArktypePeer(){return!0},bootstrap(){return(0,n.shake)({framework:`vite`})},getSchemaFiles(e,t,n){return ir(e,t,n)}},"bun-fullstack":ar,nextjs:sr,nuxt:cr,vanilla:lr},dr={basic:{HOST:`localhost`,PORT:`3000`,NODE_ENV:`development`},"basic-js":{HOST:`localhost`,PORT:`3000`,NODE_ENV:`development`},"with-bun":{HOST:`localhost`,PORT:`3000`,NODE_ENV:`development`},"with-nextjs":{DATABASE_URL:`postgres://localhost:5432/mydb`,NEXT_PUBLIC_API_URL:`https://api.example.com`,NODE_ENV:`development`},"with-nextjs-zod":{DATABASE_URL:`postgres://localhost:5432/mydb`,NEXT_PUBLIC_API_URL:`https://api.example.com`,NODE_ENV:`development`},"with-nuxt":{DATABASE_URL:`postgres://localhost:5432/mydb`,NUXT_PUBLIC_API_URL:`https://api.example.com`,NODE_ENV:`development`},"with-vite-react":{PORT:`3000`,VITE_MY_VAR:`hello`,VITE_MY_NUMBER:`42`,VITE_MY_BOOLEAN:`true`},"with-vite-react-zod":{PORT:`3000`,VITE_MY_VAR:`hello`,VITE_MY_NUMBER:`42`,VITE_MY_BOOLEAN:`true`},"with-bun-react":{BUN_PUBLIC_API_URL:`https://api.example.com`,BUN_PUBLIC_DEBUG:`true`,NODE_ENV:`development`},"with-zod":{HOST:`localhost`,PORT:`3000`,NODE_ENV:`development`},"with-valibot":{HOST:`localhost`,PORT:`3000`,NODE_ENV:`development`},"mix-and-match":{DATABASE_URL:`https://postgres.example.com/db`,API_KEY:`12345678901234567890123456789012`,NODE_ENV:`development`,PORT:`3000`,DEBUG:`false`}};function fr(e,t){return dr[e]??t()}function pr(e){switch(e){case`pnpm`:return[`pnpm`,`dlx`];case`yarn`:return[`yarn`,`dlx`];case`bun`:return[`bunx`];default:return[`npx`]}}function mr(e,t,n,r){if(!r||r===`none`)return;let i=Sn(r,n);for(let a of i)n&&a.startsWith(n)?e.clientFields.push(`\t\t${t.formatCodegenField(a,`client`,n,r)}`):e.serverFields.push(`\t\t${t.formatCodegenField(a,`server`,n,r)}`)}function hr(e){let t=[];for(let n of e){let e=n.trim().match(/^([a-zA-Z0-9_]+)\s*:/);e&&t.push(e[1])}return t}function gr(e,t,n,r=[]){let i=[],a=new Set,o=e=>{a.has(e)||(a.add(e),i.push(`\t\t${e}: process.env.${e},`))};if(e&&e.length>0){for(let n of e)(n.startsWith(t)||n===`NODE_ENV`||r.includes(n))&&o(n);return i}o(`${t}API_URL`),o(`NODE_ENV`);for(let e of hr(n))o(e);for(let e of r)o(e);return i}function _r(e){let{envKeys:t,dialect:n,config:r,importPath:i,disableCodegen:a,hostPreset:o}=e,{clientPrefix:s}=r,c=[],l=[],u=[];if(t&&t.length>0)for(let e of t)e.startsWith(s)?l.push(`\t\t${n.formatCodegenField(e,`client`,s,o)}`):e===`NODE_ENV`?u.push(`\t\t${n.formatCodegenField(e,`shared`,s,o)}`):c.push(`\t\t${n.formatCodegenField(e,`server`,s,o)}`);else{let e=n.getDefaultCodegenFields(s);c.push(...e.serverFields),l.push(...e.clientFields),u.push(...e.sharedFields),mr({serverFields:c,clientFields:l},n,s,o)}return vr({serverFields:c,clientFields:l,sharedFields:u,envKeys:t,dialect:n,config:r,nextjsImportPath:i,disableCodegen:a,hostPreset:o})}function vr(e){let{serverFields:t,clientFields:n,sharedFields:r,envKeys:i,dialect:a,config:o,nextjsImportPath:s,disableCodegen:c,hostPreset:l}=e,{clientPrefix:u,packageName:d,displayName:f}=o,p=o.id,m=a.extraImport,h=Sn(l??`none`,u),g;if(l&&l!==`none`&&h.length>0){let e=[...t,...n,...r].filter(e=>{let t=e.trim().match(/^([a-zA-Z0-9_]+)\s*:/)?.[1];return t&&!h.includes(t)}).map(e=>e.replace(/^\t\t/,` `)),i=[];for(let e of h){let t=u&&e.startsWith(u)?`client`:e===`NODE_ENV`?`shared`:`server`;i.push(`\t${a.formatCodegenField(e,t,u,l)}`)}let o=q[l]?.label??l;g=[...e,...e.length>0?[``]:[],`\t// ${o} environment variables`,...i]}else g=[...t,...n,...r].map(e=>e.replace(/^\t\t/,` `));let _=[];for(let e of r){let t=e.trim().match(/^([a-zA-Z0-9_]+)\s*:/);if(t){let e=t[1];e!==`NODE_ENV`&&_.push(e)}}let v=[];if(_.length>0&&v.push(`\texposeToClient: [${_.map(e=>`"${e}"`).join(`, `)}]`),c&&p===`nextjs`){let e=gr(i,u,n,_);v.push(`\truntimeEnv: {\n${e.join(`
|
|
114
|
+
`)}\n\t}`)}let y=v.length>0?`, {\n${v.join(`,
|
|
115
|
+
`)}\n}`:``;return`${[`import arkenv from "${p===`nuxt`||c?d:s||`@/.arkenv`}";`,...m?[m]:[]].join(`
|
|
116
|
+
`)}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Environment variable schema.
|
|
120
|
+
* ${p===`nuxt`?`In ${f}, use \`${d}\` to validate variables at build-time and runtime.`:`In ${f}, import the generated \`arkenv\` from \`@/.arkenv\` to validate variables.`}
|
|
121
|
+
* Enforces client/server separation and prevents secret leaks.
|
|
122
|
+
*/
|
|
123
|
+
export const env = arkenv({
|
|
124
|
+
${g.join(`
|
|
125
|
+
`)}
|
|
126
|
+
}${y});
|
|
127
|
+
`}function yr(e,t,n){let r=Sn(n.hostPreset??`none`,n.clientPrefix),i=Xn(n.framework);if(i){let a=t.length>0?Array.from(new Set([...t,...r])):void 0;return`${_r({...a===void 0?{}:{envKeys:a},dialect:e,config:i,...n.nextjsImportPath!==void 0&&{importPath:n.nextjsImportPath},disableCodegen:n.disableCodegen,...n.hostPreset!==void 0&&{hostPreset:n.hostPreset}})}\n`}let a;if(n.hostPreset&&n.hostPreset!==`none`&&r.length>0){let i=`\t\t// ${q[n.hostPreset]?.label??n.hostPreset} environment variables`,o=e.formatSimpleSchemaFields(r,n.clientPrefix,n.hostPreset),s=t.filter(e=>!r.includes(e));a=s.length>0?`${e.formatSimpleSchemaFields(s,n.clientPrefix,void 0)}\n\n${i}\n${o}`:`${e.defaultSimpleSchemaFields}\n\n${i}\n${o}`}else a=t.length>0?e.formatSimpleSchemaFields(t,n.clientPrefix,n.hostPreset):e.defaultSimpleSchemaFields;return`${e.assembleVanilla(a)}\n`}function br(e,t){return t.type===`string`?e.formatOptionalString():e.formatOptionalEnum(t.values)}function Q(e,t,n,r){let i=Cn(t,n,r);if(i)return br(e,i)}const xr={formatOptionalString(){return`"string?"`},formatOptionalEnum(e){return`"'${e.join(`' | '`)}'?"`},formatCodegenField(e,t,n=``,r=void 0){if(t===`shared`)return`${e}: "'development' | 'production' | 'test' = 'development'",`;let i=Q(xr,e,n,r);return i?`${e}: ${i},`:`${e}: "string?",`},defaultSimpleSchemaFields:` NODE_ENV: "'development' | 'production' | 'test' = 'development'",
|
|
128
|
+
PORT: "number.port = 3000",`,formatSimpleSchemaFields(e,t=``,n=void 0){return e.map(e=>`\t\t${e}: ${Q(xr,e,t,n)??`"string?"`},`).join(`
|
|
129
|
+
`)},getDefaultCodegenFields(e){return{serverFields:[` DATABASE_URL: "string = 'postgres://localhost:5432/mydb'",`],clientFields:[`\t\t${e}API_URL: "string = 'https://api.example.com'",`],sharedFields:[` NODE_ENV: "'development' | 'production' | 'test' = 'development'",`]}},assembleVanilla(e){return p.default`
|
|
130
|
+
import arkenv, { type } from "@arkenv/core";
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Environment variable schema for server-side or runtime-only validation.
|
|
134
|
+
*/
|
|
135
|
+
export const env = arkenv({
|
|
136
|
+
${e}
|
|
137
|
+
});
|
|
138
|
+
`}},Sr={extraImport:`import * as v from "valibot";`,formatOptionalString(){return`v.optional(v.string())`},formatOptionalEnum(e){return`v.optional(v.picklist([${e.map(e=>`"${e}"`).join(`, `)}]))`},formatCodegenField(e,t,n=``,r=void 0){if(t===`shared`)return`${e}: v.optional(v.picklist(["development", "production", "test"]), "development"),`;let i=Q(Sr,e,n,r);return i?`${e}: ${i},`:`${e}: v.optional(v.string()),`},defaultSimpleSchemaFields:` NODE_ENV: v.optional(v.picklist(["development", "production", "test"]), "development"),
|
|
139
|
+
PORT: v.optional(v.pipe(v.number(), v.integer(), v.minValue(1), v.maxValue(65535)), 3000),`,formatSimpleSchemaFields(e,t=``,n=void 0){return e.map(e=>`\t\t${e}: ${Q(Sr,e,t,n)??`v.optional(v.string())`},`).join(`
|
|
140
|
+
`)},getDefaultCodegenFields(e){return{serverFields:[` DATABASE_URL: v.optional(v.pipe(v.string(), v.url()), "postgres://localhost:5432/mydb"),`],clientFields:[`\t\t${e}API_URL: v.optional(v.pipe(v.string(), v.url()), "https://api.example.com"),`],sharedFields:[` NODE_ENV: v.optional(v.picklist(["development", "production", "test"]), "development"),`]}},assembleVanilla(e){return p.default`
|
|
141
|
+
import { arkenv } from "@arkenv/standard/valibot";
|
|
142
|
+
import * as v from "valibot";
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Environment variable schema for server-side or runtime-only validation.
|
|
146
|
+
*/
|
|
147
|
+
export const env = arkenv({
|
|
148
|
+
${e}
|
|
149
|
+
});
|
|
150
|
+
`}},Cr={extraImport:`import * as z from "zod";`,formatOptionalString(){return`z.string().optional()`},formatOptionalEnum(e){return`z.enum([${e.map(e=>`"${e}"`).join(`, `)}]).optional()`},formatCodegenField(e,t,n=``,r=void 0){if(t===`shared`)return`${e}: z.enum(["development", "production", "test"]).default("development"),`;let i=Q(Cr,e,n,r);return i?`${e}: ${i},`:`${e}: z.string().optional(),`},defaultSimpleSchemaFields:` NODE_ENV: z.enum(["development", "production", "test"]).default("development"),
|
|
151
|
+
PORT: z.int().min(1).max(65535).default(3000),`,formatSimpleSchemaFields(e,t=``,n=void 0){return e.map(e=>`\t\t${e}: ${Q(Cr,e,t,n)??`z.string().optional()`},`).join(`
|
|
152
|
+
`)},getDefaultCodegenFields(e){return{serverFields:[` DATABASE_URL: z.url().default("postgres://localhost:5432/mydb"),`],clientFields:[`\t\t${e}API_URL: z.url().default("https://api.example.com"),`],sharedFields:[` NODE_ENV: z.enum(["development", "production", "test"]).default("development"),`]}},assembleVanilla(e){return p.default`
|
|
153
|
+
import arkenv from "@arkenv/standard";
|
|
154
|
+
import * as z from "zod";
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Environment variable schema for server-side or runtime-only validation.
|
|
158
|
+
*/
|
|
159
|
+
export const env = arkenv({
|
|
160
|
+
${e}
|
|
161
|
+
});
|
|
162
|
+
`}},wr={arktype:xr,zod:Cr,valibot:Sr};function Tr(e){return{getSimpleTemplate(t,n){return yr(e,t,n)}}}const Er={arktype:Tr(wr.arktype),zod:Tr(wr.zod),valibot:Tr(wr.valibot)};function Dr(e){return e.mode===`new`?Nr(e):Pr(e)}function $(e,t){return e.some(e=>{let n=e.indexOf(`#`),r=(n===-1?e:e.slice(0,n)).trim();if(!r)return!1;if(r===t||r===`/${t}`)return!0;if(r.includes(`*`)){let e=`^${r.replace(/\./g,`\\.`).replace(/\*/g,`.*`).replace(/^\//,`/?`)}$`;try{let n=new RegExp(e);return n.test(t)||n.test(`/${t}`)}catch{return!1}}return!1})}function Or(e){return Object.entries(e).map(([e,t])=>`${e}=${t}`).join(`
|
|
163
|
+
`)+`
|
|
164
|
+
`}function kr(e,t){let{cwd:n,options:r,existingFiles:i}=e,a=ur[r.framework],o=s.default.join(n,`.env`),c=s.default.join(n,`.env.example`),l=i.includes(o),u=i.includes(c),d=wn(r.envKeys,r.hostPreset,a.clientPrefix);if(!l){let e=r.envExampleContent===void 0?Or(a.getEnvDefaults(d)):r.envExampleContent;t.files.push({path:o,content:e,action:`create`,label:`local environment variables`})}u||t.files.push({path:c,content:Or(a.getEnvDefaults(d)),action:`create`,label:`environment variables template`})}function Ar(e,t){let{cwd:n,options:r,existingFiles:i}=e,a=s.default.join(n,`.gitignore`),o=i.includes(a),c=r.framework===`nextjs`;if(o&&r.gitignoreContent!==void 0){let e=r.gitignoreContent.split(/\r?\n/),n=$(e,`.env`),i=$(e,`.env.local`),o=$(e,`.arkenv`)||$(e,`.arkenv/`);if(!n||!i||c&&!o){let e=``;(!n||!i)&&(e+=`
|
|
165
|
+
# Environment variables
|
|
166
|
+
`,n||(e+=`.env
|
|
167
|
+
`),i||(e+=`.env.local
|
|
168
|
+
`)),c&&!o&&(e+=`
|
|
169
|
+
# ArkEnv generated factory
|
|
170
|
+
.arkenv/
|
|
171
|
+
`);let s=r.gitignoreContent.endsWith(`
|
|
172
|
+
`)?`${r.gitignoreContent}${e.trim()}\n`:`${r.gitignoreContent}\n${e.trim()}\n`;t.files.push({path:a,content:s,action:`overwrite`,label:`.gitignore update`})}}else if(!o){let e=`# Environment variables
|
|
173
|
+
.env
|
|
174
|
+
.env.local
|
|
175
|
+
`;c&&(e+=`
|
|
176
|
+
# ArkEnv generated factory
|
|
177
|
+
.arkenv/
|
|
178
|
+
`),t.files.push({path:a,content:e,action:`create`,label:`.gitignore file`})}}function jr(e){let{mode:t,options:r,packageManager:i}=e,a=r.name&&r.name!==`.`?s.default.basename(r.name):void 0;return(0,n.shake)({displayPath:``,framework:r.framework,validator:r.validator,packageManager:i,importPath:``,mode:t,example:r.example,name:a,skillDetected:r.skillDetected,disableCodegen:r.disableCodegen})}function Mr(e,t){e.options.installSkill&&(t.skill={dlxCommand:pr(e.packageManager),packageName:`yamcodes/arkenv`,isYes:e.isYes})}function Nr(e){let{options:t,packageManager:n,cwd:r}=e;if(!t.example)throw Error(`New project scaffolding requires an example.`);let i=t.name&&t.name!==`.`?s.default.join(r,t.name):void 0,a=t.name&&t.name!==`.`?s.default.basename(t.name):s.default.basename(r),o={files:[],cwd:r,metadata:jr(e),clone:{repository:`https://github.com/yamcodes/arkenv.git`,example:t.example,targetName:a,...i!==void 0&&{targetDir:i}},install:{packageManager:n,dependencies:[],...i!==void 0&&{cwd:i}}};Mr(e,o);let c=Or(fr(t.example,()=>ur[t.framework].getEnvDefaults())),l=i??r;return o.files.push({path:s.default.join(l,`.env`),content:c,action:`create`,label:`local environment variables`},{path:s.default.join(l,`.env.example`),content:c,action:`create`,label:`environment variables template`}),o.metadata.displayPath=`./src/env.ts`,o.metadata.importPath=`./src/env`,o}function Pr(e){let{options:t,packageManager:n,tsConfig:r,shouldUpdateTsConfig:i,cwd:a,existingFiles:o}=e,c=ur[t.framework],l=Er[t.validator],u=s.default.resolve(a,t.path),d=s.default.dirname(u),f={files:[],cwd:a,metadata:jr(e)},p={targetPath:u,targetDir:d,cwd:a,existingFiles:o,overwriteEnvSchemaFile:t.overwriteEnvSchemaFile,path:t.path,tsConfig:r};f.files.push(...c.getSchemaFiles(l,t,p)),kr(e,f),Ar(e,f);let m=t.framework===`nextjs`||t.framework===`nuxt`?void 0:t.validator===`arktype`?`@arkenv/core`:`@arkenv/standard`,h=[...m?[m]:[],t.validator,...t.validator===`valibot`?[`@valibot/to-json-schema`]:[],...c.getDependencies(t)];c.requiresArktypePeer(t)&&!h.includes(`arktype`)&&h.push(`arktype`),f.install={packageManager:n,dependencies:Array.from(new Set(h))},i&&r.file&&(f.tsConfig={path:s.default.resolve(a,r.file),action:`strict`});let g=c.bootstrap(t);g&&(f.bootstrap=g),Mr(e,f);let _=s.default.relative(a,u).replace(/\\/g,`/`),v=_.startsWith(`.`)?_:`./${_}`,y=v.replace(/\.(ts|js|tsx|jsx)$/,``);return f.metadata.displayPath=v,f.metadata.importPath=y,f.bootstrap&&(f.bootstrap.importPath=y),f}var Fr=class{async fetchRegistry(){try{let e=await fetch(`https://raw.githubusercontent.com/yamcodes/arkenv/main/examples/registry.json`);if(!e.ok)throw Error(`Failed to fetch registry: ${e.statusText}`);return await e.json()}catch{return{examples:[{id:`basic`,name:`Basic`,description:`A minimal ArkEnv setup in Node.js`,framework:`vanilla`},{id:`with-nextjs`,name:`Next.js`,description:`Minimal Next.js project with ArkType`,framework:`nextjs`},{id:`with-nextjs-zod`,name:`Next.js (Zod)`,description:`Next.js with @arkenv/nextjs/standard and Zod`,framework:`nextjs`},{id:`with-vite-react`,name:`React + Vite`,framework:`vite`},{id:`with-vite-react-zod`,name:`React + Vite (Zod)`,description:`React + Vite with @arkenv/vite-plugin/standard and Zod`,framework:`vite`},{id:`with-bun`,name:`Bun (Vanilla)`,description:`Minimal Bun project with ArkType`,framework:`vanilla`},{id:`with-bun-react`,name:`React + Bun fullstack dev server`,framework:`bun-fullstack`},{id:`with-zod`,name:`Zod`,description:`ArkEnv with Zod in Node.js`,framework:`vanilla`},{id:`with-valibot`,name:`Valibot`,description:`ArkEnv with Valibot in Node.js`,framework:`vanilla`},{id:`mix-and-match`,name:`Mix and Match`,description:`ArkEnv with mixed ArkType, Zod, and Valibot in Node.js`,framework:`vanilla`}]}}}},Ir=class{async checkFreshness(e){let{currentVersion:t,packageName:n=`arkenv`,timeoutMs:r=1e3}=e;try{let i=It(t),a=typeof i?.prerelease[0]==`string`?i.prerelease[0]:`latest`,o=e.distTag||a,s=`https://registry.npmjs.org/${encodeURIComponent(n)}/${encodeURIComponent(o)}`,c=await fetch(s,{signal:AbortSignal.timeout(r),headers:{Accept:`application/json`}});if(!c.ok)return{isOutdated:!1};let l=(await c.json())?.version;return!l||typeof l!=`string`?{isOutdated:!1}:{isOutdated:Lt(l,t)>0,latestVersion:l,distTag:o}}catch{return{isOutdated:!1}}}};function Lr(e,t,n=process.env.npm_config_user_agent||``,r=`latest`){let i=`${e}@${r}`;return n.includes(`pnpm`)?{command:`pnpm`,dlxArgs:[`dlx`,i,...t]}:n.includes(`bun`)?{command:`bunx`,dlxArgs:[i,...t]}:n.includes(`yarn`)?{command:`yarn`,dlxArgs:[`dlx`,i,...t]}:{command:`npx`,dlxArgs:[i,...t]}}async function Rr(e){let{command:t,dlxArgs:n}=Lr(e.packageName,e.args,e.userAgent,e.tag),r=e.spawnFn??l.spawn;return new Promise((e,i)=>{let a=r(t,n,{stdio:`inherit`,shell:process.platform===`win32`}),o=()=>{a.kill(`SIGINT`)},s=()=>{a.kill(`SIGTERM`)};process.on(`SIGINT`,o),process.on(`SIGTERM`,s);let c=()=>{process.off(`SIGINT`,o),process.off(`SIGTERM`,s)};a.on(`error`,e=>{c(),i(e)}),a.on(`close`,(t,n)=>{if(c(),n===`SIGINT`){e(t??130);return}if(n===`SIGTERM`){e(t??143);return}if(n){e(t??1);return}e(t??0)})})}var zr=class{constructor(e,t,n,r,i=new Fr,a=new Ir,o=Rr,s=e=>process.exit(e)){this.logger=e,this.workspace=t,this.prompt=n,this.scanner=r,this.registry=i,this.versionChecker=a,this.spawner=o,this.exit=s}async execute(e){if(!process.env.CI&&process.stdout.isTTY&&!e.isQuiet&&!e.isAgent&&!e.isYes){let e=await this.versionChecker.checkFreshness({currentVersion:Vn,packageName:Bn,timeoutMs:1e3});if(e.isOutdated&&e.latestVersion){let t=await this.prompt.confirm(`Version ${e.latestVersion} is available (running ${Vn}). Run latest instead?`,!0,`Yes (Recommended)`);if(t===null)return this.logger.cancel(`Operation cancelled.`),!1;if(t){let t=process.argv.slice(2),n=t[0]===`init`?t:[`init`,...t],r=await this.spawner({packageName:Bn,args:n,tag:e.distTag});return this.exit(r),!0}}}let t=await this.collect(e);if(!t)return!1;let n=Dr(t),r=new Yn(this.workspace,this.logger);try{await r.execute(n)}catch(e){this.logger.fatal(`Scaffolding failed.`,e)}return!0}async collect(e){this.logger.interactiveStdout(!0);try{let t=e.name;t&&s.default.resolve(process.cwd(),t)===process.cwd()&&(t=`.`);let n={...e,...t!==void 0&&{name:t}},r=t&&t!==`.`?s.default.resolve(process.cwd(),t):process.cwd(),i=await this.workspace.exists(r),a=i?await this.scanner.hasPackageJson(r):!1,o=i?await this.scanner.isEmptyDirectory(r):!0;return n.example===void 0?a?await this.collectExistingProject(n,r):o||n.isForce?await this.collectNewProject(n,o):(this.logger.error(`Directory is not empty and no ${K(`package.json`)} was found.`),this.logger.info(`To scaffold a new project, run ${K(`arkenv init`)} in an empty directory or use ${K(`--force`)} to proceed anyway.`),this.logger.refuse({code:v.NON_EMPTY_DIR,message:`Directory is not empty and no package.json was found.`,why:`To scaffold a new project, run arkenv init in an empty directory or use --force to proceed anyway.`,retryWith:[`--force`],nextActions:[{kind:`run-command`,label:`Re-run with --force to scaffold into non-empty directory`,command:`{bin} init --force`}]},`init`),null):await this.collectNewProject(n,o)}finally{this.logger.interactiveStdout(!1)}}async collectExistingProject(e,t){let{isYes:r,isForce:i,isQuiet:a,isAgent:o}=e,c=await this.scanner.checkRequirements(t),l=c.filter(e=>e.status===`fail`),u=c.filter(e=>e.status===`warn`);for(let e of u)this.logger.warn(`${e.requirement}: ${e.message}`);if(l.length>0)if(i){this.logger.warn(`Technical requirements not met, but continuing due to --force flag.`);for(let e of l)this.logger.warn(`${e.requirement}: ${e.message}`)}else{this.logger.error(`Technical requirements not met:`);for(let e of l)this.logger.error(`- ${e.requirement}: ${e.message}${e.current?` (Current: ${e.current}, Expected: ${e.expected})`:``}`);return this.logger.info(`Use --force to bypass these checks.`),this.logger.refuse({code:v.REQUIREMENTS_NOT_MET,message:`Technical requirements not met.`,why:`Technical requirements (e.g. Node.js version) were not met.`,retryWith:[`--force`],nextActions:[{kind:`run-command`,label:`Re-run with --force to bypass technical requirements`,command:`{bin} init --force`}],details:{requirements:l.map(e=>(0,n.shake)({requirement:e.requirement,message:e.message,current:e.current,expected:e.expected}))}},`init`),null}let d=await this.scanner.checkGitStatus(t);if(d.status===`dirty`)if(i)this.logger.warn(`Git working tree is not clean, but continuing due to --force flag.`);else return this.logger.error(`Git working tree is not clean. Commit or stash your changes (use 'git stash -u' for untracked files) before running arkenv init.`),this.logger.info(`Use --force to bypass this check.`),this.logger.refuse({code:v.GIT_TREE_DIRTY,message:`Git working tree is not clean.`,why:`Commit or stash your changes before running arkenv init.`,retryWith:[`--force`],nextActions:[{kind:`run-command`,label:`Re-run with --force to bypass git working tree check`,command:`{bin} init --force`}]},`init`),null;d.status===`unknown`&&this.logger.warn(`Git working tree status could not be determined. Proceeding with caution.`);let f=!1,p=await this.scanner.checkTsConfig(t);if(p.status===`not_strict`)if(r)f=!0;else{this.logger.warn(`TypeScript strict mode is not enabled in your ${K(p.file)}.`);let e=await this.prompt.confirm(`ArkEnv requires ${K(`strict`)} mode in your ${K(p.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;f=!0}let m=await this.scanner.detectFramework(t,p.parsed),h=m===`bun-fullstack`?await this.scanner.detectBunFeatures(t,p.parsed):void 0,g=await this.scanner.suggestDefaultEnvPath(t,p.parsed),_=s.default.resolve(t,g),y=await this.scanner.getEnvExampleKeys(t,p.parsed,_),b=await this.workspace.exists(_),x=await this.prompt.runWizard((0,n.shake)({mode:`existing`,framework:m,bunFeatures:h,defaultEnvPath:g,tsConfig:p.parsed??null,envKeys:y?.keys,envKeysSource:y?.source,hasEnvSchemaFile:b,disableCodegen:e.noCodegen,hostPreset:e.hostPreset}),r);if(x===null)return null;let S=await this.scanner.hasSkill(t);if(S&&(x.skillDetected=!0,!a&&!o&&this.logger.info(`ArkEnv agent skill detected.`)),S)x.installSkill=!1;else if(o)x.installSkill=!1;else if(r)x.installSkill=!0;else{let e=await this.prompt.confirm(`Would you like to install the ArkEnv agent skill?`,!0,`Yes (Recommended)`);if(e===null)return null;x.installSkill=e}let C=s.default.resolve(t,x.path);if(x.overwriteEnvSchemaFile===void 0&&await this.workspace.exists(C)){let e=s.default.basename(C),t=await this.prompt.confirm(`${e} already exist. Overwrite?`,!1);if(t===null)return null;if(!t)return this.logger.cancel(`Operation cancelled.`),null;x.overwriteEnvSchemaFile=t}let w=await this.scanner.detectPackageManager(t,p.parsed),ee=[C],T=[];for(let e of ee)await this.workspace.exists(e)&&T.push(e);let E=s.default.join(t,`.env`),D=s.default.join(t,`.env.example`);await this.workspace.exists(E)&&T.push(E),await this.workspace.exists(D)&&(T.push(D),x.envExampleContent=await this.workspace.readFile(D));let O=s.default.join(t,`.gitignore`);return await this.workspace.exists(O)&&(T.push(O),x.gitignoreContent=await this.workspace.readFile(O)),(0,n.shake)({mode:`existing`,cwd:t,options:x,detectedFramework:m,detectedBunFeatures:h,packageManager:w,tsConfig:p,shouldUpdateTsConfig:f,existingFiles:T,isYes:r})}async collectNewProject(e,t=!0){let{isYes:r,example:i,name:a,isForce:o}=e,s=await this.registry.fetchRegistry(),c=await this.prompt.runWizard((0,n.shake)({mode:`new`,examples:s.examples,example:i,name:a}),r);if(c===null)return null;if(c.name===`.`&&!t&&!o)return this.logger.error(`Cannot scaffold into ${K(`.`)} because the current directory is not empty.`),this.logger.info(`Run ${K(`arkenv init`)} in an empty directory or choose a sub-directory name instead.`),this.logger.refuse({code:v.NON_EMPTY_DIR,message:`Cannot scaffold into the current directory because it is not empty.`,why:`Run arkenv init in an empty directory or choose a sub-directory name instead, or use --force.`,retryWith:[`--force`],nextActions:[{kind:`run-command`,label:`Re-run with --force to scaffold into non-empty directory`,command:`{bin} init --force`}]},`init`),null;let l=this.detectPackageManager();return(0,n.shake)({mode:`new`,cwd:process.cwd(),options:c,detectedFramework:c.framework,packageManager:l,tsConfig:{status:`not_found`},shouldUpdateTsConfig:!1,existingFiles:[],isYes:r})}detectPackageManager(){let e=process.env.npm_config_user_agent||``;return e.includes(`pnpm`)?`pnpm`:e.includes(`yarn`)?`yarn`:e.includes(`bun`)?`bun`:`npm`}};function Br(e,t={}){let n=new Fn(e),r=n.logger,i=new pn(n.isQuiet,r.stdio,r),a=new Mn,o=new Gt(r),s=new wt(t.jitiAliases?{jitiAliases:t.jitiAliases}:{});return{cli:n,logger:r,workspace:i,prompt:a,initUseCase:new zr(r,i,a,o),checkUseCase:new zn(r,i,o,s),helpUseCase:new Un(r),schemaLoader:s}}const Vr=new dt({isQuiet:!1,isJson:!1});let Hr,Ur=!1;async function Wr(){if(process.env.INIT_CWD)try{process.chdir(process.env.INIT_CWD)}catch{}let{cli:e,logger:t,initUseCase:r,helpUseCase:i,checkUseCase:a}=Br(process.argv);Hr=t,Gr(t,e.command),e.validationError&&(t.error(e.validationError),await i.execute(),await t.flush(),process.exit(2)),e.helpRequested&&(await i.execute(),await t.flush(),process.exit(0));let o=e.command?{init:()=>r.execute((0,n.shake)(e.initInput)),check:()=>a.execute(e.checkInput)}[e.command]:void 0;o||(e.command?t.error(`Unknown command: ${e.command}`):t.error(`Missing command.`),await i.execute(),await t.flush(),process.exit(2));try{let e=await o();typeof e==`number`&&(await t.flush(),process.exit(e)),e||(await t.flush(),process.exit(2)),await t.flush(),process.exit(0)}catch(n){try{t.fatal(`An unexpected error occurred`,n,e.command||`cli`)}catch{}await t.flush(),process.exit(1)}}function Gr(e,t){let n=async n=>{Ur&&process.exit(n),Ur=!0,setTimeout(()=>{process.exit(n)},2e3).unref(),e.interactiveStdout&&e.interactiveStdout(!1);try{e.cancel(`Operation cancelled.`,t),await e.flush()}catch(t){e.error&&e.error(`Logger failed during shutdown`,t)}finally{process.exit(n===130?3:n)}};process.on(`SIGINT`,()=>n(130)),process.on(`SIGTERM`,()=>n(143))}Wr(),process.on(`unhandledRejection`,async e=>{let t=Hr??Vr;try{t.fatal(`Unhandled rejection`,e)}catch{}await t.flush(),process.exit(1)}),process.on(`uncaughtException`,async e=>{let t=Hr??Vr;try{t.fatal(`Uncaught exception`,e)}catch{}await t.flush(),process.exit(1)});
|
package/dist/bin.d.cts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
package/dist/bin.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|