From 84ca22602b9e64f02fb68a44eb9bfc1df2ebc3ce Mon Sep 17 00:00:00 2001 From: sebastien Date: Fri, 12 Apr 2024 17:56:34 +0200 Subject: [PATCH 01/25] poc of route.props API --- .../src/index.ts | 16 +- packages/docusaurus-types/src/context.d.ts | 4 +- packages/docusaurus-types/src/index.d.ts | 1 + packages/docusaurus-types/src/routing.d.ts | 19 ++- .../src/client/exports/ComponentCreator.tsx | 12 +- .../docusaurus/src/server/codegen/codegen.ts | 4 +- .../src/server/codegen/codegenRoutes.ts | 142 ++++++++++++++++-- .../docusaurus/src/server/plugins/plugins.ts | 29 ++-- .../src/server/plugins/pluginsUtils.ts | 19 ++- .../src/server/plugins/routeConfig.ts | 6 +- 10 files changed, 206 insertions(+), 46 deletions(-) diff --git a/packages/docusaurus-plugin-content-blog/src/index.ts b/packages/docusaurus-plugin-content-blog/src/index.ts index dfc1f097f446..ea0af7dcd7ea 100644 --- a/packages/docusaurus-plugin-content-blog/src/index.ts +++ b/packages/docusaurus-plugin-content-blog/src/index.ts @@ -231,22 +231,12 @@ export default async function pluginContentBlog( } if (archiveBasePath && listedBlogPosts.length) { - const archiveUrl = normalizeUrl([ - baseUrl, - routeBasePath, - archiveBasePath, - ]); - // Create a blog archive route - const archiveProp = await createData( - `${docuHash(archiveUrl)}.json`, - JSON.stringify({blogPosts: listedBlogPosts}, null, 2), - ); addRoute({ - path: archiveUrl, + path: normalizeUrl([baseUrl, routeBasePath, archiveBasePath]), component: blogArchiveComponent, exact: true, - modules: { - archive: aliasedSource(archiveProp), + props: { + archive: {blogPosts: listedBlogPosts}, }, }); } diff --git a/packages/docusaurus-types/src/context.d.ts b/packages/docusaurus-types/src/context.d.ts index 57481a98165a..68c4f78d6ecd 100644 --- a/packages/docusaurus-types/src/context.d.ts +++ b/packages/docusaurus-types/src/context.d.ts @@ -7,7 +7,7 @@ import type {DocusaurusConfig} from './config'; import type {CodeTranslations, I18n} from './i18n'; import type {LoadedPlugin, PluginVersionInformation} from './plugin'; -import type {RouteConfig} from './routing'; +import type {PluginRouteConfig} from './routing'; export type DocusaurusContext = { siteConfig: DocusaurusConfig; @@ -57,7 +57,7 @@ export type Props = LoadContext & { preBodyTags: string; postBodyTags: string; siteMetadata: SiteMetadata; - routes: RouteConfig[]; + routes: PluginRouteConfig[]; routesPaths: string[]; plugins: LoadedPlugin[]; }; diff --git a/packages/docusaurus-types/src/index.d.ts b/packages/docusaurus-types/src/index.d.ts index ecc5810be3e3..a67446410180 100644 --- a/packages/docusaurus-types/src/index.d.ts +++ b/packages/docusaurus-types/src/index.d.ts @@ -70,6 +70,7 @@ export { export { RouteConfig, + PluginRouteConfig, RouteMetadata, RouteContext, PluginRouteContext, diff --git a/packages/docusaurus-types/src/routing.d.ts b/packages/docusaurus-types/src/routing.d.ts index b87eee9676d4..698797b7d1b9 100644 --- a/packages/docusaurus-types/src/routing.d.ts +++ b/packages/docusaurus-types/src/routing.d.ts @@ -6,6 +6,7 @@ */ import type {ParsedUrlQueryInput} from 'querystring'; +import type {PluginIdentifier} from './plugin'; /** * A "module" represents a unit of serialized data emitted from the plugin. It @@ -110,9 +111,23 @@ export type RouteConfig = { */ metadata?: RouteMetadata; /** - * Extra props; will be available on the client side. + * Optional props object; will be converted to a module and injected as props + * into the route component. */ - [propName: string]: unknown; + props?: {[propName: string]: unknown}; + /** + * Extra route attribute; will be available on the client side route object. + */ + [attributeName: string]: unknown; +}; + +export type PluginRouteConfig = RouteConfig & { + /** + * Routes are always created by Docusaurus plugins + * A plugin identifier is available at the top of a routing tree + * (child routes are implicitly created by the same plugin as their parent) + */ + plugin: PluginIdentifier; }; export type RouteContext = { diff --git a/packages/docusaurus/src/client/exports/ComponentCreator.tsx b/packages/docusaurus/src/client/exports/ComponentCreator.tsx index 33c0f4c90a6d..cd6f046e3549 100644 --- a/packages/docusaurus/src/client/exports/ComponentCreator.tsx +++ b/packages/docusaurus/src/client/exports/ComponentCreator.tsx @@ -85,8 +85,10 @@ export default function ComponentCreator( const loadedModules = JSON.parse(JSON.stringify(chunkNames)) as { __comp?: React.ComponentType; __context?: RouteContext; - [propName: string]: unknown; + __props?: {[propName: string]: unknown}; + [attributeName: string]: unknown; }; + console.log({loadedModules}); Object.entries(loaded).forEach(([keyPath, loadedModule]) => { // JSON modules are also loaded as `{ default: ... }` (`import()` // semantics) but we just want to pass the actual value to props. @@ -127,12 +129,18 @@ export default function ComponentCreator( delete loadedModules.__comp; const routeContext = loadedModules.__context!; delete loadedModules.__context; + const routeProps = loadedModules.__props; + delete loadedModules.__props; /* eslint-enable no-underscore-dangle */ // Is there any way to put this RouteContextProvider upper in the tree? return ( - + ); }, diff --git a/packages/docusaurus/src/server/codegen/codegen.ts b/packages/docusaurus/src/server/codegen/codegen.ts index 69450426826f..d6df2de34edd 100644 --- a/packages/docusaurus/src/server/codegen/codegen.ts +++ b/packages/docusaurus/src/server/codegen/codegen.ts @@ -16,7 +16,7 @@ import type { DocusaurusConfig, GlobalData, I18n, - RouteConfig, + PluginRouteConfig, SiteMetadata, } from '@docusaurus/types'; @@ -140,7 +140,7 @@ type CodegenParams = { i18n: I18n; codeTranslations: CodeTranslations; siteMetadata: SiteMetadata; - routes: RouteConfig[]; + routes: PluginRouteConfig[]; }; export async function generateSiteFiles(params: CodegenParams): Promise { diff --git a/packages/docusaurus/src/server/codegen/codegenRoutes.ts b/packages/docusaurus/src/server/codegen/codegenRoutes.ts index 8eee10d3f61e..752e2b601f83 100644 --- a/packages/docusaurus/src/server/codegen/codegenRoutes.ts +++ b/packages/docusaurus/src/server/codegen/codegenRoutes.ts @@ -6,6 +6,7 @@ */ import query from 'querystring'; +import path from 'path'; import _ from 'lodash'; import {docuHash, simpleHash, escapePath, generate} from '@docusaurus/utils'; import type { @@ -14,6 +15,8 @@ import type { RouteModules, ChunkNames, RouteChunkNames, + PluginRouteConfig, + PluginIdentifier, } from '@docusaurus/types'; type RoutesCode = { @@ -88,13 +91,13 @@ function serializeRouteConfig({ routeHash, exact, subroutesCodeStrings, - props, + attributes, }: { routePath: string; routeHash: string; exact?: boolean; subroutesCodeStrings?: string[]; - props: {[propName: string]: unknown}; + attributes: {[attributeName: string]: unknown}; }) { const parts = [ `path: '${routePath}'`, @@ -113,11 +116,11 @@ ${indent(subroutesCodeStrings.join(',\n'))} ); } - Object.entries(props).forEach(([propName, propValue]) => { + Object.entries(attributes).forEach(([attrName, attrValue]) => { const isIdentifier = - /^[$_\p{ID_Start}][$\u200c\u200d\p{ID_Continue}]*$/u.test(propName); - const key = isIdentifier ? propName : JSON.stringify(propName); - parts.push(`${key}: ${JSON.stringify(propValue)}`); + /^[$_\p{ID_Start}][$\u200c\u200d\p{ID_Continue}]*$/u.test(attrName); + const key = isIdentifier ? attrName : JSON.stringify(attrName); + parts.push(`${key}: ${JSON.stringify(attrValue)}`); }); return `{ @@ -201,7 +204,8 @@ function genRouteCode(routeConfig: RouteConfig, res: RoutesCode): string { priority, exact, metadata, - ...props + props, + ...attributes } = routeConfig; if (typeof routePath !== 'string' || !component) { @@ -225,7 +229,7 @@ ${JSON.stringify(routeConfig)}`, routeHash, subroutesCodeStrings: subroutes?.map((r) => genRouteCode(r, res)), exact, - props, + attributes, }); } @@ -311,14 +315,132 @@ const genRoutes = ({ type GenerateRouteFilesParams = { generatedFilesDir: string; - routes: RouteConfig[]; + routes: PluginRouteConfig[]; baseUrl: string; }; -export async function generateRouteFiles({ +async function generateRoutePropModule({ + generatedFilesDir, + route, + plugin, +}: { + generatedFilesDir: string; + route: RouteConfig; + plugin: PluginIdentifier; +}) { + ensureNoPropsConflict(route); + + const propModulePath = path.join( + generatedFilesDir, + plugin.name, + plugin.id, + 'p', + `${route.path}.json`, + ); + + await generate( + generatedFilesDir, + propModulePath, + JSON.stringify(route.props), + ); + return propModulePath; +} + +function ensureNoPropsConflict(route: RouteConfig) { + if (!route.props && !route.modules) { + return; + } + const conflictingPropNames = _.intersection( + Object.keys(route.props ?? {}), + Object.keys(route.modules ?? {}), + ); + if (conflictingPropNames.length > 0) { + throw new Error( + `Route ${ + route.path + } has conflicting props declared using both route.modules and route.props APIs for keys: ${conflictingPropNames.join( + ', ', + )}\nThis is not permitted, otherwise one prop would override the over.`, + ); + } +} + +async function preprocessRouteProps({ + generatedFilesDir, + route, + plugin, +}: { + generatedFilesDir: string; + route: RouteConfig; + plugin: PluginIdentifier; +}): Promise { + const propsModulePathPromise = route.props + ? generateRoutePropModule({ + generatedFilesDir, + route, + plugin, + }) + : undefined; + + const subRoutesPromise = route.routes + ? Promise.all( + route.routes.map((subRoute: RouteConfig) => { + return preprocessRouteProps({ + generatedFilesDir, + route: subRoute, + plugin, + }); + }), + ) + : undefined; + + const [propsModulePath, subRoutes] = await Promise.all([ + propsModulePathPromise, + subRoutesPromise, + ]); + + const newRoute: RouteConfig = { + ...route, + modules: { + ...route.modules, + ...(propsModulePath && {__props: propsModulePath}), + }, + subRoutes, + }; + + return newRoute; +} + +// For convenience, it's possible to pass a "route.props" object +// This method converts the props object to a regular module +// and assigns it to route.modules.__props attribute +async function preprocessAllPluginsRoutesProps({ generatedFilesDir, routes, +}: { + generatedFilesDir: string; + routes: PluginRouteConfig[]; +}) { + return Promise.all( + routes.map((route) => { + return preprocessRouteProps({ + generatedFilesDir, + route, + plugin: route.plugin, + }); + }), + ); +} + +export async function generateRouteFiles({ + generatedFilesDir, + routes: initialRoutes, }: GenerateRouteFilesParams): Promise { + const routes = await preprocessAllPluginsRoutesProps({ + generatedFilesDir, + routes: initialRoutes, + }); + const {registry, routesChunkNames, routesConfig} = generateRoutesCode(routes); await Promise.all([ genRegistry({generatedFilesDir, registry}), diff --git a/packages/docusaurus/src/server/plugins/plugins.ts b/packages/docusaurus/src/server/plugins/plugins.ts index a5dbf2633892..17e1b2d6c751 100644 --- a/packages/docusaurus/src/server/plugins/plugins.ts +++ b/packages/docusaurus/src/server/plugins/plugins.ts @@ -18,6 +18,7 @@ import { formatPluginName, getPluginByIdentifier, mergeGlobalData, + toPluginRoute, } from './pluginsUtils'; import type { LoadContext, @@ -27,6 +28,7 @@ import type { PluginIdentifier, LoadedPlugin, InitializedPlugin, + PluginRouteConfig, } from '@docusaurus/types'; async function translatePluginContent({ @@ -174,7 +176,10 @@ async function executePluginAllContentLoaded({ ); } -type AllContentLoadedResult = {routes: RouteConfig[]; globalData: GlobalData}; +type AllContentLoadedResult = { + routes: PluginRouteConfig[]; + globalData: GlobalData; +}; async function executeAllPluginsAllContentLoaded({ plugins, @@ -186,28 +191,32 @@ async function executeAllPluginsAllContentLoaded({ return PerfLogger.async(`allContentLoaded()`, async () => { const allContent = aggregateAllContent(plugins); - const routes: RouteConfig[] = []; - const globalData: GlobalData = {}; + const allRoutes: PluginRouteConfig[] = []; + const allGlobalData: GlobalData = {}; await Promise.all( plugins.map(async (plugin) => { - const {routes: pluginRoutes, globalData: pluginGlobalData} = + const {routes, globalData: pluginGlobalData} = await executePluginAllContentLoaded({ plugin, context, allContent, }); - routes.push(...pluginRoutes); + const pluginRoutes = routes.map((route) => + toPluginRoute({plugin, route}), + ); + + allRoutes.push(...pluginRoutes); if (pluginGlobalData !== undefined) { - globalData[plugin.name] ??= {}; - globalData[plugin.name]![plugin.options.id] = pluginGlobalData; + allGlobalData[plugin.name] ??= {}; + allGlobalData[plugin.name]![plugin.options.id] = pluginGlobalData; } }), ); - return {routes, globalData}; + return {routes: allRoutes, globalData: allGlobalData}; }); } @@ -221,7 +230,7 @@ function mergeResults({ plugins: LoadedPlugin[]; allContentLoadedResult: AllContentLoadedResult; }) { - const routes: RouteConfig[] = [ + const routes: PluginRouteConfig[] = [ ...aggregateRoutes(plugins), ...allContentLoadedResult.routes, ]; @@ -237,7 +246,7 @@ function mergeResults({ export type LoadPluginsResult = { plugins: LoadedPlugin[]; - routes: RouteConfig[]; + routes: PluginRouteConfig[]; globalData: GlobalData; }; diff --git a/packages/docusaurus/src/server/plugins/pluginsUtils.ts b/packages/docusaurus/src/server/plugins/pluginsUtils.ts index 4c756fd7fdb5..2b1ff68c2044 100644 --- a/packages/docusaurus/src/server/plugins/pluginsUtils.ts +++ b/packages/docusaurus/src/server/plugins/pluginsUtils.ts @@ -13,6 +13,7 @@ import type { InitializedPlugin, LoadedPlugin, PluginIdentifier, + PluginRouteConfig, RouteConfig, } from '@docusaurus/types'; @@ -49,8 +50,22 @@ export function aggregateAllContent(loadedPlugins: LoadedPlugin[]): AllContent { .value(); } -export function aggregateRoutes(loadedPlugins: LoadedPlugin[]): RouteConfig[] { - return loadedPlugins.flatMap((p) => p.routes); +export function toPluginRoute({ + plugin, + route, +}: { + plugin: LoadedPlugin; + route: RouteConfig; +}): PluginRouteConfig { + return {plugin: {name: plugin.name, id: plugin.options.id}, ...route}; +} + +export function aggregateRoutes( + loadedPlugins: LoadedPlugin[], +): PluginRouteConfig[] { + return loadedPlugins.flatMap((plugin) => + plugin.routes.map((route) => toPluginRoute({plugin, route})), + ); } export function aggregateGlobalData(loadedPlugins: LoadedPlugin[]): GlobalData { diff --git a/packages/docusaurus/src/server/plugins/routeConfig.ts b/packages/docusaurus/src/server/plugins/routeConfig.ts index cd824f1f4ba6..6e0891bfd2de 100644 --- a/packages/docusaurus/src/server/plugins/routeConfig.ts +++ b/packages/docusaurus/src/server/plugins/routeConfig.ts @@ -12,10 +12,10 @@ import { import type {RouteConfig} from '@docusaurus/types'; /** Recursively applies trailing slash config to all nested routes. */ -export function applyRouteTrailingSlash( - route: RouteConfig, +export function applyRouteTrailingSlash( + route: Route, params: ApplyTrailingSlashParams, -): RouteConfig { +): Route { return { ...route, path: applyTrailingSlash(route.path, params), From 6cd53b2a4e475273a58e1570780e7eb1951da921 Mon Sep 17 00:00:00 2001 From: sebastien Date: Fri, 12 Apr 2024 18:14:46 +0200 Subject: [PATCH 02/25] add useful comments --- packages/docusaurus/src/server/plugins/actions.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/docusaurus/src/server/plugins/actions.ts b/packages/docusaurus/src/server/plugins/actions.ts index d9313cb4cccd..99dd7526d3ec 100644 --- a/packages/docusaurus/src/server/plugins/actions.ts +++ b/packages/docusaurus/src/server/plugins/actions.ts @@ -38,6 +38,9 @@ export async function createPluginActionsUtils({ }): Promise { const pluginId = plugin.options.id; // Plugins data files are namespaced by pluginName/pluginId + + // TODO use @generated data dir here! + // The module registry should not contain absolute paths const dataDir = path.join(generatedFilesDir, plugin.name, pluginId); const pluginRouteContext: PluginRouteContext['plugin'] = { @@ -49,6 +52,7 @@ export async function createPluginActionsUtils({ `${docuHash('pluginRouteContextModule')}.json`, ); // TODO not ideal place to generate that file + // move to codegen step instead! await generate( '/', pluginRouteContextModulePath, From 434e1d9cb9cec970b59fe77faf6fec6c647c34b5 Mon Sep 17 00:00:00 2001 From: sebastien Date: Fri, 12 Apr 2024 18:15:12 +0200 Subject: [PATCH 03/25] use aliased module prop name --- .../src/server/codegen/codegenRoutes.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/docusaurus/src/server/codegen/codegenRoutes.ts b/packages/docusaurus/src/server/codegen/codegenRoutes.ts index 752e2b601f83..1122005908ec 100644 --- a/packages/docusaurus/src/server/codegen/codegenRoutes.ts +++ b/packages/docusaurus/src/server/codegen/codegenRoutes.ts @@ -330,20 +330,20 @@ async function generateRoutePropModule({ }) { ensureNoPropsConflict(route); - const propModulePath = path.join( - generatedFilesDir, + // TODO we should aim to reduce this path length + // This adds bytes to the global module registry + + const relativePath = path.join( plugin.name, plugin.id, 'p', `${route.path}.json`, ); + const modulePath = path.join(generatedFilesDir, relativePath); + const aliasedPath = path.join('@generated', relativePath); - await generate( - generatedFilesDir, - propModulePath, - JSON.stringify(route.props), - ); - return propModulePath; + await generate(generatedFilesDir, modulePath, JSON.stringify(route.props)); + return aliasedPath; } function ensureNoPropsConflict(route: RouteConfig) { From 4f91166f8fcd63ad923569d71f9e47dc566eb74d Mon Sep 17 00:00:00 2001 From: sebastien Date: Fri, 12 Apr 2024 18:16:23 +0200 Subject: [PATCH 04/25] update snapshots --- .../server/plugins/__tests__/plugins.test.ts | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/packages/docusaurus/src/server/plugins/__tests__/plugins.test.ts b/packages/docusaurus/src/server/plugins/__tests__/plugins.test.ts index 3a5c65234a00..7595869919fc 100644 --- a/packages/docusaurus/src/server/plugins/__tests__/plugins.test.ts +++ b/packages/docusaurus/src/server/plugins/__tests__/plugins.test.ts @@ -125,6 +125,10 @@ describe('loadPlugins', () => { "someModule": "someModulePath", }, "path": "/foo/", + "plugin": { + "id": "default", + "name": "plugin-name", + }, }, ] `); @@ -183,6 +187,10 @@ describe('loadPlugins', () => { "plugin": "/packages/docusaurus/src/server/plugins/__tests__/__fixtures__/site-with-plugin/.docusaurus/plugin-name/plugin-id/plugin-route-context-module-100.json", }, "path": "/foo/", + "plugin": { + "id": "plugin-id", + "name": "plugin-name", + }, }, ] `); @@ -278,6 +286,10 @@ describe('loadPlugins', () => { "plugin": "/packages/docusaurus/src/server/plugins/__tests__/__fixtures__/site-with-plugin/.docusaurus/plugin-name/default/plugin-route-context-module-100.json", }, "path": "/allContentLoadedRouteSingle/", + "plugin": { + "id": "default", + "name": "plugin-name", + }, }, { "component": "Comp", @@ -285,6 +297,10 @@ describe('loadPlugins', () => { "plugin": "/packages/docusaurus/src/server/plugins/__tests__/__fixtures__/site-with-plugin/.docusaurus/plugin-name/default/plugin-route-context-module-100.json", }, "path": "/contentLoadedRouteSingle/", + "plugin": { + "id": "default", + "name": "plugin-name", + }, }, { "component": "Comp", @@ -292,6 +308,10 @@ describe('loadPlugins', () => { "plugin": "/packages/docusaurus/src/server/plugins/__tests__/__fixtures__/site-with-plugin/.docusaurus/plugin-name/default/plugin-route-context-module-100.json", }, "path": "/allContentLoadedRouteParent/", + "plugin": { + "id": "default", + "name": "plugin-name", + }, "routes": [ { "component": "Comp", @@ -305,6 +325,10 @@ describe('loadPlugins', () => { "plugin": "/packages/docusaurus/src/server/plugins/__tests__/__fixtures__/site-with-plugin/.docusaurus/plugin-name/default/plugin-route-context-module-100.json", }, "path": "/contentLoadedRouteParent/", + "plugin": { + "id": "default", + "name": "plugin-name", + }, "routes": [ { "component": "Comp", @@ -389,6 +413,10 @@ describe('reloadPlugin', () => { "plugin": "/packages/docusaurus/src/server/plugins/__tests__/__fixtures__/site-with-plugin/.docusaurus/plugin-name/default/plugin-route-context-module-100.json", }, "path": "/allContentLoadedRouteSingle/", + "plugin": { + "id": "default", + "name": "plugin-name", + }, }, { "component": "Comp", @@ -396,6 +424,10 @@ describe('reloadPlugin', () => { "plugin": "/packages/docusaurus/src/server/plugins/__tests__/__fixtures__/site-with-plugin/.docusaurus/plugin-name/default/plugin-route-context-module-100.json", }, "path": "/contentLoadedRouteSingle/", + "plugin": { + "id": "default", + "name": "plugin-name", + }, }, { "component": "Comp", @@ -403,6 +435,10 @@ describe('reloadPlugin', () => { "plugin": "/packages/docusaurus/src/server/plugins/__tests__/__fixtures__/site-with-plugin/.docusaurus/plugin-name/default/plugin-route-context-module-100.json", }, "path": "/allContentLoadedRouteParent/", + "plugin": { + "id": "default", + "name": "plugin-name", + }, "routes": [ { "component": "Comp", @@ -416,6 +452,10 @@ describe('reloadPlugin', () => { "plugin": "/packages/docusaurus/src/server/plugins/__tests__/__fixtures__/site-with-plugin/.docusaurus/plugin-name/default/plugin-route-context-module-100.json", }, "path": "/contentLoadedRouteParent/", + "plugin": { + "id": "default", + "name": "plugin-name", + }, "routes": [ { "component": "Comp", @@ -505,6 +545,10 @@ describe('reloadPlugin', () => { "plugin": "/packages/docusaurus/src/server/plugins/__tests__/__fixtures__/site-with-plugin/.docusaurus/plugin-name-1/default/plugin-route-context-module-100.json", }, "path": "/allContentLoaded-route-initial/", + "plugin": { + "id": "default", + "name": "plugin-name-1", + }, }, { "component": "Comp", @@ -512,6 +556,10 @@ describe('reloadPlugin', () => { "plugin": "/packages/docusaurus/src/server/plugins/__tests__/__fixtures__/site-with-plugin/.docusaurus/plugin-name-1/default/plugin-route-context-module-100.json", }, "path": "/contentLoaded-route-initial/", + "plugin": { + "id": "default", + "name": "plugin-name-1", + }, }, { "component": "Comp", @@ -519,6 +567,10 @@ describe('reloadPlugin', () => { "plugin": "/packages/docusaurus/src/server/plugins/__tests__/__fixtures__/site-with-plugin/.docusaurus/plugin-name-2/default/plugin-route-context-module-100.json", }, "path": "/plugin-2-route/", + "plugin": { + "id": "default", + "name": "plugin-name-2", + }, }, ] `); @@ -545,6 +597,10 @@ describe('reloadPlugin', () => { "plugin": "/packages/docusaurus/src/server/plugins/__tests__/__fixtures__/site-with-plugin/.docusaurus/plugin-name-1/default/plugin-route-context-module-100.json", }, "path": "/allContentLoaded-route-reload/", + "plugin": { + "id": "default", + "name": "plugin-name-1", + }, }, { "component": "Comp", @@ -552,6 +608,10 @@ describe('reloadPlugin', () => { "plugin": "/packages/docusaurus/src/server/plugins/__tests__/__fixtures__/site-with-plugin/.docusaurus/plugin-name-1/default/plugin-route-context-module-100.json", }, "path": "/contentLoaded-route-reload/", + "plugin": { + "id": "default", + "name": "plugin-name-1", + }, }, { "component": "Comp", @@ -559,6 +619,10 @@ describe('reloadPlugin', () => { "plugin": "/packages/docusaurus/src/server/plugins/__tests__/__fixtures__/site-with-plugin/.docusaurus/plugin-name-2/default/plugin-route-context-module-100.json", }, "path": "/plugin-2-route/", + "plugin": { + "id": "default", + "name": "plugin-name-2", + }, }, ] `); From a9de0d08635ca03df379e56edce1178460697f04 Mon Sep 17 00:00:00 2001 From: sebastien Date: Fri, 12 Apr 2024 18:32:13 +0200 Subject: [PATCH 05/25] remove log --- packages/docusaurus/src/client/exports/ComponentCreator.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/docusaurus/src/client/exports/ComponentCreator.tsx b/packages/docusaurus/src/client/exports/ComponentCreator.tsx index cd6f046e3549..34b257877c77 100644 --- a/packages/docusaurus/src/client/exports/ComponentCreator.tsx +++ b/packages/docusaurus/src/client/exports/ComponentCreator.tsx @@ -88,7 +88,6 @@ export default function ComponentCreator( __props?: {[propName: string]: unknown}; [attributeName: string]: unknown; }; - console.log({loadedModules}); Object.entries(loaded).forEach(([keyPath, loadedModule]) => { // JSON modules are also loaded as `{ default: ... }` (`import()` // semantics) but we just want to pass the actual value to props. From 0b79ec84e19f8b97a75c88d637926f4c81a2e087 Mon Sep 17 00:00:00 2001 From: sebastien Date: Fri, 12 Apr 2024 18:32:30 +0200 Subject: [PATCH 06/25] convert more blog routes to use route props --- .../src/index.ts | 38 ++++++------------- 1 file changed, 12 insertions(+), 26 deletions(-) diff --git a/packages/docusaurus-plugin-content-blog/src/index.ts b/packages/docusaurus-plugin-content-blog/src/index.ts index ea0af7dcd7ea..156d5d8aa3b4 100644 --- a/packages/docusaurus-plugin-content-blog/src/index.ts +++ b/packages/docusaurus-plugin-content-blog/src/index.ts @@ -312,11 +312,6 @@ export default async function pluginContentBlog( blogListPaginated.map(async (listPage) => { const {metadata, items} = listPage; const {permalink} = metadata; - const pageMetadataPath = await createData( - `${docuHash(permalink)}.json`, - JSON.stringify(metadata, null, 2), - ); - addRoute({ path: permalink, component: blogListComponent, @@ -324,7 +319,9 @@ export default async function pluginContentBlog( modules: { sidebar: aliasedSource(sidebarProp), items: blogPostItemsModule(items), - metadata: aliasedSource(pageMetadataPath), + }, + props: { + metadata, }, }); }), @@ -336,17 +333,15 @@ export default async function pluginContentBlog( } async function createTagsListPage() { - const tagsPropPath = await createData( - `${docuHash(`${blogTagsListPath}-tags`)}.json`, - JSON.stringify(toTagsProp({blogTags}), null, 2), - ); addRoute({ path: blogTagsListPath, component: blogTagsListComponent, exact: true, modules: { sidebar: aliasedSource(sidebarProp), - tags: aliasedSource(tagsPropPath), + }, + props: { + tags: toTagsProp({blogTags}), }, }); } @@ -354,26 +349,17 @@ export default async function pluginContentBlog( async function createTagPostsListPage(tag: BlogTag): Promise { await Promise.all( tag.pages.map(async (blogPaginated) => { - const {metadata, items} = blogPaginated; - const tagPropPath = await createData( - `${docuHash(metadata.permalink)}.json`, - JSON.stringify(toTagProp({tag, blogTagsListPath}), null, 2), - ); - - const listMetadataPath = await createData( - `${docuHash(metadata.permalink)}-list.json`, - JSON.stringify(metadata, null, 2), - ); - addRoute({ - path: metadata.permalink, + path: blogPaginated.metadata.permalink, component: blogTagsPostsComponent, exact: true, modules: { sidebar: aliasedSource(sidebarProp), - items: blogPostItemsModule(items), - tag: aliasedSource(tagPropPath), - listMetadata: aliasedSource(listMetadataPath), + items: blogPostItemsModule(blogPaginated.items), + }, + props: { + tag: toTagProp({tag, blogTagsListPath}), + listMetadata: blogPaginated.metadata, }, }); }), From 76097374dea8eb5938ef4a2363518eef2836ce83 Mon Sep 17 00:00:00 2001 From: slorber Date: Fri, 12 Apr 2024 16:45:45 +0000 Subject: [PATCH 07/25] refactor: apply lint autofix --- project-words.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/project-words.txt b/project-words.txt index 4338cda1e9d0..a8d6f78c1382 100644 --- a/project-words.txt +++ b/project-words.txt @@ -224,6 +224,7 @@ opensearch opensearchdescription opensource optimizt +Orama orama Orta orta From 598cdeb656636013a993ef322e12b66851bdcd92 Mon Sep 17 00:00:00 2001 From: sebastien Date: Fri, 12 Apr 2024 20:12:19 +0200 Subject: [PATCH 08/25] refactor/simplify blog post routes --- .../src/index.ts | 203 +------------- .../src/routes.ts | 262 ++++++++++++++++++ 2 files changed, 272 insertions(+), 193 deletions(-) create mode 100644 packages/docusaurus-plugin-content-blog/src/routes.ts diff --git a/packages/docusaurus-plugin-content-blog/src/index.ts b/packages/docusaurus-plugin-content-blog/src/index.ts index 156d5d8aa3b4..2a2897cf7062 100644 --- a/packages/docusaurus-plugin-content-blog/src/index.ts +++ b/packages/docusaurus-plugin-content-blog/src/index.ts @@ -11,7 +11,6 @@ import { normalizeUrl, docuHash, aliasedSitePath, - aliasedSitePathToRelativePath, getPluginI18nPath, posixPath, addTrailingPathSeparator, @@ -32,24 +31,17 @@ import footnoteIDFixer from './remark/footnoteIDFixer'; import {translateContent, getTranslationFiles} from './translations'; import {createBlogFeedFiles} from './feed'; -import {toTagProp, toTagsProp} from './props'; +import {createAllRoutes} from './routes'; import type {BlogContentPaths, BlogMarkdownLoaderOptions} from './types'; -import type { - LoadContext, - Plugin, - HtmlTags, - RouteMetadata, -} from '@docusaurus/types'; +import type {LoadContext, Plugin, HtmlTags} from '@docusaurus/types'; import type { PluginOptions, BlogPostFrontMatter, BlogPostMetadata, Assets, - BlogTag, BlogTags, BlogContent, BlogPaginated, - BlogMetadata, } from '@docusaurus/plugin-content-blog'; export default async function pluginContentBlog( @@ -185,189 +177,14 @@ export default async function pluginContentBlog( }; }, - async contentLoaded({content: blogContents, actions}) { - const { - blogListComponent, - blogPostComponent, - blogTagsListComponent, - blogTagsPostsComponent, - blogArchiveComponent, - routeBasePath, - archiveBasePath, - blogTitle, - } = options; - - const {addRoute, createData} = actions; - const { - blogSidebarTitle, - blogPosts, - blogListPaginated, - blogTags, - blogTagsListPath, - } = blogContents; - - const listedBlogPosts = blogPosts.filter(shouldBeListed); - - const blogItemsToMetadata: {[postId: string]: BlogPostMetadata} = {}; - - const sidebarBlogPosts = - options.blogSidebarCount === 'ALL' - ? blogPosts - : blogPosts.slice(0, options.blogSidebarCount); - - function blogPostItemsModule(items: string[]) { - return items.map((postId) => { - const blogPostMetadata = blogItemsToMetadata[postId]!; - return { - content: { - __import: true, - path: blogPostMetadata.source, - query: { - truncated: true, - }, - }, - }; - }); - } - - if (archiveBasePath && listedBlogPosts.length) { - addRoute({ - path: normalizeUrl([baseUrl, routeBasePath, archiveBasePath]), - component: blogArchiveComponent, - exact: true, - props: { - archive: {blogPosts: listedBlogPosts}, - }, - }); - } - - // This prop is useful to provide the blog list sidebar - const sidebarProp = await createData( - // Note that this created data path must be in sync with - // metadataPath provided to mdx-loader. - `blog-post-list-prop-${pluginId}.json`, - JSON.stringify( - { - title: blogSidebarTitle, - items: sidebarBlogPosts.map((blogPost) => ({ - title: blogPost.metadata.title, - permalink: blogPost.metadata.permalink, - unlisted: blogPost.metadata.unlisted, - })), - }, - null, - 2, - ), - ); - - const blogMetadata: BlogMetadata = { - blogBasePath: normalizeUrl([baseUrl, routeBasePath]), - blogTitle, - }; - const blogMetadataPath = await createData( - `blogMetadata-${pluginId}.json`, - JSON.stringify(blogMetadata, null, 2), - ); - - function createBlogPostRouteMetadata( - blogPostMeta: BlogPostMetadata, - ): RouteMetadata { - return { - sourceFilePath: aliasedSitePathToRelativePath(blogPostMeta.source), - lastUpdatedAt: blogPostMeta.lastUpdatedAt, - }; - } - - // Create routes for blog entries. - await Promise.all( - blogPosts.map(async (blogPost) => { - const {id, metadata} = blogPost; - await createData( - // Note that this created data path must be in sync with - // metadataPath provided to mdx-loader. - `${docuHash(metadata.source)}.json`, - JSON.stringify(metadata, null, 2), - ); - - addRoute({ - path: metadata.permalink, - component: blogPostComponent, - exact: true, - modules: { - sidebar: aliasedSource(sidebarProp), - content: metadata.source, - }, - metadata: createBlogPostRouteMetadata(metadata), - context: { - blogMetadata: aliasedSource(blogMetadataPath), - }, - }); - - blogItemsToMetadata[id] = metadata; - }), - ); - - // Create routes for blog's paginated list entries. - await Promise.all( - blogListPaginated.map(async (listPage) => { - const {metadata, items} = listPage; - const {permalink} = metadata; - addRoute({ - path: permalink, - component: blogListComponent, - exact: true, - modules: { - sidebar: aliasedSource(sidebarProp), - items: blogPostItemsModule(items), - }, - props: { - metadata, - }, - }); - }), - ); - - // Tags. This is the last part so we early-return if there are no tags. - if (Object.keys(blogTags).length === 0) { - return; - } - - async function createTagsListPage() { - addRoute({ - path: blogTagsListPath, - component: blogTagsListComponent, - exact: true, - modules: { - sidebar: aliasedSource(sidebarProp), - }, - props: { - tags: toTagsProp({blogTags}), - }, - }); - } - - async function createTagPostsListPage(tag: BlogTag): Promise { - await Promise.all( - tag.pages.map(async (blogPaginated) => { - addRoute({ - path: blogPaginated.metadata.permalink, - component: blogTagsPostsComponent, - exact: true, - modules: { - sidebar: aliasedSource(sidebarProp), - items: blogPostItemsModule(blogPaginated.items), - }, - props: { - tag: toTagProp({tag, blogTagsListPath}), - listMetadata: blogPaginated.metadata, - }, - }); - }), - ); - } - - await createTagsListPage(); - await Promise.all(Object.values(blogTags).map(createTagPostsListPage)); + async contentLoaded({content, actions}) { + await createAllRoutes({ + baseUrl, + content, + actions, + options, + aliasedSource, + }); }, translateContent({content, translationFiles}) { diff --git a/packages/docusaurus-plugin-content-blog/src/routes.ts b/packages/docusaurus-plugin-content-blog/src/routes.ts new file mode 100644 index 000000000000..0df401a53801 --- /dev/null +++ b/packages/docusaurus-plugin-content-blog/src/routes.ts @@ -0,0 +1,262 @@ +/** + * 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 _ from 'lodash'; +import { + normalizeUrl, + docuHash, + aliasedSitePathToRelativePath, +} from '@docusaurus/utils'; +import {shouldBeListed} from './blogUtils'; + +import {toTagProp, toTagsProp} from './props'; +import type { + PluginContentLoadedActions, + RouteConfig, + RouteMetadata, +} from '@docusaurus/types'; +import type { + BlogPostMetadata, + BlogTag, + BlogMetadata, + BlogContent, + PluginOptions, + BlogPost, +} from '@docusaurus/plugin-content-blog'; + +type CreateAllRoutesParam = { + baseUrl: string; + content: BlogContent; + options: PluginOptions; + actions: PluginContentLoadedActions; + aliasedSource: (str: string) => string; +}; + +export async function createAllRoutes( + param: CreateAllRoutesParam, +): Promise { + const routes = await buildAllRoutes(param); + routes.forEach(param.actions.addRoute); +} + +export async function buildAllRoutes({ + baseUrl, + content, + actions, + options, + aliasedSource, +}: CreateAllRoutesParam): Promise { + const { + blogListComponent, + blogPostComponent, + blogTagsListComponent, + blogTagsPostsComponent, + blogArchiveComponent, + routeBasePath, + archiveBasePath, + blogTitle, + } = options; + const pluginId = options.id!; + const {createData} = actions; + const { + blogSidebarTitle, + blogPosts, + blogListPaginated, + blogTags, + blogTagsListPath, + } = content; + + const listedBlogPosts = blogPosts.filter(shouldBeListed); + + const blogPostsById = _.keyBy(blogPosts, (post) => post.id); + function getBlogPostById(id: string): BlogPost { + const blogPost = blogPostsById[id]; + if (!blogPost) { + throw new Error(`unexpected, can't find blog post id=${id}`); + } + return blogPost; + } + + const sidebarBlogPosts = + options.blogSidebarCount === 'ALL' + ? blogPosts + : blogPosts.slice(0, options.blogSidebarCount); + + async function createSidebarModule() { + const modulePath = await createData( + // Note that this created data path must be in sync with + // metadataPath provided to mdx-loader. + `blog-post-list-prop-${pluginId}.json`, + JSON.stringify( + { + title: blogSidebarTitle, + items: sidebarBlogPosts.map((blogPost) => ({ + title: blogPost.metadata.title, + permalink: blogPost.metadata.permalink, + unlisted: blogPost.metadata.unlisted, + })), + }, + null, + 2, + ), + ); + return aliasedSource(modulePath); + } + + async function createBlogMetadataModule() { + const blogMetadata: BlogMetadata = { + blogBasePath: normalizeUrl([baseUrl, routeBasePath]), + blogTitle, + }; + const modulePath = await createData( + `blogMetadata-${pluginId}.json`, + JSON.stringify(blogMetadata, null, 2), + ); + return aliasedSource(modulePath); + } + + const sidebarModulePath = await createSidebarModule(); + const blogMetadataModulePath = await createBlogMetadataModule(); + + function blogPostItemsModule(ids: string[]) { + return ids.map((id) => { + return { + content: { + __import: true, + path: getBlogPostById(id).metadata.source, + query: { + truncated: true, + }, + }, + }; + }); + } + + function createArchiveRoute(): RouteConfig[] { + if (archiveBasePath && listedBlogPosts.length) { + return [ + { + path: normalizeUrl([baseUrl, routeBasePath, archiveBasePath]), + component: blogArchiveComponent, + exact: true, + props: { + archive: {blogPosts: listedBlogPosts}, + }, + }, + ]; + } + return []; + } + + function createBlogPostRouteMetadata( + blogPostMeta: BlogPostMetadata, + ): RouteMetadata { + return { + sourceFilePath: aliasedSitePathToRelativePath(blogPostMeta.source), + lastUpdatedAt: blogPostMeta.lastUpdatedAt, + }; + } + + await Promise.all( + blogPosts.map(async (blogPost) => { + const {metadata} = blogPost; + await createData( + // Note that this created data path must be in sync with + // metadataPath provided to mdx-loader. + `${docuHash(metadata.source)}.json`, + JSON.stringify(metadata, null, 2), + ); + }), + ); + + function createBlogPostRoute(blogPost: BlogPost): RouteConfig { + return { + path: blogPost.metadata.permalink, + component: blogPostComponent, + exact: true, + modules: { + sidebar: sidebarModulePath, + content: blogPost.metadata.source, + }, + metadata: createBlogPostRouteMetadata(blogPost.metadata), + context: { + blogMetadata: blogMetadataModulePath, + }, + }; + } + + function createBlogPostRoutes(): RouteConfig[] { + return blogPosts.map(createBlogPostRoute); + } + + function createBlogPostsPaginatedRoutes(): RouteConfig[] { + return blogListPaginated.map((paginated) => { + return { + path: paginated.metadata.permalink, + component: blogListComponent, + exact: true, + modules: { + sidebar: sidebarModulePath, + items: blogPostItemsModule(paginated.items), + }, + props: { + metadata: paginated.metadata, + }, + }; + }); + } + + function createTagsRoutes(): RouteConfig[] { + // Tags. This is the last part so we early-return if there are no tags. + if (Object.keys(blogTags).length === 0) { + return []; + } + + const tagsListRoute: RouteConfig = { + path: blogTagsListPath, + component: blogTagsListComponent, + exact: true, + modules: { + sidebar: sidebarModulePath, + }, + props: { + tags: toTagsProp({blogTags}), + }, + }; + + function createTagPaginatedRoutes(tag: BlogTag): RouteConfig[] { + return tag.pages.map((paginated) => { + return { + path: paginated.metadata.permalink, + component: blogTagsPostsComponent, + exact: true, + modules: { + sidebar: sidebarModulePath, + items: blogPostItemsModule(paginated.items), + }, + props: { + tag: toTagProp({tag, blogTagsListPath}), + listMetadata: paginated.metadata, + }, + }; + }); + } + + const tagsPaginatedRoutes: RouteConfig[] = Object.values(blogTags).flatMap( + createTagPaginatedRoutes, + ); + + return [tagsListRoute, ...tagsPaginatedRoutes]; + } + + return [ + ...createBlogPostRoutes(), + ...createBlogPostsPaginatedRoutes(), + ...createTagsRoutes(), + ...createArchiveRoute(), + ]; +} From 73b7999dbd4ffab0fd938b852eb663c5b23b2652 Mon Sep 17 00:00:00 2001 From: sebastien Date: Sat, 13 Apr 2024 00:18:43 +0200 Subject: [PATCH 09/25] fix little codegen bugs --- packages/docusaurus/src/server/codegen/codegenRoutes.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/docusaurus/src/server/codegen/codegenRoutes.ts b/packages/docusaurus/src/server/codegen/codegenRoutes.ts index 1122005908ec..3d247a2b0365 100644 --- a/packages/docusaurus/src/server/codegen/codegenRoutes.ts +++ b/packages/docusaurus/src/server/codegen/codegenRoutes.ts @@ -333,14 +333,14 @@ async function generateRoutePropModule({ // TODO we should aim to reduce this path length // This adds bytes to the global module registry - const relativePath = path.join( + const relativePath = path.posix.join( plugin.name, plugin.id, 'p', `${route.path}.json`, ); - const modulePath = path.join(generatedFilesDir, relativePath); - const aliasedPath = path.join('@generated', relativePath); + const modulePath = path.posix.join(generatedFilesDir, relativePath); + const aliasedPath = path.posix.join('@generated', relativePath); await generate(generatedFilesDir, modulePath, JSON.stringify(route.props)); return aliasedPath; @@ -405,7 +405,8 @@ async function preprocessRouteProps({ ...route.modules, ...(propsModulePath && {__props: propsModulePath}), }, - subRoutes, + routes: subRoutes, + props: undefined, }; return newRoute; From 796cbcb0551e32368a36df6ee981d4acd5ada1a6 Mon Sep 17 00:00:00 2001 From: sebastien Date: Sat, 13 Apr 2024 18:42:16 +0200 Subject: [PATCH 10/25] track more file sizes --- .github/workflows/build-perf.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-perf.yml b/.github/workflows/build-perf.yml index 00dae13f9257..8556205551dc 100644 --- a/.github/workflows/build-perf.yml +++ b/.github/workflows/build-perf.yml @@ -48,7 +48,7 @@ jobs: repo-token: ${{ secrets.GITHUB_TOKEN }} build-script: build:website:en 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/build/index.html,website/build/blog/index.html,website/build/blog/**/introducing-docusaurus/*,website/build/docs/index.html,website/build/docs/installation/index.html,website/build/tests/docs/index.html,website/build/tests/docs/standalone/index.html}' + 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/blog/index.html,website/build/blog/**/introducing-docusaurus/*,website/build/docs/index.html,website/build/docs/installation/index.html,website/build/tests/docs/index.html,website/build/tests/docs/standalone/index.html}' strip-hash: '\.([^;]\w{7})\.' minimum-change-threshold: 30 compression: none From 586e829d74649cef57c754e9b2c2aaa49f2e0f0a Mon Sep 17 00:00:00 2001 From: sebastien Date: Mon, 15 Apr 2024 10:15:25 +0200 Subject: [PATCH 11/25] remove plugins from codegen routes --- packages/docusaurus/src/server/codegen/codegenRoutes.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/docusaurus/src/server/codegen/codegenRoutes.ts b/packages/docusaurus/src/server/codegen/codegenRoutes.ts index 3d247a2b0365..4ae9c6213990 100644 --- a/packages/docusaurus/src/server/codegen/codegenRoutes.ts +++ b/packages/docusaurus/src/server/codegen/codegenRoutes.ts @@ -205,6 +205,7 @@ function genRouteCode(routeConfig: RouteConfig, res: RoutesCode): string { exact, metadata, props, + plugin, ...attributes } = routeConfig; From c489321215ba8ebc4829a70c23b7db5404375ca6 Mon Sep 17 00:00:00 2001 From: sebastien Date: Mon, 15 Apr 2024 19:46:42 +0200 Subject: [PATCH 12/25] ensure all registry paths are using aliased paths --- .../src/index.ts | 3 ++ .../src/index.ts | 3 ++ packages/docusaurus-plugin-debug/src/index.ts | 3 ++ .../server/plugins/__tests__/plugins.test.ts | 32 +++++++++---------- .../docusaurus/src/server/plugins/actions.ts | 17 ++++++---- .../featureRequests/FeatureRequestsPlugin.js | 14 ++++++-- 6 files changed, 48 insertions(+), 24 deletions(-) diff --git a/packages/docusaurus-plugin-content-blog/src/index.ts b/packages/docusaurus-plugin-content-blog/src/index.ts index 2a2897cf7062..673bb373a191 100644 --- a/packages/docusaurus-plugin-content-blog/src/index.ts +++ b/packages/docusaurus-plugin-content-blog/src/index.ts @@ -72,6 +72,9 @@ export default async function pluginContentBlog( 'docusaurus-plugin-content-blog', ); const dataDir = path.join(pluginDataDirRoot, pluginId); + // TODO Docusaurus v4 breaking change + // module aliasing should be automatic + // we should never find local absolute FS paths in the codegen registry const aliasedSource = (source: string) => `~blog/${posixPath(path.relative(pluginDataDirRoot, source))}`; diff --git a/packages/docusaurus-plugin-content-docs/src/index.ts b/packages/docusaurus-plugin-content-docs/src/index.ts index 4cb98605953a..18e43a7f6540 100644 --- a/packages/docusaurus-plugin-content-docs/src/index.ts +++ b/packages/docusaurus-plugin-content-docs/src/index.ts @@ -73,6 +73,9 @@ export default async function pluginContentDocs( 'docusaurus-plugin-content-docs', ); const dataDir = path.join(pluginDataDirRoot, pluginId); + // TODO Docusaurus v4 breaking change + // module aliasing should be automatic + // we should never find local absolute FS paths in the codegen registry const aliasedSource = (source: string) => `~docs/${posixPath(path.relative(pluginDataDirRoot, source))}`; diff --git a/packages/docusaurus-plugin-debug/src/index.ts b/packages/docusaurus-plugin-debug/src/index.ts index cd27ebc549ee..66bc30774764 100644 --- a/packages/docusaurus-plugin-debug/src/index.ts +++ b/packages/docusaurus-plugin-debug/src/index.ts @@ -17,6 +17,9 @@ export default function pluginDebug({ generatedFilesDir, 'docusaurus-plugin-debug', ); + // TODO Docusaurus v4 breaking change + // module aliasing should be automatic + // we should never find local absolute FS paths in the codegen registry const aliasedSource = (source: string) => `~debug/${posixPath(path.relative(pluginDataDirRoot, source))}`; diff --git a/packages/docusaurus/src/server/plugins/__tests__/plugins.test.ts b/packages/docusaurus/src/server/plugins/__tests__/plugins.test.ts index 7595869919fc..1ec86de26f2f 100644 --- a/packages/docusaurus/src/server/plugins/__tests__/plugins.test.ts +++ b/packages/docusaurus/src/server/plugins/__tests__/plugins.test.ts @@ -119,7 +119,7 @@ describe('loadPlugins', () => { "data": { "someContext": "someContextPath", }, - "plugin": "/packages/docusaurus/src/server/plugins/__tests__/__fixtures__/site-with-plugin/.docusaurus/plugin-name/default/plugin-route-context-module-100.json", + "plugin": "@generated/plugin-name/default/__plugin.json", }, "modules": { "someModule": "someModulePath", @@ -184,7 +184,7 @@ describe('loadPlugins', () => { { "component": "Comp", "context": { - "plugin": "/packages/docusaurus/src/server/plugins/__tests__/__fixtures__/site-with-plugin/.docusaurus/plugin-name/plugin-id/plugin-route-context-module-100.json", + "plugin": "@generated/plugin-name/plugin-id/__plugin.json", }, "path": "/foo/", "plugin": { @@ -283,7 +283,7 @@ describe('loadPlugins', () => { { "component": "Comp", "context": { - "plugin": "/packages/docusaurus/src/server/plugins/__tests__/__fixtures__/site-with-plugin/.docusaurus/plugin-name/default/plugin-route-context-module-100.json", + "plugin": "@generated/plugin-name/default/__plugin.json", }, "path": "/allContentLoadedRouteSingle/", "plugin": { @@ -294,7 +294,7 @@ describe('loadPlugins', () => { { "component": "Comp", "context": { - "plugin": "/packages/docusaurus/src/server/plugins/__tests__/__fixtures__/site-with-plugin/.docusaurus/plugin-name/default/plugin-route-context-module-100.json", + "plugin": "@generated/plugin-name/default/__plugin.json", }, "path": "/contentLoadedRouteSingle/", "plugin": { @@ -305,7 +305,7 @@ describe('loadPlugins', () => { { "component": "Comp", "context": { - "plugin": "/packages/docusaurus/src/server/plugins/__tests__/__fixtures__/site-with-plugin/.docusaurus/plugin-name/default/plugin-route-context-module-100.json", + "plugin": "@generated/plugin-name/default/__plugin.json", }, "path": "/allContentLoadedRouteParent/", "plugin": { @@ -322,7 +322,7 @@ describe('loadPlugins', () => { { "component": "Comp", "context": { - "plugin": "/packages/docusaurus/src/server/plugins/__tests__/__fixtures__/site-with-plugin/.docusaurus/plugin-name/default/plugin-route-context-module-100.json", + "plugin": "@generated/plugin-name/default/__plugin.json", }, "path": "/contentLoadedRouteParent/", "plugin": { @@ -410,7 +410,7 @@ describe('reloadPlugin', () => { { "component": "Comp", "context": { - "plugin": "/packages/docusaurus/src/server/plugins/__tests__/__fixtures__/site-with-plugin/.docusaurus/plugin-name/default/plugin-route-context-module-100.json", + "plugin": "@generated/plugin-name/default/__plugin.json", }, "path": "/allContentLoadedRouteSingle/", "plugin": { @@ -421,7 +421,7 @@ describe('reloadPlugin', () => { { "component": "Comp", "context": { - "plugin": "/packages/docusaurus/src/server/plugins/__tests__/__fixtures__/site-with-plugin/.docusaurus/plugin-name/default/plugin-route-context-module-100.json", + "plugin": "@generated/plugin-name/default/__plugin.json", }, "path": "/contentLoadedRouteSingle/", "plugin": { @@ -432,7 +432,7 @@ describe('reloadPlugin', () => { { "component": "Comp", "context": { - "plugin": "/packages/docusaurus/src/server/plugins/__tests__/__fixtures__/site-with-plugin/.docusaurus/plugin-name/default/plugin-route-context-module-100.json", + "plugin": "@generated/plugin-name/default/__plugin.json", }, "path": "/allContentLoadedRouteParent/", "plugin": { @@ -449,7 +449,7 @@ describe('reloadPlugin', () => { { "component": "Comp", "context": { - "plugin": "/packages/docusaurus/src/server/plugins/__tests__/__fixtures__/site-with-plugin/.docusaurus/plugin-name/default/plugin-route-context-module-100.json", + "plugin": "@generated/plugin-name/default/__plugin.json", }, "path": "/contentLoadedRouteParent/", "plugin": { @@ -542,7 +542,7 @@ describe('reloadPlugin', () => { { "component": "Comp", "context": { - "plugin": "/packages/docusaurus/src/server/plugins/__tests__/__fixtures__/site-with-plugin/.docusaurus/plugin-name-1/default/plugin-route-context-module-100.json", + "plugin": "@generated/plugin-name-1/default/__plugin.json", }, "path": "/allContentLoaded-route-initial/", "plugin": { @@ -553,7 +553,7 @@ describe('reloadPlugin', () => { { "component": "Comp", "context": { - "plugin": "/packages/docusaurus/src/server/plugins/__tests__/__fixtures__/site-with-plugin/.docusaurus/plugin-name-1/default/plugin-route-context-module-100.json", + "plugin": "@generated/plugin-name-1/default/__plugin.json", }, "path": "/contentLoaded-route-initial/", "plugin": { @@ -564,7 +564,7 @@ describe('reloadPlugin', () => { { "component": "Comp", "context": { - "plugin": "/packages/docusaurus/src/server/plugins/__tests__/__fixtures__/site-with-plugin/.docusaurus/plugin-name-2/default/plugin-route-context-module-100.json", + "plugin": "@generated/plugin-name-2/default/__plugin.json", }, "path": "/plugin-2-route/", "plugin": { @@ -594,7 +594,7 @@ describe('reloadPlugin', () => { { "component": "Comp", "context": { - "plugin": "/packages/docusaurus/src/server/plugins/__tests__/__fixtures__/site-with-plugin/.docusaurus/plugin-name-1/default/plugin-route-context-module-100.json", + "plugin": "@generated/plugin-name-1/default/__plugin.json", }, "path": "/allContentLoaded-route-reload/", "plugin": { @@ -605,7 +605,7 @@ describe('reloadPlugin', () => { { "component": "Comp", "context": { - "plugin": "/packages/docusaurus/src/server/plugins/__tests__/__fixtures__/site-with-plugin/.docusaurus/plugin-name-1/default/plugin-route-context-module-100.json", + "plugin": "@generated/plugin-name-1/default/__plugin.json", }, "path": "/contentLoaded-route-reload/", "plugin": { @@ -616,7 +616,7 @@ describe('reloadPlugin', () => { { "component": "Comp", "context": { - "plugin": "/packages/docusaurus/src/server/plugins/__tests__/__fixtures__/site-with-plugin/.docusaurus/plugin-name-2/default/plugin-route-context-module-100.json", + "plugin": "@generated/plugin-name-2/default/__plugin.json", }, "path": "/plugin-2-route/", "plugin": { diff --git a/packages/docusaurus/src/server/plugins/actions.ts b/packages/docusaurus/src/server/plugins/actions.ts index 99dd7526d3ec..47633697e1ea 100644 --- a/packages/docusaurus/src/server/plugins/actions.ts +++ b/packages/docusaurus/src/server/plugins/actions.ts @@ -6,7 +6,7 @@ */ import path from 'path'; -import {docuHash, generate} from '@docusaurus/utils'; +import {generate, posixPath} from '@docusaurus/utils'; import {applyRouteTrailingSlash} from './routeConfig'; import type { InitializedPlugin, @@ -39,6 +39,12 @@ export async function createPluginActionsUtils({ const pluginId = plugin.options.id; // Plugins data files are namespaced by pluginName/pluginId + // TODO Docusaurus v4 breaking change + // module aliasing should be automatic + // we should never find local absolute FS paths in the codegen registry + const aliasedSource = (source: string) => + `@generated/${posixPath(path.relative(generatedFilesDir, source))}`; + // TODO use @generated data dir here! // The module registry should not contain absolute paths const dataDir = path.join(generatedFilesDir, plugin.name, pluginId); @@ -47,10 +53,9 @@ export async function createPluginActionsUtils({ name: plugin.name, id: pluginId, }; - const pluginRouteContextModulePath = path.join( - dataDir, - `${docuHash('pluginRouteContextModule')}.json`, - ); + + const pluginRouteContextModulePath = path.join(dataDir, `__plugin.json`); + // TODO not ideal place to generate that file // move to codegen step instead! await generate( @@ -73,7 +78,7 @@ export async function createPluginActionsUtils({ ...finalRouteConfig, context: { ...(finalRouteConfig.context && {data: finalRouteConfig.context}), - plugin: pluginRouteContextModulePath, + plugin: aliasedSource(pluginRouteContextModulePath), }, }); }, diff --git a/website/src/plugins/featureRequests/FeatureRequestsPlugin.js b/website/src/plugins/featureRequests/FeatureRequestsPlugin.js index c4ba402df521..5031dca77544 100644 --- a/website/src/plugins/featureRequests/FeatureRequestsPlugin.js +++ b/website/src/plugins/featureRequests/FeatureRequestsPlugin.js @@ -5,7 +5,8 @@ * LICENSE file in the root directory of this source tree. */ -import {normalizeUrl} from '@docusaurus/utils'; +import path from 'path'; +import {normalizeUrl, posixPath} from '@docusaurus/utils'; /** * @param {import('@docusaurus/types').LoadContext} context @@ -20,12 +21,21 @@ export default function FeatureRequestsPlugin(context) { 'paths.json', JSON.stringify(basePath), ); + + // TODO Docusaurus v4 breaking change + // module aliasing should be automatic + // we should never find local absolute FS paths in the codegen registry + const aliasedSource = (source) => + `@generated/${posixPath( + path.relative(context.generatedFilesDir, source), + )}`; + actions.addRoute({ path: basePath, exact: false, component: '@site/src/plugins/featureRequests/FeatureRequestsPage', modules: { - basePath: paths, + basePath: aliasedSource(paths), }, }); }, From c7aee9da7017c68de441dd93ec4eb353d4261158 Mon Sep 17 00:00:00 2001 From: sebastien Date: Mon, 15 Apr 2024 19:52:18 +0200 Subject: [PATCH 13/25] simplify debug plugin --- packages/docusaurus-plugin-debug/src/index.ts | 37 ++----------------- 1 file changed, 4 insertions(+), 33 deletions(-) diff --git a/packages/docusaurus-plugin-debug/src/index.ts b/packages/docusaurus-plugin-debug/src/index.ts index 66bc30774764..af1a017de37c 100644 --- a/packages/docusaurus-plugin-debug/src/index.ts +++ b/packages/docusaurus-plugin-debug/src/index.ts @@ -5,24 +5,12 @@ * LICENSE file in the root directory of this source tree. */ -import path from 'path'; -import {docuHash, normalizeUrl, posixPath} from '@docusaurus/utils'; +import {normalizeUrl} from '@docusaurus/utils'; import type {LoadContext, Plugin} from '@docusaurus/types'; export default function pluginDebug({ siteConfig: {baseUrl}, - generatedFilesDir, }: LoadContext): Plugin { - const pluginDataDirRoot = path.join( - generatedFilesDir, - 'docusaurus-plugin-debug', - ); - // TODO Docusaurus v4 breaking change - // module aliasing should be automatic - // we should never find local absolute FS paths in the codegen registry - const aliasedSource = (source: string) => - `~debug/${posixPath(path.relative(pluginDataDirRoot, source))}`; - return { name: 'docusaurus-plugin-debug', @@ -33,14 +21,7 @@ export default function pluginDebug({ return '../src/theme'; }, - async allContentLoaded({actions: {createData, addRoute}, allContent}) { - const allContentPath = await createData( - // Note that this created data path must be in sync with - // metadataPath provided to mdx-loader. - `${docuHash('docusaurus-debug-allContent')}.json`, - JSON.stringify(allContent, null, 2), - ); - + async allContentLoaded({actions: {addRoute}, allContent}) { // Home is config (duplicate for now) addRoute({ path: normalizeUrl([baseUrl, '__docusaurus/debug']), @@ -76,8 +57,8 @@ export default function pluginDebug({ path: normalizeUrl([baseUrl, '__docusaurus/debug/content']), component: '@theme/DebugContent', exact: true, - modules: { - allContent: aliasedSource(allContentPath), + props: { + allContent, }, }); @@ -87,15 +68,5 @@ export default function pluginDebug({ exact: true, }); }, - - configureWebpack() { - return { - resolve: { - alias: { - '~debug': pluginDataDirRoot, - }, - }, - }; - }, }; } From d74c0ba2444d459c0f9f85e858e458f9d20577d3 Mon Sep 17 00:00:00 2001 From: sebastien Date: Mon, 15 Apr 2024 19:57:58 +0200 Subject: [PATCH 14/25] useless comment --- packages/docusaurus-plugin-content-blog/src/routes.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/docusaurus-plugin-content-blog/src/routes.ts b/packages/docusaurus-plugin-content-blog/src/routes.ts index 0df401a53801..183d1c84798c 100644 --- a/packages/docusaurus-plugin-content-blog/src/routes.ts +++ b/packages/docusaurus-plugin-content-blog/src/routes.ts @@ -88,8 +88,6 @@ export async function buildAllRoutes({ async function createSidebarModule() { const modulePath = await createData( - // Note that this created data path must be in sync with - // metadataPath provided to mdx-loader. `blog-post-list-prop-${pluginId}.json`, JSON.stringify( { From 3bf9cb93904eeeab0821a63047ef416a5150e828 Mon Sep 17 00:00:00 2001 From: sebastien Date: Tue, 16 Apr 2024 11:39:42 +0200 Subject: [PATCH 15/25] simplify docs plugin to use route props --- .../src/routes.ts | 69 ++++++------------- 1 file changed, 20 insertions(+), 49 deletions(-) diff --git a/packages/docusaurus-plugin-content-docs/src/routes.ts b/packages/docusaurus-plugin-content-docs/src/routes.ts index cff90fc491f9..5cfc6895f09b 100644 --- a/packages/docusaurus-plugin-content-docs/src/routes.ts +++ b/packages/docusaurus-plugin-content-docs/src/routes.ts @@ -9,7 +9,6 @@ import _ from 'lodash'; import logger from '@docusaurus/logger'; import { docuHash, - createSlugger, normalizeUrl, aliasedSitePathToRelativePath, } from '@docusaurus/utils'; @@ -29,7 +28,6 @@ import type { CategoryGeneratedIndexMetadata, DocMetadata, PluginOptions, - PropTagsListPage, } from '@docusaurus/plugin-content-docs'; function createDocRouteMetadata(docMeta: DocMetadata): RouteMetadata { @@ -41,36 +39,23 @@ function createDocRouteMetadata(docMeta: DocMetadata): RouteMetadata { async function buildVersionCategoryGeneratedIndexRoutes({ version, - actions, options, - aliasedSource, }: BuildVersionRoutesParam): Promise { - const slugs = createSlugger(); - async function buildCategoryGeneratedIndexRoute( categoryGeneratedIndex: CategoryGeneratedIndexMetadata, ): Promise { - const {sidebar, ...prop} = categoryGeneratedIndex; - - const propFileName = slugs.slug( - `${version.path}-${categoryGeneratedIndex.sidebar}-category-${categoryGeneratedIndex.title}`, - ); - - const propData = await actions.createData( - `${docuHash(`category/${propFileName}`)}.json`, - JSON.stringify(prop, null, 2), - ); - return { path: categoryGeneratedIndex.permalink, component: options.docCategoryGeneratedIndexComponent, exact: true, - modules: { - categoryGeneratedIndex: aliasedSource(propData), + props: { + categoryGeneratedIndex, }, // Same as doc, this sidebar route attribute permits to associate this // subpage to the given sidebar - ...(sidebar && {sidebar}), + ...(categoryGeneratedIndex.sidebar && { + sidebar: categoryGeneratedIndex.sidebar, + }), }; } @@ -131,7 +116,7 @@ async function buildVersionSidebarRoute(param: BuildVersionRoutesParam) { async function buildVersionTagsRoutes( param: BuildVersionRoutesParam, ): Promise { - const {version, options, actions, aliasedSource} = param; + const {version, options} = param; const versionTags = getVersionTags(version.docs); async function buildTagsListRoute(): Promise { @@ -139,37 +124,27 @@ async function buildVersionTagsRoutes( if (Object.keys(versionTags).length === 0) { return null; } - const tagsProp: PropTagsListPage['tags'] = toTagsListTagsProp(versionTags); - const tagsPropPath = await actions.createData( - `${docuHash(`tags-list-${version.versionName}-prop`)}.json`, - JSON.stringify(tagsProp, null, 2), - ); return { path: version.tagsPath, exact: true, component: options.docTagsListComponent, - modules: { - tags: aliasedSource(tagsPropPath), + props: { + tags: toTagsListTagsProp(versionTags), }, }; } async function buildTagDocListRoute(tag: VersionTag): Promise { - const tagProps = toTagDocListProp({ - allTagsPath: version.tagsPath, - tag, - docs: version.docs, - }); - const tagPropPath = await actions.createData( - `${docuHash(`tag-${tag.permalink}`)}.json`, - JSON.stringify(tagProps, null, 2), - ); return { path: tag.permalink, component: options.docTagDocListComponent, exact: true, - modules: { - tag: aliasedSource(tagPropPath), + props: { + tag: toTagDocListProp({ + allTagsPath: version.tagsPath, + tag, + docs: version.docs, + }), }, }; } @@ -189,7 +164,7 @@ type BuildVersionRoutesParam = Omit & { async function buildVersionRoutes( param: BuildVersionRoutesParam, ): Promise { - const {version, actions, options, aliasedSource} = param; + const {version, options} = param; async function buildVersionSubRoutes() { const [sidebarRoute, tagsRoutes] = await Promise.all([ @@ -201,19 +176,15 @@ async function buildVersionRoutes( } async function doBuildVersionRoutes(): Promise { - const versionProp = toVersionMetadataProp(options.id, version); - const versionPropPath = await actions.createData( - `${docuHash(`version-${version.versionName}-metadata-prop`)}.json`, - JSON.stringify(versionProp, null, 2), - ); - const subRoutes = await buildVersionSubRoutes(); return { path: version.path, exact: false, component: options.docVersionRootComponent, - routes: subRoutes, - modules: { - version: aliasedSource(versionPropPath), + routes: await buildVersionSubRoutes(), + props: { + // TODO Docusaurus v4 breaking change? + // expose version metadata as route context instead of props + version: toVersionMetadataProp(options.id, version), }, priority: version.routePriority, }; From fcd82209e533113bc674e3ad7890b1cbb9b717ec Mon Sep 17 00:00:00 2001 From: sebastien Date: Tue, 16 Apr 2024 11:48:35 +0200 Subject: [PATCH 16/25] useful comment --- packages/docusaurus-plugin-content-blog/src/routes.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/docusaurus-plugin-content-blog/src/routes.ts b/packages/docusaurus-plugin-content-blog/src/routes.ts index 183d1c84798c..7d2f3394f655 100644 --- a/packages/docusaurus-plugin-content-blog/src/routes.ts +++ b/packages/docusaurus-plugin-content-blog/src/routes.ts @@ -117,6 +117,11 @@ export async function buildAllRoutes({ return aliasedSource(modulePath); } + // TODO we should have a parent blog route, + // and inject blog metadata + sidebar as a parent context + // unfortunately we can't have a parent route for blog yet + // because if both blog/docs are using routeBasePath /, + // React router config rendering doesn't support that well const sidebarModulePath = await createSidebarModule(); const blogMetadataModulePath = await createBlogMetadataModule(); From ec80ac895548853c8244cb9b311c71cb4f646d22 Mon Sep 17 00:00:00 2001 From: sebastien Date: Tue, 16 Apr 2024 12:06:30 +0200 Subject: [PATCH 17/25] refactor pages plugin contentLoaded --- .../src/index.ts | 51 +---------- .../src/routes.ts | 89 +++++++++++++++++++ 2 files changed, 92 insertions(+), 48 deletions(-) create mode 100644 packages/docusaurus-plugin-content-pages/src/routes.ts diff --git a/packages/docusaurus-plugin-content-pages/src/index.ts b/packages/docusaurus-plugin-content-pages/src/index.ts index 6363fa1914c5..9feb8496668a 100644 --- a/packages/docusaurus-plugin-content-pages/src/index.ts +++ b/packages/docusaurus-plugin-content-pages/src/index.ts @@ -11,7 +11,6 @@ import { encodePath, fileToPath, aliasedSitePath, - aliasedSitePathToRelativePath, docuHash, getPluginI18nPath, getFolderContainingFile, @@ -28,7 +27,8 @@ import { posixPath, } from '@docusaurus/utils'; import {validatePageFrontMatter} from './frontMatter'; -import type {LoadContext, Plugin, RouteMetadata} from '@docusaurus/types'; +import {createAllRoutes} from './routes'; +import type {LoadContext, Plugin} from '@docusaurus/types'; import type {PagesContentPaths} from './types'; import type { PluginOptions, @@ -207,52 +207,7 @@ export default function pluginContentPages( if (!content) { return; } - - const {addRoute, createData} = actions; - - function createPageRouteMetadata(metadata: Metadata): RouteMetadata { - const lastUpdatedAt = - metadata.type === 'mdx' ? metadata.lastUpdatedAt : undefined; - - return { - sourceFilePath: aliasedSitePathToRelativePath(metadata.source), - lastUpdatedAt, - }; - } - - await Promise.all( - content.map(async (metadata) => { - const {permalink, source} = metadata; - const routeMetadata = createPageRouteMetadata(metadata); - if (metadata.type === 'mdx') { - await createData( - // Note that this created data path must be in sync with - // metadataPath provided to mdx-loader. - `${docuHash(metadata.source)}.json`, - JSON.stringify(metadata, null, 2), - ); - addRoute({ - path: permalink, - component: options.mdxPageComponent, - exact: true, - metadata: routeMetadata, - modules: { - content: source, - }, - }); - } else { - addRoute({ - path: permalink, - component: source, - exact: true, - metadata: routeMetadata, - modules: { - config: `@generated/docusaurus.config`, - }, - }); - } - }), - ); + await createAllRoutes({content, options, actions}); }, configureWebpack() { diff --git a/packages/docusaurus-plugin-content-pages/src/routes.ts b/packages/docusaurus-plugin-content-pages/src/routes.ts new file mode 100644 index 000000000000..cc3b1f162cc1 --- /dev/null +++ b/packages/docusaurus-plugin-content-pages/src/routes.ts @@ -0,0 +1,89 @@ +/** + * 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 {aliasedSitePathToRelativePath, docuHash} from '@docusaurus/utils'; +import type { + PluginContentLoadedActions, + RouteConfig, + RouteMetadata, +} from '@docusaurus/types'; +import type { + PluginOptions, + Metadata, + LoadedContent, + MDXPageMetadata, +} from '@docusaurus/plugin-content-pages'; + +type CreateAllRoutesParam = { + content: LoadedContent; + options: PluginOptions; + actions: PluginContentLoadedActions; +}; + +function createPageRouteMetadata(metadata: Metadata): RouteMetadata { + const lastUpdatedAt = + metadata.type === 'mdx' ? metadata.lastUpdatedAt : undefined; + return { + sourceFilePath: aliasedSitePathToRelativePath(metadata.source), + lastUpdatedAt, + }; +} + +export async function createAllRoutes( + param: CreateAllRoutesParam, +): Promise { + const routes = await buildAllRoutes(param); + routes.forEach(param.actions.addRoute); +} + +export async function buildAllRoutes({ + content, + actions, + options, +}: CreateAllRoutesParam): Promise { + const {createData} = actions; + + async function buildMDXPageRoute( + metadata: MDXPageMetadata, + ): Promise { + await createData( + // Note that this created data path must be in sync with + // metadataPath provided to mdx-loader. + `${docuHash(metadata.source)}.json`, + JSON.stringify(metadata, null, 2), + ); + return { + path: metadata.permalink, + component: options.mdxPageComponent, + exact: true, + metadata: createPageRouteMetadata(metadata), + modules: { + content: metadata.source, + }, + }; + } + + async function buildJSXRoute(metadata: Metadata): Promise { + return { + path: metadata.permalink, + component: metadata.source, + exact: true, + metadata: createPageRouteMetadata(metadata), + modules: { + config: `@generated/docusaurus.config`, + }, + }; + } + + async function buildPageRoute(metadata: Metadata): Promise { + return metadata.type === 'mdx' + ? buildMDXPageRoute(metadata) + : buildJSXRoute(metadata); + } + + return Promise.all(content.map(buildPageRoute)); +} From 2b8727db324191460e6955a89783590a43e33345 Mon Sep 17 00:00:00 2001 From: sebastien Date: Tue, 16 Apr 2024 12:29:39 +0200 Subject: [PATCH 18/25] refactor pages loadContent --- .../src/content.ts | 194 ++++++++++++++++++ .../src/index.ts | 161 +-------------- 2 files changed, 202 insertions(+), 153 deletions(-) create mode 100644 packages/docusaurus-plugin-content-pages/src/content.ts diff --git a/packages/docusaurus-plugin-content-pages/src/content.ts b/packages/docusaurus-plugin-content-pages/src/content.ts new file mode 100644 index 000000000000..769adbf459be --- /dev/null +++ b/packages/docusaurus-plugin-content-pages/src/content.ts @@ -0,0 +1,194 @@ +/** + * 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 { + encodePath, + fileToPath, + aliasedSitePath, + getFolderContainingFile, + Globby, + normalizeUrl, + parseMarkdownFile, + isUnlisted, + isDraft, + readLastUpdateData, + getEditUrl, + posixPath, + getPluginI18nPath, +} from '@docusaurus/utils'; +import {validatePageFrontMatter} from './frontMatter'; +import type {LoadContext} from '@docusaurus/types'; +import type {PagesContentPaths} from './types'; +import type { + PluginOptions, + Metadata, + LoadedContent, +} from '@docusaurus/plugin-content-pages'; + +export function createPagesContentPaths({ + context, + options, +}: { + context: LoadContext; + options: PluginOptions; +}): PagesContentPaths { + const {siteDir, localizationDir} = context; + return { + contentPath: path.resolve(siteDir, options.path), + contentPathLocalized: getPluginI18nPath({ + localizationDir, + pluginName: 'docusaurus-plugin-content-pages', + pluginId: options.id, + }), + }; +} + +export function getContentPathList(contentPaths: PagesContentPaths): string[] { + return [contentPaths.contentPathLocalized, contentPaths.contentPath]; +} + +const isMarkdownSource = (source: string) => + source.endsWith('.md') || source.endsWith('.mdx'); + +type LoadContentParams = { + context: LoadContext; + options: PluginOptions; + contentPaths: PagesContentPaths; +}; + +export async function loadPagesContent( + params: LoadContentParams, +): Promise { + const {options} = params; + + const pagesFiles = await Globby(params.options.include, { + cwd: params.contentPaths.contentPath, + ignore: options.exclude, + }); + + async function doProcessPageSourceFile(relativeSource: string) { + try { + return await processPageSourceFile(relativeSource, params); + } catch (err) { + throw new Error( + `Processing of page source file path=${relativeSource} failed.`, + {cause: err as Error}, + ); + } + } + + return (await Promise.all(pagesFiles.map(doProcessPageSourceFile))).filter( + (res): res is Metadata => { + return res !== undefined; + }, + ); +} + +async function processPageSourceFile( + relativeSource: string, + params: LoadContentParams, +): Promise { + const {context, options, contentPaths} = params; + const {siteConfig, baseUrl, siteDir, i18n} = context; + const {editUrl} = options; + + // Lookup in localized folder in priority + const contentPath = await getFolderContainingFile( + getContentPathList(contentPaths), + relativeSource, + ); + + const source = path.join(contentPath, relativeSource); + const aliasedSourcePath = aliasedSitePath(source, siteDir); + const permalink = normalizeUrl([ + baseUrl, + options.routeBasePath, + encodePath(fileToPath(relativeSource)), + ]); + if (!isMarkdownSource(relativeSource)) { + return { + type: 'jsx', + permalink, + source: aliasedSourcePath, + }; + } + + const content = await fs.readFile(source, 'utf-8'); + const { + frontMatter: unsafeFrontMatter, + contentTitle, + excerpt, + } = await parseMarkdownFile({ + filePath: source, + fileContent: content, + parseFrontMatter: siteConfig.markdown.parseFrontMatter, + }); + const frontMatter = validatePageFrontMatter(unsafeFrontMatter); + + const pagesDirPath = await getFolderContainingFile( + getContentPathList(contentPaths), + relativeSource, + ); + + const pagesSourceAbsolute = path.join(pagesDirPath, relativeSource); + + function getPagesEditUrl() { + const pagesPathRelative = path.relative( + pagesDirPath, + path.resolve(pagesSourceAbsolute), + ); + + if (typeof editUrl === 'function') { + return editUrl({ + pagesDirPath: posixPath(path.relative(siteDir, pagesDirPath)), + pagesPath: posixPath(pagesPathRelative), + permalink, + locale: i18n.currentLocale, + }); + } else if (typeof editUrl === 'string') { + const isLocalized = pagesDirPath === contentPaths.contentPathLocalized; + const fileContentPath = + isLocalized && options.editLocalizedFiles + ? contentPaths.contentPathLocalized + : contentPaths.contentPath; + + const contentPathEditUrl = normalizeUrl([ + editUrl, + posixPath(path.relative(siteDir, fileContentPath)), + ]); + + return getEditUrl(pagesPathRelative, contentPathEditUrl); + } + return undefined; + } + + const lastUpdatedData = await readLastUpdateData( + source, + options, + frontMatter.last_update, + ); + + if (isDraft({frontMatter})) { + return undefined; + } + const unlisted = isUnlisted({frontMatter}); + + return { + type: 'mdx', + permalink, + source: aliasedSourcePath, + title: frontMatter.title ?? contentTitle, + description: frontMatter.description ?? excerpt, + frontMatter, + lastUpdatedBy: lastUpdatedData.lastUpdatedBy, + lastUpdatedAt: lastUpdatedData.lastUpdatedAt, + editUrl: getPagesEditUrl(), + unlisted, + }; +} diff --git a/packages/docusaurus-plugin-content-pages/src/index.ts b/packages/docusaurus-plugin-content-pages/src/index.ts index 9feb8496668a..f88954462a48 100644 --- a/packages/docusaurus-plugin-content-pages/src/index.ts +++ b/packages/docusaurus-plugin-content-pages/src/index.ts @@ -8,57 +8,32 @@ import fs from 'fs-extra'; import path from 'path'; import { - encodePath, - fileToPath, aliasedSitePath, docuHash, - getPluginI18nPath, - getFolderContainingFile, addTrailingPathSeparator, - Globby, createAbsoluteFilePathMatcher, - normalizeUrl, DEFAULT_PLUGIN_ID, - parseMarkdownFile, - isUnlisted, - isDraft, - readLastUpdateData, - getEditUrl, - posixPath, } from '@docusaurus/utils'; -import {validatePageFrontMatter} from './frontMatter'; import {createAllRoutes} from './routes'; +import { + createPagesContentPaths, + getContentPathList, + loadPagesContent, +} from './content'; import type {LoadContext, Plugin} from '@docusaurus/types'; -import type {PagesContentPaths} from './types'; import type { PluginOptions, - Metadata, LoadedContent, PageFrontMatter, } from '@docusaurus/plugin-content-pages'; -export function getContentPathList(contentPaths: PagesContentPaths): string[] { - return [contentPaths.contentPathLocalized, contentPaths.contentPath]; -} - -const isMarkdownSource = (source: string) => - source.endsWith('.md') || source.endsWith('.mdx'); - export default function pluginContentPages( context: LoadContext, options: PluginOptions, ): Plugin { - const {siteConfig, siteDir, generatedFilesDir, localizationDir, i18n} = - context; + const {siteConfig, siteDir, generatedFilesDir} = context; - const contentPaths: PagesContentPaths = { - contentPath: path.resolve(siteDir, options.path), - contentPathLocalized: getPluginI18nPath({ - localizationDir, - pluginName: 'docusaurus-plugin-content-pages', - pluginId: options.id, - }), - }; + const contentPaths = createPagesContentPaths({context, options}); const pluginDataDirRoot = path.join( generatedFilesDir, @@ -77,130 +52,10 @@ export default function pluginContentPages( }, async loadContent() { - const {include, editUrl} = options; - if (!(await fs.pathExists(contentPaths.contentPath))) { return null; } - - const {baseUrl} = siteConfig; - const pagesFiles = await Globby(include, { - cwd: contentPaths.contentPath, - ignore: options.exclude, - }); - - async function processPageSourceFile( - relativeSource: string, - ): Promise { - // Lookup in localized folder in priority - const contentPath = await getFolderContainingFile( - getContentPathList(contentPaths), - relativeSource, - ); - - const source = path.join(contentPath, relativeSource); - const aliasedSourcePath = aliasedSitePath(source, siteDir); - const permalink = normalizeUrl([ - baseUrl, - options.routeBasePath, - encodePath(fileToPath(relativeSource)), - ]); - if (!isMarkdownSource(relativeSource)) { - return { - type: 'jsx', - permalink, - source: aliasedSourcePath, - }; - } - const content = await fs.readFile(source, 'utf-8'); - const { - frontMatter: unsafeFrontMatter, - contentTitle, - excerpt, - } = await parseMarkdownFile({ - filePath: source, - fileContent: content, - parseFrontMatter: siteConfig.markdown.parseFrontMatter, - }); - const frontMatter = validatePageFrontMatter(unsafeFrontMatter); - - const pagesDirPath = await getFolderContainingFile( - getContentPathList(contentPaths), - relativeSource, - ); - - const pagesSourceAbsolute = path.join(pagesDirPath, relativeSource); - - function getPagesEditUrl() { - const pagesPathRelative = path.relative( - pagesDirPath, - path.resolve(pagesSourceAbsolute), - ); - - if (typeof editUrl === 'function') { - return editUrl({ - pagesDirPath: posixPath(path.relative(siteDir, pagesDirPath)), - pagesPath: posixPath(pagesPathRelative), - permalink, - locale: i18n.currentLocale, - }); - } else if (typeof editUrl === 'string') { - const isLocalized = - pagesDirPath === contentPaths.contentPathLocalized; - const fileContentPath = - isLocalized && options.editLocalizedFiles - ? contentPaths.contentPathLocalized - : contentPaths.contentPath; - - const contentPathEditUrl = normalizeUrl([ - editUrl, - posixPath(path.relative(siteDir, fileContentPath)), - ]); - - return getEditUrl(pagesPathRelative, contentPathEditUrl); - } - return undefined; - } - - const lastUpdatedData = await readLastUpdateData( - source, - options, - frontMatter.last_update, - ); - - if (isDraft({frontMatter})) { - return undefined; - } - const unlisted = isUnlisted({frontMatter}); - - return { - type: 'mdx', - permalink, - source: aliasedSourcePath, - title: frontMatter.title ?? contentTitle, - description: frontMatter.description ?? excerpt, - frontMatter, - lastUpdatedBy: lastUpdatedData.lastUpdatedBy, - lastUpdatedAt: lastUpdatedData.lastUpdatedAt, - editUrl: getPagesEditUrl(), - unlisted, - }; - } - - async function doProcessPageSourceFile(relativeSource: string) { - try { - return await processPageSourceFile(relativeSource); - } catch (err) { - throw new Error( - `Processing of page source file path=${relativeSource} failed.`, - {cause: err as Error}, - ); - } - } - - return ( - await Promise.all(pagesFiles.map(doProcessPageSourceFile)) - ).filter(Boolean) as Metadata[]; + return loadPagesContent({context, options, contentPaths}); }, async contentLoaded({content, actions}) { From 1ee355380a4d3d36a95ecb08d1b2a9c833c8bf89 Mon Sep 17 00:00:00 2001 From: sebastien Date: Tue, 16 Apr 2024 12:40:18 +0200 Subject: [PATCH 19/25] fix docs test snapshots --- .../__snapshots__/index.test.ts.snap | 1634 +++++++++-------- .../src/__tests__/index.test.ts | 39 - 2 files changed, 843 insertions(+), 830 deletions(-) diff --git a/packages/docusaurus-plugin-content-docs/src/__tests__/__snapshots__/index.test.ts.snap b/packages/docusaurus-plugin-content-docs/src/__tests__/__snapshots__/index.test.ts.snap index 9c88d8e20bcd..1c57afda7ebe 100644 --- a/packages/docusaurus-plugin-content-docs/src/__tests__/__snapshots__/index.test.ts.snap +++ b/packages/docusaurus-plugin-content-docs/src/__tests__/__snapshots__/index.test.ts.snap @@ -430,21 +430,6 @@ exports[`simple website content 5`] = ` exports[`simple website content: data 1`] = ` { - "category-docs-docs-category-slugs-0fe.json": "{ - "title": "Slugs", - "slug": "/category/slugs", - "permalink": "/docs/category/slugs", - "navigation": { - "previous": { - "title": "unlisted-category-doc", - "permalink": "/docs/unlisted-category/unlisted-category-doc" - }, - "next": { - "title": "rootAbsoluteSlug", - "permalink": "/docs/rootAbsoluteSlug" - } - } -}", "site-docs-custom-last-update-md-b8d.json": "{ "id": "customLastUpdate", "title": "Custom Last Update", @@ -947,335 +932,6 @@ exports[`simple website content: data 1`] = ` "title": "Slugs", "permalink": "/docs/category/slugs" } -}", - "tag-docs-tags-tag-1-b3f.json": "{ - "label": "tag 1", - "permalink": "/docs/tags/tag-1", - "allTagsPath": "/docs/tags", - "count": 2, - "items": [ - { - "id": "foo/baz", - "title": "baz", - "description": "Images", - "permalink": "/docs/foo/bazSlug.html" - }, - { - "id": "hello", - "title": "Hello, World !", - "description": "Hi, Endilie here :)", - "permalink": "/docs/" - } - ], - "unlisted": false -}", - "tag-docs-tags-tag-2-custom-permalink-825.json": "{ - "label": "tag 2", - "permalink": "/docs/tags/tag2-custom-permalink", - "allTagsPath": "/docs/tags", - "count": 1, - "items": [ - { - "id": "foo/baz", - "title": "baz", - "description": "Images", - "permalink": "/docs/foo/bazSlug.html" - } - ], - "unlisted": false -}", - "tag-docs-tags-tag-3-ab5.json": "{ - "label": "tag 3", - "permalink": "/docs/tags/tag-3", - "allTagsPath": "/docs/tags", - "count": 1, - "items": [ - { - "id": "hello", - "title": "Hello, World !", - "description": "Hi, Endilie here :)", - "permalink": "/docs/" - } - ], - "unlisted": false -}", - "tags-list-current-prop-15a.json": "[ - { - "label": "tag 1", - "permalink": "/docs/tags/tag-1", - "count": 2 - }, - { - "label": "tag 2", - "permalink": "/docs/tags/tag2-custom-permalink", - "count": 1 - }, - { - "label": "tag 3", - "permalink": "/docs/tags/tag-3", - "count": 1 - } -]", - "version-current-metadata-prop-751.json": "{ - "pluginId": "default", - "version": "current", - "label": "Next", - "banner": null, - "badge": false, - "noIndex": false, - "className": "docs-version-current", - "isLast": true, - "docsSidebars": { - "docs": [ - { - "type": "category", - "label": "Test", - "items": [ - { - "type": "category", - "label": "foo", - "items": [ - { - "type": "link", - "label": "Bar", - "href": "/docs/foo/bar", - "docId": "foo/bar", - "unlisted": false - }, - { - "type": "link", - "label": "doc-unlisted", - "href": "/docs/doc-unlisted", - "docId": "doc-unlisted", - "unlisted": false - }, - { - "type": "link", - "label": "baz", - "href": "/docs/foo/bazSlug.html", - "docId": "foo/baz", - "unlisted": false - } - ], - "collapsed": true, - "collapsible": true - }, - { - "type": "category", - "label": "Unlisted category", - "items": [ - { - "type": "link", - "label": "unlisted-category-doc", - "href": "/docs/unlisted-category/unlisted-category-doc", - "docId": "unlisted-category/unlisted-category-doc", - "unlisted": false - } - ], - "collapsed": true, - "collapsible": true, - "href": "/docs/unlisted-category/" - }, - { - "type": "category", - "label": "Slugs", - "items": [ - { - "type": "link", - "label": "rootAbsoluteSlug", - "href": "/docs/rootAbsoluteSlug", - "docId": "rootAbsoluteSlug", - "unlisted": false - }, - { - "type": "link", - "label": "rootRelativeSlug", - "href": "/docs/rootRelativeSlug", - "docId": "rootRelativeSlug", - "unlisted": false - }, - { - "type": "link", - "label": "rootResolvedSlug", - "href": "/docs/hey/rootResolvedSlug", - "docId": "rootResolvedSlug", - "unlisted": false - }, - { - "type": "link", - "label": "rootTryToEscapeSlug", - "href": "/docs/rootTryToEscapeSlug", - "docId": "rootTryToEscapeSlug", - "unlisted": false - } - ], - "collapsed": true, - "collapsible": true, - "href": "/docs/category/slugs" - }, - { - "type": "link", - "label": "My heading as title", - "href": "/docs/headingAsTitle", - "docId": "headingAsTitle", - "unlisted": false - }, - { - "type": "link", - "label": "GitHub", - "href": "https://github.com" - }, - { - "type": "link", - "label": "Hello sidebar_label", - "href": "/docs/", - "docId": "hello", - "unlisted": false - } - ], - "collapsed": true, - "collapsible": true - }, - { - "type": "category", - "label": "Guides", - "items": [ - { - "type": "link", - "label": "Hello sidebar_label", - "href": "/docs/", - "docId": "hello", - "unlisted": false - } - ], - "collapsed": true, - "collapsible": true - } - ] - }, - "docs": { - "customLastUpdate": { - "id": "customLastUpdate", - "title": "Custom Last Update", - "description": "Custom last update" - }, - "doc with space": { - "id": "doc with space", - "title": "Hoo hoo, if this path tricks you...", - "description": "" - }, - "doc-draft": { - "id": "doc-draft", - "title": "doc-draft", - "description": "This is a draft document" - }, - "doc-unlisted": { - "id": "doc-unlisted", - "title": "doc-unlisted", - "description": "This is an unlisted document", - "sidebar": "docs" - }, - "foo/bar": { - "id": "foo/bar", - "title": "Bar", - "description": "This is custom description", - "sidebar": "docs" - }, - "foo/baz": { - "id": "foo/baz", - "title": "baz", - "description": "Images", - "sidebar": "docs" - }, - "headingAsTitle": { - "id": "headingAsTitle", - "title": "My heading as title", - "description": "", - "sidebar": "docs" - }, - "hello": { - "id": "hello", - "title": "Hello, World !", - "description": "Hi, Endilie here :)", - "sidebar": "docs" - }, - "ipsum": { - "id": "ipsum", - "title": "ipsum", - "description": "Lorem ipsum." - }, - "lastUpdateAuthorOnly": { - "id": "lastUpdateAuthorOnly", - "title": "Last Update Author Only", - "description": "Only custom author, so it will still use the date from Git" - }, - "lastUpdateDateOnly": { - "id": "lastUpdateDateOnly", - "title": "Last Update Date Only", - "description": "Only custom date, so it will still use the author from Git" - }, - "lorem": { - "id": "lorem", - "title": "lorem", - "description": "Lorem ipsum." - }, - "rootAbsoluteSlug": { - "id": "rootAbsoluteSlug", - "title": "rootAbsoluteSlug", - "description": "Lorem", - "sidebar": "docs" - }, - "rootRelativeSlug": { - "id": "rootRelativeSlug", - "title": "rootRelativeSlug", - "description": "Lorem", - "sidebar": "docs" - }, - "rootResolvedSlug": { - "id": "rootResolvedSlug", - "title": "rootResolvedSlug", - "description": "Lorem", - "sidebar": "docs" - }, - "rootTryToEscapeSlug": { - "id": "rootTryToEscapeSlug", - "title": "rootTryToEscapeSlug", - "description": "Lorem", - "sidebar": "docs" - }, - "slugs/absoluteSlug": { - "id": "slugs/absoluteSlug", - "title": "absoluteSlug", - "description": "Lorem" - }, - "slugs/relativeSlug": { - "id": "slugs/relativeSlug", - "title": "relativeSlug", - "description": "Lorem" - }, - "slugs/resolvedSlug": { - "id": "slugs/resolvedSlug", - "title": "resolvedSlug", - "description": "Lorem" - }, - "slugs/tryToEscapeSlug": { - "id": "slugs/tryToEscapeSlug", - "title": "tryToEscapeSlug", - "description": "Lorem" - }, - "unlisted-category/unlisted-category-doc": { - "id": "unlisted-category/unlisted-category-doc", - "title": "unlisted-category-doc", - "description": "This is an unlisted category doc", - "sidebar": "docs" - }, - "unlisted-category/unlisted-category-index": { - "id": "unlisted-category/unlisted-category-index", - "title": "unlisted-category-index", - "description": "This is an unlisted category index", - "sidebar": "docs" - } - } }", } `; @@ -1436,43 +1092,400 @@ exports[`simple website content: route config 1`] = ` { "component": "@theme/DocVersionRoot", "exact": false, - "modules": { - "version": "~docs/version-current-metadata-prop-751.json", - }, "path": "/docs", "priority": -1, + "props": { + "version": { + "badge": false, + "banner": null, + "className": "docs-version-current", + "docs": { + "customLastUpdate": { + "description": "Custom last update", + "id": "customLastUpdate", + "sidebar": undefined, + "title": "Custom Last Update", + }, + "doc with space": { + "description": "", + "id": "doc with space", + "sidebar": undefined, + "title": "Hoo hoo, if this path tricks you...", + }, + "doc-draft": { + "description": "This is a draft document", + "id": "doc-draft", + "sidebar": undefined, + "title": "doc-draft", + }, + "doc-unlisted": { + "description": "This is an unlisted document", + "id": "doc-unlisted", + "sidebar": "docs", + "title": "doc-unlisted", + }, + "foo/bar": { + "description": "This is custom description", + "id": "foo/bar", + "sidebar": "docs", + "title": "Bar", + }, + "foo/baz": { + "description": "Images", + "id": "foo/baz", + "sidebar": "docs", + "title": "baz", + }, + "headingAsTitle": { + "description": "", + "id": "headingAsTitle", + "sidebar": "docs", + "title": "My heading as title", + }, + "hello": { + "description": "Hi, Endilie here :)", + "id": "hello", + "sidebar": "docs", + "title": "Hello, World !", + }, + "ipsum": { + "description": "Lorem ipsum.", + "id": "ipsum", + "sidebar": undefined, + "title": "ipsum", + }, + "lastUpdateAuthorOnly": { + "description": "Only custom author, so it will still use the date from Git", + "id": "lastUpdateAuthorOnly", + "sidebar": undefined, + "title": "Last Update Author Only", + }, + "lastUpdateDateOnly": { + "description": "Only custom date, so it will still use the author from Git", + "id": "lastUpdateDateOnly", + "sidebar": undefined, + "title": "Last Update Date Only", + }, + "lorem": { + "description": "Lorem ipsum.", + "id": "lorem", + "sidebar": undefined, + "title": "lorem", + }, + "rootAbsoluteSlug": { + "description": "Lorem", + "id": "rootAbsoluteSlug", + "sidebar": "docs", + "title": "rootAbsoluteSlug", + }, + "rootRelativeSlug": { + "description": "Lorem", + "id": "rootRelativeSlug", + "sidebar": "docs", + "title": "rootRelativeSlug", + }, + "rootResolvedSlug": { + "description": "Lorem", + "id": "rootResolvedSlug", + "sidebar": "docs", + "title": "rootResolvedSlug", + }, + "rootTryToEscapeSlug": { + "description": "Lorem", + "id": "rootTryToEscapeSlug", + "sidebar": "docs", + "title": "rootTryToEscapeSlug", + }, + "slugs/absoluteSlug": { + "description": "Lorem", + "id": "slugs/absoluteSlug", + "sidebar": undefined, + "title": "absoluteSlug", + }, + "slugs/relativeSlug": { + "description": "Lorem", + "id": "slugs/relativeSlug", + "sidebar": undefined, + "title": "relativeSlug", + }, + "slugs/resolvedSlug": { + "description": "Lorem", + "id": "slugs/resolvedSlug", + "sidebar": undefined, + "title": "resolvedSlug", + }, + "slugs/tryToEscapeSlug": { + "description": "Lorem", + "id": "slugs/tryToEscapeSlug", + "sidebar": undefined, + "title": "tryToEscapeSlug", + }, + "unlisted-category/unlisted-category-doc": { + "description": "This is an unlisted category doc", + "id": "unlisted-category/unlisted-category-doc", + "sidebar": "docs", + "title": "unlisted-category-doc", + }, + "unlisted-category/unlisted-category-index": { + "description": "This is an unlisted category index", + "id": "unlisted-category/unlisted-category-index", + "sidebar": "docs", + "title": "unlisted-category-index", + }, + }, + "docsSidebars": { + "docs": [ + { + "collapsed": true, + "collapsible": true, + "items": [ + { + "collapsed": true, + "collapsible": true, + "items": [ + { + "className": undefined, + "customProps": undefined, + "docId": "foo/bar", + "href": "/docs/foo/bar", + "label": "Bar", + "type": "link", + "unlisted": false, + }, + { + "className": undefined, + "customProps": undefined, + "docId": "doc-unlisted", + "href": "/docs/doc-unlisted", + "label": "doc-unlisted", + "type": "link", + "unlisted": false, + }, + { + "className": undefined, + "customProps": undefined, + "docId": "foo/baz", + "href": "/docs/foo/bazSlug.html", + "label": "baz", + "type": "link", + "unlisted": false, + }, + ], + "label": "foo", + "type": "category", + }, + { + "collapsed": true, + "collapsible": true, + "href": "/docs/unlisted-category/", + "items": [ + { + "className": undefined, + "customProps": undefined, + "docId": "unlisted-category/unlisted-category-doc", + "href": "/docs/unlisted-category/unlisted-category-doc", + "label": "unlisted-category-doc", + "type": "link", + "unlisted": false, + }, + ], + "label": "Unlisted category", + "type": "category", + }, + { + "collapsed": true, + "collapsible": true, + "href": "/docs/category/slugs", + "items": [ + { + "className": undefined, + "customProps": undefined, + "docId": "rootAbsoluteSlug", + "href": "/docs/rootAbsoluteSlug", + "label": "rootAbsoluteSlug", + "type": "link", + "unlisted": false, + }, + { + "className": undefined, + "customProps": undefined, + "docId": "rootRelativeSlug", + "href": "/docs/rootRelativeSlug", + "label": "rootRelativeSlug", + "type": "link", + "unlisted": false, + }, + { + "className": undefined, + "customProps": undefined, + "docId": "rootResolvedSlug", + "href": "/docs/hey/rootResolvedSlug", + "label": "rootResolvedSlug", + "type": "link", + "unlisted": false, + }, + { + "className": undefined, + "customProps": undefined, + "docId": "rootTryToEscapeSlug", + "href": "/docs/rootTryToEscapeSlug", + "label": "rootTryToEscapeSlug", + "type": "link", + "unlisted": false, + }, + ], + "label": "Slugs", + "type": "category", + }, + { + "className": undefined, + "customProps": undefined, + "docId": "headingAsTitle", + "href": "/docs/headingAsTitle", + "label": "My heading as title", + "type": "link", + "unlisted": false, + }, + { + "href": "https://github.com", + "label": "GitHub", + "type": "link", + }, + { + "className": undefined, + "customProps": undefined, + "docId": "hello", + "href": "/docs/", + "label": "Hello sidebar_label", + "type": "link", + "unlisted": false, + }, + ], + "label": "Test", + "type": "category", + }, + { + "collapsed": true, + "collapsible": true, + "items": [ + { + "className": undefined, + "customProps": undefined, + "docId": "hello", + "href": "/docs/", + "label": "Hello sidebar_label", + "type": "link", + "unlisted": false, + }, + ], + "label": "Guides", + "type": "category", + }, + ], + }, + "isLast": true, + "label": "Next", + "noIndex": false, + "pluginId": "default", + "version": "current", + }, + }, "routes": [ { "component": "@theme/DocTagsListPage", "exact": true, - "modules": { - "tags": "~docs/tags-list-current-prop-15a.json", - }, "path": "/docs/tags", + "props": { + "tags": [ + { + "count": 2, + "label": "tag 1", + "permalink": "/docs/tags/tag-1", + }, + { + "count": 1, + "label": "tag 2", + "permalink": "/docs/tags/tag2-custom-permalink", + }, + { + "count": 1, + "label": "tag 3", + "permalink": "/docs/tags/tag-3", + }, + ], + }, }, { "component": "@theme/DocTagDocListPage", "exact": true, - "modules": { - "tag": "~docs/tag-docs-tags-tag-1-b3f.json", - }, "path": "/docs/tags/tag-1", + "props": { + "tag": { + "allTagsPath": "/docs/tags", + "count": 2, + "items": [ + { + "description": "Images", + "id": "foo/baz", + "permalink": "/docs/foo/bazSlug.html", + "title": "baz", + }, + { + "description": "Hi, Endilie here :)", + "id": "hello", + "permalink": "/docs/", + "title": "Hello, World !", + }, + ], + "label": "tag 1", + "permalink": "/docs/tags/tag-1", + "unlisted": false, + }, + }, }, { "component": "@theme/DocTagDocListPage", "exact": true, - "modules": { - "tag": "~docs/tag-docs-tags-tag-3-ab5.json", - }, "path": "/docs/tags/tag-3", + "props": { + "tag": { + "allTagsPath": "/docs/tags", + "count": 1, + "items": [ + { + "description": "Hi, Endilie here :)", + "id": "hello", + "permalink": "/docs/", + "title": "Hello, World !", + }, + ], + "label": "tag 3", + "permalink": "/docs/tags/tag-3", + "unlisted": false, + }, + }, }, { "component": "@theme/DocTagDocListPage", "exact": true, - "modules": { - "tag": "~docs/tag-docs-tags-tag-2-custom-permalink-825.json", - }, "path": "/docs/tags/tag2-custom-permalink", + "props": { + "tag": { + "allTagsPath": "/docs/tags", + "count": 1, + "items": [ + { + "description": "Images", + "id": "foo/baz", + "permalink": "/docs/foo/bazSlug.html", + "title": "baz", + }, + ], + "label": "tag 2", + "permalink": "/docs/tags/tag2-custom-permalink", + "unlisted": false, + }, + }, }, { "component": "@theme/DocRoot", @@ -1507,10 +1520,28 @@ exports[`simple website content: route config 1`] = ` { "component": "@theme/DocCategoryGeneratedIndexPage", "exact": true, - "modules": { - "categoryGeneratedIndex": "~docs/category-docs-docs-category-slugs-0fe.json", - }, "path": "/docs/category/slugs", + "props": { + "categoryGeneratedIndex": { + "description": undefined, + "image": undefined, + "keywords": undefined, + "navigation": { + "next": { + "permalink": "/docs/rootAbsoluteSlug", + "title": "rootAbsoluteSlug", + }, + "previous": { + "permalink": "/docs/unlisted-category/unlisted-category-doc", + "title": "unlisted-category-doc", + }, + }, + "permalink": "/docs/category/slugs", + "sidebar": "docs", + "slug": "/category/slugs", + "title": "Slugs", + }, + }, "sidebar": "docs", }, { @@ -2883,64 +2914,6 @@ exports[`versioned website (community) content: data 1`] = ` "title": "Team title translated" }, "sidebar": "community" -}", - "version-1-0-0-metadata-prop-608.json": "{ - "pluginId": "community", - "version": "1.0.0", - "label": "1.0.0", - "banner": null, - "badge": true, - "noIndex": false, - "className": "docs-version-1.0.0", - "isLast": true, - "docsSidebars": { - "community": [ - { - "type": "link", - "label": "team", - "href": "/community/team", - "docId": "team", - "unlisted": false - } - ] - }, - "docs": { - "team": { - "id": "team", - "title": "team", - "description": "Team 1.0.0", - "sidebar": "community" - } - } -}", - "version-current-metadata-prop-751.json": "{ - "pluginId": "community", - "version": "current", - "label": "Next", - "banner": "unreleased", - "badge": true, - "noIndex": false, - "className": "docs-version-current", - "isLast": false, - "docsSidebars": { - "community": [ - { - "type": "link", - "label": "Team title translated", - "href": "/community/next/team", - "docId": "team", - "unlisted": false - } - ] - }, - "docs": { - "team": { - "id": "team", - "title": "Team title translated", - "description": "Team current version (translated)", - "sidebar": "community" - } - } }", } `; @@ -3014,11 +2987,41 @@ exports[`versioned website (community) content: route config 1`] = ` { "component": "@theme/DocVersionRoot", "exact": false, - "modules": { - "version": "~docs/version-current-metadata-prop-751.json", - }, "path": "/community/next", "priority": undefined, + "props": { + "version": { + "badge": true, + "banner": "unreleased", + "className": "docs-version-current", + "docs": { + "team": { + "description": "Team current version (translated)", + "id": "team", + "sidebar": "community", + "title": "Team title translated", + }, + }, + "docsSidebars": { + "community": [ + { + "className": undefined, + "customProps": undefined, + "docId": "team", + "href": "/community/next/team", + "label": "Team title translated", + "type": "link", + "unlisted": false, + }, + ], + }, + "isLast": false, + "label": "Next", + "noIndex": false, + "pluginId": "community", + "version": "current", + }, + }, "routes": [ { "component": "@theme/DocRoot", @@ -3045,11 +3048,41 @@ exports[`versioned website (community) content: route config 1`] = ` { "component": "@theme/DocVersionRoot", "exact": false, - "modules": { - "version": "~docs/version-1-0-0-metadata-prop-608.json", - }, "path": "/community", "priority": -1, + "props": { + "version": { + "badge": true, + "banner": null, + "className": "docs-version-1.0.0", + "docs": { + "team": { + "description": "Team 1.0.0", + "id": "team", + "sidebar": "community", + "title": "team", + }, + }, + "docsSidebars": { + "community": [ + { + "className": undefined, + "customProps": undefined, + "docId": "team", + "href": "/community/team", + "label": "team", + "type": "link", + "unlisted": false, + }, + ], + }, + "isLast": true, + "label": "1.0.0", + "noIndex": false, + "pluginId": "community", + "version": "1.0.0", + }, + }, "routes": [ { "component": "@theme/DocRoot", @@ -3721,347 +3754,6 @@ exports[`versioned website content: data 1`] = ` "frontMatter": { "slug": "../../../../../../../../tryToEscapeSlug" } -}", - "tag-docs-next-tags-bar-tag-1-a8f.json": "{ - "label": "barTag 1", - "permalink": "/docs/next/tags/bar-tag-1", - "allTagsPath": "/docs/next/tags", - "count": 1, - "items": [ - { - "id": "foo/bar", - "title": "bar", - "description": "This is next version of bar.", - "permalink": "/docs/next/foo/barSlug" - } - ], - "unlisted": false -}", - "tag-docs-next-tags-bar-tag-2-216.json": "{ - "label": "barTag-2", - "permalink": "/docs/next/tags/bar-tag-2", - "allTagsPath": "/docs/next/tags", - "count": 1, - "items": [ - { - "id": "foo/bar", - "title": "bar", - "description": "This is next version of bar.", - "permalink": "/docs/next/foo/barSlug" - } - ], - "unlisted": false -}", - "tag-docs-next-tags-bar-tag-3-permalink-94a.json": "{ - "label": "barTag 3", - "permalink": "/docs/next/tags/barTag-3-permalink", - "allTagsPath": "/docs/next/tags", - "count": 1, - "items": [ - { - "id": "foo/bar", - "title": "bar", - "description": "This is next version of bar.", - "permalink": "/docs/next/foo/barSlug" - } - ], - "unlisted": false -}", - "tags-list-current-prop-15a.json": "[ - { - "label": "barTag 1", - "permalink": "/docs/next/tags/bar-tag-1", - "count": 1 - }, - { - "label": "barTag-2", - "permalink": "/docs/next/tags/bar-tag-2", - "count": 1 - }, - { - "label": "barTag 3", - "permalink": "/docs/next/tags/barTag-3-permalink", - "count": 1 - } -]", - "version-1-0-0-metadata-prop-608.json": "{ - "pluginId": "default", - "version": "1.0.0", - "label": "1.0.0", - "banner": "unmaintained", - "badge": true, - "noIndex": false, - "className": "docs-version-1.0.0", - "isLast": false, - "docsSidebars": { - "docs": [ - { - "type": "category", - "label": "Test", - "items": [ - { - "type": "link", - "label": "bar", - "href": "/docs/1.0.0/foo/barSlug", - "docId": "foo/bar", - "unlisted": false - }, - { - "type": "link", - "label": "baz", - "href": "/docs/1.0.0/foo/baz", - "docId": "foo/baz", - "unlisted": false - } - ], - "collapsed": true, - "collapsible": true - }, - { - "type": "category", - "label": "Guides", - "items": [ - { - "type": "link", - "label": "hello", - "href": "/docs/1.0.0/", - "docId": "hello", - "unlisted": false - } - ], - "collapsed": true, - "collapsible": true - } - ] - }, - "docs": { - "foo/bar": { - "id": "foo/bar", - "title": "bar", - "description": "Bar 1.0.0 !", - "sidebar": "docs" - }, - "foo/baz": { - "id": "foo/baz", - "title": "baz", - "description": "Baz 1.0.0 ! This will be deleted in next subsequent versions.", - "sidebar": "docs" - }, - "hello": { - "id": "hello", - "title": "hello", - "description": "Hello 1.0.0 ! (translated en)", - "sidebar": "docs" - } - } -}", - "version-1-0-1-metadata-prop-e87.json": "{ - "pluginId": "default", - "version": "1.0.1", - "label": "1.0.1", - "banner": null, - "badge": true, - "noIndex": true, - "className": "docs-version-1.0.1", - "isLast": true, - "docsSidebars": { - "VersionedSideBarNameDoesNotMatter/docs": [ - { - "type": "category", - "label": "Test", - "items": [ - { - "type": "link", - "label": "bar", - "href": "/docs/foo/bar", - "docId": "foo/bar", - "unlisted": false - } - ], - "collapsed": true, - "collapsible": true - }, - { - "type": "category", - "label": "Guides", - "items": [ - { - "type": "link", - "label": "hello", - "href": "/docs/", - "docId": "hello", - "unlisted": false - } - ], - "collapsed": true, - "collapsible": true - } - ] - }, - "docs": { - "foo/bar": { - "id": "foo/bar", - "title": "bar", - "description": "Bar 1.0.1 !", - "sidebar": "VersionedSideBarNameDoesNotMatter/docs" - }, - "hello": { - "id": "hello", - "title": "hello", - "description": "Hello 1.0.1 !", - "sidebar": "VersionedSideBarNameDoesNotMatter/docs" - } - } -}", - "version-current-metadata-prop-751.json": "{ - "pluginId": "default", - "version": "current", - "label": "Next", - "banner": "unreleased", - "badge": true, - "noIndex": false, - "className": "docs-version-current", - "isLast": false, - "docsSidebars": { - "docs": [ - { - "type": "category", - "label": "Test", - "items": [ - { - "type": "link", - "label": "bar", - "href": "/docs/next/foo/barSlug", - "docId": "foo/bar", - "unlisted": false - } - ], - "collapsed": true, - "collapsible": true - }, - { - "type": "category", - "label": "Guides", - "items": [ - { - "type": "link", - "label": "hello", - "href": "/docs/next/", - "docId": "hello", - "unlisted": false - } - ], - "collapsed": true, - "collapsible": true - } - ] - }, - "docs": { - "foo/bar": { - "id": "foo/bar", - "title": "bar", - "description": "This is next version of bar.", - "sidebar": "docs" - }, - "hello": { - "id": "hello", - "title": "hello", - "description": "Hello next !", - "sidebar": "docs" - }, - "slugs/absoluteSlug": { - "id": "slugs/absoluteSlug", - "title": "absoluteSlug", - "description": "Lorem" - }, - "slugs/relativeSlug": { - "id": "slugs/relativeSlug", - "title": "relativeSlug", - "description": "Lorem" - }, - "slugs/resolvedSlug": { - "id": "slugs/resolvedSlug", - "title": "resolvedSlug", - "description": "Lorem" - }, - "slugs/tryToEscapeSlug": { - "id": "slugs/tryToEscapeSlug", - "title": "tryToEscapeSlug", - "description": "Lorem" - } - } -}", - "version-with-slugs-metadata-prop-2bf.json": "{ - "pluginId": "default", - "version": "withSlugs", - "label": "withSlugs", - "banner": "unmaintained", - "badge": true, - "noIndex": false, - "className": "docs-version-withSlugs", - "isLast": false, - "docsSidebars": { - "docs": [ - { - "type": "category", - "label": "Test", - "items": [ - { - "type": "link", - "label": "rootAbsoluteSlug", - "href": "/docs/withSlugs/rootAbsoluteSlug", - "docId": "rootAbsoluteSlug", - "unlisted": false - } - ], - "collapsed": true, - "collapsible": true - } - ] - }, - "docs": { - "rootAbsoluteSlug": { - "id": "rootAbsoluteSlug", - "title": "rootAbsoluteSlug", - "description": "Lorem", - "sidebar": "docs" - }, - "rootRelativeSlug": { - "id": "rootRelativeSlug", - "title": "rootRelativeSlug", - "description": "Lorem" - }, - "rootResolvedSlug": { - "id": "rootResolvedSlug", - "title": "rootResolvedSlug", - "description": "Lorem" - }, - "rootTryToEscapeSlug": { - "id": "rootTryToEscapeSlug", - "title": "rootTryToEscapeSlug", - "description": "Lorem" - }, - "slugs/absoluteSlug": { - "id": "slugs/absoluteSlug", - "title": "absoluteSlug", - "description": "Lorem" - }, - "slugs/relativeSlug": { - "id": "slugs/relativeSlug", - "title": "relativeSlug", - "description": "Lorem" - }, - "slugs/resolvedSlug": { - "id": "slugs/resolvedSlug", - "title": "resolvedSlug", - "description": "Lorem" - }, - "slugs/tryToEscapeSlug": { - "id": "slugs/tryToEscapeSlug", - "title": "tryToEscapeSlug", - "description": "Lorem" - } - } }", } `; @@ -4256,11 +3948,87 @@ exports[`versioned website content: route config 1`] = ` { "component": "@theme/DocVersionRoot", "exact": false, - "modules": { - "version": "~docs/version-1-0-0-metadata-prop-608.json", - }, "path": "/docs/1.0.0", "priority": undefined, + "props": { + "version": { + "badge": true, + "banner": "unmaintained", + "className": "docs-version-1.0.0", + "docs": { + "foo/bar": { + "description": "Bar 1.0.0 !", + "id": "foo/bar", + "sidebar": "docs", + "title": "bar", + }, + "foo/baz": { + "description": "Baz 1.0.0 ! This will be deleted in next subsequent versions.", + "id": "foo/baz", + "sidebar": "docs", + "title": "baz", + }, + "hello": { + "description": "Hello 1.0.0 ! (translated en)", + "id": "hello", + "sidebar": "docs", + "title": "hello", + }, + }, + "docsSidebars": { + "docs": [ + { + "collapsed": true, + "collapsible": true, + "items": [ + { + "className": undefined, + "customProps": undefined, + "docId": "foo/bar", + "href": "/docs/1.0.0/foo/barSlug", + "label": "bar", + "type": "link", + "unlisted": false, + }, + { + "className": undefined, + "customProps": undefined, + "docId": "foo/baz", + "href": "/docs/1.0.0/foo/baz", + "label": "baz", + "type": "link", + "unlisted": false, + }, + ], + "label": "Test", + "type": "category", + }, + { + "collapsed": true, + "collapsible": true, + "items": [ + { + "className": undefined, + "customProps": undefined, + "docId": "hello", + "href": "/docs/1.0.0/", + "label": "hello", + "type": "link", + "unlisted": false, + }, + ], + "label": "Guides", + "type": "category", + }, + ], + }, + "isLast": false, + "label": "1.0.0", + "noIndex": false, + "pluginId": "default", + "version": "1.0.0", + }, + }, "routes": [ { "component": "@theme/DocRoot", @@ -4313,43 +4081,186 @@ exports[`versioned website content: route config 1`] = ` { "component": "@theme/DocVersionRoot", "exact": false, - "modules": { - "version": "~docs/version-current-metadata-prop-751.json", - }, "path": "/docs/next", "priority": undefined, + "props": { + "version": { + "badge": true, + "banner": "unreleased", + "className": "docs-version-current", + "docs": { + "foo/bar": { + "description": "This is next version of bar.", + "id": "foo/bar", + "sidebar": "docs", + "title": "bar", + }, + "hello": { + "description": "Hello next !", + "id": "hello", + "sidebar": "docs", + "title": "hello", + }, + "slugs/absoluteSlug": { + "description": "Lorem", + "id": "slugs/absoluteSlug", + "sidebar": undefined, + "title": "absoluteSlug", + }, + "slugs/relativeSlug": { + "description": "Lorem", + "id": "slugs/relativeSlug", + "sidebar": undefined, + "title": "relativeSlug", + }, + "slugs/resolvedSlug": { + "description": "Lorem", + "id": "slugs/resolvedSlug", + "sidebar": undefined, + "title": "resolvedSlug", + }, + "slugs/tryToEscapeSlug": { + "description": "Lorem", + "id": "slugs/tryToEscapeSlug", + "sidebar": undefined, + "title": "tryToEscapeSlug", + }, + }, + "docsSidebars": { + "docs": [ + { + "collapsed": true, + "collapsible": true, + "items": [ + { + "className": undefined, + "customProps": undefined, + "docId": "foo/bar", + "href": "/docs/next/foo/barSlug", + "label": "bar", + "type": "link", + "unlisted": false, + }, + ], + "label": "Test", + "type": "category", + }, + { + "collapsed": true, + "collapsible": true, + "items": [ + { + "className": undefined, + "customProps": undefined, + "docId": "hello", + "href": "/docs/next/", + "label": "hello", + "type": "link", + "unlisted": false, + }, + ], + "label": "Guides", + "type": "category", + }, + ], + }, + "isLast": false, + "label": "Next", + "noIndex": false, + "pluginId": "default", + "version": "current", + }, + }, "routes": [ { "component": "@theme/DocTagsListPage", "exact": true, - "modules": { - "tags": "~docs/tags-list-current-prop-15a.json", - }, "path": "/docs/next/tags", + "props": { + "tags": [ + { + "count": 1, + "label": "barTag 1", + "permalink": "/docs/next/tags/bar-tag-1", + }, + { + "count": 1, + "label": "barTag-2", + "permalink": "/docs/next/tags/bar-tag-2", + }, + { + "count": 1, + "label": "barTag 3", + "permalink": "/docs/next/tags/barTag-3-permalink", + }, + ], + }, }, { "component": "@theme/DocTagDocListPage", "exact": true, - "modules": { - "tag": "~docs/tag-docs-next-tags-bar-tag-1-a8f.json", - }, "path": "/docs/next/tags/bar-tag-1", + "props": { + "tag": { + "allTagsPath": "/docs/next/tags", + "count": 1, + "items": [ + { + "description": "This is next version of bar.", + "id": "foo/bar", + "permalink": "/docs/next/foo/barSlug", + "title": "bar", + }, + ], + "label": "barTag 1", + "permalink": "/docs/next/tags/bar-tag-1", + "unlisted": false, + }, + }, }, { "component": "@theme/DocTagDocListPage", "exact": true, - "modules": { - "tag": "~docs/tag-docs-next-tags-bar-tag-2-216.json", - }, "path": "/docs/next/tags/bar-tag-2", + "props": { + "tag": { + "allTagsPath": "/docs/next/tags", + "count": 1, + "items": [ + { + "description": "This is next version of bar.", + "id": "foo/bar", + "permalink": "/docs/next/foo/barSlug", + "title": "bar", + }, + ], + "label": "barTag-2", + "permalink": "/docs/next/tags/bar-tag-2", + "unlisted": false, + }, + }, }, { "component": "@theme/DocTagDocListPage", "exact": true, - "modules": { - "tag": "~docs/tag-docs-next-tags-bar-tag-3-permalink-94a.json", - }, "path": "/docs/next/tags/barTag-3-permalink", + "props": { + "tag": { + "allTagsPath": "/docs/next/tags", + "count": 1, + "items": [ + { + "description": "This is next version of bar.", + "id": "foo/bar", + "permalink": "/docs/next/foo/barSlug", + "title": "bar", + }, + ], + "label": "barTag 3", + "permalink": "/docs/next/tags/barTag-3-permalink", + "unlisted": false, + }, + }, }, { "component": "@theme/DocRoot", @@ -4437,11 +4348,91 @@ exports[`versioned website content: route config 1`] = ` { "component": "@theme/DocVersionRoot", "exact": false, - "modules": { - "version": "~docs/version-with-slugs-metadata-prop-2bf.json", - }, "path": "/docs/withSlugs", "priority": undefined, + "props": { + "version": { + "badge": true, + "banner": "unmaintained", + "className": "docs-version-withSlugs", + "docs": { + "rootAbsoluteSlug": { + "description": "Lorem", + "id": "rootAbsoluteSlug", + "sidebar": "docs", + "title": "rootAbsoluteSlug", + }, + "rootRelativeSlug": { + "description": "Lorem", + "id": "rootRelativeSlug", + "sidebar": undefined, + "title": "rootRelativeSlug", + }, + "rootResolvedSlug": { + "description": "Lorem", + "id": "rootResolvedSlug", + "sidebar": undefined, + "title": "rootResolvedSlug", + }, + "rootTryToEscapeSlug": { + "description": "Lorem", + "id": "rootTryToEscapeSlug", + "sidebar": undefined, + "title": "rootTryToEscapeSlug", + }, + "slugs/absoluteSlug": { + "description": "Lorem", + "id": "slugs/absoluteSlug", + "sidebar": undefined, + "title": "absoluteSlug", + }, + "slugs/relativeSlug": { + "description": "Lorem", + "id": "slugs/relativeSlug", + "sidebar": undefined, + "title": "relativeSlug", + }, + "slugs/resolvedSlug": { + "description": "Lorem", + "id": "slugs/resolvedSlug", + "sidebar": undefined, + "title": "resolvedSlug", + }, + "slugs/tryToEscapeSlug": { + "description": "Lorem", + "id": "slugs/tryToEscapeSlug", + "sidebar": undefined, + "title": "tryToEscapeSlug", + }, + }, + "docsSidebars": { + "docs": [ + { + "collapsed": true, + "collapsible": true, + "items": [ + { + "className": undefined, + "customProps": undefined, + "docId": "rootAbsoluteSlug", + "href": "/docs/withSlugs/rootAbsoluteSlug", + "label": "rootAbsoluteSlug", + "type": "link", + "unlisted": false, + }, + ], + "label": "Test", + "type": "category", + }, + ], + }, + "isLast": false, + "label": "withSlugs", + "noIndex": false, + "pluginId": "default", + "version": "withSlugs", + }, + }, "routes": [ { "component": "@theme/DocRoot", @@ -4552,11 +4543,72 @@ exports[`versioned website content: route config 1`] = ` { "component": "@theme/DocVersionRoot", "exact": false, - "modules": { - "version": "~docs/version-1-0-1-metadata-prop-e87.json", - }, "path": "/docs", "priority": -1, + "props": { + "version": { + "badge": true, + "banner": null, + "className": "docs-version-1.0.1", + "docs": { + "foo/bar": { + "description": "Bar 1.0.1 !", + "id": "foo/bar", + "sidebar": "VersionedSideBarNameDoesNotMatter/docs", + "title": "bar", + }, + "hello": { + "description": "Hello 1.0.1 !", + "id": "hello", + "sidebar": "VersionedSideBarNameDoesNotMatter/docs", + "title": "hello", + }, + }, + "docsSidebars": { + "VersionedSideBarNameDoesNotMatter/docs": [ + { + "collapsed": true, + "collapsible": true, + "items": [ + { + "className": undefined, + "customProps": undefined, + "docId": "foo/bar", + "href": "/docs/foo/bar", + "label": "bar", + "type": "link", + "unlisted": false, + }, + ], + "label": "Test", + "type": "category", + }, + { + "collapsed": true, + "collapsible": true, + "items": [ + { + "className": undefined, + "customProps": undefined, + "docId": "hello", + "href": "/docs/", + "label": "hello", + "type": "link", + "unlisted": false, + }, + ], + "label": "Guides", + "type": "category", + }, + ], + }, + "isLast": true, + "label": "1.0.1", + "noIndex": true, + "pluginId": "default", + "version": "1.0.1", + }, + }, "routes": [ { "component": "@theme/DocRoot", diff --git a/packages/docusaurus-plugin-content-docs/src/__tests__/index.test.ts b/packages/docusaurus-plugin-content-docs/src/__tests__/index.test.ts index 1aca97041d2a..150ca3776628 100644 --- a/packages/docusaurus-plugin-content-docs/src/__tests__/index.test.ts +++ b/packages/docusaurus-plugin-content-docs/src/__tests__/index.test.ts @@ -31,7 +31,6 @@ import type { Options, PluginOptions, PropSidebarItemLink, - PropSidebars, } from '@docusaurus/plugin-content-docs'; import type { SidebarItemsGeneratorOption, @@ -76,36 +75,11 @@ const createFakeActions = (contentDir: string) => { }, }; - // Query by prefix, because files have a hash at the end so it's not - // convenient to query by full filename - function getCreatedDataByPrefix(prefix: string) { - const entry = Object.entries(dataContainer).find(([key]) => - key.startsWith(prefix), - ); - if (!entry) { - throw new Error(`No created entry found for prefix "${prefix}". -Entries created: -- ${Object.keys(dataContainer).join('\n- ')} - `); - } - return JSON.parse(entry[1] as string) as PropSidebars; - } - // Extra fns useful for tests! const utils = { getGlobalData: () => globalDataContainer, getRouteConfigs: () => routeConfigs, - checkVersionMetadataPropCreated: (version: LoadedVersion | undefined) => { - if (!version) { - throw new Error('Version not found'); - } - const versionMetadataProp = getCreatedDataByPrefix( - `version-${_.kebabCase(version.versionName)}-metadata-prop`, - ); - expect(versionMetadataProp.docsSidebars).toEqual(toSidebarsProp(version)); - }, - expectSnapshot: () => { // Sort the route config like in src/server/plugins/index.ts for // consistent snapshot ordering @@ -335,11 +309,8 @@ describe('simple website', () => { await plugin.contentLoaded!({ content, actions, - allContent: {}, }); - utils.checkVersionMetadataPropCreated(currentVersion); - utils.expectSnapshot(); expect(utils.getGlobalData()).toMatchSnapshot(); @@ -464,14 +435,8 @@ describe('versioned website', () => { await plugin.contentLoaded!({ content, actions, - allContent: {}, }); - utils.checkVersionMetadataPropCreated(currentVersion); - utils.checkVersionMetadataPropCreated(version101); - utils.checkVersionMetadataPropCreated(version100); - utils.checkVersionMetadataPropCreated(versionWithSlugs); - utils.expectSnapshot(); }); }); @@ -569,12 +534,8 @@ describe('versioned website (community)', () => { await plugin.contentLoaded!({ content, actions, - allContent: {}, }); - utils.checkVersionMetadataPropCreated(currentVersion); - utils.checkVersionMetadataPropCreated(version100); - utils.expectSnapshot(); }); }); From 46bfb690e213a1d5ae15fe4ad1d24ce973d34a6c Mon Sep 17 00:00:00 2001 From: sebastien Date: Tue, 16 Apr 2024 12:43:50 +0200 Subject: [PATCH 20/25] fix test TS --- .../src/__tests__/translations.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/docusaurus-plugin-content-blog/src/__tests__/translations.test.ts b/packages/docusaurus-plugin-content-blog/src/__tests__/translations.test.ts index 8de26a3fb05b..97db9eac8748 100644 --- a/packages/docusaurus-plugin-content-blog/src/__tests__/translations.test.ts +++ b/packages/docusaurus-plugin-content-blog/src/__tests__/translations.test.ts @@ -34,6 +34,7 @@ const sampleBlogPosts: BlogPost[] = [ hasTruncateMarker: true, authors: [], frontMatter: {}, + unlisted: false, }, content: '', }, From 07e0beff555f615efcc1a443ff6871295d9174a5 Mon Sep 17 00:00:00 2001 From: sebastien Date: Tue, 16 Apr 2024 13:07:41 +0200 Subject: [PATCH 21/25] fix snapshots --- .../src/__tests__/__snapshots__/translations.test.ts.snap | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/docusaurus-plugin-content-blog/src/__tests__/__snapshots__/translations.test.ts.snap b/packages/docusaurus-plugin-content-blog/src/__tests__/__snapshots__/translations.test.ts.snap index 2a19730b60f0..ecb579574d0b 100644 --- a/packages/docusaurus-plugin-content-blog/src/__tests__/__snapshots__/translations.test.ts.snap +++ b/packages/docusaurus-plugin-content-blog/src/__tests__/__snapshots__/translations.test.ts.snap @@ -56,6 +56,7 @@ exports[`translateContent falls back when translation is incomplete 1`] = ` "source": "/blog/2021/06/19/hello", "tags": [], "title": "Hello", + "unlisted": false, }, }, ], @@ -99,6 +100,7 @@ exports[`translateContent returns translated loaded 1`] = ` "source": "/blog/2021/06/19/hello", "tags": [], "title": "Hello", + "unlisted": false, }, }, ], From f8774e851f591bde32d4224e818cdbe30260b98d Mon Sep 17 00:00:00 2001 From: sebastien Date: Tue, 16 Apr 2024 13:11:16 +0200 Subject: [PATCH 22/25] createData should support object content --- .../src/routes.ts | 26 +++++++++---------- packages/docusaurus-types/src/plugin.d.ts | 2 +- .../docusaurus/src/server/plugins/actions.ts | 4 ++- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/packages/docusaurus-plugin-content-blog/src/routes.ts b/packages/docusaurus-plugin-content-blog/src/routes.ts index 7d2f3394f655..a810ce13dabc 100644 --- a/packages/docusaurus-plugin-content-blog/src/routes.ts +++ b/packages/docusaurus-plugin-content-blog/src/routes.ts @@ -26,6 +26,7 @@ import type { BlogContent, PluginOptions, BlogPost, + BlogSidebar, } from '@docusaurus/plugin-content-blog'; type CreateAllRoutesParam = { @@ -87,20 +88,17 @@ export async function buildAllRoutes({ : blogPosts.slice(0, options.blogSidebarCount); async function createSidebarModule() { + const sidebar: BlogSidebar = { + title: blogSidebarTitle, + items: sidebarBlogPosts.map((blogPost) => ({ + title: blogPost.metadata.title, + permalink: blogPost.metadata.permalink, + unlisted: blogPost.metadata.unlisted, + })), + }; const modulePath = await createData( `blog-post-list-prop-${pluginId}.json`, - JSON.stringify( - { - title: blogSidebarTitle, - items: sidebarBlogPosts.map((blogPost) => ({ - title: blogPost.metadata.title, - permalink: blogPost.metadata.permalink, - unlisted: blogPost.metadata.unlisted, - })), - }, - null, - 2, - ), + sidebar, ); return aliasedSource(modulePath); } @@ -112,7 +110,7 @@ export async function buildAllRoutes({ }; const modulePath = await createData( `blogMetadata-${pluginId}.json`, - JSON.stringify(blogMetadata, null, 2), + blogMetadata, ); return aliasedSource(modulePath); } @@ -171,7 +169,7 @@ export async function buildAllRoutes({ // Note that this created data path must be in sync with // metadataPath provided to mdx-loader. `${docuHash(metadata.source)}.json`, - JSON.stringify(metadata, null, 2), + metadata, ); }), ); diff --git a/packages/docusaurus-types/src/plugin.d.ts b/packages/docusaurus-types/src/plugin.d.ts index fddc9c4fa5af..076a39354a88 100644 --- a/packages/docusaurus-types/src/plugin.d.ts +++ b/packages/docusaurus-types/src/plugin.d.ts @@ -49,7 +49,7 @@ export type PluginVersionInformation = export type PluginContentLoadedActions = { addRoute: (config: RouteConfig) => void; - createData: (name: string, data: string) => Promise; + createData: (name: string, data: string | object) => Promise; setGlobalData: (data: unknown) => void; }; diff --git a/packages/docusaurus/src/server/plugins/actions.ts b/packages/docusaurus/src/server/plugins/actions.ts index 47633697e1ea..123a98166b46 100644 --- a/packages/docusaurus/src/server/plugins/actions.ts +++ b/packages/docusaurus/src/server/plugins/actions.ts @@ -84,7 +84,9 @@ export async function createPluginActionsUtils({ }, async createData(name, data) { const modulePath = path.join(dataDir, name); - await generate(dataDir, name, data); + const dataString = + typeof data === 'string' ? data : JSON.stringify(data, null, 2); + await generate(dataDir, name, dataString); return modulePath; }, setGlobalData(data) { From a78b23715e392e0069ba46eea868f9b22291c244 Mon Sep 17 00:00:00 2001 From: sebastien Date: Tue, 16 Apr 2024 13:15:38 +0200 Subject: [PATCH 23/25] createData should support object content --- .../__snapshots__/index.test.ts.snap | 1944 ++++++++++------- .../src/routes.ts | 2 +- .../src/routes.ts | 2 +- 3 files changed, 1099 insertions(+), 849 deletions(-) diff --git a/packages/docusaurus-plugin-content-docs/src/__tests__/__snapshots__/index.test.ts.snap b/packages/docusaurus-plugin-content-docs/src/__tests__/__snapshots__/index.test.ts.snap index 1c57afda7ebe..a19421255bc8 100644 --- a/packages/docusaurus-plugin-content-docs/src/__tests__/__snapshots__/index.test.ts.snap +++ b/packages/docusaurus-plugin-content-docs/src/__tests__/__snapshots__/index.test.ts.snap @@ -430,509 +430,630 @@ exports[`simple website content 5`] = ` exports[`simple website content: data 1`] = ` { - "site-docs-custom-last-update-md-b8d.json": "{ - "id": "customLastUpdate", - "title": "Custom Last Update", - "description": "Custom last update", - "source": "@site/docs/customLastUpdate.md", - "sourceDirName": ".", - "slug": "/customLastUpdate", - "permalink": "/docs/customLastUpdate", - "draft": false, - "unlisted": false, - "tags": [], - "version": "current", - "frontMatter": { + "site-docs-custom-last-update-md-b8d.json": { + "description": "Custom last update", + "draft": false, + "editUrl": undefined, + "frontMatter": { + "last_update": { + "author": "Custom Author (processed by parseFrontMatter)", + "date": "1/1/2000", + }, + "title": "Custom Last Update", + }, + "id": "customLastUpdate", + "lastUpdatedAt": undefined, + "lastUpdatedBy": undefined, + "next": undefined, + "permalink": "/docs/customLastUpdate", + "previous": undefined, + "sidebar": undefined, + "sidebarPosition": undefined, + "slug": "/customLastUpdate", + "source": "@site/docs/customLastUpdate.md", + "sourceDirName": ".", + "tags": [], "title": "Custom Last Update", - "last_update": { - "author": "Custom Author (processed by parseFrontMatter)", - "date": "1/1/2000" - } - } -}", - "site-docs-doc-draft-md-584.json": "{ - "id": "doc-draft", - "title": "doc-draft", - "description": "This is a draft document", - "source": "@site/docs/doc-draft.md", - "sourceDirName": ".", - "slug": "/doc-draft", - "permalink": "/docs/doc-draft", - "draft": false, - "unlisted": false, - "tags": [], - "version": "current", - "frontMatter": { - "draft": true - } -}", - "site-docs-doc-unlisted-md-80b.json": "{ - "id": "doc-unlisted", - "title": "doc-unlisted", - "description": "This is an unlisted document", - "source": "@site/docs/doc-unlisted.md", - "sourceDirName": ".", - "slug": "/doc-unlisted", - "permalink": "/docs/doc-unlisted", - "draft": false, - "unlisted": false, - "tags": [], - "version": "current", - "frontMatter": { - "unlisted": true + "unlisted": false, + "version": "current", }, - "sidebar": "docs", - "previous": { - "title": "Bar", - "permalink": "/docs/foo/bar" + "site-docs-doc-draft-md-584.json": { + "description": "This is a draft document", + "draft": false, + "editUrl": undefined, + "frontMatter": { + "draft": true, + }, + "id": "doc-draft", + "lastUpdatedAt": undefined, + "lastUpdatedBy": undefined, + "next": undefined, + "permalink": "/docs/doc-draft", + "previous": undefined, + "sidebar": undefined, + "sidebarPosition": undefined, + "slug": "/doc-draft", + "source": "@site/docs/doc-draft.md", + "sourceDirName": ".", + "tags": [], + "title": "doc-draft", + "unlisted": false, + "version": "current", }, - "next": { - "title": "baz pagination_label", - "permalink": "/docs/foo/bazSlug.html" - } -}", - "site-docs-doc-with-space-md-e90.json": "{ - "id": "doc with space", - "title": "Hoo hoo, if this path tricks you...", - "description": "", - "source": "@site/docs/doc with space.md", - "sourceDirName": ".", - "slug": "/doc with space", - "permalink": "/docs/doc with space", - "draft": false, - "unlisted": false, - "tags": [], - "version": "current", - "frontMatter": {} -}", - "site-docs-foo-bar-md-8c2.json": "{ - "id": "foo/bar", - "title": "Bar", - "description": "This is custom description", - "source": "@site/docs/foo/bar.md", - "sourceDirName": "foo", - "slug": "/foo/bar", - "permalink": "/docs/foo/bar", - "draft": false, - "unlisted": false, - "tags": [], - "version": "current", - "frontMatter": { - "id": "bar", - "title": "Bar", + "site-docs-doc-unlisted-md-80b.json": { + "description": "This is an unlisted document", + "draft": false, + "editUrl": undefined, + "frontMatter": { + "unlisted": true, + }, + "id": "doc-unlisted", + "lastUpdatedAt": undefined, + "lastUpdatedBy": undefined, + "next": { + "permalink": "/docs/foo/bazSlug.html", + "title": "baz pagination_label", + }, + "permalink": "/docs/doc-unlisted", + "previous": { + "permalink": "/docs/foo/bar", + "title": "Bar", + }, + "sidebar": "docs", + "sidebarPosition": undefined, + "slug": "/doc-unlisted", + "source": "@site/docs/doc-unlisted.md", + "sourceDirName": ".", + "tags": [], + "title": "doc-unlisted", + "unlisted": false, + "version": "current", + }, + "site-docs-doc-with-space-md-e90.json": { + "description": "", + "draft": false, + "editUrl": undefined, + "frontMatter": {}, + "id": "doc with space", + "lastUpdatedAt": undefined, + "lastUpdatedBy": undefined, + "next": undefined, + "permalink": "/docs/doc with space", + "previous": undefined, + "sidebar": undefined, + "sidebarPosition": undefined, + "slug": "/doc with space", + "source": "@site/docs/doc with space.md", + "sourceDirName": ".", + "tags": [], + "title": "Hoo hoo, if this path tricks you...", + "unlisted": false, + "version": "current", + }, + "site-docs-foo-bar-md-8c2.json": { "description": "This is custom description", - "pagination_next": null, - "pagination_prev": null + "draft": false, + "editUrl": undefined, + "frontMatter": { + "description": "This is custom description", + "id": "bar", + "pagination_next": null, + "pagination_prev": null, + "title": "Bar", + }, + "id": "foo/bar", + "lastUpdatedAt": undefined, + "lastUpdatedBy": undefined, + "next": undefined, + "permalink": "/docs/foo/bar", + "previous": undefined, + "sidebar": "docs", + "sidebarPosition": undefined, + "slug": "/foo/bar", + "source": "@site/docs/foo/bar.md", + "sourceDirName": "foo", + "tags": [], + "title": "Bar", + "unlisted": false, + "version": "current", }, - "sidebar": "docs" -}", - "site-docs-foo-baz-md-a69.json": "{ - "id": "foo/baz", - "title": "baz", - "description": "Images", - "source": "@site/docs/foo/baz.md", - "sourceDirName": "foo", - "slug": "/foo/bazSlug.html", - "permalink": "/docs/foo/bazSlug.html", - "draft": false, - "unlisted": false, - "tags": [ - { - "label": "tag 1", - "permalink": "/docs/tags/tag-1" + "site-docs-foo-baz-md-a69.json": { + "description": "Images", + "draft": false, + "editUrl": undefined, + "frontMatter": { + "id": "baz", + "pagination_label": "baz pagination_label", + "slug": "bazSlug.html", + "tags": [ + "tag 1", + "tag-1", + { + "label": "tag 2", + "permalink": "tag2-custom-permalink", + }, + ], + "title": "baz", }, - { - "label": "tag 2", - "permalink": "/docs/tags/tag2-custom-permalink" - } - ], - "version": "current", - "frontMatter": { - "id": "baz", - "title": "baz", - "slug": "bazSlug.html", - "pagination_label": "baz pagination_label", + "id": "foo/baz", + "lastUpdatedAt": undefined, + "lastUpdatedBy": undefined, + "next": { + "permalink": "/docs/unlisted-category/", + "title": "unlisted-category-index", + }, + "permalink": "/docs/foo/bazSlug.html", + "previous": { + "permalink": "/docs/doc-unlisted", + "title": "doc-unlisted", + }, + "sidebar": "docs", + "sidebarPosition": undefined, + "slug": "/foo/bazSlug.html", + "source": "@site/docs/foo/baz.md", + "sourceDirName": "foo", "tags": [ - "tag 1", - "tag-1", + { + "label": "tag 1", + "permalink": "/docs/tags/tag-1", + }, { "label": "tag 2", - "permalink": "tag2-custom-permalink" - } - ] - }, - "sidebar": "docs", - "previous": { - "title": "doc-unlisted", - "permalink": "/docs/doc-unlisted" + "permalink": "/docs/tags/tag2-custom-permalink", + }, + ], + "title": "baz", + "unlisted": false, + "version": "current", }, - "next": { - "title": "unlisted-category-index", - "permalink": "/docs/unlisted-category/" - } -}", - "site-docs-heading-as-title-md-c6d.json": "{ - "id": "headingAsTitle", - "title": "My heading as title", - "description": "", - "source": "@site/docs/headingAsTitle.md", - "sourceDirName": ".", - "slug": "/headingAsTitle", - "permalink": "/docs/headingAsTitle", - "draft": false, - "unlisted": false, - "tags": [], - "version": "current", - "frontMatter": {}, - "sidebar": "docs", - "previous": { - "title": "rootTryToEscapeSlug", - "permalink": "/docs/rootTryToEscapeSlug" + "site-docs-heading-as-title-md-c6d.json": { + "description": "", + "draft": false, + "editUrl": undefined, + "frontMatter": {}, + "id": "headingAsTitle", + "lastUpdatedAt": undefined, + "lastUpdatedBy": undefined, + "next": { + "permalink": "/docs/", + "title": "Hello sidebar_label", + }, + "permalink": "/docs/headingAsTitle", + "previous": { + "permalink": "/docs/rootTryToEscapeSlug", + "title": "rootTryToEscapeSlug", + }, + "sidebar": "docs", + "sidebarPosition": undefined, + "slug": "/headingAsTitle", + "source": "@site/docs/headingAsTitle.md", + "sourceDirName": ".", + "tags": [], + "title": "My heading as title", + "unlisted": false, + "version": "current", }, - "next": { - "title": "Hello sidebar_label", - "permalink": "/docs/" - } -}", - "site-docs-hello-md-9df.json": "{ - "id": "hello", - "title": "Hello, World !", - "description": "Hi, Endilie here :)", - "source": "@site/docs/hello.md", - "sourceDirName": ".", - "slug": "/", - "permalink": "/docs/", - "draft": false, - "unlisted": false, - "tags": [ - { - "label": "tag-1", - "permalink": "/docs/tags/tag-1" + "site-docs-hello-md-9df.json": { + "description": "Hi, Endilie here :)", + "draft": false, + "editUrl": undefined, + "frontMatter": { + "id": "hello", + "sidebar_label": "Hello sidebar_label", + "slug": "/", + "tags": [ + "tag-1", + "tag 3", + ], + "title": "Hello, World !", }, - { - "label": "tag 3", - "permalink": "/docs/tags/tag-3" - } - ], - "version": "current", - "frontMatter": { "id": "hello", - "title": "Hello, World !", - "sidebar_label": "Hello sidebar_label", + "lastUpdatedAt": undefined, + "lastUpdatedBy": undefined, + "next": undefined, + "permalink": "/docs/", + "previous": { + "permalink": "/docs/headingAsTitle", + "title": "My heading as title", + }, + "sidebar": "docs", + "sidebarPosition": undefined, + "slug": "/", + "source": "@site/docs/hello.md", + "sourceDirName": ".", "tags": [ - "tag-1", - "tag 3" + { + "label": "tag-1", + "permalink": "/docs/tags/tag-1", + }, + { + "label": "tag 3", + "permalink": "/docs/tags/tag-3", + }, ], - "slug": "/" + "title": "Hello, World !", + "unlisted": false, + "version": "current", }, - "sidebar": "docs", - "previous": { - "title": "My heading as title", - "permalink": "/docs/headingAsTitle" - } -}", - "site-docs-ipsum-md-c61.json": "{ - "id": "ipsum", - "title": "ipsum", - "description": "Lorem ipsum.", - "source": "@site/docs/ipsum.md", - "sourceDirName": ".", - "slug": "/ipsum", - "permalink": "/docs/ipsum", - "draft": false, - "unlisted": false, - "editUrl": null, - "tags": [], - "version": "current", - "frontMatter": { - "custom_edit_url": null, - "pagination_next": "doc-unlisted" + "site-docs-ipsum-md-c61.json": { + "description": "Lorem ipsum.", + "draft": false, + "editUrl": null, + "frontMatter": { + "custom_edit_url": null, + "pagination_next": "doc-unlisted", + }, + "id": "ipsum", + "lastUpdatedAt": undefined, + "lastUpdatedBy": undefined, + "next": { + "permalink": "/docs/doc-unlisted", + "title": "doc-unlisted", + }, + "permalink": "/docs/ipsum", + "previous": undefined, + "sidebar": undefined, + "sidebarPosition": undefined, + "slug": "/ipsum", + "source": "@site/docs/ipsum.md", + "sourceDirName": ".", + "tags": [], + "title": "ipsum", + "unlisted": false, + "version": "current", }, - "next": { - "title": "doc-unlisted", - "permalink": "/docs/doc-unlisted" - } -}", - "site-docs-last-update-author-only-md-352.json": "{ - "id": "lastUpdateAuthorOnly", - "title": "Last Update Author Only", - "description": "Only custom author, so it will still use the date from Git", - "source": "@site/docs/lastUpdateAuthorOnly.md", - "sourceDirName": ".", - "slug": "/lastUpdateAuthorOnly", - "permalink": "/docs/lastUpdateAuthorOnly", - "draft": false, - "unlisted": false, - "tags": [], - "version": "current", - "frontMatter": { + "site-docs-last-update-author-only-md-352.json": { + "description": "Only custom author, so it will still use the date from Git", + "draft": false, + "editUrl": undefined, + "frontMatter": { + "last_update": { + "author": "Custom Author (processed by parseFrontMatter)", + }, + "title": "Last Update Author Only", + }, + "id": "lastUpdateAuthorOnly", + "lastUpdatedAt": undefined, + "lastUpdatedBy": undefined, + "next": undefined, + "permalink": "/docs/lastUpdateAuthorOnly", + "previous": undefined, + "sidebar": undefined, + "sidebarPosition": undefined, + "slug": "/lastUpdateAuthorOnly", + "source": "@site/docs/lastUpdateAuthorOnly.md", + "sourceDirName": ".", + "tags": [], "title": "Last Update Author Only", - "last_update": { - "author": "Custom Author (processed by parseFrontMatter)" - } - } -}", - "site-docs-last-update-date-only-md-987.json": "{ - "id": "lastUpdateDateOnly", - "title": "Last Update Date Only", - "description": "Only custom date, so it will still use the author from Git", - "source": "@site/docs/lastUpdateDateOnly.md", - "sourceDirName": ".", - "slug": "/lastUpdateDateOnly", - "permalink": "/docs/lastUpdateDateOnly", - "draft": false, - "unlisted": false, - "tags": [], - "version": "current", - "frontMatter": { - "title": "Last Update Date Only", - "last_update": { - "date": "1/1/2000" - } - } -}", - "site-docs-lorem-md-b27.json": "{ - "id": "lorem", - "title": "lorem", - "description": "Lorem ipsum.", - "source": "@site/docs/lorem.md", - "sourceDirName": ".", - "slug": "/lorem", - "permalink": "/docs/lorem", - "draft": false, - "unlisted": false, - "editUrl": "https://github.com/customUrl/docs/lorem.md", - "tags": [], - "version": "current", - "frontMatter": { - "custom_edit_url": "https://github.com/customUrl/docs/lorem.md", - "unrelated_front_matter": "won't be part of metadata" - } -}", - "site-docs-root-absolute-slug-md-db5.json": "{ - "id": "rootAbsoluteSlug", - "title": "rootAbsoluteSlug", - "description": "Lorem", - "source": "@site/docs/rootAbsoluteSlug.md", - "sourceDirName": ".", - "slug": "/rootAbsoluteSlug", - "permalink": "/docs/rootAbsoluteSlug", - "draft": false, - "unlisted": false, - "tags": [], - "version": "current", - "frontMatter": { - "slug": "/rootAbsoluteSlug", - "pagination_next": "headingAsTitle", - "pagination_prev": "foo/baz" + "unlisted": false, + "version": "current", }, - "sidebar": "docs", - "previous": { - "title": "baz pagination_label", - "permalink": "/docs/foo/bazSlug.html" + "site-docs-last-update-date-only-md-987.json": { + "description": "Only custom date, so it will still use the author from Git", + "draft": false, + "editUrl": undefined, + "frontMatter": { + "last_update": { + "date": "1/1/2000", + }, + "title": "Last Update Date Only", + }, + "id": "lastUpdateDateOnly", + "lastUpdatedAt": undefined, + "lastUpdatedBy": undefined, + "next": undefined, + "permalink": "/docs/lastUpdateDateOnly", + "previous": undefined, + "sidebar": undefined, + "sidebarPosition": undefined, + "slug": "/lastUpdateDateOnly", + "source": "@site/docs/lastUpdateDateOnly.md", + "sourceDirName": ".", + "tags": [], + "title": "Last Update Date Only", + "unlisted": false, + "version": "current", }, - "next": { - "title": "My heading as title", - "permalink": "/docs/headingAsTitle" - } -}", - "site-docs-root-relative-slug-md-3dd.json": "{ - "id": "rootRelativeSlug", - "title": "rootRelativeSlug", - "description": "Lorem", - "source": "@site/docs/rootRelativeSlug.md", - "sourceDirName": ".", - "slug": "/rootRelativeSlug", - "permalink": "/docs/rootRelativeSlug", - "draft": false, - "unlisted": false, - "tags": [], - "version": "current", - "frontMatter": { - "slug": "rootRelativeSlug", - "pagination_next": "headingAsTitle", - "pagination_prev": "foo/baz" + "site-docs-lorem-md-b27.json": { + "description": "Lorem ipsum.", + "draft": false, + "editUrl": "https://github.com/customUrl/docs/lorem.md", + "frontMatter": { + "custom_edit_url": "https://github.com/customUrl/docs/lorem.md", + "unrelated_front_matter": "won't be part of metadata", + }, + "id": "lorem", + "lastUpdatedAt": undefined, + "lastUpdatedBy": undefined, + "next": undefined, + "permalink": "/docs/lorem", + "previous": undefined, + "sidebar": undefined, + "sidebarPosition": undefined, + "slug": "/lorem", + "source": "@site/docs/lorem.md", + "sourceDirName": ".", + "tags": [], + "title": "lorem", + "unlisted": false, + "version": "current", }, - "sidebar": "docs", - "previous": { - "title": "baz pagination_label", - "permalink": "/docs/foo/bazSlug.html" + "site-docs-root-absolute-slug-md-db5.json": { + "description": "Lorem", + "draft": false, + "editUrl": undefined, + "frontMatter": { + "pagination_next": "headingAsTitle", + "pagination_prev": "foo/baz", + "slug": "/rootAbsoluteSlug", + }, + "id": "rootAbsoluteSlug", + "lastUpdatedAt": undefined, + "lastUpdatedBy": undefined, + "next": { + "permalink": "/docs/headingAsTitle", + "title": "My heading as title", + }, + "permalink": "/docs/rootAbsoluteSlug", + "previous": { + "permalink": "/docs/foo/bazSlug.html", + "title": "baz pagination_label", + }, + "sidebar": "docs", + "sidebarPosition": undefined, + "slug": "/rootAbsoluteSlug", + "source": "@site/docs/rootAbsoluteSlug.md", + "sourceDirName": ".", + "tags": [], + "title": "rootAbsoluteSlug", + "unlisted": false, + "version": "current", }, - "next": { - "title": "My heading as title", - "permalink": "/docs/headingAsTitle" - } -}", - "site-docs-root-resolved-slug-md-4d1.json": "{ - "id": "rootResolvedSlug", - "title": "rootResolvedSlug", - "description": "Lorem", - "source": "@site/docs/rootResolvedSlug.md", - "sourceDirName": ".", - "slug": "/hey/rootResolvedSlug", - "permalink": "/docs/hey/rootResolvedSlug", - "draft": false, - "unlisted": false, - "tags": [], - "version": "current", - "frontMatter": { - "slug": "./hey/ho/../rootResolvedSlug", - "pagination_next": "headingAsTitle", - "pagination_prev": "foo/baz" + "site-docs-root-relative-slug-md-3dd.json": { + "description": "Lorem", + "draft": false, + "editUrl": undefined, + "frontMatter": { + "pagination_next": "headingAsTitle", + "pagination_prev": "foo/baz", + "slug": "rootRelativeSlug", + }, + "id": "rootRelativeSlug", + "lastUpdatedAt": undefined, + "lastUpdatedBy": undefined, + "next": { + "permalink": "/docs/headingAsTitle", + "title": "My heading as title", + }, + "permalink": "/docs/rootRelativeSlug", + "previous": { + "permalink": "/docs/foo/bazSlug.html", + "title": "baz pagination_label", + }, + "sidebar": "docs", + "sidebarPosition": undefined, + "slug": "/rootRelativeSlug", + "source": "@site/docs/rootRelativeSlug.md", + "sourceDirName": ".", + "tags": [], + "title": "rootRelativeSlug", + "unlisted": false, + "version": "current", }, - "sidebar": "docs", - "previous": { - "title": "baz pagination_label", - "permalink": "/docs/foo/bazSlug.html" + "site-docs-root-resolved-slug-md-4d1.json": { + "description": "Lorem", + "draft": false, + "editUrl": undefined, + "frontMatter": { + "pagination_next": "headingAsTitle", + "pagination_prev": "foo/baz", + "slug": "./hey/ho/../rootResolvedSlug", + }, + "id": "rootResolvedSlug", + "lastUpdatedAt": undefined, + "lastUpdatedBy": undefined, + "next": { + "permalink": "/docs/headingAsTitle", + "title": "My heading as title", + }, + "permalink": "/docs/hey/rootResolvedSlug", + "previous": { + "permalink": "/docs/foo/bazSlug.html", + "title": "baz pagination_label", + }, + "sidebar": "docs", + "sidebarPosition": undefined, + "slug": "/hey/rootResolvedSlug", + "source": "@site/docs/rootResolvedSlug.md", + "sourceDirName": ".", + "tags": [], + "title": "rootResolvedSlug", + "unlisted": false, + "version": "current", }, - "next": { - "title": "My heading as title", - "permalink": "/docs/headingAsTitle" - } -}", - "site-docs-root-try-to-escape-slug-md-9ee.json": "{ - "id": "rootTryToEscapeSlug", - "title": "rootTryToEscapeSlug", - "description": "Lorem", - "source": "@site/docs/rootTryToEscapeSlug.md", - "sourceDirName": ".", - "slug": "/rootTryToEscapeSlug", - "permalink": "/docs/rootTryToEscapeSlug", - "draft": false, - "unlisted": false, - "tags": [], - "version": "current", - "frontMatter": { - "slug": "../../../../../../../../rootTryToEscapeSlug", - "pagination_next": "headingAsTitle", - "pagination_prev": "foo/baz" + "site-docs-root-try-to-escape-slug-md-9ee.json": { + "description": "Lorem", + "draft": false, + "editUrl": undefined, + "frontMatter": { + "pagination_next": "headingAsTitle", + "pagination_prev": "foo/baz", + "slug": "../../../../../../../../rootTryToEscapeSlug", + }, + "id": "rootTryToEscapeSlug", + "lastUpdatedAt": undefined, + "lastUpdatedBy": undefined, + "next": { + "permalink": "/docs/headingAsTitle", + "title": "My heading as title", + }, + "permalink": "/docs/rootTryToEscapeSlug", + "previous": { + "permalink": "/docs/foo/bazSlug.html", + "title": "baz pagination_label", + }, + "sidebar": "docs", + "sidebarPosition": undefined, + "slug": "/rootTryToEscapeSlug", + "source": "@site/docs/rootTryToEscapeSlug.md", + "sourceDirName": ".", + "tags": [], + "title": "rootTryToEscapeSlug", + "unlisted": false, + "version": "current", }, - "sidebar": "docs", - "previous": { - "title": "baz pagination_label", - "permalink": "/docs/foo/bazSlug.html" + "site-docs-slugs-absolute-slug-md-4e8.json": { + "description": "Lorem", + "draft": false, + "editUrl": undefined, + "frontMatter": { + "slug": "/absoluteSlug", + }, + "id": "slugs/absoluteSlug", + "lastUpdatedAt": undefined, + "lastUpdatedBy": undefined, + "next": undefined, + "permalink": "/docs/absoluteSlug", + "previous": undefined, + "sidebar": undefined, + "sidebarPosition": undefined, + "slug": "/absoluteSlug", + "source": "@site/docs/slugs/absoluteSlug.md", + "sourceDirName": "slugs", + "tags": [], + "title": "absoluteSlug", + "unlisted": false, + "version": "current", }, - "next": { - "title": "My heading as title", - "permalink": "/docs/headingAsTitle" - } -}", - "site-docs-slugs-absolute-slug-md-4e8.json": "{ - "id": "slugs/absoluteSlug", - "title": "absoluteSlug", - "description": "Lorem", - "source": "@site/docs/slugs/absoluteSlug.md", - "sourceDirName": "slugs", - "slug": "/absoluteSlug", - "permalink": "/docs/absoluteSlug", - "draft": false, - "unlisted": false, - "tags": [], - "version": "current", - "frontMatter": { - "slug": "/absoluteSlug" - } -}", - "site-docs-slugs-relative-slug-md-d1c.json": "{ - "id": "slugs/relativeSlug", - "title": "relativeSlug", - "description": "Lorem", - "source": "@site/docs/slugs/relativeSlug.md", - "sourceDirName": "slugs", - "slug": "/slugs/relativeSlug", - "permalink": "/docs/slugs/relativeSlug", - "draft": false, - "unlisted": false, - "tags": [], - "version": "current", - "frontMatter": { - "slug": "relativeSlug" - } -}", - "site-docs-slugs-resolved-slug-md-02b.json": "{ - "id": "slugs/resolvedSlug", - "title": "resolvedSlug", - "description": "Lorem", - "source": "@site/docs/slugs/resolvedSlug.md", - "sourceDirName": "slugs", - "slug": "/slugs/hey/resolvedSlug", - "permalink": "/docs/slugs/hey/resolvedSlug", - "draft": false, - "unlisted": false, - "tags": [], - "version": "current", - "frontMatter": { - "slug": "./hey/ho/../resolvedSlug" - } -}", - "site-docs-slugs-try-to-escape-slug-md-70d.json": "{ - "id": "slugs/tryToEscapeSlug", - "title": "tryToEscapeSlug", - "description": "Lorem", - "source": "@site/docs/slugs/tryToEscapeSlug.md", - "sourceDirName": "slugs", - "slug": "/tryToEscapeSlug", - "permalink": "/docs/tryToEscapeSlug", - "draft": false, - "unlisted": false, - "tags": [], - "version": "current", - "frontMatter": { - "slug": "../../../../../../../../tryToEscapeSlug" - } -}", - "site-docs-unlisted-category-index-md-efa.json": "{ - "id": "unlisted-category/unlisted-category-index", - "title": "unlisted-category-index", - "description": "This is an unlisted category index", - "source": "@site/docs/unlisted-category/index.md", - "sourceDirName": "unlisted-category", - "slug": "/unlisted-category/", - "permalink": "/docs/unlisted-category/", - "draft": false, - "unlisted": false, - "tags": [], - "version": "current", - "frontMatter": { - "id": "unlisted-category-index", - "unlisted": true + "site-docs-slugs-relative-slug-md-d1c.json": { + "description": "Lorem", + "draft": false, + "editUrl": undefined, + "frontMatter": { + "slug": "relativeSlug", + }, + "id": "slugs/relativeSlug", + "lastUpdatedAt": undefined, + "lastUpdatedBy": undefined, + "next": undefined, + "permalink": "/docs/slugs/relativeSlug", + "previous": undefined, + "sidebar": undefined, + "sidebarPosition": undefined, + "slug": "/slugs/relativeSlug", + "source": "@site/docs/slugs/relativeSlug.md", + "sourceDirName": "slugs", + "tags": [], + "title": "relativeSlug", + "unlisted": false, + "version": "current", }, - "sidebar": "docs", - "previous": { - "title": "baz pagination_label", - "permalink": "/docs/foo/bazSlug.html" + "site-docs-slugs-resolved-slug-md-02b.json": { + "description": "Lorem", + "draft": false, + "editUrl": undefined, + "frontMatter": { + "slug": "./hey/ho/../resolvedSlug", + }, + "id": "slugs/resolvedSlug", + "lastUpdatedAt": undefined, + "lastUpdatedBy": undefined, + "next": undefined, + "permalink": "/docs/slugs/hey/resolvedSlug", + "previous": undefined, + "sidebar": undefined, + "sidebarPosition": undefined, + "slug": "/slugs/hey/resolvedSlug", + "source": "@site/docs/slugs/resolvedSlug.md", + "sourceDirName": "slugs", + "tags": [], + "title": "resolvedSlug", + "unlisted": false, + "version": "current", }, - "next": { - "title": "unlisted-category-doc", - "permalink": "/docs/unlisted-category/unlisted-category-doc" - } -}", - "site-docs-unlisted-category-unlisted-category-doc-md-bd6.json": "{ - "id": "unlisted-category/unlisted-category-doc", - "title": "unlisted-category-doc", - "description": "This is an unlisted category doc", - "source": "@site/docs/unlisted-category/unlisted-category-doc.md", - "sourceDirName": "unlisted-category", - "slug": "/unlisted-category/unlisted-category-doc", - "permalink": "/docs/unlisted-category/unlisted-category-doc", - "draft": false, - "unlisted": false, - "tags": [], - "version": "current", - "frontMatter": { - "id": "unlisted-category-doc", - "unlisted": true + "site-docs-slugs-try-to-escape-slug-md-70d.json": { + "description": "Lorem", + "draft": false, + "editUrl": undefined, + "frontMatter": { + "slug": "../../../../../../../../tryToEscapeSlug", + }, + "id": "slugs/tryToEscapeSlug", + "lastUpdatedAt": undefined, + "lastUpdatedBy": undefined, + "next": undefined, + "permalink": "/docs/tryToEscapeSlug", + "previous": undefined, + "sidebar": undefined, + "sidebarPosition": undefined, + "slug": "/tryToEscapeSlug", + "source": "@site/docs/slugs/tryToEscapeSlug.md", + "sourceDirName": "slugs", + "tags": [], + "title": "tryToEscapeSlug", + "unlisted": false, + "version": "current", }, - "sidebar": "docs", - "previous": { + "site-docs-unlisted-category-index-md-efa.json": { + "description": "This is an unlisted category index", + "draft": false, + "editUrl": undefined, + "frontMatter": { + "id": "unlisted-category-index", + "unlisted": true, + }, + "id": "unlisted-category/unlisted-category-index", + "lastUpdatedAt": undefined, + "lastUpdatedBy": undefined, + "next": { + "permalink": "/docs/unlisted-category/unlisted-category-doc", + "title": "unlisted-category-doc", + }, + "permalink": "/docs/unlisted-category/", + "previous": { + "permalink": "/docs/foo/bazSlug.html", + "title": "baz pagination_label", + }, + "sidebar": "docs", + "sidebarPosition": undefined, + "slug": "/unlisted-category/", + "source": "@site/docs/unlisted-category/index.md", + "sourceDirName": "unlisted-category", + "tags": [], "title": "unlisted-category-index", - "permalink": "/docs/unlisted-category/" + "unlisted": false, + "version": "current", + }, + "site-docs-unlisted-category-unlisted-category-doc-md-bd6.json": { + "description": "This is an unlisted category doc", + "draft": false, + "editUrl": undefined, + "frontMatter": { + "id": "unlisted-category-doc", + "unlisted": true, + }, + "id": "unlisted-category/unlisted-category-doc", + "lastUpdatedAt": undefined, + "lastUpdatedBy": undefined, + "next": { + "permalink": "/docs/category/slugs", + "title": "Slugs", + }, + "permalink": "/docs/unlisted-category/unlisted-category-doc", + "previous": { + "permalink": "/docs/unlisted-category/", + "title": "unlisted-category-index", + }, + "sidebar": "docs", + "sidebarPosition": undefined, + "slug": "/unlisted-category/unlisted-category-doc", + "source": "@site/docs/unlisted-category/unlisted-category-doc.md", + "sourceDirName": "unlisted-category", + "tags": [], + "title": "unlisted-category-doc", + "unlisted": false, + "version": "current", }, - "next": { - "title": "Slugs", - "permalink": "/docs/category/slugs" - } -}", } `; @@ -2883,38 +3004,50 @@ exports[`versioned website (community) content: current version sidebars 1`] = ` exports[`versioned website (community) content: data 1`] = ` { - "site-community-versioned-docs-version-1-0-0-team-md-359.json": "{ - "id": "team", - "title": "team", - "description": "Team 1.0.0", - "source": "@site/community_versioned_docs/version-1.0.0/team.md", - "sourceDirName": ".", - "slug": "/team", - "permalink": "/community/team", - "draft": false, - "unlisted": false, - "tags": [], - "version": "1.0.0", - "frontMatter": {}, - "sidebar": "community" -}", - "site-i-18-n-en-docusaurus-plugin-content-docs-community-current-team-md-7e5.json": "{ - "id": "team", - "title": "Team title translated", - "description": "Team current version (translated)", - "source": "@site/i18n/en/docusaurus-plugin-content-docs-community/current/team.md", - "sourceDirName": ".", - "slug": "/team", - "permalink": "/community/next/team", - "draft": false, - "unlisted": false, - "tags": [], - "version": "current", - "frontMatter": { - "title": "Team title translated" + "site-community-versioned-docs-version-1-0-0-team-md-359.json": { + "description": "Team 1.0.0", + "draft": false, + "editUrl": undefined, + "frontMatter": {}, + "id": "team", + "lastUpdatedAt": undefined, + "lastUpdatedBy": undefined, + "next": undefined, + "permalink": "/community/team", + "previous": undefined, + "sidebar": "community", + "sidebarPosition": undefined, + "slug": "/team", + "source": "@site/community_versioned_docs/version-1.0.0/team.md", + "sourceDirName": ".", + "tags": [], + "title": "team", + "unlisted": false, + "version": "1.0.0", + }, + "site-i-18-n-en-docusaurus-plugin-content-docs-community-current-team-md-7e5.json": { + "description": "Team current version (translated)", + "draft": false, + "editUrl": undefined, + "frontMatter": { + "title": "Team title translated", + }, + "id": "team", + "lastUpdatedAt": undefined, + "lastUpdatedBy": undefined, + "next": undefined, + "permalink": "/community/next/team", + "previous": undefined, + "sidebar": "community", + "sidebarPosition": undefined, + "slug": "/team", + "source": "@site/i18n/en/docusaurus-plugin-content-docs-community/current/team.md", + "sourceDirName": ".", + "tags": [], + "title": "Team title translated", + "unlisted": false, + "version": "current", }, - "sidebar": "community" -}", } `; @@ -3394,367 +3527,484 @@ exports[`versioned website content: current version sidebars 1`] = ` exports[`versioned website content: data 1`] = ` { - "site-docs-foo-bar-md-8c2.json": "{ - "id": "foo/bar", - "title": "bar", - "description": "This is next version of bar.", - "source": "@site/docs/foo/bar.md", - "sourceDirName": "foo", - "slug": "/foo/barSlug", - "permalink": "/docs/next/foo/barSlug", - "draft": false, - "unlisted": false, - "tags": [ - { - "label": "barTag 1", - "permalink": "/docs/next/tags/bar-tag-1" + "site-docs-foo-bar-md-8c2.json": { + "description": "This is next version of bar.", + "draft": false, + "editUrl": undefined, + "frontMatter": { + "slug": "barSlug", + "tags": [ + "barTag 1", + "barTag-2", + { + "label": "barTag 3", + "permalink": "barTag-3-permalink", + }, + ], }, - { - "label": "barTag-2", - "permalink": "/docs/next/tags/bar-tag-2" + "id": "foo/bar", + "lastUpdatedAt": undefined, + "lastUpdatedBy": undefined, + "next": { + "permalink": "/docs/next/", + "title": "hello", }, - { - "label": "barTag 3", - "permalink": "/docs/next/tags/barTag-3-permalink" - } - ], - "version": "current", - "frontMatter": { - "slug": "barSlug", + "permalink": "/docs/next/foo/barSlug", + "previous": undefined, + "sidebar": "docs", + "sidebarPosition": undefined, + "slug": "/foo/barSlug", + "source": "@site/docs/foo/bar.md", + "sourceDirName": "foo", "tags": [ - "barTag 1", - "barTag-2", + { + "label": "barTag 1", + "permalink": "/docs/next/tags/bar-tag-1", + }, + { + "label": "barTag-2", + "permalink": "/docs/next/tags/bar-tag-2", + }, { "label": "barTag 3", - "permalink": "barTag-3-permalink" - } - ] + "permalink": "/docs/next/tags/barTag-3-permalink", + }, + ], + "title": "bar", + "unlisted": false, + "version": "current", }, - "sidebar": "docs", - "next": { + "site-docs-hello-md-9df.json": { + "description": "Hello next !", + "draft": false, + "editUrl": undefined, + "frontMatter": { + "slug": "/", + }, + "id": "hello", + "lastUpdatedAt": undefined, + "lastUpdatedBy": undefined, + "next": undefined, + "permalink": "/docs/next/", + "previous": { + "permalink": "/docs/next/foo/barSlug", + "title": "bar", + }, + "sidebar": "docs", + "sidebarPosition": undefined, + "slug": "/", + "source": "@site/docs/hello.md", + "sourceDirName": ".", + "tags": [], "title": "hello", - "permalink": "/docs/next/" - } -}", - "site-docs-hello-md-9df.json": "{ - "id": "hello", - "title": "hello", - "description": "Hello next !", - "source": "@site/docs/hello.md", - "sourceDirName": ".", - "slug": "/", - "permalink": "/docs/next/", - "draft": false, - "unlisted": false, - "tags": [], - "version": "current", - "frontMatter": { - "slug": "/" + "unlisted": false, + "version": "current", }, - "sidebar": "docs", - "previous": { + "site-docs-slugs-absolute-slug-md-4e8.json": { + "description": "Lorem", + "draft": false, + "editUrl": undefined, + "frontMatter": { + "slug": "/absoluteSlug", + }, + "id": "slugs/absoluteSlug", + "lastUpdatedAt": undefined, + "lastUpdatedBy": undefined, + "next": undefined, + "permalink": "/docs/next/absoluteSlug", + "previous": undefined, + "sidebar": undefined, + "sidebarPosition": undefined, + "slug": "/absoluteSlug", + "source": "@site/docs/slugs/absoluteSlug.md", + "sourceDirName": "slugs", + "tags": [], + "title": "absoluteSlug", + "unlisted": false, + "version": "current", + }, + "site-docs-slugs-relative-slug-md-d1c.json": { + "description": "Lorem", + "draft": false, + "editUrl": undefined, + "frontMatter": { + "slug": "relativeSlug", + }, + "id": "slugs/relativeSlug", + "lastUpdatedAt": undefined, + "lastUpdatedBy": undefined, + "next": undefined, + "permalink": "/docs/next/slugs/relativeSlug", + "previous": undefined, + "sidebar": undefined, + "sidebarPosition": undefined, + "slug": "/slugs/relativeSlug", + "source": "@site/docs/slugs/relativeSlug.md", + "sourceDirName": "slugs", + "tags": [], + "title": "relativeSlug", + "unlisted": false, + "version": "current", + }, + "site-docs-slugs-resolved-slug-md-02b.json": { + "description": "Lorem", + "draft": false, + "editUrl": undefined, + "frontMatter": { + "slug": "./hey/ho/../resolvedSlug", + }, + "id": "slugs/resolvedSlug", + "lastUpdatedAt": undefined, + "lastUpdatedBy": undefined, + "next": undefined, + "permalink": "/docs/next/slugs/hey/resolvedSlug", + "previous": undefined, + "sidebar": undefined, + "sidebarPosition": undefined, + "slug": "/slugs/hey/resolvedSlug", + "source": "@site/docs/slugs/resolvedSlug.md", + "sourceDirName": "slugs", + "tags": [], + "title": "resolvedSlug", + "unlisted": false, + "version": "current", + }, + "site-docs-slugs-try-to-escape-slug-md-70d.json": { + "description": "Lorem", + "draft": false, + "editUrl": undefined, + "frontMatter": { + "slug": "../../../../../../../../tryToEscapeSlug", + }, + "id": "slugs/tryToEscapeSlug", + "lastUpdatedAt": undefined, + "lastUpdatedBy": undefined, + "next": undefined, + "permalink": "/docs/next/tryToEscapeSlug", + "previous": undefined, + "sidebar": undefined, + "sidebarPosition": undefined, + "slug": "/tryToEscapeSlug", + "source": "@site/docs/slugs/tryToEscapeSlug.md", + "sourceDirName": "slugs", + "tags": [], + "title": "tryToEscapeSlug", + "unlisted": false, + "version": "current", + }, + "site-i-18-n-en-docusaurus-plugin-content-docs-version-1-0-0-hello-md-fe5.json": { + "description": "Hello 1.0.0 ! (translated en)", + "draft": false, + "editUrl": undefined, + "frontMatter": { + "slug": "/", + }, + "id": "hello", + "lastUpdatedAt": undefined, + "lastUpdatedBy": undefined, + "next": undefined, + "permalink": "/docs/1.0.0/", + "previous": { + "permalink": "/docs/1.0.0/foo/baz", + "title": "baz", + }, + "sidebar": "docs", + "sidebarPosition": undefined, + "slug": "/", + "source": "@site/i18n/en/docusaurus-plugin-content-docs/version-1.0.0/hello.md", + "sourceDirName": ".", + "tags": [], + "title": "hello", + "unlisted": false, + "version": "1.0.0", + }, + "site-versioned-docs-version-1-0-0-foo-bar-md-7a6.json": { + "description": "Bar 1.0.0 !", + "draft": false, + "editUrl": undefined, + "frontMatter": { + "slug": "barSlug", + }, + "id": "foo/bar", + "lastUpdatedAt": undefined, + "lastUpdatedBy": undefined, + "next": { + "permalink": "/docs/1.0.0/foo/baz", + "title": "baz", + }, + "permalink": "/docs/1.0.0/foo/barSlug", + "previous": undefined, + "sidebar": "docs", + "sidebarPosition": undefined, + "slug": "/foo/barSlug", + "source": "@site/versioned_docs/version-1.0.0/foo/bar.md", + "sourceDirName": "foo", + "tags": [], "title": "bar", - "permalink": "/docs/next/foo/barSlug" - } -}", - "site-docs-slugs-absolute-slug-md-4e8.json": "{ - "id": "slugs/absoluteSlug", - "title": "absoluteSlug", - "description": "Lorem", - "source": "@site/docs/slugs/absoluteSlug.md", - "sourceDirName": "slugs", - "slug": "/absoluteSlug", - "permalink": "/docs/next/absoluteSlug", - "draft": false, - "unlisted": false, - "tags": [], - "version": "current", - "frontMatter": { - "slug": "/absoluteSlug" - } -}", - "site-docs-slugs-relative-slug-md-d1c.json": "{ - "id": "slugs/relativeSlug", - "title": "relativeSlug", - "description": "Lorem", - "source": "@site/docs/slugs/relativeSlug.md", - "sourceDirName": "slugs", - "slug": "/slugs/relativeSlug", - "permalink": "/docs/next/slugs/relativeSlug", - "draft": false, - "unlisted": false, - "tags": [], - "version": "current", - "frontMatter": { - "slug": "relativeSlug" - } -}", - "site-docs-slugs-resolved-slug-md-02b.json": "{ - "id": "slugs/resolvedSlug", - "title": "resolvedSlug", - "description": "Lorem", - "source": "@site/docs/slugs/resolvedSlug.md", - "sourceDirName": "slugs", - "slug": "/slugs/hey/resolvedSlug", - "permalink": "/docs/next/slugs/hey/resolvedSlug", - "draft": false, - "unlisted": false, - "tags": [], - "version": "current", - "frontMatter": { - "slug": "./hey/ho/../resolvedSlug" - } -}", - "site-docs-slugs-try-to-escape-slug-md-70d.json": "{ - "id": "slugs/tryToEscapeSlug", - "title": "tryToEscapeSlug", - "description": "Lorem", - "source": "@site/docs/slugs/tryToEscapeSlug.md", - "sourceDirName": "slugs", - "slug": "/tryToEscapeSlug", - "permalink": "/docs/next/tryToEscapeSlug", - "draft": false, - "unlisted": false, - "tags": [], - "version": "current", - "frontMatter": { - "slug": "../../../../../../../../tryToEscapeSlug" - } -}", - "site-i-18-n-en-docusaurus-plugin-content-docs-version-1-0-0-hello-md-fe5.json": "{ - "id": "hello", - "title": "hello", - "description": "Hello 1.0.0 ! (translated en)", - "source": "@site/i18n/en/docusaurus-plugin-content-docs/version-1.0.0/hello.md", - "sourceDirName": ".", - "slug": "/", - "permalink": "/docs/1.0.0/", - "draft": false, - "unlisted": false, - "tags": [], - "version": "1.0.0", - "frontMatter": { - "slug": "/" + "unlisted": false, + "version": "1.0.0", }, - "sidebar": "docs", - "previous": { + "site-versioned-docs-version-1-0-0-foo-baz-md-883.json": { + "description": "Baz 1.0.0 ! This will be deleted in next subsequent versions.", + "draft": false, + "editUrl": undefined, + "frontMatter": {}, + "id": "foo/baz", + "lastUpdatedAt": undefined, + "lastUpdatedBy": undefined, + "next": { + "permalink": "/docs/1.0.0/", + "title": "hello", + }, + "permalink": "/docs/1.0.0/foo/baz", + "previous": { + "permalink": "/docs/1.0.0/foo/barSlug", + "title": "bar", + }, + "sidebar": "docs", + "sidebarPosition": undefined, + "slug": "/foo/baz", + "source": "@site/versioned_docs/version-1.0.0/foo/baz.md", + "sourceDirName": "foo", + "tags": [], "title": "baz", - "permalink": "/docs/1.0.0/foo/baz" - } -}", - "site-versioned-docs-version-1-0-0-foo-bar-md-7a6.json": "{ - "id": "foo/bar", - "title": "bar", - "description": "Bar 1.0.0 !", - "source": "@site/versioned_docs/version-1.0.0/foo/bar.md", - "sourceDirName": "foo", - "slug": "/foo/barSlug", - "permalink": "/docs/1.0.0/foo/barSlug", - "draft": false, - "unlisted": false, - "tags": [], - "version": "1.0.0", - "frontMatter": { - "slug": "barSlug" + "unlisted": false, + "version": "1.0.0", }, - "sidebar": "docs", - "next": { - "title": "baz", - "permalink": "/docs/1.0.0/foo/baz" - } -}", - "site-versioned-docs-version-1-0-0-foo-baz-md-883.json": "{ - "id": "foo/baz", - "title": "baz", - "description": "Baz 1.0.0 ! This will be deleted in next subsequent versions.", - "source": "@site/versioned_docs/version-1.0.0/foo/baz.md", - "sourceDirName": "foo", - "slug": "/foo/baz", - "permalink": "/docs/1.0.0/foo/baz", - "draft": false, - "unlisted": false, - "tags": [], - "version": "1.0.0", - "frontMatter": {}, - "sidebar": "docs", - "previous": { + "site-versioned-docs-version-1-0-1-foo-bar-md-7a3.json": { + "description": "Bar 1.0.1 !", + "draft": false, + "editUrl": undefined, + "frontMatter": {}, + "id": "foo/bar", + "lastUpdatedAt": undefined, + "lastUpdatedBy": undefined, + "next": { + "permalink": "/docs/", + "title": "hello", + }, + "permalink": "/docs/foo/bar", + "previous": undefined, + "sidebar": "VersionedSideBarNameDoesNotMatter/docs", + "sidebarPosition": undefined, + "slug": "/foo/bar", + "source": "@site/versioned_docs/version-1.0.1/foo/bar.md", + "sourceDirName": "foo", + "tags": [], "title": "bar", - "permalink": "/docs/1.0.0/foo/barSlug" + "unlisted": false, + "version": "1.0.1", }, - "next": { - "title": "hello", - "permalink": "/docs/1.0.0/" - } -}", - "site-versioned-docs-version-1-0-1-foo-bar-md-7a3.json": "{ - "id": "foo/bar", - "title": "bar", - "description": "Bar 1.0.1 !", - "source": "@site/versioned_docs/version-1.0.1/foo/bar.md", - "sourceDirName": "foo", - "slug": "/foo/bar", - "permalink": "/docs/foo/bar", - "draft": false, - "unlisted": false, - "tags": [], - "version": "1.0.1", - "frontMatter": {}, - "sidebar": "VersionedSideBarNameDoesNotMatter/docs", - "next": { + "site-versioned-docs-version-1-0-1-hello-md-0c7.json": { + "description": "Hello 1.0.1 !", + "draft": false, + "editUrl": undefined, + "frontMatter": { + "slug": "/", + }, + "id": "hello", + "lastUpdatedAt": undefined, + "lastUpdatedBy": undefined, + "next": undefined, + "permalink": "/docs/", + "previous": { + "permalink": "/docs/foo/bar", + "title": "bar", + }, + "sidebar": "VersionedSideBarNameDoesNotMatter/docs", + "sidebarPosition": undefined, + "slug": "/", + "source": "@site/versioned_docs/version-1.0.1/hello.md", + "sourceDirName": ".", + "tags": [], "title": "hello", - "permalink": "/docs/" - } -}", - "site-versioned-docs-version-1-0-1-hello-md-0c7.json": "{ - "id": "hello", - "title": "hello", - "description": "Hello 1.0.1 !", - "source": "@site/versioned_docs/version-1.0.1/hello.md", - "sourceDirName": ".", - "slug": "/", - "permalink": "/docs/", - "draft": false, - "unlisted": false, - "tags": [], - "version": "1.0.1", - "frontMatter": { - "slug": "/" + "unlisted": false, + "version": "1.0.1", }, - "sidebar": "VersionedSideBarNameDoesNotMatter/docs", - "previous": { - "title": "bar", - "permalink": "/docs/foo/bar" - } -}", - "site-versioned-docs-version-with-slugs-root-absolute-slug-md-4d2.json": "{ - "id": "rootAbsoluteSlug", - "title": "rootAbsoluteSlug", - "description": "Lorem", - "source": "@site/versioned_docs/version-withSlugs/rootAbsoluteSlug.md", - "sourceDirName": ".", - "slug": "/rootAbsoluteSlug", - "permalink": "/docs/withSlugs/rootAbsoluteSlug", - "draft": false, - "unlisted": false, - "tags": [], - "version": "withSlugs", - "frontMatter": { - "slug": "/rootAbsoluteSlug" + "site-versioned-docs-version-with-slugs-root-absolute-slug-md-4d2.json": { + "description": "Lorem", + "draft": false, + "editUrl": undefined, + "frontMatter": { + "slug": "/rootAbsoluteSlug", + }, + "id": "rootAbsoluteSlug", + "lastUpdatedAt": undefined, + "lastUpdatedBy": undefined, + "next": undefined, + "permalink": "/docs/withSlugs/rootAbsoluteSlug", + "previous": undefined, + "sidebar": "docs", + "sidebarPosition": undefined, + "slug": "/rootAbsoluteSlug", + "source": "@site/versioned_docs/version-withSlugs/rootAbsoluteSlug.md", + "sourceDirName": ".", + "tags": [], + "title": "rootAbsoluteSlug", + "unlisted": false, + "version": "withSlugs", + }, + "site-versioned-docs-version-with-slugs-root-relative-slug-md-32a.json": { + "description": "Lorem", + "draft": false, + "editUrl": undefined, + "frontMatter": { + "slug": "rootRelativeSlug", + }, + "id": "rootRelativeSlug", + "lastUpdatedAt": undefined, + "lastUpdatedBy": undefined, + "next": undefined, + "permalink": "/docs/withSlugs/rootRelativeSlug", + "previous": undefined, + "sidebar": undefined, + "sidebarPosition": undefined, + "slug": "/rootRelativeSlug", + "source": "@site/versioned_docs/version-withSlugs/rootRelativeSlug.md", + "sourceDirName": ".", + "tags": [], + "title": "rootRelativeSlug", + "unlisted": false, + "version": "withSlugs", + }, + "site-versioned-docs-version-with-slugs-root-resolved-slug-md-aee.json": { + "description": "Lorem", + "draft": false, + "editUrl": undefined, + "frontMatter": { + "slug": "./hey/ho/../rootResolvedSlug", + }, + "id": "rootResolvedSlug", + "lastUpdatedAt": undefined, + "lastUpdatedBy": undefined, + "next": undefined, + "permalink": "/docs/withSlugs/hey/rootResolvedSlug", + "previous": undefined, + "sidebar": undefined, + "sidebarPosition": undefined, + "slug": "/hey/rootResolvedSlug", + "source": "@site/versioned_docs/version-withSlugs/rootResolvedSlug.md", + "sourceDirName": ".", + "tags": [], + "title": "rootResolvedSlug", + "unlisted": false, + "version": "withSlugs", + }, + "site-versioned-docs-version-with-slugs-root-try-to-escape-slug-md-b5d.json": { + "description": "Lorem", + "draft": false, + "editUrl": undefined, + "frontMatter": { + "slug": "../../../../../../../../rootTryToEscapeSlug", + }, + "id": "rootTryToEscapeSlug", + "lastUpdatedAt": undefined, + "lastUpdatedBy": undefined, + "next": undefined, + "permalink": "/docs/withSlugs/rootTryToEscapeSlug", + "previous": undefined, + "sidebar": undefined, + "sidebarPosition": undefined, + "slug": "/rootTryToEscapeSlug", + "source": "@site/versioned_docs/version-withSlugs/rootTryToEscapeSlug.md", + "sourceDirName": ".", + "tags": [], + "title": "rootTryToEscapeSlug", + "unlisted": false, + "version": "withSlugs", + }, + "site-versioned-docs-version-with-slugs-slugs-absolute-slug-md-47a.json": { + "description": "Lorem", + "draft": false, + "editUrl": undefined, + "frontMatter": { + "slug": "/absoluteSlug", + }, + "id": "slugs/absoluteSlug", + "lastUpdatedAt": undefined, + "lastUpdatedBy": undefined, + "next": undefined, + "permalink": "/docs/withSlugs/absoluteSlug", + "previous": undefined, + "sidebar": undefined, + "sidebarPosition": undefined, + "slug": "/absoluteSlug", + "source": "@site/versioned_docs/version-withSlugs/slugs/absoluteSlug.md", + "sourceDirName": "slugs", + "tags": [], + "title": "absoluteSlug", + "unlisted": false, + "version": "withSlugs", + }, + "site-versioned-docs-version-with-slugs-slugs-relative-slug-md-a95.json": { + "description": "Lorem", + "draft": false, + "editUrl": undefined, + "frontMatter": { + "slug": "relativeSlug", + }, + "id": "slugs/relativeSlug", + "lastUpdatedAt": undefined, + "lastUpdatedBy": undefined, + "next": undefined, + "permalink": "/docs/withSlugs/slugs/relativeSlug", + "previous": undefined, + "sidebar": undefined, + "sidebarPosition": undefined, + "slug": "/slugs/relativeSlug", + "source": "@site/versioned_docs/version-withSlugs/slugs/relativeSlug.md", + "sourceDirName": "slugs", + "tags": [], + "title": "relativeSlug", + "unlisted": false, + "version": "withSlugs", + }, + "site-versioned-docs-version-with-slugs-slugs-resolved-slug-md-5a1.json": { + "description": "Lorem", + "draft": false, + "editUrl": undefined, + "frontMatter": { + "slug": "./hey/ho/../resolvedSlug", + }, + "id": "slugs/resolvedSlug", + "lastUpdatedAt": undefined, + "lastUpdatedBy": undefined, + "next": undefined, + "permalink": "/docs/withSlugs/slugs/hey/resolvedSlug", + "previous": undefined, + "sidebar": undefined, + "sidebarPosition": undefined, + "slug": "/slugs/hey/resolvedSlug", + "source": "@site/versioned_docs/version-withSlugs/slugs/resolvedSlug.md", + "sourceDirName": "slugs", + "tags": [], + "title": "resolvedSlug", + "unlisted": false, + "version": "withSlugs", + }, + "site-versioned-docs-version-with-slugs-slugs-try-to-escape-slug-md-4e1.json": { + "description": "Lorem", + "draft": false, + "editUrl": undefined, + "frontMatter": { + "slug": "../../../../../../../../tryToEscapeSlug", + }, + "id": "slugs/tryToEscapeSlug", + "lastUpdatedAt": undefined, + "lastUpdatedBy": undefined, + "next": undefined, + "permalink": "/docs/withSlugs/tryToEscapeSlug", + "previous": undefined, + "sidebar": undefined, + "sidebarPosition": undefined, + "slug": "/tryToEscapeSlug", + "source": "@site/versioned_docs/version-withSlugs/slugs/tryToEscapeSlug.md", + "sourceDirName": "slugs", + "tags": [], + "title": "tryToEscapeSlug", + "unlisted": false, + "version": "withSlugs", }, - "sidebar": "docs" -}", - "site-versioned-docs-version-with-slugs-root-relative-slug-md-32a.json": "{ - "id": "rootRelativeSlug", - "title": "rootRelativeSlug", - "description": "Lorem", - "source": "@site/versioned_docs/version-withSlugs/rootRelativeSlug.md", - "sourceDirName": ".", - "slug": "/rootRelativeSlug", - "permalink": "/docs/withSlugs/rootRelativeSlug", - "draft": false, - "unlisted": false, - "tags": [], - "version": "withSlugs", - "frontMatter": { - "slug": "rootRelativeSlug" - } -}", - "site-versioned-docs-version-with-slugs-root-resolved-slug-md-aee.json": "{ - "id": "rootResolvedSlug", - "title": "rootResolvedSlug", - "description": "Lorem", - "source": "@site/versioned_docs/version-withSlugs/rootResolvedSlug.md", - "sourceDirName": ".", - "slug": "/hey/rootResolvedSlug", - "permalink": "/docs/withSlugs/hey/rootResolvedSlug", - "draft": false, - "unlisted": false, - "tags": [], - "version": "withSlugs", - "frontMatter": { - "slug": "./hey/ho/../rootResolvedSlug" - } -}", - "site-versioned-docs-version-with-slugs-root-try-to-escape-slug-md-b5d.json": "{ - "id": "rootTryToEscapeSlug", - "title": "rootTryToEscapeSlug", - "description": "Lorem", - "source": "@site/versioned_docs/version-withSlugs/rootTryToEscapeSlug.md", - "sourceDirName": ".", - "slug": "/rootTryToEscapeSlug", - "permalink": "/docs/withSlugs/rootTryToEscapeSlug", - "draft": false, - "unlisted": false, - "tags": [], - "version": "withSlugs", - "frontMatter": { - "slug": "../../../../../../../../rootTryToEscapeSlug" - } -}", - "site-versioned-docs-version-with-slugs-slugs-absolute-slug-md-47a.json": "{ - "id": "slugs/absoluteSlug", - "title": "absoluteSlug", - "description": "Lorem", - "source": "@site/versioned_docs/version-withSlugs/slugs/absoluteSlug.md", - "sourceDirName": "slugs", - "slug": "/absoluteSlug", - "permalink": "/docs/withSlugs/absoluteSlug", - "draft": false, - "unlisted": false, - "tags": [], - "version": "withSlugs", - "frontMatter": { - "slug": "/absoluteSlug" - } -}", - "site-versioned-docs-version-with-slugs-slugs-relative-slug-md-a95.json": "{ - "id": "slugs/relativeSlug", - "title": "relativeSlug", - "description": "Lorem", - "source": "@site/versioned_docs/version-withSlugs/slugs/relativeSlug.md", - "sourceDirName": "slugs", - "slug": "/slugs/relativeSlug", - "permalink": "/docs/withSlugs/slugs/relativeSlug", - "draft": false, - "unlisted": false, - "tags": [], - "version": "withSlugs", - "frontMatter": { - "slug": "relativeSlug" - } -}", - "site-versioned-docs-version-with-slugs-slugs-resolved-slug-md-5a1.json": "{ - "id": "slugs/resolvedSlug", - "title": "resolvedSlug", - "description": "Lorem", - "source": "@site/versioned_docs/version-withSlugs/slugs/resolvedSlug.md", - "sourceDirName": "slugs", - "slug": "/slugs/hey/resolvedSlug", - "permalink": "/docs/withSlugs/slugs/hey/resolvedSlug", - "draft": false, - "unlisted": false, - "tags": [], - "version": "withSlugs", - "frontMatter": { - "slug": "./hey/ho/../resolvedSlug" - } -}", - "site-versioned-docs-version-with-slugs-slugs-try-to-escape-slug-md-4e1.json": "{ - "id": "slugs/tryToEscapeSlug", - "title": "tryToEscapeSlug", - "description": "Lorem", - "source": "@site/versioned_docs/version-withSlugs/slugs/tryToEscapeSlug.md", - "sourceDirName": "slugs", - "slug": "/tryToEscapeSlug", - "permalink": "/docs/withSlugs/tryToEscapeSlug", - "draft": false, - "unlisted": false, - "tags": [], - "version": "withSlugs", - "frontMatter": { - "slug": "../../../../../../../../tryToEscapeSlug" - } -}", } `; diff --git a/packages/docusaurus-plugin-content-docs/src/routes.ts b/packages/docusaurus-plugin-content-docs/src/routes.ts index 5cfc6895f09b..14c55f154039 100644 --- a/packages/docusaurus-plugin-content-docs/src/routes.ts +++ b/packages/docusaurus-plugin-content-docs/src/routes.ts @@ -75,7 +75,7 @@ async function buildVersionDocRoutes({ // Note that this created data path must be in sync with // metadataPath provided to mdx-loader. `${docuHash(doc.source)}.json`, - JSON.stringify(doc, null, 2), + doc, ); const docRoute: RouteConfig = { diff --git a/packages/docusaurus-plugin-content-pages/src/routes.ts b/packages/docusaurus-plugin-content-pages/src/routes.ts index cc3b1f162cc1..2de677c45fb5 100644 --- a/packages/docusaurus-plugin-content-pages/src/routes.ts +++ b/packages/docusaurus-plugin-content-pages/src/routes.ts @@ -54,7 +54,7 @@ export async function buildAllRoutes({ // Note that this created data path must be in sync with // metadataPath provided to mdx-loader. `${docuHash(metadata.source)}.json`, - JSON.stringify(metadata, null, 2), + metadata, ); return { path: metadata.permalink, From d1b7e26774e7a305d561664a425e6db21c7c15b1 Mon Sep 17 00:00:00 2001 From: sebastien Date: Tue, 16 Apr 2024 13:16:59 +0200 Subject: [PATCH 24/25] remove unused pages webpack alias --- packages/docusaurus-plugin-content-pages/src/index.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/packages/docusaurus-plugin-content-pages/src/index.ts b/packages/docusaurus-plugin-content-pages/src/index.ts index f88954462a48..a9f7b3464293 100644 --- a/packages/docusaurus-plugin-content-pages/src/index.ts +++ b/packages/docusaurus-plugin-content-pages/src/index.ts @@ -75,11 +75,6 @@ export default function pluginContentPages( } = options; const contentDirs = getContentPathList(contentPaths); return { - resolve: { - alias: { - '~pages': pluginDataDirRoot, - }, - }, module: { rules: [ { From eeef26a52bfedeeea22960965490817eb5b2eb0c Mon Sep 17 00:00:00 2001 From: sebastien Date: Tue, 16 Apr 2024 13:37:41 +0200 Subject: [PATCH 25/25] change a bit the props module path --- packages/docusaurus/src/server/codegen/codegenRoutes.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/docusaurus/src/server/codegen/codegenRoutes.ts b/packages/docusaurus/src/server/codegen/codegenRoutes.ts index 4ae9c6213990..cb40afc585dc 100644 --- a/packages/docusaurus/src/server/codegen/codegenRoutes.ts +++ b/packages/docusaurus/src/server/codegen/codegenRoutes.ts @@ -331,19 +331,20 @@ async function generateRoutePropModule({ }) { ensureNoPropsConflict(route); + const moduleContent = JSON.stringify(route.props); + // TODO we should aim to reduce this path length // This adds bytes to the global module registry - const relativePath = path.posix.join( plugin.name, plugin.id, 'p', - `${route.path}.json`, + `${docuHash(route.path)}.json`, ); const modulePath = path.posix.join(generatedFilesDir, relativePath); const aliasedPath = path.posix.join('@generated', relativePath); - await generate(generatedFilesDir, modulePath, JSON.stringify(route.props)); + await generate(generatedFilesDir, modulePath, moduleContent); return aliasedPath; }