@nativescript/vite 8.0.0-alpha.7 → 8.0.0-alpha.70

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 (554) hide show
  1. package/README.md +51 -11
  2. package/bin/cli.cjs +8 -14
  3. package/configuration/angular.d.ts +34 -1
  4. package/configuration/angular.js +293 -172
  5. package/configuration/angular.js.map +1 -1
  6. package/configuration/base.js +177 -110
  7. package/configuration/base.js.map +1 -1
  8. package/configuration/javascript.js +14 -93
  9. package/configuration/javascript.js.map +1 -1
  10. package/configuration/react.js +41 -73
  11. package/configuration/react.js.map +1 -1
  12. package/configuration/solid.js +51 -6
  13. package/configuration/solid.js.map +1 -1
  14. package/configuration/typescript.js +12 -93
  15. package/configuration/typescript.js.map +1 -1
  16. package/helpers/app-components.d.ts +2 -1
  17. package/helpers/app-components.js.map +1 -1
  18. package/helpers/app-css-refresh.d.ts +31 -0
  19. package/helpers/app-css-refresh.js +43 -0
  20. package/helpers/app-css-refresh.js.map +1 -0
  21. package/helpers/app-css-state.d.ts +17 -0
  22. package/helpers/app-css-state.js +51 -0
  23. package/helpers/app-css-state.js.map +1 -0
  24. package/helpers/bundler-context.d.ts +11 -0
  25. package/helpers/bundler-context.js +71 -0
  26. package/helpers/bundler-context.js.map +1 -0
  27. package/helpers/cli-flags.d.ts +12 -0
  28. package/helpers/cli-flags.js +34 -0
  29. package/helpers/cli-flags.js.map +1 -1
  30. package/helpers/css-platform-plugin.d.ts +14 -0
  31. package/helpers/css-platform-plugin.js +43 -25
  32. package/helpers/css-platform-plugin.js.map +1 -1
  33. package/helpers/dev-host.d.ts +360 -0
  34. package/helpers/dev-host.js +694 -0
  35. package/helpers/dev-host.js.map +1 -0
  36. package/helpers/dynamic-import-plugin.js +9 -4
  37. package/helpers/dynamic-import-plugin.js.map +1 -1
  38. package/helpers/esbuild-platform-resolver.js +4 -1
  39. package/helpers/esbuild-platform-resolver.js.map +1 -1
  40. package/helpers/external-configs.d.ts +10 -12
  41. package/helpers/external-configs.js +58 -35
  42. package/helpers/external-configs.js.map +1 -1
  43. package/helpers/flavor.d.ts +13 -0
  44. package/helpers/flavor.js +17 -0
  45. package/helpers/flavor.js.map +1 -1
  46. package/helpers/global-defines.d.ts +101 -33
  47. package/helpers/global-defines.js +187 -64
  48. package/helpers/global-defines.js.map +1 -1
  49. package/helpers/hmr-scope.d.ts +26 -0
  50. package/helpers/hmr-scope.js +67 -0
  51. package/helpers/hmr-scope.js.map +1 -0
  52. package/helpers/init.js +0 -18
  53. package/helpers/init.js.map +1 -1
  54. package/helpers/logging.js +29 -1
  55. package/helpers/logging.js.map +1 -1
  56. package/helpers/main-entry.d.ts +4 -1
  57. package/helpers/main-entry.js +366 -47
  58. package/helpers/main-entry.js.map +1 -1
  59. package/helpers/nativeclass-esbuild-plugin.d.ts +2 -1
  60. package/helpers/nativeclass-esbuild-plugin.js +6 -1
  61. package/helpers/nativeclass-esbuild-plugin.js.map +1 -1
  62. package/helpers/nativeclass-transform.d.ts +13 -0
  63. package/helpers/nativeclass-transform.js +37 -7
  64. package/helpers/nativeclass-transform.js.map +1 -1
  65. package/helpers/nativeclass-transformer-plugin.d.ts +9 -2
  66. package/helpers/nativeclass-transformer-plugin.js +163 -15
  67. package/helpers/nativeclass-transformer-plugin.js.map +1 -1
  68. package/helpers/nativescript-package-resolver.js +10 -62
  69. package/helpers/nativescript-package-resolver.js.map +1 -1
  70. package/helpers/normalize-id.d.ts +42 -0
  71. package/helpers/normalize-id.js +60 -0
  72. package/helpers/normalize-id.js.map +1 -0
  73. package/helpers/ns-core-external-urls.d.ts +32 -0
  74. package/helpers/ns-core-external-urls.js +107 -0
  75. package/helpers/ns-core-external-urls.js.map +1 -0
  76. package/helpers/ns-core-url.d.ts +26 -3
  77. package/helpers/ns-core-url.js +66 -8
  78. package/helpers/ns-core-url.js.map +1 -1
  79. package/helpers/optimize-deps.d.ts +16 -0
  80. package/helpers/optimize-deps.js +17 -0
  81. package/helpers/optimize-deps.js.map +1 -0
  82. package/helpers/package-platform-aliases.js +34 -49
  83. package/helpers/package-platform-aliases.js.map +1 -1
  84. package/helpers/platform-types.d.ts +2 -0
  85. package/helpers/platform-types.js +2 -0
  86. package/helpers/platform-types.js.map +1 -0
  87. package/helpers/postcss-platform-config.d.ts +17 -1
  88. package/helpers/postcss-platform-config.js +20 -37
  89. package/helpers/postcss-platform-config.js.map +1 -1
  90. package/helpers/project.d.ts +35 -0
  91. package/helpers/project.js +120 -2
  92. package/helpers/project.js.map +1 -1
  93. package/helpers/resolve-main-field-platform.d.ts +20 -0
  94. package/helpers/resolve-main-field-platform.js +49 -0
  95. package/helpers/resolve-main-field-platform.js.map +1 -0
  96. package/helpers/resolver.js +17 -2
  97. package/helpers/resolver.js.map +1 -1
  98. package/helpers/theme-core-plugins.js +1 -1
  99. package/helpers/theme-core-plugins.js.map +1 -1
  100. package/helpers/ts-config-paths.d.ts +32 -0
  101. package/helpers/ts-config-paths.js +156 -27
  102. package/helpers/ts-config-paths.js.map +1 -1
  103. package/helpers/typescript-check.d.ts +2 -1
  104. package/helpers/typescript-check.js +4 -4
  105. package/helpers/typescript-check.js.map +1 -1
  106. package/helpers/ui-registration.d.ts +21 -0
  107. package/helpers/ui-registration.js +156 -0
  108. package/helpers/ui-registration.js.map +1 -0
  109. package/helpers/utils.d.ts +9 -0
  110. package/helpers/utils.js +22 -2
  111. package/helpers/utils.js.map +1 -1
  112. package/helpers/vite-package-version.d.ts +7 -0
  113. package/helpers/vite-package-version.js +44 -0
  114. package/helpers/vite-package-version.js.map +1 -0
  115. package/helpers/workers.d.ts +40 -19
  116. package/helpers/workers.js +324 -13
  117. package/helpers/workers.js.map +1 -1
  118. package/hmr/client/css-handler.d.ts +2 -1
  119. package/hmr/client/css-handler.js +63 -32
  120. package/hmr/client/css-handler.js.map +1 -1
  121. package/hmr/client/css-update-overlay.d.ts +18 -0
  122. package/hmr/client/css-update-overlay.js +27 -0
  123. package/hmr/client/css-update-overlay.js.map +1 -0
  124. package/hmr/client/framework-client-strategy.d.ts +87 -0
  125. package/hmr/client/framework-client-strategy.js +18 -0
  126. package/hmr/client/framework-client-strategy.js.map +1 -0
  127. package/hmr/client/hmr-pending-overlay.d.ts +0 -14
  128. package/hmr/client/hmr-pending-overlay.js +2 -11
  129. package/hmr/client/hmr-pending-overlay.js.map +1 -1
  130. package/hmr/client/hot-context.d.ts +67 -0
  131. package/hmr/client/hot-context.js +307 -0
  132. package/hmr/client/hot-context.js.map +1 -0
  133. package/hmr/client/index.d.ts +9 -1
  134. package/hmr/client/index.js +70 -1970
  135. package/hmr/client/index.js.map +1 -1
  136. package/hmr/client/overlay-driver.d.ts +10 -0
  137. package/hmr/client/overlay-driver.js +33 -0
  138. package/hmr/client/overlay-driver.js.map +1 -0
  139. package/hmr/client/protocol-dispatch.d.ts +8 -0
  140. package/hmr/client/protocol-dispatch.js +308 -0
  141. package/hmr/client/protocol-dispatch.js.map +1 -0
  142. package/hmr/client/root-reset.d.ts +15 -0
  143. package/hmr/client/root-reset.js +358 -0
  144. package/hmr/client/root-reset.js.map +1 -0
  145. package/hmr/client/strategy-loader.d.ts +24 -0
  146. package/hmr/client/strategy-loader.js +83 -0
  147. package/hmr/client/strategy-loader.js.map +1 -0
  148. package/hmr/client/update-pipeline.d.ts +27 -0
  149. package/hmr/client/update-pipeline.js +464 -0
  150. package/hmr/client/update-pipeline.js.map +1 -0
  151. package/hmr/client/utils.d.ts +9 -1
  152. package/hmr/client/utils.js +117 -97
  153. package/hmr/client/utils.js.map +1 -1
  154. package/hmr/client/ws-transport.d.ts +21 -0
  155. package/hmr/client/ws-transport.js +323 -0
  156. package/hmr/client/ws-transport.js.map +1 -0
  157. package/hmr/entry-runtime.d.ts +2 -1
  158. package/hmr/entry-runtime.js +282 -71
  159. package/hmr/entry-runtime.js.map +1 -1
  160. package/hmr/frameworks/angular/build/angular-linker.d.ts +12 -0
  161. package/hmr/frameworks/angular/build/angular-linker.js +113 -0
  162. package/hmr/frameworks/angular/build/angular-linker.js.map +1 -0
  163. package/hmr/frameworks/angular/build/inject-component-hmr-registration.d.ts +112 -0
  164. package/hmr/frameworks/angular/build/inject-component-hmr-registration.js +291 -0
  165. package/hmr/frameworks/angular/build/inject-component-hmr-registration.js.map +1 -0
  166. package/hmr/frameworks/angular/build/inject-hmr-vite-ignore.d.ts +75 -0
  167. package/hmr/frameworks/angular/build/inject-hmr-vite-ignore.js +221 -0
  168. package/hmr/frameworks/angular/build/inject-hmr-vite-ignore.js.map +1 -0
  169. package/{helpers/angular → hmr/frameworks/angular/build}/inline-decorator-component-templates.js +1 -170
  170. package/hmr/frameworks/angular/build/inline-decorator-component-templates.js.map +1 -0
  171. package/hmr/frameworks/angular/build/js-lexer.d.ts +4 -0
  172. package/{helpers/angular/synthesize-decorator-ctor-parameters.js → hmr/frameworks/angular/build/js-lexer.js} +22 -96
  173. package/hmr/frameworks/angular/build/js-lexer.js.map +1 -0
  174. package/hmr/frameworks/angular/build/linker-stats.d.ts +18 -0
  175. package/hmr/frameworks/angular/build/linker-stats.js +29 -0
  176. package/hmr/frameworks/angular/build/linker-stats.js.map +1 -0
  177. package/hmr/frameworks/angular/build/shared-linker.d.ts +39 -0
  178. package/hmr/frameworks/angular/build/shared-linker.js +128 -0
  179. package/hmr/frameworks/angular/build/shared-linker.js.map +1 -0
  180. package/hmr/frameworks/angular/build/synthesize-decorator-ctor-parameters.js +88 -0
  181. package/hmr/frameworks/angular/build/synthesize-decorator-ctor-parameters.js.map +1 -0
  182. package/{helpers/angular → hmr/frameworks/angular/build}/synthesize-injectable-factories.js +1 -174
  183. package/hmr/frameworks/angular/build/synthesize-injectable-factories.js.map +1 -0
  184. package/hmr/frameworks/angular/build/ts-fallback-transform.d.ts +5 -0
  185. package/hmr/frameworks/angular/build/ts-fallback-transform.js +138 -0
  186. package/hmr/frameworks/angular/build/ts-fallback-transform.js.map +1 -0
  187. package/{helpers/angular → hmr/frameworks/angular/build}/util.d.ts +1 -0
  188. package/hmr/frameworks/angular/build/util.js +155 -0
  189. package/hmr/frameworks/angular/build/util.js.map +1 -0
  190. package/hmr/frameworks/angular/build/worker-url-preserve.d.ts +5 -0
  191. package/hmr/frameworks/angular/build/worker-url-preserve.js +140 -0
  192. package/hmr/frameworks/angular/build/worker-url-preserve.js.map +1 -0
  193. package/hmr/frameworks/angular/client/index.d.ts +0 -1
  194. package/hmr/frameworks/angular/client/index.js +459 -223
  195. package/hmr/frameworks/angular/client/index.js.map +1 -1
  196. package/hmr/frameworks/angular/client/strategy.d.ts +9 -0
  197. package/hmr/frameworks/angular/client/strategy.js +19 -0
  198. package/hmr/frameworks/angular/client/strategy.js.map +1 -0
  199. package/hmr/frameworks/angular/server/angular-root-component.d.ts +79 -0
  200. package/hmr/frameworks/angular/server/angular-root-component.js +149 -0
  201. package/hmr/frameworks/angular/server/angular-root-component.js.map +1 -0
  202. package/hmr/frameworks/angular/server/linker.js +1 -4
  203. package/hmr/frameworks/angular/server/linker.js.map +1 -1
  204. package/hmr/frameworks/angular/server/ng-component-route.d.ts +43 -0
  205. package/hmr/frameworks/angular/server/ng-component-route.js +113 -0
  206. package/hmr/frameworks/angular/server/ng-component-route.js.map +1 -0
  207. package/hmr/frameworks/angular/server/strategy.js +677 -13
  208. package/hmr/frameworks/angular/server/strategy.js.map +1 -1
  209. package/hmr/{server → frameworks/angular/server}/websocket-angular-entry.js +2 -2
  210. package/hmr/frameworks/angular/server/websocket-angular-entry.js.map +1 -0
  211. package/hmr/{server → frameworks/angular/server}/websocket-angular-hot-update.d.ts +28 -11
  212. package/hmr/{server → frameworks/angular/server}/websocket-angular-hot-update.js +191 -105
  213. package/hmr/frameworks/angular/server/websocket-angular-hot-update.js.map +1 -0
  214. package/hmr/frameworks/react/client/strategy.d.ts +12 -0
  215. package/hmr/frameworks/react/client/strategy.js +27 -0
  216. package/hmr/frameworks/react/client/strategy.js.map +1 -0
  217. package/hmr/frameworks/react/server/strategy.d.ts +2 -0
  218. package/hmr/frameworks/react/server/strategy.js +230 -0
  219. package/hmr/frameworks/react/server/strategy.js.map +1 -0
  220. package/hmr/frameworks/solid/build/solid-jsx-deps.d.ts +15 -0
  221. package/hmr/frameworks/solid/build/solid-jsx-deps.js +178 -0
  222. package/hmr/frameworks/solid/build/solid-jsx-deps.js.map +1 -0
  223. package/hmr/frameworks/solid/client/app-runtime.d.ts +68 -0
  224. package/hmr/frameworks/solid/client/app-runtime.js +252 -0
  225. package/hmr/frameworks/solid/client/app-runtime.js.map +1 -0
  226. package/hmr/frameworks/solid/client/strategy.d.ts +7 -0
  227. package/hmr/frameworks/solid/client/strategy.js +391 -0
  228. package/hmr/frameworks/solid/client/strategy.js.map +1 -0
  229. package/hmr/frameworks/solid/server/strategy.js +293 -16
  230. package/hmr/frameworks/solid/server/strategy.js.map +1 -1
  231. package/hmr/frameworks/typescript/client/strategy.d.ts +7 -0
  232. package/hmr/frameworks/typescript/client/strategy.js +418 -0
  233. package/hmr/frameworks/typescript/client/strategy.js.map +1 -0
  234. package/hmr/frameworks/typescript/server/strategy.js +40 -14
  235. package/hmr/frameworks/typescript/server/strategy.js.map +1 -1
  236. package/hmr/frameworks/vue/client/dep-propagation.d.ts +44 -0
  237. package/hmr/frameworks/vue/client/dep-propagation.js +148 -0
  238. package/hmr/frameworks/vue/client/dep-propagation.js.map +1 -0
  239. package/hmr/frameworks/vue/client/index.d.ts +10 -1
  240. package/hmr/frameworks/vue/client/index.js +287 -562
  241. package/hmr/frameworks/vue/client/index.js.map +1 -1
  242. package/hmr/frameworks/vue/client/navigate-app.d.ts +3 -0
  243. package/hmr/frameworks/vue/client/navigate-app.js +178 -0
  244. package/hmr/frameworks/vue/client/navigate-app.js.map +1 -0
  245. package/hmr/frameworks/vue/client/strategy.d.ts +33 -0
  246. package/hmr/frameworks/vue/client/strategy.js +152 -0
  247. package/hmr/frameworks/vue/client/strategy.js.map +1 -0
  248. package/hmr/frameworks/vue/client/vue-sfc-update-overlay.d.ts +49 -0
  249. package/hmr/frameworks/vue/client/vue-sfc-update-overlay.js +124 -0
  250. package/hmr/frameworks/vue/client/vue-sfc-update-overlay.js.map +1 -0
  251. package/hmr/frameworks/vue/server/compiler.d.ts +3 -1
  252. package/hmr/frameworks/vue/server/compiler.js +3 -1
  253. package/hmr/frameworks/vue/server/compiler.js.map +1 -1
  254. package/hmr/frameworks/vue/server/sfc-route-assemble.d.ts +7 -0
  255. package/hmr/frameworks/vue/server/sfc-route-assemble.js +823 -0
  256. package/hmr/frameworks/vue/server/sfc-route-assemble.js.map +1 -0
  257. package/hmr/frameworks/vue/server/sfc-route-meta.d.ts +7 -0
  258. package/hmr/frameworks/vue/server/sfc-route-meta.js +80 -0
  259. package/hmr/frameworks/vue/server/sfc-route-meta.js.map +1 -0
  260. package/hmr/frameworks/vue/server/sfc-route-serve.d.ts +8 -0
  261. package/hmr/frameworks/vue/server/sfc-route-serve.js +462 -0
  262. package/hmr/frameworks/vue/server/sfc-route-serve.js.map +1 -0
  263. package/hmr/frameworks/vue/server/sfc-route-shared.d.ts +45 -0
  264. package/hmr/frameworks/vue/server/sfc-route-shared.js +105 -0
  265. package/hmr/frameworks/vue/server/sfc-route-shared.js.map +1 -0
  266. package/hmr/frameworks/vue/server/strategy.d.ts +35 -0
  267. package/hmr/frameworks/vue/server/strategy.js +291 -7
  268. package/hmr/frameworks/vue/server/strategy.js.map +1 -1
  269. package/hmr/frameworks/vue/server/websocket-sfc.d.ts +15 -0
  270. package/hmr/frameworks/vue/server/websocket-sfc.js +20 -0
  271. package/hmr/frameworks/vue/server/websocket-sfc.js.map +1 -0
  272. package/hmr/helpers/ast-normalizer.d.ts +3 -1
  273. package/hmr/helpers/ast-normalizer.js +109 -14
  274. package/hmr/helpers/ast-normalizer.js.map +1 -1
  275. package/hmr/helpers/cjs-named-exports.d.ts +23 -0
  276. package/hmr/helpers/cjs-named-exports.js +152 -0
  277. package/hmr/helpers/cjs-named-exports.js.map +1 -0
  278. package/hmr/helpers/package-exports.d.ts +16 -0
  279. package/hmr/helpers/package-exports.js +396 -0
  280. package/hmr/helpers/package-exports.js.map +1 -0
  281. package/hmr/helpers/vendor-rewrite.d.ts +1 -1
  282. package/hmr/helpers/vendor-rewrite.js +5 -3
  283. package/hmr/helpers/vendor-rewrite.js.map +1 -1
  284. package/hmr/server/boot-recording.d.ts +51 -0
  285. package/hmr/server/boot-recording.js +214 -0
  286. package/hmr/server/boot-recording.js.map +1 -0
  287. package/hmr/server/constants.js +20 -5
  288. package/hmr/server/constants.js.map +1 -1
  289. package/hmr/server/content-css-update.d.ts +54 -0
  290. package/hmr/server/content-css-update.js +78 -0
  291. package/hmr/server/content-css-update.js.map +1 -0
  292. package/hmr/server/core-bundle.d.ts +140 -0
  293. package/hmr/server/core-bundle.js +614 -0
  294. package/hmr/server/core-bundle.js.map +1 -0
  295. package/hmr/server/core-sanitize.d.ts +86 -7
  296. package/hmr/server/core-sanitize.js +164 -39
  297. package/hmr/server/core-sanitize.js.map +1 -1
  298. package/hmr/server/css-connect-sync.d.ts +28 -0
  299. package/hmr/server/css-connect-sync.js +59 -0
  300. package/hmr/server/css-connect-sync.js.map +1 -0
  301. package/hmr/server/css-device-module.d.ts +28 -0
  302. package/hmr/server/css-device-module.js +44 -0
  303. package/hmr/server/css-device-module.js.map +1 -0
  304. package/hmr/server/css-update-message.d.ts +23 -0
  305. package/hmr/server/css-update-message.js +41 -0
  306. package/hmr/server/css-update-message.js.map +1 -0
  307. package/hmr/server/deps-bundle.d.ts +233 -0
  308. package/hmr/server/deps-bundle.js +1022 -0
  309. package/hmr/server/deps-bundle.js.map +1 -0
  310. package/hmr/server/device-transform-helpers.d.ts +24 -0
  311. package/hmr/server/device-transform-helpers.js +408 -0
  312. package/hmr/server/device-transform-helpers.js.map +1 -0
  313. package/hmr/server/framework-strategy.d.ts +182 -11
  314. package/hmr/server/hmr-module-graph.d.ts +37 -0
  315. package/hmr/server/hmr-module-graph.js +215 -0
  316. package/hmr/server/hmr-module-graph.js.map +1 -0
  317. package/hmr/server/import-map.d.ts +51 -19
  318. package/hmr/server/import-map.js +136 -66
  319. package/hmr/server/import-map.js.map +1 -1
  320. package/hmr/server/index.js +7 -16
  321. package/hmr/server/index.js.map +1 -1
  322. package/hmr/server/node-builtins-route.d.ts +12 -0
  323. package/hmr/server/node-builtins-route.js +86 -0
  324. package/hmr/server/node-builtins-route.js.map +1 -0
  325. package/hmr/server/ns-core-cjs-shape.js +1 -1
  326. package/hmr/server/ns-core-cjs-shape.js.map +1 -1
  327. package/hmr/server/ns-m-response-memo.d.ts +10 -0
  328. package/hmr/server/ns-m-response-memo.js +33 -0
  329. package/hmr/server/ns-m-response-memo.js.map +1 -0
  330. package/hmr/server/ns-rt-bridge.d.ts +51 -0
  331. package/hmr/server/ns-rt-bridge.js +131 -0
  332. package/hmr/server/ns-rt-bridge.js.map +1 -0
  333. package/hmr/server/ns-rt-route.d.ts +5 -0
  334. package/hmr/server/ns-rt-route.js +39 -0
  335. package/hmr/server/ns-rt-route.js.map +1 -0
  336. package/hmr/server/perf-instrumentation.d.ts +1 -1
  337. package/hmr/server/perf-instrumentation.js +3 -1
  338. package/hmr/server/perf-instrumentation.js.map +1 -1
  339. package/hmr/server/process-code-for-device.d.ts +44 -0
  340. package/hmr/server/process-code-for-device.js +834 -0
  341. package/hmr/server/process-code-for-device.js.map +1 -0
  342. package/hmr/server/require-guard.d.ts +1 -0
  343. package/hmr/server/require-guard.js +12 -0
  344. package/hmr/server/require-guard.js.map +1 -0
  345. package/hmr/server/rewrite-imports.d.ts +2 -0
  346. package/hmr/server/rewrite-imports.js +631 -0
  347. package/hmr/server/rewrite-imports.js.map +1 -0
  348. package/hmr/server/route-helpers.d.ts +7 -0
  349. package/hmr/server/route-helpers.js +13 -0
  350. package/hmr/server/route-helpers.js.map +1 -0
  351. package/hmr/server/runtime-graph-filter.js +8 -1
  352. package/hmr/server/runtime-graph-filter.js.map +1 -1
  353. package/hmr/server/server-origin.d.ts +2 -0
  354. package/hmr/server/server-origin.js +88 -0
  355. package/hmr/server/server-origin.js.map +1 -0
  356. package/hmr/server/shared-transform-request.js +1 -2
  357. package/hmr/server/shared-transform-request.js.map +1 -1
  358. package/hmr/server/socket-utils.d.ts +10 -0
  359. package/hmr/server/socket-utils.js +14 -0
  360. package/hmr/server/socket-utils.js.map +1 -0
  361. package/hmr/server/transform-cache-invalidation.d.ts +37 -0
  362. package/hmr/server/transform-cache-invalidation.js +156 -0
  363. package/hmr/server/transform-cache-invalidation.js.map +1 -0
  364. package/hmr/server/vendor-bare-module-shims.d.ts +4 -0
  365. package/hmr/server/vendor-bare-module-shims.js +80 -0
  366. package/hmr/server/vendor-bare-module-shims.js.map +1 -0
  367. package/hmr/server/vite-plugin.d.ts +1 -0
  368. package/hmr/server/vite-plugin.js +227 -53
  369. package/hmr/server/vite-plugin.js.map +1 -1
  370. package/hmr/server/websocket-core-bridge.d.ts +51 -4
  371. package/hmr/server/websocket-core-bridge.js +62 -49
  372. package/hmr/server/websocket-core-bridge.js.map +1 -1
  373. package/hmr/server/websocket-device-transform.d.ts +3 -0
  374. package/hmr/server/websocket-device-transform.js +7 -0
  375. package/hmr/server/websocket-device-transform.js.map +1 -0
  376. package/hmr/server/websocket-hmr-pending.d.ts +2 -16
  377. package/hmr/server/websocket-hmr-pending.js +0 -22
  378. package/hmr/server/websocket-hmr-pending.js.map +1 -1
  379. package/hmr/server/websocket-hot-update.d.ts +80 -0
  380. package/hmr/server/websocket-hot-update.js +295 -0
  381. package/hmr/server/websocket-hot-update.js.map +1 -0
  382. package/hmr/server/websocket-import-map-route.d.ts +15 -0
  383. package/hmr/server/websocket-import-map-route.js +51 -0
  384. package/hmr/server/websocket-import-map-route.js.map +1 -0
  385. package/hmr/server/websocket-module-bindings.d.ts +15 -0
  386. package/hmr/server/websocket-module-bindings.js +38 -5
  387. package/hmr/server/websocket-module-bindings.js.map +1 -1
  388. package/hmr/server/websocket-module-specifiers.d.ts +66 -7
  389. package/hmr/server/websocket-module-specifiers.js +219 -49
  390. package/hmr/server/websocket-module-specifiers.js.map +1 -1
  391. package/hmr/server/websocket-ns-core.d.ts +34 -0
  392. package/hmr/server/websocket-ns-core.js +414 -0
  393. package/hmr/server/websocket-ns-core.js.map +1 -0
  394. package/hmr/server/websocket-ns-entry.d.ts +21 -0
  395. package/hmr/server/websocket-ns-entry.js +164 -0
  396. package/hmr/server/websocket-ns-entry.js.map +1 -0
  397. package/hmr/server/websocket-ns-m-paths.d.ts +19 -3
  398. package/hmr/server/websocket-ns-m-paths.js +98 -75
  399. package/hmr/server/websocket-ns-m-paths.js.map +1 -1
  400. package/hmr/server/websocket-ns-m-request.d.ts +13 -2
  401. package/hmr/server/websocket-ns-m-request.js +20 -11
  402. package/hmr/server/websocket-ns-m-request.js.map +1 -1
  403. package/hmr/server/websocket-ns-m.d.ts +52 -0
  404. package/hmr/server/websocket-ns-m.js +590 -0
  405. package/hmr/server/websocket-ns-m.js.map +1 -0
  406. package/hmr/server/websocket-served-module-helpers.d.ts +57 -4
  407. package/hmr/server/websocket-served-module-helpers.js +462 -141
  408. package/hmr/server/websocket-served-module-helpers.js.map +1 -1
  409. package/hmr/server/websocket-txn.js +6 -9
  410. package/hmr/server/websocket-txn.js.map +1 -1
  411. package/hmr/server/websocket-vendor-unifier.d.ts +0 -1
  412. package/hmr/server/websocket-vendor-unifier.js +4 -9
  413. package/hmr/server/websocket-vendor-unifier.js.map +1 -1
  414. package/hmr/server/websocket.d.ts +7 -40
  415. package/hmr/server/websocket.js +653 -6734
  416. package/hmr/server/websocket.js.map +1 -1
  417. package/hmr/shared/ns-globals.d.ts +106 -0
  418. package/hmr/shared/ns-globals.js +29 -0
  419. package/hmr/shared/ns-globals.js.map +1 -0
  420. package/hmr/shared/protocol.d.ts +157 -0
  421. package/hmr/shared/protocol.js +28 -0
  422. package/hmr/shared/protocol.js.map +1 -0
  423. package/hmr/shared/runtime/boot-complete.d.ts +14 -0
  424. package/hmr/shared/runtime/boot-complete.js +32 -0
  425. package/hmr/shared/runtime/boot-complete.js.map +1 -0
  426. package/hmr/shared/runtime/boot-placeholder-ui.d.ts +69 -0
  427. package/hmr/shared/runtime/boot-placeholder-ui.js +101 -0
  428. package/hmr/shared/runtime/boot-placeholder-ui.js.map +1 -0
  429. package/hmr/shared/runtime/boot-progress.d.ts +44 -0
  430. package/hmr/shared/runtime/boot-progress.js +134 -0
  431. package/hmr/shared/runtime/boot-progress.js.map +1 -0
  432. package/hmr/shared/runtime/boot-timeline.d.ts +1 -1
  433. package/hmr/shared/runtime/boot-timeline.js +8 -19
  434. package/hmr/shared/runtime/boot-timeline.js.map +1 -1
  435. package/hmr/shared/runtime/browser-runtime-contract.d.ts +43 -24
  436. package/hmr/shared/runtime/browser-runtime-contract.js +21 -9
  437. package/hmr/shared/runtime/browser-runtime-contract.js.map +1 -1
  438. package/hmr/shared/runtime/dev-overlay-ios.d.ts +87 -0
  439. package/hmr/shared/runtime/dev-overlay-ios.js +521 -0
  440. package/hmr/shared/runtime/dev-overlay-ios.js.map +1 -0
  441. package/hmr/shared/runtime/dev-overlay-shared.d.ts +58 -0
  442. package/hmr/shared/runtime/dev-overlay-shared.js +116 -0
  443. package/hmr/shared/runtime/dev-overlay-shared.js.map +1 -0
  444. package/hmr/shared/runtime/dev-overlay-snapshots.d.ts +31 -0
  445. package/hmr/shared/runtime/dev-overlay-snapshots.js +324 -0
  446. package/hmr/shared/runtime/dev-overlay-snapshots.js.map +1 -0
  447. package/hmr/shared/runtime/dev-overlay-tree.d.ts +59 -0
  448. package/hmr/shared/runtime/dev-overlay-tree.js +712 -0
  449. package/hmr/shared/runtime/dev-overlay-tree.js.map +1 -0
  450. package/hmr/shared/runtime/dev-overlay.d.ts +23 -69
  451. package/hmr/shared/runtime/dev-overlay.js +67 -1023
  452. package/hmr/shared/runtime/dev-overlay.js.map +1 -1
  453. package/hmr/shared/runtime/global-scope.d.ts +18 -0
  454. package/hmr/shared/runtime/global-scope.js +21 -0
  455. package/hmr/shared/runtime/global-scope.js.map +1 -0
  456. package/hmr/shared/runtime/hooks.js +2 -1
  457. package/hmr/shared/runtime/hooks.js.map +1 -1
  458. package/hmr/shared/runtime/launch-bridge.d.ts +9 -0
  459. package/hmr/shared/runtime/launch-bridge.js +98 -0
  460. package/hmr/shared/runtime/launch-bridge.js.map +1 -0
  461. package/hmr/shared/runtime/module-provenance.js +4 -6
  462. package/hmr/shared/runtime/module-provenance.js.map +1 -1
  463. package/hmr/shared/runtime/ns-runtime-test-double.d.ts +21 -0
  464. package/hmr/shared/runtime/ns-runtime-test-double.js +20 -0
  465. package/hmr/shared/runtime/ns-runtime-test-double.js.map +1 -0
  466. package/hmr/shared/runtime/overlay-flag.d.ts +9 -0
  467. package/hmr/shared/runtime/overlay-flag.js +34 -0
  468. package/hmr/shared/runtime/overlay-flag.js.map +1 -0
  469. package/hmr/shared/runtime/root-placeholder-view.d.ts +19 -0
  470. package/hmr/shared/runtime/root-placeholder-view.js +311 -0
  471. package/hmr/shared/runtime/root-placeholder-view.js.map +1 -0
  472. package/hmr/shared/runtime/root-placeholder.js +401 -206
  473. package/hmr/shared/runtime/root-placeholder.js.map +1 -1
  474. package/hmr/shared/runtime/session-bootstrap.js +203 -58
  475. package/hmr/shared/runtime/session-bootstrap.js.map +1 -1
  476. package/hmr/shared/runtime/vendor-bootstrap.js +3 -10
  477. package/hmr/shared/runtime/vendor-bootstrap.js.map +1 -1
  478. package/hmr/shared/runtime/vendor-resolve.d.ts +22 -0
  479. package/hmr/shared/runtime/vendor-resolve.js +45 -0
  480. package/hmr/shared/runtime/vendor-resolve.js.map +1 -0
  481. package/hmr/shared/vendor/manifest-collect.d.ts +4 -0
  482. package/hmr/shared/vendor/manifest-collect.js +909 -0
  483. package/hmr/shared/vendor/manifest-collect.js.map +1 -0
  484. package/hmr/shared/vendor/manifest-loader.d.ts +2 -1
  485. package/hmr/shared/vendor/manifest-loader.js +5 -3
  486. package/hmr/shared/vendor/manifest-loader.js.map +1 -1
  487. package/hmr/shared/vendor/manifest.d.ts +12 -7
  488. package/hmr/shared/vendor/manifest.js +180 -826
  489. package/hmr/shared/vendor/manifest.js.map +1 -1
  490. package/hmr/shared/vendor/registry.d.ts +2 -0
  491. package/hmr/shared/vendor/registry.js +14 -0
  492. package/hmr/shared/vendor/registry.js.map +1 -1
  493. package/hmr/shared/vendor/vendor-device-shim.d.ts +1 -0
  494. package/hmr/shared/vendor/vendor-device-shim.js +208 -0
  495. package/hmr/shared/vendor/vendor-device-shim.js.map +1 -0
  496. package/hmr/shared/vendor/vendor-esbuild-plugins.d.ts +107 -0
  497. package/hmr/shared/vendor/vendor-esbuild-plugins.js +540 -0
  498. package/hmr/shared/vendor/vendor-esbuild-plugins.js.map +1 -0
  499. package/index.d.ts +1 -0
  500. package/index.js +5 -0
  501. package/index.js.map +1 -1
  502. package/package.json +65 -13
  503. package/runtime/core-aliases-early.js +28 -57
  504. package/runtime/core-aliases-early.js.map +1 -1
  505. package/shims/react-jsx-runtime.d.ts +4 -0
  506. package/shims/react-jsx-runtime.js +61 -0
  507. package/shims/react-jsx-runtime.js.map +1 -0
  508. package/helpers/angular/angular-linker.d.ts +0 -13
  509. package/helpers/angular/angular-linker.js +0 -194
  510. package/helpers/angular/angular-linker.js.map +0 -1
  511. package/helpers/angular/inline-decorator-component-templates.js.map +0 -1
  512. package/helpers/angular/shared-linker.d.ts +0 -11
  513. package/helpers/angular/shared-linker.js +0 -75
  514. package/helpers/angular/shared-linker.js.map +0 -1
  515. package/helpers/angular/synthesize-decorator-ctor-parameters.js.map +0 -1
  516. package/helpers/angular/synthesize-injectable-factories.js.map +0 -1
  517. package/helpers/angular/util.js +0 -67
  518. package/helpers/angular/util.js.map +0 -1
  519. package/helpers/module-runner-patch.d.ts +0 -3
  520. package/helpers/module-runner-patch.js +0 -63
  521. package/helpers/module-runner-patch.js.map +0 -1
  522. package/helpers/prelink-angular.d.ts +0 -2
  523. package/helpers/prelink-angular.js +0 -117
  524. package/helpers/prelink-angular.js.map +0 -1
  525. package/hmr/server/websocket-angular-entry.js.map +0 -1
  526. package/hmr/server/websocket-angular-hot-update.js.map +0 -1
  527. package/hmr/server/websocket-ns-m-finalize.d.ts +0 -22
  528. package/hmr/server/websocket-ns-m-finalize.js +0 -88
  529. package/hmr/server/websocket-ns-m-finalize.js.map +0 -1
  530. package/hmr/server/websocket-runtime-compat.d.ts +0 -19
  531. package/hmr/server/websocket-runtime-compat.js +0 -287
  532. package/hmr/server/websocket-runtime-compat.js.map +0 -1
  533. package/hmr/server/websocket-vue-sfc.d.ts +0 -27
  534. package/hmr/server/websocket-vue-sfc.js +0 -1114
  535. package/hmr/server/websocket-vue-sfc.js.map +0 -1
  536. package/hmr/shared/runtime/http-only-boot.d.ts +0 -2
  537. package/hmr/shared/runtime/http-only-boot.js +0 -171
  538. package/hmr/shared/runtime/http-only-boot.js.map +0 -1
  539. package/hmr/vendor-bootstrap.d.ts +0 -3
  540. package/hmr/vendor-bootstrap.js +0 -32
  541. package/hmr/vendor-bootstrap.js.map +0 -1
  542. package/shims/react-reconciler-constants.d.ts +0 -14
  543. package/shims/react-reconciler-constants.js +0 -21
  544. package/shims/react-reconciler-constants.js.map +0 -1
  545. package/shims/react-reconciler.d.ts +0 -8
  546. package/shims/react-reconciler.js +0 -15
  547. package/shims/react-reconciler.js.map +0 -1
  548. package/transformers/NativeClass/index.d.ts +0 -2
  549. package/transformers/NativeClass/index.js +0 -222
  550. package/transformers/NativeClass/index.js.map +0 -1
  551. /package/{helpers/angular → hmr/frameworks/angular/build}/inline-decorator-component-templates.d.ts +0 -0
  552. /package/{helpers/angular → hmr/frameworks/angular/build}/synthesize-decorator-ctor-parameters.d.ts +0 -0
  553. /package/{helpers/angular → hmr/frameworks/angular/build}/synthesize-injectable-factories.d.ts +0 -0
  554. /package/hmr/{server → frameworks/angular/server}/websocket-angular-entry.d.ts +0 -0
@@ -1,9 +1,17 @@
1
+ import { interceptNgComponentRequest } from './ng-component-route.js';
1
2
  import * as path from 'path';
2
- import { readFileSync, readdirSync, statSync } from 'fs';
3
- import * as PAT from '../../../server/constants.js';
3
+ import { existsSync, readFileSync, readdirSync, statSync } from 'fs';
4
+ import { getMonorepoWorkspaceRoot } from '../../../../helpers/project.js';
4
5
  import { linkAngularPartialsIfNeeded } from './linker.js';
6
+ import { prepareAngularEntryForDevice } from '../../../server/rewrite-imports.js';
5
7
  import { getProjectAppPath, getProjectAppVirtualPath } from '../../../../helpers/utils.js';
6
8
  import { isRuntimeGraphExcludedPath, matchesRuntimeGraphModuleId, shouldIncludeRuntimeGraphFile, shouldSkipRuntimeGraphDirectoryName } from '../../../server/runtime-graph-filter.js';
9
+ import { stripJsComments } from '../build/util.js';
10
+ import { runHotUpdatePrologue } from '../../../server/websocket-hot-update.js';
11
+ import { collectAngularEvictionUrls, collectAngularHotUpdateRoots, collectAngularTransformCacheInvalidationUrls, shouldInvalidateAngularTransitiveImporters, shouldSuppressDefaultViteHotUpdate } from './websocket-angular-hot-update.js';
12
+ import { collectTransitiveImportersForInvalidation } from '../../../server/transform-cache-invalidation.js';
13
+ import { getServerOrigin } from '../../../server/server-origin.js';
14
+ import { isSameAngularModuleRel } from './angular-root-component.js';
7
15
  // Angular server strategy for NativeScript HMR.
8
16
  //
9
17
  // Responsibilities:
@@ -15,6 +23,10 @@ import { isRuntimeGraphExcludedPath, matchesRuntimeGraphModuleId, shouldIncludeR
15
23
  const ANGULAR_APP_DIR = getProjectAppPath();
16
24
  const ANGULAR_APP_VIRTUAL_WITH_SLASH = `${getProjectAppVirtualPath()}/`;
17
25
  const ANGULAR_RUNTIME_FILE_PATTERN = /\.(ts|js|tsx|jsx|mjs)$/i;
26
+ const ANGULAR_STYLE_MODULE_PATTERN = /\.(?:css|scss|sass|less|styl)(?:\?|$)/i;
27
+ function isAngularTransitiveImporterExcluded(id) {
28
+ return id.includes('/node_modules/') || ANGULAR_STYLE_MODULE_PATTERN.test(id);
29
+ }
18
30
  function findAngularEntryFiles(root) {
19
31
  const srcDir = path.join(root, ANGULAR_APP_DIR);
20
32
  const results = [];
@@ -57,25 +69,669 @@ function findAngularEntryFiles(root) {
57
69
  walk(srcDir);
58
70
  return results;
59
71
  }
72
+ // One failed `ɵɵreplaceMetadata` apply can fan out to several
73
+ // `angular:invalidate` sends for the same component (Angular sends one per
74
+ // failing LView walk, and stale hot listeners from earlier module
75
+ // evaluations can re-run the apply). Reboot once per component per window.
76
+ const recentAngularInvalidateReboots = new Map();
77
+ const ANGULAR_INVALIDATE_REBOOT_DEDUPE_MS = 2000;
78
+ /**
79
+ * Project-relative posix path for the `ns:angular-update` broadcast. Files
80
+ * outside the vite root (workspace libs) fall back to the monorepo
81
+ * workspace-relative form — the same shape `rewriteFsAbsoluteToNsM` mints for
82
+ * their device URLs — instead of a `/../../../libs/...` up-walk that matches
83
+ * nothing on the device.
84
+ */
85
+ function angularUpdateRelPath(file, root, workspaceRoot) {
86
+ const toPosixRel = (value) => '/' + path.posix.normalize(value.split(path.sep).join('/'));
87
+ const rel = path.relative(root, file);
88
+ if (!rel.startsWith('..')) {
89
+ return toPosixRel(rel);
90
+ }
91
+ if (workspaceRoot) {
92
+ const workspaceRel = path.relative(workspaceRoot, file);
93
+ if (!workspaceRel.startsWith('..')) {
94
+ return toPosixRel(workspaceRel);
95
+ }
96
+ }
97
+ return toPosixRel(rel);
98
+ }
99
+ /**
100
+ * Broadcast the Angular reboot path (`ns:angular-update` → device module
101
+ * eviction → entry re-import → `__reboot_ng_modules__` with route replay)
102
+ * for `file`, outside a Vite `handleHotUpdate` cycle.
103
+ *
104
+ * This is the recovery half of Angular's `angular:invalidate` contract:
105
+ * Angular core sends that event (via `import.meta.hot.send`) when applying an
106
+ * in-place `ɵɵreplaceMetadata` component update THROWS on the device — see
107
+ * `executeWithInvalidateFallback` in @angular/core — and expects the dev
108
+ * server to force a full reload, which is exactly what `@angular/build`'s
109
+ * Vite server does on web. Without this, a single bad template apply (or a
110
+ * template compiled against a newer class shape than the still-live instance)
111
+ * wedges the view permanently: every subsequent in-place update re-applies
112
+ * against the same stale runtime state and re-throws, so even "fixed" saves
113
+ * never render. The reboot re-imports fresh module bodies (fresh component
114
+ * class + template) and re-bootstraps, after which in-place updates apply
115
+ * cleanly again.
116
+ *
117
+ * Mirrors the `.ts` tail of `handleHotUpdate` below, taking the conservative
118
+ * always-transitive route: a failed apply means live runtime state is
119
+ * suspect, and over-evicting is safe while under-evicting re-wedges.
120
+ */
121
+ async function broadcastAngularReboot(file, server, deps) {
122
+ const { wss, moduleGraph, sharedTransformRequest, getBootstrapEntryRelPath, isSocketClientOpen, rememberAngularReloadSuppression, verbose } = deps;
123
+ if (!wss)
124
+ return;
125
+ const root = server.config.root || process.cwd();
126
+ const monorepoWorkspaceRoot = getMonorepoWorkspaceRoot(root);
127
+ const hotUpdateRoots = collectAngularHotUpdateRoots({
128
+ file,
129
+ modules: [],
130
+ getModuleById: (id) => server.moduleGraph.getModuleById(id),
131
+ getModulesByFile: (targetFile) => server.moduleGraph.getModulesByFile?.(targetFile),
132
+ });
133
+ for (const mod of hotUpdateRoots) {
134
+ try {
135
+ server.moduleGraph.invalidateModule(mod);
136
+ }
137
+ catch { }
138
+ }
139
+ let transitiveImporters = [];
140
+ try {
141
+ transitiveImporters = collectTransitiveImportersForInvalidation({
142
+ modules: hotUpdateRoots,
143
+ isExcluded: isAngularTransitiveImporterExcluded,
144
+ maxDepth: 16,
145
+ });
146
+ for (const mod of transitiveImporters) {
147
+ try {
148
+ server.moduleGraph.invalidateModule(mod);
149
+ }
150
+ catch { }
151
+ }
152
+ }
153
+ catch (error) {
154
+ if (verbose)
155
+ console.warn('[hmr-ws][angular] invalidate-reboot transitive importer collection failed', error);
156
+ }
157
+ try {
158
+ const transformCacheInvalidationUrls = new Set(collectAngularTransformCacheInvalidationUrls({
159
+ file,
160
+ isTs: true,
161
+ hotUpdateRoots,
162
+ transitiveImporters,
163
+ projectRoot: root,
164
+ workspaceRoot: monorepoWorkspaceRoot,
165
+ }));
166
+ if (transformCacheInvalidationUrls.size) {
167
+ sharedTransformRequest.invalidateMany(transformCacheInvalidationUrls);
168
+ }
169
+ }
170
+ catch (error) {
171
+ if (verbose)
172
+ console.warn('[hmr-ws][angular] invalidate-reboot transform cache purge failed', error);
173
+ }
174
+ try {
175
+ const rel = angularUpdateRelPath(file, root, monorepoWorkspaceRoot);
176
+ rememberAngularReloadSuppression(root, file);
177
+ const origin = getServerOrigin(server);
178
+ const bootstrapEntryRel = getBootstrapEntryRelPath();
179
+ let evictPaths = [];
180
+ try {
181
+ evictPaths = collectAngularEvictionUrls({
182
+ file,
183
+ hotUpdateRoots,
184
+ transitiveImporters,
185
+ projectRoot: root,
186
+ origin,
187
+ bootstrapEntry: bootstrapEntryRel,
188
+ workspaceRoot: monorepoWorkspaceRoot,
189
+ });
190
+ }
191
+ catch (error) {
192
+ if (verbose)
193
+ console.warn('[hmr-ws][angular] invalidate-reboot eviction set computation failed', error);
194
+ }
195
+ const msg = {
196
+ type: 'ns:angular-update',
197
+ origin,
198
+ path: rel,
199
+ version: moduleGraph.version,
200
+ timestamp: Date.now(),
201
+ evictPaths,
202
+ importerEntry: bootstrapEntryRel,
203
+ };
204
+ wss.clients.forEach((client) => {
205
+ if (isSocketClientOpen(client)) {
206
+ client.send(JSON.stringify(msg));
207
+ }
208
+ });
209
+ }
210
+ catch (error) {
211
+ console.warn('[hmr-ws][angular] invalidate-reboot broadcast failed:', error);
212
+ }
213
+ }
60
214
  export const angularServerStrategy = {
61
215
  flavor: 'angular',
62
216
  matchesFile(id) {
63
217
  // Treat only application TS/JS as candidates for ordering/graph purposes
64
218
  return matchesRuntimeGraphModuleId(id, ANGULAR_APP_VIRTUAL_WITH_SLASH, ANGULAR_RUNTIME_FILE_PATTERN);
65
219
  },
66
- preClean(code) {
67
- return code;
220
+ // Defer the prologue's common-block delta broadcast: the Angular HMR client
221
+ // re-fetches the changed module, so the broadcast must come AFTER this
222
+ // strategy's hot-update tail purges its transform caches — otherwise the
223
+ // client's re-import races the server's invalidation and serves stale code.
224
+ deferDeltaBroadcast: true,
225
+ // Angular HTML templates skip the prologue's default module-graph delta
226
+ // upsert: the tail below re-queries the graph and drives Analog's in-place
227
+ // swap (or the NS reboot path) itself.
228
+ skipDefaultGraphUpdate(file) {
229
+ return /\.(html|htm)$/i.test(file);
230
+ },
231
+ // With Analog `liveReload` active, component `styleUrls` edits are applied
232
+ // in place via `angular:component-update` → `ɵɵreplaceMetadata` →
233
+ // `@nativescript/angular`'s renderer re-applying the component's scoped
234
+ // styles. The prologue must NOT also broadcast `ns:css-updates` for them:
235
+ // the device's `?direct=1` fetch would create the css `?direct` module that
236
+ // makes Analog stop emitting `angular:component-update` on later edits (its
237
+ // css branch then takes the NativeScript-inert Vite css-update path). The
238
+ // presence of `analogjs-live-reload-plugin` is the clean signal that this
239
+ // in-place pipeline is wired up (it only registers when `liveReload: true`).
240
+ ownsComponentStyleHmr(server) {
241
+ return (server.config?.plugins ?? []).some((plugin) => plugin?.name === 'analogjs-live-reload-plugin');
242
+ },
243
+ // A TS component edit already causes an Angular root reboot; carry any
244
+ // Tailwind-generated app.css change inside that same `ns:angular-update`
245
+ // message (see `deferredCssUpdates` in the prologue) so the device
246
+ // serializes the CSS apply with the reboot instead of racing teardown.
247
+ defersContentCssToFrameworkUpdate(file) {
248
+ return file.endsWith('.ts');
249
+ },
250
+ // Device-reported failed in-place component update → reboot recovery.
251
+ //
252
+ // Angular core sends `angular:invalidate` (over `import.meta.hot.send`,
253
+ // which the NS hot registry forwards to the `/ns-hmr` socket as
254
+ // `{ type: 'custom', event, data }`) whenever an in-place
255
+ // `ɵɵreplaceMetadata` apply throws — e.g. the swapped-in template
256
+ // references class members the still-live component instance doesn't have
257
+ // (metadata replacement reuses the instance by design, so class-body
258
+ // changes never reach it). On the web `@angular/build` answers this with a
259
+ // full page reload; the NS equivalent is the module-eviction reboot. The
260
+ // payload id is the compiler-embedded component HMR id:
261
+ // `encodeURIComponent('<workspace-relative-path>@<ClassName>')`, relative
262
+ // to the TS compilation base (the monorepo workspace root when one exists
263
+ // — see the `workspaceRoot` alignment note in configuration/angular.ts).
264
+ async handleClientCustomEvent({ event, data, server }, deps) {
265
+ if (event !== 'angular:invalidate')
266
+ return;
267
+ const payload = (data ?? {});
268
+ const rawId = typeof payload.id === 'string' ? payload.id : '';
269
+ if (!rawId)
270
+ return;
271
+ let decoded = rawId;
272
+ try {
273
+ decoded = decodeURIComponent(rawId);
274
+ }
275
+ catch { }
276
+ const rel = decoded.split('@')[0];
277
+ if (!rel)
278
+ return;
279
+ const projectRoot = server.config.root || process.cwd();
280
+ const workspaceRoot = getMonorepoWorkspaceRoot(process.cwd()) ?? projectRoot;
281
+ const file = [path.resolve(workspaceRoot, rel), path.resolve(projectRoot, rel)].find((candidate) => existsSync(candidate));
282
+ if (!file) {
283
+ console.warn(`[hmr-ws][angular] angular:invalidate received for unresolvable component id ${decoded} — cannot trigger reboot recovery`);
284
+ return;
285
+ }
286
+ const now = Date.now();
287
+ const last = recentAngularInvalidateReboots.get(file) ?? 0;
288
+ if (now - last < ANGULAR_INVALIDATE_REBOOT_DEDUPE_MS)
289
+ return;
290
+ recentAngularInvalidateReboots.set(file, now);
291
+ // Always-on: this is an error-recovery path the user needs to see —
292
+ // the device just failed to apply an in-place template swap.
293
+ const firstLine = typeof payload.message === 'string' ? payload.message.split('\n')[0] : '';
294
+ console.warn(`[hmr-ws][angular] device failed to apply in-place component update for ${rel}${firstLine ? ` (${firstLine})` : ''} — rebooting Angular with fresh modules to recover`);
295
+ await broadcastAngularReboot(file, server, deps);
296
+ },
297
+ // Full Angular hot-update handler: shared prologue, then the Angular tail
298
+ // (TS/HTML + root-component detection, hot-update-root + transitive-importer
299
+ // invalidation, shared transform-cache purge, and the `ns:angular-update`
300
+ // reboot broadcast). Reached directly from the WebSocket plugin's
301
+ // handleHotUpdate hook.
302
+ async handleHotUpdate(ctx, deps) {
303
+ const state = await runHotUpdatePrologue(ctx, deps);
304
+ if (!state)
305
+ return;
306
+ const { root, updateRel, metrics: updateMetrics, emitSummary: emitHmrUpdateSummary, deferredCssUpdates } = state;
307
+ const { strategy, verbose, wss, moduleGraph, sharedTransformRequest, getBootstrapEntryRelPath, isSocketClientOpen, getHmrSocketRole, rememberAngularReloadSuppression, getRootComponentIdentity } = deps;
308
+ const { file, server } = ctx;
309
+ // For Angular, react to component TS or external template HTML changes under /src
310
+ const isHtml = file.endsWith('.html');
311
+ const isTs = file.endsWith('.ts');
312
+ // Web-style template HMR opt-in: when the user enables Angular's
313
+ // `liveReload` (Analog's flag, mirrored from `--hmr` in
314
+ // `configuration/angular.ts`), `.html` edits are owned by
315
+ // Analog's `handleHotUpdate` which sends
316
+ // `server.ws.send('angular:component-update', { id, timestamp })`.
317
+ // The runtime listener registered in each compiled component
318
+ // `.mjs` then dynamic-imports `/@ng/component?c=<id>&t=<ts>` and
319
+ // calls `ɵɵreplaceMetadata` on the live class — swapping the
320
+ // template definition AND walking live `LView`s to recreate
321
+ // matching views in-place. NO Angular reboot, NO route navigation.
322
+ //
323
+ // The NS reboot path (`ns:angular-update` → `__reboot_ng_modules__`)
324
+ // must be SKIPPED for HTML edits when this is on; otherwise both
325
+ // fire, the reboot wins, and we lose the in-place swap. The
326
+ // reboot path stays intact for `.ts` edits — those genuinely
327
+ // change module-level code (services, route configs, NgModule
328
+ // providers) that Angular's `ɵɵreplaceMetadata` can't reach.
329
+ //
330
+ // We detect "live reload mode is on" by checking that the
331
+ // `analogjs-live-reload-plugin` registered itself with the
332
+ // dev server. That plugin only exists when `liveReload: true`
333
+ // was passed to `angular()` in `configuration/angular.ts`,
334
+ // which gates on `hmrActive`. So this check is a clean
335
+ // boolean: true iff the in-place pipeline is wired up.
336
+ const angularLiveReloadActive = (server.config?.plugins ?? []).some((plugin) => plugin?.name === 'analogjs-live-reload-plugin');
337
+ // Root-component edits must NOT take Analog's in-place
338
+ // `ɵɵreplaceMetadata` path: the root component hosts the
339
+ // navigation `Frame` via `<page-router-outlet>`, and replacing
340
+ // its metadata recreates the root view without re-navigating,
341
+ // leaving a permanent white screen. We route the edit to the
342
+ // reboot broadcast below instead (which re-bootstraps and
343
+ // replays route state). The companion guard in the websocket
344
+ // bridge drops the in-place `angular:component-update` event for
345
+ // the root so the two paths don't race. `.ts` root edits already
346
+ // fall through to the reboot path; this only re-routes `.html`.
347
+ const rootComponent = getRootComponentIdentity();
348
+ // `isSameAngularModuleRel` normalizes separators + leading slash internally,
349
+ // so the raw project-relative path can be passed straight through.
350
+ const isRootComponentEdit = !!rootComponent && isSameAngularModuleRel(rootComponent.moduleRel, path.relative(root, file));
351
+ if (isHtml && angularLiveReloadActive && !isRootComponentEdit) {
352
+ updateMetrics.tAfterFramework = Date.now();
353
+ if (verbose) {
354
+ const rel = '/' + path.relative(root, file).split(path.sep).join('/');
355
+ console.info(`[ns-hmr][server] HTML edit handed off to Analog component-update path; skipping ns:angular-update broadcast (file=${rel})`);
356
+ }
357
+ // Re-query the moduleGraph for this file AFTER awaiting
358
+ // `graphInitialPopulationPromise` (done at the top of
359
+ // `handleHotUpdate`) and return the freshly-discovered
360
+ // modules so they propagate to Analog's `handleHotUpdate`
361
+ // in the same chain.
362
+ //
363
+ // Vite v8 builds the initial `mixedHmrContext.modules`
364
+ // from `mixedModuleGraph.getModulesByFile(file)` BEFORE
365
+ // any plugin runs. On the very first save after a cold
366
+ // dev-server start, the moduleGraph for the changed
367
+ // `.html` template has not yet been populated — that
368
+ // population happens lazily via `populateInitialGraph`
369
+ // → `transformRequest` → Analog's `transform` hook →
370
+ // `addWatchFile(htmlFile)` → `vite:import-analysis`
371
+ // consumes `_addedImports` and finally calls
372
+ // `moduleGraph.updateModuleInfo` which registers the
373
+ // `html → component.ts` importer relationship in
374
+ // `fileToModulesMap`. All of that work races against the
375
+ // file-watcher event for the `.html` edit, and the
376
+ // watcher event almost always wins — so `ctx.modules`
377
+ // arrives as `[]` even though the component is fully
378
+ // compiled and ready to receive an in-place template
379
+ // swap.
380
+ //
381
+ // Returning `undefined` here would propagate that empty
382
+ // `ctx.modules` to the next plugin (Analog's handler),
383
+ // which iterates with `ctx.modules.forEach(mod => mod
384
+ // .importers.forEach(imp => …))` — a no-op when
385
+ // `ctx.modules` is empty. Analog never broadcasts
386
+ // `angular:component-update`, never marks anything
387
+ // self-accepting, and Vite falls back to a `full-reload`
388
+ // payload that the device runtime cannot honor (NS apps
389
+ // don't have a browser-style page reload). The
390
+ // user-visible symptom is exactly the "first save logs
391
+ // `(client) page reload` and the simulator gets stuck
392
+ // on the HMR-applying overlay forever" failure we hit
393
+ // before this re-query was added.
394
+ //
395
+ // Since we already `await graphInitialPopulationPromise`
396
+ // at the top of this function, by this point the
397
+ // moduleGraph IS populated (every component file in
398
+ // `src/` has been transformed and `addWatchFile` has
399
+ // been consumed by `import-analysis`). A fresh
400
+ // `getModulesByFile(file)` call now returns the template
401
+ // module with the importing component's module in
402
+ // `.importers`. Returning that array overwrites
403
+ // `mixedHmrContext.modules` so Analog's handler — which
404
+ // runs RIGHT AFTER us in the same chain — sees the
405
+ // populated importer graph, identifies the component
406
+ // class via `classNames.get(imp.id)`, and broadcasts
407
+ // `angular:component-update` for `ɵɵreplaceMetadata`.
408
+ //
409
+ // We still skip the reboot path (`ns:angular-update`)
410
+ // for HTML edits — control never reaches the
411
+ // reboot-broadcast block below because of the `return`
412
+ // here. The default-Vite-full-reload suppression is now
413
+ // Analog's responsibility: it marks the changed module
414
+ // self-accepting, which tells Vite the update is
415
+ // handled and prevents the fallback.
416
+ let resolvedModules = ctx.modules;
417
+ try {
418
+ const fresh = server.moduleGraph?.getModulesByFile?.(file);
419
+ if (fresh && fresh.size > 0) {
420
+ resolvedModules = [...fresh];
421
+ if (verbose) {
422
+ console.info(`[ns-hmr][server] re-queried modules after graph population: count=${resolvedModules.length} (was ${ctx.modules?.length ?? 0})`);
423
+ }
424
+ }
425
+ }
426
+ catch (refetchErr) {
427
+ if (verbose) {
428
+ console.warn('[ns-hmr][server] failed to re-query moduleGraph for html update', refetchErr);
429
+ }
430
+ }
431
+ emitHmrUpdateSummary();
432
+ return resolvedModules;
433
+ }
434
+ const angularHotUpdateRoots = collectAngularHotUpdateRoots({
435
+ file,
436
+ modules: ctx.modules,
437
+ getModuleById: (id) => server.moduleGraph.getModuleById(id),
438
+ getModulesByFile: (targetFile) => server.moduleGraph.getModulesByFile?.(targetFile),
439
+ });
440
+ if (verbose) {
441
+ console.info(`[ns-hmr][server] hot-update file=${file} isHtml=${isHtml} isTs=${isTs} ctxModules=${Array.from(ctx.modules || []).length} hotUpdateRoots=${angularHotUpdateRoots.length} (${angularHotUpdateRoots
442
+ .map((m) => m?.id ?? '(none)')
443
+ .slice(0, 8)
444
+ .join(', ')}${angularHotUpdateRoots.length > 8 ? ', …' : ''})`);
445
+ }
446
+ if (!(isHtml || isTs))
447
+ return;
448
+ updateMetrics.invalidated += angularHotUpdateRoots.length;
449
+ if (angularHotUpdateRoots.length) {
450
+ for (const mod of angularHotUpdateRoots) {
451
+ try {
452
+ server.moduleGraph.invalidateModule(mod);
453
+ }
454
+ catch (invalidationError) {
455
+ if (verbose) {
456
+ console.warn('[hmr-ws][angular] hot-update root invalidation failed', mod?.id, invalidationError);
457
+ }
458
+ }
459
+ }
460
+ if (verbose) {
461
+ console.log('[hmr-ws][angular] invalidated hot-update root modules:', angularHotUpdateRoots.length);
462
+ }
463
+ }
464
+ const angularTransitiveInvalidationRoots = (angularHotUpdateRoots.length ? angularHotUpdateRoots : ctx.modules);
465
+ // Read the source for `.ts/.tsx/.js/.jsx` edits so
466
+ // `shouldInvalidateAngularTransitiveImporters` can
467
+ // distinguish leaf modules (constants/utils) from real
468
+ // Angular files. If `ctx.read()` throws (file deleted, race
469
+ // against the watcher), `angularChangedSource` stays
470
+ // undefined and we fall back to the conservative "always
471
+ // invalidate transitively" behavior.
472
+ let angularChangedSource;
473
+ if (isTs) {
474
+ try {
475
+ angularChangedSource = await ctx.read();
476
+ }
477
+ catch {
478
+ angularChangedSource = undefined;
479
+ }
480
+ }
481
+ const angularNeedsTransitive = shouldInvalidateAngularTransitiveImporters({
482
+ flavor: strategy.flavor,
483
+ file,
484
+ source: angularChangedSource,
485
+ });
486
+ // Surface the narrowing decision on every `.ts` Angular hot
487
+ // update (HTML routes always invalidate transitively and
488
+ // aren't subject to narrowing, so we leave them as
489
+ // `undefined` — the field is omitted from the summary line).
490
+ // The boolean is the inverse of `angularNeedsTransitive`
491
+ // because "needs transitive" is the broad (un-narrowed)
492
+ // behavior.
493
+ if (isTs) {
494
+ updateMetrics.narrowed = !angularNeedsTransitive;
495
+ }
496
+ // Stable URL + Explicit Invalidation:
497
+ //
498
+ // Compute the transitive importer closure ONCE here and reuse
499
+ // it for (a) `server.moduleGraph.invalidateModule` (so Vite's
500
+ // transform pipeline re-runs on next request), (b) the shared
501
+ // transform-request cache, and (c) the runtime eviction set
502
+ // we broadcast in `ns:angular-update`. Consolidating this
503
+ // removes a redundant graph walk and guarantees the three
504
+ // consumers see the exact same set of importers (otherwise a
505
+ // late module-graph mutation between calls could leave an
506
+ // asymmetric narrowed/broad mix).
507
+ //
508
+ // We separate Vite-transform narrowing from runtime eviction:
509
+ // `angularNeedsTransitive` answers the question "does the
510
+ // changed file's symbol shape change such that importers
511
+ // must be re-transformed by Vite?". The runtime, however,
512
+ // has a stricter requirement: ESM live bindings only refresh
513
+ // if the importing module re-evaluates inside V8. A
514
+ // constants file with no Angular decorator does NOT need a
515
+ // Vite re-transform of its importers (their compiled JS is
516
+ // identical), but its importers still hold stale bindings to
517
+ // the OLD constants Module record. After eviction + re-import
518
+ // of `main.ts`, V8 sees the cached importers, returns them
519
+ // unchanged, and they continue to read the OLD values. The
520
+ // user-visible symptom: HMR completes successfully, logs are
521
+ // clean, but the simulator does not reflect the change.
522
+ //
523
+ // The fix: ALWAYS compute the transitive importer closure
524
+ // for runtime eviction. Only skip Vite's
525
+ // `moduleGraph.invalidate` + transform-cache purge when
526
+ // `angularNeedsTransitive` is false — those are the genuine
527
+ // narrowing wins (saves re-transform work on the server).
528
+ // The eviction set always includes importers so V8 re-fetches
529
+ // and re-binds them.
530
+ if (verbose) {
531
+ console.info(`[ns-hmr][server] angularNeedsTransitive=${angularNeedsTransitive} (file=${path.basename(file)})`);
532
+ }
533
+ let transitiveImporters = [];
534
+ try {
535
+ transitiveImporters = collectTransitiveImportersForInvalidation({
536
+ modules: angularTransitiveInvalidationRoots,
537
+ isExcluded: isAngularTransitiveImporterExcluded,
538
+ maxDepth: 16,
539
+ });
540
+ if (verbose) {
541
+ console.info(`[ns-hmr][server] transitiveImporters count=${transitiveImporters.length} firstN=`, transitiveImporters.slice(0, 16).map((m) => m?.id ?? '(none)'));
542
+ }
543
+ if (angularNeedsTransitive) {
544
+ updateMetrics.invalidated += transitiveImporters.length;
545
+ for (const mod of transitiveImporters) {
546
+ try {
547
+ server.moduleGraph.invalidateModule(mod);
548
+ }
549
+ catch (invalidationError) {
550
+ if (verbose) {
551
+ console.warn('[hmr-ws][angular] transitive importer invalidation failed', mod?.id, invalidationError);
552
+ }
553
+ }
554
+ }
555
+ if (verbose && transitiveImporters.length) {
556
+ console.log('[hmr-ws][angular] invalidated transitive importers:', transitiveImporters.length);
557
+ }
558
+ }
559
+ else if (isTs && typeof angularChangedSource === 'string') {
560
+ // Narrowing means "skip Vite re-transform" (the
561
+ // importers still get evicted from the V8 module
562
+ // registry so live bindings refresh). The importer
563
+ // count is appended so the distinction is visible.
564
+ if (verbose && transitiveImporters.length) {
565
+ console.log(`[hmr-ws][angular] narrowed transitive invalidation (no @Component/@Directive/@Pipe/@Injectable/@NgModule): ${updateRel} — Vite transform skipped, runtime eviction includes ${transitiveImporters.length} importer(s)`);
566
+ }
567
+ }
568
+ }
569
+ catch (error) {
570
+ if (verbose)
571
+ console.warn('[hmr-ws][angular] transitive importer collection failed', error);
572
+ }
573
+ try {
574
+ // Purge shared transform cache for the changed file +
575
+ // hot-update roots unconditionally (their transform
576
+ // output IS different now). Transitive importers are
577
+ // only purged when narrowing decides their output may
578
+ // have changed; otherwise their cached transforms are
579
+ // still valid (compiled JS is identical even though the
580
+ // runtime must re-evaluate them to refresh ESM bindings).
581
+ const transformCacheInvalidationUrls = new Set(collectAngularTransformCacheInvalidationUrls({
582
+ file,
583
+ isTs,
584
+ hotUpdateRoots: angularHotUpdateRoots,
585
+ transitiveImporters: angularNeedsTransitive ? transitiveImporters : [],
586
+ projectRoot: server.config.root || process.cwd(),
587
+ workspaceRoot: getMonorepoWorkspaceRoot(server.config.root || process.cwd()),
588
+ }));
589
+ if (transformCacheInvalidationUrls.size) {
590
+ sharedTransformRequest.invalidateMany(transformCacheInvalidationUrls);
591
+ if (verbose) {
592
+ console.log('[hmr-ws][angular] purged shared transform cache entries:', transformCacheInvalidationUrls.size);
593
+ }
594
+ }
595
+ }
596
+ catch (error) {
597
+ if (verbose)
598
+ console.warn('[hmr-ws][angular] shared transform cache purge failed', error);
599
+ }
600
+ updateMetrics.tAfterFramework = Date.now();
601
+ try {
602
+ const root = server.config.root || process.cwd();
603
+ const monorepoWorkspaceRoot = getMonorepoWorkspaceRoot(root);
604
+ const rel = angularUpdateRelPath(file, root, monorepoWorkspaceRoot);
605
+ rememberAngularReloadSuppression(root, file);
606
+ const origin = getServerOrigin(server);
607
+ const bootstrapEntryRel = getBootstrapEntryRelPath();
608
+ // Stable URL + Explicit Invalidation:
609
+ //
610
+ // `evictPaths` is the canonical list of `/ns/m/<rel>` URLs
611
+ // the runtime must drop from `g_moduleRegistry` before
612
+ // re-importing `importerEntry`. Older versions of the
613
+ // server signaled invalidation by bumping a global
614
+ // `graphVersion` counter and embedding it in every URL —
615
+ // but V8 keys the module registry by full URL, so a v1 →
616
+ // v2 bump effectively flushed the entire dependency
617
+ // graph from the cache and forced the runtime to
618
+ // re-fetch + re-eval every transitively-imported module
619
+ // on each save (~3s HMR cycles, dominated by Vite's
620
+ // single-threaded transform pipeline). The new model:
621
+ //
622
+ // 1. URLs are stable: `/ns/m/<rel>` everywhere, no `vN`.
623
+ // 2. The server walks the inverse-dependency closure and
624
+ // sends only the modules that actually need to be
625
+ // re-evaluated (typically O(1) for component edits,
626
+ // or the changed file + entry for narrowed edits).
627
+ // 3. The client calls ns:runtime `invalidateModules(evictPaths)`
628
+ // and re-imports `importerEntry`, which causes V8 to
629
+ // refetch ONLY those modules. Everything else stays
630
+ // hot in the registry.
631
+ //
632
+ // Invariants enforced by `collectAngularEvictionUrls`:
633
+ // - Always includes the changed file (so the new source
634
+ // is fetched).
635
+ // - Always includes `importerEntry` (so re-import
636
+ // re-evaluates).
637
+ // - Excludes node_modules (vendor packages are stable).
638
+ // - Excludes virtual / runtime-graph-excluded ids.
639
+ // - Origin-prefixed: `http://host:port/ns/m/<rel>`.
640
+ let evictPaths = [];
641
+ try {
642
+ evictPaths = collectAngularEvictionUrls({
643
+ file,
644
+ hotUpdateRoots: angularHotUpdateRoots,
645
+ transitiveImporters,
646
+ projectRoot: root,
647
+ origin,
648
+ bootstrapEntry: bootstrapEntryRel,
649
+ workspaceRoot: monorepoWorkspaceRoot,
650
+ });
651
+ }
652
+ catch (error) {
653
+ if (verbose) {
654
+ console.warn('[ns-hmr][server] eviction set computation failed', error);
655
+ }
656
+ }
657
+ if (verbose) {
658
+ try {
659
+ const tsRel = rel.replace(/\.(html|htm)$/i, '.ts');
660
+ const jsRel = rel.replace(/\.(html|htm)$/i, '.js');
661
+ const containsRelatedTs = evictPaths.some((u) => u.endsWith(tsRel));
662
+ const containsRelatedJs = evictPaths.some((u) => u.endsWith(jsRel));
663
+ const sample = evictPaths.slice(0, 32);
664
+ console.info(`[ns-hmr][server] evict-set count=${evictPaths.length} importerEntry=${bootstrapEntryRel ?? '(none)'} containsRelatedTs=${containsRelatedTs} containsRelatedJs=${containsRelatedJs} firstN=`, sample);
665
+ if (evictPaths.length > sample.length) {
666
+ console.info(`[ns-hmr][server] evict-set hidden=${evictPaths.length - sample.length} (showed first ${sample.length})`);
667
+ }
668
+ }
669
+ catch { }
670
+ }
671
+ const msg = {
672
+ type: 'ns:angular-update',
673
+ origin,
674
+ path: rel,
675
+ version: moduleGraph.version,
676
+ timestamp: Date.now(),
677
+ evictPaths,
678
+ importerEntry: bootstrapEntryRel,
679
+ ...(deferredCssUpdates?.length ? { cssUpdates: deferredCssUpdates } : {}),
680
+ };
681
+ if (verbose) {
682
+ console.log('[hmr-ws][angular] broadcasting update', Array.from(wss.clients || []).map((client) => ({
683
+ role: getHmrSocketRole(client),
684
+ readyState: client.readyState,
685
+ openState: client.OPEN,
686
+ })));
687
+ }
688
+ wss.clients.forEach((client) => {
689
+ if (isSocketClientOpen(client)) {
690
+ client.send(JSON.stringify(msg));
691
+ updateMetrics.recipients += 1;
692
+ }
693
+ });
694
+ }
695
+ catch (error) {
696
+ console.warn('[hmr-ws][angular] update failed:', error);
697
+ }
698
+ emitHmrUpdateSummary();
699
+ if (shouldSuppressDefaultViteHotUpdate({ flavor: strategy.flavor, file })) {
700
+ return [];
701
+ }
702
+ return;
703
+ },
704
+ // AnalogJS `/@ng/component` metadata fetches: gate boot-time fetches to the
705
+ // no-update stub, delegate live update fetches downstream to Analog's
706
+ // middleware (with the empty-body guard the iOS ESM loader needs).
707
+ interceptModuleRequest(ctx) {
708
+ return interceptNgComponentRequest(ctx);
68
709
  },
69
- rewriteFrameworkImports(code) {
70
- // Angular runtime imports are handled via the vendor bridge; no extra rewrite.
71
- return code;
710
+ // preClean/rewriteFrameworkImports/postClean/canonicalizeFrameworkImports default to
711
+ // identity: Angular runtime imports go through the vendor bridge and there are
712
+ // no Angular-specific HTTP endpoints to version.
713
+ //
714
+ // Override the `/ns/m` served-module rewrite: Angular entries need the
715
+ // register-only entry-preparation pass (`prepareAngularEntryForDevice`)
716
+ // instead of the shared `rewriteImports` default the other flavors use.
717
+ rewriteServedModule(code, ctx) {
718
+ return prepareAngularEntryForDevice(code, ctx.moduleId, ctx.sfcFileMap, ctx.depFileMap, ctx.projectRoot, ctx.verbose, undefined, ctx.serverOrigin, true);
72
719
  },
73
- postClean(code) {
74
- return code;
720
+ // Angular module freshness is eviction-driven (the client evicts changed
721
+ // component/module URLs before re-import), with one exception: the
722
+ // `/@ng/component?c=<id>&t=<ts>` metadata endpoint. Each save mints a new
723
+ // `t`, so (a) the URL is volatile — the previous timestamped entry must
724
+ // be evicted on re-import or the registry grows one stale entry per save
725
+ // — and (b) its query must survive canonicalization verbatim, because
726
+ // `t` IS the version discriminator: collapsing it would hand
727
+ // `ɵɵreplaceMetadata` the boot-time metadata forever ("server logs hmr
728
+ // update, screen never changes"). This vocabulary is policy owned here,
729
+ // next to the route that defines it; the runtime just applies it.
730
+ volatilePatterns() {
731
+ return ['/@ng/component'];
75
732
  },
76
- ensureVersionedImports(code, _origin, _version) {
77
- // No Angular-specific HTTP endpoints yet; leave imports as-is.
78
- return code;
733
+ preserveQueryPaths() {
734
+ return ['/@ng/component'];
79
735
  },
80
736
  async processFile(ctx) {
81
737
  // Ensure any Angular code the HMR server assembles for HTTP consumption is fully linked.
@@ -131,7 +787,15 @@ export const angularServerStrategy = {
131
787
  }
132
788
  else if (st.isFile() && shouldIncludeRuntimeGraphFile(full, /\.ts$/i)) {
133
789
  try {
134
- const code = readFileSync(full, 'utf8');
790
+ const rawCode = readFileSync(full, 'utf8');
791
+ // Blank out `//` and `/* */` comments before regex
792
+ // scanning so a commented-out `templateUrl` /
793
+ // `styleUrls` line doesn't enroll the watcher (and
794
+ // therefore the import graph) for a non-existent
795
+ // asset. See note in
796
+ // `extractComponentAssetPaths` for the failure
797
+ // mode this avoids in current Rolldown-Vite.
798
+ const code = stripJsComments(rawCode);
135
799
  if (/\@Component\s*\(/.test(code) && /templateUrl\s*:\s*["']\.\//.test(code)) {
136
800
  const m = code.match(/templateUrl\s*:\s*["']\.\/(.*?\.html)["']/);
137
801
  if (m && m[1]) {