From 12dbc67775c3e0f573793d9d2b01929e58322879 Mon Sep 17 00:00:00 2001 From: meteorlxy Date: Wed, 11 Sep 2024 20:16:57 +0800 Subject: [PATCH] fix(core): make `content` have higher priority than `filePath` in page options --- packages/core/src/page/createPage.ts | 4 +-- packages/core/src/page/index.ts | 2 +- ...geFileContent.ts => resolvePageContent.ts} | 18 +++++++---- packages/core/src/types/page.ts | 7 ++--- ...ent.spec.ts => resolvePageContent.spec.ts} | 30 ++++++++++++++----- 5 files changed, 42 insertions(+), 19 deletions(-) rename packages/core/src/page/{resolvePageFileContent.ts => resolvePageContent.ts} (51%) rename packages/core/tests/page/{resolvePageFileContent.spec.ts => resolvePageContent.spec.ts} (51%) diff --git a/packages/core/src/page/createPage.ts b/packages/core/src/page/createPage.ts index c000873c84..600d60d63d 100644 --- a/packages/core/src/page/createPage.ts +++ b/packages/core/src/page/createPage.ts @@ -3,8 +3,8 @@ import { inferPagePath } from './inferPagePath.js' import { parsePageContent } from './parsePageContent.js' import { resolvePageChunkInfo } from './resolvePageChunkInfo.js' import { resolvePageComponentInfo } from './resolvePageComponentInfo.js' +import { resolvePageContent } from './resolvePageContent.js' import { resolvePageDate } from './resolvePageDate.js' -import { resolvePageFileContent } from './resolvePageFileContent.js' import { resolvePageFilePath } from './resolvePageFilePath.js' import { resolvePageHtmlInfo } from './resolvePageHtmlInfo.js' import { resolvePageLang } from './resolvePageLang.js' @@ -27,7 +27,7 @@ export const createPage = async ( }) // read the raw file content according to the absolute file path - const content = await resolvePageFileContent({ filePath, options }) + const content = await resolvePageContent({ filePath, options }) // render page content and extract information const { diff --git a/packages/core/src/page/index.ts b/packages/core/src/page/index.ts index 6e1bc3d592..f37c622171 100644 --- a/packages/core/src/page/index.ts +++ b/packages/core/src/page/index.ts @@ -5,7 +5,7 @@ export * from './renderPageSfcBlocksToVue.js' export * from './resolvePageChunkInfo.js' export * from './resolvePageComponentInfo.js' export * from './resolvePageDate.js' -export * from './resolvePageFileContent.js' +export * from './resolvePageContent.js' export * from './resolvePageFilePath.js' export * from './resolvePageHtmlInfo.js' export * from './resolvePageLang.js' diff --git a/packages/core/src/page/resolvePageFileContent.ts b/packages/core/src/page/resolvePageContent.ts similarity index 51% rename from packages/core/src/page/resolvePageFileContent.ts rename to packages/core/src/page/resolvePageContent.ts index e05bf9a501..c4bda0732b 100644 --- a/packages/core/src/page/resolvePageFileContent.ts +++ b/packages/core/src/page/resolvePageContent.ts @@ -1,21 +1,30 @@ +import { isString } from '@vuepress/shared' import { debug, fs } from '@vuepress/utils' import type { PageOptions } from '../types/index.js' const log = debug('vuepress:core/page') +// fallback to empty string +const FALLBACK_CONTENT = '' + /** - * Resolve page file content according to filePath or options content + * Resolve page content according to `content` or `filePath` */ -export const resolvePageFileContent = async ({ +export const resolvePageContent = async ({ filePath, options, }: { filePath: string | null options: PageOptions }): Promise => { + // if `content` is provided by options, use it directly + if (isString(options.content)) { + return options.content + } + + // if `filePath` is resolved, read content from file if (filePath) { try { - // read page content from file const content = await fs.readFile(filePath, 'utf-8') return content } catch (e) { @@ -23,6 +32,5 @@ export const resolvePageFileContent = async ({ } } - // load raw content from options - return options.content ?? '' + return FALLBACK_CONTENT } diff --git a/packages/core/src/types/page.ts b/packages/core/src/types/page.ts index 178fec9782..0532d3d594 100644 --- a/packages/core/src/types/page.ts +++ b/packages/core/src/types/page.ts @@ -147,11 +147,10 @@ export type Page< */ export interface PageOptions { /** - * If `filePath` is not set, this option will be used as the raw - * markdown content of the page. + * The raw markdown content of the page. * - * If `filePath` is set, this option will be ignored, while the - * content of the file will be used. + * If `content` is not provided, the file content of the `filePath` + * will be used. */ content?: string diff --git a/packages/core/tests/page/resolvePageFileContent.spec.ts b/packages/core/tests/page/resolvePageContent.spec.ts similarity index 51% rename from packages/core/tests/page/resolvePageFileContent.spec.ts rename to packages/core/tests/page/resolvePageContent.spec.ts index 41f92f9132..f7a22b50b4 100644 --- a/packages/core/tests/page/resolvePageFileContent.spec.ts +++ b/packages/core/tests/page/resolvePageContent.spec.ts @@ -1,10 +1,10 @@ import { fs, path } from '@vuepress/utils' import { expect, it } from 'vitest' -import { resolvePageFileContent } from '../../src/index.js' +import { resolvePageContent } from '../../src/index.js' it('should resolve file content correctly from file path', async () => { const filePath = path.resolve(__dirname, '../__fixtures__/pages/foo.md') - const resolved = await resolvePageFileContent({ filePath, options: {} }) + const resolved = await resolvePageContent({ filePath, options: {} }) const expected = (await fs.readFile(filePath)).toString() expect(resolved).toBe(expected) @@ -12,24 +12,40 @@ it('should resolve file content correctly from file path', async () => { it('should use content from page options', async () => { const content = 'foobar' - const resolved = await resolvePageFileContent({ + const resolved = await resolvePageContent({ filePath: null, options: { content }, }) - expect(resolved).toBe(resolved) + + const expected = content + expect(resolved).toBe(expected) }) it('should return empty string if nothing provided', async () => { - const resolved = await resolvePageFileContent({ + const resolved = await resolvePageContent({ filePath: null, options: {}, }) - expect(resolved).toBe('') + + const expected = '' + expect(resolved).toBe(expected) +}) + +it('should use content from page options and ignore file path', async () => { + const filePath = path.resolve(__dirname, '../__fixtures__/pages/foo.md') + const content = 'foobar' + const resolved = await resolvePageContent({ + filePath, + options: { content }, + }) + + const expected = content + expect(resolved).toBe(expected) }) it('should throw error if the file does not exist', async () => { try { - await resolvePageFileContent({ + await resolvePageContent({ filePath: '404', options: {}, })