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.
- package/admin/app/lib/auth-client.ts +21 -0
- package/admin/app/lib/auth.server.ts +62 -0
- package/admin/app/routeTree.gen.ts +21 -3
- package/admin/app/routes/index.tsx +68 -8
- package/admin/app/routes/login.tsx +207 -0
- package/admin/app/server.ts +23 -0
- package/admin/app/styles.css +146 -0
- package/admin/app/worker.ts +18 -0
- package/admin/dist/client/assets/auth-client-DqJZaFZR.js +3 -0
- package/admin/dist/client/assets/login-CQjkiBAF.js +1 -0
- package/admin/dist/client/assets/main-bc5tcdGg.js +18 -0
- package/admin/dist/client/assets/routes-CTPOG_v1.js +3 -0
- package/admin/dist/client/assets/{styles-DJ6QEJmN.css → styles-zS0BbO7e.css} +1 -1
- package/admin/dist/client/assets/useNavigate-CEOVvMjz.js +1 -0
- package/admin/dist/server/assets/{react-dom-CpO9xk_L.js → __tanstack-start-server-fn-resolver-qK0Yfvti.js} +83 -507
- package/admin/dist/server/assets/_tanstack-start-manifest_v-BgMVPPt2.js +21 -0
- package/admin/dist/server/assets/adapter-DjXlUL1J.js +2253 -0
- package/admin/dist/server/assets/auth-client-CoUpyQIM.js +807 -0
- package/admin/dist/server/assets/auth-dSAIPjBw.js +72 -0
- package/admin/dist/server/assets/auth.server-BLVDnTCZ.js +31352 -0
- package/admin/dist/server/assets/bun-sqlite-dialect-C8OaCWSL-BNNY-FoT.js +154 -0
- package/admin/dist/server/assets/compiled-query-CnFG_BVV.js +6967 -0
- package/admin/dist/server/assets/d1-sqlite-dialect-sYHNqBte-Bjz-cybU.js +115 -0
- package/admin/dist/server/assets/dist-C3-e8E2B.js +215 -0
- package/admin/dist/server/assets/dist-CUzFWZag.js +6039 -0
- package/admin/dist/server/assets/{init-DJr2glb3.js → dist-DBv71kqn.js} +21 -381
- package/admin/dist/server/assets/error-CASJ5tIm.js +457 -0
- package/admin/dist/server/assets/error-codes-BhMTGvV6.js +1153 -0
- package/admin/dist/server/assets/init-CJJUsPDL.js +49 -0
- package/admin/dist/server/assets/job-manager-D9Ab9hgu.js +179 -0
- package/admin/dist/server/assets/{jobs-bQfYqSk7.js → jobs-DrEe9YOj.js} +18 -5
- package/admin/dist/server/assets/kysely-adapter-YC8RFPyc.js +2 -0
- package/admin/dist/server/assets/login-SqzTMYOZ.js +228 -0
- package/admin/dist/server/assets/migrator-ZpVZslbq.js +2926 -0
- package/admin/dist/server/assets/{misc-DOk3t9vs.js → misc-BSoYldBT.js} +22 -9
- package/admin/dist/server/assets/{models-CBb8Owe5.js → models-CoviNHUP.js} +1 -1
- package/admin/dist/server/assets/node-sqlite-dialect-BJIaP6lL.js +154 -0
- package/admin/dist/server/assets/{router-DlU_fGDK.js → router-D-82slI-.js} +23 -11
- package/admin/dist/server/assets/{routes-BcfX6iub.js → routes-B1pNmxF3.js} +43 -29
- package/admin/dist/server/assets/{routes-pIM0fgUO.js → routes-C9huiZHw.js} +56 -22
- package/admin/dist/server/assets/sqlite-adapter-CL2EidjD.js +69 -0
- package/admin/dist/server/assets/{start-BS52hm79.js → start-BiybVoR2.js} +1 -1
- package/admin/dist/server/assets/status-B1AGLvHn.js +162 -0
- package/admin/dist/server/assets/status-D7PU72hm.js +262 -0
- package/admin/dist/server/assets/string-B4XlckmJ.js +6 -0
- package/admin/dist/server/assets/useNavigate-0H08s_Q2.js +29 -0
- package/admin/dist/server/assets/useRouter-BXJvr8to.js +508 -0
- package/admin/dist/server/server.js +70 -90
- package/admin/package.json +6 -1
- package/admin/server/functions/auth.ts +89 -0
- package/admin/server/functions/jobs.ts +30 -2
- package/admin/server/functions/misc.ts +25 -5
- package/admin/server/functions/status.ts +52 -3
- package/admin/server/index.ts +1 -1
- package/admin/server/init.ts +21 -9
- package/admin/server/services/d1-status.ts +282 -0
- package/admin/vite.config.ts +29 -15
- package/admin/wrangler.jsonc +16 -0
- package/package.json +1 -1
- package/template/app/components/markdown/Markdown.tsx +7 -1
- package/template/app/utils/docs.server.ts +37 -4
- package/template/app/worker.ts +16 -0
- package/template/content/docs-i18n/en/cli.md +9 -5
- package/template/content/docs-i18n/en/deployment.md +85 -68
- package/template/dist/client/assets/{Doc-CGhUfH9r.js → Doc-BKO69_nz.js} +1 -1
- package/template/dist/client/assets/{DocsLayout-CoPL9BM9.js → DocsLayout-BGugXxEQ.js} +1 -1
- package/template/dist/client/assets/{FileTabs-DsPkEUu7.js → FileTabs-4fZriOj4.js} +1 -1
- package/template/dist/client/assets/{Footer-4faHyha8.js → Footer-DYh1AfWA.js} +1 -1
- package/template/dist/client/assets/{FrameworkContent-Cxg_X_EP.js → FrameworkContent-rVvjxASn.js} +1 -1
- package/template/dist/client/assets/{MarkdownHeadingContext-CwDqQdSh.js → MarkdownHeadingContext-CdvUDZFU.js} +4 -4
- package/template/dist/client/assets/{PostNotFound-1ZaWdycM.js → PostNotFound-WoSYGsGu.js} +1 -1
- package/template/dist/client/assets/{_basePickBy-FbrKkfHa.js → _basePickBy-Dd7GuR7A.js} +1 -1
- package/template/dist/client/assets/{_baseUniq-g6ljCkn8.js → _baseUniq-DMxQLGFI.js} +1 -1
- package/template/dist/client/assets/_lang-3AqGszEy.js +1 -0
- package/template/dist/client/assets/_lang._project-COkrIqzH.js +1 -0
- package/template/dist/client/assets/_lang._project._version-B8vRZczu.js +1 -0
- package/template/dist/client/assets/{_lang._project._version.docs-DjZ_USgK.js → _lang._project._version.docs-DokNGgvU.js} +1 -1
- package/template/dist/client/assets/{_lang._project._version.docs._-CNb1EMFX.js → _lang._project._version.docs._-CXCNZzOb.js} +1 -1
- package/template/dist/client/assets/_lang._project._version.docs._-DR0WSQEb.js +1 -0
- package/template/dist/client/assets/_lang._project._version.docs.framework._framework._-C_Grro8r.js +1 -0
- 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
- package/template/dist/client/assets/{_lang._project._version.docs.framework.index-S3Frbfn4.js → _lang._project._version.docs.framework.index-DQX1lBi3.js} +1 -1
- package/template/dist/client/assets/{_lang._project.docs-CkmM5v1V.js → _lang._project.docs-DsYQj9jI.js} +1 -1
- package/template/dist/client/assets/_lang._project.docs._-DlM_D6DD.js +1 -0
- package/template/dist/client/assets/{_lang._project.docs._-BHYKQj_2.js → _lang._project.docs._-l2tTjx80.js} +1 -1
- package/template/dist/client/assets/_lang.blog-CEwEtalL.js +1 -0
- package/template/dist/client/assets/_lang.blog-D6YGC3tK.js +1 -0
- package/template/dist/client/assets/_lang.blog._-DgHu4oLy.js +1 -0
- package/template/dist/client/assets/{_lang.blog._-bXJwKw9E.js → _lang.blog._-Umz18sQE.js} +1 -1
- package/template/dist/client/assets/_lang.blog.index-C8LKUFtD.js +1 -0
- package/template/dist/client/assets/{_lang.blog.index-CdR5PZOo.js → _lang.blog.index-DzUqpOBE.js} +1 -1
- package/template/dist/client/assets/{_lang.docs-Cp3wmc9k.js → _lang.docs-CUh3R7DD.js} +1 -1
- package/template/dist/client/assets/{_lang.docs._-0bwIpeOn.js → _lang.docs._-DlgTPy3s.js} +1 -1
- package/template/dist/client/assets/_lang.docs._-DmaQE7lx.js +1 -0
- package/template/dist/client/assets/_lang.docs.framework._framework._-B4C4uDFp.js +1 -0
- package/template/dist/client/assets/{_lang.docs.framework._framework.index-BLgwIvQA.js → _lang.docs.framework._framework.index-DTg6Xd3p.js} +1 -1
- package/template/dist/client/assets/{_lang.docs.framework.index-CzW7Dul3.js → _lang.docs.framework.index-BQ2enasl.js} +1 -1
- package/template/dist/client/assets/{arc-B4lRpBfi.js → arc-DGPgC_QF.js} +1 -1
- package/template/dist/client/assets/{architectureDiagram-2XIMDMQ5-Coq1Gceq.js → architectureDiagram-2XIMDMQ5-yI53_GAi.js} +1 -1
- package/template/dist/client/assets/{blockDiagram-WCTKOSBZ-C7BGTzDN.js → blockDiagram-WCTKOSBZ-C3tr24zy.js} +1 -1
- package/template/dist/client/assets/{c4Diagram-IC4MRINW-xTBVTs0q.js → c4Diagram-IC4MRINW-DOA-mowm.js} +1 -1
- package/template/dist/client/assets/channel-DzZD7dUQ.js +1 -0
- package/template/dist/client/assets/{chunk-4BX2VUAB-DUUHBu75.js → chunk-4BX2VUAB-B6NSnNJJ.js} +1 -1
- package/template/dist/client/assets/{chunk-55IACEB6-MUxF_n9_.js → chunk-55IACEB6-CWYwArBH.js} +1 -1
- package/template/dist/client/assets/{chunk-FMBD7UC4-BWh6wvYo.js → chunk-FMBD7UC4-DSyn2wIW.js} +1 -1
- package/template/dist/client/assets/{chunk-JSJVCQXG-CLUdUV5u.js → chunk-JSJVCQXG-D83nm5W0.js} +1 -1
- package/template/dist/client/assets/{chunk-KX2RTZJC-CAlz_cXA.js → chunk-KX2RTZJC-DD7fN9e9.js} +1 -1
- package/template/dist/client/assets/{chunk-NQ4KR5QH-BaYKfUVy.js → chunk-NQ4KR5QH-C3YlYiU5.js} +1 -1
- package/template/dist/client/assets/{chunk-QZHKN3VN-NxDloxi5.js → chunk-QZHKN3VN-B7wBEuCG.js} +1 -1
- package/template/dist/client/assets/{chunk-WL4C6EOR-C2Ncbi5S.js → chunk-WL4C6EOR-ByA1FloT.js} +1 -1
- package/template/dist/client/assets/classDiagram-VBA2DB6C-CRozKaUD.js +1 -0
- package/template/dist/client/assets/classDiagram-v2-RAHNMMFH-CRozKaUD.js +1 -0
- package/template/dist/client/assets/clone-CGnOEl4E.js +1 -0
- package/template/dist/client/assets/{cose-bilkent-S5V4N54A-Ct9-ZJcv.js → cose-bilkent-S5V4N54A-nt_sXfWc.js} +1 -1
- package/template/dist/client/assets/{dagre-KLK3FWXG-u9dz8dcq.js → dagre-KLK3FWXG-DUsyMTPd.js} +1 -1
- package/template/dist/client/assets/{diagram-E7M64L7V-BXmcaktT.js → diagram-E7M64L7V-D5SAypX0.js} +1 -1
- package/template/dist/client/assets/{diagram-IFDJBPK2-CRlP5SeV.js → diagram-IFDJBPK2-WhP5c8Vz.js} +1 -1
- package/template/dist/client/assets/{diagram-P4PSJMXO-B9rJcj_H.js → diagram-P4PSJMXO-AMrwIlhf.js} +1 -1
- package/template/dist/client/assets/{erDiagram-INFDFZHY-DX-vee6w.js → erDiagram-INFDFZHY-BxifSpCV.js} +1 -1
- package/template/dist/client/assets/{flowDiagram-PKNHOUZH-CoBCSOFc.js → flowDiagram-PKNHOUZH-BMAowE9I.js} +1 -1
- package/template/dist/client/assets/{ganttDiagram-A5KZAMGK-BlqU_ghi.js → ganttDiagram-A5KZAMGK-Bay-0iRq.js} +1 -1
- package/template/dist/client/assets/{gitGraphDiagram-K3NZZRJ6-CntCsuti.js → gitGraphDiagram-K3NZZRJ6-Va91W3gw.js} +1 -1
- package/template/dist/client/assets/{graph-CZaxZzO8.js → graph-CbBYObK_.js} +1 -1
- package/template/dist/client/assets/{index-XelhTkgl.js → index-CF6qz2tX.js} +1 -1
- package/template/dist/client/assets/{infoDiagram-LFFYTUFH-_jCC8Jtt.js → infoDiagram-LFFYTUFH-Byd5C-4U.js} +1 -1
- package/template/dist/client/assets/{ishikawaDiagram-PHBUUO56-D3m_r2ig.js → ishikawaDiagram-PHBUUO56-DxOKnE1v.js} +1 -1
- package/template/dist/client/assets/{journeyDiagram-4ABVD52K-CvRNm03C.js → journeyDiagram-4ABVD52K-IRmt7RI4.js} +1 -1
- package/template/dist/client/assets/{kanban-definition-K7BYSVSG-nQcLuNSy.js → kanban-definition-K7BYSVSG-BjTVXn-R.js} +1 -1
- package/template/dist/client/assets/{layout-DZIdDq97.js → layout-Bbx6A0bC.js} +1 -1
- package/template/dist/client/assets/{linear-C2JcF5ss.js → linear-Df2eAW4A.js} +1 -1
- package/template/dist/client/assets/{main-C8MldI1o.js → main-DqZtiCro.js} +2 -2
- package/template/dist/client/assets/{mermaid.core-DlB0QBo2.js → mermaid.core-BIoiBcAA.js} +4 -4
- package/template/dist/client/assets/{mindmap-definition-YRQLILUH-D9OjtrBW.js → mindmap-definition-YRQLILUH-Btzz0iIP.js} +1 -1
- package/template/dist/client/assets/ordinal-Cboi1Yqb.js +1 -0
- package/template/dist/client/assets/{pieDiagram-SKSYHLDU-DoYJZfNJ.js → pieDiagram-SKSYHLDU-C2amrGtU.js} +1 -1
- package/template/dist/client/assets/{quadrantDiagram-337W2JSQ-Bs71YHJr.js → quadrantDiagram-337W2JSQ-EVgH9VuN.js} +1 -1
- package/template/dist/client/assets/{react-C0klD_r9.js → react-qvbbiZob.js} +1 -1
- package/template/dist/client/assets/{requirementDiagram-Z7DCOOCP-BWvQcALn.js → requirementDiagram-Z7DCOOCP-BkYPbRis.js} +1 -1
- package/template/dist/client/assets/{sankeyDiagram-WA2Y5GQK-CiGy1SQP.js → sankeyDiagram-WA2Y5GQK-B5EIaP-h.js} +1 -1
- package/template/dist/client/assets/{sequenceDiagram-2WXFIKYE-DRZim8vR.js → sequenceDiagram-2WXFIKYE-BC33VGOc.js} +1 -1
- package/template/dist/client/assets/{stateDiagram-RAJIS63D-BoqzJeL7.js → stateDiagram-RAJIS63D-DiKvWUYb.js} +1 -1
- package/template/dist/client/assets/stateDiagram-v2-FVOUBMTO-DjKMPYGe.js +1 -0
- package/template/dist/client/assets/{timeline-definition-YZTLITO2-CyvR95Wz.js → timeline-definition-YZTLITO2-QiFlgbRA.js} +1 -1
- package/template/dist/client/assets/{treemap-KZPCXAKY-DkXgGvs_.js → treemap-KZPCXAKY-BOYbyS9G.js} +1 -1
- package/template/dist/client/assets/{vennDiagram-LZ73GAT5-CVpGZu6p.js → vennDiagram-LZ73GAT5-CqmW7j4r.js} +1 -1
- package/template/dist/client/assets/{xychartDiagram-JWTSCODW-Cjqbi_DU.js → xychartDiagram-JWTSCODW-gj6oWX8l.js} +1 -1
- package/template/dist/server/assets/{Doc-DKBxQduk.js → Doc-9tJiX5y6.js} +3 -3
- package/template/dist/server/assets/{DocsLayout-CQfCTal3.js → DocsLayout-BTjhU_W5.js} +2 -2
- package/template/dist/server/assets/{Footer-Dcw5XVqX.js → Footer-CefTi2yh.js} +1 -1
- package/template/dist/server/assets/{FrameworkContent-OJfvCBHi.js → FrameworkContent-BkJvuP04.js} +2 -2
- package/template/dist/server/assets/{MarkdownHeadingContext-h4SfZq-C.js → MarkdownHeadingContext-37oQpb36.js} +8 -4
- package/template/dist/server/assets/{PostNotFound-DRJpnWrj.js → PostNotFound-BqBZf83v.js} +1 -1
- package/template/dist/server/assets/{_basePickBy-DJ9gzwF8.js → _basePickBy-DZ3TPUta.js} +2 -2
- package/template/dist/server/assets/{_baseUniq-CezmbvU2.js → _baseUniq-DKicWTQT.js} +1 -1
- package/template/dist/server/assets/{_lang._project._version.docs-CE_Z2zvG.js → _lang._project._version.docs-DOTNQiDb.js} +1 -1
- package/template/dist/server/assets/{_lang._project._version.docs-sJvASz_e.js → _lang._project._version.docs-U-t4mk5_.js} +3 -3
- package/template/dist/server/assets/{_lang._project._version.docs._-B2vf_QGY.js → _lang._project._version.docs._-DMgnElWM.js} +5 -5
- package/template/dist/server/assets/{_lang._project._version.docs._-CQcamDns.js → _lang._project._version.docs._-DSg82-Ug.js} +1 -1
- package/template/dist/server/assets/{_lang._project._version.docs.framework._framework._-54LEIllb.js → _lang._project._version.docs.framework._framework._-DbeN6toN.js} +1 -1
- 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
- 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
- package/template/dist/server/assets/{_lang._project._version.docs.framework.index-DoEddI6Z.js → _lang._project._version.docs.framework.index-CmLAP_Io.js} +1 -1
- package/template/dist/server/assets/{_lang._project.docs-BjOhmwp6.js → _lang._project.docs-Bb4ZZ_jr.js} +3 -3
- package/template/dist/server/assets/{_lang._project.docs-dl8MxaGg.js → _lang._project.docs-BsnkRf-R.js} +1 -1
- package/template/dist/server/assets/{_lang._project.docs._-hSRVM-U7.js → _lang._project.docs._-ChrpJ61j.js} +5 -5
- package/template/dist/server/assets/{_lang._project.docs._-Bq0ajlaH.js → _lang._project.docs._-axRfm8vS.js} +1 -1
- package/template/dist/server/assets/{_lang.blog-Dk36D6Ol.js → _lang.blog-8j6IvzvQ.js} +2 -2
- package/template/dist/server/assets/{_lang.blog._-Cm8zXsPs.js → _lang.blog._-BPzP97Ac.js} +2 -2
- package/template/dist/server/assets/{_lang.blog._-D4CEjSkM.js → _lang.blog._-CjgFipz7.js} +1 -1
- package/template/dist/server/assets/{_lang.blog.index-orWcAgbi.js → _lang.blog._-DNX8UglA.js} +2 -2
- package/template/dist/server/assets/{_lang.blog.index-ZhMds6Jp.js → _lang.blog.index-CeZnMJBi.js} +1 -1
- package/template/dist/server/assets/{_lang.blog.index-Dfy48Gbt.js → _lang.blog.index-Dk5fYp4Q.js} +1 -1
- package/template/dist/server/assets/{_lang.blog._-A8h17fpC.js → _lang.blog.index-DzVKqoC4.js} +2 -2
- package/template/dist/server/assets/{_lang.docs-CAEkhcnT.js → _lang.docs-B4StnHMb.js} +3 -3
- package/template/dist/server/assets/{_lang.docs-CB1sGjRO.js → _lang.docs-DSB3iI6a.js} +1 -1
- package/template/dist/server/assets/{_lang.docs._-Zbv8OwJU.js → _lang.docs._--c0In1AT.js} +5 -5
- package/template/dist/server/assets/{_lang.docs._-DEX6FutM.js → _lang.docs._-S-y4-3Qn.js} +1 -1
- package/template/dist/server/assets/{_lang.docs.framework._framework._-BnpTV3KM.js → _lang.docs.framework._framework._-BFWLyU2h.js} +1 -1
- package/template/dist/server/assets/{_lang.docs.framework._framework._-4s4-ZCYh.js → _lang.docs.framework._framework._-Be0U7cDg.js} +5 -5
- package/template/dist/server/assets/{_lang.docs.framework._framework.index-BLryfsl2.js → _lang.docs.framework._framework.index-BZ512aSk.js} +1 -1
- package/template/dist/server/assets/{_lang.docs.framework.index-DGxWQH6q.js → _lang.docs.framework.index-U8z3j4kz.js} +1 -1
- package/template/dist/server/assets/{_tanstack-start-manifest_v-CURwM8Tc.js → _tanstack-start-manifest_v-DXpQ8503.js} +1 -1
- package/template/dist/server/assets/{arc-BwftnT5H.js → arc-B4h6h_n6.js} +1 -1
- package/template/dist/server/assets/{architecture-PBZL5I3N-KbDVC6gM.js → architecture-PBZL5I3N-CUwqLXkR.js} +6 -6
- package/template/dist/server/assets/{architectureDiagram-2XIMDMQ5-BoLvWxb3.js → architectureDiagram-2XIMDMQ5-CuCoxdBe.js} +6 -6
- package/template/dist/server/assets/{blockDiagram-WCTKOSBZ-GPFcXs-f.js → blockDiagram-WCTKOSBZ-D5PsUOim.js} +6 -6
- package/template/dist/server/assets/{blog.server-Bbk2Ifog.js → blog.server-WqzZ00iA.js} +1 -1
- package/template/dist/server/assets/{c4Diagram-IC4MRINW-EQwQCspo.js → c4Diagram-IC4MRINW-CXy5xO3o.js} +2 -2
- package/template/dist/server/assets/{channel-CxvwuPH7.js → channel-D0l-mWaF.js} +1 -1
- package/template/dist/server/assets/{chunk-4BX2VUAB-DUgcw5ei.js → chunk-4BX2VUAB-M7FVHMss.js} +1 -1
- package/template/dist/server/assets/{chunk-55IACEB6-Cn15uD91.js → chunk-55IACEB6-D_gDAje5.js} +1 -1
- package/template/dist/server/assets/{chunk-FMBD7UC4-Ck3iyLPu.js → chunk-FMBD7UC4-B5Bebx-Y.js} +1 -1
- package/template/dist/server/assets/{chunk-JSJVCQXG-VAT8yncE.js → chunk-JSJVCQXG-DxBkq-uB.js} +1 -1
- package/template/dist/server/assets/{chunk-KX2RTZJC-B1bd2VmA.js → chunk-KX2RTZJC-BMHm1EGi.js} +1 -1
- package/template/dist/server/assets/{chunk-NQ4KR5QH-CR67GG9C.js → chunk-NQ4KR5QH-Cp28pTwT.js} +3 -3
- package/template/dist/server/assets/{chunk-QZHKN3VN-B9SSazM4.js → chunk-QZHKN3VN-Bq5GZqaR.js} +1 -1
- package/template/dist/server/assets/{chunk-WL4C6EOR-DZ4Pjuao.js → chunk-WL4C6EOR-C9Nj5GdW.js} +5 -5
- package/template/dist/server/assets/{classDiagram-VBA2DB6C-CA6_4Wb2.js → classDiagram-VBA2DB6C-CUchv9T5.js} +6 -6
- package/template/dist/server/assets/{classDiagram-v2-RAHNMMFH-CA6_4Wb2.js → classDiagram-v2-RAHNMMFH-CUchv9T5.js} +6 -6
- package/template/dist/server/assets/{clone-DJHP_iVy.js → clone-CJcTi58S.js} +1 -1
- package/template/dist/server/assets/{cose-bilkent-S5V4N54A-DtU-cN6W.js → cose-bilkent-S5V4N54A-CxvCMhN_.js} +1 -1
- package/template/dist/server/assets/{dagre-KLK3FWXG-yZYrVU4p.js → dagre-KLK3FWXG-B5bQP7FL.js} +6 -6
- package/template/dist/server/assets/{diagram-E7M64L7V-8Yyz0aw0.js → diagram-E7M64L7V-NjHca90S.js} +8 -8
- package/template/dist/server/assets/{diagram-IFDJBPK2-DcxFYI3M.js → diagram-IFDJBPK2-CoTCfBKd.js} +6 -6
- package/template/dist/server/assets/{diagram-P4PSJMXO-CehxUcI0.js → diagram-P4PSJMXO-DHvGgYjH.js} +6 -6
- package/template/dist/server/assets/{docs.server-7EUAkSBN.js → docs.server-BSH7IvIU.js} +3884 -444
- package/template/dist/server/assets/{erDiagram-INFDFZHY-Bu2p1_Pj.js → erDiagram-INFDFZHY-01crajKr.js} +4 -4
- package/template/dist/server/assets/{flowDiagram-PKNHOUZH-B_eKR7I0.js → flowDiagram-PKNHOUZH-BkUQ_vxg.js} +6 -6
- package/template/dist/server/assets/{ganttDiagram-A5KZAMGK-DP6YEZof.js → ganttDiagram-A5KZAMGK-DvrO-w2P.js} +2 -2
- package/template/dist/server/assets/{gitGraph-HDMCJU4V-Bt0qhVL4.js → gitGraph-HDMCJU4V-h9JNaxB7.js} +6 -6
- package/template/dist/server/assets/{gitGraphDiagram-K3NZZRJ6-DwvkdYrg.js → gitGraphDiagram-K3NZZRJ6-BoKm6Fm-.js} +7 -7
- package/template/dist/server/assets/{graph-BVFNe_k5.js → graph-BoxbfI7Z.js} +2 -2
- package/template/dist/server/assets/{index-BvagF3L5.js → index-Jfzi6SZW.js} +2 -2
- package/template/dist/server/assets/{info-3K5VOQVL-CFejRnvB.js → info-3K5VOQVL-DgaSHqkS.js} +6 -6
- package/template/dist/server/assets/{infoDiagram-LFFYTUFH-D0v9uyXI.js → infoDiagram-LFFYTUFH-DgV5W8-I.js} +5 -5
- package/template/dist/server/assets/{ishikawaDiagram-PHBUUO56-DZumspL4.js → ishikawaDiagram-PHBUUO56-CqlMQ0Fq.js} +1 -1
- package/template/dist/server/assets/{journeyDiagram-4ABVD52K-nRp_-qZp.js → journeyDiagram-4ABVD52K-D6ySTub8.js} +4 -4
- package/template/dist/server/assets/{kanban-definition-K7BYSVSG-BMKyyzjt.js → kanban-definition-K7BYSVSG-BT8m7Cwk.js} +2 -2
- package/template/dist/server/assets/{layout-mpiN5R-5.js → layout-CkYcErfn.js} +4 -4
- package/template/dist/server/assets/{linear-CqNYgjEx.js → linear-F_0dWGZL.js} +1 -1
- package/template/dist/server/assets/{mermaid-parser.core-B8Uu3QZY.js → mermaid-parser.core-q5MdUJuo.js} +11 -11
- package/template/dist/server/assets/{mermaid.core-BI3nMhNO.js → mermaid.core-DOWTODR1.js} +31 -31
- package/template/dist/server/assets/{mindmap-definition-YRQLILUH-DCoFqLPh.js → mindmap-definition-YRQLILUH-BQxlQqn-.js} +3 -3
- package/template/dist/server/assets/{ordinal-Bcam90FY.js → ordinal-CxptdPJm.js} +1 -1
- package/template/dist/server/assets/{packet-RMMSAZCW-djgonfKN.js → packet-RMMSAZCW-D8FkLZuP.js} +6 -6
- package/template/dist/server/assets/{pie-UPGHQEXC-Dug2t-PE.js → pie-UPGHQEXC-Diw2fHLk.js} +6 -6
- package/template/dist/server/assets/{pieDiagram-SKSYHLDU-CS0_hW4w.js → pieDiagram-SKSYHLDU-B1J4UJZ7.js} +8 -8
- package/template/dist/server/assets/{quadrantDiagram-337W2JSQ-BpQNM0zu.js → quadrantDiagram-337W2JSQ-BvjKLapg.js} +2 -2
- package/template/dist/server/assets/{radar-KQ55EAFF-3ir2W9Wi.js → radar-KQ55EAFF-CcBdPU3n.js} +6 -6
- package/template/dist/server/assets/{requirementDiagram-Z7DCOOCP-D92RyjV4.js → requirementDiagram-Z7DCOOCP-Bgr_wnAs.js} +3 -3
- package/template/dist/server/assets/{router-DK1vpPhv.js → router-DxwPl-Dc.js} +18 -18
- package/template/dist/server/assets/{sankeyDiagram-WA2Y5GQK-DCPRB-xO.js → sankeyDiagram-WA2Y5GQK-B0UwtyW3.js} +2 -2
- package/template/dist/server/assets/{sequenceDiagram-2WXFIKYE-C1ab2VvU.js → sequenceDiagram-2WXFIKYE-BbxQJHjO.js} +3 -3
- package/template/dist/server/assets/{stateDiagram-RAJIS63D-GhG1G3ff.js → stateDiagram-RAJIS63D-Cg-uJ_UO.js} +8 -8
- package/template/dist/server/assets/{stateDiagram-v2-FVOUBMTO-C-KtMadV.js → stateDiagram-v2-FVOUBMTO-BWVPrqfa.js} +4 -4
- package/template/dist/server/assets/{timeline-definition-YZTLITO2-DyfAQCd4.js → timeline-definition-YZTLITO2-DCSJT2WT.js} +2 -2
- package/template/dist/server/assets/{treemap-KZPCXAKY-Cn0Cw4Cl.js → treemap-KZPCXAKY-a0nhlKgx.js} +6 -6
- package/template/dist/server/assets/{vennDiagram-LZ73GAT5-D2Ak5JUa.js → vennDiagram-LZ73GAT5-Bk2HQEQq.js} +1 -1
- package/template/dist/server/assets/{xychartDiagram-JWTSCODW-DqoBOs1L.js → xychartDiagram-JWTSCODW-C4svHkt_.js} +3 -3
- package/template/dist/server/server.js +16 -16
- package/template/package.json +2 -0
- package/template/vite.config.ts +33 -18
- package/template/wrangler.jsonc +2 -2
- package/admin/dist/client/assets/main-CSFhgz4p.js +0 -17
- package/admin/dist/client/assets/routes-C6bCOSX-.js +0 -3
- package/admin/dist/server/assets/_tanstack-start-manifest_v-BE5XHVZ2.js +0 -17
- package/admin/dist/server/assets/redirect-DtfSYi2g.js +0 -51
- package/admin/dist/server/assets/status-CZz8Rs_7.js +0 -81
- package/template/dist/client/assets/_lang-Cpuy5xmU.js +0 -1
- package/template/dist/client/assets/_lang._project-DBdR04In.js +0 -1
- package/template/dist/client/assets/_lang._project._version-CtCLMJs2.js +0 -1
- package/template/dist/client/assets/_lang._project._version.docs._-CxgRZ17Q.js +0 -1
- package/template/dist/client/assets/_lang._project._version.docs.framework._framework._-Qph6wahA.js +0 -1
- package/template/dist/client/assets/_lang._project.docs._-C_ZfXEJ7.js +0 -1
- package/template/dist/client/assets/_lang.blog-BcRmhv23.js +0 -1
- package/template/dist/client/assets/_lang.blog-C5Aa7k5r.js +0 -1
- package/template/dist/client/assets/_lang.blog._-BVw4vhtF.js +0 -1
- package/template/dist/client/assets/_lang.blog.index-Y35iFzkp.js +0 -1
- package/template/dist/client/assets/_lang.docs._-B9hwwoTY.js +0 -1
- package/template/dist/client/assets/_lang.docs.framework._framework._-BENbKZIu.js +0 -1
- package/template/dist/client/assets/channel-C_1F7tzH.js +0 -1
- package/template/dist/client/assets/classDiagram-VBA2DB6C-CqViWWFw.js +0 -1
- package/template/dist/client/assets/classDiagram-v2-RAHNMMFH-CqViWWFw.js +0 -1
- package/template/dist/client/assets/clone-EeiNAO_N.js +0 -1
- package/template/dist/client/assets/ordinal-BENe2yWM.js +0 -1
- package/template/dist/client/assets/stateDiagram-v2-FVOUBMTO-CJYWvllO.js +0 -1
- /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
|
+
}
|
package/admin/vite.config.ts
CHANGED
|
@@ -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
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|
@@ -211,6 +211,12 @@ export const Markdown = React.memo(function Markdown({
|
|
|
211
211
|
return null
|
|
212
212
|
}
|
|
213
213
|
|
|
214
|
-
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|