watch-tail 0.6.0 → 0.6.2
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 +97 -350
- package/build/client/_app/immutable/chunks/{C_aXFBl3.js → 1cmfrS0o.js} +1 -1
- package/build/client/_app/immutable/chunks/1cmfrS0o.js.br +0 -0
- package/build/client/_app/immutable/chunks/1cmfrS0o.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{DU0OQtdJ.js → 8x_7TBuS.js} +1 -1
- package/build/client/_app/immutable/chunks/8x_7TBuS.js.br +0 -0
- package/build/client/_app/immutable/chunks/8x_7TBuS.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{D76YLq-2.js → AAWh0-tL.js} +1 -1
- package/build/client/_app/immutable/chunks/AAWh0-tL.js.br +0 -0
- package/build/client/_app/immutable/chunks/AAWh0-tL.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{Amq8zxdJ.js → BKpsnTLG.js} +1 -1
- package/build/client/_app/immutable/chunks/BKpsnTLG.js.br +0 -0
- package/build/client/_app/immutable/chunks/BKpsnTLG.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{B5q6rkQ-.js → BNDRPiSt.js} +1 -1
- package/build/client/_app/immutable/chunks/BNDRPiSt.js.br +0 -0
- package/build/client/_app/immutable/chunks/BNDRPiSt.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{C1lycbEF.js → BWDKMHXq.js} +1 -1
- package/build/client/_app/immutable/chunks/BWDKMHXq.js.br +0 -0
- package/build/client/_app/immutable/chunks/BWDKMHXq.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{BZFYtRPj.js → CBRk0OGa.js} +1 -1
- package/build/client/_app/immutable/chunks/CBRk0OGa.js.br +0 -0
- package/build/client/_app/immutable/chunks/CBRk0OGa.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{CT_NYh_-.js → CG0TPRkn.js} +1 -1
- package/build/client/_app/immutable/chunks/CG0TPRkn.js.br +0 -0
- package/build/client/_app/immutable/chunks/CG0TPRkn.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CGReuhGk.js +1 -0
- package/build/client/_app/immutable/chunks/CGReuhGk.js.br +1 -0
- package/build/client/_app/immutable/chunks/CGReuhGk.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{CyncJW0D.js → CIDBs8t6.js} +1 -1
- package/build/client/_app/immutable/chunks/CIDBs8t6.js.br +0 -0
- package/build/client/_app/immutable/chunks/CIDBs8t6.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{BDlvDAqe.js → CfPyeeq3.js} +1 -1
- package/build/client/_app/immutable/chunks/CfPyeeq3.js.br +0 -0
- package/build/client/_app/immutable/chunks/CfPyeeq3.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{CEU4ihsz.js → CpeJ2iPd.js} +1 -1
- package/build/client/_app/immutable/chunks/CpeJ2iPd.js.br +0 -0
- package/build/client/_app/immutable/chunks/CpeJ2iPd.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{CZIk93qi.js → D0IrjYE5.js} +1 -1
- package/build/client/_app/immutable/chunks/D0IrjYE5.js.br +0 -0
- package/build/client/_app/immutable/chunks/D0IrjYE5.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{B43Eeyih.js → D1Hr4tKw.js} +1 -1
- package/build/client/_app/immutable/chunks/D1Hr4tKw.js.br +0 -0
- package/build/client/_app/immutable/chunks/D1Hr4tKw.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{BsH4MNzX.js → D6rwn6Ed.js} +1 -1
- package/build/client/_app/immutable/chunks/D6rwn6Ed.js.br +1 -0
- package/build/client/_app/immutable/chunks/D6rwn6Ed.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{B3p3umIY.js → DQCjzVyz.js} +1 -1
- package/build/client/_app/immutable/chunks/DQCjzVyz.js.br +0 -0
- package/build/client/_app/immutable/chunks/DQCjzVyz.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{BAynhd7i.js → DWm-CGbg.js} +1 -1
- package/build/client/_app/immutable/chunks/DWm-CGbg.js.br +0 -0
- package/build/client/_app/immutable/chunks/DWm-CGbg.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{BJpWBbAS.js → DYDQbI6D.js} +1 -1
- package/build/client/_app/immutable/chunks/DYDQbI6D.js.br +0 -0
- package/build/client/_app/immutable/chunks/DYDQbI6D.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{CG6rRxUy.js → Dc9It0QB.js} +1 -1
- package/build/client/_app/immutable/chunks/Dc9It0QB.js.br +0 -0
- package/build/client/_app/immutable/chunks/Dc9It0QB.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{BOT2hFMn.js → DkQY3T0m.js} +1 -1
- package/build/client/_app/immutable/chunks/DkQY3T0m.js.br +0 -0
- package/build/client/_app/immutable/chunks/DkQY3T0m.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{ByhwhtiG.js → DqJI6J5U.js} +1 -1
- package/build/client/_app/immutable/chunks/DqJI6J5U.js.br +0 -0
- package/build/client/_app/immutable/chunks/DqJI6J5U.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{zHL7lw4G.js → DtV-MjyX.js} +1 -1
- package/build/client/_app/immutable/chunks/DtV-MjyX.js.br +0 -0
- package/build/client/_app/immutable/chunks/DtV-MjyX.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{wx-wtMGx.js → DznDQzx1.js} +1 -1
- package/build/client/_app/immutable/chunks/DznDQzx1.js.br +0 -0
- package/build/client/_app/immutable/chunks/DznDQzx1.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{BGmgUZMc.js → F4LqKrLs.js} +5 -5
- package/build/client/_app/immutable/chunks/F4LqKrLs.js.br +0 -0
- package/build/client/_app/immutable/chunks/F4LqKrLs.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{jO4fmY1N.js → KA1QvXmu.js} +1 -1
- package/build/client/_app/immutable/chunks/KA1QvXmu.js.br +0 -0
- package/build/client/_app/immutable/chunks/KA1QvXmu.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{D4sC5v3c.js → KsLFdNDs.js} +1 -1
- package/build/client/_app/immutable/chunks/KsLFdNDs.js.br +0 -0
- package/build/client/_app/immutable/chunks/KsLFdNDs.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{D8H_ivbb.js → OoMmWNOu.js} +1 -1
- package/build/client/_app/immutable/chunks/OoMmWNOu.js.br +0 -0
- package/build/client/_app/immutable/chunks/OoMmWNOu.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{Yk6ZJZnu.js → UsO0MS14.js} +1 -1
- package/build/client/_app/immutable/chunks/UsO0MS14.js.br +0 -0
- package/build/client/_app/immutable/chunks/UsO0MS14.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{snfmbqby.js → sf5kQ3yV.js} +1 -1
- package/build/client/_app/immutable/chunks/sf5kQ3yV.js.br +0 -0
- package/build/client/_app/immutable/chunks/sf5kQ3yV.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{CM5sQDq_.js → w7c5E2ms.js} +1 -1
- package/build/client/_app/immutable/chunks/w7c5E2ms.js.br +0 -0
- package/build/client/_app/immutable/chunks/w7c5E2ms.js.gz +0 -0
- package/build/client/_app/immutable/entry/{app.DFSifnlU.js → app.FQLd-NC-.js} +2 -2
- package/build/client/_app/immutable/entry/app.FQLd-NC-.js.br +0 -0
- package/build/client/_app/immutable/entry/app.FQLd-NC-.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.DqW_lChD.js +1 -0
- package/build/client/_app/immutable/entry/start.DqW_lChD.js.br +1 -0
- package/build/client/_app/immutable/entry/start.DqW_lChD.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{1.Djdw1GzA.js → 1.5EZfoLCg.js} +1 -1
- package/build/client/_app/immutable/nodes/1.5EZfoLCg.js.br +0 -0
- package/build/client/_app/immutable/nodes/1.5EZfoLCg.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{2.CjvaJDQJ.js → 2.CbcDv2oO.js} +2 -2
- package/build/client/_app/immutable/nodes/2.CbcDv2oO.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.CbcDv2oO.js.gz +0 -0
- package/build/client/_app/version.json +1 -1
- package/build/client/_app/version.json.br +0 -0
- package/build/client/_app/version.json.gz +0 -0
- package/build/handler.js +4 -4
- package/build/index.js +4 -4
- package/build/server/chunks/chunks/{internal2.js-BPo5dcDi.js → internal2.js-627EG4am.js} +2 -2
- package/build/server/chunks/chunks/{internal2.js-BPo5dcDi.js.map → internal2.js-627EG4am.js.map} +1 -1
- package/build/server/chunks/chunks/{state.js-DgkwfYFo.js → state.js-DbqJPX0Y.js} +2 -2
- package/build/server/chunks/chunks/{state.js-DgkwfYFo.js.map → state.js-DbqJPX0Y.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/stream/{_server.ts.js-BWRHawY8.js → _server.ts.js-B9_-4ssJ.js} +36 -1
- package/build/server/chunks/entries/endpoints/api/stream/_server.ts.js-B9_-4ssJ.js.map +1 -0
- package/build/server/chunks/entries/fallbacks/{error.svelte.js-CsCL5PMW.js → error.svelte.js-B8dLO9gT.js} +3 -3
- package/build/server/chunks/entries/fallbacks/{error.svelte.js-CsCL5PMW.js.map → error.svelte.js-B8dLO9gT.js.map} +1 -1
- package/build/server/chunks/entries/pages/{_page.svelte.js-qqtU0apo.js → _page.svelte.js-BwuzE25P.js} +3 -3
- package/build/server/chunks/entries/pages/{_page.svelte.js-qqtU0apo.js.map → _page.svelte.js-BwuzE25P.js.map} +1 -1
- package/build/server/chunks/{handler-DlfTB05m.js → handler-hlKcUyVP.js} +3 -3
- package/build/server/chunks/{handler-DlfTB05m.js.map → handler-hlKcUyVP.js.map} +1 -1
- package/build/server/chunks/{index.js-BMrd9hfO.js → index.js-BfPWKsz6.js} +2 -2
- package/build/server/chunks/{index.js-BMrd9hfO.js.map → index.js-BfPWKsz6.js.map} +1 -1
- package/build/server/chunks/{manifest.js-D1kCuVe5.js → manifest.js-uuijI5lm.js} +5 -5
- package/build/server/chunks/{manifest.js-D1kCuVe5.js.map → manifest.js-uuijI5lm.js.map} +1 -1
- package/build/server/chunks/nodes/{1.js-B5FPLYnf.js → 1.js-bi9PXX_2.js} +3 -3
- package/build/server/chunks/nodes/{1.js-B5FPLYnf.js.map → 1.js-bi9PXX_2.js.map} +1 -1
- package/build/server/chunks/nodes/{2.js-BEuxzw6b.js → 2.js-3MYCPEqM.js} +3 -3
- package/build/server/chunks/nodes/{2.js-BEuxzw6b.js.map → 2.js-3MYCPEqM.js.map} +1 -1
- package/dist/cli/server.js +10 -0
- package/package.json +3 -2
- package/build/client/_app/immutable/chunks/Amq8zxdJ.js.br +0 -0
- package/build/client/_app/immutable/chunks/Amq8zxdJ.js.gz +0 -0
- package/build/client/_app/immutable/chunks/B3p3umIY.js.br +0 -0
- package/build/client/_app/immutable/chunks/B3p3umIY.js.gz +0 -0
- package/build/client/_app/immutable/chunks/B43Eeyih.js.br +0 -0
- package/build/client/_app/immutable/chunks/B43Eeyih.js.gz +0 -0
- package/build/client/_app/immutable/chunks/B5q6rkQ-.js.br +0 -0
- package/build/client/_app/immutable/chunks/B5q6rkQ-.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BAynhd7i.js.br +0 -0
- package/build/client/_app/immutable/chunks/BAynhd7i.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BDlvDAqe.js.br +0 -0
- package/build/client/_app/immutable/chunks/BDlvDAqe.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BGmgUZMc.js.br +0 -0
- package/build/client/_app/immutable/chunks/BGmgUZMc.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BJpWBbAS.js.br +0 -0
- package/build/client/_app/immutable/chunks/BJpWBbAS.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BOT2hFMn.js.br +0 -0
- package/build/client/_app/immutable/chunks/BOT2hFMn.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BZFYtRPj.js.br +0 -0
- package/build/client/_app/immutable/chunks/BZFYtRPj.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BsH4MNzX.js.br +0 -0
- package/build/client/_app/immutable/chunks/BsH4MNzX.js.gz +0 -0
- package/build/client/_app/immutable/chunks/ByhwhtiG.js.br +0 -0
- package/build/client/_app/immutable/chunks/ByhwhtiG.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C1lycbEF.js.br +0 -0
- package/build/client/_app/immutable/chunks/C1lycbEF.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CEU4ihsz.js.br +0 -0
- package/build/client/_app/immutable/chunks/CEU4ihsz.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CG6rRxUy.js.br +0 -0
- package/build/client/_app/immutable/chunks/CG6rRxUy.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CM5sQDq_.js.br +0 -0
- package/build/client/_app/immutable/chunks/CM5sQDq_.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CT_NYh_-.js.br +0 -0
- package/build/client/_app/immutable/chunks/CT_NYh_-.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CZIk93qi.js.br +0 -0
- package/build/client/_app/immutable/chunks/CZIk93qi.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C_aXFBl3.js.br +0 -0
- package/build/client/_app/immutable/chunks/C_aXFBl3.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CqWPu3PG.js +0 -1
- package/build/client/_app/immutable/chunks/CqWPu3PG.js.br +0 -1
- package/build/client/_app/immutable/chunks/CqWPu3PG.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CyncJW0D.js.br +0 -0
- package/build/client/_app/immutable/chunks/CyncJW0D.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D4sC5v3c.js.br +0 -0
- package/build/client/_app/immutable/chunks/D4sC5v3c.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D76YLq-2.js.br +0 -0
- package/build/client/_app/immutable/chunks/D76YLq-2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D8H_ivbb.js.br +0 -0
- package/build/client/_app/immutable/chunks/D8H_ivbb.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DU0OQtdJ.js.br +0 -0
- package/build/client/_app/immutable/chunks/DU0OQtdJ.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Yk6ZJZnu.js.br +0 -0
- package/build/client/_app/immutable/chunks/Yk6ZJZnu.js.gz +0 -0
- package/build/client/_app/immutable/chunks/jO4fmY1N.js.br +0 -0
- package/build/client/_app/immutable/chunks/jO4fmY1N.js.gz +0 -0
- package/build/client/_app/immutable/chunks/snfmbqby.js.br +0 -0
- package/build/client/_app/immutable/chunks/snfmbqby.js.gz +0 -0
- package/build/client/_app/immutable/chunks/wx-wtMGx.js.br +0 -0
- package/build/client/_app/immutable/chunks/wx-wtMGx.js.gz +0 -0
- package/build/client/_app/immutable/chunks/zHL7lw4G.js.br +0 -0
- package/build/client/_app/immutable/chunks/zHL7lw4G.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.DFSifnlU.js.br +0 -0
- package/build/client/_app/immutable/entry/app.DFSifnlU.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.2H5s3Lol.js +0 -1
- package/build/client/_app/immutable/entry/start.2H5s3Lol.js.br +0 -1
- package/build/client/_app/immutable/entry/start.2H5s3Lol.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.Djdw1GzA.js.br +0 -0
- package/build/client/_app/immutable/nodes/1.Djdw1GzA.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.CjvaJDQJ.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.CjvaJDQJ.js.gz +0 -0
- package/build/server/chunks/entries/endpoints/api/stream/_server.ts.js-BWRHawY8.js.map +0 -1
package/README.md
CHANGED
|
@@ -2,100 +2,95 @@
|
|
|
2
2
|
|
|
3
3
|
# watch-tail
|
|
4
4
|
|
|
5
|
-
**
|
|
5
|
+
**CloudWatch logs. One command. A clearer picture.**
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
tab fighting the AWS console.
|
|
7
|
+
Tail live logs, investigate an incident across services, and keep what you find in a local archive.
|
|
8
|
+
Uses your existing AWS credentials. Runs on your machine.
|
|
10
9
|
|
|
11
10
|
[](https://www.npmjs.com/package/watch-tail)
|
|
12
11
|
[](https://github.com/antstanley/watch-stream/actions/workflows/ci.yml)
|
|
13
12
|
[](./LICENSE)
|
|
14
13
|
[](package.json)
|
|
15
14
|
|
|
16
|
-
<img src="
|
|
15
|
+
<img src="https://raw.githubusercontent.com/antstanley/watch-stream/v0.6.2/docs/screenshot.png" alt="Historic logs from multiple groups, with severity chart and request grouping" width="1200">
|
|
17
16
|
|
|
18
17
|
</div>
|
|
19
18
|
|
|
19
|
+
## Start here
|
|
20
|
+
|
|
20
21
|
```bash
|
|
21
|
-
npx watch-tail
|
|
22
|
-
npx watch-tail --profile my-profile --region af-south-1
|
|
23
|
-
npx watch-tail --floci
|
|
22
|
+
npx watch-tail # use your existing AWS credentials
|
|
23
|
+
npx watch-tail --profile my-profile --region af-south-1 # choose a profile and region
|
|
24
|
+
npx watch-tail --floci # use a local emulator
|
|
24
25
|
```
|
|
25
26
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
Because the two things you have today are the AWS console and `aws logs tail`, and both make you
|
|
29
|
-
work for every line.
|
|
30
|
-
|
|
31
|
-
- **The console is a form-filling exercise.** Region dropdown, log-group dropdown, sometimes a stream
|
|
32
|
-
dropdown, then a text-only event viewer that forgets where you were. `watch-tail` opens on your
|
|
33
|
-
region, lists every group with its size, and starts streaming the moment you click one.
|
|
34
|
-
- **`aws logs tail` is a wall of text.** `watch-tail` gives you pause with buffering, client-side
|
|
35
|
-
filtering, clear, auto-scroll, a 5 000-line ring buffer, and a stream-name column that is truncated
|
|
36
|
-
with the full value on hover - so a 95-character Lambda stream name cannot push your message off
|
|
37
|
-
screen.
|
|
38
|
-
- **Logs arrive as payloads, not prose.** JSON entries are pretty-printed with syntax colouring by
|
|
39
|
-
default, and one toggle shows the raw line when you need the wire format. With that toggle off,
|
|
40
|
-
**click a line that carries JSON** and just that payload opens beneath it - indented, coloured, and
|
|
41
|
-
without losing the raw line - and clicking again closes it.
|
|
42
|
-
- **"What happened an hour ago?" is the normal question.** Flip to **Historic** and scan 15 min, 1 h,
|
|
43
|
-
3 h, 12 h, 24 h, 5 days - or pick a custom `from`/`to` window. The scan finishes on its own and the
|
|
44
|
-
window lives in the URL, so `…&mode=historic&range=24h` is a shareable view of an incident.
|
|
45
|
-
- **Your credentials never move.** No keys to paste into a SaaS, no CLI to install into your CI, no
|
|
46
|
-
vendor account: it uses the ambient AWS profile you already use, needs only two read-only IAM
|
|
47
|
-
actions, and binds to loopback. Throwaway keys are used for a local emulator and only there.
|
|
48
|
-
- **It is one command and it goes away.** `npx watch-tail`, Ctrl+C. Nothing is deployed, nothing is
|
|
49
|
-
sent anywhere, and there is no agent, sidecar or daemon to clean up.
|
|
50
|
-
- **You keep what you have seen.** Logs you stream are appended to a local DuckDB file, so the incident
|
|
51
|
-
you looked at last week is still there - no re-scanning AWS, no 14-day cliff, no credentials needed
|
|
52
|
-
to read it back. Switch the source to **Local archive** in the UI and the same window controls work
|
|
53
|
-
against that file.
|
|
54
|
-
|
|
55
|
-
Use it when you are debugging a Lambda, chasing an API Gateway 5xx, watching a worker drain a queue,
|
|
56
|
-
or handing a teammate a link that shows exactly the window you are staring at.
|
|
27
|
+
Requires **Node.js 22+**. Prefer a global install? `npm install -g watch-tail` gives you both
|
|
28
|
+
`watch-tail` and the shorter `wt`. Press **Ctrl+C** to stop, including during a live stream or login prompt.
|
|
57
29
|
|
|
58
30
|
## What you get
|
|
59
31
|
|
|
60
|
-
- **
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
- **
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
- **
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
32
|
+
- **Live tail and historic scans.** Follow new events or select a preset (15 minutes to 5 days) or
|
|
33
|
+
custom window. Pause with buffering, filter text, clear the view, and toggle auto-scroll.
|
|
34
|
+
- **Several groups, one view.** Select groups in the sidebar to merge their logs and chart. A group
|
|
35
|
+
column keeps each line's source visible.
|
|
36
|
+
- **Requests, not just lines.** **By request** groups matching request IDs into one expandable row,
|
|
37
|
+
showing line count, elapsed span, and highest severity. Lines without an ID stay visible.
|
|
38
|
+
- **Spot the spike.** In Historic mode, the chart shows request counts over time, coloured by severity.
|
|
39
|
+
Drag to zoom into an incident; severity chips filter both chart and logs. Switch off **By request**
|
|
40
|
+
to count individual events. Collapse the chart when you want the space back.
|
|
41
|
+
- **Readable payloads.** Syntax-coloured JSON, expandable payloads, wrapping, horizontal scrolling,
|
|
42
|
+
and resizable sidebar and stream-name columns. The viewer keeps a 5,000-line buffer.
|
|
43
|
+
- **Offline history.** Streamed events are saved to a local DuckDB archive. Browse them later without
|
|
44
|
+
AWS credentials, or query them with SQL.
|
|
45
|
+
- **Reopen the same view.** Region, groups, source, mode, and time window live in the URL. A teammate
|
|
46
|
+
needs their own AWS access or a copy of the archive; the link does not include logs or credentials.
|
|
47
|
+
|
|
48
|
+
## Follow a request
|
|
49
|
+
|
|
50
|
+
Grouping is on by default. Click a request row to expand its lines; use **By request** to return to
|
|
51
|
+
individual events. IDs are detected from `requestId`, `request_id`, `awsRequestId`, `x-request-id`,
|
|
52
|
+
and Lambda's `RequestId:` lines. Each request takes the severity of its most critical line.
|
|
53
|
+
|
|
54
|
+
<img src="https://raw.githubusercontent.com/antstanley/watch-stream/v0.6.2/docs/requests.png" alt="An expanded checkout request showing its JSON payloads and Lambda log lines" width="1200">
|
|
55
|
+
|
|
56
|
+
In **Historic**, drag across the chart to narrow the window. Click to clear the brush, or use
|
|
57
|
+
**Reset zoom** to restore the preset. CloudWatch charts reflect the events loaded into the viewer;
|
|
58
|
+
archive charts query the whole selected window.
|
|
59
|
+
|
|
60
|
+
## Keep your history
|
|
61
|
+
|
|
62
|
+
Choose **Local archive** to browse events already captured on this machine, even offline or with an
|
|
63
|
+
expired SSO session. Only events received while streaming are archived; it does not back up your
|
|
64
|
+
whole AWS account.
|
|
86
65
|
|
|
87
66
|
```bash
|
|
88
|
-
|
|
89
|
-
|
|
67
|
+
watch-tail --db ./logs.duckdb # choose an archive file
|
|
68
|
+
watch-tail --no-archive # disable archiving
|
|
90
69
|
```
|
|
91
70
|
|
|
92
|
-
|
|
71
|
+
<img src="https://raw.githubusercontent.com/antstanley/watch-stream/v0.6.2/docs/archive.png" alt="Local archive replay with stored event counts and a severity chart" width="1200">
|
|
93
72
|
|
|
94
|
-
|
|
95
|
-
|
|
73
|
+
The default file is `archive.duckdb` in:
|
|
74
|
+
|
|
75
|
+
| Platform | Directory |
|
|
76
|
+
| -------- | ---------------------------------------------- |
|
|
77
|
+
| macOS | `~/Library/Application Support/watch-tail/` |
|
|
78
|
+
| Linux | `${XDG_DATA_HOME:-~/.local/share}/watch-tail/` |
|
|
79
|
+
| Windows | `%LOCALAPPDATA%\watch-tail\` |
|
|
80
|
+
|
|
81
|
+
DuckDB is optional: if its native driver cannot load, the viewer runs without archiving. One process
|
|
82
|
+
can own an archive file at a time; use separate `--db` paths for concurrent instances. To inspect it
|
|
83
|
+
with a DuckDB client, stop the app first:
|
|
84
|
+
|
|
85
|
+
```sql
|
|
86
|
+
SELECT log_group, level, count(*) AS events
|
|
87
|
+
FROM log_events
|
|
88
|
+
GROUP BY log_group, level
|
|
89
|
+
ORDER BY events DESC;
|
|
96
90
|
```
|
|
97
91
|
|
|
98
|
-
|
|
92
|
+
CloudWatch scans in this app are limited to the last 14 days; actual AWS retention depends on the
|
|
93
|
+
log group's settings. The local archive can retain events beyond that window.
|
|
99
94
|
|
|
100
95
|
## CLI
|
|
101
96
|
|
|
@@ -118,39 +113,24 @@ watch-tail [options]
|
|
|
118
113
|
-v, --version Show the version
|
|
119
114
|
```
|
|
120
115
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
not a "no".
|
|
124
|
-
|
|
125
|
-
Shell completions come from [`@bomb.sh/tab`](https://bomb.sh): flags, `--region` values from the
|
|
126
|
-
CloudWatch Logs region list, and `--profile` values from your own `~/.aws/config`. zsh, bash, fish and
|
|
127
|
-
powershell are supported.
|
|
116
|
+
Shell completions support zsh, bash, fish, and PowerShell, including your AWS profile names and
|
|
117
|
+
available regions:
|
|
128
118
|
|
|
129
119
|
```bash
|
|
130
|
-
source <(watch-tail complete zsh)
|
|
131
|
-
watch-tail complete zsh > ~/.watch-tail-completion.zsh # or install it permanently
|
|
132
|
-
echo 'source ~/.watch-tail-completion.zsh' >> ~/.zshrc
|
|
120
|
+
source <(watch-tail complete zsh)
|
|
133
121
|
```
|
|
134
122
|
|
|
135
|
-
The generated script re-invokes `watch-tail complete -- <words>`, so completions keep working after
|
|
136
|
-
you upgrade. Install the [`@bomb.sh/tab`](https://www.npmjs.com/package/@bomb.sh/tab) CLI globally if
|
|
137
|
-
you also want completions for a locally installed copy through your package manager
|
|
138
|
-
(`pnpm watch-tail <TAB>`).
|
|
139
|
-
|
|
140
|
-
`--profile` sets `AWS_PROFILE` for the server process only. Nothing is written to disk, and any local
|
|
141
|
-
emulator settings are neutralized for that run, so a stray `.env.local` cannot redirect a real AWS run.
|
|
142
|
-
|
|
143
123
|
## AWS access
|
|
144
124
|
|
|
145
|
-
|
|
146
|
-
|
|
125
|
+
Uses the AWS SDK credential chain: SSO, shared config, environment variables, or an instance role.
|
|
126
|
+
The server binds to loopback by default. No vendor account or deployed agent is needed.
|
|
147
127
|
|
|
148
128
|
```bash
|
|
149
129
|
aws sso login --profile my-profile
|
|
150
|
-
|
|
130
|
+
wt --profile my-profile
|
|
151
131
|
```
|
|
152
132
|
|
|
153
|
-
|
|
133
|
+
The app reads logs using these IAM actions:
|
|
154
134
|
|
|
155
135
|
```json
|
|
156
136
|
{
|
|
@@ -165,273 +145,40 @@ Two read-only actions are enough; the app never writes logs:
|
|
|
165
145
|
}
|
|
166
146
|
```
|
|
167
147
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
On startup the CLI asks the running app for one log group. If AWS refuses because of credentials, it
|
|
173
|
-
works out which login command fixes it - from how your profile is configured, not from guesswork -
|
|
174
|
-
and offers to run it:
|
|
175
|
-
|
|
176
|
-
```text
|
|
177
|
-
warning: AWS credentials are not usable: ... The SSO session token associated with
|
|
178
|
-
profile=my-profile was not found or is invalid.
|
|
179
|
-
? Sign in to the SSO session for my-profile. Run `aws sso login --profile my-profile` now? › yes
|
|
180
|
-
running aws sso login --profile my-profile
|
|
181
|
-
signed in - credentials work now
|
|
182
|
-
```
|
|
183
|
-
|
|
184
|
-
If you did not name a profile and you have more than one, it asks which one first. The answer decides
|
|
185
|
-
both the login and the profile the app runs with, so a chosen profile is applied by restarting the
|
|
186
|
-
server with it (and with that profile's own region). **A profile that already works is never sent to a
|
|
187
|
-
login prompt**: the CLI asks `sts:GetCallerIdentity` about the chosen profile first, and only offers a
|
|
188
|
-
login when that profile really has nothing usable.
|
|
189
|
-
|
|
190
|
-
```text
|
|
191
|
-
? Which AWS profile should watch-tail use? (type to search, then Enter)
|
|
192
|
-
using profile beyond-mzansi
|
|
193
|
-
restarting with profile beyond-mzansi
|
|
194
|
-
profile beyond-mzansi already works (AWSReservedSSO_AWSAdministratorAccess) - using it
|
|
195
|
-
```
|
|
196
|
-
|
|
197
|
-
```text
|
|
198
|
-
? Which AWS profile should watch-tail use? (type to search, then Enter)
|
|
199
|
-
using profile beyond-mzansi
|
|
200
|
-
? Sign in to the SSO session for beyond-mzansi. Run `aws sso login --profile beyond-mzansi` now? › yes
|
|
201
|
-
restarting with profile beyond-mzansi
|
|
202
|
-
signed in as beyond-mzansi - credentials work now
|
|
203
|
-
```
|
|
204
|
-
|
|
205
|
-
| Your profile | What it runs |
|
|
206
|
-
| -------------------------------------- | ------------------------------------------------------------------------------------------ |
|
|
207
|
-
| `sso_session` / `sso_start_url` | `aws sso login --profile <name>` |
|
|
208
|
-
| `login_session` (console sign-in) | `aws login --profile <name>` |
|
|
209
|
-
| nothing configured yet | `aws login` (which creates the session) |
|
|
210
|
-
| static keys, or a `credential_process` | no login is offered - those are fixed with `aws configure` or where the process is defined |
|
|
211
|
-
|
|
212
|
-
The login runs with your terminal attached, so the browser flow works. `--remote` is added when there
|
|
213
|
-
is no browser (SSH, headless). Decline, or run non-interactively, and the CLI prints the exact command
|
|
214
|
-
instead and keeps the app up - log in elsewhere, then press Refresh. Emulator runs (`--endpoint`,
|
|
215
|
-
`--floci`) skip the check, because those use throwaway credentials by design.
|
|
216
|
-
|
|
217
|
-
**The region is optional.** Precedence is `--region`, then `AWS_REGION`/`AWS_DEFAULT_REGION`, then the
|
|
218
|
-
profile's own region, then `[default]` in `~/.aws/config`. Nothing resolvable produces a clear
|
|
219
|
-
`missing-region` message instead of a silent guess. Log groups, retention and events are per region,
|
|
220
|
-
so a group in `eu-west-1` will not appear under `us-east-2`.
|
|
221
|
-
|
|
222
|
-
### Local emulator
|
|
223
|
-
|
|
224
|
-
```bash
|
|
225
|
-
curl -fsSL https://floci.io/install.sh | sh
|
|
226
|
-
floci start
|
|
227
|
-
npx watch-tail --floci # throwaway credentials are supplied automatically
|
|
228
|
-
```
|
|
229
|
-
|
|
230
|
-
`--floci` is the only thing that points the CLI at an emulator. If an `.env.local` next to the app
|
|
231
|
-
sets `AWS_ENDPOINT_URL` - as this repository's `pnpm floci:up` writes for the dev server - the CLI
|
|
232
|
-
ignores it, says so, and runs against real AWS; your own exported variables always win over that file.
|
|
233
|
-
|
|
234
|
-
## Local history
|
|
148
|
+
If credentials fail, the CLI can help you choose a profile and offer `aws sso login` or `aws login`
|
|
149
|
+
as appropriate. Working profiles are checked before offering login. In a non-interactive session it
|
|
150
|
+
prints the command to run instead.
|
|
235
151
|
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
152
|
+
Region precedence: `--region`, `AWS_REGION` / `AWS_DEFAULT_REGION`, the chosen profile, then the
|
|
153
|
+
default profile. Use `--floci` or `--endpoint` to select an emulator explicitly; emulator settings
|
|
154
|
+
from the checkout's `.env.local` do not silently redirect a normal CLI run.
|
|
239
155
|
|
|
240
|
-
|
|
241
|
-
available. Choosing it:
|
|
156
|
+
## Local development
|
|
242
157
|
|
|
243
|
-
|
|
244
|
-
locally,
|
|
245
|
-
- replays a window from the file instead of calling CloudWatch - instant, and **no credentials
|
|
246
|
-
needed**, so it works with an expired SSO session, offline, or on a machine that never had AWS
|
|
247
|
-
access,
|
|
248
|
-
- keeps the same range controls (`15m` … `5d`, or a custom `from`/`to`), and puts the source in the URL
|
|
249
|
-
so `…&source=archive&range=24h` is a shareable view of the archive.
|
|
250
|
-
|
|
251
|
-
```bash
|
|
252
|
-
watch-tail # archive on, file in your app data directory
|
|
253
|
-
watch-tail --db ./logs.duckdb # keep the archive next to the project instead
|
|
254
|
-
watch-tail --no-archive # do not archive anything
|
|
255
|
-
```
|
|
256
|
-
|
|
257
|
-
The default file is `archive.duckdb` inside your platform's data directory:
|
|
258
|
-
|
|
259
|
-
| Platform | Path |
|
|
260
|
-
| -------- | ------------------------------------------------------------ |
|
|
261
|
-
| macOS | `~/Library/Application Support/watch-tail/archive.duckdb` |
|
|
262
|
-
| Linux | `${XDG_DATA_HOME:-~/.local/share}/watch-tail/archive.duckdb` |
|
|
263
|
-
| Windows | `%LOCALAPPDATA%\watch-tail\archive.duckdb` |
|
|
264
|
-
|
|
265
|
-
`WATCH_STREAM_ARCHIVE=off` turns the archive off for the server, and `WATCH_STREAM_ARCHIVE_DB` sets the
|
|
266
|
-
file, for people who drive the server directly.
|
|
267
|
-
|
|
268
|
-
Because it is a DuckDB database, you can point any DuckDB client at the same file - with the app
|
|
269
|
-
stopped, since DuckDB allows one writer:
|
|
270
|
-
|
|
271
|
-
```bash
|
|
272
|
-
duckdb ~/Library/Application\ Support/watch-tail/archive.duckdb
|
|
273
|
-
```
|
|
274
|
-
|
|
275
|
-
```sql
|
|
276
|
-
SELECT log_group, count(*) AS events, max(timestamp_ms) AS newest
|
|
277
|
-
FROM log_events
|
|
278
|
-
GROUP BY log_group
|
|
279
|
-
ORDER BY events DESC;
|
|
280
|
-
|
|
281
|
-
SELECT to_timestamp(timestamp_ms / 1000) AS at, message
|
|
282
|
-
FROM log_events
|
|
283
|
-
WHERE log_group = '/aws/lambda/checkout' AND message ILIKE '%timeout%'
|
|
284
|
-
ORDER BY timestamp_ms;
|
|
285
|
-
|
|
286
|
-
-- how many errors per group, ignoring levels that were never detected
|
|
287
|
-
SELECT log_group, level, count(*) AS events
|
|
288
|
-
FROM log_events
|
|
289
|
-
WHERE level = 'error'
|
|
290
|
-
GROUP BY log_group, level
|
|
291
|
-
ORDER BY events DESC;
|
|
292
|
-
```
|
|
293
|
-
|
|
294
|
-
Three things worth knowing:
|
|
295
|
-
|
|
296
|
-
- **DuckDB is an optional dependency.** It is a native module (roughly 114 MB installed, prebuilt for
|
|
297
|
-
every supported platform - no compiler needed). If it cannot be installed or loaded, `watch-tail`
|
|
298
|
-
runs exactly as it did before, without history, and says so in the startup banner. To skip it
|
|
299
|
-
deliberately: `npm install -g watch-tail --no-optional`.
|
|
300
|
-
- **One process owns the file.** DuckDB takes an exclusive lock, so a second `watch-tail` on the same
|
|
301
|
-
archive runs without history while the first is up; `--db` is the way to keep two instances
|
|
302
|
-
separate.
|
|
303
|
-
- Levels are detected, not received: CloudWatch Logs does not report a severity, so `error`/`warn`/
|
|
304
|
-
`info`/`debug` come from the line itself, and `NULL` means nothing could be read from it.
|
|
305
|
-
- **The archive is as wide as what you watched.** Events are recorded as they stream, so history covers
|
|
306
|
-
the windows you have actually visited. It is also local, unencrypted and outside your AWS account -
|
|
307
|
-
treat the file like the logs themselves.
|
|
308
|
-
|
|
309
|
-
## Requests, not lines
|
|
310
|
-
|
|
311
|
-
Log lines that belong to the same request are one thing, not twenty. watch-tail reads a request id out
|
|
312
|
-
of each line - a declared `requestId` (also `request_id`, `awsRequestId`, an `x-request-id`) or the
|
|
313
|
-
`RequestId: ...` that a Lambda prints - and groups the lines that share it:
|
|
314
|
-
|
|
315
|
-
- **The log view** collapses each request into a single row: its request id, how many lines it wrote,
|
|
316
|
-
how long it took, and the level of its **most critical line**, so a request with one error among
|
|
317
|
-
twenty info lines reads as an error. Click the row to open it and see every line, indented, in order.
|
|
318
|
-
- **The chart** counts **one mark per request**, placed at the request's first line and coloured by
|
|
319
|
-
that same most critical level, so a spike of failing requests is a spike of marks rather than a spike
|
|
320
|
-
of log volume.
|
|
321
|
-
- **By request** in the log view's toolbar turns it off, and the view goes back to one row per line
|
|
322
|
-
(and the chart back to one mark per line). Your choice is remembered.
|
|
323
|
-
|
|
324
|
-
Grouping is on by default. Lines with no request id are never grouped: each keeps its own row and its
|
|
325
|
-
own mark, so nothing is hidden by a request id the log did not have. A request whose lines span more
|
|
326
|
-
than one bucket is counted once, where it started, which is why the chart's total can be lower than
|
|
327
|
-
the number of lines.
|
|
328
|
-
|
|
329
|
-
## The chart
|
|
330
|
-
|
|
331
|
-
In **Historic** mode (and for the local archive) a scatter chart sits above the log view: X is time, Y
|
|
332
|
-
is the number of requests in a bucket, and each level is its own colour. Drag across it to brush a
|
|
333
|
-
range - the log view, the window chip and the URL all follow, so a brush is a shareable view of the
|
|
334
|
-
spike you just found. Click the chart to clear the brush, or press **Reset zoom** to go back to the
|
|
335
|
-
preset window. The level chips filter the chart and the log view together.
|
|
336
|
-
|
|
337
|
-
A drag only counts as a zoom when it is a real drag: a click, or a pointer that slips a couple of
|
|
338
|
-
pixels, clears the brush instead of zooming into a sliver of a window, and the view is re-scoped when
|
|
339
|
-
you release rather than while you drag - so the stream is not restarted mid-gesture.
|
|
340
|
-
|
|
341
|
-
With several groups selected, the counts cover all of them and the chart's legend splits the totals by
|
|
342
|
-
level. The level chips filter requests by their most critical level, which is the level the marks are
|
|
343
|
-
drawn in, so the legend and the filter never disagree. The archive answers the chart with one SQL query over the whole window; a CloudWatch view has no
|
|
344
|
-
aggregate API, so there the chart counts the events already in the view.
|
|
345
|
-
|
|
346
|
-
The panel has a header you can click to collapse it, and it remembers that choice: collapsed, it is
|
|
347
|
-
just one line of totals and per-level counts, and the space goes back to the log view.
|
|
348
|
-
|
|
349
|
-
The chart is drawn with [layerchart](https://www.layerchart.com), which is **loaded on demand**: the
|
|
350
|
-
charting code is fetched in the browser only once the panel is open, so it never delays the log view's
|
|
351
|
-
first paint. Measured on the production build, an open panel pulls about 235 KiB of chart code after
|
|
352
|
-
the page has started, and a collapsed one pulls none at all.
|
|
353
|
-
|
|
354
|
-
## Development
|
|
158
|
+
With [floci](https://floci.io) installed:
|
|
355
159
|
|
|
356
160
|
```bash
|
|
357
161
|
pnpm install
|
|
358
|
-
pnpm
|
|
359
|
-
|
|
360
|
-
pnpm
|
|
361
|
-
pnpm dev:aws --profile my-profile # dev server against a real profile
|
|
362
|
-
pnpm build # adapter-node build + the CLI in dist/
|
|
363
|
-
pnpm start # run the built CLI
|
|
364
|
-
```
|
|
365
|
-
|
|
366
|
-
| Command | What it does |
|
|
367
|
-
| --------------------------- | ----------------------------------------------------------- |
|
|
368
|
-
| `pnpm check` | `svelte-check` types |
|
|
369
|
-
| `pnpm test:unit` | vitest unit, component and integration projects |
|
|
370
|
-
| `pnpm test:e2e` | floci integration suite (`WATCH_STREAM_E2E=1`) |
|
|
371
|
-
| `pnpm test:cli` | the built CLI serves and stops cleanly (`WATCH_TAIL_E2E=1`) |
|
|
372
|
-
| `pnpm test:ui` | Playwright smoke check of the UI against a running app |
|
|
373
|
-
| `pnpm lint` / `pnpm format` | oxlint / oxfmt |
|
|
374
|
-
| `pnpm knip` | unused files, exports and dependencies |
|
|
375
|
-
| `pnpm verify` | all of the above plus the build |
|
|
376
|
-
| `pnpm publish:check` | publint plus the exact tarball contents |
|
|
377
|
-
|
|
378
|
-
## Releasing
|
|
379
|
-
|
|
380
|
-
Releases use [changesets](https://github.com/changesets/changesets): a changeset is a small file
|
|
381
|
-
that records _what changed and how much it matters_, reviewed with the code. Pending changesets are
|
|
382
|
-
folded into one "Release: version packages" PR; merging it bumps the version and writes
|
|
383
|
-
`CHANGELOG.md`; the release workflow then stages that version to npm and tags the commit.
|
|
384
|
-
|
|
385
|
-
```bash
|
|
386
|
-
pnpm changeset # describe the change; the Version PR does the rest
|
|
387
|
-
pnpm changeset status # preview the next version
|
|
162
|
+
pnpm floci:up # start the emulator and write its dev environment
|
|
163
|
+
pnpm seed # demo logs; use pnpm seed:watch for live traffic
|
|
164
|
+
pnpm dev # http://localhost:5173
|
|
388
165
|
```
|
|
389
166
|
|
|
390
|
-
|
|
391
|
-
before it goes live, so no npm token exists in the repository - authentication is GitHub OIDC trusted
|
|
392
|
-
publishing, scoped to the publish job. See [RELEASING.md](./RELEASING.md) for the concept, the
|
|
393
|
-
one-time setup and the approval flow.
|
|
394
|
-
|
|
395
|
-
## Architecture
|
|
167
|
+
Use `pnpm dev:aws --profile my-profile` to develop against AWS instead.
|
|
396
168
|
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
CloudWatch Logs API -- ambient AWS credentials
|
|
406
|
-
or floci on http://localhost:4566
|
|
407
|
-
|
|
408
|
-
Everything streamed is also appended to a local archive,
|
|
409
|
-
which the UI can read back without AWS:
|
|
410
|
-
|
|
411
|
-
SvelteKit server ---- @duckdb/node-api ----> archive.duckdb (DuckDB file)
|
|
412
|
-
^
|
|
413
|
-
Browser -- GET /api/stream?source=archive -+
|
|
414
|
-
```
|
|
169
|
+
| Command | Purpose |
|
|
170
|
+
| --------------------------- | ------------------------------------------------------------- |
|
|
171
|
+
| `pnpm verify` | Types, lint, formatting, tests, unused-code checks, and build |
|
|
172
|
+
| `pnpm test:e2e` | Emulator integration tests (requires floci) |
|
|
173
|
+
| `pnpm test:cli` | Built CLI startup and shutdown checks |
|
|
174
|
+
| `pnpm test:ui` | Browser smoke checks against the running app |
|
|
175
|
+
| `pnpm build` / `pnpm start` | Build and run the production CLI |
|
|
176
|
+
| `pnpm publish:check` | Validate package metadata and tarball contents |
|
|
415
177
|
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
## Notes and limits
|
|
420
|
-
|
|
421
|
-
- CloudWatch Logs has no push API for reading, so the app polls `FilterLogEvents` (1 s by default,
|
|
422
|
-
250 ms - 15 s configurable). Expect roughly a second of latency and one API call per second per open
|
|
423
|
-
stream.
|
|
424
|
-
- `FilterLogEvents` only returns events from the last 14 days.
|
|
425
|
-
- The local server has no authentication: it binds to loopback and inherits your AWS permissions.
|
|
426
|
-
Binding elsewhere prints a warning - only do it on a trusted network.
|
|
427
|
-
- floci omits `logStreamName` in `FilterLogEvents`, so the stream column stays empty locally; real AWS
|
|
428
|
-
fills it.
|
|
429
|
-
- The archive is written from the same process that serves the UI, so it only grows while something is
|
|
430
|
-
streaming. A window you never opened is not in it, and events dropped by the 10 000-event cap of a
|
|
431
|
-
historic scan are not archived either.
|
|
432
|
-
- Archived events are de-duplicated by CloudWatch event id (or by a hash of timestamp, stream and
|
|
433
|
-
message when an emulator omits ids), so re-scanning the same window does not duplicate rows.
|
|
178
|
+
See [ARCHITECTURE.md](./ARCHITECTURE.md) for internals,
|
|
179
|
+
[CHANGELOG.md](./CHANGELOG.md) for release history, and [RELEASING.md](./RELEASING.md) for the
|
|
180
|
+
Changesets and npm staged-publishing workflow.
|
|
434
181
|
|
|
435
182
|
## License
|
|
436
183
|
|
|
437
|
-
MIT
|
|
184
|
+
[MIT](./LICENSE)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{J as e,ht as t}from"./pqiPC7Y8.js";import{t as n}from"./Db0q5_zr.js";import{t as r}from"./CCch3uox.js";import{t as i}from"./
|
|
1
|
+
import{J as e,ht as t}from"./pqiPC7Y8.js";import{t as n}from"./Db0q5_zr.js";import{t as r}from"./CCch3uox.js";import{t as i}from"./sf5kQ3yV.js";import{i as a}from"./8x_7TBuS.js";function o(e){let t=e?.all??0,n=e?.x??t,r=e?.y??t,i=e?.left??n,a=e?.right??n,o=e?.top??r;return{left:i,right:a,bottom:e?.bottom??r,top:o}}function s(s,l){let u=t(()=>l?.());return t=>{let l=o(e(u)?.insets),d=s.xScale.domain(),f=s.yScale.domain(),p=i(e(u)?.x??s.x),m=i(e(u)?.y??s.y),h=i(e(u)?.x1??s.x1),g=i(e(u)?.y1??s.y1),_=(e(u)?.x1??s.config.x1)!=null,v=(e(u)?.y1??s.config.y1)!=null;if(a(s.yScale)){let e=c(s.yScale(m(t))??0)+(v&&s.y1Scale?s.y1Scale(g(t)):0)+l.top,i=Math.max(0,s.yScale.bandwidth?(v&&s.y1Scale?s.y1Scale.bandwidth?.()??0:s.yScale.bandwidth())-l.bottom-l.top:0),a=p(t),o=0,u=0;return Array.isArray(a)?(o=r(a),u=n(a)):a==null?(o=0,u=0):a>0?(o=n([0,d[0]]),u=a):(o=a,u=r([0,d[1]])),{x:s.xScale(o)+l.left,y:e,width:Math.max(0,s.xScale(u)-s.xScale(o)-l.left-l.right),height:i}}if(a(s.xScale)){let e=c(s.xScale(p(t)))+(_&&s.x1Scale?s.x1Scale(h(t)):0)+l.left,i=Math.max(0,s.xScale.bandwidth?(_&&s.x1Scale?s.x1Scale.bandwidth?.()??0:s.xScale.bandwidth())-l.left-l.right:0),a=m(t),o=0,u=0;return Array.isArray(a)?(o=n(a),u=r(a)):a==null?(o=0,u=0):a>0?(o=a,u=n([0,f[0]])):(o=r([0,f[1]]),u=a),s.yRange[0]<s.yRange[1]&&([o,u]=[u,o]),{x:e,y:s.yScale(o)+l.top,width:i,height:s.yScale(u)-s.yScale(o)-l.bottom-l.top}}if(s.xInterval){let e=p(t),i=s.xInterval.floor(e),a=s.xInterval.offset(i),o=s.xScale(i),c=s.xScale(a),u=Math.min(o,c)+l.left,d=Math.abs(c-o)-l.left-l.right,h=m(t),g=0,_=0;return Array.isArray(h)?(g=n(h),_=r(h)):h==null?(g=0,_=0):h>0?(g=h,_=n([0,f[0]])):(g=r([0,f[1]]),_=h),{x:u,y:s.yScale(g)+l.top,width:d,height:s.yScale(_)-s.yScale(g)-l.bottom-l.top}}if(s.yInterval){let e=m(t),i=s.yInterval.floor(e),a=s.yInterval.offset(i),o=s.yScale(i),c=s.yScale(a),u=Math.min(o,c)+l.top,f=Math.abs(c-o)-l.top-l.bottom,h=p(t),g=0,_=0;Array.isArray(h)?(g=r(h),_=n(h)):h==null?(g=0,_=0):h>0?(g=n([0,d[0]]),_=h):(g=h,_=r([0,d[1]]));let v=s.xScale(g)+l.left;return{x:v,y:u,width:s.xScale(_)-v-l.right,height:f}}}}function c(e){return Array.isArray(e)?e[0]:e}function l(e,t,n){let r=0,i=0,a=0,o=0;typeof e==`number`?r=i=a=o=e:Array.isArray(e)?[r,i,a,o]=e:e&&(r=e.topLeft??0,i=e.topRight??0,a=e.bottomRight??0,o=e.bottomLeft??0);let s=Math.min(t,n)/2;return[Math.min(Math.max(0,r),s),Math.min(Math.max(0,i),s),Math.min(Math.max(0,a),s),Math.min(Math.max(0,o),s)]}function u([e,t,n,r]){return e===t&&t===n&&n===r}export{o as i,s as n,l as r,u as t};
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./pqiPC7Y8.js";import{A as e,C as t,D as n,E as r,O as i,S as a,T as o,_ as s,b as c,d as l,f as u,g as d,h as f,j as p,k as m,l as h,m as g,p as _,u as v,w as y,x as b,y as x}from"./
|
|
1
|
+
import"./pqiPC7Y8.js";import{A as e,C as t,D as n,E as r,O as i,S as a,T as o,_ as s,b as c,d as l,f as u,g as d,h as f,j as p,k as m,l as h,m as g,p as _,u as v,w as y,x as b,y as x}from"./CIDBs8t6.js";import{d as S,i as C,p as w,r as T,t as E,u as D}from"./CpeJ2iPd.js";import{t as O}from"./w7c5E2ms.js";import{t as k}from"./sf5kQ3yV.js";import"./DQCjzVyz.js";function A(a,s,c,l,u,d){let f=[[t,1,i],[t,5,5*i],[t,15,15*i],[t,30,30*i],[d,1,r],[d,5,5*r],[d,15,15*r],[d,30,30*r],[u,1,o],[u,3,3*o],[u,6,6*o],[u,12,12*o],[l,1,y],[l,2,2*y],[c,1,m],[s,1,n],[s,3,3*n],[a,1,e]];function h(e,t,n){let r=t<e;r&&([e,t]=[t,e]);let i=n&&typeof n.range==`function`?n:g(e,t,n),a=i?i.range(e,+t+1):[];return r?a.reverse():a}function g(t,n,r){let i=Math.abs(n-t)/r,o=w(([,,e])=>e).right(f,i);if(o===f.length)return a.every(S(t/e,n/e,r));if(o===0)return p.every(Math.max(S(t,n,r),1));let[s,c]=f[i/f[o-1][2]<f[o][2]/i?o-1:o];return s.every(c)}return[h,g]}var[j,M]=A(l,_,f,s,c,a),[N,P]=A(v,u,g,d,x,b);function F(e,t){e=e.slice();var n=0,r=e.length-1,i=e[n],a=e[r],o;return a<i&&(o=n,n=r,r=o,o=i,i=a,a=o),e[n]=t.floor(i),e[r]=t.ceil(a),e}function I(e){return new Date(e)}function L(e){return e instanceof Date?+e:+new Date(+e)}function R(e,t,n,r,i,a,o,s,c,l){var u=T(),d=u.invert,f=u.domain,p=l(`.%L`),m=l(`:%S`),h=l(`%I:%M`),g=l(`%I %p`),_=l(`%a %d`),v=l(`%b %d`),y=l(`%B`),b=l(`%Y`);function x(e){return(c(e)<e?p:s(e)<e?m:o(e)<e?h:a(e)<e?g:r(e)<e?i(e)<e?_:v:n(e)<e?y:b)(e)}return u.invert=function(e){return new Date(d(e))},u.domain=function(e){return arguments.length?f(Array.from(e,L)):f().map(I)},u.ticks=function(t){var n=f();return e(n[0],n[n.length-1],t??10)},u.tickFormat=function(e,t){return t==null?x:l(t)},u.nice=function(e){var n=f();return(!e||typeof e.range!=`function`)&&(e=t(n[0],n[n.length-1],e??10)),e?f(F(n,e)):u},u.copy=function(){return C(u,R(e,t,n,r,i,a,o,s,c,l))},u}function z(){return D.apply(R(N,P,v,u,g,d,x,b,t,h).domain([new Date(2e3,0,1),new Date(2e3,0,2)]),arguments)}function B(e){return typeof e==`function`&&typeof e.range==`function`}function V(e){return typeof e.bandwidth==`function`}function H(e){let t=e.domain();return t[0]instanceof Date||t[1]instanceof Date}function U(e){if(!H(e)||typeof e.ticks!=`function`||typeof e.copy!=`function`)return!1;let t=e.copy().domain([new Date(Date.UTC(2024,0,1)),new Date(Date.UTC(2024,0,4))]).ticks(3);return t.length>0&&t.every(e=>e.getUTCHours()===0&&e.getUTCMinutes()===0&&e.getUTCSeconds()===0)}function W(e){let t=e.domain();return typeof t[0]==`number`||typeof t[1]==`number`}function G(e){return B(e)?e.range():(console.error("[LayerChart] Your scale doesn't have a `.range` method?"),[])}function K(e){let t=e.domain(),n=e.step(),r=e.range()[0],i=e.paddingOuter?.()??e.padding();return function(e){let a=Math.floor((e-r)/n-i);return t[Math.max(0,Math.min(a,t.length-1))]}}function q(e,t){return V(e)?K(e)(t):e.invert?.(t)}function J(e,t,n,r){let i=e.copy();return t&&i.domain(t),n!=null&&(typeof n==`function`?i.range(n(r)):i.range(n)),i}function Y(e,t,n){let r=null;if(e&&e.length>0&&e.some(e=>e!=null))r=e.filter(e=>e!=null);else if(t&&t.length>0&&n){let e=k(n)(t[0]);r=Array.isArray(e)?e:[e]}if(r){if(r.some(e=>e instanceof Date))return z();if(r.some(e=>typeof e==`number`))return E();if(r.some(e=>typeof e==`string`))return O()}return E()}function X(e){return e===0||e}function Z(e){return X(e)?Array.isArray(e)?t=>e.map(e=>typeof e==`function`?e(t):t[e]):typeof e==`function`?e:t=>t[e]:null}export{W as a,Z as c,N as d,V as i,q as l,J as n,H as o,G as r,U as s,Y as t,z as u};
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{J as e,M as t,P as n,R as r,a as i,bt as a,ht as o,i as s,j as c,k as l,o as u,st as d,yt as f,z as p}from"./pqiPC7Y8.js";import"./xihTtKlq.js";import{t as m}from"./CyncJW0D.js";import{y as h}from"./BAynhd7i.js";import{c as g,t as _}from"./snfmbqby.js";import{n as v,t as y}from"./jO4fmY1N.js";import{n as b,r as x,t as S}from"./CG6rRxUy.js";import{i as C,n as w,r as T,t as E}from"./CZIk93qi.js";import{t as D}from"./BR2LaRms.js";import{o as O,r as ee}from"./B5q6rkQ-.js";import{D as k,_ as A}from"./BGmgUZMc.js";var j=class{constructor(e,t){this._context=e,this._x=t}areaStart(){this._line=0}areaEnd(){this._line=NaN}lineStart(){this._point=0}lineEnd(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line}point(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;default:this._x?this._context.bezierCurveTo(this._x0=(this._x0+e)/2,this._y0,this._x0,t,e,t):this._context.bezierCurveTo(this._x0,this._y0=(this._y0+t)/2,e,this._y0,e,t)}this._x0=e,this._y0=t}},M=class{constructor(e){this._context=e}lineStart(){this._point=0}lineEnd(){}point(e,t){if(e=+e,t=+t,this._point===0)this._point=1;else{let n=D(this._x0,this._y0),r=D(this._x0,this._y0=(this._y0+t)/2),i=D(e,this._y0),a=D(e,t);this._context.moveTo(...n),this._context.bezierCurveTo(...r,...i,...a)}this._x0=e,this._y0=t}};function te(e){return new j(e,!0)}function ne(e){return new j(e,!1)}function N(e){return new M(e)}function P(e){return e.source}function F(e){return e.target}function re(e){let t=P,n=F,r=T,i=C,a=null,o=null,s=y(c);function c(){let c,l=k.call(arguments),u=t.apply(this,l),d=n.apply(this,l);if(a??(o=e(c=s())),o.lineStart(),l[0]=u,o.point(+r.apply(this,l),+i.apply(this,l)),l[0]=d,o.point(+r.apply(this,l),+i.apply(this,l)),o.lineEnd(),c)return o=null,c+``||null}return c.source=function(e){return arguments.length?(t=e,c):t},c.target=function(e){return arguments.length?(n=e,c):n},c.x=function(e){return arguments.length?(r=typeof e==`function`?e:v(+e),c):r},c.y=function(e){return arguments.length?(i=typeof e==`function`?e:v(+e),c):i},c.context=function(t){return arguments.length?(t==null?a=o=null:o=e(a=t),c):a},c}function ie(){let e=re(N);return e.angle=e.x,delete e.x,e.radius=e.y,delete e.y,e}function I(e,t){this._context=e,this._t=t}I.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=this._y=NaN,this._point=0},lineEnd:function(){0<this._t&&this._t<1&&this._point===2&&this._context.lineTo(this._x,this._y),(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line>=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;default:if(this._t<=0)this._context.lineTo(this._x,t),this._context.lineTo(e,t);else{var n=this._x*(1-this._t)+e*this._t;this._context.lineTo(n,this._y),this._context.lineTo(n,t)}}this._x=e,this._y=t}};function L(e){return new I(e,.5)}function R(e){return new I(e,0)}function z(e){return new I(e,1)}function B(e){let{x:t,y:n,r=4,labelPlacement:i=`center`,labelX:a,labelY:o,labelXOffset:s=0,labelYOffset:c=0,fontSize:l=16,labelGap:u=2,link:d=!1,verticalAnchor:f}=e,p=a!=null||o!=null,m=l*.71,h=0,g=0;if(i===`smart`){let e=(a??t)-t,r=(o??n)-n,i=Math.abs(e),s=Math.abs(r);(i>1e-6||s>1e-6)&&(h=i>=s*.4?Math.sign(e):0,g=s>=i*.4?Math.sign(r):0)}else i!==`center`&&(h=i.includes(`left`)?-1:+!!i.includes(`right`),g=i.includes(`top`)?-1:+!!i.includes(`bottom`));let _=Math.hypot(h,g)||1,v=h<0?-1:1,y=g<0?-1:1,b=p?a??t:t+r*h/_+s*v,x=p?o??n:n+r*g/_+c*y,S=d?u:0,C=b-t,w=x-n,T=Math.hypot(C,w)||1,E=S*C/T,D=S*w/T,O=f==null?g>0?m/2:g<0?-m/2:0:0;return{direction:{x:h,y:g},anchor:{x:b,y:x},text:{x:b+E,y:x+D+O,textAnchor:h>0?`start`:h<0?`end`:`middle`,verticalAnchor:`middle`}}}function V(e,t){let{text:n}=B(t);return A(e,n.x,n.y,{textAnchor:n.textAnchor,verticalAnchor:n.verticalAnchor,fontSize:t.fontSize??16})}function H(e,t){return Math.abs(e.x-t.x)<1e-6&&Math.abs(e.y-t.y)<1e-6}function U(e,t){return H(e,t)?``:`M ${e.x} ${e.y} L ${t.x} ${t.y}`}function W(e){return Math.abs(e)<1e-6}function G({source:e,target:t,sweep:n}){return n===`horizontal-vertical`?`M ${e.x} ${e.y} L ${t.x} ${e.y} L ${t.x} ${t.y}`:`M ${e.x} ${e.y} L ${e.x} ${t.y} L ${t.x} ${t.y}`}function K(e){let{radius:t,dx:n,dy:r,source:i,target:a,sweep:o}=e,s=Math.max(0,Math.min(t,Math.abs(n),Math.abs(r)));if(W(s))return G(e);let c=Math.sign(n),l=Math.sign(r);if(o===`horizontal-vertical`){let e={x:a.x-s*c,y:i.y},t={x:a.x,y:i.y+s*l};return`M ${i.x} ${i.y} L ${e.x} ${e.y} L ${t.x} ${t.y} L ${a.x} ${a.y}`}{let e={x:i.x,y:a.y-s*l},t={x:i.x+s*c,y:a.y};return`M ${i.x} ${i.y} L ${e.x} ${e.y} L ${t.x} ${t.y} L ${a.x} ${a.y}`}}function q(e){let{radius:t,dx:n,dy:r,source:i,target:a,sweep:o}=e,s=Math.max(0,Math.min(t,Math.abs(n),Math.abs(r)));if(W(s))return G(e);let c=Math.sign(n),l=Math.sign(r);if(o===`horizontal-vertical`){let e={x:a.x-s*c,y:i.y},t={x:a.x,y:i.y+s*l},n=+(c*l>0);return`M ${i.x} ${i.y} L ${e.x} ${e.y} A ${s} ${s} 0 0 ${n} ${t.x} ${t.y} L ${a.x} ${a.y}`}{let e={x:i.x,y:a.y-s*l},t={x:i.x+s*c,y:a.y},n=c*l>0?0:1;return`M ${i.x} ${i.y} L ${e.x} ${e.y} A ${s} ${s} 0 0 ${n} ${t.x} ${t.y} L ${a.x} ${a.y}`}}function ae({source:e,target:t,dx:n,dy:r,bend:i=22.5}){let a=Math.hypot(n,r),o=i*Math.PI/180;if(Math.abs(o)<1e-6||a<1e-6)return U(e,t);let s=a/(2*Math.sin(Math.abs(o))),c=+(Math.abs(i)>90),l=+(i>0);return`M${e.x},${e.y}A${s},${s} 0 ${c} ${l} ${t.x},${t.y}`}var J={square:G,beveled:K,rounded:q,swoop:ae};function oe(e){let{source:t,target:n,type:r}=e;if(H(t,n))return``;let i=n.x-t.x,a=n.y-t.y;return r===`straight`||r!==`swoop`&&(W(i)||W(a))?U(t,n):(J[r]||J.square)({...e,dx:i,dy:a})}var Y=`M0,0L0,0`;function se({source:e,target:t,sweep:n,curve:r,orientation:i=`horizontal`}){let a=t.x-e.x,o=t.y-e.y;if(i===`vertical`&&n===`none`){let{x:n,y:i}=e,{x:a,y:o}=t;if(r===L){let e=(i+o)/2;return`M${n},${i}L${n},${e}L${a},${e}L${a},${o}`}if(r===R)return`M${n},${i}L${a},${i}L${a},${o}`;if(r===z)return`M${n},${i}L${n},${o}L${a},${o}`}let s=w().curve(r),c=[],l=W(a)||W(o);if(n===`none`||l?c=[[e.x,e.y],[t.x,t.y]]:n===`horizontal-vertical`?c=[[e.x,e.y],[t.x,e.y],[t.x,t.y]]:n===`vertical-horizontal`&&(c=[[e.x,e.y],[e.x,t.y],[t.x,t.y]]),c.length===2&&W(a)&&W(a))return Y;let u=s(c);return!u||u.includes(`NaN`)?Y:u}function X(e,t){let n=e.x-Math.PI/2,r=e.y,i=t.x-Math.PI/2,a=t.y,o=Math.cos(n),s=Math.sin(n),c=Math.cos(i),l=Math.sin(i),u=Math.abs(i-n)>Math.PI?+(i<=n):+(i>n);return{sa:n,sr:r,ta:i,tr:a,sc:o,ss:s,tc:c,ts:l,sx:r*o,sy:r*s,tx:a*c,ty:a*l,sweepFlag:u}}function ce({source:e,target:t,type:n,radius:r,bend:i=22.5}){let{sr:a,ta:o,tr:s,sc:c,ss:l,tc:u,ts:d,sx:f,sy:p,tx:m,ty:h,sweepFlag:g}=X(e,t);if(n===`straight`)return`M${f},${p}L${m},${h}`;if(n===`swoop`){let e=m-f,t=h-p,n=Math.hypot(e,t),r=i*Math.PI/180;if(Math.abs(r)<1e-6||n<1e-6)return`M${f},${p}L${m},${h}`;let a=n/(2*Math.sin(Math.abs(r)));return`M${f},${p}A${a},${a} 0 ${+(Math.abs(i)>90)} ${+(i>0)} ${m},${h}`}if(n===`rounded`){let e=.2,t=m-f,n=h-p,r=e*(t+n),i=e*(n-t);return`M${f},${p}C${f+r},${p+i} ${m+i},${h-r} ${m},${h}`}if(n===`square`){if(a<1e-6)return`M${f},${p}L${m},${h}`;let e=(a+s)/2;return`M${f},${p}L${e*c},${e*l}A${e},${e},0,0,${g},${e*u},${e*d}L${m},${h}`}let _=a*u,v=a*d,y=_-f,b=v-p,x=Math.hypot(y,b);if(x<1e-6)return`M${f},${p}L${m},${h}`;let S=Math.abs(s-a)||1,C=Math.max(0,Math.min(r,x,S)),w=y/x,T=b/x,E=Math.sign(s-a)||1;return`M${f},${p}L${_-C*w},${v-C*T}L${_+E*C*u},${v+E*C*d}L${m},${h}`}function le({source:e,target:t,curve:n}){let{sr:r,tr:i,sc:a,ss:o,tc:s,ts:c,sx:l,sy:u,tx:d,ty:f,sweepFlag:p}=X(e,t);if((n===R||n===z||n===L)&&r<1e-6)return`M${l},${u}L${d},${f}`;if(n===R)return`M${l},${u}A${r},${r},0,0,${p},${r*s},${r*c}L${d},${f}`;if(n===z)return`M${l},${u}L${i*a},${i*o}A${i},${i},0,0,${p},${d},${f}`;if(n===L){let e=(r+i)/2;return`M${l},${u}L${e*a},${e*o}A${e},${e},0,0,${p},${e*s},${e*c}L${d},${f}`}return n?E().curve(n)([[e.x,e.y],[t.x,t.y]])??Y:ie().angle(e=>e.x).radius(e=>e.y)({source:e,target:t})??Y}var Z={x:0,y:0};function Q(e){return typeof e==`string`||typeof e==`function`}var ue=new Set(`$$slots.$$events.$$legacy.Path.x1.y1.x2.y2.data.sankey.source.target.x.y.orientation.curve.type.sweep.radius.bend.radial.marker.markerStart.markerMid.markerEnd.motion.pathRef.pathData.class`.split(`.`));function $(v,y){a(y,!0);let b=m(),S=h(),C=s(y,`sankey`,3,!1),w=s(y,`type`,3,`d3`),T=s(y,`radius`,3,20),E=s(y,`bend`,3,22.5),D=s(y,`pathRef`,15),k=i(y,ue),A=o(()=>y.radial??b.radial??!1),j=o(()=>y.orientation?y.orientation:C()?`horizontal`:`vertical`),M=o(()=>y.curve?y.curve:e(j)===`horizontal`?te:ne),N=o(()=>w()===`d3`?y.sweep??`none`:y.sweep&&y.sweep!==`none`?y.sweep:e(j)===`vertical`?`horizontal-vertical`:`vertical-horizontal`),P=o(()=>Q(y.x1)||Q(y.y1)||Q(y.x2)||Q(y.y2)),F=o(()=>!e(P)&&(typeof y.x1==`number`||typeof y.y1==`number`||typeof y.x2==`number`||typeof y.y2==`number`)),re=o(()=>y.source?y.source:C()?e=>({node:e.source,y:e.y0,isSource:!0}):e=>e.source),ie=o(()=>y.target?y.target:C()?e=>({node:e.target,y:e.y1,isSource:!1}):e=>e.target),I=o(()=>y.x?y.x:C()?e=>e.isSource?e.node.x1:e.node.x0:e(A)?e=>e.x:t=>e(j)===`horizontal`?t.y:t.x),L=o(()=>y.y?y.y:C()||e(A)?e=>e.y:t=>e(j)===`horizontal`?t.x:t.y),R=o(()=>_(y.x1)),z=o(()=>_(y.y1)),B=o(()=>_(y.x2)),V=o(()=>_(y.y2)),H=t=>{let n=e(R)(t),r=e(z)(t),i=e(B)(t),a=e(V)(t),o=typeof y.x1==`string`||typeof y.x1==`function`?b.xScale:null,s=typeof y.y1==`string`||typeof y.y1==`function`?b.yScale:null,c=o&&n!=null?o(n):typeof n==`number`?n:0,l=s&&r!=null?s(r):typeof r==`number`?r:0,u=o&&i!=null?o(i):typeof i==`number`?i:0,d=s&&a!=null?s(a):typeof a==`number`?a:0;return{source:{x:Number.isFinite(c)?c:0,y:Number.isFinite(l)?l:0},target:{x:Number.isFinite(u)?u:0,y:Number.isFinite(d)?d:0}}},U=o(()=>{if(e(F))return{x:typeof y.x1==`number`?y.x1:0,y:typeof y.y1==`number`?y.y1:0};if(!y.data)return Z;try{let t=e(re)(y.data);if(t==null)return Z;let n=e(I)(t),r=e(L)(t);return{x:Number.isFinite(n)?n:0,y:Number.isFinite(r)?r:0}}catch(e){return console.error(`Error accessing source coordinates:`,e,`Data:`,y.data),Z}}),W=o(()=>{if(e(F))return{x:typeof y.x2==`number`?y.x2:100,y:typeof y.y2==`number`?y.y2:100};if(!y.data)return Z;try{let t=e(ie)(y.data);if(t==null)return Z;let n=e(I)(t),r=e(L)(t);return{x:Number.isFinite(n)?n:0,y:Number.isFinite(r)?r:0}}catch(e){return console.error(`Error accessing target coordinates:`,e,`Data:`,y.data),Z}});function G(t,n){return y.pathData?y.pathData:e(A)?w()===`d3`?le({source:t,target:n,curve:e(M)}):ce({source:t,target:n,type:w(),radius:T(),bend:E()}):w()===`d3`?se({source:t,target:n,sweep:e(N),curve:e(M),orientation:e(j)}):oe({source:t,target:n,sweep:e(N),type:w(),radius:T(),bend:E()})}let K=o(()=>e(P)?``:G(e(U),e(W))),q=O(y.motion),ae=q?{type:q.type,options:{interpolate:x,...q.options}}:void 0,J=ee(``,()=>e(K),ae),Y=()=>J.current,X=o(()=>e(P)?S(y.data):[]);function $(e,t){return typeof e==`function`?e(t):e}function de(e){return $(y.class,e)}let fe=o(()=>y.stroke),pe=o(()=>y.fill),me=o(()=>k[`stroke-width`]??y.strokeWidth);var he=p(),ge=d(he),_e=n=>{var i=p(),a=d(i);c(a,17,()=>e(X),t,(t,n)=>{let i=o(()=>H(e(n))),a=o(()=>$(e(fe),e(n))??(b.config.c?b.cGet(e(n)):void 0));var s=p(),c=d(s);{let t=o(()=>G(e(i).source,e(i).target)),r=o(()=>$(e(pe),e(n))),s=o(()=>$(e(me),e(n))),d=o(()=>g(`lc-link`,de(e(n))));l(c,()=>y.Path,(n,i)=>{i(n,u({get pathData(){return e(t)},get marker(){return y.marker},get markerStart(){return y.markerStart},get markerMid(){return y.markerMid},get markerEnd(){return y.markerEnd}},()=>k,{get stroke(){return e(a)},get fill(){return e(r)},get"stroke-width"(){return e(s)},get class(){return e(d)}}))})}r(t,s)}),r(n,i)},ve=t=>{var n=p(),i=d(n);{let t=o(()=>g(`lc-link`,typeof y.class==`string`?y.class:void 0));l(i,()=>y.Path,(n,r)=>{r(n,u({pathData:Y,get marker(){return y.marker},get markerStart(){return y.markerStart},get markerMid(){return y.markerMid},get markerEnd(){return y.markerEnd}},()=>k,{get class(){return e(t)},get pathRef(){return D()},set pathRef(e){D(e)}}))})}r(t,n)};n(ge,t=>{e(P)?t(_e):t(ve,-1)}),r(v,he),f()}var de=new Set([`$$slots`,`$$events`,`$$legacy`,`pathRef`]);function fe(e,t){a(t,!0);let n=s(t,`pathRef`,15),r=i(t,de);$(e,u({get Path(){return b}},()=>r,{get pathRef(){return n()},set pathRef(e){n(e)}})),f()}var pe=new Set([`$$slots`,`$$events`,`$$legacy`]);function me(e,t){let n=i(t,pe);$(e,u({get Path(){return S}},()=>n))}export{V as i,fe as n,B as r,me as t};
|
|
1
|
+
import{J as e,M as t,P as n,R as r,a as i,bt as a,ht as o,i as s,j as c,k as l,o as u,st as d,yt as f,z as p}from"./pqiPC7Y8.js";import"./xihTtKlq.js";import{t as m}from"./CIDBs8t6.js";import{y as h}from"./DWm-CGbg.js";import{c as g,t as _}from"./sf5kQ3yV.js";import{n as v,t as y}from"./KA1QvXmu.js";import{n as b,r as x,t as S}from"./Dc9It0QB.js";import{i as C,n as w,r as T,t as E}from"./D0IrjYE5.js";import{t as D}from"./BR2LaRms.js";import{o as O,r as ee}from"./BNDRPiSt.js";import{D as k,_ as A}from"./F4LqKrLs.js";var j=class{constructor(e,t){this._context=e,this._x=t}areaStart(){this._line=0}areaEnd(){this._line=NaN}lineStart(){this._point=0}lineEnd(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line}point(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;default:this._x?this._context.bezierCurveTo(this._x0=(this._x0+e)/2,this._y0,this._x0,t,e,t):this._context.bezierCurveTo(this._x0,this._y0=(this._y0+t)/2,e,this._y0,e,t)}this._x0=e,this._y0=t}},M=class{constructor(e){this._context=e}lineStart(){this._point=0}lineEnd(){}point(e,t){if(e=+e,t=+t,this._point===0)this._point=1;else{let n=D(this._x0,this._y0),r=D(this._x0,this._y0=(this._y0+t)/2),i=D(e,this._y0),a=D(e,t);this._context.moveTo(...n),this._context.bezierCurveTo(...r,...i,...a)}this._x0=e,this._y0=t}};function te(e){return new j(e,!0)}function ne(e){return new j(e,!1)}function N(e){return new M(e)}function P(e){return e.source}function F(e){return e.target}function re(e){let t=P,n=F,r=T,i=C,a=null,o=null,s=y(c);function c(){let c,l=k.call(arguments),u=t.apply(this,l),d=n.apply(this,l);if(a??(o=e(c=s())),o.lineStart(),l[0]=u,o.point(+r.apply(this,l),+i.apply(this,l)),l[0]=d,o.point(+r.apply(this,l),+i.apply(this,l)),o.lineEnd(),c)return o=null,c+``||null}return c.source=function(e){return arguments.length?(t=e,c):t},c.target=function(e){return arguments.length?(n=e,c):n},c.x=function(e){return arguments.length?(r=typeof e==`function`?e:v(+e),c):r},c.y=function(e){return arguments.length?(i=typeof e==`function`?e:v(+e),c):i},c.context=function(t){return arguments.length?(t==null?a=o=null:o=e(a=t),c):a},c}function ie(){let e=re(N);return e.angle=e.x,delete e.x,e.radius=e.y,delete e.y,e}function I(e,t){this._context=e,this._t=t}I.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=this._y=NaN,this._point=0},lineEnd:function(){0<this._t&&this._t<1&&this._point===2&&this._context.lineTo(this._x,this._y),(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line>=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;default:if(this._t<=0)this._context.lineTo(this._x,t),this._context.lineTo(e,t);else{var n=this._x*(1-this._t)+e*this._t;this._context.lineTo(n,this._y),this._context.lineTo(n,t)}}this._x=e,this._y=t}};function L(e){return new I(e,.5)}function R(e){return new I(e,0)}function z(e){return new I(e,1)}function B(e){let{x:t,y:n,r=4,labelPlacement:i=`center`,labelX:a,labelY:o,labelXOffset:s=0,labelYOffset:c=0,fontSize:l=16,labelGap:u=2,link:d=!1,verticalAnchor:f}=e,p=a!=null||o!=null,m=l*.71,h=0,g=0;if(i===`smart`){let e=(a??t)-t,r=(o??n)-n,i=Math.abs(e),s=Math.abs(r);(i>1e-6||s>1e-6)&&(h=i>=s*.4?Math.sign(e):0,g=s>=i*.4?Math.sign(r):0)}else i!==`center`&&(h=i.includes(`left`)?-1:+!!i.includes(`right`),g=i.includes(`top`)?-1:+!!i.includes(`bottom`));let _=Math.hypot(h,g)||1,v=h<0?-1:1,y=g<0?-1:1,b=p?a??t:t+r*h/_+s*v,x=p?o??n:n+r*g/_+c*y,S=d?u:0,C=b-t,w=x-n,T=Math.hypot(C,w)||1,E=S*C/T,D=S*w/T,O=f==null?g>0?m/2:g<0?-m/2:0:0;return{direction:{x:h,y:g},anchor:{x:b,y:x},text:{x:b+E,y:x+D+O,textAnchor:h>0?`start`:h<0?`end`:`middle`,verticalAnchor:`middle`}}}function V(e,t){let{text:n}=B(t);return A(e,n.x,n.y,{textAnchor:n.textAnchor,verticalAnchor:n.verticalAnchor,fontSize:t.fontSize??16})}function H(e,t){return Math.abs(e.x-t.x)<1e-6&&Math.abs(e.y-t.y)<1e-6}function U(e,t){return H(e,t)?``:`M ${e.x} ${e.y} L ${t.x} ${t.y}`}function W(e){return Math.abs(e)<1e-6}function G({source:e,target:t,sweep:n}){return n===`horizontal-vertical`?`M ${e.x} ${e.y} L ${t.x} ${e.y} L ${t.x} ${t.y}`:`M ${e.x} ${e.y} L ${e.x} ${t.y} L ${t.x} ${t.y}`}function K(e){let{radius:t,dx:n,dy:r,source:i,target:a,sweep:o}=e,s=Math.max(0,Math.min(t,Math.abs(n),Math.abs(r)));if(W(s))return G(e);let c=Math.sign(n),l=Math.sign(r);if(o===`horizontal-vertical`){let e={x:a.x-s*c,y:i.y},t={x:a.x,y:i.y+s*l};return`M ${i.x} ${i.y} L ${e.x} ${e.y} L ${t.x} ${t.y} L ${a.x} ${a.y}`}{let e={x:i.x,y:a.y-s*l},t={x:i.x+s*c,y:a.y};return`M ${i.x} ${i.y} L ${e.x} ${e.y} L ${t.x} ${t.y} L ${a.x} ${a.y}`}}function q(e){let{radius:t,dx:n,dy:r,source:i,target:a,sweep:o}=e,s=Math.max(0,Math.min(t,Math.abs(n),Math.abs(r)));if(W(s))return G(e);let c=Math.sign(n),l=Math.sign(r);if(o===`horizontal-vertical`){let e={x:a.x-s*c,y:i.y},t={x:a.x,y:i.y+s*l},n=+(c*l>0);return`M ${i.x} ${i.y} L ${e.x} ${e.y} A ${s} ${s} 0 0 ${n} ${t.x} ${t.y} L ${a.x} ${a.y}`}{let e={x:i.x,y:a.y-s*l},t={x:i.x+s*c,y:a.y},n=c*l>0?0:1;return`M ${i.x} ${i.y} L ${e.x} ${e.y} A ${s} ${s} 0 0 ${n} ${t.x} ${t.y} L ${a.x} ${a.y}`}}function ae({source:e,target:t,dx:n,dy:r,bend:i=22.5}){let a=Math.hypot(n,r),o=i*Math.PI/180;if(Math.abs(o)<1e-6||a<1e-6)return U(e,t);let s=a/(2*Math.sin(Math.abs(o))),c=+(Math.abs(i)>90),l=+(i>0);return`M${e.x},${e.y}A${s},${s} 0 ${c} ${l} ${t.x},${t.y}`}var J={square:G,beveled:K,rounded:q,swoop:ae};function oe(e){let{source:t,target:n,type:r}=e;if(H(t,n))return``;let i=n.x-t.x,a=n.y-t.y;return r===`straight`||r!==`swoop`&&(W(i)||W(a))?U(t,n):(J[r]||J.square)({...e,dx:i,dy:a})}var Y=`M0,0L0,0`;function se({source:e,target:t,sweep:n,curve:r,orientation:i=`horizontal`}){let a=t.x-e.x,o=t.y-e.y;if(i===`vertical`&&n===`none`){let{x:n,y:i}=e,{x:a,y:o}=t;if(r===L){let e=(i+o)/2;return`M${n},${i}L${n},${e}L${a},${e}L${a},${o}`}if(r===R)return`M${n},${i}L${a},${i}L${a},${o}`;if(r===z)return`M${n},${i}L${n},${o}L${a},${o}`}let s=w().curve(r),c=[],l=W(a)||W(o);if(n===`none`||l?c=[[e.x,e.y],[t.x,t.y]]:n===`horizontal-vertical`?c=[[e.x,e.y],[t.x,e.y],[t.x,t.y]]:n===`vertical-horizontal`&&(c=[[e.x,e.y],[e.x,t.y],[t.x,t.y]]),c.length===2&&W(a)&&W(a))return Y;let u=s(c);return!u||u.includes(`NaN`)?Y:u}function X(e,t){let n=e.x-Math.PI/2,r=e.y,i=t.x-Math.PI/2,a=t.y,o=Math.cos(n),s=Math.sin(n),c=Math.cos(i),l=Math.sin(i),u=Math.abs(i-n)>Math.PI?+(i<=n):+(i>n);return{sa:n,sr:r,ta:i,tr:a,sc:o,ss:s,tc:c,ts:l,sx:r*o,sy:r*s,tx:a*c,ty:a*l,sweepFlag:u}}function ce({source:e,target:t,type:n,radius:r,bend:i=22.5}){let{sr:a,ta:o,tr:s,sc:c,ss:l,tc:u,ts:d,sx:f,sy:p,tx:m,ty:h,sweepFlag:g}=X(e,t);if(n===`straight`)return`M${f},${p}L${m},${h}`;if(n===`swoop`){let e=m-f,t=h-p,n=Math.hypot(e,t),r=i*Math.PI/180;if(Math.abs(r)<1e-6||n<1e-6)return`M${f},${p}L${m},${h}`;let a=n/(2*Math.sin(Math.abs(r)));return`M${f},${p}A${a},${a} 0 ${+(Math.abs(i)>90)} ${+(i>0)} ${m},${h}`}if(n===`rounded`){let e=.2,t=m-f,n=h-p,r=e*(t+n),i=e*(n-t);return`M${f},${p}C${f+r},${p+i} ${m+i},${h-r} ${m},${h}`}if(n===`square`){if(a<1e-6)return`M${f},${p}L${m},${h}`;let e=(a+s)/2;return`M${f},${p}L${e*c},${e*l}A${e},${e},0,0,${g},${e*u},${e*d}L${m},${h}`}let _=a*u,v=a*d,y=_-f,b=v-p,x=Math.hypot(y,b);if(x<1e-6)return`M${f},${p}L${m},${h}`;let S=Math.abs(s-a)||1,C=Math.max(0,Math.min(r,x,S)),w=y/x,T=b/x,E=Math.sign(s-a)||1;return`M${f},${p}L${_-C*w},${v-C*T}L${_+E*C*u},${v+E*C*d}L${m},${h}`}function le({source:e,target:t,curve:n}){let{sr:r,tr:i,sc:a,ss:o,tc:s,ts:c,sx:l,sy:u,tx:d,ty:f,sweepFlag:p}=X(e,t);if((n===R||n===z||n===L)&&r<1e-6)return`M${l},${u}L${d},${f}`;if(n===R)return`M${l},${u}A${r},${r},0,0,${p},${r*s},${r*c}L${d},${f}`;if(n===z)return`M${l},${u}L${i*a},${i*o}A${i},${i},0,0,${p},${d},${f}`;if(n===L){let e=(r+i)/2;return`M${l},${u}L${e*a},${e*o}A${e},${e},0,0,${p},${e*s},${e*c}L${d},${f}`}return n?E().curve(n)([[e.x,e.y],[t.x,t.y]])??Y:ie().angle(e=>e.x).radius(e=>e.y)({source:e,target:t})??Y}var Z={x:0,y:0};function Q(e){return typeof e==`string`||typeof e==`function`}var ue=new Set(`$$slots.$$events.$$legacy.Path.x1.y1.x2.y2.data.sankey.source.target.x.y.orientation.curve.type.sweep.radius.bend.radial.marker.markerStart.markerMid.markerEnd.motion.pathRef.pathData.class`.split(`.`));function $(v,y){a(y,!0);let b=m(),S=h(),C=s(y,`sankey`,3,!1),w=s(y,`type`,3,`d3`),T=s(y,`radius`,3,20),E=s(y,`bend`,3,22.5),D=s(y,`pathRef`,15),k=i(y,ue),A=o(()=>y.radial??b.radial??!1),j=o(()=>y.orientation?y.orientation:C()?`horizontal`:`vertical`),M=o(()=>y.curve?y.curve:e(j)===`horizontal`?te:ne),N=o(()=>w()===`d3`?y.sweep??`none`:y.sweep&&y.sweep!==`none`?y.sweep:e(j)===`vertical`?`horizontal-vertical`:`vertical-horizontal`),P=o(()=>Q(y.x1)||Q(y.y1)||Q(y.x2)||Q(y.y2)),F=o(()=>!e(P)&&(typeof y.x1==`number`||typeof y.y1==`number`||typeof y.x2==`number`||typeof y.y2==`number`)),re=o(()=>y.source?y.source:C()?e=>({node:e.source,y:e.y0,isSource:!0}):e=>e.source),ie=o(()=>y.target?y.target:C()?e=>({node:e.target,y:e.y1,isSource:!1}):e=>e.target),I=o(()=>y.x?y.x:C()?e=>e.isSource?e.node.x1:e.node.x0:e(A)?e=>e.x:t=>e(j)===`horizontal`?t.y:t.x),L=o(()=>y.y?y.y:C()||e(A)?e=>e.y:t=>e(j)===`horizontal`?t.x:t.y),R=o(()=>_(y.x1)),z=o(()=>_(y.y1)),B=o(()=>_(y.x2)),V=o(()=>_(y.y2)),H=t=>{let n=e(R)(t),r=e(z)(t),i=e(B)(t),a=e(V)(t),o=typeof y.x1==`string`||typeof y.x1==`function`?b.xScale:null,s=typeof y.y1==`string`||typeof y.y1==`function`?b.yScale:null,c=o&&n!=null?o(n):typeof n==`number`?n:0,l=s&&r!=null?s(r):typeof r==`number`?r:0,u=o&&i!=null?o(i):typeof i==`number`?i:0,d=s&&a!=null?s(a):typeof a==`number`?a:0;return{source:{x:Number.isFinite(c)?c:0,y:Number.isFinite(l)?l:0},target:{x:Number.isFinite(u)?u:0,y:Number.isFinite(d)?d:0}}},U=o(()=>{if(e(F))return{x:typeof y.x1==`number`?y.x1:0,y:typeof y.y1==`number`?y.y1:0};if(!y.data)return Z;try{let t=e(re)(y.data);if(t==null)return Z;let n=e(I)(t),r=e(L)(t);return{x:Number.isFinite(n)?n:0,y:Number.isFinite(r)?r:0}}catch(e){return console.error(`Error accessing source coordinates:`,e,`Data:`,y.data),Z}}),W=o(()=>{if(e(F))return{x:typeof y.x2==`number`?y.x2:100,y:typeof y.y2==`number`?y.y2:100};if(!y.data)return Z;try{let t=e(ie)(y.data);if(t==null)return Z;let n=e(I)(t),r=e(L)(t);return{x:Number.isFinite(n)?n:0,y:Number.isFinite(r)?r:0}}catch(e){return console.error(`Error accessing target coordinates:`,e,`Data:`,y.data),Z}});function G(t,n){return y.pathData?y.pathData:e(A)?w()===`d3`?le({source:t,target:n,curve:e(M)}):ce({source:t,target:n,type:w(),radius:T(),bend:E()}):w()===`d3`?se({source:t,target:n,sweep:e(N),curve:e(M),orientation:e(j)}):oe({source:t,target:n,sweep:e(N),type:w(),radius:T(),bend:E()})}let K=o(()=>e(P)?``:G(e(U),e(W))),q=O(y.motion),ae=q?{type:q.type,options:{interpolate:x,...q.options}}:void 0,J=ee(``,()=>e(K),ae),Y=()=>J.current,X=o(()=>e(P)?S(y.data):[]);function $(e,t){return typeof e==`function`?e(t):e}function de(e){return $(y.class,e)}let fe=o(()=>y.stroke),pe=o(()=>y.fill),me=o(()=>k[`stroke-width`]??y.strokeWidth);var he=p(),ge=d(he),_e=n=>{var i=p(),a=d(i);c(a,17,()=>e(X),t,(t,n)=>{let i=o(()=>H(e(n))),a=o(()=>$(e(fe),e(n))??(b.config.c?b.cGet(e(n)):void 0));var s=p(),c=d(s);{let t=o(()=>G(e(i).source,e(i).target)),r=o(()=>$(e(pe),e(n))),s=o(()=>$(e(me),e(n))),d=o(()=>g(`lc-link`,de(e(n))));l(c,()=>y.Path,(n,i)=>{i(n,u({get pathData(){return e(t)},get marker(){return y.marker},get markerStart(){return y.markerStart},get markerMid(){return y.markerMid},get markerEnd(){return y.markerEnd}},()=>k,{get stroke(){return e(a)},get fill(){return e(r)},get"stroke-width"(){return e(s)},get class(){return e(d)}}))})}r(t,s)}),r(n,i)},ve=t=>{var n=p(),i=d(n);{let t=o(()=>g(`lc-link`,typeof y.class==`string`?y.class:void 0));l(i,()=>y.Path,(n,r)=>{r(n,u({pathData:Y,get marker(){return y.marker},get markerStart(){return y.markerStart},get markerMid(){return y.markerMid},get markerEnd(){return y.markerEnd}},()=>k,{get class(){return e(t)},get pathRef(){return D()},set pathRef(e){D(e)}}))})}r(t,n)};n(ge,t=>{e(P)?t(_e):t(ve,-1)}),r(v,he),f()}var de=new Set([`$$slots`,`$$events`,`$$legacy`,`pathRef`]);function fe(e,t){a(t,!0);let n=s(t,`pathRef`,15),r=i(t,de);$(e,u({get Path(){return b}},()=>r,{get pathRef(){return n()},set pathRef(e){n(e)}})),f()}var pe=new Set([`$$slots`,`$$events`,`$$legacy`]);function me(e,t){let n=i(t,pe);$(e,u({get Path(){return S}},()=>n))}export{V as i,fe as n,B as r,me as t};
|