@absolutejs/absolute 0.20.0-beta.165 → 0.20.0-beta.167

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/CHANGELOG.md CHANGED
@@ -6,6 +6,20 @@ 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.167 — 2026-11-09
10
+
11
+ ### Fixed
12
+
13
+ - **Refresh imported CSS, stylesheet dependencies, and changed image assets during HMR**
14
+ CSS imported by JavaScript remained in stale style nodes while style-update only reloaded linked bundles. Refresh source stylesheet modules in place to preserve cascade order, rebuild configured CSS entries when imported partials change outside stylesConfig, and run CSS-only incremental builds. Static asset updates now invalidate matching image and favicon URLs. The dev launcher selects patched Bun 1.4.4+absolute.2. React, CSS, logo, and favicon changes were verified in an open Job Tracker page without navigation.
15
+
16
+ ## 0.20.0-beta.166 — 2026-11-06
17
+
18
+ ### Fixed
19
+
20
+ - **Production client bundles use the production build of every package**
21
+ Production client bundles compiled `process.env.NODE_ENV` as development, because Bun.build does so unless told otherwise, whatever the environment says. React's own vendor build was already fixed, but anything else a page bundled took its development build. That made bundles larger and slower, and could pair a package's development code with production React: the reconciler inside @react-three/fiber reads React's `actQueue`, which production React doesn't have, and threw on absolutejs.ai's billing page. React, other-framework, island and worker client builds now say production in a production build. Development builds are unchanged.
22
+
9
23
  ## 0.20.0-beta.165 — 2026-11-05
10
24
 
11
25
  ### Added
package/changelog.json CHANGED
@@ -2,6 +2,28 @@
2
2
  "contract": 1,
3
3
  "name": "@absolutejs/absolute",
4
4
  "releases": [
5
+ {
6
+ "changes": [
7
+ {
8
+ "detail": "CSS imported by JavaScript remained in stale style nodes while style-update only reloaded linked bundles. Refresh source stylesheet modules in place to preserve cascade order, rebuild configured CSS entries when imported partials change outside stylesConfig, and run CSS-only incremental builds. Static asset updates now invalidate matching image and favicon URLs. The dev launcher selects patched Bun 1.4.4+absolute.2. React, CSS, logo, and favicon changes were verified in an open Job Tracker page without navigation.",
9
+ "kind": "fixed",
10
+ "summary": "Refresh imported CSS, stylesheet dependencies, and changed image assets during HMR"
11
+ }
12
+ ],
13
+ "date": "2026-11-09",
14
+ "version": "0.20.0-beta.167"
15
+ },
16
+ {
17
+ "changes": [
18
+ {
19
+ "detail": "Production client bundles compiled `process.env.NODE_ENV` as development, because Bun.build does so unless told otherwise, whatever the environment says. React's own vendor build was already fixed, but anything else a page bundled took its development build. That made bundles larger and slower, and could pair a package's development code with production React: the reconciler inside @react-three/fiber reads React's `actQueue`, which production React doesn't have, and threw on absolutejs.ai's billing page. React, other-framework, island and worker client builds now say production in a production build. Development builds are unchanged.",
20
+ "kind": "fixed",
21
+ "summary": "Production client bundles use the production build of every package"
22
+ }
23
+ ],
24
+ "date": "2026-11-06",
25
+ "version": "0.20.0-beta.166"
26
+ },
5
27
  {
6
28
  "changes": [
7
29
  {
@@ -300,10 +322,10 @@
300
322
  {
301
323
  "changes": [
302
324
  {
303
- "detail": "Elysia 2.0.0-rc.0 renamed every lifecycle hook to its `on` form (request \u2192 onRequest, beforeHandle \u2192 onBeforeHandle, afterHandle \u2192 onAfterHandle, afterResponse \u2192 onAfterResponse, error \u2192 onError, parse \u2192 onParse, transform \u2192 onTransform) and removed setup/cleanup in favour of onStart/onStop. The framework now builds, tests and ships against Elysia 2.0.0-rc.0 and the matching @elysia plugins, and requires `elysia ^2.0.0-rc.0`, so it also accepts later release candidates and 2.0.0. It moves with the packages that made the same change: @absolutejs/auth 0.101 and @absolutejs/sync 3, plus pwa, sync-capacitor and sync-expo releases that accept sync 3.",
325
+ "detail": "Elysia 2.0.0-rc.0 renamed every lifecycle hook to its `on` form (request → onRequest, beforeHandle → onBeforeHandle, afterHandle → onAfterHandle, afterResponse → onAfterResponse, error → onError, parse → onParse, transform → onTransform) and removed setup/cleanup in favour of onStart/onStop. The framework now builds, tests and ships against Elysia 2.0.0-rc.0 and the matching @elysia plugins, and requires `elysia ^2.0.0-rc.0`, so it also accepts later release candidates and 2.0.0. It moves with the packages that made the same change: @absolutejs/auth 0.101 and @absolutejs/sync 3, plus pwa, sync-capacitor and sync-expo releases that accept sync 3.",
304
326
  "kind": "breaking",
305
327
  "migration": {
306
- "instruction": "Upgrade `elysia` and every `@elysia/*` package to 2.0.0-rc.0 or later, `@absolutejs/auth` to 0.101 or later and `@absolutejs/sync` to 3. Then rename lifecycle hooks in your server: request \u2192 onRequest, beforeHandle \u2192 onBeforeHandle, afterHandle \u2192 onAfterHandle, afterResponse \u2192 onAfterResponse, error \u2192 onError, parse \u2192 onParse, transform \u2192 onTransform; replace setup/cleanup with onStart/onStop. The codemod at absolutejs/scripts codemods/elysia-rc-hooks.ts does the renames (run it before upgrading Elysia).",
328
+ "instruction": "Upgrade `elysia` and every `@elysia/*` package to 2.0.0-rc.0 or later, `@absolutejs/auth` to 0.101 or later and `@absolutejs/sync` to 3. Then rename lifecycle hooks in your server: request → onRequest, beforeHandle → onBeforeHandle, afterHandle → onAfterHandle, afterResponse → onAfterResponse, error → onError, parse → onParse, transform → onTransform; replace setup/cleanup with onStart/onStop. The codemod at absolutejs/scripts codemods/elysia-rc-hooks.ts does the renames (run it before upgrading Elysia).",
307
329
  "manual": true
308
330
  },
309
331
  "summary": "Requires Elysia 2.0.0-rc.0, @absolutejs/auth 0.101 and @absolutejs/sync 3",
@@ -324,7 +346,7 @@
324
346
  "summary": "Browser test recordings and reports no longer restart absolute dev"
325
347
  },
326
348
  {
327
- "detail": "An app that imports one of its own workspace packages (`\"@acme/core\": \"workspace:*\"`) did not run under `absolute dev`. With Bun's isolated linker, the default for a workspace, the dev build imported the package from the framework's own folder, could not find it, and the server crash-looped. With the hoisted linker the page rendered but never hydrated: modules outside the app's folder were addressed as `/@src/../\u2026`, which a browser collapses before asking, so they 404ed. Now a package that resolves to source outside node_modules is the app's own code: served and transpiled like the app's files rather than vendored, its folder watched, and an edit to it hot-reloads in place (server and browser) instead of restarting the server or reloading the page. Packages are read from the app's folder, so any dependency only the app declares also works under the isolated linker, and the dev server serves files outside the app folder (a workspace package, a node_modules hoisted to the workspace root) through `/@src/@up/\u2026`. A `dev.watchDirs` entry or a symlink written to work around this is no longer needed.",
349
+ "detail": "An app that imports one of its own workspace packages (`\"@acme/core\": \"workspace:*\"`) did not run under `absolute dev`. With Bun's isolated linker, the default for a workspace, the dev build imported the package from the framework's own folder, could not find it, and the server crash-looped. With the hoisted linker the page rendered but never hydrated: modules outside the app's folder were addressed as `/@src/../…`, which a browser collapses before asking, so they 404ed. Now a package that resolves to source outside node_modules is the app's own code: served and transpiled like the app's files rather than vendored, its folder watched, and an edit to it hot-reloads in place (server and browser) instead of restarting the server or reloading the page. Packages are read from the app's folder, so any dependency only the app declares also works under the isolated linker, and the dev server serves files outside the app folder (a workspace package, a node_modules hoisted to the workspace root) through `/@src/@up/…`. A `dev.watchDirs` entry or a symlink written to work around this is no longer needed.",
328
350
  "kind": "fixed",
329
351
  "summary": "`absolute dev` runs apps that import their own workspace packages, under Bun's isolated or hoisted linker, with hot reload"
330
352
  },
@@ -363,7 +385,7 @@
363
385
  {
364
386
  "detail": "Production builds bundled React into its vendor files without setting `process.env.NODE_ENV`, so React picked its development build: `react-dom_client.js` was 903 KB, and React ran its development checks in every production page. Production builds now set `process.env.NODE_ENV` to `\"production\"`: 400 KB, 81 KB gzipped. Only whitespace is minified; renaming identifiers or minifying syntax across the split vendor chunks makes Bun emit an export named `__INVALID__REF__`, which stopped compiled executables from hydrating. `absolute dev` is unchanged; Fast Refresh needs the development build.",
365
387
  "kind": "fixed",
366
- "summary": "Production builds ship React's production build (react-dom 903 KB \u2192 400 KB, no development checks)"
388
+ "summary": "Production builds ship React's production build (react-dom 903 KB → 400 KB, no development checks)"
367
389
  },
368
390
  {
369
391
  "detail": "React Fast Refresh updates the components it registered. Editing a module that registers none (a class component, or a `memo`/`forwardRef` wrapper the transpiler does not register) re-ran only that module, and its importer kept rendering the old one, so the edit never showed until a reload. The update now also re-imports the module's importers up to the nearest one that registers a component, so the edit appears and the rest of the page keeps its state.",
@@ -537,7 +559,7 @@
537
559
  "summary": "The dev server starts when a server module re-exports with inline `type` specifiers"
538
560
  },
539
561
  {
540
- "detail": "In 0.20.0-beta.129 the published package bundles the dev bootstrap separately from the code that reacts to file changes, and each bundle kept its own copy of the hot runtime's state. The file-change side never saw what the bootstrap had installed, so every server edit was reported as not hot-managed and restarted the server, which is the behaviour backend HMR was meant to remove. The state now lives on `globalThis`, so every bundle shares one runtime. A server edit now updates in place in the published package as well, at about 50\u2013250ms for a handler and about 150\u2013300ms for a plugin or the server entry on a large app.",
562
+ "detail": "In 0.20.0-beta.129 the published package bundles the dev bootstrap separately from the code that reacts to file changes, and each bundle kept its own copy of the hot runtime's state. The file-change side never saw what the bootstrap had installed, so every server edit was reported as not hot-managed and restarted the server, which is the behaviour backend HMR was meant to remove. The state now lives on `globalThis`, so every bundle shares one runtime. A server edit now updates in place in the published package as well, at about 50–250ms for a handler and about 150–300ms for a plugin or the server entry on a large app.",
541
563
  "kind": "fixed",
542
564
  "summary": "Server edits update in place in the published package instead of restarting"
543
565
  },
@@ -558,7 +580,7 @@
558
580
  {
559
581
  "changes": [
560
582
  {
561
- "detail": "Editing a server module in development used to restart the whole server: a second or more of downtime, every open page dropped, every connection, pool, queue worker and in-memory cache rebuilt. Server modules are now updated in place, statement by statement. A save re-runs only the top-level statements whose own text changed, those that use something that changed, and the importer statements that call a changed export; everything else (database pools, workers, caches, `let` state) is kept as it was. React pages and components the server imports for SSR are updated the same way, so the next request renders the edit. A handler edit typically lands in 1\u201350ms with nothing else re-run, and exactly one update is applied per save. What a replaced statement started is stopped before its replacement runs: intervals, timeouts and timer chains (cron libraries included), immediates, `process` listeners, extra `Bun.serve` servers (a fixed port is handed over), workers and `onHotDispose` callbacks. Work started by requests and WebSocket events is never stopped. Rebuilding the Elysia app swaps it onto the running server and runs the old app's `cleanup` and the new app's `setup` hooks, as a stop followed by a listen would. An edit that fails to parse or throws while running keeps the previous version serving, and everything it started is rolled back; the fix applies normally. Set `ABSOLUTE_BACKEND_HMR=0` to restart on server edits as before. See docs/BACKEND_HMR.md.",
583
+ "detail": "Editing a server module in development used to restart the whole server: a second or more of downtime, every open page dropped, every connection, pool, queue worker and in-memory cache rebuilt. Server modules are now updated in place, statement by statement. A save re-runs only the top-level statements whose own text changed, those that use something that changed, and the importer statements that call a changed export; everything else (database pools, workers, caches, `let` state) is kept as it was. React pages and components the server imports for SSR are updated the same way, so the next request renders the edit. A handler edit typically lands in 1–50ms with nothing else re-run, and exactly one update is applied per save. What a replaced statement started is stopped before its replacement runs: intervals, timeouts and timer chains (cron libraries included), immediates, `process` listeners, extra `Bun.serve` servers (a fixed port is handed over), workers and `onHotDispose` callbacks. Work started by requests and WebSocket events is never stopped. Rebuilding the Elysia app swaps it onto the running server and runs the old app's `cleanup` and the new app's `setup` hooks, as a stop followed by a listen would. An edit that fails to parse or throws while running keeps the previous version serving, and everything it started is rolled back; the fix applies normally. Set `ABSOLUTE_BACKEND_HMR=0` to restart on server edits as before. See docs/BACKEND_HMR.md.",
562
584
  "kind": "added",
563
585
  "summary": "Server code edits in development update the running server in place instead of restarting it",
564
586
  "symbols": [
@@ -602,7 +624,7 @@
602
624
  {
603
625
  "changes": [
604
626
  {
605
- "detail": "When a page failed its on-demand build in development, the handler threw `Asset \"<Page>\" not found in manifest.` and left the response to whichever error handler answered first. An app with its own `onError` (most real apps) showed its generic error page, so the actual cause \u2014 a missing import, a syntax error \u2014 was only in the terminal. Page handlers for Vue, React, Svelte, Angular and Ember now return a Build Error page themselves, with the build's own error message, and the page reloads by itself once a rebuild lands or the dev server comes back. AbsoluteJS's fallback error page for missing assets shows the same build error.",
627
+ "detail": "When a page failed its on-demand build in development, the handler threw `Asset \"<Page>\" not found in manifest.` and left the response to whichever error handler answered first. An app with its own `onError` (most real apps) showed its generic error page, so the actual cause — a missing import, a syntax error — was only in the terminal. Page handlers for Vue, React, Svelte, Angular and Ember now return a Build Error page themselves, with the build's own error message, and the page reloads by itself once a rebuild lands or the dev server comes back. AbsoluteJS's fallback error page for missing assets shows the same build error.",
606
628
  "kind": "fixed",
607
629
  "summary": "A page that fails to build in development shows the real build error and reloads itself once fixed",
608
630
  "symbols": [
@@ -611,7 +633,7 @@
611
633
  ]
612
634
  },
613
635
  {
614
- "detail": "Any changed file no HMR pipeline handled restarted the dev server, including documentation and test files the server never runs. Each restart dropped every open page for seconds and rebuilt them from nothing. Now documents (`.md`, `.txt`, \u2026) and test files never restart it; code modules restart it only when the running server process has loaded them (a module nothing has imported yet loads fresh on first use); config such as `.env`, `package.json` and `tsconfig.json` still does.",
636
+ "detail": "Any changed file no HMR pipeline handled restarted the dev server, including documentation and test files the server never runs. Each restart dropped every open page for seconds and rebuilt them from nothing. Now documents (`.md`, `.txt`, …) and test files never restart it; code modules restart it only when the running server process has loaded them (a module nothing has imported yet loads fresh on first use); config such as `.env`, `package.json` and `tsconfig.json` still does.",
615
637
  "kind": "fixed",
616
638
  "summary": "Editing docs, tests or code the server never loaded no longer restarts the dev server"
617
639
  }
@@ -649,7 +671,7 @@
649
671
  {
650
672
  "changes": [
651
673
  {
652
- "detail": "The Vue build copies every `.ts` helper a page reaches into its generated tree, but it found them with a regex that only matched `import \u2026 from`. A helper reached only through a re-export (`export { x } from './y'` or `export * from './y'`) was never copied, so the build failed with `Could not resolve: \"./y\"` and every page above it answered 500 in dev. Dependencies are now read with Bun's import scanner, which sees imports, dynamic imports and all three re-export forms; a regex that also covers re-exports is the fallback for source that does not parse.",
674
+ "detail": "The Vue build copies every `.ts` helper a page reaches into its generated tree, but it found them with a regex that only matched `import … from`. A helper reached only through a re-export (`export { x } from './y'` or `export * from './y'`) was never copied, so the build failed with `Could not resolve: \"./y\"` and every page above it answered 500 in dev. Dependencies are now read with Bun's import scanner, which sees imports, dynamic imports and all three re-export forms; a regex that also covers re-exports is the fallback for source that does not parse.",
653
675
  "kind": "fixed",
654
676
  "summary": "Vue pages that reach a helper through a re-export build again"
655
677
  }
@@ -1067,7 +1089,7 @@
1067
1089
  {
1068
1090
  "changes": [
1069
1091
  {
1070
- "detail": "The provider-neutral release command now installs the exact Capacitor AAB-derived APK set on the managed emulator, takes both network transports offline, and requires an AbsoluteJS-owned native readiness signal across a cold launch and process relaunch. Bun workspace-hoisted Capacitor executables and package manifests are resolved only through the application\u2019s governing workspace. Reports and telemetry retain only provider, artifact identity, outcome, and bounded timings.",
1092
+ "detail": "The provider-neutral release command now installs the exact Capacitor AAB-derived APK set on the managed emulator, takes both network transports offline, and requires an AbsoluteJS-owned native readiness signal across a cold launch and process relaunch. Bun workspace-hoisted Capacitor executables and package manifests are resolved only through the application’s governing workspace. Reports and telemetry retain only provider, artifact identity, outcome, and bounded timings.",
1071
1093
  "kind": "added",
1072
1094
  "summary": "Capacitor Android releases gain installed offline AAB acceptance"
1073
1095
  }
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- // .angular-partial-tmp-IooXgx/src/core/streamingSlotRegistrar.ts
2
+ // .angular-partial-tmp-0mmkCI/src/core/streamingSlotRegistrar.ts
3
3
  var STREAMING_SLOT_REGISTRAR_KEY = Symbol.for("absolutejs.streamingSlotRegistrar");
4
4
  var STREAMING_SLOT_WARNING_STORAGE_KEY = Symbol.for("absolutejs.streamingSlotWarningController");
5
5
  var STREAMING_SLOT_COLLECTION_STORAGE_KEY = Symbol.for("absolutejs.streamingSlotCollectionController");
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- // .angular-partial-tmp-IooXgx/src/core/streamingSlotRegistrar.ts
2
+ // .angular-partial-tmp-0mmkCI/src/core/streamingSlotRegistrar.ts
3
3
  var STREAMING_SLOT_REGISTRAR_KEY = Symbol.for("absolutejs.streamingSlotRegistrar");
4
4
  var STREAMING_SLOT_WARNING_STORAGE_KEY = Symbol.for("absolutejs.streamingSlotWarningController");
5
5
  var STREAMING_SLOT_COLLECTION_STORAGE_KEY = Symbol.for("absolutejs.streamingSlotCollectionController");
@@ -46,7 +46,7 @@ var warnMissingStreamingSlotCollector = (primitiveName) => {
46
46
  getWarningController()?.maybeWarn(primitiveName);
47
47
  };
48
48
 
49
- // .angular-partial-tmp-IooXgx/src/core/streamingSlotRegistry.ts
49
+ // .angular-partial-tmp-0mmkCI/src/core/streamingSlotRegistry.ts
50
50
  var STREAMING_SLOT_STORAGE_KEY = Symbol.for("absolutejs.streamingSlotAsyncLocalStorage");
51
51
  var isObjectRecord2 = (value) => Boolean(value) && typeof value === "object";
52
52
  var isAsyncLocalStorage = (value) => isObjectRecord2(value) && ("getStore" in value) && typeof value.getStore === "function" && ("run" in value) && typeof value.run === "function";
package/dist/build.js CHANGED
@@ -12694,7 +12694,7 @@ var resolveBuildDevelopmentMode = (mode, nodeEnv) => mode === "development" || m
12694
12694
  __VUE_OPTIONS_API__: "true",
12695
12695
  __VUE_PROD_DEVTOOLS__: development ? "true" : "false",
12696
12696
  __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: development ? "true" : "false"
12697
- });
12697
+ }), resolveClientDefine = (development, define = {}) => development ? define : { ...define, "process.env.NODE_ENV": '"production"' };
12698
12698
 
12699
12699
  // src/utils/commonAncestor.ts
12700
12700
  var commonAncestor = (paths, fallback) => {
@@ -23343,6 +23343,8 @@ ${offenders.map((o) => ` \u2022 ${o}`).join(`
23343
23343
  const buildStart = performance.now();
23344
23344
  const isDev = resolveBuildDevelopmentMode(mode, env2.NODE_ENV);
23345
23345
  const vueFeatureFlags = resolveVueFeatureFlags(isDev);
23346
+ const clientDefine = resolveClientDefine(isDev);
23347
+ const clientDefineWithVue = resolveClientDefine(isDev, vueDirectory ? vueFeatureFlags : {});
23346
23348
  const projectRoot = cwd();
23347
23349
  const devServerExternalsPlugins = isDev ? [
23348
23350
  createDevServerExternalsPlugin({
@@ -23727,7 +23729,7 @@ ${offenders.map((o) => ` \u2022 ${o}`).join(`
23727
23729
  ...allAngularEntries.map((source) => toDevPageEntry("angular", source)),
23728
23730
  ...allEmberEntries.map((source) => toDevPageEntry("ember", source))
23729
23731
  ] : [];
23730
- const globalCssEntries = isIncremental ? filterToIncrementalEntries(allGlobalCssEntries, (entry) => entry) : allGlobalCssEntries;
23732
+ const globalCssEntries = !isIncremental || incrementalFiles?.some(isStylePath) ? allGlobalCssEntries : filterToIncrementalEntries(allGlobalCssEntries, (entry) => entry);
23731
23733
  const hmrClientBundlePromise = hmr && (htmlDir || htmxDir) ? buildHMRClient() : undefined;
23732
23734
  const allFrameworkDirs = [
23733
23735
  reactDir,
@@ -24012,7 +24014,7 @@ ${offenders.map((o) => ` \u2022 ${o}`).join(`
24012
24014
  generatedRoot: join46(buildPath, "_island_entries")
24013
24015
  };
24014
24016
  const islandClientEntryPoints = islandEntryResult.entries.map((entry) => entry.entryPath);
24015
- if (!deferPageEntries && serverEntryPoints.length === 0 && reactClientEntryPoints.length === 0 && nonReactClientEntryPoints.length === 0 && urlReferencedFiles.length === 0 && islandClientEntryPoints.length === 0 && htmxDir === undefined && htmlDir === undefined) {
24017
+ if (!deferPageEntries && serverEntryPoints.length === 0 && reactClientEntryPoints.length === 0 && nonReactClientEntryPoints.length === 0 && urlReferencedFiles.length === 0 && islandClientEntryPoints.length === 0 && globalCssEntries.length === 0 && htmxDir === undefined && htmlDir === undefined) {
24016
24018
  logWarn("No entry points found, manifest will be empty");
24017
24019
  sendTelemetryEvent("build:empty", {
24018
24020
  configuredDirs: {
@@ -24131,6 +24133,7 @@ ${offenders.map((o) => ` \u2022 ${o}`).join(`
24131
24133
  const htmlScriptPlugin = hmr ? createHTMLScriptHMRPlugin(htmlDir, htmxDir) : undefined;
24132
24134
  const reactBuildConfig = reactClientEntryPoints.length > 0 ? mergeBunBuildConfig({
24133
24135
  banner: pwaArtifacts?.bootstrapBanner,
24136
+ define: clientDefine,
24134
24137
  entrypoints: reactClientEntryPoints,
24135
24138
  external: [
24136
24139
  ...new Set([
@@ -24209,7 +24212,7 @@ ${offenders.map((o) => ` \u2022 ${o}`).join(`
24209
24212
  nonReactClientEntryPoints.length > 0 ? tracePhase("bun/non-react-client", () => bunBuild7(mergeBunBuildConfig({
24210
24213
  banner: pwaArtifacts?.bootstrapBanner,
24211
24214
  conditions: svelteResolveConditions,
24212
- define: vueDirectory ? vueFeatureFlags : undefined,
24215
+ define: clientDefineWithVue,
24213
24216
  entrypoints: nonReactClientEntryPoints,
24214
24217
  external: Object.keys(nonReactExternalPaths),
24215
24218
  format: "esm",
@@ -24238,6 +24241,7 @@ ${offenders.map((o) => ` \u2022 ${o}`).join(`
24238
24241
  }, resolveBunBuildOverride(bunBuildConfig, "nonReactClient")))) : undefined,
24239
24242
  urlReferencedFiles.length > 0 ? tracePhase("bun/worker-client", () => bunBuild7(mergeBunBuildConfig({
24240
24243
  conditions: svelteResolveConditions,
24244
+ define: clientDefine,
24241
24245
  entrypoints: urlReferencedFiles,
24242
24246
  external: Object.keys(nonReactExternalPaths),
24243
24247
  format: "esm",
@@ -24255,7 +24259,7 @@ ${offenders.map((o) => ` \u2022 ${o}`).join(`
24255
24259
  islandClientEntryPoints.length > 0 ? tracePhase("bun/island-client", () => bunBuild7(mergeBunBuildConfig({
24256
24260
  banner: pwaArtifacts?.bootstrapBanner,
24257
24261
  conditions: svelteResolveConditions,
24258
- define: vueDirectory ? vueFeatureFlags : undefined,
24262
+ define: clientDefineWithVue,
24259
24263
  entrypoints: islandClientEntryPoints,
24260
24264
  external: Object.keys(nonReactExternalPaths),
24261
24265
  format: "esm",
@@ -32388,12 +32392,13 @@ ${code}`;
32388
32392
  const raw = readFileSync43(filePath, "utf-8");
32389
32393
  const escaped = raw.replace(/\\/g, "\\\\").replace(/`/g, "\\`").replace(/\$/g, "\\$");
32390
32394
  return [
32391
- `const style = document.createElement('style');`,
32395
+ `const id = ${JSON.stringify(filePath)};`,
32396
+ `const existing = Array.from(document.querySelectorAll('style[data-hmr-id]')).find(el => el.dataset.hmrId === id);`,
32397
+ `const style = existing || document.createElement('style');`,
32392
32398
  `style.textContent = \`${escaped}\`;`,
32393
- `style.dataset.hmrId = ${JSON.stringify(filePath)};`,
32394
- `const existing = document.querySelector(\`style[data-hmr-id="${filePath}"]\`);`,
32395
- `if (existing) existing.remove();`,
32396
- `document.head.appendChild(style);`
32399
+ `style.dataset.hmrId = id;`,
32400
+ `style.dataset.hmrSrc = import.meta.url;`,
32401
+ `if (!existing) document.head.appendChild(style);`
32397
32402
  ].join(`
32398
32403
  `);
32399
32404
  }, generateSvelteHmrBootstrap = (moduleUrl, vendorPaths, timestamp) => {
@@ -34549,6 +34554,7 @@ var moduleServerPromise, getModuleServer = () => moduleServerPromise, clearDevSs
34549
34554
  logHmrUpdate(relative27(process.cwd(), filePath));
34550
34555
  broadcastToClients(state, {
34551
34556
  data: {
34557
+ assetUrl: webPath,
34552
34558
  framework: urlPrefix || "public",
34553
34559
  manifest: state.manifest,
34554
34560
  serverDuration: Math.round(performance.now() - startedAt),
@@ -37979,5 +37985,5 @@ export {
37979
37985
  devBuild
37980
37986
  };
37981
37987
 
37982
- //# debugId=B0E420A64566FADD64756E2164756E21
37988
+ //# debugId=28A6554DD474CEE164756E2164756E21
37983
37989
  //# sourceMappingURL=build.js.map