fimo 0.7.0-experimental.2 → 0.7.0-experimental.4

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 (384) hide show
  1. package/README.md +1 -1
  2. package/assets/content-templates/hooks-template.eta +27 -73
  3. package/assets/content-templates/types-template.eta +1 -4
  4. package/assets/skills/fimo/SKILL.md +2 -2
  5. package/assets/skills/fimo/references/content.md +42 -46
  6. package/assets/skills/fimo/references/locales.md +0 -8
  7. package/assets/skills/fimo/references/setup-react-router.md +2 -2
  8. package/assets/skills/fimo/references/ui.md +1 -1
  9. package/assets/skills/fimo-cli/references/content.md +14 -17
  10. package/assets/skills/fimo-cli/references/domains.md +1 -1
  11. package/assets/skills/fimo-cli/references/locales.md +0 -6
  12. package/assets/skills/fimo-migration/SKILL.md +22 -2
  13. package/assets/skills/fimo-migration/references/content.md +8 -0
  14. package/assets/skills/fimo-migration/references/manifest.md +35 -0
  15. package/assets/skills/fimo-migration/references/qa.md +24 -2
  16. package/assets/skills/fimo-migration/references/workflow.md +12 -1
  17. package/assets/skills/fimo-migration/references/wrap.md +582 -0
  18. package/assets/skills/fimo-studio/references/custom-domains.md +1 -1
  19. package/assets/skills/fimo-studio/references/visual-editing.md +5 -3
  20. package/dist/build/vite/index.d.ts.map +1 -0
  21. package/dist/build/vite/plugins/content-sync.d.ts.map +1 -0
  22. package/dist/build/vite/plugins/content-sync.test.d.ts +2 -0
  23. package/dist/build/vite/plugins/content-sync.test.d.ts.map +1 -0
  24. package/dist/build/vite/plugins/content-sync.test.js +64 -0
  25. package/dist/build/vite/plugins/data-id.d.ts.map +1 -0
  26. package/dist/build/vite/plugins/fimo-config.d.ts.map +1 -0
  27. package/dist/build/vite/plugins/fimo-config.test.d.ts +2 -0
  28. package/dist/build/vite/plugins/fimo-config.test.d.ts.map +1 -0
  29. package/dist/build/vite/plugins/fimo-config.test.js +46 -0
  30. package/dist/build/vite/plugins/overlay.d.ts.map +1 -0
  31. package/dist/build/vite/plugins/robots.d.ts.map +1 -0
  32. package/dist/build/vite/plugins/seo.d.ts.map +1 -0
  33. package/dist/build/vite/plugins/server-config.d.ts.map +1 -0
  34. package/dist/build/vite/plugins/sitemap.d.ts.map +1 -0
  35. package/dist/build/vite/plugins/translations.d.ts +2 -8
  36. package/dist/build/vite/plugins/translations.d.ts.map +1 -0
  37. package/dist/build/vite/plugins/translations.js +3 -121
  38. package/dist/build/vite/plugins/translations.test.d.ts +2 -0
  39. package/dist/build/vite/plugins/translations.test.d.ts.map +1 -0
  40. package/dist/build/vite/plugins/translations.test.js +266 -0
  41. package/dist/cli/bundle.json +2 -3
  42. package/dist/cli/index.js +117939 -1186
  43. package/dist/runtime/app/FimoProviders.d.ts +1 -11
  44. package/dist/runtime/app/FimoProviders.d.ts.map +1 -0
  45. package/dist/runtime/app/FimoProviders.js +2 -23
  46. package/dist/runtime/app/FimoScripts.d.ts.map +1 -0
  47. package/dist/runtime/app/index.d.ts.map +1 -0
  48. package/dist/runtime/app/prefetch.d.ts.map +1 -0
  49. package/dist/runtime/astro/index.d.ts +2 -0
  50. package/dist/runtime/astro/index.d.ts.map +1 -0
  51. package/dist/runtime/astro/index.js +3 -0
  52. package/dist/runtime/astro/server.d.ts +3 -0
  53. package/dist/runtime/astro/server.d.ts.map +1 -0
  54. package/dist/runtime/astro/server.js +6 -0
  55. package/dist/runtime/content/DataSourcesProvider.d.ts.map +1 -0
  56. package/dist/runtime/content/RefreshContentProvider.d.ts.map +1 -0
  57. package/dist/runtime/content/RefreshContentProvider.test.d.ts +2 -0
  58. package/dist/runtime/content/RefreshContentProvider.test.d.ts.map +1 -0
  59. package/dist/runtime/content/RefreshContentProvider.test.js +33 -0
  60. package/dist/runtime/content/parseCollectionResponse.d.ts.map +1 -0
  61. package/dist/runtime/content/parseCollectionResponse.test.d.ts +2 -0
  62. package/dist/runtime/content/parseCollectionResponse.test.d.ts.map +1 -0
  63. package/dist/runtime/content/parseCollectionResponse.test.js +20 -0
  64. package/dist/runtime/content/utils/retrieve-data-sources.d.ts +0 -1
  65. package/dist/runtime/content/utils/retrieve-data-sources.d.ts.map +1 -0
  66. package/dist/runtime/content/utils/retrieve-data-sources.js +4 -27
  67. package/dist/runtime/core/AppErrorBoundary.d.ts.map +1 -0
  68. package/dist/runtime/core/ViteLifecycles.d.ts.map +1 -0
  69. package/dist/runtime/i18n/FimoLocaleContext.d.ts.map +1 -0
  70. package/dist/runtime/i18n/FimoLocaleContext.js +1 -0
  71. package/dist/runtime/i18n/locale.d.ts.map +1 -0
  72. package/dist/runtime/i18n/locale.test.d.ts +2 -0
  73. package/dist/runtime/i18n/locale.test.d.ts.map +1 -0
  74. package/dist/runtime/i18n/locale.test.js +58 -0
  75. package/dist/runtime/iframe/ConsoleErrorProvider.d.ts.map +1 -0
  76. package/dist/runtime/iframe/ScreenshotProvider.d.ts.map +1 -0
  77. package/dist/runtime/iframe/runtime/overlay-hmr.d.ts.map +1 -0
  78. package/dist/runtime/iframe/runtime/overlay-hmr.js +0 -3
  79. package/dist/runtime/iframe/runtime/overlay-runtime.d.ts.map +1 -0
  80. package/dist/runtime/index.d.ts +0 -3
  81. package/dist/runtime/index.d.ts.map +1 -0
  82. package/dist/runtime/index.js +0 -2
  83. package/dist/runtime/next/FimoNextProviders.d.ts +24 -0
  84. package/dist/runtime/next/FimoNextProviders.d.ts.map +1 -0
  85. package/dist/runtime/next/FimoNextProviders.js +20 -0
  86. package/dist/runtime/next/FimoNextScripts.d.ts +10 -0
  87. package/dist/runtime/next/FimoNextScripts.d.ts.map +1 -0
  88. package/dist/runtime/next/FimoNextScripts.js +19 -0
  89. package/dist/runtime/next/index.d.ts +14 -0
  90. package/dist/runtime/next/index.d.ts.map +1 -0
  91. package/dist/runtime/next/index.js +14 -0
  92. package/dist/runtime/next/server.d.ts +2 -0
  93. package/dist/runtime/next/server.d.ts.map +1 -0
  94. package/dist/runtime/next/server.js +4 -0
  95. package/dist/runtime/nuxt/composables.d.ts +9 -0
  96. package/dist/runtime/nuxt/composables.d.ts.map +1 -0
  97. package/dist/runtime/nuxt/composables.js +57 -0
  98. package/dist/runtime/nuxt/index.d.ts +3 -0
  99. package/dist/runtime/nuxt/index.d.ts.map +1 -0
  100. package/dist/runtime/nuxt/index.js +6 -0
  101. package/dist/runtime/nuxt/server.d.ts +3 -0
  102. package/dist/runtime/nuxt/server.d.ts.map +1 -0
  103. package/dist/runtime/nuxt/server.js +6 -0
  104. package/dist/runtime/paths/get-fimo-paths.d.ts.map +1 -0
  105. package/dist/runtime/paths/get-fimo-paths.js +5 -15
  106. package/dist/runtime/paths/index.d.ts.map +1 -0
  107. package/dist/runtime/paths/types.d.ts.map +1 -0
  108. package/dist/runtime/primitives/components/Boolean.d.ts.map +1 -0
  109. package/dist/runtime/primitives/components/Date.d.ts.map +1 -0
  110. package/dist/runtime/primitives/components/Image.d.ts.map +1 -0
  111. package/dist/runtime/primitives/components/RichText.d.ts.map +1 -0
  112. package/dist/runtime/primitives/components/StaticImage.d.ts.map +1 -0
  113. package/dist/runtime/primitives/components/Text.d.ts.map +1 -0
  114. package/dist/runtime/primitives/components/Video.d.ts.map +1 -0
  115. package/dist/runtime/primitives/components/index.d.ts.map +1 -0
  116. package/dist/runtime/primitives/index.d.ts.map +1 -0
  117. package/dist/runtime/primitives/labels-hook.d.ts +33 -0
  118. package/dist/runtime/primitives/labels-hook.d.ts.map +1 -0
  119. package/dist/runtime/primitives/labels-hook.js +41 -0
  120. package/dist/runtime/primitives/labels-store.d.ts +12 -0
  121. package/dist/runtime/primitives/labels-store.d.ts.map +1 -0
  122. package/dist/runtime/primitives/labels-store.js +60 -0
  123. package/dist/runtime/primitives/labels-store.test.d.ts +2 -0
  124. package/dist/runtime/primitives/labels-store.test.d.ts.map +1 -0
  125. package/dist/runtime/primitives/labels-store.test.js +66 -0
  126. package/dist/runtime/primitives/lib/image-optimization.d.ts.map +1 -0
  127. package/dist/runtime/primitives/lib/index.d.ts.map +1 -0
  128. package/dist/runtime/primitives/lib/primitives.d.ts +2 -2
  129. package/dist/runtime/primitives/lib/primitives.d.ts.map +1 -0
  130. package/dist/runtime/primitives/lib/query.d.ts +3 -5
  131. package/dist/runtime/primitives/lib/query.d.ts.map +1 -0
  132. package/dist/runtime/primitives/lib/template.d.ts.map +1 -0
  133. package/dist/runtime/primitives/lib/useFimoLiveValue.d.ts +5 -3
  134. package/dist/runtime/primitives/lib/useFimoLiveValue.d.ts.map +1 -0
  135. package/dist/runtime/primitives/lib/useFimoLiveValue.js +11 -4
  136. package/dist/runtime/primitives/public-surface.test.d.ts +2 -0
  137. package/dist/runtime/primitives/public-surface.test.d.ts.map +1 -0
  138. package/dist/runtime/primitives/public-surface.test.js +45 -0
  139. package/dist/runtime/primitives/translations.d.ts +1 -27
  140. package/dist/runtime/primitives/translations.d.ts.map +1 -0
  141. package/dist/runtime/primitives/translations.js +7 -85
  142. package/dist/runtime/react/FimoSpaProviders.d.ts +36 -0
  143. package/dist/runtime/react/FimoSpaProviders.d.ts.map +1 -0
  144. package/dist/runtime/react/FimoSpaProviders.js +63 -0
  145. package/dist/runtime/react/index.d.ts +33 -0
  146. package/dist/runtime/react/index.d.ts.map +1 -0
  147. package/dist/runtime/react/index.js +39 -0
  148. package/dist/runtime/react-router/index.d.ts.map +1 -0
  149. package/dist/runtime/react-router/navigation-utils.d.ts.map +1 -0
  150. package/dist/runtime/react-router/navigation.d.ts.map +1 -0
  151. package/dist/runtime/react-router/navigation.test.d.ts +2 -0
  152. package/dist/runtime/react-router/navigation.test.d.ts.map +1 -0
  153. package/dist/runtime/react-router/navigation.test.js +35 -0
  154. package/dist/runtime/react-router/routes.d.ts.map +1 -0
  155. package/dist/runtime/react-router/routes.test.d.ts +2 -0
  156. package/dist/runtime/react-router/routes.test.d.ts.map +1 -0
  157. package/dist/runtime/react-router/routes.test.js +67 -0
  158. package/dist/runtime/remix/FimoRemixProviders.d.ts +16 -0
  159. package/dist/runtime/remix/FimoRemixProviders.d.ts.map +1 -0
  160. package/dist/runtime/remix/FimoRemixProviders.js +12 -0
  161. package/dist/runtime/remix/FimoRemixScripts.d.ts +10 -0
  162. package/dist/runtime/remix/FimoRemixScripts.d.ts.map +1 -0
  163. package/dist/runtime/remix/FimoRemixScripts.js +19 -0
  164. package/dist/runtime/remix/index.d.ts +12 -0
  165. package/dist/runtime/remix/index.d.ts.map +1 -0
  166. package/dist/runtime/remix/index.js +11 -0
  167. package/dist/runtime/remix/server.d.ts +2 -0
  168. package/dist/runtime/remix/server.d.ts.map +1 -0
  169. package/dist/runtime/remix/server.js +2 -0
  170. package/dist/runtime/routing/AppResetScrollOnNavigate.d.ts.map +1 -0
  171. package/dist/runtime/routing/AppRoutesProvider.d.ts.map +1 -0
  172. package/dist/runtime/seo/buildSeoForPath.d.ts +3 -1
  173. package/dist/runtime/seo/buildSeoForPath.d.ts.map +1 -0
  174. package/dist/runtime/seo/buildSeoForPath.js +1 -4
  175. package/dist/runtime/seo/htmlProps.d.ts.map +1 -0
  176. package/dist/runtime/seo/index.d.ts.map +1 -0
  177. package/dist/runtime/seo/resolver.d.ts.map +1 -0
  178. package/dist/runtime/shared/display-routes.d.ts +14 -0
  179. package/dist/runtime/shared/display-routes.d.ts.map +1 -0
  180. package/dist/runtime/shared/display-routes.js +25 -0
  181. package/dist/runtime/shared/fimo-config.server.d.ts.map +1 -0
  182. package/dist/runtime/shared/fimo-config.server.js +1 -0
  183. package/dist/runtime/shared/fimo-config.types.d.ts +2 -0
  184. package/dist/runtime/shared/fimo-config.types.d.ts.map +1 -0
  185. package/dist/runtime/shared/i18n-messages.d.ts +29 -0
  186. package/dist/runtime/shared/i18n-messages.d.ts.map +1 -0
  187. package/dist/runtime/shared/i18n-messages.js +79 -0
  188. package/dist/runtime/shared/i18n-messages.test.d.ts +2 -0
  189. package/dist/runtime/shared/i18n-messages.test.d.ts.map +1 -0
  190. package/dist/runtime/shared/i18n-messages.test.js +39 -0
  191. package/dist/runtime/shared/labels-fetch.pure.d.ts +17 -0
  192. package/dist/runtime/shared/labels-fetch.pure.d.ts.map +1 -0
  193. package/dist/runtime/shared/labels-fetch.pure.js +71 -0
  194. package/dist/runtime/shared/labels-fetch.server.d.ts +7 -0
  195. package/dist/runtime/shared/labels-fetch.server.d.ts.map +1 -0
  196. package/dist/runtime/shared/labels-fetch.server.js +97 -0
  197. package/dist/runtime/shared/labels-t.pure.d.ts +2 -0
  198. package/dist/runtime/shared/labels-t.pure.d.ts.map +1 -0
  199. package/dist/runtime/shared/labels-t.pure.js +10 -0
  200. package/dist/runtime/svelte/index.d.ts +3 -0
  201. package/dist/runtime/svelte/index.d.ts.map +1 -0
  202. package/dist/runtime/svelte/index.js +7 -0
  203. package/dist/runtime/svelte/server.d.ts +3 -0
  204. package/dist/runtime/svelte/server.d.ts.map +1 -0
  205. package/dist/runtime/svelte/server.js +6 -0
  206. package/dist/runtime/t/OptionalTracking.d.ts.map +1 -0
  207. package/dist/runtime/t/OptionalTracking.test.d.ts +2 -0
  208. package/dist/runtime/t/OptionalTracking.test.d.ts.map +1 -0
  209. package/dist/runtime/t/OptionalTracking.test.js +11 -0
  210. package/dist/runtime/t/Pageview.d.ts.map +1 -0
  211. package/dist/runtime/templates.d.ts.map +1 -0
  212. package/dist/runtime/vue/index.d.ts +3 -0
  213. package/dist/runtime/vue/index.d.ts.map +1 -0
  214. package/dist/runtime/vue/index.js +5 -0
  215. package/dist/runtime/vue/server.d.ts +3 -0
  216. package/dist/runtime/vue/server.d.ts.map +1 -0
  217. package/dist/runtime/vue/server.js +6 -0
  218. package/dist/runtime/wrapped/FimoFileLink.d.ts +17 -0
  219. package/dist/runtime/wrapped/FimoFileLink.d.ts.map +1 -0
  220. package/dist/runtime/wrapped/FimoFileLink.js +19 -0
  221. package/dist/runtime/wrapped/FimoMediaImage.d.ts +14 -0
  222. package/dist/runtime/wrapped/FimoMediaImage.d.ts.map +1 -0
  223. package/dist/runtime/wrapped/FimoMediaImage.js +20 -0
  224. package/dist/runtime/wrapped/FimoMediaVideo.d.ts +14 -0
  225. package/dist/runtime/wrapped/FimoMediaVideo.d.ts.map +1 -0
  226. package/dist/runtime/wrapped/FimoMediaVideo.js +20 -0
  227. package/dist/runtime/wrapped/FimoRichTextBlock.d.ts +23 -0
  228. package/dist/runtime/wrapped/FimoRichTextBlock.d.ts.map +1 -0
  229. package/dist/runtime/wrapped/FimoRichTextBlock.js +22 -0
  230. package/dist/runtime/wrapped/FimoText.d.ts +22 -0
  231. package/dist/runtime/wrapped/FimoText.d.ts.map +1 -0
  232. package/dist/runtime/wrapped/FimoText.js +20 -0
  233. package/dist/runtime/wrapped/WrappedContentContext.d.ts +28 -0
  234. package/dist/runtime/wrapped/WrappedContentContext.d.ts.map +1 -0
  235. package/dist/runtime/wrapped/WrappedContentContext.js +30 -0
  236. package/dist/runtime/wrapped/WrappedProviders.d.ts +33 -0
  237. package/dist/runtime/wrapped/WrappedProviders.d.ts.map +1 -0
  238. package/dist/runtime/wrapped/WrappedProviders.js +101 -0
  239. package/dist/runtime/wrapped/dom.d.ts +4 -0
  240. package/dist/runtime/wrapped/dom.d.ts.map +1 -0
  241. package/dist/runtime/wrapped/dom.js +23 -0
  242. package/dist/runtime/wrapped/dom.test.d.ts +2 -0
  243. package/dist/runtime/wrapped/dom.test.d.ts.map +1 -0
  244. package/dist/runtime/wrapped/dom.test.js +16 -0
  245. package/dist/runtime/wrapped/server.d.ts +77 -0
  246. package/dist/runtime/wrapped/server.d.ts.map +1 -0
  247. package/dist/runtime/wrapped/server.js +237 -0
  248. package/dist/runtime/wrapped/server.test.d.ts +2 -0
  249. package/dist/runtime/wrapped/server.test.d.ts.map +1 -0
  250. package/dist/runtime/wrapped/server.test.js +91 -0
  251. package/dist/scripts/apply-wrap-templates.d.ts +61 -0
  252. package/dist/scripts/apply-wrap-templates.js +132 -0
  253. package/dist/scripts/apply-wrap-templates.test.js +199 -0
  254. package/dist/scripts/apply-wrap.d.ts +46 -0
  255. package/dist/scripts/apply-wrap.js +278 -0
  256. package/dist/scripts/apply-wrap.test.d.ts +1 -0
  257. package/dist/scripts/apply-wrap.test.js +226 -0
  258. package/dist/scripts/cms/discover.d.ts +2 -0
  259. package/dist/scripts/cms/discover.js +17 -0
  260. package/dist/scripts/cms/example-content.d.ts +32 -0
  261. package/dist/scripts/cms/example-content.js +87 -0
  262. package/dist/scripts/cms/example-content.test.d.ts +1 -0
  263. package/dist/scripts/cms/example-content.test.js +57 -0
  264. package/dist/scripts/cms/strapi/detect.d.ts +2 -0
  265. package/dist/scripts/cms/strapi/detect.js +185 -0
  266. package/dist/scripts/cms/strapi/detect.test.d.ts +1 -0
  267. package/dist/scripts/cms/strapi/detect.test.js +56 -0
  268. package/dist/scripts/cms/strapi/index.d.ts +3 -0
  269. package/dist/scripts/cms/strapi/index.js +15 -0
  270. package/dist/scripts/cms/strapi/list-source.d.ts +17 -0
  271. package/dist/scripts/cms/strapi/list-source.js +90 -0
  272. package/dist/scripts/cms/strapi/list-source.test.d.ts +1 -0
  273. package/dist/scripts/cms/strapi/list-source.test.js +33 -0
  274. package/dist/scripts/cms/strapi/schema-map.d.ts +9 -0
  275. package/dist/scripts/cms/strapi/schema-map.js +138 -0
  276. package/dist/scripts/cms/strapi/schema-map.test.d.ts +1 -0
  277. package/dist/scripts/cms/strapi/schema-map.test.js +87 -0
  278. package/dist/scripts/cms/types.d.ts +76 -0
  279. package/dist/scripts/cms/types.js +11 -0
  280. package/dist/scripts/detect-framework.d.ts +39 -0
  281. package/dist/scripts/detect-framework.js +133 -0
  282. package/dist/scripts/detect-framework.test.d.ts +1 -0
  283. package/dist/scripts/detect-framework.test.js +122 -0
  284. package/dist/scripts/draft-rows.d.ts +19 -0
  285. package/dist/scripts/draft-rows.js +135 -0
  286. package/dist/scripts/draft-rows.test.d.ts +1 -0
  287. package/dist/scripts/draft-rows.test.js +113 -0
  288. package/dist/scripts/draft-schemas.d.ts +27 -0
  289. package/dist/scripts/draft-schemas.js +188 -0
  290. package/dist/scripts/draft-schemas.test.d.ts +1 -0
  291. package/dist/scripts/draft-schemas.test.js +152 -0
  292. package/dist/scripts/frameworks/astro/routes.d.ts +3 -0
  293. package/dist/scripts/frameworks/astro/routes.js +55 -0
  294. package/dist/scripts/frameworks/astro/template-style.d.ts +7 -0
  295. package/dist/scripts/frameworks/astro/template-style.js +19 -0
  296. package/dist/scripts/frameworks/discover.d.ts +70 -0
  297. package/dist/scripts/frameworks/discover.js +171 -0
  298. package/dist/scripts/frameworks/next/rewire.d.ts +30 -0
  299. package/dist/scripts/frameworks/next/rewire.js +258 -0
  300. package/dist/scripts/frameworks/next/rewire.test.d.ts +1 -0
  301. package/dist/scripts/frameworks/next/rewire.test.js +134 -0
  302. package/dist/scripts/frameworks/next/routes.d.ts +17 -0
  303. package/dist/scripts/frameworks/next/routes.js +134 -0
  304. package/dist/scripts/frameworks/next/routes.test.d.ts +1 -0
  305. package/dist/scripts/frameworks/next/routes.test.js +64 -0
  306. package/dist/scripts/frameworks/next/wiring.d.ts +26 -0
  307. package/dist/scripts/frameworks/next/wiring.js +163 -0
  308. package/dist/scripts/frameworks/next/wiring.test.d.ts +1 -0
  309. package/dist/scripts/frameworks/next/wiring.test.js +146 -0
  310. package/dist/scripts/frameworks/nuxt/routes.d.ts +3 -0
  311. package/dist/scripts/frameworks/nuxt/routes.js +54 -0
  312. package/dist/scripts/frameworks/nuxt/template-style.d.ts +9 -0
  313. package/dist/scripts/frameworks/nuxt/template-style.js +27 -0
  314. package/dist/scripts/frameworks/remix/routes.d.ts +3 -0
  315. package/dist/scripts/frameworks/remix/routes.js +50 -0
  316. package/dist/scripts/frameworks/sveltekit/routes.d.ts +3 -0
  317. package/dist/scripts/frameworks/sveltekit/routes.js +50 -0
  318. package/dist/scripts/frameworks/sveltekit/template-style.d.ts +9 -0
  319. package/dist/scripts/frameworks/sveltekit/template-style.js +54 -0
  320. package/dist/scripts/frameworks/vite/routes.d.ts +15 -0
  321. package/dist/scripts/frameworks/vite/routes.js +93 -0
  322. package/dist/scripts/frameworks/vite/routes.test.d.ts +1 -0
  323. package/dist/scripts/frameworks/vite/routes.test.js +73 -0
  324. package/dist/scripts/frameworks/vite/wiring.d.ts +10 -0
  325. package/dist/scripts/frameworks/vite/wiring.js +99 -0
  326. package/dist/scripts/frameworks/vite/wiring.test.d.ts +1 -0
  327. package/dist/scripts/frameworks/vite/wiring.test.js +88 -0
  328. package/dist/scripts/generated-types.test.d.ts +1 -0
  329. package/dist/scripts/generated-types.test.js +212 -0
  330. package/dist/scripts/lib/validation-report.d.ts +1 -0
  331. package/dist/scripts/lib/validation-report.js +3 -0
  332. package/dist/scripts/lint-translation-keys.test.d.ts +1 -0
  333. package/dist/scripts/lint-translation-keys.test.js +16 -0
  334. package/dist/scripts/render-parity/capture.d.ts +56 -0
  335. package/dist/scripts/render-parity/capture.js +366 -0
  336. package/dist/scripts/render-parity/capture.test.d.ts +1 -0
  337. package/dist/scripts/render-parity/capture.test.js +306 -0
  338. package/dist/scripts/render-parity/compare.d.ts +59 -0
  339. package/dist/scripts/render-parity/compare.js +0 -0
  340. package/dist/scripts/render-parity/compare.test.d.ts +1 -0
  341. package/dist/scripts/render-parity/compare.test.js +98 -0
  342. package/dist/scripts/render-parity/normalize-html.d.ts +13 -0
  343. package/dist/scripts/render-parity/normalize-html.js +223 -0
  344. package/dist/scripts/render-parity/normalize-html.test.d.ts +1 -0
  345. package/dist/scripts/render-parity/normalize-html.test.js +58 -0
  346. package/dist/scripts/render-parity/types.d.ts +41 -0
  347. package/dist/scripts/render-parity/types.js +1 -0
  348. package/dist/scripts/resolve-routes.js +1 -1
  349. package/dist/scripts/scan-wrappable.d.ts +196 -0
  350. package/dist/scripts/scan-wrappable.js +1221 -0
  351. package/dist/scripts/scan-wrappable.test.d.ts +1 -0
  352. package/dist/scripts/scan-wrappable.test.js +502 -0
  353. package/dist/scripts/sync-schemas.test.d.ts +1 -0
  354. package/dist/scripts/sync-schemas.test.js +124 -0
  355. package/dist/scripts/validate-route-metadata.js +11 -0
  356. package/dist/scripts/validate-route-metadata.test.d.ts +1 -0
  357. package/dist/scripts/validate-route-metadata.test.js +116 -0
  358. package/dist/scripts/validate-schemas.test.d.ts +1 -0
  359. package/dist/scripts/validate-schemas.test.js +263 -0
  360. package/package.json +85 -20
  361. package/scripts/add-ext.mjs +47 -0
  362. package/scripts/bump-version.mjs +58 -0
  363. package/scripts/bundle-cli.mjs +123 -0
  364. package/scripts/install-cli.mjs +36 -0
  365. package/scripts/lib/channels.mjs +70 -0
  366. package/scripts/lib/dev-release-state.mjs +44 -0
  367. package/scripts/lib/dev-release-state.test.ts +36 -0
  368. package/scripts/lib/postinstall-onboarding.test.ts +82 -0
  369. package/scripts/lib/release-core.mjs +225 -0
  370. package/scripts/lib/release-core.test.ts +147 -0
  371. package/scripts/migration-qa-gate.test.ts +155 -0
  372. package/scripts/publish-npm.mjs +180 -0
  373. package/templates/react-router/package.json +7 -10
  374. package/templates/react-router/src/pages/Index.tsx +1 -1
  375. package/dist/runtime/content/client/createContentClient.d.ts +0 -5
  376. package/dist/runtime/content/client/createContentClient.js +0 -300
  377. package/dist/runtime/content/client/createSingletonClient.d.ts +0 -5
  378. package/dist/runtime/content/client/createSingletonClient.js +0 -108
  379. package/dist/runtime/content/client/internal.d.ts +0 -44
  380. package/dist/runtime/content/client/internal.js +0 -236
  381. package/dist/runtime/content/client/types.d.ts +0 -136
  382. package/dist/runtime/content/client/useQueryLocale.d.ts +0 -2
  383. package/dist/runtime/content/client/useQueryLocale.js +0 -6
  384. /package/dist/{runtime/content/client/types.js → scripts/apply-wrap-templates.test.d.ts} +0 -0
@@ -0,0 +1,56 @@
1
+ import { type ParityBaseline } from './types.js';
2
+ export interface CaptureOptions {
3
+ cwd: string;
4
+ packageManager: string;
5
+ routes: Array<{
6
+ path: string;
7
+ }>;
8
+ framework: string | null;
9
+ bootTimeoutMs?: number;
10
+ routeTimeoutMs?: number;
11
+ /** Reuse an already-running dev server instead of booting one: the warm
12
+ * server recompiles incrementally, so repeated checks cost seconds. The
13
+ * server is probed once and never stopped. */
14
+ serverOrigin?: string;
15
+ /** Concrete values for dynamic route params so `[locale]`-style routes are
16
+ * actually captured instead of skipped. A route resolves (and is captured)
17
+ * only when EVERY `:param` in it has a value here; both baseline and check
18
+ * read the same values, so the comparison stays symmetric. */
19
+ paramValues?: Record<string, string>;
20
+ onProgress?: (message: string) => void;
21
+ }
22
+ /** Substitute known params into a `:param` route path; returns the concrete
23
+ * path, or null when a param has no value (still unresolvable → skip). */
24
+ export declare function resolveRoutePath(routePath: string, paramValues: Record<string, string>): string | null;
25
+ export declare class CaptureError extends Error {
26
+ readonly stderrTail: string;
27
+ constructor(message: string, stderrTail?: string);
28
+ }
29
+ export declare function findFreePort(): Promise<number>;
30
+ /**
31
+ * Build workspace packages the app needs BEFORE booting its dev server. Fimo
32
+ * runs the app's bare `next dev`, but in a Turborepo/pnpm monorepo the
33
+ * internal deps (`@repo/*`) aren't built by that — `turbo dev` would build
34
+ * them first. This detects unbuilt internal deps and runs the monorepo's
35
+ * build once (the root `build` script, else `turbo run build`); turbo's cache
36
+ * makes an already-built repo near-instant. A build failure is surfaced with
37
+ * an actionable message instead of a cryptic `Cannot find module` at boot.
38
+ */
39
+ export declare function ensureWorkspaceDepsBuilt(cwd: string, packageManager: string, onProgress?: (message: string) => void): void;
40
+ interface DevServer {
41
+ origin: string;
42
+ stderrTail: () => string;
43
+ stop: () => Promise<void>;
44
+ }
45
+ export declare function startDevServer(opts: {
46
+ cwd: string;
47
+ packageManager: string;
48
+ bootTimeoutMs: number;
49
+ }): Promise<DevServer>;
50
+ /**
51
+ * Boot the project's own dev server, capture every static route's normalized
52
+ * signature, and tear the server down. Baseline and check both run through
53
+ * this identical pipeline — that symmetry is the gate's correctness property.
54
+ */
55
+ export declare function captureParityBaseline(opts: CaptureOptions): Promise<ParityBaseline>;
56
+ export {};
@@ -0,0 +1,366 @@
1
+ import { spawn, spawnSync } from 'node:child_process';
2
+ import fs from 'node:fs';
3
+ import net from 'node:net';
4
+ import path from 'node:path';
5
+ import { extractRouteSignature } from './normalize-html.js';
6
+ import { PARITY_BASELINE_VERSION } from './types.js';
7
+ /** Substitute known params into a `:param` route path; returns the concrete
8
+ * path, or null when a param has no value (still unresolvable → skip). */
9
+ export function resolveRoutePath(routePath, paramValues) {
10
+ const resolved = routePath.replace(/:([A-Za-z0-9_]+)/g, (_, name) => paramValues[name] ? encodeURIComponent(paramValues[name]) : `:${name}`);
11
+ return resolved.includes(':') ? null : resolved;
12
+ }
13
+ const DEFAULT_BOOT_TIMEOUT_MS = 90_000;
14
+ const DEFAULT_ROUTE_TIMEOUT_MS = 60_000;
15
+ const READINESS_POLL_MS = 500;
16
+ const KILL_GRACE_MS = 5_000;
17
+ export class CaptureError extends Error {
18
+ stderrTail;
19
+ constructor(message, stderrTail = '') {
20
+ super(message);
21
+ this.name = 'CaptureError';
22
+ this.stderrTail = stderrTail;
23
+ }
24
+ }
25
+ export function findFreePort() {
26
+ return new Promise((resolve, reject) => {
27
+ const server = net.createServer();
28
+ server.once('error', reject);
29
+ server.listen(0, '127.0.0.1', () => {
30
+ const address = server.address();
31
+ const port = typeof address === 'object' && address ? address.port : 0;
32
+ server.close(() => resolve(port));
33
+ });
34
+ });
35
+ }
36
+ function preflight(cwd) {
37
+ if (!fs.existsSync(path.join(cwd, 'node_modules'))) {
38
+ throw new CaptureError('node_modules is missing — run your package manager install first.');
39
+ }
40
+ try {
41
+ const pkg = JSON.parse(fs.readFileSync(path.join(cwd, 'package.json'), 'utf8'));
42
+ if (!pkg.scripts?.dev) {
43
+ throw new CaptureError('No `dev` script in package.json — the parity capture boots your dev server.');
44
+ }
45
+ }
46
+ catch (error) {
47
+ if (error instanceof CaptureError) {
48
+ throw error;
49
+ }
50
+ throw new CaptureError('Could not read package.json.');
51
+ }
52
+ }
53
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
54
+ /** The monorepo root above `cwd` (pnpm-workspace / turbo / npm workspaces),
55
+ * or null when `cwd` is standalone. */
56
+ function workspaceRoot(cwd) {
57
+ let dir = cwd;
58
+ for (let depth = 0; depth < 6; depth += 1) {
59
+ const parent = path.dirname(dir);
60
+ if (parent === dir) {
61
+ break;
62
+ }
63
+ dir = parent;
64
+ if (fs.existsSync(path.join(dir, 'pnpm-workspace.yaml')) || fs.existsSync(path.join(dir, 'turbo.json'))) {
65
+ return dir;
66
+ }
67
+ try {
68
+ const pkg = JSON.parse(fs.readFileSync(path.join(dir, 'package.json'), 'utf8'));
69
+ if (pkg.workspaces) {
70
+ return dir;
71
+ }
72
+ }
73
+ catch {
74
+ // keep walking up
75
+ }
76
+ }
77
+ return null;
78
+ }
79
+ /** Internal workspace packages this app depends on (`workspace:` / `catalog:`
80
+ * protocol) whose build output is missing — a bare `next dev` fails on
81
+ * `Cannot find module '@repo/…/dist/…'` until they are built. */
82
+ function unbuiltWorkspaceDeps(cwd) {
83
+ let pkg;
84
+ try {
85
+ pkg = JSON.parse(fs.readFileSync(path.join(cwd, 'package.json'), 'utf8'));
86
+ }
87
+ catch {
88
+ return [];
89
+ }
90
+ const deps = Object.entries({ ...pkg.dependencies, ...pkg.devDependencies })
91
+ .filter(([, version]) => typeof version === 'string' && (version.startsWith('workspace:') || version.startsWith('catalog:')))
92
+ .map(([name]) => name);
93
+ return deps.filter((name) => {
94
+ const depDir = path.join(cwd, 'node_modules', name);
95
+ try {
96
+ const depPkg = JSON.parse(fs.readFileSync(path.join(depDir, 'package.json'), 'utf8'));
97
+ const entry = depPkg.module ?? depPkg.main;
98
+ if (typeof entry === 'string') {
99
+ return !fs.existsSync(path.join(depDir, entry));
100
+ }
101
+ // exports-only package: treat a missing dist/ as unbuilt.
102
+ return Boolean(depPkg.exports) && !fs.existsSync(path.join(depDir, 'dist'));
103
+ }
104
+ catch {
105
+ return false; // can't resolve the link → don't force a build
106
+ }
107
+ });
108
+ }
109
+ /**
110
+ * Build workspace packages the app needs BEFORE booting its dev server. Fimo
111
+ * runs the app's bare `next dev`, but in a Turborepo/pnpm monorepo the
112
+ * internal deps (`@repo/*`) aren't built by that — `turbo dev` would build
113
+ * them first. This detects unbuilt internal deps and runs the monorepo's
114
+ * build once (the root `build` script, else `turbo run build`); turbo's cache
115
+ * makes an already-built repo near-instant. A build failure is surfaced with
116
+ * an actionable message instead of a cryptic `Cannot find module` at boot.
117
+ */
118
+ export function ensureWorkspaceDepsBuilt(cwd, packageManager, onProgress) {
119
+ const root = workspaceRoot(cwd);
120
+ if (!root) {
121
+ return;
122
+ }
123
+ const unbuilt = unbuiltWorkspaceDeps(cwd);
124
+ if (unbuilt.length === 0) {
125
+ return;
126
+ }
127
+ onProgress?.(`building workspace packages (${unbuilt.slice(0, 3).join(', ')}${unbuilt.length > 3 ? '…' : ''})`);
128
+ let rootBuild = null;
129
+ try {
130
+ const rootPkg = JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf8'));
131
+ if (rootPkg.scripts?.build) {
132
+ rootBuild = { command: packageManager, args: ['run', 'build'] };
133
+ }
134
+ }
135
+ catch {
136
+ // fall through to turbo
137
+ }
138
+ if (!rootBuild && fs.existsSync(path.join(root, 'turbo.json'))) {
139
+ rootBuild = { command: 'npx', args: ['turbo', 'run', 'build'] };
140
+ }
141
+ if (!rootBuild) {
142
+ throw new CaptureError(`Workspace packages (${unbuilt.join(', ')}) must be built before the dev server can boot, and the monorepo has no root \`build\` script or turbo config to run. Build them yourself, then re-run \`npx fimo migrate\`.`);
143
+ }
144
+ const result = spawnSync(rootBuild.command, rootBuild.args, {
145
+ cwd: root,
146
+ timeout: 300_000,
147
+ encoding: 'utf8',
148
+ env: { ...process.env, NEXT_TELEMETRY_DISABLED: '1' },
149
+ });
150
+ if (result.status !== 0) {
151
+ throw new CaptureError(`Workspace packages (${unbuilt.join(', ')}) need building for the dev server, but \`${rootBuild.command} ${rootBuild.args.join(' ')}\` failed at ${path.relative(cwd, root) || 'the repo root'}. Build them yourself, then re-run \`npx fimo migrate\`.\n${(result.stderr || result.stdout || '').slice(-800)}`);
152
+ }
153
+ }
154
+ export async function startDevServer(opts) {
155
+ preflight(opts.cwd);
156
+ const port = await findFreePort();
157
+ const child = spawn(opts.packageManager, ['run', 'dev'], {
158
+ cwd: opts.cwd,
159
+ detached: process.platform !== 'win32',
160
+ stdio: ['ignore', 'pipe', 'pipe'],
161
+ env: { ...process.env, PORT: String(port), NEXT_TELEMETRY_DISABLED: '1', BROWSER: 'none' },
162
+ });
163
+ let stdoutBuffer = '';
164
+ let stderrBuffer = '';
165
+ child.stdout?.on('data', (chunk) => {
166
+ stdoutBuffer = `${stdoutBuffer}${chunk.toString()}`.slice(-8_000);
167
+ });
168
+ child.stderr?.on('data', (chunk) => {
169
+ stderrBuffer = `${stderrBuffer}${chunk.toString()}`.slice(-8_000);
170
+ });
171
+ let exited = false;
172
+ child.on('exit', () => {
173
+ exited = true;
174
+ });
175
+ const stop = async () => {
176
+ if (exited || child.pid === undefined) {
177
+ return;
178
+ }
179
+ try {
180
+ if (process.platform === 'win32') {
181
+ spawn('taskkill', ['/pid', String(child.pid), '/T', '/F']);
182
+ }
183
+ else {
184
+ process.kill(-child.pid, 'SIGTERM');
185
+ }
186
+ }
187
+ catch {
188
+ child.kill('SIGTERM');
189
+ }
190
+ const deadline = Date.now() + KILL_GRACE_MS;
191
+ while (!exited && Date.now() < deadline) {
192
+ await sleep(100);
193
+ }
194
+ if (!exited && child.pid !== undefined && process.platform !== 'win32') {
195
+ try {
196
+ process.kill(-child.pid, 'SIGKILL');
197
+ }
198
+ catch {
199
+ // already gone
200
+ }
201
+ }
202
+ };
203
+ // Readiness: an HTTP response BELOW 500 counts as listening (a 404 means
204
+ // the router is up). Nuxt's dev server answers 503 immediately while Vite
205
+ // still builds — treating that as ready captured a baseline of 503s.
206
+ // Dev scripts that hardcode their own port are handled by sniffing stdout.
207
+ const probe = async (origin) => {
208
+ try {
209
+ const response = await fetch(origin, { signal: AbortSignal.timeout(2_000) });
210
+ return response.status < 500;
211
+ }
212
+ catch {
213
+ return false;
214
+ }
215
+ };
216
+ // Probe via the `localhost` hostname, never a numeric loopback: Vite-family
217
+ // servers (Astro, Nuxt, SvelteKit) may bind ::1 only, and Node's fetch
218
+ // tries both address families for a hostname (Happy Eyeballs).
219
+ const deadline = Date.now() + opts.bootTimeoutMs;
220
+ let origin = `http://localhost:${port}`;
221
+ while (Date.now() < deadline) {
222
+ if (exited) {
223
+ await stop();
224
+ throw new CaptureError('The dev server exited before becoming ready.', stderrBuffer || stdoutBuffer);
225
+ }
226
+ if (await probe(origin)) {
227
+ return { origin, stderrTail: () => stderrBuffer, stop };
228
+ }
229
+ const sniffed = stdoutBuffer.match(/(?:localhost|127\.0\.0\.1):(\d{2,5})/);
230
+ if (sniffed && Number(sniffed[1]) !== port) {
231
+ const candidate = `http://localhost:${sniffed[1]}`;
232
+ if (await probe(candidate)) {
233
+ origin = candidate;
234
+ return { origin, stderrTail: () => stderrBuffer, stop };
235
+ }
236
+ }
237
+ await sleep(READINESS_POLL_MS);
238
+ }
239
+ await stop();
240
+ throw new CaptureError(`The dev server did not answer within ${Math.round(opts.bootTimeoutMs / 1000)}s.`, stderrBuffer || stdoutBuffer);
241
+ }
242
+ async function fetchRoute(origin, routePath, timeoutMs) {
243
+ const response = await fetch(new URL(routePath, origin), {
244
+ signal: AbortSignal.timeout(timeoutMs),
245
+ headers: { accept: 'text/html' },
246
+ });
247
+ return { status: response.status, html: await response.text() };
248
+ }
249
+ /**
250
+ * Boot the project's own dev server, capture every static route's normalized
251
+ * signature, and tear the server down. Baseline and check both run through
252
+ * this identical pipeline — that symmetry is the gate's correctness property.
253
+ */
254
+ export async function captureParityBaseline(opts) {
255
+ const bootTimeoutMs = opts.bootTimeoutMs ?? DEFAULT_BOOT_TIMEOUT_MS;
256
+ const routeTimeoutMs = opts.routeTimeoutMs ?? DEFAULT_ROUTE_TIMEOUT_MS;
257
+ const routes = {};
258
+ const paramValues = opts.paramValues ?? {};
259
+ // Capturable = a concrete URL exists (no params, or all params resolved via
260
+ // paramValues). The capture is keyed by the ORIGINAL route.path so baseline
261
+ // and check line up; only the fetched URL is the resolved one.
262
+ const staticRoutes = [];
263
+ for (const route of opts.routes) {
264
+ const resolved = route.path.includes(':') ? resolveRoutePath(route.path, paramValues) : route.path;
265
+ if (resolved === null) {
266
+ routes[route.path] = { skipped: 'dynamic-params' };
267
+ }
268
+ else {
269
+ staticRoutes.push({ path: route.path, url: resolved });
270
+ }
271
+ }
272
+ let server;
273
+ if (opts.serverOrigin) {
274
+ const origin = opts.serverOrigin.replace(/\/+$/, '');
275
+ opts.onProgress?.(`using the running dev server at ${origin}`);
276
+ try {
277
+ await fetch(origin, { signal: AbortSignal.timeout(5_000) });
278
+ }
279
+ catch {
280
+ throw new CaptureError(`No dev server answered at ${origin} — start it (e.g. \`${opts.packageManager} run dev\`) or drop --server to boot one.`);
281
+ }
282
+ server = { origin, stderrTail: () => '', stop: async () => { } };
283
+ }
284
+ else {
285
+ // Monorepo: build the app's workspace deps before the bare dev boot, or
286
+ // `next dev` dies on `Cannot find module '@repo/…'`.
287
+ ensureWorkspaceDepsBuilt(opts.cwd, opts.packageManager, opts.onProgress);
288
+ const bootStartedAt = Date.now();
289
+ opts.onProgress?.('starting your dev server');
290
+ const bootTicker = setInterval(() => {
291
+ opts.onProgress?.(`starting your dev server (${Math.round((Date.now() - bootStartedAt) / 1000)}s)`);
292
+ }, 5_000);
293
+ bootTicker.unref();
294
+ try {
295
+ server = await startDevServer({ cwd: opts.cwd, packageManager: opts.packageManager, bootTimeoutMs });
296
+ }
297
+ finally {
298
+ clearInterval(bootTicker);
299
+ }
300
+ }
301
+ try {
302
+ // Sequential on purpose: dev compilers choke on parallel cold compiles.
303
+ let index = 0;
304
+ for (const route of staticRoutes) {
305
+ index += 1;
306
+ const routeStartedAt = Date.now();
307
+ const progress = () => {
308
+ const elapsed = Math.round((Date.now() - routeStartedAt) / 1000);
309
+ opts.onProgress?.(`capturing ${route.path} (${index}/${staticRoutes.length}${elapsed >= 5 ? `, ${elapsed}s` : ''})`);
310
+ };
311
+ progress();
312
+ const routeTicker = setInterval(progress, 5_000);
313
+ routeTicker.unref();
314
+ try {
315
+ let result = await fetchRoute(server.origin, route.url, routeTimeoutMs).catch(async () => {
316
+ // One retry: first-compile latency and transient dev-server flake.
317
+ await sleep(1_000);
318
+ return fetchRoute(server.origin, route.url, routeTimeoutMs);
319
+ });
320
+ if (result.status >= 500) {
321
+ await sleep(1_000);
322
+ const retried = await fetchRoute(server.origin, route.url, routeTimeoutMs).catch(() => null);
323
+ if (retried) {
324
+ result = retried;
325
+ }
326
+ }
327
+ routes[route.path] = {
328
+ signature: extractRouteSignature(result.html, { origin: server.origin, status: result.status }),
329
+ };
330
+ }
331
+ catch (error) {
332
+ routes[route.path] = { skipped: 'fetch-failed', error: error instanceof Error ? error.message : String(error) };
333
+ }
334
+ finally {
335
+ clearInterval(routeTicker);
336
+ }
337
+ }
338
+ // Second pass for error pages: by now the dev server is fully warm, so a
339
+ // 500 recorded above was very likely a cold-compile flake. An error
340
+ // snapshot poisons the baseline (the parity gate would compare against
341
+ // the error page forever), so retry once more before accepting it.
342
+ for (const route of staticRoutes) {
343
+ const capture = routes[route.path];
344
+ if (capture && 'signature' in capture && capture.signature.status >= 500) {
345
+ opts.onProgress?.(`retrying ${route.path} (captured ${capture.signature.status})`);
346
+ const retried = await fetchRoute(server.origin, route.url, routeTimeoutMs).catch(() => null);
347
+ if (retried && retried.status < 500) {
348
+ routes[route.path] = {
349
+ signature: extractRouteSignature(retried.html, { origin: server.origin, status: retried.status }),
350
+ };
351
+ }
352
+ }
353
+ }
354
+ }
355
+ finally {
356
+ await server.stop();
357
+ }
358
+ return {
359
+ version: PARITY_BASELINE_VERSION,
360
+ capturedAt: new Date().toISOString(),
361
+ engine: 'dev-server',
362
+ framework: opts.framework,
363
+ command: `${opts.packageManager} run dev`,
364
+ routes,
365
+ };
366
+ }
@@ -0,0 +1 @@
1
+ export {};