@absolutejs/absolute 0.20.0-beta.170 → 0.20.0-beta.171

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 (142) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/README.md +33 -4
  3. package/changelog.json +112 -0
  4. package/dist/angular/browser.js +2 -2
  5. package/dist/angular/browser.js.map +3 -3
  6. package/dist/angular/components/constants.js +1 -0
  7. package/dist/angular/components/core/streamingSlotRegistrar.js +2 -2
  8. package/dist/angular/components/core/streamingSlotRegistry.js +3 -3
  9. package/dist/angular/index.js +184 -29
  10. package/dist/angular/index.js.map +15 -14
  11. package/dist/angular/server.js +184 -29
  12. package/dist/angular/server.js.map +15 -14
  13. package/dist/build.js +1241 -853
  14. package/dist/build.js.map +32 -30
  15. package/dist/cli/{add-6a7pjkn9.js → add-ae6mg79m.js} +10 -10
  16. package/dist/cli/{analyze-606fshwa.js → analyze-e57zz9x8.js} +3 -3
  17. package/dist/cli/{androidEmulatorController-68jjdxmx.js → androidEmulatorController-vqc5m2rp.js} +6 -6
  18. package/dist/cli/{androidNativeWatcher-x032x9yr.js → androidNativeWatcher-s03aczxv.js} +6 -6
  19. package/dist/cli/{api-mshjr4ah.js → api-8ppxw487.js} +8 -8
  20. package/dist/cli/{build-g81xqbb9.js → build-fz7qbdn3.js} +3 -3
  21. package/dist/cli/{buildDepVendor-29d8v9cx.js → buildDepVendor-qvsh6dsj.js} +7 -3
  22. package/dist/cli/{compile-9y1w9zpj.js → compile-ndc36zna.js} +10 -7
  23. package/dist/cli/config/server.js +36 -6
  24. package/dist/cli/{db-5b4s1kvx.js → db-qbzjw3en.js} +2 -2
  25. package/dist/cli/{dev-hyeb89hp.js → dev-x49583aj.js} +43 -15
  26. package/dist/cli/{doctor-h55y9hj1.js → doctor-repprx92.js} +42 -12
  27. package/dist/cli/{emulatorDoctor-p3yt7140.js → emulatorDoctor-s1z5tkp7.js} +5 -5
  28. package/dist/cli/{emulatorInstaller-4pm2kx9w.js → emulatorInstaller-pgkdswvq.js} +6 -6
  29. package/dist/cli/{env-snb0597q.js → env-5nz1qm8e.js} +3 -3
  30. package/dist/cli/{expoDevController-0vj8dvkh.js → expoDevController-018anvbm.js} +6 -6
  31. package/dist/cli/{generate-20x1pkf7.js → generate-brvjesd6.js} +8 -8
  32. package/dist/cli/{heapDiff-wqj8vrq8.js → heapDiff-kncvdtn8.js} +3 -3
  33. package/dist/cli/htmx/htmx.min.js +1 -1
  34. package/dist/cli/{htmx-6mz2h7k1.js → htmx-5twhjz7p.js} +7 -7
  35. package/dist/cli/{index-w09fzs9f.js → index-0z5fgb80.js} +1 -1
  36. package/dist/cli/{index-exfkpjja.js → index-125cfzvn.js} +2 -2
  37. package/dist/cli/{index-32ge2w1f.js → index-25e7k849.js} +16 -8
  38. package/dist/cli/{index-ys2rzqhg.js → index-2shf4aya.js} +1 -1
  39. package/dist/cli/{index-74m7kh8c.js → index-3ewt17wm.js} +1 -1
  40. package/dist/cli/{index-zd3cna19.js → index-3sfcmb49.js} +1 -1
  41. package/dist/cli/{index-14fbvz34.js → index-50ag35xg.js} +2 -2
  42. package/dist/cli/{index-h5qx5jpk.js → index-7854xf0m.js} +1 -1
  43. package/dist/cli/{index-3y57kd7x.js → index-8khbn8qr.js} +3 -3
  44. package/dist/cli/{index-xw1byvzp.js → index-9djrap79.js} +1 -1
  45. package/dist/cli/{index-ppphkyps.js → index-a6xx0p9e.js} +1 -1
  46. package/dist/cli/{index-g4ehq6ev.js → index-aemhvvwb.js} +1 -1
  47. package/dist/cli/{index-z6f43b20.js → index-b1wht4q5.js} +1 -1
  48. package/dist/cli/{index-s3xvccq3.js → index-btp4fyf1.js} +2 -2
  49. package/dist/cli/{index-066qhc6n.js → index-cgmp9d02.js} +1 -1
  50. package/dist/cli/{index-3wz3mktm.js → index-gyjxrnnz.js} +1 -1
  51. package/dist/cli/index-jwfambwe.js +13 -0
  52. package/dist/cli/{index-3wm8p7rg.js → index-n6faa3m3.js} +1 -1
  53. package/dist/cli/{index-kye08pjx.js → index-pr1skxen.js} +1 -1
  54. package/dist/cli/{index-t8cf0zj9.js → index-prza6tkp.js} +3 -3
  55. package/dist/cli/{index-qbrzvmh9.js → index-q3snnhyd.js} +1 -1
  56. package/dist/cli/{index-3vmc30gf.js → index-rz56x932.js} +1 -1
  57. package/dist/cli/{index-9sksd8c8.js → index-vh68jb0e.js} +2 -2
  58. package/dist/cli/index.js +32 -32
  59. package/dist/cli/{info-mn125212.js → info-k124sh7g.js} +4 -4
  60. package/dist/cli/{inspect-c7s117j0.js → inspect-n6pcfvfw.js} +5 -5
  61. package/dist/cli/{iosNativeWatcher-0nm6qad5.js → iosNativeWatcher-wdq2fvj1.js} +7 -7
  62. package/dist/cli/{iosSimulatorController-hza2c3rv.js → iosSimulatorController-n97dpa8p.js} +7 -7
  63. package/dist/cli/{islands-dc54e5y1.js → islands-p4vgx7a2.js} +3 -3
  64. package/dist/cli/{logs-ej1add2b.js → logs-shg23fbt.js} +3 -3
  65. package/dist/cli/{ls-b6zz24nt.js → ls-0hfx323m.js} +3 -3
  66. package/dist/cli/{mem-5q7n3ymb.js → mem-16sy1707.js} +5 -5
  67. package/dist/cli/{migrate-6nm4kdf6.js → migrate-k91k050s.js} +2 -2
  68. package/dist/cli/{mobile-ajnnvqtv.js → mobile-nqdkk3gd.js} +13 -13
  69. package/dist/cli/prerender-010z771p.js +10 -0
  70. package/dist/cli/{prettier-phdtvqef.js → prettier-dh5fh786.js} +1 -1
  71. package/dist/cli/{ps-ezmzyscn.js → ps-pk7ncjac.js} +6 -6
  72. package/dist/cli/{psTui-3x3ykjve.js → psTui-50wf0b72.js} +7 -7
  73. package/dist/cli/{remoteMacProtocol-g09myqt5.js → remoteMacProtocol-g10s408w.js} +7 -7
  74. package/dist/cli/{remove-t8x1mrxg.js → remove-abaf0w6k.js} +8 -8
  75. package/dist/cli/{routes-3xj256gx.js → routes-mc3ymp8t.js} +3 -3
  76. package/dist/cli/{start-d6p831ny.js → start-t3cq57wn.js} +5 -5
  77. package/dist/cli/{typecheck-stbt0qt5.js → typecheck-209bemxm.js} +17 -4
  78. package/dist/cli/{workspace-61hh6jq1.js → workspace-7sbyyc59.js} +5 -5
  79. package/dist/client/chunks/islands-s2ta5ajb.js.map +1 -1
  80. package/dist/client/navigation.js +2 -1
  81. package/dist/client/navigation.js.map +3 -3
  82. package/dist/dev/client/domTracker.ts +52 -19
  83. package/dist/dev/client/frameworkDetect.ts +11 -0
  84. package/dist/dev/client/handlers/html.ts +6 -1
  85. package/dist/dev/client/handlers/htmx.ts +6 -1
  86. package/dist/dev/client/hmrClient.ts +10 -0
  87. package/dist/dev/serverBootstrap.js +112 -6
  88. package/dist/index.js +1147 -757
  89. package/dist/index.js.map +32 -30
  90. package/dist/islands/index.js +16 -5
  91. package/dist/islands/index.js.map +6 -6
  92. package/dist/mobile/index.js +2 -2
  93. package/dist/mobile/index.js.map +3 -3
  94. package/dist/react/components/index.js +2 -2
  95. package/dist/react/components/index.js.map +3 -3
  96. package/dist/react/index.js +85 -18
  97. package/dist/react/index.js.map +11 -11
  98. package/dist/react/server.js +71 -15
  99. package/dist/react/server.js.map +8 -8
  100. package/dist/src/angular/baseHref.d.ts +2 -0
  101. package/dist/src/angular/components/constants.d.ts +1 -0
  102. package/dist/src/angular/ssrRender.d.ts +1 -1
  103. package/dist/src/build/compileAngular.d.ts +15 -0
  104. package/dist/src/build/resolveBuildMode.d.ts +6 -0
  105. package/dist/src/build/scanAngularHandlerCalls.d.ts +3 -1
  106. package/dist/src/build/verifyAngularCoreUniqueness.d.ts +3 -1
  107. package/dist/src/cli/htmx/install.d.ts +1 -1
  108. package/dist/src/cli/typeGraphCoherence.d.ts +9 -2
  109. package/dist/src/constants.d.ts +1 -0
  110. package/dist/src/core/appErrorHooks.d.ts +8 -0
  111. package/dist/src/core/islandPageContext.d.ts +5 -1
  112. package/dist/src/core/requestContext.d.ts +5 -0
  113. package/dist/src/core/serverOnlyStaticFiles.d.ts +7 -0
  114. package/dist/src/dev/editorTempFiles.d.ts +3 -0
  115. package/dist/src/dev/hot/analyze.d.ts +1 -1
  116. package/dist/src/dev/hot/runtime.d.ts +20 -0
  117. package/dist/src/dev/importCost/instrument.d.ts +1 -1
  118. package/dist/src/dev/rebuildTrigger.d.ts +1 -0
  119. package/dist/src/utils/cleanStaleOutputs.d.ts +4 -1
  120. package/dist/src/utils/logger.d.ts +3 -2
  121. package/dist/src/utils/resolveConvention.d.ts +1 -0
  122. package/dist/src/utils/ssrErrorPage.d.ts +3 -0
  123. package/dist/svelte/index.js +85 -18
  124. package/dist/svelte/index.js.map +11 -11
  125. package/dist/svelte/router/Route.svelte.d.ts +1 -2
  126. package/dist/svelte/router/Router.svelte +2 -4
  127. package/dist/svelte/server.js +73 -16
  128. package/dist/svelte/server.js.map +9 -9
  129. package/dist/types/globals.d.ts +3 -0
  130. package/dist/types/svelteRouter.ts +3 -12
  131. package/dist/vue/components/Image.js +2 -2
  132. package/dist/vue/components/Image.js.map +3 -3
  133. package/dist/vue/components/index.js +2 -2
  134. package/dist/vue/components/index.js.map +3 -3
  135. package/dist/vue/index.js +158 -91
  136. package/dist/vue/index.js.map +12 -12
  137. package/dist/vue/server.js +144 -88
  138. package/dist/vue/server.js.map +9 -9
  139. package/package.json +1 -1
  140. package/dist/cli/prerender-fqpp0m1j.js +0 -10
  141. /package/dist/cli/{index-vtp20gwf.js → index-2bxfhs32.js} +0 -0
  142. /package/dist/cli/{index-fgz435qn.js → index-t8jmj8w1.js} +0 -0
package/CHANGELOG.md CHANGED
@@ -6,6 +6,56 @@ This file is generated by `absolute-changelog` from the entries in
6
6
  `changelog/`. Edit an entry, not this file — and add new ones under
7
7
  `changelog/unreleased/`.
8
8
 
9
+ ## 0.20.0-beta.171 — 2026-11-13
10
+
11
+ ### Security
12
+
13
+ - **Production error pages show a generic message instead of the error text**
14
+ Error convention pages showed the error's own message outside development. A missing static page rendered `error.html` with `{{ message }}` set to "ENOENT: no such file or directory, open '/srv/app/build/html/pages/Nope.html'", which exposed the server's file layout. Database and network errors can expose hosts and queries the same way. Outside development, every error convention page (HTML and HTMX `error.html`, and the React, Svelte, Vue and Angular error pages) now receives the message "Something went wrong while rendering this page." and no stack. The built-in error page shown when no convention exists does the same. The `name` prop is unchanged. The full error is still logged on the server, and development still shows the real message and stack.
15
+ - **Production no longer serves /manifest.json or puts server file paths in island pages**
16
+ Under `absolute start`, `GET /manifest.json` returned the build's runtime manifest, which lists the absolute disk path of every SSR page and server bundle (for example `/srv/app/build/react/server/rsc/Dashboard.<hash>.js`). It now returns 404, as `server-outputs.json` and `spa-routes.json` already did, and so do its `.br` and `.gz` copies. The browser never fetched this file. Pages with islands also carried those paths in the inline `window.__ABSOLUTE_MANIFEST__` script. That script now holds only web paths, so island bundles and the islands bootstrap resolve as before. A web-app manifest can no longer be named `manifest.json`: the build overwrote that file with its own manifest, so it was never served. `pwa.manifest.path: '/manifest.json'` is now a build error, and a `manifest.json` in `publicDirectory` logs a warning. Use the default `/manifest.webmanifest`.
17
+
18
+ ### Changed
19
+
20
+ - **The bundled htmx is now 2.0.11**
21
+ The htmx copy that `absolute add htmx` installs, and that `absolute htmx` reports as the vendored version, is now 2.0.11 instead of 2.0.6. Projects that already have htmx keep their installed copy. Run `absolute htmx 2.0.11` to upgrade one.
22
+ - **Routes that throw render error.html for HTML and HTMX page requests**
23
+ A route handler that threw before returning an HTML or HTMX page got Elysia's JSON 500. Browser navigations and HTMX requests now get the `error.html` from the HTML or HTMX pages directory, with status 500. HTMX requests try the HTMX one first. In production the page shows a generic message and no stack. Other requests, Elysia's own errors and thrown `status(...)` responses are unchanged. This is a fallback: if your app registers its own `onError`, before or after `.use(absolutejs)`, your handler keeps handling these errors and no `error.html` is rendered. The app's handlers are found when the server starts with `.listen()`; an app that only calls `app.handle()` gets `error.html` regardless. See docs/STATIC_PAGE_CONVENTIONS.md.
24
+
25
+ ### Fixed
26
+
27
+ - **Angular APP_BASE_HREF works when the page handler is called from a helper**
28
+ An Angular router page mounted at a wildcard route like `.get('/portal/*', …)` only got `APP_BASE_HREF` when `handleAngularPageRequest(...)` was written directly inside that route. Called from a helper function, no base href was set and the router could not match any route. The base href now comes from the route that matched the request, so `/portal/*` gives `/portal/` wherever the handler call is written, and the browser bootstraps with the same value. Parameterised mounts such as `/t/:tenant/*` use the values from the request URL. A provider you pass in the handler's `providers` option still takes precedence on the server.
29
+ - **Angular router pages with routed children in the same file render the right root**
30
+ When an Angular page module exported `routes` and declared its routed child components in the same file, the build picked the first exported class as the page, so the server and the browser rendered the first routed child as the page root for every URL. The page is now the component that hosts `<router-outlet>`. Without an outlet, the last exported component is the page, and an explicit `export default` still wins.
31
+ - **No more false "2 distinct @angular/core resolutions" warning, and doctor finds real duplicates**
32
+ Production builds of Angular pages that import `@absolutejs/absolute/angular` warned "Server bundle references 2 distinct @angular/core resolutions" even though every real import used the same copy. The check read text such as `from '@angular/core'` inside string literals in AbsoluteJS's own code as imports. It now reads the bundle's actual imports. `absolute doctor` also checks that each `@angular/*` runtime package resolves to one physical copy, and `absolute doctor --fix` pins your app's version in `overrides`, removes the extra copy and reinstalls.
33
+ - **Angular dev rebuilds no longer fail on React or Svelte when they are not installed**
34
+ In a project without React or Svelte installed, such as a Vue and Angular app, every Angular rebuild in `absolute dev` logged "angular client bundle rebuild failed" with "Could not resolve: react" and "svelte", and the served bundle stayed on its previous version. The Angular dev rebuild now stubs frameworks the project does not install, like the initial build already did.
35
+ - **Backend HMR keeps scoped state created inline in the app, the way create-absolutejs writes it**
36
+ A project made with create-absolutejs creates its scoped state inline: `.use([absolutejs, api, scopedState({ count: { value: 0 } })])`. Editing `server.ts` or `api.ts` re-runs that statement, and `@absolutejs/scoped-state` 0.3 keeps every visitor's session inside the plugin `scopedState()` returns, so each edit made a new, empty one and every count went back to 0. Backend HMR now hands the re-run statement the plugin the same call made last time, so visitors keep their state. This works for any number of `scopedState()` calls in a statement. A call whose arguments you edit starts empty, and the dev server says so. A call you delete is dropped. When the arguments are not plain literals, for example a variable, the call cannot be matched safely, so it still starts empty and the dev server warns you to move it into its own top-level `const` and pass that to `.use()`.
37
+ - **Dev watchers ignore editor temp, swap and lock files**
38
+ The dev server treated some editor and tool temp files as source changes. On macOS, `sed -i` writes a `.!12345!file.ts` file, which made an Angular page rebootstrap and lose its state. The dev watchers, including the one that restarts the server, now ignore `sed -i` temp files from both GNU and macOS, Vim swap files and its `4913` probe, Emacs lock and autosave files, `~` backups, `.tmp` files, JetBrains `___jb_tmp___` and `___jb_old___` files, Chrome `.crswap` files, Kate swap files and gedit's `.goutputstream-` files. The saved file's own change still triggers the update.
39
+ - **Editing a shared partial in dev updates each open HTML or HTMX page with its own content and the new text**
40
+ With two HTML or HTMX pages open that share a partial or layout, editing the partial made every tab show the last page updated. Both tabs showed the same body, and one lost its own `<title>` and other slot content. Each tab now applies only its own page. Live updates also stopped putting the old text back on elements that have an `id`, so an edited partial or page shows its new text there too. Text that a script changed on such an element is still kept.
41
+ - **Production warnings start with [absolutejs] instead of [hmr]**
42
+ Warnings and errors from a production server or build, such as "File route ... is not served", started with `[hmr]` even though production has no HMR. They now start with `[absolutejs]`. The dev server still uses `[hmr]`.
43
+ - **React islands render in production builds** (`Island`)
44
+ A React page that rendered a React `<Island>` returned 500 under `absolute start` with `renderToString is not a function`. Island SSR used React's legacy string renderer, which the production server bundle strips out. Islands now render with `renderToReadableStream`. When the island registry has React islands, the production server bundle also keeps React external. Each island's source loads `react` from node_modules when it first renders, and a second copy inlined into the bundle made the island's hooks fail.
45
+ - **Production builds no longer leave old hashed bundles in the build directory**
46
+ A production build now removes the bundles an earlier build left in the build directory. The cleanup only recognised file hashes made of hex digits, but Bun hashes use letters and digits, so old server bundles, page bundles, workers, fonts and React Server Components bundles piled up with every build. A build now removes older versions of the files it writes, old chunks in the directories it writes chunks to, the `.br` and `.gz` copies of removed files, and the outputs of pages that no longer exist. It keeps a list of its outputs in `build-outputs.json` to find those, and that file is never served. Files you put in the build directory yourself are left alone.
47
+ - **Svelte router pages, and pages whose only content is one component, hydrate without a mismatch warning in dev**
48
+ In dev, every page using the Svelte router logged `[svelte] hydration_mismatch` and was mounted again from scratch, even a page with one `<Route>`. The same happened to any Svelte page or snippet whose only content is one component. The dev server compiles browser components with Svelte's HMR option, which expects a marker comment after such a component, but the server render was compiled without it and left the markers out. The server render now uses the same option in dev, so these pages hydrate cleanly. Production builds were not affected.
49
+ - **`absolute typecheck` accepts imports of Svelte components that have no `<script>` block**
50
+ Importing a `.svelte` component that has no `<script>` block failed `absolute typecheck` with "Could not find a declaration file for module", unless the project's tsconfig set `allowJs`. svelte-check treats a component without `<script lang="ts">` as JavaScript, and without `allowJs` it could not resolve the import. The svelte-check step now enables `allowJs` in the config it generates. JavaScript files are still not type-checked unless the project sets `checkJs`. The generated declaration for such a component, used when server code imports it, is now a complete TypeScript declaration instead of one that names `SvelteComponent` without importing it.
51
+ - **Vue pages that export `routes` work in production builds** (`defineRoutes`, `handleVuePageRequest`)
52
+ A Vue page that exported `routes` returned 500 under `absolute start` with `__VUE_PROD_DEVTOOLS__ is not defined`. vue-router is bundled into the page's server build and reads Vue's compile-time feature flags, which only the client builds defined. The flags are now defined in the server build, the production server bundle, `absolute compile`, the dev dependency vendor and the dev module server. Lazily loaded route components also failed to load in production with a 404, because their build path contains a directory named `%2F` and the server decoded it into a slash. They now load, so a direct visit to a nested URL mounts the route and client-side navigation works.
53
+
54
+ ### Internal
55
+
56
+ - **Mobile release functions’ declarations reorder their result members** (`buildAbsoluteAndroidRelease`, `buildAbsoluteIosRelease`, `buildAbsoluteRemoteIosRelease`, `createAbsoluteMobileCompatibilityArtifact`, `installAbsoluteIosRelease`, `parseAbsoluteMobileCompatibilityArtifact`, `readAbsoluteMobileMaterializedReleases`)
57
+ The published type declarations of these mobile release functions list the members of their inferred result types in a different order. The types are the same; nothing about how they are called or what they return changed.
58
+
9
59
  ## 0.20.0-beta.170 — 2026-11-13
10
60
 
11
61
  ### Breaking
package/README.md CHANGED
@@ -233,6 +233,35 @@ the router manages the scroll position:
233
233
  reload. `goto(url, { noScroll: true })` or `<Link noScroll>` leaves the
234
234
  scroll alone.
235
235
 
236
+ ### Vue router pages
237
+
238
+ A Vue page that exports `routes` becomes a single-page app shell. The page
239
+ installs vue-router with those routes, and one server route can serve every
240
+ child URL:
241
+
242
+ ```vue
243
+ <script lang="ts">
244
+ import { defineRoutes } from '@absolutejs/absolute/vue';
245
+
246
+ export const routes = defineRoutes([
247
+ {
248
+ path: '/app/one',
249
+ component: () => import('./One.vue').then((m) => m.default)
250
+ },
251
+ { path: '/app', redirect: '/app/one' }
252
+ ]);
253
+ </script>
254
+
255
+ <template><RouterView /></template>
256
+ ```
257
+
258
+ Forward `request` to `handleVuePageRequest` so the handler can match the URL.
259
+ The server sends an empty `#root` for these pages, with the child
260
+ routes' CSS already inlined, and the browser renders the route when it mounts.
261
+ Rendering on the server would be thrown away by that client mount and would
262
+ play CSS entrance animations twice. A page with `client: 'none'` has no client
263
+ mount, so it is rendered on the server.
264
+
236
265
  ### Vue server data
237
266
 
238
267
  `useServerData(key, fetcher)` loads data while a Vue page renders on the
@@ -375,9 +404,7 @@ per request, plus `X-Content-Type-Options`, `Referrer-Policy`,
375
404
  `frame-ancestors` and `Permissions-Policy`:
376
405
 
377
406
  ```ts
378
- export const server = new Elysia()
379
- .use(secureHeaders())
380
- .use(absolutejs);
407
+ export const server = new Elysia().use(secureHeaders()).use(absolutejs);
381
408
  ```
382
409
 
383
410
  Scripts run only with the nonce (`'strict-dynamic'`, no `'unsafe-inline'`),
@@ -392,7 +419,9 @@ Turn on `vitals` to report LCP, INP, CLS, FCP and TTFB from real visits:
392
419
 
393
420
  ```ts
394
421
  // absolute.config.ts
395
- vitals: { sampleRate: 0.25 }
422
+ vitals: {
423
+ sampleRate: 0.25;
424
+ }
396
425
  ```
397
426
 
398
427
  Every page then loads a small reporter that sends one batch per page, with
package/changelog.json CHANGED
@@ -2,6 +2,118 @@
2
2
  "contract": 1,
3
3
  "name": "@absolutejs/absolute",
4
4
  "releases": [
5
+ {
6
+ "changes": [
7
+ {
8
+ "detail": "An Angular router page mounted at a wildcard route like `.get('/portal/*', …)` only got `APP_BASE_HREF` when `handleAngularPageRequest(...)` was written directly inside that route. Called from a helper function, no base href was set and the router could not match any route. The base href now comes from the route that matched the request, so `/portal/*` gives `/portal/` wherever the handler call is written, and the browser bootstraps with the same value. Parameterised mounts such as `/t/:tenant/*` use the values from the request URL. A provider you pass in the handler's `providers` option still takes precedence on the server.",
9
+ "kind": "fixed",
10
+ "summary": "Angular APP_BASE_HREF works when the page handler is called from a helper"
11
+ },
12
+ {
13
+ "detail": "When an Angular page module exported `routes` and declared its routed child components in the same file, the build picked the first exported class as the page, so the server and the browser rendered the first routed child as the page root for every URL. The page is now the component that hosts `<router-outlet>`. Without an outlet, the last exported component is the page, and an explicit `export default` still wins.",
14
+ "kind": "fixed",
15
+ "summary": "Angular router pages with routed children in the same file render the right root"
16
+ },
17
+ {
18
+ "detail": "Production builds of Angular pages that import `@absolutejs/absolute/angular` warned \"Server bundle references 2 distinct @angular/core resolutions\" even though every real import used the same copy. The check read text such as `from '@angular/core'` inside string literals in AbsoluteJS's own code as imports. It now reads the bundle's actual imports. `absolute doctor` also checks that each `@angular/*` runtime package resolves to one physical copy, and `absolute doctor --fix` pins your app's version in `overrides`, removes the extra copy and reinstalls.",
19
+ "kind": "fixed",
20
+ "summary": "No more false \"2 distinct @angular/core resolutions\" warning, and doctor finds real duplicates"
21
+ },
22
+ {
23
+ "detail": "In a project without React or Svelte installed, such as a Vue and Angular app, every Angular rebuild in `absolute dev` logged \"angular client bundle rebuild failed\" with \"Could not resolve: react\" and \"svelte\", and the served bundle stayed on its previous version. The Angular dev rebuild now stubs frameworks the project does not install, like the initial build already did.",
24
+ "kind": "fixed",
25
+ "summary": "Angular dev rebuilds no longer fail on React or Svelte when they are not installed"
26
+ },
27
+ {
28
+ "detail": "A project made with create-absolutejs creates its scoped state inline: `.use([absolutejs, api, scopedState({ count: { value: 0 } })])`. Editing `server.ts` or `api.ts` re-runs that statement, and `@absolutejs/scoped-state` 0.3 keeps every visitor's session inside the plugin `scopedState()` returns, so each edit made a new, empty one and every count went back to 0. Backend HMR now hands the re-run statement the plugin the same call made last time, so visitors keep their state. This works for any number of `scopedState()` calls in a statement. A call whose arguments you edit starts empty, and the dev server says so. A call you delete is dropped. When the arguments are not plain literals, for example a variable, the call cannot be matched safely, so it still starts empty and the dev server warns you to move it into its own top-level `const` and pass that to `.use()`.",
29
+ "kind": "fixed",
30
+ "summary": "Backend HMR keeps scoped state created inline in the app, the way create-absolutejs writes it"
31
+ },
32
+ {
33
+ "detail": "The dev server treated some editor and tool temp files as source changes. On macOS, `sed -i` writes a `.!12345!file.ts` file, which made an Angular page rebootstrap and lose its state. The dev watchers, including the one that restarts the server, now ignore `sed -i` temp files from both GNU and macOS, Vim swap files and its `4913` probe, Emacs lock and autosave files, `~` backups, `.tmp` files, JetBrains `___jb_tmp___` and `___jb_old___` files, Chrome `.crswap` files, Kate swap files and gedit's `.goutputstream-` files. The saved file's own change still triggers the update.",
34
+ "kind": "fixed",
35
+ "summary": "Dev watchers ignore editor temp, swap and lock files"
36
+ },
37
+ {
38
+ "detail": "Error convention pages showed the error's own message outside development. A missing static page rendered `error.html` with `{{ message }}` set to \"ENOENT: no such file or directory, open '/srv/app/build/html/pages/Nope.html'\", which exposed the server's file layout. Database and network errors can expose hosts and queries the same way. Outside development, every error convention page (HTML and HTMX `error.html`, and the React, Svelte, Vue and Angular error pages) now receives the message \"Something went wrong while rendering this page.\" and no stack. The built-in error page shown when no convention exists does the same. The `name` prop is unchanged. The full error is still logged on the server, and development still shows the real message and stack.",
39
+ "kind": "security",
40
+ "summary": "Production error pages show a generic message instead of the error text"
41
+ },
42
+ {
43
+ "detail": "With two HTML or HTMX pages open that share a partial or layout, editing the partial made every tab show the last page updated. Both tabs showed the same body, and one lost its own `<title>` and other slot content. Each tab now applies only its own page. Live updates also stopped putting the old text back on elements that have an `id`, so an edited partial or page shows its new text there too. Text that a script changed on such an element is still kept.",
44
+ "kind": "fixed",
45
+ "summary": "Editing a shared partial in dev updates each open HTML or HTMX page with its own content and the new text"
46
+ },
47
+ {
48
+ "detail": "The htmx copy that `absolute add htmx` installs, and that `absolute htmx` reports as the vendored version, is now 2.0.11 instead of 2.0.6. Projects that already have htmx keep their installed copy. Run `absolute htmx 2.0.11` to upgrade one.",
49
+ "kind": "changed",
50
+ "summary": "The bundled htmx is now 2.0.11"
51
+ },
52
+ {
53
+ "detail": "The published type declarations of these mobile release functions list the members of their inferred result types in a different order. The types are the same; nothing about how they are called or what they return changed.",
54
+ "kind": "internal",
55
+ "summary": "Mobile release functions’ declarations reorder their result members",
56
+ "symbols": [
57
+ "buildAbsoluteAndroidRelease",
58
+ "buildAbsoluteIosRelease",
59
+ "buildAbsoluteRemoteIosRelease",
60
+ "createAbsoluteMobileCompatibilityArtifact",
61
+ "installAbsoluteIosRelease",
62
+ "parseAbsoluteMobileCompatibilityArtifact",
63
+ "readAbsoluteMobileMaterializedReleases"
64
+ ]
65
+ },
66
+ {
67
+ "detail": "Under `absolute start`, `GET /manifest.json` returned the build's runtime manifest, which lists the absolute disk path of every SSR page and server bundle (for example `/srv/app/build/react/server/rsc/Dashboard.<hash>.js`). It now returns 404, as `server-outputs.json` and `spa-routes.json` already did, and so do its `.br` and `.gz` copies. The browser never fetched this file. Pages with islands also carried those paths in the inline `window.__ABSOLUTE_MANIFEST__` script. That script now holds only web paths, so island bundles and the islands bootstrap resolve as before. A web-app manifest can no longer be named `manifest.json`: the build overwrote that file with its own manifest, so it was never served. `pwa.manifest.path: '/manifest.json'` is now a build error, and a `manifest.json` in `publicDirectory` logs a warning. Use the default `/manifest.webmanifest`.",
68
+ "kind": "security",
69
+ "summary": "Production no longer serves /manifest.json or puts server file paths in island pages"
70
+ },
71
+ {
72
+ "detail": "Warnings and errors from a production server or build, such as \"File route ... is not served\", started with `[hmr]` even though production has no HMR. They now start with `[absolutejs]`. The dev server still uses `[hmr]`.",
73
+ "kind": "fixed",
74
+ "summary": "Production warnings start with [absolutejs] instead of [hmr]"
75
+ },
76
+ {
77
+ "detail": "A React page that rendered a React `<Island>` returned 500 under `absolute start` with `renderToString is not a function`. Island SSR used React's legacy string renderer, which the production server bundle strips out. Islands now render with `renderToReadableStream`. When the island registry has React islands, the production server bundle also keeps React external. Each island's source loads `react` from node_modules when it first renders, and a second copy inlined into the bundle made the island's hooks fail.",
78
+ "kind": "fixed",
79
+ "summary": "React islands render in production builds",
80
+ "symbols": [
81
+ "Island"
82
+ ]
83
+ },
84
+ {
85
+ "detail": "A production build now removes the bundles an earlier build left in the build directory. The cleanup only recognised file hashes made of hex digits, but Bun hashes use letters and digits, so old server bundles, page bundles, workers, fonts and React Server Components bundles piled up with every build. A build now removes older versions of the files it writes, old chunks in the directories it writes chunks to, the `.br` and `.gz` copies of removed files, and the outputs of pages that no longer exist. It keeps a list of its outputs in `build-outputs.json` to find those, and that file is never served. Files you put in the build directory yourself are left alone.",
86
+ "kind": "fixed",
87
+ "summary": "Production builds no longer leave old hashed bundles in the build directory"
88
+ },
89
+ {
90
+ "detail": "A route handler that threw before returning an HTML or HTMX page got Elysia's JSON 500. Browser navigations and HTMX requests now get the `error.html` from the HTML or HTMX pages directory, with status 500. HTMX requests try the HTMX one first. In production the page shows a generic message and no stack. Other requests, Elysia's own errors and thrown `status(...)` responses are unchanged. This is a fallback: if your app registers its own `onError`, before or after `.use(absolutejs)`, your handler keeps handling these errors and no `error.html` is rendered. The app's handlers are found when the server starts with `.listen()`; an app that only calls `app.handle()` gets `error.html` regardless. See docs/STATIC_PAGE_CONVENTIONS.md.",
91
+ "kind": "changed",
92
+ "summary": "Routes that throw render error.html for HTML and HTMX page requests"
93
+ },
94
+ {
95
+ "detail": "In dev, every page using the Svelte router logged `[svelte] hydration_mismatch` and was mounted again from scratch, even a page with one `<Route>`. The same happened to any Svelte page or snippet whose only content is one component. The dev server compiles browser components with Svelte's HMR option, which expects a marker comment after such a component, but the server render was compiled without it and left the markers out. The server render now uses the same option in dev, so these pages hydrate cleanly. Production builds were not affected.",
96
+ "kind": "fixed",
97
+ "summary": "Svelte router pages, and pages whose only content is one component, hydrate without a mismatch warning in dev"
98
+ },
99
+ {
100
+ "detail": "Importing a `.svelte` component that has no `<script>` block failed `absolute typecheck` with \"Could not find a declaration file for module\", unless the project's tsconfig set `allowJs`. svelte-check treats a component without `<script lang=\"ts\">` as JavaScript, and without `allowJs` it could not resolve the import. The svelte-check step now enables `allowJs` in the config it generates. JavaScript files are still not type-checked unless the project sets `checkJs`. The generated declaration for such a component, used when server code imports it, is now a complete TypeScript declaration instead of one that names `SvelteComponent` without importing it.",
101
+ "kind": "fixed",
102
+ "summary": "`absolute typecheck` accepts imports of Svelte components that have no `<script>` block"
103
+ },
104
+ {
105
+ "detail": "A Vue page that exported `routes` returned 500 under `absolute start` with `__VUE_PROD_DEVTOOLS__ is not defined`. vue-router is bundled into the page's server build and reads Vue's compile-time feature flags, which only the client builds defined. The flags are now defined in the server build, the production server bundle, `absolute compile`, the dev dependency vendor and the dev module server. Lazily loaded route components also failed to load in production with a 404, because their build path contains a directory named `%2F` and the server decoded it into a slash. They now load, so a direct visit to a nested URL mounts the route and client-side navigation works.",
106
+ "kind": "fixed",
107
+ "summary": "Vue pages that export `routes` work in production builds",
108
+ "symbols": [
109
+ "defineRoutes",
110
+ "handleVuePageRequest"
111
+ ]
112
+ }
113
+ ],
114
+ "date": "2026-11-13",
115
+ "version": "0.20.0-beta.171"
116
+ },
5
117
  {
6
118
  "changes": [
7
119
  {
@@ -9092,7 +9092,7 @@ var require_cjs = __commonJS(function(exports) {
9092
9092
  var ENV_VAR = "NODE_ENV", getNodeEnv = () => process.env[ENV_VAR], isDevelopmentRuntime = () => process.env[ENV_VAR] === "development", isProductionRuntime = () => process.env[ENV_VAR] === "production";
9093
9093
 
9094
9094
  // src/constants.ts
9095
- var ANGULAR_INIT_TIMEOUT_MS = 500, ANSI_ESCAPE_CODE = 27, ANSI_ESCAPE_LENGTH = 3, ASCII_SPACE = 32, BASE_36_RADIX = 36, BUN_BUILD_WARNING_SUPPRESSION = "wildcard sideEffects are not supported yet", TAILWIND_BUN_CSS_WARNING_PATTERN, BODY_SLICE_LENGTH = 2000, BYTES_PER_KILOBYTE = 1024, CLI_ARGS_OFFSET = 3, CSS_ERROR_RESOLVE_DELAY_MS = 50, CSS_MAX_CHECK_ATTEMPTS = 10, CSS_MAX_PARSE_TIMEOUT_MS = 500, CSS_RELOAD_BACKOFF_BASE_MS = 1000, CSS_RELOAD_BACKOFF_MAX_MS = 60000, CSS_SHEET_READY_TIMEOUT_MS = 100, DEFAULT_CHUNK_SIZE = 16384, DEFAULT_DEBOUNCE_MS = 15, DEFAULT_PORT = 3000, DEV_SERVER_RESTART_DEBOUNCE_MS = 100, DOM_UPDATE_DELAY_MS = 50, FILE_PROTOCOL_PREFIX_LENGTH = 7, FOCUS_ID_PREFIX_LENGTH = 3, FOCUS_IDX_PREFIX_LENGTH = 4, FOCUS_NAME_PREFIX_LENGTH = 5, ESLINT_STUDIO_DEFAULT_HOST = "eslint.absolute.localhost", ESLINT_STUDIO_DEFAULT_PORT = 4099, CONFIG_DEFAULT_HOST = "config.absolute.localhost", CONFIG_DEFAULT_PORT = 4099, HMR_UPDATE_TIMEOUT_MS = 2000, HOOK_SIGNATURE_LENGTH = 12, EXCLUDE_LAST_OFFSET = -1, HTTP_STATUS_OK = 200, HTTP_STATUS_BAD_REQUEST = 400, HTTP_STATUS_NOT_FOUND = 404, HTTP_STATUS_GONE = 410, HOURS_IN_DAY = 24, HOURS_IN_HALF_DAY = 12, IMAGE_DEFAULT_DEVICE_SIZES, IMAGE_DEFAULT_IMAGE_SIZES, IMAGE_DEFAULT_QUALITY = 75, IMAGE_GLOB_SUFFIX_LENGTH = 2, INSTANCE_PROBE_TIMEOUT_MS = 250, MAX_ERROR_LENGTH = 200, MAX_RECONNECT_ATTEMPTS = 60, MILLISECONDS_IN_A_SECOND = 1000, MINUTES_IN_AN_HOUR = 60, SECONDS_IN_A_MINUTE = 60, MILLISECONDS_IN_A_MINUTE, MILLISECONDS_IN_A_DAY, OVERLAY_FADE_DURATION_MS = 150, PING_INTERVAL_MS = 30000, LIST_LOG_TAIL_MAX_BYTES = 65536, LIST_TUI_COLUMN_GAP = 2, LIST_TUI_DEFAULT_HEIGHT = 28, LIST_TUI_DEFAULT_WIDTH = 100, LIST_TUI_ESCAPE_SEQUENCE_TIMEOUT_MS = 30, LIST_TUI_FOOTER_LINE_COUNT = 2, LIST_TUI_MARKER_WIDTH = 2, LIST_TUI_MIN_LOG_HEIGHT = 3, LIST_TUI_MIN_URL_WIDTH = 16, LIST_TUI_RENDER_DEBOUNCE_MS = 16, LIST_TUI_STATUS_MESSAGE_TIMEOUT_MS = 4000, LIST_WATCH_REFRESH_MS = 1000, RAF_BATCH_COUNT = 3, RANDOM_ID_END_INDEX = 11, REBUILD_BATCH_DELAY_MS = 10, REBUILD_RELOAD_DELAY_MS = 200, RECONNECT_INITIAL_DELAY_MS = 500, RECONNECT_POLL_INTERVAL_MS = 300, REACT_STREAM_SLOT_FAST_DELAY_MS = 5, REACT_STREAM_SLOT_SLOW_DELAY_MS = 20, SIGINT_EXIT_CODE = 130, SIGTERM_EXIT_CODE = 143, SVELTE_CSS_LOAD_TIMEOUT_MS = 500, TIME_PRECISION = 2, TWO_THIRDS, UNFOUND_INDEX = -1, WEBSOCKET_NORMAL_CLOSURE = 1000, DEFAULT_WEBSOCKET_IDLE_TIMEOUT_SECONDS = 240, DEFAULT_HTTP_IDLE_TIMEOUT_SECONDS = 240, MAX_HTTP_IDLE_TIMEOUT_SECONDS = 255, WORKSPACE_COMMAND_ARGS_OFFSET = 3, WORKSPACE_FAILURE_LOG_PRINT_LIMIT = 30, WORKSPACE_FAILURE_RECENT_LOG_LIMIT = 60, WORKSPACE_READY_ATTEMPT_TIMEOUT_MS = 5000, WORKSPACE_READY_PROBE_INTERVAL_MS = 250, WORKSPACE_READY_TIMEOUT_MS = 30000, WORKSPACE_SHUTDOWN_TIMEOUT_MS = 1e4, WORKSPACE_TUI_DEFAULT_HEIGHT = 28, WORKSPACE_TUI_DEFAULT_WIDTH = 100, WORKSPACE_TUI_ESCAPE_SEQUENCE_TIMEOUT_MS = 30, WORKSPACE_TUI_FOOTER_LINE_COUNT = 3, WORKSPACE_TUI_MIN_LOG_HEIGHT = 3, WORKSPACE_TUI_MIN_SERVICE_NAME_WIDTH = 7, WORKSPACE_TUI_MIN_TARGET_WIDTH = 8, WORKSPACE_TUI_MIN_WRAP_WIDTH = 12, WORKSPACE_TUI_PROMPT_CURSOR_OFFSET = 3, WORKSPACE_TUI_RECENT_LOG_LIMIT = 40, WORKSPACE_TUI_RENDER_DEBOUNCE_MS = 16, WORKSPACE_TUI_STATUS_WIDTH = 10, WORKSPACE_TUI_TARGET_PADDING_WIDTH = 6, WORKSPACE_TUI_VISIBILITY_WIDTH = 8;
9095
+ var ANGULAR_INIT_TIMEOUT_MS = 500, ANSI_ESCAPE_CODE = 27, ANSI_ESCAPE_LENGTH = 3, ASCII_SPACE = 32, BASE_36_RADIX = 36, BUN_BUILD_WARNING_SUPPRESSION = "wildcard sideEffects are not supported yet", TAILWIND_BUN_CSS_WARNING_PATTERN, BODY_SLICE_LENGTH = 2000, BYTES_PER_KILOBYTE = 1024, CLI_ARGS_OFFSET = 3, CSS_ERROR_RESOLVE_DELAY_MS = 50, CSS_MAX_CHECK_ATTEMPTS = 10, CSS_MAX_PARSE_TIMEOUT_MS = 500, CSS_RELOAD_BACKOFF_BASE_MS = 1000, CSS_RELOAD_BACKOFF_MAX_MS = 60000, CSS_SHEET_READY_TIMEOUT_MS = 100, DEFAULT_CHUNK_SIZE = 16384, DEFAULT_DEBOUNCE_MS = 15, DEFAULT_PORT = 3000, DEV_SERVER_RESTART_DEBOUNCE_MS = 100, DOM_UPDATE_DELAY_MS = 50, FILE_PROTOCOL_PREFIX_LENGTH = 7, FOCUS_ID_PREFIX_LENGTH = 3, FOCUS_IDX_PREFIX_LENGTH = 4, FOCUS_NAME_PREFIX_LENGTH = 5, ESLINT_STUDIO_DEFAULT_HOST = "eslint.absolute.localhost", ESLINT_STUDIO_DEFAULT_PORT = 4099, CONFIG_DEFAULT_HOST = "config.absolute.localhost", CONFIG_DEFAULT_PORT = 4099, HMR_UPDATE_TIMEOUT_MS = 2000, HOOK_SIGNATURE_LENGTH = 12, EXCLUDE_LAST_OFFSET = -1, HTTP_STATUS_OK = 200, HTTP_STATUS_BAD_REQUEST = 400, HTTP_STATUS_NOT_FOUND = 404, HTTP_STATUS_GONE = 410, HTTP_STATUS_INTERNAL_SERVER_ERROR = 500, HOURS_IN_DAY = 24, HOURS_IN_HALF_DAY = 12, IMAGE_DEFAULT_DEVICE_SIZES, IMAGE_DEFAULT_IMAGE_SIZES, IMAGE_DEFAULT_QUALITY = 75, IMAGE_GLOB_SUFFIX_LENGTH = 2, INSTANCE_PROBE_TIMEOUT_MS = 250, MAX_ERROR_LENGTH = 200, MAX_RECONNECT_ATTEMPTS = 60, MILLISECONDS_IN_A_SECOND = 1000, MINUTES_IN_AN_HOUR = 60, SECONDS_IN_A_MINUTE = 60, MILLISECONDS_IN_A_MINUTE, MILLISECONDS_IN_A_DAY, OVERLAY_FADE_DURATION_MS = 150, PING_INTERVAL_MS = 30000, LIST_LOG_TAIL_MAX_BYTES = 65536, LIST_TUI_COLUMN_GAP = 2, LIST_TUI_DEFAULT_HEIGHT = 28, LIST_TUI_DEFAULT_WIDTH = 100, LIST_TUI_ESCAPE_SEQUENCE_TIMEOUT_MS = 30, LIST_TUI_FOOTER_LINE_COUNT = 2, LIST_TUI_MARKER_WIDTH = 2, LIST_TUI_MIN_LOG_HEIGHT = 3, LIST_TUI_MIN_URL_WIDTH = 16, LIST_TUI_RENDER_DEBOUNCE_MS = 16, LIST_TUI_STATUS_MESSAGE_TIMEOUT_MS = 4000, LIST_WATCH_REFRESH_MS = 1000, RAF_BATCH_COUNT = 3, RANDOM_ID_END_INDEX = 11, REBUILD_BATCH_DELAY_MS = 10, REBUILD_RELOAD_DELAY_MS = 200, RECONNECT_INITIAL_DELAY_MS = 500, RECONNECT_POLL_INTERVAL_MS = 300, REACT_STREAM_SLOT_FAST_DELAY_MS = 5, REACT_STREAM_SLOT_SLOW_DELAY_MS = 20, SIGINT_EXIT_CODE = 130, SIGTERM_EXIT_CODE = 143, SVELTE_CSS_LOAD_TIMEOUT_MS = 500, TIME_PRECISION = 2, TWO_THIRDS, UNFOUND_INDEX = -1, WEBSOCKET_NORMAL_CLOSURE = 1000, DEFAULT_WEBSOCKET_IDLE_TIMEOUT_SECONDS = 240, DEFAULT_HTTP_IDLE_TIMEOUT_SECONDS = 240, MAX_HTTP_IDLE_TIMEOUT_SECONDS = 255, WORKSPACE_COMMAND_ARGS_OFFSET = 3, WORKSPACE_FAILURE_LOG_PRINT_LIMIT = 30, WORKSPACE_FAILURE_RECENT_LOG_LIMIT = 60, WORKSPACE_READY_ATTEMPT_TIMEOUT_MS = 5000, WORKSPACE_READY_PROBE_INTERVAL_MS = 250, WORKSPACE_READY_TIMEOUT_MS = 30000, WORKSPACE_SHUTDOWN_TIMEOUT_MS = 1e4, WORKSPACE_TUI_DEFAULT_HEIGHT = 28, WORKSPACE_TUI_DEFAULT_WIDTH = 100, WORKSPACE_TUI_ESCAPE_SEQUENCE_TIMEOUT_MS = 30, WORKSPACE_TUI_FOOTER_LINE_COUNT = 3, WORKSPACE_TUI_MIN_LOG_HEIGHT = 3, WORKSPACE_TUI_MIN_SERVICE_NAME_WIDTH = 7, WORKSPACE_TUI_MIN_TARGET_WIDTH = 8, WORKSPACE_TUI_MIN_WRAP_WIDTH = 12, WORKSPACE_TUI_PROMPT_CURSOR_OFFSET = 3, WORKSPACE_TUI_RECENT_LOG_LIMIT = 40, WORKSPACE_TUI_RENDER_DEBOUNCE_MS = 16, WORKSPACE_TUI_STATUS_WIDTH = 10, WORKSPACE_TUI_TARGET_PADDING_WIDTH = 6, WORKSPACE_TUI_VISIBILITY_WIDTH = 8;
9096
9096
  var init_constants = __esm(() => {
9097
9097
  TAILWIND_BUN_CSS_WARNING_PATTERN = /invalid @ rule encountered: '@(theme|tailwind|source|utility|variant|custom-variant|apply|reference|plugin|config)'/;
9098
9098
  IMAGE_DEFAULT_DEVICE_SIZES = [
@@ -10357,5 +10357,5 @@ export {
10357
10357
  withPendingTask
10358
10358
  };
10359
10359
 
10360
- //# debugId=9E0C82D99D386E9864756E2164756E21
10360
+ //# debugId=244693C5959A9FB164756E2164756E21
10361
10361
  //# sourceMappingURL=browser.js.map