From e93b98a2426b0e7375cf3b53c4e57c66121cbb57 Mon Sep 17 00:00:00 2001 From: slorber Date: Mon, 25 May 2020 19:51:37 +0200 Subject: [PATCH] fix writeRedirectFiles --- .../src/collectRedirects.ts | 3 - .../src/index.ts | 2 +- .../src/writeRedirectFiles.ts | 59 +++++++++++++++---- 3 files changed, 48 insertions(+), 16 deletions(-) diff --git a/packages/docusaurus-plugin-client-redirects/src/collectRedirects.ts b/packages/docusaurus-plugin-client-redirects/src/collectRedirects.ts index 8e7a11abdd..89b36f9c03 100644 --- a/packages/docusaurus-plugin-client-redirects/src/collectRedirects.ts +++ b/packages/docusaurus-plugin-client-redirects/src/collectRedirects.ts @@ -5,7 +5,6 @@ * LICENSE file in the root directory of this source tree. */ -import path from 'path'; import {flatten, uniqBy} from 'lodash'; import { RedirectsCreator, @@ -13,8 +12,6 @@ import { RedirectMetadata, PluginOptions, } from './types'; -import createRedirectPageContent from './createRedirectPageContent'; -import {addTrailingSlash, getFilePathForRoutePath} from './utils'; import { fromExtensionsRedirectCreator, toExtensionsRedirectCreator, diff --git a/packages/docusaurus-plugin-client-redirects/src/index.ts b/packages/docusaurus-plugin-client-redirects/src/index.ts index bc0b8d2a27..1253e2b768 100644 --- a/packages/docusaurus-plugin-client-redirects/src/index.ts +++ b/packages/docusaurus-plugin-client-redirects/src/index.ts @@ -31,7 +31,7 @@ export default function pluginClientRedirectsPages( const redirects: RedirectMetadata[] = collectRedirects(pluginContext); // Write files only at the end: make code more easy to test without IO - await writeRedirectFiles(redirects); + await writeRedirectFiles(redirects, pluginContext); }, }; } diff --git a/packages/docusaurus-plugin-client-redirects/src/writeRedirectFiles.ts b/packages/docusaurus-plugin-client-redirects/src/writeRedirectFiles.ts index 7dbda45323..f98e5a8ccf 100644 --- a/packages/docusaurus-plugin-client-redirects/src/writeRedirectFiles.ts +++ b/packages/docusaurus-plugin-client-redirects/src/writeRedirectFiles.ts @@ -6,23 +6,58 @@ */ import fs from 'fs-extra'; -import {RedirectMetadata} from './types'; +import path from 'path'; +import {memoize} from 'lodash'; -type RedirectFile = Pick< - RedirectMetadata, - 'redirectAbsoluteFilePath' | 'redirectPageContent' ->; +import {PluginContext, RedirectMetadata} from './types'; +import createRedirectPageContent from './createRedirectPageContent'; +import {addTrailingSlash, getFilePathForRoutePath} from './utils'; -export default async function writeRedirectFiles(redirects: RedirectFile[]) { - async function writeRedirectFile(redirect: RedirectFile) { +type FileMetadata = RedirectMetadata & { + fileAbsolutePath: string; + fileContent: string; +}; + +function toFileMetadata( + redirects: RedirectMetadata[], + pluginContext: PluginContext, +): FileMetadata[] { + // Perf: avoid rendering the template twice with the exact same "props" + // We might create multiple redirect pages for the same destination url + // note: the first fn arg is the cache key! + const createPageContentMemoized = memoize((toUrl: string) => { + return createRedirectPageContent({toUrl}); + }); + + return redirects.map((redirect) => { + const fileAbsolutePath = path.join( + pluginContext.outDir, + getFilePathForRoutePath(redirect.fromRoutePath), + ); + const toUrl = addTrailingSlash( + `${pluginContext.baseUrl}${redirect.toRoutePath}`, + ); + const fileContent = createPageContentMemoized(toUrl); + return { + ...redirect, + fileAbsolutePath, + fileContent, + }; + }); +} + +export default async function writeRedirectFiles( + redirects: RedirectMetadata[], + pluginContext: PluginContext, +) { + async function writeFile(file: FileMetadata) { try { - await fs.writeFile( - redirect.redirectAbsoluteFilePath, - redirect.redirectPageContent, - ); + await fs.writeFile(file.fileAbsolutePath, file.fileContent); } catch (err) { throw new Error(`Redirect file creation error: ${err}`); } } - await Promise.all(redirects.map(writeRedirectFile)); + + const files = toFileMetadata(redirects, pluginContext); + await Promise.all(files.map(writeFile)); }