diff --git a/lib/model/content/front-matter-inner-document.ts b/lib/model/content/front-matter-inner-document.ts index a9b5ae737b..01e9445be7 100644 --- a/lib/model/content/front-matter-inner-document.ts +++ b/lib/model/content/front-matter-inner-document.ts @@ -1,6 +1,6 @@ import { strict as assert } from 'assert' -import { isObject } from '../../runtime' -import { abbreviatize } from '../abbreviations' +import type { contentFunc } from '@nuxt/content' +import { abbreviatize } from '../..' import type { INuxtContentParsedDocument, VueNodeType, @@ -8,8 +8,6 @@ import type { VueRenderTreeNonRoot, VueNodeTag, } from '../../types' -import type { INuxtContentDatabase } from './parser' -import type { INuxtContentResult } from './model' export interface IFrontMatterInnerDocument { /** @@ -68,70 +66,59 @@ export interface IFrontMatterInnerDocumentParsed document: INuxtContentParsedDocument | null } -export const parseMarkdownText = async ( - document: IFrontMatterInnerDocument, - database: INuxtContentDatabase, + +export const createNuxtContentParsedDocument = async ( + input: { text: string } | undefined, + $content: contentFunc, ): Promise => { - let body: INuxtContentParsedDocument - if (isObject(document) === false) { - const message = `Unexpected input, we expect an object` - throw new TypeError(message) - } - let errorSuffix = '' - if (isFrontMatterInnerDocument(document)) { - try { - /** - * Make all text with abbreviations to be wrapped into - * appropriate abbr tag. - */ - const textContent = abbreviatize(document.text) - /** - * Taking on what markdown.toJSON returns - * https://github.com/nuxt/content/blob/%40nuxt/content%401.10.0/packages/content/parsers/markdown/index.js#L95 - */ - const parsed = await database.markdown.toJSON(textContent) - if (parsed && 'body' in parsed) { - body = parsed as INuxtContentParsedDocument - return body - } - } catch (e) { - errorSuffix += String(e) - } + let md = '' + if (input && Reflect.has(input, 'text')) { + md = input.text } - const message = `There is no content to parse` + errorSuffix - throw new Error(message) + await Promise.resolve() + /** + * Make all text with abbreviations to be wrapped into + * appropriate abbr tag. + */ + md = abbreviatize(md) + /** + * Taking on what markdown.toJSON returns + * https://github.com/nuxt/content/blob/%40nuxt/content%401.10.0/packages/content/parsers/markdown/index.js#L95 + */ + const out = await $content?.database?.markdown?.toJSON(md) + return out as INuxtContentParsedDocument } export const isFrontMatterInnerDocument = ( - input: any, + input: unknown, ): input is IFrontMatterInnerDocument => { let out: boolean = false - if (input && 'text' in input) { + if (input && Reflect.has(input, 'text')) { out = true } return out } -export const assertsFrontMatterInnerDocument = ( - input: any, -): asserts input is IFrontMatterInnerDocument => { +export const assertsFrontMatterInnerDocument: (input: unknown) => asserts input is IFrontMatterInnerDocument = ( + input, +) => { const expectedMessage = `We expected to receive an IFrontMatterInnerDocument` assert.equal(isFrontMatterInnerDocument(input), true, expectedMessage) } export const isFrontMatterCoverImageInnerDocument = ( - input: any, + input: unknown, ): input is IFrontMatterCoverImageInnerDocument => { let out: boolean = false - if (input && 'text' in input && 'src' in input) { + if (isFrontMatterInnerDocument(input) && Reflect.has(input, 'src')) { out = true } return out } -export const assertsFrontMatterCoverImageInnerDocument = ( - input: any, -): asserts input is IFrontMatterCoverImageInnerDocument => { +export const assertsFrontMatterCoverImageInnerDocument: (input: unknown) => asserts input is IFrontMatterInnerDocument = ( + input, +) => { const expectedMessage = `We expected to receive an IFrontMatterCoverImageInnerDocument` assert.equal( isFrontMatterCoverImageInnerDocument(input), @@ -140,23 +127,6 @@ export const assertsFrontMatterCoverImageInnerDocument = ( ) } -export const extractFrontMatterInnerDocument = ( - input: INuxtContentResult, - key: string, -): IFrontMatterInnerDocument | null => { - let out: null | IFrontMatterInnerDocument = null - if (isObject(input) === false) { - const message = `Unexpected input, we expect an object` - throw new TypeError(message) - } - if (key in input) { - if (isFrontMatterInnerDocument(input[key])) { - out = input[key] - } - } - return out -} - export const getVueNodeTag = (node: VueRenderTreeNonRoot): VueNodeTag => { if (getVueNodeType(node) === 'element' && 'tag' in node) { diff --git a/lib/runtime/nuxt-content.ts b/lib/runtime/nuxt-content.ts index 5979f76d36..3270bf859d 100644 --- a/lib/runtime/nuxt-content.ts +++ b/lib/runtime/nuxt-content.ts @@ -1,17 +1,5 @@ -import { - extractFrontMatterInnerDocument, - parseMarkdownText, -} from '../model/content' -import { - extractFrontMatterTagsAndNormalize, - isFrontMatterCoverImageInnerDocument, - isFrontMatterInnerDocument, -} from '../model' -import type { - IFrontMatterCoverImageInnerDocument, - IFrontMatterInnerDocument, - INuxtOptionsHooks, -} from '../model/content' +import { extractFrontMatterTagsAndNormalize } from '..' +import type { INuxtOptionsHooks } from '..' import { extractVueTreeLinks } from './nuxt-content-links' const allPages = new Map>() @@ -32,8 +20,30 @@ export const getNuxtContentAllLinks = (): string[] => { return allLinks } +/** + * nuxt/content's + * - `'content:file:beforeParse ?` + * - `'content:file:beforeInsert': async (document, database) => {}` + * - `'content:options ?` + * - `'content:ready': ($content) => {}` + * + * Probably the best place to do AppVeryOldArticle + * + * Bookmarks: + * - https://content.nuxt.com/v1/getting-started/advanced#contentfilebeforeparse + */ export const nuxtContentHooks: INuxtOptionsHooks = { - 'content:file:beforeInsert': async (document, database) => { + 'content:file:beforeInsert': async (document) => { + await Promise.resolve() + /** + * Reminder + * This is a hook that runs before the content is inserted + * for every page. + * + * What's also available here + * + * - `process.client` + */ const { description = '', excerpt = '', @@ -52,6 +62,7 @@ export const nuxtContentHooks: INuxtOptionsHooks = { description, excerpt, } + if (!allPages.has(path) && redirect === '') { allPages.set(path, item) } @@ -59,7 +70,7 @@ export const nuxtContentHooks: INuxtOptionsHooks = { // Normalize tags from the source so we can have articles // with same word, different CaSiNg (e.g. Foo and foo) as the same const tags = extractFrontMatterTagsAndNormalize('tags', document) - Object.assign(document, { tags }) + Reflect.set(document, 'tags', tags) const categories = extractFrontMatterTagsAndNormalize( 'categories', document, @@ -76,37 +87,5 @@ export const nuxtContentHooks: INuxtOptionsHooks = { if (links.length > 0) { allLinks.push(...links) } - - // ------------------------------------------------------------------------ - let preamble: IFrontMatterInnerDocument | null = null - const preambleMaybe = extractFrontMatterInnerDocument(document, 'preamble') - if (isFrontMatterInnerDocument(preambleMaybe)) { - const parsedDocument = await parseMarkdownText(preambleMaybe, database) - - const merging = Object.assign(document.preamble, { - document: parsedDocument, - }) - if (isFrontMatterInnerDocument(merging)) { - preamble = merging - } - } - Reflect.set(document, 'preamble', preamble) - // ------------------------------------------------------------------------ - let coverImage: IFrontMatterCoverImageInnerDocument | null = null - const coverImageMaybe = extractFrontMatterInnerDocument( - document, - 'coverImage', - ) - if (isFrontMatterInnerDocument(coverImageMaybe)) { - const parsedDocument = await parseMarkdownText(coverImageMaybe, database) - const merging = Object.assign(document.coverImage, { - document: parsedDocument, - }) - if (isFrontMatterCoverImageInnerDocument(merging)) { - coverImage = merging - } - } - Reflect.set(document, 'coverImage', coverImage) - // ------------------------------------------------------------------------ }, } diff --git a/pages/blog/_year/_month/_slug.vue b/pages/blog/_year/_month/_slug.vue index 50efc6a710..87ffd6d438 100644 --- a/pages/blog/_year/_month/_slug.vue +++ b/pages/blog/_year/_month/_slug.vue @@ -1,19 +1,22 @@