@analogjs/platform 3.0.0-alpha.9 → 3.0.0-alpha.90

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 (361) hide show
  1. package/migrations/migration.json +7 -1
  2. package/package.json +28 -14
  3. package/src/index.d.ts +5 -2
  4. package/src/index.js +3 -1
  5. package/src/index.js.map +1 -1
  6. package/src/lib/analog-integration-plugin.d.ts +9 -0
  7. package/src/lib/analog-integration-plugin.js +22 -0
  8. package/src/lib/analog-integration-plugin.js.map +1 -0
  9. package/src/lib/clear-client-page-endpoint.d.ts +2 -2
  10. package/src/lib/clear-client-page-endpoint.js +27 -5
  11. package/src/lib/clear-client-page-endpoint.js.map +1 -1
  12. package/src/lib/content/marked/index.d.ts +5 -5
  13. package/src/lib/content/marked/index.js.map +1 -1
  14. package/src/lib/content/marked/marked-content-highlighter.d.ts +2 -2
  15. package/src/lib/content/marked/marked-content-highlighter.js.map +1 -1
  16. package/src/lib/content/marked/marked-setup.service.d.ts +8 -8
  17. package/src/lib/content/marked/marked-setup.service.js +7 -5
  18. package/src/lib/content/marked/marked-setup.service.js.map +1 -1
  19. package/src/lib/content/prism/angular.js.map +1 -1
  20. package/src/lib/content/prism/index.d.ts +1 -1
  21. package/src/lib/content/prism/index.js.map +1 -1
  22. package/src/lib/content/prism/options.d.ts +1 -1
  23. package/src/lib/content/prism/prism-highlighter.d.ts +5 -5
  24. package/src/lib/content/prism/prism-highlighter.js.map +1 -1
  25. package/src/lib/content/shiki/index.d.ts +3 -3
  26. package/src/lib/content/shiki/index.js +9 -6
  27. package/src/lib/content/shiki/index.js.map +1 -1
  28. package/src/lib/content/shiki/options.d.ts +8 -7
  29. package/src/lib/content/shiki/shiki-highlighter.d.ts +14 -13
  30. package/src/lib/content/shiki/shiki-highlighter.js +7 -4
  31. package/src/lib/content/shiki/shiki-highlighter.js.map +1 -1
  32. package/src/lib/content/utils/escape-html.d.ts +7 -0
  33. package/src/lib/content/utils/escape-html.js +16 -0
  34. package/src/lib/content/utils/escape-html.js.map +1 -0
  35. package/src/lib/content-plugin.d.ts +19 -19
  36. package/src/lib/content-plugin.js +34 -9
  37. package/src/lib/content-plugin.js.map +1 -1
  38. package/src/lib/deps-plugin.d.ts +2 -2
  39. package/src/lib/deps-plugin.js +24 -11
  40. package/src/lib/deps-plugin.js.map +1 -1
  41. package/src/lib/discover-library-routes.d.ts +19 -0
  42. package/src/lib/discover-library-routes.js +72 -0
  43. package/src/lib/discover-library-routes.js.map +1 -0
  44. package/src/lib/i18n-component-registry-plugin.d.ts +17 -0
  45. package/src/lib/i18n-component-registry-plugin.js +100 -0
  46. package/src/lib/i18n-component-registry-plugin.js.map +1 -0
  47. package/src/lib/i18n-extract-plugin.d.ts +33 -0
  48. package/src/lib/inject-server-fn-ids.d.ts +17 -0
  49. package/src/lib/inject-server-fn-ids.js +94 -0
  50. package/src/lib/inject-server-fn-ids.js.map +1 -0
  51. package/src/lib/json-ld-manifest-plugin.d.ts +41 -0
  52. package/src/lib/json-ld-manifest-plugin.js +84 -0
  53. package/src/lib/json-ld-manifest-plugin.js.map +1 -0
  54. package/src/lib/nitro/analog-nitro-plugin.d.ts +18 -0
  55. package/src/lib/nitro/analog-nitro-plugin.js +582 -0
  56. package/src/lib/nitro/analog-nitro-plugin.js.map +1 -0
  57. package/src/lib/nitro/angular-linker-plugin.d.ts +15 -0
  58. package/src/lib/nitro/angular-linker-plugin.js +64 -0
  59. package/src/lib/nitro/angular-linker-plugin.js.map +1 -0
  60. package/src/lib/nitro/build-sitemap.d.ts +23 -0
  61. package/src/lib/nitro/build-sitemap.js +137 -0
  62. package/src/lib/nitro/build-sitemap.js.map +1 -0
  63. package/src/lib/nitro/debug.d.ts +5 -0
  64. package/src/lib/nitro/debug.js +11 -0
  65. package/src/lib/nitro/debug.js.map +1 -0
  66. package/src/lib/nitro/get-content-files.d.ts +13 -0
  67. package/src/lib/nitro/get-content-files.js +52 -0
  68. package/src/lib/nitro/get-content-files.js.map +1 -0
  69. package/src/lib/nitro/get-page-handlers.d.ts +22 -0
  70. package/src/lib/nitro/get-page-handlers.js +33 -0
  71. package/src/lib/nitro/get-page-handlers.js.map +1 -0
  72. package/src/lib/nitro/i18n-prerender.d.ts +29 -0
  73. package/src/lib/nitro/i18n-prerender.js +61 -0
  74. package/src/lib/nitro/i18n-prerender.js.map +1 -0
  75. package/src/lib/nitro/page-endpoints-plugin.d.ts +7 -0
  76. package/src/lib/nitro/page-endpoints-plugin.js +72 -0
  77. package/src/lib/nitro/page-endpoints-plugin.js.map +1 -0
  78. package/src/lib/nitro/post-rendering-hook.d.ts +2 -0
  79. package/src/lib/nitro/post-rendering-hook.js +10 -0
  80. package/src/lib/nitro/post-rendering-hook.js.map +1 -0
  81. package/src/lib/nitro/renderers.d.ts +33 -0
  82. package/src/lib/nitro/renderers.js +22 -0
  83. package/src/lib/nitro/renderers.js.map +1 -0
  84. package/src/lib/nitro/types.d.ts +122 -0
  85. package/src/lib/nx-plugin/_virtual/_rolldown/runtime.js +23 -0
  86. package/src/lib/nx-plugin/builders.json +15 -0
  87. package/src/lib/nx-plugin/executors.json +13 -5
  88. package/src/lib/nx-plugin/generators.json +25 -0
  89. package/src/lib/nx-plugin/node_modules/.pnpm/es-toolkit@1.45.1/node_modules/es-toolkit/dist/string/camelCase.js +13 -0
  90. package/src/lib/nx-plugin/node_modules/.pnpm/es-toolkit@1.45.1/node_modules/es-toolkit/dist/string/camelCase.js.map +1 -0
  91. package/src/lib/nx-plugin/node_modules/.pnpm/es-toolkit@1.45.1/node_modules/es-toolkit/dist/string/capitalize.js +8 -0
  92. package/src/lib/nx-plugin/node_modules/.pnpm/es-toolkit@1.45.1/node_modules/es-toolkit/dist/string/capitalize.js.map +1 -0
  93. package/src/lib/nx-plugin/node_modules/.pnpm/es-toolkit@1.45.1/node_modules/es-toolkit/dist/string/words.js +9 -0
  94. package/src/lib/nx-plugin/node_modules/.pnpm/es-toolkit@1.45.1/node_modules/es-toolkit/dist/string/words.js.map +1 -0
  95. package/src/lib/nx-plugin/package.json +1 -3
  96. package/src/lib/nx-plugin/src/builders/vite/schema.json +39 -0
  97. package/src/lib/nx-plugin/src/builders/vite/vite-build.d.ts +11 -0
  98. package/src/lib/nx-plugin/src/builders/vite/vite-build.js +18 -0
  99. package/src/lib/nx-plugin/src/builders/vite/vite-build.js.map +1 -0
  100. package/src/lib/nx-plugin/src/builders/vite-dev-server/dev-server.d.ts +7 -0
  101. package/src/lib/nx-plugin/src/builders/vite-dev-server/dev-server.js +14 -0
  102. package/src/lib/nx-plugin/src/builders/vite-dev-server/dev-server.js.map +1 -0
  103. package/src/lib/nx-plugin/src/builders/vite-dev-server/schema.json +27 -0
  104. package/src/lib/nx-plugin/src/executors/vite-dev-server/compat.d.ts +1 -1
  105. package/src/lib/nx-plugin/src/executors/vite-dev-server/compat.js +4 -4
  106. package/src/lib/nx-plugin/src/executors/vite-dev-server/compat.js.map +1 -1
  107. package/src/lib/nx-plugin/src/executors/vite-dev-server/vite-dev-server.impl.d.ts +1 -1
  108. package/src/lib/nx-plugin/src/executors/vite-dev-server/vite-dev-server.impl.js +3 -3
  109. package/src/lib/nx-plugin/src/executors/vite-dev-server/vite-dev-server.impl.js.map +1 -1
  110. package/src/lib/nx-plugin/src/executors/vitest/compat.d.ts +1 -1
  111. package/src/lib/nx-plugin/src/executors/vitest/compat.js +4 -4
  112. package/src/lib/nx-plugin/src/executors/vitest/compat.js.map +1 -1
  113. package/src/lib/nx-plugin/src/executors/vitest/vitest.impl.d.ts +1 -1
  114. package/src/lib/nx-plugin/src/executors/vitest/vitest.impl.js +3 -3
  115. package/src/lib/nx-plugin/src/executors/vitest/vitest.impl.js.map +1 -1
  116. package/src/lib/nx-plugin/src/generators/app/compat.d.ts +9 -3
  117. package/src/lib/nx-plugin/src/generators/app/compat.js +15 -4
  118. package/src/lib/nx-plugin/src/generators/app/compat.js.map +1 -1
  119. package/src/lib/nx-plugin/src/generators/app/files/agents/AGENTS.md +11 -0
  120. package/src/lib/nx-plugin/src/generators/app/files/agents/CLAUDE.md +1 -0
  121. package/src/lib/nx-plugin/src/generators/app/files/root/tsconfig.base.json +3 -6
  122. package/src/lib/nx-plugin/src/generators/app/files/template-angular/src/test-setup.ts__template__ +1 -0
  123. package/src/lib/nx-plugin/src/generators/app/files/template-angular/tsconfig.app.json__template__ +1 -3
  124. package/src/lib/nx-plugin/src/generators/app/files/template-angular/tsconfig.json__template__ +2 -1
  125. package/src/lib/nx-plugin/src/generators/app/files/template-angular/vite.config.ts__template__ +7 -3
  126. package/src/lib/nx-plugin/src/generators/app/files/template-angular-v17/tsconfig.json__template__ +4 -2
  127. package/src/lib/nx-plugin/src/generators/app/files/template-angular-v17/vite.config.ts__template__ +2 -5
  128. package/src/lib/nx-plugin/src/generators/app/files/template-angular-v18/tsconfig.json__template__ +4 -2
  129. package/src/lib/nx-plugin/src/generators/app/files/template-angular-v18/vite.config.ts__template__ +3 -6
  130. package/src/lib/nx-plugin/src/generators/app/files/template-angular-v19/tsconfig.app.json__template__ +1 -3
  131. package/src/lib/nx-plugin/src/generators/app/files/template-angular-v19/tsconfig.json__template__ +4 -2
  132. package/src/lib/nx-plugin/src/generators/app/files/template-angular-v19/vite.config.ts__template__ +2 -5
  133. package/src/lib/nx-plugin/src/generators/app/generator.d.ts +11 -11
  134. package/src/lib/nx-plugin/src/generators/app/generator.js +44 -37
  135. package/src/lib/nx-plugin/src/generators/app/generator.js.map +1 -1
  136. package/src/lib/nx-plugin/src/generators/app/lib/add-agent-context.d.ts +2 -0
  137. package/src/lib/nx-plugin/src/generators/app/lib/add-agent-context.js +16 -0
  138. package/src/lib/nx-plugin/src/generators/app/lib/add-agent-context.js.map +1 -0
  139. package/src/lib/nx-plugin/src/generators/app/lib/add-analog-dependencies.d.ts +1 -1
  140. package/src/lib/nx-plugin/src/generators/app/lib/add-analog-project-config.d.ts +1 -1
  141. package/src/lib/nx-plugin/src/generators/app/lib/add-analog-project-config.js +6 -5
  142. package/src/lib/nx-plugin/src/generators/app/lib/add-analog-project-config.js.map +1 -1
  143. package/src/lib/nx-plugin/src/generators/app/lib/add-angular-app.d.ts +2 -2
  144. package/src/lib/nx-plugin/src/generators/app/lib/add-angular-app.js +8 -11
  145. package/src/lib/nx-plugin/src/generators/app/lib/add-angular-app.js.map +1 -1
  146. package/src/lib/nx-plugin/src/generators/app/lib/add-eslint.d.ts +2 -2
  147. package/src/lib/nx-plugin/src/generators/app/lib/add-files.d.ts +2 -2
  148. package/src/lib/nx-plugin/src/generators/app/lib/add-files.js +6 -5
  149. package/src/lib/nx-plugin/src/generators/app/lib/add-files.js.map +1 -1
  150. package/src/lib/nx-plugin/src/generators/app/lib/add-home-page.d.ts +2 -2
  151. package/src/lib/nx-plugin/src/generators/app/lib/add-home-page.js +6 -5
  152. package/src/lib/nx-plugin/src/generators/app/lib/add-home-page.js.map +1 -1
  153. package/src/lib/nx-plugin/src/generators/app/lib/add-tailwind-config.d.ts +7 -7
  154. package/src/lib/nx-plugin/src/generators/app/lib/add-tailwind-config.js +13 -11
  155. package/src/lib/nx-plugin/src/generators/app/lib/add-tailwind-config.js.map +1 -1
  156. package/src/lib/nx-plugin/src/generators/app/lib/add-tailwind-helpers.d.ts +4 -5
  157. package/src/lib/nx-plugin/src/generators/app/lib/add-tailwind-helpers.js +34 -40
  158. package/src/lib/nx-plugin/src/generators/app/lib/add-tailwind-helpers.js.map +1 -1
  159. package/src/lib/nx-plugin/src/generators/app/lib/add-vite-plugin.d.ts +1 -1
  160. package/src/lib/nx-plugin/src/generators/app/lib/cleanup-files.d.ts +2 -2
  161. package/src/lib/nx-plugin/src/generators/app/lib/cleanup-files.js +1 -1
  162. package/src/lib/nx-plugin/src/generators/app/lib/cleanup-files.js.map +1 -1
  163. package/src/lib/nx-plugin/src/generators/app/lib/initialize-analog-workspace.d.ts +2 -2
  164. package/src/lib/nx-plugin/src/generators/app/lib/update-index-html.d.ts +1 -1
  165. package/src/lib/nx-plugin/src/generators/app/lib/update-index-html.js +5 -4
  166. package/src/lib/nx-plugin/src/generators/app/lib/update-index-html.js.map +1 -1
  167. package/src/lib/nx-plugin/src/generators/app/schema.d.ts +3 -0
  168. package/src/lib/nx-plugin/src/generators/app/schema.json +6 -0
  169. package/src/lib/nx-plugin/src/generators/app/versions/minimum-supported-versions.d.ts +4 -2
  170. package/src/lib/nx-plugin/src/generators/app/versions/minimum-supported-versions.js +9 -6
  171. package/src/lib/nx-plugin/src/generators/app/versions/minimum-supported-versions.js.map +1 -1
  172. package/src/lib/nx-plugin/src/generators/app/versions/nx-dependencies.d.ts +0 -3
  173. package/src/lib/nx-plugin/src/generators/app/versions/nx_17_X/versions.d.ts +1 -1
  174. package/src/lib/nx-plugin/src/generators/app/versions/nx_18_X/versions.d.ts +12 -12
  175. package/src/lib/nx-plugin/src/generators/app/versions/nx_18_X/versions.js +8 -27
  176. package/src/lib/nx-plugin/src/generators/app/versions/nx_18_X/versions.js.map +1 -1
  177. package/src/lib/nx-plugin/src/generators/app/versions/tailwind-dependencies.d.ts +1 -1
  178. package/src/lib/nx-plugin/src/generators/app/versions/tailwind-dependencies.js +6 -5
  179. package/src/lib/nx-plugin/src/generators/app/versions/tailwind-dependencies.js.map +1 -1
  180. package/src/lib/nx-plugin/src/generators/app/versions.d.ts +0 -18
  181. package/src/lib/nx-plugin/src/generators/init/compat.d.ts +9 -3
  182. package/src/lib/nx-plugin/src/generators/init/compat.js +15 -4
  183. package/src/lib/nx-plugin/src/generators/init/compat.js.map +1 -1
  184. package/src/lib/nx-plugin/src/generators/init/files/vite.config.ts__template__ +2 -6
  185. package/src/lib/nx-plugin/src/generators/init/generator.d.ts +3 -3
  186. package/src/lib/nx-plugin/src/generators/init/generator.js +35 -34
  187. package/src/lib/nx-plugin/src/generators/init/generator.js.map +1 -1
  188. package/src/lib/nx-plugin/src/generators/init/lib/add-analog-dependencies.d.ts +1 -1
  189. package/src/lib/nx-plugin/src/generators/init/lib/add-analog-dependencies.js +8 -7
  190. package/src/lib/nx-plugin/src/generators/init/lib/add-analog-dependencies.js.map +1 -1
  191. package/src/lib/nx-plugin/src/generators/init/lib/update-app-tsconfig.d.ts +2 -2
  192. package/src/lib/nx-plugin/src/generators/init/lib/update-app-tsconfig.js +6 -5
  193. package/src/lib/nx-plugin/src/generators/init/lib/update-app-tsconfig.js.map +1 -1
  194. package/src/lib/nx-plugin/src/generators/init/lib/update-build-target.d.ts +2 -2
  195. package/src/lib/nx-plugin/src/generators/init/lib/update-build-target.js +15 -14
  196. package/src/lib/nx-plugin/src/generators/init/lib/update-build-target.js.map +1 -1
  197. package/src/lib/nx-plugin/src/generators/init/lib/update-git-ignore.d.ts +1 -1
  198. package/src/lib/nx-plugin/src/generators/init/lib/update-git-ignore.js +1 -1
  199. package/src/lib/nx-plugin/src/generators/init/lib/update-git-ignore.js.map +1 -1
  200. package/src/lib/nx-plugin/src/generators/init/lib/update-index-html.d.ts +2 -2
  201. package/src/lib/nx-plugin/src/generators/init/lib/update-index-html.js +7 -6
  202. package/src/lib/nx-plugin/src/generators/init/lib/update-index-html.js.map +1 -1
  203. package/src/lib/nx-plugin/src/generators/init/lib/update-main.d.ts +2 -2
  204. package/src/lib/nx-plugin/src/generators/init/lib/update-main.js +5 -4
  205. package/src/lib/nx-plugin/src/generators/init/lib/update-main.js.map +1 -1
  206. package/src/lib/nx-plugin/src/generators/init/lib/update-package-json.d.ts +2 -2
  207. package/src/lib/nx-plugin/src/generators/init/lib/update-package-json.js +9 -8
  208. package/src/lib/nx-plugin/src/generators/init/lib/update-package-json.js.map +1 -1
  209. package/src/lib/nx-plugin/src/generators/init/lib/update-serve-target.d.ts +2 -2
  210. package/src/lib/nx-plugin/src/generators/init/lib/update-serve-target.js +6 -5
  211. package/src/lib/nx-plugin/src/generators/init/lib/update-serve-target.js.map +1 -1
  212. package/src/lib/nx-plugin/src/generators/init/lib/update-test-target.d.ts +2 -2
  213. package/src/lib/nx-plugin/src/generators/init/lib/update-test-target.js +6 -5
  214. package/src/lib/nx-plugin/src/generators/init/lib/update-test-target.js.map +1 -1
  215. package/src/lib/nx-plugin/src/generators/init/lib/update-test-tsconfig.d.ts +2 -2
  216. package/src/lib/nx-plugin/src/generators/init/lib/update-test-tsconfig.js +6 -5
  217. package/src/lib/nx-plugin/src/generators/init/lib/update-test-tsconfig.js.map +1 -1
  218. package/src/lib/nx-plugin/src/generators/init/test-files/src/test-setup.ts__template__ +1 -0
  219. package/src/lib/nx-plugin/src/generators/page/__snapshots__/generator.spec.ts.snap +0 -7
  220. package/src/lib/nx-plugin/src/generators/page/compat.d.ts +9 -0
  221. package/src/lib/nx-plugin/src/generators/page/compat.js +19 -0
  222. package/src/lib/nx-plugin/src/generators/page/compat.js.map +1 -0
  223. package/src/lib/nx-plugin/src/generators/page/files/__fileName__.page.ts__template__ +0 -1
  224. package/src/lib/nx-plugin/src/generators/page/generator.d.ts +3 -4
  225. package/src/lib/nx-plugin/src/generators/page/generator.js +14 -13
  226. package/src/lib/nx-plugin/src/generators/page/generator.js.map +1 -1
  227. package/src/lib/nx-plugin/src/generators/preset/__snapshots__/generator.spec.ts.snap +9 -7
  228. package/src/lib/nx-plugin/src/generators/preset/generator.d.ts +3 -3
  229. package/src/lib/nx-plugin/src/generators/preset/generator.js +24 -7
  230. package/src/lib/nx-plugin/src/generators/preset/generator.js.map +1 -1
  231. package/src/lib/nx-plugin/src/generators/preset/schema.d.ts +1 -0
  232. package/src/lib/nx-plugin/src/generators/preset/schema.json +6 -0
  233. package/src/lib/nx-plugin/src/generators/setup-vitest/compat.d.ts +9 -3
  234. package/src/lib/nx-plugin/src/generators/setup-vitest/compat.js +15 -4
  235. package/src/lib/nx-plugin/src/generators/setup-vitest/compat.js.map +1 -1
  236. package/src/lib/nx-plugin/src/generators/setup-vitest/files/src/test-setup.ts__template__ +1 -0
  237. package/src/lib/nx-plugin/src/generators/setup-vitest/files/vite.config.mts__template__ +0 -6
  238. package/src/lib/nx-plugin/src/generators/setup-vitest/generator.d.ts +3 -3
  239. package/src/lib/nx-plugin/src/generators/setup-vitest/generator.js +19 -21
  240. package/src/lib/nx-plugin/src/generators/setup-vitest/generator.js.map +1 -1
  241. package/src/lib/nx-plugin/src/generators/setup-vitest/lib/add-analog-dependencies.d.ts +1 -1
  242. package/src/lib/nx-plugin/src/generators/setup-vitest/lib/add-analog-dependencies.js +5 -4
  243. package/src/lib/nx-plugin/src/generators/setup-vitest/lib/add-analog-dependencies.js.map +1 -1
  244. package/src/lib/nx-plugin/src/generators/setup-vitest/lib/update-test-target.d.ts +2 -2
  245. package/src/lib/nx-plugin/src/generators/setup-vitest/lib/update-test-target.js +6 -5
  246. package/src/lib/nx-plugin/src/generators/setup-vitest/lib/update-test-target.js.map +1 -1
  247. package/src/lib/nx-plugin/src/generators/setup-vitest/lib/update-tsconfig.d.ts +2 -2
  248. package/src/lib/nx-plugin/src/generators/setup-vitest/lib/update-tsconfig.js +6 -5
  249. package/src/lib/nx-plugin/src/generators/setup-vitest/lib/update-tsconfig.js.map +1 -1
  250. package/src/lib/nx-plugin/src/utils/version-utils.d.ts +1 -1
  251. package/src/lib/nx-plugin/src/utils/version-utils.js +9 -8
  252. package/src/lib/nx-plugin/src/utils/version-utils.js.map +1 -1
  253. package/src/lib/nx-plugin/src/utils/versions/dependencies.js +33 -32
  254. package/src/lib/nx-plugin/src/utils/versions/dependencies.js.map +1 -1
  255. package/src/lib/nx-plugin/src/utils/versions/dev-dependencies.js +40 -39
  256. package/src/lib/nx-plugin/src/utils/versions/dev-dependencies.js.map +1 -1
  257. package/src/lib/nx-plugin/src/utils/versions/ng_17_X/versions.d.ts +1 -1
  258. package/src/lib/nx-plugin/src/utils/versions/ng_17_X/versions.js +16 -2
  259. package/src/lib/nx-plugin/src/utils/versions/ng_17_X/versions.js.map +1 -1
  260. package/src/lib/nx-plugin/src/utils/versions/ng_18_X/versions.d.ts +1 -1
  261. package/src/lib/nx-plugin/src/utils/versions/ng_18_X/versions.js +16 -2
  262. package/src/lib/nx-plugin/src/utils/versions/ng_18_X/versions.js.map +1 -1
  263. package/src/lib/nx-plugin/src/utils/versions/ng_19_X/versions.d.ts +9 -8
  264. package/src/lib/nx-plugin/src/utils/versions/ng_19_X/versions.js +27 -10
  265. package/src/lib/nx-plugin/src/utils/versions/ng_19_X/versions.js.map +1 -1
  266. package/src/lib/options.d.ts +165 -84
  267. package/src/lib/platform-plugin.d.ts +2 -2
  268. package/src/lib/platform-plugin.js +20 -34
  269. package/src/lib/platform-plugin.js.map +1 -1
  270. package/src/lib/route-file-discovery.d.ts +23 -0
  271. package/src/lib/route-file-discovery.js +114 -0
  272. package/src/lib/route-file-discovery.js.map +1 -0
  273. package/src/lib/route-generation-plugin.d.ts +3 -0
  274. package/src/lib/route-generation-plugin.js +45 -0
  275. package/src/lib/route-generation-plugin.js.map +1 -0
  276. package/src/lib/route-idiom-diagnostics.d.ts +13 -0
  277. package/src/lib/route-idiom-diagnostics.js +160 -0
  278. package/src/lib/route-idiom-diagnostics.js.map +1 -0
  279. package/src/lib/route-manifest.d.ts +122 -0
  280. package/src/lib/route-manifest.js +431 -0
  281. package/src/lib/route-manifest.js.map +1 -0
  282. package/src/lib/router-plugin.d.ts +19 -19
  283. package/src/lib/router-plugin.js +127 -33
  284. package/src/lib/router-plugin.js.map +1 -1
  285. package/src/lib/server-fn-client-transform.d.ts +26 -0
  286. package/src/lib/server-fn-client-transform.js +97 -0
  287. package/src/lib/server-fn-client-transform.js.map +1 -0
  288. package/src/lib/server-fn-id.d.ts +25 -0
  289. package/src/lib/server-fn-id.js +37 -0
  290. package/src/lib/server-fn-id.js.map +1 -0
  291. package/src/lib/ssr/defer-streaming-plugin.d.ts +65 -0
  292. package/src/lib/ssr/inject-html-plugin.d.ts +1 -1
  293. package/src/lib/ssr/inject-html-plugin.js.map +1 -1
  294. package/src/lib/ssr/ssr-build-plugin.d.ts +24 -16
  295. package/src/lib/ssr/ssr-build-plugin.js +2 -18
  296. package/src/lib/ssr/ssr-build-plugin.js.map +1 -1
  297. package/src/lib/typed-routes-plugin.d.ts +50 -0
  298. package/src/lib/typed-routes-plugin.js +234 -0
  299. package/src/lib/typed-routes-plugin.js.map +1 -0
  300. package/src/lib/utils/debug-harness.d.ts +23 -0
  301. package/src/lib/utils/debug-harness.js +88 -0
  302. package/src/lib/utils/debug-harness.js.map +1 -0
  303. package/src/lib/utils/debug-log-file.d.ts +5 -0
  304. package/src/lib/utils/debug-log-file.js +56 -0
  305. package/src/lib/utils/debug-log-file.js.map +1 -0
  306. package/src/lib/utils/debug.d.ts +20 -0
  307. package/src/lib/utils/debug.js +24 -0
  308. package/src/lib/utils/debug.js.map +1 -0
  309. package/src/lib/utils/rolldown.d.ts +2 -2
  310. package/src/lib/utils/rolldown.js.map +1 -1
  311. package/src/server-mode-plugin.d.ts +11 -5
  312. package/src/server-mode-plugin.js +16 -6
  313. package/src/server-mode-plugin.js.map +1 -1
  314. package/src/lib/nx-plugin/src/executors/vite/compat.d.ts +0 -3
  315. package/src/lib/nx-plugin/src/executors/vite/compat.js +0 -8
  316. package/src/lib/nx-plugin/src/executors/vite/compat.js.map +0 -1
  317. package/src/lib/nx-plugin/src/executors/vite/schema.d.ts +0 -2
  318. package/src/lib/nx-plugin/src/executors/vite/schema.json +0 -147
  319. package/src/lib/nx-plugin/src/executors/vite/vite.impl.d.ts +0 -2
  320. package/src/lib/nx-plugin/src/executors/vite/vite.impl.js +0 -7
  321. package/src/lib/nx-plugin/src/executors/vite/vite.impl.js.map +0 -1
  322. package/src/lib/nx-plugin/src/generators/app/files/tailwind/v4/.postcssrc.json +0 -5
  323. package/src/lib/nx-plugin/src/generators/app/files/tailwind/v4/tailwind.config.ts__template__ +0 -14
  324. package/src/lib/nx-plugin/src/generators/app/files/template-angular-v15/index.html__template__ +0 -15
  325. package/src/lib/nx-plugin/src/generators/app/files/template-angular-v15/src/app/app.component.spec.ts__template__ +0 -17
  326. package/src/lib/nx-plugin/src/generators/app/files/template-angular-v15/src/app/app.component.ts__template__ +0 -10
  327. package/src/lib/nx-plugin/src/generators/app/files/template-angular-v15/src/favicon.ico__template__ +0 -0
  328. package/src/lib/nx-plugin/src/generators/app/files/template-angular-v15/src/main.providers.ts__template__ +0 -5
  329. package/src/lib/nx-plugin/src/generators/app/files/template-angular-v15/src/main.server.ts__template__ +0 -23
  330. package/src/lib/nx-plugin/src/generators/app/files/template-angular-v15/src/main.ts__template__ +0 -11
  331. package/src/lib/nx-plugin/src/generators/app/files/template-angular-v15/src/public/assets/.gitkeep__template__ +0 -0
  332. package/src/lib/nx-plugin/src/generators/app/files/template-angular-v15/src/public/assets/analog.svg__template__ +0 -1
  333. package/src/lib/nx-plugin/src/generators/app/files/template-angular-v15/src/public/assets/vite.svg__template__ +0 -1
  334. package/src/lib/nx-plugin/src/generators/app/files/template-angular-v15/src/server/routes/v1/hello.ts__template__ +0 -3
  335. package/src/lib/nx-plugin/src/generators/app/files/template-angular-v15/src/styles.css__template__ +0 -4
  336. package/src/lib/nx-plugin/src/generators/app/files/template-angular-v15/src/test-setup.ts__template__ +0 -12
  337. package/src/lib/nx-plugin/src/generators/app/files/template-angular-v15/src/vite-env.d.ts__template__ +0 -1
  338. package/src/lib/nx-plugin/src/generators/app/files/template-angular-v15/tsconfig.app.json__template__ +0 -16
  339. package/src/lib/nx-plugin/src/generators/app/files/template-angular-v15/tsconfig.editor.json__template__ +0 -7
  340. package/src/lib/nx-plugin/src/generators/app/files/template-angular-v15/tsconfig.json__template__ +0 -32
  341. package/src/lib/nx-plugin/src/generators/app/files/template-angular-v15/tsconfig.spec.json__template__ +0 -14
  342. package/src/lib/nx-plugin/src/generators/app/files/template-angular-v15/vite.config.ts__template__ +0 -61
  343. package/src/lib/nx-plugin/src/generators/app/lib/add-analog-dependencies.js +0 -14
  344. package/src/lib/nx-plugin/src/generators/app/lib/add-analog-dependencies.js.map +0 -1
  345. package/src/lib/nx-plugin/src/generators/app/lib/add-eslint.js +0 -15
  346. package/src/lib/nx-plugin/src/generators/app/lib/add-eslint.js.map +0 -1
  347. package/src/lib/nx-plugin/src/generators/app/lib/add-vite-plugin.js +0 -11
  348. package/src/lib/nx-plugin/src/generators/app/lib/add-vite-plugin.js.map +0 -1
  349. package/src/lib/nx-plugin/src/generators/app/lib/initialize-analog-workspace.js +0 -64
  350. package/src/lib/nx-plugin/src/generators/app/lib/initialize-analog-workspace.js.map +0 -1
  351. package/src/lib/nx-plugin/src/generators/app/versions/dependencies.js +0 -37
  352. package/src/lib/nx-plugin/src/generators/app/versions/dependencies.js.map +0 -1
  353. package/src/lib/nx-plugin/src/generators/app/versions/dev-dependencies.js +0 -45
  354. package/src/lib/nx-plugin/src/generators/app/versions/dev-dependencies.js.map +0 -1
  355. package/src/lib/nx-plugin/src/generators/app/versions/nx-dependencies.js +0 -27
  356. package/src/lib/nx-plugin/src/generators/app/versions/nx-dependencies.js.map +0 -1
  357. package/src/lib/nx-plugin/src/generators/app/versions/nx_17_X/versions.js +0 -30
  358. package/src/lib/nx-plugin/src/generators/app/versions/nx_17_X/versions.js.map +0 -1
  359. package/src/lib/nx-plugin/src/generators/app/versions.js +0 -29
  360. package/src/lib/nx-plugin/src/generators/app/versions.js.map +0 -1
  361. package/src/lib/nx-plugin/src/index.d.ts +0 -0
@@ -0,0 +1,582 @@
1
+ import { SERVER_MODE_ID } from "../../server-mode-plugin.js";
2
+ import { getPageHandlers } from "./get-page-handlers.js";
3
+ import { pageEndpointsPlugin } from "./page-endpoints-plugin.js";
4
+ import { getMatchingContentFilesWithFrontMatter } from "./get-content-files.js";
5
+ import { buildSitemap } from "./build-sitemap.js";
6
+ import { addPostRenderingHooks } from "./post-rendering-hook.js";
7
+ import { createI18nPostRenderingHook, expandRoutesWithLocales } from "./i18n-prerender.js";
8
+ import { angularLinkerPlugin } from "./angular-linker-plugin.js";
9
+ import { basename, dirname, relative, resolve } from "node:path";
10
+ import { existsSync, readFileSync, readdirSync, unlinkSync } from "node:fs";
11
+ import { mkdir, writeFile } from "node:fs/promises";
12
+ //#region packages/platform/src/lib/nitro/analog-nitro-plugin.ts
13
+ var SSR_ENTRY_VIRTUAL_ID = "\0virtual:@analogjs/nitro/ssr-entry";
14
+ /**
15
+ * Angular packages that ship in partial-compilation form and must pass
16
+ * through the linker before the SSR / nitro bundle can execute without
17
+ * JIT. Wired into `ssr.optimizeDeps.rolldownOptions.plugins`.
18
+ */
19
+ var ANGULAR_SSR_DEPS = [
20
+ "@angular/compiler",
21
+ "@angular/core",
22
+ "@angular/common",
23
+ "@angular/platform-browser",
24
+ "@angular/platform-server"
25
+ ];
26
+ /**
27
+ * Analog's NitroModule. Plug it into the Vite plugin chain alongside
28
+ * `nitro()` from `nitro/vite`; nitro/vite picks up the `.nitro` property
29
+ * and runs `setup(nitro)` once the Nitro instance is ready.
30
+ */
31
+ function analogNitroPlugin(options = {}) {
32
+ const workspaceRoot = options.workspaceRoot ?? process.env["NX_WORKSPACE_ROOT"] ?? process.cwd();
33
+ const sourceRoot = "src";
34
+ const ssr = options.ssr ?? true;
35
+ const apiPrefix = options.apiPrefix ?? "api";
36
+ let context = {
37
+ workspaceRoot,
38
+ rootDir: ".",
39
+ sourceRoot
40
+ };
41
+ let ssrEntryMarkerPath = "";
42
+ let userPublicDir;
43
+ let isBuild = false;
44
+ const ssrDepsReady = /* @__PURE__ */ new WeakMap();
45
+ let builtIndexHtml;
46
+ function waitForSsrDeps(environment) {
47
+ let ready = ssrDepsReady.get(environment);
48
+ if (!ready) {
49
+ ready = Promise.resolve(environment.depsOptimizer?.init());
50
+ ssrDepsReady.set(environment, ready);
51
+ }
52
+ return ready;
53
+ }
54
+ function refreshContext(viteRoot) {
55
+ context = {
56
+ workspaceRoot,
57
+ rootDir: relative(workspaceRoot, viteRoot ?? process.cwd()) || ".",
58
+ sourceRoot
59
+ };
60
+ ssrEntryMarkerPath = resolve(context.workspaceRoot, context.rootDir, ".analog/__ssr-entry.mjs");
61
+ }
62
+ function indexHtmlPath() {
63
+ return resolve(context.workspaceRoot, context.rootDir, options.index ?? "index.html");
64
+ }
65
+ function readIndexHtml() {
66
+ if (!isBuild) {
67
+ const source = indexHtmlPath();
68
+ return existsSync(source) ? readFileSync(source, "utf-8") : "<!doctype html><html><body><div id=\"app\"></div></body></html>";
69
+ }
70
+ if (builtIndexHtml === void 0) throw new Error(`[analog] The client build produced no ${basename(indexHtmlPath())}, so there is no document to server-render around. Rendering around the source document instead would ship markup pointing at the unbundled entry, which does not exist in a build.`);
71
+ return builtIndexHtml;
72
+ }
73
+ function resolveEntryServer() {
74
+ return options.entryServer ?? resolve(context.workspaceRoot, context.rootDir, `${sourceRoot}/main.server.ts`);
75
+ }
76
+ return {
77
+ name: "@analogjs/nitro",
78
+ enforce: "pre",
79
+ config(userConfig, configEnv) {
80
+ refreshContext(userConfig.root);
81
+ isBuild = configEnv?.command === "build";
82
+ if (userConfig.publicDir !== false) userPublicDir = resolve(context.workspaceRoot, context.rootDir, userConfig.publicDir ?? "public");
83
+ if (!process.env["NITRO_PRESET"]) {
84
+ if (process.env["BUILD_PRESET"]) process.env["NITRO_PRESET"] = process.env["BUILD_PRESET"];
85
+ else if (process.env["VERCEL"]) process.env["NITRO_PRESET"] = "vercel";
86
+ else if (process.env["NETLIFY"]) process.env["NITRO_PRESET"] = "netlify";
87
+ else if (process.env["CF_PAGES"]) process.env["NITRO_PRESET"] = "cloudflare-pages";
88
+ }
89
+ const overrides = {
90
+ server: { fs: { allow: [context.workspaceRoot] } },
91
+ environments: { client: { build: { rollupOptions: { input: indexHtmlPath() } } } }
92
+ };
93
+ if (ssr) {
94
+ overrides.experimental = { vite: { services: { ssr: { entry: ssrEntryMarkerPath } } } };
95
+ overrides.environments["ssr"] = {
96
+ build: {
97
+ outDir: resolve(context.workspaceRoot, "dist", context.rootDir, "ssr"),
98
+ rollupOptions: { input: { index: ssrEntryMarkerPath } }
99
+ },
100
+ optimizeDeps: {
101
+ include: ANGULAR_SSR_DEPS,
102
+ rolldownOptions: { plugins: [angularLinkerPlugin()] }
103
+ }
104
+ };
105
+ }
106
+ return overrides;
107
+ },
108
+ configureServer(server) {
109
+ const environment = server.environments["ssr"];
110
+ if (ssr && environment) waitForSsrDeps(environment).catch(() => void 0);
111
+ },
112
+ resolveId(id) {
113
+ if (id === ssrEntryMarkerPath || id === SSR_ENTRY_VIRTUAL_ID) {
114
+ if (ssr && !isBuild && this.environment.name === "ssr") return waitForSsrDeps(this.environment).then(() => SSR_ENTRY_VIRTUAL_ID);
115
+ return SSR_ENTRY_VIRTUAL_ID;
116
+ }
117
+ return null;
118
+ },
119
+ load(id) {
120
+ if (id !== SSR_ENTRY_VIRTUAL_ID) return null;
121
+ return generateSsrEntryWrapper(resolveEntryServer(), readIndexHtml());
122
+ },
123
+ writeBundle(_outputOptions, bundle) {
124
+ if (this.environment?.name !== "client") return;
125
+ const emitted = bundle[basename(indexHtmlPath())];
126
+ if (emitted?.type === "asset") {
127
+ const { source } = emitted;
128
+ builtIndexHtml = typeof source === "string" ? source : new TextDecoder().decode(source);
129
+ }
130
+ },
131
+ nitro: { async setup(nitro) {
132
+ if (!context || context.rootDir === ".") refreshContext(nitro.options.rootDir);
133
+ if (nitro.options.dev && !process.env["NITRO_DEV_RUNNER"] && !nitro.options.devServer?.runner) nitro.options.devServer = {
134
+ ...nitro.options.devServer,
135
+ runner: "self"
136
+ };
137
+ if (!nitro.options.dev) {
138
+ const preset = (nitro.options.preset ?? "").toLowerCase();
139
+ const isManagedPreset = preset !== "" && preset !== "node-server" && preset !== "node" && preset !== "nitro-dev";
140
+ if (preset.includes("vercel")) {
141
+ const vercel = nitro.options.vercel;
142
+ nitro.options.vercel = {
143
+ ...vercel,
144
+ entryFormat: vercel?.entryFormat ?? "node",
145
+ functions: {
146
+ runtime: vercel?.functions?.runtime ?? "nodejs24.x",
147
+ ...vercel?.functions
148
+ }
149
+ };
150
+ const vercelDir = resolve(context.workspaceRoot, ".vercel/output");
151
+ nitro.options.output = {
152
+ ...nitro.options.output,
153
+ dir: vercelDir,
154
+ serverDir: resolve(vercelDir, "functions/__server.func"),
155
+ publicDir: resolve(vercelDir, "static")
156
+ };
157
+ }
158
+ if (preset === "netlify" || preset === "netlify-edge") {
159
+ const netlifyDir = resolve(context.workspaceRoot, ".netlify/functions-internal");
160
+ nitro.options.output = {
161
+ ...nitro.options.output,
162
+ dir: netlifyDir,
163
+ serverDir: resolve(netlifyDir, "server"),
164
+ publicDir: resolve(context.workspaceRoot, "dist", context.rootDir, "analog/public")
165
+ };
166
+ }
167
+ if (preset.includes("cloudflare")) {
168
+ const cfDir = resolve(context.workspaceRoot, "dist", context.rootDir);
169
+ nitro.options.output = {
170
+ ...nitro.options.output,
171
+ dir: cfDir,
172
+ publicDir: cfDir,
173
+ serverDir: resolve(cfDir, "_worker.js")
174
+ };
175
+ }
176
+ if (!isManagedPreset) {
177
+ const distRoot = resolve(context.workspaceRoot, "dist", context.rootDir);
178
+ nitro.options.output = {
179
+ ...nitro.options.output,
180
+ dir: resolve(distRoot, "analog"),
181
+ publicDir: resolve(distRoot, "analog/public"),
182
+ serverDir: resolve(distRoot, "analog/server")
183
+ };
184
+ }
185
+ nitro.hooks.hook("prerender:route", async (route) => {
186
+ if (!route.skip || route.error) return;
187
+ const buffer = route.data;
188
+ if (!buffer || !route.fileName) return;
189
+ const filePath = resolve(nitro.options.output.publicDir, route.fileName.replace(/^[\\/]+/, ""));
190
+ try {
191
+ await mkdir(dirname(filePath), { recursive: true });
192
+ await writeFile(filePath, Buffer.from(buffer));
193
+ route.skip = false;
194
+ } catch {}
195
+ });
196
+ }
197
+ if (userPublicDir && existsSync(userPublicDir)) {
198
+ if (!nitro.options.publicAssets.some((asset) => asset.dir === userPublicDir)) nitro.options.publicAssets.push({
199
+ dir: userPublicDir,
200
+ baseURL: "/",
201
+ maxAge: 0,
202
+ fallthrough: true
203
+ });
204
+ }
205
+ nitro.hooks.hook("prerender:config", (prerendererConfig) => {
206
+ prerendererConfig.output = {
207
+ ...prerendererConfig.output,
208
+ publicDir: nitro.options.output.publicDir
209
+ };
210
+ });
211
+ const pageHandlers = getPageHandlers({
212
+ workspaceRoot: context.workspaceRoot,
213
+ sourceRoot: context.sourceRoot,
214
+ rootDir: context.rootDir,
215
+ additionalPagesDirs: options.additionalPagesDirs
216
+ });
217
+ nitro.options.handlers.push(...pageHandlers);
218
+ const serverDir = resolve(context.workspaceRoot, context.rootDir, `${context.sourceRoot}/server`);
219
+ if (existsSync(serverDir) && !nitro.options.scanDirs.includes(serverDir)) nitro.options.scanDirs.push(serverDir);
220
+ nitro.hooks.hook("rollup:before", (_n, rollupConfig) => {
221
+ if (Array.isArray(rollupConfig.plugins)) rollupConfig.plugins.push(pageEndpointsPlugin());
222
+ applyAnalogNitroExternals(rollupConfig);
223
+ sanitizeNitroBundlerConfig(rollupConfig);
224
+ });
225
+ if (ssr) {
226
+ nitro.options.virtual["#analog/ssr"] = () => generateSsrServiceVirtual(nitro);
227
+ nitro.options.virtual["#analog/ssr-renderer"] = () => generateSsrRendererVirtual(readIndexHtml());
228
+ nitro.options.renderer ??= {};
229
+ nitro.options.renderer.handler = "#analog/ssr-renderer";
230
+ delete nitro.options.renderer.template;
231
+ nitro.hooks.hook("prerender:config", (prerendererConfig) => {
232
+ prerendererConfig.renderer = false;
233
+ });
234
+ nitro.hooks.hook("prerender:init", (prerenderer) => {
235
+ prerenderer.options.renderer = { handler: "#analog/ssr-renderer" };
236
+ });
237
+ }
238
+ injectAnalogRouteRuleHeaders(nitro);
239
+ await wirePrerender(nitro, options, context, apiPrefix);
240
+ if (options.i18n) addPostRenderingHooks(nitro, [createI18nPostRenderingHook({
241
+ defaultLocale: options.i18n.defaultLocale,
242
+ locales: options.i18n.locales
243
+ })]);
244
+ } }
245
+ };
246
+ }
247
+ /**
248
+ * Builds the h3 handler installed as Nitro's `renderer.handler`. Short-circuits
249
+ * `ssr: false` routes to the raw client template; otherwise dispatches the
250
+ * request to the SSR service env (`fetchViteEnv("ssr", req)` works in dev via
251
+ * the env-runner and in prod via the `__nitro_vite_envs__` global set up by
252
+ * nitro/vite's `prodSetup`).
253
+ */
254
+ function generateSsrRendererVirtual(template) {
255
+ return `
256
+ import { defineHandler } from 'nitro/h3';
257
+ import ssr from '#analog/ssr';
258
+
259
+ const TEMPLATE = ${JSON.stringify(template)};
260
+
261
+ export default defineHandler(async (event) => {
262
+ event.res.headers.set('content-type', 'text/html; charset=utf-8');
263
+ // 'x-analog-no-ssr' is stamped on response headers by
264
+ // injectAnalogRouteRuleHeaders for routeRules with \`ssr: false\`. Nitro
265
+ // applies routeRule headers to the response before the renderer fires,
266
+ // so we can short-circuit by reading them here.
267
+ if (event.res.headers.get('x-analog-no-ssr') === 'true') {
268
+ return TEMPLATE;
269
+ }
270
+ const service = ssr.default ?? ssr;
271
+ return service.fetch(event.req);
272
+ });
273
+ `;
274
+ }
275
+ /**
276
+ * Resolves \`#analog/ssr\` to the SSR fetch handler. The shape returned by
277
+ * this function is bundler-agnostic: works in Vite-built main bundles and
278
+ * Rolldown-built prerender bundles alike.
279
+ *
280
+ * - Dev: dispatch through nitro/vite's env runner (\`fetchViteEnv\`); the SSR
281
+ * service module isn't on disk yet, so we delegate to the runner.
282
+ * - Build / prerender: re-export the built SSR entry directly from the
283
+ * filesystem. By the time Nitro's bundlers ask for \`#analog/ssr\`, Vite has
284
+ * already produced \`<buildDir>/vite/services/ssr/<entry>.mjs\`.
285
+ */
286
+ function generateSsrServiceVirtual(nitro) {
287
+ if (nitro.options.dev) return `
288
+ import { fetchViteEnv } from 'nitro/vite/runtime';
289
+ export default {
290
+ // The dev runner answers from a worker, and a rejection there comes back as
291
+ // something Nitro cannot turn into a response, so the request hangs with no
292
+ // status and no message. Answer with the failure instead.
293
+ async fetch(req) {
294
+ try {
295
+ return await fetchViteEnv('ssr', req);
296
+ } catch (err) {
297
+ console.error('[analog ssr]', err);
298
+ const message = err instanceof Error ? (err.stack ?? err.message) : String(err);
299
+ return new Response(message, {
300
+ status: 500,
301
+ headers: { 'content-type': 'text/plain; charset=utf-8' },
302
+ });
303
+ }
304
+ },
305
+ };
306
+ `;
307
+ const ssrDir = resolve(nitro.options.buildDir, "vite/services/ssr");
308
+ if (!existsSync(ssrDir)) return `export default { async fetch() { throw new Error('Analog SSR service directory missing: ${ssrDir}'); } };`;
309
+ const entries = readdirSync(ssrDir).filter((f) => f.endsWith(".mjs"));
310
+ if (entries.length === 0) return `export default { async fetch() { throw new Error('No Analog SSR entry file built in: ${ssrDir}'); } };`;
311
+ const entryPath = resolve(ssrDir, entries.find((f) => f === "main.server.mjs") ?? entries[0]);
312
+ return `export { default } from ${JSON.stringify(entryPath)};`;
313
+ }
314
+ /**
315
+ * Packages Analog forces external in the Nitro server bundle. Each entry is
316
+ * here for a specific reason — see comments.
317
+ */
318
+ var ANALOG_NITRO_EXTERNALS = [
319
+ "rxjs",
320
+ "node-fetch-native/dist/polyfill",
321
+ "sharp"
322
+ ];
323
+ function applyAnalogNitroExternals(rollupConfig) {
324
+ const prev = rollupConfig.external;
325
+ const existing = prev === void 0 ? [] : Array.isArray(prev) ? prev : prev instanceof RegExp ? [prev] : typeof prev === "string" ? [prev] : [];
326
+ const escapeRegExp = (s) => s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
327
+ for (const entry of ANALOG_NITRO_EXTERNALS) {
328
+ const pattern = new RegExp(`^${escapeRegExp(entry)}(?:/|$)`);
329
+ if (!existing.some((p) => String(p) === String(pattern))) existing.push(pattern);
330
+ }
331
+ rollupConfig.external = existing;
332
+ }
333
+ /**
334
+ * Workarounds for Nitro v3 + Rolldown bundler interaction quirks. Each
335
+ * is narrowly scoped and can be removed once the upstream bug is fixed:
336
+ *
337
+ * 1. `output.codeSplitting` — Nitro 3.0.x sets this; Rolldown rejects it
338
+ * as an unknown key.
339
+ * 2. `output.manualChunks` — Nitro's default manual chunking crashes
340
+ * Nitro's prerender rebundle.
341
+ * 3. `output.chunkFileNames` — Nitro's chunk-name function produces
342
+ * route-derived `[token]` patterns which Rollup/Rolldown interprets as
343
+ * placeholders; we rewrite non-standard tokens to `_token_`.
344
+ */
345
+ function sanitizeNitroBundlerConfig(rollupConfig) {
346
+ const output = rollupConfig.output;
347
+ if (!output || Array.isArray(output) || typeof output !== "object") return;
348
+ const out = output;
349
+ if ("codeSplitting" in out) delete out["codeSplitting"];
350
+ if ("manualChunks" in out) delete out["manualChunks"];
351
+ const VALID_ROLLUP_PLACEHOLDER = /^\[(?:name|hash|format|ext)\]$/;
352
+ const chunkFileNames = out["chunkFileNames"];
353
+ if (typeof chunkFileNames === "function") {
354
+ const originalFn = chunkFileNames;
355
+ out["chunkFileNames"] = (...args) => {
356
+ const result = originalFn(...args);
357
+ if (typeof result !== "string") return result;
358
+ return result.replace(/\[[^\]]+\]/g, (match) => VALID_ROLLUP_PLACEHOLDER.test(match) ? match : `_${match.slice(1, -1)}_`);
359
+ };
360
+ }
361
+ }
362
+ /**
363
+ * Walks Nitro's resolved routeRules and stamps `x-analog-no-ssr: true` onto
364
+ * any rule with `ssr: false`, and `x-analog-no-streaming: true` onto any rule
365
+ * with `streaming: false`. Kept as response-header hints for downstream
366
+ * consumers (CDN, edge logic); the actual SSR short-circuit happens inside
367
+ * the SSR renderer virtual above, and the router falls back to a buffered
368
+ * render when it sees the streaming hint.
369
+ */
370
+ function injectAnalogRouteRuleHeaders(nitro) {
371
+ const routeRules = nitro.options.routeRules;
372
+ if (!routeRules) return;
373
+ for (const rule of Object.values(routeRules)) {
374
+ if (rule?.ssr === false) rule.headers = {
375
+ ...rule.headers,
376
+ "x-analog-no-ssr": "true"
377
+ };
378
+ if (rule?.streaming === false) rule.headers = {
379
+ ...rule.headers,
380
+ "x-analog-no-streaming": "true"
381
+ };
382
+ }
383
+ }
384
+ /**
385
+ * Builds the SSR service entry source. The wrapper imports the user's
386
+ * `main.server.ts` Angular renderer and adapts it to the `{ fetch(req) }`
387
+ * shape that nitro/vite's service mechanism expects.
388
+ */
389
+ function generateSsrEntryWrapper(entryServer, template) {
390
+ return `
391
+ // Import \`serverFetch\` from the root \`nitro\` entry rather than \`nitro/app\`.
392
+ // The /app subpath creates a fresh \`useNitroApp()\` instance scoped to the
393
+ // importing bundle, which in our setup is the standalone SSR vite bundle —
394
+ // it has no route handlers, so every fetch 404s. The root entry instead
395
+ // reads \`globalThis.__nitro__.{default,prerender}\`, which the surrounding
396
+ // Nitro server (prerender pass or production runtime) has already
397
+ // populated with the real app + handlers.
398
+ // Set \`ngServerMode\` before the Angular renderer and its app config evaluate,
399
+ // otherwise \`provideClientHydration()\` registers browser-only features such
400
+ // as event replay on the server.
401
+ import ${JSON.stringify(SERVER_MODE_ID)};
402
+ import { serverFetch as nitroServerFetch } from 'nitro';
403
+ import { createFetch } from 'ofetch';
404
+ import renderer from ${JSON.stringify(entryServer)};
405
+
406
+ const TEMPLATE = ${JSON.stringify(template)};
407
+
408
+ const normalizeRequestPath = (url) =>
409
+ url.replace(/\\/index\\.html(?=$|[?#])/, '/');
410
+
411
+ // In-process fetch wired into Nitro's request pipeline. Angular's HttpClient
412
+ // (via withFetch()) and Analog's injectLoad() call this during SSR/prerender
413
+ // so they hit the running app's page-endpoint and API routes without going
414
+ // through the network — the prerender pipeline doesn't have a listening
415
+ // socket. Without this, every SSR data fetch ECONNREFUSEs and Angular's
416
+ // router fails to resolve any data-bound route, producing an empty
417
+ // <router-outlet/> in the prerendered HTML.
418
+ const ssrFetch = (resource, init) => {
419
+ let url = typeof resource === 'string'
420
+ ? resource
421
+ : resource instanceof URL
422
+ ? resource.href
423
+ : resource.url;
424
+ // Relative URLs from injectAPIPrefix() etc. need a host for Nitro's
425
+ // Request constructor to accept them.
426
+ if (typeof url === 'string' && url.startsWith('/')) {
427
+ url = 'http://localhost' + url;
428
+ }
429
+ return nitroServerFetch(url, init);
430
+ };
431
+
432
+ // Wrap in ofetch so consumers that expect \`$fetch.raw()\` (the router's
433
+ // request-context interceptor short-circuits SSR HttpClient calls through
434
+ // \`globalThis.$fetch.raw\`) can call it. Set on globalThis so router code
435
+ // running inside the Angular renderer can find it.
436
+ const ssrOFetch = createFetch({ fetch: ssrFetch });
437
+ if (typeof globalThis.$fetch === 'undefined') {
438
+ globalThis.$fetch = ssrOFetch;
439
+ }
440
+
441
+ export default {
442
+ async fetch(req) {
443
+ const url = new URL(req.url);
444
+ const requestPath = normalizeRequestPath(url.pathname);
445
+ // Preserve the query string so Angular's router + injectQuery() and
446
+ // server data loaders that read from req.url see the full path+query.
447
+ const requestUrl = requestPath + url.search;
448
+
449
+ if (req.headers.get('x-analog-no-ssr') === 'true') {
450
+ return new Response(TEMPLATE, {
451
+ status: 200,
452
+ headers: { 'content-type': 'text/html; charset=utf-8' },
453
+ });
454
+ }
455
+
456
+ const reqShim = {
457
+ headers: Object.fromEntries(req.headers.entries()),
458
+ url: requestUrl,
459
+ originalUrl: requestUrl,
460
+ connection: {},
461
+ };
462
+
463
+ try {
464
+ const html = await renderer(requestUrl, TEMPLATE, {
465
+ req: reqShim,
466
+ // Pass the ofetch-wrapped fetch — INTERNAL_FETCH is consumed by the
467
+ // router's request-context interceptor via \`serverFetch.raw(...)\`,
468
+ // which is ofetch's response-shape API. Plain fetch lacks \`.raw\`
469
+ // and throws TypeError during prerender/SSR.
470
+ fetch: ssrOFetch,
471
+ });
472
+ return new Response(html, {
473
+ status: 200,
474
+ headers: { 'content-type': 'text/html; charset=utf-8' },
475
+ });
476
+ } catch (err) {
477
+ console.error('[analog ssr]', err);
478
+ return new Response(TEMPLATE, {
479
+ status: 500,
480
+ headers: { 'content-type': 'text/html; charset=utf-8' },
481
+ });
482
+ }
483
+ },
484
+ };
485
+ `;
486
+ }
487
+ async function wirePrerender(nitro, options, context, apiPrefix) {
488
+ const prerender = options.prerender;
489
+ if (!prerender && !options.i18n) return;
490
+ const { routes: collected, sitemaps: routeSitemaps, routeSourceFiles } = await collectRoutes(prerender?.routes, context, apiPrefix);
491
+ const expanded = options.i18n ? expandRoutesWithLocales(collected, {
492
+ defaultLocale: options.i18n.defaultLocale,
493
+ locales: options.i18n.locales
494
+ }) : collected;
495
+ const nitroPrerender = nitro.options.prerender ??= {};
496
+ nitroPrerender.routes ??= [];
497
+ nitroPrerender.routes.push(...expanded);
498
+ if (prerender?.discover ?? false) nitroPrerender.crawlLinks = true;
499
+ const prerendersRoot = nitroPrerender.routes.some((route) => route === "/");
500
+ if ((options.ssr ?? true) && prerendersRoot) nitro.hooks.hook("prerender:init", () => {
501
+ const publicDir = resolve(nitro.options.output.publicDir);
502
+ for (const extension of [
503
+ "",
504
+ ".br",
505
+ ".gz"
506
+ ]) {
507
+ const indexFile = resolve(publicDir, `index.html${extension}`);
508
+ if (existsSync(indexFile)) unlinkSync(indexFile);
509
+ }
510
+ });
511
+ if (prerender?.postRenderingHooks?.length) addPostRenderingHooks(nitro, prerender.postRenderingHooks);
512
+ if (Object.keys(routeSourceFiles).length > 0) nitro.hooks.hook("prerender:done", async () => {
513
+ const publicDir = resolve(nitro.options.output.publicDir);
514
+ const { mkdirSync, writeFileSync } = await import("node:fs");
515
+ const { dirname, join } = await import("node:path");
516
+ for (const [route, content] of Object.entries(routeSourceFiles)) {
517
+ const outputPath = join(publicDir, `${route}.md`);
518
+ mkdirSync(dirname(outputPath), { recursive: true });
519
+ writeFileSync(outputPath, content, "utf8");
520
+ }
521
+ });
522
+ const sitemapConfig = prerender?.sitemap;
523
+ if (sitemapConfig) nitro.hooks.hook("prerender:done", async (result) => {
524
+ await buildSitemap({}, sitemapConfig, (result?.prerenderedRoutes ?? []).map((r) => r.route), resolve(nitro.options.output.publicDir), routeSitemaps, { apiPrefix });
525
+ });
526
+ }
527
+ async function collectRoutes(routesInput, context, apiPrefix) {
528
+ const out = [];
529
+ const sitemaps = {};
530
+ const routeSourceFiles = {};
531
+ if (!routesInput) return {
532
+ routes: out,
533
+ sitemaps,
534
+ routeSourceFiles
535
+ };
536
+ const inputs = Array.isArray(routesInput) ? routesInput : typeof routesInput === "function" ? await routesInput() : [];
537
+ for (const entry of inputs) {
538
+ if (!entry) continue;
539
+ if (typeof entry === "string") {
540
+ out.push(entry);
541
+ continue;
542
+ }
543
+ if ("contentDir" in entry) {
544
+ const dir = entry;
545
+ const files = getMatchingContentFilesWithFrontMatter(context.workspaceRoot, context.rootDir, dir.contentDir, !!dir.recursive);
546
+ for (const file of files) {
547
+ const route = dir.transform(file);
548
+ if (route === false) continue;
549
+ out.push(route);
550
+ if (dir.sitemap) sitemaps[route] = typeof dir.sitemap === "function" ? dir.sitemap(file) : dir.sitemap;
551
+ if (dir.outputSourceFile) {
552
+ const sourceContent = dir.outputSourceFile(file);
553
+ if (typeof sourceContent === "string") routeSourceFiles[route] = sourceContent;
554
+ }
555
+ }
556
+ continue;
557
+ }
558
+ if ("route" in entry) {
559
+ const cfg = entry;
560
+ out.push(cfg.route);
561
+ if (cfg.sitemap) sitemaps[cfg.route] = cfg.sitemap;
562
+ if (cfg.outputSourceFile) {
563
+ const sourcePath = resolve(context.workspaceRoot, context.rootDir, cfg.outputSourceFile);
564
+ if (existsSync(sourcePath)) routeSourceFiles[cfg.route] = readFileSync(sourcePath, "utf8");
565
+ }
566
+ if (cfg.staticData) {
567
+ const prefix = apiPrefix.startsWith("/") ? apiPrefix : `/${apiPrefix}`;
568
+ const route = cfg.route.startsWith("/") ? cfg.route : `/${cfg.route}`;
569
+ out.push(`${prefix}/_analog/pages${route}`);
570
+ }
571
+ }
572
+ }
573
+ return {
574
+ routes: out,
575
+ sitemaps,
576
+ routeSourceFiles
577
+ };
578
+ }
579
+ //#endregion
580
+ export { analogNitroPlugin };
581
+
582
+ //# sourceMappingURL=analog-nitro-plugin.js.map