diff --git a/admin/new.docusaurus.io/package.json b/admin/new.docusaurus.io/package.json index eccd00e8b54c..de550ea91328 100644 --- a/admin/new.docusaurus.io/package.json +++ b/admin/new.docusaurus.io/package.json @@ -1,6 +1,6 @@ { "name": "new.docusaurus.io", - "version": "2.2.0", + "version": "2.3.0", "private": true, "scripts": { "start": "npx --package netlify-cli netlify dev" diff --git a/lerna.json b/lerna.json index 146c099d38cc..d7b1554f6054 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.2.0", + "version": "2.3.0", "npmClient": "yarn", "useWorkspaces": true, "changelog": { diff --git a/packages/create-docusaurus/package.json b/packages/create-docusaurus/package.json index a79e9902fbd1..3b6eda6086b1 100755 --- a/packages/create-docusaurus/package.json +++ b/packages/create-docusaurus/package.json @@ -1,6 +1,6 @@ { "name": "create-docusaurus", - "version": "2.2.0", + "version": "2.3.0", "description": "Create Docusaurus apps easily.", "type": "module", "repository": { @@ -22,8 +22,8 @@ }, "license": "MIT", "dependencies": { - "@docusaurus/logger": "2.2.0", - "@docusaurus/utils": "2.2.0", + "@docusaurus/logger": "2.3.0", + "@docusaurus/utils": "2.3.0", "commander": "^5.1.0", "fs-extra": "^10.1.0", "lodash": "^4.17.21", diff --git a/packages/create-docusaurus/templates/classic-typescript/package.json b/packages/create-docusaurus/templates/classic-typescript/package.json index dd08b3cb39e7..e3c37260e63e 100644 --- a/packages/create-docusaurus/templates/classic-typescript/package.json +++ b/packages/create-docusaurus/templates/classic-typescript/package.json @@ -1,6 +1,6 @@ { "name": "docusaurus-2-classic-typescript-template", - "version": "2.2.0", + "version": "2.3.0", "private": true, "scripts": { "docusaurus": "docusaurus", @@ -15,8 +15,8 @@ "typecheck": "tsc" }, "dependencies": { - "@docusaurus/core": "2.2.0", - "@docusaurus/preset-classic": "2.2.0", + "@docusaurus/core": "2.3.0", + "@docusaurus/preset-classic": "2.3.0", "@mdx-js/react": "^1.6.22", "clsx": "^1.2.1", "prism-react-renderer": "^1.3.5", @@ -24,7 +24,7 @@ "react-dom": "^17.0.2" }, "devDependencies": { - "@docusaurus/module-type-aliases": "2.2.0", + "@docusaurus/module-type-aliases": "2.3.0", "@tsconfig/docusaurus": "^1.0.5", "typescript": "^4.7.4" }, diff --git a/packages/create-docusaurus/templates/classic/docusaurus.config.js b/packages/create-docusaurus/templates/classic/docusaurus.config.js index cbea7b1b4b1b..d664b65021e3 100644 --- a/packages/create-docusaurus/templates/classic/docusaurus.config.js +++ b/packages/create-docusaurus/templates/classic/docusaurus.config.js @@ -8,17 +8,22 @@ const darkCodeTheme = require('prism-react-renderer/themes/dracula'); const config = { title: 'My Site', tagline: 'Dinosaurs are cool', + favicon: 'img/favicon.ico', + + // Set the production url of your site here url: 'https://your-docusaurus-test-site.com', + // Set the // pathname under which your site is served + // For GitHub pages deployment, it is often '//' baseUrl: '/', - onBrokenLinks: 'throw', - onBrokenMarkdownLinks: 'warn', - favicon: 'img/favicon.ico', // GitHub pages deployment config. // If you aren't using GitHub pages, you don't need these. organizationName: 'facebook', // Usually your GitHub org/user name. projectName: 'docusaurus', // Usually your repo name. + onBrokenLinks: 'throw', + onBrokenMarkdownLinks: 'warn', + // Even if you don't use internalization, you can use this field to set useful // metadata like html lang. For example, if your site is Chinese, you may want // to replace "en" with "zh-Hans". @@ -56,6 +61,8 @@ const config = { themeConfig: /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ ({ + // Replace with your project's social card + image: 'img/docusaurus-social-card.jpg', navbar: { title: 'My Site', logo: { diff --git a/packages/create-docusaurus/templates/classic/package.json b/packages/create-docusaurus/templates/classic/package.json index 49f99873d7b8..3c423a60d401 100644 --- a/packages/create-docusaurus/templates/classic/package.json +++ b/packages/create-docusaurus/templates/classic/package.json @@ -1,6 +1,6 @@ { "name": "docusaurus-2-classic-template", - "version": "2.2.0", + "version": "2.3.0", "private": true, "scripts": { "docusaurus": "docusaurus", @@ -14,8 +14,8 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@docusaurus/core": "2.2.0", - "@docusaurus/preset-classic": "2.2.0", + "@docusaurus/core": "2.3.0", + "@docusaurus/preset-classic": "2.3.0", "@mdx-js/react": "^1.6.22", "clsx": "^1.2.1", "prism-react-renderer": "^1.3.5", @@ -23,7 +23,7 @@ "react-dom": "^17.0.2" }, "devDependencies": { - "@docusaurus/module-type-aliases": "2.2.0" + "@docusaurus/module-type-aliases": "2.3.0" }, "browserslist": { "production": [ diff --git a/packages/create-docusaurus/templates/facebook/docusaurus.config.js b/packages/create-docusaurus/templates/facebook/docusaurus.config.js index c877fbcb0476..69844a2af9e1 100644 --- a/packages/create-docusaurus/templates/facebook/docusaurus.config.js +++ b/packages/create-docusaurus/templates/facebook/docusaurus.config.js @@ -13,17 +13,22 @@ const config = { title: 'My Site', tagline: 'The tagline of my site', + favicon: 'img/favicon.ico', + + // Set the production url of your site here url: 'https://your-docusaurus-test-site.com', + // Set the // pathname under which your site is served + // For GitHub pages deployment, it is often '//' baseUrl: '/', - onBrokenLinks: 'throw', - onBrokenMarkdownLinks: 'warn', - favicon: 'img/favicon.ico', // GitHub pages deployment config. // If you aren't using GitHub pages, you don't need these. organizationName: 'facebook', // Usually your GitHub org/user name. projectName: 'docusaurus', // Usually your repo name. + onBrokenLinks: 'throw', + onBrokenMarkdownLinks: 'warn', + presets: [ [ 'classic', @@ -53,6 +58,7 @@ const config = { themeConfig: /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ ({ + image: 'img/docusaurus-social-card.jpg', navbar: { title: 'My Meta Project', logo: { diff --git a/packages/create-docusaurus/templates/facebook/package.json b/packages/create-docusaurus/templates/facebook/package.json index 1e9345099b75..e1e04e6407eb 100644 --- a/packages/create-docusaurus/templates/facebook/package.json +++ b/packages/create-docusaurus/templates/facebook/package.json @@ -1,6 +1,6 @@ { "name": "docusaurus-2-facebook-template", - "version": "2.2.0", + "version": "2.3.0", "private": true, "scripts": { "docusaurus": "docusaurus", @@ -18,8 +18,8 @@ "format:diff": "prettier --config .prettierrc --list-different \"**/*.{js,jsx,ts,tsx,md,mdx}\"" }, "dependencies": { - "@docusaurus/core": "2.2.0", - "@docusaurus/preset-classic": "2.2.0", + "@docusaurus/core": "2.3.0", + "@docusaurus/preset-classic": "2.3.0", "@mdx-js/react": "^1.6.22", "clsx": "^1.2.1", "react": "^17.0.2", diff --git a/packages/create-docusaurus/templates/shared/docs/tutorial-basics/markdown-features.mdx b/packages/create-docusaurus/templates/shared/docs/tutorial-basics/markdown-features.mdx index 6b3aaaaaaf85..0337f34d6a54 100644 --- a/packages/create-docusaurus/templates/shared/docs/tutorial-basics/markdown-features.mdx +++ b/packages/create-docusaurus/templates/shared/docs/tutorial-basics/markdown-features.mdx @@ -51,7 +51,11 @@ You can use absolute paths to reference images in the static directory (`static/ ![Docusaurus logo](/img/docusaurus.png) -You can reference images relative to the current file as well, as shown in [the extra guides](../tutorial-extras/manage-docs-versions.md). +You can reference images relative to the current file as well. This is particularly useful to colocate images close to the Markdown files using them: + +```md +![Docusaurus logo](./img/docusaurus.png) +``` ## Code Blocks diff --git a/packages/create-docusaurus/templates/shared/static/img/docusaurus-social-card.jpg b/packages/create-docusaurus/templates/shared/static/img/docusaurus-social-card.jpg new file mode 100644 index 000000000000..ffcb448210e1 Binary files /dev/null and b/packages/create-docusaurus/templates/shared/static/img/docusaurus-social-card.jpg differ diff --git a/packages/docusaurus-cssnano-preset/package.json b/packages/docusaurus-cssnano-preset/package.json index a2fcd9d3162d..60942313aaa0 100644 --- a/packages/docusaurus-cssnano-preset/package.json +++ b/packages/docusaurus-cssnano-preset/package.json @@ -1,6 +1,6 @@ { "name": "@docusaurus/cssnano-preset", - "version": "2.2.0", + "version": "2.3.0", "description": "Advanced cssnano preset for maximum optimization.", "main": "lib/index.js", "license": "MIT", diff --git a/packages/docusaurus-logger/package.json b/packages/docusaurus-logger/package.json index ca5d5ea818f6..2a59bc1d0421 100644 --- a/packages/docusaurus-logger/package.json +++ b/packages/docusaurus-logger/package.json @@ -1,6 +1,6 @@ { "name": "@docusaurus/logger", - "version": "2.2.0", + "version": "2.3.0", "description": "An encapsulated logger for semantically formatting console messages.", "main": "./lib/index.js", "repository": { diff --git a/packages/docusaurus-mdx-loader/package.json b/packages/docusaurus-mdx-loader/package.json index d6dc246f9ab7..5dd0400b3f54 100644 --- a/packages/docusaurus-mdx-loader/package.json +++ b/packages/docusaurus-mdx-loader/package.json @@ -1,6 +1,6 @@ { "name": "@docusaurus/mdx-loader", - "version": "2.2.0", + "version": "2.3.0", "description": "Docusaurus Loader for MDX", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -20,8 +20,8 @@ "dependencies": { "@babel/parser": "^7.18.8", "@babel/traverse": "^7.18.8", - "@docusaurus/logger": "2.2.0", - "@docusaurus/utils": "2.2.0", + "@docusaurus/logger": "2.3.0", + "@docusaurus/utils": "2.3.0", "@mdx-js/mdx": "^1.6.22", "escape-html": "^1.0.3", "file-loader": "^6.2.0", @@ -37,10 +37,9 @@ "webpack": "^5.73.0" }, "devDependencies": { - "@docusaurus/types": "2.2.0", + "@docusaurus/types": "2.3.0", "@types/escape-html": "^1.0.2", "@types/mdast": "^3.0.10", - "@types/mermaid": "^8.2.9", "@types/stringify-object": "^3.3.1", "@types/unist": "^2.0.6", "rehype-stringify": "^8.0.0", diff --git a/packages/docusaurus-mdx-loader/src/remark/admonitions/__tests__/__fixtures__/nesting.md b/packages/docusaurus-mdx-loader/src/remark/admonitions/__tests__/__fixtures__/nesting.md new file mode 100644 index 000000000000..04cb34755c4f --- /dev/null +++ b/packages/docusaurus-mdx-loader/src/remark/admonitions/__tests__/__fixtures__/nesting.md @@ -0,0 +1,10 @@ +Test nested Admonitions + +::::info **Weather** +On nice days, you can enjoy skiing in the mountains. + +:::danger *Storms* +Take care of snowstorms... +::: + +:::: \ No newline at end of file diff --git a/packages/docusaurus-mdx-loader/src/remark/admonitions/__tests__/__snapshots__/index.test.ts.snap b/packages/docusaurus-mdx-loader/src/remark/admonitions/__tests__/__snapshots__/index.test.ts.snap index 227eb28b3370..d02da45a66a8 100644 --- a/packages/docusaurus-mdx-loader/src/remark/admonitions/__tests__/__snapshots__/index.test.ts.snap +++ b/packages/docusaurus-mdx-loader/src/remark/admonitions/__tests__/__snapshots__/index.test.ts.snap @@ -42,3 +42,8 @@ exports[`admonitions remark plugin interpolation 1`] = ` "

Test admonition with interpolated title/body

My interpolated title <button style={{color: "red"}} onClick={() => alert("click")}>test

body interpolated content

" `; + +exports[`admonitions remark plugin nesting 1`] = ` +"

Test nested Admonitions

+Weather

On nice days, you can enjoy skiing in the mountains.

Storms

Take care of snowstorms...

" +`; diff --git a/packages/docusaurus-mdx-loader/src/remark/admonitions/__tests__/index.test.ts b/packages/docusaurus-mdx-loader/src/remark/admonitions/__tests__/index.test.ts index 3794562bb16d..ee59edf89439 100644 --- a/packages/docusaurus-mdx-loader/src/remark/admonitions/__tests__/index.test.ts +++ b/packages/docusaurus-mdx-loader/src/remark/admonitions/__tests__/index.test.ts @@ -50,4 +50,9 @@ describe('admonitions remark plugin', () => { const result = await processFixture('interpolation'); expect(result).toMatchSnapshot(); }); + + it('nesting', async () => { + const result = await processFixture('nesting'); + expect(result).toMatchSnapshot(); + }); }); diff --git a/packages/docusaurus-mdx-loader/src/remark/admonitions/index.ts b/packages/docusaurus-mdx-loader/src/remark/admonitions/index.ts index d6393b8c4529..d7efad2a8151 100644 --- a/packages/docusaurus-mdx-loader/src/remark/admonitions/index.ts +++ b/packages/docusaurus-mdx-loader/src/remark/admonitions/index.ts @@ -52,9 +52,20 @@ const plugin: Plugin = function plugin( const options = normalizeOptions(optionsInput); const keywords = Object.values(options.keywords).map(escapeRegExp).join('|'); + const nestingChar = escapeRegExp(options.tag.slice(0, 1)); const tag = escapeRegExp(options.tag); - const regex = new RegExp(`${tag}(${keywords})(?: *(.*))?\n`); - const escapeTag = new RegExp(escapeRegExp(`\\${options.tag}`), 'g'); + + // resolve th nesting level of an opening tag + // ::: -> 0, :::: -> 1, ::::: -> 2 ... + const nestingLevelRegex = new RegExp( + `^${tag}(?${nestingChar}*)`, + ); + + const regex = new RegExp(`${tag}${nestingChar}*(${keywords})(?: *(.*))?\n`); + const escapeTag = new RegExp( + escapeRegExp(`\\${options.tag}${options.tag.slice(0, 1)}*`), + 'g', + ); // The tokenizer is called on blocks to determine if there is an admonition // present and create tags for it @@ -77,6 +88,11 @@ const plugin: Plugin = function plugin( ]; const food = []; const content = []; + // get the nesting level of the opening tag + const openingLevel = + nestingLevelRegex.exec(opening)!.groups!.nestingLevel!.length; + // used as a stack to keep track of nested admonitions + const nestingLevels: number[] = [openingLevel]; let newValue = value; // consume lines until a closing tag @@ -88,12 +104,32 @@ const plugin: Plugin = function plugin( next !== -1 ? newValue.slice(idx + 1, next) : newValue.slice(idx + 1); food.push(line); newValue = newValue.slice(idx + 1); - // the closing tag is NOT part of the content - if (line.startsWith(options.tag)) { - break; + const nesting = nestingLevelRegex.exec(line); + idx = newValue.indexOf(NEWLINE); + if (!nesting) { + content.push(line); + continue; + } + const tagLevel = nesting.groups!.nestingLevel!.length; + // first level + if (nestingLevels.length === 0) { + nestingLevels.push(tagLevel); + content.push(line); + continue; + } + const currentLevel = nestingLevels[nestingLevels.length - 1]!; + if (tagLevel < currentLevel) { + // entering a nested admonition block + nestingLevels.push(tagLevel); + } else if (tagLevel === currentLevel) { + // closing a nested admonition block + nestingLevels.pop(); + // the closing tag is NOT part of the content + if (nestingLevels.length === 0) { + break; + } } content.push(line); - idx = newValue.indexOf(NEWLINE); } // consume the processed tag and replace escape sequences diff --git a/packages/docusaurus-migrate/package.json b/packages/docusaurus-migrate/package.json index 0b43a166c261..c779e95fcf09 100644 --- a/packages/docusaurus-migrate/package.json +++ b/packages/docusaurus-migrate/package.json @@ -1,6 +1,6 @@ { "name": "@docusaurus/migrate", - "version": "2.2.0", + "version": "2.3.0", "description": "A CLI tool to migrate from older versions of Docusaurus.", "license": "MIT", "engines": { @@ -24,8 +24,8 @@ "dependencies": { "@babel/core": "^7.18.6", "@babel/preset-env": "^7.18.6", - "@docusaurus/logger": "2.2.0", - "@docusaurus/utils": "2.2.0", + "@docusaurus/logger": "2.3.0", + "@docusaurus/utils": "2.3.0", "@mapbox/hast-util-to-jsx": "^2.0.0", "color": "^4.2.3", "commander": "^5.1.0", diff --git a/packages/docusaurus-migrate/src/__tests__/__snapshots__/index.test.ts.snap b/packages/docusaurus-migrate/src/__tests__/__snapshots__/index.test.ts.snap index 4fd3d63d75ff..96eea4159332 100644 --- a/packages/docusaurus-migrate/src/__tests__/__snapshots__/index.test.ts.snap +++ b/packages/docusaurus-migrate/src/__tests__/__snapshots__/index.test.ts.snap @@ -120,7 +120,7 @@ exports[`migration CLI migrates complex website: write 1`] = ` ] } ], - "copyright": "Copyright © 2022 Facebook Inc.", + "copyright": "Copyright © 2023 Facebook Inc.", "logo": { "src": "img/docusaurus_monochrome.svg" } @@ -303,7 +303,7 @@ exports[`migration CLI migrates missing versions: write 1`] = ` ] } ], - "copyright": "Copyright © 2022 Facebook Inc.", + "copyright": "Copyright © 2023 Facebook Inc.", "logo": { "src": "img/docusaurus_monochrome.svg" } @@ -483,7 +483,7 @@ exports[`migration CLI migrates simple website: write 1`] = ` ] } ], - "copyright": "Copyright © 2022 Facebook Inc.", + "copyright": "Copyright © 2023 Facebook Inc.", "logo": { "src": "img/docusaurus_monochrome.svg" } diff --git a/packages/docusaurus-module-type-aliases/package.json b/packages/docusaurus-module-type-aliases/package.json index a3ca49abc086..679e22faa609 100644 --- a/packages/docusaurus-module-type-aliases/package.json +++ b/packages/docusaurus-module-type-aliases/package.json @@ -1,6 +1,6 @@ { "name": "@docusaurus/module-type-aliases", - "version": "2.2.0", + "version": "2.3.0", "description": "Docusaurus module type aliases.", "types": "./src/index.d.ts", "publishConfig": { @@ -13,7 +13,7 @@ }, "dependencies": { "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/types": "2.2.0", + "@docusaurus/types": "2.3.0", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", diff --git a/packages/docusaurus-plugin-client-redirects/package.json b/packages/docusaurus-plugin-client-redirects/package.json index 042b6bf08d07..877190e41367 100644 --- a/packages/docusaurus-plugin-client-redirects/package.json +++ b/packages/docusaurus-plugin-client-redirects/package.json @@ -1,6 +1,6 @@ { "name": "@docusaurus/plugin-client-redirects", - "version": "2.2.0", + "version": "2.3.0", "description": "Client redirects plugin for Docusaurus.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -18,18 +18,18 @@ }, "license": "MIT", "dependencies": { - "@docusaurus/core": "2.2.0", - "@docusaurus/logger": "2.2.0", - "@docusaurus/utils": "2.2.0", - "@docusaurus/utils-common": "2.2.0", - "@docusaurus/utils-validation": "2.2.0", + "@docusaurus/core": "2.3.0", + "@docusaurus/logger": "2.3.0", + "@docusaurus/utils": "2.3.0", + "@docusaurus/utils-common": "2.3.0", + "@docusaurus/utils-validation": "2.3.0", "eta": "^1.12.3", "fs-extra": "^10.1.0", "lodash": "^4.17.21", "tslib": "^2.4.0" }, "devDependencies": { - "@docusaurus/types": "2.2.0" + "@docusaurus/types": "2.3.0" }, "peerDependencies": { "react": "^16.8.4 || ^17.0.0", diff --git a/packages/docusaurus-plugin-content-blog/package.json b/packages/docusaurus-plugin-content-blog/package.json index adb9ab6d012b..3f94945db891 100644 --- a/packages/docusaurus-plugin-content-blog/package.json +++ b/packages/docusaurus-plugin-content-blog/package.json @@ -1,6 +1,6 @@ { "name": "@docusaurus/plugin-content-blog", - "version": "2.2.0", + "version": "2.3.0", "description": "Blog plugin for Docusaurus.", "main": "lib/index.js", "types": "src/plugin-content-blog.d.ts", @@ -18,13 +18,13 @@ }, "license": "MIT", "dependencies": { - "@docusaurus/core": "2.2.0", - "@docusaurus/logger": "2.2.0", - "@docusaurus/mdx-loader": "2.2.0", - "@docusaurus/types": "2.2.0", - "@docusaurus/utils": "2.2.0", - "@docusaurus/utils-common": "2.2.0", - "@docusaurus/utils-validation": "2.2.0", + "@docusaurus/core": "2.3.0", + "@docusaurus/logger": "2.3.0", + "@docusaurus/mdx-loader": "2.3.0", + "@docusaurus/types": "2.3.0", + "@docusaurus/utils": "2.3.0", + "@docusaurus/utils-common": "2.3.0", + "@docusaurus/utils-validation": "2.3.0", "cheerio": "^1.0.0-rc.12", "feed": "^4.2.2", "fs-extra": "^10.1.0", @@ -35,9 +35,6 @@ "utility-types": "^3.10.0", "webpack": "^5.73.0" }, - "devDependencies": { - "escape-string-regexp": "^4.0.0" - }, "peerDependencies": { "react": "^16.8.4 || ^17.0.0", "react-dom": "^16.8.4 || ^17.0.0" diff --git a/packages/docusaurus-plugin-content-blog/src/__tests__/__snapshots__/feed.test.ts.snap b/packages/docusaurus-plugin-content-blog/src/__tests__/__snapshots__/feed.test.ts.snap index bf7d608e30c6..ae568922d131 100644 --- a/packages/docusaurus-plugin-content-blog/src/__tests__/__snapshots__/feed.test.ts.snap +++ b/packages/docusaurus-plugin-content-blog/src/__tests__/__snapshots__/feed.test.ts.snap @@ -1,5 +1,37 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`atom filters to the first two entries 1`] = ` +[ + " + + https://docusaurus.io/myBaseUrl/blog + Hello Blog + 2021-03-06T00:00:00.000Z + https://github.com/jpmonette/feed + + Hello Blog + https://docusaurus.io/myBaseUrl/image/favicon.ico + Copyright + + <![CDATA[MDX Blog Sample with require calls]]> + https://docusaurus.io/myBaseUrl/blog/mdx-require-blog-post + + 2021-03-06T00:00:00.000Z + + Test MDX with require calls

]]>
+
+ + <![CDATA[Full Blog Sample]]> + https://docusaurus.io/myBaseUrl/blog/mdx-blog-post + + 2021-03-05T00:00:00.000Z + + HTML Heading 1

HTML Heading 2

HTML Paragraph

Import DOM

Heading 1

Heading 2

Heading 3

Heading 4

Heading 5
  • list1
  • list2
  • list3
  • list1
  • list2
  • list3

Normal Text Italics Text Bold Text

linkimage

]]>
+
+
", +] +`; + exports[`atom has feed item for each post 1`] = ` [ " @@ -14,7 +46,7 @@ exports[`atom has feed item for each post 1`] = ` Copyright <![CDATA[MDX Blog Sample with require calls]]> - /mdx-require-blog-post + https://docusaurus.io/myBaseUrl/blog/mdx-require-blog-post 2021-03-06T00:00:00.000Z @@ -22,7 +54,7 @@ exports[`atom has feed item for each post 1`] = ` <![CDATA[Full Blog Sample]]> - /mdx-blog-post + https://docusaurus.io/myBaseUrl/blog/mdx-blog-post 2021-03-05T00:00:00.000Z @@ -30,7 +62,7 @@ exports[`atom has feed item for each post 1`] = ` <![CDATA[Complex Slug]]> - /hey/my super path/héllô + https://docusaurus.io/myBaseUrl/blog/hey/my super path/héllô 2020-08-16T00:00:00.000Z @@ -40,7 +72,7 @@ exports[`atom has feed item for each post 1`] = ` <![CDATA[Simple Slug]]> - /simple/slug + https://docusaurus.io/myBaseUrl/blog/simple/slug 2020-08-15T00:00:00.000Z @@ -52,13 +84,13 @@ exports[`atom has feed item for each post 1`] = ` <![CDATA[some heading]]> - /heading-as-title + https://docusaurus.io/myBaseUrl/blog/heading-as-title 2019-01-02T00:00:00.000Z <![CDATA[date-matter]]> - /date-matter + https://docusaurus.io/myBaseUrl/blog/date-matter 2019-01-01T00:00:00.000Z @@ -67,7 +99,7 @@ exports[`atom has feed item for each post 1`] = ` <![CDATA[Happy 1st Birthday Slash! (translated)]]> - /2018/12/14/Happy-First-Birthday-Slash + https://docusaurus.io/myBaseUrl/blog/2018/12/14/Happy-First-Birthday-Slash 2018-12-14T00:00:00.000Z @@ -84,6 +116,37 @@ exports[`atom has feed item for each post 1`] = ` ] `; +exports[`json filters to the first two entries 1`] = ` +[ + "{ + "version": "https://jsonfeed.org/version/1", + "title": "Hello Blog", + "home_page_url": "https://docusaurus.io/myBaseUrl/blog", + "description": "Hello Blog", + "items": [ + { + "id": "https://docusaurus.io/myBaseUrl/blog/mdx-require-blog-post", + "content_html": "

Test MDX with require calls

", + "url": "https://docusaurus.io/myBaseUrl/blog/mdx-require-blog-post", + "title": "MDX Blog Sample with require calls", + "summary": "Test MDX with require calls", + "date_modified": "2021-03-06T00:00:00.000Z", + "tags": [] + }, + { + "id": "https://docusaurus.io/myBaseUrl/blog/mdx-blog-post", + "content_html": "

HTML Heading 1

HTML Heading 2

HTML Paragraph

Import DOM

Heading 1

Heading 2

Heading 3

Heading 4

Heading 5
  • list1
  • list2
  • list3
  • list1
  • list2
  • list3

Normal Text Italics Text Bold Text

link\\"image\\"

", + "url": "https://docusaurus.io/myBaseUrl/blog/mdx-blog-post", + "title": "Full Blog Sample", + "summary": "HTML Heading 1", + "date_modified": "2021-03-05T00:00:00.000Z", + "tags": [] + } + ] +}", +] +`; + exports[`json has feed item for each post 1`] = ` [ "{ @@ -93,7 +156,7 @@ exports[`json has feed item for each post 1`] = ` "description": "Hello Blog", "items": [ { - "id": "/mdx-require-blog-post", + "id": "https://docusaurus.io/myBaseUrl/blog/mdx-require-blog-post", "content_html": "

Test MDX with require calls

", "url": "https://docusaurus.io/myBaseUrl/blog/mdx-require-blog-post", "title": "MDX Blog Sample with require calls", @@ -102,7 +165,7 @@ exports[`json has feed item for each post 1`] = ` "tags": [] }, { - "id": "/mdx-blog-post", + "id": "https://docusaurus.io/myBaseUrl/blog/mdx-blog-post", "content_html": "

HTML Heading 1

HTML Heading 2

HTML Paragraph

Import DOM

Heading 1

Heading 2

Heading 3

Heading 4

Heading 5
  • list1
  • list2
  • list3
  • list1
  • list2
  • list3

Normal Text Italics Text Bold Text

link\\"image\\"

", "url": "https://docusaurus.io/myBaseUrl/blog/mdx-blog-post", "title": "Full Blog Sample", @@ -111,7 +174,7 @@ exports[`json has feed item for each post 1`] = ` "tags": [] }, { - "id": "/hey/my super path/héllô", + "id": "https://docusaurus.io/myBaseUrl/blog/hey/my super path/héllô", "content_html": "

complex url slug

", "url": "https://docusaurus.io/myBaseUrl/blog/hey/my super path/héllô", "title": "Complex Slug", @@ -123,7 +186,7 @@ exports[`json has feed item for each post 1`] = ` ] }, { - "id": "/simple/slug", + "id": "https://docusaurus.io/myBaseUrl/blog/simple/slug", "content_html": "

simple url slug

", "url": "https://docusaurus.io/myBaseUrl/blog/simple/slug", "title": "Simple Slug", @@ -136,7 +199,7 @@ exports[`json has feed item for each post 1`] = ` "tags": [] }, { - "id": "/heading-as-title", + "id": "https://docusaurus.io/myBaseUrl/blog/heading-as-title", "content_html": "", "url": "https://docusaurus.io/myBaseUrl/blog/heading-as-title", "title": "some heading", @@ -144,7 +207,7 @@ exports[`json has feed item for each post 1`] = ` "tags": [] }, { - "id": "/date-matter", + "id": "https://docusaurus.io/myBaseUrl/blog/date-matter", "content_html": "

date inside front matter

", "url": "https://docusaurus.io/myBaseUrl/blog/date-matter", "title": "date-matter", @@ -155,7 +218,7 @@ exports[`json has feed item for each post 1`] = ` ] }, { - "id": "/2018/12/14/Happy-First-Birthday-Slash", + "id": "https://docusaurus.io/myBaseUrl/blog/2018/12/14/Happy-First-Birthday-Slash", "content_html": "

Happy birthday!

", "url": "https://docusaurus.io/myBaseUrl/blog/2018/12/14/Happy-First-Birthday-Slash", "title": "Happy 1st Birthday Slash! (translated)", @@ -171,6 +234,40 @@ exports[`json has feed item for each post 1`] = ` ] `; +exports[`rss filters to the first two entries 1`] = ` +[ + " + + + Hello Blog + https://docusaurus.io/myBaseUrl/blog + Hello Blog + Sat, 06 Mar 2021 00:00:00 GMT + https://validator.w3.org/feed/docs/rss2.html + https://github.com/jpmonette/feed + en + Copyright + + <![CDATA[MDX Blog Sample with require calls]]> + https://docusaurus.io/myBaseUrl/blog/mdx-require-blog-post + https://docusaurus.io/myBaseUrl/blog/mdx-require-blog-post + Sat, 06 Mar 2021 00:00:00 GMT + + Test MDX with require calls

]]>
+
+ + <![CDATA[Full Blog Sample]]> + https://docusaurus.io/myBaseUrl/blog/mdx-blog-post + https://docusaurus.io/myBaseUrl/blog/mdx-blog-post + Fri, 05 Mar 2021 00:00:00 GMT + + HTML Heading 1

HTML Heading 2

HTML Paragraph

Import DOM

Heading 1

Heading 2

Heading 3

Heading 4

Heading 5
  • list1
  • list2
  • list3
  • list1
  • list2
  • list3

Normal Text Italics Text Bold Text

linkimage

]]>
+
+
+
", +] +`; + exports[`rss has feed item for each post 1`] = ` [ " @@ -187,7 +284,7 @@ exports[`rss has feed item for each post 1`] = ` <![CDATA[MDX Blog Sample with require calls]]> https://docusaurus.io/myBaseUrl/blog/mdx-require-blog-post - /mdx-require-blog-post + https://docusaurus.io/myBaseUrl/blog/mdx-require-blog-post Sat, 06 Mar 2021 00:00:00 GMT Test MDX with require calls

]]>
@@ -195,7 +292,7 @@ exports[`rss has feed item for each post 1`] = ` <![CDATA[Full Blog Sample]]> https://docusaurus.io/myBaseUrl/blog/mdx-blog-post - /mdx-blog-post + https://docusaurus.io/myBaseUrl/blog/mdx-blog-post Fri, 05 Mar 2021 00:00:00 GMT HTML Heading 1

HTML Heading 2

HTML Paragraph

Import DOM

Heading 1

Heading 2

Heading 3

Heading 4

Heading 5
  • list1
  • list2
  • list3
  • list1
  • list2
  • list3

Normal Text Italics Text Bold Text

linkimage

]]>
@@ -203,7 +300,7 @@ exports[`rss has feed item for each post 1`] = ` <![CDATA[Complex Slug]]> https://docusaurus.io/myBaseUrl/blog/hey/my super path/héllô - /hey/my super path/héllô + https://docusaurus.io/myBaseUrl/blog/hey/my super path/héllô Sun, 16 Aug 2020 00:00:00 GMT complex url slug

]]>
@@ -213,7 +310,7 @@ exports[`rss has feed item for each post 1`] = ` <![CDATA[Simple Slug]]> https://docusaurus.io/myBaseUrl/blog/simple/slug - /simple/slug + https://docusaurus.io/myBaseUrl/blog/simple/slug Sat, 15 Aug 2020 00:00:00 GMT simple url slug

]]>
@@ -221,13 +318,13 @@ exports[`rss has feed item for each post 1`] = ` <![CDATA[some heading]]> https://docusaurus.io/myBaseUrl/blog/heading-as-title - /heading-as-title + https://docusaurus.io/myBaseUrl/blog/heading-as-title Wed, 02 Jan 2019 00:00:00 GMT <![CDATA[date-matter]]> https://docusaurus.io/myBaseUrl/blog/date-matter - /date-matter + https://docusaurus.io/myBaseUrl/blog/date-matter Tue, 01 Jan 2019 00:00:00 GMT date inside front matter

]]>
@@ -236,7 +333,7 @@ exports[`rss has feed item for each post 1`] = ` <![CDATA[Happy 1st Birthday Slash! (translated)]]> https://docusaurus.io/myBaseUrl/blog/2018/12/14/Happy-First-Birthday-Slash - /2018/12/14/Happy-First-Birthday-Slash + https://docusaurus.io/myBaseUrl/blog/2018/12/14/Happy-First-Birthday-Slash Fri, 14 Dec 2018 00:00:00 GMT Happy birthday!

]]>
diff --git a/packages/docusaurus-plugin-content-blog/src/__tests__/feed.test.ts b/packages/docusaurus-plugin-content-blog/src/__tests__/feed.test.ts index b02b620456c4..a1db3f7efd37 100644 --- a/packages/docusaurus-plugin-content-blog/src/__tests__/feed.test.ts +++ b/packages/docusaurus-plugin-content-blog/src/__tests__/feed.test.ts @@ -143,4 +143,56 @@ describe.each(['atom', 'rss', 'json'])('%s', (feedType) => { ).toMatchSnapshot(); fsMock.mockClear(); }); + + it('filters to the first two entries', async () => { + const siteDir = path.join(__dirname, '__fixtures__', 'website'); + const outDir = path.join(siteDir, 'build-snap'); + const siteConfig = { + title: 'Hello', + baseUrl: '/myBaseUrl/', + url: 'https://docusaurus.io', + favicon: 'image/favicon.ico', + }; + + // Build is quite difficult to mock, so we built the blog beforehand and + // copied the output to the fixture... + await testGenerateFeeds( + { + siteDir, + siteConfig, + i18n: DefaultI18N, + outDir, + } as LoadContext, + { + path: 'blog', + routeBasePath: 'blog', + tagsBasePath: 'tags', + authorsMapPath: 'authors.yml', + include: DEFAULT_OPTIONS.include, + exclude: DEFAULT_OPTIONS.exclude, + feedOptions: { + type: [feedType], + copyright: 'Copyright', + createFeedItems: async (params) => { + const {blogPosts, defaultCreateFeedItems, ...rest} = params; + const blogPostsFiltered = blogPosts.filter( + (item, index) => index < 2, + ); + return defaultCreateFeedItems({ + blogPosts: blogPostsFiltered, + ...rest, + }); + }, + }, + readingTime: ({content, defaultReadingTime}) => + defaultReadingTime({content}), + truncateMarker: //, + } as PluginOptions, + ); + + expect( + fsMock.mock.calls.map((call) => call[1] as string), + ).toMatchSnapshot(); + fsMock.mockClear(); + }); }); diff --git a/packages/docusaurus-plugin-content-blog/src/__tests__/frontMatter.test.ts b/packages/docusaurus-plugin-content-blog/src/__tests__/frontMatter.test.ts index 7d769afe3f69..c6470dae506a 100644 --- a/packages/docusaurus-plugin-content-blog/src/__tests__/frontMatter.test.ts +++ b/packages/docusaurus-plugin-content-blog/src/__tests__/frontMatter.test.ts @@ -5,7 +5,7 @@ * LICENSE file in the root directory of this source tree. */ -import escapeStringRegexp from 'escape-string-regexp'; +import {escapeRegexp} from '@docusaurus/utils'; import {validateBlogPostFrontMatter} from '../frontMatter'; import type {BlogPostFrontMatter} from '@docusaurus/plugin-content-blog'; @@ -57,7 +57,7 @@ function testField(params: { } catch (err) { // eslint-disable-next-line jest/no-conditional-expect expect((err as Error).message).toMatch( - new RegExp(escapeStringRegexp(message)), + new RegExp(escapeRegexp(message)), ); } }); diff --git a/packages/docusaurus-plugin-content-blog/src/feed.ts b/packages/docusaurus-plugin-content-blog/src/feed.ts index 222fcb84b2b5..d62396537e49 100644 --- a/packages/docusaurus-plugin-content-blog/src/feed.ts +++ b/packages/docusaurus-plugin-content-blog/src/feed.ts @@ -8,7 +8,7 @@ import path from 'path'; import fs from 'fs-extra'; import logger from '@docusaurus/logger'; -import {Feed, type Author as FeedAuthor, type Item as FeedItem} from 'feed'; +import {Feed, type Author as FeedAuthor} from 'feed'; import {normalizeUrl, readOutputHTMLFile} from '@docusaurus/utils'; import {blogPostContainerID} from '@docusaurus/utils-common'; import {load as cheerioLoad} from 'cheerio'; @@ -18,6 +18,7 @@ import type { PluginOptions, Author, BlogPost, + BlogFeedItem, } from '@docusaurus/plugin-content-blog'; async function generateBlogFeed({ @@ -54,14 +55,39 @@ async function generateBlogFeed({ copyright: feedOptions.copyright, }); + const createFeedItems = + options.feedOptions.createFeedItems ?? defaultCreateFeedItems; + + const feedItems = await createFeedItems({ + blogPosts, + siteConfig, + outDir, + defaultCreateFeedItems, + }); + + feedItems.forEach(feed.addItem); + + return feed; +} + +async function defaultCreateFeedItems({ + blogPosts, + siteConfig, + outDir, +}: { + blogPosts: BlogPost[]; + siteConfig: DocusaurusConfig; + outDir: string; +}): Promise { + const {url: siteUrl} = siteConfig; + function toFeedAuthor(author: Author): FeedAuthor { return {name: author.name, link: author.url, email: author.email}; } - await Promise.all( + return Promise.all( blogPosts.map(async (post) => { const { - id, metadata: { title: metadataTitle, permalink, @@ -79,10 +105,11 @@ async function generateBlogFeed({ ); const $ = cheerioLoad(content); - const feedItem: FeedItem = { + const link = normalizeUrl([siteUrl, permalink]); + const feedItem: BlogFeedItem = { title: metadataTitle, - id, - link: normalizeUrl([siteUrl, permalink]), + id: link, + link, date, description, // Atom feed demands the "term", while other feeds use "name" @@ -99,9 +126,7 @@ async function generateBlogFeed({ return feedItem; }), - ).then((items) => items.forEach(feed.addItem)); - - return feed; + ); } async function createBlogFeedFile({ diff --git a/packages/docusaurus-plugin-content-blog/src/options.ts b/packages/docusaurus-plugin-content-blog/src/options.ts index 99c4067a9ad8..895814a0c3ff 100644 --- a/packages/docusaurus-plugin-content-blog/src/options.ts +++ b/packages/docusaurus-plugin-content-blog/src/options.ts @@ -124,6 +124,7 @@ const PluginOptionSchema = Joi.object({ .default(DEFAULT_OPTIONS.feedOptions.copyright), }), language: Joi.string(), + createFeedItems: Joi.function(), }).default(DEFAULT_OPTIONS.feedOptions), authorsMapPath: Joi.string().default(DEFAULT_OPTIONS.authorsMapPath), readingTime: Joi.function().default(() => DEFAULT_OPTIONS.readingTime), diff --git a/packages/docusaurus-plugin-content-blog/src/plugin-content-blog.d.ts b/packages/docusaurus-plugin-content-blog/src/plugin-content-blog.d.ts index 63d31d5f58c7..59f0f9e53b95 100644 --- a/packages/docusaurus-plugin-content-blog/src/plugin-content-blog.d.ts +++ b/packages/docusaurus-plugin-content-blog/src/plugin-content-blog.d.ts @@ -9,12 +9,19 @@ declare module '@docusaurus/plugin-content-blog' { import type {LoadedMDXContent} from '@docusaurus/mdx-loader'; import type {MDXOptions} from '@docusaurus/mdx-loader'; import type {FrontMatterTag, Tag} from '@docusaurus/utils'; - import type {Plugin, LoadContext} from '@docusaurus/types'; + import type {DocusaurusConfig, Plugin, LoadContext} from '@docusaurus/types'; + import type {Item as FeedItem} from 'feed'; import type {Overwrite} from 'utility-types'; export type Assets = { /** - * If `metadata.image` is a collocated image path, this entry will be the + * If `metadata.yarn workspace website typecheck +4 +yarn workspace v1.22.19yarn workspace website typecheck +4 +yarn workspace v1.22.19yarn workspace website typecheck +4 +yarn workspace v1.22.19image` is a collocated image path, this entry will be the * bundler-generated image path. Otherwise, it's empty, and the image URL * should be accessed through `frontMatter.image`. */ @@ -255,6 +262,24 @@ declare module '@docusaurus/plugin-content-blog' { copyright: string; /** Language of the feed. */ language?: string; + /** Allow control over the construction of BlogFeedItems */ + createFeedItems?: CreateFeedItemsFn; + }; + + type DefaultCreateFeedItemsParams = { + blogPosts: BlogPost[]; + siteConfig: DocusaurusConfig; + outDir: string; + }; + + type CreateFeedItemsFn = ( + params: CreateFeedItemsParams, + ) => Promise; + + type CreateFeedItemsParams = DefaultCreateFeedItemsParams & { + defaultCreateFeedItems: ( + params: DefaultCreateFeedItemsParams, + ) => Promise; }; /** @@ -436,6 +461,8 @@ declare module '@docusaurus/plugin-content-blog' { content: string; }; + export type BlogFeedItem = FeedItem; + export type BlogPaginatedMetadata = { /** Title of the entire blog. */ readonly blogTitle: string; diff --git a/packages/docusaurus-plugin-content-docs/package.json b/packages/docusaurus-plugin-content-docs/package.json index c5a43d6537bd..b60bb1e76cea 100644 --- a/packages/docusaurus-plugin-content-docs/package.json +++ b/packages/docusaurus-plugin-content-docs/package.json @@ -1,6 +1,6 @@ { "name": "@docusaurus/plugin-content-docs", - "version": "2.2.0", + "version": "2.3.0", "description": "Docs plugin for Docusaurus.", "main": "lib/index.js", "sideEffects": false, @@ -35,13 +35,13 @@ }, "license": "MIT", "dependencies": { - "@docusaurus/core": "2.2.0", - "@docusaurus/logger": "2.2.0", - "@docusaurus/mdx-loader": "2.2.0", - "@docusaurus/module-type-aliases": "2.2.0", - "@docusaurus/types": "2.2.0", - "@docusaurus/utils": "2.2.0", - "@docusaurus/utils-validation": "2.2.0", + "@docusaurus/core": "2.3.0", + "@docusaurus/logger": "2.3.0", + "@docusaurus/mdx-loader": "2.3.0", + "@docusaurus/module-type-aliases": "2.3.0", + "@docusaurus/types": "2.3.0", + "@docusaurus/utils": "2.3.0", + "@docusaurus/utils-validation": "2.3.0", "@types/react-router-config": "^5.0.6", "combine-promises": "^1.1.0", "fs-extra": "^10.1.0", @@ -56,7 +56,6 @@ "@types/js-yaml": "^4.0.5", "@types/picomatch": "^2.3.0", "commander": "^5.1.0", - "escape-string-regexp": "^4.0.0", "picomatch": "^2.3.1", "shelljs": "^0.8.5" }, diff --git a/packages/docusaurus-plugin-content-docs/src/__tests__/frontMatter.test.ts b/packages/docusaurus-plugin-content-docs/src/__tests__/frontMatter.test.ts index 55da1682c725..0dc44555f24f 100644 --- a/packages/docusaurus-plugin-content-docs/src/__tests__/frontMatter.test.ts +++ b/packages/docusaurus-plugin-content-docs/src/__tests__/frontMatter.test.ts @@ -5,7 +5,7 @@ * LICENSE file in the root directory of this source tree. */ -import escapeStringRegexp from 'escape-string-regexp'; +import {escapeRegexp} from '@docusaurus/utils'; import {validateDocFrontMatter} from '../frontMatter'; import type {DocFrontMatter} from '@docusaurus/plugin-content-docs'; @@ -57,7 +57,7 @@ function testField(params: { } catch (err) { // eslint-disable-next-line jest/no-conditional-expect expect((err as Error).message).toMatch( - new RegExp(escapeStringRegexp(message)), + new RegExp(escapeRegexp(message)), ); } }); diff --git a/packages/docusaurus-plugin-content-docs/src/index.ts b/packages/docusaurus-plugin-content-docs/src/index.ts index 2b53c960c8f1..ae18564ce33f 100644 --- a/packages/docusaurus-plugin-content-docs/src/index.ts +++ b/packages/docusaurus-plugin-content-docs/src/index.ts @@ -336,12 +336,13 @@ export default async function pluginContentDocs( }; function createMDXLoaderRule(): RuleSetRule { - const contentDirs = versionsMetadata.flatMap(getContentPathList); + const contentDirs = versionsMetadata + .flatMap(getContentPathList) + // Trailing slash is important, see https://github.com/facebook/docusaurus/pull/3970 + .map(addTrailingPathSeparator); return { test: /\.mdx?$/i, - include: contentDirs - // Trailing slash is important, see https://github.com/facebook/docusaurus/pull/3970 - .map(addTrailingPathSeparator), + include: contentDirs, use: [ getJSLoader({isServer}), { diff --git a/packages/docusaurus-plugin-content-pages/package.json b/packages/docusaurus-plugin-content-pages/package.json index ba50c4f6a31f..59e1da61ca0d 100644 --- a/packages/docusaurus-plugin-content-pages/package.json +++ b/packages/docusaurus-plugin-content-pages/package.json @@ -1,6 +1,6 @@ { "name": "@docusaurus/plugin-content-pages", - "version": "2.2.0", + "version": "2.3.0", "description": "Pages plugin for Docusaurus.", "main": "lib/index.js", "types": "src/plugin-content-pages.d.ts", @@ -18,11 +18,11 @@ }, "license": "MIT", "dependencies": { - "@docusaurus/core": "2.2.0", - "@docusaurus/mdx-loader": "2.2.0", - "@docusaurus/types": "2.2.0", - "@docusaurus/utils": "2.2.0", - "@docusaurus/utils-validation": "2.2.0", + "@docusaurus/core": "2.3.0", + "@docusaurus/mdx-loader": "2.3.0", + "@docusaurus/types": "2.3.0", + "@docusaurus/utils": "2.3.0", + "@docusaurus/utils-validation": "2.3.0", "fs-extra": "^10.1.0", "tslib": "^2.4.0", "webpack": "^5.73.0" diff --git a/packages/docusaurus-plugin-debug/package.json b/packages/docusaurus-plugin-debug/package.json index 8553d40ac3f0..418e6e028495 100644 --- a/packages/docusaurus-plugin-debug/package.json +++ b/packages/docusaurus-plugin-debug/package.json @@ -1,6 +1,6 @@ { "name": "@docusaurus/plugin-debug", - "version": "2.2.0", + "version": "2.3.0", "description": "Debug plugin for Docusaurus.", "main": "lib/index.js", "types": "src/plugin-debug.d.ts", @@ -20,9 +20,9 @@ }, "license": "MIT", "dependencies": { - "@docusaurus/core": "2.2.0", - "@docusaurus/types": "2.2.0", - "@docusaurus/utils": "2.2.0", + "@docusaurus/core": "2.3.0", + "@docusaurus/types": "2.3.0", + "@docusaurus/utils": "2.3.0", "fs-extra": "^10.1.0", "react-json-view": "^1.21.3", "tslib": "^2.4.0" diff --git a/packages/docusaurus-plugin-google-analytics/package.json b/packages/docusaurus-plugin-google-analytics/package.json index ed92e424eeca..814f08b985fb 100644 --- a/packages/docusaurus-plugin-google-analytics/package.json +++ b/packages/docusaurus-plugin-google-analytics/package.json @@ -1,6 +1,6 @@ { "name": "@docusaurus/plugin-google-analytics", - "version": "2.2.0", + "version": "2.3.0", "description": "Global analytics (analytics.js) plugin for Docusaurus.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -18,9 +18,9 @@ }, "license": "MIT", "dependencies": { - "@docusaurus/core": "2.2.0", - "@docusaurus/types": "2.2.0", - "@docusaurus/utils-validation": "2.2.0", + "@docusaurus/core": "2.3.0", + "@docusaurus/types": "2.3.0", + "@docusaurus/utils-validation": "2.3.0", "tslib": "^2.4.0" }, "peerDependencies": { diff --git a/packages/docusaurus-plugin-google-gtag/package.json b/packages/docusaurus-plugin-google-gtag/package.json index a9f2c4330671..cb5c9a1b8b59 100644 --- a/packages/docusaurus-plugin-google-gtag/package.json +++ b/packages/docusaurus-plugin-google-gtag/package.json @@ -1,6 +1,6 @@ { "name": "@docusaurus/plugin-google-gtag", - "version": "2.2.0", + "version": "2.3.0", "description": "Global Site Tag (gtag.js) plugin for Docusaurus.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -18,9 +18,9 @@ }, "license": "MIT", "dependencies": { - "@docusaurus/core": "2.2.0", - "@docusaurus/types": "2.2.0", - "@docusaurus/utils-validation": "2.2.0", + "@docusaurus/core": "2.3.0", + "@docusaurus/types": "2.3.0", + "@docusaurus/utils-validation": "2.3.0", "tslib": "^2.4.0" }, "peerDependencies": { diff --git a/packages/docusaurus-plugin-google-tag-manager/.npmignore b/packages/docusaurus-plugin-google-tag-manager/.npmignore new file mode 100644 index 000000000000..03c9ae1e1b54 --- /dev/null +++ b/packages/docusaurus-plugin-google-tag-manager/.npmignore @@ -0,0 +1,3 @@ +.tsbuildinfo* +tsconfig* +__tests__ diff --git a/packages/docusaurus-plugin-google-tag-manager/README.md b/packages/docusaurus-plugin-google-tag-manager/README.md new file mode 100644 index 000000000000..01e213fe34fc --- /dev/null +++ b/packages/docusaurus-plugin-google-tag-manager/README.md @@ -0,0 +1,7 @@ +# `@docusaurus/plugin-google-tag-manager` + +Google Tag Manager plugin for Docusaurus. + +## Usage + +See [plugin-google-tag-manager documentation](https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-google-tag-manager). diff --git a/packages/docusaurus-plugin-google-tag-manager/package.json b/packages/docusaurus-plugin-google-tag-manager/package.json new file mode 100644 index 000000000000..41b8a32764f8 --- /dev/null +++ b/packages/docusaurus-plugin-google-tag-manager/package.json @@ -0,0 +1,33 @@ +{ + "name": "@docusaurus/plugin-google-tag-manager", + "version": "2.3.0", + "description": "Google Tag Manager (gtm.js) plugin for Docusaurus.", + "main": "lib/index.js", + "types": "lib/index.d.ts", + "publishConfig": { + "access": "public" + }, + "scripts": { + "build": "tsc --build", + "watch": "tsc --build --watch" + }, + "repository": { + "type": "git", + "url": "https://github.com/facebook/docusaurus.git", + "directory": "packages/docusaurus-plugin-google-tag-manager" + }, + "license": "MIT", + "dependencies": { + "@docusaurus/core": "2.3.0", + "@docusaurus/types": "2.3.0", + "@docusaurus/utils-validation": "2.3.0", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + }, + "engines": { + "node": ">=16.14" + } +} diff --git a/packages/docusaurus-plugin-google-tag-manager/src/index.ts b/packages/docusaurus-plugin-google-tag-manager/src/index.ts new file mode 100644 index 000000000000..10e0c3868ea7 --- /dev/null +++ b/packages/docusaurus-plugin-google-tag-manager/src/index.ts @@ -0,0 +1,78 @@ +/** + * 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 {Joi} from '@docusaurus/utils-validation'; +import type { + LoadContext, + Plugin, + OptionValidationContext, +} from '@docusaurus/types'; +import type {PluginOptions, Options} from './options'; + +export default function pluginGoogleAnalytics( + context: LoadContext, + options: PluginOptions, +): Plugin { + const {containerId} = options; + const isProd = process.env.NODE_ENV === 'production'; + + return { + name: 'docusaurus-plugin-google-tag-manager', + + contentLoaded({actions}) { + actions.setGlobalData(options); + }, + + injectHtmlTags() { + if (!isProd) { + return {}; + } + return { + preBodyTags: [ + { + tagName: 'noscript', + innerHTML: ``, + }, + ], + headTags: [ + { + tagName: 'link', + attributes: { + rel: 'preconnect', + href: 'https://www.googletagmanager.com', + }, + }, + { + tagName: 'script', + innerHTML: `window.dataLayer = window.dataLayer || [];`, + }, + { + tagName: 'script', + innerHTML: `(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': +new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], +j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= +'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); +})(window,document,'script','dataLayer','${containerId}');`, + }, + ], + }; + }, + }; +} + +const pluginOptionsSchema = Joi.object({ + containerId: Joi.string().required(), +}); + +export function validateOptions({ + validate, + options, +}: OptionValidationContext): PluginOptions { + return validate(pluginOptionsSchema, options); +} + +export type {PluginOptions, Options}; diff --git a/packages/docusaurus-plugin-google-tag-manager/src/options.ts b/packages/docusaurus-plugin-google-tag-manager/src/options.ts new file mode 100644 index 000000000000..6ffe05812a64 --- /dev/null +++ b/packages/docusaurus-plugin-google-tag-manager/src/options.ts @@ -0,0 +1,12 @@ +/** + * 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 type PluginOptions = { + containerId: string; +}; + +export type Options = Partial; diff --git a/packages/docusaurus-plugin-google-tag-manager/src/types.d.ts b/packages/docusaurus-plugin-google-tag-manager/src/types.d.ts new file mode 100644 index 000000000000..6f6f99f12793 --- /dev/null +++ b/packages/docusaurus-plugin-google-tag-manager/src/types.d.ts @@ -0,0 +1,8 @@ +/** + * 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. + */ + +/// diff --git a/packages/docusaurus-plugin-google-tag-manager/tsconfig.client.json b/packages/docusaurus-plugin-google-tag-manager/tsconfig.client.json new file mode 100644 index 000000000000..14bbcd3b6a55 --- /dev/null +++ b/packages/docusaurus-plugin-google-tag-manager/tsconfig.client.json @@ -0,0 +1,15 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "noEmit": false, + "composite": true, + "incremental": true, + "tsBuildInfoFile": "./lib/.tsbuildinfo-client", + "module": "esnext", + "target": "esnext", + "rootDir": "src", + "outDir": "lib" + }, + "include": ["src/*.d.ts"], + "exclude": ["**/__tests__/**"] +} diff --git a/packages/docusaurus-plugin-google-tag-manager/tsconfig.json b/packages/docusaurus-plugin-google-tag-manager/tsconfig.json new file mode 100644 index 000000000000..1e49538f9ea2 --- /dev/null +++ b/packages/docusaurus-plugin-google-tag-manager/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../../tsconfig.json", + "references": [{"path": "./tsconfig.client.json"}], + "compilerOptions": { + "noEmit": false, + "incremental": true, + "tsBuildInfoFile": "./lib/.tsbuildinfo", + "rootDir": "src", + "outDir": "lib" + }, + "include": ["src"], + "exclude": ["**/__tests__/**"] +} diff --git a/packages/docusaurus-plugin-ideal-image/package.json b/packages/docusaurus-plugin-ideal-image/package.json index 639b28e7f8c4..fb7371b83411 100644 --- a/packages/docusaurus-plugin-ideal-image/package.json +++ b/packages/docusaurus-plugin-ideal-image/package.json @@ -1,6 +1,6 @@ { "name": "@docusaurus/plugin-ideal-image", - "version": "2.2.0", + "version": "2.3.0", "description": "Docusaurus Plugin to generate an almost ideal image (responsive, lazy-loading, and low quality placeholder).", "main": "lib/index.js", "types": "src/plugin-ideal-image.d.ts", @@ -20,12 +20,12 @@ }, "license": "MIT", "dependencies": { - "@docusaurus/core": "2.2.0", - "@docusaurus/lqip-loader": "2.2.0", + "@docusaurus/core": "2.3.0", + "@docusaurus/lqip-loader": "2.3.0", "@docusaurus/responsive-loader": "^1.7.0", - "@docusaurus/theme-translations": "2.2.0", - "@docusaurus/types": "2.2.0", - "@docusaurus/utils-validation": "2.2.0", + "@docusaurus/theme-translations": "2.3.0", + "@docusaurus/types": "2.3.0", + "@docusaurus/utils-validation": "2.3.0", "@endiliey/react-ideal-image": "^0.0.11", "react-waypoint": "^10.3.0", "sharp": "^0.30.7", @@ -33,7 +33,7 @@ "webpack": "^5.73.0" }, "devDependencies": { - "@docusaurus/module-type-aliases": "2.2.0", + "@docusaurus/module-type-aliases": "2.3.0", "fs-extra": "^10.1.0" }, "peerDependencies": { diff --git a/packages/docusaurus-plugin-pwa/package.json b/packages/docusaurus-plugin-pwa/package.json index a246140424ec..64a9dabf5ee8 100644 --- a/packages/docusaurus-plugin-pwa/package.json +++ b/packages/docusaurus-plugin-pwa/package.json @@ -1,6 +1,6 @@ { "name": "@docusaurus/plugin-pwa", - "version": "2.2.0", + "version": "2.3.0", "description": "Docusaurus Plugin to add PWA support.", "main": "lib/index.js", "types": "src/plugin-pwa.d.ts", @@ -22,12 +22,12 @@ "dependencies": { "@babel/core": "^7.18.6", "@babel/preset-env": "^7.18.6", - "@docusaurus/core": "2.2.0", - "@docusaurus/theme-common": "2.2.0", - "@docusaurus/theme-translations": "2.2.0", - "@docusaurus/types": "2.2.0", - "@docusaurus/utils": "2.2.0", - "@docusaurus/utils-validation": "2.2.0", + "@docusaurus/core": "2.3.0", + "@docusaurus/theme-common": "2.3.0", + "@docusaurus/theme-translations": "2.3.0", + "@docusaurus/types": "2.3.0", + "@docusaurus/utils": "2.3.0", + "@docusaurus/utils-validation": "2.3.0", "babel-loader": "^8.2.5", "clsx": "^1.2.1", "core-js": "^3.23.3", @@ -40,7 +40,7 @@ "workbox-window": "^6.5.3" }, "devDependencies": { - "@docusaurus/module-type-aliases": "2.2.0", + "@docusaurus/module-type-aliases": "2.3.0", "fs-extra": "^10.1.0" }, "peerDependencies": { diff --git a/packages/docusaurus-plugin-sitemap/package.json b/packages/docusaurus-plugin-sitemap/package.json index 1f82e19a317a..d782d741e82f 100644 --- a/packages/docusaurus-plugin-sitemap/package.json +++ b/packages/docusaurus-plugin-sitemap/package.json @@ -1,6 +1,6 @@ { "name": "@docusaurus/plugin-sitemap", - "version": "2.2.0", + "version": "2.3.0", "description": "Simple sitemap generation plugin for Docusaurus.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -18,12 +18,12 @@ }, "license": "MIT", "dependencies": { - "@docusaurus/core": "2.2.0", - "@docusaurus/logger": "2.2.0", - "@docusaurus/types": "2.2.0", - "@docusaurus/utils": "2.2.0", - "@docusaurus/utils-common": "2.2.0", - "@docusaurus/utils-validation": "2.2.0", + "@docusaurus/core": "2.3.0", + "@docusaurus/logger": "2.3.0", + "@docusaurus/types": "2.3.0", + "@docusaurus/utils": "2.3.0", + "@docusaurus/utils-common": "2.3.0", + "@docusaurus/utils-validation": "2.3.0", "fs-extra": "^10.1.0", "sitemap": "^7.1.1", "tslib": "^2.4.0" diff --git a/packages/docusaurus-preset-classic/package.json b/packages/docusaurus-preset-classic/package.json index 6234fcf54751..a6f0a086339b 100644 --- a/packages/docusaurus-preset-classic/package.json +++ b/packages/docusaurus-preset-classic/package.json @@ -1,6 +1,6 @@ { "name": "@docusaurus/preset-classic", - "version": "2.2.0", + "version": "2.3.0", "description": "Classic preset for Docusaurus.", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -18,18 +18,19 @@ }, "license": "MIT", "dependencies": { - "@docusaurus/core": "2.2.0", - "@docusaurus/plugin-content-blog": "2.2.0", - "@docusaurus/plugin-content-docs": "2.2.0", - "@docusaurus/plugin-content-pages": "2.2.0", - "@docusaurus/plugin-debug": "2.2.0", - "@docusaurus/plugin-google-analytics": "2.2.0", - "@docusaurus/plugin-google-gtag": "2.2.0", - "@docusaurus/plugin-sitemap": "2.2.0", - "@docusaurus/theme-classic": "2.2.0", - "@docusaurus/theme-common": "2.2.0", - "@docusaurus/theme-search-algolia": "2.2.0", - "@docusaurus/types": "2.2.0" + "@docusaurus/core": "2.3.0", + "@docusaurus/plugin-content-blog": "2.3.0", + "@docusaurus/plugin-content-docs": "2.3.0", + "@docusaurus/plugin-content-pages": "2.3.0", + "@docusaurus/plugin-debug": "2.3.0", + "@docusaurus/plugin-google-analytics": "2.3.0", + "@docusaurus/plugin-google-gtag": "2.3.0", + "@docusaurus/plugin-google-tag-manager": "2.3.0", + "@docusaurus/plugin-sitemap": "2.3.0", + "@docusaurus/theme-classic": "2.3.0", + "@docusaurus/theme-common": "2.3.0", + "@docusaurus/theme-search-algolia": "2.3.0", + "@docusaurus/types": "2.3.0" }, "peerDependencies": { "react": "^16.8.4 || ^17.0.0", diff --git a/packages/docusaurus-preset-classic/src/index.ts b/packages/docusaurus-preset-classic/src/index.ts index c7fe1c825a3e..c1cc099c39bd 100644 --- a/packages/docusaurus-preset-classic/src/index.ts +++ b/packages/docusaurus-preset-classic/src/index.ts @@ -40,6 +40,7 @@ export default function preset( theme, googleAnalytics, gtag, + googleTagManager, ...rest } = opts; @@ -80,6 +81,11 @@ export default function preset( if (gtag) { plugins.push(makePluginConfig('@docusaurus/plugin-google-gtag', gtag)); } + if (googleTagManager) { + plugins.push( + makePluginConfig('@docusaurus/plugin-google-gtag', googleTagManager), + ); + } if (isProd && sitemap !== false) { plugins.push(makePluginConfig('@docusaurus/plugin-sitemap', sitemap)); } diff --git a/packages/docusaurus-preset-classic/src/options.ts b/packages/docusaurus-preset-classic/src/options.ts index 1e65f826fa31..a8fdb68125f2 100644 --- a/packages/docusaurus-preset-classic/src/options.ts +++ b/packages/docusaurus-preset-classic/src/options.ts @@ -11,6 +11,7 @@ import type {Options as PagesPluginOptions} from '@docusaurus/plugin-content-pag import type {Options as SitemapPluginOptions} from '@docusaurus/plugin-sitemap'; import type {Options as GAPluginOptions} from '@docusaurus/plugin-google-analytics'; import type {Options as GtagPluginOptions} from '@docusaurus/plugin-google-gtag'; +import type {Options as GTMPluginOptions} from '@docusaurus/plugin-google-tag-manager'; import type {Options as ThemeOptions} from '@docusaurus/theme-classic'; import type {ThemeConfig as BaseThemeConfig} from '@docusaurus/types'; import type {UserThemeConfig as ClassicThemeConfig} from '@docusaurus/theme-common'; @@ -42,6 +43,7 @@ export type Options = { * is present. */ gtag?: GtagPluginOptions; + googleTagManager?: GTMPluginOptions; }; export type ThemeConfig = BaseThemeConfig & diff --git a/packages/docusaurus-remark-plugin-npm2yarn/package.json b/packages/docusaurus-remark-plugin-npm2yarn/package.json index a30882cbbb5e..fe38341730a6 100644 --- a/packages/docusaurus-remark-plugin-npm2yarn/package.json +++ b/packages/docusaurus-remark-plugin-npm2yarn/package.json @@ -1,6 +1,6 @@ { "name": "@docusaurus/remark-plugin-npm2yarn", - "version": "2.2.0", + "version": "2.3.0", "description": "Remark plugin for converting npm commands to Yarn commands as tabs.", "main": "lib/index.js", "publishConfig": { diff --git a/packages/docusaurus-theme-classic/package.json b/packages/docusaurus-theme-classic/package.json index e91e1aa10035..24503d0632fc 100644 --- a/packages/docusaurus-theme-classic/package.json +++ b/packages/docusaurus-theme-classic/package.json @@ -1,6 +1,6 @@ { "name": "@docusaurus/theme-classic", - "version": "2.2.0", + "version": "2.3.0", "description": "Classic theme for Docusaurus", "main": "lib/index.js", "types": "src/theme-classic.d.ts", @@ -20,18 +20,18 @@ "copy:watch": "node ../../admin/scripts/copyUntypedFiles.js --watch" }, "dependencies": { - "@docusaurus/core": "2.2.0", - "@docusaurus/mdx-loader": "2.2.0", - "@docusaurus/module-type-aliases": "2.2.0", - "@docusaurus/plugin-content-blog": "2.2.0", - "@docusaurus/plugin-content-docs": "2.2.0", - "@docusaurus/plugin-content-pages": "2.2.0", - "@docusaurus/theme-common": "2.2.0", - "@docusaurus/theme-translations": "2.2.0", - "@docusaurus/types": "2.2.0", - "@docusaurus/utils": "2.2.0", - "@docusaurus/utils-common": "2.2.0", - "@docusaurus/utils-validation": "2.2.0", + "@docusaurus/core": "2.3.0", + "@docusaurus/mdx-loader": "2.3.0", + "@docusaurus/module-type-aliases": "2.3.0", + "@docusaurus/plugin-content-blog": "2.3.0", + "@docusaurus/plugin-content-docs": "2.3.0", + "@docusaurus/plugin-content-pages": "2.3.0", + "@docusaurus/theme-common": "2.3.0", + "@docusaurus/theme-translations": "2.3.0", + "@docusaurus/types": "2.3.0", + "@docusaurus/utils": "2.3.0", + "@docusaurus/utils-common": "2.3.0", + "@docusaurus/utils-validation": "2.3.0", "@mdx-js/react": "^1.6.22", "clsx": "^1.2.1", "copy-text-to-clipboard": "^3.0.1", diff --git a/packages/docusaurus-theme-classic/src/__tests__/options.test.ts b/packages/docusaurus-theme-classic/src/__tests__/options.test.ts index 0e9d13b08db3..69d307f7fdd3 100644 --- a/packages/docusaurus-theme-classic/src/__tests__/options.test.ts +++ b/packages/docusaurus-theme-classic/src/__tests__/options.test.ts @@ -62,7 +62,7 @@ describe('themeConfig', () => { textColor: '#000', isCloseable: true, }, - image: 'img/docusaurus-soc.png', + image: 'img/docusaurus-social-card.jpg', navbar: { style: 'primary', hideOnScroll: true, diff --git a/packages/docusaurus-theme-classic/src/getSwizzleConfig.ts b/packages/docusaurus-theme-classic/src/getSwizzleConfig.ts index 3a800e8617d7..1d5f811cbc31 100644 --- a/packages/docusaurus-theme-classic/src/getSwizzleConfig.ts +++ b/packages/docusaurus-theme-classic/src/getSwizzleConfig.ts @@ -20,6 +20,14 @@ export default function getSwizzleConfig(): SwizzleConfig { description: 'The component used to render multi-line code blocks, generally used in Markdown files.', }, + 'CodeBlock/Content': { + actions: { + eject: 'unsafe', + wrap: 'forbidden', + }, + description: + 'The folder containing components responsible for rendering different types of CodeBlock content.', + }, ColorModeToggle: { actions: { eject: 'safe', @@ -28,6 +36,14 @@ export default function getSwizzleConfig(): SwizzleConfig { description: 'The color mode toggle to switch between light and dark mode.', }, + 'DocBreadcrumbs/Items': { + actions: { + eject: 'unsafe', + wrap: 'forbidden', // Can't wrap a folder + }, + description: + 'The components responsible for rendering the breadcrumb items', + }, DocCardList: { actions: { eject: 'safe', @@ -36,6 +52,17 @@ export default function getSwizzleConfig(): SwizzleConfig { description: 'The component responsible for rendering a list of sidebar items cards.\nNotable used on the category generated-index pages.', }, + 'DocItem/TOC': { + actions: { + // Forbidden because it's a parent folder, makes the CLI crash atm + // TODO the CLI should rather support --eject + // Subfolders can be swizzled + eject: 'forbidden', + wrap: 'forbidden', + }, + description: + 'The DocItem TOC is not directly swizzle-able, but you can swizzle its sub-components.', + }, DocSidebar: { actions: { eject: 'unsafe', // Too much technical code in sidebar, not very safe atm @@ -101,6 +128,17 @@ export default function getSwizzleConfig(): SwizzleConfig { }, description: 'The footer logo', }, + Icon: { + actions: { + // Forbidden because it's a parent folder, makes the CLI crash atm + // TODO the CLI should rather support --eject + // Subfolders can be swizzled + eject: 'forbidden', + wrap: 'forbidden', + }, + description: + 'The Icon folder is not directly swizzle-able, but you can swizzle its sub-components.', + }, 'Icon/Arrow': { actions: { eject: 'safe', @@ -220,7 +258,7 @@ export default function getSwizzleConfig(): SwizzleConfig { wrap: 'forbidden', }, description: - 'The Navbar item components mapping. Can be ejected to add custom navbar item types. See https://github.com/facebook/docusaurus/issues/7227.', + 'The Navbar item components mapping. Can be ejected to add custom navbar item types.\nSee https://github.com/facebook/docusaurus/issues/7227.', }, NotFound: { actions: { diff --git a/packages/docusaurus-theme-classic/src/theme-classic.d.ts b/packages/docusaurus-theme-classic/src/theme-classic.d.ts index 032aeb01603c..eac330fc4e6d 100644 --- a/packages/docusaurus-theme-classic/src/theme-classic.d.ts +++ b/packages/docusaurus-theme-classic/src/theme-classic.d.ts @@ -1123,38 +1123,17 @@ declare module '@theme/Mermaid' { } declare module '@theme/TabItem' { - import type {ReactNode} from 'react'; + import type {TabItemProps} from '@docusaurus/theme-common/internal'; - export interface Props { - readonly children: ReactNode; - readonly value: string; - readonly default?: boolean; - readonly label?: string; - readonly hidden?: boolean; - readonly className?: string; - readonly attributes?: {[key: string]: unknown}; - } + export interface Props extends TabItemProps {} export default function TabItem(props: Props): JSX.Element; } declare module '@theme/Tabs' { - import type {ReactElement} from 'react'; - import type {Props as TabItemProps} from '@theme/TabItem'; + import type {TabsProps} from '@docusaurus/theme-common/internal'; - export interface Props { - readonly lazy?: boolean; - readonly block?: boolean; - readonly children: readonly ReactElement[]; - readonly defaultValue?: string | null; - readonly values?: readonly { - value: string; - label?: string; - attributes?: {[key: string]: unknown}; - }[]; - readonly groupId?: string; - readonly className?: string; - } + export interface Props extends TabsProps {} export default function Tabs(props: Props): JSX.Element; } @@ -1392,3 +1371,7 @@ declare module '@theme/prism-include-languages' { PrismObject: typeof PrismNamespace, ): void; } + +declare module '@theme/DocBreadcrumbs/Items/Home' { + export default function HomeBreadcrumbItem(): JSX.Element; +} diff --git a/packages/docusaurus-theme-classic/src/theme/DocBreadcrumbs/Items/Home/index.tsx b/packages/docusaurus-theme-classic/src/theme/DocBreadcrumbs/Items/Home/index.tsx new file mode 100644 index 000000000000..cb8ae8d518b3 --- /dev/null +++ b/packages/docusaurus-theme-classic/src/theme/DocBreadcrumbs/Items/Home/index.tsx @@ -0,0 +1,33 @@ +/** + * 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 React from 'react'; +import Link from '@docusaurus/Link'; +import useBaseUrl from '@docusaurus/useBaseUrl'; +import {translate} from '@docusaurus/Translate'; +import IconHome from '@theme/Icon/Home'; + +import styles from './styles.module.css'; + +export default function HomeBreadcrumbItem(): JSX.Element { + const homeHref = useBaseUrl('/'); + + return ( +
  • + + + +
  • + ); +} diff --git a/packages/docusaurus-theme-classic/src/theme/DocBreadcrumbs/Items/Home/styles.module.css b/packages/docusaurus-theme-classic/src/theme/DocBreadcrumbs/Items/Home/styles.module.css new file mode 100644 index 000000000000..81c9f729b749 --- /dev/null +++ b/packages/docusaurus-theme-classic/src/theme/DocBreadcrumbs/Items/Home/styles.module.css @@ -0,0 +1,14 @@ +/** + * 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. + */ + +.breadcrumbHomeIcon { + position: relative; + top: 1px; + vertical-align: top; + height: 1.1rem; + width: 1.1rem; +} diff --git a/packages/docusaurus-theme-classic/src/theme/DocBreadcrumbs/index.tsx b/packages/docusaurus-theme-classic/src/theme/DocBreadcrumbs/index.tsx index 1e296be0bded..74e02efdf119 100644 --- a/packages/docusaurus-theme-classic/src/theme/DocBreadcrumbs/index.tsx +++ b/packages/docusaurus-theme-classic/src/theme/DocBreadcrumbs/index.tsx @@ -13,9 +13,8 @@ import { useHomePageRoute, } from '@docusaurus/theme-common/internal'; import Link from '@docusaurus/Link'; -import useBaseUrl from '@docusaurus/useBaseUrl'; import {translate} from '@docusaurus/Translate'; -import IconHome from '@theme/Icon/Home'; +import HomeBreadcrumbItem from '@theme/DocBreadcrumbs/Items/Home'; import styles from './styles.module.css'; @@ -79,24 +78,6 @@ function BreadcrumbsItem({ ); } -function HomeBreadcrumbItem() { - const homeHref = useBaseUrl('/'); - return ( -
  • - - - -
  • - ); -} - export default function DocBreadcrumbs(): JSX.Element | null { const breadcrumbs = useSidebarBreadcrumbs(); const homePageRoute = useHomePageRoute(); diff --git a/packages/docusaurus-theme-classic/src/theme/DocBreadcrumbs/styles.module.css b/packages/docusaurus-theme-classic/src/theme/DocBreadcrumbs/styles.module.css index 5794e1b3c9fa..a400c5d9e622 100644 --- a/packages/docusaurus-theme-classic/src/theme/DocBreadcrumbs/styles.module.css +++ b/packages/docusaurus-theme-classic/src/theme/DocBreadcrumbs/styles.module.css @@ -9,11 +9,3 @@ --ifm-breadcrumb-size-multiplier: 0.8; margin-bottom: 0.8rem; } - -.breadcrumbHomeIcon { - position: relative; - top: 1px; - vertical-align: top; - height: 1.1rem; - width: 1.1rem; -} diff --git a/packages/docusaurus-theme-classic/src/theme/DocPage/Layout/Sidebar/ExpandButton/styles.module.css b/packages/docusaurus-theme-classic/src/theme/DocPage/Layout/Sidebar/ExpandButton/styles.module.css index ee835664bb46..f5e58785e148 100644 --- a/packages/docusaurus-theme-classic/src/theme/DocPage/Layout/Sidebar/ExpandButton/styles.module.css +++ b/packages/docusaurus-theme-classic/src/theme/DocPage/Layout/Sidebar/ExpandButton/styles.module.css @@ -7,10 +7,11 @@ @media (min-width: 997px) { .expandButton { - position: sticky; + position: absolute; top: 0; + right: 0; + width: 100%; height: 100%; - max-height: 100vh; display: flex; align-items: center; justify-content: center; diff --git a/packages/docusaurus-theme-classic/src/theme/DocPage/Layout/Sidebar/index.tsx b/packages/docusaurus-theme-classic/src/theme/DocPage/Layout/Sidebar/index.tsx index a88302612113..551ac7c3f39d 100644 --- a/packages/docusaurus-theme-classic/src/theme/DocPage/Layout/Sidebar/index.tsx +++ b/packages/docusaurus-theme-classic/src/theme/DocPage/Layout/Sidebar/index.tsx @@ -60,15 +60,20 @@ export default function DocPageLayoutSidebar({ } }}> - +
    + + {hiddenSidebar && } +
    - - {hiddenSidebar && } ); } diff --git a/packages/docusaurus-theme-classic/src/theme/DocPage/Layout/Sidebar/styles.module.css b/packages/docusaurus-theme-classic/src/theme/DocPage/Layout/Sidebar/styles.module.css index 52a371cc3fb2..f821f3b60564 100644 --- a/packages/docusaurus-theme-classic/src/theme/DocPage/Layout/Sidebar/styles.module.css +++ b/packages/docusaurus-theme-classic/src/theme/DocPage/Layout/Sidebar/styles.module.css @@ -29,4 +29,11 @@ width: var(--doc-sidebar-hidden-width); cursor: pointer; } + + .sidebarViewport { + top: 0; + position: sticky; + height: 100%; + max-height: 100vh; + } } diff --git a/packages/docusaurus-theme-classic/src/theme/DocPage/Layout/styles.module.css b/packages/docusaurus-theme-classic/src/theme/DocPage/Layout/styles.module.css index 2516de55e3d4..03c6f2194b09 100644 --- a/packages/docusaurus-theme-classic/src/theme/DocPage/Layout/styles.module.css +++ b/packages/docusaurus-theme-classic/src/theme/DocPage/Layout/styles.module.css @@ -12,4 +12,5 @@ .docsWrapper { display: flex; + flex: 1 0 auto; } diff --git a/packages/docusaurus-theme-classic/src/theme/DocSidebar/Desktop/CollapseButton/styles.module.css b/packages/docusaurus-theme-classic/src/theme/DocSidebar/Desktop/CollapseButton/styles.module.css index 44f11f21cc75..c5026e8bf154 100644 --- a/packages/docusaurus-theme-classic/src/theme/DocSidebar/Desktop/CollapseButton/styles.module.css +++ b/packages/docusaurus-theme-classic/src/theme/DocSidebar/Desktop/CollapseButton/styles.module.css @@ -43,4 +43,5 @@ .collapseSidebarButton { display: none; + margin: 0; } diff --git a/packages/docusaurus-theme-classic/src/theme/DocSidebar/Desktop/Content/index.tsx b/packages/docusaurus-theme-classic/src/theme/DocSidebar/Desktop/Content/index.tsx index 120f4509c1a1..cbd89b05f661 100644 --- a/packages/docusaurus-theme-classic/src/theme/DocSidebar/Desktop/Content/index.tsx +++ b/packages/docusaurus-theme-classic/src/theme/DocSidebar/Desktop/Content/index.tsx @@ -12,6 +12,7 @@ import { useAnnouncementBar, useScrollPosition, } from '@docusaurus/theme-common/internal'; +import {translate} from '@docusaurus/Translate'; import DocSidebarItems from '@theme/DocSidebarItems'; import type {Props} from '@theme/DocSidebar/Desktop/Content'; @@ -41,6 +42,11 @@ export default function DocSidebarDesktopContent({ return (