@nativescript/vite 8.0.0-alpha.9 → 8.0.0-dev.0

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 +89 -14
  2. package/bin/cli.cjs +8 -14
  3. package/configuration/angular.d.ts +34 -1
  4. package/configuration/angular.js +196 -217
  5. package/configuration/angular.js.map +1 -1
  6. package/configuration/base.js +152 -104
  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 +11 -92
  15. package/configuration/typescript.js.map +1 -1
  16. package/framework.d.ts +22 -0
  17. package/framework.js +18 -0
  18. package/framework.js.map +1 -0
  19. package/helpers/app-components.d.ts +2 -1
  20. package/helpers/app-components.js.map +1 -1
  21. package/helpers/app-css-refresh.d.ts +31 -0
  22. package/helpers/app-css-refresh.js +43 -0
  23. package/helpers/app-css-refresh.js.map +1 -0
  24. package/helpers/app-css-state.d.ts +17 -0
  25. package/helpers/app-css-state.js +51 -0
  26. package/helpers/app-css-state.js.map +1 -0
  27. package/helpers/bundler-context.d.ts +11 -0
  28. package/helpers/bundler-context.js +71 -0
  29. package/helpers/bundler-context.js.map +1 -0
  30. package/helpers/cli-flags.d.ts +12 -0
  31. package/helpers/cli-flags.js +34 -0
  32. package/helpers/cli-flags.js.map +1 -1
  33. package/helpers/css-platform-plugin.d.ts +14 -0
  34. package/helpers/css-platform-plugin.js +43 -25
  35. package/helpers/css-platform-plugin.js.map +1 -1
  36. package/helpers/dev-host.d.ts +360 -0
  37. package/helpers/dev-host.js +694 -0
  38. package/helpers/dev-host.js.map +1 -0
  39. package/helpers/dynamic-import-plugin.d.ts +2 -1
  40. package/helpers/dynamic-import-plugin.js +59 -53
  41. package/helpers/dynamic-import-plugin.js.map +1 -1
  42. package/helpers/esbuild-platform-resolver.js +4 -1
  43. package/helpers/esbuild-platform-resolver.js.map +1 -1
  44. package/helpers/external-configs.d.ts +10 -12
  45. package/helpers/external-configs.js +58 -35
  46. package/helpers/external-configs.js.map +1 -1
  47. package/helpers/flavor.d.ts +31 -0
  48. package/helpers/flavor.js +53 -2
  49. package/helpers/flavor.js.map +1 -1
  50. package/helpers/global-defines.d.ts +100 -33
  51. package/helpers/global-defines.js +192 -66
  52. package/helpers/global-defines.js.map +1 -1
  53. package/helpers/hmr-scope.d.ts +26 -0
  54. package/helpers/hmr-scope.js +67 -0
  55. package/helpers/hmr-scope.js.map +1 -0
  56. package/helpers/init.js +24 -26
  57. package/helpers/init.js.map +1 -1
  58. package/helpers/logging.d.ts +11 -1
  59. package/helpers/logging.js +45 -2
  60. package/helpers/logging.js.map +1 -1
  61. package/helpers/main-entry.d.ts +4 -1
  62. package/helpers/main-entry.js +293 -40
  63. package/helpers/main-entry.js.map +1 -1
  64. package/helpers/nativeclass-esbuild-plugin.d.ts +2 -1
  65. package/helpers/nativeclass-esbuild-plugin.js +6 -1
  66. package/helpers/nativeclass-esbuild-plugin.js.map +1 -1
  67. package/helpers/nativeclass-transform.d.ts +13 -0
  68. package/helpers/nativeclass-transform.js +37 -7
  69. package/helpers/nativeclass-transform.js.map +1 -1
  70. package/helpers/nativeclass-transformer-plugin.js +8 -3
  71. package/helpers/nativeclass-transformer-plugin.js.map +1 -1
  72. package/helpers/nativescript-package-resolver.js +10 -62
  73. package/helpers/nativescript-package-resolver.js.map +1 -1
  74. package/helpers/normalize-id.d.ts +42 -0
  75. package/helpers/normalize-id.js +60 -0
  76. package/helpers/normalize-id.js.map +1 -0
  77. package/helpers/ns-core-external-urls.d.ts +32 -0
  78. package/helpers/ns-core-external-urls.js +107 -0
  79. package/helpers/ns-core-external-urls.js.map +1 -0
  80. package/helpers/ns-core-url.d.ts +26 -3
  81. package/helpers/ns-core-url.js +66 -8
  82. package/helpers/ns-core-url.js.map +1 -1
  83. package/helpers/optimize-deps.d.ts +16 -0
  84. package/helpers/optimize-deps.js +17 -0
  85. package/helpers/optimize-deps.js.map +1 -0
  86. package/helpers/package-platform-aliases.js +34 -49
  87. package/helpers/package-platform-aliases.js.map +1 -1
  88. package/helpers/platform-types.d.ts +2 -0
  89. package/helpers/platform-types.js +2 -0
  90. package/helpers/platform-types.js.map +1 -0
  91. package/helpers/postcss-platform-config.d.ts +17 -1
  92. package/helpers/postcss-platform-config.js +20 -37
  93. package/helpers/postcss-platform-config.js.map +1 -1
  94. package/helpers/resolve-main-field-platform.d.ts +20 -0
  95. package/helpers/resolve-main-field-platform.js +49 -0
  96. package/helpers/resolve-main-field-platform.js.map +1 -0
  97. package/helpers/resolver.js +17 -2
  98. package/helpers/resolver.js.map +1 -1
  99. package/helpers/theme-core-plugins.js +1 -1
  100. package/helpers/theme-core-plugins.js.map +1 -1
  101. package/helpers/ts-config-paths.d.ts +32 -0
  102. package/helpers/ts-config-paths.js +143 -62
  103. package/helpers/ts-config-paths.js.map +1 -1
  104. package/helpers/typescript-check.d.ts +3 -3
  105. package/helpers/typescript-check.js +4 -4
  106. package/helpers/typescript-check.js.map +1 -1
  107. package/helpers/ui-registration.d.ts +21 -0
  108. package/helpers/ui-registration.js +156 -0
  109. package/helpers/ui-registration.js.map +1 -0
  110. package/helpers/utils.d.ts +9 -0
  111. package/helpers/utils.js +22 -2
  112. package/helpers/utils.js.map +1 -1
  113. package/helpers/vite-package-version.d.ts +7 -0
  114. package/helpers/vite-package-version.js +44 -0
  115. package/helpers/vite-package-version.js.map +1 -0
  116. package/helpers/workers.d.ts +33 -0
  117. package/helpers/workers.js +237 -10
  118. package/helpers/workers.js.map +1 -1
  119. package/hmr/client/css-handler.d.ts +2 -1
  120. package/hmr/client/css-handler.js +63 -32
  121. package/hmr/client/css-handler.js.map +1 -1
  122. package/hmr/client/css-update-overlay.d.ts +18 -0
  123. package/hmr/client/css-update-overlay.js +27 -0
  124. package/hmr/client/css-update-overlay.js.map +1 -0
  125. package/hmr/client/framework-client-strategy.d.ts +117 -0
  126. package/hmr/client/framework-client-strategy.js +18 -0
  127. package/hmr/client/framework-client-strategy.js.map +1 -0
  128. package/hmr/client/framework.d.ts +31 -0
  129. package/hmr/client/framework.js +17 -0
  130. package/hmr/client/framework.js.map +1 -0
  131. package/hmr/client/hmr-pending-overlay.d.ts +0 -14
  132. package/hmr/client/hmr-pending-overlay.js +2 -11
  133. package/hmr/client/hmr-pending-overlay.js.map +1 -1
  134. package/hmr/client/hot-context.d.ts +89 -0
  135. package/hmr/client/hot-context.js +404 -0
  136. package/hmr/client/hot-context.js.map +1 -0
  137. package/hmr/client/index.d.ts +9 -1
  138. package/hmr/client/index.js +70 -1970
  139. package/hmr/client/index.js.map +1 -1
  140. package/hmr/client/overlay-driver.d.ts +10 -0
  141. package/hmr/client/overlay-driver.js +33 -0
  142. package/hmr/client/overlay-driver.js.map +1 -0
  143. package/hmr/client/protocol-dispatch.d.ts +8 -0
  144. package/hmr/client/protocol-dispatch.js +308 -0
  145. package/hmr/client/protocol-dispatch.js.map +1 -0
  146. package/hmr/client/root-reset.d.ts +15 -0
  147. package/hmr/client/root-reset.js +358 -0
  148. package/hmr/client/root-reset.js.map +1 -0
  149. package/hmr/client/strategy-loader.d.ts +24 -0
  150. package/hmr/client/strategy-loader.js +136 -0
  151. package/hmr/client/strategy-loader.js.map +1 -0
  152. package/hmr/client/update-pipeline.d.ts +27 -0
  153. package/hmr/client/update-pipeline.js +489 -0
  154. package/hmr/client/update-pipeline.js.map +1 -0
  155. package/hmr/client/utils.d.ts +9 -1
  156. package/hmr/client/utils.js +117 -97
  157. package/hmr/client/utils.js.map +1 -1
  158. package/hmr/client/ws-transport.d.ts +21 -0
  159. package/hmr/client/ws-transport.js +323 -0
  160. package/hmr/client/ws-transport.js.map +1 -0
  161. package/hmr/entry-runtime.d.ts +2 -1
  162. package/hmr/entry-runtime.js +279 -44
  163. package/hmr/entry-runtime.js.map +1 -1
  164. package/hmr/framework-flavors.d.ts +59 -0
  165. package/hmr/framework-flavors.js +108 -0
  166. package/hmr/framework-flavors.js.map +1 -0
  167. package/hmr/frameworks/angular/build/angular-linker.d.ts +12 -0
  168. package/hmr/frameworks/angular/build/angular-linker.js +113 -0
  169. package/hmr/frameworks/angular/build/angular-linker.js.map +1 -0
  170. package/{helpers/angular → hmr/frameworks/angular/build}/inject-component-hmr-registration.js +2 -70
  171. package/hmr/frameworks/angular/build/inject-component-hmr-registration.js.map +1 -0
  172. package/hmr/frameworks/angular/build/inject-hmr-vite-ignore.d.ts +75 -0
  173. package/hmr/frameworks/angular/build/inject-hmr-vite-ignore.js +221 -0
  174. package/hmr/frameworks/angular/build/inject-hmr-vite-ignore.js.map +1 -0
  175. package/{helpers/angular → hmr/frameworks/angular/build}/inline-decorator-component-templates.js +1 -170
  176. package/hmr/frameworks/angular/build/inline-decorator-component-templates.js.map +1 -0
  177. package/hmr/frameworks/angular/build/js-lexer.d.ts +4 -0
  178. package/{helpers/angular/synthesize-decorator-ctor-parameters.js → hmr/frameworks/angular/build/js-lexer.js} +22 -96
  179. package/hmr/frameworks/angular/build/js-lexer.js.map +1 -0
  180. package/hmr/frameworks/angular/build/linker-stats.d.ts +18 -0
  181. package/hmr/frameworks/angular/build/linker-stats.js +29 -0
  182. package/hmr/frameworks/angular/build/linker-stats.js.map +1 -0
  183. package/hmr/frameworks/angular/build/shared-linker.d.ts +39 -0
  184. package/hmr/frameworks/angular/build/shared-linker.js +128 -0
  185. package/hmr/frameworks/angular/build/shared-linker.js.map +1 -0
  186. package/hmr/frameworks/angular/build/synthesize-decorator-ctor-parameters.js +88 -0
  187. package/hmr/frameworks/angular/build/synthesize-decorator-ctor-parameters.js.map +1 -0
  188. package/{helpers/angular → hmr/frameworks/angular/build}/synthesize-injectable-factories.js +1 -174
  189. package/hmr/frameworks/angular/build/synthesize-injectable-factories.js.map +1 -0
  190. package/hmr/frameworks/angular/build/ts-fallback-transform.d.ts +5 -0
  191. package/hmr/frameworks/angular/build/ts-fallback-transform.js +138 -0
  192. package/hmr/frameworks/angular/build/ts-fallback-transform.js.map +1 -0
  193. package/hmr/frameworks/angular/build/util.js.map +1 -0
  194. package/hmr/frameworks/angular/build/worker-url-preserve.d.ts +5 -0
  195. package/hmr/frameworks/angular/build/worker-url-preserve.js +140 -0
  196. package/hmr/frameworks/angular/build/worker-url-preserve.js.map +1 -0
  197. package/hmr/frameworks/angular/client/index.d.ts +0 -1
  198. package/hmr/frameworks/angular/client/index.js +360 -194
  199. package/hmr/frameworks/angular/client/index.js.map +1 -1
  200. package/hmr/frameworks/angular/client/strategy.d.ts +9 -0
  201. package/hmr/frameworks/angular/client/strategy.js +19 -0
  202. package/hmr/frameworks/angular/client/strategy.js.map +1 -0
  203. package/hmr/frameworks/angular/server/angular-root-component.d.ts +79 -0
  204. package/hmr/frameworks/angular/server/angular-root-component.js +149 -0
  205. package/hmr/frameworks/angular/server/angular-root-component.js.map +1 -0
  206. package/hmr/frameworks/angular/server/ng-component-route.d.ts +43 -0
  207. package/hmr/frameworks/angular/server/ng-component-route.js +113 -0
  208. package/hmr/frameworks/angular/server/ng-component-route.js.map +1 -0
  209. package/hmr/frameworks/angular/server/strategy.js +668 -13
  210. package/hmr/frameworks/angular/server/strategy.js.map +1 -1
  211. package/hmr/{server → frameworks/angular/server}/websocket-angular-entry.js +2 -2
  212. package/hmr/frameworks/angular/server/websocket-angular-entry.js.map +1 -0
  213. package/hmr/{server → frameworks/angular/server}/websocket-angular-hot-update.d.ts +27 -11
  214. package/hmr/{server → frameworks/angular/server}/websocket-angular-hot-update.js +179 -107
  215. package/hmr/frameworks/angular/server/websocket-angular-hot-update.js.map +1 -0
  216. package/hmr/frameworks/react/client/strategy.d.ts +12 -0
  217. package/hmr/frameworks/react/client/strategy.js +27 -0
  218. package/hmr/frameworks/react/client/strategy.js.map +1 -0
  219. package/hmr/frameworks/react/server/strategy.d.ts +2 -0
  220. package/hmr/frameworks/react/server/strategy.js +230 -0
  221. package/hmr/frameworks/react/server/strategy.js.map +1 -0
  222. package/hmr/frameworks/solid/build/solid-jsx-deps.d.ts +15 -0
  223. package/hmr/frameworks/solid/build/solid-jsx-deps.js +178 -0
  224. package/hmr/frameworks/solid/build/solid-jsx-deps.js.map +1 -0
  225. package/hmr/frameworks/solid/client/app-runtime.d.ts +68 -0
  226. package/hmr/frameworks/solid/client/app-runtime.js +252 -0
  227. package/hmr/frameworks/solid/client/app-runtime.js.map +1 -0
  228. package/hmr/frameworks/solid/client/strategy.d.ts +7 -0
  229. package/hmr/frameworks/solid/client/strategy.js +391 -0
  230. package/hmr/frameworks/solid/client/strategy.js.map +1 -0
  231. package/hmr/frameworks/solid/server/strategy.js +293 -16
  232. package/hmr/frameworks/solid/server/strategy.js.map +1 -1
  233. package/hmr/frameworks/typescript/client/strategy.d.ts +7 -0
  234. package/hmr/frameworks/typescript/client/strategy.js +418 -0
  235. package/hmr/frameworks/typescript/client/strategy.js.map +1 -0
  236. package/hmr/frameworks/typescript/server/strategy.js +40 -14
  237. package/hmr/frameworks/typescript/server/strategy.js.map +1 -1
  238. package/hmr/frameworks/vue/client/dep-propagation.d.ts +44 -0
  239. package/hmr/frameworks/vue/client/dep-propagation.js +148 -0
  240. package/hmr/frameworks/vue/client/dep-propagation.js.map +1 -0
  241. package/hmr/frameworks/vue/client/index.d.ts +10 -1
  242. package/hmr/frameworks/vue/client/index.js +270 -521
  243. package/hmr/frameworks/vue/client/index.js.map +1 -1
  244. package/hmr/frameworks/vue/client/navigate-app.d.ts +3 -0
  245. package/hmr/frameworks/vue/client/navigate-app.js +178 -0
  246. package/hmr/frameworks/vue/client/navigate-app.js.map +1 -0
  247. package/hmr/frameworks/vue/client/strategy.d.ts +33 -0
  248. package/hmr/frameworks/vue/client/strategy.js +152 -0
  249. package/hmr/frameworks/vue/client/strategy.js.map +1 -0
  250. package/hmr/frameworks/vue/client/vue-sfc-update-overlay.d.ts +49 -0
  251. package/hmr/frameworks/vue/client/vue-sfc-update-overlay.js +124 -0
  252. package/hmr/frameworks/vue/client/vue-sfc-update-overlay.js.map +1 -0
  253. package/hmr/frameworks/vue/server/compiler.d.ts +3 -1
  254. package/hmr/frameworks/vue/server/compiler.js +3 -1
  255. package/hmr/frameworks/vue/server/compiler.js.map +1 -1
  256. package/hmr/frameworks/vue/server/sfc-route-assemble.d.ts +7 -0
  257. package/hmr/frameworks/vue/server/sfc-route-assemble.js +823 -0
  258. package/hmr/frameworks/vue/server/sfc-route-assemble.js.map +1 -0
  259. package/hmr/frameworks/vue/server/sfc-route-meta.d.ts +7 -0
  260. package/hmr/frameworks/vue/server/sfc-route-meta.js +80 -0
  261. package/hmr/frameworks/vue/server/sfc-route-meta.js.map +1 -0
  262. package/hmr/frameworks/vue/server/sfc-route-serve.d.ts +8 -0
  263. package/hmr/frameworks/vue/server/sfc-route-serve.js +462 -0
  264. package/hmr/frameworks/vue/server/sfc-route-serve.js.map +1 -0
  265. package/hmr/frameworks/vue/server/sfc-route-shared.d.ts +45 -0
  266. package/hmr/frameworks/vue/server/sfc-route-shared.js +105 -0
  267. package/hmr/frameworks/vue/server/sfc-route-shared.js.map +1 -0
  268. package/hmr/frameworks/vue/server/strategy.d.ts +35 -0
  269. package/hmr/frameworks/vue/server/strategy.js +291 -7
  270. package/hmr/frameworks/vue/server/strategy.js.map +1 -1
  271. package/hmr/frameworks/vue/server/websocket-sfc.d.ts +15 -0
  272. package/hmr/frameworks/vue/server/websocket-sfc.js +20 -0
  273. package/hmr/frameworks/vue/server/websocket-sfc.js.map +1 -0
  274. package/hmr/helpers/ast-normalizer.d.ts +3 -1
  275. package/hmr/helpers/ast-normalizer.js +109 -14
  276. package/hmr/helpers/ast-normalizer.js.map +1 -1
  277. package/hmr/helpers/package-exports.d.ts +16 -0
  278. package/hmr/helpers/package-exports.js +396 -0
  279. package/hmr/helpers/package-exports.js.map +1 -0
  280. package/hmr/helpers/vendor-rewrite.d.ts +1 -1
  281. package/hmr/helpers/vendor-rewrite.js +5 -3
  282. package/hmr/helpers/vendor-rewrite.js.map +1 -1
  283. package/hmr/server/boot-recording.d.ts +51 -0
  284. package/hmr/server/boot-recording.js +214 -0
  285. package/hmr/server/boot-recording.js.map +1 -0
  286. package/hmr/server/constants.js +7 -1
  287. package/hmr/server/constants.js.map +1 -1
  288. package/hmr/server/content-css-update.d.ts +54 -0
  289. package/hmr/server/content-css-update.js +78 -0
  290. package/hmr/server/content-css-update.js.map +1 -0
  291. package/hmr/server/core-bundle.d.ts +140 -0
  292. package/hmr/server/core-bundle.js +614 -0
  293. package/hmr/server/core-bundle.js.map +1 -0
  294. package/hmr/server/core-sanitize.d.ts +86 -7
  295. package/hmr/server/core-sanitize.js +155 -37
  296. package/hmr/server/core-sanitize.js.map +1 -1
  297. package/hmr/server/css-connect-sync.d.ts +28 -0
  298. package/hmr/server/css-connect-sync.js +59 -0
  299. package/hmr/server/css-connect-sync.js.map +1 -0
  300. package/hmr/server/css-device-module.d.ts +28 -0
  301. package/hmr/server/css-device-module.js +44 -0
  302. package/hmr/server/css-device-module.js.map +1 -0
  303. package/hmr/server/css-update-message.d.ts +23 -0
  304. package/hmr/server/css-update-message.js +41 -0
  305. package/hmr/server/css-update-message.js.map +1 -0
  306. package/hmr/server/deps-bundle.d.ts +233 -0
  307. package/hmr/server/deps-bundle.js +1022 -0
  308. package/hmr/server/deps-bundle.js.map +1 -0
  309. package/hmr/server/device-transform-helpers.d.ts +24 -0
  310. package/hmr/server/device-transform-helpers.js +408 -0
  311. package/hmr/server/device-transform-helpers.js.map +1 -0
  312. package/hmr/server/framework-strategy.d.ts +182 -11
  313. package/hmr/server/hmr-module-graph.d.ts +37 -0
  314. package/hmr/server/hmr-module-graph.js +215 -0
  315. package/hmr/server/hmr-module-graph.js.map +1 -0
  316. package/hmr/server/import-map.d.ts +57 -23
  317. package/hmr/server/import-map.js +142 -70
  318. package/hmr/server/import-map.js.map +1 -1
  319. package/hmr/server/index.js +7 -16
  320. package/hmr/server/index.js.map +1 -1
  321. package/hmr/server/node-builtins-route.d.ts +12 -0
  322. package/hmr/server/node-builtins-route.js +86 -0
  323. package/hmr/server/node-builtins-route.js.map +1 -0
  324. package/hmr/server/ns-m-response-memo.d.ts +10 -0
  325. package/hmr/server/ns-m-response-memo.js +33 -0
  326. package/hmr/server/ns-m-response-memo.js.map +1 -0
  327. package/hmr/server/ns-rt-bridge.d.ts +51 -0
  328. package/hmr/server/ns-rt-bridge.js +131 -0
  329. package/hmr/server/ns-rt-bridge.js.map +1 -0
  330. package/hmr/server/ns-rt-route.d.ts +5 -0
  331. package/hmr/server/ns-rt-route.js +39 -0
  332. package/hmr/server/ns-rt-route.js.map +1 -0
  333. package/hmr/server/perf-instrumentation.d.ts +1 -1
  334. package/hmr/server/perf-instrumentation.js +3 -1
  335. package/hmr/server/perf-instrumentation.js.map +1 -1
  336. package/hmr/server/process-code-for-device.d.ts +54 -0
  337. package/hmr/server/process-code-for-device.js +832 -0
  338. package/hmr/server/process-code-for-device.js.map +1 -0
  339. package/hmr/server/require-guard.d.ts +1 -0
  340. package/hmr/server/require-guard.js +12 -0
  341. package/hmr/server/require-guard.js.map +1 -0
  342. package/hmr/server/rewrite-imports.d.ts +2 -0
  343. package/hmr/server/rewrite-imports.js +631 -0
  344. package/hmr/server/rewrite-imports.js.map +1 -0
  345. package/hmr/server/route-helpers.d.ts +7 -0
  346. package/hmr/server/route-helpers.js +13 -0
  347. package/hmr/server/route-helpers.js.map +1 -0
  348. package/hmr/server/runtime-graph-filter.js +8 -1
  349. package/hmr/server/runtime-graph-filter.js.map +1 -1
  350. package/hmr/server/server-origin.d.ts +2 -0
  351. package/hmr/server/server-origin.js +88 -0
  352. package/hmr/server/server-origin.js.map +1 -0
  353. package/hmr/server/shared-transform-request.js +1 -2
  354. package/hmr/server/shared-transform-request.js.map +1 -1
  355. package/hmr/server/socket-utils.d.ts +10 -0
  356. package/hmr/server/socket-utils.js +14 -0
  357. package/hmr/server/socket-utils.js.map +1 -0
  358. package/hmr/server/transform-cache-invalidation.d.ts +37 -0
  359. package/hmr/server/transform-cache-invalidation.js +156 -0
  360. package/hmr/server/transform-cache-invalidation.js.map +1 -0
  361. package/hmr/server/vendor-bare-module-shims.d.ts +4 -0
  362. package/hmr/server/vendor-bare-module-shims.js +80 -0
  363. package/hmr/server/vendor-bare-module-shims.js.map +1 -0
  364. package/hmr/server/vite-plugin.d.ts +1 -0
  365. package/hmr/server/vite-plugin.js +211 -53
  366. package/hmr/server/vite-plugin.js.map +1 -1
  367. package/hmr/server/websocket-core-bridge.d.ts +51 -4
  368. package/hmr/server/websocket-core-bridge.js +62 -49
  369. package/hmr/server/websocket-core-bridge.js.map +1 -1
  370. package/hmr/server/websocket-device-transform.d.ts +3 -0
  371. package/hmr/server/websocket-device-transform.js +7 -0
  372. package/hmr/server/websocket-device-transform.js.map +1 -0
  373. package/hmr/server/websocket-hmr-pending.d.ts +2 -16
  374. package/hmr/server/websocket-hmr-pending.js +0 -22
  375. package/hmr/server/websocket-hmr-pending.js.map +1 -1
  376. package/hmr/server/websocket-hot-update.d.ts +80 -0
  377. package/hmr/server/websocket-hot-update.js +299 -0
  378. package/hmr/server/websocket-hot-update.js.map +1 -0
  379. package/hmr/server/websocket-import-map-route.d.ts +15 -0
  380. package/hmr/server/websocket-import-map-route.js +51 -0
  381. package/hmr/server/websocket-import-map-route.js.map +1 -0
  382. package/hmr/server/websocket-module-bindings.d.ts +15 -0
  383. package/hmr/server/websocket-module-bindings.js +36 -3
  384. package/hmr/server/websocket-module-bindings.js.map +1 -1
  385. package/hmr/server/websocket-module-specifiers.d.ts +2 -5
  386. package/hmr/server/websocket-module-specifiers.js +42 -30
  387. package/hmr/server/websocket-module-specifiers.js.map +1 -1
  388. package/hmr/server/websocket-ns-core.d.ts +34 -0
  389. package/hmr/server/websocket-ns-core.js +414 -0
  390. package/hmr/server/websocket-ns-core.js.map +1 -0
  391. package/hmr/server/websocket-ns-entry.d.ts +21 -0
  392. package/hmr/server/websocket-ns-entry.js +163 -0
  393. package/hmr/server/websocket-ns-entry.js.map +1 -0
  394. package/hmr/server/websocket-ns-m-paths.d.ts +19 -3
  395. package/hmr/server/websocket-ns-m-paths.js +98 -75
  396. package/hmr/server/websocket-ns-m-paths.js.map +1 -1
  397. package/hmr/server/websocket-ns-m-request.d.ts +2 -1
  398. package/hmr/server/websocket-ns-m-request.js +3 -2
  399. package/hmr/server/websocket-ns-m-request.js.map +1 -1
  400. package/hmr/server/websocket-ns-m.d.ts +52 -0
  401. package/hmr/server/websocket-ns-m.js +592 -0
  402. package/hmr/server/websocket-ns-m.js.map +1 -0
  403. package/hmr/server/websocket-served-module-helpers.d.ts +65 -3
  404. package/hmr/server/websocket-served-module-helpers.js +457 -140
  405. package/hmr/server/websocket-served-module-helpers.js.map +1 -1
  406. package/hmr/server/websocket-txn.js +6 -9
  407. package/hmr/server/websocket-txn.js.map +1 -1
  408. package/hmr/server/websocket-vendor-unifier.d.ts +0 -1
  409. package/hmr/server/websocket-vendor-unifier.js +4 -9
  410. package/hmr/server/websocket-vendor-unifier.js.map +1 -1
  411. package/hmr/server/websocket.d.ts +6 -40
  412. package/hmr/server/websocket.js +661 -6751
  413. package/hmr/server/websocket.js.map +1 -1
  414. package/hmr/shared/ns-globals.d.ts +108 -0
  415. package/hmr/shared/ns-globals.js +29 -0
  416. package/hmr/shared/ns-globals.js.map +1 -0
  417. package/hmr/shared/protocol.d.ts +157 -0
  418. package/hmr/shared/protocol.js +28 -0
  419. package/hmr/shared/protocol.js.map +1 -0
  420. package/hmr/shared/runtime/boot-complete.d.ts +14 -0
  421. package/hmr/shared/runtime/boot-complete.js +32 -0
  422. package/hmr/shared/runtime/boot-complete.js.map +1 -0
  423. package/hmr/shared/runtime/boot-placeholder-ui.d.ts +69 -0
  424. package/hmr/shared/runtime/boot-placeholder-ui.js +101 -0
  425. package/hmr/shared/runtime/boot-placeholder-ui.js.map +1 -0
  426. package/hmr/shared/runtime/boot-progress.d.ts +44 -0
  427. package/hmr/shared/runtime/boot-progress.js +134 -0
  428. package/hmr/shared/runtime/boot-progress.js.map +1 -0
  429. package/hmr/shared/runtime/boot-timeline.d.ts +1 -1
  430. package/hmr/shared/runtime/boot-timeline.js +8 -19
  431. package/hmr/shared/runtime/boot-timeline.js.map +1 -1
  432. package/hmr/shared/runtime/browser-runtime-contract.d.ts +58 -25
  433. package/hmr/shared/runtime/browser-runtime-contract.js +21 -9
  434. package/hmr/shared/runtime/browser-runtime-contract.js.map +1 -1
  435. package/hmr/shared/runtime/dev-overlay-ios.d.ts +87 -0
  436. package/hmr/shared/runtime/dev-overlay-ios.js +521 -0
  437. package/hmr/shared/runtime/dev-overlay-ios.js.map +1 -0
  438. package/hmr/shared/runtime/dev-overlay-shared.d.ts +58 -0
  439. package/hmr/shared/runtime/dev-overlay-shared.js +116 -0
  440. package/hmr/shared/runtime/dev-overlay-shared.js.map +1 -0
  441. package/hmr/shared/runtime/dev-overlay-snapshots.d.ts +31 -0
  442. package/hmr/shared/runtime/dev-overlay-snapshots.js +324 -0
  443. package/hmr/shared/runtime/dev-overlay-snapshots.js.map +1 -0
  444. package/hmr/shared/runtime/dev-overlay-tree.d.ts +59 -0
  445. package/hmr/shared/runtime/dev-overlay-tree.js +712 -0
  446. package/hmr/shared/runtime/dev-overlay-tree.js.map +1 -0
  447. package/hmr/shared/runtime/dev-overlay.d.ts +23 -69
  448. package/hmr/shared/runtime/dev-overlay.js +67 -1011
  449. package/hmr/shared/runtime/dev-overlay.js.map +1 -1
  450. package/hmr/shared/runtime/global-scope.d.ts +18 -0
  451. package/hmr/shared/runtime/global-scope.js +21 -0
  452. package/hmr/shared/runtime/global-scope.js.map +1 -0
  453. package/hmr/shared/runtime/hooks.js +2 -1
  454. package/hmr/shared/runtime/hooks.js.map +1 -1
  455. package/hmr/shared/runtime/launch-bridge.d.ts +9 -0
  456. package/hmr/shared/runtime/launch-bridge.js +98 -0
  457. package/hmr/shared/runtime/launch-bridge.js.map +1 -0
  458. package/hmr/shared/runtime/module-provenance.js +3 -2
  459. package/hmr/shared/runtime/module-provenance.js.map +1 -1
  460. package/hmr/shared/runtime/ns-runtime-test-double.d.ts +21 -0
  461. package/hmr/shared/runtime/ns-runtime-test-double.js +20 -0
  462. package/hmr/shared/runtime/ns-runtime-test-double.js.map +1 -0
  463. package/hmr/shared/runtime/overlay-flag.d.ts +9 -0
  464. package/hmr/shared/runtime/overlay-flag.js +34 -0
  465. package/hmr/shared/runtime/overlay-flag.js.map +1 -0
  466. package/hmr/shared/runtime/root-placeholder-view.d.ts +19 -0
  467. package/hmr/shared/runtime/root-placeholder-view.js +311 -0
  468. package/hmr/shared/runtime/root-placeholder-view.js.map +1 -0
  469. package/hmr/shared/runtime/root-placeholder.js +382 -157
  470. package/hmr/shared/runtime/root-placeholder.js.map +1 -1
  471. package/hmr/shared/runtime/session-bootstrap.js +209 -54
  472. package/hmr/shared/runtime/session-bootstrap.js.map +1 -1
  473. package/hmr/shared/runtime/vendor-bootstrap.js +2 -1
  474. package/hmr/shared/runtime/vendor-bootstrap.js.map +1 -1
  475. package/hmr/shared/runtime/vendor-resolve.d.ts +22 -0
  476. package/hmr/shared/runtime/vendor-resolve.js +45 -0
  477. package/hmr/shared/runtime/vendor-resolve.js.map +1 -0
  478. package/hmr/shared/runtime/worker-tracking.d.ts +28 -0
  479. package/hmr/shared/runtime/worker-tracking.js +114 -0
  480. package/hmr/shared/runtime/worker-tracking.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 +10 -35
  488. package/hmr/shared/vendor/manifest.js +154 -978
  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/package.json +70 -13
  500. package/runtime/core-aliases-early.js +11 -16
  501. package/runtime/core-aliases-early.js.map +1 -1
  502. package/shims/react-jsx-runtime.d.ts +4 -0
  503. package/shims/react-jsx-runtime.js +61 -0
  504. package/shims/react-jsx-runtime.js.map +1 -0
  505. package/helpers/angular/angular-linker.d.ts +0 -13
  506. package/helpers/angular/angular-linker.js +0 -185
  507. package/helpers/angular/angular-linker.js.map +0 -1
  508. package/helpers/angular/inject-component-hmr-registration.js.map +0 -1
  509. package/helpers/angular/inline-decorator-component-templates.js.map +0 -1
  510. package/helpers/angular/shared-linker.d.ts +0 -11
  511. package/helpers/angular/shared-linker.js +0 -75
  512. package/helpers/angular/shared-linker.js.map +0 -1
  513. package/helpers/angular/synthesize-decorator-ctor-parameters.js.map +0 -1
  514. package/helpers/angular/synthesize-injectable-factories.js.map +0 -1
  515. package/helpers/angular/util.js.map +0 -1
  516. package/helpers/module-runner-patch.d.ts +0 -3
  517. package/helpers/module-runner-patch.js +0 -63
  518. package/helpers/module-runner-patch.js.map +0 -1
  519. package/helpers/prelink-angular.d.ts +0 -2
  520. package/helpers/prelink-angular.js +0 -114
  521. package/helpers/prelink-angular.js.map +0 -1
  522. package/hmr/server/websocket-angular-entry.js.map +0 -1
  523. package/hmr/server/websocket-angular-hot-update.js.map +0 -1
  524. package/hmr/server/websocket-ns-m-finalize.d.ts +0 -22
  525. package/hmr/server/websocket-ns-m-finalize.js +0 -88
  526. package/hmr/server/websocket-ns-m-finalize.js.map +0 -1
  527. package/hmr/server/websocket-runtime-compat.d.ts +0 -19
  528. package/hmr/server/websocket-runtime-compat.js +0 -287
  529. package/hmr/server/websocket-runtime-compat.js.map +0 -1
  530. package/hmr/server/websocket-vue-sfc.d.ts +0 -27
  531. package/hmr/server/websocket-vue-sfc.js +0 -1069
  532. package/hmr/server/websocket-vue-sfc.js.map +0 -1
  533. package/hmr/shared/runtime/http-only-boot.d.ts +0 -2
  534. package/hmr/shared/runtime/http-only-boot.js +0 -171
  535. package/hmr/shared/runtime/http-only-boot.js.map +0 -1
  536. package/hmr/vendor-bootstrap.d.ts +0 -3
  537. package/hmr/vendor-bootstrap.js +0 -32
  538. package/hmr/vendor-bootstrap.js.map +0 -1
  539. package/shims/react-reconciler-constants.d.ts +0 -14
  540. package/shims/react-reconciler-constants.js +0 -21
  541. package/shims/react-reconciler-constants.js.map +0 -1
  542. package/shims/react-reconciler.d.ts +0 -8
  543. package/shims/react-reconciler.js +0 -15
  544. package/shims/react-reconciler.js.map +0 -1
  545. package/transformers/NativeClass/index.d.ts +0 -2
  546. package/transformers/NativeClass/index.js +0 -222
  547. package/transformers/NativeClass/index.js.map +0 -1
  548. /package/{helpers/angular → hmr/frameworks/angular/build}/inject-component-hmr-registration.d.ts +0 -0
  549. /package/{helpers/angular → hmr/frameworks/angular/build}/inline-decorator-component-templates.d.ts +0 -0
  550. /package/{helpers/angular → hmr/frameworks/angular/build}/synthesize-decorator-ctor-parameters.d.ts +0 -0
  551. /package/{helpers/angular → hmr/frameworks/angular/build}/synthesize-injectable-factories.d.ts +0 -0
  552. /package/{helpers/angular → hmr/frameworks/angular/build}/util.d.ts +0 -0
  553. /package/{helpers/angular → hmr/frameworks/angular/build}/util.js +0 -0
  554. /package/hmr/{server → frameworks/angular/server}/websocket-angular-entry.d.ts +0 -0
@@ -1,10 +1,99 @@
1
1
  import { parse as babelParse } from '@babel/parser';
2
2
  import * as t from '@babel/types';
3
+ import { existsSync, readFileSync } from 'fs';
4
+ import * as path from 'path';
3
5
  import * as PAT from './constants.js';
4
6
  import { isDeepCoreSubpath } from './core-sanitize.js';
5
7
  import { getCjsNamedExports } from '../helpers/cjs-named-exports.js';
6
- import { extractDirectExportedNames } from './websocket-core-bridge.js';
7
- const MODULE_IMPORT_ANALYSIS_PLUGINS = ['typescript', 'jsx', 'importMeta', 'topLevelAwait', 'classProperties', 'classPrivateProperties', 'classPrivateMethods', 'decorators-legacy'];
8
+ import { getMonorepoWorkspaceRoot } from '../../helpers/project.js';
9
+ import { extractDirectExportedNames, parseExportSpecList } from './websocket-core-bridge.js';
10
+ import { resolveCandidateFilePath } from './websocket-module-specifiers.js';
11
+ let cachedWorkspaceCoreRoot;
12
+ /**
13
+ * Absolute root of @nativescript/core when it is consumed from monorepo
14
+ * source (`<workspace>/packages/core` in the NativeScript repo) rather than
15
+ * node_modules. Returns null for standalone apps.
16
+ */
17
+ export function getWorkspaceCoreSourceRoot() {
18
+ if (cachedWorkspaceCoreRoot !== undefined)
19
+ return cachedWorkspaceCoreRoot;
20
+ cachedWorkspaceCoreRoot = null;
21
+ try {
22
+ const wsRoot = getMonorepoWorkspaceRoot();
23
+ if (wsRoot) {
24
+ const pkgPath = path.join(wsRoot, 'packages/core/package.json');
25
+ if (existsSync(pkgPath)) {
26
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
27
+ if (pkg?.name === '@nativescript/core') {
28
+ cachedWorkspaceCoreRoot = path.resolve(wsRoot, 'packages/core').replace(/\\/g, '/');
29
+ }
30
+ }
31
+ }
32
+ }
33
+ catch { }
34
+ return cachedWorkspaceCoreRoot;
35
+ }
36
+ /**
37
+ * True when a served module path points into @nativescript/core consumed from
38
+ * monorepo source. These modules are library code: the app-source HMR passes
39
+ * (AST normalization, /ns/rt underscore-helper alias injection) must NOT run
40
+ * on them — they exist for compiled app/SFC output, and on core sources they
41
+ * misread internals (e.g. `ClassInfo._getBase`) as Vue template helpers and
42
+ * inject destructures that shadow real bindings or TDZ-crash on the circular
43
+ * /ns/rt dependency. In standalone apps core lives under node_modules and is
44
+ * already excluded by the node_modules check.
45
+ */
46
+ export function isWorkspaceCoreModulePath(p) {
47
+ if (!p)
48
+ return false;
49
+ const coreRoot = getWorkspaceCoreSourceRoot();
50
+ if (!coreRoot)
51
+ return false;
52
+ const normalized = String(p).split('?')[0].replace(/\\/g, '/');
53
+ return normalized.includes(coreRoot + '/') || /(^|\/)packages\/core\//.test(normalized);
54
+ }
55
+ /**
56
+ * True when a served module path points into the @nativescript/vite package
57
+ * routed via its monorepo build output (`dist/packages/vite/...`). Apps that
58
+ * consume the package via `file:../../dist/packages/vite` get a node_modules
59
+ * SYMLINK, and require.resolve follows it to the real dist path — so the
60
+ * served URL carries no `node_modules/` segment and escapes the node_modules
61
+ * library check. Like core source, this is library code: the app-source HMR
62
+ * passes (AST normalization, /ns/rt alias injection) must not run on it —
63
+ * e.g. the HMR client bundle already carries its own `__ns_rt_ns_re` import,
64
+ * and a second injected one is a duplicate-declaration SyntaxError on device.
65
+ */
66
+ export function isWorkspaceVitePackageModulePath(p) {
67
+ if (!p)
68
+ return false;
69
+ const normalized = String(p).split('?')[0].replace(/\\/g, '/');
70
+ return /(^|\/)dist\/packages\/vite\//.test(normalized);
71
+ }
72
+ /**
73
+ * Single classification point for the /ns/m served-module pipeline. The
74
+ * app-source passes inside processCodeForDevice (AST normalization, /ns/rt
75
+ * underscore-helper alias injection) must run ONLY on 'app' modules; 'library'
76
+ * code is served as-is plus import rewriting. Three things count as library:
77
+ * - anything under node_modules
78
+ * - @nativescript/core consumed from monorepo source (packages/core)
79
+ * - the @nativescript/vite package served from its dist build output
80
+ * (file:../../dist/packages/vite symlinks resolve to the real dist path,
81
+ * so no node_modules segment appears in the URL)
82
+ * Add the next workspace-library case HERE, not at a call site.
83
+ */
84
+ export function classifyServedModule(p) {
85
+ if (!p)
86
+ return 'app';
87
+ const normalized = String(p).split('?')[0].replace(/\\/g, '/');
88
+ if (/(?:^|\/)node_modules\//.test(normalized))
89
+ return 'library';
90
+ if (isWorkspaceCoreModulePath(normalized))
91
+ return 'library';
92
+ if (isWorkspaceVitePackageModulePath(normalized))
93
+ return 'library';
94
+ return 'app';
95
+ }
96
+ export const MODULE_IMPORT_ANALYSIS_PLUGINS = ['typescript', 'jsx', 'importMeta', 'topLevelAwait', 'classProperties', 'classPrivateProperties', 'classPrivateMethods', 'decorators-legacy'];
8
97
  export function collectTopLevelImportRecords(code) {
9
98
  if (!code || typeof code !== 'string' || !/\bimport\b/.test(code)) {
10
99
  return [];
@@ -64,19 +153,63 @@ export function hoistTopLevelStaticImports(code) {
64
153
  }
65
154
  return `${hoisted.join('\n')}\n${stripped.replace(/^\s*\n+/, '')}`;
66
155
  }
156
+ // Boot-progress instrumentation snippet (server-side string-only).
157
+ //
158
+ // Injected at the top of every `__ns_boot__/b1`-tagged module the dev
159
+ // server serves during cold boot. The snippet is FULLY SYNCHRONOUS —
160
+ // even one conditional top-level `await` would mark the module async
161
+ // in V8, propagating an async-promise chain through the entire boot
162
+ // graph and tripping the iOS 10 s top-level-await deadline (see
163
+ // `ModuleInternal.mm::pumpAsyncProgress`). It just bumps the
164
+ // `__NS_HMR_BOOT_MODULE_COUNT__` / `__NS_HMR_BOOT_LAST_MODULE__`
165
+ // globals; the 250 ms heartbeat in `session-bootstrap.ts` owns
166
+ // `setBootStage` and runs `boot-progress.ts::computeBootImportProgress`
167
+ // against those counters plus elapsed wall-clock to drive the bar.
168
+ // The iOS runtime's `MaybePumpJSThreadDuringBoot` keeps the JS-thread
169
+ // CFRunLoop ticking between sync fetches so the heartbeat can fire
170
+ // during the otherwise-blocking cold-boot module walk.
171
+ //
172
+ // Regression-tested by `websocket-integrity.spec.ts` (snippet stays
173
+ // fully synchronous + propagates exactly via the boot-tag prefix).
67
174
  export function buildBootProgressSnippet(bootModuleLabel) {
68
175
  const normalizedLabel = JSON.stringify(String(bootModuleLabel || '').replace(/\\/g, '/'));
69
- return [
70
- `const __nsBootGlobal=globalThis;`,
71
- `try{if(!__nsBootGlobal.__NS_HMR_BOOT_COMPLETE__){const __nsBootApi=__nsBootGlobal.__NS_HMR_DEV_OVERLAY__;if(__nsBootApi&&typeof __nsBootApi.setBootStage==='function'){const __nsBootCount=(__nsBootGlobal.__NS_HMR_BOOT_MODULE_COUNT__=Number(__nsBootGlobal.__NS_HMR_BOOT_MODULE_COUNT__||0)+1);__nsBootGlobal.__NS_HMR_BOOT_LAST_MODULE__=${normalizedLabel};const __nsBootNow=Date.now();const __nsBootLast=Number(__nsBootGlobal.__NS_HMR_BOOT_LAST_PROGRESS_AT__||0);if(__nsBootCount<=8||__nsBootCount%6===0||__nsBootNow-__nsBootLast>90){__nsBootGlobal.__NS_HMR_BOOT_LAST_PROGRESS_AT__=__nsBootNow;const __nsBootProgress=Math.min(94,82+Math.min(10,Math.round((Math.log(__nsBootCount+1)/Math.LN2)*2)));__nsBootApi.setBootStage('importing-main',{detail:'Evaluated '+__nsBootCount+' modules\\n'+__nsBootGlobal.__NS_HMR_BOOT_LAST_MODULE__,attempt:Number(__nsBootGlobal.__NS_HMR_BOOT_MAIN_ATTEMPT__||1),attempts:Number(__nsBootGlobal.__NS_HMR_BOOT_MAIN_ATTEMPTS__||6),progress:__nsBootProgress});}}}}catch(__nsBootErr){}`,
72
- `if(!__nsBootGlobal.__NS_HMR_BOOT_COMPLETE__){const __nsBootCount=Number(__nsBootGlobal.__NS_HMR_BOOT_MODULE_COUNT__||0);if(__nsBootCount<=24||__nsBootCount%8===0){await new Promise((resolve)=>setTimeout(resolve,0));}}`,
73
- '',
74
- ].join('\n');
176
+ return [`const __nsBootGlobal=globalThis;`, `try{if(!__nsBootGlobal.__NS_HMR_BOOT_COMPLETE__){__nsBootGlobal.__NS_HMR_BOOT_MODULE_COUNT__=Number(__nsBootGlobal.__NS_HMR_BOOT_MODULE_COUNT__||0)+1;__nsBootGlobal.__NS_HMR_BOOT_LAST_MODULE__=${normalizedLabel};}}catch(__nsBootErr){}`, ''].join('\n');
177
+ }
178
+ /**
179
+ * A worker entry served under HMR evaluates in a fresh isolate where nothing
180
+ * has installed the runtime globals — `setTimeout`, `console` formatting,
181
+ * `fetch` — that the main realm's entry installs once from
182
+ * `@nativescript/core/globals`. The production worker build bundles that
183
+ * module in; the dev serve adds the import when the script does not carry it
184
+ * itself, so a worker behaves the same way on both paths.
185
+ */
186
+ export function ensureWorkerEntryGlobalsImport(code) {
187
+ if (/^\s*import\s+(?:[^'"\n]*from\s+)?["'][^"']*(?:@nativescript(?:[/_-])core(?:[/_-])globals|\/ns\/core\/globals)[^"']*["']/m.test(code))
188
+ return code;
189
+ return `import '@nativescript/core/globals';\n${code}`;
75
190
  }
76
191
  export function stripCoreGlobalsImports(code) {
77
192
  const pattern = /^\s*(?:import\s+(?:[^'"\n]*from\s+)?|export\s+\*\s+from\s+)["'][^"']*(?:@nativescript(?:[/_-])core(?:[\/_-])globals|@nativescript_core_globals)[^"']*["'];?\s*$/gm;
78
193
  return code.replace(pattern, '');
79
194
  }
195
+ // The ONE device-side implementation of Vite's variable-dynamic-import
196
+ // helper. Injected by `ensureVariableDynamicImportHelper` and by
197
+ // `stripViteDynamicImportVirtual` when it removes the `/@id/__x00__vite`
198
+ // virtual that normally provides it — both paths must emit the same shim.
199
+ const VARIABLE_DYNAMIC_IMPORT_HELPER_SOURCE = `const __variableDynamicImportRuntimeHelper = (map, request, importMode) => {\n` +
200
+ ` try { if (request === '@') { return import(new URL('/ns/m/__invalid_at__.mjs', import.meta.url).href); } } catch {}\n` +
201
+ ` const loader = map && (map[request] || map[request?.replace(/\\\\/g, "/")]);\n` +
202
+ ` if (!loader) {\n` +
203
+ ` const error = new Error("Cannot dynamically import: " + request);\n` +
204
+ ` error.code = 'ERR_MODULE_NOT_FOUND';\n` +
205
+ ` return Promise.reject(error);\n` +
206
+ ` }\n` +
207
+ ` try {\n` +
208
+ ` return loader(importMode);\n` +
209
+ ` } catch (err) {\n` +
210
+ ` return Promise.reject(err);\n` +
211
+ ` }\n` +
212
+ `};\n`;
80
213
  export function ensureVariableDynamicImportHelper(code) {
81
214
  if (!code.includes('__variableDynamicImportRuntimeHelper')) {
82
215
  return code;
@@ -84,23 +217,9 @@ export function ensureVariableDynamicImportHelper(code) {
84
217
  if (PAT.VARIABLE_DYNAMIC_IMPORT_HELPER_PATTERN.test(code)) {
85
218
  return code;
86
219
  }
87
- const helper = `const __variableDynamicImportRuntimeHelper = (map, request, importMode) => {\n` +
88
- ` try { if (request === '@') { return import(new URL('/ns/m/__invalid_at__.mjs', import.meta.url).href); } } catch {}\n` +
89
- ` const loader = map && (map[request] || map[request?.replace(/\\\\/g, "/")]);\n` +
90
- ` if (!loader) {\n` +
91
- ` const error = new Error("Cannot dynamically import: " + request);\n` +
92
- ` error.code = 'ERR_MODULE_NOT_FOUND';\n` +
93
- ` return Promise.reject(error);\n` +
94
- ` }\n` +
95
- ` try {\n` +
96
- ` return loader(importMode);\n` +
97
- ` } catch (err) {\n` +
98
- ` return Promise.reject(err);\n` +
99
- ` }\n` +
100
- `};\n`;
101
- return `${helper}${code}`;
220
+ return `${VARIABLE_DYNAMIC_IMPORT_HELPER_SOURCE}${code}`;
102
221
  }
103
- export function ensureGuardPlainDynamicImports(code, _origin) {
222
+ export function ensureGuardPlainDynamicImports(code) {
104
223
  try {
105
224
  if (!code || !/\bimport\s*\(/.test(code))
106
225
  return code;
@@ -129,7 +248,7 @@ export function ensureGuardPlainDynamicImports(code, _origin) {
129
248
  // * The runtime canonicalizes any URL shape (boot prefix, hmr prefix,
130
249
  // stable) to a single key via `CanonicalizeHttpUrlKey`.
131
250
  // * The Angular client receives an explicit eviction set in
132
- // `ns:angular-update` and calls `__nsInvalidateModules` before
251
+ // `ns:angular-update` and calls ns:module `invalidateModules` before
133
252
  // re-importing the entry, so V8 only refetches modules that
134
253
  // actually changed.
135
254
  // * The dynamic-import helper no longer needs to busy-construct
@@ -177,40 +296,207 @@ export function ensureDynamicHmrImportHelper(code) {
177
296
  return code;
178
297
  }
179
298
  }
180
- function extractExportedNames(code) {
181
- return extractDirectExportedNames(code);
299
+ /**
300
+ * Star-export expansion must be TRANSITIVE.
301
+ *
302
+ * The expansion below replaces `export * from "url"` with an explicit named
303
+ * list, so any name missing from that list is silently dropped from the
304
+ * importer's export surface — the device then fails at link time with
305
+ * "does not provide an export named '<name>'". Real packages routinely chain
306
+ * star re-exports (`index.ios.js → export * from './canvas'` →
307
+ * `canvas.ios.js → export * from './canvas.common'`), so the name set for a
308
+ * star target is the union of its direct exports, its named re-exports, and
309
+ * — recursively — every nested `export * from` chain, cycles included.
310
+ *
311
+ * This mirrors `collectStaticExportOriginsFromFile` in
312
+ * `websocket-core-bridge.ts`, which solved the identical problem for the
313
+ * /ns/core bridge (see its `Application` comment). That walker reads files
314
+ * from disk; this one works on Vite-transformed code via the shared
315
+ * transformer, because star targets here are served URLs (aliases, /@fs
316
+ * paths, platform-extension resolution already applied by Vite's resolver).
317
+ * If you change export-name semantics in one walker, check the other.
318
+ */
319
+ const STAR_EXPANSION_MAX_DEPTH = 64;
320
+ /**
321
+ * Normalize a star-export target (served URL or nested transformed
322
+ * specifier) into a root-relative path feedable to Vite's transform
323
+ * pipeline. Returns null for specifiers that cannot be walked (bare ids,
324
+ * relative specs with no parent context).
325
+ */
326
+ function normalizeStarExportTargetPath(spec, parentVitePath) {
327
+ let p = String(spec || '').trim();
328
+ if (!p)
329
+ return null;
330
+ p = p.replace(/^https?:\/\/[^/]+/, '');
331
+ p = p.replace(/[?#].*$/, '');
332
+ p = p.replace(/^\/ns\/m\//, '/');
333
+ p = p.replace(/^\/__ns_boot__\/[^/]+/, '');
334
+ p = p.replace(/\/__ns_hmr__\/[^/]+/, '');
335
+ if (p.startsWith('.')) {
336
+ // Vite's import analysis normally rewrites nested specifiers to
337
+ // root-relative URLs; resolve any relative stragglers against the
338
+ // parent module's directory.
339
+ const parent = String(parentVitePath || '')
340
+ .replace(/\\/g, '/')
341
+ .replace(/[?#].*$/, '');
342
+ if (!parent.startsWith('/'))
343
+ return null;
344
+ p = path.posix.normalize(path.posix.join(path.posix.dirname(parent), p));
345
+ }
346
+ return p.startsWith('/') ? p : null;
347
+ }
348
+ // One of three deliberately-separate export scanners; each answers a
349
+ // different question and merging them would couple unrelated contracts:
350
+ // - `extractDirectExportedNames` (websocket-core-bridge.ts): direct lexical
351
+ // exports only — the shared primitive both other scanners build on.
352
+ // - `scanModuleExportSurface` (here): direct exports PLUS re-export lists
353
+ // and `export * from` sources, because star expansion must know both what
354
+ // a module claims and where the rest comes from.
355
+ // - `extractExportMetadata` (below): does a module have a default export
356
+ // and which named ones — shape-only, for SFC route metadata.
357
+ function scanModuleExportSurface(code) {
358
+ const ownNames = new Set(extractDirectExportedNames(code));
359
+ for (const m of code.matchAll(/\bexport\s+\*\s+as\s+([A-Za-z_$][\w$]*)\s+from\s*["'][^"']+["']/g)) {
360
+ ownNames.add(m[1]);
361
+ }
362
+ for (const m of code.matchAll(/\bexport\s*\{([^}]+)\}\s*from\s*["'][^"']+["']/g)) {
363
+ for (const { exportedName } of parseExportSpecList(m[1])) {
364
+ ownNames.add(exportedName);
365
+ }
366
+ }
367
+ const starSources = [];
368
+ // Tolerate trailing comments/code on the line (see the identical fix in
369
+ // websocket-core-bridge.ts: a strict `$` anchor silently skipped
370
+ // `export * from './layouts'; // barrel export` lines).
371
+ for (const m of code.matchAll(/^[ \t]*export\s+\*\s+from\s+["']([^"']+)["'][^\n]*$/gm)) {
372
+ starSources.push(m[1]);
373
+ }
374
+ return { ownNames, starSources };
182
375
  }
183
- export async function expandStarExports(code, server, _projectRoot, verbose) {
184
- const STAR_RE = /^[ \t]*(export\s+\*\s+from\s+["'])([^"']+)(["'];?)[ \t]*$/gm;
376
+ /**
377
+ * Recursively collect the full export-name set of a star-export target,
378
+ * following nested `export * from` chains. Cycle-safe via the DFS `stack`
379
+ * set (a revisited module contributes nothing new at that point — its names
380
+ * are already being collected by the outer visit, matching spec
381
+ * GetExportedNames semantics). Returns null when the target itself cannot
382
+ * be transformed; partial failures deeper in the chain are reported through
383
+ * `diagnostics` while still returning every name that could be collected.
384
+ */
385
+ async function collectStarTargetExportNames(vitePath, transformer, stack, depth, diagnostics) {
386
+ if (stack.has(vitePath))
387
+ return new Set();
388
+ if (depth > STAR_EXPANSION_MAX_DEPTH) {
389
+ diagnostics.push(`star-export chain deeper than ${STAR_EXPANSION_MAX_DEPTH} at ${vitePath}`);
390
+ return null;
391
+ }
392
+ let targetCode;
393
+ try {
394
+ targetCode = (await transformer(vitePath))?.code ?? undefined;
395
+ }
396
+ catch { }
397
+ if (!targetCode) {
398
+ diagnostics.push(`unresolvable star-export target ${vitePath}`);
399
+ return null;
400
+ }
401
+ const surface = scanModuleExportSurface(targetCode);
402
+ const names = new Set(surface.ownNames);
403
+ stack.add(vitePath);
404
+ try {
405
+ for (const spec of surface.starSources) {
406
+ const childPath = normalizeStarExportTargetPath(spec, vitePath);
407
+ if (!childPath) {
408
+ diagnostics.push(`unwalkable nested star-export specifier ${JSON.stringify(spec)} in ${vitePath}`);
409
+ continue;
410
+ }
411
+ const childNames = await collectStarTargetExportNames(childPath, transformer, stack, depth + 1, diagnostics);
412
+ if (!childNames)
413
+ continue;
414
+ for (const n of childNames)
415
+ names.add(n);
416
+ }
417
+ }
418
+ finally {
419
+ stack.delete(vitePath);
420
+ }
421
+ // `export *` never re-exports default.
422
+ names.delete('default');
423
+ return names;
424
+ }
425
+ export async function expandStarExports(code, server, projectRoot, verbose, sharedTransformer, importerId) {
426
+ const STAR_RE = /^[ \t]*export\s+\*\s+from\s+["']([^"']+)["'];?(?=[ \t]*(?:\/\/[^\n]*)?$)/gm;
185
427
  let match;
186
428
  const replacements = [];
187
429
  while ((match = STAR_RE.exec(code)) !== null) {
188
- const url = match[2];
430
+ const url = match[1];
189
431
  if (!url.includes('/node_modules/'))
190
432
  continue;
191
- replacements.push({ full: match[0], url, prefix: match[1], suffix: match[3] });
433
+ replacements.push({ full: match[0], url });
192
434
  }
193
435
  if (!replacements.length)
194
436
  return code;
195
- for (const rep of replacements) {
196
- try {
197
- let vitePath = rep.url.replace(/^https?:\/\/[^/]+/, '');
198
- vitePath = vitePath.replace(/^\/ns\/m\//, '/');
199
- vitePath = vitePath.replace(/^\/__ns_boot__\/[^/]+/, '');
200
- vitePath = vitePath.replace(/\/__ns_hmr__\/[^/]+/, '');
201
- const result = await server.transformRequest(vitePath);
202
- if (!result?.code)
203
- continue;
204
- const names = extractExportedNames(result.code);
205
- if (!names.length)
206
- continue;
207
- const explicit = `export { ${names.join(', ')} } from ${JSON.stringify(rep.url)};`;
208
- code = code.replace(rep.full, explicit);
209
- if (verbose) {
210
- console.log(`[ns/m] expanded export* -> ${names.length} names from ${vitePath}`);
437
+ // Names already exported lexically by the importing module. Per spec,
438
+ // lexical exports shadow star-exported names — re-emitting them in an
439
+ // explicit list would be a duplicate-export SyntaxError on device.
440
+ const claimed = new Set(scanModuleExportSurface(code).ownNames);
441
+ // Resolve each star-export target in parallel through the shared runner
442
+ // (when provided) so they share the /ns/m TTL cache and concurrency gate.
443
+ const baseTransformer = sharedTransformer ?? ((url) => server.transformRequest(url));
444
+ // A bare `/node_modules/<pkg>/...` URL is NOT transformable on its own:
445
+ // Vite's bare-specifier resolver is gated by the package's
446
+ // `package.json#exports` and refuses internal sub-paths even when the file
447
+ // is on disk (e.g. `css-tree/lib/version.js`, `css-what/dist/esm/types.js`),
448
+ // and in a monorepo the package is hoisted ABOVE the app's `root` so the
449
+ // path doesn't exist relative to it at all. Either way the transform
450
+ // returns nothing and the star target is mis-reported as "unresolvable",
451
+ // silently dropping its names from the importer's export surface. Mirror the
452
+ // main /ns/m route (`filterExistingNodeModulesTransformCandidates`): resolve
453
+ // the path to a concrete file under the project or workspace root and feed
454
+ // the `/@fs/<abs>` form to Vite, which bypasses the `exports` gate. Falls
455
+ // back to the raw URL for anything that doesn't resolve to a real file.
456
+ const workspaceRoot = projectRoot ? getMonorepoWorkspaceRoot(projectRoot) : null;
457
+ const transformer = (url) => {
458
+ if (projectRoot && url.includes('/node_modules/')) {
459
+ const abs = resolveCandidateFilePath(url, projectRoot, workspaceRoot);
460
+ if (abs) {
461
+ // Posix-normalize and guarantee a leading slash so Windows drive
462
+ // letters produce the `/@fs/C:/...` form Vite expects.
463
+ const absPosix = abs.replace(/\\/g, '/');
464
+ return baseTransformer(`/@fs${absPosix.startsWith('/') ? '' : '/'}${absPosix}`);
211
465
  }
212
466
  }
213
- catch { }
467
+ return baseTransformer(url);
468
+ };
469
+ const resolved = await Promise.all(replacements.map(async (rep) => {
470
+ const diagnostics = [];
471
+ const vitePath = normalizeStarExportTargetPath(rep.url, null);
472
+ if (!vitePath) {
473
+ diagnostics.push(`unwalkable star-export URL ${rep.url}`);
474
+ return { rep, names: null, diagnostics };
475
+ }
476
+ const names = await collectStarTargetExportNames(vitePath, transformer, new Set(), 0, diagnostics);
477
+ if (verbose && names) {
478
+ console.log(`[ns/m] expanded export* -> ${names.size} names from ${vitePath}${diagnostics.length ? ' (partial)' : ''}`);
479
+ }
480
+ return { rep, names, diagnostics };
481
+ }));
482
+ for (const entry of resolved) {
483
+ if (entry.diagnostics.length) {
484
+ // Always-on: an incomplete expansion silently narrows the importer's
485
+ // export surface, which surfaces on device as a link-time
486
+ // "does not provide an export named ..." with no server-side trace.
487
+ console.warn(`[ns/m][export*] incomplete star-export expansion${importerId ? ` in ${importerId}` : ''} for ${entry.rep.url}: ${entry.diagnostics.join('; ')}`);
488
+ }
489
+ if (!entry.names)
490
+ continue;
491
+ // First star wins for names provided by multiple siblings; duplicates
492
+ // would be a SyntaxError, and spec-ambiguous names have no good answer.
493
+ const emit = Array.from(entry.names).filter((n) => !claimed.has(n));
494
+ for (const n of emit)
495
+ claimed.add(n);
496
+ // An empty list still keeps the dependency edge (side effects,
497
+ // evaluation order) via a side-effect import.
498
+ const explicit = emit.length ? `export { ${emit.join(', ')} } from ${JSON.stringify(entry.rep.url)};` : `import ${JSON.stringify(entry.rep.url)};`;
499
+ code = code.replace(entry.rep.full, explicit);
214
500
  }
215
501
  return code;
216
502
  }
@@ -233,11 +519,17 @@ export function repairImportEqualsAssignments(code) {
233
519
  catch { }
234
520
  return code;
235
521
  }
236
- export function ensureVersionedRtImports(code, origin, ver) {
237
- if (!code || !origin || !Number.isFinite(ver))
522
+ // Canonicalize `/ns/rt` imports: collapse any versioned form
523
+ // (`/ns/rt/<n>`, `/@ns/rt/<n>`) to the single unversioned `/ns/rt` URL.
524
+ // One canonical URL per bridge module — the runtime treats the literal
525
+ // URL as module identity, so emitting `/ns/rt/<ver>` would mint a new
526
+ // module realm per graph version. (The GET route still ACCEPTS the
527
+ // versioned form for stale in-flight code; see ns-rt-route.ts.)
528
+ export function canonicalizeRtImports(code, origin) {
529
+ if (!code || !origin)
238
530
  return code;
239
- code = code.replace(/(from\s+["'])(?:https?:\/\/[^"']+)?\/(?:\@ns|ns)\/rt(?:\/[\d]+)?(["'])/g, (_m, p1, p3) => `${p1}/ns/rt/${ver}${p3}`);
240
- code = code.replace(/(import\(\s*["'])(?:https?:\/\/[^"']+)?\/(?:\@ns|ns)\/rt(?:\/[\d]+)?(["']\s*\))/g, (_m, p1, p3) => `${p1}/ns/rt/${ver}${p3}`);
531
+ code = code.replace(/(from\s+["'])(?:https?:\/\/[^"']+)?\/(?:\@ns|ns)\/rt(?:\/[\d]+)?(["'])/g, (_m, p1, p3) => `${p1}/ns/rt${p3}`);
532
+ code = code.replace(/(import\(\s*["'])(?:https?:\/\/[^"']+)?\/(?:\@ns|ns)\/rt(?:\/[\d]+)?(["']\s*\))/g, (_m, p1, p3) => `${p1}/ns/rt${p3}`);
241
533
  return code;
242
534
  }
243
535
  export function stripViteDynamicImportVirtual(code) {
@@ -245,19 +537,27 @@ export function stripViteDynamicImportVirtual(code) {
245
537
  return code;
246
538
  }
247
539
  const original = code;
248
- code = code.replace(/^[\t ]*import[^\n]*\/@id\/__x00__vite\/dynamic-import-helper[^\n]*$/gm, '');
540
+ // Statement-scoped, NOT line-anchored: Vite 8 emits its injected imports
541
+ // concatenated on ONE line with the module's original first line, e.g.
542
+ // import …"/@vite/client";import …"/@id/__x00__vite/dynamic-import-helper.js";/**
543
+ // A `^…$`-anchored replace would delete the whole line — including the
544
+ // module's leading `/**`, leaving an orphaned JSDoc body that is a
545
+ // SyntaxError ("Unexpected token '*'") on device.
546
+ code = code.replace(/import\s+[^;'"\n]*['"][^'"\n]*\/@id\/__x00__vite\/dynamic-import-helper[^'"\n]*['"]\s*;?/g, '');
249
547
  if (/\/@id\/__x00__vite\/dynamic-import-helper/.test(code)) {
250
548
  code = code.replace(/\/@id\/__x00__vite\/dynamic-import-helper[^"'`)]*/g, '/__NS_UNUSED_DYNAMIC_IMPORT_HELPER__');
251
549
  }
252
550
  if (!/__variableDynamicImportRuntimeHelper/.test(code)) {
253
- const inline = `const __variableDynamicImportRuntimeHelper = (map, request, importMode) => {\n try { if (request === '@') { return import('/ns/m/__invalid_at__.mjs'); } } catch {}\n const loader = map && (map[request] || map[request?.replace(/\\\\/g, '/')]);\n if (!loader) { const e = new Error('Cannot dynamically import: ' + request); /*@ts-ignore*/ e.code = 'ERR_MODULE_NOT_FOUND'; return Promise.reject(e); }\n try { return loader(importMode); } catch (e) { return Promise.reject(e); }\n};\n`;
254
- code = inline + code;
551
+ code = VARIABLE_DYNAMIC_IMPORT_HELPER_SOURCE + code;
255
552
  }
256
553
  if (code !== original) {
257
554
  code = `// [hmr-sanitize] removed virtual dynamic-import-helper\n${code}`;
258
555
  }
259
556
  return code;
260
557
  }
558
+ // Shape-only scanner (see the scanner taxonomy above scanModuleExportSurface):
559
+ // answers "does this module export a default, and which named exports?" for
560
+ // the Vue SFC route metadata. It intentionally ignores re-export sources.
261
561
  export function extractExportMetadata(code) {
262
562
  const named = new Set();
263
563
  let hasDefault = /\bexport\s+default\b/.test(code);
@@ -289,76 +589,106 @@ export function extractExportMetadata(code) {
289
589
  named.delete('default');
290
590
  return { hasDefault, named: Array.from(named) };
291
591
  }
592
+ /**
593
+ * Defensive export normalization for route-config modules: if a served module
594
+ * defines `routes` and only exports it named, append a default-export alias so
595
+ * both `import { routes }` and `import routes` resolve. Backing implementation
596
+ * for `FrameworkServerStrategy.normalizeServedExports` (Vue/Solid/TS).
597
+ */
598
+ export function ensureRoutesDefaultExport(code) {
599
+ if (/\bexport\s+default\b/.test(code))
600
+ return code;
601
+ const hasNamedRoutes = /\bexport\s*\{\s*routes\s*\}/.test(code);
602
+ const hasConstRoutes = /\bconst\s+routes\s*=/.test(code) || /\bvar\s+routes\s*=/.test(code) || /\blet\s+routes\s*=/.test(code);
603
+ if (hasNamedRoutes && hasConstRoutes) {
604
+ return code + `\nexport default routes;\n`;
605
+ }
606
+ return code;
607
+ }
292
608
  function shouldAllowLocalCoreSanitizerPaths(contextLabel) {
293
- return /\bnode_modules\/@nativescript\/vite\/hmr\/(?:client|frameworks)\//.test(contextLabel);
609
+ // The @nativescript/vite HMR runtime (client + framework strategies)
610
+ // legitimately references local core paths in strings — allow it whether it
611
+ // is served from node_modules or from the monorepo dist output
612
+ // (`file:../../dist/packages/vite` symlinks resolve to the real dist path,
613
+ // so no node_modules segment appears in the served URL).
614
+ return /\b(?:node_modules\/@nativescript\/vite|dist\/packages\/vite)\/hmr\/(?:client|frameworks)\//.test(contextLabel);
294
615
  }
295
616
  export function assertNoOptimizedArtifacts(code, contextLabel) {
296
- try {
297
- const offenders = [];
298
- const lines = code.split('\n');
299
- const tests = [/\b__VITE_PLUGIN__\b/, /\b__VITE_PRELOAD__\b/];
300
- const localCore = /(^|[^\w@])(?:\.\.?\/|\/)??@nativescript[\/_-]core\//i;
301
- for (let i = 0; i < lines.length; i++) {
302
- const line = lines[i];
303
- for (const re of tests) {
304
- if (re.test(line)) {
305
- offenders.push(`${i + 1}: ${line.substring(0, 200)}`);
306
- break;
307
- }
308
- }
309
- if (localCore.test(line)) {
310
- const trimmed = line.trimStart();
311
- if (trimmed.startsWith('//') || trimmed.startsWith('/*') || trimmed.startsWith('*')) {
312
- continue;
313
- }
314
- if (shouldAllowLocalCoreSanitizerPaths(contextLabel)) {
315
- continue;
316
- }
317
- offenders.push(`${i + 1}: ${line.substring(0, 200)} [local-core-path]`);
318
- }
319
- if (offenders.length >= 10)
617
+ const offenders = [];
618
+ const lines = code.split('\n');
619
+ const tests = [/\b__VITE_PLUGIN__\b/, /\b__VITE_PRELOAD__\b/];
620
+ const localCore = /(^|[^\w@])(?:\.\.?\/|\/)??@nativescript[\/_-]core\//i;
621
+ for (let i = 0; i < lines.length; i++) {
622
+ const line = lines[i];
623
+ for (const re of tests) {
624
+ if (re.test(line)) {
625
+ offenders.push(`${i + 1}: ${line.substring(0, 200)}`);
320
626
  break;
627
+ }
321
628
  }
322
- if (offenders.length) {
323
- const msg = `[sanitize-fail] Optimized deps/virtual id artifacts detected in ${contextLabel}. These cannot be evaluated by the device HTTP ESM loader. Offending lines (first ${Math.min(5, offenders.length)} shown):\n` + offenders.slice(0, 5).join('\n');
324
- const error = new Error(msg);
325
- error.code = 'NS_SANITIZE_FAIL';
326
- error.offenders = offenders;
327
- throw error;
629
+ if (localCore.test(line)) {
630
+ const trimmed = line.trimStart();
631
+ if (trimmed.startsWith('//') || trimmed.startsWith('/*') || trimmed.startsWith('*')) {
632
+ continue;
633
+ }
634
+ if (shouldAllowLocalCoreSanitizerPaths(contextLabel)) {
635
+ continue;
636
+ }
637
+ // Only module-resolution contexts (import/export/require) leak to the
638
+ // device ESM loader. A core path appearing as plain runtime string data
639
+ // — e.g. component-builder's `const CORE_UI_BARREL = '@nativescript/core/ui'`
640
+ // passed to `global.loadModule()`, which reads the bundler module
641
+ // registry, not the ESM loader — is legitimate and must not fail serving.
642
+ if (!/(?:\bimport\b|\bexport\b|\bfrom\s*["']|\brequire\s*\()/.test(line)) {
643
+ continue;
644
+ }
645
+ offenders.push(`${i + 1}: ${line.substring(0, 200)} [local-core-path]`);
328
646
  }
329
- }
330
- catch (error) {
647
+ if (offenders.length >= 10)
648
+ break;
649
+ }
650
+ if (offenders.length) {
651
+ const msg = `[sanitize-fail] Optimized deps/virtual id artifacts detected in ${contextLabel}. These cannot be evaluated by the device HTTP ESM loader. Offending lines (first ${Math.min(5, offenders.length)} shown):\n` + offenders.slice(0, 5).join('\n');
652
+ const error = new Error(msg);
653
+ error.code = 'NS_SANITIZE_FAIL';
654
+ error.offenders = offenders;
331
655
  throw error;
332
656
  }
333
657
  }
334
- export function ensureDestructureCoreImports(code) {
658
+ /** Convert an import spec list (`A, B as C`) into a destructure pattern (`A, B: C`). */
659
+ function toDestructurePattern(specList) {
660
+ return specList
661
+ .split(',')
662
+ .map((s) => s.trim())
663
+ .filter(Boolean)
664
+ .map((seg) => {
665
+ const match = seg.split(/\s+as\s+/i);
666
+ return match.length === 2 ? `${match[0].trim()}: ${match[1].trim()}` : seg;
667
+ })
668
+ .join(', ');
669
+ }
670
+ // Rewrite named imports from a bridge URL (`/ns/core`, `/ns/rt`) into a
671
+ // default import plus `const {}` destructure. The bridge modules export a
672
+ // default namespace object, so a named import that survives to the device
673
+ // fails at link time ("does not provide an export named ...").
674
+ function destructureBridgeImports(code, opts) {
335
675
  try {
336
676
  let result = code;
337
- let coreImportCounter = 0;
338
- const toDestructure = (specList) => specList
339
- .split(',')
340
- .map((s) => s.trim())
341
- .filter(Boolean)
342
- .map((seg) => {
343
- const match = seg.split(/\s+as\s+/i);
344
- return match.length === 2 ? `${match[0].trim()}: ${match[1].trim()}` : seg;
345
- })
346
- .join(', ');
347
- const reNamed = /(^|\n)\s*import\s*\{([^}]+)\}\s*from\s*["']((?:https?:\/\/[^"']+)?\/ns\/core(?:\/[\d]+)?(?:\?p=[^"']+)?)['"];?\s*/gm;
348
- result = result.replace(reNamed, (_full, prefix, specList, src) => {
349
- if (isDeepCoreSubpath(src))
350
- return _full;
351
- const tempName = `__ns_core_ns_re${coreImportCounter > 0 ? `_${coreImportCounter}` : ''}`;
352
- coreImportCounter++;
353
- const decl = `const { ${toDestructure(specList)} } = ${tempName};`;
354
- return `${prefix}import ${tempName} from ${JSON.stringify(src)};\n${decl}\n`;
677
+ let counter = 0;
678
+ const srcPattern = `((?:https?:\\/\\/[^"']+)?${opts.pathPattern})`;
679
+ const reNamed = new RegExp(`(^|\\n)\\s*import\\s*\\{([^}]+)\\}\\s*from\\s*["']${srcPattern}['"];?\\s*`, 'gm');
680
+ result = result.replace(reNamed, (full, prefix, specList, src) => {
681
+ if (opts.shouldSkip?.(src))
682
+ return full;
683
+ const tempName = opts.numberRepeats && counter > 0 ? `${opts.tempName}_${counter}` : opts.tempName;
684
+ counter++;
685
+ return `${prefix}import ${tempName} from ${JSON.stringify(src)};\nconst { ${toDestructurePattern(specList)} } = ${tempName};\n`;
355
686
  });
356
- const reMixed = /(^|\n)\s*import\s+([A-Za-z_$][\w$]*)\s*,\s*\{([^}]+)\}\s*from\s*["']((?:https?:\/\/[^"']+)?\/ns\/core(?:\/[\d]+)?(?:\?p=[^"']+)?)['"];?\s*/gm;
357
- result = result.replace(reMixed, (_full, prefix, defName, specList, src) => {
358
- if (isDeepCoreSubpath(src))
359
- return _full;
360
- const decl = `const { ${toDestructure(specList)} } = ${defName};`;
361
- return `${prefix}import ${defName} from ${JSON.stringify(src)};\n${decl}\n`;
687
+ const reMixed = new RegExp(`(^|\\n)\\s*import\\s+([A-Za-z_$][\\w$]*)\\s*,\\s*\\{([^}]+)\\}\\s*from\\s*["']${srcPattern}['"];?\\s*`, 'gm');
688
+ result = result.replace(reMixed, (full, prefix, defName, specList, src) => {
689
+ if (opts.shouldSkip?.(src))
690
+ return full;
691
+ return `${prefix}import ${defName} from ${JSON.stringify(src)};\nconst { ${toDestructurePattern(specList)} } = ${defName};\n`;
362
692
  });
363
693
  return result;
364
694
  }
@@ -366,34 +696,21 @@ export function ensureDestructureCoreImports(code) {
366
696
  return code;
367
697
  }
368
698
  }
699
+ export function ensureDestructureCoreImports(code) {
700
+ return destructureBridgeImports(code, {
701
+ pathPattern: String.raw `\/ns\/core(?:\/[^"']+)?`,
702
+ tempName: '__ns_core_ns_re',
703
+ numberRepeats: true,
704
+ // Deep core subpaths keep their named-import form (see core-sanitize.ts).
705
+ shouldSkip: isDeepCoreSubpath,
706
+ });
707
+ }
369
708
  export function ensureDestructureRtImports(code) {
370
- try {
371
- let result = code;
372
- const toDestructure = (specList) => specList
373
- .split(',')
374
- .map((s) => s.trim())
375
- .filter(Boolean)
376
- .map((seg) => {
377
- const match = seg.split(/\s+as\s+/i);
378
- return match.length === 2 ? `${match[0].trim()}: ${match[1].trim()}` : seg;
379
- })
380
- .join(', ');
381
- const reNamed = /(^|\n)\s*import\s*\{([^}]+)\}\s*from\s*["']((?:https?:\/\/[^"']+)?\/ns\/rt(?:\/[\d]+)?)['"];?\s*/gm;
382
- result = result.replace(reNamed, (_full, prefix, specList, src) => {
383
- const tempName = `__ns_rt_ns_re`;
384
- const decl = `const { ${toDestructure(specList)} } = ${tempName};`;
385
- return `${prefix}import ${tempName} from ${JSON.stringify(src)};\n${decl}\n`;
386
- });
387
- const reMixed = /(^|\n)\s*import\s+([A-Za-z_$][\w$]*)\s*,\s*\{([^}]+)\}\s*from\s*["']((?:https?:\/\/[^"']+)?\/ns\/rt(?:\/[\d]+)?)['"];?\s*/gm;
388
- result = result.replace(reMixed, (_full, prefix, defName, specList, src) => {
389
- const decl = `const { ${toDestructure(specList)} } = ${defName};`;
390
- return `${prefix}import ${defName} from ${JSON.stringify(src)};\n${decl}\n`;
391
- });
392
- return result;
393
- }
394
- catch {
395
- return code;
396
- }
709
+ return destructureBridgeImports(code, {
710
+ pathPattern: String.raw `\/ns\/rt(?:\/[\d]+)?`,
711
+ tempName: '__ns_rt_ns_re',
712
+ numberRepeats: false,
713
+ });
397
714
  }
398
715
  export function dedupeRtNamedImportsAgainstDestructures(code) {
399
716
  try {