@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,94 @@
1
+ import { deriveServerFnId } from "./server-fn-id.js";
2
+ import { parseSync } from "oxc-parser";
3
+ import MagicString from "magic-string";
4
+ //#region packages/platform/src/lib/inject-server-fn-ids.ts
5
+ var SERVER_FN_SOURCE = "@analogjs/router/server";
6
+ /**
7
+ * Server/SSR-build transform: injects the derived `id` into each
8
+ * `export const NAME = serverFn(config, handler)` so the function registers
9
+ * under the same opaque id the client proxy dispatches to. Unlike the client
10
+ * scrub this keeps the handler and every other statement intact — it only edits
11
+ * the config object — so the server module still runs the real implementation.
12
+ *
13
+ * Returns `null` when the module defines no server function.
14
+ */
15
+ function injectServerFnIds(code, fileId) {
16
+ if (!code.includes("serverFn")) return null;
17
+ const { program } = parseSync(fileId, code);
18
+ const body = program.body;
19
+ const serverFnLocalNames = collectServerFnLocalNames(body);
20
+ const magic = new MagicString(code);
21
+ const ids = [];
22
+ for (const node of body) {
23
+ if (node.type !== "ExportNamedDeclaration" || node.declaration?.type !== "VariableDeclaration") continue;
24
+ for (const declarator of node.declaration.declarations) {
25
+ if (declarator.id?.type !== "Identifier" || declarator.init?.type !== "CallExpression" || declarator.init.callee?.type !== "Identifier" || !serverFnLocalNames.has(declarator.init.callee.name)) continue;
26
+ const name = declarator.id.name;
27
+ const id = deriveServerFnId(fileId, name);
28
+ ids.push({
29
+ name,
30
+ id
31
+ });
32
+ const args = declarator.init.arguments ?? [];
33
+ const arg0 = args[0];
34
+ const idProp = `id: ${JSON.stringify(id)}`;
35
+ if (arg0?.type === "ObjectExpression") {
36
+ assertMethodInputCompatible(arg0, name, fileId);
37
+ injectId(magic, arg0, id);
38
+ } else if (isFunctionNode(arg0)) magic.appendLeft(arg0.start, `{ ${idProp} }, `);
39
+ else if (arg0 && args.length >= 2) {
40
+ magic.appendLeft(arg0.start, `{ ${idProp}, input: `);
41
+ magic.appendRight(arg0.end, ` }`);
42
+ } else throw new Error(`[analog] serverFn "${name}" in ${fileId} must be called as serverFn(handler), serverFn(schema, handler), or serverFn(config, handler).`);
43
+ }
44
+ }
45
+ if (ids.length === 0) return null;
46
+ return {
47
+ code: magic.toString(),
48
+ ids
49
+ };
50
+ }
51
+ /**
52
+ * Insert (or replace) `id: "<derived>"` in the config object. Authors do not
53
+ * supply an id; a stray one is overwritten so the route is always the derived,
54
+ * non-enumerable digest — never an author-controlled value.
55
+ */
56
+ function injectId(magic, configArg, id) {
57
+ const existing = (configArg.properties ?? []).find((prop) => prop.type === "Property" && (prop.key?.type === "Identifier" ? prop.key.name : prop.key?.value) === "id");
58
+ if (existing) {
59
+ magic.overwrite(existing.value.start, existing.value.end, JSON.stringify(id));
60
+ return;
61
+ }
62
+ magic.appendRight(configArg.start + 1, ` id: ${JSON.stringify(id)},`);
63
+ }
64
+ /**
65
+ * Reject `method: 'GET'` alongside an `input` schema at build time: GET carries
66
+ * no body, so a GET function can never receive validated input.
67
+ */
68
+ function assertMethodInputCompatible(configArg, name, fileId) {
69
+ let method;
70
+ let hasInput = false;
71
+ for (const prop of configArg.properties ?? []) {
72
+ if (prop.type !== "Property") continue;
73
+ const key = prop.key?.type === "Identifier" ? prop.key.name : prop.key?.value;
74
+ if (key === "method" && prop.value?.type === "Literal") method = prop.value.value;
75
+ else if (key === "input") hasInput = true;
76
+ }
77
+ if (method === "GET" && hasInput) throw new Error(`[analog] serverFn "${name}" in ${fileId} declares method: 'GET' with an input schema; GET carries no body. Use POST (the default when input is present) or drop the input.`);
78
+ }
79
+ function isFunctionNode(node) {
80
+ return node?.type === "ArrowFunctionExpression" || node?.type === "FunctionExpression";
81
+ }
82
+ function collectServerFnLocalNames(body) {
83
+ const names = /* @__PURE__ */ new Set();
84
+ for (const node of body) {
85
+ if (node.type !== "ImportDeclaration" || node.source?.value !== SERVER_FN_SOURCE) continue;
86
+ for (const spec of node.specifiers ?? []) if (spec.type === "ImportSpecifier" && spec.imported?.name === "serverFn") names.add(spec.local.name);
87
+ }
88
+ if (names.size === 0) names.add("serverFn");
89
+ return names;
90
+ }
91
+ //#endregion
92
+ export { injectServerFnIds };
93
+
94
+ //# sourceMappingURL=inject-server-fn-ids.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inject-server-fn-ids.js","names":[],"sources":["../../../src/lib/inject-server-fn-ids.ts"],"sourcesContent":["import MagicString from 'magic-string';\nimport { parseSync } from 'oxc-parser';\n\nimport { deriveServerFnId } from './server-fn-id.js';\n\nconst SERVER_FN_SOURCE = '@analogjs/router/server';\n\nexport interface InjectServerFnIdsResult {\n code: string;\n ids: { name: string; id: string }[];\n}\n\n/**\n * Server/SSR-build transform: injects the derived `id` into each\n * `export const NAME = serverFn(config, handler)` so the function registers\n * under the same opaque id the client proxy dispatches to. Unlike the client\n * scrub this keeps the handler and every other statement intact — it only edits\n * the config object — so the server module still runs the real implementation.\n *\n * Returns `null` when the module defines no server function.\n */\nexport function injectServerFnIds(\n code: string,\n fileId: string,\n): InjectServerFnIdsResult | null {\n if (!code.includes('serverFn')) {\n return null;\n }\n\n const { program } = parseSync(fileId, code);\n const body = (program as { body: any[] }).body;\n const serverFnLocalNames = collectServerFnLocalNames(body);\n\n const magic = new MagicString(code);\n const ids: { name: string; id: string }[] = [];\n\n for (const node of body) {\n if (\n node.type !== 'ExportNamedDeclaration' ||\n node.declaration?.type !== 'VariableDeclaration'\n ) {\n continue;\n }\n for (const declarator of node.declaration.declarations) {\n if (\n declarator.id?.type !== 'Identifier' ||\n declarator.init?.type !== 'CallExpression' ||\n declarator.init.callee?.type !== 'Identifier' ||\n !serverFnLocalNames.has(declarator.init.callee.name)\n ) {\n continue;\n }\n\n const name = declarator.id.name;\n const id = deriveServerFnId(fileId, name);\n ids.push({ name, id });\n\n const args = declarator.init.arguments ?? [];\n const arg0 = args[0];\n const idProp = `id: ${JSON.stringify(id)}`;\n\n if (arg0?.type === 'ObjectExpression') {\n // serverFn({ … }, handler) — inject the id into the config object.\n assertMethodInputCompatible(arg0, name, fileId);\n injectId(magic, arg0, id);\n } else if (isFunctionNode(arg0)) {\n // serverFn(handler) — synthesize a config: `{ id }, handler`.\n magic.appendLeft(arg0.start, `{ ${idProp} }, `);\n } else if (arg0 && args.length >= 2) {\n // serverFn(schema, handler) — wrap the schema into `{ id, input: <schema> }`.\n magic.appendLeft(arg0.start, `{ ${idProp}, input: `);\n magic.appendRight(arg0.end, ` }`);\n } else {\n throw new Error(\n `[analog] serverFn \"${name}\" in ${fileId} must be called as serverFn(handler), serverFn(schema, handler), or serverFn(config, handler).`,\n );\n }\n }\n }\n\n if (ids.length === 0) {\n return null;\n }\n\n return { code: magic.toString(), ids };\n}\n\n/**\n * Insert (or replace) `id: \"<derived>\"` in the config object. Authors do not\n * supply an id; a stray one is overwritten so the route is always the derived,\n * non-enumerable digest — never an author-controlled value.\n */\nfunction injectId(magic: MagicString, configArg: any, id: string): void {\n const existing = (configArg.properties ?? []).find(\n (prop: any) =>\n prop.type === 'Property' &&\n (prop.key?.type === 'Identifier' ? prop.key.name : prop.key?.value) ===\n 'id',\n );\n\n if (existing) {\n magic.overwrite(\n existing.value.start,\n existing.value.end,\n JSON.stringify(id),\n );\n return;\n }\n\n // Insert as the first property, right after the opening brace.\n magic.appendRight(configArg.start + 1, ` id: ${JSON.stringify(id)},`);\n}\n\n/**\n * Reject `method: 'GET'` alongside an `input` schema at build time: GET carries\n * no body, so a GET function can never receive validated input.\n */\nfunction assertMethodInputCompatible(\n configArg: any,\n name: string,\n fileId: string,\n): void {\n let method: string | undefined;\n let hasInput = false;\n for (const prop of configArg.properties ?? []) {\n if (prop.type !== 'Property') continue;\n const key =\n prop.key?.type === 'Identifier' ? prop.key.name : prop.key?.value;\n if (key === 'method' && prop.value?.type === 'Literal') {\n method = prop.value.value;\n } else if (key === 'input') {\n hasInput = true;\n }\n }\n if (method === 'GET' && hasInput) {\n throw new Error(\n `[analog] serverFn \"${name}\" in ${fileId} declares method: 'GET' with an input schema; GET carries no body. Use POST (the default when input is present) or drop the input.`,\n );\n }\n}\n\nfunction isFunctionNode(node: any): boolean {\n return (\n node?.type === 'ArrowFunctionExpression' ||\n node?.type === 'FunctionExpression'\n );\n}\n\nfunction collectServerFnLocalNames(body: any[]): Set<string> {\n const names = new Set<string>();\n for (const node of body) {\n if (\n node.type !== 'ImportDeclaration' ||\n node.source?.value !== SERVER_FN_SOURCE\n ) {\n continue;\n }\n for (const spec of node.specifiers ?? []) {\n if (\n spec.type === 'ImportSpecifier' &&\n spec.imported?.name === 'serverFn'\n ) {\n names.add(spec.local.name);\n }\n }\n }\n if (names.size === 0) {\n names.add('serverFn');\n }\n return names;\n}\n"],"mappings":";;;;AAKA,IAAM,mBAAmB;;;;;;;;;;AAgBzB,SAAgB,kBACd,MACA,QACgC;AAChC,KAAI,CAAC,KAAK,SAAS,WAAW,CAC5B,QAAO;CAGT,MAAM,EAAE,YAAY,UAAU,QAAQ,KAAK;CAC3C,MAAM,OAAQ,QAA4B;CAC1C,MAAM,qBAAqB,0BAA0B,KAAK;CAE1D,MAAM,QAAQ,IAAI,YAAY,KAAK;CACnC,MAAM,MAAsC,EAAE;AAE9C,MAAK,MAAM,QAAQ,MAAM;AACvB,MACE,KAAK,SAAS,4BACd,KAAK,aAAa,SAAS,sBAE3B;AAEF,OAAK,MAAM,cAAc,KAAK,YAAY,cAAc;AACtD,OACE,WAAW,IAAI,SAAS,gBACxB,WAAW,MAAM,SAAS,oBAC1B,WAAW,KAAK,QAAQ,SAAS,gBACjC,CAAC,mBAAmB,IAAI,WAAW,KAAK,OAAO,KAAK,CAEpD;GAGF,MAAM,OAAO,WAAW,GAAG;GAC3B,MAAM,KAAK,iBAAiB,QAAQ,KAAK;AACzC,OAAI,KAAK;IAAE;IAAM;IAAI,CAAC;GAEtB,MAAM,OAAO,WAAW,KAAK,aAAa,EAAE;GAC5C,MAAM,OAAO,KAAK;GAClB,MAAM,SAAS,OAAO,KAAK,UAAU,GAAG;AAExC,OAAI,MAAM,SAAS,oBAAoB;AAErC,gCAA4B,MAAM,MAAM,OAAO;AAC/C,aAAS,OAAO,MAAM,GAAG;cAChB,eAAe,KAAK,CAE7B,OAAM,WAAW,KAAK,OAAO,KAAK,OAAO,MAAM;YACtC,QAAQ,KAAK,UAAU,GAAG;AAEnC,UAAM,WAAW,KAAK,OAAO,KAAK,OAAO,WAAW;AACpD,UAAM,YAAY,KAAK,KAAK,KAAK;SAEjC,OAAM,IAAI,MACR,sBAAsB,KAAK,OAAO,OAAO,gGAC1C;;;AAKP,KAAI,IAAI,WAAW,EACjB,QAAO;AAGT,QAAO;EAAE,MAAM,MAAM,UAAU;EAAE;EAAK;;;;;;;AAQxC,SAAS,SAAS,OAAoB,WAAgB,IAAkB;CACtE,MAAM,YAAY,UAAU,cAAc,EAAE,EAAE,MAC3C,SACC,KAAK,SAAS,eACb,KAAK,KAAK,SAAS,eAAe,KAAK,IAAI,OAAO,KAAK,KAAK,WAC3D,KACL;AAED,KAAI,UAAU;AACZ,QAAM,UACJ,SAAS,MAAM,OACf,SAAS,MAAM,KACf,KAAK,UAAU,GAAG,CACnB;AACD;;AAIF,OAAM,YAAY,UAAU,QAAQ,GAAG,QAAQ,KAAK,UAAU,GAAG,CAAC,GAAG;;;;;;AAOvE,SAAS,4BACP,WACA,MACA,QACM;CACN,IAAI;CACJ,IAAI,WAAW;AACf,MAAK,MAAM,QAAQ,UAAU,cAAc,EAAE,EAAE;AAC7C,MAAI,KAAK,SAAS,WAAY;EAC9B,MAAM,MACJ,KAAK,KAAK,SAAS,eAAe,KAAK,IAAI,OAAO,KAAK,KAAK;AAC9D,MAAI,QAAQ,YAAY,KAAK,OAAO,SAAS,UAC3C,UAAS,KAAK,MAAM;WACX,QAAQ,QACjB,YAAW;;AAGf,KAAI,WAAW,SAAS,SACtB,OAAM,IAAI,MACR,sBAAsB,KAAK,OAAO,OAAO,oIAC1C;;AAIL,SAAS,eAAe,MAAoB;AAC1C,QACE,MAAM,SAAS,6BACf,MAAM,SAAS;;AAInB,SAAS,0BAA0B,MAA0B;CAC3D,MAAM,wBAAQ,IAAI,KAAa;AAC/B,MAAK,MAAM,QAAQ,MAAM;AACvB,MACE,KAAK,SAAS,uBACd,KAAK,QAAQ,UAAU,iBAEvB;AAEF,OAAK,MAAM,QAAQ,KAAK,cAAc,EAAE,CACtC,KACE,KAAK,SAAS,qBACd,KAAK,UAAU,SAAS,WAExB,OAAM,IAAI,KAAK,MAAM,KAAK;;AAIhC,KAAI,MAAM,SAAS,EACjB,OAAM,IAAI,WAAW;AAEvB,QAAO"}
@@ -0,0 +1,41 @@
1
+ import { type JsonLdObject } from "./route-manifest.js";
2
+ export type JsonLdModuleManifestEntry = {
3
+ kind: "module";
4
+ routePath: string;
5
+ sourceFile: string;
6
+ importAlias: string;
7
+ };
8
+ export type JsonLdContentManifestEntry = {
9
+ kind: "content";
10
+ routePath: string;
11
+ sourceFile: string;
12
+ jsonLd: JsonLdObject[];
13
+ };
14
+ export type JsonLdManifestEntry = JsonLdModuleManifestEntry | JsonLdContentManifestEntry;
15
+ /**
16
+ * Heuristic detector for JSON-LD exports in route modules.
17
+ *
18
+ * This is intentionally regex-based for speed during file scanning.
19
+ * It reliably detects these direct export patterns:
20
+ *
21
+ * - `export const routeJsonLd = ...`
22
+ * - `export const routeMeta = { ..., jsonLd: ... }`
23
+ * - `export const routeJsonLd = (route) => ...` (function form)
24
+ *
25
+ * Known limitations (not detected):
26
+ *
27
+ * - re-exports: `export { routeJsonLd } from './data'`
28
+ * - aliased exports: `export { something as routeJsonLd }`
29
+ * - default exports: `export default { jsonLd: ... }`
30
+ * - indirect assignment: `const data = { jsonLd: ... }; export const routeMeta = data`
31
+ *
32
+ * Known false-positive risks:
33
+ *
34
+ * - comment text containing `export const routeJsonLd`
35
+ * - unrelated `jsonLd` text appearing after `export const routeMeta`
36
+ *
37
+ * Prefer the supported direct export patterns listed above.
38
+ */
39
+ export declare function detectJsonLdModuleExports(fileContent: string): boolean;
40
+ export declare function extractMarkdownJsonLd(rawContent: string): JsonLdObject[];
41
+ export declare function generateJsonLdManifestSource(entries: JsonLdManifestEntry[], outFile: string): string;
@@ -0,0 +1,84 @@
1
+ import { normalizeJsonLd } from "./route-manifest.js";
2
+ import { dirname, relative } from "node:path";
3
+ import { normalizePath } from "vite";
4
+ import fm from "front-matter";
5
+ //#region packages/platform/src/lib/json-ld-manifest-plugin.ts
6
+ /**
7
+ * Heuristic detector for JSON-LD exports in route modules.
8
+ *
9
+ * This is intentionally regex-based for speed during file scanning.
10
+ * It reliably detects these direct export patterns:
11
+ *
12
+ * - `export const routeJsonLd = ...`
13
+ * - `export const routeMeta = { ..., jsonLd: ... }`
14
+ * - `export const routeJsonLd = (route) => ...` (function form)
15
+ *
16
+ * Known limitations (not detected):
17
+ *
18
+ * - re-exports: `export { routeJsonLd } from './data'`
19
+ * - aliased exports: `export { something as routeJsonLd }`
20
+ * - default exports: `export default { jsonLd: ... }`
21
+ * - indirect assignment: `const data = { jsonLd: ... }; export const routeMeta = data`
22
+ *
23
+ * Known false-positive risks:
24
+ *
25
+ * - comment text containing `export const routeJsonLd`
26
+ * - unrelated `jsonLd` text appearing after `export const routeMeta`
27
+ *
28
+ * Prefer the supported direct export patterns listed above.
29
+ */
30
+ function detectJsonLdModuleExports(fileContent) {
31
+ return /export\s+const\s+routeJsonLd\b/.test(fileContent) || /export\s+const\s+routeMeta\b[\s\S]*?\bjsonLd\b/.test(fileContent);
32
+ }
33
+ function extractMarkdownJsonLd(rawContent) {
34
+ const { attributes } = fm(rawContent);
35
+ return normalizeJsonLd(attributes["jsonLd"]);
36
+ }
37
+ function generateJsonLdManifestSource(entries, outFile) {
38
+ const lines = [];
39
+ const moduleEntries = entries.filter((entry) => entry.kind === "module");
40
+ lines.push("// This file is auto-generated by @analogjs/platform");
41
+ lines.push("// Do not edit manually");
42
+ lines.push("");
43
+ lines.push("import type { Graph, Thing, WithContext } from 'schema-dts';");
44
+ moduleEntries.forEach((entry) => {
45
+ lines.push(`import * as ${entry.importAlias} from '${toImportPath(outFile, entry.sourceFile)}';`);
46
+ });
47
+ lines.push("");
48
+ lines.push("export type AnalogJsonLdDocument = WithContext<Thing> | Graph | Array<WithContext<Thing>>;");
49
+ lines.push("export type GeneratedJsonLdManifestEntry = { routePath: string; sourceFile: string; kind: 'module' | 'content'; resolveJsonLd: () => AnalogJsonLdDocument[]; };");
50
+ lines.push("");
51
+ lines.push("function normalizeJsonLd(value: unknown): AnalogJsonLdDocument[] {");
52
+ lines.push(" if (Array.isArray(value)) {");
53
+ lines.push(" return value.filter((entry): entry is AnalogJsonLdDocument => typeof entry === 'object' && entry !== null && !Array.isArray(entry));");
54
+ lines.push(" }");
55
+ lines.push("");
56
+ lines.push(" return typeof value === 'object' && value !== null ? [value as AnalogJsonLdDocument] : [];");
57
+ lines.push("}");
58
+ lines.push("");
59
+ lines.push("function resolveModuleJsonLd(routeModule: unknown): AnalogJsonLdDocument[] {");
60
+ lines.push(" const typedRouteModule = routeModule as { routeJsonLd?: unknown; routeMeta?: { jsonLd?: unknown } };");
61
+ lines.push(" return normalizeJsonLd(typedRouteModule.routeMeta?.jsonLd ?? typedRouteModule.routeJsonLd);");
62
+ lines.push("}");
63
+ lines.push("");
64
+ lines.push("export const routeJsonLdManifest = new Map<string, GeneratedJsonLdManifestEntry>([");
65
+ entries.forEach((entry) => {
66
+ if (entry.kind === "module") {
67
+ lines.push(` ['${entry.routePath}', { routePath: '${entry.routePath}', sourceFile: '${entry.sourceFile}', kind: 'module', resolveJsonLd: () => resolveModuleJsonLd(${entry.importAlias}) }],`);
68
+ return;
69
+ }
70
+ lines.push(` ['${entry.routePath}', { routePath: '${entry.routePath}', sourceFile: '${entry.sourceFile}', kind: 'content', resolveJsonLd: () => ${JSON.stringify(entry.jsonLd)} }],`);
71
+ });
72
+ lines.push("]);");
73
+ lines.push("");
74
+ return lines.join("\n");
75
+ }
76
+ function toImportPath(outFile, sourceFile) {
77
+ const relativePath = normalizePath(relative(dirname(outFile), sourceFile.replace(/^\//, "").replace(/\.(ts|js|analog|ag)$/, "")));
78
+ if (relativePath.startsWith(".")) return relativePath;
79
+ return `./${relativePath}`;
80
+ }
81
+ //#endregion
82
+ export { detectJsonLdModuleExports, extractMarkdownJsonLd, generateJsonLdManifestSource };
83
+
84
+ //# sourceMappingURL=json-ld-manifest-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-ld-manifest-plugin.js","names":[],"sources":["../../../src/lib/json-ld-manifest-plugin.ts"],"sourcesContent":["import fm from 'front-matter';\nimport { normalizePath } from 'vite';\nimport { dirname, relative } from 'node:path';\n\nimport { normalizeJsonLd, type JsonLdObject } from './route-manifest.js';\n\nexport type JsonLdModuleManifestEntry = {\n kind: 'module';\n routePath: string;\n sourceFile: string;\n importAlias: string;\n};\n\nexport type JsonLdContentManifestEntry = {\n kind: 'content';\n routePath: string;\n sourceFile: string;\n jsonLd: JsonLdObject[];\n};\n\nexport type JsonLdManifestEntry =\n | JsonLdModuleManifestEntry\n | JsonLdContentManifestEntry;\n\n/**\n * Heuristic detector for JSON-LD exports in route modules.\n *\n * This is intentionally regex-based for speed during file scanning.\n * It reliably detects these direct export patterns:\n *\n * - `export const routeJsonLd = ...`\n * - `export const routeMeta = { ..., jsonLd: ... }`\n * - `export const routeJsonLd = (route) => ...` (function form)\n *\n * Known limitations (not detected):\n *\n * - re-exports: `export { routeJsonLd } from './data'`\n * - aliased exports: `export { something as routeJsonLd }`\n * - default exports: `export default { jsonLd: ... }`\n * - indirect assignment: `const data = { jsonLd: ... }; export const routeMeta = data`\n *\n * Known false-positive risks:\n *\n * - comment text containing `export const routeJsonLd`\n * - unrelated `jsonLd` text appearing after `export const routeMeta`\n *\n * Prefer the supported direct export patterns listed above.\n */\nexport function detectJsonLdModuleExports(fileContent: string): boolean {\n return (\n /export\\s+const\\s+routeJsonLd\\b/.test(fileContent) ||\n /export\\s+const\\s+routeMeta\\b[\\s\\S]*?\\bjsonLd\\b/.test(fileContent)\n );\n}\n\nexport function extractMarkdownJsonLd(rawContent: string): JsonLdObject[] {\n const { attributes } = fm<Record<string, unknown>>(rawContent);\n return normalizeJsonLd(attributes['jsonLd']);\n}\n\nexport function generateJsonLdManifestSource(\n entries: JsonLdManifestEntry[],\n outFile: string,\n): string {\n const lines: string[] = [];\n const moduleEntries = entries.filter(\n (entry): entry is JsonLdModuleManifestEntry => entry.kind === 'module',\n );\n\n lines.push('// This file is auto-generated by @analogjs/platform');\n lines.push('// Do not edit manually');\n lines.push('');\n\n lines.push(\"import type { Graph, Thing, WithContext } from 'schema-dts';\");\n\n moduleEntries.forEach((entry) => {\n lines.push(\n `import * as ${entry.importAlias} from '${toImportPath(outFile, entry.sourceFile)}';`,\n );\n });\n\n lines.push('');\n lines.push(\n 'export type AnalogJsonLdDocument = WithContext<Thing> | Graph | Array<WithContext<Thing>>;',\n );\n lines.push(\n \"export type GeneratedJsonLdManifestEntry = { routePath: string; sourceFile: string; kind: 'module' | 'content'; resolveJsonLd: () => AnalogJsonLdDocument[]; };\",\n );\n lines.push('');\n lines.push(\n 'function normalizeJsonLd(value: unknown): AnalogJsonLdDocument[] {',\n );\n lines.push(' if (Array.isArray(value)) {');\n lines.push(\n \" return value.filter((entry): entry is AnalogJsonLdDocument => typeof entry === 'object' && entry !== null && !Array.isArray(entry));\",\n );\n lines.push(' }');\n lines.push('');\n lines.push(\n \" return typeof value === 'object' && value !== null ? [value as AnalogJsonLdDocument] : [];\",\n );\n lines.push('}');\n lines.push('');\n lines.push(\n 'function resolveModuleJsonLd(routeModule: unknown): AnalogJsonLdDocument[] {',\n );\n lines.push(\n ' const typedRouteModule = routeModule as { routeJsonLd?: unknown; routeMeta?: { jsonLd?: unknown } };',\n );\n lines.push(\n // Match runtime precedence (mergeRouteJsonLdIntoRouteMeta in routes.ts):\n // routeMeta.jsonLd wins over standalone routeJsonLd.\n ' return normalizeJsonLd(typedRouteModule.routeMeta?.jsonLd ?? typedRouteModule.routeJsonLd);',\n );\n lines.push('}');\n lines.push('');\n lines.push(\n 'export const routeJsonLdManifest = new Map<string, GeneratedJsonLdManifestEntry>([',\n );\n\n entries.forEach((entry) => {\n if (entry.kind === 'module') {\n lines.push(\n ` ['${entry.routePath}', { routePath: '${entry.routePath}', sourceFile: '${entry.sourceFile}', kind: 'module', resolveJsonLd: () => resolveModuleJsonLd(${entry.importAlias}) }],`,\n );\n return;\n }\n\n lines.push(\n ` ['${entry.routePath}', { routePath: '${entry.routePath}', sourceFile: '${entry.sourceFile}', kind: 'content', resolveJsonLd: () => ${JSON.stringify(entry.jsonLd)} }],`,\n );\n });\n\n lines.push(']);');\n lines.push('');\n\n return lines.join('\\n');\n}\n\nfunction toImportPath(outFile: string, sourceFile: string): string {\n // JSON-LD entries are emitted inside the same generated route module, so\n // imports are always resolved relative to that single output file.\n const fromDir = dirname(outFile);\n const sourceNoExt = sourceFile\n .replace(/^\\//, '')\n .replace(/\\.(ts|js|analog|ag)$/, '');\n const relativePath = normalizePath(relative(fromDir, sourceNoExt));\n\n if (relativePath.startsWith('.')) {\n return relativePath;\n }\n\n return `./${relativePath}`;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgDA,SAAgB,0BAA0B,aAA8B;AACtE,QACE,iCAAiC,KAAK,YAAY,IAClD,iDAAiD,KAAK,YAAY;;AAItE,SAAgB,sBAAsB,YAAoC;CACxE,MAAM,EAAE,eAAe,GAA4B,WAAW;AAC9D,QAAO,gBAAgB,WAAW,UAAU;;AAG9C,SAAgB,6BACd,SACA,SACQ;CACR,MAAM,QAAkB,EAAE;CAC1B,MAAM,gBAAgB,QAAQ,QAC3B,UAA8C,MAAM,SAAS,SAC/D;AAED,OAAM,KAAK,uDAAuD;AAClE,OAAM,KAAK,0BAA0B;AACrC,OAAM,KAAK,GAAG;AAEd,OAAM,KAAK,+DAA+D;AAE1E,eAAc,SAAS,UAAU;AAC/B,QAAM,KACJ,eAAe,MAAM,YAAY,SAAS,aAAa,SAAS,MAAM,WAAW,CAAC,IACnF;GACD;AAEF,OAAM,KAAK,GAAG;AACd,OAAM,KACJ,6FACD;AACD,OAAM,KACJ,kKACD;AACD,OAAM,KAAK,GAAG;AACd,OAAM,KACJ,qEACD;AACD,OAAM,KAAK,gCAAgC;AAC3C,OAAM,KACJ,2IACD;AACD,OAAM,KAAK,MAAM;AACjB,OAAM,KAAK,GAAG;AACd,OAAM,KACJ,+FACD;AACD,OAAM,KAAK,IAAI;AACf,OAAM,KAAK,GAAG;AACd,OAAM,KACJ,+EACD;AACD,OAAM,KACJ,yGACD;AACD,OAAM,KAGJ,gGACD;AACD,OAAM,KAAK,IAAI;AACf,OAAM,KAAK,GAAG;AACd,OAAM,KACJ,qFACD;AAED,SAAQ,SAAS,UAAU;AACzB,MAAI,MAAM,SAAS,UAAU;AAC3B,SAAM,KACJ,OAAO,MAAM,UAAU,mBAAmB,MAAM,UAAU,kBAAkB,MAAM,WAAW,8DAA8D,MAAM,YAAY,OAC9K;AACD;;AAGF,QAAM,KACJ,OAAO,MAAM,UAAU,mBAAmB,MAAM,UAAU,kBAAkB,MAAM,WAAW,2CAA2C,KAAK,UAAU,MAAM,OAAO,CAAC,MACtK;GACD;AAEF,OAAM,KAAK,MAAM;AACjB,OAAM,KAAK,GAAG;AAEd,QAAO,MAAM,KAAK,KAAK;;AAGzB,SAAS,aAAa,SAAiB,YAA4B;CAOjE,MAAM,eAAe,cAAc,SAJnB,QAAQ,QAAQ,EACZ,WACjB,QAAQ,OAAO,GAAG,CAClB,QAAQ,wBAAwB,GAAG,CAC2B,CAAC;AAElE,KAAI,aAAa,WAAW,IAAI,CAC9B,QAAO;AAGT,QAAO,KAAK"}
@@ -0,0 +1,18 @@
1
+ import type { Nitro } from "nitro/types";
2
+ import type { Plugin } from "vite";
3
+ import type { Options } from "../options.js";
4
+ /**
5
+ * Analog's NitroModule. Plug it into the Vite plugin chain alongside
6
+ * `nitro()` from `nitro/vite`; nitro/vite picks up the `.nitro` property
7
+ * and runs `setup(nitro)` once the Nitro instance is ready.
8
+ */
9
+ export declare function analogNitroPlugin(options?: Options): Plugin;
10
+ /**
11
+ * Walks Nitro's resolved routeRules and stamps `x-analog-no-ssr: true` onto
12
+ * any rule with `ssr: false`, and `x-analog-no-streaming: true` onto any rule
13
+ * with `streaming: false`. Kept as response-header hints for downstream
14
+ * consumers (CDN, edge logic); the actual SSR short-circuit happens inside
15
+ * the SSR renderer virtual above, and the router falls back to a buffered
16
+ * render when it sees the streaming hint.
17
+ */
18
+ export declare function injectAnalogRouteRuleHeaders(nitro: Nitro): void;