blume 2.1.0 → 2.1.1

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 (397) hide show
  1. package/CHANGELOG.md +94 -0
  2. package/dist/cli/{chunk-5cg2rzgf.js → chunk-073rdvgb.js} +19 -48
  3. package/dist/cli/{chunk-5cg2rzgf.js.map → chunk-073rdvgb.js.map} +4 -5
  4. package/dist/cli/{chunk-ga0pf4aj.js → chunk-0n9xkp3d.js} +12 -3
  5. package/dist/cli/{chunk-ga0pf4aj.js.map → chunk-0n9xkp3d.js.map} +3 -3
  6. package/dist/cli/chunk-150jk7km.js +52 -0
  7. package/dist/cli/chunk-150jk7km.js.map +10 -0
  8. package/dist/cli/{chunk-rekqz4qg.js → chunk-313vnn40.js} +16 -15
  9. package/dist/cli/chunk-313vnn40.js.map +10 -0
  10. package/dist/cli/{chunk-gp84za0h.js → chunk-3v3ffbrj.js} +2 -2
  11. package/dist/cli/{chunk-9xr4dgee.js → chunk-3x6x3pph.js} +29 -16
  12. package/dist/cli/chunk-3x6x3pph.js.map +10 -0
  13. package/dist/cli/{chunk-0gz36akr.js → chunk-42t4jxdx.js} +21 -5
  14. package/dist/cli/chunk-42t4jxdx.js.map +12 -0
  15. package/dist/cli/{chunk-ta27feev.js → chunk-54ztw1nj.js} +21 -2
  16. package/dist/cli/chunk-54ztw1nj.js.map +10 -0
  17. package/dist/cli/{chunk-jnwj5kjj.js → chunk-5vjtgs6e.js} +20 -7
  18. package/dist/cli/{chunk-jnwj5kjj.js.map → chunk-5vjtgs6e.js.map} +3 -3
  19. package/dist/cli/chunk-66w9j7p6.js +322 -0
  20. package/dist/cli/chunk-66w9j7p6.js.map +14 -0
  21. package/dist/cli/{chunk-nd1821sk.js → chunk-7ppf1rva.js} +32 -18
  22. package/dist/cli/chunk-7ppf1rva.js.map +10 -0
  23. package/dist/cli/{chunk-p804f3pe.js → chunk-8y2kmjv8.js} +6 -6
  24. package/dist/cli/{chunk-2f7n4qzt.js → chunk-c1y538kd.js} +1 -1
  25. package/dist/cli/{chunk-1n228xqb.js → chunk-c887fj0s.js} +2 -2
  26. package/dist/cli/{chunk-y5h4r2y0.js → chunk-cfyg47zg.js} +15 -5
  27. package/dist/cli/chunk-cfyg47zg.js.map +10 -0
  28. package/dist/cli/{chunk-cmtcnh9f.js → chunk-dzwehpy7.js} +2 -2
  29. package/dist/cli/{chunk-h2a48yhd.js → chunk-e6atmn4h.js} +119 -15
  30. package/dist/cli/{chunk-h2a48yhd.js.map → chunk-e6atmn4h.js.map} +10 -10
  31. package/dist/cli/{chunk-5ffywsmb.js → chunk-e8xw9qkh.js} +8 -6
  32. package/dist/cli/{chunk-5ffywsmb.js.map → chunk-e8xw9qkh.js.map} +3 -3
  33. package/dist/cli/{chunk-ntv4qrt7.js → chunk-e9q7a2ak.js} +14 -14
  34. package/dist/cli/{chunk-xkz5xbtv.js → chunk-ehweg4fr.js} +2366 -1114
  35. package/dist/cli/chunk-ehweg4fr.js.map +218 -0
  36. package/dist/cli/{chunk-zf748avv.js → chunk-ep6nd0rn.js} +176 -281
  37. package/dist/cli/{chunk-zf748avv.js.map → chunk-ep6nd0rn.js.map} +11 -12
  38. package/dist/cli/{chunk-yxmk4pec.js → chunk-fdrkhpjy.js} +16 -15
  39. package/dist/cli/{chunk-yxmk4pec.js.map → chunk-fdrkhpjy.js.map} +3 -3
  40. package/dist/cli/{chunk-5wj2qwn2.js → chunk-ft9vfys6.js} +4 -4
  41. package/dist/cli/{chunk-4h8z9vv5.js → chunk-gb420vvz.js} +89 -46
  42. package/dist/cli/chunk-gb420vvz.js.map +17 -0
  43. package/dist/cli/{chunk-713mngdq.js → chunk-hebn0tpx.js} +76 -10
  44. package/dist/cli/chunk-hebn0tpx.js.map +14 -0
  45. package/dist/cli/{chunk-2n4ps1b3.js → chunk-htrwgabr.js} +40 -22
  46. package/dist/cli/chunk-htrwgabr.js.map +15 -0
  47. package/dist/cli/{chunk-zhvd6adm.js → chunk-hx3xqnk9.js} +13 -13
  48. package/dist/cli/chunk-j134vrp2.js +65 -0
  49. package/dist/cli/chunk-j134vrp2.js.map +10 -0
  50. package/dist/cli/{chunk-y4ykbark.js → chunk-kma9f6sf.js} +2 -2
  51. package/dist/cli/{chunk-py62fewh.js → chunk-mrcccgnh.js} +3 -3
  52. package/dist/cli/{chunk-2f3ndkpw.js → chunk-n0v7m8ry.js} +3 -3
  53. package/dist/cli/{chunk-43zcf4gz.js → chunk-ncj7w596.js} +522 -353
  54. package/dist/cli/chunk-ncj7w596.js.map +35 -0
  55. package/dist/cli/{chunk-9geymqns.js → chunk-nq1d20w2.js} +14 -14
  56. package/dist/cli/{chunk-g2z9x01v.js → chunk-nrns10mj.js} +3 -3
  57. package/dist/cli/{chunk-e7vvk5ya.js → chunk-sds923fa.js} +3 -3
  58. package/dist/cli/{chunk-cy5bm0j0.js → chunk-t2m5j4pr.js} +2 -2
  59. package/dist/cli/{chunk-cy5bm0j0.js.map → chunk-t2m5j4pr.js.map} +1 -1
  60. package/dist/cli/{chunk-yj17vs39.js → chunk-tdqhyxfz.js} +5 -5
  61. package/dist/cli/{chunk-q3wxxq39.js → chunk-tphac74f.js} +5 -5
  62. package/dist/cli/{chunk-6bm0xpgd.js → chunk-w1r4vase.js} +2 -2
  63. package/dist/cli/index.js +24 -19
  64. package/dist/cli/index.js.map +3 -3
  65. package/dist/types/ai/ask-context.d.ts +6 -2
  66. package/dist/types/ai/component-markdown.d.ts +2 -0
  67. package/dist/types/ai/openapi-components.d.ts +4 -1
  68. package/dist/types/astro/integration.d.ts +5 -4
  69. package/dist/types/astro/markdown-negotiation.d.ts +3 -0
  70. package/dist/types/astro/pages.d.ts +10 -0
  71. package/dist/types/cli/init/scaffold.d.ts +1 -1
  72. package/dist/types/components/content/api-field.d.ts +4 -1
  73. package/dist/types/components/content/api-page.d.ts +6 -1
  74. package/dist/types/components/openapi/code-samples.d.ts +29 -0
  75. package/dist/types/components/openapi/helpers.d.ts +22 -1
  76. package/dist/types/components/openapi/security.d.ts +10 -0
  77. package/dist/types/components/openapi/snippets.d.ts +60 -0
  78. package/dist/types/core/changelog-index.d.ts +8 -0
  79. package/dist/types/core/config-input.d.ts +30 -3
  80. package/dist/types/core/data.d.ts +4 -0
  81. package/dist/types/core/i18n-ui.d.ts +2 -0
  82. package/dist/types/core/links.d.ts +8 -0
  83. package/dist/types/core/probe.d.ts +2 -0
  84. package/dist/types/core/project-graph.d.ts +6 -0
  85. package/dist/types/core/redirect-patterns.d.ts +11 -3
  86. package/dist/types/core/schema.d.ts +119 -0
  87. package/dist/types/core/sources/cache.d.ts +3 -0
  88. package/dist/types/core/sources/contentful-rich-text.d.ts +11 -2
  89. package/dist/types/core/sources/contentful.d.ts +17 -1
  90. package/dist/types/core/sources/lexical.d.ts +5 -0
  91. package/dist/types/core/sources/normalize.d.ts +20 -1
  92. package/dist/types/core/sources/remote.d.ts +37 -10
  93. package/dist/types/core/sources/sanity.d.ts +1 -1
  94. package/dist/types/core/types.d.ts +17 -0
  95. package/dist/types/deploy/adapter-output.d.ts +2 -1
  96. package/dist/types/deploy/adapters/cloudflare.d.ts +7 -5
  97. package/dist/types/deploy/adapters/node.d.ts +58 -23
  98. package/dist/types/deploy/adapters/registry.d.ts +10 -0
  99. package/dist/types/deploy/adapters/types.d.ts +3 -2
  100. package/dist/types/deploy/platforms/cloudflare.d.ts +10 -7
  101. package/dist/types/deploy/platforms/node.d.ts +3 -1
  102. package/dist/types/deploy/platforms/types.d.ts +18 -7
  103. package/dist/types/deploy/platforms/vercel.d.ts +20 -1
  104. package/dist/types/deploy/redirects.d.ts +17 -1
  105. package/dist/types/deploy/sitemap.d.ts +2 -1
  106. package/dist/types/deploy/vercel-negotiation.d.ts +42 -21
  107. package/dist/types/openapi/checks.d.ts +27 -0
  108. package/dist/types/openapi/graphql.d.ts +6 -0
  109. package/dist/types/openapi/model.d.ts +15 -4
  110. package/dist/types/openapi/parse.d.ts +3 -0
  111. package/dist/types/openapi/references.d.ts +16 -0
  112. package/dist/types/ratelimit/index.d.ts +1 -1
  113. package/dist/types/ratelimit/schema.d.ts +8 -0
  114. package/dist/types/ratelimit/upstash.d.ts +39 -14
  115. package/dist/types/reference/graphql.d.ts +76 -1
  116. package/dist/types/reference/index.d.ts +1 -1
  117. package/dist/types/reference/openapi.d.ts +2 -2
  118. package/dist/types/reference/options.d.ts +37 -1
  119. package/dist/types/reference/schema.d.ts +84 -0
  120. package/dist/types/search/adapters/registry.d.ts +3 -0
  121. package/dist/types/search/adapters/typesense.d.ts +14 -4
  122. package/dist/types/search/build.d.ts +3 -1
  123. package/dist/types/search/orama-index.d.ts +9 -9
  124. package/dist/types/search/sync/algolia.d.ts +5 -2
  125. package/dist/types/search/sync/index.d.ts +3 -1
  126. package/dist/types/search/sync/typesense.d.ts +11 -7
  127. package/dist/types/sources/contentful.d.ts +16 -0
  128. package/dist/types/sources/github-releases.d.ts +8 -1
  129. package/dist/types/sources/payload.d.ts +2 -0
  130. package/dist/types/sources/registry.d.ts +54 -0
  131. package/dist/types/sources/shared.d.ts +3 -0
  132. package/dist/types/sources/strapi.d.ts +2 -0
  133. package/docs/01-quickstart.mdx +4 -2
  134. package/docs/02-deployment.mdx +31 -13
  135. package/docs/advanced/changelog.mdx +11 -0
  136. package/docs/advanced/skills.mdx +1 -1
  137. package/docs/cli/audit.mdx +30 -7
  138. package/docs/cli/doctor.mdx +5 -1
  139. package/docs/cli/evals.mdx +4 -4
  140. package/docs/cli/translate.mdx +1 -0
  141. package/docs/cli/validate.mdx +4 -3
  142. package/docs/configuration/analytics.mdx +1 -1
  143. package/docs/configuration/assistant.mdx +6 -2
  144. package/docs/configuration/customization.mdx +4 -2
  145. package/docs/configuration/export.mdx +5 -3
  146. package/docs/configuration/index.mdx +3 -2
  147. package/docs/configuration/rate-limiting.mdx +23 -2
  148. package/docs/configuration/search.mdx +37 -14
  149. package/docs/content/components.mdx +2 -2
  150. package/docs/content/frontmatter.mdx +5 -3
  151. package/docs/content/i18n.mdx +2 -2
  152. package/docs/content/includes.mdx +1 -1
  153. package/docs/content/navigation.mdx +4 -4
  154. package/docs/content/sources/contentful.mdx +7 -4
  155. package/docs/content/sources/custom.mdx +7 -3
  156. package/docs/content/sources/github-releases.mdx +10 -2
  157. package/docs/content/sources/index.mdx +3 -3
  158. package/docs/content/sources/notion.mdx +1 -1
  159. package/docs/content/sources/obsidian.mdx +1 -1
  160. package/docs/content/sources/payload.mdx +3 -2
  161. package/docs/content/sources/remote-mdx.mdx +4 -0
  162. package/docs/content/sources/sanity.mdx +2 -2
  163. package/docs/content/sources/strapi.mdx +3 -2
  164. package/docs/content/syntax.mdx +2 -2
  165. package/docs/discoverability/agent-discovery.mdx +1 -1
  166. package/docs/discoverability/index.mdx +1 -1
  167. package/docs/discoverability/json-api.mdx +2 -0
  168. package/docs/discoverability/llms-txt.mdx +1 -1
  169. package/docs/discoverability/markdown.mdx +3 -1
  170. package/docs/discoverability/mcp.mdx +4 -0
  171. package/docs/discoverability/sitemap-and-robots.mdx +1 -1
  172. package/docs/references/api-pages.mdx +1 -1
  173. package/docs/references/asyncapi.mdx +3 -1
  174. package/docs/references/graphql.mdx +13 -1
  175. package/docs/references/openapi.mdx +50 -8
  176. package/package.json +9 -9
  177. package/skills/blume-migrate/SKILL.md +1 -1
  178. package/skills/blume-migrate/references/docusaurus.md +4 -4
  179. package/skills/blume-migrate/references/fumadocs.md +17 -13
  180. package/skills/blume-migrate/references/nextra.md +8 -5
  181. package/skills/blume-migrate/references/starlight.md +9 -7
  182. package/src/ai/ask-context.ts +33 -3
  183. package/src/ai/ask-limits.ts +13 -0
  184. package/src/ai/changelog-markdown.ts +11 -6
  185. package/src/ai/component-markdown.ts +1 -1
  186. package/src/ai/cors.ts +12 -3
  187. package/src/ai/mcp/query.ts +14 -6
  188. package/src/ai/openapi-components.ts +28 -4
  189. package/src/ai/relative-links.ts +4 -38
  190. package/src/astro/generate.ts +78 -48
  191. package/src/astro/integration.ts +16 -13
  192. package/src/astro/markdown-negotiation.ts +3 -0
  193. package/src/astro/module-types.ts +3 -1
  194. package/src/astro/pages.ts +23 -0
  195. package/src/astro/templates.ts +125 -80
  196. package/src/audit/catalog.ts +19 -3
  197. package/src/audit/checks/links.ts +14 -1
  198. package/src/audit/checks/network.ts +110 -6
  199. package/src/audit/checks/redirects.ts +6 -4
  200. package/src/audit/checks/robots.ts +58 -2
  201. package/src/audit/run.ts +3 -0
  202. package/src/audit/types.ts +2 -0
  203. package/src/audit/url.ts +14 -5
  204. package/src/blume-modules.d.ts +5 -1
  205. package/src/cli/args.ts +51 -0
  206. package/src/cli/build-failure.ts +23 -0
  207. package/src/cli/commands/audit.ts +10 -1
  208. package/src/cli/commands/dev.ts +18 -2
  209. package/src/cli/commands/doctor.ts +45 -12
  210. package/src/cli/commands/eval.ts +36 -4
  211. package/src/cli/commands/init.ts +6 -4
  212. package/src/cli/commands/validate.ts +10 -1
  213. package/src/cli/init/scaffold.ts +3 -3
  214. package/src/cli/prepare.ts +6 -3
  215. package/src/cli/required-secrets.ts +1 -1
  216. package/src/components/content/ApiPlayground.astro +6 -2
  217. package/src/components/content/api-field.ts +4 -1
  218. package/src/components/content/api-page.ts +31 -7
  219. package/src/components/content/mermaid-element.ts +15 -1
  220. package/src/components/islands/hooks.ts +27 -1
  221. package/src/components/layout/PageActions.astro +139 -24
  222. package/src/components/layout/RootLayout.astro +10 -2
  223. package/src/components/layout/Search.astro +17 -3
  224. package/src/components/layout/TableOfContents.astro +24 -17
  225. package/src/components/layout/head-scripts.ts +6 -1
  226. package/src/components/layout/search/algolia.ts +10 -1
  227. package/src/components/layout/search/analytics.ts +42 -14
  228. package/src/components/layout/search/endpoint.ts +48 -5
  229. package/src/components/layout/search/pagefind.ts +114 -5
  230. package/src/components/layout/search/types.ts +12 -0
  231. package/src/components/layout/search/typesense.ts +18 -6
  232. package/src/components/openapi/AsyncApiOperation.astro +14 -7
  233. package/src/components/openapi/Authorization.astro +10 -0
  234. package/src/components/openapi/GraphqlOperation.astro +5 -0
  235. package/src/components/openapi/Operation.astro +24 -1
  236. package/src/components/openapi/ParametersTable.astro +8 -4
  237. package/src/components/openapi/Playground.astro +7 -1
  238. package/src/components/openapi/RequestBody.astro +19 -2
  239. package/src/components/openapi/Responses.astro +1 -0
  240. package/src/components/openapi/SchemaTable.astro +15 -3
  241. package/src/components/openapi/async-snippets.ts +61 -5
  242. package/src/components/openapi/async.ts +123 -29
  243. package/src/components/openapi/graphql-helpers.ts +35 -12
  244. package/src/components/openapi/helpers.ts +36 -2
  245. package/src/components/openapi/message-model.ts +54 -11
  246. package/src/components/openapi/message.ts +14 -4
  247. package/src/components/openapi/operation-model.ts +16 -7
  248. package/src/components/openapi/playground-client.ts +24 -5
  249. package/src/components/openapi/playground-schema.ts +1 -1
  250. package/src/components/openapi/schema-tree.ts +44 -14
  251. package/src/components/openapi/security.ts +10 -0
  252. package/src/components/openapi/snippets.ts +5 -3
  253. package/src/components/openapi/validate-json.ts +4 -3
  254. package/src/core/changelog-index.ts +31 -1
  255. package/src/core/component-diagnostics.ts +53 -0
  256. package/src/core/component-overrides.ts +32 -0
  257. package/src/core/config-input.ts +31 -3
  258. package/src/core/data.ts +2 -0
  259. package/src/core/diagnostics.ts +5 -0
  260. package/src/core/i18n-ui.ts +2 -0
  261. package/src/core/includes.ts +1 -1
  262. package/src/core/links.ts +47 -17
  263. package/src/core/probe.ts +26 -6
  264. package/src/core/project-graph.ts +59 -18
  265. package/src/core/redirect-patterns.ts +36 -7
  266. package/src/core/schema.ts +21 -2
  267. package/src/core/sources/cache.ts +6 -0
  268. package/src/core/sources/contentful-rich-text.ts +29 -6
  269. package/src/core/sources/contentful.ts +135 -25
  270. package/src/core/sources/filesystem.ts +26 -4
  271. package/src/core/sources/github-releases.ts +12 -1
  272. package/src/core/sources/lexical.ts +15 -10
  273. package/src/core/sources/mdx-remote.ts +62 -10
  274. package/src/core/sources/normalize.ts +227 -41
  275. package/src/core/sources/notion.ts +7 -1
  276. package/src/core/sources/obsidian.ts +16 -3
  277. package/src/core/sources/payload.ts +38 -15
  278. package/src/core/sources/remote.ts +72 -15
  279. package/src/core/sources/resolve.ts +11 -1
  280. package/src/core/sources/sanity.ts +43 -25
  281. package/src/core/sources/strapi.ts +2 -2
  282. package/src/core/types.ts +18 -0
  283. package/src/core/ui-packs/ar.ts +1 -0
  284. package/src/core/ui-packs/bg.ts +1 -0
  285. package/src/core/ui-packs/bn.ts +1 -0
  286. package/src/core/ui-packs/ca.ts +1 -0
  287. package/src/core/ui-packs/cs.ts +1 -0
  288. package/src/core/ui-packs/da.ts +1 -0
  289. package/src/core/ui-packs/de.ts +1 -0
  290. package/src/core/ui-packs/el.ts +1 -0
  291. package/src/core/ui-packs/es.ts +1 -0
  292. package/src/core/ui-packs/fa.ts +1 -0
  293. package/src/core/ui-packs/fi.ts +1 -0
  294. package/src/core/ui-packs/fr.ts +1 -0
  295. package/src/core/ui-packs/he.ts +1 -0
  296. package/src/core/ui-packs/hi.ts +1 -0
  297. package/src/core/ui-packs/hr.ts +1 -0
  298. package/src/core/ui-packs/hu.ts +1 -0
  299. package/src/core/ui-packs/id.ts +1 -0
  300. package/src/core/ui-packs/it.ts +1 -0
  301. package/src/core/ui-packs/ja.ts +1 -0
  302. package/src/core/ui-packs/ko.ts +1 -0
  303. package/src/core/ui-packs/nl.ts +1 -0
  304. package/src/core/ui-packs/no.ts +1 -0
  305. package/src/core/ui-packs/pl.ts +1 -0
  306. package/src/core/ui-packs/pt-br.ts +1 -0
  307. package/src/core/ui-packs/pt.ts +1 -0
  308. package/src/core/ui-packs/ro.ts +1 -0
  309. package/src/core/ui-packs/ru.ts +1 -0
  310. package/src/core/ui-packs/sk.ts +1 -0
  311. package/src/core/ui-packs/sr.ts +1 -0
  312. package/src/core/ui-packs/sv.ts +1 -0
  313. package/src/core/ui-packs/th.ts +1 -0
  314. package/src/core/ui-packs/tr.ts +1 -0
  315. package/src/core/ui-packs/uk.ts +1 -0
  316. package/src/core/ui-packs/vi.ts +1 -0
  317. package/src/core/ui-packs/zh-tw.ts +1 -0
  318. package/src/core/ui-packs/zh.ts +1 -0
  319. package/src/deploy/adapter-output.ts +7 -2
  320. package/src/deploy/adapters/cloudflare.ts +7 -5
  321. package/src/deploy/adapters/node.ts +47 -9
  322. package/src/deploy/adapters/types.ts +7 -3
  323. package/src/deploy/artifacts.ts +2 -1
  324. package/src/deploy/platforms/cloudflare.ts +13 -9
  325. package/src/deploy/platforms/netlify.ts +2 -1
  326. package/src/deploy/platforms/node.ts +12 -2
  327. package/src/deploy/platforms/types.ts +21 -7
  328. package/src/deploy/platforms/vercel.ts +113 -16
  329. package/src/deploy/redirects.ts +66 -6
  330. package/src/deploy/rss.ts +3 -1
  331. package/src/deploy/sitemap.ts +39 -5
  332. package/src/deploy/vercel-negotiation.ts +290 -102
  333. package/src/eval/agents.ts +18 -1
  334. package/src/eval/prompts.ts +6 -3
  335. package/src/eval/report.ts +34 -13
  336. package/src/eval/run.ts +5 -0
  337. package/src/markdown/relative-links.ts +3 -2
  338. package/src/openapi/checks.ts +273 -0
  339. package/src/openapi/graphql-build.ts +21 -0
  340. package/src/openapi/graphql.ts +11 -0
  341. package/src/openapi/model.ts +15 -3
  342. package/src/openapi/parse.ts +127 -2
  343. package/src/openapi/references.ts +43 -3
  344. package/src/openapi/source.ts +39 -14
  345. package/src/ratelimit/index.ts +1 -1
  346. package/src/ratelimit/runtime.ts +37 -19
  347. package/src/ratelimit/upstash.ts +40 -10
  348. package/src/reference/graphql.ts +15 -1
  349. package/src/reference/index.ts +1 -0
  350. package/src/reference/openapi.ts +2 -2
  351. package/src/reference/options.ts +29 -1
  352. package/src/registry/eject.ts +3 -1
  353. package/src/search/adapters/locale-scope.ts +30 -0
  354. package/src/search/adapters/typesense.ts +14 -4
  355. package/src/search/build.ts +21 -3
  356. package/src/search/orama-index.ts +163 -31
  357. package/src/search/source-pages.ts +29 -0
  358. package/src/search/sync/algolia.ts +99 -9
  359. package/src/search/sync/index.ts +52 -13
  360. package/src/search/sync/typesense.ts +72 -27
  361. package/src/sources/contentful.ts +12 -0
  362. package/src/sources/github-releases.ts +7 -1
  363. package/src/sources/shared.ts +3 -0
  364. package/src/theme/entry.ts +29 -3
  365. package/src/translate/validate.ts +23 -1
  366. package/dist/cli/chunk-0gz36akr.js.map +0 -12
  367. package/dist/cli/chunk-2n4ps1b3.js.map +0 -15
  368. package/dist/cli/chunk-43zcf4gz.js.map +0 -36
  369. package/dist/cli/chunk-4ejxbzee.js +0 -39
  370. package/dist/cli/chunk-4ejxbzee.js.map +0 -10
  371. package/dist/cli/chunk-4h8z9vv5.js.map +0 -16
  372. package/dist/cli/chunk-713mngdq.js.map +0 -14
  373. package/dist/cli/chunk-9xr4dgee.js.map +0 -10
  374. package/dist/cli/chunk-amrb6hgh.js +0 -145
  375. package/dist/cli/chunk-amrb6hgh.js.map +0 -11
  376. package/dist/cli/chunk-nd1821sk.js.map +0 -10
  377. package/dist/cli/chunk-rekqz4qg.js.map +0 -10
  378. package/dist/cli/chunk-ta27feev.js.map +0 -10
  379. package/dist/cli/chunk-xkz5xbtv.js.map +0 -213
  380. package/dist/cli/chunk-y5h4r2y0.js.map +0 -10
  381. /package/dist/cli/{chunk-gp84za0h.js.map → chunk-3v3ffbrj.js.map} +0 -0
  382. /package/dist/cli/{chunk-p804f3pe.js.map → chunk-8y2kmjv8.js.map} +0 -0
  383. /package/dist/cli/{chunk-2f7n4qzt.js.map → chunk-c1y538kd.js.map} +0 -0
  384. /package/dist/cli/{chunk-1n228xqb.js.map → chunk-c887fj0s.js.map} +0 -0
  385. /package/dist/cli/{chunk-cmtcnh9f.js.map → chunk-dzwehpy7.js.map} +0 -0
  386. /package/dist/cli/{chunk-ntv4qrt7.js.map → chunk-e9q7a2ak.js.map} +0 -0
  387. /package/dist/cli/{chunk-5wj2qwn2.js.map → chunk-ft9vfys6.js.map} +0 -0
  388. /package/dist/cli/{chunk-zhvd6adm.js.map → chunk-hx3xqnk9.js.map} +0 -0
  389. /package/dist/cli/{chunk-y4ykbark.js.map → chunk-kma9f6sf.js.map} +0 -0
  390. /package/dist/cli/{chunk-py62fewh.js.map → chunk-mrcccgnh.js.map} +0 -0
  391. /package/dist/cli/{chunk-2f3ndkpw.js.map → chunk-n0v7m8ry.js.map} +0 -0
  392. /package/dist/cli/{chunk-9geymqns.js.map → chunk-nq1d20w2.js.map} +0 -0
  393. /package/dist/cli/{chunk-g2z9x01v.js.map → chunk-nrns10mj.js.map} +0 -0
  394. /package/dist/cli/{chunk-e7vvk5ya.js.map → chunk-sds923fa.js.map} +0 -0
  395. /package/dist/cli/{chunk-yj17vs39.js.map → chunk-tdqhyxfz.js.map} +0 -0
  396. /package/dist/cli/{chunk-q3wxxq39.js.map → chunk-tphac74f.js.map} +0 -0
  397. /package/dist/cli/{chunk-6bm0xpgd.js.map → chunk-w1r4vase.js.map} +0 -0
@@ -1,7 +1,9 @@
1
1
  import { join } from "pathe";
2
2
 
3
+ import { BlumeError } from "../diagnostics.ts";
3
4
  import matter from "../frontmatter.ts";
4
5
  import { neutralizeUnsafeLinks } from "../safe-links.ts";
6
+ import type { Diagnostic } from "../types.ts";
5
7
  import {
6
8
  hashText,
7
9
  loadWithCache,
@@ -9,7 +11,7 @@ import {
9
11
  snapshotCache,
10
12
  } from "./cache.ts";
11
13
  import type { JsonObject, JsonValue } from "./json.ts";
12
- import { asString, getPath, isStringValue } from "./json.ts";
14
+ import { asNumber, asString, getPath, isStringValue } from "./json.ts";
13
15
  import { slugify, slugifyPath } from "./normalize.ts";
14
16
  import type {
15
17
  ContentSource,
@@ -27,8 +29,15 @@ export interface RemoteSourceOptions {
27
29
  * offline warning.
28
30
  */
29
31
  assertConfigured?: () => void;
30
- /** Pull every entry from the API; called on refresh and on each poll. */
31
- fetchEntries: () => Promise<SourceEntry[]>;
32
+ /**
33
+ * Pull every entry from the API; called on refresh and on each poll.
34
+ * `warn` reports a problem with the content itself (an embed the API
35
+ * couldn't resolve, a node with no Markdown), which the load returns
36
+ * beside the entries; a load served from the snapshot repeats none.
37
+ */
38
+ fetchEntries: (
39
+ warn: (diagnostic: Diagnostic) => void
40
+ ) => Promise<SourceEntry[]>;
32
41
  name: string;
33
42
  /** Opt-in dev polling interval (seconds); omit to freeze for the session. */
34
43
  pollInterval?: number;
@@ -56,14 +65,24 @@ export const remoteSource = (
56
65
  refresh = ctx?.refresh ?? true
57
66
  ): Promise<SourceLoadResult> => {
58
67
  options.assertConfigured?.();
68
+ // Set only once a fetch succeeds, so a failed one that falls back to the
69
+ // snapshot reports nothing about pages it never delivered.
70
+ let warnings: Diagnostic[] = [];
59
71
  const result = await loadWithCache(
60
72
  options.name,
61
73
  cache,
62
- options.fetchEntries,
74
+ async () => {
75
+ const found: Diagnostic[] = [];
76
+ const entries = await options.fetchEntries((diagnostic) => {
77
+ found.push(diagnostic);
78
+ });
79
+ warnings = found;
80
+ return entries;
81
+ },
63
82
  refresh
64
83
  );
65
84
  snapshot = new Map(result.entries.map((entry) => [entry.ref, entry]));
66
- return result;
85
+ return { ...result, diagnostics: [...result.diagnostics, ...warnings] };
67
86
  };
68
87
 
69
88
  const read = async (ref: string): Promise<string> => {
@@ -96,6 +115,7 @@ export const remoteSource = (
96
115
  export interface RemoteFrontmatter {
97
116
  description?: string;
98
117
  draft?: boolean;
118
+ sidebar?: { order: number };
99
119
  title?: string;
100
120
  }
101
121
 
@@ -124,6 +144,20 @@ export const stagedEntry = (
124
144
  };
125
145
  };
126
146
 
147
+ /**
148
+ * The error a source throws before its first request when the token its API
149
+ * always requires is unset (Notion, Contentful's Delivery API). Sent without
150
+ * one, the request could only fail, and the build would report the API's
151
+ * wording as a fetch failure instead of the variable to set.
152
+ */
153
+ export const missingSecretError = (name: string, env: string): BlumeError =>
154
+ new BlumeError({
155
+ code: "BLUME_MISSING_SECRET",
156
+ message: `Source "${name}" needs ${env}, which is not set.`,
157
+ severity: "error",
158
+ suggestion: `Set ${env} in .env.local for local dev, or in your host's environment for production.`,
159
+ });
160
+
127
161
  /** How a source calls its CMS: the API's auth headers and an injectable fetch. */
128
162
  export interface RestClient {
129
163
  /** Injected for tests; defaults to the global `fetch`. */
@@ -183,31 +217,50 @@ export interface RemoteFieldMap {
183
217
  description?: string;
184
218
  /** Field holding the last-modified ISO date. */
185
219
  lastModified?: string;
220
+ /** Field holding the sidebar order (a number); no default. */
221
+ order?: string;
186
222
  /** Field holding the route slug. */
187
223
  slug?: string;
188
224
  /** Field holding the page title. */
189
225
  title?: string;
190
226
  }
191
227
 
228
+ /** A field map with its defaults filled in; `order` is read only when set. */
229
+ export type RemoteFields = Required<Omit<RemoteFieldMap, "order">> &
230
+ Pick<RemoteFieldMap, "order">;
231
+
232
+ /**
233
+ * The slug a document's staged entry is named by. It falls back to the
234
+ * document's id when the slug field is missing or slugifies to nothing (pure
235
+ * punctuation), so distinct documents never collapse onto one
236
+ * `untitled.md`; a slashed slug keeps its segments.
237
+ */
238
+ export const documentSlug = (
239
+ doc: JsonObject,
240
+ slugField: string,
241
+ id: string
242
+ ): string =>
243
+ slugifyPath(asString(getPath(doc, slugField)) ?? id) ||
244
+ slugify(id) ||
245
+ "untitled";
246
+
192
247
  /**
193
- * Map a document to a staged entry. The slug falls back to the document's id
194
- * when the slug field is missing or slugifies to nothing (pure punctuation),
195
- * so distinct documents never collapse onto one `untitled.md`; a slashed
196
- * slug keeps its segments. A string body is Markdown and passes through as
197
- * `.md`, its unsafe links reduced to their labels; any other shape goes to
198
- * the CMS's lowerer, and is written as `.mdx`
199
- * when `lowersToMdx` (the source has serializers, see `writesMdx`).
248
+ * Map a document to a staged entry named by its {@link documentSlug}. A
249
+ * number in the `order` field, when one is mapped, becomes the page's
250
+ * sidebar order. A string body is Markdown and passes through as `.md`, its
251
+ * unsafe links reduced to their labels; any other shape goes to the CMS's
252
+ * lowerer, and is written as `.mdx` when `lowersToMdx` (the source has
253
+ * serializers, see `writesMdx`).
200
254
  */
201
255
  export const documentEntry = (
202
256
  doc: JsonObject,
203
- fields: Required<RemoteFieldMap>,
257
+ fields: RemoteFields,
204
258
  id: string,
205
259
  lower: (body: JsonValue) => string,
206
260
  draft = false,
207
261
  lowersToMdx = false
208
262
  ): SourceEntry => {
209
- const slugValue = asString(getPath(doc, fields.slug)) ?? id;
210
- const slug = slugifyPath(slugValue) || slugify(id) || "untitled";
263
+ const slug = documentSlug(doc, fields.slug, id);
211
264
  const data: RemoteFrontmatter = {};
212
265
  const title = asString(getPath(doc, fields.title));
213
266
  const description = asString(getPath(doc, fields.description));
@@ -220,6 +273,10 @@ export const documentEntry = (
220
273
  if (draft) {
221
274
  data.draft = true;
222
275
  }
276
+ const order = fields.order ? asNumber(getPath(doc, fields.order)) : undefined;
277
+ if (order !== undefined) {
278
+ data.sidebar = { order };
279
+ }
223
280
  const body = getPath(doc, fields.body);
224
281
  let markdown = "";
225
282
  let format: "md" | "mdx" = "md";
@@ -138,7 +138,17 @@ const buildSource = (
138
138
  return notionSource({ ...adapter.options, name }, ctx());
139
139
  }
140
140
  case "contentful": {
141
- return contentfulSource({ ...adapter.options, name }, ctx());
141
+ // i18n and versions place an entry hyperlink's route as they do the
142
+ // linked entry's page.
143
+ return contentfulSource(
144
+ {
145
+ ...adapter.options,
146
+ i18n: config.i18n,
147
+ name,
148
+ versions: config.versions,
149
+ },
150
+ ctx()
151
+ );
142
152
  }
143
153
  case "payload": {
144
154
  return payloadSource({ ...adapter.options, name }, ctx());
@@ -3,6 +3,8 @@ import { join } from "pathe";
3
3
  import { BlumeError } from "../diagnostics.ts";
4
4
  import matter from "../frontmatter.ts";
5
5
  import { nodeRequire } from "../node-require.ts";
6
+ import { neutralizeUnsafeLinks } from "../safe-links.ts";
7
+ import type { Diagnostic } from "../types.ts";
6
8
  import {
7
9
  hashText,
8
10
  loadWithCache,
@@ -10,7 +12,7 @@ import {
10
12
  snapshotCache,
11
13
  } from "./cache.ts";
12
14
  import type { JsonObject } from "./json.ts";
13
- import { asString, getPath } from "./json.ts";
15
+ import { asString, getPath, isStringValue } from "./json.ts";
14
16
  import { writesMdx } from "./lower.ts";
15
17
  import { slugify, slugifyPath } from "./normalize.ts";
16
18
  import { portableTextToMarkdown } from "./portable-text.ts";
@@ -35,7 +37,7 @@ export interface SanityFieldMap {
35
37
  description?: string;
36
38
  /** Route slug (dot path); default `slug.current`. */
37
39
  slug?: string;
38
- /** Portable Text body field; default `body`. */
40
+ /** Body field, Portable Text or a Markdown string; default `body`. */
39
41
  body?: string;
40
42
  /** Last-modified ISO date; default `_updatedAt`. */
41
43
  lastModified?: string;
@@ -172,29 +174,32 @@ export const sanitySource = (
172
174
  data.description = description;
173
175
  }
174
176
 
175
- // SAFETY: the configured body field holds Portable Text blocks; a value of
176
- // any other shape fails the `Array.isArray` check below and yields an
177
- // empty body, and the serializer tolerates malformed blocks.
178
- const blocks = (getPath(doc, fields.body ?? "body") ??
179
- []) as PortableTextBlock[];
180
- const markdown = Array.isArray(blocks)
181
- ? portableTextToMarkdown(blocks, {
182
- imageUrl: (block) => {
183
- // SAFETY: `asset` on an image block is Sanity's asset reference
184
- // object; any other shape yields no `_ref` and the image is
185
- // skipped.
186
- const ref = (block.asset as { _ref?: string } | undefined)?._ref;
187
- return ref
188
- ? imageUrlFromRef(ref, options.projectId, options.dataset)
189
- : null;
190
- },
191
- serializers: options.serializers,
192
- })
193
- : "";
194
-
177
+ const body = getPath(doc, fields.body ?? "body");
178
+ let markdown = "";
195
179
  // Serializer output is MDX (components, directives), so a source with
196
- // serializers writes its entries as `.mdx`.
197
- const format = writesMdx(options.serializers) ? "mdx" : "md";
180
+ // serializers writes its Portable Text entries as `.mdx`.
181
+ let format: "md" | "mdx" = writesMdx(options.serializers) ? "mdx" : "md";
182
+ if (isStringValue(body)) {
183
+ // A Markdown field passes through as `.md`, its unsafe links reduced to
184
+ // their labels, as the other CMS sources do (see `documentEntry`).
185
+ markdown = neutralizeUnsafeLinks(`${body.trimEnd()}\n`);
186
+ format = "md";
187
+ } else if (Array.isArray(body)) {
188
+ // SAFETY: an array in the body field is Portable Text blocks; the
189
+ // serializer tolerates malformed blocks.
190
+ markdown = portableTextToMarkdown(body as PortableTextBlock[], {
191
+ imageUrl: (block) => {
192
+ // SAFETY: `asset` on an image block is Sanity's asset reference
193
+ // object; any other shape yields no `_ref` and the image is
194
+ // skipped.
195
+ const ref = (block.asset as { _ref?: string } | undefined)?._ref;
196
+ return ref
197
+ ? imageUrlFromRef(ref, options.projectId, options.dataset)
198
+ : null;
199
+ },
200
+ serializers: options.serializers,
201
+ });
202
+ }
198
203
  const raw = matter.stringify(markdown, data);
199
204
  return {
200
205
  body: { format, text: markdown },
@@ -211,18 +216,31 @@ export const sanitySource = (
211
216
  const load = async (
212
217
  refresh = ctx?.refresh ?? true
213
218
  ): Promise<SourceLoadResult> => {
219
+ const empty: Diagnostic[] = [];
214
220
  const result = await loadWithCache(
215
221
  options.name,
216
222
  cache,
217
223
  async () => {
218
224
  const client = resolveClient(options, ctx?.preview ?? false);
219
225
  const docs = await client.fetch<SanityDocument[]>(options.query);
226
+ // A private dataset answers a query without a token with no
227
+ // documents rather than an error, so an empty result is the only
228
+ // sign the token is missing.
229
+ if (docs.length === 0 && !(options.token ?? process.env.SANITY_TOKEN)) {
230
+ empty.push({
231
+ code: "BLUME_MISSING_SECRET",
232
+ message: `Source "${options.name}" found no documents, and SANITY_TOKEN is not set. A private dataset returns nothing to a query without a token.`,
233
+ severity: "warning",
234
+ suggestion:
235
+ "Set SANITY_TOKEN to a token with read access if the dataset is private.",
236
+ });
237
+ }
220
238
  return docs.map(toEntry);
221
239
  },
222
240
  refresh
223
241
  );
224
242
  snapshot = new Map(result.entries.map((entry) => [entry.ref, entry]));
225
- return result;
243
+ return { ...result, diagnostics: [...result.diagnostics, ...empty] };
226
244
  };
227
245
 
228
246
  const read = async (ref: string): Promise<string> => {
@@ -1,6 +1,6 @@
1
1
  import type { JsonObject } from "./json.ts";
2
2
  import { asNumber, asObject, asString, getPath, objectsIn } from "./json.ts";
3
- import type { RemoteFieldMap, RestClient } from "./remote.ts";
3
+ import type { RemoteFieldMap, RemoteFields, RestClient } from "./remote.ts";
4
4
  import {
5
5
  documentEntry,
6
6
  fetchJson,
@@ -38,7 +38,7 @@ export interface StrapiSourceOptions {
38
38
 
39
39
  const PAGE_SIZE = 100;
40
40
 
41
- const DEFAULT_FIELDS: Required<RemoteFieldMap> = {
41
+ const DEFAULT_FIELDS: RemoteFields = {
42
42
  body: "content",
43
43
  description: "description",
44
44
  lastModified: "updatedAt",
package/src/core/types.ts CHANGED
@@ -62,6 +62,10 @@ export interface PageLink {
62
62
  * only those go through the image pipeline; a plain link to the same path
63
63
  * resolves as a site route. */
64
64
  image?: boolean;
65
+ /** Set when the target is a lowercase `<a href>`, which ships as written:
66
+ * the Markdown pipeline neither resolves its relative path file-style nor
67
+ * mounts the base path on it, so it's checked the way a browser reads it. */
68
+ raw?: boolean;
65
69
  /** 1-based line number in the source file. */
66
70
  line: number;
67
71
  /** 1-based column of the target within the line. */
@@ -72,6 +76,18 @@ export interface PageLink {
72
76
  file?: string;
73
77
  }
74
78
 
79
+ /** A `<Component path="…">` in a page, located like a {@link PageLink}. */
80
+ export interface ExampleUse {
81
+ /** The example's key as written: its path under `examples/`, sans extension. */
82
+ path: string;
83
+ /** 1-based line number in the source file. */
84
+ line: number;
85
+ /** 1-based column of the `path` value within the line. */
86
+ column: number;
87
+ /** Absolute path of the included partial it was written in, if not the page. */
88
+ file?: string;
89
+ }
90
+
75
91
  /**
76
92
  * Resolved project paths. Computed once per CLI invocation and threaded
77
93
  * through the core pipeline.
@@ -194,6 +210,8 @@ export interface PageRecord {
194
210
  links: PageLink[];
195
211
  /** Capitalized JSX component tags used in the body (`.mdx` only). */
196
212
  componentsUsed?: string[];
213
+ /** The string `path` of each `<Component>` example in the body (`.mdx` only). */
214
+ examplesUsed?: ExampleUse[];
197
215
  /** Resolved "last updated" ISO date, when the feature is enabled. */
198
216
  lastModified?: string;
199
217
  /** Absolute paths of files this page `<include>`s, transitively. Drives the
@@ -48,6 +48,7 @@ export const ar: UIStringsOverride = {
48
48
  banner: { dismiss: "إغلاق الإعلان" },
49
49
  changelog: {
50
50
  description: "تحديثات المنتج وملاحظات الإصدارات.",
51
+ empty: "لا توجد إدخالات في سجل التغييرات بعد.",
51
52
  title: "سجل التغييرات",
52
53
  },
53
54
  consent: {
@@ -50,6 +50,7 @@ export const bg: UIStringsOverride = {
50
50
  banner: { dismiss: "Затваряне на съобщението" },
51
51
  changelog: {
52
52
  description: "Актуализации на продукта и бележки към изданията.",
53
+ empty: "Все още няма записи в дневника на промените.",
53
54
  title: "Дневник на промените",
54
55
  },
55
56
  consent: {
@@ -48,6 +48,7 @@ export const bn: UIStringsOverride = {
48
48
  banner: { dismiss: "ঘোষণা বন্ধ করুন" },
49
49
  changelog: {
50
50
  description: "পণ্য আপডেট এবং রিলিজ নোট।",
51
+ empty: "পরিবর্তন লগে এখনও কোনো এন্ট্রি নেই।",
51
52
  title: "পরিবর্তন লগ",
52
53
  },
53
54
  consent: {
@@ -51,6 +51,7 @@ export const ca: UIStringsOverride = {
51
51
  banner: { dismiss: "Tanca l'anunci" },
52
52
  changelog: {
53
53
  description: "Actualitzacions del producte i notes de la versió.",
54
+ empty: "Encara no hi ha entrades al registre de canvis.",
54
55
  title: "Registre de canvis",
55
56
  },
56
57
  consent: {
@@ -48,6 +48,7 @@ export const cs: UIStringsOverride = {
48
48
  banner: { dismiss: "Zavřít oznámení" },
49
49
  changelog: {
50
50
  description: "Novinky produktu a poznámky k vydání.",
51
+ empty: "V seznamu změn zatím nejsou žádné záznamy.",
51
52
  title: "Seznam změn",
52
53
  },
53
54
  consent: {
@@ -49,6 +49,7 @@ export const da: UIStringsOverride = {
49
49
  banner: { dismiss: "Luk meddelelsen" },
50
50
  changelog: {
51
51
  description: "Produktopdateringer og udgivelsesnoter.",
52
+ empty: "Ingen poster i ændringsloggen endnu.",
52
53
  title: "Ændringslog",
53
54
  },
54
55
  consent: {
@@ -51,6 +51,7 @@ export const de: UIStringsOverride = {
51
51
  banner: { dismiss: "Ankündigung schließen" },
52
52
  changelog: {
53
53
  description: "Produkt-Updates und Versionshinweise.",
54
+ empty: "Noch keine Einträge im Änderungsprotokoll.",
54
55
  title: "Änderungsprotokoll",
55
56
  },
56
57
  consent: {
@@ -50,6 +50,7 @@ export const el: UIStringsOverride = {
50
50
  banner: { dismiss: "Κλείσιμο ανακοίνωσης" },
51
51
  changelog: {
52
52
  description: "Ενημερώσεις προϊόντος και σημειώσεις έκδοσης.",
53
+ empty: "Δεν υπάρχουν ακόμη καταχωρίσεις στο ιστορικό αλλαγών.",
53
54
  title: "Ιστορικό αλλαγών",
54
55
  },
55
56
  consent: {
@@ -51,6 +51,7 @@ export const es: UIStringsOverride = {
51
51
  banner: { dismiss: "Cerrar el anuncio" },
52
52
  changelog: {
53
53
  description: "Novedades del producto y notas de la versión.",
54
+ empty: "Todavía no hay entradas en el registro de cambios.",
54
55
  title: "Registro de cambios",
55
56
  },
56
57
  consent: {
@@ -49,6 +49,7 @@ export const fa: UIStringsOverride = {
49
49
  banner: { dismiss: "بستن اطلاعیه" },
50
50
  changelog: {
51
51
  description: "به‌روزرسانی‌های محصول و یادداشت‌های انتشار.",
52
+ empty: "هنوز هیچ موردی در گزارش تغییرات نیست.",
52
53
  title: "گزارش تغییرات",
53
54
  },
54
55
  consent: {
@@ -49,6 +49,7 @@ export const fi: UIStringsOverride = {
49
49
  banner: { dismiss: "Sulje ilmoitus" },
50
50
  changelog: {
51
51
  description: "Tuotepäivitykset ja julkaisutiedot.",
52
+ empty: "Muutoslokissa ei ole vielä merkintöjä.",
52
53
  title: "Muutosloki",
53
54
  },
54
55
  consent: {
@@ -51,6 +51,7 @@ export const fr: UIStringsOverride = {
51
51
  banner: { dismiss: "Fermer l'annonce" },
52
52
  changelog: {
53
53
  description: "Nouveautés du produit et notes de version.",
54
+ empty: "Aucune entrée dans le journal des modifications pour le moment.",
54
55
  title: "Journal des modifications",
55
56
  },
56
57
  consent: {
@@ -48,6 +48,7 @@ export const he: UIStringsOverride = {
48
48
  banner: { dismiss: "סגירת ההודעה" },
49
49
  changelog: {
50
50
  description: "עדכוני מוצר והערות גרסה.",
51
+ empty: "אין עדיין רשומות ביומן השינויים.",
51
52
  title: "יומן שינויים",
52
53
  },
53
54
  consent: {
@@ -48,6 +48,7 @@ export const hi: UIStringsOverride = {
48
48
  banner: { dismiss: "घोषणा बंद करें" },
49
49
  changelog: {
50
50
  description: "उत्पाद अपडेट और रिलीज़ नोट्स।",
51
+ empty: "परिवर्तन लॉग में अभी कोई प्रविष्टि नहीं है।",
51
52
  title: "परिवर्तन लॉग",
52
53
  },
53
54
  consent: {
@@ -50,6 +50,7 @@ export const hr: UIStringsOverride = {
50
50
  banner: { dismiss: "Zatvori obavijest" },
51
51
  changelog: {
52
52
  description: "Ažuriranja proizvoda i napomene o izdanjima.",
53
+ empty: "U popisu promjena još nema unosa.",
53
54
  title: "Popis promjena",
54
55
  },
55
56
  consent: {
@@ -49,6 +49,7 @@ export const hu: UIStringsOverride = {
49
49
  banner: { dismiss: "Közlemény bezárása" },
50
50
  changelog: {
51
51
  description: "Termékfrissítések és kiadási megjegyzések.",
52
+ empty: "A változásnaplóban még nincsenek bejegyzések.",
52
53
  title: "Változásnapló",
53
54
  },
54
55
  consent: {
@@ -50,6 +50,7 @@ export const id: UIStringsOverride = {
50
50
  banner: { dismiss: "Tutup pengumuman" },
51
51
  changelog: {
52
52
  description: "Pembaruan produk dan catatan rilis.",
53
+ empty: "Belum ada entri di log perubahan.",
53
54
  title: "Log perubahan",
54
55
  },
55
56
  consent: {
@@ -49,6 +49,7 @@ export const it: UIStringsOverride = {
49
49
  banner: { dismiss: "Chiudi l'annuncio" },
50
50
  changelog: {
51
51
  description: "Aggiornamenti del prodotto e note di rilascio.",
52
+ empty: "Il registro delle modifiche non contiene ancora voci.",
52
53
  title: "Registro delle modifiche",
53
54
  },
54
55
  consent: {
@@ -50,6 +50,7 @@ export const ja: UIStringsOverride = {
50
50
  banner: { dismiss: "お知らせを閉じる" },
51
51
  changelog: {
52
52
  description: "製品のアップデートとリリースノート。",
53
+ empty: "変更履歴のエントリーはまだありません。",
53
54
  title: "変更履歴",
54
55
  },
55
56
  consent: {
@@ -49,6 +49,7 @@ export const ko: UIStringsOverride = {
49
49
  banner: { dismiss: "공지 닫기" },
50
50
  changelog: {
51
51
  description: "제품 업데이트 및 릴리스 노트.",
52
+ empty: "아직 변경 로그 항목이 없습니다.",
52
53
  title: "변경 로그",
53
54
  },
54
55
  consent: {
@@ -51,6 +51,7 @@ export const nl: UIStringsOverride = {
51
51
  banner: { dismiss: "Aankondiging sluiten" },
52
52
  changelog: {
53
53
  description: "Productupdates en releaseopmerkingen.",
54
+ empty: "Nog geen items in het wijzigingslogboek.",
54
55
  title: "Wijzigingslogboek",
55
56
  },
56
57
  consent: {
@@ -49,6 +49,7 @@ export const no: UIStringsOverride = {
49
49
  banner: { dismiss: "Lukk kunngjøringen" },
50
50
  changelog: {
51
51
  description: "Produktoppdateringer og utgivelsesnotater.",
52
+ empty: "Ingen oppføringer i endringsloggen ennå.",
52
53
  title: "Endringslogg",
53
54
  },
54
55
  consent: {
@@ -50,6 +50,7 @@ export const pl: UIStringsOverride = {
50
50
  banner: { dismiss: "Zamknij ogłoszenie" },
51
51
  changelog: {
52
52
  description: "Aktualizacje produktu i informacje o wydaniach.",
53
+ empty: "W dzienniku zmian nie ma jeszcze wpisów.",
53
54
  title: "Dziennik zmian",
54
55
  },
55
56
  consent: {
@@ -51,6 +51,7 @@ export const ptBR: UIStringsOverride = {
51
51
  banner: { dismiss: "Fechar o anúncio" },
52
52
  changelog: {
53
53
  description: "Atualizações do produto e notas de lançamento.",
54
+ empty: "Ainda não há entradas no registro de alterações.",
54
55
  title: "Registro de alterações",
55
56
  },
56
57
  consent: {
@@ -50,6 +50,7 @@ export const pt: UIStringsOverride = {
50
50
  banner: { dismiss: "Fechar o anúncio" },
51
51
  changelog: {
52
52
  description: "Atualizações do produto e notas de lançamento.",
53
+ empty: "Ainda não há entradas no registo de alterações.",
53
54
  title: "Registo de alterações",
54
55
  },
55
56
  consent: {
@@ -50,6 +50,7 @@ export const ro: UIStringsOverride = {
50
50
  banner: { dismiss: "Închide anunțul" },
51
51
  changelog: {
52
52
  description: "Actualizări ale produsului și note de lansare.",
53
+ empty: "Încă nu există intrări în jurnalul de modificări.",
53
54
  title: "Jurnal de modificări",
54
55
  },
55
56
  consent: {
@@ -50,6 +50,7 @@ export const ru: UIStringsOverride = {
50
50
  banner: { dismiss: "Закрыть объявление" },
51
51
  changelog: {
52
52
  description: "Обновления продукта и примечания к выпускам.",
53
+ empty: "В журнале изменений пока нет записей.",
53
54
  title: "Журнал изменений",
54
55
  },
55
56
  consent: {
@@ -48,6 +48,7 @@ export const sk: UIStringsOverride = {
48
48
  banner: { dismiss: "Zavrieť oznámenie" },
49
49
  changelog: {
50
50
  description: "Novinky produktu a poznámky k vydaniu.",
51
+ empty: "V zozname zmien zatiaľ nie sú žiadne záznamy.",
51
52
  title: "Zoznam zmien",
52
53
  },
53
54
  consent: {
@@ -49,6 +49,7 @@ export const sr: UIStringsOverride = {
49
49
  banner: { dismiss: "Затвори обавештење" },
50
50
  changelog: {
51
51
  description: "Ажурирања производа и белешке о издањима.",
52
+ empty: "У дневнику измена још нема уноса.",
52
53
  title: "Дневник измена",
53
54
  },
54
55
  consent: {
@@ -49,6 +49,7 @@ export const sv: UIStringsOverride = {
49
49
  banner: { dismiss: "Stäng meddelandet" },
50
50
  changelog: {
51
51
  description: "Produktuppdateringar och versionsinformation.",
52
+ empty: "Inga poster i ändringsloggen ännu.",
52
53
  title: "Ändringslogg",
53
54
  },
54
55
  consent: {
@@ -48,6 +48,7 @@ export const th: UIStringsOverride = {
48
48
  banner: { dismiss: "ปิดประกาศ" },
49
49
  changelog: {
50
50
  description: "อัปเดตผลิตภัณฑ์และบันทึกประจำรุ่น",
51
+ empty: "ยังไม่มีรายการในบันทึกการเปลี่ยนแปลง",
51
52
  title: "บันทึกการเปลี่ยนแปลง",
52
53
  },
53
54
  consent: {
@@ -50,6 +50,7 @@ export const tr: UIStringsOverride = {
50
50
  banner: { dismiss: "Duyuruyu kapat" },
51
51
  changelog: {
52
52
  description: "Ürün güncellemeleri ve sürüm notları.",
53
+ empty: "Değişiklik günlüğünde henüz kayıt yok.",
53
54
  title: "Değişiklik günlüğü",
54
55
  },
55
56
  consent: {