Compare commits

...

258 commits
v3.5.2 ... main

Author SHA1 Message Date
dependabot[bot]
67924ca979
chore(deps): bump marocchino/sticky-pull-request-comment from 2.9.1 to 2.9.2 (#11103)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-15 09:31:05 +02:00
dependabot[bot]
bf6f574383
chore(deps): bump actions/setup-node from 4.3.0 to 4.4.0 (#11102)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-15 09:30:51 +02:00
Sébastien Lorber
730ce485ba
feat(theme): make it possible to provide your own page title formatter (#11090) 2025-04-11 19:16:17 +02:00
Sébastien Lorber
5b944d6b64
feat(pages): Support frontMatter.slug like docs and blog plugins (#11088) 2025-04-11 14:44:19 +02:00
Sébastien Lorber
ac0a6f7d5b
chore: add pr: translations GitHub + lerna changelog label (#11087)
Co-authored-by: slorber <749374+slorber@users.noreply.github.com>
2025-04-11 12:51:42 +02:00
Sébastien Lorber
72b8621515
fix(theme): add missing rel="tag" attribute for docs/blog tags (#11085)
Co-authored-by: slorber <749374+slorber@users.noreply.github.com>
2025-04-11 11:44:12 +02:00
Sébastien Lorber
535c1c9835
docs: remove ref to Docusaurus v2 (#11084)
Co-authored-by: slorber <749374+slorber@users.noreply.github.com>
2025-04-11 11:05:44 +02:00
Sébastien Lorber
29d19a6884
refactor(live-codeblock): refactor live code block theme components (#11077) 2025-04-10 15:55:02 +02:00
Ben McCann
387157205a
chore(deps): upgrade cspell (#11078)
* chore(deps): upgrade cspell

* Add word

---------

Co-authored-by: Joshua Chen <sidachen2003@gmail.com>
2025-04-08 19:37:04 -04:00
Sébastien Lorber
e9dfecbce7
fix(c): fix yarn lint:spelling:fix script (#11075)
* fix lint:spelling:fix

* fix lint:spelling:fix
2025-04-08 16:11:41 +02:00
Sébastien Lorber
df5f465605
chore: upgrade Rspack 1.3.3 (#11073)
upgrade Rspack
2025-04-08 14:24:21 +02:00
Sébastien Lorber
67248f8e66
perf(core): remove bundler optimization.removeAvailableModules (#11072)
remove removeAvailableModules
2025-04-08 11:53:45 +02:00
dependabot[bot]
e8e67e9b9e
chore(deps): bump estree-util-value-to-estree from 3.1.2 to 3.3.3 (#11070)
Bumps [estree-util-value-to-estree](https://github.com/remcohaszing/estree-util-value-to-estree) from 3.1.2 to 3.3.3.
- [Release notes](https://github.com/remcohaszing/estree-util-value-to-estree/releases)
- [Commits](https://github.com/remcohaszing/estree-util-value-to-estree/compare/v3.1.2...v3.3.3)

---
updated-dependencies:
- dependency-name: estree-util-value-to-estree
  dependency-version: 3.3.3
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-08 11:29:46 +02:00
dependabot[bot]
08467e5f51
chore(deps): bump actions/dependency-review-action from 4.5.0 to 4.6.0 (#11069)
Bumps [actions/dependency-review-action](https://github.com/actions/dependency-review-action) from 4.5.0 to 4.6.0.
- [Release notes](https://github.com/actions/dependency-review-action/releases)
- [Commits](3b139cfc5f...ce3cf9537a)

---
updated-dependencies:
- dependency-name: actions/dependency-review-action
  dependency-version: 4.6.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-08 11:29:33 +02:00
Sébastien Lorber
abdd0c7995
fix(blog): fix blog Atom feed item url / XSL bug (#11068)
Fix blog Atom feed XSL
2025-04-07 19:10:01 +02:00
Sébastien Lorber
979ae084a7
feat(core): enable Rspack parallelCodeSplitting (#11067)
re-enable parallelCodeSplitting
2025-04-07 18:55:27 +02:00
Sébastien Lorber
6215983cdd
chore: upgrade mermaid, fix diagram labels bug (#11066)
* fix mermaid bug

* refactor: apply lint autofix

---------

Co-authored-by: slorber <749374+slorber@users.noreply.github.com>
2025-04-07 18:30:01 +02:00
Sébastien Lorber
b7ba0b54fb
chore: upgrade image-size deps to v2 (#11065)
* upgrade image-size to v2

* fix resizeImage script

* fix tests
2025-04-07 18:29:15 +02:00
Sébastien Lorber
31b279fea6
refactor(theme): introduce CodeBlockContextProvider + split into smaller components (#11062)
* introduce CodeBlockContextProvider

* refactor: apply lint autofix

* add comment

* move wordWrap to context

* Refactor button components

* remove console logs

* Extract more code block components

* Extract CodeBlockLineToken subcomponent

* add TODOs

---------

Co-authored-by: slorber <749374+slorber@users.noreply.github.com>
2025-04-04 20:11:40 +02:00
Sébastien Lorber
d28210d35b
refactor(theme): CodeBlock, centralize metadata parsing + refactor theme component (#11059)
* fix import duplicated

* centralize parsing of code block metadata

* split logic into many subcomponents

* extract getCodeBlockClassName

* fix duplicate useCodeWordWrap() call

* simplify JSX

* move ensureLanguageClassName logic to theme-common

* fix line highlighting bug

* rename tokens to lines

* Extract Pre/Code subcomponents

* Add tests for metadata language

* Add tests for metadata className

* Add tests for metadata title

* Add tests for metadata line highlighting

* Add tests for metadata lineNumbersStart
2025-04-04 18:15:34 +02:00
Sébastien Lorber
f6bdc3123b
refactor(theme): refactor CodeBlock parseLines logic + use inline snapshots to ease review (#11058)
* refactor codeblock parseLines logic + use inline snapshots

* refactor: apply lint autofix

* eslint

---------

Co-authored-by: slorber <749374+slorber@users.noreply.github.com>
2025-04-04 13:22:51 +02:00
Sébastien Lorber
16e3002911
fix(theme): navbar mobile sidebar should allow clicking dropdown parent link (#11053)
* try to repro + initial fix

* Use HTML button

* extract useItemCollapsible()

* Split DropdownNavbarItem into Mobile/Desktop subcomponents

* Add aria labels to button

* cleanup prop types

* aria label

* add translations

* cleanup types

* Split DefaultNavbarItem into Mobile/Desktop subcomponents

* revert change

* type fix
2025-04-03 18:40:45 +02:00
Sébastien Lorber
a05629eeb5
chore: use rspack 1.3.0 (#11039)
* upgrade rspack

* disable parallelCodeSplitting temporarily
2025-04-01 15:33:09 +02:00
程序员小墨
3176a2ccba
fix(theme): Fix code block magic comments with CRLF line breaks bug (#11046)
* fix: with CRLF line breaks, an extra empty line was rendered with // highlight-end at end of code blocks

See: #11036

* Add unit tests

---------

Co-authored-by: sebastien <lorber.sebastien@gmail.com>
2025-04-01 15:14:02 +02:00
Daniel Kuschny
c0f3755d51
test(theme-common): Add tests for getLineNumbersStart (#11017) 2025-03-28 17:20:50 +01:00
Sébastien Lorber
dae29a2782
refactor(core): remove clean-webpack-plugin (#11037)
* remove clean-webpack-plugin

* refactor: apply lint autofix

* remove clean-webpack-plugin

---------

Co-authored-by: slorber <749374+slorber@users.noreply.github.com>
2025-03-27 18:44:48 +01:00
Sébastien Lorber
37d8844506
fix(cli): fix CLI write-translation bug (#11027)
* fix write-translation bug

* fix write-translation bug
2025-03-27 12:22:44 +01:00
Tatsunori Uchino
8881fd1a59
fix(theme-translation): add missing Japanese translation for System Mode (#11030) 2025-03-27 11:58:10 +01:00
Sébastien Lorber
e64e0e7c96
fix(ideal-image): fix waypoint initial scroll bug (#11026)
fiw waypoint initial scroll bug
2025-03-24 15:31:37 +01:00
Sébastien Lorber
43fdb825e8
fix(ideal-image): Internalize react-waypoint dependency, fix React 19 compatibility (#11014)
* copy waypoint, remove logs

* remove propTypes

* remove debug

* remove scrollableAncestor prop

* remove onPositionChange

* remove horizontal prop

* remove fireOnRapidScroll

* remove useless render code

* remove ensureRefIsUsedByChild

* remove children prop

* inline constants

* remove consolidated-events

* copy getCurrentPosition

* remove computeOffsetPixels

* extract findScrollableAncestor

* extract getBounds

* remove hasWindow

* remove onNextTick()

* fixes

* make it work, replace waypoint

* slim down

* slim down

* slim down

* use TypeScript

* slim down

* slim down

* revert
2025-03-20 12:33:27 +01:00
Sébastien Lorber
fcee060f40
refactor(ideal-image-plugin): internalize legacy component code (#11010)
* almost working

* refactor: apply lint autofix

* cspell ignore

* refactor: apply lint autofix

* type fixes

---------

Co-authored-by: slorber <749374+slorber@users.noreply.github.com>
2025-03-19 18:21:09 +01:00
Sébastien Lorber
502b9007be
perf(core): Optimize docusaurus start/serve, fix openBrowser() perf issue on macOS (#11007)
Optimize openBrowser() util
2025-03-19 13:18:32 +01:00
Sébastien Lorber
3782244ce7
feat(core): Add bundler tracing/profiling (#11006)
* Add rspack tracing/profiling

* Add CLI start PerfLogger

* cleanup BundlerCPUProfilerPlugin
2025-03-19 12:14:06 +01:00
Sébastien Lorber
e88f1aaf96
fix(mdx-loader): refactor and fix heading to toc html value serialization (#11004)
* refactor with iso behavior

* Add unit tests

* change behavior for <img> tags
2025-03-18 17:52:26 +01:00
dependabot[bot]
1d4d17da18
chore(deps): bump actions/setup-node from 4.2.0 to 4.3.0 (#11002)
* chore(deps): bump actions/setup-node from 4.2.0 to 4.3.0

Bumps [actions/setup-node](https://github.com/actions/setup-node) from 4.2.0 to 4.3.0.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](1d0ff469b7...cdca7365b2)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* refactor: apply lint autofix

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-18 10:01:00 +01:00
cylewaitforit
b0b95ccff9
fix(module-type-aliases): pin react-helmet-async to @slorber/react-helmet-async@1.3.0 (#10998) 2025-03-17 11:17:05 +01:00
Balthasar Hofer
579bb5ad37
fix(theme): CodeBlock should accept title of ReactNode type (#10999)
* allow ReactNode for CodeBlock title

* fix example
2025-03-17 11:03:10 +01:00
dependabot[bot]
7d36e2a8ff
chore(deps): bump @babel/runtime-corejs3 from 7.25.9 to 7.26.10 (#10990)
Bumps [@babel/runtime-corejs3](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime-corejs3) from 7.25.9 to 7.26.10.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.26.10/packages/babel-runtime-corejs3)

---
updated-dependencies:
- dependency-name: "@babel/runtime-corejs3"
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-14 18:51:00 +01:00
dependabot[bot]
39eded7b69
chore(deps): bump axios from 1.7.7 to 1.8.2 (#10970)
Bumps [axios](https://github.com/axios/axios) from 1.7.7 to 1.8.2.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.7.7...v1.8.2)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-14 18:32:20 +01:00
Sébastien Lorber
cb69b40c86
fix(theme): mobile drawer history blocker should be rendered conditionally (workaround) (#10989)
Add history blocker workaround
2025-03-14 18:22:00 +01:00
Sébastien Lorber
7cf94c03a4
feat(theme): Allow resetting colorMode to System/OS value (#10987)
* make it work

* fix

* Try to fix accessibility issues

* add translations

* rename 'auto' to 'system'

* refactor: apply lint autofix

* rename 'auto' to 'system'

* remove title prop

* typo

* use shorter title

* refactor: apply lint autofix

* document useColorMode tradeoffs + data-attribute variables

---------

Co-authored-by: slorber <749374+slorber@users.noreply.github.com>
Co-authored-by: nasso
Co-authored-by: OzakIOne
2025-03-14 13:45:25 +01:00
pedenys
fd51384cab
docs: update external link to MDX reference (#10981)
Update markdown-features-code-blocks.mdx

Update external link to MDX reference
2025-03-13 10:53:45 +01:00
Jake Boone
549ab795c3
feat(plugin-npm2yarn): Add Bun to default tabs conversions (#10953)
* fix(plugin-npm2yarn): Add Bun as default to align with docs

* fix(plugin-npm2yarn): update test snapshot with bunx

* fix(plugin-npm2yarn): update test snapshot with bunx-create

* fix(plugin-npm2yarn): update screenshot to add pnpm and Bun

---------

Co-authored-by: Sébastien Lorber <slorber@users.noreply.github.com>
2025-03-11 09:37:01 +01:00
dependabot[bot]
e2e85e6b50
chore(deps): bump prismjs from 1.29.0 to 1.30.0 (#10978)
Bumps [prismjs](https://github.com/PrismJS/prism) from 1.29.0 to 1.30.0.
- [Release notes](https://github.com/PrismJS/prism/releases)
- [Changelog](https://github.com/PrismJS/prism/blob/master/CHANGELOG.md)
- [Commits](https://github.com/PrismJS/prism/compare/v1.29.0...v1.30.0)

---
updated-dependencies:
- dependency-name: prismjs
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-10 20:29:27 -04:00
Sébastien Lorber
15b0ef6d13
chore: add eslint-plugin-react-compiler (#10969)
* install ESLint plugin

* fix eslint CodeBlockLine error

* eslint

* eslint

* eslint

* refactor: apply lint autofix

* empty

---------

Co-authored-by: slorber <749374+slorber@users.noreply.github.com>
2025-03-07 18:04:40 +01:00
Sébastien Lorber
d33004da1e
chore: upgrade monorepo to TS 5.8 (#10966)
* Upgrade to TS 5.8

* increase build perf CI timeout values

* enable erasableSyntaxOnly

* enable erasableSyntaxOnly
2025-03-06 12:33:11 +01:00
Sébastien Lorber
dec3bcbbd7
fix(create-docusaurus): fix CLI and remove shelljs escapeShellArg util (#10958) 2025-02-28 20:09:59 +01:00
dependabot[bot]
2976dfea72
chore(deps): bump http-proxy-middleware from 2.0.6 to 2.0.7 (#10957)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-28 19:07:23 +01:00
Sébastien Lorber
4d3930f944
refactor: remove react-dev-utils (CRA) dependency, internalize code (#10956)
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
Co-authored-by: slorber <749374+slorber@users.noreply.github.com>
2025-02-28 18:49:27 +01:00
ozaki
7f4a37949e
refactor: replace unmaintained shelljs dependency by execa (#10358)
Co-authored-by: sebastien <lorber.sebastien@gmail.com>
2025-02-28 14:31:01 +01:00
Hidde de Vries
a6ef3897e0
fix(theme): only render secondaryMenu if it should be shown (#10705)
Co-authored-by: sebastien <lorber.sebastien@gmail.com>
2025-02-27 16:39:03 +01:00
Sébastien Lorber
396deedba4
fix(theme): fix useColorMode().colorMode leading to React hydration mismatches (#10954) 2025-02-27 16:32:28 +01:00
マルコメ
9d7ceec189
docs: add missing code block language to README.md (#10952) 2025-02-26 10:15:03 +01:00
kilavvy
154c95c11c
docs: typo in documentation files (#10950) 2025-02-25 13:38:38 +01:00
Joshua Chen
f31bfec3c9
fix(theme-classic): fix ThemeClassName reference (#10948) 2025-02-24 02:07:16 -05:00
Sébastien Lorber
ca035d8562
feat(theme): add theme layout stable CSS classes (#10945) 2025-02-21 19:03:49 +01:00
Yangshun Tay
c10a18d51d
misc(blog): Update Yangshun bio (#10942) 2025-02-21 12:16:03 +01:00
Sébastien Lorber
e641568e7f
feat(core): Docusaurus Faster - Rspack Persistent Cache (#10931) 2025-02-21 11:39:48 +01:00
Massoud Maboudi
5b848cb2f0
docs(showcase): Update datagit.ir showcase image, description, and tags (#10939) 2025-02-20 13:04:16 +01:00
Sébastien Lorber
cdc3ba31d9
chore(algolia): bump docsearch dependency to v3.9 (#10941) 2025-02-20 11:25:52 +01:00
dependabot[bot]
1a71b3863a
chore(deps): bump dompurify from 3.1.6 to 3.2.4 (#10937)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-18 13:30:44 +01:00
dependabot[bot]
871af414a5
chore(deps): bump preactjs/compressed-size-action from 2.7.0 to 2.8.0 (#10936)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-18 12:56:25 +01:00
Taras
75e5a00a66
docs: disable plugin-debug in production by default (#10928) 2025-02-16 15:22:59 +01:00
Sébastien Lorber
af272bdefa
fix(docs): fix mdx loader cache invalidation bug on versions changes (#10934) 2025-02-14 17:46:41 +01:00
Sébastien Lorber
a72a06ecb1
fix(plugins): add missing validateOptions types (#10929)
Co-authored-by: slorber <749374+slorber@users.noreply.github.com>
2025-02-13 15:29:51 +01:00
Milica
04f7972f32
docs: updating showcase site link (#10925) 2025-02-13 12:21:15 +01:00
John Reilly
45065e8d2b
fix(seo): docs breadcrumb structured data should use JSON-LD and filter unliked categories (#10888)
Co-authored-by: sebastien <lorber.sebastien@gmail.com>
2025-02-07 19:03:10 +01:00
Sébastien Lorber
cd7875bf84
docs: move docs of frontMatter.title_meta from docs to blog plugin (#10916) 2025-02-07 16:57:23 +01:00
Sébastien Lorber
5331de2962
fix(theme): collapse doc sidebar category on label click if active (#10886) 2025-02-07 16:18:36 +01:00
Sébastien Lorber
c5a793de9d
fix(core): use os.availableParallelism() for SSG worker threads count (#10915) 2025-02-07 16:05:02 +01:00
Sébastien Lorber
cd2792775e
fix(ideal-image): Add issuer to ideal-image Webpack loader (#10910) 2025-02-06 14:13:46 +01:00
Max Schmitt
3fde4a0d6a
fix(core): a11y fix on mobile DropdownNavbarItem (#10898) 2025-02-06 13:25:54 +01:00
Sébastien Lorber
b76f0feadc
fix(theme): apply docs sidebar_class_name in DocCard + better dogfooding (#10909) 2025-02-06 13:08:33 +01:00
reece-white
0162f6abc6
chore(plugin-debug): upgrade react-json-view-lite to v2.3.0 for react 19 (#10903) 2025-02-06 10:43:08 +01:00
Yoshiaki Yoshida
801bc7f74a
docs: update Cloudflare Pages deployment link (#10901) 2025-02-06 10:22:47 +01:00
Justin D Mathew
987eb1c6d2
docs(theme-live-codeblock): update versioned docs to include link to react-live (#10902) 2025-02-06 10:10:53 +01:00
Ramazan Sancar
f73d401d3a
fix(theme-translations): Turkish exist language translate completed. (#10893) 2025-02-04 17:43:37 +01:00
Tatsunori Uchino
a0248ed404
docs: Suggest remark-cjk-friendly in migration guide (#10892) 2025-02-03 13:02:20 +01:00
Waldir Pimenta
3198de8c45
docs: Clarify how to enable math equations (#10894)
Co-authored-by: Sébastien Lorber <slorber@users.noreply.github.com>
2025-02-03 12:58:05 +01:00
Stephen Glass
dee39835a1
docs: fix grammar for installation docs (#10889) 2025-02-03 12:56:56 +01:00
Sébastien Lorber
7ca3aa5144
perf(theme): use SVG sprite for IconExternalLink (#10885) 2025-01-31 17:28:04 +01:00
Hichem Fantar
884f93eea8
fix(theme): fix <DocCard> height inconsistency (#10849)
Co-authored-by: sebastien <lorber.sebastien@gmail.com>
2025-01-31 15:25:10 +01:00
jkboxomine
3b72bb43db
fix(docs): versioning CLI should copy localized translation file current.json to version-<v>.json (#10875)
Co-authored-by: Sungchang Ha <bryan98@naver.com>
2025-01-31 12:50:13 +01:00
Mariusz Krzaczkowski
bc3445c344
fix(theme-translations): Add missing Polish (pl) theme translations (#10884) 2025-01-31 11:30:00 +01:00
Kenneth Ormandy
78f44d0ae7
fix(theme): Hide code block buttons before React hydration (#10866) 2025-01-30 18:24:33 +01:00
Oleksiy Gapotchenko
4d7a28963a
feat(theme): add versions attribute to docsVersionDropdown navbar item (#10852)
Co-authored-by: sebastien <lorber.sebastien@gmail.com>
2025-01-30 18:21:54 +01:00
Justin D Mathew
8bc3e8a092
docs(theme-live-codeblock): update theme-live-codeblock.mdx to include link to react-live (#10874) 2025-01-30 13:02:17 +01:00
dependabot[bot]
d025403f73
chore(deps): bump actions/setup-node from 4.1.0 to 4.2.0 (#10873)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-01-28 10:40:48 +01:00
Sébastien Lorber
5dc472759f
refactor(create-docusaurus): add future.v4 flag to init templates (#10871) 2025-01-27 16:05:12 +01:00
Tatsunori Uchino
b6d9fe2843
chore(deps): bump @rspack/core in Faster from 1.2.0-alpha.0 to 1.2.2 (#10870) 2025-01-27 15:32:10 +01:00
Sébastien Lorber
98aab81388
feat(core): Docusaurus Faster - SSG worker threads (#10826)
Co-authored-by: Sébastien Lorber <slorber@users.noreply.github.com>
Co-authored-by: Mariusz Krzaczkowski <m.krzaczkowski@yetiforce.com>
Co-authored-by: João Victor Lopes <joaof.victor@hotmail.com>
Co-authored-by: slorber <749374+slorber@users.noreply.github.com>
2025-01-27 14:24:30 +01:00
dependabot[bot]
042070cf9d
chore(deps): bump marocchino/sticky-pull-request-comment from 2.9.0 to 2.9.1 (#10853)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-01-22 10:05:13 +01:00
dependabot[bot]
9700d47d69
chore(deps): bump katex from 0.16.11 to 0.16.21 (#10851)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-01-17 22:55:44 +01:00
Sébastien Lorber
9df5aae6de
feat(core): new postBuild({routesBuildMetadata}) API, deprecate head attribute + v4 future flag (#10850)
Co-authored-by: slorber <749374+slorber@users.noreply.github.com>
2025-01-17 17:26:48 +01:00
Sébastien Lorber
67207bc5e5
fix(theme): Fix <DocCardList> usage on docs at root of a sidebar (#10847)
Fix `<DocCardList>` usage on docs at root of a sidebar
2025-01-16 21:53:41 +01:00
Sébastien Lorber
e59355be76
feat(theme): code block showLineNumbers=start metastring (#10846) 2025-01-16 17:28:04 +01:00
João Victor Lopes
fcc9e5c56a
docs(website): Comparison with Rspress (#10822)
Co-authored-by: Sébastien Lorber <slorber@users.noreply.github.com>
2025-01-07 12:11:51 +01:00
Mariusz Krzaczkowski
5a50522905
fix(theme-translations): Add missing Polish (pl) theme translations (#10825) 2025-01-07 11:30:52 +01:00
Sébastien Lorber
97690abc94
fix(core): restore core svg file-loader (#10820) 2025-01-06 17:54:43 +01:00
Sébastien Lorber
35259521e0
chore(plugin-debug): upgrade react-json-view-lite to v2, prepare for React 19 (#10819) 2025-01-06 16:01:29 +01:00
Sébastien Lorber
431526ecbc
fix: perflogger mark detail bug (#10818) 2025-01-06 14:13:14 +01:00
FISH UP
0df69844b6
chore(theme-translations): add missing zh theme translations (#10816)
* fix(theme-translation): add missing zh-Hant theme translations

* fix(theme-translation): add missing zh-Hans theme translations
2025-01-05 19:38:25 -05:00
Sébastien Lorber
c17b55b58f
chore: update examples for v3.7.0 (#10814) 2025-01-03 19:32:21 +01:00
Sébastien Lorber
71d682c53b
chore: release Docusaurus 3.7.0 (#10812) 2025-01-03 18:11:21 +01:00
Sébastien Lorber
cacb973326
feat(core): Turn Rspack incremental on by default (again) (#10800) 2025-01-03 14:23:26 +01:00
Jake Boone
94a56fef08
refactor: reduce file size of docusaurus.svg (#10806) 2025-01-03 12:19:25 +01:00
Ivan Cheban
1b44d7ae3c
docs: simplify sidebar description (#10810) 2025-01-03 12:04:26 +01:00
Hichem Fantar
bdbdd5aff5
chore: specify package manager version in package.json (#10807) 2025-01-03 11:54:11 +01:00
Lehoczky Zoltán
9800180f57
fix(npm-to-yarn): add missing npm-to-yarn converter for Bun (#10803) 2024-12-30 17:22:26 +01:00
Zed Spencer-Milnes
56ccf19063
chore: Devcontainer upgrade to Ubuntu Noble & Node 22 (#10770) 2024-12-30 11:13:01 +01:00
Zed Spencer-Milnes
43795fcabb
feat(blog): Add author social icons for bluesky, mastodon, threads, twitch, youtube, instagram (#10768)
Co-authored-by: sebastien <lorber.sebastien@gmail.com>
Co-authored-by: Chas Emerick <chas@cemerick.com>
2024-12-27 12:32:25 +01:00
Sébastien Lorber
cc97d66dbb
refactor(algolia): simplify SearchBar component (#10801) 2024-12-26 18:59:00 +01:00
Sébastien Lorber
e8ad3923ea
fix(algolia): properly forward placeholder/translations to DocSearch components (#10799) 2024-12-26 16:30:23 +01:00
Sébastien Lorber
e7a8c9db82
refactor(core): Use Intl native API to get locale direction, remove rtl-detect depend… (#10798) 2024-12-26 15:44:07 +01:00
dependabot[bot]
092238d0fa
chore(deps): bump nanoid from 3.3.7 to 3.3.8 (#10771)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-12-26 13:47:48 +01:00
Pierre Millot
4a1ec52922
chore(algolia): upgrade algoliasearch to v5 (#10672)
Co-authored-by: sebastien <lorber.sebastien@gmail.com>
2024-12-26 13:39:32 +01:00
Sébastien Lorber
37184e581d
fix(theme): Footer Column/Link should merge provided className (#10796) 2024-12-26 12:46:43 +01:00
Taylor Reece
e5ed9a3894
docs(showcase): Update Prismatic.io showcase image, description, and tags (#10795) 2024-12-24 16:38:24 +01:00
Sébastien Lorber
0f29a37b3a
feat: Add React 19 support to Docusaurus v3 (#10763) 2024-12-24 14:43:03 +01:00
Sébastien Lorber
f196a1eb29
fix(core): fix React hydration errors, change html minifier settings (#10786) 2024-12-23 18:45:31 +01:00
William Black
2565601af3
fix(theme-common): code block magic comments should support SQL block comments (#10782) 2024-12-20 17:16:59 +01:00
Jan Aukema
87a5ab9177
fix(theme-translations): Add missing Dutch (nl) theme translations (#10783)
Co-authored-by: Jan Aukema <j.aukema@atps.nl>
2024-12-20 17:03:03 +01:00
Sébastien Lorber
b5359db47e
refactor(website): remove pure-react-carousel (#10784) 2024-12-20 16:47:29 +01:00
Zen
c5a6c26d94
fix(theme-translation): add missing Korean (ko) theme translations (#10760) 2024-12-13 15:27:54 +01:00
Zen
9cefca42df
docs: add swizzle delete tip (#10759) 2024-12-13 15:27:03 +01:00
Sébastien Lorber
91c0b5bf35
fix(docs): fix sidebar item visibility bug for category index (#10754) 2024-12-10 13:06:21 +01:00
Sébastien Lorber
4966dce36e
refactor(core): swizzle wrap should use ReactNode instead of JSX.Element (#10747) 2024-12-06 18:24:18 +01:00
Sébastien Lorber
f9825af43e
refactor: prepare types for React 19 (#10746) 2024-12-06 18:03:04 +01:00
Alvin Bryan
e9f0641620
docs: Removed AgileTs from the Showcase (#10742) 2024-12-06 11:56:28 +01:00
Waldir Pimenta
01cad20b5a
docs: Link initialization docs together (#10740) 2024-12-05 13:55:59 +01:00
Sébastien Lorber
a995865314
feat(blog): Add frontMatter.sidebar_label (#10729) 2024-11-29 18:05:09 +01:00
Sébastien Lorber
df6f53a2f5
feat(svgr): create new Docusaurus SVGR plugin (#10677) 2024-11-29 17:26:34 +01:00
Sébastien Lorber
750edc78ff
refactor(theme-common): change storageUtils useSyncExternalCode getSnapshot workaround (#10728) 2024-11-29 16:50:10 +01:00
Sébastien Lorber
8098741245
fix(core): fix codegen routesChunkName possible hash collision (#10727) 2024-11-29 15:36:02 +01:00
Sébastien Lorber
1777b14566
chore: upgrade to TS 5.7 (#10725) 2024-11-28 16:51:42 +01:00
Sébastien Lorber
fb7ad2c1bb
fix(mdx-loader): fix md image paths with spaces bug related to transformImage encoding problem (#10723) 2024-11-28 16:39:43 +01:00
dependabot[bot]
ffdd415129
chore(deps): bump actions/dependency-review-action from 4.4.0 to 4.5.0 (#10721)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-26 09:21:27 +01:00
Lin Huang
60499e2cdc
docs: fix example typo for migration-versioned-sites.mdx (#10717) 2024-11-25 10:20:09 +01:00
Sébastien Lorber
fd43036ab8
chore: release Docusaurus 3.6.3 (#10713) 2024-11-22 17:13:56 +01:00
Sébastien Lorber
8561826026
fix(core): disable Rspack incremental in dev (#10712) 2024-11-22 16:05:13 +01:00
Sébastien Lorber
90e85e83a5
chore: release Docusaurus 3.6.2 (#10698) 2024-11-19 19:07:06 +01:00
Sébastien Lorber
5344bc105e
fix(create-docusaurus): Fix TS issues on newly initialized sites (#10694) 2024-11-19 12:08:35 +01:00
Sébastien Lorber
be7bace8bd
fix(types): add missing ambiant TS declarations for .md / .mdx partials (#10693) 2024-11-18 16:32:09 +01:00
Sébastien Lorber
644bc49862
fix(theme-live-codeblock): fix live editor border-radius (#10689) 2024-11-18 11:10:06 +01:00
Sébastien Lorber
e5bdb0b97d
chore(ci): retry yarn install to ignore temporary network errors (#10691) 2024-11-18 11:09:12 +01:00
Ryoga
a53ddf6ae9
fix(theme-translation): complete and fix Japanese translations (#10688) 2024-11-18 09:35:00 +01:00
Zwyx
e6b7397253
docs: fix description of feedOptions.xslt (#10687)
* Fix description of `feedOptions.xslt`

* Update website/docs/api/plugins/plugin-content-blog.mdx

---------

Co-authored-by: Joshua Chen <sidachen2003@gmail.com>
2024-11-16 01:31:56 -05:00
Sébastien Lorber
e3c13291ac
fix(cli): docusaurus --help should print plugin commands using extendCli() (#10685) 2024-11-15 19:07:59 +01:00
Junior_Gx
36fc11dccd
fix(homepage): typo corrections and updated twitter handles (#10678)
Co-authored-by: sebastien <lorber.sebastien@gmail.com>
2024-11-15 16:06:02 +01:00
Sébastien Lorber
33a35a4c65
fix(bundler): allow CSS nesting by default, restore postcss-preset-env (#10680) 2024-11-15 15:58:34 +01:00
Sébastien Lorber
2b8ddb9260
fix(create-docusaurus): add ts exclude to TS init template (#10676) 2024-11-14 12:29:27 +01:00
Sébastien Lorber
dfea969574
fix(faster): Upgrade to Rspack 1.1.1, fix build progress bar display (#10648) 2024-11-14 12:01:40 +01:00
Kyle Tsang
0c8635529e
docs: fix package name in babel config docs (#10666) 2024-11-11 13:59:23 +01:00
Sébastien Lorber
f1272788a4
chore: release Docusaurus 3.6.1 (#10659) 2024-11-08 18:47:43 +01:00
Sébastien Lorber
d268a20a6f
fix(core): bundler should not minimize static assets (#10658) 2024-11-08 18:26:37 +01:00
Sébastien Lorber
0c791fb4e9
docs: fix old base ts config ref (#10657) 2024-11-08 15:51:24 +01:00
Sébastien Lorber
ae46d110d1
test(argos): skip screenshot for /tests/pages/react-18 (#10656) 2024-11-08 15:21:03 +01:00
Sébastien Lorber
bcfa3b1128
refactor(faster,bundler,core): improve js loader DX (#10655) 2024-11-08 14:33:18 +01:00
Balthasar Hofer
bdf55eda22
refactor(mdx-loader): streamline typescript usage for remark plugin types (#10651) 2024-11-07 17:42:32 +01:00
Sébastien Lorber
e32aa605ca
chore: Argos screenshot dogfooding test pages (#10650) 2024-11-07 16:12:23 +01:00
Sébastien Lorber
1955002d3b
fix(faster,utils): fix faster/types peerDependencies (#10649) 2024-11-07 12:26:34 +01:00
Sébastien Lorber
5a883b4008
chore: update examples with docusaurus 3.6 (#10642) 2024-11-04 12:31:10 +01:00
Sébastien Lorber
ed2cdf391f
chore: release Docusaurus v3.6 (#10633) 2024-11-04 12:03:54 +01:00
Sébastien Lorber
fce0884768
fix(core): restore Rspack ProgressBar colors (#10632) 2024-10-31 12:54:36 +01:00
Liviu Ionescu
5cf2c39836
feat(blog): Add frontMatter.title_meta to override title for SEO (#10586)
Co-authored-by: sebastien <lorber.sebastien@gmail.com>
2024-10-31 11:59:35 +01:00
Sébastien Lorber
5c1ce0137c
docs: fix frontMatter.mdx.format docs (#10631) 2024-10-31 11:23:59 +01:00
Sébastien Lorber
e7001060da
docs: Add missing API ref docs for Docusaurus Faster options (#10630) 2024-10-31 11:16:59 +01:00
dependabot[bot]
a4fa4c27f1
chore(deps): bump actions/setup-node from 4.0.4 to 4.1.0 (#10623)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-29 11:40:51 +01:00
dependabot[bot]
a0aa7d8174
chore(deps): bump actions/dependency-review-action from 4.3.4 to 4.4.0 (#10624)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-29 11:11:32 +01:00
Sébastien Lorber
34f9a36a9d
fix(faster): allow Rspack + babel-loader (#10617) 2024-10-25 19:24:20 +02:00
Sébastien Lorber
52e50d29bc
fix(theme): Restore former globalThis.Prism (#10618) 2024-10-25 19:24:05 +02:00
Sébastien Lorber
d723a1ee46
fix(faster): add missing tslib dependency (#10616) 2024-10-25 16:08:48 +02:00
Sébastien Lorber
87c19650ba
fix(faster): fix error message typo + add color (#10614)
fix faster error
2024-10-25 13:22:51 +02:00
Sébastien Lorber
3c8dc5bc15
chore: fix canary trigger (#10613) 2024-10-25 11:15:35 +02:00
Sébastien Lorber
85fd8f2871
chore: fix canary version prefix (#10612) 2024-10-25 10:56:35 +02:00
Sébastien Lorber
c1349fe78c
fix(core): fix DOCUSAURUS_CURRENT_LOCALE = 'undefined' (#10611) 2024-10-24 19:11:22 +02:00
Sébastien Lorber
28f6a4907a
chore: upgrade minor dependencies (#10610) 2024-10-24 18:44:59 +02:00
Sébastien Lorber
4892f3ac4a
chore: upgrade faster packages (#10609) 2024-10-24 10:23:37 +02:00
Sébastien Lorber
35aa39bddb
docs: mention config/sidebars run in Node.js runtime (#10608) 2024-10-23 20:01:07 +02:00
Sébastien Lorber
1a2b8b7d05
fix(core): Use proper swc loader options (#10605) 2024-10-23 14:47:14 +02:00
Sébastien Lorber
6eeab427bb
chore: fix ci typo in build-perf.yml (#10606) 2024-10-23 13:56:52 +02:00
Sébastien Lorber
d3f110cc03
perf(ci): Add CI checks to prevent memory, build-time and build-size regressions (#10601) 2024-10-22 18:34:38 +02:00
Sébastien Lorber
dbdd254c51
feat(cli): build/deploy should allow multiple --locale options (#10600) 2024-10-22 13:53:41 +02:00
Sébastien Lorber
776b3ee8c2
fix(core): fix i18n sites SSG memory leak - require.cache (#10599) 2024-10-22 12:40:57 +02:00
Andrew Asche
9457833df0
fix(theme): light & dark mode checkbox doesn't announce state switches (#10585) 2024-10-18 19:02:21 +02:00
Sébastien Lorber
c9f231afb3
refactor(core): refactor SSG infrastructure (#10593) 2024-10-18 18:55:09 +02:00
moonrailgun
14579cbda8
docs: resource add docusaurus-i18n (#10592) 2024-10-18 18:48:02 +02:00
Kamil Moskała
c201fd56bb
docs: update google analytics plugin message to past tense (#10591) 2024-10-18 11:34:35 +02:00
Sébastien Lorber
762f7b1927
feat(core): add Node.js memory perf logging (#10590) 2024-10-17 21:18:52 +02:00
Sébastien Lorber
24716787d3
feat: new Rsdoctor official plugin (#10588) 2024-10-17 17:20:06 +02:00
Sébastien Lorber
f6a6ca899f
refactor(core): replace serve-handler fork by official deps (#10587) 2024-10-17 13:54:12 +02:00
Sébastien Lorber
904b53b963
fix(core): fix handling of Swc html minifier warnings (#10581) 2024-10-13 09:57:59 +02:00
Sébastien Lorber
97e6c42099
refactor(core): remove useless Webpack wait plugin (#10579) 2024-10-11 16:02:42 +02:00
Sébastien Lorber
74c09aee35
feat(core): Replace Webpack with Rspack - siteConfig.future.experimental_faster.rspackBundler (#10402) 2024-10-11 10:50:24 +02:00
Sébastien Lorber
c7fd8d1702
fix(core): move @docusaurus/faster to bundler peerDeps (#10573) 2024-10-10 17:14:14 +02:00
Raghav
5400690108
docs: rename Facebook to Meta in GitHub-related Markdowns (#10566)
Co-authored-by: sebastien <lorber.sebastien@gmail.com>
2024-10-09 09:17:53 +02:00
Sébastien Lorber
912c4954d9
feat(core): faster HTML minimizer - siteConfig.future.experimental_faster.swcHtmlMinimizer (#10554) 2024-10-04 18:26:54 +02:00
Patrick
126d395f2d
fix(translations): complete missing slovenian theme translations (#10551)
Co-authored-by: sebastien <lorber.sebastien@gmail.com>
2024-10-04 11:32:45 +02:00
Sébastien Lorber
9e473bd080
fix(mdx-loader): fix cross-compiler cache randomly loading mdx with client/server envs (#10553) 2024-10-03 23:20:57 +02:00
Sébastien Lorber
05f3c203a2
chore: upgrade Webpack to 5.95 and related deps (#10548) 2024-10-03 16:48:27 +02:00
Sébastien Lorber
5de4832fb2
fix(tsconfig): add @docusaurus/tsconfig target es2022 (#10547) 2024-10-03 15:28:01 +02:00
Flix
7f6472a74d
fix(website): APITable component should navigate to anchor less agressively (#10534)
Co-authored-by: Flix <flixy121@gmail.com>
Co-authored-by: sebastien <lorber.sebastien@gmail.com>
2024-10-03 14:22:59 +02:00
Liviu Ionescu
e8545b5280
docs: add tip about harmless vulnerabilities (#10535)
Co-authored-by: Sébastien Lorber <slorber@users.noreply.github.com>
2024-10-03 13:29:32 +02:00
jackrabbit128
0657e5806c
docs: clarify component naming for markdown import (#10545)
* docs: clarify component naming for markdown import (#10542)

* Apply review suggestion

Co-authored-by: Joshua Chen <sidachen2003@gmail.com>

* Update website/docs/guides/markdown-features/markdown-features-react.mdx

---------

Co-authored-by: Joshua Chen <sidachen2003@gmail.com>
2024-10-02 17:45:11 -04:00
dependabot[bot]
0794ebdd18
chore(deps): bump preactjs/compressed-size-action from 2.6.0 to 2.7.0 (#10539)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-01 09:16:24 +02:00
dependabot[bot]
c093dfdcc9
chore(deps): bump rollup from 2.79.1 to 2.79.2 (#10530)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-27 16:46:24 +02:00
Sébastien Lorber
cba1e02772
feat(core): faster CSS minimizer - siteConfig.future.experimental_faster.lightningCssMinimizer (#10522) 2024-09-27 16:31:13 +02:00
Sébastien Lorber
3b7c8281d5
chore: fix interverted condition in formatLighthouseReport.js (#10528) 2024-09-27 13:43:19 +02:00
Sébastien Lorber
539412ef49
chore: fix formatLighthouseReport() CI (#10527) 2024-09-27 13:19:53 +02:00
k-seltzer
0692fe96b5
docs: fix typo (#10520) 2024-09-25 18:27:26 -04:00
dependabot[bot]
7d0345865b
chore(deps): bump actions/setup-node from 4.0.2 to 4.0.4 (#10518) 2024-09-24 10:59:28 -04:00
Sébastien Lorber
a5fd530ffc
fix: remove babel.config.js from init templates + website (#10514) 2024-09-22 13:59:33 +02:00
Sébastien Lorber
9ecff801ff
refactor: create @docusaurus/bundler and @docusaurus/babel packages (#10511) 2024-09-21 16:35:49 +02:00
Sébastien Lorber
fd14d6af55
feat(theme-mermaid): support Mermaid 11+ including new types of diagrams (#10510) 2024-09-19 15:52:43 +02:00
Nguyễn Thành Nam
ce159b1cfa
fix(theme-translations): add missing Vietnamese translations (#10507) 2024-09-19 15:48:52 +02:00
Sébastien Lorber
95e2d469e3
chore: Rename Twitter links/labels to X (#10509) 2024-09-19 11:30:57 +02:00
dependabot[bot]
a435fbd36e
chore(deps): bump dompurify from 3.0.5 to 3.1.6 (#10505)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: sebastien <lorber.sebastien@gmail.com>
2024-09-19 11:29:36 +02:00
Oleksandr
f1d4d55478
docs: update twitter link in introduction docs (#10502)
Co-authored-by: Sébastien Lorber <slorber@users.noreply.github.com>
2024-09-19 09:54:09 +02:00
Oleksandr
d6dcf16452
docs: Update twitter links in introducing-docusaurus blog post (#10503) 2024-09-19 09:47:31 +02:00
Chris Cho
dd4fe63a3d
docs: Fix link to GitHub workflow file docs (#10498) 2024-09-13 10:51:56 +02:00
Sébastien Lorber
2495d059de
refactor(core): prepare codebase for swappable bundler (#10497) 2024-09-13 09:30:30 +02:00
dependabot[bot]
611842af91
chore(deps): bump express from 4.19.2 to 4.20.0 (#10488)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: dependabot[bot] <dependabot[bot]@users.noreply.github.com>
2024-09-11 17:16:32 +02:00
Sébastien Lorber
3725dc37a0
refactor(core): rewrite Webpack ChunkAssetPlugin with RuntimeModule (#10485) 2024-09-10 14:16:36 +02:00
Sébastien Lorber
1a70734c11
chore: upgrade to TS 5.6 + temporarily use skipLibCheck for TS 5.6 (#10486) 2024-09-10 13:52:31 +02:00
Sébastien Lorber
e8c6787ec2
docs: fix v3.5 blog post typo - onUntruncatedBlogPosts (#10484) 2024-09-09 17:05:45 +02:00
Sébastien Lorber
5bab0b5432
feat(core, mdx-loader): deduplicate MDX compilation - siteConfig.future.experimental_faster.mdxCrossCompilerCache (#10479) 2024-09-06 16:07:09 +02:00
Sébastien Lorber
897ebbe3ca
refactor: move PerfLogger from core to @docusaurus/logger (#10480) 2024-09-06 10:58:53 +02:00
Sébastien Lorber
a47e8dda2d
refactor(mdx-loader): re-export metadata module instead of serializing it (#10470) 2024-09-02 17:54:29 +02:00
Olexandr Radovenchyk
3d69ff3d47
docs: Update README.md twitter links (#10468) 2024-09-02 13:54:35 +02:00
Sébastien Lorber
a4329d3388
refactor(mdx-loader): read metadata from memory (loaded content) instead of fs (#10457)
* mdx loader shouldn't read metadata from file system but from memory

* comments

* refactor: apply lint autofix

* apply same for blog

* apply same for blog

* refactor: apply lint autofix

* apply same for pages
2024-08-30 08:02:26 +02:00
ozaki
2aef92cb9e
fix(blog): normalize inline authors socials (#10424)
Co-authored-by: OzakIOne <OzakIOne@users.noreply.github.com>
Co-authored-by: Sébastien Lorber <slorber@users.noreply.github.com>
2024-08-29 18:42:03 +02:00
dependabot[bot]
200b38b763
chore(deps): bump webpack from 5.88.1 to 5.94.0 (#10455)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: sebastien <lorber.sebastien@gmail.com>
2024-08-29 16:28:54 +02:00
ozaki
02ed7d9132
fix(blog): apply baseUrl to relative image in blog authors (#10440)
Co-authored-by: sebastien <lorber.sebastien@gmail.com>
2024-08-29 14:40:42 +02:00
Sébastien Lorber
95880282b1
chore: upgrade npm-to-yarn to v3 (#10454) 2024-08-29 14:18:06 +02:00
Sébastien Lorber
d5885c0c5d
refactor(mdx-loader): refactor mdx-loader, expose loader creation utils (#10450) 2024-08-27 13:52:45 +02:00
dependabot[bot]
db6c2af160
chore(deps): bump github/codeql-action from 3.26.3 to 3.26.5 (#10449)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-08-27 10:27:21 +02:00
Sébastien Lorber
08da5c23fc
refactor(core): Restore null-loader (#10448) 2024-08-26 16:09:05 +02:00
dependabot[bot]
c0b86f4e56
chore(deps): bump micromatch from 4.0.5 to 4.0.8 (#10444)
Bumps [micromatch](https://github.com/micromatch/micromatch) from 4.0.5 to 4.0.8.
- [Release notes](https://github.com/micromatch/micromatch/releases)
- [Changelog](https://github.com/micromatch/micromatch/blob/4.0.8/CHANGELOG.md)
- [Commits](https://github.com/micromatch/micromatch/compare/4.0.5...4.0.8)

---
updated-dependencies:
- dependency-name: micromatch
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-08-24 16:08:21 +02:00
Sébastien Lorber
1b906a5726
fix(core): use serve-handler fork to remove annoying punycode warning (#10442) 2024-08-24 00:32:39 +02:00
Sébastien Lorber
bb90e35153
feat(core): faster JS minimizer - siteConfig.future.experimental_faster.swcJsMinimizer (#10441) 2024-08-23 18:44:42 +02:00
ozaki
aa65f39d8c
fix(blog): authors count incorrectly rendered (#10431)
Co-authored-by: sebastien <lorber.sebastien@gmail.com>
2024-08-23 14:07:49 +02:00
Sébastien Lorber
afd2374ca6
chore(ci): fix setup-node, use LTS by default (#10438) 2024-08-23 13:59:18 +02:00
Sébastien Lorber
84c24127db
fix(theme): upgrade infima, fix footer link width bug (#10439) 2024-08-23 13:59:07 +02:00
Sébastien Lorber
418247ec87
feat(core): faster transpiler option - siteConfig.future.experimental_faster.swcJsLoader (#10435) 2024-08-23 13:48:52 +02:00
Kenrick
349a58453a
docs: Fix typo on changelog (#10437) 2024-08-23 12:38:51 +02:00
Sébastien Lorber
2b28b06f67
fix(core): always use hash for CSS module class names (#10423) 2024-08-21 18:25:36 +02:00
Sébastien Lorber
97bd815d9a
refactor(core): improve handling of server bundle (#10429) 2024-08-21 17:34:18 +02:00
dependabot[bot]
1c56fa5830
chore(deps): bump github/codeql-action from 3.26.0 to 3.26.3 (#10425)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-08-20 11:48:16 +02:00
Sébastien Lorber
473d1442b8
chore(website): add Rsdoctor plugin (#10418) 2024-08-20 11:42:13 +02:00
Oleh
aba22afa18
docs: fix Twitter => X link in repo README (#10414)
Co-authored-by: sebastien <lorber.sebastien@gmail.com>
2024-08-20 11:41:11 +02:00
Sébastien Lorber
bb499926a0
refactor(mdx-loader): remove useless usage of mdx loader this.query (#10422) 2024-08-19 19:17:33 +02:00
Boris Depoortere
6652ed1443
docs: corrected typo in search.mdx (#10416)
Co-authored-by: sebastien <lorber.sebastien@gmail.com>
2024-08-19 18:31:08 +02:00
Sébastien Lorber
2d55ca474e
fix(types): fix type of PluginModule (#10420) 2024-08-19 18:30:52 +02:00
Joel Campos
0b640ca3e2
fix(translations): fix Spanish translation for "breadcrumbs" (#10413) 2024-08-19 16:55:20 +02:00
Sébastien Lorber
3a0b4bf7a2
refactor(core): remove useless build forceTerminate exit (#10410) 2024-08-19 14:17:13 +02:00
Zenahr Barzani
ae5328daac
docs(website): small spellfix on 3.5 update notes (#10405) 2024-08-15 11:46:54 +02:00
Sébastien Lorber
16a789904f
chore: update examples for v3.5.2 (#10401) 2024-08-13 17:23:15 +02:00
Sébastien Lorber
655ce94c0f
chore: release 3.5.2 (#10400) 2024-08-13 14:47:19 +02:00
1271 changed files with 75762 additions and 17418 deletions

View file

@ -21,11 +21,14 @@
],
"ignorePaths": [
"CHANGELOG.md",
"patches",
"packages/docusaurus-theme-translations/locales",
"packages/docusaurus-plugin-ideal-image/src/theme/IdealImageLegacy",
"package.json",
"yarn.lock",
"project-words.txt",
"__snapshots__",
"admin/scripts",
"website/src/data/users.tsx",
"website/src/data/tweets.tsx",
"website/docusaurus.config.localized.json",

View file

@ -1,32 +1,36 @@
{
"image": "mcr.microsoft.com/devcontainers/base:ubuntu-22.04",
"settings": {
"[typescript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true
},
"[json]": {
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true
},
"[jsonc]": {
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true
"image": "mcr.microsoft.com/devcontainers/base:ubuntu-24.04",
"customizations": {
"vscode": {
"settings": {
"[typescript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true
},
"[json]": {
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true
},
"[jsonc]": {
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true
}
},
"extensions": [
"dbaeumer.vscode-eslint",
"orta.vscode-jest",
"esbenp.prettier-vscode",
"streetsidesoftware.code-spell-checker"
]
}
},
"extensions": [
"dbaeumer.vscode-eslint",
"orta.vscode-jest",
"esbenp.prettier-vscode",
"streetsidesoftware.code-spell-checker"
],
"forwardPorts": [3000],
"containerUser": "vscode",
"postCreateCommand": "yarn install",
"waitFor": "postCreateCommand", // otherwise automated jest tests fail
"features": {
"node": {
"version": "18"
"version": "22"
},
"github-cli": "latest"
}

View file

@ -21,3 +21,7 @@ packages/create-docusaurus/lib/*
packages/create-docusaurus/templates/facebook
website/_dogfooding/_swizzle_theme_tests
website/_dogfooding/_asset-tests/badSyntax.js
packages/docusaurus-plugin-ideal-image/src/theme/IdealImageLegacy

14
.eslintrc.js vendored
View file

@ -60,6 +60,7 @@ module.exports = {
},
reportUnusedDisableDirectives: true,
plugins: [
'react-compiler',
'react-hooks',
'header',
'jest',
@ -68,6 +69,7 @@ module.exports = {
'@docusaurus',
],
rules: {
'react-compiler/react-compiler': ERROR,
'react/jsx-uses-react': OFF, // JSX runtime: automatic
'react/react-in-jsx-scope': OFF, // JSX runtime: automatic
'array-callback-return': WARNING,
@ -296,7 +298,7 @@ module.exports = {
'jest/expect-expect': OFF,
'jest/no-large-snapshots': [
WARNING,
{maxSize: Infinity, inlineMaxSize: 10},
{maxSize: Infinity, inlineMaxSize: 50},
],
'jest/no-test-return-statement': ERROR,
'jest/prefer-expect-resolves': WARNING,
@ -380,7 +382,14 @@ module.exports = {
// We don't provide any escape hatches for this rule. Rest siblings and
// function placeholder params are always ignored, and any other unused
// locals must be justified with a disable comment.
'@typescript-eslint/no-unused-vars': [ERROR, {ignoreRestSiblings: true}],
'@typescript-eslint/no-unused-vars': [
ERROR,
{
ignoreRestSiblings: true,
argsIgnorePattern: '^_',
varsIgnorePattern: '^_',
},
],
'@typescript-eslint/prefer-optional-chain': ERROR,
'@docusaurus/no-html-links': ERROR,
'@docusaurus/prefer-docusaurus-heading': ERROR,
@ -396,6 +405,7 @@ module.exports = {
'@',
'WebContainers',
'Twitter',
'X',
'GitHub',
'Dev.to',
'1.x',

View file

@ -30,18 +30,18 @@ jobs:
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Use Node.js
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: 20
node-version: lts/*
- name: Install dependencies
run: yarn install --frozen-lockfile
run: yarn || yarn || yarn
- name: Install Playwright browsers
run: npx playwright install --with-deps chromium
- name: Build website fast
run: yarn build:website:fast --dev
run: yarn argos:build
- name: Take Argos screenshots
run: yarn argos:screenshot

View file

@ -24,11 +24,11 @@ jobs:
- name: Checkout
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Set up Node
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: 20
node-version: lts/*
cache: yarn
- name: Installation
run: yarn
run: yarn || yarn || yarn
- name: Build blog-only
run: yarn workspace website build:blogOnly

View file

@ -27,12 +27,12 @@ jobs:
- name: Checkout
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Set up Node
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: '18'
node-version: lts/*
cache: yarn
- name: Installation
run: yarn
run: yarn || yarn || yarn
- name: Build Hash Router
run: yarn build:website:fast

View file

@ -11,6 +11,7 @@ on:
- main
- docusaurus-v**
paths:
- .github/workflows/build-perf.yml
- package.json
- yarn.lock
- packages/**
@ -25,6 +26,7 @@ permissions:
contents: read
jobs:
# Posts a PR comment with build size differences from PR vs main branches
build-size:
permissions:
checks: write # for preactjs/compressed-size-action to create and update the checks
@ -34,47 +36,65 @@ jobs:
name: Build Size Report
timeout-minutes: 30
runs-on: ubuntu-latest
strategy:
matrix:
DOCUSAURUS_INFRA: ['SLOWER', 'FASTER']
steps:
- name: Checkout
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Set up Node
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: 20
node-version: lts/*
cache: yarn
- name: Track build size changes
uses: preactjs/compressed-size-action@f780fd104362cfce9e118f9198df2ee37d12946c # v2
uses: preactjs/compressed-size-action@946a292cd35bd1088e0d7eb92b69d1a8d5b5d76a # v2
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
build-script: build:website:fast
clean-script: clear:website # see https://github.com/facebook/docusaurus/pull/6838
pattern: '{website/build/assets/js/main*js,website/build/assets/css/styles*css,website/.docusaurus/globalData.json,website/.docusaurus/registry.js,website/.docusaurus/routes.js,website/.docusaurus/routesChunkNames.json,website/.docusaurus/site-metadata.json,website/.docusaurus/codeTranslations.json,website/.docusaurus/i18n.json,website/.docusaurus/docusaurus.config.mjs,website/build/index.html,website/build/docs.html,website/build/docs/**/*.html,website/build/blog.html,website/build/blog/**/*.html}'
pattern: '{website/build/assets/js/main*js,website/build/assets/js/runtime~main*js,website/build/assets/css/styles*css,website/.docusaurus/globalData.json,website/.docusaurus/registry.js,website/.docusaurus/routes.js,website/.docusaurus/routesChunkNames.json,website/.docusaurus/site-metadata.json,website/.docusaurus/codeTranslations.json,website/.docusaurus/i18n.json,website/.docusaurus/docusaurus.config.mjs,website/build/index.html,website/build/docs.html,website/build/docs/**/*.html,website/build/blog.html,website/build/blog/**/*.html}'
# HTML files: exclude versioned docs pages, tags pages, html redirect files
exclude: '{website/build/docs/?.?.?/**/*.html,website/build/docs/next/**/*.html,website/build/blog/tags/**/*.html,**/*.html.html}'
strip-hash: '\.([^;]\w{7})\.'
minimum-change-threshold: 30
compression: none
comment-key: DOCUSAURUS_INFRA_${{ matrix.DOCUSAURUS_INFRA }}
env:
DOCUSAURUS_SLOWER: ${{ matrix.DOCUSAURUS_INFRA == 'SLOWER' && 'true' || 'false' }}
# Ensures build times stay under reasonable thresholds
build-time:
name: Build Time Perf
timeout-minutes: 30
runs-on: ubuntu-latest
strategy:
matrix:
DOCUSAURUS_INFRA: ['SLOWER', 'FASTER']
steps:
- name: Checkout
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Set up Node
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: lts/*
cache: yarn
- name: Installation
run: yarn
run: yarn || yarn || yarn
# Ensure build with a cold cache does not increase too much
- name: Build (cold cache)
run: yarn build:website:fast
timeout-minutes: 8
timeout-minutes: ${{ matrix.DOCUSAURUS_INFRA == 'SLOWER' && 3 || 2 }}
env:
DOCUSAURUS_SLOWER: ${{ matrix.DOCUSAURUS_INFRA == 'SLOWER' && 'true' || 'false' }}
# Ensure build with a warm cache does not increase too much
- name: Build (warm cache)
run: yarn build:website:fast
timeout-minutes: 2
# Temporary: upper value for Rspack until incremental cache works better
timeout-minutes: ${{ matrix.DOCUSAURUS_INFRA == 'SLOWER' && 1 || 2 }}
env:
DOCUSAURUS_SLOWER: ${{ matrix.DOCUSAURUS_INFRA == 'SLOWER' && 'true' || 'false' }}
# TODO post a GitHub comment with build with perf warnings?

View file

@ -1,11 +1,14 @@
name: Canary Release
on:
workflow_dispatch:
push:
branches:
- main
- docusaurus-v**
paths:
- .github/workflows/canary-release.yml
- package.json
- packages/**
permissions:
@ -21,9 +24,9 @@ jobs:
with:
fetch-depth: 0 # Needed to get the commit number with "git rev-list --count HEAD"
- name: Set up Node
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: 20
node-version: lts/*
cache: yarn
- name: Prepare git
run: |
@ -38,7 +41,7 @@ jobs:
env:
NPM_TOKEN: ${{ secrets.NPM_AUTH_TOKEN }}
- name: Installation
run: yarn
run: yarn || yarn || yarn
- name: Publish Canary release
run: |
yarn canary

View file

@ -36,9 +36,9 @@ jobs:
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Initialize CodeQL
uses: github/codeql-action/init@eb055d739abdc2e8de2e5f4ba1a8b246daa779aa # 3.26.0
uses: github/codeql-action/init@2c779ab0d087cd7fe7b826087247c2c81f27bfa6 # 3.26.5
with:
languages: ${{ matrix.language }}
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@eb055d739abdc2e8de2e5f4ba1a8b246daa779aa # 3.26.0
uses: github/codeql-action/analyze@2c779ab0d087cd7fe7b826087247c2c81f27bfa6 # 3.26.5

View file

@ -20,8 +20,14 @@ jobs:
- name: Checkout
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Set up Node
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: lts/*
cache: yarn
- name: Installation
run: yarn
run: yarn || yarn || yarn
- name: Build packages
run: yarn build:packages
@ -32,4 +38,4 @@ jobs:
yarn create-docusaurus template/docusaurus-classic-ts classic --typescript -p npm
- name: Release
run: npx pkg-pr-new publish './packages/*' --template './template/*' --compact --comment=off
run: npx pkg-pr-new@0.0.20 publish './packages/*' --template './template/*' --compact --comment=off

View file

@ -15,4 +15,4 @@ jobs:
- name: Checkout
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Dependency Review
uses: actions/dependency-review-action@5a2ce3f5b92ee19cbb1541a4984c76d921601d7c # 4.3.4
uses: actions/dependency-review-action@ce3cf9537a52e8119d91fd484ab5b8a807627bf8 # 4.6.0

View file

@ -24,12 +24,12 @@ jobs:
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Use Node.js
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: 20
node-version: lts/*
- name: Install dependencies
run: yarn install --frozen-lockfile
run: yarn || yarn || yarn
- name: Build website fast
run: yarn build:website:fast
@ -64,7 +64,7 @@ jobs:
- name: Add Lighthouse stats as comment
id: comment_to_pr
uses: marocchino/sticky-pull-request-comment@331f8f5b4215f0445d3c07b4967662a32a2d3e31 # 2.9.0
uses: marocchino/sticky-pull-request-comment@67d0dec7b07ed060a405f9b2a64b8ab319fdd7db # 2.9.2
with:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
number: ${{ github.event.pull_request.number }}

View file

@ -25,7 +25,7 @@ jobs:
ref: ${{ github.head_ref }}
- name: Installation
run: yarn
run: yarn || yarn || yarn
- name: AutoFix Format
run: yarn format

View file

@ -22,19 +22,18 @@ jobs:
- name: Checkout
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Set up Node
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: 20
node-version: lts/*
cache: yarn
- name: Installation
run: yarn
# run: yarn install --immutable # Fails if yarn.lock is modified (unfortunately only works for Yarn 2, and --frozen-lockfile is not the same!)
run: yarn install --frozen-lockfile || yarn install --frozen-lockfile || yarn install --frozen-lockfile
- name: Check immutable yarn.lock
run: git diff --exit-code
- name: Check for suspicious yarn.lock
# for allowed aliases, see https://github.com/yargs/cliui/pull/139/files#r1670711112
run: yarn lockfile-lint --path yarn.lock --type yarn --allowed-hosts yarn --validate-https --validate-package-names --validate-integrity --empty-hostname=false --allowed-package-name-aliases react-loadable string-width-cjs strip-ansi-cjs wrap-ansi-cjs
run: yarn lockfile-lint --path yarn.lock --type yarn --allowed-hosts yarn --validate-https --validate-package-names --validate-integrity --empty-hostname=false --allowed-package-name-aliases react-loadable react-helmet-async string-width-cjs strip-ansi-cjs wrap-ansi-cjs
- name: Lint
run: |

View file

@ -24,11 +24,11 @@ jobs:
- name: Checkout
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Set up Node
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: 20
node-version: lts/*
cache: yarn
- name: Installation
run: yarn
run: yarn || yarn || yarn
- name: Test
run: yarn test website/src/data/__tests__/user.test.ts

View file

@ -38,21 +38,21 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
node: ['18.0', '20', '22.4']
node: ['18.0', '20', '22']
steps:
- name: Checkout
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Use Node.js ${{ matrix.node }}
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: ${{ matrix.node }}
cache: yarn
- name: Installation
run: yarn
run: yarn || yarn || yarn
- name: Generate test-website project against main branch
run: yarn test:build:website -s
- name: Install test-website project with Yarn v1
run: yarn install
run: yarn || yarn || yarn
working-directory: ../test-website
env:
npm_config_registry: http://localhost:4873
@ -62,7 +62,14 @@ jobs:
env:
E2E_TEST: true
- name: Build test-website project
run: yarn build
# We build 2 locales to ensure a localized site doesn't leak memory
# See https://github.com/facebook/docusaurus/pull/10599
run: yarn build --locale en --locale fr
env:
# Our website should build even with limited memory
# See https://github.com/facebook/docusaurus/pull/10590
NODE_OPTIONS: '--max-old-space-size=300'
DOCUSAURUS_PERF_LOGGER: 'true'
working-directory: ../test-website
yarn-berry:
@ -77,12 +84,12 @@ jobs:
- name: Checkout
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Use Node.js LTS
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: lts/*
cache: yarn
- name: Installation
run: yarn
run: yarn || yarn || yarn
- name: Generate test-website project with ${{ matrix.variant }} against main branch
run: yarn test:build:website ${{ matrix.variant }}
- name: Install test-website project with Yarn Berry and nodeLinker = ${{ matrix.nodeLinker }}
@ -98,7 +105,7 @@ jobs:
# https://yarnpkg.com/features/pnp#fallback-mode
yarn config set pnpFallbackMode none
yarn install
yarn || yarn || yarn
working-directory: ../test-website
env:
YARN_ENABLE_IMMUTABLE_INSTALLS: false # Yarn berry should create the lockfile, despite CI env
@ -128,7 +135,14 @@ jobs:
yarn typecheck
- name: Build test-website project
run: yarn build
# We build 2 locales to ensure a localized site doesn't leak memory
# See https://github.com/facebook/docusaurus/pull/10599
run: yarn build --locale en --locale fr
env:
# Our website should build even with limited memory
# See https://github.com/facebook/docusaurus/pull/10590
NODE_OPTIONS: '--max-old-space-size=300'
DOCUSAURUS_PERF_LOGGER: 'true'
working-directory: ../test-website
npm:
@ -139,26 +153,36 @@ jobs:
- name: Checkout
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Use Node.js LTS
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: lts/*
cache: yarn
- name: Installation
run: yarn
run: yarn || yarn || yarn
- name: Generate test-website project against main branch
run: yarn test:build:website -s
run: yarn test:build:website -st
- name: Install test-website project with npm
run: npm install
working-directory: ../test-website
env:
npm_config_registry: http://localhost:4873
- name: TypeCheck website
working-directory: ../test-website
run: yarn typecheck
- name: Start test-website project
run: npm run start -- --no-open
working-directory: ../test-website
env:
E2E_TEST: true
- name: Build test-website project
run: npm run build
# We build 2 locales to ensure a localized site doesn't leak memory
# See https://github.com/facebook/docusaurus/pull/10599
run: npm run build -- --locale en --locale fr
env:
# Our website should build even with limited memory
# See https://github.com/facebook/docusaurus/pull/10590
NODE_OPTIONS: '--max-old-space-size=300'
DOCUSAURUS_PERF_LOGGER: 'true'
working-directory: ../test-website
pnpm:
@ -169,27 +193,36 @@ jobs:
- name: Checkout
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Use Node.js LTS
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: lts/*
cache: yarn
- name: Installation
run: yarn
run: yarn || yarn || yarn
- name: Generate test-website project against main branch
run: yarn test:build:website -s
run: yarn test:build:website -st
- name: Install test-website project with pnpm
run: |
npm install -g pnpm
# Fix some peer dependencies errors
pnpm add @algolia/client-search @types/react@17 typescript
pnpm install
working-directory: ../test-website
env:
npm_config_registry: http://localhost:4873
- name: TypeCheck website
working-directory: ../test-website
run: yarn typecheck
- name: Start test-website project
run: pnpm start --no-open
working-directory: ../test-website
env:
E2E_TEST: true
- name: Build test-website project
run: pnpm run build
# We build 2 locales to ensure a localized site doesn't leak memory
# See https://github.com/facebook/docusaurus/pull/10599
run: pnpm run build --locale en --locale fr
env:
# Our website should build even with limited memory
# See https://github.com/facebook/docusaurus/pull/10590
NODE_OPTIONS: '--max-old-space-size=300'
DOCUSAURUS_PERF_LOGGER: 'true'
working-directory: ../test-website

View file

@ -28,12 +28,12 @@ jobs:
- name: Checkout
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Set up Node LTS
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: lts/*
cache: yarn
- name: Installation
run: yarn
run: yarn || yarn || yarn
# Swizzle all the theme components
- name: Swizzle (${{matrix.action}} - ${{matrix.variant}})
@ -43,4 +43,4 @@ jobs:
run: yarn build:website:fast
# Ensure swizzled site still typechecks
- name: TypeCheck website
run: yarn workspace website typecheck
run: yarn workspace website typecheck --project tsconfig.skipLibCheck.json

View file

@ -27,18 +27,18 @@ jobs:
runs-on: windows-latest
strategy:
matrix:
node: ['18.0', '20', '22.4']
node: ['18.0', '20', '22']
steps:
- name: Support longpaths
run: git config --system core.longpaths true
- name: Checkout
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Use Node.js ${{ matrix.node }}
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: ${{ matrix.node }}
- name: Installation
run: yarn || yarn || yarn # 3 attempts to avoid timeout errors...
run: yarn || yarn || yarn
- name: Docusaurus Jest Tests
run: yarn test
- name: Create a deep path
@ -55,12 +55,16 @@ jobs:
run: yarn build:website:fast
- name: TypeCheck website
run: yarn workspace website typecheck
# TODO temporary, remove TS skipLibCheck
# see https://github.com/facebook/docusaurus/pull/10486
run: yarn workspace website typecheck --project tsconfig.skipLibCheck.json
- name: TypeCheck website - min version - v5.1
run: |
yarn add typescript@5.1.6 --exact -D -W --ignore-scripts
yarn workspace website typecheck
- name: TypeCheck website - max version - Latest
# For latest TS there are often lib check errors, so we disable it
# Details: https://github.com/facebook/docusaurus/pull/10486
run: |
yarn add typescript@latest --exact -D -W --ignore-scripts
yarn workspace website typecheck
yarn workspace website typecheck --project tsconfig.skipLibCheck.json

View file

@ -27,31 +27,44 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
node: ['18.0', '20', '22.4']
node: ['18.0', '20', '22']
steps:
- name: Checkout
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Use Node.js ${{ matrix.node }}
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: ${{ matrix.node }}
cache: yarn
- name: Installation
run: yarn
run: yarn || yarn || yarn
- name: Test
run: yarn test
- name: Remove Theme Internal Re-export
run: yarn workspace @docusaurus/theme-common removeThemeInternalReexport
- name: Docusaurus Build
run: yarn build:website:fast
# We build 2 locales to ensure a localized site doesn't leak memory
# See https://github.com/facebook/docusaurus/pull/10599
run: yarn build:website:fast --locale en --locale fr
env:
# Our website should build even with limited memory
# See https://github.com/facebook/docusaurus/pull/10590
NODE_OPTIONS: '--max-old-space-size=450'
DOCUSAURUS_PERF_LOGGER: 'true'
- name: Docusaurus site CSS order
run: yarn workspace website test:css-order
- name: TypeCheck website
run: yarn workspace website typecheck
# TODO temporary, remove TS skipLibCheck
# see https://github.com/facebook/docusaurus/pull/10486
run: yarn workspace website typecheck --project tsconfig.skipLibCheck.json
- name: TypeCheck website - min version - v5.1
run: |
yarn add typescript@5.1.6 --exact -D -W --ignore-scripts
yarn workspace website typecheck
- name: TypeCheck website - max version - Latest
# For latest TS there are often lib check errors, so we disable it
# Details: https://github.com/facebook/docusaurus/pull/10486
run: |
yarn add typescript@latest --exact -D -W --ignore-scripts
yarn workspace website typecheck
yarn workspace website typecheck --project tsconfig.skipLibCheck.json

7
.gitignore vendored
View file

@ -14,7 +14,7 @@ package-lock.json
.eslintcache
yarn-error.log
build
website/build
coverage
.docusaurus
.cache-loader
@ -38,8 +38,13 @@ website/_dogfooding/_swizzle_theme_tests
CrowdinTranslations_*.zip
website/.cpu-prof
website/i18n/**/*
#!website/i18n/fr
#!website/i18n/fr/**/*
.netlify
website/rspack-tracing.json
website/bundler-cpu-profile.json

View file

@ -4,6 +4,7 @@ node_modules
build
coverage
.docusaurus
.idea
.svg
*.svg
@ -29,3 +30,5 @@ website/static/katex/katex.min.css
website/changelog
website/_dogfooding/_swizzle_theme_tests
website/_dogfooding/_asset-tests/badSyntax.js
website/_dogfooding/_asset-tests/badSyntax.css

View file

@ -13,5 +13,6 @@ packages/docusaurus-*/lib/*
packages/create-docusaurus/lib/*
packages/create-docusaurus/templates/
website/static/katex/katex.min.css
website/_dogfooding/_asset-tests/badSyntax.css
jest/vendor

View file

@ -1,5 +1,351 @@
# Docusaurus Changelog
## 3.7.0 (2025-01-03)
#### :rocket: New Feature
- `docusaurus-faster`, `docusaurus`
- [#10800](https://github.com/facebook/docusaurus/pull/10800) feat(core): Turn Rspack incremental on by default (again) ([@slorber](https://github.com/slorber))
- `docusaurus-plugin-content-blog`, `docusaurus-theme-classic`
- [#10768](https://github.com/facebook/docusaurus/pull/10768) feat(blog): Add author social icons for bluesky, mastodon, threads, twitch, youtube, instagram ([@GingerGeek](https://github.com/GingerGeek))
- `create-docusaurus`, `docusaurus-mdx-loader`, `docusaurus-module-type-aliases`, `docusaurus-plugin-client-redirects`, `docusaurus-plugin-content-blog`, `docusaurus-plugin-content-docs`, `docusaurus-plugin-content-pages`, `docusaurus-plugin-debug`, `docusaurus-plugin-google-analytics`, `docusaurus-plugin-google-gtag`, `docusaurus-plugin-google-tag-manager`, `docusaurus-plugin-ideal-image`, `docusaurus-plugin-pwa`, `docusaurus-plugin-rsdoctor`, `docusaurus-plugin-sitemap`, `docusaurus-plugin-svgr`, `docusaurus-plugin-vercel-analytics`, `docusaurus-preset-classic`, `docusaurus-theme-classic`, `docusaurus-theme-common`, `docusaurus-theme-live-codeblock`, `docusaurus-theme-mermaid`, `docusaurus-theme-search-algolia`, `docusaurus-types`, `docusaurus`
- [#10763](https://github.com/facebook/docusaurus/pull/10763) feat: Add React 19 support to Docusaurus v3 ([@slorber](https://github.com/slorber))
- `docusaurus-plugin-content-blog`
- [#10729](https://github.com/facebook/docusaurus/pull/10729) feat(blog): Add `frontMatter.sidebar_label` ([@slorber](https://github.com/slorber))
- `docusaurus-module-type-aliases`, `docusaurus-plugin-svgr`, `docusaurus-preset-classic`, `docusaurus-types`, `docusaurus-utils`, `docusaurus`
- [#10677](https://github.com/facebook/docusaurus/pull/10677) feat(svgr): create new Docusaurus SVGR plugin ([@slorber](https://github.com/slorber))
#### :bug: Bug Fix
- `docusaurus-remark-plugin-npm2yarn`
- [#10803](https://github.com/facebook/docusaurus/pull/10803) fix(npm-to-yarn): add missing npm-to-yarn converter for Bun ([@Lehoczky](https://github.com/Lehoczky))
- `docusaurus-theme-classic`, `docusaurus-theme-common`
- [#10796](https://github.com/facebook/docusaurus/pull/10796) fix(theme): Footer Column/Link should merge provided className ([@slorber](https://github.com/slorber))
- `docusaurus-bundler`, `docusaurus-theme-common`
- [#10786](https://github.com/facebook/docusaurus/pull/10786) fix(core): fix React hydration errors, change html minifier settings ([@slorber](https://github.com/slorber))
- `docusaurus-theme-common`
- [#10782](https://github.com/facebook/docusaurus/pull/10782) fix(theme-common): code block magic comments should support SQL block comments ([@WillBlack403](https://github.com/WillBlack403))
- `docusaurus-theme-translations`
- [#10783](https://github.com/facebook/docusaurus/pull/10783) fix(theme-translations): Add missing Dutch (nl) theme translations ([@janaukema](https://github.com/janaukema))
- [#10760](https://github.com/facebook/docusaurus/pull/10760) fix(theme-translation): add missing Korean (ko) theme translations ([@effozen](https://github.com/effozen))
- `docusaurus-plugin-content-docs`
- [#10754](https://github.com/facebook/docusaurus/pull/10754) fix(docs): fix sidebar item visibility bug for category index ([@slorber](https://github.com/slorber))
- `docusaurus`
- [#10727](https://github.com/facebook/docusaurus/pull/10727) fix(core): fix codegen routesChunkName possible hash collision ([@slorber](https://github.com/slorber))
- `docusaurus-mdx-loader`
- [#10723](https://github.com/facebook/docusaurus/pull/10723) fix(mdx-loader): fix md image paths with spaces bug related to transformImage encoding problem ([@slorber](https://github.com/slorber))
#### :memo: Documentation
- [#10740](https://github.com/facebook/docusaurus/pull/10740) docs: Link initialization docs together ([@waldyrious](https://github.com/waldyrious))
#### :robot: Dependencies
- [#10771](https://github.com/facebook/docusaurus/pull/10771) chore(deps): bump nanoid from 3.3.7 to 3.3.8 ([@dependabot[bot]](https://github.com/apps/dependabot))
- [#10721](https://github.com/facebook/docusaurus/pull/10721) chore(deps): bump actions/dependency-review-action from 4.4.0 to 4.5.0 ([@dependabot[bot]](https://github.com/apps/dependabot))
#### :wrench: Maintenance
- Other
- [#10770](https://github.com/facebook/docusaurus/pull/10770) chore: Devcontainer upgrade to Ubuntu Noble & Node 22 ([@GingerGeek](https://github.com/GingerGeek))
- `docusaurus-theme-search-algolia`
- [#10801](https://github.com/facebook/docusaurus/pull/10801) refactor(algolia): simplify SearchBar component ([@slorber](https://github.com/slorber))
- [#10672](https://github.com/facebook/docusaurus/pull/10672) chore(algolia): upgrade algoliasearch to v5 ([@millotp](https://github.com/millotp))
- `docusaurus`
- [#10798](https://github.com/facebook/docusaurus/pull/10798) refactor(core): Use Intl native API to get locale direction, remove rtl-detect depend… ([@slorber](https://github.com/slorber))
- [#10747](https://github.com/facebook/docusaurus/pull/10747) refactor(core): swizzle wrap should use ReactNode instead of JSX.Element ([@slorber](https://github.com/slorber))
- `create-docusaurus`, `docusaurus-mdx-loader`, `docusaurus-module-type-aliases`, `docusaurus-plugin-content-blog`, `docusaurus-plugin-content-docs`, `docusaurus-plugin-content-pages`, `docusaurus-plugin-debug`, `docusaurus-plugin-ideal-image`, `docusaurus-plugin-pwa`, `docusaurus-theme-classic`, `docusaurus-theme-common`, `docusaurus-theme-live-codeblock`, `docusaurus-theme-mermaid`, `docusaurus-theme-search-algolia`, `docusaurus-types`, `docusaurus`
- [#10746](https://github.com/facebook/docusaurus/pull/10746) refactor: prepare types for React 19 ([@slorber](https://github.com/slorber))
- `docusaurus-theme-common`
- [#10728](https://github.com/facebook/docusaurus/pull/10728) refactor(theme-common): change storageUtils useSyncExternalCode getSnapshot workaround ([@slorber](https://github.com/slorber))
#### Committers: 14
- Alvin Bryan ([@alvinometric](https://github.com/alvinometric))
- Hichem Fantar ([@hichemfantar](https://github.com/hichemfantar))
- Ivan Cheban ([@ivancheban](https://github.com/ivancheban))
- Jake Boone ([@jakeboone02](https://github.com/jakeboone02))
- Jan Aukema ([@janaukema](https://github.com/janaukema))
- Lehoczky Zoltán ([@Lehoczky](https://github.com/Lehoczky))
- Lin Huang ([@codimiracle](https://github.com/codimiracle))
- Pierre Millot ([@millotp](https://github.com/millotp))
- Sébastien Lorber ([@slorber](https://github.com/slorber))
- Taylor Reece ([@taylorreece](https://github.com/taylorreece))
- Waldir Pimenta ([@waldyrious](https://github.com/waldyrious))
- William Black ([@WillBlack403](https://github.com/WillBlack403))
- Zed Spencer-Milnes ([@GingerGeek](https://github.com/GingerGeek))
- Zen ([@effozen](https://github.com/effozen))
## 3.6.3 (2024-11-22)
#### :bug: Bug Fix
- `docusaurus`
- [#10712](https://github.com/facebook/docusaurus/pull/10712) fix(core): disable Rspack incremental in dev ([@slorber](https://github.com/slorber))
#### Committers: 1
- Sébastien Lorber ([@slorber](https://github.com/slorber))
## 3.6.2 (2024-11-19)
#### :bug: Bug Fix
- `docusaurus-module-type-aliases`
- [#10693](https://github.com/facebook/docusaurus/pull/10693) fix(types): add missing ambiant TS declarations for .md / .mdx partials ([@slorber](https://github.com/slorber))
- `docusaurus-theme-translations`
- [#10688](https://github.com/facebook/docusaurus/pull/10688) fix(theme-translation): add and update Japanese translations ([@Ryoga-exe](https://github.com/Ryoga-exe))
- `docusaurus`
- [#10685](https://github.com/facebook/docusaurus/pull/10685) fix(cli): `docusaurus --help` should print plugin commands using `extendCli()` ([@slorber](https://github.com/slorber))
- `docusaurus-bundler`
- [#10680](https://github.com/facebook/docusaurus/pull/10680) fix(bundler): allow CSS nesting by default, restore postcss-preset-env ([@slorber](https://github.com/slorber))
- `create-docusaurus`
- [#10676](https://github.com/facebook/docusaurus/pull/10676) fix(create-docusaurus): add ts exclude to TS init template ([@slorber](https://github.com/slorber))
- `docusaurus-bundler`, `docusaurus-faster`, `docusaurus`
- [#10648](https://github.com/facebook/docusaurus/pull/10648) fix(faster): Upgrade to Rspack 1.1.1, fix build progress bar display ([@slorber](https://github.com/slorber))
#### :wrench: Maintenance
- [#10691](https://github.com/facebook/docusaurus/pull/10691) chore(ci): retry `yarn install` to ignore temporary network errors ([@slorber](https://github.com/slorber))
#### Committers: 5
- Junior_Gx ([@goffxnca](https://github.com/goffxnca))
- Kyle Tsang ([@kyletsang](https://github.com/kyletsang))
- Ryoga ([@Ryoga-exe](https://github.com/Ryoga-exe))
- Sébastien Lorber ([@slorber](https://github.com/slorber))
- Zwyx ([@Zwyx](https://github.com/Zwyx))
## 3.6.1 (2024-11-08)
#### :bug: Bug Fix
- `docusaurus`
- [#10658](https://github.com/facebook/docusaurus/pull/10658) fix(core): bundler should not minimize static assets ([@slorber](https://github.com/slorber))
- `docusaurus-bundler`, `docusaurus-faster`, `docusaurus-utils-common`, `docusaurus-utils`
- [#10649](https://github.com/facebook/docusaurus/pull/10649) fix(faster,utils): fix faster/types peerDependencies ([@slorber](https://github.com/slorber))
#### :nail_care: Polish
- `docusaurus-bundler`, `docusaurus-types`, `docusaurus`
- [#10655](https://github.com/facebook/docusaurus/pull/10655) refactor(faster,bundler,core): improve js loader DX ([@slorber](https://github.com/slorber))
#### :memo: Documentation
- [#10657](https://github.com/facebook/docusaurus/pull/10657) docs: fix old base ts config ref ([@slorber](https://github.com/slorber))
#### :wrench: Maintenance
- `docusaurus-mdx-loader`
- [#10651](https://github.com/facebook/docusaurus/pull/10651) refactor(mdx-loader): streamline typescript usage for remark plugin types ([@lebalz](https://github.com/lebalz))
- Other
- [#10650](https://github.com/facebook/docusaurus/pull/10650) chore: Argos screenshot dogfooding test pages ([@slorber](https://github.com/slorber))
#### Committers: 2
- Balthasar Hofer ([@lebalz](https://github.com/lebalz))
- Sébastien Lorber ([@slorber](https://github.com/slorber))
## 3.6.0 (2024-11-04)
#### :rocket: New Feature
- `docusaurus-plugin-content-blog`, `docusaurus-theme-classic`
- [#10586](https://github.com/facebook/docusaurus/pull/10586) feat(blog): Add `frontMatter.title_meta` to override title for SEO ([@ilg-ul](https://github.com/ilg-ul))
- `docusaurus`
- [#10600](https://github.com/facebook/docusaurus/pull/10600) feat(cli): build/deploy should allow multiple `--locale` options ([@slorber](https://github.com/slorber))
- `docusaurus-logger`
- [#10590](https://github.com/facebook/docusaurus/pull/10590) feat(core): add Node.js memory perf logging ([@slorber](https://github.com/slorber))
- `docusaurus-plugin-rsdoctor`
- [#10588](https://github.com/facebook/docusaurus/pull/10588) feat: new Rsdoctor official plugin ([@slorber](https://github.com/slorber))
- `docusaurus-bundler`, `docusaurus-faster`, `docusaurus-theme-classic`, `docusaurus`
- [#10402](https://github.com/facebook/docusaurus/pull/10402) feat(core): Replace Webpack with Rspack - `siteConfig.future.experimental_faster.rspackBundler` ([@slorber](https://github.com/slorber))
- `docusaurus-bundler`, `docusaurus-faster`, `docusaurus-types`, `docusaurus`
- [#10554](https://github.com/facebook/docusaurus/pull/10554) feat(core): faster HTML minimizer - `siteConfig.future.experimental_faster.swcHtmlMinimizer` ([@slorber](https://github.com/slorber))
- [#10522](https://github.com/facebook/docusaurus/pull/10522) feat(core): faster CSS minimizer - `siteConfig.future.experimental_faster.lightningCssMinimizer` ([@slorber](https://github.com/slorber))
- `docusaurus-theme-mermaid`
- [#10510](https://github.com/facebook/docusaurus/pull/10510) feat(theme-mermaid): support Mermaid 11+ including new types of diagrams ([@slorber](https://github.com/slorber))
- `docusaurus-mdx-loader`, `docusaurus-plugin-content-blog`, `docusaurus-plugin-content-docs`, `docusaurus-plugin-content-pages`, `docusaurus-types`, `docusaurus`
- [#10479](https://github.com/facebook/docusaurus/pull/10479) feat(core, mdx-loader): deduplicate MDX compilation - `siteConfig.future.experimental_faster.mdxCrossCompilerCache` ([@slorber](https://github.com/slorber))
- `docusaurus-faster`, `docusaurus-types`, `docusaurus`
- [#10441](https://github.com/facebook/docusaurus/pull/10441) feat(core): faster JS minimizer - `siteConfig.future.experimental_faster.swcJsMinimizer` ([@slorber](https://github.com/slorber))
- `docusaurus-faster`, `docusaurus-plugin-content-docs`, `docusaurus-types`, `docusaurus`
- [#10435](https://github.com/facebook/docusaurus/pull/10435) feat(core): faster transpiler option - `siteConfig.future.experimental_faster.swcJsLoader` ([@slorber](https://github.com/slorber))
#### :bug: Bug Fix
- `docusaurus-bundler`, `docusaurus`
- [#10632](https://github.com/facebook/docusaurus/pull/10632) fix(core): restore Rspack ProgressBar colors ([@slorber](https://github.com/slorber))
- [#10581](https://github.com/facebook/docusaurus/pull/10581) fix(core): fix handling of Swc html minifier warnings ([@slorber](https://github.com/slorber))
- [#10573](https://github.com/facebook/docusaurus/pull/10573) fix(core): move @docusaurus/faster to bundler peerDeps ([@slorber](https://github.com/slorber))
- `docusaurus-bundler`
- [#10617](https://github.com/facebook/docusaurus/pull/10617) fix(faster): allow Rspack + babel-loader ([@slorber](https://github.com/slorber))
- [#10614](https://github.com/facebook/docusaurus/pull/10614) fix(faster): fix error message typo + add color ([@slorber](https://github.com/slorber))
- `docusaurus-theme-classic`
- [#10618](https://github.com/facebook/docusaurus/pull/10618) fix(theme): Restore former globalThis.Prism ([@slorber](https://github.com/slorber))
- [#10585](https://github.com/facebook/docusaurus/pull/10585) fix(theme): light & dark mode checkbox doesn't announce state switches ([@andrewasche](https://github.com/andrewasche))
- [#10439](https://github.com/facebook/docusaurus/pull/10439) fix(theme): upgrade infima, fix footer link width bug ([@slorber](https://github.com/slorber))
- `docusaurus-faster`
- [#10616](https://github.com/facebook/docusaurus/pull/10616) fix(faster): add missing tslib dependency ([@slorber](https://github.com/slorber))
- `docusaurus`
- [#10611](https://github.com/facebook/docusaurus/pull/10611) fix(core): fix DOCUSAURUS_CURRENT_LOCALE = 'undefined' ([@slorber](https://github.com/slorber))
- [#10423](https://github.com/facebook/docusaurus/pull/10423) fix(core): always use hash for CSS module class names ([@slorber](https://github.com/slorber))
- `docusaurus-bundler`, `docusaurus-faster`
- [#10605](https://github.com/facebook/docusaurus/pull/10605) fix(core): Use proper swc loader options ([@slorber](https://github.com/slorber))
- `docusaurus-theme-translations`
- [#10551](https://github.com/facebook/docusaurus/pull/10551) fix(translations): complete missing slovenian theme translations ([@patik123](https://github.com/patik123))
- [#10507](https://github.com/facebook/docusaurus/pull/10507) fix(theme-translations): add missing Vietnamese translations ([@namnguyenthanhwork](https://github.com/namnguyenthanhwork))
- [#10413](https://github.com/facebook/docusaurus/pull/10413) fix(translations): fix Spanish translation for "breadcrumbs" ([@TheMineWay](https://github.com/TheMineWay))
- `docusaurus-mdx-loader`
- [#10553](https://github.com/facebook/docusaurus/pull/10553) fix(mdx-loader): fix cross-compiler cache randomly loading mdx with client/server envs ([@slorber](https://github.com/slorber))
- `docusaurus-tsconfig`
- [#10547](https://github.com/facebook/docusaurus/pull/10547) fix(tsconfig): add `@docusaurus/tsconfig` target es2022 ([@slorber](https://github.com/slorber))
- `docusaurus-plugin-content-blog`
- [#10424](https://github.com/facebook/docusaurus/pull/10424) fix(blog): normalize inline authors socials ([@OzakIOne](https://github.com/OzakIOne))
- [#10440](https://github.com/facebook/docusaurus/pull/10440) fix(blog): apply baseUrl to relative image in blog authors ([@OzakIOne](https://github.com/OzakIOne))
- `docusaurus-theme-classic`, `docusaurus-theme-common`, `docusaurus-theme-translations`
- [#10431](https://github.com/facebook/docusaurus/pull/10431) fix(blog): authors count incorrectly rendered ([@OzakIOne](https://github.com/OzakIOne))
- `docusaurus-types`, `docusaurus`
- [#10420](https://github.com/facebook/docusaurus/pull/10420) fix(types): fix type of PluginModule ([@slorber](https://github.com/slorber))
#### :running_woman: Performance
- `docusaurus-bundler`, `docusaurus-faster`
- [#10605](https://github.com/facebook/docusaurus/pull/10605) fix(core): Use proper swc loader options ([@slorber](https://github.com/slorber))
- Other
- [#10601](https://github.com/facebook/docusaurus/pull/10601) perf(ci): Add CI checks to prevent memory, build-time and build-size regressions ([@slorber](https://github.com/slorber))
- `docusaurus`
- [#10599](https://github.com/facebook/docusaurus/pull/10599) fix(core): fix i18n sites SSG memory leak - require.cache ([@slorber](https://github.com/slorber))
- `docusaurus-mdx-loader`, `docusaurus-plugin-content-blog`, `docusaurus-plugin-content-docs`, `docusaurus-plugin-content-pages`
- [#10470](https://github.com/facebook/docusaurus/pull/10470) refactor(mdx-loader): re-export metadata module instead of serializing it ([@slorber](https://github.com/slorber))
- [#10457](https://github.com/facebook/docusaurus/pull/10457) refactor(mdx-loader): read metadata from memory (loaded content) instead of fs ([@slorber](https://github.com/slorber))
#### :memo: Documentation
- Other
- [#10631](https://github.com/facebook/docusaurus/pull/10631) docs: fix frontMatter.mdx.format docs ([@slorber](https://github.com/slorber))
- [#10630](https://github.com/facebook/docusaurus/pull/10630) docs: Add missing API ref docs for Docusaurus Faster options ([@slorber](https://github.com/slorber))
- [#10592](https://github.com/facebook/docusaurus/pull/10592) docs: resource add docusaurus-i18n ([@moonrailgun](https://github.com/moonrailgun))
- [#10535](https://github.com/facebook/docusaurus/pull/10535) docs: add tip about harmless vulnerabilities ([@ilg-ul](https://github.com/ilg-ul))
- [#10545](https://github.com/facebook/docusaurus/pull/10545) docs: clarify component naming for markdown import ([@jackrabbit128](https://github.com/jackrabbit128))
- [#10416](https://github.com/facebook/docusaurus/pull/10416) docs: corrected typo in search.mdx ([@B0r1sD](https://github.com/B0r1sD))
- [#10405](https://github.com/facebook/docusaurus/pull/10405) docs(website): small spellfix on 3.5 update notes ([@Zenahr](https://github.com/Zenahr))
- `create-docusaurus`
- [#10608](https://github.com/facebook/docusaurus/pull/10608) docs: mention config/sidebars run in Node.js runtime ([@slorber](https://github.com/slorber))
#### :robot: Dependencies
- Other
- [#10623](https://github.com/facebook/docusaurus/pull/10623) chore(deps): bump actions/setup-node from 4.0.4 to 4.1.0 ([@dependabot[bot]](https://github.com/apps/dependabot))
- [#10624](https://github.com/facebook/docusaurus/pull/10624) chore(deps): bump actions/dependency-review-action from 4.3.4 to 4.4.0 ([@dependabot[bot]](https://github.com/apps/dependabot))
- [#10539](https://github.com/facebook/docusaurus/pull/10539) chore(deps): bump preactjs/compressed-size-action from 2.6.0 to 2.7.0 ([@dependabot[bot]](https://github.com/apps/dependabot))
- [#10530](https://github.com/facebook/docusaurus/pull/10530) chore(deps): bump rollup from 2.79.1 to 2.79.2 ([@dependabot[bot]](https://github.com/apps/dependabot))
- [#10518](https://github.com/facebook/docusaurus/pull/10518) chore(deps): bump actions/setup-node from 4.0.2 to 4.0.4 ([@dependabot[bot]](https://github.com/apps/dependabot))
- [#10505](https://github.com/facebook/docusaurus/pull/10505) chore(deps): bump dompurify from 3.0.5 to 3.1.6 ([@dependabot[bot]](https://github.com/apps/dependabot))
- [#10488](https://github.com/facebook/docusaurus/pull/10488) chore(deps): bump express from 4.19.2 to 4.20.0 ([@dependabot[bot]](https://github.com/apps/dependabot))
- [#10449](https://github.com/facebook/docusaurus/pull/10449) chore(deps): bump github/codeql-action from 3.26.3 to 3.26.5 ([@dependabot[bot]](https://github.com/apps/dependabot))
- [#10444](https://github.com/facebook/docusaurus/pull/10444) chore(deps): bump micromatch from 4.0.5 to 4.0.8 ([@dependabot[bot]](https://github.com/apps/dependabot))
- [#10425](https://github.com/facebook/docusaurus/pull/10425) chore(deps): bump github/codeql-action from 3.26.0 to 3.26.3 ([@dependabot[bot]](https://github.com/apps/dependabot))
- `docusaurus-plugin-pwa`
- [#10455](https://github.com/facebook/docusaurus/pull/10455) chore(deps): bump webpack from 5.88.1 to 5.94.0 ([@dependabot[bot]](https://github.com/apps/dependabot))
#### :wrench: Maintenance
- Other
- [#10612](https://github.com/facebook/docusaurus/pull/10612) chore: fix canary version prefix ([@slorber](https://github.com/slorber))
- [#10438](https://github.com/facebook/docusaurus/pull/10438) chore(ci): fix setup-node, use LTS by default ([@slorber](https://github.com/slorber))
- [#10418](https://github.com/facebook/docusaurus/pull/10418) chore(website): add Rsdoctor plugin ([@slorber](https://github.com/slorber))
- `docusaurus-babel`, `docusaurus-bundler`, `docusaurus-mdx-loader`, `docusaurus-plugin-debug`, `docusaurus-plugin-pwa`, `docusaurus-plugin-rsdoctor`, `docusaurus-theme-live-codeblock`, `docusaurus`
- [#10610](https://github.com/facebook/docusaurus/pull/10610) chore: upgrade minor dependencies ([@slorber](https://github.com/slorber))
- `docusaurus-bundler`, `docusaurus-faster`
- [#10609](https://github.com/facebook/docusaurus/pull/10609) chore: upgrade faster packages ([@slorber](https://github.com/slorber))
- `docusaurus-bundler`, `docusaurus-logger`, `docusaurus-types`, `docusaurus`
- [#10593](https://github.com/facebook/docusaurus/pull/10593) refactor(core): refactor SSG infrastructure ([@slorber](https://github.com/slorber))
- `docusaurus`
- [#10587](https://github.com/facebook/docusaurus/pull/10587) refactor(core): replace serve-handler fork by official deps ([@slorber](https://github.com/slorber))
- [#10579](https://github.com/facebook/docusaurus/pull/10579) refactor(core): remove useless Webpack wait plugin ([@slorber](https://github.com/slorber))
- [#10485](https://github.com/facebook/docusaurus/pull/10485) refactor(core): rewrite Webpack ChunkAssetPlugin with RuntimeModule ([@slorber](https://github.com/slorber))
- [#10448](https://github.com/facebook/docusaurus/pull/10448) refactor(core): Restore null-loader ([@slorber](https://github.com/slorber))
- [#10442](https://github.com/facebook/docusaurus/pull/10442) fix(core): use serve-handler fork to remove annoying punycode warning ([@slorber](https://github.com/slorber))
- [#10410](https://github.com/facebook/docusaurus/pull/10410) refactor(core): remove useless build forceTerminate exit ([@slorber](https://github.com/slorber))
- `docusaurus-bundler`, `docusaurus-plugin-pwa`, `docusaurus-types`, `docusaurus`
- [#10548](https://github.com/facebook/docusaurus/pull/10548) chore: upgrade Webpack to 5.95 and related deps ([@slorber](https://github.com/slorber))
- `create-docusaurus`
- [#10514](https://github.com/facebook/docusaurus/pull/10514) refactor: remove babel.config.js from init templates + website ([@slorber](https://github.com/slorber))
- `create-docusaurus`, `docusaurus-babel`, `docusaurus-bundler`, `docusaurus-mdx-loader`, `docusaurus-plugin-pwa`, `docusaurus-theme-classic`, `docusaurus-theme-translations`, `docusaurus-types`, `docusaurus-utils`, `docusaurus`
- [#10511](https://github.com/facebook/docusaurus/pull/10511) refactor: create `@docusaurus/bundler` and `@docusaurus/babel` packages ([@slorber](https://github.com/slorber))
- `create-docusaurus`, `docusaurus-plugin-pwa`, `docusaurus-theme-classic`, `docusaurus-theme-common`, `docusaurus-theme-mermaid`, `docusaurus-utils`, `docusaurus`, `eslint-plugin`
- [#10509](https://github.com/facebook/docusaurus/pull/10509) chore: Rename Twitter links/labels to X ([@slorber](https://github.com/slorber))
- `docusaurus-plugin-content-docs`, `docusaurus-types`, `docusaurus`
- [#10497](https://github.com/facebook/docusaurus/pull/10497) refactor(core): prepare codebase for swappable bundler ([@slorber](https://github.com/slorber))
- `create-docusaurus`, `docusaurus-utils`
- [#10486](https://github.com/facebook/docusaurus/pull/10486) chore: upgrade to TS 5.6 + temporarily use skipLibCheck for TS 5.6 ([@slorber](https://github.com/slorber))
- `create-docusaurus`, `docusaurus-logger`, `docusaurus-theme-translations`, `docusaurus`
- [#10480](https://github.com/facebook/docusaurus/pull/10480) refactor: move PerfLogger from core to @docusaurus/logger ([@slorber](https://github.com/slorber))
- `docusaurus-remark-plugin-npm2yarn`
- [#10454](https://github.com/facebook/docusaurus/pull/10454) chore: upgrade npm-to-yarn to v3 ([@slorber](https://github.com/slorber))
- `docusaurus-mdx-loader`, `docusaurus-plugin-content-blog`, `docusaurus-plugin-content-docs`, `docusaurus-plugin-content-pages`, `docusaurus`
- [#10450](https://github.com/facebook/docusaurus/pull/10450) refactor(mdx-loader): refactor mdx-loader, expose loader creation utils ([@slorber](https://github.com/slorber))
- `docusaurus-mdx-loader`, `docusaurus-utils`, `docusaurus`
- [#10429](https://github.com/facebook/docusaurus/pull/10429) refactor(core): improve handling of server bundle ([@slorber](https://github.com/slorber))
- `docusaurus-mdx-loader`
- [#10422](https://github.com/facebook/docusaurus/pull/10422) refactor(mdx-loader): remove useless usage of mdx loader this.query ([@slorber](https://github.com/slorber))
#### Committers: 19
- Andrew Asche ([@andrewasche](https://github.com/andrewasche))
- Boris Depoortere ([@B0r1sD](https://github.com/B0r1sD))
- Chris Cho ([@ccho-mongodb](https://github.com/ccho-mongodb))
- Flix ([@flixyudh](https://github.com/flixyudh))
- Joel Campos ([@TheMineWay](https://github.com/TheMineWay))
- Kamil Moskała ([@moskalakamil](https://github.com/moskalakamil))
- Kenrick ([@kenrick95](https://github.com/kenrick95))
- Liviu Ionescu ([@ilg-ul](https://github.com/ilg-ul))
- Nguyễn Thành Nam ([@namnguyenthanhwork](https://github.com/namnguyenthanhwork))
- Patrick ([@patik123](https://github.com/patik123))
- Raghav ([@raghav2005](https://github.com/raghav2005))
- Sébastien Lorber ([@slorber](https://github.com/slorber))
- Zenahr Barzani ([@Zenahr](https://github.com/Zenahr))
- [@Olexandr88](https://github.com/Olexandr88)
- [@Radovenchyk](https://github.com/Radovenchyk)
- [@jackrabbit128](https://github.com/jackrabbit128)
- [@k-seltzer](https://github.com/k-seltzer)
- moonrailgun ([@moonrailgun](https://github.com/moonrailgun))
- ozaki ([@OzakIOne](https://github.com/OzakIOne))
## 3.5.2 (2024-08-13)
#### :bug: Bug Fix
- `docusaurus-theme-common`
- [#10397](https://github.com/facebook/docusaurus/pull/10397) fix(theme-common): restore useContextualSearchFilters public API for retrocompatibility ([@slorber](https://github.com/slorber))
- `docusaurus`
- [#10391](https://github.com/facebook/docusaurus/pull/10391) fix(core): always alias React/ReactDOM to site dependency so that importing MDX from anywhere works ([@slorber](https://github.com/slorber))
- `create-docusaurus`, `docusaurus-plugin-content-blog`
- [#10392](https://github.com/facebook/docusaurus/pull/10392) fix(create-docusaurus): Improve init templates blog setup + fix warnings ([@slorber](https://github.com/slorber))
- `docusaurus-theme-classic`
- [#10390](https://github.com/facebook/docusaurus/pull/10390) fix(theme): Adjust blog authors line height to show descenders in lowercase letters (`g`, `j`, `p`, `q`, and `y`) ([@josh-wong](https://github.com/josh-wong))
#### :nail_care: Polish
- `docusaurus-theme-classic`, `docusaurus-theme-common`, `docusaurus-theme-translations`
- [#10394](https://github.com/facebook/docusaurus/pull/10394) fix(translations): change casing of some en labels ([@cstangerup](https://github.com/cstangerup))
#### :memo: Documentation
- [#10393](https://github.com/facebook/docusaurus/pull/10393) docs(showcase): remove sites not using Docusaurus anymore ([@GatienBoquet](https://github.com/GatienBoquet))
#### :robot: Dependencies
- [#10396](https://github.com/facebook/docusaurus/pull/10396) chore(deps): bump github/codeql-action from 3.25.13 to 3.26.0 ([@dependabot[bot]](https://github.com/apps/dependabot))
#### Committers: 4
- Christian Stangerup ([@cstangerup](https://github.com/cstangerup))
- Gatien Boquet ([@GatienBoquet](https://github.com/GatienBoquet))
- Josh Wong ([@josh-wong](https://github.com/josh-wong))
- Sébastien Lorber ([@slorber](https://github.com/slorber))
## 3.5.1 (2024-08-09)
#### :bug: Bug Fix

View file

@ -1,3 +1,3 @@
# Code of Conduct
Facebook has adopted a Code of Conduct that we expect project participants to adhere to. Please [read the full text](https://code.fb.com/codeofconduct/) so that you can understand what actions will and will not be tolerated.
Meta has adopted a Code of Conduct that we expect project participants to adhere to. Please [read the full text](https://code.fb.com/codeofconduct/) so that you can understand what actions will and will not be tolerated.

View file

@ -9,7 +9,7 @@ The [Open Source Guides](https://opensource.guide/) website has a collection of
## Code of Conduct
Facebook has adopted a Code of Conduct that we expect project participants to adhere to. Please read [the full text](https://code.fb.com/codeofconduct) so that you can understand what actions will and will not be tolerated.
Meta has adopted a Code of Conduct that we expect project participants to adhere to. Please read [the full text](https://code.fb.com/codeofconduct) so that you can understand what actions will and will not be tolerated.
## Get Involved
@ -21,7 +21,7 @@ There are many ways to contribute to Docusaurus, and many of them do not involve
- Read through the [Docusaurus docs](https://docusaurus.io/docs/installation). If you find anything that is confusing or can be improved, you can click "Edit this page" at the bottom of most docs, which takes you to the GitHub interface to make and propose changes.
- Take a look at the [features requested](https://github.com/facebook/docusaurus/labels/feature) by others in the community and consider opening a pull request if you see something you want to work on.
Contributions are very welcome. If you think you need help planning your contribution, please ping us on Twitter at [@docusaurus](https://twitter.com/docusaurus) and let us know you are looking for a bit of help.
Contributions are very welcome. If you think you need help planning your contribution, please ping us on X at [@docusaurus](https://x.com/docusaurus) and let us know you are looking for a bit of help.
### Join our Discord Channel
@ -63,7 +63,7 @@ If you're only fixing a bug, it's fine to submit a pull request right away but w
### Security Bugs
Facebook has a [bounty program](https://www.facebook.com/whitehat/) for the safe disclosure of security bugs. With that in mind, please do not file public issues; go through the process outlined on that page.
Meta has a [bounty program](https://www.facebook.com/whitehat/) for the safe disclosure of security bugs. With that in mind, please do not file public issues; go through the process outlined on that page.
### Feature requests
@ -206,7 +206,7 @@ This is also auto-fixable with the `header/header` ESLint rule.
### Contributor License Agreement (CLA)
In order to accept your pull request, we need you to submit a CLA. You only need to do this once, so if you've done this for another Facebook open source project, you're good to go. If you are submitting a pull request for the first time, the Facebook GitHub Bot will reply with a link to the CLA form. You may also [complete your CLA here](https://code.facebook.com/cla).
In order to accept your pull request, we need you to submit a CLA. You only need to do this once, so if you've done this for another Meta open source project, you're good to go. If you are submitting a pull request for the first time, the Meta GitHub Bot will reply with a link to the CLA form. You may also [complete your CLA here](https://code.facebook.com/cla).
After you have signed the CLA, the CLA bot would automatically update the PR status. There's no need to open a new PR.

View file

@ -10,7 +10,7 @@
</div>
<p align="center">
<a href="https://twitter.com/docusaurus"><img src="https://img.shields.io/twitter/follow/docusaurus.svg?style=social" align="right" alt="Twitter Follow" /></a>
<a href="https://x.com/docusaurus"><img src="https://img.shields.io/twitter/follow/docusaurus.svg?style=social" align="right" alt="Twitter Follow" /></a>
<a href="#backers" alt="sponsors on Open Collective"><img src="https://opencollective.com/Docusaurus/backers/badge.svg" /></a>
<a href="#sponsors" alt="Sponsors on Open Collective"><img src="https://opencollective.com/Docusaurus/sponsors/badge.svg" /></a>
<a href="https://www.npmjs.com/package/@docusaurus/core"><img src="https://img.shields.io/npm/v/@docusaurus/core.svg?style=flat" alt="npm version"></a>
@ -59,11 +59,11 @@ npm init docusaurus@latest
## Contributing
We've released Docusaurus because it helps us better scale and supports the many OSS projects at Facebook. We hope that other organizations can benefit from the project. We are thankful for any contributions from the community.
We've released Docusaurus because it helps us better scale and supports the many OSS projects at Meta. We hope that other organizations can benefit from the project. We are thankful for any contributions from the community.
### [Code of Conduct](https://code.fb.com/codeofconduct)
Facebook has adopted a Code of Conduct that we expect project participants to adhere to. Please read [the full text](https://code.fb.com/codeofconduct) so that you can understand what actions will and will not be tolerated.
Meta has adopted a Code of Conduct that we expect project participants to adhere to. Please read [the full text](https://code.fb.com/codeofconduct) so that you can understand what actions will and will not be tolerated.
### Contributing guide
@ -80,7 +80,7 @@ We have a few channels for contact:
- [Discord](https://discord.gg/docusaurus):
- `#general` for those using Docusaurus.
- `#contributors` for those wanting to contribute to the Docusaurus core.
- [@docusaurus](https://twitter.com/docusaurus) on Twitter
- [@docusaurus](https://x.com/docusaurus) X
- [GitHub Issues](https://github.com/facebook/docusaurus/issues)
## Contributors

View file

@ -1,6 +1,6 @@
{
"name": "new.docusaurus.io",
"version": "3.5.1",
"version": "3.7.0",
"private": true,
"scripts": {
"start": "npx --package netlify-cli netlify dev"

View file

@ -218,7 +218,7 @@ Create a separate branch/PR and run `yarn examples:generate`
### 9. Notify people about new release (optional but desirable)
After new release, it is cool to notify our users about this in the Discord chat (`#announcements` channel) and write summaries on Twitter using the following templates.
After new release, it is cool to notify our users about this in the Discord chat (`#announcements` channel) and write summaries on X using the following templates.
For Discord:
@ -227,7 +227,7 @@ A new version %VER% is available now! 🎉
See release notes at the following link https://github.com/facebook/docusaurus/releases/tag/%VER%
```
For Twitter:
For X:
```
💥 A new version %VER% is available now! 💥

View file

@ -41,16 +41,23 @@ function createURL(url) {
* @param {Object} param0
* @param {string} param0.url
* @param {LighthouseSummary} param0.summary
* @param {string} param0.reportUrl
* @param {string | undefined} param0.reportUrl
* @return {string}
*/
const createMarkdownTableRow = ({url, summary, reportUrl}) =>
[
`| [${createURL(url).pathname}](${url})`,
const createMarkdownTableRow = ({url, summary, reportUrl}) => {
const columns = [
`[${createURL(url).pathname}](${url})`,
.../** @type {(keyof LighthouseSummary)[]} */ (
Object.keys(summaryKeys)
).map((k) => scoreEntry(summary[k])),
`[Report](${reportUrl}) |`,
].join(' | ');
// See https://github.com/facebook/docusaurus/pull/10527
reportUrl ? `[Report](${reportUrl})` : `Report N/A`,
];
return `| ${columns.join(' | ')} |`;
};
const createMarkdownTableHeader = () => [
['| URL', ...Object.values(summaryKeys), 'Report |'].join(' | '),
@ -64,18 +71,15 @@ const createMarkdownTableHeader = () => [
* @param {Record<string, string>} param0.links
* @param {{url: string, summary: LighthouseSummary}[]} param0.results
*/
const createLighthouseReport = ({results, links}) => {
export default function formatLighthouseReport({results, links}) {
const tableHeader = createMarkdownTableHeader();
const tableBody = results.map((result) => {
const testUrl = /** @type {string} */ (
Object.keys(links).find((key) => key === result.url)
);
const reportPublicUrl = /** @type {string} */ (links[testUrl]);
const {url, summary} = result;
const reportUrl = /** @type {string | undefined} */ (links[result.url]);
return createMarkdownTableRow({
url: testUrl,
summary: result.summary,
reportUrl: reportPublicUrl,
url,
summary,
reportUrl,
});
});
const comment = [
@ -86,6 +90,4 @@ const createLighthouseReport = ({results, links}) => {
'',
];
return comment.join('\n');
};
export default createLighthouseReport;
}

View file

@ -9,9 +9,9 @@ import fs from 'fs-extra';
import path from 'path';
import {fileURLToPath} from 'url';
import {program} from 'commander';
import logger from '@docusaurus/logger';
import {logger} from '@docusaurus/logger';
import sharp from 'sharp';
import imageSize from 'image-size';
import {imageSizeFromFile} from 'image-size/fromFile';
// You can use it as:
//
@ -64,7 +64,7 @@ program
await Promise.all(
images.map(async (imgPath) => {
const {width, height} = imageSize(imgPath);
const {width, height} = await imageSizeFromFile(imgPath);
const targetWidth =
options.width ?? (imgPath.includes(showcasePath) ? 640 : 1000);
const targetHeight =

View file

@ -5,7 +5,9 @@
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
set -euo pipefail
set -xeuo pipefail
rm -rf ../test-website
CUSTOM_REGISTRY_URL="http://localhost:4873"
NEW_VERSION="$(node -p "require('./packages/docusaurus/package.json').version")-NEW"
@ -52,7 +54,8 @@ git diff --name-only -- '*.json' | sed 's, ,\\&,g' | xargs git checkout --
cd ..
# Build skeleton website with new version
npm_config_registry="$CUSTOM_REGISTRY_URL" npx create-docusaurus@"$NEW_VERSION" test-website classic --javascript $EXTRA_OPTS
npm_config_registry="$CUSTOM_REGISTRY_URL" npx --yes --loglevel silly create-docusaurus@"$NEW_VERSION" test-website classic --javascript $EXTRA_OPTS
# Stop Docker container
if [[ -z "${KEEP_CONTAINER:-true}" ]] && ( $(docker container inspect "$CONTAINER_NAME" > /dev/null 2>&1) ); then

View file

@ -12,7 +12,7 @@ import {version as ReactVersion} from 'react';
import {version as ReactDOMVersion} from 'react-dom';
export function TestComponent() {
const expectedVersion = 18;
const expectedVersion = 19;
if (!ReactVersion.startsWith(`${expectedVersion}`)) {
throw new Error(
`'test-bad-package/README.mdx' is rendered with bad React version: ${ReactVersion}`,

View file

@ -1,10 +1,10 @@
{
"name": "test-bad-package",
"version": "3.5.1",
"version": "3.7.0",
"private": true,
"dependencies": {
"@mdx-js/react": "1.0.1",
"react": "16.14.0",
"react-dom": "16.14.0",
"@mdx-js/react": "1.0.1"
"react-dom": "16.14.0"
}
}

View file

@ -1,17 +1,17 @@
{
"name": "argos",
"version": "3.5.1",
"version": "3.7.0",
"description": "Argos visual diff tests",
"license": "MIT",
"private": true,
"scripts": {
"screenshot": "playwright test",
"upload": "npx @argos-ci/cli upload ./screenshots",
"upload": "npx @argos-ci/cli upload ./screenshots/chromium",
"report": "playwright show-report"
},
"dependencies": {
"@argos-ci/playwright": "^1.9.3",
"@playwright/test": "^1.41.2",
"cheerio": "^1.0.0-rc.12"
"@argos-ci/playwright": "^2.0.0",
"@playwright/test": "^1.48.1",
"cheerio": "1.0.0-rc.12"
}
}

View file

@ -45,6 +45,24 @@ function isBlacklisted(pathname: string) {
'/showcase',
// Long blog post with many image carousels, often timeouts
'/blog/2022/08/01/announcing-docusaurus-2.0',
// DOGFOOD TESTS
// React key errors:
'/tests/docs/tests/toc-partials',
// Console errors
'/tests/pages/diagrams',
'/tests/pages/markdown-tests-md',
'/tests/pages/react-18',
// Flaky because of hydration error
'/tests/blog/archive',
'/tests/pages/code-block-tests',
'/tests/pages/embeds',
// Flaky because of hydration error with docusaurus serve + .html
'/tests/blog/x/y/z.html',
'/tests/docs/dummy.html',
// Cause weird docusaurus serve errors:
'/tests/docs/tests/ascii/%C3%A6%C3%B8%C3%A5',
'/tests/docs/tests/ascii/folder/%C3%A6%C3%B8%C3%A5',
];
return (
@ -52,6 +70,13 @@ function isBlacklisted(pathname: string) {
pathname.startsWith('/changelog') ||
// versioned docs
pathname.match(/^\/docs\/((\d\.\d\.\d)|(next))\//) ||
// verbose useless dogfooding pages
pathname.startsWith('/tests/docs/toc/') ||
pathname.startsWith('/tests/docs/tags/') ||
pathname.startsWith('/tests/docs/tests/category-links') ||
pathname.startsWith('/tests/docs/tests/visibility') ||
pathname.startsWith('/tests/blog/page/') ||
pathname.startsWith('/tests/blog/tags/') ||
// manually excluded urls
BlacklistedPathnames.includes(pathname)
);
@ -105,28 +130,26 @@ function throwOnConsole(page: Page) {
const typesToCheck = ['error', 'warning'];
const ignoreMessages = [
// This mismatch warning looks like a React 18 bug to me
'Warning: Prop `%s` did not match. Server: %s Client: %s%s className "null" ""',
// TODO this fetch error message is unexpected and should be fixed
// it's already happening in main branch
'Failed to load resource: the server responded with a status of 404 (Not Found)',
// TODO looks like a legit hydration bug to fix
// on /blog/releases/2.4
'Warning: Prop `%s` did not match. Server: %s Client: %s%s href "/docs" "/docs?docusaurus-theme=light"',
'Warning: Prop `%s` did not match. Server: %s Client: %s%s href "/docs" "/docs?docusaurus-theme=dark"',
// on /blog/releases/3.0
'Warning: Prop `%s` did not match. Server: %s Client: %s%s href "/docs" "/docs?docusaurus-data-navbar=false&docusaurus-data-red-border"',
// on /docs/styling-layout
'Warning: Prop `%s` did not match. Server: %s Client: %s%s href "/docs" "/docs?docusaurus-data-navbar=false&docusaurus-data-red-border"',
'Warning: Prop `%s` did not match. Server: %s Client: %s%s href "/docs/configuration" "/docs/configuration?docusaurus-theme=light"',
'Warning: Prop `%s` did not match. Server: %s Client: %s%s href "/docs/configuration" "/docs/configuration?docusaurus-theme=dark"',
// TODO legit hydration bugs to fix on embeds of /docs/styling-layout
// useLocation() returns window.search/hash immediately :s
'/docs/configuration?docusaurus-theme=light',
'/docs/configuration?docusaurus-theme=dark',
// Warning because react-live not supporting React automatic JSX runtime
// See https://github.com/FormidableLabs/react-live/issues/405
'Your app (or one of its dependencies) is using an outdated JSX transform. Update to the modern JSX transform for faster performance',
// TODO weird problem related to KaTeX fonts refusing to decode?
// on /docs/markdown-features/math-equations
'Failed to decode downloaded font: http://localhost:3000/katex/fonts/',
'OTS parsing error: Failed to convert WOFF 2.0 font to SFNT',
// Mermaid warning, see https://github.com/mermaid-js/mermaid/issues/6031
'Do not assign mappings to elements without corresponding data',
];
page.on('console', (message) => {

2
examples/README.md generated
View file

@ -2,7 +2,7 @@
These example projects are generated with the init CLI:
```
```bash
npx @docusaurus/init@latest init examples/<templateName> <templateName>`
```

View file

@ -4,13 +4,13 @@ This website is built using [Docusaurus](https://docusaurus.io/), a modern stati
### Installation
```
```bash
$ yarn
```
### Local Development
```
```bash
$ yarn start
```
@ -18,7 +18,7 @@ This command starts a local development server and opens up a browser window. Mo
### Build
```
```bash
$ yarn build
```
@ -28,13 +28,13 @@ This command generates static content into the `build` directory and can be serv
Using SSH:
```
```bash
$ USE_SSH=true yarn deploy
```
Not using SSH:
```
```bash
$ GIT_USER=<Your GitHub username> yarn deploy
```

View file

@ -1,3 +0,0 @@
module.exports = {
presets: [require.resolve('@docusaurus/core/lib/babel/preset')],
};

View file

@ -1,12 +1,12 @@
---
slug: first-blog-post
title: First Blog Post
authors:
name: Gao Wei
title: Docusaurus Core Team
url: https://github.com/wgao19
image_url: https://github.com/wgao19.png
authors: [slorber, yangshun]
tags: [hola, docusaurus]
---
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet...
<!-- truncate -->
...consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

View file

@ -1,7 +1,7 @@
---
slug: long-blog-post
title: Long Blog Post
authors: endi
authors: yangshun
tags: [hello, docusaurus]
---
@ -9,7 +9,7 @@ This is the summary of a very long blog post,
Use a `<!--` `truncate` `-->` comment to limit blog post size in the list view.
<!--truncate-->
<!-- truncate -->
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

View file

@ -11,10 +11,14 @@ Blog posts support [Docusaurus Markdown features](https://docusaurus.io/docs/mar
Use the power of React to create interactive blog posts.
:::
{/* truncate */}
For example, use JSX to create an interactive button:
```js
<button onClick={() => alert('button clicked!')}>Click me!</button>
```
<button onClick={() => alert('button clicked!')}>Click me!</button>
:::

View file

@ -7,6 +7,10 @@ tags: [facebook, hello, docusaurus]
[Docusaurus blogging features](https://docusaurus.io/docs/blog) are powered by the [blog plugin](https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-content-blog).
Here are a few tips you might find useful.
<!-- truncate -->
Simply add Markdown files (or folders) to the `blog` directory.
Regular blog authors can be added to `authors.yml`.

View file

@ -1,14 +1,9 @@
endi:
name: Endilie Yacop Sucipto
title: Maintainer of Docusaurus
url: https://github.com/endiliey
image_url: https://github.com/endiliey.png
yangshun:
name: Yangshun Tay
title: Front End Engineer @ Facebook
url: https://github.com/yangshun
image_url: https://github.com/yangshun.png
page: true
socials:
x: yangshunz
github: yangshun
@ -18,6 +13,9 @@ slorber:
title: Docusaurus maintainer
url: https://sebastienlorber.com
image_url: https://github.com/slorber.png
page:
# customize the url of the author page at /blog/authors/<permalink>
permalink: '/all-sebastien-lorber-articles'
socials:
x: sebastienlorber
linkedin: sebastienlorber

View file

@ -2,14 +2,17 @@ facebook:
label: Facebook
permalink: /facebook
description: Facebook tag description
hello:
label: Hello
permalink: /hello
description: Hello tag description
docusaurus:
label: Docusaurus
permalink: /docusaurus
description: Docusaurus tag description
hola:
label: Hola
permalink: /hola

View file

@ -2,6 +2,8 @@ import {themes as prismThemes} from 'prism-react-renderer';
import type {Config} from '@docusaurus/types';
import type * as Preset from '@docusaurus/preset-classic';
// This runs in Node.js - Don't use client-side code here (browser APIs, JSX...)
const config: Config = {
title: 'My Site',
tagline: 'Dinosaurs are cool',
@ -50,6 +52,10 @@ const config: Config = {
// Remove this to remove the "edit this page" links.
editUrl:
'https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/',
// Useful options to enforce blogging best practices
onInlineTags: 'warn',
onInlineAuthors: 'warn',
onUntruncatedBlogPosts: 'warn',
},
theme: {
customCss: './src/css/custom.css',
@ -106,8 +112,8 @@ const config: Config = {
href: 'https://discordapp.com/invite/docusaurus',
},
{
label: 'Twitter',
href: 'https://twitter.com/docusaurus',
label: 'X',
href: 'https://x.com/docusaurus',
},
],
},

View file

@ -16,19 +16,19 @@
"dev": "docusaurus start"
},
"dependencies": {
"@docusaurus/core": "3.5.1",
"@docusaurus/preset-classic": "3.5.1",
"@docusaurus/core": "3.7.0",
"@docusaurus/preset-classic": "3.7.0",
"@mdx-js/react": "^3.0.0",
"clsx": "^2.0.0",
"prism-react-renderer": "^2.3.0",
"react": "^18.0.0",
"react-dom": "^18.0.0"
"react": "^19.0.0",
"react-dom": "^19.0.0"
},
"devDependencies": {
"@docusaurus/module-type-aliases": "3.5.1",
"@docusaurus/tsconfig": "3.5.1",
"@docusaurus/types": "3.5.1",
"typescript": "~5.5.2"
"@docusaurus/module-type-aliases": "3.7.0",
"@docusaurus/tsconfig": "3.7.0",
"@docusaurus/types": "3.7.0",
"typescript": "~5.6.2"
},
"browserslist": {
"production": [

View file

@ -1,5 +1,7 @@
import type {SidebarsConfig} from '@docusaurus/plugin-content-docs';
// This runs in Node.js - Don't use client-side code here (browser APIs, JSX...)
/**
* Creating a sidebar enables you to:
- create an ordered group of docs

View file

@ -1,3 +1,4 @@
import type {ReactNode} from 'react';
import clsx from 'clsx';
import Heading from '@theme/Heading';
import styles from './styles.module.css';
@ -5,7 +6,7 @@ import styles from './styles.module.css';
type FeatureItem = {
title: string;
Svg: React.ComponentType<React.ComponentProps<'svg'>>;
description: JSX.Element;
description: ReactNode;
};
const FeatureList: FeatureItem[] = [
@ -55,7 +56,7 @@ function Feature({title, Svg, description}: FeatureItem) {
);
}
export default function HomepageFeatures(): JSX.Element {
export default function HomepageFeatures(): ReactNode {
return (
<section className={styles.features}>
<div className="container">

View file

@ -1,3 +1,4 @@
import type {ReactNode} from 'react';
import clsx from 'clsx';
import Link from '@docusaurus/Link';
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
@ -28,7 +29,7 @@ function HomepageHeader() {
);
}
export default function Home(): JSX.Element {
export default function Home(): ReactNode {
const {siteConfig} = useDocusaurusContext();
return (
<Layout

View file

@ -3,5 +3,6 @@
"extends": "@docusaurus/tsconfig",
"compilerOptions": {
"baseUrl": "."
}
},
"exclude": [".docusaurus", "build"]
}

File diff suppressed because it is too large Load diff

View file

@ -4,13 +4,13 @@ This website is built using [Docusaurus](https://docusaurus.io/), a modern stati
### Installation
```
```bash
$ yarn
```
### Local Development
```
```bash
$ yarn start
```
@ -18,7 +18,7 @@ This command starts a local development server and opens up a browser window. Mo
### Build
```
```bash
$ yarn build
```
@ -28,13 +28,13 @@ This command generates static content into the `build` directory and can be serv
Using SSH:
```
```bash
$ USE_SSH=true yarn deploy
```
Not using SSH:
```
```bash
$ GIT_USER=<Your GitHub username> yarn deploy
```

View file

@ -1,3 +0,0 @@
module.exports = {
presets: [require.resolve('@docusaurus/core/lib/babel/preset')],
};

View file

@ -1,12 +1,12 @@
---
slug: first-blog-post
title: First Blog Post
authors:
name: Gao Wei
title: Docusaurus Core Team
url: https://github.com/wgao19
image_url: https://github.com/wgao19.png
authors: [slorber, yangshun]
tags: [hola, docusaurus]
---
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet...
<!-- truncate -->
...consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

View file

@ -1,7 +1,7 @@
---
slug: long-blog-post
title: Long Blog Post
authors: endi
authors: yangshun
tags: [hello, docusaurus]
---
@ -9,7 +9,7 @@ This is the summary of a very long blog post,
Use a `<!--` `truncate` `-->` comment to limit blog post size in the list view.
<!--truncate-->
<!-- truncate -->
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

View file

@ -11,10 +11,14 @@ Blog posts support [Docusaurus Markdown features](https://docusaurus.io/docs/mar
Use the power of React to create interactive blog posts.
:::
{/* truncate */}
For example, use JSX to create an interactive button:
```js
<button onClick={() => alert('button clicked!')}>Click me!</button>
```
<button onClick={() => alert('button clicked!')}>Click me!</button>
:::

View file

@ -7,6 +7,10 @@ tags: [facebook, hello, docusaurus]
[Docusaurus blogging features](https://docusaurus.io/docs/blog) are powered by the [blog plugin](https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-content-blog).
Here are a few tips you might find useful.
<!-- truncate -->
Simply add Markdown files (or folders) to the `blog` directory.
Regular blog authors can be added to `authors.yml`.

View file

@ -1,14 +1,9 @@
endi:
name: Endilie Yacop Sucipto
title: Maintainer of Docusaurus
url: https://github.com/endiliey
image_url: https://github.com/endiliey.png
yangshun:
name: Yangshun Tay
title: Front End Engineer @ Facebook
url: https://github.com/yangshun
image_url: https://github.com/yangshun.png
page: true
socials:
x: yangshunz
github: yangshun
@ -18,6 +13,9 @@ slorber:
title: Docusaurus maintainer
url: https://sebastienlorber.com
image_url: https://github.com/slorber.png
page:
# customize the url of the author page at /blog/authors/<permalink>
permalink: '/all-sebastien-lorber-articles'
socials:
x: sebastienlorber
linkedin: sebastienlorber

View file

@ -2,14 +2,17 @@ facebook:
label: Facebook
permalink: /facebook
description: Facebook tag description
hello:
label: Hello
permalink: /hello
description: Hello tag description
docusaurus:
label: Docusaurus
permalink: /docusaurus
description: Docusaurus tag description
hola:
label: Hola
permalink: /hola

View file

@ -6,6 +6,8 @@
import {themes as prismThemes} from 'prism-react-renderer';
// This runs in Node.js - Don't use client-side code here (browser APIs, JSX...)
/** @type {import('@docusaurus/types').Config} */
const config = {
title: 'My Site',
@ -56,6 +58,10 @@ const config = {
// Remove this to remove the "edit this page" links.
editUrl:
'https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/',
// Useful options to enforce blogging best practices
onInlineTags: 'warn',
onInlineAuthors: 'warn',
onUntruncatedBlogPosts: 'warn',
},
theme: {
customCss: './src/css/custom.css',
@ -114,8 +120,8 @@ const config = {
href: 'https://discordapp.com/invite/docusaurus',
},
{
label: 'Twitter',
href: 'https://twitter.com/docusaurus',
label: 'X',
href: 'https://x.com/docusaurus',
},
],
},

View file

@ -15,17 +15,17 @@
"dev": "docusaurus start"
},
"dependencies": {
"@docusaurus/core": "3.5.1",
"@docusaurus/preset-classic": "3.5.1",
"@docusaurus/core": "3.7.0",
"@docusaurus/preset-classic": "3.7.0",
"@mdx-js/react": "^3.0.0",
"clsx": "^2.0.0",
"prism-react-renderer": "^2.3.0",
"react": "^18.0.0",
"react-dom": "^18.0.0"
"react": "^19.0.0",
"react-dom": "^19.0.0"
},
"devDependencies": {
"@docusaurus/module-type-aliases": "3.5.1",
"@docusaurus/types": "3.5.1"
"@docusaurus/module-type-aliases": "3.7.0",
"@docusaurus/types": "3.7.0"
},
"browserslist": {
"production": [

View file

@ -1,3 +1,7 @@
// @ts-check
// This runs in Node.js - Don't use client-side code here (browser APIs, JSX...)
/**
* Creating a sidebar enables you to:
- create an ordered group of docs
@ -7,11 +11,9 @@
The sidebars can be generated from the filesystem, or explicitly defined here.
Create as many sidebars as you want.
@type {import('@docusaurus/plugin-content-docs').SidebarsConfig}
*/
// @ts-check
/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */
const sidebars = {
// By default, Docusaurus generates a sidebar from the docs folder structure
tutorialSidebar: [{type: 'autogenerated', dirName: '.'}],

File diff suppressed because it is too large Load diff

View file

@ -1,5 +1,5 @@
{
"version": "3.5.1",
"version": "3.7.0",
"npmClient": "yarn",
"useWorkspaces": true,
"useNx": false,
@ -13,7 +13,8 @@
"pr: polish": ":nail_care: Polish",
"pr: documentation": ":memo: Documentation",
"pr: dependencies": ":robot: Dependencies",
"pr: maintenance": ":wrench: Maintenance"
"pr: maintenance": ":wrench: Maintenance",
"pr: translations": ":globe_with_meridians: Translations"
},
"cacheDir": ".changelog"
}

View file

@ -15,6 +15,7 @@
"scripts": {
"start": "yarn build:packages && yarn start:website",
"start:website": "yarn workspace website start",
"start:website:profile": "DOCUSAURUS_BUNDLER_CPU_PROFILE=true DOCUSAURUS_RSPACK_TRACE=true yarn workspace website start",
"start:website:baseUrl": "yarn workspace website start:baseUrl",
"start:website:blogOnly": "yarn workspace website start:blogOnly",
"start:website:deployPreview": "cross-env NETLIFY=true CONTEXT='deploy-preview' yarn workspace website start",
@ -22,12 +23,15 @@
"build": "yarn build:packages && yarn build:website",
"build:packages": "lerna run build --no-private",
"build:website": "yarn workspace website build",
"build:website:profile": "DOCUSAURUS_BUNDLER_CPU_PROFILE=true DOCUSAURUS_RSPACK_TRACE=true yarn workspace website build",
"build:website:baseUrl": "yarn workspace website build:baseUrl",
"build:website:blogOnly": "yarn workspace website build:blogOnly",
"build:website:deployPreview:testWrap": "yarn workspace website test:swizzle:wrap:ts",
"build:website:deployPreview:build": "cross-env NETLIFY=true CONTEXT='deploy-preview' yarn workspace website build",
"build:website:deployPreview": "yarn build:website:deployPreview:testWrap && yarn build:website:deployPreview:build",
"build:website:fast": "yarn workspace website build:fast",
"build:website:fast:rsdoctor": "yarn workspace website build:fast:rsdoctor",
"build:website:fast:profile": "yarn workspace website build:fast:profile",
"build:website:en": "yarn workspace website build --locale en",
"clear:website": "yarn workspace website clear",
"serve:website": "yarn workspace website serve",
@ -39,13 +43,16 @@
"crowdin:upload:website": "crowdin upload sources --config ./crowdin-v2.yaml",
"crowdin:download": "crowdin download --config ./crowdin-v2.yaml",
"crowdin:download:website": "yarn crowdin:download --language fr --language ko --language pt-BR --language zh-CN --language ja",
"argos": "yarn argos:build && yarn argos:screenshot",
"argos:build": "cross-env DOCUSAURUS_ARGOS_BUILD=true yarn build:website:fast --dev",
"argos:screenshot": "yarn workspace argos screenshot",
"canary": "yarn canary:bumpVersion && yarn canary:publish",
"canary:version": "echo 0.0.0-`git rev-list --count HEAD`+`git rev-parse --short HEAD`",
"canary:getCoreVersion": "node -p \"require('./packages/docusaurus/package.json').version\"",
"canary:version": "echo `yarn --silent canary:getCoreVersion`-canary-`git rev-list --count HEAD`+`git rev-parse --short HEAD`",
"canary:bumpVersion": "yarn lerna version `yarn --silent canary:version` --exact --no-push --yes",
"canary:publish": "yarn lerna publish from-package --dist-tag canary --yes --no-verify-access",
"changelog": "lerna-changelog",
"postinstall": "yarn lock:update && yarn build:packages",
"postinstall": "patch-package && yarn lock:update && yarn build:packages",
"prepare": "husky install",
"format": "prettier --write .",
"format:diff": "prettier --list-different .",
@ -54,7 +61,7 @@
"lint:js": "eslint --cache --report-unused-disable-directives \"**/*.{js,jsx,ts,tsx,mjs}\"",
"lint:js:fix": "yarn lint:js --fix",
"lint:spelling": "cspell \"**\" --no-progress --show-context --show-suggestions",
"lint:spelling:fix": "yarn rimraf project-words.txt && echo \"# Project Words - DO NOT TOUCH - This is updated through CI\" >> project-words.txt && yarn -s lint:spelling --words-only --unique --no-exit-code --no-summary \"**\" | cross-env LC_ALL=en_US.UTF-8 sort --ignore-case >> project-words.txt",
"lint:spelling:fix": "yarn rimraf project-words.txt && echo \"# Project Words - DO NOT TOUCH - This is updated through CI\" >> project-words.txt && yarn -s lint:spelling --words-only --unique --no-exit-code --no-summary \"**\" | cross-env LC_ALL=C sort --ignore-case >> project-words.txt",
"lint:style": "stylelint \"**/*.css\"",
"lint:style:fix": "yarn lint:style --fix",
"lerna": "lerna",
@ -69,23 +76,22 @@
"devDependencies": {
"@crowdin/cli": "^3.13.0",
"@prettier/plugin-xml": "^2.2.0",
"@swc/core": "1.2.197",
"@swc/jest": "^0.2.26",
"@swc/core": "^1.7.14",
"@swc/jest": "^0.2.36",
"@testing-library/react-hooks": "^8.0.1",
"@types/fs-extra": "^9.0.13",
"@types/jest": "^29.5.3",
"@types/jest": "^29.5.12",
"@types/lodash": "^4.14.197",
"@types/node": "^18.16.19",
"@types/prompts": "^2.4.4",
"@types/react": "^18.2.15",
"@types/react-dev-utils": "^9.0.11",
"@types/react-test-renderer": "^18.0.0",
"@types/semver": "^7.5.0",
"@types/shelljs": "^0.8.12",
"@typescript-eslint/eslint-plugin": "^5.62.0",
"@typescript-eslint/parser": "^5.62.0",
"cross-env": "^7.0.3",
"cspell": "^8.1.0",
"cspell": "^8.18.1",
"eslint": "^8.45.0",
"eslint-config-airbnb": "^19.0.4",
"eslint-config-prettier": "^8.8.0",
@ -94,23 +100,25 @@
"eslint-plugin-jest": "^27.2.3",
"eslint-plugin-jsx-a11y": "^6.7.1",
"eslint-plugin-react": "^7.32.2",
"eslint-plugin-react-compiler": "^19.0.0-beta-40c6c23-20250301",
"eslint-plugin-react-hooks": "^4.6.0",
"eslint-plugin-regexp": "^1.15.0",
"husky": "^8.0.3",
"image-size": "^1.0.2",
"jest": "^29.6.1",
"jest-environment-jsdom": "^29.6.1",
"jest-serializer-ansi-escapes": "^2.0.1",
"image-size": "^2.0.2",
"jest": "^29.7.0",
"jest-environment-jsdom": "^29.7.0",
"jest-serializer-ansi-escapes": "^3.0.0",
"jest-serializer-react-helmet-async": "^1.0.21",
"lerna": "^6.6.2",
"lerna-changelog": "^2.2.0",
"lint-staged": "^13.2.3",
"lint-staged": "~13.2.3",
"lockfile-lint": "^4.14.0",
"npm-run-all": "^4.1.5",
"patch-package": "^8.0.0",
"postinstall-postinstall": "^2.1.0",
"prettier": "^2.8.8",
"react": "^18.0.0",
"react-dom": "^18.0.0",
"react-helmet-async": "^1.3.0",
"react-test-renderer": "^18.0.0",
"rimraf": "^3.0.2",
"sharp": "^0.32.3",
@ -118,6 +126,7 @@
"stylelint": "^14.16.1",
"stylelint-config-prettier": "^9.0.5",
"stylelint-config-standard": "^29.0.0",
"typescript": "~5.5.2"
}
"typescript": "~5.8.2"
},
"packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
}

View file

@ -10,7 +10,7 @@
import path from 'path';
import {createRequire} from 'module';
import logger from '@docusaurus/logger';
import {logger} from '@docusaurus/logger';
import semver from 'semver';
import {program} from 'commander';

View file

@ -1,6 +1,6 @@
{
"name": "create-docusaurus",
"version": "3.5.1",
"version": "3.7.0",
"description": "Create Docusaurus apps easily.",
"type": "module",
"repository": {
@ -22,14 +22,14 @@
},
"license": "MIT",
"dependencies": {
"@docusaurus/logger": "3.5.1",
"@docusaurus/utils": "3.5.1",
"@docusaurus/logger": "3.7.0",
"@docusaurus/utils": "3.7.0",
"commander": "^5.1.0",
"execa": "5.1.1",
"fs-extra": "^11.1.1",
"lodash": "^4.17.21",
"prompts": "^2.4.2",
"semver": "^7.5.4",
"shelljs": "^0.8.5",
"supports-color": "^9.4.0",
"tslib": "^2.6.0"
},

View file

@ -9,11 +9,14 @@ import fs from 'fs-extra';
import {fileURLToPath} from 'url';
import path from 'path';
import _ from 'lodash';
import logger from '@docusaurus/logger';
import shell from 'shelljs';
import {logger} from '@docusaurus/logger';
import execa from 'execa';
import prompts, {type Choice} from 'prompts';
import supportsColor from 'supports-color';
import {escapeShellArg, askPreferredLanguage} from '@docusaurus/utils';
// TODO remove dependency on large @docusaurus/utils
// would be better to have a new smaller @docusaurus/utils-cli package
import {askPreferredLanguage} from '@docusaurus/utils';
type LanguagesOptions = {
javascript?: boolean;
@ -70,9 +73,9 @@ function findPackageManagerFromUserAgent(): PackageManager | undefined {
}
async function askForPackageManagerChoice(): Promise<PackageManager> {
const hasYarn = shell.exec('yarn --version', {silent: true}).code === 0;
const hasPnpm = shell.exec('pnpm --version', {silent: true}).code === 0;
const hasBun = shell.exec('bun --version', {silent: true}).code === 0;
const hasYarn = (await execa.command('yarn --version')).exitCode === 0;
const hasPnpm = (await execa.command('pnpm --version')).exitCode === 0;
const hasBun = (await execa.command('bun --version')).exitCode === 0;
if (!hasYarn && !hasPnpm && !hasBun) {
return 'npm';
@ -530,10 +533,7 @@ export default async function init(
if (source.type === 'git') {
const gitCommand = await getGitCommand(source.strategy);
const gitCloneCommand = `${gitCommand} ${escapeShellArg(
source.url,
)} ${escapeShellArg(dest)}`;
if (shell.exec(gitCloneCommand).code !== 0) {
if ((await execa(gitCommand, [source.url, dest])).exitCode !== 0) {
logger.error`Cloning Git template failed!`;
process.exit(1);
}
@ -583,24 +583,27 @@ export default async function init(
const cdpath = path.relative('.', dest);
const pkgManager = await getPackageManager(dest, cliOptions);
if (!cliOptions.skipInstall) {
shell.cd(dest);
process.chdir(dest);
logger.info`Installing dependencies with name=${pkgManager}...`;
// ...
if (
shell.exec(
pkgManager === 'yarn'
? 'yarn'
: pkgManager === 'bun'
? 'bun install'
: `${pkgManager} install --color always`,
{
env: {
...process.env,
// Force coloring the output, since the command is invoked by
// shelljs, which is not an interactive shell
...(supportsColor.stdout ? {FORCE_COLOR: '1'} : {}),
(
await execa.command(
pkgManager === 'yarn'
? 'yarn'
: pkgManager === 'bun'
? 'bun install'
: `${pkgManager} install --color always`,
{
env: {
...process.env,
// Force coloring the output
...(supportsColor.stdout ? {FORCE_COLOR: '1'} : {}),
},
},
},
).code !== 0
)
).exitCode !== 0
) {
logger.error('Dependency installation failed.');
logger.info`The site directory has already been created, and you can retry by typing:

View file

@ -2,11 +2,18 @@ import {themes as prismThemes} from 'prism-react-renderer';
import type {Config} from '@docusaurus/types';
import type * as Preset from '@docusaurus/preset-classic';
// This runs in Node.js - Don't use client-side code here (browser APIs, JSX...)
const config: Config = {
title: 'My Site',
tagline: 'Dinosaurs are cool',
favicon: 'img/favicon.ico',
// Future flags, see https://docusaurus.io/docs/api/docusaurus-config#future
future: {
v4: true, // Improve compatibility with the upcoming Docusaurus v4
},
// Set the production url of your site here
url: 'https://your-docusaurus-site.example.com',
// Set the /<baseUrl>/ pathname under which your site is served
@ -110,8 +117,8 @@ const config: Config = {
href: 'https://discordapp.com/invite/docusaurus',
},
{
label: 'Twitter',
href: 'https://twitter.com/docusaurus',
label: 'X',
href: 'https://x.com/docusaurus',
},
],
},

View file

@ -1,6 +1,6 @@
{
"name": "docusaurus-2-classic-typescript-template",
"version": "3.5.1",
"version": "3.7.0",
"private": true,
"scripts": {
"docusaurus": "docusaurus",
@ -15,19 +15,19 @@
"typecheck": "tsc"
},
"dependencies": {
"@docusaurus/core": "3.5.1",
"@docusaurus/preset-classic": "3.5.1",
"@docusaurus/core": "3.7.0",
"@docusaurus/preset-classic": "3.7.0",
"@mdx-js/react": "^3.0.0",
"clsx": "^2.0.0",
"prism-react-renderer": "^2.3.0",
"react": "^18.0.0",
"react-dom": "^18.0.0"
"react": "^19.0.0",
"react-dom": "^19.0.0"
},
"devDependencies": {
"@docusaurus/module-type-aliases": "3.5.1",
"@docusaurus/tsconfig": "3.5.1",
"@docusaurus/types": "3.5.1",
"typescript": "~5.5.2"
"@docusaurus/module-type-aliases": "3.7.0",
"@docusaurus/tsconfig": "3.7.0",
"@docusaurus/types": "3.7.0",
"typescript": "~5.6.2"
},
"browserslist": {
"production": [

View file

@ -1,5 +1,7 @@
import type {SidebarsConfig} from '@docusaurus/plugin-content-docs';
// This runs in Node.js - Don't use client-side code here (browser APIs, JSX...)
/**
* Creating a sidebar enables you to:
- create an ordered group of docs

View file

@ -1,3 +1,4 @@
import type {ReactNode} from 'react';
import clsx from 'clsx';
import Heading from '@theme/Heading';
import styles from './styles.module.css';
@ -5,7 +6,7 @@ import styles from './styles.module.css';
type FeatureItem = {
title: string;
Svg: React.ComponentType<React.ComponentProps<'svg'>>;
description: JSX.Element;
description: ReactNode;
};
const FeatureList: FeatureItem[] = [
@ -55,7 +56,7 @@ function Feature({title, Svg, description}: FeatureItem) {
);
}
export default function HomepageFeatures(): JSX.Element {
export default function HomepageFeatures(): ReactNode {
return (
<section className={styles.features}>
<div className="container">

View file

@ -1,3 +1,4 @@
import type {ReactNode} from 'react';
import clsx from 'clsx';
import Link from '@docusaurus/Link';
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
@ -28,7 +29,7 @@ function HomepageHeader() {
);
}
export default function Home(): JSX.Element {
export default function Home(): ReactNode {
const {siteConfig} = useDocusaurusContext();
return (
<Layout

View file

@ -3,5 +3,6 @@
"extends": "@docusaurus/tsconfig",
"compilerOptions": {
"baseUrl": "."
}
},
"exclude": [".docusaurus", "build"]
}

View file

@ -6,12 +6,19 @@
import {themes as prismThemes} from 'prism-react-renderer';
// This runs in Node.js - Don't use client-side code here (browser APIs, JSX...)
/** @type {import('@docusaurus/types').Config} */
const config = {
title: 'My Site',
tagline: 'Dinosaurs are cool',
favicon: 'img/favicon.ico',
// Future flags, see https://docusaurus.io/docs/api/docusaurus-config#future
future: {
v4: true, // Improve compatibility with the upcoming Docusaurus v4
},
// Set the production url of your site here
url: 'https://your-docusaurus-site.example.com',
// Set the /<baseUrl>/ pathname under which your site is served
@ -118,8 +125,8 @@ const config = {
href: 'https://discordapp.com/invite/docusaurus',
},
{
label: 'Twitter',
href: 'https://twitter.com/docusaurus',
label: 'X',
href: 'https://x.com/docusaurus',
},
],
},

View file

@ -1,6 +1,6 @@
{
"name": "docusaurus-2-classic-template",
"version": "3.5.1",
"version": "3.7.0",
"private": true,
"scripts": {
"docusaurus": "docusaurus",
@ -14,17 +14,17 @@
"write-heading-ids": "docusaurus write-heading-ids"
},
"dependencies": {
"@docusaurus/core": "3.5.1",
"@docusaurus/preset-classic": "3.5.1",
"@docusaurus/core": "3.7.0",
"@docusaurus/preset-classic": "3.7.0",
"@mdx-js/react": "^3.0.0",
"clsx": "^2.0.0",
"prism-react-renderer": "^2.3.0",
"react": "^18.0.0",
"react-dom": "^18.0.0"
"react": "^19.0.0",
"react-dom": "^19.0.0"
},
"devDependencies": {
"@docusaurus/module-type-aliases": "3.5.1",
"@docusaurus/types": "3.5.1"
"@docusaurus/module-type-aliases": "3.7.0",
"@docusaurus/types": "3.7.0"
},
"browserslist": {
"production": [

View file

@ -1,3 +1,7 @@
// @ts-check
// This runs in Node.js - Don't use client-side code here (browser APIs, JSX...)
/**
* Creating a sidebar enables you to:
- create an ordered group of docs
@ -7,11 +11,9 @@
The sidebars can be generated from the filesystem, or explicitly defined here.
Create as many sidebars as you want.
@type {import('@docusaurus/plugin-content-docs').SidebarsConfig}
*/
// @ts-check
/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */
const sidebars = {
// By default, Docusaurus generates a sidebar from the docs folder structure
tutorialSidebar: [{type: 'autogenerated', dirName: '.'}],

View file

@ -4,13 +4,13 @@ This website is built using [Docusaurus](https://docusaurus.io/), a modern stati
### Installation
```
```bash
$ yarn
```
### Local Development
```
```bash
$ yarn start
```
@ -18,7 +18,7 @@ This command starts a local development server and opens up a browser window. Mo
### Build
```
```bash
$ yarn build
```
@ -28,13 +28,13 @@ This command generates static content into the `build` directory and can be serv
Using SSH:
```
```bash
$ USE_SSH=true yarn deploy
```
Not using SSH:
```
```bash
$ GIT_USER=<Your GitHub username> yarn deploy
```

View file

@ -1,3 +0,0 @@
module.exports = {
presets: [require.resolve('@docusaurus/core/lib/babel/preset')],
};

View file

@ -1,12 +1,14 @@
yangshun:
name: Yangshun Tay
title: Front End Engineer @ Facebook
url: https://github.com/yangshun
title: Ex-Meta Staff Engineer, Co-founder GreatFrontEnd
url: https://linkedin.com/in/yangshun
image_url: https://github.com/yangshun.png
page: true
socials:
x: yangshunz
linkedin: yangshun
github: yangshun
newsletter: https://www.greatfrontend.com
slorber:
name: Sébastien Lorber

View file

@ -0,0 +1,3 @@
.tsbuildinfo*
tsconfig*
__tests__

View file

@ -0,0 +1,3 @@
# `@docusaurus/babel`
Docusaurus package for Babel-related utils.

View file

@ -0,0 +1,50 @@
{
"name": "@docusaurus/babel",
"version": "3.7.0",
"description": "Docusaurus package for Babel-related utils.",
"main": "./lib/index.js",
"types": "./lib/index.d.ts",
"exports": {
"./preset": {
"types": "./lib/preset.d.ts",
"default": "./lib/preset.js"
},
".": {
"types": "./lib/index.d.ts",
"default": "./lib/index.js"
}
},
"scripts": {
"build": "tsc",
"watch": "tsc --watch"
},
"publishConfig": {
"access": "public"
},
"repository": {
"type": "git",
"url": "https://github.com/facebook/docusaurus.git",
"directory": "packages/docusaurus-babel"
},
"license": "MIT",
"dependencies": {
"@babel/core": "^7.25.9",
"@babel/generator": "^7.25.9",
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
"@babel/plugin-transform-runtime": "^7.25.9",
"@babel/preset-env": "^7.25.9",
"@babel/preset-react": "^7.25.9",
"@babel/preset-typescript": "^7.25.9",
"@babel/runtime": "^7.25.9",
"@babel/runtime-corejs3": "^7.25.9",
"@babel/traverse": "^7.25.9",
"@docusaurus/logger": "3.7.0",
"@docusaurus/utils": "3.7.0",
"babel-plugin-dynamic-import-node": "^2.3.3",
"fs-extra": "^11.1.1",
"tslib": "^2.6.0"
},
"engines": {
"node": ">=18.0"
}
}

View file

@ -0,0 +1,537 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
import {jest} from '@jest/globals';
import fs from 'fs-extra';
import tmp from 'tmp-promise';
import {getBabelOptions} from '../utils';
import {extractSourceCodeFileTranslations} from '../babelTranslationsExtractor';
const TestBabelOptions = getBabelOptions({
isServer: true,
});
async function createTmpSourceCodeFile({
extension,
content,
}: {
extension: string;
content: string;
}) {
const file = await tmp.file({
prefix: 'jest-createTmpSourceCodeFile',
postfix: `.${extension}`,
});
await fs.writeFile(file.path, content);
return {
sourceCodeFilePath: file.path,
};
}
describe('extractSourceCodeFileTranslations', () => {
it('throws for bad source code', async () => {
const {sourceCodeFilePath} = await createTmpSourceCodeFile({
extension: 'js',
content: `
const default => {
}
`,
});
const errorMock = jest.spyOn(console, 'error').mockImplementation(() => {});
await expect(
extractSourceCodeFileTranslations(sourceCodeFilePath, TestBabelOptions),
).rejects.toThrow();
expect(errorMock).toHaveBeenCalledWith(
expect.stringMatching(
/Error while attempting to extract Docusaurus translations from source code file at/,
),
);
});
it('extracts nothing from untranslated source code', async () => {
const {sourceCodeFilePath} = await createTmpSourceCodeFile({
extension: 'js',
content: `
const unrelated = 42;
`,
});
const sourceCodeFileTranslations = await extractSourceCodeFileTranslations(
sourceCodeFilePath,
TestBabelOptions,
);
expect(sourceCodeFileTranslations).toEqual({
sourceCodeFilePath,
translations: {},
warnings: [],
});
});
it('extracts from a translate() functions calls', async () => {
const {sourceCodeFilePath} = await createTmpSourceCodeFile({
extension: 'js',
content: `
import {translate} from '@docusaurus/Translate';
export default function MyComponent() {
return (
<div>
<input text={translate({id: 'codeId',message: 'code message',description: 'code description'})}/>
<input text={translate({id: 'codeId1'})}/>
</div>
);
}
`,
});
const sourceCodeFileTranslations = await extractSourceCodeFileTranslations(
sourceCodeFilePath,
TestBabelOptions,
);
expect(sourceCodeFileTranslations).toEqual({
sourceCodeFilePath,
translations: {
codeId: {message: 'code message', description: 'code description'},
codeId1: {message: 'codeId1'},
},
warnings: [],
});
});
it('extracts from a <Translate> components', async () => {
const {sourceCodeFilePath} = await createTmpSourceCodeFile({
extension: 'js',
content: `
import Translate from '@docusaurus/Translate';
export default function MyComponent() {
return (
<div>
<Translate id="codeId" description={"code description"}>
code message
</Translate>
<Translate id="codeId1" description="description 2" />
</div>
);
}
`,
});
const sourceCodeFileTranslations = await extractSourceCodeFileTranslations(
sourceCodeFilePath,
TestBabelOptions,
);
expect(sourceCodeFileTranslations).toEqual({
sourceCodeFilePath,
translations: {
codeId: {message: 'code message', description: 'code description'},
codeId1: {message: 'codeId1', description: 'description 2'},
},
warnings: [],
});
});
it('extracts statically evaluable content', async () => {
const {sourceCodeFilePath} = await createTmpSourceCodeFile({
extension: 'js',
content: `
import Translate, {translate} from '@docusaurus/Translate';
const prefix = "prefix ";
export default function MyComponent() {
return (
<div>
<input
text={translate({
id: prefix + 'codeId fn',
message: prefix + 'code message',
description: prefix + 'code description'}
)}
/>
<Translate
id={prefix + "codeId comp"}
description={prefix + "code description"}
>
{prefix + "code message"}
</Translate>
<Translate>
{
prefix + \`Static template literal with unusual formatting!\`
}
</Translate>
</div>
);
}
`,
});
const sourceCodeFileTranslations = await extractSourceCodeFileTranslations(
sourceCodeFilePath,
TestBabelOptions,
);
expect(sourceCodeFileTranslations).toEqual({
sourceCodeFilePath,
translations: {
'prefix codeId comp': {
message: 'prefix code message',
description: 'prefix code description',
},
'prefix codeId fn': {
message: 'prefix code message',
description: 'prefix code description',
},
'prefix Static template literal with unusual formatting!': {
message: 'prefix Static template literal with unusual formatting!',
},
},
warnings: [],
});
});
it('extracts from TypeScript file', async () => {
const {sourceCodeFilePath} = await createTmpSourceCodeFile({
extension: 'tsx',
content: `
import {translate} from '@docusaurus/Translate';
type ComponentProps<T> = {toto: string}
export default function MyComponent<T>(props: ComponentProps<T>) {
return (
<div>
<input text={translate({id: 'codeId',message: 'code message',description: 'code description'}) as string}/>
<input text={translate({message: 'code message 2',description: 'code description 2'}) as string}/>
</div>
);
}
`,
});
const sourceCodeFileTranslations = await extractSourceCodeFileTranslations(
sourceCodeFilePath,
TestBabelOptions,
);
expect(sourceCodeFileTranslations).toEqual({
sourceCodeFilePath,
translations: {
codeId: {message: 'code message', description: 'code description'},
'code message 2': {
message: 'code message 2',
description: 'code description 2',
},
},
warnings: [],
});
});
it('does not extract from functions that is not docusaurus provided', async () => {
const {sourceCodeFilePath} = await createTmpSourceCodeFile({
extension: 'js',
content: `
import translate from 'a-lib';
export default function somethingElse() {
const a = translate('foo');
return <Translate>bar</Translate>
}
`,
});
const sourceCodeFileTranslations = await extractSourceCodeFileTranslations(
sourceCodeFilePath,
TestBabelOptions,
);
expect(sourceCodeFileTranslations).toEqual({
sourceCodeFilePath,
translations: {},
warnings: [],
});
});
it('does not extract from functions that is internal', async () => {
const {sourceCodeFilePath} = await createTmpSourceCodeFile({
extension: 'js',
content: `
function translate() {
return 'foo'
}
export default function somethingElse() {
const a = translate('foo');
return a;
}
`,
});
const sourceCodeFileTranslations = await extractSourceCodeFileTranslations(
sourceCodeFilePath,
TestBabelOptions,
);
expect(sourceCodeFileTranslations).toEqual({
sourceCodeFilePath,
translations: {},
warnings: [],
});
});
it('recognizes aliased imports', async () => {
const {sourceCodeFilePath} = await createTmpSourceCodeFile({
extension: 'js',
content: `
import Foo, {translate as bar} from '@docusaurus/Translate';
export function MyComponent() {
return (
<div>
<Foo id="codeId" description={"code description"}>
code message
</Foo>
<Translate id="codeId1" />
</div>
);
}
export default function () {
return (
<div>
<input text={translate({id: 'codeId',message: 'code message',description: 'code description'})}/>
<input text={bar({id: 'codeId1'})}/>
</div>
);
}
`,
});
const sourceCodeFileTranslations = await extractSourceCodeFileTranslations(
sourceCodeFilePath,
TestBabelOptions,
);
expect(sourceCodeFileTranslations).toEqual({
sourceCodeFilePath,
translations: {
codeId: {
description: 'code description',
message: 'code message',
},
codeId1: {
message: 'codeId1',
},
},
warnings: [],
});
});
it('recognizes aliased imports as string literal', async () => {
const {sourceCodeFilePath} = await createTmpSourceCodeFile({
extension: 'js',
content: `
import {'translate' as bar} from '@docusaurus/Translate';
export default function () {
return (
<div>
<input text={translate({id: 'codeId',message: 'code message',description: 'code description'})}/>
<input text={bar({id: 'codeId1'})}/>
</div>
);
}
`,
});
const sourceCodeFileTranslations = await extractSourceCodeFileTranslations(
sourceCodeFilePath,
TestBabelOptions,
);
expect(sourceCodeFileTranslations).toEqual({
sourceCodeFilePath,
translations: {
codeId1: {
message: 'codeId1',
},
},
warnings: [],
});
});
it('warns about id if no children', async () => {
const {sourceCodeFilePath} = await createTmpSourceCodeFile({
extension: 'js',
content: `
import Translate from '@docusaurus/Translate';
export default function () {
return (
<Translate description="foo" />
);
}
`,
});
const sourceCodeFileTranslations = await extractSourceCodeFileTranslations(
sourceCodeFilePath,
TestBabelOptions,
);
expect(sourceCodeFileTranslations).toEqual({
sourceCodeFilePath,
translations: {},
warnings: [
`<Translate> without children must have id prop.
Example: <Translate id="my-id" />
File: ${sourceCodeFilePath} at line 6
Full code: <Translate description="foo" />`,
],
});
});
it('warns about dynamic id', async () => {
const {sourceCodeFilePath} = await createTmpSourceCodeFile({
extension: 'js',
content: `
import Translate from '@docusaurus/Translate';
export default function () {
return (
<Translate id={index}>foo</Translate>
);
}
`,
});
const sourceCodeFileTranslations = await extractSourceCodeFileTranslations(
sourceCodeFilePath,
TestBabelOptions,
);
expect(sourceCodeFileTranslations).toEqual({
sourceCodeFilePath,
translations: {
foo: {
message: 'foo',
},
},
warnings: [
`<Translate> prop=id should be a statically evaluable object.
Example: <Translate id="optional id" description="optional description">Message</Translate>
Dynamically constructed values are not allowed, because they prevent translations to be extracted.
File: ${sourceCodeFilePath} at line 6
Full code: <Translate id={index}>foo</Translate>`,
],
});
});
it('warns about dynamic children', async () => {
const {sourceCodeFilePath} = await createTmpSourceCodeFile({
extension: 'js',
content: `
import Translate from '@docusaurus/Translate';
export default function () {
return (
<Translate id='foo'><a>hhh</a></Translate>
);
}
`,
});
const sourceCodeFileTranslations = await extractSourceCodeFileTranslations(
sourceCodeFilePath,
TestBabelOptions,
);
expect(sourceCodeFileTranslations).toEqual({
sourceCodeFilePath,
translations: {},
warnings: [
`Translate content could not be extracted. It has to be a static string and use optional but static props, like <Translate id="my-id" description="my-description">text</Translate>.
File: ${sourceCodeFilePath} at line 6
Full code: <Translate id='foo'><a>hhh</a></Translate>`,
],
});
});
it('warns about dynamic translate argument', async () => {
const {sourceCodeFilePath} = await createTmpSourceCodeFile({
extension: 'js',
content: `
import {translate} from '@docusaurus/Translate';
translate(foo);
`,
});
const sourceCodeFileTranslations = await extractSourceCodeFileTranslations(
sourceCodeFilePath,
TestBabelOptions,
);
expect(sourceCodeFileTranslations).toEqual({
sourceCodeFilePath,
translations: {},
warnings: [
`translate() first arg should be a statically evaluable object.
Example: translate({message: "text",id: "optional.id",description: "optional description"}
Dynamically constructed values are not allowed, because they prevent translations to be extracted.
File: ${sourceCodeFilePath} at line 4
Full code: translate(foo)`,
],
});
});
it('warns about too many arguments', async () => {
const {sourceCodeFilePath} = await createTmpSourceCodeFile({
extension: 'js',
content: `
import {translate} from '@docusaurus/Translate';
translate({message: 'a'}, {a: 1}, 2);
`,
});
const sourceCodeFileTranslations = await extractSourceCodeFileTranslations(
sourceCodeFilePath,
TestBabelOptions,
);
expect(sourceCodeFileTranslations).toEqual({
sourceCodeFilePath,
translations: {},
warnings: [
`translate() function only takes 1 or 2 args
File: ${sourceCodeFilePath} at line 4
Full code: translate({
message: 'a'
}, {
a: 1
}, 2)`,
],
});
});
});

View file

@ -0,0 +1,266 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
import fs from 'fs-extra';
import logger from '@docusaurus/logger';
import traverse, {type Node} from '@babel/traverse';
import generate from '@babel/generator';
import {
parse,
type types as t,
type NodePath,
type TransformOptions,
} from '@babel/core';
import type {TranslationFileContent} from '@docusaurus/types';
export type SourceCodeFileTranslations = {
sourceCodeFilePath: string;
translations: TranslationFileContent;
warnings: string[];
};
export async function extractAllSourceCodeFileTranslations(
sourceCodeFilePaths: string[],
babelOptions: TransformOptions,
): Promise<SourceCodeFileTranslations[]> {
return Promise.all(
sourceCodeFilePaths.flatMap((sourceFilePath) =>
extractSourceCodeFileTranslations(sourceFilePath, babelOptions),
),
);
}
export async function extractSourceCodeFileTranslations(
sourceCodeFilePath: string,
babelOptions: TransformOptions,
): Promise<SourceCodeFileTranslations> {
try {
const code = await fs.readFile(sourceCodeFilePath, 'utf8');
const ast = parse(code, {
...babelOptions,
ast: true,
// filename is important, because babel does not process the same files
// according to their js/ts extensions.
// See https://x.com/NicoloRibaudo/status/1321130735605002243
filename: sourceCodeFilePath,
}) as Node;
const translations = extractSourceCodeAstTranslations(
ast,
sourceCodeFilePath,
);
return translations;
} catch (err) {
logger.error`Error while attempting to extract Docusaurus translations from source code file at path=${sourceCodeFilePath}.`;
throw err;
}
}
/*
Need help understanding this?
Useful resources:
https://github.com/jamiebuilds/babel-handbook/blob/master/translations/en/plugin-handbook.md
https://github.com/formatjs/formatjs/blob/main/packages/babel-plugin-formatjs/index.ts
https://github.com/pugjs/babel-walk
*/
function extractSourceCodeAstTranslations(
ast: Node,
sourceCodeFilePath: string,
): SourceCodeFileTranslations {
function sourceWarningPart(node: Node) {
return `File: ${sourceCodeFilePath} at line ${node.loc?.start.line ?? '?'}
Full code: ${generate(node).code}`;
}
const translations: TranslationFileContent = {};
const warnings: string[] = [];
let translateComponentName: string | undefined;
let translateFunctionName: string | undefined;
// First pass: find import declarations of Translate / translate.
// If not found, don't process the rest to avoid false positives
traverse(ast, {
ImportDeclaration(path) {
if (
path.node.importKind === 'type' ||
path.get('source').node.value !== '@docusaurus/Translate'
) {
return;
}
const importSpecifiers = path.get('specifiers');
const defaultImport = importSpecifiers.find(
(specifier): specifier is NodePath<t.ImportDefaultSpecifier> =>
specifier.node.type === 'ImportDefaultSpecifier',
);
const callbackImport = importSpecifiers.find(
(specifier): specifier is NodePath<t.ImportSpecifier> =>
specifier.node.type === 'ImportSpecifier' &&
((
(specifier as NodePath<t.ImportSpecifier>).get('imported')
.node as t.Identifier
).name === 'translate' ||
(
(specifier as NodePath<t.ImportSpecifier>).get('imported')
.node as t.StringLiteral
).value === 'translate'),
);
translateComponentName = defaultImport?.get('local').node.name;
translateFunctionName = callbackImport?.get('local').node.name;
},
});
traverse(ast, {
...(translateComponentName && {
JSXElement(path) {
if (
!path
.get('openingElement')
.get('name')
.isJSXIdentifier({name: translateComponentName})
) {
return;
}
function evaluateJSXProp(propName: string): string | undefined {
const attributePath = path
.get('openingElement.attributes')
.find(
(attr) =>
attr.isJSXAttribute() &&
attr.get('name').isJSXIdentifier({name: propName}),
);
if (attributePath) {
const attributeValue = attributePath.get('value') as NodePath;
const attributeValueEvaluated =
attributeValue.isJSXExpressionContainer()
? (attributeValue.get('expression') as NodePath).evaluate()
: attributeValue.evaluate();
if (
attributeValueEvaluated.confident &&
typeof attributeValueEvaluated.value === 'string'
) {
return attributeValueEvaluated.value;
}
warnings.push(
`<Translate> prop=${propName} should be a statically evaluable object.
Example: <Translate id="optional id" description="optional description">Message</Translate>
Dynamically constructed values are not allowed, because they prevent translations to be extracted.
${sourceWarningPart(path.node)}`,
);
}
return undefined;
}
const id = evaluateJSXProp('id');
const description = evaluateJSXProp('description');
let message: string;
const childrenPath = path.get('children');
// Handle empty content
if (!childrenPath.length) {
if (!id) {
warnings.push(`<Translate> without children must have id prop.
Example: <Translate id="my-id" />
${sourceWarningPart(path.node)}`);
} else {
translations[id] = {
message: id,
...(description && {description}),
};
}
return;
}
// Handle single non-empty content
const singleChildren = childrenPath
// Remove empty/useless text nodes that might be around our
// translation! Makes the translation system more reliable to JSX
// formatting issues
.filter(
(children) =>
!(
children.isJSXText() &&
children.node.value.replace('\n', '').trim() === ''
),
)
.pop();
const isJSXText = singleChildren?.isJSXText();
const isJSXExpressionContainer =
singleChildren?.isJSXExpressionContainer() &&
(singleChildren.get('expression') as NodePath).evaluate().confident;
if (isJSXText || isJSXExpressionContainer) {
message = isJSXText
? singleChildren.node.value.trim().replace(/\s+/g, ' ')
: String(
(singleChildren.get('expression') as NodePath).evaluate().value,
);
translations[id ?? message] = {
message,
...(description && {description}),
};
} else {
warnings.push(
`Translate content could not be extracted. It has to be a static string and use optional but static props, like <Translate id="my-id" description="my-description">text</Translate>.
${sourceWarningPart(path.node)}`,
);
}
},
}),
...(translateFunctionName && {
CallExpression(path) {
if (!path.get('callee').isIdentifier({name: translateFunctionName})) {
return;
}
const args = path.get('arguments');
if (args.length === 1 || args.length === 2) {
const firstArgPath = args[0]!;
// translate("x" + "y"); => translate("xy");
const firstArgEvaluated = firstArgPath.evaluate();
if (
firstArgEvaluated.confident &&
typeof firstArgEvaluated.value === 'object'
) {
const {message, id, description} = firstArgEvaluated.value as {
[propName: string]: unknown;
};
translations[String(id ?? message)] = {
message: String(message ?? id),
...(Boolean(description) && {description: String(description)}),
};
} else {
warnings.push(
`translate() first arg should be a statically evaluable object.
Example: translate({message: "text",id: "optional.id",description: "optional description"}
Dynamically constructed values are not allowed, because they prevent translations to be extracted.
${sourceWarningPart(path.node)}`,
);
}
} else {
warnings.push(
`translate() function only takes 1 or 2 args
${sourceWarningPart(path.node)}`,
);
}
},
}),
});
return {sourceCodeFilePath, translations, warnings};
}

View file

@ -0,0 +1,10 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
export {getCustomBabelConfigFilePath, getBabelOptions} from './utils';
export {extractAllSourceCodeFileTranslations} from './babelTranslationsExtractor';

View file

@ -0,0 +1,82 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
import path from 'path';
import type {ConfigAPI, TransformOptions} from '@babel/core';
function getTransformOptions(isServer: boolean): TransformOptions {
const absoluteRuntimePath = path.dirname(
require.resolve(`@babel/runtime/package.json`),
);
return {
// All optional newlines and whitespace will be omitted when generating code
// in compact mode
compact: true,
presets: [
isServer
? [
require.resolve('@babel/preset-env'),
{
targets: {
node: 'current',
},
},
]
: [
require.resolve('@babel/preset-env'),
{
useBuiltIns: 'entry',
loose: true,
corejs: '3',
// Do not transform modules to CJS
modules: false,
// Exclude transforms that make all code slower
exclude: ['transform-typeof-symbol'],
},
],
[
require.resolve('@babel/preset-react'),
{
runtime: 'automatic',
},
],
require.resolve('@babel/preset-typescript'),
],
plugins: [
// Polyfills the runtime needed for async/await, generators, and friends
// https://babeljs.io/docs/en/babel-plugin-transform-runtime
[
require.resolve('@babel/plugin-transform-runtime'),
{
corejs: false,
helpers: true,
// By default, it assumes @babel/runtime@7.0.0. Since we use >7.0.0,
// better to explicitly specify the version so that it can reuse the
// helper better. See https://github.com/babel/babel/issues/10261
// eslint-disable-next-line @typescript-eslint/no-var-requires, global-require
version: (require('@babel/runtime/package.json') as {version: string})
.version,
regenerator: true,
useESModules: true,
// Undocumented option that lets us encapsulate our runtime, ensuring
// the correct version is used
// https://github.com/babel/babel/blob/090c364a90fe73d36a30707fc612ce037bdbbb24/packages/babel-plugin-transform-runtime/src/index.js#L35-L42
absoluteRuntime: absoluteRuntimePath,
},
],
// Adds syntax support for import()
isServer
? require.resolve('babel-plugin-dynamic-import-node')
: require.resolve('@babel/plugin-syntax-dynamic-import'),
],
};
}
export default function babelPresets(api: ConfigAPI): TransformOptions {
const callerName = api.caller((caller) => caller?.name);
return getTransformOptions(callerName === 'server');
}

View file

@ -0,0 +1,50 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
import fs from 'fs-extra';
import path from 'path';
import {BABEL_CONFIG_FILE_NAME} from '@docusaurus/utils';
import type {TransformOptions} from '@babel/core';
export async function getCustomBabelConfigFilePath(
siteDir: string,
): Promise<string | undefined> {
const customBabelConfigurationPath = path.join(
siteDir,
BABEL_CONFIG_FILE_NAME,
);
return (await fs.pathExists(customBabelConfigurationPath))
? customBabelConfigurationPath
: undefined;
}
export function getBabelOptions({
isServer,
babelOptions,
}: {
isServer?: boolean;
// TODO Docusaurus v4 fix this
// weird to have getBabelOptions take a babelOptions param
babelOptions?: TransformOptions | string;
} = {}): TransformOptions {
const caller = {name: isServer ? 'server' : 'client'};
if (typeof babelOptions === 'string') {
return {
babelrc: false,
configFile: babelOptions,
caller,
};
}
return {
...(babelOptions ?? {
presets: [require.resolve('@docusaurus/babel/preset')],
}),
babelrc: false,
configFile: false,
caller,
};
}

View file

@ -0,0 +1,10 @@
{
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"noEmit": false,
"sourceMap": true,
"declarationMap": true
},
"include": ["src"],
"exclude": ["**/__tests__/**"]
}

View file

@ -0,0 +1,3 @@
.tsbuildinfo*
tsconfig*
__tests__

View file

@ -0,0 +1,3 @@
# `@docusaurus/bundler`
Docusaurus util package to abstract the current bundler.

View file

@ -0,0 +1,60 @@
{
"name": "@docusaurus/bundler",
"version": "3.7.0",
"description": "Docusaurus util package to abstract the current bundler.",
"main": "./lib/index.js",
"types": "./lib/index.d.ts",
"scripts": {
"build": "tsc",
"watch": "tsc --watch"
},
"publishConfig": {
"access": "public"
},
"repository": {
"type": "git",
"url": "https://github.com/facebook/docusaurus.git",
"directory": "packages/docusaurus-bundler"
},
"license": "MIT",
"dependencies": {
"@babel/core": "^7.25.9",
"@docusaurus/babel": "3.7.0",
"@docusaurus/cssnano-preset": "3.7.0",
"@docusaurus/logger": "3.7.0",
"@docusaurus/types": "3.7.0",
"@docusaurus/utils": "3.7.0",
"babel-loader": "^9.2.1",
"clean-css": "^5.3.2",
"copy-webpack-plugin": "^11.0.0",
"css-loader": "^6.8.1",
"css-minimizer-webpack-plugin": "^5.0.1",
"cssnano": "^6.1.2",
"file-loader": "^6.2.0",
"html-minifier-terser": "^7.2.0",
"mini-css-extract-plugin": "^2.9.1",
"null-loader": "^4.0.1",
"postcss": "^8.4.26",
"postcss-loader": "^7.3.3",
"postcss-preset-env": "^10.1.0",
"terser-webpack-plugin": "^5.3.9",
"tslib": "^2.6.0",
"url-loader": "^4.1.1",
"webpack": "^5.95.0",
"webpackbar": "^6.0.1"
},
"peerDependencies": {
"@docusaurus/faster": "*"
},
"peerDependenciesMeta": {
"@docusaurus/faster": {
"optional": true
}
},
"devDependencies": {
"@total-typescript/shoehorn": "^0.1.2"
},
"engines": {
"node": ">=18.0"
}
}

View file

@ -0,0 +1,87 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
import {type Configuration} from 'webpack';
import logger from '@docusaurus/logger';
import formatWebpackMessages from './legacy/formatWebpackMessages';
import type webpack from 'webpack';
import type {CurrentBundler} from '@docusaurus/types';
export function formatStatsErrorMessage(
statsJson: ReturnType<webpack.Stats['toJson']> | undefined,
): string | undefined {
if (statsJson?.errors?.length) {
// TODO formatWebpackMessages does not print stack-traces
// Also the error causal chain is lost here
// We log the stacktrace inside serverEntry.tsx for now (not ideal)
const {errors} = formatWebpackMessages(statsJson);
return errors
.map((str) => logger.red(str))
.join(`\n\n${logger.yellow('--------------------------')}\n\n`);
}
return undefined;
}
export function printStatsWarnings(
statsJson: ReturnType<webpack.Stats['toJson']> | undefined,
): void {
if (statsJson?.warnings?.length) {
statsJson.warnings?.forEach((warning) => {
logger.warn(warning);
});
}
}
declare global {
interface Error {
/** @see https://webpack.js.org/api/node/#error-handling */
details?: unknown;
}
}
export function compile({
configs,
currentBundler,
}: {
configs: Configuration[];
currentBundler: CurrentBundler;
}): Promise<webpack.MultiStats> {
return new Promise((resolve, reject) => {
const compiler = currentBundler.instance(configs);
compiler.run((err, stats) => {
if (err) {
logger.error(err.stack ?? err);
if (err.details) {
logger.error(err.details);
}
reject(err);
}
// Let plugins consume all the stats
const errorsWarnings = stats?.toJson('errors-warnings');
if (stats?.hasErrors()) {
const statsErrorMessage = formatStatsErrorMessage(errorsWarnings);
reject(
new Error(
`Failed to compile due to Webpack errors.\n${statsErrorMessage}`,
),
);
}
printStatsWarnings(errorsWarnings);
// Webpack 5 requires calling close() so that persistent caching works
// See https://github.com/webpack/webpack.js.org/pull/4775
compiler.close((errClose) => {
if (errClose) {
logger.error(`Error while closing Webpack compiler: ${errClose}`);
reject(errClose);
} else {
resolve(stats!);
}
});
});
});
}

View file

@ -0,0 +1,106 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
import webpack from 'webpack';
import WebpackBar from 'webpackbar';
import MiniCssExtractPlugin from 'mini-css-extract-plugin';
import CopyWebpackPlugin from 'copy-webpack-plugin';
import {importRspack} from './importFaster';
import type {FasterModule} from './importFaster';
import type {CurrentBundler, DocusaurusConfig} from '@docusaurus/types';
// We inject a site config slice because the Rspack flag might change place
type SiteConfigSlice = {
future: {
experimental_faster: Pick<
DocusaurusConfig['future']['experimental_faster'],
'rspackBundler'
>;
};
};
function isRspack(siteConfig: SiteConfigSlice): boolean {
return siteConfig.future.experimental_faster.rspackBundler;
}
export async function getCurrentBundler({
siteConfig,
}: {
siteConfig: SiteConfigSlice;
}): Promise<CurrentBundler> {
if (isRspack(siteConfig)) {
return {
name: 'rspack',
instance: (await importRspack()) as unknown as typeof webpack,
};
}
return {
name: 'webpack',
instance: webpack,
};
}
export function getCurrentBundlerAsRspack({
currentBundler,
}: {
currentBundler: CurrentBundler;
}): FasterModule['rspack'] {
if (currentBundler.name !== 'rspack') {
throw new Error(
`Can't getCurrentBundlerAsRspack() because current bundler is ${currentBundler.name}`,
);
}
return currentBundler.instance as unknown as FasterModule['rspack'];
}
export async function getCSSExtractPlugin({
currentBundler,
}: {
currentBundler: CurrentBundler;
}): Promise<typeof MiniCssExtractPlugin> {
if (currentBundler.name === 'rspack') {
// @ts-expect-error: this exists only in Rspack
return currentBundler.instance.CssExtractRspackPlugin;
}
return MiniCssExtractPlugin;
}
export async function getCopyPlugin({
currentBundler,
}: {
currentBundler: CurrentBundler;
}): Promise<typeof CopyWebpackPlugin> {
if (currentBundler.name === 'rspack') {
// @ts-expect-error: this exists only in Rspack
return currentBundler.instance.CopyRspackPlugin;
}
return CopyWebpackPlugin;
}
export async function getProgressBarPlugin({
currentBundler,
}: {
currentBundler: CurrentBundler;
}): Promise<typeof WebpackBar> {
if (currentBundler.name === 'rspack') {
const rspack = getCurrentBundlerAsRspack({currentBundler});
class CustomRspackProgressPlugin extends rspack.ProgressPlugin {
constructor({name, color = 'green'}: {name?: string; color?: string}) {
// Unfortunately rspack.ProgressPlugin does not have name/color options
// See https://rspack.dev/plugins/webpack/progress-plugin
super({
prefix: name,
template: `● {prefix:.bold} {bar:50.${color}/white.dim} ({percent}%) {wide_msg:.dim}`,
progressChars: '██',
});
}
}
return CustomRspackProgressPlugin as unknown as typeof WebpackBar;
}
return WebpackBar;
}

View file

@ -0,0 +1,77 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
import logger from '@docusaurus/logger';
import type {
MinimizerOptions as JsMinimizerOptions,
CustomOptions,
} from 'terser-webpack-plugin';
import type {MinimizerOptions as CssMinimizerOptions} from 'css-minimizer-webpack-plugin';
export type FasterModule = Awaited<typeof import('@docusaurus/faster')>;
async function importFaster(): Promise<FasterModule> {
return import('@docusaurus/faster');
}
async function ensureFaster(): Promise<FasterModule> {
try {
return await importFaster();
} catch (error) {
throw new Error(
`To enable Docusaurus Faster options, your site must add the ${logger.name(
'@docusaurus/faster',
)} package as a dependency.`,
{cause: error},
);
}
}
export async function importRspack(): Promise<FasterModule['rspack']> {
const faster = await ensureFaster();
return faster.rspack;
}
export async function importSwcLoader(): Promise<string> {
const faster = await ensureFaster();
return faster.swcLoader;
}
export async function importGetSwcLoaderOptions(): Promise<
FasterModule['getSwcLoaderOptions']
> {
const faster = await ensureFaster();
return faster.getSwcLoaderOptions;
}
export async function importSwcJsMinimizerOptions(): Promise<
JsMinimizerOptions<CustomOptions>
> {
const faster = await ensureFaster();
return faster.getSwcJsMinimizerOptions() as JsMinimizerOptions<CustomOptions>;
}
export async function importSwcHtmlMinifier(): Promise<
ReturnType<FasterModule['getSwcHtmlMinifier']>
> {
const faster = await ensureFaster();
return faster.getSwcHtmlMinifier();
}
export async function importGetBrowserslistQueries(): Promise<
FasterModule['getBrowserslistQueries']
> {
const faster = await ensureFaster();
return faster.getBrowserslistQueries;
}
export async function importLightningCssMinimizerOptions(): Promise<
CssMinimizerOptions<CustomOptions>
> {
const faster = await ensureFaster();
return faster.getLightningCssMinimizerOptions() as CssMinimizerOptions<CustomOptions>;
}

View file

@ -0,0 +1,24 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
export {printStatsWarnings, formatStatsErrorMessage, compile} from './compiler';
export {
getCurrentBundler,
getCSSExtractPlugin,
getCopyPlugin,
getProgressBarPlugin,
} from './currentBundler';
export {getMinimizers} from './minification';
export {
getHtmlMinifier,
type HtmlMinifier,
type HtmlMinifierType,
} from './minifyHtml';
export {createJsLoaderFactory} from './loaders/jsLoader';
export {createStyleLoadersFactory} from './loaders/styleLoader';

View file

@ -0,0 +1,138 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
// TODO Legacy CRA react-dev-utils package code
// This code was in CRA/react-dev-utils (deprecated in 2025)
// We just copied the code as-is to remove a fat/useless dependency subtree
// See https://github.com/facebook/docusaurus/pull/10956
// See https://github.com/facebook/create-react-app/blob/main/packages/react-dev-utils/formatWebpackMessages.js
/* eslint-disable */
const friendlySyntaxErrorLabel = 'Syntax error:';
function isLikelyASyntaxError(message) {
return message.indexOf(friendlySyntaxErrorLabel) !== -1;
}
// Cleans up webpack error messages.
function formatMessage(message) {
let lines = [];
if (typeof message === 'string') {
lines = message.split('\n');
} else if ('message' in message) {
lines = message['message'].split('\n');
} else if (Array.isArray(message)) {
message.forEach((message) => {
if ('message' in message) {
lines = message['message'].split('\n');
}
});
}
// Strip webpack-added headers off errors/warnings
// https://github.com/webpack/webpack/blob/master/lib/ModuleError.js
lines = lines.filter((line) => !/Module [A-z ]+\(from/.test(line));
// Transform parsing error into syntax error
// TODO: move this to our ESLint formatter?
lines = lines.map((line) => {
const parsingError = /Line (\d+):(?:(\d+):)?\s*Parsing error: (.+)$/.exec(
line,
);
if (!parsingError) {
return line;
}
const [, errorLine, errorColumn, errorMessage] = parsingError;
return `${friendlySyntaxErrorLabel} ${errorMessage} (${errorLine}:${errorColumn})`;
});
message = lines.join('\n');
// Smoosh syntax errors (commonly found in CSS)
message = message.replace(
/SyntaxError\s+\((\d+):(\d+)\)\s*(.+?)\n/g,
`${friendlySyntaxErrorLabel} $3 ($1:$2)\n`,
);
// Clean up export errors
message = message.replace(
/^.*export '(.+?)' was not found in '(.+?)'.*$/gm,
`Attempted import error: '$1' is not exported from '$2'.`,
);
message = message.replace(
/^.*export 'default' \(imported as '(.+?)'\) was not found in '(.+?)'.*$/gm,
`Attempted import error: '$2' does not contain a default export (imported as '$1').`,
);
message = message.replace(
/^.*export '(.+?)' \(imported as '(.+?)'\) was not found in '(.+?)'.*$/gm,
`Attempted import error: '$1' is not exported from '$3' (imported as '$2').`,
);
lines = message.split('\n');
// Remove leading newline
if (lines.length > 2 && lines[1].trim() === '') {
lines.splice(1, 1);
}
// Clean up file name
lines[0] = lines[0].replace(/^(.*) \d+:\d+-\d+$/, '$1');
// Cleans up verbose "module not found" messages for files and packages.
if (lines[1] && lines[1].indexOf('Module not found: ') === 0) {
lines = [
lines[0],
lines[1]
.replace('Error: ', '')
.replace('Module not found: Cannot find file:', 'Cannot find file:'),
];
}
// Add helpful message for users trying to use Sass for the first time
if (lines[1] && lines[1].match(/Cannot find module.+sass/)) {
lines[1] = 'To import Sass files, you first need to install sass.\n';
lines[1] +=
'Run `npm install sass` or `yarn add sass` inside your workspace.';
}
message = lines.join('\n');
// Internal stacks are generally useless so we strip them... with the
// exception of stacks containing `webpack:` because they're normally
// from user code generated by webpack. For more information see
// https://github.com/facebook/create-react-app/pull/1050
message = message.replace(
/^\s*at\s((?!webpack:).)*:\d+:\d+[\s)]*(\n|$)/gm,
'',
); // at ... ...:x:y
message = message.replace(/^\s*at\s<anonymous>(\n|$)/gm, ''); // at <anonymous>
lines = message.split('\n');
// Remove duplicated newlines
lines = lines.filter(
(line, index, arr) =>
index === 0 ||
line.trim() !== '' ||
line.trim() !== arr[index - 1].trim(),
);
// Reassemble the message
message = lines.join('\n');
return message.trim();
}
/**
* @param {import("webpack").Stats.ToJsonOutput} json.
* @returns {{ errors: string[], warnings: string[] }}
*/
module.exports = function formatWebpackMessages(json) {
const formattedErrors = json.errors.map(formatMessage);
const formattedWarnings = json.warnings.map(formatMessage);
const result = {errors: formattedErrors, warnings: formattedWarnings};
if (result.errors.some(isLikelyASyntaxError)) {
// If there are any syntax errors, show just them.
result.errors = result.errors.filter(isLikelyASyntaxError);
}
return result;
};

View file

@ -0,0 +1,130 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
import {fromPartial, type PartialDeep} from '@total-typescript/shoehorn';
import {createJsLoaderFactory} from '../jsLoader';
import type {RuleSetRule} from 'webpack';
type SiteConfigSlice = Parameters<
typeof createJsLoaderFactory
>[0]['siteConfig'];
describe('createJsLoaderFactory', () => {
function testJsLoaderFactory(siteConfig?: {
webpack?: SiteConfigSlice['webpack'];
future?: PartialDeep<SiteConfigSlice['future']>;
}) {
return createJsLoaderFactory({
siteConfig: {
...siteConfig,
webpack: siteConfig?.webpack,
future: fromPartial({
...siteConfig?.future,
experimental_faster: fromPartial({
...siteConfig?.future?.experimental_faster,
}),
}),
},
});
}
it('createJsLoaderFactory defaults to babel loader', async () => {
const createJsLoader = await testJsLoaderFactory();
expect(createJsLoader({isServer: true}).loader).toBe(
require.resolve('babel-loader'),
);
expect(createJsLoader({isServer: false}).loader).toBe(
require.resolve('babel-loader'),
);
});
it('createJsLoaderFactory accepts babel loader preset', async () => {
const createJsLoader = await testJsLoaderFactory({
webpack: {jsLoader: 'babel'},
});
expect(createJsLoader({isServer: true}).loader).toBe(
require.resolve('babel-loader'),
);
expect(createJsLoader({isServer: false}).loader).toBe(
require.resolve('babel-loader'),
);
});
it('createJsLoaderFactory accepts custom loader', async () => {
const createJsLoader = await testJsLoaderFactory({
webpack: {
jsLoader: (isServer) => {
return {loader: `my-loader-${isServer ? 'server' : 'client'}`};
},
},
});
expect(createJsLoader({isServer: true}).loader).toBe('my-loader-server');
expect(createJsLoader({isServer: false}).loader).toBe('my-loader-client');
});
it('createJsLoaderFactory rejects custom loader when using faster swc loader', async () => {
await expect(() =>
testJsLoaderFactory({
future: {
experimental_faster: {
swcJsLoader: true,
},
},
webpack: {
jsLoader: (isServer) => {
return {loader: `my-loader-${isServer ? 'server' : 'client'}`};
},
},
}),
).rejects.toThrowErrorMatchingInlineSnapshot(`
"You can't use siteConfig.webpack.jsLoader and siteConfig.future.experimental_faster.swcJsLoader at the same time.
To avoid any configuration ambiguity, you must make an explicit choice:
- If you want to use Docusaurus Faster and SWC (recommended), remove siteConfig.webpack.jsLoader
- If you want to use a custom JS loader, use siteConfig.future.experimental_faster.swcJsLoader: false"
`);
});
it('createJsLoaderFactory accepts loaders with preset', async () => {
const createJsLoader = await testJsLoaderFactory({
webpack: {jsLoader: 'babel'},
});
expect(
createJsLoader({
isServer: true,
}).loader,
).toBe(require.resolve('babel-loader'));
expect(
createJsLoader({
isServer: false,
}).loader,
).toBe(require.resolve('babel-loader'));
});
it('createJsLoaderFactory allows customization', async () => {
const customJSLoader = (isServer: boolean): RuleSetRule => ({
loader: 'my-fast-js-loader',
options: String(isServer),
});
const createJsLoader = await testJsLoaderFactory({
webpack: {jsLoader: customJSLoader},
});
expect(
createJsLoader({
isServer: true,
}),
).toEqual(customJSLoader(true));
expect(
createJsLoader({
isServer: false,
}),
).toEqual(customJSLoader(false));
});
});

View file

@ -0,0 +1,87 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
import {getBabelOptions} from '@docusaurus/babel';
import {importSwcLoader, importGetSwcLoaderOptions} from '../importFaster';
import {getCurrentBundler} from '../currentBundler';
import type {ConfigureWebpackUtils, DocusaurusConfig} from '@docusaurus/types';
const BabelJsLoaderFactory: ConfigureWebpackUtils['getJSLoader'] = ({
isServer,
babelOptions,
}) => {
return {
loader: require.resolve('babel-loader'),
options: getBabelOptions({isServer, babelOptions}),
};
};
async function createSwcJsLoaderFactory(): Promise<
ConfigureWebpackUtils['getJSLoader']
> {
const loader = await importSwcLoader();
const getOptions = await importGetSwcLoaderOptions();
return ({isServer}) => {
return {
loader,
options: getOptions({isServer}),
};
};
}
// Same as swcLoader, except we use the built-in SWC loader
async function createRspackSwcJsLoaderFactory(): Promise<
ConfigureWebpackUtils['getJSLoader']
> {
const loader = 'builtin:swc-loader';
const getOptions = await importGetSwcLoaderOptions();
return ({isServer}) => {
return {
loader,
options: getOptions({isServer}),
};
};
}
// Confusing: function that creates a function that creates actual js loaders
// This is done on purpose because the js loader factory is a public API
// It is injected in configureWebpack plugin lifecycle for plugin authors
export async function createJsLoaderFactory({
siteConfig,
}: {
siteConfig: {
webpack?: DocusaurusConfig['webpack'];
future: {
experimental_faster: DocusaurusConfig['future']['experimental_faster'];
};
};
}): Promise<ConfigureWebpackUtils['getJSLoader']> {
const currentBundler = await getCurrentBundler({siteConfig});
const isSWCLoader = siteConfig.future.experimental_faster.swcJsLoader;
if (isSWCLoader) {
if (siteConfig.webpack?.jsLoader) {
throw new Error(
`You can't use siteConfig.webpack.jsLoader and siteConfig.future.experimental_faster.swcJsLoader at the same time.
To avoid any configuration ambiguity, you must make an explicit choice:
- If you want to use Docusaurus Faster and SWC (recommended), remove siteConfig.webpack.jsLoader
- If you want to use a custom JS loader, use siteConfig.future.experimental_faster.swcJsLoader: false`,
);
}
return currentBundler.name === 'rspack'
? createRspackSwcJsLoaderFactory()
: createSwcJsLoaderFactory();
}
const jsLoader = siteConfig.webpack?.jsLoader ?? 'babel';
if (jsLoader instanceof Function) {
return ({isServer}) => jsLoader(isServer);
}
if (jsLoader === 'babel') {
return BabelJsLoaderFactory;
}
throw new Error(`Docusaurus bug: unexpected jsLoader value${jsLoader}`);
}

Some files were not shown because too many files have changed in this diff Show more