From a7e19963fb8dd1833afa8a445746872c43200b68 Mon Sep 17 00:00:00 2001 From: Yash Atreya <44857776+yash-atreya@users.noreply.github.com> Date: Thu, 26 Jun 2025 17:36:01 +0530 Subject: [PATCH] feat(`docs`): serve rustdocs (#17084) Co-authored-by: Claude --- .github/workflows/book.yml | 6 + book/vocs/bun.lockb | Bin 302056 -> 311438 bytes book/vocs/package.json | 10 +- book/vocs/scripts/build-cargo-docs.sh | 14 +++ book/vocs/{ => scripts}/check-links.ts | 0 book/vocs/{ => scripts}/generate-redirects.ts | 2 +- book/vocs/scripts/inject-cargo-docs.ts | 105 ++++++++++++++++++ book/vocs/vocs.config.ts | 1 + 8 files changed, 134 insertions(+), 4 deletions(-) create mode 100755 book/vocs/scripts/build-cargo-docs.sh rename book/vocs/{ => scripts}/check-links.ts (100%) rename book/vocs/{ => scripts}/generate-redirects.ts (96%) create mode 100644 book/vocs/scripts/inject-cargo-docs.ts diff --git a/.github/workflows/book.yml b/.github/workflows/book.yml index 2460d00d58..fb04b785ce 100644 --- a/.github/workflows/book.yml +++ b/.github/workflows/book.yml @@ -28,6 +28,12 @@ jobs: bun i npx playwright install --with-deps chromium + - name: Install Rust nightly + uses: dtolnay/rust-toolchain@nightly + + - name: Build docs + run: cd book/vocs && bash scripts/build-cargo-docs.sh + - name: Build Vocs run: | cd book/vocs/ && bun run build diff --git a/book/vocs/bun.lockb b/book/vocs/bun.lockb index 0f15cd4dc666167798797dafba290536329e65f4..bc5c53c3de1c23052b64668edb1dabe914f230ad 100755 GIT binary patch delta 27270 zcmeHwcU%=m8}8Y&2L%xU8-fiKD;$cTsHlLwE0$P65fKm+1k`Av2TRo0^~9`3WAB=% zA&MpT*iGyjdpGtTjj`S5*)xj=!{?{Tckl21;r@8`nR(}(nRln{?CdP(dS?FdLkdjv zsZi6fR$h?$%}VI#>AnvXr=YsQthkzL&pS@033Tz910dO3c8HIygz(v7s z;7u@y8TE@#i-DcG9;q??VtS{g&T!D_@<49R=pe0-?7ZQnTKf!V*+q}5HdnMMAr&w; zvMK2?4@ne7*k~}bxDjmer@&9s7MZ`anILsEyXHD?S6j%u%u?eel)TVl*fvqzq%;kzMaXj=cI)WoRNI24b1 z=|2p%$mf9_5uPdZ;*xqNv8WXIogid3?|oH{2a4wq)6=9)MtdTRAgx44zbwV_Mb3yTN5N(z`= zG;HS5$+rp@I{Zc3Bey*VCOLH|Ug~1$Eq0~Wb(ChDuK#pa^2*sYIe%}{&Cs)yPyJ=o~+tgBi=TEw>^6rAMSaa`He zHLKYr)!2D6{F@EtgWe6LV6&?+M0#fKU<|RTi6JGx9AONWlFcU}U1oOm36XY~JK*eL zp5_x`^92T#`sN6qU}>M()tAx^z9BaKZFRb?<_O4f#3m;RrQ7_>Vd`!>Id=VGq{?y{j zWsV9AvWtX|7hA-9v3-!;*YGhOZ13S~zTj;LL*43#`am;453~SySaW{(qX3Nex*mcP zz_K~woQsLE(g3t2-KUfSp8=E)0&v^W4Ff120ic!WCJ6szFb^{IzY_d47;Q{96JWeK z0IkRXc#x^TTBkG7PlpZzoo)@l2~AOUQ{?xoQpn7p9(slOxy(%r;v{jhvm?T3sP$ zV<{$yRs@H7sJkm>C#FIGF}j0#h$g$OEM&@CgAU1c?AL zomFvSgz7?W&D5_cG^`z%<WU! z1h;M&Pl8z?qlLm)!Q;VHnZVP3UvQSenT!>@z!r@O(EU^+SfCEpT!8(aYX*I-tK4RXiS(WEOtGjNcZU}3?oVAgR7 z;r9UJPgj~J!OXxDepZ>62sa9UAee?%1@o|G<`b-jqy9sL0+|u&fSEAo`?R#N2q!b6 za1q`L%%CX!*J;98aAQY^bH?={KGl+ebJcK8~ zG;}2Vyt2`P$APIbfhWOCf1>b{)&4&j4$QA~-+~!7i>Lp>yt2j6V}g8Y;$h8{FBNiY zW|giG@mA_F#b!e5Ajob0<(g%ZuuVkEiCF=AL^zqr{R(Dw2LvAk<4<>(C&6^`37UKy zC-%8ZV2%>^z%2hqG>49-5ICC0y>wyk)Y+m;$#yK;|GBD}r{4pvBGu-f%RKscB!z8#p;zb;@#>?$}4%&9{HmiqF#XkqzXq5IhfpY(Ra6&# z8d?v`Hq}J{1~c9*5q=v?gYVH&PQYG^0OraBB<3!dem(q9(d7a&qMZmQ)0qz^hUXVt zSg;$I`o)Fc1I&ZWhai)m5ah&+7=UmZ5GeG>%&4mH=fu3d))V1m#;-5@WICHz{3gxu zkC+KJ6$$6WG_<7%w`NvZJ5`SQw>Yvh!#azIWR^r1Ff;5bU5kKZ-(&C0aJewn0hO~G&}>W_9h!k{<_r=@UUiz)(bhA z32zYmlaO08-U;ZQLQcc}5_-?U>|OS-f^(h1V3t5};V;jbIMXshK*gFOpdpyuqaBzB znF~Y7V7Bf-U_8g@#(?psn}ic*f!~6e&UavjZvb=o<5ohR6Ej|0 z5pKB!cS)WUSJxQ3}yy= z5yyi}d7AKNu}LWQ72HoKkQrfs;LnBJnwh~MA%|0K?DW$y(i?Mv>z97Eycsd zT;5_oF5-S%#QnI4+nDz|9Aw@GKQ7{Ok(cwXkBhi$7hK$B6R`(>T*PIGyjcaN&*JB# zGZZIs9iHA|mf*)lTrTeN&iio@7lrU~5%=RF?#D%3iBBdt$b4w|xQHuOeX}k0vSe~v zyk*Hz&Oz0B@s@J>IidTwi2HF7_v0e&$3`}4^uA$3A3l5<65Be$ zxqxZGwSA?dyOo~4`}-=xUQaQ8AJ*>GkxttJ57(83zP`InKW>S~mX7sp7A8A2NZC1* zn;W%+cUdQ#{>9~r%j&I*a^K&kk$h}u*p)Ah6ECMv$>&!(VCU%_%U(XOIBNe<=lbjZ zT5fOjx-@^{w4t|ShLzakmSOUU9=rbApbV>ocUvc%RAbt)do{KnSv~4-r;4cyHV(hl z{{Gd=^HwMJlFz1;+kCIr#J?UaKVLe$?xn&luT1Xt_0U00ub0~`M;u<;b9}<##Vf4R z)%F;%kPQ*vJ8X~K(d3}1LTIZ&>$_bl<5PZl+_gJ1?zj5MZQ9m}Ytu3uy`uhDpT}YO zjHrWWx(6@qYB;fd$d1TdOFIM^J3aq{+eEdJ*lTU@;>#IL+DXlN*j#XaF{s^yyamQT zso1MhpRb%}IHW$!+cE9fslH8OSI1S3ax785*e?@JfeTLQ?wlO>*{UYDX2o_nx`z83 zwS@OsCtNkYL+u$)_B@#*KaMyyLEr!AsQi0ZMAkkw$2%k?ug6U1rVbmN3SDbId-7+A zBf^>-?A$Y^@Y99Mmp!{tGhueXm6o}!(%t_iU6ao6ylwY!2Oo##KQQOevN8>p_FVO% zjovr(!tNy7L6PQXP0BAfttnsI-md(kdUKbKsoiN)TgN+Xy*&I&ESUYM+=CY1*0M_Y zmp2LP48gn4j9Yl3XS?x54<0;n!8xKwShHsbE=Gqg3!dxw{Z(bWZo2d6&8CO_0)`)$ zP~^As)wbF_-`ctJ-IQLvwx0Q7&#InW{nbi>`@yus5EVXZLcH75AI-b+jaxPKdTy7) z+x9%(vn%q4*s6=JR5|u*YOQO17j_wEDirba^N149#lv*~(|(7zM$Zy75aIm?kSo2^6N&GS{L3t_-55>FBcq+@ej+x z^>5AML)HmzSw68|p6GH-Y!`hu{JXLdZoBuFNpM^AjdPXq4MyA@aeGSh*T3z~y`a*- zhp$$DHh$^43lBri{5=2oo*2K4p0`GqO~trl%1T(dUfYW zg$vc1!TcsmI}HBifBR*}xT+2%wn#S))bU?1#FVrx-wzXv&5C~BYvAaNTjLAmnQ*9< z-K`T3Mr2-}ajsPBUmOh^(#{4%=1;IY)+%baWoxQs#N^&T?J)eZa?tWpp)ER|9$%(T zQe4mS;lFhKsq2~+4&lW*oEeeq*k@psGo2#7($7qrdvu-upXt}XIC8b{w`)$@m_ofr zMRxxxe|{^Ak69;N&skq<_w&*B9wdE}Cu*Nf@rv;UPu`yJs$aD>hbn9e2>GU57n^$L zEBBaI-68q+o%R)Z2tMhNABl$Hn5vhrh-+v+@z=-hP2z8&e(r_*7V)V%4-^w zy6n0j$bD?WnAXpS_&%TBXVRc*{kG5Bb^gM=N}tROGc}miWZ&>PqpK|&(&x_cn$-=t zB6Z%ORtcZ5PWT6(gYCy>wA{Py#;W{J7r&E*v4jdRtf)Rop6biU+s$D8@IDYubU1&CrZc8 z`hDl1Zw5yjZnjUzmpOfI zgWICzXBXEG^K4c1>IHM`g%-JX6~1ixvDc2?t86{SU48Ut!q%p?pO#G;Gu)?Iz@L7N zkFB>#__TGx>pL&iH@-OYa?d9dKf4|n*1SRf8)M4m)jzyZfBo4m`9@?68IoBfb8f!= z)swHh9Ngct;qG0__OB}u)ittO>J9nOSQJB6Ni;iSo$w#E`~BSYUY&7wqRTX0c=75F zx(a&^e%^i2v8Z7Ce1)zQ-2B&&XBD2c@NXI$_0Vj$xy_Ou{eC>)yxP$|PmjIljH|cq z!dG4{W+$UT@p~oN+EheibI$b7qu(H@!WXY0Y>%A^_6md(C|f;4-@Ux#mMK-xKa!-I z${!W=_oO|USH1KH^fr?bKaVo0kiH~UGtc?)d`B|{q`}-|IhYOrz`OJx9tB}$ArI2xd zGSlL-y|!0*yO8mHe|HAp_*uv>5j5%6z{7)6I7a4fn5lH&;Pi`5F3bNR^f+^(j9Wjn zomZUnFqr#BxE#xa^9t&5@tPYB7|tmHW!!HPr%sH~gLpq@AUCD-RE2MLQ1d-%f{aRcscRb<(U&G15i zqfq1kMJL~Lb9~{!v4u{4FUuFcELn~VlySEncUbXYm!^z6bo_}$nJ`auLxOb$l47Vi?#iew`hq6581_2pk!L4vjtpWZ|gEl~0fV(IM18hp^zz|?4Fbv?>9|J@HkpQ=jayRAx zU?9NVdgXJY?NorHBH#sh1DOb12dn|s0xOaED&Pko1K|B56IcsOQEG127d3s0!k7tk zgD3`wLs`cIJ%I!u5oiZ=0Qi2hFfa#t^MLul0-znx9_R=}0NkY)3e*AW0S$oKKz)EK z8esr;ApXdWo7}~@28Fj4*a-I)U^B24*bZz1b^-f=Ux5R_A>asb3^)#)0nP&FfQ!I+ z;1X~JxCZ^Vu1G0X#^e# z{u1~RrBV-i4S_~L707~s$^dV;kQ^7;0E|UzzM(|;4W|v za6p(nkO$yIARoY0h+Kdzz=?njkQXojdO!v^)8Ik^r#hV36o$-&(~Kf;a7CQ&8Pb4M zfU|@yKv#g=6U1+U`3U1v$#UR3;Cp}zMk|3IfFFT1 zKo95+v{`56?S122JBfDWZ30i1aR0o8y2AOW&Ope4X< z))RnOf7PHV_Qd0qO!Fz$m>kbC*8SbPzTi z0#aclcbIy>C?mp)0S@X z00n^(fG5CjmR-5H5RVLc1N{Fni9jzP7DxiB!yxWB=5A!}Sl)unuOs4aU=OelI0*EF zoI8jc15JQjFt8Sk=8UHyz%Rf!(-{IJ1ATxLAXQfW+O797ncz+bu0r=Z;~?+GKs{g# z(jEc z<^k)0jld#c4X_UQ5m*Uq1~vezfW^Qj7XJ^xPrwpj7BCZ-3QPmO0j2|cVB7>$0~gi# zFi;TS#`DU655jzbioh`FegTXCMgqfuLXh)It{uRB;1qBgsDijAZv^t=zVW~WU?MOH z;1`0w0B3+NfziMs(5V|Pm8UOEktIp62}o?n!4PG1v9Kq3K9qPrs*8Pd&!w1nyYOUPS_c(vhg0ki~4 z0i}U^Fy{fup`rX zzdpLSiBF##f;o5N(mAJ0oI2G7__WIKc8JHJn!_}o=MDiJVfmnW0^qVOhjYp)J1CeB zm|Sn<10+|)_>9N+j7wm8UqJU09GnnNlwmrK+B=oOH}pPDFo#Xo{=JQ@J~1jSCN&Km z1{#>jrn?m?<2-}#+wABjjfB4u+k^X)@0Y3hIF3R>B`T)rz^XU!!I!Q`YR^8IO zN_~}mprV73Am-`m%a63QJ=*zZxL%5^>f`5wXNFPAYbaEnEEHCBUmQ8V>+>a0@b{@) z2^up*h;hr}(+gbu;}H^wsCaBxs5HBcs4Jns%Q$ezYs<#4D%;ekNF60DLOj|yG@9q^ z`AjcufCSGC=|`36h+33W21aer+Fie6(}fd=TE$}4P2~U-ig7;7g6M4iB>iTWh~J

@l3zM8&oZ|xO$3^?~2xP*x|gl%A1f+ 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 delta 21532 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 VKk1C|;gA07{rrLX?$MY<{|9-$+b#eA diff --git a/book/vocs/package.json b/book/vocs/package.json index 912bc13634..72b6ee7613 100644 --- a/book/vocs/package.json +++ b/book/vocs/package.json @@ -5,10 +5,12 @@ "type": "module", "scripts": { "dev": "vocs dev", - "build": "vocs build && bun generate-redirects.ts", + "build": "bash scripts/build-cargo-docs.sh && vocs build && bun scripts/generate-redirects.ts && bun scripts/inject-cargo-docs.ts", "preview": "vocs preview", - "check-links": "bun check-links.ts", - "generate-redirects": "bun generate-redirects.ts" + "check-links": "bun scripts/check-links.ts", + "generate-redirects": "bun scripts/generate-redirects.ts", + "build-cargo-docs": "bash scripts/build-cargo-docs.sh", + "inject-cargo-docs": "bun scripts/inject-cargo-docs.ts" }, "dependencies": { "react": "latest", @@ -16,7 +18,9 @@ "vocs": "latest" }, "devDependencies": { + "@types/node": "latest", "@types/react": "latest", + "glob": "^10.3.10", "typescript": "latest" } } \ No newline at end of file diff --git a/book/vocs/scripts/build-cargo-docs.sh b/book/vocs/scripts/build-cargo-docs.sh new file mode 100755 index 0000000000..a1a8eeec0a --- /dev/null +++ b/book/vocs/scripts/build-cargo-docs.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +# Script to build cargo docs with the same flags as used in CI + +# Navigate to the reth root directory (two levels up from book/vocs) +cd ../.. || exit 1 + +echo "Building cargo docs..." + +# Build the documentation +export RUSTDOCFLAGS="--cfg docsrs --show-type-layout --generate-link-to-definition --enable-index-page -Zunstable-options" +cargo docs --exclude "example-*" + +echo "Cargo docs built successfully at ./target/doc" \ No newline at end of file diff --git a/book/vocs/check-links.ts b/book/vocs/scripts/check-links.ts similarity index 100% rename from book/vocs/check-links.ts rename to book/vocs/scripts/check-links.ts diff --git a/book/vocs/generate-redirects.ts b/book/vocs/scripts/generate-redirects.ts similarity index 96% rename from book/vocs/generate-redirects.ts rename to book/vocs/scripts/generate-redirects.ts index 99466c294e..c56861a5a9 100644 --- a/book/vocs/generate-redirects.ts +++ b/book/vocs/scripts/generate-redirects.ts @@ -1,7 +1,7 @@ #!/usr/bin/env bun import { writeFileSync, mkdirSync } from 'fs' import { join, dirname } from 'path' -import { redirects, basePath } from './redirects.config' +import { redirects, basePath } from '../redirects.config' // Base path for the site function generateRedirectHtml(targetPath: string): string { diff --git a/book/vocs/scripts/inject-cargo-docs.ts b/book/vocs/scripts/inject-cargo-docs.ts new file mode 100644 index 0000000000..1f8fee260d --- /dev/null +++ b/book/vocs/scripts/inject-cargo-docs.ts @@ -0,0 +1,105 @@ +import { promises as fs } from 'fs'; +import { join, relative } from 'path'; +import { glob } from 'glob'; + +const CARGO_DOCS_PATH = '../../target/doc'; +const VOCS_DIST_PATH = './docs/dist/docs'; +const BASE_PATH = '/docs'; + +async function injectCargoDocs() { + console.log('Injecting cargo docs into Vocs dist...'); + + // Check if cargo docs exist + try { + await fs.access(CARGO_DOCS_PATH); + } catch { + console.error(`Error: Cargo docs not found at ${CARGO_DOCS_PATH}`); + console.error("Please run: cargo doc --no-deps --workspace --exclude 'example-*'"); + process.exit(1); + } + + // Check if Vocs dist exists + try { + await fs.access('./docs/dist'); + } catch { + console.error('Error: Vocs dist not found. Please run: bun run build'); + process.exit(1); + } + + // Create docs directory in dist if it doesn't exist + await fs.mkdir(VOCS_DIST_PATH, { recursive: true }); + + // Copy all cargo docs to the dist/docs folder + console.log(`Copying cargo docs to ${VOCS_DIST_PATH}...`); + await fs.cp(CARGO_DOCS_PATH, VOCS_DIST_PATH, { recursive: true }); + + // Fix relative paths in HTML files to work from /reth/docs + console.log('Fixing relative paths in HTML files...'); + + const htmlFiles = await glob(`${VOCS_DIST_PATH}/**/*.html`); + + for (const file of htmlFiles) { + let content = await fs.readFile(file, 'utf-8'); + + // Fix static file references + content = content + // CSS and JS in static.files + .replace(/href="\.\/static\.files\//g, `href="${BASE_PATH}/static.files/`) + .replace(/src="\.\/static\.files\//g, `src="${BASE_PATH}/static.files/`) + .replace(/href="\.\.\/static\.files\//g, `href="${BASE_PATH}/static.files/`) + .replace(/src="\.\.\/static\.files\//g, `src="${BASE_PATH}/static.files/`) + + // Fix the dynamic font loading in the script tag + .replace(/href="\$\{f\}"/g, `href="${BASE_PATH}/static.files/\${f}"`) + .replace(/href="\.\/static\.files\/\$\{f\}"/g, `href="${BASE_PATH}/static.files/\${f}"`) + + // Fix crate navigation links + .replace(/href="\.\/([^/]+)\/index\.html"/g, `href="${BASE_PATH}/$1/index.html"`) + .replace(/href="\.\.\/([^/]+)\/index\.html"/g, `href="${BASE_PATH}/$1/index.html"`) + // Fix simple crate links (without ./ or ../) + .replace(/href="([^/:"]+)\/index\.html"/g, `href="${BASE_PATH}/$1/index.html"`) + + // Fix root index.html links + .replace(/href="\.\/index\.html"/g, `href="${BASE_PATH}/index.html"`) + .replace(/href="\.\.\/index\.html"/g, `href="${BASE_PATH}/index.html"`) + + // Fix rustdoc data attributes + .replace(/data-root-path="\.\/"/g, `data-root-path="${BASE_PATH}/"`) + .replace(/data-root-path="\.\.\/"/g, `data-root-path="${BASE_PATH}/"`) + .replace(/data-static-root-path="\.\/static\.files\/"/g, `data-static-root-path="${BASE_PATH}/static.files/"`) + .replace(/data-static-root-path="\.\.\/static\.files\/"/g, `data-static-root-path="${BASE_PATH}/static.files/"`) + + // Fix search index paths + .replace(/data-search-index-js="([^"]+)"/g, `data-search-index-js="${BASE_PATH}/static.files/$1"`) + .replace(/data-search-js="([^"]+)"/g, `data-search-js="${BASE_PATH}/static.files/$1"`) + .replace(/data-settings-js="([^"]+)"/g, `data-settings-js="${BASE_PATH}/static.files/$1"`) + + // Fix logo paths + .replace(/src="\.\/static\.files\/rust-logo/g, `src="${BASE_PATH}/static.files/rust-logo`) + .replace(/src="\.\.\/static\.files\/rust-logo/g, `src="${BASE_PATH}/static.files/rust-logo`); + + await fs.writeFile(file, content, 'utf-8'); + } + + // Also fix paths in JavaScript files + const jsFiles = await glob(`${VOCS_DIST_PATH}/**/*.js`); + + for (const file of jsFiles) { + let content = await fs.readFile(file, 'utf-8'); + + // Fix any hardcoded paths in JS files + content = content + .replace(/"\.\/static\.files\//g, `"${BASE_PATH}/static.files/`) + .replace(/"\.\.\/static\.files\//g, `"${BASE_PATH}/static.files/`) + .replace(/"\.\/([^/]+)\/index\.html"/g, `"${BASE_PATH}/$1/index.html"`) + .replace(/"\.\.\/([^/]+)\/index\.html"/g, `"${BASE_PATH}/$1/index.html"`); + + await fs.writeFile(file, content, 'utf-8'); + } + + console.log('Cargo docs successfully injected!'); + console.log(`The crate documentation will be available at ${BASE_PATH}`); +} + +// Run the script +injectCargoDocs().catch(console.error); \ No newline at end of file diff --git a/book/vocs/vocs.config.ts b/book/vocs/vocs.config.ts index 7cb376d3cd..299963fc36 100644 --- a/book/vocs/vocs.config.ts +++ b/book/vocs/vocs.config.ts @@ -12,6 +12,7 @@ export default defineConfig({ topNav: [ { text: 'Run', link: '/run/ethereum' }, { text: 'SDK', link: '/sdk/overview' }, + { text: 'Rustdocs', link: '/docs' }, { text: 'GitHub', link: 'https://github.com/paradigmxyz/reth' }, { text: 'v1.4.8',