docs-i18n 0.9.2 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (267) hide show
  1. package/admin/app/lib/auth-client.ts +21 -0
  2. package/admin/app/lib/auth.server.ts +62 -0
  3. package/admin/app/routeTree.gen.ts +21 -3
  4. package/admin/app/routes/index.tsx +68 -8
  5. package/admin/app/routes/login.tsx +207 -0
  6. package/admin/app/server.ts +23 -0
  7. package/admin/app/styles.css +146 -0
  8. package/admin/app/worker.ts +18 -0
  9. package/admin/dist/client/assets/auth-client-DqJZaFZR.js +3 -0
  10. package/admin/dist/client/assets/login-CQjkiBAF.js +1 -0
  11. package/admin/dist/client/assets/main-bc5tcdGg.js +18 -0
  12. package/admin/dist/client/assets/routes-CTPOG_v1.js +3 -0
  13. package/admin/dist/client/assets/{styles-DJ6QEJmN.css → styles-zS0BbO7e.css} +1 -1
  14. package/admin/dist/client/assets/useNavigate-CEOVvMjz.js +1 -0
  15. package/admin/dist/server/assets/{react-dom-CpO9xk_L.js → __tanstack-start-server-fn-resolver-qK0Yfvti.js} +83 -507
  16. package/admin/dist/server/assets/_tanstack-start-manifest_v-BgMVPPt2.js +21 -0
  17. package/admin/dist/server/assets/adapter-DjXlUL1J.js +2253 -0
  18. package/admin/dist/server/assets/auth-client-CoUpyQIM.js +807 -0
  19. package/admin/dist/server/assets/auth-dSAIPjBw.js +72 -0
  20. package/admin/dist/server/assets/auth.server-BLVDnTCZ.js +31352 -0
  21. package/admin/dist/server/assets/bun-sqlite-dialect-C8OaCWSL-BNNY-FoT.js +154 -0
  22. package/admin/dist/server/assets/compiled-query-CnFG_BVV.js +6967 -0
  23. package/admin/dist/server/assets/d1-sqlite-dialect-sYHNqBte-Bjz-cybU.js +115 -0
  24. package/admin/dist/server/assets/dist-C3-e8E2B.js +215 -0
  25. package/admin/dist/server/assets/dist-CUzFWZag.js +6039 -0
  26. package/admin/dist/server/assets/{init-DJr2glb3.js → dist-DBv71kqn.js} +21 -381
  27. package/admin/dist/server/assets/error-CASJ5tIm.js +457 -0
  28. package/admin/dist/server/assets/error-codes-BhMTGvV6.js +1153 -0
  29. package/admin/dist/server/assets/init-CJJUsPDL.js +49 -0
  30. package/admin/dist/server/assets/job-manager-D9Ab9hgu.js +179 -0
  31. package/admin/dist/server/assets/{jobs-bQfYqSk7.js → jobs-DrEe9YOj.js} +18 -5
  32. package/admin/dist/server/assets/kysely-adapter-YC8RFPyc.js +2 -0
  33. package/admin/dist/server/assets/login-SqzTMYOZ.js +228 -0
  34. package/admin/dist/server/assets/migrator-ZpVZslbq.js +2926 -0
  35. package/admin/dist/server/assets/{misc-DOk3t9vs.js → misc-BSoYldBT.js} +22 -9
  36. package/admin/dist/server/assets/{models-CBb8Owe5.js → models-CoviNHUP.js} +1 -1
  37. package/admin/dist/server/assets/node-sqlite-dialect-BJIaP6lL.js +154 -0
  38. package/admin/dist/server/assets/{router-DlU_fGDK.js → router-D-82slI-.js} +23 -11
  39. package/admin/dist/server/assets/{routes-BcfX6iub.js → routes-B1pNmxF3.js} +43 -29
  40. package/admin/dist/server/assets/{routes-pIM0fgUO.js → routes-C9huiZHw.js} +56 -22
  41. package/admin/dist/server/assets/sqlite-adapter-CL2EidjD.js +69 -0
  42. package/admin/dist/server/assets/{start-BS52hm79.js → start-BiybVoR2.js} +1 -1
  43. package/admin/dist/server/assets/status-B1AGLvHn.js +162 -0
  44. package/admin/dist/server/assets/status-D7PU72hm.js +262 -0
  45. package/admin/dist/server/assets/string-B4XlckmJ.js +6 -0
  46. package/admin/dist/server/assets/useNavigate-0H08s_Q2.js +29 -0
  47. package/admin/dist/server/assets/useRouter-BXJvr8to.js +508 -0
  48. package/admin/dist/server/server.js +70 -90
  49. package/admin/package.json +6 -1
  50. package/admin/server/functions/auth.ts +89 -0
  51. package/admin/server/functions/jobs.ts +30 -2
  52. package/admin/server/functions/misc.ts +25 -5
  53. package/admin/server/functions/status.ts +52 -3
  54. package/admin/server/index.ts +1 -1
  55. package/admin/server/init.ts +21 -9
  56. package/admin/server/services/d1-status.ts +282 -0
  57. package/admin/vite.config.ts +29 -15
  58. package/admin/wrangler.jsonc +16 -0
  59. package/package.json +1 -1
  60. package/template/app/components/markdown/Markdown.tsx +7 -1
  61. package/template/app/utils/docs.server.ts +37 -4
  62. package/template/app/worker.ts +16 -0
  63. package/template/content/docs-i18n/en/cli.md +9 -5
  64. package/template/content/docs-i18n/en/deployment.md +85 -68
  65. package/template/dist/client/assets/{Doc-CGhUfH9r.js → Doc-BKO69_nz.js} +1 -1
  66. package/template/dist/client/assets/{DocsLayout-CoPL9BM9.js → DocsLayout-BGugXxEQ.js} +1 -1
  67. package/template/dist/client/assets/{FileTabs-DsPkEUu7.js → FileTabs-4fZriOj4.js} +1 -1
  68. package/template/dist/client/assets/{Footer-4faHyha8.js → Footer-DYh1AfWA.js} +1 -1
  69. package/template/dist/client/assets/{FrameworkContent-Cxg_X_EP.js → FrameworkContent-rVvjxASn.js} +1 -1
  70. package/template/dist/client/assets/{MarkdownHeadingContext-CwDqQdSh.js → MarkdownHeadingContext-CdvUDZFU.js} +4 -4
  71. package/template/dist/client/assets/{PostNotFound-1ZaWdycM.js → PostNotFound-WoSYGsGu.js} +1 -1
  72. package/template/dist/client/assets/{_basePickBy-FbrKkfHa.js → _basePickBy-Dd7GuR7A.js} +1 -1
  73. package/template/dist/client/assets/{_baseUniq-g6ljCkn8.js → _baseUniq-DMxQLGFI.js} +1 -1
  74. package/template/dist/client/assets/_lang-3AqGszEy.js +1 -0
  75. package/template/dist/client/assets/_lang._project-COkrIqzH.js +1 -0
  76. package/template/dist/client/assets/_lang._project._version-B8vRZczu.js +1 -0
  77. package/template/dist/client/assets/{_lang._project._version.docs-DjZ_USgK.js → _lang._project._version.docs-DokNGgvU.js} +1 -1
  78. package/template/dist/client/assets/{_lang._project._version.docs._-CNb1EMFX.js → _lang._project._version.docs._-CXCNZzOb.js} +1 -1
  79. package/template/dist/client/assets/_lang._project._version.docs._-DR0WSQEb.js +1 -0
  80. package/template/dist/client/assets/_lang._project._version.docs.framework._framework._-C_Grro8r.js +1 -0
  81. package/template/dist/client/assets/{_lang._project._version.docs.framework._framework.index-CqyVy6eq.js → _lang._project._version.docs.framework._framework.index-DsYjXRdj.js} +1 -1
  82. package/template/dist/client/assets/{_lang._project._version.docs.framework.index-S3Frbfn4.js → _lang._project._version.docs.framework.index-DQX1lBi3.js} +1 -1
  83. package/template/dist/client/assets/{_lang._project.docs-CkmM5v1V.js → _lang._project.docs-DsYQj9jI.js} +1 -1
  84. package/template/dist/client/assets/_lang._project.docs._-DlM_D6DD.js +1 -0
  85. package/template/dist/client/assets/{_lang._project.docs._-BHYKQj_2.js → _lang._project.docs._-l2tTjx80.js} +1 -1
  86. package/template/dist/client/assets/_lang.blog-CEwEtalL.js +1 -0
  87. package/template/dist/client/assets/_lang.blog-D6YGC3tK.js +1 -0
  88. package/template/dist/client/assets/_lang.blog._-DgHu4oLy.js +1 -0
  89. package/template/dist/client/assets/{_lang.blog._-bXJwKw9E.js → _lang.blog._-Umz18sQE.js} +1 -1
  90. package/template/dist/client/assets/_lang.blog.index-C8LKUFtD.js +1 -0
  91. package/template/dist/client/assets/{_lang.blog.index-CdR5PZOo.js → _lang.blog.index-DzUqpOBE.js} +1 -1
  92. package/template/dist/client/assets/{_lang.docs-Cp3wmc9k.js → _lang.docs-CUh3R7DD.js} +1 -1
  93. package/template/dist/client/assets/{_lang.docs._-0bwIpeOn.js → _lang.docs._-DlgTPy3s.js} +1 -1
  94. package/template/dist/client/assets/_lang.docs._-DmaQE7lx.js +1 -0
  95. package/template/dist/client/assets/_lang.docs.framework._framework._-B4C4uDFp.js +1 -0
  96. package/template/dist/client/assets/{_lang.docs.framework._framework.index-BLgwIvQA.js → _lang.docs.framework._framework.index-DTg6Xd3p.js} +1 -1
  97. package/template/dist/client/assets/{_lang.docs.framework.index-CzW7Dul3.js → _lang.docs.framework.index-BQ2enasl.js} +1 -1
  98. package/template/dist/client/assets/{arc-B4lRpBfi.js → arc-DGPgC_QF.js} +1 -1
  99. package/template/dist/client/assets/{architectureDiagram-2XIMDMQ5-Coq1Gceq.js → architectureDiagram-2XIMDMQ5-yI53_GAi.js} +1 -1
  100. package/template/dist/client/assets/{blockDiagram-WCTKOSBZ-C7BGTzDN.js → blockDiagram-WCTKOSBZ-C3tr24zy.js} +1 -1
  101. package/template/dist/client/assets/{c4Diagram-IC4MRINW-xTBVTs0q.js → c4Diagram-IC4MRINW-DOA-mowm.js} +1 -1
  102. package/template/dist/client/assets/channel-DzZD7dUQ.js +1 -0
  103. package/template/dist/client/assets/{chunk-4BX2VUAB-DUUHBu75.js → chunk-4BX2VUAB-B6NSnNJJ.js} +1 -1
  104. package/template/dist/client/assets/{chunk-55IACEB6-MUxF_n9_.js → chunk-55IACEB6-CWYwArBH.js} +1 -1
  105. package/template/dist/client/assets/{chunk-FMBD7UC4-BWh6wvYo.js → chunk-FMBD7UC4-DSyn2wIW.js} +1 -1
  106. package/template/dist/client/assets/{chunk-JSJVCQXG-CLUdUV5u.js → chunk-JSJVCQXG-D83nm5W0.js} +1 -1
  107. package/template/dist/client/assets/{chunk-KX2RTZJC-CAlz_cXA.js → chunk-KX2RTZJC-DD7fN9e9.js} +1 -1
  108. package/template/dist/client/assets/{chunk-NQ4KR5QH-BaYKfUVy.js → chunk-NQ4KR5QH-C3YlYiU5.js} +1 -1
  109. package/template/dist/client/assets/{chunk-QZHKN3VN-NxDloxi5.js → chunk-QZHKN3VN-B7wBEuCG.js} +1 -1
  110. package/template/dist/client/assets/{chunk-WL4C6EOR-C2Ncbi5S.js → chunk-WL4C6EOR-ByA1FloT.js} +1 -1
  111. package/template/dist/client/assets/classDiagram-VBA2DB6C-CRozKaUD.js +1 -0
  112. package/template/dist/client/assets/classDiagram-v2-RAHNMMFH-CRozKaUD.js +1 -0
  113. package/template/dist/client/assets/clone-CGnOEl4E.js +1 -0
  114. package/template/dist/client/assets/{cose-bilkent-S5V4N54A-Ct9-ZJcv.js → cose-bilkent-S5V4N54A-nt_sXfWc.js} +1 -1
  115. package/template/dist/client/assets/{dagre-KLK3FWXG-u9dz8dcq.js → dagre-KLK3FWXG-DUsyMTPd.js} +1 -1
  116. package/template/dist/client/assets/{diagram-E7M64L7V-BXmcaktT.js → diagram-E7M64L7V-D5SAypX0.js} +1 -1
  117. package/template/dist/client/assets/{diagram-IFDJBPK2-CRlP5SeV.js → diagram-IFDJBPK2-WhP5c8Vz.js} +1 -1
  118. package/template/dist/client/assets/{diagram-P4PSJMXO-B9rJcj_H.js → diagram-P4PSJMXO-AMrwIlhf.js} +1 -1
  119. package/template/dist/client/assets/{erDiagram-INFDFZHY-DX-vee6w.js → erDiagram-INFDFZHY-BxifSpCV.js} +1 -1
  120. package/template/dist/client/assets/{flowDiagram-PKNHOUZH-CoBCSOFc.js → flowDiagram-PKNHOUZH-BMAowE9I.js} +1 -1
  121. package/template/dist/client/assets/{ganttDiagram-A5KZAMGK-BlqU_ghi.js → ganttDiagram-A5KZAMGK-Bay-0iRq.js} +1 -1
  122. package/template/dist/client/assets/{gitGraphDiagram-K3NZZRJ6-CntCsuti.js → gitGraphDiagram-K3NZZRJ6-Va91W3gw.js} +1 -1
  123. package/template/dist/client/assets/{graph-CZaxZzO8.js → graph-CbBYObK_.js} +1 -1
  124. package/template/dist/client/assets/{index-XelhTkgl.js → index-CF6qz2tX.js} +1 -1
  125. package/template/dist/client/assets/{infoDiagram-LFFYTUFH-_jCC8Jtt.js → infoDiagram-LFFYTUFH-Byd5C-4U.js} +1 -1
  126. package/template/dist/client/assets/{ishikawaDiagram-PHBUUO56-D3m_r2ig.js → ishikawaDiagram-PHBUUO56-DxOKnE1v.js} +1 -1
  127. package/template/dist/client/assets/{journeyDiagram-4ABVD52K-CvRNm03C.js → journeyDiagram-4ABVD52K-IRmt7RI4.js} +1 -1
  128. package/template/dist/client/assets/{kanban-definition-K7BYSVSG-nQcLuNSy.js → kanban-definition-K7BYSVSG-BjTVXn-R.js} +1 -1
  129. package/template/dist/client/assets/{layout-DZIdDq97.js → layout-Bbx6A0bC.js} +1 -1
  130. package/template/dist/client/assets/{linear-C2JcF5ss.js → linear-Df2eAW4A.js} +1 -1
  131. package/template/dist/client/assets/{main-C8MldI1o.js → main-DqZtiCro.js} +2 -2
  132. package/template/dist/client/assets/{mermaid.core-DlB0QBo2.js → mermaid.core-BIoiBcAA.js} +4 -4
  133. package/template/dist/client/assets/{mindmap-definition-YRQLILUH-D9OjtrBW.js → mindmap-definition-YRQLILUH-Btzz0iIP.js} +1 -1
  134. package/template/dist/client/assets/ordinal-Cboi1Yqb.js +1 -0
  135. package/template/dist/client/assets/{pieDiagram-SKSYHLDU-DoYJZfNJ.js → pieDiagram-SKSYHLDU-C2amrGtU.js} +1 -1
  136. package/template/dist/client/assets/{quadrantDiagram-337W2JSQ-Bs71YHJr.js → quadrantDiagram-337W2JSQ-EVgH9VuN.js} +1 -1
  137. package/template/dist/client/assets/{react-C0klD_r9.js → react-qvbbiZob.js} +1 -1
  138. package/template/dist/client/assets/{requirementDiagram-Z7DCOOCP-BWvQcALn.js → requirementDiagram-Z7DCOOCP-BkYPbRis.js} +1 -1
  139. package/template/dist/client/assets/{sankeyDiagram-WA2Y5GQK-CiGy1SQP.js → sankeyDiagram-WA2Y5GQK-B5EIaP-h.js} +1 -1
  140. package/template/dist/client/assets/{sequenceDiagram-2WXFIKYE-DRZim8vR.js → sequenceDiagram-2WXFIKYE-BC33VGOc.js} +1 -1
  141. package/template/dist/client/assets/{stateDiagram-RAJIS63D-BoqzJeL7.js → stateDiagram-RAJIS63D-DiKvWUYb.js} +1 -1
  142. package/template/dist/client/assets/stateDiagram-v2-FVOUBMTO-DjKMPYGe.js +1 -0
  143. package/template/dist/client/assets/{timeline-definition-YZTLITO2-CyvR95Wz.js → timeline-definition-YZTLITO2-QiFlgbRA.js} +1 -1
  144. package/template/dist/client/assets/{treemap-KZPCXAKY-DkXgGvs_.js → treemap-KZPCXAKY-BOYbyS9G.js} +1 -1
  145. package/template/dist/client/assets/{vennDiagram-LZ73GAT5-CVpGZu6p.js → vennDiagram-LZ73GAT5-CqmW7j4r.js} +1 -1
  146. package/template/dist/client/assets/{xychartDiagram-JWTSCODW-Cjqbi_DU.js → xychartDiagram-JWTSCODW-gj6oWX8l.js} +1 -1
  147. package/template/dist/server/assets/{Doc-DKBxQduk.js → Doc-9tJiX5y6.js} +3 -3
  148. package/template/dist/server/assets/{DocsLayout-CQfCTal3.js → DocsLayout-BTjhU_W5.js} +2 -2
  149. package/template/dist/server/assets/{Footer-Dcw5XVqX.js → Footer-CefTi2yh.js} +1 -1
  150. package/template/dist/server/assets/{FrameworkContent-OJfvCBHi.js → FrameworkContent-BkJvuP04.js} +2 -2
  151. package/template/dist/server/assets/{MarkdownHeadingContext-h4SfZq-C.js → MarkdownHeadingContext-37oQpb36.js} +8 -4
  152. package/template/dist/server/assets/{PostNotFound-DRJpnWrj.js → PostNotFound-BqBZf83v.js} +1 -1
  153. package/template/dist/server/assets/{_basePickBy-DJ9gzwF8.js → _basePickBy-DZ3TPUta.js} +2 -2
  154. package/template/dist/server/assets/{_baseUniq-CezmbvU2.js → _baseUniq-DKicWTQT.js} +1 -1
  155. package/template/dist/server/assets/{_lang._project._version.docs-CE_Z2zvG.js → _lang._project._version.docs-DOTNQiDb.js} +1 -1
  156. package/template/dist/server/assets/{_lang._project._version.docs-sJvASz_e.js → _lang._project._version.docs-U-t4mk5_.js} +3 -3
  157. package/template/dist/server/assets/{_lang._project._version.docs._-B2vf_QGY.js → _lang._project._version.docs._-DMgnElWM.js} +5 -5
  158. package/template/dist/server/assets/{_lang._project._version.docs._-CQcamDns.js → _lang._project._version.docs._-DSg82-Ug.js} +1 -1
  159. package/template/dist/server/assets/{_lang._project._version.docs.framework._framework._-54LEIllb.js → _lang._project._version.docs.framework._framework._-DbeN6toN.js} +1 -1
  160. package/template/dist/server/assets/{_lang._project._version.docs.framework._framework._-Dmn8xCf0.js → _lang._project._version.docs.framework._framework._-kBw_9L-F.js} +5 -5
  161. package/template/dist/server/assets/{_lang._project._version.docs.framework._framework.index-COKb9ffR.js → _lang._project._version.docs.framework._framework.index-Bsyj0DD5.js} +1 -1
  162. package/template/dist/server/assets/{_lang._project._version.docs.framework.index-DoEddI6Z.js → _lang._project._version.docs.framework.index-CmLAP_Io.js} +1 -1
  163. package/template/dist/server/assets/{_lang._project.docs-BjOhmwp6.js → _lang._project.docs-Bb4ZZ_jr.js} +3 -3
  164. package/template/dist/server/assets/{_lang._project.docs-dl8MxaGg.js → _lang._project.docs-BsnkRf-R.js} +1 -1
  165. package/template/dist/server/assets/{_lang._project.docs._-hSRVM-U7.js → _lang._project.docs._-ChrpJ61j.js} +5 -5
  166. package/template/dist/server/assets/{_lang._project.docs._-Bq0ajlaH.js → _lang._project.docs._-axRfm8vS.js} +1 -1
  167. package/template/dist/server/assets/{_lang.blog-Dk36D6Ol.js → _lang.blog-8j6IvzvQ.js} +2 -2
  168. package/template/dist/server/assets/{_lang.blog._-Cm8zXsPs.js → _lang.blog._-BPzP97Ac.js} +2 -2
  169. package/template/dist/server/assets/{_lang.blog._-D4CEjSkM.js → _lang.blog._-CjgFipz7.js} +1 -1
  170. package/template/dist/server/assets/{_lang.blog.index-orWcAgbi.js → _lang.blog._-DNX8UglA.js} +2 -2
  171. package/template/dist/server/assets/{_lang.blog.index-ZhMds6Jp.js → _lang.blog.index-CeZnMJBi.js} +1 -1
  172. package/template/dist/server/assets/{_lang.blog.index-Dfy48Gbt.js → _lang.blog.index-Dk5fYp4Q.js} +1 -1
  173. package/template/dist/server/assets/{_lang.blog._-A8h17fpC.js → _lang.blog.index-DzVKqoC4.js} +2 -2
  174. package/template/dist/server/assets/{_lang.docs-CAEkhcnT.js → _lang.docs-B4StnHMb.js} +3 -3
  175. package/template/dist/server/assets/{_lang.docs-CB1sGjRO.js → _lang.docs-DSB3iI6a.js} +1 -1
  176. package/template/dist/server/assets/{_lang.docs._-Zbv8OwJU.js → _lang.docs._--c0In1AT.js} +5 -5
  177. package/template/dist/server/assets/{_lang.docs._-DEX6FutM.js → _lang.docs._-S-y4-3Qn.js} +1 -1
  178. package/template/dist/server/assets/{_lang.docs.framework._framework._-BnpTV3KM.js → _lang.docs.framework._framework._-BFWLyU2h.js} +1 -1
  179. package/template/dist/server/assets/{_lang.docs.framework._framework._-4s4-ZCYh.js → _lang.docs.framework._framework._-Be0U7cDg.js} +5 -5
  180. package/template/dist/server/assets/{_lang.docs.framework._framework.index-BLryfsl2.js → _lang.docs.framework._framework.index-BZ512aSk.js} +1 -1
  181. package/template/dist/server/assets/{_lang.docs.framework.index-DGxWQH6q.js → _lang.docs.framework.index-U8z3j4kz.js} +1 -1
  182. package/template/dist/server/assets/{_tanstack-start-manifest_v-CURwM8Tc.js → _tanstack-start-manifest_v-DXpQ8503.js} +1 -1
  183. package/template/dist/server/assets/{arc-BwftnT5H.js → arc-B4h6h_n6.js} +1 -1
  184. package/template/dist/server/assets/{architecture-PBZL5I3N-KbDVC6gM.js → architecture-PBZL5I3N-CUwqLXkR.js} +6 -6
  185. package/template/dist/server/assets/{architectureDiagram-2XIMDMQ5-BoLvWxb3.js → architectureDiagram-2XIMDMQ5-CuCoxdBe.js} +6 -6
  186. package/template/dist/server/assets/{blockDiagram-WCTKOSBZ-GPFcXs-f.js → blockDiagram-WCTKOSBZ-D5PsUOim.js} +6 -6
  187. package/template/dist/server/assets/{blog.server-Bbk2Ifog.js → blog.server-WqzZ00iA.js} +1 -1
  188. package/template/dist/server/assets/{c4Diagram-IC4MRINW-EQwQCspo.js → c4Diagram-IC4MRINW-CXy5xO3o.js} +2 -2
  189. package/template/dist/server/assets/{channel-CxvwuPH7.js → channel-D0l-mWaF.js} +1 -1
  190. package/template/dist/server/assets/{chunk-4BX2VUAB-DUgcw5ei.js → chunk-4BX2VUAB-M7FVHMss.js} +1 -1
  191. package/template/dist/server/assets/{chunk-55IACEB6-Cn15uD91.js → chunk-55IACEB6-D_gDAje5.js} +1 -1
  192. package/template/dist/server/assets/{chunk-FMBD7UC4-Ck3iyLPu.js → chunk-FMBD7UC4-B5Bebx-Y.js} +1 -1
  193. package/template/dist/server/assets/{chunk-JSJVCQXG-VAT8yncE.js → chunk-JSJVCQXG-DxBkq-uB.js} +1 -1
  194. package/template/dist/server/assets/{chunk-KX2RTZJC-B1bd2VmA.js → chunk-KX2RTZJC-BMHm1EGi.js} +1 -1
  195. package/template/dist/server/assets/{chunk-NQ4KR5QH-CR67GG9C.js → chunk-NQ4KR5QH-Cp28pTwT.js} +3 -3
  196. package/template/dist/server/assets/{chunk-QZHKN3VN-B9SSazM4.js → chunk-QZHKN3VN-Bq5GZqaR.js} +1 -1
  197. package/template/dist/server/assets/{chunk-WL4C6EOR-DZ4Pjuao.js → chunk-WL4C6EOR-C9Nj5GdW.js} +5 -5
  198. package/template/dist/server/assets/{classDiagram-VBA2DB6C-CA6_4Wb2.js → classDiagram-VBA2DB6C-CUchv9T5.js} +6 -6
  199. package/template/dist/server/assets/{classDiagram-v2-RAHNMMFH-CA6_4Wb2.js → classDiagram-v2-RAHNMMFH-CUchv9T5.js} +6 -6
  200. package/template/dist/server/assets/{clone-DJHP_iVy.js → clone-CJcTi58S.js} +1 -1
  201. package/template/dist/server/assets/{cose-bilkent-S5V4N54A-DtU-cN6W.js → cose-bilkent-S5V4N54A-CxvCMhN_.js} +1 -1
  202. package/template/dist/server/assets/{dagre-KLK3FWXG-yZYrVU4p.js → dagre-KLK3FWXG-B5bQP7FL.js} +6 -6
  203. package/template/dist/server/assets/{diagram-E7M64L7V-8Yyz0aw0.js → diagram-E7M64L7V-NjHca90S.js} +8 -8
  204. package/template/dist/server/assets/{diagram-IFDJBPK2-DcxFYI3M.js → diagram-IFDJBPK2-CoTCfBKd.js} +6 -6
  205. package/template/dist/server/assets/{diagram-P4PSJMXO-CehxUcI0.js → diagram-P4PSJMXO-DHvGgYjH.js} +6 -6
  206. package/template/dist/server/assets/{docs.server-7EUAkSBN.js → docs.server-BSH7IvIU.js} +3884 -444
  207. package/template/dist/server/assets/{erDiagram-INFDFZHY-Bu2p1_Pj.js → erDiagram-INFDFZHY-01crajKr.js} +4 -4
  208. package/template/dist/server/assets/{flowDiagram-PKNHOUZH-B_eKR7I0.js → flowDiagram-PKNHOUZH-BkUQ_vxg.js} +6 -6
  209. package/template/dist/server/assets/{ganttDiagram-A5KZAMGK-DP6YEZof.js → ganttDiagram-A5KZAMGK-DvrO-w2P.js} +2 -2
  210. package/template/dist/server/assets/{gitGraph-HDMCJU4V-Bt0qhVL4.js → gitGraph-HDMCJU4V-h9JNaxB7.js} +6 -6
  211. package/template/dist/server/assets/{gitGraphDiagram-K3NZZRJ6-DwvkdYrg.js → gitGraphDiagram-K3NZZRJ6-BoKm6Fm-.js} +7 -7
  212. package/template/dist/server/assets/{graph-BVFNe_k5.js → graph-BoxbfI7Z.js} +2 -2
  213. package/template/dist/server/assets/{index-BvagF3L5.js → index-Jfzi6SZW.js} +2 -2
  214. package/template/dist/server/assets/{info-3K5VOQVL-CFejRnvB.js → info-3K5VOQVL-DgaSHqkS.js} +6 -6
  215. package/template/dist/server/assets/{infoDiagram-LFFYTUFH-D0v9uyXI.js → infoDiagram-LFFYTUFH-DgV5W8-I.js} +5 -5
  216. package/template/dist/server/assets/{ishikawaDiagram-PHBUUO56-DZumspL4.js → ishikawaDiagram-PHBUUO56-CqlMQ0Fq.js} +1 -1
  217. package/template/dist/server/assets/{journeyDiagram-4ABVD52K-nRp_-qZp.js → journeyDiagram-4ABVD52K-D6ySTub8.js} +4 -4
  218. package/template/dist/server/assets/{kanban-definition-K7BYSVSG-BMKyyzjt.js → kanban-definition-K7BYSVSG-BT8m7Cwk.js} +2 -2
  219. package/template/dist/server/assets/{layout-mpiN5R-5.js → layout-CkYcErfn.js} +4 -4
  220. package/template/dist/server/assets/{linear-CqNYgjEx.js → linear-F_0dWGZL.js} +1 -1
  221. package/template/dist/server/assets/{mermaid-parser.core-B8Uu3QZY.js → mermaid-parser.core-q5MdUJuo.js} +11 -11
  222. package/template/dist/server/assets/{mermaid.core-BI3nMhNO.js → mermaid.core-DOWTODR1.js} +31 -31
  223. package/template/dist/server/assets/{mindmap-definition-YRQLILUH-DCoFqLPh.js → mindmap-definition-YRQLILUH-BQxlQqn-.js} +3 -3
  224. package/template/dist/server/assets/{ordinal-Bcam90FY.js → ordinal-CxptdPJm.js} +1 -1
  225. package/template/dist/server/assets/{packet-RMMSAZCW-djgonfKN.js → packet-RMMSAZCW-D8FkLZuP.js} +6 -6
  226. package/template/dist/server/assets/{pie-UPGHQEXC-Dug2t-PE.js → pie-UPGHQEXC-Diw2fHLk.js} +6 -6
  227. package/template/dist/server/assets/{pieDiagram-SKSYHLDU-CS0_hW4w.js → pieDiagram-SKSYHLDU-B1J4UJZ7.js} +8 -8
  228. package/template/dist/server/assets/{quadrantDiagram-337W2JSQ-BpQNM0zu.js → quadrantDiagram-337W2JSQ-BvjKLapg.js} +2 -2
  229. package/template/dist/server/assets/{radar-KQ55EAFF-3ir2W9Wi.js → radar-KQ55EAFF-CcBdPU3n.js} +6 -6
  230. package/template/dist/server/assets/{requirementDiagram-Z7DCOOCP-D92RyjV4.js → requirementDiagram-Z7DCOOCP-Bgr_wnAs.js} +3 -3
  231. package/template/dist/server/assets/{router-DK1vpPhv.js → router-DxwPl-Dc.js} +18 -18
  232. package/template/dist/server/assets/{sankeyDiagram-WA2Y5GQK-DCPRB-xO.js → sankeyDiagram-WA2Y5GQK-B0UwtyW3.js} +2 -2
  233. package/template/dist/server/assets/{sequenceDiagram-2WXFIKYE-C1ab2VvU.js → sequenceDiagram-2WXFIKYE-BbxQJHjO.js} +3 -3
  234. package/template/dist/server/assets/{stateDiagram-RAJIS63D-GhG1G3ff.js → stateDiagram-RAJIS63D-Cg-uJ_UO.js} +8 -8
  235. package/template/dist/server/assets/{stateDiagram-v2-FVOUBMTO-C-KtMadV.js → stateDiagram-v2-FVOUBMTO-BWVPrqfa.js} +4 -4
  236. package/template/dist/server/assets/{timeline-definition-YZTLITO2-DyfAQCd4.js → timeline-definition-YZTLITO2-DCSJT2WT.js} +2 -2
  237. package/template/dist/server/assets/{treemap-KZPCXAKY-Cn0Cw4Cl.js → treemap-KZPCXAKY-a0nhlKgx.js} +6 -6
  238. package/template/dist/server/assets/{vennDiagram-LZ73GAT5-D2Ak5JUa.js → vennDiagram-LZ73GAT5-Bk2HQEQq.js} +1 -1
  239. package/template/dist/server/assets/{xychartDiagram-JWTSCODW-DqoBOs1L.js → xychartDiagram-JWTSCODW-C4svHkt_.js} +3 -3
  240. package/template/dist/server/server.js +16 -16
  241. package/template/package.json +2 -0
  242. package/template/vite.config.ts +33 -18
  243. package/template/wrangler.jsonc +2 -2
  244. package/admin/dist/client/assets/main-CSFhgz4p.js +0 -17
  245. package/admin/dist/client/assets/routes-C6bCOSX-.js +0 -3
  246. package/admin/dist/server/assets/_tanstack-start-manifest_v-BE5XHVZ2.js +0 -17
  247. package/admin/dist/server/assets/redirect-DtfSYi2g.js +0 -51
  248. package/admin/dist/server/assets/status-CZz8Rs_7.js +0 -81
  249. package/template/dist/client/assets/_lang-Cpuy5xmU.js +0 -1
  250. package/template/dist/client/assets/_lang._project-DBdR04In.js +0 -1
  251. package/template/dist/client/assets/_lang._project._version-CtCLMJs2.js +0 -1
  252. package/template/dist/client/assets/_lang._project._version.docs._-CxgRZ17Q.js +0 -1
  253. package/template/dist/client/assets/_lang._project._version.docs.framework._framework._-Qph6wahA.js +0 -1
  254. package/template/dist/client/assets/_lang._project.docs._-C_ZfXEJ7.js +0 -1
  255. package/template/dist/client/assets/_lang.blog-BcRmhv23.js +0 -1
  256. package/template/dist/client/assets/_lang.blog-C5Aa7k5r.js +0 -1
  257. package/template/dist/client/assets/_lang.blog._-BVw4vhtF.js +0 -1
  258. package/template/dist/client/assets/_lang.blog.index-Y35iFzkp.js +0 -1
  259. package/template/dist/client/assets/_lang.docs._-B9hwwoTY.js +0 -1
  260. package/template/dist/client/assets/_lang.docs.framework._framework._-BENbKZIu.js +0 -1
  261. package/template/dist/client/assets/channel-C_1F7tzH.js +0 -1
  262. package/template/dist/client/assets/classDiagram-VBA2DB6C-CqViWWFw.js +0 -1
  263. package/template/dist/client/assets/classDiagram-v2-RAHNMMFH-CqViWWFw.js +0 -1
  264. package/template/dist/client/assets/clone-EeiNAO_N.js +0 -1
  265. package/template/dist/client/assets/ordinal-BENe2yWM.js +0 -1
  266. package/template/dist/client/assets/stateDiagram-v2-FVOUBMTO-CJYWvllO.js +0 -1
  267. /package/admin/dist/server/assets/{createServerRpc-DJq9yo-B.js → createServerRpc-Cyyxq9HQ.js} +0 -0
@@ -0,0 +1,282 @@
1
+ /**
2
+ * D1-backed status service for CF Workers deployment.
3
+ *
4
+ * Queries the same sources/source_files/translations tables as the local
5
+ * TranslationCache, but via D1 instead of better-sqlite3.
6
+ *
7
+ * This is read-only — the admin dashboard on CF Workers can view
8
+ * translation status but cannot run translate jobs or modify the cache.
9
+ */
10
+
11
+ function getD1(): D1Database | null {
12
+ try {
13
+ return (globalThis as any).__D1_DB ?? null;
14
+ } catch {
15
+ return null;
16
+ }
17
+ }
18
+
19
+ function requireD1(): D1Database {
20
+ const db = getD1();
21
+ if (!db) throw new Error('D1 database not available');
22
+ return db;
23
+ }
24
+
25
+ export async function d1GetVersions(): Promise<string[]> {
26
+ const db = requireD1();
27
+ const result = await db
28
+ .prepare('SELECT DISTINCT version FROM source_files ORDER BY version')
29
+ .all<{ version: string }>();
30
+ return result.results.map((r) => r.version);
31
+ }
32
+
33
+ export async function d1GetLangs(): Promise<string[]> {
34
+ const db = requireD1();
35
+ const result = await db
36
+ .prepare('SELECT DISTINCT lang FROM translations ORDER BY lang')
37
+ .all<{ lang: string }>();
38
+ return result.results.map((r) => r.lang);
39
+ }
40
+
41
+ export async function d1SectionStats(
42
+ version: string,
43
+ lang: string,
44
+ ): Promise<
45
+ {
46
+ section: string;
47
+ totalFiles: number;
48
+ translatedFiles: number;
49
+ totalNodes: number;
50
+ translatedNodes: number;
51
+ }[]
52
+ > {
53
+ const db = requireD1();
54
+ const result = await db
55
+ .prepare(
56
+ `
57
+ WITH file_coverage AS (
58
+ SELECT
59
+ sf.file,
60
+ CASE
61
+ WHEN sf.file LIKE 'docs/%' THEN 'docs'
62
+ WHEN sf.file LIKE 'blog/%' THEN 'blog'
63
+ WHEN sf.file LIKE 'learn/%' THEN 'learn'
64
+ ELSE 'other'
65
+ END as section,
66
+ COUNT(DISTINCT sf.key) as total_nodes,
67
+ COUNT(DISTINCT t.key) as translated_nodes
68
+ FROM source_files sf
69
+ LEFT JOIN translations t ON t.key = sf.key AND t.lang = ?
70
+ WHERE sf.version = ?
71
+ GROUP BY sf.file
72
+ )
73
+ SELECT
74
+ section,
75
+ COUNT(*) as totalFiles,
76
+ SUM(CASE WHEN translated_nodes = total_nodes THEN 1 ELSE 0 END) as translatedFiles,
77
+ SUM(total_nodes) as totalNodes,
78
+ SUM(translated_nodes) as translatedNodes
79
+ FROM file_coverage
80
+ GROUP BY section
81
+ ORDER BY section
82
+ `,
83
+ )
84
+ .bind(lang, version)
85
+ .all<{
86
+ section: string;
87
+ totalFiles: number;
88
+ translatedFiles: number;
89
+ totalNodes: number;
90
+ translatedNodes: number;
91
+ }>();
92
+ return result.results;
93
+ }
94
+
95
+ export async function d1SourceCount(version: string): Promise<number> {
96
+ const db = requireD1();
97
+ const result = await db
98
+ .prepare(
99
+ 'SELECT COUNT(DISTINCT key) as count FROM source_files WHERE version = ?',
100
+ )
101
+ .bind(version)
102
+ .first<{ count: number }>();
103
+ return result?.count ?? 0;
104
+ }
105
+
106
+ export async function d1FileCoverage(
107
+ version: string,
108
+ lang: string,
109
+ ): Promise<{ file: string; total: number; translated: number }[]> {
110
+ const db = requireD1();
111
+ const result = await db
112
+ .prepare(
113
+ `
114
+ SELECT
115
+ sf.file,
116
+ COUNT(DISTINCT sf.key) as total,
117
+ COUNT(DISTINCT t.key) as translated
118
+ FROM source_files sf
119
+ LEFT JOIN translations t ON t.key = sf.key AND t.lang = ?
120
+ WHERE sf.version = ?
121
+ GROUP BY sf.file
122
+ ORDER BY sf.file
123
+ `,
124
+ )
125
+ .bind(lang, version)
126
+ .all<{ file: string; total: number; translated: number }>();
127
+ return result.results;
128
+ }
129
+
130
+ export async function d1FileDetail(
131
+ version: string,
132
+ lang: string,
133
+ file: string,
134
+ ): Promise<
135
+ {
136
+ key: string;
137
+ source: string;
138
+ type: string;
139
+ translation: string | null;
140
+ line: number;
141
+ }[]
142
+ > {
143
+ const db = requireD1();
144
+ const result = await db
145
+ .prepare(
146
+ `
147
+ SELECT
148
+ s.key,
149
+ s.text as source,
150
+ s.type,
151
+ t.value as translation,
152
+ sf.line
153
+ FROM source_files sf
154
+ JOIN sources s ON s.key = sf.key
155
+ LEFT JOIN translations t ON t.key = sf.key AND t.lang = ?
156
+ WHERE sf.version = ? AND sf.file = ?
157
+ ORDER BY sf.line
158
+ `,
159
+ )
160
+ .bind(lang, version, file)
161
+ .all<{
162
+ key: string;
163
+ source: string;
164
+ type: string;
165
+ translation: string | null;
166
+ line: number;
167
+ }>();
168
+ return result.results;
169
+ }
170
+
171
+ export async function d1GetTranslation(
172
+ lang: string,
173
+ key: string,
174
+ ): Promise<string | null> {
175
+ const db = requireD1();
176
+ const result = await db
177
+ .prepare('SELECT value FROM translations WHERE lang = ? AND key = ?')
178
+ .bind(lang, key)
179
+ .first<{ value: string }>();
180
+ return result?.value ?? null;
181
+ }
182
+
183
+ export async function d1DeleteTranslation(
184
+ lang: string,
185
+ key: string,
186
+ ): Promise<boolean> {
187
+ const db = requireD1();
188
+ const result = await db
189
+ .prepare('DELETE FROM translations WHERE lang = ? AND key = ?')
190
+ .bind(lang, key)
191
+ .run();
192
+ return (result.meta?.changes ?? 0) > 0;
193
+ }
194
+
195
+ export async function d1GetOverview(
196
+ versions: string[],
197
+ langs: string[],
198
+ ): Promise<
199
+ Record<
200
+ string,
201
+ {
202
+ enFileCount: number;
203
+ langs: Record<
204
+ string,
205
+ {
206
+ sections: Record<string, any>;
207
+ totalFiles: number;
208
+ translatedFiles: number;
209
+ totalNodes: number;
210
+ translatedNodes: number;
211
+ }
212
+ >;
213
+ }
214
+ >
215
+ > {
216
+ const db = requireD1();
217
+ const result: Record<string, any> = {};
218
+
219
+ for (const version of versions) {
220
+ // Count unique files for this version
221
+ const fileCountResult = await db
222
+ .prepare(
223
+ 'SELECT COUNT(DISTINCT file) as count FROM source_files WHERE version = ?',
224
+ )
225
+ .bind(version)
226
+ .first<{ count: number }>();
227
+ const enFileCount = fileCountResult?.count ?? 0;
228
+
229
+ const langStats: Record<string, any> = {};
230
+ for (const lang of langs) {
231
+ const sections = await d1SectionStats(version, lang);
232
+ let totalFiles = 0,
233
+ translatedFiles = 0,
234
+ totalNodes = 0,
235
+ translatedNodes = 0;
236
+ const sectionMap: Record<string, any> = {};
237
+ for (const s of sections) {
238
+ sectionMap[s.section] = s;
239
+ totalFiles += s.totalFiles;
240
+ translatedFiles += s.translatedFiles;
241
+ totalNodes += s.totalNodes;
242
+ translatedNodes += s.translatedNodes;
243
+ }
244
+ langStats[lang] = {
245
+ sections: sectionMap,
246
+ totalFiles,
247
+ translatedFiles,
248
+ totalNodes,
249
+ translatedNodes,
250
+ };
251
+ }
252
+ result[version] = { enFileCount, langs: langStats };
253
+ }
254
+
255
+ return result;
256
+ }
257
+
258
+ /**
259
+ * Get file blocks from D1 — returns source nodes with their translations,
260
+ * in line order. Note: without filesystem access, we can only return
261
+ * translatable blocks (no gap/whitespace blocks between them).
262
+ */
263
+ export async function d1GetFileBlocks(
264
+ version: string,
265
+ lang: string,
266
+ file: string,
267
+ ): Promise<
268
+ {
269
+ md5: string | null;
270
+ type: string;
271
+ source: string;
272
+ translation: string | null;
273
+ }[]
274
+ > {
275
+ const detail = await d1FileDetail(version, lang, file);
276
+ return detail.map((row) => ({
277
+ md5: row.key,
278
+ type: row.type,
279
+ source: row.source,
280
+ translation: row.translation,
281
+ }));
282
+ }
@@ -3,24 +3,38 @@ import { defineConfig } from 'vite';
3
3
  import { tanstackStart } from '@tanstack/react-start/plugin/vite';
4
4
  import react from '@vitejs/plugin-react';
5
5
 
6
+ // CF Workers deploy mode: DOCS_I18N_CF=1 enables @cloudflare/vite-plugin
7
+ const isCfBuild = process.env.DOCS_I18N_CF === '1';
8
+
9
+ const plugins: any[] = [
10
+ tanstackStart({
11
+ srcDirectory: 'app',
12
+ }),
13
+ react(),
14
+ ];
15
+
16
+ // Add Cloudflare plugin for CF Workers builds
17
+ if (isCfBuild) {
18
+ const { cloudflare } = await import('@cloudflare/vite-plugin');
19
+ plugins.unshift(cloudflare({ viteEnvironment: { name: 'ssr' } }));
20
+ }
21
+
6
22
  export default defineConfig({
7
- plugins: [
8
- tanstackStart({
9
- srcDirectory: 'app',
10
- }),
11
- react(),
12
- ],
23
+ plugins,
13
24
  // Bundle all deps into server build so it can run without node_modules
14
- environments: {
15
- ssr: {
16
- build: {
17
- rollupOptions: {
18
- external: ['node:*'],
25
+ // (Only for non-CF builds; CF plugin manages its own SSR environment)
26
+ ...(!isCfBuild && {
27
+ environments: {
28
+ ssr: {
29
+ build: {
30
+ rollupOptions: {
31
+ external: [/^node:/, 'better-sqlite3'],
32
+ },
33
+ },
34
+ resolve: {
35
+ noExternal: true,
19
36
  },
20
- },
21
- resolve: {
22
- noExternal: true,
23
37
  },
24
38
  },
25
- },
39
+ }),
26
40
  });
@@ -0,0 +1,16 @@
1
+ {
2
+ "name": "docs-i18n-admin",
3
+ "compatibility_date": "2025-01-01",
4
+ "compatibility_flags": ["nodejs_compat_v2"],
5
+ "main": "./app/worker.ts",
6
+ "assets": {
7
+ "directory": "dist/client"
8
+ },
9
+ "d1_databases": [
10
+ {
11
+ "binding": "DB",
12
+ "database_name": "docs-i18n-db",
13
+ "database_id": "597ff8e0-36fd-4bd5-a3fd-8f9e5bd14662"
14
+ }
15
+ ]
16
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "docs-i18n",
3
- "version": "0.9.2",
3
+ "version": "0.11.0",
4
4
  "description": "Universal documentation translation engine — parse, translate, cache, assemble, manage.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -211,6 +211,12 @@ export const Markdown = React.memo(function Markdown({
211
211
  return null
212
212
  }
213
213
 
214
- return parse(rendered.markup, options)
214
+ try {
215
+ return parse(rendered.markup, options)
216
+ } catch {
217
+ // Fallback: render raw HTML when DOM-based parser is unavailable (e.g., CF Workers)
218
+ // Client-side hydration will re-render correctly with full DOM APIs
219
+ return <div dangerouslySetInnerHTML={{ __html: rendered.markup }} />
220
+ }
215
221
  }, [rendered.markup, options])
216
222
  })
@@ -9,8 +9,9 @@ import { readFileSync, existsSync, readdirSync, statSync } from 'node:fs'
9
9
  import { resolve, relative, join } from 'node:path'
10
10
  import matter from 'gray-matter'
11
11
  import type { LoadedDoc, DocsConfig, DocsConfigItem, ProjectConfig } from '~/types'
12
- import { type ContentLoader, createFsLoader } from './content-loader'
12
+ import { type ContentLoader, createFsLoader, createD1Loader } from './content-loader'
13
13
  import { generateSidebarFromFilesystem } from './sidebar-generator'
14
+ import { createDb } from '~/db'
14
15
 
15
16
  /**
16
17
  * Get the project root directory.
@@ -60,6 +61,38 @@ export function setContentLoader(loader: ContentLoader) {
60
61
  _loader = loader
61
62
  }
62
63
 
64
+ /** Cached D1 reference (or false if not available). */
65
+ let _d1Cache: D1Database | false | undefined
66
+
67
+ /**
68
+ * Try to get D1 binding from Cloudflare Workers environment.
69
+ * Returns null if not running on CF Workers.
70
+ */
71
+ function getD1(): D1Database | null {
72
+ if (_d1Cache !== undefined) return _d1Cache || null
73
+ try {
74
+ // globalThis.__D1_DB is set by the worker entry (app/worker.ts)
75
+ const db = (globalThis as any).__D1_DB
76
+ if (db) {
77
+ _d1Cache = db
78
+ return db
79
+ }
80
+ } catch {}
81
+ _d1Cache = false
82
+ return null
83
+ }
84
+
85
+ /**
86
+ * Get a content loader, auto-detecting D1 on CF Workers.
87
+ */
88
+ function getContentLoader(docsRoot?: string, urlMapper?: (filePath: string) => string): ContentLoader {
89
+ const d1 = getD1()
90
+ if (d1) {
91
+ return createD1Loader(createDb(d1))
92
+ }
93
+ return createFsLoader(getProjectRoot(), docsRoot, urlMapper)
94
+ }
95
+
63
96
  /**
64
97
  * Load a document with i18n fallback.
65
98
  * Uses docsRoot from projectConfig to resolve content paths.
@@ -72,7 +105,7 @@ export async function loadDoc(
72
105
  projectConfig?: ProjectConfig,
73
106
  ): Promise<LoadedDoc> {
74
107
  const docsRoot = projectConfig?.docsRoot || 'content'
75
- const loader = createFsLoader(getProjectRoot(), docsRoot, projectConfig?.urlMapper)
108
+ const loader = getContentLoader(docsRoot, projectConfig?.urlMapper)
76
109
  return loader.loadDoc(project, version, lang, slug)
77
110
  }
78
111
 
@@ -90,11 +123,11 @@ export async function loadDocsConfig(
90
123
  }
91
124
 
92
125
  const docsRoot = projectConfig?.docsRoot || 'content'
93
- const loader = createFsLoader(getProjectRoot(), docsRoot)
126
+ const loader = getContentLoader(docsRoot)
94
127
  const config = await loader.loadDocsConfig(project, version)
95
128
  if (config) return config
96
129
 
97
- // Auto-scan fallback (filesystem only)
130
+ // Auto-scan fallback (filesystem only, won't work on CF Workers)
98
131
  return autoScanDocs(getProjectRoot(), docsRoot, project, version)
99
132
  }
100
133
 
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Cloudflare Workers entry point.
3
+ * Re-exports TanStack Start's server entry as a CF Worker fetch handler.
4
+ * Injects D1 binding into globalThis for server-side content loading.
5
+ */
6
+ import handler from '@tanstack/react-start/server-entry'
7
+
8
+ export default {
9
+ async fetch(request: Request, env: any, ctx: any) {
10
+ // Expose D1 binding to server-side code via globalThis
11
+ if (env?.DB) {
12
+ ;(globalThis as any).__D1_DB = env.DB
13
+ }
14
+ return handler.fetch(request)
15
+ },
16
+ }
@@ -226,7 +226,7 @@ docs-i18n site [subcommand] [options]
226
226
 
227
227
  | Subcommand | Description |
228
228
  | --- | --- |
229
- | `dev` (default) | Start the Vite dev server with hot reload |
229
+ | `dev` (default) | Start the site server (pre-built or Vite dev) |
230
230
  | `build` | Build the site for production |
231
231
  | `upload` | Upload content and translations to Cloudflare D1 |
232
232
  | `deploy` | Deploy to Cloudflare Workers |
@@ -236,16 +236,20 @@ docs-i18n site [subcommand] [options]
236
236
  | Flag | Default | Description |
237
237
  | --- | --- | --- |
238
238
  | `--port <n>` | 3000 | Port for the dev server |
239
+ | `--custom` | false | Force Vite dev mode (skip pre-built server) |
239
240
  | `--db <name>` | `docs-i18n-db` | D1 database name (for `upload`) |
240
241
 
241
242
  **Examples:**
242
243
 
243
244
  ```bash
244
- # Start dev server
245
+ # Start site (uses pre-built server for instant startup)
245
246
  docs-i18n site
246
247
 
247
248
  # Start on custom port
248
- docs-i18n site dev --port 4000
249
+ docs-i18n site --port 4000
250
+
251
+ # Force Vite dev mode (HMR, custom components)
252
+ docs-i18n site --custom
249
253
 
250
254
  # Build for production
251
255
  docs-i18n site build
@@ -259,9 +263,9 @@ docs-i18n site deploy
259
263
 
260
264
  **How it works:**
261
265
 
262
- The `site` command does not require a `docs-i18n.config.ts`. It reads the `site.config.ts` file from your project root to configure the documentation site (project names, colors, locales, etc.).
266
+ The `site` command reads `site.config.ts` from your project root to configure the documentation site (project names, colors, locales, etc.).
263
267
 
264
- On first run, the template's dependencies are automatically installed. The dev server uses Vite with the consumer's `site.config.ts` aliased into the template for customization.
268
+ By default, the site starts instantly using the pre-built Node.js server (no `npm install` needed). The pre-built server uses `jiti` to load your `site.config.ts` at runtime. Use `--custom` to fall back to Vite dev mode with hot reload when you need custom React components or live editing.
265
269
 
266
270
  For non-English languages, the site automatically loads translations from the `.cache/translations.db` SQLite cache and assembles them at runtime.
267
271