@absolutejs/absolute 0.20.0-beta.0 → 0.20.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/dist/angular/components/core/streamingSlotRegistrar.js +1 -1
  2. package/dist/angular/components/core/streamingSlotRegistry.js +2 -2
  3. package/dist/angular/index.js +14 -1
  4. package/dist/angular/index.js.map +3 -3
  5. package/dist/angular/server.js +14 -1
  6. package/dist/angular/server.js.map +3 -3
  7. package/dist/build.js +206 -47
  8. package/dist/build.js.map +20 -19
  9. package/dist/cli/config/server.js +2 -2
  10. package/dist/cli/index.js +16506 -11326
  11. package/dist/dev/client/cssUtils.ts +98 -41
  12. package/dist/dev/client/handlers/html.ts +75 -15
  13. package/dist/dev/client/handlers/htmx.ts +43 -8
  14. package/dist/dev/client/handlers/react.ts +114 -32
  15. package/dist/dev/client/handlers/rebuild.ts +28 -8
  16. package/dist/dev/client/handlers/svelte.ts +33 -50
  17. package/dist/dev/client/handlers/vue.ts +36 -45
  18. package/dist/dev/client/hmrClient.ts +38 -6
  19. package/dist/dev/client/hmrTiming.ts +141 -0
  20. package/dist/dev/serverBootstrap.js +20 -11
  21. package/dist/index.js +953 -423
  22. package/dist/index.js.map +27 -23
  23. package/dist/mobile/browser.js.map +1 -1
  24. package/dist/mobile/index.js +2667 -260
  25. package/dist/mobile/index.js.map +27 -7
  26. package/dist/react/index.js +16 -3
  27. package/dist/react/index.js.map +4 -4
  28. package/dist/react/jsxDevRuntimeCompat.js +22 -2
  29. package/dist/react/jsxDevRuntimeCompat.js.map +5 -4
  30. package/dist/react/jsxRuntimeCompat.js +90 -0
  31. package/dist/react/jsxRuntimeCompat.js.map +10 -0
  32. package/dist/react/server.js +16 -3
  33. package/dist/react/server.js.map +4 -4
  34. package/dist/src/build/compileVue.d.ts +1 -1
  35. package/dist/src/build/resolveBuildMode.d.ts +7 -0
  36. package/dist/src/cli/scripts/dev.d.ts +4 -1
  37. package/dist/src/cli/scripts/mobile.d.ts +1 -0
  38. package/dist/src/cli/utils.d.ts +2 -2
  39. package/dist/src/core/build.d.ts +1 -1
  40. package/dist/src/dev/clientManager.d.ts +7 -0
  41. package/dist/src/dev/configResolver.d.ts +2 -0
  42. package/dist/src/dev/moduleMapper.d.ts +1 -1
  43. package/dist/src/dev/moduleServer.d.ts +2 -1
  44. package/dist/src/dev/pathUtils.d.ts +1 -1
  45. package/dist/src/dev/reactComponentClassifier.d.ts +1 -1
  46. package/dist/src/mobile/androidConformance.d.ts +42 -0
  47. package/dist/src/mobile/androidEmulatorController.d.ts +100 -0
  48. package/dist/src/mobile/androidNativeWatcher.d.ts +19 -0
  49. package/dist/src/mobile/androidRelease.d.ts +51 -0
  50. package/dist/src/mobile/androidWebView.d.ts +46 -0
  51. package/dist/src/mobile/associationFiles.d.ts +49 -0
  52. package/dist/src/mobile/buildMetadata.d.ts +10 -0
  53. package/dist/src/mobile/buildPipeline.d.ts +8 -0
  54. package/dist/src/mobile/buildRelease.d.ts +24 -0
  55. package/dist/src/mobile/capacitorBundle.d.ts +28 -0
  56. package/dist/src/mobile/capacitorProject.d.ts +9 -0
  57. package/dist/src/mobile/client.d.ts +1 -1
  58. package/dist/src/mobile/config.d.ts +17 -0
  59. package/dist/src/mobile/emulatorDoctor.d.ts +25 -0
  60. package/dist/src/mobile/emulatorInstaller.d.ts +41 -0
  61. package/dist/src/mobile/index.d.ts +14 -0
  62. package/dist/src/mobile/iosRelease.d.ts +61 -0
  63. package/dist/src/mobile/materializedBundle.d.ts +14 -0
  64. package/dist/src/mobile/nativeDeepLinks.d.ts +5 -0
  65. package/dist/src/mobile/releaseArtifact.d.ts +1 -0
  66. package/dist/src/mobile/releaseDoctor.d.ts +13 -0
  67. package/dist/src/mobile/releasePublisher.d.ts +130 -0
  68. package/dist/src/mobile/routeMatcher.d.ts +3 -0
  69. package/dist/src/mobile/routeMetadataTransform.d.ts +13 -0
  70. package/dist/src/mobile/shellBootstrap.d.ts +1 -0
  71. package/dist/src/mobile/transport.d.ts +31 -0
  72. package/dist/src/react/hooks/useMediaQuery.d.ts +1 -1
  73. package/dist/src/react/jsxDevRuntimeCompat.d.ts +1 -1
  74. package/dist/src/react/jsxRuntimeCompat.d.ts +7 -0
  75. package/dist/src/react/pageHandler.d.ts +3 -0
  76. package/dist/src/utils/loadConfig.d.ts +1 -0
  77. package/dist/src/utils/logger.d.ts +2 -0
  78. package/dist/src/utils/userAgentFunctions.d.ts +1 -1
  79. package/dist/svelte/index.js +14 -1
  80. package/dist/svelte/index.js.map +3 -3
  81. package/dist/svelte/server.js +14 -1
  82. package/dist/svelte/server.js.map +3 -3
  83. package/dist/types/build.d.ts +45 -0
  84. package/dist/types/cli.d.ts +2 -0
  85. package/dist/types/globals.d.ts +14 -0
  86. package/dist/types/messages.d.ts +12 -0
  87. package/dist/vue/index.js +14 -1
  88. package/dist/vue/index.js.map +3 -3
  89. package/dist/vue/server.js +14 -1
  90. package/dist/vue/server.js.map +3 -3
  91. package/package.json +35 -7
package/dist/build.js CHANGED
@@ -214,6 +214,19 @@ var colors2, frameworkColors, formatPath = (filePath) => {
214
214
  const errorMsg = error instanceof Error ? error.message : error;
215
215
  const fullMessage = `${colors2.red}error${colors2.reset} ${message}${errorMsg ? `: ${errorMsg}` : ""}`;
216
216
  console.error(`${timestamp} ${tag} ${fullMessage}`);
217
+ }, logHmrClientUpdate = (path, framework, duration, target, serverMs, clientMs, outcome = "applied", kind) => {
218
+ const timestamp = `${colors2.dim}${formatTimestamp()}${colors2.reset}`;
219
+ const targetLabel = target.startsWith("capacitor-") ? target.slice("capacitor-".length) : target;
220
+ const tag = `${colors2.cyan}[hmr:${targetLabel}]${colors2.reset}`;
221
+ const pathColor = framework ? getFrameworkColor(framework) : colors2.white;
222
+ const breakdown = serverMs === undefined || clientMs === undefined ? "" : `; server ${serverMs}ms, client ${clientMs}ms`;
223
+ let action = "failed after";
224
+ if (outcome === "applied")
225
+ action = "applied in";
226
+ else if (outcome === "reloaded")
227
+ action = "falling back to reload after";
228
+ const kindLabel = kind ? `${kind} ` : "";
229
+ console.log(`${timestamp} ${tag} ${framework ?? "update"} ${kindLabel}${pathColor}${formatPath(path)}${colors2.reset} ${colors2.dim}${action} ${duration}ms${breakdown}${colors2.reset}`);
217
230
  }, logHmrUpdate = (path, framework, duration) => {
218
231
  log("hmr update", { duration, framework, path });
219
232
  }, logInfo = (message) => {
@@ -963,6 +976,22 @@ var indexContentCache, resolveDevClientDir = () => {
963
976
  ` throw new Error('React root container not found: document is null');`,
964
977
  `}
965
978
  `,
979
+ ...isDev ? [
980
+ `// Stock Bun cannot emit Fast Refresh registrations yet. Give the dev client`,
981
+ `// a deterministic remount path that still imports only the changed module.`,
982
+ `window.__ABS_REACT_REMOUNT__ = (nextModule) => {`,
983
+ ` const NextPageComponent = resolvePageComponent(nextModule, ['default', '${pascalComponentName}', '${componentName}']);`,
984
+ ` const element = createElement(ErrorBoundary, null, createElement(NextPageComponent, mergedProps));`,
985
+ ` if (window.__REACT_ROOT__) {`,
986
+ ` window.__REACT_ROOT__.render(element);`,
987
+ ` return;`,
988
+ ` }`,
989
+ ` const nextRoot = createRoot(container);`,
990
+ ` nextRoot.render(element);`,
991
+ ` window.__REACT_ROOT__ = nextRoot;`,
992
+ `};
993
+ `
994
+ ] : [],
966
995
  `// Guard: only hydrate on first load. During HMR re-imports, skip hydration`,
967
996
  `// so React Fast Refresh can swap components in-place and preserve state.`,
968
997
  `if (!window.__REACT_ROOT__) {`,
@@ -12035,9 +12064,23 @@ var ENTITY_DECORATOR_RE, IMPORT_RE, TOP_LEVEL_DECL_RE, extractAllTopLevelNames =
12035
12064
  // Send a server-side ack so the dev terminal can log the
12036
12065
  // full HMR latency (server compile + WS hop + client apply +
12037
12066
  // CD pulse) rather than just the server-side compile time.
12038
- const __ng_hmr_ack = (tier, applyMs, error) => {
12067
+ const __ng_hmr_ack = (tier, applyMs, error, updateId) => {
12039
12068
  try {
12040
12069
  const ws = globalThis.__HMR_WS__;
12070
+ const target = globalThis.__ABS_HMR_TARGET__ || 'web';
12071
+ const timing = {
12072
+ clientMs: Math.round(applyMs),
12073
+ duration: Math.round(applyMs),
12074
+ kind: 'component',
12075
+ outcome: error ? 'failed' : 'applied',
12076
+ serverMs: 0,
12077
+ target,
12078
+ updateId
12079
+ };
12080
+ globalThis.__ABS_HMR_LAST_APPLY__ = timing;
12081
+ const applies = globalThis.__ABS_HMR_APPLIES__ || (globalThis.__ABS_HMR_APPLIES__ = []);
12082
+ applies.push(timing);
12083
+ if (applies.length > 50) applies.splice(0, applies.length - 50);
12041
12084
  if (ws && ws.readyState === 1) {
12042
12085
  ws.send(JSON.stringify({
12043
12086
  type: 'angular:hmr-ack',
@@ -12045,7 +12088,9 @@ var ENTITY_DECORATOR_RE, IMPORT_RE, TOP_LEVEL_DECL_RE, extractAllTopLevelNames =
12045
12088
  className: ${JSON.stringify(className)},
12046
12089
  tier,
12047
12090
  applyMs,
12048
- error
12091
+ error,
12092
+ target,
12093
+ updateId
12049
12094
  }));
12050
12095
  }
12051
12096
  } catch {}
@@ -12069,16 +12114,16 @@ var ENTITY_DECORATOR_RE, IMPORT_RE, TOP_LEVEL_DECL_RE, extractAllTopLevelNames =
12069
12114
  import.meta,
12070
12115
  __ng_hmr_id
12071
12116
  );
12072
- __ng_hmr_ack('tier-0', performance.now() - t0);
12117
+ __ng_hmr_ack('tier-0', performance.now() - t0, undefined, t);
12073
12118
  } catch (err) {
12074
12119
  console.error('[abs-hmr] \u0275\u0275replaceMetadata threw for ${className}:', err);
12075
- __ng_hmr_ack('tier-0', performance.now() - t0, String(err && err.message || err));
12120
+ __ng_hmr_ack('tier-0', performance.now() - t0, String(err && err.message || err), t);
12076
12121
  }
12077
12122
  } else {
12078
12123
  // Non-component entity (pipe / directive / service) \u2014 no
12079
12124
  // LView tree to walk, just apply the prototype patch.
12080
12125
  u.default(${className}, [core]);
12081
- __ng_hmr_ack('tier-0', performance.now() - t0);
12126
+ __ng_hmr_ack('tier-0', performance.now() - t0, undefined, t);
12082
12127
  }
12083
12128
  };
12084
12129
  // Tier 1 remount: structural changes (new ctor params / new field
@@ -12110,10 +12155,10 @@ var ENTITY_DECORATOR_RE, IMPORT_RE, TOP_LEVEL_DECL_RE, extractAllTopLevelNames =
12110
12155
  ${JSON.stringify(className)}
12111
12156
  );
12112
12157
  if (mySeq !== __ng_hmr_seq) return; // newer event arrived during remount
12113
- __ng_hmr_ack('tier-1a', performance.now() - t0);
12158
+ __ng_hmr_ack('tier-1a', performance.now() - t0, undefined, t);
12114
12159
  } catch (err) {
12115
12160
  console.error('[abs-hmr] remount threw for ${className}:', err);
12116
- __ng_hmr_ack('tier-1a', performance.now() - t0, String(err && err.message || err));
12161
+ __ng_hmr_ack('tier-1a', performance.now() - t0, String(err && err.message || err), t);
12117
12162
  }
12118
12163
  } else {
12119
12164
  // No remount helper installed (older absolutejs runtime, or
@@ -12260,6 +12305,13 @@ var init_cleanup = __esm(() => {
12260
12305
  init_generatedDir();
12261
12306
  });
12262
12307
 
12308
+ // src/build/resolveBuildMode.ts
12309
+ var resolveBuildDevelopmentMode = (mode, nodeEnv) => mode === "development" || mode === undefined && nodeEnv === "development", resolveVueFeatureFlags = (development) => ({
12310
+ __VUE_OPTIONS_API__: "true",
12311
+ __VUE_PROD_DEVTOOLS__: development ? "true" : "false",
12312
+ __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: development ? "true" : "false"
12313
+ });
12314
+
12263
12315
  // src/utils/commonAncestor.ts
12264
12316
  var exports_commonAncestor = {};
12265
12317
  __export(exports_commonAncestor, {
@@ -20204,13 +20256,17 @@ var resolveJsxDevRuntimeCompatPath = () => {
20204
20256
  }
20205
20257
  }
20206
20258
  return (candidates[0] ?? resolve25(import.meta.dir, "react", "jsxDevRuntimeCompat.js")).replace(/\\/g, "/");
20207
- }, jsxDevRuntimeCompatPath, reactSpecifiers, toSafeFileName = (specifier) => specifier.replace(/\//g, "_"), computeVendorPaths = () => {
20259
+ }, jsxDevRuntimeCompatPath, jsxRuntimeCompatPath, reactSpecifiers, toSafeFileName = (specifier) => specifier.replace(/\//g, "_"), computeVendorPaths = () => {
20208
20260
  const paths = {};
20209
20261
  for (const specifier of reactSpecifiers) {
20210
20262
  paths[specifier] = `/react/vendor/${toSafeFileName(specifier)}.js`;
20211
20263
  }
20212
20264
  return paths;
20213
20265
  }, generateEntrySource = async (specifier) => {
20266
+ if (specifier === "react/jsx-runtime") {
20267
+ return `export { Fragment, jsx, jsxs } from '${jsxRuntimeCompatPath}';
20268
+ `;
20269
+ }
20214
20270
  if (specifier === "react/jsx-dev-runtime") {
20215
20271
  return `export { Fragment, jsxDEV } from '${jsxDevRuntimeCompatPath}';
20216
20272
  `;
@@ -20262,6 +20318,7 @@ var resolveJsxDevRuntimeCompatPath = () => {
20262
20318
  var init_buildReactVendor = __esm(() => {
20263
20319
  init_generateReactIndexes();
20264
20320
  jsxDevRuntimeCompatPath = resolveJsxDevRuntimeCompatPath();
20321
+ jsxRuntimeCompatPath = jsxDevRuntimeCompatPath.replace("jsxDevRuntimeCompat", "jsxRuntimeCompat");
20265
20322
  reactSpecifiers = [
20266
20323
  "react",
20267
20324
  "react-dom",
@@ -20673,7 +20730,7 @@ import {
20673
20730
  import { basename as basename14, dirname as dirname19, extname as extname10, join as join36, relative as relative15, resolve as resolve26 } from "path";
20674
20731
  import { cwd, env as env2, exit } from "process";
20675
20732
  var {build: bunBuild7, Glob: Glob8 } = globalThis.Bun;
20676
- var isDev2, isBuildTraceEnabled = () => {
20733
+ var isBuildTraceEnabled = () => {
20677
20734
  const value = env2.ABSOLUTE_BUILD_TRACE?.toLowerCase();
20678
20735
  return value === "1" || value === "true" || value === "yes";
20679
20736
  }, collectConventionSourceFiles = (entry) => {
@@ -21039,7 +21096,7 @@ ${content.slice(firstUseIdx)}`;
21039
21096
  if (changed)
21040
21097
  writeFileSync8(outputPath, content);
21041
21098
  }
21042
- }, vueFeatureFlags, bunBuildPassKeys, bunBuildPassKeySet, reservedBunBuildConfigKeys, passLockedKeys, isObject = (value) => typeof value === "object" && value !== null, isBunBuildPassConfig = (config) => isObject(config) && Object.keys(config).some((key) => bunBuildPassKeySet.has(key)), sanitizeBunBuildOverride = (override, extraReservedKeys = new Set) => {
21099
+ }, bunBuildPassKeys, bunBuildPassKeySet, reservedBunBuildConfigKeys, passLockedKeys, isObject = (value) => typeof value === "object" && value !== null, isBunBuildPassConfig = (config) => isObject(config) && Object.keys(config).some((key) => bunBuildPassKeySet.has(key)), sanitizeBunBuildOverride = (override, extraReservedKeys = new Set) => {
21043
21100
  if (!override)
21044
21101
  return {};
21045
21102
  const sanitized = { ...override };
@@ -21112,6 +21169,8 @@ ${content.slice(firstUseIdx)}`;
21112
21169
  sourcemaps
21113
21170
  }) => {
21114
21171
  const buildStart = performance.now();
21172
+ const isDev2 = resolveBuildDevelopmentMode(mode, env2.NODE_ENV);
21173
+ const vueFeatureFlags = resolveVueFeatureFlags(isDev2);
21115
21174
  const projectRoot = cwd();
21116
21175
  const traceEnabled = isBuildTraceEnabled();
21117
21176
  const traceEvents = [];
@@ -22387,7 +22446,7 @@ ${content.slice(firstUseIdx)}`;
22387
22446
  }
22388
22447
  await tracePhase("cleanup/generated", () => cleanup({
22389
22448
  angularDir,
22390
- preserveAngularGenerated: skipAngularClientBundle,
22449
+ preserveAngularGenerated: hmr && angularDir !== undefined,
22391
22450
  reactDir,
22392
22451
  svelteDir,
22393
22452
  vueDir
@@ -22504,7 +22563,6 @@ var init_build = __esm(() => {
22504
22563
  init_logger();
22505
22564
  init_validateSafePath();
22506
22565
  init_spaRouteManifest();
22507
- isDev2 = env2.NODE_ENV === "development";
22508
22566
  REACT_VENDOR_SPECIFIERS = [
22509
22567
  "react-dom/client",
22510
22568
  "react-refresh/runtime",
@@ -22541,11 +22599,6 @@ var init_build = __esm(() => {
22541
22599
  `if(nv&&ov&&typeof nv==="object"&&"value"in nv&&!nv.effect&&typeof nv.value===typeof ov.value)nv.value=ov.value;}`,
22542
22600
  `}}return r;};}`
22543
22601
  ].join("");
22544
- vueFeatureFlags = {
22545
- __VUE_OPTIONS_API__: "true",
22546
- __VUE_PROD_DEVTOOLS__: isDev2 ? "true" : "false",
22547
- __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: isDev2 ? "true" : "false"
22548
- };
22549
22602
  bunBuildPassKeys = [
22550
22603
  "server",
22551
22604
  "reactClient",
@@ -23106,6 +23159,8 @@ var resolveBuildPaths = (config) => {
23106
23159
  emberDir: optional(config.emberDirectory),
23107
23160
  htmlDir: optional(config.htmlDirectory),
23108
23161
  htmxDir: optional(config.htmxDirectory),
23162
+ mobileBundleDir: optional(config.mobile?.bundleDirectory ?? (config.mobile ? ".absolutejs/mobile/web" : undefined)),
23163
+ mobileNativeDir: optional(config.mobile?.nativeProject?.directory ?? (config.mobile ? "mobile" : undefined)),
23109
23164
  publicDir: optional(config.publicDirectory),
23110
23165
  reactDir: optional(config.reactDirectory),
23111
23166
  stylesDir: optional(typeof config.stylesConfig === "string" ? config.stylesConfig : config.stylesConfig?.path),
@@ -23125,7 +23180,9 @@ var createHMRState = (config) => ({
23125
23180
  dependencyGraph: emptyDependencyGraph,
23126
23181
  fileChangeQueue: new Map,
23127
23182
  fileHashes: new Map,
23183
+ hmrUpdates: new Map,
23128
23184
  isRebuilding: false,
23185
+ lastBroadcastTimestamp: 0,
23129
23186
  manifest: {},
23130
23187
  moduleVersions: createModuleVersionTracker(),
23131
23188
  rebuildCount: 0,
@@ -23392,6 +23449,15 @@ var STYLE_EXTENSION_PATTERN2, detectFramework = (filePath, resolved) => {
23392
23449
  if (styles)
23393
23450
  return false;
23394
23451
  }
23452
+ const isInside = (root) => {
23453
+ if (!root)
23454
+ return false;
23455
+ const normalizedRoot = root.replace(/\\/g, "/").replace(/\/$/, "");
23456
+ return normalized === normalizedRoot || normalized.startsWith(`${normalizedRoot}/`);
23457
+ };
23458
+ if (isInside(resolved?.buildDir) || isInside(resolved?.mobileBundleDir) || isInside(resolved?.mobileNativeDir)) {
23459
+ return true;
23460
+ }
23395
23461
  if (HARD_DENY_PATTERN.test(normalized))
23396
23462
  return true;
23397
23463
  if (normalized.endsWith(".log"))
@@ -23430,7 +23496,7 @@ var safeRemoveFromGraph = (graph, fullPath) => {
23430
23496
  });
23431
23497
  }
23432
23498
  }, ATOMIC_WRITE_TEMP_PATTERNS, shouldSkipFilename = (filename, isStylesDir) => !isStylesDir && (filename === "compiled" || filename === "generated" || filename === "build" || filename === "indexes" || filename === "server" || filename === "client" || filename.includes("/compiled/") || filename.includes("/generated/") || filename.includes("/build/") || filename.includes("/indexes/") || filename.includes("/server/") || filename.includes("/client/") || filename.startsWith("compiled/") || filename.startsWith("generated/") || filename.startsWith("build/") || filename.startsWith("indexes/") || filename.startsWith("server/") || filename.startsWith("client/")) || filename.endsWith("/") || filename.includes(".tmp.") || filename.endsWith(".tmp") || filename.endsWith("~") || filename.startsWith(".#") || filename.startsWith(".absolutejs-hmr-") || ATOMIC_WRITE_TEMP_PATTERNS.some((pattern) => pattern.test(filename)), setupWatcher = (absolutePath, isStylesDir, state, onFileChange) => {
23433
- const ATOMIC_RECOVERY_WINDOW_MS = 1000;
23499
+ const ATOMIC_RECOVERY_WINDOW_MS = 5000;
23434
23500
  const atomicRecoveryScan = (eventDir) => {
23435
23501
  let entries;
23436
23502
  try {
@@ -24328,13 +24394,14 @@ var isValidHMRClientMessage = (data) => {
24328
24394
  case "ready":
24329
24395
  case "request-rebuild":
24330
24396
  case "hydration-error":
24331
- case "hmr-timing":
24332
24397
  case "angular:hmr-ack":
24333
24398
  return true;
24399
+ case "hmr-timing":
24400
+ return typeof Reflect.get(data, "duration") === "number" && Number.isFinite(Reflect.get(data, "duration")) && isOptionalHmrApplyKind(Reflect.get(data, "kind")) && isOptionalHmrApplyOutcome(Reflect.get(data, "outcome"));
24334
24401
  default:
24335
24402
  return false;
24336
24403
  }
24337
- };
24404
+ }, isOptionalHmrApplyKind = (value) => value === undefined || value === "component" || value === "css" || value === "full-reload" || value === "html" || value === "htmx" || value === "script", isOptionalHmrApplyOutcome = (value) => value === undefined || value === "applied" || value === "failed" || value === "reloaded";
24338
24405
 
24339
24406
  // src/dev/webSocket.ts
24340
24407
  var exports_webSocket = {};
@@ -24344,7 +24411,33 @@ __export(exports_webSocket, {
24344
24411
  handleClientConnect: () => handleClientConnect,
24345
24412
  broadcastToClients: () => broadcastToClients
24346
24413
  });
24347
- var trySendMessage = (client, messageStr) => {
24414
+ var MAX_RETAINED_HMR_UPDATES = 100, normalizedHmrTarget = (value) => {
24415
+ if (value === "capacitor-android")
24416
+ return value;
24417
+ if (value === "capacitor-ios")
24418
+ return value;
24419
+ if (value === "capacitor-native")
24420
+ return value;
24421
+ return "web";
24422
+ }, hmrMessageMetadata = (state, message) => {
24423
+ const data = Reflect.get(message, "data");
24424
+ const framework = typeof data === "object" && data !== null && typeof Reflect.get(data, "framework") === "string" ? String(Reflect.get(data, "framework")) : state.lastHmrFramework;
24425
+ const source = typeof data === "object" && data !== null ? Reflect.get(data, "primarySource") ?? Reflect.get(data, "sourceFile") : undefined;
24426
+ return {
24427
+ framework,
24428
+ path: typeof source === "string" ? source : state.lastHmrPath
24429
+ };
24430
+ }, retainHmrUpdate = (state, updateId, message) => {
24431
+ const metadata = hmrMessageMetadata(state, message);
24432
+ if (!metadata.framework && !metadata.path)
24433
+ return;
24434
+ state.hmrUpdates.set(updateId, metadata);
24435
+ if (state.hmrUpdates.size <= MAX_RETAINED_HMR_UPDATES)
24436
+ return;
24437
+ const oldest = state.hmrUpdates.keys().next().value;
24438
+ if (typeof oldest === "number")
24439
+ state.hmrUpdates.delete(oldest);
24440
+ }, trySendMessage = (client, messageStr) => {
24348
24441
  try {
24349
24442
  client.send(messageStr);
24350
24443
  return true;
@@ -24352,9 +24445,12 @@ var trySendMessage = (client, messageStr) => {
24352
24445
  return false;
24353
24446
  }
24354
24447
  }, broadcastToClients = (state, message) => {
24448
+ const timestamp = Math.max(Date.now(), state.lastBroadcastTimestamp + 1);
24449
+ state.lastBroadcastTimestamp = timestamp;
24450
+ retainHmrUpdate(state, timestamp, message);
24355
24451
  const messageStr = JSON.stringify({
24356
24452
  ...message,
24357
- timestamp: Date.now()
24453
+ timestamp
24358
24454
  });
24359
24455
  const shouldRemove = (client) => !trySendMessage(client, messageStr);
24360
24456
  const clientsToRemove = [];
@@ -24437,13 +24533,34 @@ var trySendMessage = (client, messageStr) => {
24437
24533
  state.activeFrameworks.add(data.framework);
24438
24534
  }
24439
24535
  break;
24440
- case "hmr-timing":
24441
- logHmrUpdate(state.lastHmrPath ?? "", state.lastHmrFramework, data.duration);
24536
+ case "hmr-timing": {
24537
+ const update = typeof data.updateId === "number" ? state.hmrUpdates.get(data.updateId) : undefined;
24538
+ logHmrClientUpdate(update?.path ?? state.lastHmrPath ?? "", update?.framework ?? state.lastHmrFramework, data.duration, normalizedHmrTarget(data.target), data.serverMs, data.clientMs, data.outcome, data.kind);
24539
+ sendTelemetryEvent("hmr:client-applied", {
24540
+ clientMs: data.clientMs,
24541
+ durationMs: data.duration,
24542
+ framework: update?.framework ?? state.lastHmrFramework ?? "unknown",
24543
+ kind: data.kind,
24544
+ outcome: data.outcome ?? "applied",
24545
+ serverMs: data.serverMs,
24546
+ success: (data.outcome ?? "applied") === "applied",
24547
+ target: normalizedHmrTarget(data.target)
24548
+ });
24442
24549
  break;
24550
+ }
24443
24551
  case "angular:hmr-ack": {
24444
24552
  const tag = data.tier === "tier-0" ? "tier-0" : "tier-1a";
24445
24553
  const suffix = data.error ? ` FAILED \u2014 ${data.error}` : ` applied in ${data.applyMs.toFixed(0)}ms`;
24446
- logInfo(`[ng-hmr] ${tag} ${data.className}${suffix}`);
24554
+ const target = normalizedHmrTarget(data.target);
24555
+ logInfo(`[ng-hmr:${target}] ${tag} ${data.className}${suffix}`);
24556
+ sendTelemetryEvent("hmr:client-applied", {
24557
+ clientMs: data.applyMs,
24558
+ durationMs: data.applyMs,
24559
+ framework: "angular",
24560
+ success: data.error === undefined,
24561
+ target,
24562
+ tier: data.tier
24563
+ });
24447
24564
  break;
24448
24565
  }
24449
24566
  }
@@ -24460,6 +24577,7 @@ var trySendMessage = (client, messageStr) => {
24460
24577
  } catch {}
24461
24578
  };
24462
24579
  var init_webSocket = __esm(() => {
24580
+ init_telemetryEvent();
24463
24581
  init_logger();
24464
24582
  });
24465
24583
 
@@ -24555,6 +24673,7 @@ var init_loadConfig = __esm(() => {
24555
24673
  "islands",
24556
24674
  "kind",
24557
24675
  "mode",
24676
+ "mobile",
24558
24677
  "options",
24559
24678
  "port",
24560
24679
  "postcss",
@@ -24578,6 +24697,7 @@ __export(exports_moduleServer, {
24578
24697
  warmCompilers: () => warmCompilers,
24579
24698
  warmCache: () => warmCache,
24580
24699
  setGlobalModuleServer: () => setGlobalModuleServer,
24700
+ isReactFastRefreshSupported: () => isReactFastRefreshSupported,
24581
24701
  invalidateModule: () => invalidateModule,
24582
24702
  createModuleServer: () => createModuleServer,
24583
24703
  SRC_URL_PREFIX: () => SRC_URL_PREFIX
@@ -24769,11 +24889,11 @@ ${code}`;
24769
24889
  } catch {
24770
24890
  return false;
24771
24891
  }
24772
- }, reactFastRefreshSupported, reactFastRefreshWarningEmitted = false, warnIfReactFastRefreshUnsupported = () => {
24892
+ }, reactFastRefreshSupported, isReactFastRefreshSupported = () => reactFastRefreshSupported, reactFastRefreshWarningEmitted = false, warnIfReactFastRefreshUnsupported = () => {
24773
24893
  if (reactFastRefreshSupported || reactFastRefreshWarningEmitted)
24774
24894
  return;
24775
24895
  reactFastRefreshWarningEmitted = true;
24776
- logWarn("React HMR is blocked: this Bun build ignores " + "`reactFastRefresh` on Bun.Transpiler, so component state " + "cannot be preserved across edits. Tracking " + "https://github.com/oven-sh/bun/pull/28312 \u2014 if it still has " + "not merged, leave a \uD83D\uDC4D on the PR so the Bun team knows it " + "is blocking you. Until then, React edits trigger a full " + "reload instead of a fast refresh.");
24896
+ logWarn("React HMR is blocked: this Bun build ignores " + "`reactFastRefresh` on Bun.Transpiler, so component state " + "cannot be preserved across edits. Tracking " + "https://github.com/oven-sh/bun/pull/28312 \u2014 if it still has " + "not merged, leave a \uD83D\uDC4D on the PR so the Bun team knows it " + "is blocking you. Until then, React edits trigger a targeted " + "page remount instead of a state-preserving fast refresh.");
24777
24897
  }, transformReactFile = (filePath, projectRoot, rewriter) => {
24778
24898
  const raw = readFileSync27(filePath, "utf-8");
24779
24899
  const valueExports = tsxTranspiler.scan(raw).exports;
@@ -25375,12 +25495,12 @@ export default {};
25375
25495
  invalidate(resolved);
25376
25496
  mtimeCache.delete(filePath);
25377
25497
  mtimeCache.delete(resolved);
25378
- }, warmCache = (pathname) => {
25498
+ }, warmCache = async (pathname) => {
25379
25499
  if (!pathname.startsWith(SRC_PREFIX))
25380
25500
  return;
25381
25501
  if (!globalModuleServer)
25382
25502
  return;
25383
- globalModuleServer(pathname);
25503
+ await globalModuleServer(pathname);
25384
25504
  }, globalModuleServer = null, SRC_URL_PREFIX, setGlobalModuleServer = (handler) => {
25385
25505
  globalModuleServer = handler;
25386
25506
  };
@@ -25693,10 +25813,18 @@ var resolveRequestPathname = (request) => {
25693
25813
  return moduleUrl.href;
25694
25814
  }, invalidateEmberSsrCache = () => {
25695
25815
  emberCacheBuster = Date.now();
25696
- }, buildHtmlShell = (headTag, bodyContent, indexPath, props) => {
25816
+ }, buildHtmlShell = (headTag, bodyContent, indexPath, props, hmrShim) => {
25697
25817
  const propsScript = `window.__INITIAL_PROPS__=${JSON.stringify(props ?? {})};`;
25698
25818
  const indexImport = indexPath ? `<script type="module" src="${indexPath}"></script>` : "";
25699
- return `<!DOCTYPE html><html>${headTag}<body>` + `<div id="ember-root">${bodyContent}</div>` + `<script>${propsScript}</script>${indexImport}</body></html>`;
25819
+ return `<!DOCTYPE html><html>${headTag}<body>` + `<div id="ember-root">${bodyContent}</div>` + `<script>${propsScript}</script>${indexImport}${hmrShim}</body></html>`;
25820
+ }, cachedEmberHmrShim = null, getEmberHmrShim = () => {
25821
+ if (cachedEmberHmrShim)
25822
+ return cachedEmberHmrShim;
25823
+ cachedEmberHmrShim = Promise.resolve().then(() => (init_buildHMRClient(), exports_buildHMRClient)).then(async ({ buildHMRClient: buildHMRClient2 }) => {
25824
+ const bundle = await buildHMRClient2();
25825
+ return `<script>window.__HMR_FRAMEWORK__="ember";</script><script data-hmr-client>${bundle}</script>`;
25826
+ });
25827
+ return cachedEmberHmrShim;
25700
25828
  }, handleEmberPageRequest = async (input) => {
25701
25829
  const { indexPath, pagePath, headTag } = input;
25702
25830
  const userProps = input.props;
@@ -25710,7 +25838,8 @@ var resolveRequestPathname = (request) => {
25710
25838
  throw new Error(`Ember page bundle at ${pagePath} does not export renderToHTML(). Was it compiled by compileEmber()?`);
25711
25839
  }
25712
25840
  const innerHtml = bundle.renderToHTML(props ?? {});
25713
- const html = buildHtmlShell(resolvedHeadTag, innerHtml.replace(/^<div>|<\/div>$/g, ""), indexPath, props);
25841
+ const hmrShim = !indexPath ? await getEmberHmrShim() : "";
25842
+ const html = buildHtmlShell(resolvedHeadTag, innerHtml.replace(/^<div>|<\/div>$/g, ""), indexPath, props, hmrShim);
25714
25843
  return withPageCacheHeaders(new Response(html, {
25715
25844
  headers: { "Content-Type": "text/html" }
25716
25845
  }), input.request);
@@ -25815,6 +25944,7 @@ var moduleServerPromise, getModuleServer = () => moduleServerPromise, clearDevSs
25815
25944
  return;
25816
25945
  if (!files.some(isTailwindCandidate))
25817
25946
  return;
25947
+ const startedAt = performance.now();
25818
25948
  try {
25819
25949
  const { computeFrameworkTailwindSources: computeFrameworkTailwindSources2 } = await Promise.resolve().then(() => (init_compileTailwind(), exports_compileTailwind));
25820
25950
  const { cssChanged } = await incrementalTailwindBuild(config.tailwind, state.resolvedPaths.buildDir, files, getStyleTransformConfig(config), computeFrameworkTailwindSources2(config));
@@ -25830,7 +25960,8 @@ var moduleServerPromise, getModuleServer = () => moduleServerPromise, clearDevSs
25830
25960
  data: {
25831
25961
  cause: files.filter(isTailwindCandidate),
25832
25962
  framework: "tailwind",
25833
- manifest: state.manifest
25963
+ manifest: state.manifest,
25964
+ serverDuration: Math.round(performance.now() - startedAt)
25834
25965
  },
25835
25966
  message: "Tailwind utilities recompiled",
25836
25967
  type: "style-update"
@@ -26152,6 +26283,7 @@ var moduleServerPromise, getModuleServer = () => moduleServerPromise, clearDevSs
26152
26283
  const { publicDir } = state.resolvedPaths;
26153
26284
  const { assetsDir } = state.resolvedPaths;
26154
26285
  const handleStaticMirror = async (sourceDir, urlPrefix) => {
26286
+ const startedAt = performance.now();
26155
26287
  const absSource = resolvePath(filePath);
26156
26288
  const normalizedSource = absSource.replace(/\\/g, "/");
26157
26289
  const normalizedDir = sourceDir.replace(/\\/g, "/");
@@ -26172,7 +26304,9 @@ var moduleServerPromise, getModuleServer = () => moduleServerPromise, clearDevSs
26172
26304
  broadcastToClients(state, {
26173
26305
  data: {
26174
26306
  framework: urlPrefix || "public",
26175
- manifest: state.manifest
26307
+ manifest: state.manifest,
26308
+ serverDuration: Math.round(performance.now() - startedAt),
26309
+ sourceFile: absSource
26176
26310
  },
26177
26311
  message: `${urlPrefix || "Public"} asset updated`,
26178
26312
  type: "style-update"
@@ -26864,6 +26998,9 @@ var moduleServerPromise, getModuleServer = () => moduleServerPromise, clearDevSs
26864
26998
  await bundleAngularClient(state, clientPaths, state.resolvedPaths.buildDir, angularDir);
26865
26999
  }
26866
27000
  await Promise.all(pageEntries.map((entry) => compileAngularFileJIT2(entry, generatedAngularRoot, resolvedAngularDir, styleTransformConfig)));
27001
+ if (providersInjection.appProvidersSource) {
27002
+ await compileAngularFileJIT2(providersInjection.appProvidersSource, generatedAngularRoot, resolvedAngularDir, styleTransformConfig);
27003
+ }
26867
27004
  broadcastToClients(state, {
26868
27005
  data: { manifest: state.manifest },
26869
27006
  type: "angular-tier-zero-ssr-rebuild-complete"
@@ -26928,7 +27065,7 @@ var moduleServerPromise, getModuleServer = () => moduleServerPromise, clearDevSs
26928
27065
  invalidateModule2(pageFile);
26929
27066
  const rel = relative18(process.cwd(), pageFile).replace(/\\/g, "/");
26930
27067
  const url = `${SRC_URL_PREFIX2}${rel}`;
26931
- warmCache2(url);
27068
+ await warmCache2(url);
26932
27069
  return url;
26933
27070
  }, getReactModuleUrl, resolveBroadcastTarget = async (primaryFile) => {
26934
27071
  const isComponentFile2 = primaryFile.endsWith(".tsx") || primaryFile.endsWith(".jsx");
@@ -26937,7 +27074,7 @@ var moduleServerPromise, getModuleServer = () => moduleServerPromise, clearDevSs
26937
27074
  const { findNearestComponent: findNearestComponent2 } = await Promise.resolve().then(() => (init_transformCache(), exports_transformCache));
26938
27075
  const nearest = findNearestComponent2(resolvePath(primaryFile));
26939
27076
  return nearest ?? primaryFile;
26940
- }, handleReactModuleServerPath = async (state, reactFiles, startTime, onRebuildComplete) => {
27077
+ }, handleReactModuleServerPath = async (state, reactFiles, startTime, fastRefreshSupported, onRebuildComplete) => {
26941
27078
  const primaryFile = reactFiles.find((file4) => !file4.replace(/\\/g, "/").includes("/pages/")) ?? reactFiles[0];
26942
27079
  if (!primaryFile) {
26943
27080
  onRebuildComplete({
@@ -26958,6 +27095,7 @@ var moduleServerPromise, getModuleServer = () => moduleServerPromise, clearDevSs
26958
27095
  state.lastHmrFramework = "react";
26959
27096
  broadcastToClients(state, {
26960
27097
  data: {
27098
+ fastRefreshSupported,
26961
27099
  framework: "react",
26962
27100
  hasComponentChanges: true,
26963
27101
  hasCSSChanges: false,
@@ -26981,9 +27119,10 @@ var moduleServerPromise, getModuleServer = () => moduleServerPromise, clearDevSs
26981
27119
  onRebuildComplete({ hmrState: state, manifest: state.manifest });
26982
27120
  return state.manifest;
26983
27121
  }
26984
- const { warnIfReactFastRefreshUnsupported: warnIfReactFastRefreshUnsupported2 } = await Promise.resolve().then(() => (init_moduleServer(), exports_moduleServer));
27122
+ const { isReactFastRefreshSupported: isReactFastRefreshSupported2, warnIfReactFastRefreshUnsupported: warnIfReactFastRefreshUnsupported2 } = await Promise.resolve().then(() => (init_moduleServer(), exports_moduleServer));
26985
27123
  warnIfReactFastRefreshUnsupported2();
26986
- return handleReactModuleServerPath(state, reactFiles, startTime, onRebuildComplete);
27124
+ const fastRefreshSupported = isReactFastRefreshSupported2();
27125
+ return handleReactModuleServerPath(state, reactFiles, startTime, fastRefreshSupported, onRebuildComplete);
26987
27126
  }, getClientVendorPaths = async () => {
26988
27127
  const {
26989
27128
  getDevVendorPaths: getDevVendorPaths2,
@@ -27119,7 +27258,8 @@ var moduleServerPromise, getModuleServer = () => moduleServerPromise, clearDevSs
27119
27258
  }
27120
27259
  return ctx;
27121
27260
  }, runSvelteBundleRebuild = async (state, svelteFiles, config) => {
27122
- if (svelteFiles.length === 0)
27261
+ const existingSvelteFiles = svelteFiles.filter((file4) => existsSync33(file4));
27262
+ if (existingSvelteFiles.length === 0)
27123
27263
  return;
27124
27264
  const svelteDir = config.svelteDirectory ?? "";
27125
27265
  if (!svelteDir)
@@ -27128,7 +27268,7 @@ var moduleServerPromise, getModuleServer = () => moduleServerPromise, clearDevSs
27128
27268
  const { compileSvelte: compileSvelte2 } = await Promise.resolve().then(() => (init_compileSvelte(), exports_compileSvelte));
27129
27269
  const { build: bunBuild9 } = await Promise.resolve(globalThis.Bun);
27130
27270
  const clientRoot = await computeClientRoot(state.resolvedPaths);
27131
- const { svelteServerPaths, svelteIndexPaths, svelteClientPaths } = await compileSvelte2(svelteFiles, svelteDir, new Map, true, getStyleTransformConfig(state.config));
27271
+ const { svelteServerPaths, svelteIndexPaths, svelteClientPaths } = await compileSvelte2(existingSvelteFiles, svelteDir, new Map, true, getStyleTransformConfig(state.config));
27132
27272
  const serverEntries = [...svelteServerPaths];
27133
27273
  const clientEntries = [...svelteIndexPaths, ...svelteClientPaths];
27134
27274
  const { serverRoot, serverOutDir } = await computeServerOutPaths(state.resolvedPaths, "svelte");
@@ -27567,7 +27707,10 @@ var moduleServerPromise, getModuleServer = () => moduleServerPromise, clearDevSs
27567
27707
  broadcastToClients(state, {
27568
27708
  data: {
27569
27709
  affectedPages: allPageEntries,
27570
- manifest: state.manifest
27710
+ framework: "ember",
27711
+ manifest: state.manifest,
27712
+ serverDuration: duration,
27713
+ sourceFile: primary
27571
27714
  },
27572
27715
  type: "full-reload"
27573
27716
  });
@@ -27612,6 +27755,7 @@ var moduleServerPromise, getModuleServer = () => moduleServerPromise, clearDevSs
27612
27755
  hasCSSChanges,
27613
27756
  manifest,
27614
27757
  primarySource,
27758
+ serverDuration: duration,
27615
27759
  sourceFiles
27616
27760
  },
27617
27761
  type: "react-update"
@@ -27637,6 +27781,7 @@ var moduleServerPromise, getModuleServer = () => moduleServerPromise, clearDevSs
27637
27781
  framework,
27638
27782
  manifest,
27639
27783
  scriptPath,
27784
+ serverDuration: duration,
27640
27785
  sourceFile: scriptFile
27641
27786
  },
27642
27787
  type: "script-update"
@@ -27667,7 +27812,7 @@ var moduleServerPromise, getModuleServer = () => moduleServerPromise, clearDevSs
27667
27812
  return false;
27668
27813
  }
27669
27814
  return filesToRebuild.some((file4) => islandFiles.has(resolvePath(file4)));
27670
- }, handleIslandSourceReload = async (state, config, filesToRebuild, manifest) => {
27815
+ }, handleIslandSourceReload = async (state, config, filesToRebuild, manifest, serverDuration) => {
27671
27816
  const shouldReload = await didStaticPagesNeedIslandRefresh(config, filesToRebuild);
27672
27817
  if (!shouldReload) {
27673
27818
  return false;
@@ -27677,7 +27822,10 @@ var moduleServerPromise, getModuleServer = () => moduleServerPromise, clearDevSs
27677
27822
  broadcastToClients(state, {
27678
27823
  data: {
27679
27824
  affectedPages,
27680
- manifest
27825
+ framework: "islands",
27826
+ manifest,
27827
+ serverDuration,
27828
+ sourceFile: filesToRebuild[0]
27681
27829
  },
27682
27830
  type: "full-reload"
27683
27831
  });
@@ -27718,6 +27866,7 @@ var moduleServerPromise, getModuleServer = () => moduleServerPromise, clearDevSs
27718
27866
  framework: "html",
27719
27867
  html: newHTML,
27720
27868
  manifest,
27869
+ serverDuration: duration,
27721
27870
  sourceFile: builtHtmlPagePath
27722
27871
  },
27723
27872
  type: "html-update"
@@ -27763,6 +27912,7 @@ var moduleServerPromise, getModuleServer = () => moduleServerPromise, clearDevSs
27763
27912
  cssUrl,
27764
27913
  framework: "vue",
27765
27914
  manifest,
27915
+ serverDuration: duration,
27766
27916
  sourceFile: cssFile,
27767
27917
  updateType: "css-only"
27768
27918
  },
@@ -27778,6 +27928,7 @@ var moduleServerPromise, getModuleServer = () => moduleServerPromise, clearDevSs
27778
27928
  framework: "vue",
27779
27929
  hmrId,
27780
27930
  manifest,
27931
+ serverDuration: duration,
27781
27932
  sourceFile: vuePagePath,
27782
27933
  updateType: "css-only"
27783
27934
  },
@@ -27795,6 +27946,7 @@ var moduleServerPromise, getModuleServer = () => moduleServerPromise, clearDevSs
27795
27946
  hmrId,
27796
27947
  html: null,
27797
27948
  manifest,
27949
+ serverDuration: duration,
27798
27950
  sourceFile: vuePagePath,
27799
27951
  updateType: "full"
27800
27952
  },
@@ -27859,6 +28011,7 @@ var moduleServerPromise, getModuleServer = () => moduleServerPromise, clearDevSs
27859
28011
  cssUrl,
27860
28012
  framework: "svelte",
27861
28013
  manifest,
28014
+ serverDuration: duration,
27862
28015
  sourceFile: cssFile,
27863
28016
  updateType: "css-only"
27864
28017
  },
@@ -27879,6 +28032,7 @@ var moduleServerPromise, getModuleServer = () => moduleServerPromise, clearDevSs
27879
28032
  framework: "svelte",
27880
28033
  html: null,
27881
28034
  manifest,
28035
+ serverDuration: duration,
27882
28036
  sourceFile: sveltePagePath,
27883
28037
  updateType: "full"
27884
28038
  },
@@ -27927,6 +28081,7 @@ var moduleServerPromise, getModuleServer = () => moduleServerPromise, clearDevSs
27927
28081
  cssUrl,
27928
28082
  framework: "angular",
27929
28083
  manifest,
28084
+ serverDuration: duration,
27930
28085
  sourceFile: cssFile,
27931
28086
  updateType: "style"
27932
28087
  },
@@ -27972,6 +28127,7 @@ var moduleServerPromise, getModuleServer = () => moduleServerPromise, clearDevSs
27972
28127
  framework: "htmx",
27973
28128
  html: newHTML,
27974
28129
  manifest,
28130
+ serverDuration: duration,
27975
28131
  sourceFile: builtHtmxPagePath
27976
28132
  },
27977
28133
  type: "htmx-update"
@@ -28080,7 +28236,9 @@ var moduleServerPromise, getModuleServer = () => moduleServerPromise, clearDevSs
28080
28236
  broadcastToClients(state, {
28081
28237
  data: {
28082
28238
  framework,
28083
- manifest
28239
+ manifest,
28240
+ serverDuration: Date.now() - startTime,
28241
+ sourceFile: filesToRebuild?.find((file4) => detectFramework(file4, state.resolvedPaths) === framework)
28084
28242
  },
28085
28243
  message: `${framework} framework updated`,
28086
28244
  type
@@ -28292,14 +28450,15 @@ var moduleServerPromise, getModuleServer = () => moduleServerPromise, clearDevSs
28292
28450
  data: {
28293
28451
  cause: filesToRebuild?.filter(isTailwindCandidate) ?? [],
28294
28452
  framework: "tailwind",
28295
- manifest
28453
+ manifest,
28454
+ serverDuration: duration
28296
28455
  },
28297
28456
  message: "Tailwind utilities recompiled",
28298
28457
  type: "style-update"
28299
28458
  });
28300
28459
  }
28301
28460
  const hasFilesToRebuild = filesToRebuild && filesToRebuild.length > 0;
28302
- const didReloadForIslandChange = hasFilesToRebuild ? await handleIslandSourceReload(state, config, filesToRebuild, manifest) : false;
28461
+ const didReloadForIslandChange = hasFilesToRebuild ? await handleIslandSourceReload(state, config, filesToRebuild, manifest, duration) : false;
28303
28462
  if (didReloadForIslandChange) {
28304
28463
  onRebuildComplete({ hmrState: state, manifest });
28305
28464
  return manifest;
@@ -29239,5 +29398,5 @@ export {
29239
29398
  build
29240
29399
  };
29241
29400
 
29242
- //# debugId=B2F810836F80A55464756E2164756E21
29401
+ //# debugId=AEC5AC744032F0A464756E2164756E21
29243
29402
  //# sourceMappingURL=build.js.map