@nativescript/vite 8.0.0-alpha.6 → 8.0.0-alpha.61

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 (465) 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 +390 -165
  5. package/configuration/angular.js.map +1 -1
  6. package/configuration/base.js +244 -53
  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-state.d.ts +8 -0
  19. package/helpers/app-css-state.js +8 -0
  20. package/helpers/app-css-state.js.map +1 -0
  21. package/helpers/bundler-context.d.ts +11 -0
  22. package/helpers/bundler-context.js +71 -0
  23. package/helpers/bundler-context.js.map +1 -0
  24. package/helpers/cli-flags.d.ts +12 -0
  25. package/helpers/cli-flags.js +34 -0
  26. package/helpers/cli-flags.js.map +1 -1
  27. package/helpers/css-platform-plugin.d.ts +14 -0
  28. package/helpers/css-platform-plugin.js +43 -25
  29. package/helpers/css-platform-plugin.js.map +1 -1
  30. package/helpers/dev-host.d.ts +360 -0
  31. package/helpers/dev-host.js +694 -0
  32. package/helpers/dev-host.js.map +1 -0
  33. package/helpers/dynamic-import-plugin.js +9 -4
  34. package/helpers/dynamic-import-plugin.js.map +1 -1
  35. package/helpers/esbuild-platform-resolver.js +4 -1
  36. package/helpers/esbuild-platform-resolver.js.map +1 -1
  37. package/helpers/external-configs.d.ts +10 -12
  38. package/helpers/external-configs.js +58 -35
  39. package/helpers/external-configs.js.map +1 -1
  40. package/helpers/global-defines.d.ts +100 -13
  41. package/helpers/global-defines.js +165 -28
  42. package/helpers/global-defines.js.map +1 -1
  43. package/helpers/hmr-scope.d.ts +26 -0
  44. package/helpers/hmr-scope.js +67 -0
  45. package/helpers/hmr-scope.js.map +1 -0
  46. package/helpers/init.js +0 -18
  47. package/helpers/init.js.map +1 -1
  48. package/helpers/logging.js +29 -1
  49. package/helpers/logging.js.map +1 -1
  50. package/helpers/main-entry.d.ts +4 -1
  51. package/helpers/main-entry.js +368 -53
  52. package/helpers/main-entry.js.map +1 -1
  53. package/helpers/nativeclass-esbuild-plugin.d.ts +2 -1
  54. package/helpers/nativeclass-esbuild-plugin.js +6 -1
  55. package/helpers/nativeclass-esbuild-plugin.js.map +1 -1
  56. package/helpers/nativeclass-transform.d.ts +13 -0
  57. package/helpers/nativeclass-transform.js +37 -7
  58. package/helpers/nativeclass-transform.js.map +1 -1
  59. package/helpers/nativeclass-transformer-plugin.d.ts +9 -2
  60. package/helpers/nativeclass-transformer-plugin.js +163 -15
  61. package/helpers/nativeclass-transformer-plugin.js.map +1 -1
  62. package/helpers/nativescript-package-resolver.js +10 -62
  63. package/helpers/nativescript-package-resolver.js.map +1 -1
  64. package/helpers/normalize-id.d.ts +42 -0
  65. package/helpers/normalize-id.js +60 -0
  66. package/helpers/normalize-id.js.map +1 -0
  67. package/helpers/ns-core-url.d.ts +29 -7
  68. package/helpers/ns-core-url.js +69 -12
  69. package/helpers/ns-core-url.js.map +1 -1
  70. package/helpers/optimize-deps.d.ts +16 -0
  71. package/helpers/optimize-deps.js +17 -0
  72. package/helpers/optimize-deps.js.map +1 -0
  73. package/helpers/package-platform-aliases.js +34 -49
  74. package/helpers/package-platform-aliases.js.map +1 -1
  75. package/helpers/platform-types.d.ts +2 -0
  76. package/helpers/platform-types.js +2 -0
  77. package/helpers/platform-types.js.map +1 -0
  78. package/helpers/postcss-platform-config.d.ts +17 -1
  79. package/helpers/postcss-platform-config.js +20 -37
  80. package/helpers/postcss-platform-config.js.map +1 -1
  81. package/helpers/project.d.ts +35 -0
  82. package/helpers/project.js +120 -2
  83. package/helpers/project.js.map +1 -1
  84. package/helpers/resolve-main-field-platform.d.ts +20 -0
  85. package/helpers/resolve-main-field-platform.js +49 -0
  86. package/helpers/resolve-main-field-platform.js.map +1 -0
  87. package/helpers/resolver.js +17 -2
  88. package/helpers/resolver.js.map +1 -1
  89. package/helpers/theme-core-plugins.js +1 -1
  90. package/helpers/theme-core-plugins.js.map +1 -1
  91. package/helpers/ts-config-paths.d.ts +32 -0
  92. package/helpers/ts-config-paths.js +156 -27
  93. package/helpers/ts-config-paths.js.map +1 -1
  94. package/helpers/typescript-check.d.ts +2 -1
  95. package/helpers/typescript-check.js +2 -2
  96. package/helpers/typescript-check.js.map +1 -1
  97. package/helpers/ui-registration.d.ts +21 -0
  98. package/helpers/ui-registration.js +156 -0
  99. package/helpers/ui-registration.js.map +1 -0
  100. package/helpers/utils.d.ts +9 -0
  101. package/helpers/utils.js +22 -2
  102. package/helpers/utils.js.map +1 -1
  103. package/helpers/vite-package-version.d.ts +7 -0
  104. package/helpers/vite-package-version.js +44 -0
  105. package/helpers/vite-package-version.js.map +1 -0
  106. package/helpers/workers.d.ts +48 -19
  107. package/helpers/workers.js +662 -13
  108. package/helpers/workers.js.map +1 -1
  109. package/hmr/client/css-handler.d.ts +2 -1
  110. package/hmr/client/css-handler.js +50 -26
  111. package/hmr/client/css-handler.js.map +1 -1
  112. package/hmr/client/css-update-overlay.d.ts +18 -0
  113. package/hmr/client/css-update-overlay.js +27 -0
  114. package/hmr/client/css-update-overlay.js.map +1 -0
  115. package/hmr/client/framework-client-strategy.d.ts +79 -0
  116. package/hmr/client/framework-client-strategy.js +19 -0
  117. package/hmr/client/framework-client-strategy.js.map +1 -0
  118. package/hmr/client/hmr-pending-overlay.d.ts +0 -14
  119. package/hmr/client/hmr-pending-overlay.js +14 -4
  120. package/hmr/client/hmr-pending-overlay.js.map +1 -1
  121. package/hmr/client/hot-context.d.ts +67 -0
  122. package/hmr/client/hot-context.js +284 -0
  123. package/hmr/client/hot-context.js.map +1 -0
  124. package/hmr/client/index.js +922 -273
  125. package/hmr/client/index.js.map +1 -1
  126. package/hmr/client/utils.d.ts +2 -1
  127. package/hmr/client/utils.js +111 -99
  128. package/hmr/client/utils.js.map +1 -1
  129. package/hmr/entry-runtime.d.ts +2 -1
  130. package/hmr/entry-runtime.js +279 -71
  131. package/hmr/entry-runtime.js.map +1 -1
  132. package/hmr/frameworks/angular/build/angular-linker.d.ts +12 -0
  133. package/hmr/frameworks/angular/build/angular-linker.js +109 -0
  134. package/hmr/frameworks/angular/build/angular-linker.js.map +1 -0
  135. package/hmr/frameworks/angular/build/inject-component-hmr-registration.d.ts +112 -0
  136. package/hmr/frameworks/angular/build/inject-component-hmr-registration.js +291 -0
  137. package/hmr/frameworks/angular/build/inject-component-hmr-registration.js.map +1 -0
  138. package/hmr/frameworks/angular/build/inject-hmr-vite-ignore.d.ts +75 -0
  139. package/hmr/frameworks/angular/build/inject-hmr-vite-ignore.js +221 -0
  140. package/hmr/frameworks/angular/build/inject-hmr-vite-ignore.js.map +1 -0
  141. package/{helpers/angular → hmr/frameworks/angular/build}/inline-decorator-component-templates.js +1 -170
  142. package/hmr/frameworks/angular/build/inline-decorator-component-templates.js.map +1 -0
  143. package/hmr/frameworks/angular/build/js-lexer.d.ts +4 -0
  144. package/{helpers/angular/synthesize-decorator-ctor-parameters.js → hmr/frameworks/angular/build/js-lexer.js} +22 -96
  145. package/hmr/frameworks/angular/build/js-lexer.js.map +1 -0
  146. package/hmr/frameworks/angular/build/shared-linker.d.ts +39 -0
  147. package/hmr/frameworks/angular/build/shared-linker.js +128 -0
  148. package/hmr/frameworks/angular/build/shared-linker.js.map +1 -0
  149. package/hmr/frameworks/angular/build/synthesize-decorator-ctor-parameters.js +88 -0
  150. package/hmr/frameworks/angular/build/synthesize-decorator-ctor-parameters.js.map +1 -0
  151. package/{helpers/angular → hmr/frameworks/angular/build}/synthesize-injectable-factories.js +1 -174
  152. package/hmr/frameworks/angular/build/synthesize-injectable-factories.js.map +1 -0
  153. package/{helpers/angular → hmr/frameworks/angular/build}/util.d.ts +1 -0
  154. package/hmr/frameworks/angular/build/util.js +155 -0
  155. package/hmr/frameworks/angular/build/util.js.map +1 -0
  156. package/hmr/frameworks/angular/client/index.js +542 -175
  157. package/hmr/frameworks/angular/client/index.js.map +1 -1
  158. package/hmr/frameworks/angular/client/strategy.d.ts +9 -0
  159. package/hmr/frameworks/angular/client/strategy.js +19 -0
  160. package/hmr/frameworks/angular/client/strategy.js.map +1 -0
  161. package/hmr/frameworks/angular/server/angular-root-component.d.ts +79 -0
  162. package/hmr/frameworks/angular/server/angular-root-component.js +149 -0
  163. package/hmr/frameworks/angular/server/angular-root-component.js.map +1 -0
  164. package/hmr/frameworks/angular/server/linker.js +1 -4
  165. package/hmr/frameworks/angular/server/linker.js.map +1 -1
  166. package/hmr/frameworks/angular/server/strategy.js +458 -12
  167. package/hmr/frameworks/angular/server/strategy.js.map +1 -1
  168. package/hmr/{server → frameworks/angular/server}/websocket-angular-entry.js +2 -2
  169. package/hmr/frameworks/angular/server/websocket-angular-entry.js.map +1 -0
  170. package/hmr/{server → frameworks/angular/server}/websocket-angular-hot-update.d.ts +14 -11
  171. package/hmr/{server → frameworks/angular/server}/websocket-angular-hot-update.js +108 -111
  172. package/hmr/frameworks/angular/server/websocket-angular-hot-update.js.map +1 -0
  173. package/hmr/frameworks/react/server/strategy.d.ts +2 -0
  174. package/hmr/frameworks/react/server/strategy.js +230 -0
  175. package/hmr/frameworks/react/server/strategy.js.map +1 -0
  176. package/hmr/frameworks/solid/build/solid-jsx-deps.d.ts +15 -0
  177. package/hmr/frameworks/solid/build/solid-jsx-deps.js +178 -0
  178. package/hmr/frameworks/solid/build/solid-jsx-deps.js.map +1 -0
  179. package/hmr/frameworks/solid/client/app-runtime.d.ts +68 -0
  180. package/hmr/frameworks/solid/client/app-runtime.js +246 -0
  181. package/hmr/frameworks/solid/client/app-runtime.js.map +1 -0
  182. package/hmr/frameworks/solid/server/strategy.js +291 -16
  183. package/hmr/frameworks/solid/server/strategy.js.map +1 -1
  184. package/hmr/frameworks/typescript/server/strategy.js +38 -14
  185. package/hmr/frameworks/typescript/server/strategy.js.map +1 -1
  186. package/hmr/frameworks/vue/client/dep-propagation.d.ts +44 -0
  187. package/hmr/frameworks/vue/client/dep-propagation.js +148 -0
  188. package/hmr/frameworks/vue/client/dep-propagation.js.map +1 -0
  189. package/hmr/frameworks/vue/client/index.d.ts +9 -0
  190. package/hmr/frameworks/vue/client/index.js +251 -247
  191. package/hmr/frameworks/vue/client/index.js.map +1 -1
  192. package/hmr/frameworks/vue/client/strategy.d.ts +33 -0
  193. package/hmr/frameworks/vue/client/strategy.js +157 -0
  194. package/hmr/frameworks/vue/client/strategy.js.map +1 -0
  195. package/hmr/frameworks/vue/client/vue-sfc-update-overlay.d.ts +49 -0
  196. package/hmr/frameworks/vue/client/vue-sfc-update-overlay.js +142 -0
  197. package/hmr/frameworks/vue/client/vue-sfc-update-overlay.js.map +1 -0
  198. package/hmr/frameworks/vue/server/compiler.d.ts +3 -1
  199. package/hmr/frameworks/vue/server/compiler.js +3 -1
  200. package/hmr/frameworks/vue/server/compiler.js.map +1 -1
  201. package/hmr/frameworks/vue/server/sfc-route-assemble.d.ts +7 -0
  202. package/hmr/frameworks/vue/server/sfc-route-assemble.js +823 -0
  203. package/hmr/frameworks/vue/server/sfc-route-assemble.js.map +1 -0
  204. package/hmr/frameworks/vue/server/sfc-route-meta.d.ts +7 -0
  205. package/hmr/frameworks/vue/server/sfc-route-meta.js +80 -0
  206. package/hmr/frameworks/vue/server/sfc-route-meta.js.map +1 -0
  207. package/hmr/frameworks/vue/server/sfc-route-serve.d.ts +8 -0
  208. package/hmr/frameworks/vue/server/sfc-route-serve.js +462 -0
  209. package/hmr/frameworks/vue/server/sfc-route-serve.js.map +1 -0
  210. package/hmr/frameworks/vue/server/sfc-route-shared.d.ts +45 -0
  211. package/hmr/frameworks/vue/server/sfc-route-shared.js +105 -0
  212. package/hmr/frameworks/vue/server/sfc-route-shared.js.map +1 -0
  213. package/hmr/frameworks/vue/server/strategy.d.ts +35 -0
  214. package/hmr/frameworks/vue/server/strategy.js +286 -7
  215. package/hmr/frameworks/vue/server/strategy.js.map +1 -1
  216. package/hmr/frameworks/vue/server/websocket-sfc.d.ts +15 -0
  217. package/hmr/frameworks/vue/server/websocket-sfc.js +20 -0
  218. package/hmr/frameworks/vue/server/websocket-sfc.js.map +1 -0
  219. package/hmr/helpers/ast-normalizer.d.ts +3 -1
  220. package/hmr/helpers/ast-normalizer.js +77 -10
  221. package/hmr/helpers/ast-normalizer.js.map +1 -1
  222. package/hmr/helpers/cjs-named-exports.d.ts +23 -0
  223. package/hmr/helpers/cjs-named-exports.js +152 -0
  224. package/hmr/helpers/cjs-named-exports.js.map +1 -0
  225. package/hmr/helpers/package-exports.d.ts +16 -0
  226. package/hmr/helpers/package-exports.js +396 -0
  227. package/hmr/helpers/package-exports.js.map +1 -0
  228. package/hmr/helpers/vendor-rewrite.d.ts +1 -1
  229. package/hmr/helpers/vendor-rewrite.js +5 -3
  230. package/hmr/helpers/vendor-rewrite.js.map +1 -1
  231. package/hmr/server/boot-archive-route.d.ts +40 -0
  232. package/hmr/server/boot-archive-route.js +154 -0
  233. package/hmr/server/boot-archive-route.js.map +1 -0
  234. package/hmr/server/boot-closure-route.d.ts +49 -0
  235. package/hmr/server/boot-closure-route.js +144 -0
  236. package/hmr/server/boot-closure-route.js.map +1 -0
  237. package/hmr/server/boot-recording.d.ts +58 -0
  238. package/hmr/server/boot-recording.js +228 -0
  239. package/hmr/server/boot-recording.js.map +1 -0
  240. package/hmr/server/constants.js +20 -5
  241. package/hmr/server/constants.js.map +1 -1
  242. package/hmr/server/core-bundle.d.ts +140 -0
  243. package/hmr/server/core-bundle.js +614 -0
  244. package/hmr/server/core-bundle.js.map +1 -0
  245. package/hmr/server/core-sanitize.d.ts +86 -7
  246. package/hmr/server/core-sanitize.js +170 -45
  247. package/hmr/server/core-sanitize.js.map +1 -1
  248. package/hmr/server/css-device-module.d.ts +28 -0
  249. package/hmr/server/css-device-module.js +44 -0
  250. package/hmr/server/css-device-module.js.map +1 -0
  251. package/hmr/server/deps-bundle.d.ts +218 -0
  252. package/hmr/server/deps-bundle.js +998 -0
  253. package/hmr/server/deps-bundle.js.map +1 -0
  254. package/hmr/server/device-transform-helpers.d.ts +24 -0
  255. package/hmr/server/device-transform-helpers.js +408 -0
  256. package/hmr/server/device-transform-helpers.js.map +1 -0
  257. package/hmr/server/framework-strategy.d.ts +113 -11
  258. package/hmr/server/hmr-module-graph.d.ts +37 -0
  259. package/hmr/server/hmr-module-graph.js +215 -0
  260. package/hmr/server/hmr-module-graph.js.map +1 -0
  261. package/hmr/server/import-map.d.ts +13 -4
  262. package/hmr/server/import-map.js +94 -47
  263. package/hmr/server/import-map.js.map +1 -1
  264. package/hmr/server/index.js +7 -16
  265. package/hmr/server/index.js.map +1 -1
  266. package/hmr/server/ns-core-cjs-shape.d.ts +2 -4
  267. package/hmr/server/ns-core-cjs-shape.js +4 -6
  268. package/hmr/server/ns-core-cjs-shape.js.map +1 -1
  269. package/hmr/server/ns-m-response-memo.d.ts +10 -0
  270. package/hmr/server/ns-m-response-memo.js +33 -0
  271. package/hmr/server/ns-m-response-memo.js.map +1 -0
  272. package/hmr/server/ns-rt-bridge.d.ts +51 -0
  273. package/hmr/server/ns-rt-bridge.js +131 -0
  274. package/hmr/server/ns-rt-bridge.js.map +1 -0
  275. package/hmr/server/ns-rt-route.d.ts +5 -0
  276. package/hmr/server/ns-rt-route.js +39 -0
  277. package/hmr/server/ns-rt-route.js.map +1 -0
  278. package/hmr/server/perf-instrumentation.d.ts +6 -10
  279. package/hmr/server/perf-instrumentation.js +5 -6
  280. package/hmr/server/perf-instrumentation.js.map +1 -1
  281. package/hmr/server/process-code-for-device.d.ts +30 -0
  282. package/hmr/server/process-code-for-device.js +791 -0
  283. package/hmr/server/process-code-for-device.js.map +1 -0
  284. package/hmr/server/require-guard.d.ts +1 -0
  285. package/hmr/server/require-guard.js +12 -0
  286. package/hmr/server/require-guard.js.map +1 -0
  287. package/hmr/server/rewrite-imports.d.ts +2 -0
  288. package/hmr/server/rewrite-imports.js +638 -0
  289. package/hmr/server/rewrite-imports.js.map +1 -0
  290. package/hmr/server/route-helpers.d.ts +7 -0
  291. package/hmr/server/route-helpers.js +13 -0
  292. package/hmr/server/route-helpers.js.map +1 -0
  293. package/hmr/server/server-origin.d.ts +2 -0
  294. package/hmr/server/server-origin.js +83 -0
  295. package/hmr/server/server-origin.js.map +1 -0
  296. package/hmr/server/shared-transform-request.js +1 -2
  297. package/hmr/server/shared-transform-request.js.map +1 -1
  298. package/hmr/server/transform-cache-invalidation.d.ts +37 -0
  299. package/hmr/server/transform-cache-invalidation.js +156 -0
  300. package/hmr/server/transform-cache-invalidation.js.map +1 -0
  301. package/hmr/server/vendor-bare-module-shims.d.ts +4 -0
  302. package/hmr/server/vendor-bare-module-shims.js +80 -0
  303. package/hmr/server/vendor-bare-module-shims.js.map +1 -0
  304. package/hmr/server/vite-plugin.d.ts +1 -0
  305. package/hmr/server/vite-plugin.js +180 -54
  306. package/hmr/server/vite-plugin.js.map +1 -1
  307. package/hmr/server/websocket-core-bridge.d.ts +51 -4
  308. package/hmr/server/websocket-core-bridge.js +62 -54
  309. package/hmr/server/websocket-core-bridge.js.map +1 -1
  310. package/hmr/server/websocket-css-hot-update.d.ts +33 -0
  311. package/hmr/server/websocket-css-hot-update.js +65 -0
  312. package/hmr/server/websocket-css-hot-update.js.map +1 -0
  313. package/hmr/server/websocket-device-transform.d.ts +3 -0
  314. package/hmr/server/websocket-device-transform.js +7 -0
  315. package/hmr/server/websocket-device-transform.js.map +1 -0
  316. package/hmr/server/websocket-hmr-pending.d.ts +3 -9
  317. package/hmr/server/websocket-hmr-pending.js +1 -1
  318. package/hmr/server/websocket-hmr-pending.js.map +1 -1
  319. package/hmr/server/websocket-hot-update.d.ts +77 -0
  320. package/hmr/server/websocket-hot-update.js +360 -0
  321. package/hmr/server/websocket-hot-update.js.map +1 -0
  322. package/hmr/server/websocket-import-map-route.d.ts +15 -0
  323. package/hmr/server/websocket-import-map-route.js +50 -0
  324. package/hmr/server/websocket-import-map-route.js.map +1 -0
  325. package/hmr/server/websocket-module-bindings.js +3 -3
  326. package/hmr/server/websocket-module-bindings.js.map +1 -1
  327. package/hmr/server/websocket-module-specifiers.d.ts +66 -2
  328. package/hmr/server/websocket-module-specifiers.js +191 -20
  329. package/hmr/server/websocket-module-specifiers.js.map +1 -1
  330. package/hmr/server/websocket-ns-core.d.ts +34 -0
  331. package/hmr/server/websocket-ns-core.js +414 -0
  332. package/hmr/server/websocket-ns-core.js.map +1 -0
  333. package/hmr/server/websocket-ns-entry.d.ts +21 -0
  334. package/hmr/server/websocket-ns-entry.js +164 -0
  335. package/hmr/server/websocket-ns-entry.js.map +1 -0
  336. package/hmr/server/websocket-ns-m-paths.d.ts +1 -3
  337. package/hmr/server/websocket-ns-m-paths.js +25 -82
  338. package/hmr/server/websocket-ns-m-paths.js.map +1 -1
  339. package/hmr/server/websocket-ns-m-request.d.ts +11 -1
  340. package/hmr/server/websocket-ns-m-request.js +17 -9
  341. package/hmr/server/websocket-ns-m-request.js.map +1 -1
  342. package/hmr/server/websocket-ns-m.d.ts +52 -0
  343. package/hmr/server/websocket-ns-m.js +835 -0
  344. package/hmr/server/websocket-ns-m.js.map +1 -0
  345. package/hmr/server/websocket-served-module-helpers.d.ts +50 -4
  346. package/hmr/server/websocket-served-module-helpers.js +384 -86
  347. package/hmr/server/websocket-served-module-helpers.js.map +1 -1
  348. package/hmr/server/websocket-txn.js +6 -9
  349. package/hmr/server/websocket-txn.js.map +1 -1
  350. package/hmr/server/websocket-vendor-unifier.d.ts +0 -1
  351. package/hmr/server/websocket-vendor-unifier.js +4 -9
  352. package/hmr/server/websocket-vendor-unifier.js.map +1 -1
  353. package/hmr/server/websocket.d.ts +7 -39
  354. package/hmr/server/websocket.js +643 -6716
  355. package/hmr/server/websocket.js.map +1 -1
  356. package/hmr/shared/ns-globals.d.ts +108 -0
  357. package/hmr/shared/ns-globals.js +28 -0
  358. package/hmr/shared/ns-globals.js.map +1 -0
  359. package/hmr/shared/protocol.d.ts +145 -0
  360. package/hmr/shared/protocol.js +28 -0
  361. package/hmr/shared/protocol.js.map +1 -0
  362. package/hmr/shared/runtime/boot-archive-format.d.ts +16 -0
  363. package/hmr/shared/runtime/boot-archive-format.js +31 -0
  364. package/hmr/shared/runtime/boot-archive-format.js.map +1 -0
  365. package/hmr/shared/runtime/boot-complete.d.ts +14 -0
  366. package/hmr/shared/runtime/boot-complete.js +32 -0
  367. package/hmr/shared/runtime/boot-complete.js.map +1 -0
  368. package/hmr/shared/runtime/boot-placeholder-ui.d.ts +69 -0
  369. package/hmr/shared/runtime/boot-placeholder-ui.js +101 -0
  370. package/hmr/shared/runtime/boot-placeholder-ui.js.map +1 -0
  371. package/hmr/shared/runtime/boot-progress.d.ts +44 -0
  372. package/hmr/shared/runtime/boot-progress.js +134 -0
  373. package/hmr/shared/runtime/boot-progress.js.map +1 -0
  374. package/hmr/shared/runtime/boot-timeline.d.ts +2 -1
  375. package/hmr/shared/runtime/boot-timeline.js +9 -22
  376. package/hmr/shared/runtime/boot-timeline.js.map +1 -1
  377. package/hmr/shared/runtime/browser-runtime-contract.d.ts +53 -22
  378. package/hmr/shared/runtime/browser-runtime-contract.js +6 -9
  379. package/hmr/shared/runtime/browser-runtime-contract.js.map +1 -1
  380. package/hmr/shared/runtime/dev-overlay-snapshots.d.ts +31 -0
  381. package/hmr/shared/runtime/dev-overlay-snapshots.js +324 -0
  382. package/hmr/shared/runtime/dev-overlay-snapshots.js.map +1 -0
  383. package/hmr/shared/runtime/dev-overlay.d.ts +76 -30
  384. package/hmr/shared/runtime/dev-overlay.js +767 -408
  385. package/hmr/shared/runtime/dev-overlay.js.map +1 -1
  386. package/hmr/shared/runtime/global-scope.d.ts +18 -0
  387. package/hmr/shared/runtime/global-scope.js +21 -0
  388. package/hmr/shared/runtime/global-scope.js.map +1 -0
  389. package/hmr/shared/runtime/hooks.js +2 -1
  390. package/hmr/shared/runtime/hooks.js.map +1 -1
  391. package/hmr/shared/runtime/http-only-boot.js +7 -6
  392. package/hmr/shared/runtime/http-only-boot.js.map +1 -1
  393. package/hmr/shared/runtime/module-provenance.js +4 -6
  394. package/hmr/shared/runtime/module-provenance.js.map +1 -1
  395. package/hmr/shared/runtime/root-placeholder-view.d.ts +19 -0
  396. package/hmr/shared/runtime/root-placeholder-view.js +311 -0
  397. package/hmr/shared/runtime/root-placeholder-view.js.map +1 -0
  398. package/hmr/shared/runtime/root-placeholder.js +398 -204
  399. package/hmr/shared/runtime/root-placeholder.js.map +1 -1
  400. package/hmr/shared/runtime/session-bootstrap.js +274 -55
  401. package/hmr/shared/runtime/session-bootstrap.js.map +1 -1
  402. package/hmr/shared/runtime/vendor-bootstrap.js +3 -10
  403. package/hmr/shared/runtime/vendor-bootstrap.js.map +1 -1
  404. package/hmr/shared/vendor/manifest-collect.d.ts +4 -0
  405. package/hmr/shared/vendor/manifest-collect.js +549 -0
  406. package/hmr/shared/vendor/manifest-collect.js.map +1 -0
  407. package/hmr/shared/vendor/manifest-loader.d.ts +2 -1
  408. package/hmr/shared/vendor/manifest-loader.js +5 -3
  409. package/hmr/shared/vendor/manifest-loader.js.map +1 -1
  410. package/hmr/shared/vendor/manifest.d.ts +1 -7
  411. package/hmr/shared/vendor/manifest.js +136 -825
  412. package/hmr/shared/vendor/manifest.js.map +1 -1
  413. package/hmr/shared/vendor/registry.d.ts +2 -0
  414. package/hmr/shared/vendor/registry.js +14 -0
  415. package/hmr/shared/vendor/registry.js.map +1 -1
  416. package/hmr/shared/vendor/vendor-device-shim.d.ts +1 -0
  417. package/hmr/shared/vendor/vendor-device-shim.js +208 -0
  418. package/hmr/shared/vendor/vendor-device-shim.js.map +1 -0
  419. package/hmr/shared/vendor/vendor-esbuild-plugins.d.ts +76 -0
  420. package/hmr/shared/vendor/vendor-esbuild-plugins.js +401 -0
  421. package/hmr/shared/vendor/vendor-esbuild-plugins.js.map +1 -0
  422. package/hmr/vendor-bootstrap.d.ts +1 -3
  423. package/hmr/vendor-bootstrap.js +4 -6
  424. package/hmr/vendor-bootstrap.js.map +1 -1
  425. package/index.d.ts +1 -0
  426. package/index.js +5 -0
  427. package/index.js.map +1 -1
  428. package/package.json +65 -11
  429. package/runtime/core-aliases-early.js +25 -55
  430. package/runtime/core-aliases-early.js.map +1 -1
  431. package/shims/react-jsx-runtime.d.ts +4 -0
  432. package/shims/react-jsx-runtime.js +61 -0
  433. package/shims/react-jsx-runtime.js.map +1 -0
  434. package/helpers/angular/angular-linker.d.ts +0 -13
  435. package/helpers/angular/angular-linker.js +0 -194
  436. package/helpers/angular/angular-linker.js.map +0 -1
  437. package/helpers/angular/inline-decorator-component-templates.js.map +0 -1
  438. package/helpers/angular/shared-linker.d.ts +0 -11
  439. package/helpers/angular/shared-linker.js +0 -75
  440. package/helpers/angular/shared-linker.js.map +0 -1
  441. package/helpers/angular/synthesize-decorator-ctor-parameters.js.map +0 -1
  442. package/helpers/angular/synthesize-injectable-factories.js.map +0 -1
  443. package/helpers/angular/util.js +0 -67
  444. package/helpers/angular/util.js.map +0 -1
  445. package/helpers/prelink-angular.d.ts +0 -2
  446. package/helpers/prelink-angular.js +0 -117
  447. package/helpers/prelink-angular.js.map +0 -1
  448. package/hmr/server/websocket-angular-entry.js.map +0 -1
  449. package/hmr/server/websocket-angular-hot-update.js.map +0 -1
  450. package/hmr/server/websocket-ns-m-finalize.d.ts +0 -22
  451. package/hmr/server/websocket-ns-m-finalize.js +0 -88
  452. package/hmr/server/websocket-ns-m-finalize.js.map +0 -1
  453. package/hmr/server/websocket-runtime-compat.d.ts +0 -19
  454. package/hmr/server/websocket-runtime-compat.js +0 -286
  455. package/hmr/server/websocket-runtime-compat.js.map +0 -1
  456. package/hmr/server/websocket-vue-sfc.d.ts +0 -27
  457. package/hmr/server/websocket-vue-sfc.js +0 -1114
  458. package/hmr/server/websocket-vue-sfc.js.map +0 -1
  459. package/transformers/NativeClass/index.d.ts +0 -2
  460. package/transformers/NativeClass/index.js +0 -222
  461. package/transformers/NativeClass/index.js.map +0 -1
  462. /package/{helpers/angular → hmr/frameworks/angular/build}/inline-decorator-component-templates.d.ts +0 -0
  463. /package/{helpers/angular → hmr/frameworks/angular/build}/synthesize-decorator-ctor-parameters.d.ts +0 -0
  464. /package/{helpers/angular → hmr/frameworks/angular/build}/synthesize-injectable-factories.d.ts +0 -0
  465. /package/hmr/{server → frameworks/angular/server}/websocket-angular-entry.d.ts +0 -0
@@ -0,0 +1,835 @@
1
+ import * as path from 'path';
2
+ import { parse as babelParse } from '@babel/parser';
3
+ import traverse from '@babel/traverse';
4
+ import { sanitizeStrayCoreReferences } from './core-sanitize.js';
5
+ import { getMonorepoWorkspaceRoot } from '../../helpers/project.js';
6
+ import { isRuntimeGraphExcludedPath } from './runtime-graph-filter.js';
7
+ import { buildPiniaVendorShim, buildVueVendorShim } from './vendor-bare-module-shims.js';
8
+ import { canonicalizeNsMImportPath } from './websocket-ns-m-paths.js';
9
+ import { setDeviceModuleHeaders } from './route-helpers.js';
10
+ import { CSS_MODULE_RE, buildCssRegisterSnippetFromVar, normalizeCssForDevice } from './css-device-module.js';
11
+ import { filterExistingNodeModulesTransformCandidates, getBlockedDeviceNodeModulesReason, resolveCandidateFilePath, stripDecoratedServePrefixes, tryReadRawExplicitJavaScriptModule } from './websocket-module-specifiers.js';
12
+ import { assertNoOptimizedArtifacts, buildBootProgressSnippet, canonicalizeRtImports, classifyServedModule, dedupeRtNamedImportsAgainstDestructures, deduplicateLinkerImports, ensureDestructureCoreImports, ensureGuardPlainDynamicImports, ensureVariableDynamicImportHelper, expandStarExports, hoistTopLevelStaticImports, MODULE_IMPORT_ANALYSIS_PLUGINS, wrapCommonJsModuleForDevice } from './websocket-served-module-helpers.js';
13
+ import { cleanCode, collectImportDependencies, processCodeForDevice, rewriteImports } from './websocket-device-transform.js';
14
+ import { REQUIRE_GUARD_SNIPPET } from './require-guard.js';
15
+ import { getServerOrigin } from './server-origin.js';
16
+ import { createNsMResponseMemo } from './ns-m-response-memo.js';
17
+ import { getSharedDepsBundleService, registerDepsBundleRoute } from './deps-bundle.js';
18
+ const babelTraverse = traverse?.default || traverse;
19
+ // Minimal valid ESM body for "no component update available": the iOS HTTP
20
+ // ESM loader (`LoadHttpModuleForUrl`) rejects empty bodies even on HTTP 200,
21
+ // so an actual empty response would crash the component's `_HmrLoad` import.
22
+ const NG_COMPONENT_NO_UPDATE_STUB = '// [ns:m] no Angular component update for this request — substituted with valid empty module to satisfy iOS HTTP loader (rejects empty bodies)\nexport {};\n';
23
+ /**
24
+ * Registers the `/ns/m/*` device module server: the HTTP endpoint every
25
+ * NativeScript device uses to fetch app/source modules (and AnalogJS Angular
26
+ * `/@ng/component` live-reload requests) as device-ready ESM. This is the
27
+ * single hottest route in the HMR server.
28
+ */
29
+ export function registerNsModuleServerRoute(server, options) {
30
+ // Final-response memo: repeat serves of an unchanged module (app restarts,
31
+ // the boot-archive build, kickstart waves) skip the whole post-processing
32
+ // pipeline. Keyed by a hash of Vite's transform output, so HMR edits
33
+ // invalidate implicitly. `NS_VITE_HMR_DISABLE_NSM_MEMO=1` opts out.
34
+ const memoDisabled = process.env.NS_VITE_HMR_DISABLE_NSM_MEMO === '1' || process.env.NS_VITE_HMR_DISABLE_NSM_MEMO === 'true';
35
+ const responseMemo = createNsMResponseMemo();
36
+ // Deps bundle (see deps-bundle.ts): once a boot recording exists, the
37
+ // recorded node_modules closure is served as ONE esbuild payload and the
38
+ // canonical /ns/m/node_modules/... URLs become thin registry shims.
39
+ const depsBundle = options.depsBundle !== undefined ? options.depsBundle : getSharedDepsBundleService(server);
40
+ if (depsBundle) {
41
+ registerDepsBundleRoute(server, depsBundle);
42
+ }
43
+ server.middlewares.use(async (req, res, next) => {
44
+ try {
45
+ const urlObj = new URL(req.url || '', 'http://localhost');
46
+ if (!urlObj.pathname.startsWith('/ns/m'))
47
+ return next();
48
+ // Closure deps injected by createHmrWebSocketPlugin (see websocket.ts).
49
+ const verbose = options.verbose;
50
+ const APP_VIRTUAL_WITH_SLASH = options.appVirtualWithSlash;
51
+ const sfcFileMap = options.sfcFileMap;
52
+ const depFileMap = options.depFileMap;
53
+ const sharedTransformRequest = options.sharedTransformRequest;
54
+ const ensureInitialGraphPopulationStarted = options.ensureInitialGraphPopulationStarted;
55
+ const strategy = options.getStrategy();
56
+ // Delegate AnalogJS Angular component live-reload endpoints.
57
+ //
58
+ // Angular 21's `ɵɵgetReplaceMetadataURL` (in @angular/core
59
+ // _debug_node-chunk.mjs) builds the metadata-replacement URL as
60
+ // `new URL('./@ng/component?c=<id>&t=<ts>', import.meta.url).href`.
61
+ // Because `import.meta.url` for a NS-served module is
62
+ // `http://host:port/ns/m/<project-relative>/component.ts`, the
63
+ // resolved metadata URL ends up *nested* under the component's
64
+ // directory: `/ns/m/<dir>/@ng/component?c=...&t=...`.
65
+ //
66
+ // AnalogJS's `liveReloadPlugin` registers a middleware that matches
67
+ // `/@ng/component` anywhere in `req.url` and returns either an empty
68
+ // module body (no HMR update available) or the metadata-replacement
69
+ // code (after a save invalidates the file). Without this delegation
70
+ // the NS `/ns/m/` middleware would treat the path as a file lookup,
71
+ // fail to resolve `@ng/component` against disk, and respond with
72
+ // 404 — which surfaces as `HTTP fetch/compile failed` at the
73
+ // component's own `_HmrLoad(Date.now())` call on initial boot and
74
+ // blocks Angular component bootstrapping.
75
+ //
76
+ // Calling `next()` here lets AnalogJS's middleware (or any other
77
+ // middleware later in the chain) handle the request. Analog's
78
+ // middleware reads only the `?c=` query string and is pathname-
79
+ // agnostic, so we don't need to rewrite `req.url` for it to work.
80
+ //
81
+ // HOWEVER: AnalogJS responds with an EMPTY body (`res.end('')`)
82
+ // for non-invalidated component IDs (initial boot, before any
83
+ // file save). The iOS HTTP ESM loader's
84
+ // `LoadHttpModuleForUrl` (ModuleInternalCallbacks.mm) treats an
85
+ // empty body as a fetch failure (`body.empty() → reject`), even
86
+ // when the HTTP status is 200 OK. That bubbles up as
87
+ // `HTTP fetch/compile failed` at the device's `__ns_import(...)`
88
+ // inside each component's `_HmrLoad(Date.now())` and crashes
89
+ // Angular's component bootstrap. To make Analog's empty
90
+ // "no-update" response acceptable to the iOS loader, we wrap
91
+ // `res.write` / `res.end` and substitute a minimal valid ESM
92
+ // module body (`export {}`) when downstream writes nothing.
93
+ // Non-empty bodies (real HMR update payloads after a save)
94
+ // pass through unchanged.
95
+ if (urlObj.pathname.includes('/@ng/component')) {
96
+ // Boot-fetch gate: every compiled component runs
97
+ // `<Class>_HmrLoad(Date.now())` on evaluation, so every cold
98
+ // boot hits this route for every component. Analog serves a
99
+ // REAL metadata-replacement payload whenever the component's
100
+ // module was invalidated at any point in the dev server's
101
+ // lifetime (Vite's `lastInvalidationTimestamp` never resets),
102
+ // and a boot-time `ɵɵreplaceMetadata` on the root component
103
+ // tears down the PageRouterOutlet frame — the "relaunch after
104
+ // an HMR edit → white screen" failure. Only fetches echoing a
105
+ // forwarded `angular:component-update` broadcast's exact
106
+ // `(id, t)` pair may reach Analog; a fresh boot already
107
+ // evaluates the latest transformed source and never needs a
108
+ // replacement payload.
109
+ const isLiveUpdateFetch = options.isLiveAngularComponentUpdateFetch;
110
+ if (isLiveUpdateFetch) {
111
+ const componentId = urlObj.searchParams.get('c') || '';
112
+ const timestampRaw = urlObj.searchParams.get('t');
113
+ // `Number(null)` is 0 — require an actual `t` param.
114
+ const timestamp = timestampRaw ? Number(timestampRaw) : NaN;
115
+ if (!componentId || !Number.isFinite(timestamp) || !isLiveUpdateFetch(componentId, timestamp)) {
116
+ res.statusCode = 200;
117
+ res.setHeader('Content-Type', 'text/javascript');
118
+ res.setHeader('Cache-Control', 'no-cache');
119
+ res.end(NG_COMPONENT_NO_UPDATE_STUB);
120
+ return;
121
+ }
122
+ }
123
+ const chunks = [];
124
+ const origEnd = res.end.bind(res);
125
+ let ended = false;
126
+ const captureChunk = (chunk) => {
127
+ if (chunk == null)
128
+ return;
129
+ if (typeof chunk === 'string') {
130
+ chunks.push(chunk);
131
+ }
132
+ else if (Buffer.isBuffer(chunk)) {
133
+ chunks.push(chunk.toString('utf8'));
134
+ }
135
+ else {
136
+ chunks.push(String(chunk));
137
+ }
138
+ };
139
+ res.write = function (chunk, ..._args) {
140
+ captureChunk(chunk);
141
+ return true;
142
+ };
143
+ res.end = function (chunk, ..._args) {
144
+ if (ended)
145
+ return true;
146
+ ended = true;
147
+ captureChunk(chunk);
148
+ let body = chunks.join('');
149
+ if (body.length === 0) {
150
+ body = NG_COMPONENT_NO_UPDATE_STUB;
151
+ }
152
+ try {
153
+ res.setHeader('Content-Length', Buffer.byteLength(body, 'utf8'));
154
+ }
155
+ catch { }
156
+ return origEnd(body);
157
+ };
158
+ return next();
159
+ }
160
+ // graphVersion starts at 1 and stays stable during cold boot (see
161
+ // `upsertGraphModule`'s bumpVersion option and the inline comment
162
+ // at the graphVersion declaration), so the initial population can
163
+ // run in the background without blocking the first response.
164
+ // `handleHotUpdate` awaits the same promise so the first HMR
165
+ // event still sees a fully populated graph.
166
+ ensureInitialGraphPopulationStarted(server);
167
+ // Cold-boot counting lives in the leading boot-trace middleware
168
+ // (see `configureServer` — it records the request and tracks
169
+ // finish() via res.on('close'/'finish')), not here: recording in
170
+ // this handler would miss the round-trip timing and per-route
171
+ // breakdowns.
172
+ setDeviceModuleHeaders(res);
173
+ // Support both query (?path=/abs) and path-style (/ns/m/abs)
174
+ let spec = urlObj.searchParams.get('path') || '';
175
+ if (!spec) {
176
+ const base = '/ns/m';
177
+ const rest = urlObj.pathname.slice(base.length);
178
+ if (rest && rest !== '/')
179
+ spec = rest;
180
+ }
181
+ // Special-case stub for anomalous '@' imports emitted as '/__invalid_at__.mjs'
182
+ if (spec === '/__invalid_at__.mjs' || spec === '__invalid_at__.mjs') {
183
+ res.statusCode = 200;
184
+ res.end("// invalid '@' import stub\nexport {}\n");
185
+ return;
186
+ }
187
+ if (!spec) {
188
+ res.statusCode = 200;
189
+ res.end('export {}\n');
190
+ return;
191
+ }
192
+ const serverRoot = (server.config?.root || process.cwd());
193
+ const monorepoWorkspaceRoot = getMonorepoWorkspaceRoot(serverRoot);
194
+ spec = spec.replace(/[?#].*$/, '');
195
+ // Tolerate LEGACY path-based boot/HMR prefixes from stale cached
196
+ // device code (`/ns/m/__ns_boot__/b1/…`, `/ns/m/__ns_hmr__/<tag>/…`).
197
+ // Current servers never emit them — freshness is eviction-driven.
198
+ try {
199
+ spec = stripDecoratedServePrefixes(spec).cleanedSpec;
200
+ }
201
+ catch { }
202
+ // Normalize absolute filesystem paths back to project-relative ids (e.g. /src/app.ts)
203
+ try {
204
+ const toPosix = (p) => p.replace(/\\/g, '/');
205
+ const rootPosix = toPosix(serverRoot);
206
+ const specPosix = toPosix(spec);
207
+ // If spec is an absolute path under the project root, convert to '/'+relative
208
+ const isAbsFs = /^\//.test(specPosix) || /^[A-Za-z]:\//.test(spec); // posix or win drive
209
+ if (isAbsFs) {
210
+ let rel = specPosix.startsWith(rootPosix) ? specPosix.slice(rootPosix.length) : require('path').posix.relative(rootPosix, specPosix);
211
+ if (!rel.startsWith('..')) {
212
+ if (!rel.startsWith('/'))
213
+ rel = '/' + rel;
214
+ // Ensure leading '/src' style when path maps into src
215
+ spec = rel;
216
+ }
217
+ }
218
+ }
219
+ catch { }
220
+ // Serve Vite virtual modules (/@id/ prefix). These are internal
221
+ // virtual modules (e.g., \0nsvite:nsconfig-json for ~/package.json)
222
+ // that don't exist on disk. Decode the ID and load via plugin container.
223
+ if (spec.startsWith('/@id/')) {
224
+ try {
225
+ // First try Vite's transform pipeline directly
226
+ const vr = await sharedTransformRequest(spec);
227
+ if (vr?.code) {
228
+ res.statusCode = 200;
229
+ res.end(vr.code);
230
+ return;
231
+ }
232
+ }
233
+ catch { }
234
+ try {
235
+ // Fallback: decode the virtual module ID (__x00__ → \0) and
236
+ // load through the plugin container directly
237
+ const rawId = spec.slice('/@id/'.length).replace(/__x00__/g, '\0');
238
+ const loadResult = await server.pluginContainer.load(rawId);
239
+ if (loadResult) {
240
+ const code = typeof loadResult === 'string' ? loadResult : loadResult.code;
241
+ if (code) {
242
+ res.statusCode = 200;
243
+ res.end(code);
244
+ return;
245
+ }
246
+ }
247
+ }
248
+ catch { }
249
+ }
250
+ if (spec.startsWith('@/'))
251
+ spec = APP_VIRTUAL_WITH_SLASH + spec.slice(2);
252
+ if (spec.startsWith('./'))
253
+ spec = spec.slice(1);
254
+ const blockedNodeModulesReason = getBlockedDeviceNodeModulesReason(spec);
255
+ if (blockedNodeModulesReason) {
256
+ res.statusCode = 404;
257
+ res.end(`// [ns:m] blocked device import\nthrow new Error(${JSON.stringify(`[ns/m] ${blockedNodeModulesReason}`)});\nexport {};\n`);
258
+ return;
259
+ }
260
+ if (!spec.startsWith('/'))
261
+ spec = '/' + spec;
262
+ // Deps-bundle shim short-circuit: a bundled node_modules module is
263
+ // served as a thin registry shim (see deps-bundle.ts) — the whole
264
+ // transform pipeline below is skipped. Non-bundled specs (no
265
+ // recording yet, CJS files, build failure) fall through unchanged.
266
+ if (depsBundle && spec.includes('/node_modules/')) {
267
+ const shim = depsBundle.getShimForSpec(spec);
268
+ if (shim) {
269
+ res.statusCode = 200;
270
+ res.end(shim);
271
+ return;
272
+ }
273
+ }
274
+ // A JS/TS `import './x.css'` reaches the device as a module request;
275
+ // Vite's default CSS module needs a DOM, so it's a no-op on NativeScript.
276
+ // Compile via `?inline` (full postcss/sass/@import, no DOM side effect),
277
+ // register the result under the file's root-relative tag (matches the
278
+ // `.css` live-edit tag so edits replace, not stack), and re-export the
279
+ // string for `import css from './x.css'`. `app.css` has its own path.
280
+ if (CSS_MODULE_RE.test(spec)) {
281
+ try {
282
+ const inlineRes = await sharedTransformRequest(`${spec}?inline`);
283
+ const inlineCode = inlineRes?.code || '';
284
+ // `?inline` output is `export default "<compiled css>"`.
285
+ const m = inlineCode.match(/export\s+default\s+("(?:[^"\\]|\\.)*")\s*;?/s);
286
+ if (m) {
287
+ let css = '';
288
+ try {
289
+ css = JSON.parse(m[1]);
290
+ }
291
+ catch { }
292
+ css = normalizeCssForDevice(css);
293
+ const out = `// [ns:m][css] ${spec}\n` + `const __ns_css_text__ = ${JSON.stringify(css)};\n` + buildCssRegisterSnippetFromVar(spec, '__ns_css_text__') + `export default __ns_css_text__;\n`;
294
+ res.statusCode = 200;
295
+ res.end(out);
296
+ return;
297
+ }
298
+ if (verbose)
299
+ console.warn('[ns:m][css] unexpected ?inline output shape for', spec);
300
+ }
301
+ catch (cssErr) {
302
+ if (verbose)
303
+ console.warn('[ns:m][css] inline compile failed', spec, cssErr?.message);
304
+ }
305
+ // Fall through to default handling if inline compile produced nothing.
306
+ }
307
+ const hasExt = /\.(ts|tsx|js|jsx|mjs|mts|cts|vue)$/i.test(spec);
308
+ const baseNoExt = hasExt ? spec.replace(/\.(ts|tsx|js|jsx|mjs|mts|cts)$/i, '') : spec;
309
+ const candidates = [...(hasExt ? [spec] : []), baseNoExt + '.ts', baseNoExt + '.js', baseNoExt + '.tsx', baseNoExt + '.jsx', baseNoExt + '.mjs', baseNoExt + '.mts', baseNoExt + '.cts', baseNoExt + '.vue', baseNoExt + '/index.ts', baseNoExt + '/index.js', baseNoExt + '/index.tsx', baseNoExt + '/index.jsx', baseNoExt + '/index.mjs'];
310
+ const transformCandidates = filterExistingNodeModulesTransformCandidates(spec, candidates, serverRoot, monorepoWorkspaceRoot);
311
+ let transformed = null;
312
+ let resolvedCandidate = null;
313
+ const rawExplicitModule = tryReadRawExplicitJavaScriptModule(spec, serverRoot);
314
+ if (rawExplicitModule) {
315
+ transformed = { code: rawExplicitModule.code };
316
+ resolvedCandidate = rawExplicitModule.resolvedId;
317
+ }
318
+ // Queue and dedupe transformRequest calls so heavy app graphs do not
319
+ // overwhelm Vite with concurrent work. Slow-transform warnings start only
320
+ // when the transform actually begins executing, and requests stay pending
321
+ // until Vite returns a real result.
322
+ const transformWithTimeout = async (url, timeoutMs = 120000) => {
323
+ const r = await sharedTransformRequest(url, timeoutMs);
324
+ // A type-only .ts module legitimately transforms to EMPTY code
325
+ // (e.g. a workspace lib's `interfaces.ts` holding only `export
326
+ // type ...`). Every candidate gate below tests `r?.code`
327
+ // truthiness, so '' would cascade through all fallbacks into a
328
+ // 404 "transform miss" — and one 404 in the entry graph fails
329
+ // the whole dev-session boot. Normalize to the canonical empty
330
+ // ESM module instead.
331
+ if (r && typeof r.code === 'string' && r.code.trim() === '') {
332
+ return { ...r, code: 'export {}\n' };
333
+ }
334
+ return r;
335
+ };
336
+ if (!transformed?.code) {
337
+ for (const cand of transformCandidates) {
338
+ try {
339
+ const r = await transformWithTimeout(cand);
340
+ if (r?.code) {
341
+ transformed = r;
342
+ resolvedCandidate = cand;
343
+ break;
344
+ }
345
+ }
346
+ catch { }
347
+ }
348
+ }
349
+ // Fallback 1: ask Vite to resolve the id, then transform the resolved id (handles aliases and virtual ids)
350
+ if (!transformed?.code) {
351
+ try {
352
+ const rid = await server.pluginContainer?.resolveId?.(spec, undefined);
353
+ const ridStr = typeof rid === 'string' ? rid : rid?.id || null;
354
+ if (ridStr) {
355
+ const r = await transformWithTimeout(ridStr);
356
+ if (r?.code) {
357
+ transformed = r;
358
+ resolvedCandidate = ridStr;
359
+ }
360
+ }
361
+ }
362
+ catch { }
363
+ }
364
+ // Fallback 1b: if spec is a /node_modules/ path, extract bare specifier
365
+ // and try resolveId with that. This handles package.json "exports" field
366
+ // resolution (e.g., solid-js/jsx-runtime → solid-js/dist/solid.js).
367
+ if (!transformed?.code && spec.includes('/node_modules/')) {
368
+ try {
369
+ const nmIdx = spec.lastIndexOf('/node_modules/');
370
+ const bare = spec.slice(nmIdx + '/node_modules/'.length);
371
+ if (bare && !bare.startsWith('.')) {
372
+ const rid = await server.pluginContainer?.resolveId?.(bare, undefined);
373
+ const ridStr = typeof rid === 'string' ? rid : rid?.id || null;
374
+ if (ridStr) {
375
+ const r = await transformWithTimeout(ridStr);
376
+ if (r?.code) {
377
+ transformed = r;
378
+ resolvedCandidate = ridStr;
379
+ }
380
+ }
381
+ }
382
+ }
383
+ catch { }
384
+ }
385
+ // Fallback 2: try /@fs absolute path under project root (Vite file system alias).
386
+ // In a monorepo with hoisted node_modules the file may live above
387
+ // `serverRoot`, so try the workspace root next.
388
+ if (!transformed?.code) {
389
+ try {
390
+ const toPosix = (p) => p.replace(/\\/g, '/');
391
+ const rootsToTry = [serverRoot, ...(monorepoWorkspaceRoot && path.resolve(monorepoWorkspaceRoot) !== path.resolve(serverRoot) ? [monorepoWorkspaceRoot] : [])];
392
+ for (const root of rootsToTry) {
393
+ const rootPosix = toPosix(root).replace(/\/$/, '');
394
+ const absPosix = `${rootPosix}${spec.startsWith('/') ? '' : '/'}${spec}`;
395
+ const fsId = `/@fs${absPosix}`;
396
+ if (resolveCandidateFilePath(fsId, serverRoot, monorepoWorkspaceRoot)) {
397
+ const r = await transformWithTimeout(fsId);
398
+ if (r?.code) {
399
+ transformed = r;
400
+ resolvedCandidate = fsId;
401
+ break;
402
+ }
403
+ }
404
+ }
405
+ }
406
+ catch { }
407
+ }
408
+ // Fallback 3: try adding ?import to hint Vite's transform pipeline
409
+ if (!transformed?.code) {
410
+ for (const cand of transformCandidates) {
411
+ try {
412
+ const r = await transformWithTimeout(`${cand}${cand.includes('?') ? '&' : '?'}import`);
413
+ if (r?.code) {
414
+ transformed = r;
415
+ resolvedCandidate = `${cand}?import`;
416
+ break;
417
+ }
418
+ }
419
+ catch { }
420
+ }
421
+ }
422
+ // Solid HMR: patch the served `@solid-refresh` runtime so $$refreshESM
423
+ // applies registry updates inline on module re-evaluation. The full
424
+ // patch (and its server-side diagnostics) lives in the Solid strategy's
425
+ // `transformNodeModule` hook; every other flavor leaves the hook
426
+ // undefined, so this is a no-op for them.
427
+ try {
428
+ if (transformed?.code && strategy?.transformNodeModule) {
429
+ const patched = strategy.transformNodeModule(transformed.code, resolvedCandidate || spec || '', verbose);
430
+ if (patched !== transformed.code) {
431
+ // Work on a copy to avoid mutating Vite's cached TransformResult
432
+ transformed = { ...transformed, code: patched };
433
+ }
434
+ }
435
+ }
436
+ catch { }
437
+ // NOTE: Path-based cache busting for /ns/m/* imports is applied in the
438
+ // finalize step below (after rewriteImports adds the /ns/m/ prefix).
439
+ // The block here only handles TypeScript-specific graph population.
440
+ try {
441
+ if (transformed?.code) {
442
+ const code = transformed.code;
443
+ // TypeScript-specific graph population: when TS flavor is active
444
+ // and this is an application module under the virtual app root,
445
+ // upsert it into the HMR graph so ns:hmr-full-graph is non-empty.
446
+ try {
447
+ if (strategy?.flavor === 'typescript' || strategy?.flavor === 'react') {
448
+ const id = (resolvedCandidate || spec).replace(/[?#].*$/, '');
449
+ // Only track app modules (under APP_VIRTUAL_WITH_SLASH) and ts/js/tsx/jsx/mjs.
450
+ const isApp = id.startsWith(APP_VIRTUAL_WITH_SLASH) || id.startsWith('/app/');
451
+ if (isApp && /\.(ts|tsx|js|jsx|mjs|mts|cts)$/i.test(id) && !isRuntimeGraphExcludedPath(id)) {
452
+ const deps = Array.from(collectImportDependencies(code, id));
453
+ if (verbose) {
454
+ console.log('[hmr-ws][ts-graph] candidate', { id, depsCount: deps.length });
455
+ }
456
+ // Serve-time warm-up: no live edit happened, so don't bump
457
+ // graphVersion.
458
+ options.upsertGraphModule(id, code, deps, { bumpVersion: false });
459
+ }
460
+ }
461
+ }
462
+ catch { }
463
+ }
464
+ }
465
+ catch { }
466
+ // If transformRequest failed, handle bare-module vendor shims for 'vue' and 'pinia'
467
+ if (!transformed?.code) {
468
+ const bare = spec.startsWith('/') ? spec.slice(1) : spec;
469
+ const isBare = bare && !bare.includes('/') && !/\.(ts|tsx|js|jsx|mjs|mts|cts|vue)$/i.test(bare);
470
+ if (isBare && (bare === 'vue' || bare === 'nativescript-vue' || bare === 'pinia')) {
471
+ const pkg = bare;
472
+ let code = '';
473
+ if (pkg === 'vue' || pkg === 'nativescript-vue') {
474
+ code = buildVueVendorShim(pkg);
475
+ }
476
+ else if (pkg === 'pinia') {
477
+ code = buildPiniaVendorShim();
478
+ }
479
+ res.statusCode = 200;
480
+ res.end(code || 'export {}\n');
481
+ return;
482
+ }
483
+ // Generic bare module resolution via Vite plugin container
484
+ if (isBare) {
485
+ try {
486
+ const resolved = await server.pluginContainer?.resolveId?.(spec, undefined);
487
+ const resolvedId = typeof resolved === 'string' ? resolved : resolved?.id || null;
488
+ if (resolvedId) {
489
+ const r = await transformWithTimeout(resolvedId);
490
+ if (r?.code) {
491
+ transformed = r;
492
+ resolvedCandidate = resolvedId;
493
+ }
494
+ }
495
+ }
496
+ catch { }
497
+ }
498
+ if (!transformed?.code) {
499
+ // Emit a module that throws with context for easier on-device debugging
500
+ try {
501
+ const tried = Array.from(new Set(transformCandidates.length > 0 ? transformCandidates : candidates)).slice(0, 12);
502
+ const out = `// [ns:m] transform miss path=${spec} tried=${tried.length}\n` + `throw new Error(${JSON.stringify(`[ns/m] transform failed for ${spec} (tried ${tried.length} candidates).`)});\nexport {};\n`;
503
+ res.statusCode = 404;
504
+ res.end(out);
505
+ return;
506
+ }
507
+ catch {
508
+ res.statusCode = 404;
509
+ res.end('export {}\n');
510
+ return;
511
+ }
512
+ }
513
+ }
514
+ // Final-response memo (see ns-m-response-memo.ts): identical
515
+ // (spec, transform output, context) → identical served body, so repeat
516
+ // serves skip the post-processing pipeline. The graph version in the
517
+ // context conservatively invalidates on any live edit — star-export
518
+ // expansion and the link-check read other modules, so this module's
519
+ // own transform hash is not sufficient.
520
+ const memoContext = `${strategy?.flavor || ''}|${getServerOrigin(server)}|${options.getGraphVersion()}|${resolvedCandidate || ''}`;
521
+ const memoKey = memoDisabled ? null : responseMemo.buildKey(spec, transformed.code, memoContext);
522
+ if (memoKey) {
523
+ const memoized = responseMemo.get(memoKey);
524
+ if (memoized !== undefined) {
525
+ res.statusCode = 200;
526
+ res.end(memoized);
527
+ return;
528
+ }
529
+ }
530
+ let code = transformed.code;
531
+ // Prepend guard to capture any URL-based require attempts
532
+ code = REQUIRE_GUARD_SNIPPET + code;
533
+ code = cleanCode(code, strategy);
534
+ // Library code (node_modules, monorepo core source, dist vite package)
535
+ // must skip the app-source passes inside processCodeForDevice (AST
536
+ // normalization, /ns/rt helper-alias injection). One classification
537
+ // point — see classifyServedModule for the full case list.
538
+ const isNodeMod = classifyServedModule(resolvedCandidate || spec) === 'library';
539
+ code = processCodeForDevice(code, false, true, isNodeMod, resolvedCandidate || spec);
540
+ // import.meta.hot is JS-owned: cleanCode() strips Vite's browser
541
+ // __vite__createHotContext assignment and processCodeForDevice
542
+ // injects the NS hot-context prelude (globalThis.__NS_HOT_REGISTRY__,
543
+ // installed by the /__ns_dev__/client bootstrap) for app modules.
544
+ const projectRoot = server.config?.root || process.cwd();
545
+ const serverOrigin = getServerOrigin(server);
546
+ // Served-module import rewrite, routed through the active framework
547
+ // strategy. Angular overrides with its register-only entry pass
548
+ // (`rewriteServedModule`); every other flavor falls through to the shared
549
+ // `rewriteImports` default.
550
+ const servedModuleCtx = {
551
+ moduleId: resolvedCandidate || spec,
552
+ sfcFileMap,
553
+ depFileMap,
554
+ projectRoot,
555
+ serverOrigin,
556
+ verbose: !!verbose,
557
+ };
558
+ code = strategy?.rewriteServedModule ? strategy.rewriteServedModule(code, servedModuleCtx) : rewriteImports(code, servedModuleCtx.moduleId, sfcFileMap, depFileMap, projectRoot, !!verbose, undefined, serverOrigin, true);
559
+ // Expand `export * from "url"` into explicit named re-exports.
560
+ // NativeScript's HTTP ESM loader may not propagate star-re-exports across
561
+ // HTTP module boundaries (the namespace object gets direct exports but
562
+ // misses re-exported names). By expanding to `export { a, b } from "url"`,
563
+ // the engine sees explicit named exports and resolves them correctly.
564
+ try {
565
+ code = await expandStarExports(code, server, server.config?.root || process.cwd(), verbose, sharedTransformRequest, resolvedCandidate || spec);
566
+ }
567
+ catch (e) {
568
+ if (verbose)
569
+ console.warn('[ns/m] export* expansion failed:', e?.message);
570
+ }
571
+ // Dedupe any /ns/rt named imports that duplicate destructured bindings off default /ns/rt
572
+ try {
573
+ code = dedupeRtNamedImportsAgainstDestructures(code);
574
+ }
575
+ catch { }
576
+ code = ensureVariableDynamicImportHelper(code);
577
+ // Final safety: guard any plain dynamic import(...) occurrences to reroute anomalous '@' specs
578
+ try {
579
+ code = ensureGuardPlainDynamicImports(code);
580
+ }
581
+ catch { }
582
+ // Extra hardening before the fast-fail assertion: run the
583
+ // consolidated stray-core-reference safety net. If any
584
+ // rewrite occurred, leave a diagnostic marker so the
585
+ // pipeline review log explains why the served code carries
586
+ // it.
587
+ try {
588
+ const __before = code;
589
+ code = sanitizeStrayCoreReferences(code);
590
+ if (code !== __before) {
591
+ code = `// [hmr-sanitize] core-literal->bridge\n` + code;
592
+ }
593
+ }
594
+ catch { }
595
+ // Final pass: deduplicate/resolve any bare-specifier imports that slipped
596
+ // through the pipeline (e.g., extracted from JSDoc comments by import-splitting
597
+ // regexes, or injected by the Angular linker on already-resolved code).
598
+ try {
599
+ code = deduplicateLinkerImports(code);
600
+ }
601
+ catch { }
602
+ // CJS/UMD wrapping: if a module uses module.exports but has no ESM export default,
603
+ // wrap it with CJS shims so the device HTTP ESM loader can consume it.
604
+ // This handles npm packages that use CommonJS but aren't pre-bundled by Vite.
605
+ //
606
+ // Key constraints this must handle:
607
+ // - CJS modules often declare local vars with the same names as their exports
608
+ // (e.g. `function createLTTB() {...}; exports.createLTTB = createLTTB;`)
609
+ // so `export var { createLTTB }` would cause a duplicate declaration.
610
+ // - UMD modules reference `this` at top level (undefined in ESM) but
611
+ // typically fall back to `self` or `globalThis`.
612
+ // - `module`, `exports` must be shims since they don't exist in ESM.
613
+ try {
614
+ code = wrapCommonJsModuleForDevice(code, resolvedCandidate || null);
615
+ }
616
+ catch { }
617
+ try {
618
+ assertNoOptimizedArtifacts(code, `NS M ${resolvedCandidate || spec}`);
619
+ }
620
+ catch (e) {
621
+ res.statusCode = 500;
622
+ return void res.end(`throw new Error(${JSON.stringify(e?.message || String(e))});\nexport {};`);
623
+ }
624
+ // Defensive export normalization: if a module defines `routes` and only exports it named,
625
+ // add a default export alias so both `import { routes }` and `import routes` work.
626
+ try {
627
+ if (!/\bexport\s+default\b/.test(code)) {
628
+ const hasNamedRoutes = /\bexport\s*\{\s*routes\s*\}/.test(code);
629
+ const hasConstRoutes = /\bconst\s+routes\s*=/.test(code) || /\bvar\s+routes\s*=/.test(code) || /\blet\s+routes\s*=/.test(code);
630
+ if (hasNamedRoutes && hasConstRoutes) {
631
+ code += `\nexport default routes;\n`;
632
+ }
633
+ }
634
+ }
635
+ catch { }
636
+ // Every emitted endpoint URL is CANONICAL (unversioned).
637
+ //
638
+ // Module identity is literally the URL — a versioned
639
+ // `/ns/rt/<ver>` / `/ns/core/<ver>` / `/ns/sfc/<ver>` would
640
+ // create a second module realm. `canonicalizeRtImports` and the
641
+ // strategy's `canonicalizeFrameworkImports` collapse any
642
+ // versioned form (stale cached device code) back to the single
643
+ // canonical URL.
644
+ try {
645
+ code = canonicalizeRtImports(code, getServerOrigin(server));
646
+ code = strategy.canonicalizeFrameworkImports?.(code, getServerOrigin(server)) ?? code;
647
+ }
648
+ catch { }
649
+ // `/ns/m` URL finalize step.
650
+ //
651
+ // `canonicalizeNsMImportPath` strips any `__ns_hmr__/<tag>/`
652
+ // and `__ns_boot__/b1/` segments so every emitted URL is the
653
+ // canonical stable form (cache busting is driven by
654
+ // `__NS_DEV__.invalidateModules` + the runtime's eviction nonce, not
655
+ // URL decoration).
656
+ try {
657
+ const origin = getServerOrigin(server);
658
+ const rewritePath = (p) => canonicalizeNsMImportPath(p);
659
+ // /ns/m URL forms — all collapse to canonical stable
660
+ // URLs via the `rewriteNsMImportPathForHmr` rewriter.
661
+ // 1) Static imports: import ... from "/ns/m/..."
662
+ code = code.replace(/(from\s*["'])(\/ns\/m\/[^"'?]+)(["'])/g, (_m, a, p, b) => `${a}${rewritePath(p)}${b}`);
663
+ // 2) Side-effect imports: import "/ns/m/..."
664
+ code = code.replace(/(import\s*(?!\()\s*["'])(\/ns\/m\/[^"'?]+)(["'])/g, (_m, a, p, b) => `${a}${rewritePath(p)}${b}`);
665
+ // 3) Dynamic imports: import("/ns/m/...")
666
+ code = code.replace(/(import\(\s*["'])(\/ns\/m\/[^"'?]+)(["']\s*\))/g, (_m, a, p, b) => `${a}${rewritePath(p)}${b}`);
667
+ // 4) new URL("/ns/m/...", import.meta.url)
668
+ code = code.replace(/(new\s+URL\(\s*["'])(\/ns\/m\/[^"'?]+)(["']\s*,\s*import\.meta\.url\s*\))/g, (_m, a, p, b) => `${a}${rewritePath(p)}${b}`);
669
+ // 5) __ns_import(new URL('/ns/m/...', import.meta.url).href)
670
+ code = code.replace(/(new\s+URL\(\s*["'])(\/ns\/m\/[^"'?]+)(["']\s*,\s*import\.meta\.url\s*\)\.href)/g, (_m, a, p, b) => `${a}${rewritePath(p)}${b}`);
671
+ // 6) Force absolute HTTP for new URL('/ns/m/...', import.meta.url).href → canonical stable URL.
672
+ try {
673
+ code = code.replace(/new\s+URL\(\s*["'](\/ns\/m\/[^"'?]+)(?:\?[^"']*)?["']\s*,\s*import\.meta\.url\s*\)\.href/g, (_m, p1) => `${JSON.stringify(`${origin}${rewritePath(p1)}`)}`);
674
+ }
675
+ catch { }
676
+ // 7) SFC URLs (Vue) — canonical, like everything else. Freshness
677
+ // is driven by the Vue client evicting the SFC artifact URL set.
678
+ try {
679
+ code = code.replace(/new\s+URL\(\s*["']\/ns\/sfc(\/[^"'?]+)(?:\?[^"']*)?["']\s*,\s*import\.meta\.url\s*\)\.href/g, (_m, p1) => `${JSON.stringify(`${origin}/ns/sfc${p1}`)}`);
680
+ }
681
+ catch { }
682
+ }
683
+ catch { }
684
+ // Final guard: eliminate any lingering named imports from /ns/core to avoid
685
+ // evaluation-time "does not provide an export named ..." in the device runtime.
686
+ try {
687
+ code = ensureDestructureCoreImports(code);
688
+ }
689
+ catch { }
690
+ // Boot-time module graph progress: while the app is still replacing
691
+ // the placeholder, emit lightweight progress updates as /ns/m app
692
+ // modules begin evaluating. The snippet is SELF-GATING (it no-ops
693
+ // once `__NS_HMR_BOOT_COMPLETE__` flips) so it is injected
694
+ // unconditionally — no boot-tagged URL needed. node_modules are
695
+ // deliberately skipped (the heartbeat's wall-clock axis covers
696
+ // vendor stretches; see startBootImportHeartbeat).
697
+ try {
698
+ if (!isNodeMod) {
699
+ const bootModuleLabel = String(spec || '').replace(/\\/g, '/');
700
+ const bootProgressSnippet = buildBootProgressSnippet(bootModuleLabel);
701
+ code = bootProgressSnippet + code;
702
+ code = hoistTopLevelStaticImports(code);
703
+ }
704
+ }
705
+ catch { }
706
+ // Dev-only: link-check static imports to surface missing bindings early
707
+ try {
708
+ const devCheck = process.env.NODE_ENV !== 'production';
709
+ if (devCheck) {
710
+ const ast = babelParse(code, {
711
+ sourceType: 'module',
712
+ plugins: MODULE_IMPORT_ANALYSIS_PLUGINS,
713
+ });
714
+ const imports = [];
715
+ babelTraverse(ast, {
716
+ ImportDeclaration(p) {
717
+ const src = p.node.source.value;
718
+ if (typeof src !== 'string')
719
+ return;
720
+ const wantsDefault = p.node.specifiers.some((s) => s.type === 'ImportDefaultSpecifier');
721
+ imports.push({ src, wantsDefault });
722
+ },
723
+ });
724
+ // Resolve and verify each static import that asks for default
725
+ for (const imp of imports) {
726
+ if (!imp.wantsDefault)
727
+ continue;
728
+ // Only check our served endpoints and app modules
729
+ if (/^https?:\/\/[^\s]+\/ns\//.test(imp.src) || /^https?:\/\/[^\s]+\/.+/.test(imp.src)) {
730
+ const u = new URL(imp.src, 'http://localhost');
731
+ // Fetch target module's sanitized code using server.transformRequest or by routing through our own endpoints heuristically
732
+ let targetCode = '';
733
+ try {
734
+ if (u.pathname.startsWith('/ns/asm')) {
735
+ // Reconstruct: call our own assembler handler to get code (preferred)
736
+ const target = await server.transformRequest(imp.src.replace(/^https?:\/\/[^/]+/, ''));
737
+ targetCode = target?.code || '';
738
+ }
739
+ else if (u.pathname.startsWith('/ns/sfc')) {
740
+ // Delegator re-exports default from /ns/asm — skip; assembler will be checked when imported by upstream
741
+ continue;
742
+ }
743
+ else if (u.pathname.startsWith('/ns/m')) {
744
+ // Resolve to local project path and transform with same candidate logic as /ns/m handler
745
+ let local = u.pathname.replace(/^\/ns\/m/, '');
746
+ try {
747
+ // Normalize project-relative path
748
+ if (local.startsWith('@/'))
749
+ local = APP_VIRTUAL_WITH_SLASH + local.slice(2);
750
+ if (local.startsWith('./'))
751
+ local = local.slice(1);
752
+ if (!local.startsWith('/'))
753
+ local = '/' + local;
754
+ const hasExt = /(\.ts|\.tsx|\.js|\.jsx|\.mjs|\.mts|\.cts|\.vue)$/i.test(local);
755
+ const baseNoExt = hasExt ? local.replace(/\.(ts|tsx|js|jsx|mjs|mts|cts)$/i, '') : local;
756
+ const cands = [...(hasExt ? [local] : []), baseNoExt + '.ts', baseNoExt + '.js', baseNoExt + '.tsx', baseNoExt + '.jsx', baseNoExt + '.mjs', baseNoExt + '.mts', baseNoExt + '.cts', baseNoExt + '.vue', baseNoExt + '/index.ts', baseNoExt + '/index.js', baseNoExt + '/index.tsx', baseNoExt + '/index.jsx', baseNoExt + '/index.mjs'];
757
+ let t = null;
758
+ for (const cand of cands) {
759
+ try {
760
+ const r = await server.transformRequest(cand);
761
+ if (r?.code) {
762
+ t = r;
763
+ break;
764
+ }
765
+ }
766
+ catch { }
767
+ if (t?.code)
768
+ break;
769
+ }
770
+ if (!t?.code) {
771
+ try {
772
+ const rid = await server.pluginContainer?.resolveId?.(local, undefined);
773
+ const ridStr = typeof rid === 'string' ? rid : rid?.id || null;
774
+ if (ridStr) {
775
+ const r2 = await server.transformRequest(ridStr);
776
+ if (r2?.code)
777
+ t = r2;
778
+ }
779
+ }
780
+ catch { }
781
+ }
782
+ targetCode = t?.code || '';
783
+ }
784
+ catch { }
785
+ }
786
+ else if (u.pathname.startsWith('/ns/rt') || u.pathname.startsWith('/ns/core')) {
787
+ // Bridges export named/default as needed; skip default check
788
+ continue;
789
+ }
790
+ }
791
+ catch { }
792
+ if (!targetCode)
793
+ continue;
794
+ const hasDefault = /\bexport\s+default\b/.test(targetCode) || /export\s*\{\s*default\s*(?:as\s*default)?\s*\}/.test(targetCode);
795
+ if (!hasDefault) {
796
+ // CJS/UMD modules won't have `export default` — they get CJS-wrapped
797
+ // by the serving pipeline. Only warn, don't fatally block the importer.
798
+ const hasCjsPattern = /\bmodule\s*\.\s*exports\b/.test(targetCode) || /\bexports\s*\.\s*\w/.test(targetCode);
799
+ if (hasCjsPattern) {
800
+ if (verbose) {
801
+ console.warn(`[ns:m][link-check] CJS module without export default: ${u.pathname} (will be CJS-wrapped at serve time)`);
802
+ }
803
+ continue;
804
+ }
805
+ const msg = `[link-check] Missing default export in ${u.pathname}${u.search} (imported by ${resolvedCandidate || spec})`;
806
+ // Emit a module that throws to surface the exact offender
807
+ res.statusCode = 200;
808
+ res.end(`throw new Error(${JSON.stringify(msg)});\nexport {};`);
809
+ return;
810
+ }
811
+ }
812
+ }
813
+ }
814
+ }
815
+ catch (eLC) {
816
+ if (verbose) {
817
+ console.warn('[ns:m][link-check] failed', eLC?.message || eLC);
818
+ }
819
+ }
820
+ // Only fully successful serves are memoized — every early-return
821
+ // above (link-check throw module, 404 stubs, 500s) stays uncached.
822
+ if (memoKey) {
823
+ responseMemo.set(memoKey, code);
824
+ }
825
+ res.statusCode = 200;
826
+ res.end(code);
827
+ }
828
+ catch (e) {
829
+ console.warn('[sfc-asm] error serving', req.url, e && e.message ? e.message : e);
830
+ res.statusCode = 500;
831
+ res.end('export {}\n');
832
+ }
833
+ });
834
+ }
835
+ //# sourceMappingURL=websocket-ns-m.js.map