@squadbase/vantage 0.3.1 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/add-PPCBMWEN.js +6 -0
- package/dist/add-PPCBMWEN.js.map +1 -0
- package/dist/{build-QP5BL3K7.js → build-756WIEVI.js} +4 -4
- package/dist/{build-QP5BL3K7.js.map → build-756WIEVI.js.map} +1 -1
- package/dist/{check-QPFERQLO.js → check-KZ5PHCA6.js} +3 -3
- package/dist/{check-QPFERQLO.js.map → check-KZ5PHCA6.js.map} +1 -1
- package/dist/{chunk-OFFJ3OL5.js → chunk-HQDEYCDP.js} +29 -8
- package/dist/chunk-HQDEYCDP.js.map +1 -0
- package/dist/{chunk-R2YYVCGS.js → chunk-L3TW4FNA.js} +12 -62
- package/dist/chunk-L3TW4FNA.js.map +1 -0
- package/dist/{chunk-UTEKU3LG.js → chunk-X44ZTKID.js} +3 -3
- package/dist/{chunk-UTEKU3LG.js.map → chunk-X44ZTKID.js.map} +1 -1
- package/dist/cli.js +15 -12
- package/dist/cli.js.map +1 -1
- package/dist/{dev-NX3PMYCT.js → dev-EILX2VTF.js} +22 -7
- package/dist/dev-EILX2VTF.js.map +1 -0
- package/dist/{docs-M5ZUI25V.js → docs-GP2ZHIQF.js} +3 -3
- package/dist/{docs-M5ZUI25V.js.map → docs-GP2ZHIQF.js.map} +1 -1
- package/dist/{doctor-N6JMEWKT.js → doctor-FXZLMGC3.js} +3 -3
- package/dist/{doctor-N6JMEWKT.js.map → doctor-FXZLMGC3.js.map} +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/{preview-CLALOEFE.js → preview-WBQPCTTT.js} +22 -10
- package/dist/preview-WBQPCTTT.js.map +1 -0
- package/dist/{routes-YI25MKPF.js → routes-WCN4KSZY.js} +3 -3
- package/dist/{routes-YI25MKPF.js.map → routes-WCN4KSZY.js.map} +1 -1
- package/dist/{search-5TYAIQ7C.js → search-GLKCJXSI.js} +3 -3
- package/dist/{search-5TYAIQ7C.js.map → search-GLKCJXSI.js.map} +1 -1
- package/dist/{upgrade-3P5MBGE6.js → upgrade-S64IXL42.js} +4 -4
- package/dist/{upgrade-3P5MBGE6.js.map → upgrade-S64IXL42.js.map} +1 -1
- package/dist/vite/index.d.ts +1 -1
- package/dist/vite/index.js +1 -1
- package/docs/en/changelog.md +78 -0
- package/docs/en/cli-reference.md +65 -0
- package/docs/en/getting-started.md +3 -2
- package/docs/ja/changelog.md +72 -0
- package/docs/ja/cli-reference.md +64 -0
- package/docs/ja/getting-started.md +4 -2
- package/package.json +1 -1
- package/skills/vantage-add-feature/SKILL.md +1 -1
- package/skills/vantage-app/SKILL.md +4 -3
- package/templates/AGENTS.md +3 -2
- package/dist/add-DWNDA57L.js +0 -6
- package/dist/add-DWNDA57L.js.map +0 -1
- package/dist/chunk-OFFJ3OL5.js.map +0 -1
- package/dist/chunk-R2YYVCGS.js.map +0 -1
- package/dist/dev-NX3PMYCT.js.map +0 -1
- package/dist/preview-CLALOEFE.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/upgrade.ts"],"names":[],"mappings":";;;;;;;;;;AAWA,eAAsB,OAAA,CAAQ,MAAc,IAAA,EAAmC;AAC7E,EAAA,MAAM,UAAU,gBAAA,EAAiB;AACjC,EAAA,MAAM,KAAA,GAAQ,YAAY,IAAI,CAAA;AAC9B,EAAA,iBAAA,CAAkB,EAAE,IAAA,EAAM,KAAA,EAAO,CAAA;AAIjC,EAAA,MAAM,MAAA,GAAS,eAAe,IAAI,CAAA;AAElC,EAAA,IAAI,IAAA,CAAK,MAAM,IAAA,EAAM;AACnB,IAAA,SAAA,CAAU,EAAE,EAAA,EAAI,IAAA,EAAM,OAAA,EAAS,UAAA,EAAY,EAAC,EAAG,WAAA,EAAa,IAAA,EAAM,YAAA,EAAc,MAAA,KAAW,SAAA,EAAW,CAAA;AACtG,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,GAAA,CAAI,KAAA,CAAM,CAAA,gBAAA,EAAc,OAAO,CAAA,CAAE,CAAA;AACjC,EAAA,GAAA,CAAI,GAAG,iCAAiC,CAAA;AACxC,EAAA,IAAI,MAAA,KAAW,SAAA,EAAW,GAAA,CAAI,EAAA,CAAG,sCAAsC,CAAA;AACvE,EAAA,GAAA,CAAI,KAAK,wDAAwD,CAAA;AACjE,EAAA,OAAO,CAAA;AACT","file":"upgrade-
|
|
1
|
+
{"version":3,"sources":["../src/cli/upgrade.ts"],"names":[],"mappings":";;;;;;;;;;AAWA,eAAsB,OAAA,CAAQ,MAAc,IAAA,EAAmC;AAC7E,EAAA,MAAM,UAAU,gBAAA,EAAiB;AACjC,EAAA,MAAM,KAAA,GAAQ,YAAY,IAAI,CAAA;AAC9B,EAAA,iBAAA,CAAkB,EAAE,IAAA,EAAM,KAAA,EAAO,CAAA;AAIjC,EAAA,MAAM,MAAA,GAAS,eAAe,IAAI,CAAA;AAElC,EAAA,IAAI,IAAA,CAAK,MAAM,IAAA,EAAM;AACnB,IAAA,SAAA,CAAU,EAAE,EAAA,EAAI,IAAA,EAAM,OAAA,EAAS,UAAA,EAAY,EAAC,EAAG,WAAA,EAAa,IAAA,EAAM,YAAA,EAAc,MAAA,KAAW,SAAA,EAAW,CAAA;AACtG,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,GAAA,CAAI,KAAA,CAAM,CAAA,gBAAA,EAAc,OAAO,CAAA,CAAE,CAAA;AACjC,EAAA,GAAA,CAAI,GAAG,iCAAiC,CAAA;AACxC,EAAA,IAAI,MAAA,KAAW,SAAA,EAAW,GAAA,CAAI,EAAA,CAAG,sCAAsC,CAAA;AACvE,EAAA,GAAA,CAAI,KAAK,wDAAwD,CAAA;AACjE,EAAA,OAAO,CAAA;AACT","file":"upgrade-S64IXL42.js","sourcesContent":["import { generateArtifacts } from \"../core/generate\"\nimport { scanProject } from \"../core/scan\"\nimport { syncAgentsFile } from \"./add\"\nimport { frameworkVersion, log, printJson, type ParsedArgs } from \"./util\"\n\n/**\n * `vantage upgrade` — reconcile generated artifacts with the installed\n * framework version and apply any needed code transforms. v0.1 only\n * regenerates artifacts and re-syncs a managed AGENTS.md; the migration hook\n * exists for future major versions.\n */\nexport async function upgrade(root: string, args: ParsedArgs): Promise<number> {\n const version = frameworkVersion()\n const model = scanProject(root)\n generateArtifacts({ root, model })\n\n // Keep an adopted AGENTS.md (the app-author map) in step with the framework's\n // canonical copy. No-op when the app never ran `vantage add agents`.\n const agents = syncAgentsFile(root)\n\n if (args.flags.json) {\n printJson({ ok: true, version, transforms: [], regenerated: true, agentsSynced: agents === \"updated\" })\n return 0\n }\n\n log.brand(`upgrade → v${version}`)\n log.ok(\"Regenerated .vantage artifacts.\")\n if (agents === \"updated\") log.ok(\"Synced AGENTS.md from the framework.\")\n log.info(\"No breaking code transforms required for this version.\")\n return 0\n}\n"]}
|
package/dist/vite/index.d.ts
CHANGED
|
@@ -21,7 +21,7 @@ interface VantagePluginOptions {
|
|
|
21
21
|
/**
|
|
22
22
|
* The single plugin that turns a plain Vite instance into Vantage: file-based
|
|
23
23
|
* routing, generated entry/HTML, Tailwind, the server-import boundary, route
|
|
24
|
-
* HMR and dev console forwarding.
|
|
24
|
+
* HMR and the dev-server defaults (including console forwarding).
|
|
25
25
|
*/
|
|
26
26
|
declare function vantagePlugin(options: VantagePluginOptions): PluginOption;
|
|
27
27
|
|
package/dist/vite/index.js
CHANGED
package/docs/en/changelog.md
CHANGED
|
@@ -9,6 +9,84 @@ What changed in each Vantage release. Newest is on top.
|
|
|
9
9
|
> minor release may include backwards-incompatible changes. A patch is limited to
|
|
10
10
|
> backwards-compatible additions and bug fixes.
|
|
11
11
|
|
|
12
|
+
## v0.5.0
|
|
13
|
+
|
|
14
|
+
Browser-to-terminal forwarding now runs on Vite's native mechanism. Which levels
|
|
15
|
+
are forwarded and how they are printed both change, so the minor goes up, per the
|
|
16
|
+
0.x policy.
|
|
17
|
+
|
|
18
|
+
Apps pinned to `"@squadbase/vantage": "^0.4.0"` will not pick up 0.5.0 — bump the
|
|
19
|
+
range to `^0.5.0`.
|
|
20
|
+
|
|
21
|
+
> [!WARNING]
|
|
22
|
+
> **`console.log` / `console.info` are no longer forwarded to the dev terminal.**
|
|
23
|
+
> Only `console.warn` / `console.error` and uncaught errors / promise rejections
|
|
24
|
+
> are. Use `console.warn` for anything you want to see in the terminal. **The
|
|
25
|
+
> output format changes too** — `[console.warn] …` / `[Unhandled error] …` instead
|
|
26
|
+
> of `[browser:log] …`, so update anything that scrapes the dev server log
|
|
27
|
+
> (monitors, scripts).
|
|
28
|
+
|
|
29
|
+
### Changed
|
|
30
|
+
|
|
31
|
+
- **Browser-to-terminal forwarding is now Vite's `server.forwardConsole`**
|
|
32
|
+
(→ [CLI reference](cli-reference)) — replacing the hand-rolled bridge means
|
|
33
|
+
uncaught errors arrive **source-mapped, with a code frame** around the
|
|
34
|
+
offending line.
|
|
35
|
+
|
|
36
|
+
```text
|
|
37
|
+
1:46:34 PM [vite] (client) [Unhandled error] TypeError: rows.map is not a function
|
|
38
|
+
> src/sales/index.tsx:12:18
|
|
39
|
+
12 | return <ul>{rows.map((r) => <li key={r.id}>{r.name}</li>)}</ul>
|
|
40
|
+
| ^
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
- **Only `warn` / `error` are forwarded** — a single `console.log` that runs on
|
|
44
|
+
every render would bury the server's own output. There is no option to widen it.
|
|
45
|
+
|
|
46
|
+
### Added
|
|
47
|
+
|
|
48
|
+
- **`vantage dev --no-overlay`** — hides the full-screen overlay the browser shows
|
|
49
|
+
on a runtime error. Use it when the overlay is in the way rather than helpful:
|
|
50
|
+
screenshots and demos, or when the error already reached the terminal and you
|
|
51
|
+
want to look at the page underneath. On by default; `--overlay` states it
|
|
52
|
+
explicitly.
|
|
53
|
+
|
|
54
|
+
## v0.4.0
|
|
55
|
+
|
|
56
|
+
An explicit `--port` is now exact. This includes a backwards-incompatible
|
|
57
|
+
change, so the minor goes up, per the 0.x policy.
|
|
58
|
+
|
|
59
|
+
Apps pinned to `"@squadbase/vantage": "^0.3.0"` will not pick up 0.4.0 — bump the
|
|
60
|
+
range to `^0.4.0`.
|
|
61
|
+
|
|
62
|
+
> [!WARNING]
|
|
63
|
+
> **`vantage dev --port 3000` now exits 1 instead of starting when 3000 is taken.**
|
|
64
|
+
> It used to walk quietly to 3001. Pass `--no-strict-port` if you need the old
|
|
65
|
+
> behaviour. Leaving `--port` **off** is unchanged: a busy default (5173 / 4173)
|
|
66
|
+
> still walks to the next free port.
|
|
67
|
+
|
|
68
|
+
### Changed
|
|
69
|
+
|
|
70
|
+
- **An explicit `--port` is exact** (→ [CLI reference](cli-reference)) —
|
|
71
|
+
writing `--port 3000` means the port is a contract with something outside the
|
|
72
|
+
process: a reverse proxy, a container port mapping, an OAuth redirect URI.
|
|
73
|
+
Binding 3001 instead is a silent failure, not a recovery — a supervisor that
|
|
74
|
+
only checks "is anything listening on 3000" will happily report a server nobody
|
|
75
|
+
can reach. Without `--port`, a busy default still walks, so running several
|
|
76
|
+
projects side by side is as easy as before.
|
|
77
|
+
- **An invalid `--port` value is an error** — a non-integer, an out-of-range
|
|
78
|
+
number, or a missing value used to start the server on the default port.
|
|
79
|
+
|
|
80
|
+
### Added
|
|
81
|
+
|
|
82
|
+
- **`--strict-port`** — fail instead of walking, even when the port came from the
|
|
83
|
+
default.
|
|
84
|
+
- **`--no-strict-port`** — walk to the next free port, even when `--port` was
|
|
85
|
+
explicit. Use it where 0.3.x behaviour is required.
|
|
86
|
+
|
|
87
|
+
A fullstack `vantage preview` binds its Node server to exactly one port, so it
|
|
88
|
+
was already always strict; `--no-strict-port` has no effect there (and says so).
|
|
89
|
+
|
|
12
90
|
## v0.3.1
|
|
13
91
|
|
|
14
92
|
CLI startup, dev server boot and builds got faster. Nothing here is meant to
|
package/docs/en/cli-reference.md
CHANGED
|
@@ -324,6 +324,71 @@ vantage build --api-base-url https://api.example.com
|
|
|
324
324
|
The flag takes precedence over `PUBLIC_API_BASE_URL` from `.env`. Unset means empty (same-origin
|
|
325
325
|
relative paths). See [Build & deploy](build-and-deploy) for details.
|
|
326
326
|
|
|
327
|
+
## `--port` — the dev / preview port
|
|
328
|
+
|
|
329
|
+
`vantage dev` (default `:5173`) and `vantage preview` (default `:4173`) accept `--port`.
|
|
330
|
+
|
|
331
|
+
```bash
|
|
332
|
+
vantage dev --port 3000
|
|
333
|
+
vantage preview --port 8080
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
**An explicit `--port` is exact: if the port is taken, the server does not start and the command
|
|
337
|
+
exits 1.** Writing `--port 3000` means the port is a contract with something outside the process — a
|
|
338
|
+
reverse proxy, a container port mapping, an OAuth redirect URI — so quietly binding 3001 instead is a
|
|
339
|
+
silent failure, not a recovery (a supervisor that only checks "is anything listening on 3000" will
|
|
340
|
+
happily report a server nobody can reach).
|
|
341
|
+
|
|
342
|
+
**Without `--port`**, a busy default port still walks to the next free one, so running several
|
|
343
|
+
projects side by side takes no ceremony. Two flags override that default:
|
|
344
|
+
|
|
345
|
+
| Flag | Meaning |
|
|
346
|
+
|---|---|
|
|
347
|
+
| `--strict-port` | Fail instead of walking, even when the port came from the default |
|
|
348
|
+
| `--no-strict-port` | Walk to the next free port, even when `--port` was explicit |
|
|
349
|
+
|
|
350
|
+
```bash
|
|
351
|
+
vantage dev --port 3000 --no-strict-port # 3000 busy → starts on 3001
|
|
352
|
+
vantage dev --strict-port # will not start unless 5173 is free
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
> [!NOTE]
|
|
356
|
+
> A `--port` value that is not an integer, or out of range, is an error — it never falls back to the
|
|
357
|
+
> default silently. A fullstack `preview` binds its Node server to exactly one port, so it is **always**
|
|
358
|
+
> strict and `--no-strict-port` has no effect there.
|
|
359
|
+
|
|
360
|
+
## Browser output in dev — forwarding and the overlay
|
|
361
|
+
|
|
362
|
+
`vantage dev` **forwards what happens in the browser to the dev terminal**. By default that means
|
|
363
|
+
`console.warn` / `console.error` plus uncaught errors and promise rejections.
|
|
364
|
+
|
|
365
|
+
```text
|
|
366
|
+
1:46:34 PM [vite] (client) [console.warn] rows is empty
|
|
367
|
+
1:46:34 PM [vite] (client) [Unhandled error] TypeError: rows.map is not a function
|
|
368
|
+
> src/sales/index.tsx:12:18
|
|
369
|
+
11 | const rows = data?.rows
|
|
370
|
+
12 | return <ul>{rows.map((r) => <li key={r.id}>{r.name}</li>)}</ul>
|
|
371
|
+
| ^
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
Uncaught errors are source-mapped and printed with a code frame around the offending line, so most
|
|
375
|
+
issues can be chased **without opening DevTools**. Nothing to configure, and no option to turn it
|
|
376
|
+
off.
|
|
377
|
+
|
|
378
|
+
`console.log` / `console.info` are not forwarded: a log that runs on every render would bury the
|
|
379
|
+
server's own output. Use `console.warn` for anything you want to see in the terminal.
|
|
380
|
+
|
|
381
|
+
The **full-screen error overlay** the browser shows on a runtime error can be hidden with
|
|
382
|
+
`--no-overlay`.
|
|
383
|
+
|
|
384
|
+
```bash
|
|
385
|
+
vantage dev --no-overlay
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
Use it when the overlay is in the way rather than helpful — screenshots and demos, or when the
|
|
389
|
+
error already reached the terminal and you want to look at the page underneath. On by default
|
|
390
|
+
(`--overlay` states it explicitly).
|
|
391
|
+
|
|
327
392
|
## `VANTAGE_PROFILE` — measure before you tune
|
|
328
393
|
|
|
329
394
|
Set `VANTAGE_PROFILE=1` on any command to see how long each phase took.
|
|
@@ -60,8 +60,9 @@ in place.
|
|
|
60
60
|
| `vantage routes` | Print the page + API URL map |
|
|
61
61
|
|
|
62
62
|
> [!TIP]
|
|
63
|
-
> While `vantage dev` runs, the browser's `console
|
|
64
|
-
> terminal as `[
|
|
63
|
+
> While `vantage dev` runs, the browser's `console.warn` / `console.error` are forwarded to the dev
|
|
64
|
+
> terminal as `[console.warn] …`, and uncaught errors as `[Unhandled error] …` with the offending
|
|
65
|
+
> source line. Most issues can be diagnosed without opening the browser.
|
|
65
66
|
|
|
66
67
|
## Quick mode (pass a path directly)
|
|
67
68
|
|
package/docs/ja/changelog.md
CHANGED
|
@@ -8,6 +8,78 @@ Vantage のリリースごとの変更点です。新しいものが上に来ま
|
|
|
8
8
|
> まだプロトタイプ(**0.x**)です。0.x の間は **minor が実質のメジャー**扱いで、後方互換性の
|
|
9
9
|
> ない変更は minor で入ることがあります。patch は後方互換の機能追加とバグ修正のみです。
|
|
10
10
|
|
|
11
|
+
## v0.5.0
|
|
12
|
+
|
|
13
|
+
ブラウザから開発ターミナルへの転送を Vite ネイティブの仕組みに置き換えました。転送される
|
|
14
|
+
レベルと出力形式が変わる後方互換でない変更を含むため、0.x の方針に従って minor を上げています。
|
|
15
|
+
|
|
16
|
+
依存を `"@squadbase/vantage": "^0.4.0"` と書いているアプリには 0.5.0 は入りません。
|
|
17
|
+
`^0.5.0` に上げてください。
|
|
18
|
+
|
|
19
|
+
> [!WARNING]
|
|
20
|
+
> **`console.log` / `console.info` は開発ターミナルへ転送されなくなりました。** 転送するのは
|
|
21
|
+
> `console.warn` / `console.error` と未捕捉のエラー / Promise リジェクションだけです。
|
|
22
|
+
> ターミナルで見たいログは `console.warn` で出してください。**出力の形式も変わります** ―
|
|
23
|
+
> `[browser:log] …` ではなく `[console.warn] …` / `[Unhandled error] …` になるので、開発サーバーの
|
|
24
|
+
> ログを文字列で拾っている仕組み(監視・スクリプト)があれば合わせてください。
|
|
25
|
+
|
|
26
|
+
### 変更
|
|
27
|
+
|
|
28
|
+
- **ブラウザ → ターミナルの転送が Vite の `server.forwardConsole` になりました**
|
|
29
|
+
(→ [CLI リファレンス](cli-reference))― 自前のブリッジを置き換えたことで、未捕捉のエラーが
|
|
30
|
+
**ソースマップを解決した位置とコードフレーム付き**で出るようになります。
|
|
31
|
+
|
|
32
|
+
```text
|
|
33
|
+
1:46:34 PM [vite] (client) [Unhandled error] TypeError: rows.map is not a function
|
|
34
|
+
> src/sales/index.tsx:12:18
|
|
35
|
+
12 | return <ul>{rows.map((r) => <li key={r.id}>{r.name}</li>)}</ul>
|
|
36
|
+
| ^
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
- **転送するのは `warn` / `error` だけになりました** ― 描画のたびに走る 1 本の `console.log` で
|
|
40
|
+
サーバー自身の出力が埋もれてしまうためです。設定で戻すことはできません。
|
|
41
|
+
|
|
42
|
+
### 追加
|
|
43
|
+
|
|
44
|
+
- **`vantage dev --no-overlay`** ― エラー時にブラウザへ出る全画面のオーバーレイを消します。
|
|
45
|
+
スクリーンショットやデモでオーバーレイが邪魔なとき、あるいはエラーの内容がすでにターミナルへ
|
|
46
|
+
転送されていて画面側は素の状態を見たいときに使います。既定はオンのままで、`--overlay` で
|
|
47
|
+
明示することもできます。
|
|
48
|
+
|
|
49
|
+
## v0.4.0
|
|
50
|
+
|
|
51
|
+
明示した `--port` が厳格になりました。後方互換でない変更を含むため、0.x の方針に従って
|
|
52
|
+
minor を上げています。
|
|
53
|
+
|
|
54
|
+
依存を `"@squadbase/vantage": "^0.3.0"` と書いているアプリには 0.4.0 は入りません。
|
|
55
|
+
`^0.4.0` に上げてください。
|
|
56
|
+
|
|
57
|
+
> [!WARNING]
|
|
58
|
+
> **`vantage dev --port 3000` は、3000 が埋まっていると起動せずエラーで終了します(exit 1)。**
|
|
59
|
+
> これまでは黙って 3001 へずれていました。従来の挙動が必要なら `--no-strict-port` を付けて
|
|
60
|
+
> ください。`--port` を**省いたとき**の挙動は変わりません(既定の 5173 / 4173 が埋まっていれば
|
|
61
|
+
> 次の空きポートへずれます)。
|
|
62
|
+
|
|
63
|
+
### 変更
|
|
64
|
+
|
|
65
|
+
- **明示した `--port` は厳格になりました**(→ [CLI リファレンス](cli-reference))― `--port 3000`
|
|
66
|
+
と書くのは、リバースプロキシ・コンテナのポートマッピング・OAuth のリダイレクト URI など
|
|
67
|
+
**プロセスの外側との約束**があるからで、黙って 3001 で上がるのは復旧ではなく静かな失敗です
|
|
68
|
+
(「3000 で誰かが listen しているか」だけを見る監視は、誰も到達できないサーバーを「起動成功」と
|
|
69
|
+
報告してしまいます)。`--port` を省いたときは従来どおり次の空きポートへずれるので、複数の
|
|
70
|
+
プロジェクトを並べて立ち上げる手軽さは変わりません。
|
|
71
|
+
- **`--port` の値が不正なときはエラーになりました** ― 整数でない・範囲外・値が無い場合、
|
|
72
|
+
これまでは黙って既定値で起動していました。
|
|
73
|
+
|
|
74
|
+
### 追加
|
|
75
|
+
|
|
76
|
+
- **`--strict-port`** ― `--port` を省いたときも、既定ポートが取れなければ起動しません。
|
|
77
|
+
- **`--no-strict-port`** ― `--port` を明示したときも、埋まっていれば次の空きポートへずらします。
|
|
78
|
+
0.3.x までの挙動が必要なときに使ってください。
|
|
79
|
+
|
|
80
|
+
fullstack の `vantage preview` は Node サーバーを 1 ポートに bind するだけなので以前から常に
|
|
81
|
+
厳格で、`--no-strict-port` は効きません(その旨を表示します)。
|
|
82
|
+
|
|
11
83
|
## v0.3.1
|
|
12
84
|
|
|
13
85
|
CLI の起動と、開発サーバー・ビルドの立ち上がりを速くしました。挙動を変える意図の変更は
|
package/docs/ja/cli-reference.md
CHANGED
|
@@ -318,6 +318,70 @@ vantage build --api-base-url https://api.example.com
|
|
|
318
318
|
このフラグは `.env` の `PUBLIC_API_BASE_URL` より優先されます。未指定なら空(同一オリジンの
|
|
319
319
|
相対パス)。詳細は[ビルドとデプロイ](build-and-deploy)を参照してください。
|
|
320
320
|
|
|
321
|
+
## `--port` — dev / preview のポート
|
|
322
|
+
|
|
323
|
+
`vantage dev`(既定 `:5173`)と `vantage preview`(既定 `:4173`)は `--port` を受け付けます。
|
|
324
|
+
|
|
325
|
+
```bash
|
|
326
|
+
vantage dev --port 3000
|
|
327
|
+
vantage preview --port 8080
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
**`--port` を明示したときは、そのポートが取れなければ起動せずエラーで終了します**(exit 1)。
|
|
331
|
+
`--port 3000` と書くのは、リバースプロキシ・コンテナのポートマッピング・OAuth のリダイレクト URI
|
|
332
|
+
など**プロセスの外側との約束**があるからで、黙って 3001 で上がるのは復旧ではなく静かな失敗だからです
|
|
333
|
+
(「3000 で誰かが listen しているか」だけを見る監視は、誰も到達できないサーバーを "起動成功" と
|
|
334
|
+
報告してしまいます)。
|
|
335
|
+
|
|
336
|
+
`--port` を**省いたとき**は既定ポートが埋まっていれば**次の空きポートへ自動でずれます**。複数の
|
|
337
|
+
プロジェクトを同時に立ち上げるのに手間はかかりません。この既定は 2 つのフラグで上書きできます。
|
|
338
|
+
|
|
339
|
+
| フラグ | 意味 |
|
|
340
|
+
|---|---|
|
|
341
|
+
| `--strict-port` | `--port` を省いたときも、既定ポートが取れなければエラーで終了する |
|
|
342
|
+
| `--no-strict-port` | `--port` を明示したときも、埋まっていれば次の空きポートへずらす |
|
|
343
|
+
|
|
344
|
+
```bash
|
|
345
|
+
vantage dev --port 3000 --no-strict-port # 3000 が埋まっていれば 3001 で上がる
|
|
346
|
+
vantage dev --strict-port # 5173 が取れなければ起動しない
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
> [!NOTE]
|
|
350
|
+
> `--port` の値が整数でない・範囲外のときはエラーです(既定値へ黙って戻ることはありません)。
|
|
351
|
+
> また fullstack の `preview` は Node サーバーを 1 ポートに bind するだけなので**常に厳格**で、
|
|
352
|
+
> `--no-strict-port` は効きません。
|
|
353
|
+
|
|
354
|
+
## dev のブラウザ出力 — 転送とオーバーレイ
|
|
355
|
+
|
|
356
|
+
`vantage dev` は、ブラウザ側で起きたことを**開発ターミナルへ転送します**。既定で転送するのは
|
|
357
|
+
`console.warn` / `console.error` と、未捕捉のエラー / Promise リジェクションです。
|
|
358
|
+
|
|
359
|
+
```text
|
|
360
|
+
1:46:34 PM [vite] (client) [console.warn] rows is empty
|
|
361
|
+
1:46:34 PM [vite] (client) [Unhandled error] TypeError: rows.map is not a function
|
|
362
|
+
> src/sales/index.tsx:12:18
|
|
363
|
+
11 | const rows = data?.rows
|
|
364
|
+
12 | return <ul>{rows.map((r) => <li key={r.id}>{r.name}</li>)}</ul>
|
|
365
|
+
| ^
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
未捕捉のエラーはソースマップを解決したうえで、該当行のコードフレーム付きで出ます。**ブラウザの
|
|
369
|
+
DevTools を開かなくても**、多くの不具合はターミナルだけで追えます(設定は不要で、無効化する
|
|
370
|
+
オプションもありません)。
|
|
371
|
+
|
|
372
|
+
`console.log` / `console.info` は転送しません。描画のたびに走るログでサーバー自身の出力が
|
|
373
|
+
埋もれてしまうためです。ターミナルに出したい情報は `console.warn` で出してください。
|
|
374
|
+
|
|
375
|
+
エラーが起きたときにブラウザへ出る**全画面のオーバーレイ**は `--no-overlay` で消せます。
|
|
376
|
+
|
|
377
|
+
```bash
|
|
378
|
+
vantage dev --no-overlay
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
スクリーンショットやデモのように**オーバーレイが画面の邪魔になる**とき、あるいはエラーの
|
|
382
|
+
内容がすでにターミナルへ転送されていて画面側は素の状態を見たいときに使います。既定はオン
|
|
383
|
+
(`--overlay` で明示することもできます)。
|
|
384
|
+
|
|
321
385
|
## `VANTAGE_PROFILE` — 遅いときに測る
|
|
322
386
|
|
|
323
387
|
どのコマンドでも `VANTAGE_PROFILE=1` を付けると、フェーズごとの所要時間が出ます。
|
|
@@ -60,8 +60,10 @@ React Fast Refresh がその場で反映します。
|
|
|
60
60
|
| `vantage routes` | ページ + API の URL マップを表示 |
|
|
61
61
|
|
|
62
62
|
> [!TIP]
|
|
63
|
-
> `vantage dev` の実行中は、ブラウザの `console
|
|
64
|
-
> `[
|
|
63
|
+
> `vantage dev` の実行中は、ブラウザの `console.warn` / `console.error` が
|
|
64
|
+
> `[console.warn] …` として、未捕捉のエラーはソースコードの該当箇所付きで
|
|
65
|
+
> `[Unhandled error] …` として開発ターミナルへ転送されます。多くの不具合はブラウザを
|
|
66
|
+
> 開かずに診断できます。
|
|
65
67
|
|
|
66
68
|
## クイックモード(パスを直接渡す)
|
|
67
69
|
|
package/package.json
CHANGED
|
@@ -139,7 +139,7 @@ vantage add block sales-overview # → components/blocks/sales-overview.tsx
|
|
|
139
139
|
```bash
|
|
140
140
|
vantage routes # 追加したページ/API が意図した URL に出ているか
|
|
141
141
|
vantage check # 規約違反が無いか(exit 1 ならエラーあり)
|
|
142
|
-
vantage dev # 実際に動くか(
|
|
142
|
+
vantage dev # 実際に動くか(warn/error と未捕捉エラーは開発ターミナルへ転送される)
|
|
143
143
|
```
|
|
144
144
|
|
|
145
145
|
`vantage routes` は `--pages` / `--apis` で片側だけに絞れる。`--detail` を足すと各ルートの静的な
|
|
@@ -44,7 +44,7 @@ exit 1 になる。
|
|
|
44
44
|
"routes": "vantage routes"
|
|
45
45
|
},
|
|
46
46
|
"dependencies": {
|
|
47
|
-
"@squadbase/vantage": "^0.
|
|
47
|
+
"@squadbase/vantage": "^0.5.0",
|
|
48
48
|
"react": "^19.2.7",
|
|
49
49
|
"react-dom": "^19.2.7"
|
|
50
50
|
}
|
|
@@ -116,8 +116,9 @@ pnpm preview # 本番ビルドをローカルで動かす
|
|
|
116
116
|
|
|
117
117
|
## 詰まったら
|
|
118
118
|
|
|
119
|
-
- ブラウザの `console
|
|
120
|
-
|
|
119
|
+
- ブラウザの `console.warn` / `console.error` とランタイムエラーは、**開発ターミナルへ転送
|
|
120
|
+
される**(`[console.warn] …` / `[Unhandled error] …` + コードフレーム)。devtools を開かずに
|
|
121
|
+
読める。`console.log` は転送されないので、**ターミナルで見たいログは `console.warn`** で出す。
|
|
121
122
|
- `vantage check --json` / `vantage routes --json` は機械可読出力。
|
|
122
123
|
- props や規約を確かめたいときは `vantage docs <name>`、名前が思い出せないときは
|
|
123
124
|
`vantage search <やりたいこと>`。**推測で props を書かない。**
|
package/templates/AGENTS.md
CHANGED
|
@@ -122,7 +122,7 @@ root/
|
|
|
122
122
|
"routes": "vantage routes"
|
|
123
123
|
},
|
|
124
124
|
"dependencies": {
|
|
125
|
-
"@squadbase/vantage": "^0.
|
|
125
|
+
"@squadbase/vantage": "^0.5.0",
|
|
126
126
|
"react": "^19.2.7",
|
|
127
127
|
"react-dom": "^19.2.7"
|
|
128
128
|
}
|
|
@@ -356,7 +356,8 @@ pnpm preview # 本番ビルドをローカル実行
|
|
|
356
356
|
(手で書かない)。`vantage routes` は `--pages` / `--apis` で片側だけに絞れ、`--detail` を足すと
|
|
357
357
|
各ルートの静的な仕様(ページ: パスパラメータ + `definePage` のメタ / API: メソッド・query・
|
|
358
358
|
body・レスポンスの status と形)まで出る。`vantage check --json` / `vantage routes --json` は
|
|
359
|
-
|
|
359
|
+
エージェント向けの機械可読出力。dev では `console.warn` / `console.error` とランタイムエラーが開発ターミナルへ
|
|
360
|
+
転送される(`console.log` は転送されない)。エラーの全画面オーバーレイは `vantage dev --no-overlay` で消せる。
|
|
360
361
|
|
|
361
362
|
## さらに詳しく(同梱 Skill)
|
|
362
363
|
|
package/dist/add-DWNDA57L.js
DELETED
package/dist/add-DWNDA57L.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"add-DWNDA57L.js"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/util.ts"],"names":[],"mappings":";;;;;;AAaA,IAAM,aAAA,uBAAoB,GAAA,CAAI;AAAA,EAC5B,MAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAA;AAAA,EACA;AACF,CAAC,CAAA;AAGM,SAAS,UAAU,IAAA,EAA4B;AACpD,EAAA,MAAM,cAAwB,EAAC;AAC/B,EAAA,MAAM,QAA0C,EAAC;AACjD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,IAAI,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA,EAAG;AACxB,MAAA,MAAM,EAAA,GAAK,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AAC1B,MAAA,IAAI,OAAO,EAAA,EAAI;AACb,QAAA,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA,EAAG,EAAE,CAAC,CAAA,GAAI,GAAA,CAAI,KAAA,CAAM,EAAA,GAAK,CAAC,CAAA;AAC1C,QAAA;AAAA,MACF;AACA,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA;AACvB,MAAA,IAAI,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA,EAAG;AAC1B,QAAA,KAAA,CAAM,GAAG,CAAA,GAAI,IAAA;AACb,QAAA;AAAA,MACF;AACA,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA;AACvB,MAAA,IAAI,SAAS,MAAA,IAAa,CAAC,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AAC/C,QAAA,KAAA,CAAM,GAAG,CAAA,GAAI,IAAA;AACb,QAAA,CAAA,EAAA;AAAA,MACF,CAAA,MAAO;AACL,QAAA,KAAA,CAAM,GAAG,CAAA,GAAI,IAAA;AAAA,MACf;AAAA,IACF,CAAA,MAAA,IAAW,GAAA,CAAI,MAAA,GAAS,CAAA,IAAK,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA,IAAK,CAAC,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,EAAG;AAErE,MAAA,KAAA,MAAW,MAAM,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,EAAG,KAAA,CAAM,EAAE,CAAA,GAAI,IAAA;AAAA,IAC7C,CAAA,MAAO;AACL,MAAA,WAAA,CAAY,KAAK,GAAG,CAAA;AAAA,IACtB;AAAA,EACF;AACA,EAAA,OAAO,EAAE,aAAa,KAAA,EAAM;AAC9B;AAQO,SAAS,oBAAoB,IAAA,EAAwB;AAC1D,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,cAAc,CAAA;AACvC,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,MAAA,EAAQ;AAC7C,IAAA,OAAA,CAAQ,IAAI,mBAAA,GAAsB,KAAA;AAAA,EACpC;AACF;AAGO,SAAS,SAAA,CAAU,OAAqC,QAAA,EAA0B;AACvF,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,CAAA,GAAI,OAAO,KAAK,CAAA;AACtB,IAAA,IAAI,MAAA,CAAO,UAAU,CAAC,CAAA,IAAK,IAAI,CAAA,IAAK,CAAA,GAAI,OAAO,OAAO,CAAA;AAAA,EACxD;AACA,EAAA,OAAO,QAAA;AACT;AAGO,SAAS,YAAY,KAAA,EAAiD;AAC3E,EAAA,MAAM,GAAA,GAAM,OAAO,KAAA,CAAM,IAAA,KAAS,WAAW,KAAA,CAAM,IAAA,GAAO,QAAQ,GAAA,EAAI;AACtE,EAAA,OAAO,IAAA,CAAK,QAAQ,GAAG,CAAA;AACzB;AAGA,IAAM,oBAAA,GAAuB,CAAA;AAMtB,SAAS,iBAAiB,MAAA,EAA+B;AAC9D,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AAC/B,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,QAAA,CAAS,GAAG,CAAA;AAC5B,IAAA,IAAI,IAAA,CAAK,WAAA,EAAY,EAAG,OAAO,GAAA;AAC/B,IAAA,IAAI,IAAA,CAAK,MAAA,EAAO,IAAK,eAAA,CAAgB,IAAA,CAAK,CAAC,GAAA,KAAQ,GAAA,CAAI,QAAA,CAAS,GAAG,CAAC,CAAA,EAAG;AAIrE,MAAA,IAAI,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC1B,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,oBAAA,EAAsB,CAAA,EAAA,EAAK;AAC9C,QAAA,IAAI,EAAA,CAAG,WAAW,IAAA,CAAK,IAAA,CAAK,KAAK,cAAc,CAAC,GAAG,OAAO,GAAA;AAC1D,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC/B,QAAA,IAAI,WAAW,GAAA,EAAK;AACpB,QAAA,GAAA,GAAM,MAAA;AAAA,MACR;AACA,MAAA,OAAO,IAAA,CAAK,QAAQ,GAAG,CAAA;AAAA,IACzB;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,IAAA;AACT;AAEO,IAAM,GAAA,GAAM;AAAA,EACjB,IAAA,EAAM,CAAC,GAAA,KAAgB,OAAA,CAAQ,IAAI,GAAG,CAAA;AAAA,EACtC,IAAA,EAAM,CAAC,GAAA,KAAgB,OAAA,CAAQ,IAAI,EAAA,CAAG,IAAA,CAAK,SAAI,CAAA,GAAI,GAAG,CAAA;AAAA,EACtD,EAAA,EAAI,CAAC,GAAA,KAAgB,OAAA,CAAQ,IAAI,EAAA,CAAG,KAAA,CAAM,SAAI,CAAA,GAAI,GAAG,CAAA;AAAA,EACrD,IAAA,EAAM,CAAC,GAAA,KAAgB,OAAA,CAAQ,IAAI,EAAA,CAAG,MAAA,CAAO,IAAI,CAAA,GAAI,GAAG,CAAA;AAAA,EACxD,KAAA,EAAO,CAAC,GAAA,KAAgB,OAAA,CAAQ,MAAM,EAAA,CAAG,GAAA,CAAI,SAAI,CAAA,GAAI,GAAG,CAAA;AAAA,EACxD,KAAA,EAAO,CAAC,GAAA,KAAgB,OAAA,CAAQ,GAAA,CAAI,EAAA,CAAG,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ,UAAU,CAAC,CAAA,GAAI,GAAG;AAC3E;AAGO,SAAS,iBAAiB,KAAA,EAA2B;AAC1D,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,MAAM,QACJ,CAAA,CAAE,QAAA,KAAa,OAAA,GAAU,EAAA,CAAG,IAAI,EAAA,CAAG,IAAA,CAAK,SAAS,CAAC,IAAI,EAAA,CAAG,MAAA,CAAO,EAAA,CAAG,IAAA,CAAK,QAAQ,CAAC,CAAA;AACnF,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,EAAA,CAAG,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AACrD,IAAA,IAAI,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAA,CAAQ,GAAA,CAAI,WAAW,EAAA,CAAG,GAAA,CAAI,QAAQ,CAAC,IAAI,CAAA,CAAE,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AACpF,IAAA,IAAI,CAAA,CAAE,GAAA,EAAK,OAAA,CAAQ,GAAA,CAAI,CAAA,QAAA,EAAW,EAAA,CAAG,GAAA,CAAI,MAAM,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,GAAG,CAAA,CAAE,CAAA;AAAA,EAC7D;AACF;AAGO,SAAS,UAAU,OAAA,EAAwB;AAChD,EAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,IAAA,CAAK,SAAA,CAAU,SAAS,IAAA,EAAM,CAAC,IAAI,IAAI,CAAA;AAC9D;AAGO,SAAS,gBAAA,GAA2B;AACzC,EAAA,IAAI;AAEF,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,iBAAA,EAAmB,YAAY,GAAG,CAAA;AACtD,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,GAAG,YAAA,CAAa,GAAA,EAAK,MAAM,CAAC,CAAA;AACnD,IAAA,OAAO,GAAA,CAAI,OAAA;AAAA,EACb,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,OAAA;AAAA,EACT;AACF","file":"chunk-OFFJ3OL5.js","sourcesContent":["import fs from \"node:fs\"\nimport path from \"node:path\"\nimport pc from \"picocolors\"\nimport { PAGE_EXTENSIONS } from \"../core/constants\"\nimport type { Diagnostic } from \"../core/types\"\n\n/** Parsed CLI arguments. */\nexport interface ParsedArgs {\n positionals: string[]\n flags: Record<string, string | boolean>\n}\n\n/** Flags that never take a value, so they don't swallow the next token. */\nconst BOOLEAN_FLAGS = new Set([\n \"json\",\n \"help\",\n \"force\",\n \"verbose\",\n \"version\",\n \"all\",\n \"list\",\n \"regex\",\n \"pages\",\n \"apis\",\n \"detail\",\n \"h\",\n \"v\",\n])\n\n/** Minimal argv parser: `--json`, `--port 3000`, `--port=3000`, `-v`, positionals. */\nexport function parseArgs(argv: string[]): ParsedArgs {\n const positionals: string[] = []\n const flags: Record<string, string | boolean> = {}\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i]!\n if (arg.startsWith(\"--\")) {\n const eq = arg.indexOf(\"=\")\n if (eq !== -1) {\n flags[arg.slice(2, eq)] = arg.slice(eq + 1)\n continue\n }\n const key = arg.slice(2)\n if (BOOLEAN_FLAGS.has(key)) {\n flags[key] = true\n continue\n }\n const next = argv[i + 1]\n if (next !== undefined && !next.startsWith(\"-\")) {\n flags[key] = next\n i++\n } else {\n flags[key] = true\n }\n } else if (arg.length > 1 && arg.startsWith(\"-\") && !/^-\\d/.test(arg)) {\n // Single-dash short flags, e.g. `-v`, `-h` (each char is a boolean).\n for (const ch of arg.slice(1)) flags[ch] = true\n } else {\n positionals.push(arg)\n }\n }\n return { positionals, flags }\n}\n\n/**\n * Apply a `--api-base-url <url>` flag by setting `process.env.PUBLIC_API_BASE_URL`\n * so Vite inlines it into the client bundle (via envPrefix). Setting it on\n * process.env gives the flag precedence over any `.env` file value. No-op when\n * the flag is absent, leaving any `.env` value in effect.\n */\nexport function applyApiBaseUrlFlag(args: ParsedArgs): void {\n const value = args.flags[\"api-base-url\"]\n if (typeof value === \"string\" && value.length) {\n process.env.PUBLIC_API_BASE_URL = value\n }\n}\n\n/** Parse a `--port` flag value into a valid port, falling back to a default. */\nexport function parsePort(value: string | boolean | undefined, fallback: number): number {\n if (typeof value === \"string\") {\n const n = Number(value)\n if (Number.isInteger(n) && n > 0 && n < 65536) return n\n }\n return fallback\n}\n\n/** Resolve the project root, honoring `--root`, defaulting to cwd. */\nexport function resolveRoot(flags: Record<string, string | boolean>): string {\n const raw = typeof flags.root === \"string\" ? flags.root : process.cwd()\n return path.resolve(raw)\n}\n\n/** How far up from a page file to look for the package root. */\nconst QUICK_ROOT_MAX_DEPTH = 5\n\n/**\n * Resolve a positional path to a quick-run project root.\n * A directory → itself; a page file (.tsx/.jsx) → its project; else null.\n */\nexport function resolveQuickRoot(target: string): string | null {\n try {\n const abs = path.resolve(target)\n const stat = fs.statSync(abs)\n if (stat.isDirectory()) return abs\n if (stat.isFile() && PAGE_EXTENSIONS.some((ext) => abs.endsWith(ext))) {\n // Walk up to the nearest package.json so `vantage ./demo/src/index.tsx`\n // starts in ./demo — the directory holding the page is not the project\n // root once pages live under src/ (or in any nested route directory).\n let dir = path.dirname(abs)\n for (let i = 0; i <= QUICK_ROOT_MAX_DEPTH; i++) {\n if (fs.existsSync(path.join(dir, \"package.json\"))) return dir\n const parent = path.dirname(dir)\n if (parent === dir) break\n dir = parent\n }\n return path.dirname(abs)\n }\n } catch {\n // statSync throws when the path does not exist → null (not a quick target)\n }\n return null\n}\n\nexport const log = {\n info: (msg: string) => console.log(msg),\n step: (msg: string) => console.log(pc.cyan(\"→ \") + msg),\n ok: (msg: string) => console.log(pc.green(\"✓ \") + msg),\n warn: (msg: string) => console.log(pc.yellow(\"! \") + msg),\n error: (msg: string) => console.error(pc.red(\"✗ \") + msg),\n brand: (msg: string) => console.log(pc.bold(pc.magenta(\"vantage \")) + msg),\n}\n\n/** Print diagnostics as human-readable text. */\nexport function printDiagnostics(diags: Diagnostic[]): void {\n for (const d of diags) {\n const badge =\n d.severity === \"error\" ? pc.red(pc.bold(\" ERROR \")) : pc.yellow(pc.bold(\" WARN \"))\n console.log(`${badge} ${pc.dim(d.code)} ${d.message}`)\n if (d.files?.length) console.log(` ${pc.dim(\"files:\")} ${d.files.join(\", \")}`)\n if (d.fix) console.log(` ${pc.dim(\"fix:\")} ${d.fix}`)\n }\n}\n\n/** Emit a JSON payload to stdout (for agent consumption). */\nexport function printJson(payload: unknown): void {\n process.stdout.write(JSON.stringify(payload, null, 2) + \"\\n\")\n}\n\n/** Read the vantage package version. */\nexport function frameworkVersion(): string {\n try {\n // dist/cli.js (and shared chunks) live in dist/, so package.json is one up.\n const url = new URL(\"../package.json\", import.meta.url)\n const pkg = JSON.parse(fs.readFileSync(url, \"utf8\")) as { version: string }\n return pkg.version\n } catch {\n return \"0.0.0\"\n }\n}\n\nexport function fileExists(p: string): boolean {\n try {\n return fs.existsSync(p)\n } catch {\n return false\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/server/dev.ts","../src/vite/index.ts"],"names":["path"],"mappings":";;;;;;;;;;;;;AAsBO,SAAS,uBAAuB,IAAA,EAIxB;AACb,EAAA,MAAM,EAAE,MAAA,EAAQ,QAAA,EAAU,MAAA,EAAO,GAAI,IAAA;AAErC,EAAA,MAAM,cAAc,MAClB,aAAA;AAAA,IACE,QAAA,EAAS,CAAE,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MAC1B,WAAW,CAAA,CAAE,SAAA;AAAA,MACb,UAAU,CAAA,CAAE,QAAA;AAAA,MACZ,WAAA,EAAa,EAAE,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,UAAU,CAAA;AAAA,MACzD,WAAA,EAAa,EAAE,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,QAAQ,CAAA,CAAE,MAAA;AAAA,MAC3D,IAAA,EAAM,MAAM,MAAA,CAAO,aAAA,CAAc,EAAE,OAAO;AAAA,KAC5C,CAAE;AAAA,GACJ;AAEF,EAAA,MAAM,GAAA,GAAM,IAAI,IAAA,EAAK;AAIrB,EAAA,MAAM,IAAA,GAAO,cAAA,CAAe,MAAA,EAAQ,CAAA;AACpC,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,GAAA,CAAI,GAAA,CAAI,QAAQ,IAAI,CAAA;AACpB,IAAA,GAAA,CAAI,GAAA,CAAI,UAAU,IAAI,CAAA;AAAA,EACxB;AAEA,EAAA,MAAM,MAAA,GAAS,OAAO,CAAA,KAA8C;AAClE,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,CAAA,CAAE,IAAI,GAAG,CAAA;AAC7B,IAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,WAAA,EAAY,EAAG,IAAI,QAAQ,CAAA;AACvD,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,KAAA,EAAO,WAAA,EAAa,IAAA,EAAM,GAAA,CAAI,QAAA,EAAS,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,IAClF;AACA,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI;AACF,MAAA,GAAA,GAAM,MAAM,KAAA,CAAM,KAAA,CAAM,IAAA,EAAK;AAAA,IAC/B,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,GAAA,YAAe,KAAA,EAAO,MAAA,CAAO,gBAAA,CAAiB,GAAG,CAAA;AACrD,MAAA,MAAM,GAAA;AAAA,IACR;AACA,IAAA,OAAO,WAAA,CAAY,KAAK,CAAA,CAAE,GAAA,CAAI,KAAK,KAAA,CAAM,MAAA,EAAQ,QAAQ,CAAA;AAAA,EAC3D,CAAA;AAEA,EAAA,GAAA,CAAI,GAAA,CAAI,QAAQ,MAAa,CAAA;AAE7B,EAAA,GAAA,CAAI,GAAA,CAAI,UAAU,MAAa,CAAA;AAE/B,EAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,GAAA,CAAI,KAAK,CAAA;AAE7C,EAAA,OAAO,CAAC,GAAA,EAAK,GAAA,EAAK,IAAA,KAAS;AACzB,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,IAAO,GAAA;AACvB,IAAA,MAAMA,KAAAA,GAAO,GAAA,CAAI,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAC7B,IAAA,IAAIA,KAAAA,KAAS,MAAA,IAAUA,KAAAA,CAAK,UAAA,CAAW,OAAO,CAAA,EAAG;AAC/C,MAAA,OAAA,CAAQ,OAAA,CAAQ,SAAS,GAAA,EAAK,GAAG,CAAC,CAAA,CAAE,KAAA,CAAM,CAAC,GAAA,KAAQ;AACjD,QAAA,OAAA,CAAQ,KAAA,CAAM,qCAAqC,GAAG,CAAA;AACtD,QAAA,IAAI,CAAC,IAAI,WAAA,EAAa;AACpB,UAAA,GAAA,CAAI,UAAA,GAAa,GAAA;AACjB,UAAA,GAAA,CAAI,SAAA,CAAU,gBAAgB,kBAAkB,CAAA;AAChD,UAAA,GAAA,CAAI,IAAI,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,uBAAA,EAAyB,CAAC,CAAA;AAAA,QAC5D;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,IAAA,EAAK;AAAA,IACP;AAAA,EACF,CAAA;AACF;;;AC1DA,IAAM,MAAA,GAAS,CAAC,OAAA,EAAS,WAAA,EAAa,0BAA0B,uBAAuB,CAAA;AAGvF,IAAM,YAAA,GAAe;AAAA,EACnB,OAAA;AAAA,EACA,WAAA;AAAA,EACA,kBAAA;AAAA,EACA,mBAAA;AAAA,EACA,wBAAA;AAAA,EACA;AACF,CAAA;AASA,IAAM,QAAA,GAAW;AAAA,EACf,uBAAA;AAAA,EACA,0BAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,iBAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EACA,0BAAA;AAAA,EACA,uBAAA;AAAA,EACA,yBAAA;AAAA,EACA,4BAAA;AAAA,EACA,uBAAA;AAAA,EACA,sBAAA;AAAA,EACA,qBAAA;AAAA,EACA,4BAAA;AAAA,EACA,wBAAA;AAAA,EACA,yBAAA;AAAA,EACA,4BAAA;AAAA,EACA,uBAAA;AAAA,EACA,0BAAA;AAAA,EACA,uBAAA;AAAA,EACA,uBAAA;AAAA,EACA,qBAAA;AAAA,EACA,uBAAA;AAAA,EACA,6BAAA;AAAA,EACA,wBAAA;AAAA,EACA;AACF,CAAA;AAGA,SAAS,YAAY,IAAA,EAAsB;AACzC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC5B,EAAA,OAAO,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,GAAI,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,GAAI,MAAM,CAAC,CAAA;AACrE;AAGA,SAAS,UAAA,CAAW,SAAiB,GAAA,EAAsB;AACzD,EAAA,IAAI,GAAA,GAAM,OAAA;AACV,EAAA,WAAS;AACP,IAAA,IAAI,EAAA,CAAG,WAAW,IAAA,CAAK,IAAA,CAAK,KAAK,cAAA,EAAgB,GAAG,CAAC,CAAA,EAAG,OAAO,IAAA;AAC/D,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC/B,IAAA,IAAI,MAAA,KAAW,KAAK,OAAO,KAAA;AAC3B,IAAA,GAAA,GAAM,MAAA;AAAA,EACR;AACF;AAoBA,SAAS,gBAAgB,IAAA,EAAwB;AAC/C,EAAA,OAAO,CAAC,GAAG,YAAA,EAAc,GAAG,QAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,IAAA,KAAS,UAAA,CAAW,IAAA,EAAM,WAAA,CAAY,IAAI,CAAC,CAAC,CAAA;AAC5F;AAGA,SAAS,UAAA,CAAW,UAAkB,IAAA,EAAuB;AAC3D,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,QAAA,EAAU,IAAI,CAAA;AACxC,EAAA,IAAI,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA,EAAG,OAAO,KAAA;AACjC,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AACnC,EAAA,IAAI,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,eAAe,GAAA,CAAI,CAAC,CAAA,IAAM,CAAA,CAAE,WAAW,GAAG,CAAA,IAAK,CAAA,KAAM,IAAK,GAAG,OAAO,KAAA;AAC7F,EAAA,OAAO,gBAAgB,IAAA,CAAK,CAAC,QAAQ,IAAA,CAAK,QAAA,CAAS,GAAG,CAAC,CAAA;AACzD;AAEA,SAAS,SAAA,CAAU,MAAc,IAAA,EAAuB;AACtD,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,IAAI,CAAA;AACpC,EAAA,OAAO,IAAI,UAAA,CAAW,CAAA,MAAA,EAAS,IAAA,CAAK,GAAG,MAAM,IAAA,CAAK,GAAG,CAAA,CAAE,CAAA,IAAK,iBAAiB,IAAA,CAAK,IAAI,KAAK,CAAC,IAAA,CAAK,SAAS,OAAO,CAAA;AACnH;AAEA,SAAS,YAAA,CAAa,MAAc,IAAA,EAAuB;AACzD,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,IAAI,CAAA;AACpC,EAAA,OAAO,QAAQ,QAAA,IAAY,GAAA,CAAI,WAAW,CAAA,MAAA,EAAS,IAAA,CAAK,GAAG,CAAA,CAAE,CAAA;AAC/D;AAOO,SAAS,cAAc,OAAA,EAA6C;AACzE,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAA;AACtC,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,WAAW,CAAA;AAC9C,EAAA,IAAI,KAAA,GAAoB,OAAA,CAAQ,KAAA,IAAS,WAAA,CAAY,IAAI,CAAA;AAEzD,EAAA,IAAI,SAAA,GAAY,OAAA,CAAQ,OAAA,CAAQ,gBAAgB,CAAA;AAEhD,EAAA,IAAI,SAAA,GAA2B,IAAA;AAG/B,EAAA,MAAM,QAAA,GAAW,MAAe,KAAA,CAAM,OAAA,KAAY,EAAA,GAAK,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,KAAA,CAAM,OAAO,CAAA;AAE3F,EAAA,MAAM,OAAO,MAAY;AACvB,IAAA,iBAAA,CAAkB,EAAE,IAAA,EAAM,KAAA,EAAO,CAAA;AACjC,IAAA,SAAA,GAAY,IAAA;AACZ,IAAA,SAAA,GAAY,IAAA;AAAA,EACd,CAAA;AAGA,EAAA,MAAM,kBAAkB,MAAY;AAClC,IAAA,IAAI,CAAC,WAAW,IAAA,EAAK;AAAA,EACvB,CAAA;AAEA,EAAA,MAAM,aAAa,MAAY;AAC7B,IAAA,KAAA,GAAQ,YAAY,IAAI,CAAA;AACxB,IAAA,IAAA,EAAK;AAAA,EACP,CAAA;AAEA,EAAA,MAAM,IAAA,GAAe;AAAA,IACnB,IAAA,EAAM,cAAA;AAAA,IACN,OAAA,EAAS,KAAA;AAAA,IAET,MAAA,GAAS;AACP,MAAA,OAAO;AAAA,QACL,IAAA;AAAA,QACA,OAAA,EAAS,QAAA;AAAA,QACT,SAAA,EAAW,CAAC,SAAS,CAAA;AAAA,QACrB,OAAA,EAAS,EAAE,MAAA,EAAQ,MAAA,EAAO;AAAA,QAC1B,YAAA,EAAc,EAAE,OAAA,EAAS,eAAA,CAAgB,IAAI,CAAA,EAAE;AAAA,QAC/C,KAAA,EAAO;AAAA,UACL,MAAA,EAAQ,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,QAAQ,QAAQ,CAAA;AAAA,UACxC,WAAA,EAAa,IAAA;AAAA,UACb,aAAA,EAAe;AAAA,YACb,KAAA,EAAO,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY,YAAY;AAAA;AAC3C;AACF,OACF;AAAA,IACF,CAAA;AAAA,IAEA,cAAA,GAAiB;AAEf,MAAA,eAAA,EAAgB;AAAA,IAClB,CAAA;AAAA,IAEA,UAAA,GAAa;AAGX,MAAA,eAAA,EAAgB;AAAA,IAClB,CAAA;AAAA;AAAA,IAGA,SAAA,CAAU,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM;AAChC,MAAA,IAAI,IAAA,EAAM,KAAK,OAAO,IAAA;AACtB,MAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AACjC,MAAA,IAAI,CAAC,GAAA,CAAI,UAAA,CAAW,IAAI,GAAG,OAAO,IAAA;AAClC,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,GAAG,CAAA;AACtC,MAAA,IACE,MAAA,CAAO,UAAA,CAAW,CAAA,MAAA,EAAS,IAAA,CAAK,GAAG,CAAA,CAAE,CAAA,IACrC,MAAA,CAAO,UAAA,CAAW,WAAW,CAAA,IAC7B,MAAA,CAAO,QAAA,CAAS,cAAc,CAAA,EAC9B;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,IAAI,MAAA,GAAwB,IAAA;AAC5B,MAAA,IAAI,MAAA,CAAO,UAAA,CAAW,GAAG,CAAA,EAAG,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA,EAAG,MAAM,CAAA;AAAA,WAAA,IAClE,MAAA,CAAO,UAAA,CAAW,GAAG,CAAA,EAAG,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,WAAA,IAChE,MAAA,KAAW,QAAA,IAAY,MAAA,CAAO,UAAA,CAAW,SAAS,GAAG,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,MAAM,CAAA;AAC7F,MAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,MAAM,CAAA;AAC5C,MAAA,IAAI,SAAA,KAAc,YAAY,SAAA,CAAU,UAAA,CAAW,SAAS,IAAA,CAAK,GAAG,EAAE,CAAA,EAAG;AACvE,QAAA,IAAA,CAAK,KAAA;AAAA,UACH,CAAA,eAAA,EAAkB,MAAM,CAAA,yBAAA,EAA4B,MAAM,CAAA,oFAAA;AAAA,SAE5D;AAAA,MACF;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASA,SAAA,CAAU,MAAM,EAAA,EAAI;AAClB,MAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAC7B,MAAA,IAAI,CAAC,UAAA,CAAW,QAAA,EAAS,EAAG,KAAK,GAAG,OAAO,IAAA;AAC3C,MAAA,IAAI,CAAC,yBAAA,CAA0B,IAAA,CAAK,IAAI,GAAG,OAAO,IAAA;AAGlD,MAAA,MAAM,MAAM,IAAA,CAAK,OAAA;AAAA,QACf,sCAAA;AAAA,QACA,CAAC,EAAA,EAAI,MAAA,EAAgB,IAAA,KAAiB,SAAS,QAAA,GAAW;AAAA,OAC5D;AACA,MAAA,IAAI,GAAA,KAAQ,MAAM,OAAO,IAAA;AACzB,MAAA,OAAO,EAAE,IAAA,EAAM,GAAA,EAAK,GAAA,EAAK,IAAA,EAAK;AAAA,IAChC,CAAA;AAAA;AAAA,IAGA,kBAAA,EAAoB;AAAA,MAClB,KAAA,EAAO,KAAA;AAAA,MACP,OAAA,CAAQ,OAAO,GAAA,EAA0B;AACvC,QAAA,IAAI,CAAC,GAAA,CAAI,MAAA,EAAQ,OAAO,EAAC;AACzB,QAAA,OAAO;AAAA,UACL;AAAA,YACE,GAAA,EAAK,QAAA;AAAA,YACL,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,YACxB,QAAA,EAAU,cAAA;AAAA,YACV,QAAA,EAAU;AAAA;AACZ,SACF;AAAA,MACF;AAAA,KACF;AAAA,IAEA,gBAAgB,MAAA,EAAuB;AACrC,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,GAAA,IAAQ,OAAA,CAAQ,GAAA;AAG7C,MAAA,MAAM,KAAA,GAAQ,uBAAuB,EAAE,MAAA,EAAQ,UAAU,MAAM,KAAA,EAAO,QAAQ,CAAA;AAC9E,MAAA,MAAA,CAAO,WAAA,CAAY,GAAA,CAAI,CAAC,GAAA,EAAK,KAAK,IAAA,KAAS;AACzC,QAAA,MAAM,OAAO,GAAA,CAAI,GAAA,IAAO,KAAK,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AACzC,QAAA,IAAI,GAAA,KAAQ,oBAAA,IAAwB,GAAA,CAAI,MAAA,KAAW,MAAA,EAAQ;AACzD,UAAA,OAAO,mBAAA,CAAoB,KAAK,GAAG,CAAA;AAAA,QACrC;AAGA,QAAA,IAAI,MAAM,SAAA,EAAW,OAAO,KAAA,CAAM,GAAA,EAAK,KAAK,IAAI,CAAA;AAChD,QAAA,OAAO,IAAA,EAAK;AAAA,MACd,CAAC,CAAA;AAID,MAAA,MAAM,YAAA,GAAe,CAAC,IAAA,KAAiB,IAAA,CAAK,SAAS,QAAA,EAAS,EAAG,IAAI,CAAA,KAAM,YAAA;AAG3E,MAAA,MAAM,YAAY,MAAM,eAAA,CAAgB,IAAI,CAAA,CAAE,QAAQ,KAAA,CAAM,OAAA;AAC5D,MAAA,MAAM,YAAA,GAAe,CAAC,IAAA,KAAiB;AACrC,QAAA,IAAI,SAAA,EAAU,IAAK,UAAA,CAAW,QAAA,EAAS,EAAG,IAAI,CAAA,IAAK,SAAA,CAAU,IAAA,EAAM,IAAI,CAAA,IAAK,YAAA,CAAa,IAAI,CAAA,EAAG;AAC9F,UAAA,UAAA,EAAW;AACX,UAAA,MAAA,CAAO,EAAA,CAAG,IAAA,CAAK,EAAE,IAAA,EAAM,eAAe,CAAA;AAAA,QACxC;AAAA,MACF,CAAA;AAOA,MAAA,MAAM,UAAA,GAAa,CAAC,GAAA,KAAgB;AAClC,QAAA,IAAI,YAAA,CAAa,IAAA,EAAM,GAAG,CAAA,EAAG,OAAO,IAAA;AACpC,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,QAAA,IAAY,GAAG,CAAA;AACzC,QAAA,IAAI,QAAQ,EAAA,IAAM,GAAA,CAAI,UAAA,CAAW,IAAI,GAAG,OAAO,KAAA;AAC/C,QAAA,OAAO,CAAC,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,GAAG,EAAE,IAAA,CAAK,CAAC,CAAA,KAAM,cAAA,CAAe,IAAI,CAAC,CAAA,IAAK,CAAA,CAAE,UAAA,CAAW,GAAG,CAAC,CAAA;AAAA,MACpF,CAAA;AACA,MAAA,MAAA,CAAO,OAAA,CAAQ,EAAA,CAAG,KAAA,EAAO,YAAY,CAAA;AACrC,MAAA,MAAA,CAAO,OAAA,CAAQ,EAAA,CAAG,QAAA,EAAU,YAAY,CAAA;AACxC,MAAA,MAAA,CAAO,OAAA,CAAQ,EAAA,CAAG,QAAA,EAAU,CAAC,GAAA,KAAQ;AACnC,QAAA,IAAI,SAAA,EAAU,IAAK,UAAA,CAAW,GAAG,GAAG,UAAA,EAAW;AAAA,MACjD,CAAC,CAAA;AACD,MAAA,MAAA,CAAO,OAAA,CAAQ,EAAA,CAAG,WAAA,EAAa,CAAC,GAAA,KAAQ;AACtC,QAAA,IAAI,CAAC,SAAA,EAAU,IAAK,CAAC,UAAA,CAAW,GAAG,CAAA,EAAG;AACtC,QAAA,UAAA,EAAW;AACX,QAAA,MAAA,CAAO,EAAA,CAAG,IAAA,CAAK,EAAE,IAAA,EAAM,eAAe,CAAA;AAAA,MACxC,CAAC,CAAA;AACD,MAAA,MAAA,CAAO,OAAA,CAAQ,EAAA,CAAG,QAAA,EAAU,CAAC,IAAA,KAAS;AACpC,QAAA,IAAI,YAAA,CAAa,IAAA,EAAM,IAAI,CAAA,EAAG;AAC5B,UAAA,MAAM,IAAA,GAAO,MAAA,CAAO,WAAA,CAAY,gBAAA,CAAiB,IAAI,CAAA;AACrD,UAAA,IAAI,MAAM,KAAA,MAAW,CAAA,IAAK,MAAM,MAAA,CAAO,WAAA,CAAY,iBAAiB,CAAC,CAAA;AAAA,QACvE;AAAA,MACF,CAAC,CAAA;AAGD,MAAA,OAAO,MAAM;AACX,QAAA,MAAA,CAAO,WAAA,CAAY,GAAA,CAAI,OAAO,GAAA,EAAK,KAAK,IAAA,KAAS;AAC/C,UAAA,IAAI,IAAI,MAAA,KAAW,KAAA,IAAS,IAAI,MAAA,KAAW,MAAA,SAAe,IAAA,EAAK;AAG/D,UAAA,IAAI;AAKF,YAAA,IAAI,cAAc,IAAA,EAAM;AACtB,cAAA,MAAM,GAAA,GAAM,GAAG,YAAA,CAAa,IAAA,CAAK,KAAK,UAAA,EAAY,YAAY,GAAG,MAAM,CAAA;AAQvE,cAAA,MAAM,QAAA,GAAW,IAAI,WAAW,CAAA,WAAA,CAAA;AAChC,cAAA,SAAA,GAAY,MAAM,MAAA,CAAO,kBAAA,CAAmB,QAAA,EAAU,GAAA,EAAK,IAAI,WAAW,CAAA;AAAA,YAC5E;AACA,YAAA,GAAA,CAAI,UAAA,GAAa,GAAA;AACjB,YAAA,GAAA,CAAI,SAAA,CAAU,gBAAgB,WAAW,CAAA;AACzC,YAAA,GAAA,CAAI,IAAI,SAAS,CAAA;AAAA,UACnB,SAAS,GAAA,EAAK;AACZ,YAAA,IAAA,CAAK,GAAY,CAAA;AAAA,UACnB;AAAA,QACF,CAAC,CAAA;AAAA,MACH,CAAA;AAAA,IACF;AAAA,GACF;AAGA,EAAA,OAAO,CAAC,IAAA,EAAM,KAAA,EAAM,EAAG,aAA6B,CAAA;AACtD;AAEA,IAAM,cAAA,GAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAuBvB,SAAS,mBAAA,CAAoB,KAA0C,GAAA,EAA+C;AACpH,EAAA,IAAI,IAAA,GAAO,EAAA;AACX,EAAA,GAAA,CAAI,EAAA,CAAG,MAAA,EAAQ,CAAC,KAAA,KAAU;AACxB,IAAA,IAAA,IAAQ,KAAA;AACR,IAAA,IAAI,IAAA,CAAK,MAAA,GAAS,GAAA,EAAW,GAAA,CAAI,OAAA,EAAQ;AAAA,EAC3C,CAAC,CAAA;AACD,EAAA,GAAA,CAAI,EAAA,CAAG,OAAO,MAAM;AAClB,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAQ,GAAI,IAAA,CAAK,MAAM,IAAI,CAAA;AAC1C,MAAA,MAAM,GAAA,GAAM,EAAA,CAAG,GAAA,CAAI,CAAA,SAAA,EAAY,KAAK,CAAA,CAAA,CAAG,CAAA;AACvC,MAAA,MAAM,KAAA,GACJ,KAAA,KAAU,OAAA,GAAU,EAAA,CAAG,GAAA,GAAM,UAAU,MAAA,GAAS,EAAA,CAAG,MAAA,GAAS,CAAC,CAAA,KAAc,CAAA;AAE7E,MAAA,OAAA,CAAQ,GAAA,CAAI,GAAG,GAAG,CAAA,CAAA,EAAI,MAAM,MAAA,CAAO,OAAO,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,IAChD,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,GAAA,CAAI,UAAA,GAAa,GAAA;AACjB,IAAA,GAAA,CAAI,GAAA,EAAI;AAAA,EACV,CAAC,CAAA;AACH","file":"chunk-R2YYVCGS.js","sourcesContent":["import { Hono } from \"hono\"\nimport { getRequestListener } from \"@hono/node-server\"\nimport type { IncomingMessage, ServerResponse } from \"node:http\"\nimport type { ViteDevServer } from \"vite\"\nimport type { RouteModel } from \"../core/types\"\nimport { corsMiddleware } from \"./cors\"\nimport {\n dispatchApi,\n matchApiRoute,\n sortApiRoutes,\n type ApiRouteEntry,\n} from \"./dispatch\"\nimport type { ApiModule } from \"./index\"\n\ntype Middleware = (req: IncomingMessage, res: ServerResponse, next: () => void) => void\n\n/**\n * Build a connect-style middleware that serves `server/api/**` in dev. Modules\n * are loaded through Vite's SSR pipeline so edits hot-reload, and the route list\n * is read fresh on every request so added/removed API files take effect without\n * a restart.\n */\nexport function createApiDevMiddleware(opts: {\n server: ViteDevServer\n getModel: () => RouteModel\n getEnv: () => Record<string, string | undefined>\n}): Middleware {\n const { server, getModel, getEnv } = opts\n\n const buildRoutes = (): ApiRouteEntry[] =>\n sortApiRoutes(\n getModel().apis.map((a) => ({\n routePath: a.routePath,\n segments: a.segments,\n hasCatchall: a.segments.some((s) => s.kind === \"catchall\"),\n staticCount: a.segments.filter((s) => s.kind === \"static\").length,\n load: () => server.ssrLoadModule(a.absFile) as Promise<ApiModule>,\n })),\n )\n\n const app = new Hono()\n\n // CORS for split deployments, matching prod. Off unless CORS_ORIGIN is set;\n // read once here from the current env (dev's CORS config is deploy-level).\n const cors = corsMiddleware(getEnv())\n if (cors) {\n app.use(\"/api\", cors)\n app.use(\"/api/*\", cors)\n }\n\n const handle = async (c: { req: { url: string; raw: Request } }) => {\n const url = new URL(c.req.url)\n const match = matchApiRoute(buildRoutes(), url.pathname)\n if (!match) {\n return Response.json({ error: \"Not Found\", path: url.pathname }, { status: 404 })\n }\n let mod: ApiModule\n try {\n mod = await match.route.load()\n } catch (err) {\n if (err instanceof Error) server.ssrFixStacktrace(err)\n throw err\n }\n return dispatchApi(mod, c.req.raw, match.params, getEnv())\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n app.all(\"/api\", handle as any)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n app.all(\"/api/*\", handle as any)\n\n const listener = getRequestListener(app.fetch)\n\n return (req, res, next) => {\n const url = req.url ?? \"/\"\n const path = url.split(\"?\")[0]!\n if (path === \"/api\" || path.startsWith(\"/api/\")) {\n Promise.resolve(listener(req, res)).catch((err) => {\n console.error(\"[vantage] API middleware failure:\", err)\n if (!res.headersSent) {\n res.statusCode = 500\n res.setHeader(\"content-type\", \"application/json\")\n res.end(JSON.stringify({ error: \"Internal Server Error\" }))\n }\n })\n } else {\n next()\n }\n }\n}\n","import fs from \"node:fs\"\nimport path from \"node:path\"\nimport react from \"@vitejs/plugin-react\"\nimport tailwindcss from \"@tailwindcss/vite\"\nimport type { HtmlTagDescriptor, Plugin, PluginOption, ViteDevServer } from \"vite\"\nimport pc from \"picocolors\"\nimport { NON_ROUTE_DIRS, PAGE_EXTENSIONS, VANTAGE_DIR } from \"../core/constants\"\nimport { generateArtifacts } from \"../core/generate\"\nimport { resolvePageRoot, scanProject } from \"../core/scan\"\nimport type { RouteModel } from \"../core/types\"\nimport { createApiDevMiddleware } from \"../server/dev\"\n\nexport interface VantagePluginOptions {\n root: string\n /** Server-side env (process.env + loaded .env), passed to API handlers. */\n env?: Record<string, string | undefined>\n /**\n * A route model the caller already scanned. `dev`/`build` run diagnostics\n * before starting Vite, so without this the project would be walked a second\n * time for an answer that is milliseconds old.\n */\n model?: RouteModel\n /**\n * Set when the caller has already written `.vantage/` for `model`. `build`\n * does, so that the server bundle — which reads `server-routes.gen.ts` — can\n * be produced at the same time as the client instead of after it.\n */\n artifactsWritten?: boolean\n}\n\nconst DEDUPE = [\"react\", \"react-dom\", \"@tanstack/react-router\", \"@tanstack/react-query\"]\n\n/** Always prebundled: the generated client entry imports these on every start. */\nconst RUNTIME_DEPS = [\n \"react\",\n \"react-dom\",\n \"react-dom/client\",\n \"react/jsx-runtime\",\n \"@tanstack/react-router\",\n \"@tanstack/react-query\",\n]\n\n/**\n * The rest of the managed stack — everything `@squadbase/vantage/ui` and\n * `/components` pull in. Apps import framework subpaths, never these directly,\n * so Vantage knows the full set up front and Vite does not have to rediscover\n * it. Declaring them removes the second optimize wave (and the full page reload\n * it forces) the first time a page reaches for a new kit component.\n */\nconst KIT_DEPS = [\n \"@tanstack/react-table\",\n \"class-variance-authority\",\n \"clsx\",\n \"cmdk\",\n \"date-fns\",\n \"date-fns/locale\",\n \"echarts\",\n \"lucide-react\",\n \"react-day-picker\",\n \"tailwind-merge\",\n \"@base-ui/react/accordion\",\n \"@base-ui/react/button\",\n \"@base-ui/react/checkbox\",\n \"@base-ui/react/collapsible\",\n \"@base-ui/react/dialog\",\n \"@base-ui/react/input\",\n \"@base-ui/react/menu\",\n \"@base-ui/react/merge-props\",\n \"@base-ui/react/popover\",\n \"@base-ui/react/progress\",\n \"@base-ui/react/scroll-area\",\n \"@base-ui/react/select\",\n \"@base-ui/react/separator\",\n \"@base-ui/react/slider\",\n \"@base-ui/react/switch\",\n \"@base-ui/react/tabs\",\n \"@base-ui/react/toggle\",\n \"@base-ui/react/toggle-group\",\n \"@base-ui/react/tooltip\",\n \"@base-ui/react/use-render\",\n]\n\n/** The package part of a specifier: `@base-ui/react/select` → `@base-ui/react`. */\nfunction packageName(spec: string): string {\n const parts = spec.split(\"/\")\n return spec.startsWith(\"@\") ? parts.slice(0, 2).join(\"/\") : parts[0]!\n}\n\n/** Walk up `node_modules` chains looking for a package directory. */\nfunction hasPackage(fromDir: string, pkg: string): boolean {\n let dir = fromDir\n for (;;) {\n if (fs.existsSync(path.join(dir, \"node_modules\", pkg))) return true\n const parent = path.dirname(dir)\n if (parent === dir) return false\n dir = parent\n }\n}\n\n/**\n * Build `optimizeDeps.include`, keeping only specifiers that actually resolve\n * from the project root.\n *\n * Two constraints pin this down. Vite hard-errors on an include entry it cannot\n * resolve, so guessing is not an option. And Vite's own dependency discovery\n * names these packages *plainly* — so the `parent > child` form, which would\n * reach the copy inside the framework's own node_modules, does not merge with\n * what discovery finds: it prebundles a second, never-requested copy of every\n * entry (measured: 156 files instead of 78).\n *\n * The practical effect is that a hoisted install (npm/yarn, and pnpm with\n * hoisting) declares the whole managed stack up front and skips the second\n * optimize wave — the one that forces a full page reload the first time a page\n * reaches for a new kit component. Under a strict pnpm layout the kit resolves\n * only from the framework package, nothing extra is declared, and behaviour is\n * exactly what it was before.\n */\nfunction optimizeInclude(root: string): string[] {\n return [...RUNTIME_DEPS, ...KIT_DEPS].filter((spec) => hasPackage(root, packageName(spec)))\n}\n\n/** Page modules are scanned from the page root: `<root>/src` when it exists. */\nfunction isPageFile(pageRoot: string, file: string): boolean {\n const rel = path.relative(pageRoot, file)\n if (rel.startsWith(\"..\")) return false\n const segments = rel.split(path.sep)\n if (segments.some((s) => NON_ROUTE_DIRS.has(s) || (s.startsWith(\".\") && s !== \"..\"))) return false\n return PAGE_EXTENSIONS.some((ext) => file.endsWith(ext))\n}\n\nfunction isApiFile(root: string, file: string): boolean {\n const rel = path.relative(root, file)\n return rel.startsWith(`server${path.sep}api${path.sep}`) && /\\.(ts|tsx|js)$/.test(file) && !file.endsWith(\".d.ts\")\n}\n\nfunction isServerFile(root: string, file: string): boolean {\n const rel = path.relative(root, file)\n return rel === \"server\" || rel.startsWith(`server${path.sep}`)\n}\n\n/**\n * The single plugin that turns a plain Vite instance into Vantage: file-based\n * routing, generated entry/HTML, Tailwind, the server-import boundary, route\n * HMR and dev console forwarding.\n */\nexport function vantagePlugin(options: VantagePluginOptions): PluginOption {\n const root = path.resolve(options.root)\n const vantageDir = path.join(root, VANTAGE_DIR)\n let model: RouteModel = options.model ?? scanProject(root)\n /** Written once per start: `configResolved` and `buildStart` both need it. */\n let generated = Boolean(options.artifactsWritten)\n /** Cached dev shell, invalidated whenever the artifacts are rewritten. */\n let shellHtml: string | null = null\n\n /** Absolute page-scan root, kept in step with the last scan. */\n const pageRoot = (): string => (model.pageDir === \"\" ? root : path.join(root, model.pageDir))\n\n const emit = (): void => {\n generateArtifacts({ root, model })\n generated = true\n shellHtml = null\n }\n\n /** Write the artifacts for the model we already have, at most once per start. */\n const ensureGenerated = (): void => {\n if (!generated) emit()\n }\n\n const regenerate = (): void => {\n model = scanProject(root)\n emit()\n }\n\n const core: Plugin = {\n name: \"vantage:core\",\n enforce: \"pre\",\n\n config() {\n return {\n root,\n appType: \"custom\",\n envPrefix: [\"PUBLIC_\"],\n resolve: { dedupe: DEDUPE },\n optimizeDeps: { include: optimizeInclude(root) },\n build: {\n outDir: path.join(root, \"dist\", \"client\"),\n emptyOutDir: true,\n rollupOptions: {\n input: path.join(vantageDir, \"index.html\"),\n },\n },\n }\n },\n\n configResolved() {\n // Ensure .vantage exists before dev HTML serving or the build reads input.\n ensureGenerated()\n },\n\n buildStart() {\n // configResolved already ran in the normal path; this is the safety net\n // for embedders that construct the plugin without a full config pass.\n ensureGenerated()\n },\n\n // --- Server-import boundary: client code may never import server/. ---\n resolveId(source, importer, opts) {\n if (opts?.ssr) return null\n if (!importer) return null\n const imp = importer.split(\"?\")[0]!\n if (!imp.startsWith(root)) return null\n const relImp = path.relative(root, imp)\n if (\n relImp.startsWith(`server${path.sep}`) ||\n relImp.startsWith(VANTAGE_DIR) ||\n relImp.includes(\"node_modules\")\n ) {\n return null\n }\n let target: string | null = null\n if (source.startsWith(\".\")) target = path.resolve(path.dirname(imp), source)\n else if (source.startsWith(\"/\")) target = path.join(root, source.slice(1))\n else if (source === \"server\" || source.startsWith(\"server/\")) target = path.join(root, source)\n if (!target) return null\n const relTarget = path.relative(root, target)\n if (relTarget === \"server\" || relTarget.startsWith(`server${path.sep}`)) {\n this.error(\n `Client module \"${relImp}\" imports from server/ (\"${source}\"). ` +\n `server/ code must never reach the client bundle — move shared code to lib/.`,\n )\n }\n return null\n },\n\n // --- Keep React Fast Refresh working on page modules. ---\n // `export const page = definePage(...)` is a non-component export, which\n // makes @vitejs/plugin-react bail out of Fast Refresh (full reload). The\n // runtime never reads this export (title/description are extracted at\n // generate time), so we drop the `export` keyword — turning it into a local\n // const — before the React plugin analyzes the module. Offsets are\n // preserved (6 spaces for \"export\") so sourcemaps stay accurate.\n transform(code, id) {\n const clean = id.split(\"?\")[0]!\n if (!isPageFile(pageRoot(), clean)) return null\n if (!/export\\s+const\\s+page\\b/.test(code)) return null\n // Anchor to line start so `export const page` inside a string/comment is\n // not rewritten. \"export\" (6 chars) becomes 6 spaces to keep offsets.\n const out = code.replace(\n /^([ \\t]*)export(\\s+const\\s+page\\b)/gm,\n (_m, indent: string, rest: string) => indent + \" \" + rest,\n )\n if (out === code) return null\n return { code: out, map: null }\n },\n\n // --- Dev console + runtime errors forwarded to the terminal. ---\n transformIndexHtml: {\n order: \"pre\",\n handler(_html, ctx): HtmlTagDescriptor[] {\n if (!ctx.server) return []\n return [\n {\n tag: \"script\",\n attrs: { type: \"module\" },\n injectTo: \"head-prepend\",\n children: CONSOLE_BRIDGE,\n },\n ]\n },\n },\n\n configureServer(server: ViteDevServer) {\n const getEnv = () => options.env ?? (process.env as Record<string, string | undefined>)\n\n // API requests handled before Vite's own middlewares.\n const apiMw = createApiDevMiddleware({ server, getModel: () => model, getEnv })\n server.middlewares.use((req, res, next) => {\n const url = (req.url ?? \"/\").split(\"?\")[0]\n if (url === \"/__vantage_console\" && req.method === \"POST\") {\n return handleConsoleBeacon(req, res)\n }\n // Without server/, /api/* is a normal client route: fall through to the\n // SPA shell instead of returning API 404s (matches production).\n if (model.hasServer) return apiMw(req, res, next)\n return next()\n })\n\n // Structural route changes -> regenerate manifest + reload. Adding or\n // removing styles.css also changes the generated runtime.css.\n const isStylesFile = (file: string) => path.relative(pageRoot(), file) === \"styles.css\"\n // Creating or deleting src/ moves the page root itself, which changes\n // every generated import even though no page file was touched.\n const rootMoved = () => resolvePageRoot(root).dir !== model.pageDir\n const onStructural = (file: string) => {\n if (rootMoved() || isPageFile(pageRoot(), file) || isApiFile(root, file) || isStylesFile(file)) {\n regenerate()\n server.ws.send({ type: \"full-reload\" })\n }\n }\n /**\n * A new directory can introduce route segments, so it has to be scanned —\n * but only when it could actually hold pages or API modules. Rescanning on\n * every mkdir (node_modules churn, build output, dot-dirs) walks the whole\n * project for nothing.\n */\n const isRouteDir = (dir: string) => {\n if (isServerFile(root, dir)) return true\n const rel = path.relative(pageRoot(), dir)\n if (rel === \"\" || rel.startsWith(\"..\")) return false\n return !rel.split(path.sep).some((s) => NON_ROUTE_DIRS.has(s) || s.startsWith(\".\"))\n }\n server.watcher.on(\"add\", onStructural)\n server.watcher.on(\"unlink\", onStructural)\n server.watcher.on(\"addDir\", (dir) => {\n if (rootMoved() || isRouteDir(dir)) regenerate()\n })\n server.watcher.on(\"unlinkDir\", (dir) => {\n if (!rootMoved() && !isRouteDir(dir)) return\n regenerate()\n server.ws.send({ type: \"full-reload\" })\n })\n server.watcher.on(\"change\", (file) => {\n if (isServerFile(root, file)) {\n const mods = server.moduleGraph.getModulesByFile(file)\n if (mods) for (const m of mods) server.moduleGraph.invalidateModule(m)\n }\n })\n\n // SPA fallback: serve the generated index.html for navigations.\n return () => {\n server.middlewares.use(async (req, res, next) => {\n if (req.method !== \"GET\" && req.method !== \"HEAD\") return next()\n // Standard SPA fallback: anything Vite's own middlewares didn't handle\n // (real modules, assets, /@vite, /@id) resolves to the app shell.\n try {\n // The shell is generated, not authored, and the plugin set that\n // transforms it is fixed — so the result only changes when the\n // artifacts are rewritten. Caching it keeps every navigation from\n // re-running the whole HTML transform chain.\n if (shellHtml === null) {\n const raw = fs.readFileSync(path.join(vantageDir, \"index.html\"), \"utf8\")\n // The first argument is the URL of the shell *document*, not of the\n // navigation being answered: Vite derives the ids of the scripts it\n // injects (the React Refresh preamble) from it, emitting\n // `<src>?html-proxy&index=0.js`. Passing `req.url` would make a page\n // load of /sales request \"/sales?html-proxy&index=0.js\", which\n // resolves to sales/index.tsx and errors. `originalUrl` still carries\n // the real navigation for plugins that want it.\n const shellUrl = `/${VANTAGE_DIR}/index.html`\n shellHtml = await server.transformIndexHtml(shellUrl, raw, req.originalUrl)\n }\n res.statusCode = 200\n res.setHeader(\"Content-Type\", \"text/html\")\n res.end(shellHtml)\n } catch (err) {\n next(err as Error)\n }\n })\n }\n },\n }\n\n // React Fast Refresh + Tailwind are owned by Vantage, never by the user.\n return [core, react(), tailwindcss() as PluginOption]\n}\n\nconst CONSOLE_BRIDGE = `\n(() => {\n const send = (level, message) => {\n try {\n const body = JSON.stringify({ level, message });\n if (navigator.sendBeacon) navigator.sendBeacon(\"/__vantage_console\", body);\n else fetch(\"/__vantage_console\", { method: \"POST\", body, keepalive: true });\n } catch (_) {}\n };\n const fmt = (args) => args.map((a) => {\n if (a instanceof Error) return a.stack || a.message;\n if (typeof a === \"object\") { try { return JSON.stringify(a); } catch { return String(a); } }\n return String(a);\n }).join(\" \");\n for (const lvl of [\"log\", \"info\", \"warn\", \"error\"]) {\n const orig = console[lvl].bind(console);\n console[lvl] = (...args) => { send(lvl, fmt(args)); orig(...args); };\n }\n window.addEventListener(\"error\", (e) => send(\"error\", (e.message || \"Error\") + \" @ \" + (e.filename || \"\") + \":\" + e.lineno));\n window.addEventListener(\"unhandledrejection\", (e) => send(\"error\", \"UnhandledRejection: \" + ((e.reason && e.reason.stack) || e.reason)));\n})();\n`\n\nfunction handleConsoleBeacon(req: import(\"node:http\").IncomingMessage, res: import(\"node:http\").ServerResponse): void {\n let body = \"\"\n req.on(\"data\", (chunk) => {\n body += chunk\n if (body.length > 1_000_000) req.destroy()\n })\n req.on(\"end\", () => {\n try {\n const { level, message } = JSON.parse(body) as { level: string; message: string }\n const tag = pc.dim(`[browser:${level}]`)\n const color =\n level === \"error\" ? pc.red : level === \"warn\" ? pc.yellow : (s: string) => s\n // eslint-disable-next-line no-console\n console.log(`${tag} ${color(String(message))}`)\n } catch {\n /* ignore malformed beacons */\n }\n res.statusCode = 204\n res.end()\n })\n}\n"]}
|
package/dist/dev-NX3PMYCT.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/dev.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAQA,eAAsB,GAAA,CAAI,MAAc,IAAA,EAAmC;AACzE,EAAA,MAAM,KAAA,GAAQ,YAAY,IAAI,CAAA;AAC9B,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,IAAA,EAAM,KAAK,CAAA,CAAE,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,KAAa,OAAO,CAAA;AAC/E,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,gBAAA,CAAiB,MAAM,CAAA;AACvB,IAAA,GAAA,CAAI,MAAM,sDAAsD,CAAA;AAChE,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GAAO,aAAA;AACb,EAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,EAAA,MAAM,GAAA,GAAM,EAAE,GAAG,OAAA,CAAQ,GAAA,EAAK,GAAG,OAAA,CAAQ,IAAA,EAAM,IAAA,EAAM,EAAE,CAAA,EAAE;AACzD,EAAA,MAAM,IAAA,GAAO,SAAA,CAAU,IAAA,CAAK,KAAA,CAAM,MAAM,IAAI,CAAA;AAE5C,EAAA,MAAM,SAAS,MAAM,UAAA;AAAA,IAAW,mBAAA;AAAA,IAAqB,MACnD,YAAA,CAAa;AAAA,MACX,UAAA,EAAY,KAAA;AAAA,MACZ,IAAA;AAAA,MACA,IAAA;AAAA;AAAA;AAAA,MAGA,OAAA,EAAS,CAAC,aAAA,CAAc,EAAE,MAAM,GAAA,EAAK,KAAA,EAAO,CAAC,CAAA;AAAA,MAC7C,MAAA,EAAQ,EAAE,IAAA,EAAK;AAAA,MACf,WAAA,EAAa;AAAA,KACd;AAAA,GACH;AAEA,EAAA,MAAM,UAAA,CAAW,aAAA,EAAe,MAAM,MAAA,CAAO,QAAQ,CAAA;AACrD,EAAA,GAAA,CAAI,MAAM,kBAAkB,CAAA;AAC5B,EAAA,MAAA,CAAO,SAAA,EAAU;AACjB,EAAA,IAAI,KAAA,CAAM,SAAA,EAAW,GAAA,CAAI,IAAA,CAAK,sBAA2B,CAAA;AAEzD,EAAA,MAAM,WAAW,YAAY;AAC3B,IAAA,MAAM,OAAO,KAAA,EAAM;AACnB,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB,CAAA;AACA,EAAA,OAAA,CAAQ,EAAA,CAAG,UAAU,QAAQ,CAAA;AAC7B,EAAA,OAAA,CAAQ,EAAA,CAAG,WAAW,QAAQ,CAAA;AAG9B,EAAA,OAAO,IAAI,QAAgB,MAAM;AAAA,EAAC,CAAC,CAAA;AACrC","file":"dev-NX3PMYCT.js","sourcesContent":["import { createServer, loadEnv } from \"vite\"\nimport { runDiagnostics } from \"../core/diagnostics\"\nimport { timedAsync } from \"../core/profile\"\nimport { scanProject } from \"../core/scan\"\nimport { vantagePlugin } from \"../vite/index\"\nimport { applyApiBaseUrlFlag, log, parsePort, printDiagnostics, type ParsedArgs } from \"./util\"\n\n/** `vantage dev` — start the dev server with HMR and the optional API server. */\nexport async function dev(root: string, args: ParsedArgs): Promise<number> {\n const model = scanProject(root)\n const errors = runDiagnostics(root, model).filter((d) => d.severity === \"error\")\n if (errors.length) {\n printDiagnostics(errors)\n log.error(\"Fix the errors above before starting the dev server.\")\n return 1\n }\n\n const mode = \"development\"\n applyApiBaseUrlFlag(args)\n const env = { ...process.env, ...loadEnv(mode, root, \"\") }\n const port = parsePort(args.flags.port, 5173)\n\n const server = await timedAsync(\"vite:createServer\", () =>\n createServer({\n configFile: false,\n root,\n mode,\n // The model was just scanned for diagnostics; hand it over so the plugin\n // does not walk the project again.\n plugins: [vantagePlugin({ root, env, model })],\n server: { port },\n clearScreen: false,\n }),\n )\n\n await timedAsync(\"vite:listen\", () => server.listen())\n log.brand(\"dev server ready\")\n server.printUrls()\n if (model.hasServer) log.info(\" \" + \"server/api enabled\")\n\n const shutdown = async () => {\n await server.close()\n process.exit(0)\n }\n process.on(\"SIGINT\", shutdown)\n process.on(\"SIGTERM\", shutdown)\n\n // Keep the process alive; the listening server owns the lifecycle.\n return new Promise<number>(() => {})\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/preview.ts"],"names":[],"mappings":";;;;;;;AAMA,eAAsB,OAAA,CAAQ,MAAc,IAAA,EAAmC;AAC7E,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,QAAQ,uBAAuB,CAAA;AACpE,EAAA,IAAI,CAAC,EAAA,CAAG,UAAA,CAAW,YAAY,CAAA,EAAG;AAChC,IAAA,GAAA,CAAI,MAAM,4CAA4C,CAAA;AACtD,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,MAAM,WAAW,IAAA,CAAK,KAAA,CAAM,GAAG,YAAA,CAAa,YAAA,EAAc,MAAM,CAAC,CAAA;AACjE,EAAA,MAAM,IAAA,GAAO,SAAA,CAAU,IAAA,CAAK,KAAA,CAAM,MAAM,IAAI,CAAA;AAE5C,EAAA,IAAI,QAAA,CAAS,SAAS,WAAA,EAAa;AACjC,IAAA,MAAM,aAAa,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,MAAA,EAAQ,UAAU,WAAW,CAAA;AAChE,IAAA,IAAI,CAAC,EAAA,CAAG,UAAA,CAAW,UAAU,CAAA,EAAG;AAC9B,MAAA,GAAA,CAAI,MAAM,gDAAgD,CAAA;AAC1D,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,GAAA,CAAI,KAAA,CAAM,CAAA,4CAAA,EAA0C,IAAI,CAAA,CAAE,CAAA;AAC1D,IAAA,MAAM,QAAQ,KAAA,CAAM,OAAA,CAAQ,QAAA,EAAU,CAAC,UAAU,CAAA,EAAG;AAAA,MAClD,KAAA,EAAO,SAAA;AAAA,MACP,GAAA,EAAK,EAAE,GAAG,OAAA,CAAQ,KAAK,IAAA,EAAM,MAAA,CAAO,IAAI,CAAA;AAAE,KAC3C,CAAA;AACD,IAAA,OAAO,IAAI,OAAA,CAAgB,CAAC,OAAA,KAAY;AACtC,MAAA,KAAA,CAAM,GAAG,MAAA,EAAQ,CAAC,SAAS,OAAA,CAAQ,IAAA,IAAQ,CAAC,CAAC,CAAA;AAC7C,MAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA;AACtC,MAAA,OAAA,CAAQ,EAAA,CAAG,UAAU,IAAI,CAAA;AACzB,MAAA,OAAA,CAAQ,EAAA,CAAG,WAAW,IAAI,CAAA;AAAA,IAC5B,CAAC,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,EAAE,OAAA,EAAS,WAAA,EAAY,GAAI,MAAM,OAAO,MAAM,CAAA;AACpD,EAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY;AAAA,IAC/B,UAAA,EAAY,KAAA;AAAA,IACZ,IAAA;AAAA,IACA,KAAA,EAAO,EAAE,MAAA,EAAQ,IAAA,CAAK,KAAK,IAAA,EAAM,MAAA,EAAQ,QAAQ,CAAA,EAAE;AAAA,IACnD,OAAA,EAAS,EAAE,IAAA;AAAK,GACjB,CAAA;AACD,EAAA,GAAA,CAAI,MAAM,eAAe,CAAA;AACzB,EAAA,MAAA,CAAO,SAAA,EAAU;AACjB,EAAA,OAAO,IAAI,QAAgB,MAAM;AAAA,EAAC,CAAC,CAAA;AACrC","file":"preview-CLALOEFE.js","sourcesContent":["import fs from \"node:fs\"\nimport path from \"node:path\"\nimport { spawn } from \"node:child_process\"\nimport { log, parsePort, type ParsedArgs } from \"./util\"\n\n/** `vantage preview` — run the production build locally. */\nexport async function preview(root: string, args: ParsedArgs): Promise<number> {\n const manifestPath = path.join(root, \"dist\", \"vantage-manifest.json\")\n if (!fs.existsSync(manifestPath)) {\n log.error(\"No build found. Run `vantage build` first.\")\n return 1\n }\n const manifest = JSON.parse(fs.readFileSync(manifestPath, \"utf8\")) as { mode: string }\n const port = parsePort(args.flags.port, 4173)\n\n if (manifest.mode === \"fullstack\") {\n const serverPath = path.join(root, \"dist\", \"server\", \"index.mjs\")\n if (!fs.existsSync(serverPath)) {\n log.error(\"Server bundle missing. Re-run `vantage build`.\")\n return 1\n }\n log.brand(`preview (fullstack) → http://localhost:${port}`)\n const child = spawn(process.execPath, [serverPath], {\n stdio: \"inherit\",\n env: { ...process.env, PORT: String(port) },\n })\n return new Promise<number>((resolve) => {\n child.on(\"exit\", (code) => resolve(code ?? 0))\n const stop = () => child.kill(\"SIGINT\")\n process.on(\"SIGINT\", stop)\n process.on(\"SIGTERM\", stop)\n })\n }\n\n // SPA-only preview via Vite's static preview server.\n const { preview: vitePreview } = await import(\"vite\")\n const server = await vitePreview({\n configFile: false,\n root,\n build: { outDir: path.join(root, \"dist\", \"client\") },\n preview: { port },\n })\n log.brand(\"preview (spa)\")\n server.printUrls()\n return new Promise<number>(() => {})\n}\n"]}
|