@invisibleloop/pulse 0.20.11 → 0.20.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (266) hide show
  1. package/package.json +6 -5
  2. package/public/.pulse-ui-version +1 -1
  3. package/scripts/build.js +26 -0
  4. package/scripts/release-version.js +17 -8
  5. package/scripts/strip-server.test.js +60 -0
  6. package/src/agent/checklist.md +8 -12
  7. package/src/agent/commands/pulse-start.md +2 -0
  8. package/src/agent/commands/verify.md +30 -8
  9. package/src/agent/guide-components.md +7 -25
  10. package/src/agent/guide-routing.md +0 -12
  11. package/src/agent/guide-server.md +102 -1
  12. package/src/agent/guide-spec.md +8 -1
  13. package/src/agent/guide-styles.md +23 -0
  14. package/src/agent/identity.md +9 -0
  15. package/src/agent/workflow.md +4 -23
  16. package/src/cli/check-bundles.js +113 -0
  17. package/src/cli/check-bundles.test.js +137 -0
  18. package/src/cli/cli.test.js +105 -0
  19. package/src/cli/dev.js +48 -3
  20. package/src/cli/diagnose.js +105 -0
  21. package/src/cli/diagnose.test.js +124 -0
  22. package/src/cli/discover.js +9 -2
  23. package/src/cli/index.js +171 -9
  24. package/src/cli/process-utils.js +57 -0
  25. package/src/cli/process-utils.test.js +114 -0
  26. package/src/cli/review.js +391 -0
  27. package/src/cli/review.test.js +143 -0
  28. package/src/cli/scaffold.js +9 -4
  29. package/src/cli/stamp.js +102 -0
  30. package/src/cli/stamp.test.js +149 -0
  31. package/src/cli/start.js +15 -2
  32. package/src/cli/validate.js +184 -0
  33. package/src/cli/validate.test.js +153 -0
  34. package/src/mcp/mcp.test.js +261 -30
  35. package/src/mcp/server.js +207 -515
  36. package/src/mcp/validate-worker.js +18 -1
  37. package/src/runtime/index.js +144 -11
  38. package/src/runtime/runtime.test.js +199 -0
  39. package/src/runtime/ssr.js +13 -6
  40. package/src/runtime/ssr.test.js +31 -0
  41. package/src/server/index.js +162 -9
  42. package/src/server/server.test.js +225 -2
  43. package/src/spec/schema.js +1 -1
  44. package/src/ui/index.js +0 -5
  45. package/src/ui/ui.test.js +0 -75
  46. package/types/ui.d.ts +0 -21
  47. package/.claude/commands/build-page.md +0 -63
  48. package/.claude/commands/new-doc-page.md +0 -45
  49. package/.claude/commands/pulse-start.md +0 -11
  50. package/.claude/commands/pulse-stop.md +0 -5
  51. package/.claude/commands/verify.md +0 -118
  52. package/.claude/pulse-checklist.md +0 -189
  53. package/.github/workflows/ci.yml +0 -25
  54. package/.github/workflows/publish.yml +0 -45
  55. package/.pulse/load-reports/home/1773432711417.json +0 -22
  56. package/.pulse-verified +0 -1
  57. package/AGENTS.md +0 -697
  58. package/CLAUDE.md +0 -697
  59. package/README.md +0 -95
  60. package/benchmark/public/dist/counter.boot-PO6SNSJZ.js +0 -8
  61. package/benchmark/public/dist/home.boot-YK6VAEQI.js +0 -6
  62. package/benchmark/public/dist/manifest.json +0 -5
  63. package/benchmark/public/dist/runtime-5Y7ESAIB.js +0 -2
  64. package/benchmark/public/dist/runtime-KO4BHUQ3.js +0 -49
  65. package/benchmark/results/2026-03-27-09-20.json +0 -188
  66. package/benchmark/results/2026-03-27-09-21.json +0 -188
  67. package/benchmark/results/2026-03-27-09-29.json +0 -188
  68. package/benchmark/results/2026-03-27-10-14.json +0 -188
  69. package/benchmark/results/2026-03-27-10-18.json +0 -232
  70. package/benchmark/src/pages/counter.js +0 -37
  71. package/benchmark/src/pages/home.js +0 -21
  72. package/docs/.claude/commands/pulse-build.md +0 -7
  73. package/docs/.claude/commands/pulse-dev.md +0 -7
  74. package/docs/.claude/commands/pulse-start.md +0 -9
  75. package/docs/.claude/commands/pulse-stop.md +0 -5
  76. package/docs/.claude/commands/verify.md +0 -84
  77. package/docs/.claude/coverage-check.js +0 -196
  78. package/docs/.claude/pulse-checklist.md +0 -189
  79. package/docs/public/.pulse-ui-version +0 -1
  80. package/docs/public/andypixel.css +0 -237
  81. package/docs/public/bookworms.css +0 -422
  82. package/docs/public/coutumes.css +0 -561
  83. package/docs/public/docs.css +0 -2388
  84. package/docs/public/favicon.svg +0 -4
  85. package/docs/public/home-brut.css +0 -982
  86. package/docs/public/images/bookworms/hero-books.jpg +0 -0
  87. package/docs/public/images/bookworms/how-we-read-now.jpg +0 -0
  88. package/docs/public/images/bookworms/lantern-keepers.jpg +0 -0
  89. package/docs/public/images/bookworms/provincial-bookseller.jpg +0 -0
  90. package/docs/public/images/journey/178.jpg +0 -0
  91. package/docs/public/images/journey/29.jpg +0 -0
  92. package/docs/public/images/retrowheels/hero.jpg +0 -0
  93. package/docs/public/images/shop/devbook-pro.jpg +0 -0
  94. package/docs/public/images/suzukibento/1015.jpg +0 -0
  95. package/docs/public/images/suzukibento/1025.jpg +0 -0
  96. package/docs/public/images/suzukibento/1043.jpg +0 -0
  97. package/docs/public/images/suzukibento/1059.jpg +0 -0
  98. package/docs/public/images/suzukibento/1062.jpg +0 -0
  99. package/docs/public/images/suzukibento/1084.jpg +0 -0
  100. package/docs/public/images/swish/1469334031218-e382a71b716b.jpg +0 -0
  101. package/docs/public/images/swish/1483985988355-763728e1935b.jpg +0 -0
  102. package/docs/public/images/swish/1485518882345-15568b007407.jpg +0 -0
  103. package/docs/public/images/swish/1490481651871-ab68de25d43d.jpg +0 -0
  104. package/docs/public/images/swish/1496747611176-843222e1e57c.jpg +0 -0
  105. package/docs/public/images/swish/1502716119720-b23a93e5fe1b.jpg +0 -0
  106. package/docs/public/images/swish/1539109136881-3be0616acf4b.jpg +0 -0
  107. package/docs/public/images/swish/1551803091-e20673f15770.jpg +0 -0
  108. package/docs/public/images/swish/1558769132-cb1aea458c5e.jpg +0 -0
  109. package/docs/public/images/swish/1572804013309-59a88b7e92f1.jpg +0 -0
  110. package/docs/public/img/heic1501a.jpg +0 -0
  111. package/docs/public/img/placeholder-landscape.svg +0 -18
  112. package/docs/public/img/placeholder-square.svg +0 -14
  113. package/docs/public/img/placeholder-tall.svg +0 -22
  114. package/docs/public/journey.css +0 -528
  115. package/docs/public/menu.js +0 -327
  116. package/docs/public/pulse-ui.css +0 -3028
  117. package/docs/public/pulse-ui.js +0 -257
  118. package/docs/public/retrowheels.css +0 -425
  119. package/docs/public/shop.css +0 -269
  120. package/docs/public/sparkys.css +0 -382
  121. package/docs/public/suzukibento.css +0 -517
  122. package/docs/public/swish.css +0 -394
  123. package/docs/public/theme.css +0 -52
  124. package/docs/public/themes/lumio.css +0 -50
  125. package/docs/public/themes/observatory.css +0 -104
  126. package/docs/server.js +0 -161
  127. package/docs/src/lib/component-page.js +0 -49
  128. package/docs/src/lib/highlight.js +0 -2
  129. package/docs/src/lib/layout.js +0 -190
  130. package/docs/src/lib/metrics-store.js +0 -6
  131. package/docs/src/lib/nav.js +0 -171
  132. package/docs/src/lib/stats.js +0 -81
  133. package/docs/src/pages/accessibility.js +0 -157
  134. package/docs/src/pages/actions.js +0 -194
  135. package/docs/src/pages/auth.js +0 -176
  136. package/docs/src/pages/caching.js +0 -95
  137. package/docs/src/pages/components/accordion.js +0 -48
  138. package/docs/src/pages/components/alert.js +0 -35
  139. package/docs/src/pages/components/app-badge.js +0 -41
  140. package/docs/src/pages/components/avatar.js +0 -35
  141. package/docs/src/pages/components/badge.js +0 -36
  142. package/docs/src/pages/components/breadcrumbs.js +0 -94
  143. package/docs/src/pages/components/button.js +0 -84
  144. package/docs/src/pages/components/card.js +0 -225
  145. package/docs/src/pages/components/charts.js +0 -283
  146. package/docs/src/pages/components/checkbox.js +0 -129
  147. package/docs/src/pages/components/cluster.js +0 -47
  148. package/docs/src/pages/components/container.js +0 -40
  149. package/docs/src/pages/components/cta.js +0 -54
  150. package/docs/src/pages/components/divider.js +0 -37
  151. package/docs/src/pages/components/empty.js +0 -36
  152. package/docs/src/pages/components/feature.js +0 -60
  153. package/docs/src/pages/components/fieldset.js +0 -65
  154. package/docs/src/pages/components/fileupload.js +0 -128
  155. package/docs/src/pages/components/footer.js +0 -58
  156. package/docs/src/pages/components/grid.js +0 -169
  157. package/docs/src/pages/components/heading.js +0 -107
  158. package/docs/src/pages/components/hero.js +0 -123
  159. package/docs/src/pages/components/icons.js +0 -410
  160. package/docs/src/pages/components/image.js +0 -71
  161. package/docs/src/pages/components/input.js +0 -51
  162. package/docs/src/pages/components/media.js +0 -51
  163. package/docs/src/pages/components/modal.js +0 -111
  164. package/docs/src/pages/components/nav.js +0 -136
  165. package/docs/src/pages/components/phone-frame.js +0 -74
  166. package/docs/src/pages/components/progress.js +0 -102
  167. package/docs/src/pages/components/prose.js +0 -111
  168. package/docs/src/pages/components/pullquote.js +0 -71
  169. package/docs/src/pages/components/radio.js +0 -194
  170. package/docs/src/pages/components/rating.js +0 -106
  171. package/docs/src/pages/components/search.js +0 -61
  172. package/docs/src/pages/components/section.js +0 -98
  173. package/docs/src/pages/components/segmented.js +0 -121
  174. package/docs/src/pages/components/select.js +0 -45
  175. package/docs/src/pages/components/slider.js +0 -115
  176. package/docs/src/pages/components/spinner.js +0 -73
  177. package/docs/src/pages/components/stack.js +0 -48
  178. package/docs/src/pages/components/stat.js +0 -55
  179. package/docs/src/pages/components/stepper.js +0 -66
  180. package/docs/src/pages/components/table.js +0 -45
  181. package/docs/src/pages/components/textarea.js +0 -31
  182. package/docs/src/pages/components/toggle.js +0 -84
  183. package/docs/src/pages/components/tooltip.js +0 -48
  184. package/docs/src/pages/components.js +0 -200
  185. package/docs/src/pages/config.js +0 -193
  186. package/docs/src/pages/constraints.js +0 -100
  187. package/docs/src/pages/deploy.js +0 -233
  188. package/docs/src/pages/error-pages.js +0 -99
  189. package/docs/src/pages/extending.js +0 -198
  190. package/docs/src/pages/faq.js +0 -99
  191. package/docs/src/pages/forms.js +0 -129
  192. package/docs/src/pages/getting-started.js +0 -147
  193. package/docs/src/pages/guard.js +0 -120
  194. package/docs/src/pages/home.js +0 -350
  195. package/docs/src/pages/how-it-works.js +0 -244
  196. package/docs/src/pages/hydration.js +0 -108
  197. package/docs/src/pages/images.js +0 -120
  198. package/docs/src/pages/markdown.js +0 -156
  199. package/docs/src/pages/meta.js +0 -193
  200. package/docs/src/pages/mutations.js +0 -107
  201. package/docs/src/pages/navigation.js +0 -85
  202. package/docs/src/pages/performance.js +0 -157
  203. package/docs/src/pages/persist.js +0 -89
  204. package/docs/src/pages/project-structure.js +0 -91
  205. package/docs/src/pages/prompt-examples.js +0 -186
  206. package/docs/src/pages/raw-responses.js +0 -122
  207. package/docs/src/pages/routing.js +0 -120
  208. package/docs/src/pages/server-api.js +0 -291
  209. package/docs/src/pages/server-data.js +0 -203
  210. package/docs/src/pages/slash-commands.js +0 -55
  211. package/docs/src/pages/spec.js +0 -207
  212. package/docs/src/pages/state.js +0 -102
  213. package/docs/src/pages/store.js +0 -203
  214. package/docs/src/pages/streaming.js +0 -107
  215. package/docs/src/pages/stripe.js +0 -194
  216. package/docs/src/pages/supabase.js +0 -324
  217. package/docs/src/pages/templates/andypixel.js +0 -260
  218. package/docs/src/pages/templates/blog-post.js +0 -226
  219. package/docs/src/pages/templates/bookworms.js +0 -227
  220. package/docs/src/pages/templates/coutumes.js +0 -237
  221. package/docs/src/pages/templates/journey.js +0 -186
  222. package/docs/src/pages/templates/mobile-app.js +0 -371
  223. package/docs/src/pages/templates/retrowheels.js +0 -355
  224. package/docs/src/pages/templates/shop.js +0 -268
  225. package/docs/src/pages/templates/sparkys.js +0 -264
  226. package/docs/src/pages/templates/suzukibento.js +0 -200
  227. package/docs/src/pages/templates/swish.js +0 -313
  228. package/docs/src/pages/templates.js +0 -534
  229. package/docs/src/pages/testing.js +0 -199
  230. package/docs/src/pages/validation.js +0 -138
  231. package/examples/.claude/commands/pulse-build.md +0 -7
  232. package/examples/.claude/commands/pulse-dev.md +0 -7
  233. package/examples/.claude/commands/pulse-start.md +0 -9
  234. package/examples/.claude/commands/pulse-stop.md +0 -5
  235. package/examples/.claude/commands/verify.md +0 -84
  236. package/examples/.claude/coverage-check.js +0 -196
  237. package/examples/.claude/pulse-checklist.md +0 -189
  238. package/examples/andypixel.css +0 -237
  239. package/examples/andypixel.js +0 -258
  240. package/examples/bookworms.css +0 -422
  241. package/examples/bookworms.js +0 -225
  242. package/examples/contact.js +0 -166
  243. package/examples/counter.js +0 -94
  244. package/examples/dev.server.js +0 -110
  245. package/examples/examples.test.js +0 -394
  246. package/examples/journey.css +0 -528
  247. package/examples/journey.js +0 -186
  248. package/examples/pricing.js +0 -262
  249. package/examples/products.js +0 -190
  250. package/examples/public/.pulse-ui-version +0 -1
  251. package/examples/public/pulse-ui.css +0 -3028
  252. package/examples/public/pulse-ui.js +0 -257
  253. package/examples/quiz.js +0 -208
  254. package/examples/retrowheels.css +0 -425
  255. package/examples/retrowheels.js +0 -353
  256. package/examples/shared.js +0 -84
  257. package/examples/suzukibento.css +0 -513
  258. package/examples/suzukibento.js +0 -200
  259. package/examples/swish.css +0 -394
  260. package/examples/swish.js +0 -311
  261. package/examples/todos.js +0 -162
  262. package/src/ui/fieldset.js +0 -37
  263. package/src/ui/phone-frame.js +0 -40
  264. package/src/ui/search.js +0 -78
  265. package/src/ui/segmented.js +0 -50
  266. package/src/ui/tooltip.js +0 -28
package/README.md DELETED
@@ -1,95 +0,0 @@
1
- # Pulse
2
-
3
- **A spec-first, AI-native web framework.** Early access.
4
-
5
- Write a plain JavaScript object that describes what a page does. Pulse handles routing, SSR, hydration, client-side navigation, compression, security headers, and caching automatically.
6
-
7
- ```js
8
- export default {
9
- route: '/counter',
10
- meta: {
11
- title: 'Counter',
12
- styles: ['/app.css'],
13
- },
14
-
15
- state: { count: 0 },
16
-
17
- constraints: {
18
- count: { min: 0, max: 10 },
19
- },
20
-
21
- view: (state) => `
22
- <main id="main-content">
23
- <p>${state.count}</p>
24
- <button data-event="decrement">−</button>
25
- <button data-event="increment">+</button>
26
- </main>
27
- `,
28
-
29
- mutations: {
30
- increment: (state) => ({ count: state.count + 1 }),
31
- decrement: (state) => ({ count: state.count - 1 }),
32
- },
33
- }
34
- ```
35
-
36
- ## Requirements
37
-
38
- Node.js 22 or later.
39
-
40
- ## Getting started
41
-
42
- ```bash
43
- npm install -g @invisibleloop/pulse
44
- mkdir my-project && cd my-project
45
- pulse
46
- ```
47
-
48
- Running `pulse` in an empty directory scaffolds a new project and starts an AI coding session. Your agent has MCP tools and slash commands available from the first prompt.
49
-
50
- Full documentation: **[pulseframework.dev](https://pulseframework.dev)**
51
-
52
- ## Key ideas
53
-
54
- **The spec is the source of truth.** Every page is a single JS object — data fetching, state, mutations, async actions, and view all in one place. No separate files for routes, controllers, or templates.
55
-
56
- **Performance is built in.** Streaming SSR, immutable asset caching, and zero layout shift are automatic. Every scaffolded project targets Lighthouse 100 for Accessibility, Best Practices, and SEO — and is fast by design (streaming HTML before data resolves, CLS 0.00).
57
-
58
- **No client-side dependencies.** Pulse ships no runtime framework to the browser — only a small hydration bundle (~2 kB brotli) that binds your spec's mutations and actions to the DOM.
59
-
60
- **AI-native.** The CLI starts an MCP server alongside the dev server, giving the coding agent tools to create pages, validate specs, and run Lighthouse audits — all without leaving the editor.
61
-
62
- ## CLI
63
-
64
- ```bash
65
- pulse # scaffold a new project or start AI session
66
- pulse dev # dev server (default port 3000)
67
- pulse build # production build → public/dist/
68
- pulse start # production server
69
- ```
70
-
71
- ## Docs
72
-
73
- Full reference at [pulseframework.dev](https://pulseframework.dev):
74
-
75
- - **Getting started** — install, scaffold, first page
76
- - **The spec** — full reference for every property
77
- - **State, mutations, actions** — client interactivity
78
- - **Server data** — async data fetching before render
79
- - **Routing** — dynamic routes and URL params
80
- - **Streaming SSR** — shell + deferred segments
81
- - **Caching** — per-page TTL and HTTP cache headers
82
- - **Guard** — authentication and authorisation before data fetches
83
- - **Validation & constraints** — declarative form validation and state bounds
84
- - **Raw responses** — RSS feeds, sitemaps, JSON APIs
85
- - **Markdown** — built-in parser for blog posts and docs pages, zero browser JS
86
- - **Performance** — how the framework hits Lighthouse 100
87
- - **UI components** — 50+ built-in components
88
-
89
- ## Status
90
-
91
- This is an early-access release. The core architecture is stable and production-quality, but the API may evolve before v1. Feedback and issues welcome on [GitHub](https://github.com/invisibleloop/pulse-framework).
92
-
93
- ## License
94
-
95
- MIT
@@ -1,8 +0,0 @@
1
- import{a as n,b as u}from"./runtime-5Y7ESAIB.js";var o={route:"/counter",hydrate:"/src/pages/counter.js",meta:{title:"Counter \u2014 Pulse Benchmark",styles:["/pulse.css"]},state:{count:0},constraints:{count:{min:0,max:10}},mutations:{increment:t=>({count:t.count+1}),decrement:t=>({count:t.count-1})},view:(t,r)=>`
2
- <main id="main-content">
3
- <p>${r.greeting}</p>
4
- <p>Count: ${t.count}</p>
5
- <button data-event="decrement">\u2212</button>
6
- <button data-event="increment">+</button>
7
- </main>
8
- `};var e=document.getElementById("pulse-root");e&&!e.dataset.pulseMounted&&(e.dataset.pulseMounted="1",n(o,e,window.__PULSE_SERVER__||{},{ssr:!0}),u(e,n));var m=o;export{m as default};
@@ -1,6 +0,0 @@
1
- import{a as e,b as i}from"./runtime-5Y7ESAIB.js";var o={route:"/home",meta:{title:"Home \u2014 Pulse Benchmark",styles:["/pulse.css"]},state:{},view:()=>`
2
- <main id="main-content">
3
- <h1>Pulse Benchmark</h1>
4
- <p>Static page \u2014 no client-side interactivity.</p>
5
- </main>
6
- `};var t=document.getElementById("pulse-root");t&&!t.dataset.pulseMounted&&(t.dataset.pulseMounted="1",e(o,t,window.__PULSE_SERVER__||{},{ssr:!0}),i(t,e));var r=o;export{r as default};
@@ -1,5 +0,0 @@
1
- {
2
- "/src/pages/counter.js": "/../benchmark/public/dist/counter.boot-PO6SNSJZ.js",
3
- "/src/pages/home.js": "/../benchmark/public/dist/home.boot-YK6VAEQI.js",
4
- "_runtime": "/../benchmark/public/dist/runtime-5Y7ESAIB.js"
5
- }
@@ -1,2 +0,0 @@
1
- var E={},V=!1,R={},D=!1,k=new Set;function U(t){V||(E={...t||{}},V=!0)}function q(){return E}function K(t){return k.add(t),()=>k.delete(t)}function P(t){E={...E,...t};for(let o of k)o(E)}function H(t){D||(R=t||{},D=!0)}function N(t,o){let r=R[t];if(!r){console.warn(`[Pulse] No store mutation found for "${t}"`);return}P(r(E,o))}var T=t=>import("./runtime-KO4BHUQ3.js").then(o=>o.showToast(t));function ft(t,o,r={},s={}){if(!t||t.state===void 0||!t.view)throw new Error("[Pulse] mount: spec must have state and view");typeof window<"u"&&(U(window.__PULSE_STORE__||{}),s.store?.mutations&&H(s.store.mutations));let e=new Set(t.store||[]),i={};for(let[u,c]of Object.entries(r))e.has(u)||(i[u]=c);function a(){if(!e.size)return i;let u=q(),c={};for(let w of e)u[w]!==void 0&&(c[w]=u[w]);return{...c,...i}}let n=z(t.state),h=t.persist?.length?`pulse:${t.route||location.pathname}`:null,y=!1;if(h)try{let u=JSON.parse(localStorage.getItem(h)||"{}");t.persist.forEach(c=>{u[c]!==void 0&&u[c]!==t.state[c]&&(n[c]=u[c],y=!0)})}catch{}function d(){if(h)try{let u={};t.persist.forEach(c=>{u[c]=n[c]}),localStorage.setItem(h,JSON.stringify(u))}catch{}}let m=null;function f(){let u;try{u=Z(t,n,a())}catch(c){console.error("[Pulse] View error:",c);let w=a();u=t.onViewError?t.onViewError(c,n,w):ot(c)}u!==m&&(m=u,et(o,u))}function S(u,c){if(t.mutations?.[u]){let w=t.mutations[u](n,c);w?._toast&&T(w._toast);let{_toast:C,...g}=w??{},p=n;n=x({...n,...g},t.constraints),d(),$(p,n)&&f();return}if(t.actions?.[u]){b(u,t.actions[u],n,c);return}console.warn(`[Pulse] No mutation or action found for "${u}"`)}async function b(u,c,w,C){if(c.onStart){let g=c.onStart(w,C);g?._toast&&T(g._toast);let{_toast:p,...M}=g??{},_=n;n=x({...n,...M},t.constraints),$(_,n)&&f()}if(c.validate){let g=rt(n,t.validation);if(g.length>0){console.warn(`[Pulse] Validation failed for action "${u}":`,g);let p=c.onError?.(n,{validation:g})??{};p._toast&&T(p._toast);let{_toast:M,..._}=p,L=n;n=x({...n,..._},t.constraints),$(L,n)&&f();return}}try{let g=await c.run(n,a(),C),p=c.onSuccess(n,g)??{};p._storeUpdate&&P(p._storeUpdate),p._toast&&T(p._toast);let{_storeUpdate:M,_toast:_,...L}=p,Y=n;n=x({...n,...L},t.constraints),$(Y,n)&&f()}catch(g){console.error(`[Pulse] Action "${u}" failed:`,g);let p=c.onError(n,g)??{};p._toast&&T(p._toast);let{_toast:M,..._}=p,L=n;n=x({...n,..._},t.constraints),$(L,n)&&f()}d()}let v=new AbortController;tt(o,S,v.signal);let l=e.size>0?K(()=>f()):null;return s.ssr&&!y||f(),{getState:()=>z(n),dispatch:S,refresh:f,destroy:()=>{l?.(),v.abort(),o.innerHTML=""}}}function Z(t,o,r){return typeof t.view=="function"?t.view(o,r):Object.values(t.view).map(s=>s(o,r)).join("")}function tt(t,o,r){let s=r?{signal:r}:{};t.addEventListener("click",e=>{let i=e.target?.closest?.("[data-store-event]");if(i){let[m,f]=A(i.dataset.storeEvent);m==="click"&&(e.preventDefault(),N(f,e));return}let a=e.target?.closest?.("[data-dialog-open]");if(a){let m=document.getElementById(a.dataset.dialogOpen);m?.showModal&&(e.preventDefault(),m.showModal());return}let n=e.target?.closest?.("[data-dialog-close]");if(n){let m=n.closest("dialog");m&&(e.preventDefault(),m.close());return}if(e.target?.tagName==="DIALOG"){e.target.close();return}let h=e.target?.closest?.("[data-event]");if(!h)return;let[y,d]=A(h.dataset.event);y==="click"&&(e.preventDefault(),o(d,e))},s),t.addEventListener("change",e=>{let i=e.target?.closest?.("[data-store-event]");if(i){let[y,d]=A(i.dataset.storeEvent);y==="change"&&N(d,e);return}let a=e.target?.closest?.("[data-event]");if(!a)return;let[n,h]=A(a.dataset.event);n==="change"&&I(a,h,e,o)},s),t.addEventListener("input",e=>{let i=e.target?.closest?.("[data-store-event]");if(i){let[y,d]=A(i.dataset.storeEvent);y==="input"&&N(d,e);return}let a=e.target?.closest?.("[data-event]");if(!a)return;let[n,h]=A(a.dataset.event);n==="input"&&I(a,h,e,o)},s),t.addEventListener("submit",e=>{let i=e.target?.closest?.("[data-action]");i&&(e.preventDefault(),o(i.dataset.action,new FormData(i)),i.hasAttribute("data-reset")&&i.reset())},s)}function et(t,o){if(typeof document>"u"){t.innerHTML=o;return}let r=document.createElement("div");r.innerHTML=o,O(t,r)}function O(t,o){let r=Array.from(o.childNodes),s=r.filter(i=>i.nodeType===1);if(s.length>0&&s.every(i=>i.getAttribute("data-key")!==null)){nt(t,s);return}let e=Array.from(t.childNodes);for(r.forEach((i,a)=>{let n=e[a];if(!n){t.appendChild(i.cloneNode(!0));return}if(n.nodeType!==i.nodeType||n.nodeName!==i.nodeName){t.replaceChild(i.cloneNode(!0),n);return}if(i.nodeType===3){n.nodeValue!==i.nodeValue&&(n.nodeValue=i.nodeValue);return}i.nodeType===1&&(B(n,i),O(n,i))});t.childNodes.length>r.length;)t.removeChild(t.lastChild)}function nt(t,o){let r=new Map;for(let e of t.childNodes)if(e.nodeType===1){let i=e.getAttribute("data-key");i!==null&&r.set(i,e)}let s=null;for(let e=o.length-1;e>=0;e--){let i=o[e],a=i.getAttribute("data-key"),n=r.get(a);n?(r.delete(a),B(n,i),O(n,i)):n=i.cloneNode(!0),(n.nextSibling!==s||n.parentNode!==t)&&t.insertBefore(n,s),s=n}for(let e of r.values())t.removeChild(e)}function B(t,o){for(let{name:r,value:s}of Array.from(o.attributes))t.getAttribute(r)!==s&&t.setAttribute(r,s);for(let{name:r}of Array.from(t.attributes))o.hasAttribute(r)||t.removeAttribute(r)}function A(t){let o=t.split(":");return o.length===1?["click",o[0]]:[o[0],o[1]]}function I(t,o,r,s){let e=parseInt(t.dataset.debounce,10);if(e>0){J(t,"d",o,e,a=>s(o,a))(r);return}let i=parseInt(t.dataset.throttle,10);if(i>0){J(t,"t",o,i,a=>s(o,a))(r);return}s(o,r)}function x(t,o){if(!o)return t;let s=Object.keys(o).some(e=>e.includes("."))?structuredClone(t):t;for(let[e,i]of Object.entries(o)){let{obj:a,key:n}=F(s,e);a===null||a[n]===void 0||(i.min!==void 0&&typeof a[n]=="number"&&(a[n]=Math.max(a[n],i.min)),i.max!==void 0&&typeof a[n]=="number"&&(a[n]=Math.min(a[n],i.max)))}return s}function rt(t,o){if(!o)return[];let r=[];for(let[s,e]of Object.entries(o)){let{obj:i,key:a}=F(t,s),n=i?.[a];if(e.required&&!n){r.push({path:s,rule:"required",message:`${s} is required`});continue}n==null||n===""||(e.minLength!==void 0&&String(n).length<e.minLength&&r.push({path:s,rule:"minLength",message:`${s} must be at least ${e.minLength} characters`}),e.maxLength!==void 0&&String(n).length>e.maxLength&&r.push({path:s,rule:"maxLength",message:`${s} must be no more than ${e.maxLength} characters`}),e.min!==void 0&&Number(n)<e.min&&r.push({path:s,rule:"min",message:`${s} must be at least ${e.min}`}),e.max!==void 0&&Number(n)>e.max&&r.push({path:s,rule:"max",message:`${s} must be no more than ${e.max}`}),e.format==="email"&&!st(String(n))&&r.push({path:s,rule:"format",message:`${s} must be a valid email address`}),e.format==="url"&&!ut(String(n))&&r.push({path:s,rule:"format",message:`${s} must be a valid URL`}),e.format==="numeric"&&isNaN(Number(n))&&r.push({path:s,rule:"format",message:`${s} must be numeric`}),e.pattern&&!e.pattern.test(String(n))&&r.push({path:s,rule:"pattern",message:`${s} does not match the required format`}))}return r}function F(t,o){let r=o.split("."),s=r.pop(),e=t;for(let i of r){if(e==null||typeof e!="object")return{obj:null,key:s};e=e[i]}return{obj:e,key:s}}function z(t){return structuredClone(t)}function $(t,o){if(t===o)return!1;let r=Object.keys(t);return r.length!==Object.keys(o).length?!0:r.some(s=>t[s]!==o[s])}function ot(t){return`<div style="padding:1rem;color:#b91c1c;background:#fef2f2;border:1px solid #fca5a5;border-radius:.375rem;font-family:monospace;font-size:.875rem"><strong>View error</strong>${t?.message?`: ${t.message}`:""}</div>`}function st(t){return/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(t)}var j=new WeakMap;function J(t,o,r,s,e){j.has(t)||j.set(t,{});let i=j.get(t),a=`${o}:${r}:${s}`;return i[a]||(i[a]=o==="d"?it(e,s):at(e,s)),i[a]}function it(t,o){let r;return function(...s){clearTimeout(r),r=setTimeout(()=>t(...s),o)}}function at(t,o){let r=0;return function(...s){let e=Date.now();e-r>=o&&(r=e,t(...s))}}function ut(t){try{return new URL(t),!0}catch{return!1}}function mt(t,o){history.replaceState({pulse:!0,path:location.pathname},"",location.pathname);let r=null;async function s(e,i){try{let a=await fetch(e,{headers:{"X-Pulse-Navigate":"true"}});if(!a.ok){location.href=e;return}if((a.headers.get("content-type")||"").includes("application/x-ndjson")){let h=a.body.getReader(),y=new TextDecoder,d="",m=null,f={},S=new Map,b=async v=>{if(!v.trim())return;let l=JSON.parse(v);if(l.type==="meta")m=l.hydrate,document.title=l.title||document.title,G(l.styles),await X(l.scripts);else if(l.type==="html"){t.innerHTML=l.html;for(let u of l.deferred||[]){let c=t.querySelector(`[id="pd-${u}"]`);c&&S.set(u,c)}i&&history.pushState({pulse:!0,path:e},"",e),Q(t)}else if(l.type==="deferred"){let u=S.get(l.id);if(u){let c=document.createElement("div");c.innerHTML=l.html,u.replaceWith(...c.childNodes),S.delete(l.id)}}else l.type==="done"&&(l.storeState&&window.__updatePulseStore__&&window.__updatePulseStore__(l.storeState),f=l.serverState||{})};for(;;){let{done:v,value:l}=await h.read();if(v)break;d+=y.decode(l,{stream:!0});let u=d.split(`
2
- `);d=u.pop();for(let c of u)await b(c)}if(d&&await b(d),W(t),document.dispatchEvent(new CustomEvent("pulse:navigate")),m&&o){r?.destroy(),t.dataset.pulseMounted="1",window.__PULSE_SERVER__=f;let{default:v}=await import(m);v&&(r=o(v,t,f))}}else{let{html:h,title:y,styles:d,scripts:m,hydrate:f,serverState:S,storeState:b}=await a.json();if(b&&window.__updatePulseStore__&&window.__updatePulseStore__(b),t.innerHTML=h,document.title=y||document.title,G(d),await X(m),W(t),i&&history.pushState({pulse:!0,path:e},"",e),f&&o){r?.destroy(),t.dataset.pulseMounted="1",window.__PULSE_SERVER__=S||{};let{default:v}=await import(f);v&&(r=o(v,t,S||{}))}document.dispatchEvent(new CustomEvent("pulse:navigate")),Q(t)}}catch{location.href=e}}return document.addEventListener("click",e=>{let i=e.target.closest("a");if(!i)return;let a=i.getAttribute("href");if(!a)return;let n;try{n=new URL(a,location.origin)}catch{return}n.origin===location.origin&&(e.ctrlKey||e.metaKey||e.shiftKey||e.altKey||i.target&&i.target!=="_self"||(e.preventDefault(),s(n.pathname+n.search,!0)))}),window.addEventListener("popstate",e=>{e.state?.pulse&&s(location.pathname+location.search,!1)}),{setMount:e=>{r=e}}}function W(t){t.querySelectorAll("script:not([src])").forEach(o=>{let r=document.createElement("script");r.textContent=o.textContent,document.head.appendChild(r),r.remove()})}function G(t){if(!Array.isArray(t))return;let o=new Set([...document.querySelectorAll('link[rel="stylesheet"]')].map(r=>r.getAttribute("href")));for(let r of t)if(!o.has(r)){let s=document.createElement("link");s.rel="stylesheet",s.href=r,document.head.appendChild(s)}}function X(t){if(!Array.isArray(t))return Promise.resolve();let o=new Set([...document.querySelectorAll("script[src]")].map(r=>r.getAttribute("src")));return Promise.all(t.filter(r=>!o.has(r)).map(r=>new Promise(s=>{let e=document.createElement("script");e.src=r,e.onload=s,e.onerror=s,document.head.appendChild(e)})))}function Q(t){window.scrollTo({top:0,behavior:"instant"});let o=t.querySelector("#main-content, main, h1")||t;o.hasAttribute("tabindex")||(o.setAttribute("tabindex","-1"),o.addEventListener("blur",()=>o.removeAttribute("tabindex"),{once:!0})),o.focus({preventScroll:!0})}export{ft as a,mt as b};
@@ -1,49 +0,0 @@
1
- var l="pulse-toasts";var m=new Set(["success","error","warning","info"]),p=`
2
- #pulse-toasts {
3
- position: fixed;
4
- top: 1rem;
5
- right: 1rem;
6
- z-index: 9999;
7
- display: flex;
8
- flex-direction: column;
9
- gap: .5rem;
10
- pointer-events: none;
11
- max-width: min(24rem, calc(100vw - 2rem));
12
- }
13
- .pulse-toast {
14
- display: flex;
15
- align-items: flex-start;
16
- gap: .75rem;
17
- padding: .75rem 1rem;
18
- border-radius: .5rem;
19
- box-shadow: 0 4px 16px rgba(0,0,0,.2);
20
- font-size: .875rem;
21
- line-height: 1.4;
22
- pointer-events: all;
23
- opacity: 0;
24
- transform: translateX(calc(100% + 1.5rem));
25
- transition: opacity .2s ease, transform .2s ease;
26
- background: #1e293b;
27
- color: #f8fafc;
28
- }
29
- .pulse-toast--visible {
30
- opacity: 1;
31
- transform: translateX(0);
32
- }
33
- .pulse-toast--success { background: #166534; }
34
- .pulse-toast--error { background: #991b1b; }
35
- .pulse-toast--warning { background: #92400e; }
36
- .pulse-toast-message { flex: 1; }
37
- .pulse-toast-close {
38
- background: none;
39
- border: none;
40
- color: inherit;
41
- cursor: pointer;
42
- padding: 0 0 0 .25rem;
43
- font-size: 1.125rem;
44
- line-height: 1;
45
- opacity: .7;
46
- flex-shrink: 0;
47
- }
48
- .pulse-toast-close:hover { opacity: 1; }
49
- `,c=!1;function f(){if(c)return;c=!0;let e=document.createElement("style");e.textContent=p,document.head.appendChild(e)}function g(){let e=document.getElementById(l);return e||(f(),e=document.createElement("div"),e.id=l,e.setAttribute("aria-live","polite"),e.setAttribute("aria-atomic","false"),document.body.appendChild(e)),e}function b(e){if(typeof document>"u")return;let{message:a,variant:i="info",duration:r=4e3}=typeof e=="string"?{message:e}:e;if(!a)return;let u=m.has(i)?i:"info",n=g();for(;n.children.length>=5;)n.firstElementChild?.remove();let t=document.createElement("div");t.className=`pulse-toast pulse-toast--${u}`,t.setAttribute("role","status");let o=document.createElement("span");o.className="pulse-toast-message",o.textContent=a;let s=document.createElement("button");s.className="pulse-toast-close",s.setAttribute("aria-label","Dismiss notification"),s.textContent="\xD7",s.addEventListener("click",()=>d(t)),t.appendChild(o),t.appendChild(s),n.appendChild(t),requestAnimationFrame(()=>t.classList.add("pulse-toast--visible")),r>0&&setTimeout(()=>d(t),r)}function d(e){e.classList.remove("pulse-toast--visible"),e.addEventListener("transitionend",()=>e.remove(),{once:!0})}export{b as showToast};
@@ -1,188 +0,0 @@
1
- {
2
- "timestamp": "2026-03-27T09:20:25.195Z",
3
- "node": "v22.19.0",
4
- "suites": [
5
- {
6
- "label": "simple",
7
- "path": "/bench/simple",
8
- "iterations": 100,
9
- "ttfb": {
10
- "mean": 0.18965339000000087,
11
- "p50": 0.17383399999999938,
12
- "p95": 0.29887500000000955,
13
- "p99": 0.3626250000000084,
14
- "min": 0.14820799999998258,
15
- "max": 0.3626250000000084
16
- },
17
- "total": {
18
- "mean": 0.21540463999999956,
19
- "p50": 0.19762500000001637,
20
- "p95": 0.32587499999999636,
21
- "p99": 0.40537499999999227,
22
- "min": 0.16808299999999576,
23
- "max": 0.40537499999999227
24
- },
25
- "bodyBytes": 1054,
26
- "serverData": null,
27
- "serverRender": null
28
- },
29
- {
30
- "label": "data-1",
31
- "path": "/bench/data-1",
32
- "iterations": 100,
33
- "ttfb": {
34
- "mean": 0.7174741700000027,
35
- "p50": 0.6867910000000848,
36
- "p95": 1.1546250000001237,
37
- "p99": 1.5141250000001492,
38
- "min": 0.26679200000012315,
39
- "max": 1.5141250000001492
40
- },
41
- "total": {
42
- "mean": 22.057245399999985,
43
- "p50": 22.128749999999854,
44
- "p95": 22.988791999999876,
45
- "p99": 23.292291999999975,
46
- "min": 20.543083000000024,
47
- "max": 23.292291999999975
48
- },
49
- "bodyBytes": 4384,
50
- "serverData": null,
51
- "serverRender": null
52
- },
53
- {
54
- "label": "data-3",
55
- "path": "/bench/data-3",
56
- "iterations": 100,
57
- "ttfb": {
58
- "mean": 0.7575587300000006,
59
- "p50": 0.7104169999997794,
60
- "p95": 1.4852919999998448,
61
- "p99": 1.7593329999999696,
62
- "min": 0.2626669999999649,
63
- "max": 1.7593329999999696
64
- },
65
- "total": {
66
- "mean": 31.95738079999998,
67
- "p50": 32.02441699999963,
68
- "p95": 32.793916999999965,
69
- "p99": 33.06345800000008,
70
- "min": 30.259124999999585,
71
- "max": 33.06345800000008
72
- },
73
- "bodyBytes": 1246,
74
- "serverData": null,
75
- "serverRender": null
76
- },
77
- {
78
- "label": "cached",
79
- "path": "/bench/cached",
80
- "iterations": 100,
81
- "ttfb": {
82
- "mean": 0.1528695300000345,
83
- "p50": 0.13799999999991996,
84
- "p95": 0.2255829999994603,
85
- "p99": 0.48387499999989814,
86
- "min": 0.09737500000028376,
87
- "max": 0.48387499999989814
88
- },
89
- "total": {
90
- "mean": 0.16491832000000614,
91
- "p50": 0.14895900000010442,
92
- "p95": 0.2435829999994894,
93
- "p99": 0.49779099999977916,
94
- "min": 0.10537500000009459,
95
- "max": 0.49779099999977916
96
- },
97
- "bodyBytes": 988,
98
- "serverData": null,
99
- "serverRender": null
100
- },
101
- {
102
- "label": "nav/simple",
103
- "path": "/bench/simple",
104
- "iterations": 100,
105
- "ttfb": {
106
- "mean": 0.13343495999998595,
107
- "p50": 0.1262909999995827,
108
- "p95": 0.19287500000064028,
109
- "p99": 0.423333000000639,
110
- "min": 0.08924999999999272,
111
- "max": 0.423333000000639
112
- },
113
- "total": {
114
- "mean": 0.14239336000002367,
115
- "p50": 0.13475000000016735,
116
- "p95": 0.20391700000072888,
117
- "p99": 0.4311250000000655,
118
- "min": 0.09600000000045839,
119
- "max": 0.4311250000000655
120
- },
121
- "bodyBytes": 244,
122
- "serverData": null,
123
- "serverRender": null
124
- },
125
- {
126
- "label": "nav/data-1",
127
- "path": "/bench/data-1",
128
- "iterations": 100,
129
- "ttfb": {
130
- "mean": 21.82076291000002,
131
- "p50": 21.85304200000064,
132
- "p95": 22.433207999999468,
133
- "p99": 23.03662499999973,
134
- "min": 20.698709000000235,
135
- "max": 23.03662499999973
136
- },
137
- "total": {
138
- "mean": 21.865540849999878,
139
- "p50": 21.896166999998968,
140
- "p95": 22.511749999999665,
141
- "p99": 23.08691699999963,
142
- "min": 20.723042000000532,
143
- "max": 23.08691699999963
144
- },
145
- "bodyBytes": 3513,
146
- "serverData": null,
147
- "serverRender": null
148
- },
149
- {
150
- "label": "nav/data-3",
151
- "path": "/bench/data-3",
152
- "iterations": 100,
153
- "ttfb": {
154
- "mean": 31.878054999999968,
155
- "p50": 31.92083300000013,
156
- "p95": 32.69962499999929,
157
- "p99": 33.174958999999944,
158
- "min": 30.299708999998984,
159
- "max": 33.174958999999944
160
- },
161
- "total": {
162
- "mean": 31.93094377999998,
163
- "p50": 31.96887500000048,
164
- "p95": 32.76958299999933,
165
- "p99": 33.27116700000079,
166
- "min": 30.37066699999923,
167
- "max": 33.27116700000079
168
- },
169
- "bodyBytes": 375,
170
- "serverData": null,
171
- "serverRender": null
172
- }
173
- ],
174
- "bundles": {
175
- "contact.boot": {
176
- "file": "contact.boot-IBC3WEQQ.js",
177
- "bytes": 2506
178
- },
179
- "counter.boot": {
180
- "file": "counter.boot-VUWQFE5L.js",
181
- "bytes": 1229
182
- },
183
- "runtime": {
184
- "file": "runtime-YLZ4ZGK4.js",
185
- "bytes": 7017
186
- }
187
- }
188
- }
@@ -1,188 +0,0 @@
1
- {
2
- "timestamp": "2026-03-27T09:21:12.621Z",
3
- "node": "v22.19.0",
4
- "suites": [
5
- {
6
- "label": "simple",
7
- "path": "/bench/simple",
8
- "iterations": 100,
9
- "ttfb": {
10
- "mean": 0.18461582000000049,
11
- "p50": 0.1646250000000009,
12
- "p95": 0.2852500000000191,
13
- "p99": 0.42183299999999235,
14
- "min": 0.1447080000000085,
15
- "max": 0.42183299999999235
16
- },
17
- "total": {
18
- "mean": 0.21154751000000033,
19
- "p50": 0.18912499999999,
20
- "p95": 0.31433400000000233,
21
- "p99": 0.4727500000000191,
22
- "min": 0.1662499999999909,
23
- "max": 0.4727500000000191
24
- },
25
- "bodyBytes": 1107,
26
- "serverData": null,
27
- "serverRender": null
28
- },
29
- {
30
- "label": "data-1",
31
- "path": "/bench/data-1",
32
- "iterations": 100,
33
- "ttfb": {
34
- "mean": 0.6358262399999944,
35
- "p50": 0.5394169999999576,
36
- "p95": 1.2368329999999332,
37
- "p99": 2.6608750000000327,
38
- "min": 0.22608299999990322,
39
- "max": 2.6608750000000327
40
- },
41
- "total": {
42
- "mean": 22.039515369999986,
43
- "p50": 22.052624999999807,
44
- "p95": 23.031082999999853,
45
- "p99": 23.720332999999982,
46
- "min": 20.468165999999655,
47
- "max": 23.720332999999982
48
- },
49
- "bodyBytes": 4437,
50
- "serverData": null,
51
- "serverRender": null
52
- },
53
- {
54
- "label": "data-3",
55
- "path": "/bench/data-3",
56
- "iterations": 100,
57
- "ttfb": {
58
- "mean": 0.5651482699999678,
59
- "p50": 0.49766700000009223,
60
- "p95": 1.3021660000003976,
61
- "p99": 1.4529170000000704,
62
- "min": 0.23220799999944575,
63
- "max": 1.4529170000000704
64
- },
65
- "total": {
66
- "mean": 31.685546209999952,
67
- "p50": 31.745542000000114,
68
- "p95": 32.82679100000041,
69
- "p99": 33.18908300000021,
70
- "min": 29.795499999999265,
71
- "max": 33.18908300000021
72
- },
73
- "bodyBytes": 1299,
74
- "serverData": null,
75
- "serverRender": null
76
- },
77
- {
78
- "label": "cached",
79
- "path": "/bench/cached",
80
- "iterations": 100,
81
- "ttfb": {
82
- "mean": 0.1482587500000227,
83
- "p50": 0.13324999999986176,
84
- "p95": 0.2303750000000946,
85
- "p99": 0.3728339999997843,
86
- "min": 0.10658300000068266,
87
- "max": 0.3728339999997843
88
- },
89
- "total": {
90
- "mean": 0.16088121999998292,
91
- "p50": 0.145542000000205,
92
- "p95": 0.24883299999964947,
93
- "p99": 0.3845839999994496,
94
- "min": 0.11658299999999144,
95
- "max": 0.3845839999994496
96
- },
97
- "bodyBytes": 1041,
98
- "serverData": null,
99
- "serverRender": null
100
- },
101
- {
102
- "label": "nav/simple",
103
- "path": "/bench/simple",
104
- "iterations": 100,
105
- "ttfb": {
106
- "mean": 0.11078830999994352,
107
- "p50": 0.10883399999966059,
108
- "p95": 0.12508299999990413,
109
- "p99": 0.37304199999925913,
110
- "min": 0.09274999999979627,
111
- "max": 0.37304199999925913
112
- },
113
- "total": {
114
- "mean": 0.1193449899999905,
115
- "p50": 0.11745799999971496,
116
- "p95": 0.13524999999935972,
117
- "p99": 0.38433399999939866,
118
- "min": 0.09883399999944231,
119
- "max": 0.38433399999939866
120
- },
121
- "bodyBytes": 244,
122
- "serverData": null,
123
- "serverRender": null
124
- },
125
- {
126
- "label": "nav/data-1",
127
- "path": "/bench/data-1",
128
- "iterations": 100,
129
- "ttfb": {
130
- "mean": 21.61796121999997,
131
- "p50": 21.62274999999954,
132
- "p95": 22.23725000000013,
133
- "p99": 22.784042000000227,
134
- "min": 20.593541999999616,
135
- "max": 22.784042000000227
136
- },
137
- "total": {
138
- "mean": 21.65816495000001,
139
- "p50": 21.65904099999989,
140
- "p95": 22.343792000000576,
141
- "p99": 22.863250000000335,
142
- "min": 20.61554199999955,
143
- "max": 22.863250000000335
144
- },
145
- "bodyBytes": 3513,
146
- "serverData": null,
147
- "serverRender": null
148
- },
149
- {
150
- "label": "nav/data-3",
151
- "path": "/bench/data-3",
152
- "iterations": 100,
153
- "ttfb": {
154
- "mean": 31.698053359999975,
155
- "p50": 31.66662499999984,
156
- "p95": 32.492291999999,
157
- "p99": 32.72829199999978,
158
- "min": 30.043375000001106,
159
- "max": 32.72829199999978
160
- },
161
- "total": {
162
- "mean": 31.743360929999927,
163
- "p50": 31.71479199999885,
164
- "p95": 32.56791599999997,
165
- "p99": 32.881624999999985,
166
- "min": 30.08008300000074,
167
- "max": 32.881624999999985
168
- },
169
- "bodyBytes": 375,
170
- "serverData": null,
171
- "serverRender": null
172
- }
173
- ],
174
- "bundles": {
175
- "contact.boot": {
176
- "file": "contact.boot-IBC3WEQQ.js",
177
- "bytes": 2506
178
- },
179
- "counter.boot": {
180
- "file": "counter.boot-VUWQFE5L.js",
181
- "bytes": 1229
182
- },
183
- "runtime": {
184
- "file": "runtime-YLZ4ZGK4.js",
185
- "bytes": 7017
186
- }
187
- }
188
- }