From 133ec902f34552b80be16ef64168603e5579867f Mon Sep 17 00:00:00 2001 From: Harlan Wilton Date: Sun, 5 Jun 2022 11:38:09 +1000 Subject: [PATCH 1/3] fix(transformers): opt-in to correct `extensions` spelling --- playground/content/real-content/content.md | 2 +- src/module.ts | 5 +++-- src/runtime/server/transformers/csv.ts | 2 +- src/runtime/server/transformers/json.ts | 2 +- src/runtime/server/transformers/markdown.ts | 2 +- src/runtime/server/transformers/path-meta.ts | 2 +- src/runtime/server/transformers/shiki.ts | 2 +- src/runtime/server/transformers/yaml.ts | 2 +- src/runtime/types.d.ts | 4 ++++ test/basic.test.ts | 6 +++++- test/fixtures/basic/addons/custom-transformer.ts | 11 +++++++++++ test/fixtures/basic/modules/content-helper.ts | 13 +++++++++++++ test/fixtures/basic/nuxt.config.ts | 5 ++++- 13 files changed, 47 insertions(+), 11 deletions(-) create mode 100644 test/fixtures/basic/addons/custom-transformer.ts create mode 100644 test/fixtures/basic/modules/content-helper.ts diff --git a/playground/content/real-content/content.md b/playground/content/real-content/content.md index 5b90d6a4b..5bb9e07b9 100644 --- a/playground/content/real-content/content.md +++ b/playground/content/real-content/content.md @@ -89,7 +89,7 @@ Parsers and Transformers can be defined using `defineContentPlugin`: ```ts export default defineContentPlugin({ name: 'plugin-name', - extentions: ['.md'], + extensions: ['.md'], parse: async (id, content) => {}, transform: async content => {} }) diff --git a/src/module.ts b/src/module.ts index 687f6421f..fc7565151 100644 --- a/src/module.ts +++ b/src/module.ts @@ -279,8 +279,9 @@ export default defineNuxtModule({ // TODO: remove kit usage templateUtils.importSources(contentContext.transformers), `const transformers = [${contentContext.transformers.map(templateUtils.importName).join(', ')}]`, - 'export const getParser = (ext) => transformers.find(p => ext.match(new RegExp(p.extentions.join("|"), "i")) && p.parse)', - 'export const getTransformers = (ext) => transformers.filter(p => ext.match(new RegExp(p.extentions.join("|"), "i")) && p.transform)', + 'const matchExtensionPattern = (p) => new RegExp((p.extensions || p.extentions).join("|"), "i")', + 'export const getParser = (ext) => transformers.find(p => ext.match(matchExtensionPattern(p)) && p.parse)', + 'export const getTransformers = (ext) => transformers.filter(p => ext.match(matchExtensionPattern(p)) && p.transform)', 'export default () => {}' ].join('\n') }) diff --git a/src/runtime/server/transformers/csv.ts b/src/runtime/server/transformers/csv.ts index 873d0df55..949d887b2 100644 --- a/src/runtime/server/transformers/csv.ts +++ b/src/runtime/server/transformers/csv.ts @@ -2,7 +2,7 @@ import { useRuntimeConfig } from '#imports' export default { name: 'csv', - extentions: ['.csv'], + extensions: ['.csv'], parse: async (_id, content) => { const config = { ...useRuntimeConfig().content?.csv || {} } diff --git a/src/runtime/server/transformers/json.ts b/src/runtime/server/transformers/json.ts index b8ca081b1..fd5139630 100644 --- a/src/runtime/server/transformers/json.ts +++ b/src/runtime/server/transformers/json.ts @@ -2,7 +2,7 @@ import destr from 'destr' export default { name: 'Json', - extentions: ['.json', '.json5'], + extensions: ['.json', '.json5'], parse: async (_id, content) => { let parsed = content diff --git a/src/runtime/server/transformers/markdown.ts b/src/runtime/server/transformers/markdown.ts index a36f3d5a8..48077d6a4 100644 --- a/src/runtime/server/transformers/markdown.ts +++ b/src/runtime/server/transformers/markdown.ts @@ -9,7 +9,7 @@ const importPlugin = async (p: [string, any]) => ([ export default { name: 'markdown', - extentions: ['.md'], + extensions: ['.md'], parse: async (_id, content) => { const config: MarkdownOptions = { ...useRuntimeConfig().content?.markdown || {} } config.rehypePlugins = await Promise.all((config.rehypePlugins || []).map(importPlugin)) diff --git a/src/runtime/server/transformers/path-meta.ts b/src/runtime/server/transformers/path-meta.ts index 53bc2a925..17e91cbe1 100644 --- a/src/runtime/server/transformers/path-meta.ts +++ b/src/runtime/server/transformers/path-meta.ts @@ -22,7 +22,7 @@ const describeId = (_id: string) => { export default { name: 'path-meta', - extentions: ['.*'], + extensions: ['.*'], transform (content) { const { locales, defaultLocale } = useRuntimeConfig().content || {} const { _source, _file, _path, _extension } = describeId(content._id) diff --git a/src/runtime/server/transformers/shiki.ts b/src/runtime/server/transformers/shiki.ts index 4dbd20736..e2c698586 100644 --- a/src/runtime/server/transformers/shiki.ts +++ b/src/runtime/server/transformers/shiki.ts @@ -8,7 +8,7 @@ const withContentBase = (url: string) => { export default { name: 'markdown', - extentions: ['.md'], + extensions: ['.md'], transform: async (content) => { const codeBlocks = [] visit( diff --git a/src/runtime/server/transformers/yaml.ts b/src/runtime/server/transformers/yaml.ts index 94d3189f8..50d5636c4 100644 --- a/src/runtime/server/transformers/yaml.ts +++ b/src/runtime/server/transformers/yaml.ts @@ -2,7 +2,7 @@ import { parseFrontMatter } from '../../markdown-parser' export default { name: 'Yaml', - extentions: ['.yml', '.yaml'], + extensions: ['.yml', '.yaml'], parse: async (_id, content) => { const { data } = await parseFrontMatter(`---\n${content}\n---`) diff --git a/src/runtime/types.d.ts b/src/runtime/types.d.ts index f0df92b64..ed44030af 100644 --- a/src/runtime/types.d.ts +++ b/src/runtime/types.d.ts @@ -105,7 +105,11 @@ export interface Toc { export interface ContentTransformer { name: string + /** + * @deprecated Misspelled, use `extensions` + */ extentions: string[] + extensions: string[] parse?(id: string, content: string): Promise | ParsedContent transform?: ((content: ParsedContent) => Promise) | ((content: ParsedContent) => ParsedContent) } diff --git a/test/basic.test.ts b/test/basic.test.ts index 3be5742f9..a4c3df483 100644 --- a/test/basic.test.ts +++ b/test/basic.test.ts @@ -103,6 +103,7 @@ describe('fixtures:basic', async () => { const html = await $fetch('/_partial/content-(v2)') expect(html).contains('Content (v2)') }) + testNavigation() testMarkdownParser() @@ -115,7 +116,10 @@ describe('fixtures:basic', async () => { testJSONParser() testPathMetaTransformer() - + test('transformers:custom', async () => { + const index = await fetchDocument('content:index.md') + expect(index._customTransformed).toBeTruthy() + }) // testMDCComponent() testRegex() diff --git a/test/fixtures/basic/addons/custom-transformer.ts b/test/fixtures/basic/addons/custom-transformer.ts new file mode 100644 index 000000000..2cdf3e406 --- /dev/null +++ b/test/fixtures/basic/addons/custom-transformer.ts @@ -0,0 +1,11 @@ +import { ContentTransformer } from '../../../../src/runtime/types' + +export default { + name: 'custom-transformer', + // note this is using the deprecated `extentions` as a test + extentions: ['.*'], + transform (content) { + content._customTransformed = true + return content + } +} diff --git a/test/fixtures/basic/modules/content-helper.ts b/test/fixtures/basic/modules/content-helper.ts new file mode 100644 index 000000000..81d38d547 --- /dev/null +++ b/test/fixtures/basic/modules/content-helper.ts @@ -0,0 +1,13 @@ +import { createResolver, defineNuxtModule, useNuxt } from '@nuxt/kit' + +export default defineNuxtModule({ + setup () { + const nuxt = useNuxt() + + const resolver = createResolver(import.meta.url) + + nuxt.hooks.hook('content:context', (ctx) => { + ctx.transformers.push(resolver.resolve('../addons/custom-transformer')) + }) + } +}) diff --git a/test/fixtures/basic/nuxt.config.ts b/test/fixtures/basic/nuxt.config.ts index d06739c2c..dd4fe3f65 100644 --- a/test/fixtures/basic/nuxt.config.ts +++ b/test/fixtures/basic/nuxt.config.ts @@ -16,7 +16,10 @@ export default defineNuxtConfig({ } ] }, - buildModules: [contentModule], + buildModules: [ + '~/modules/content-helper', + contentModule + ], content: { locales: ['en', 'fa'], sources: [ From 3df63f528638e42dd3dd525df59fa79d11874051 Mon Sep 17 00:00:00 2001 From: Harlan Wilton Date: Sun, 5 Jun 2022 12:20:04 +1000 Subject: [PATCH 2/3] Revert "refactor!: spell `extensions` correctly (#1204)" This reverts commit adc0143ca72b094fad908262f6fb0185ddbc07e4. --- playground/content/real-content/content.md | 2 +- src/runtime/server/transformers/csv.ts | 2 +- src/runtime/server/transformers/json.ts | 2 +- src/runtime/server/transformers/markdown.ts | 2 +- src/runtime/server/transformers/path-meta.ts | 2 +- src/runtime/server/transformers/shiki.ts | 2 +- src/runtime/server/transformers/yaml.ts | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/playground/content/real-content/content.md b/playground/content/real-content/content.md index 5bb9e07b9..5b90d6a4b 100644 --- a/playground/content/real-content/content.md +++ b/playground/content/real-content/content.md @@ -89,7 +89,7 @@ Parsers and Transformers can be defined using `defineContentPlugin`: ```ts export default defineContentPlugin({ name: 'plugin-name', - extensions: ['.md'], + extentions: ['.md'], parse: async (id, content) => {}, transform: async content => {} }) diff --git a/src/runtime/server/transformers/csv.ts b/src/runtime/server/transformers/csv.ts index 949d887b2..873d0df55 100644 --- a/src/runtime/server/transformers/csv.ts +++ b/src/runtime/server/transformers/csv.ts @@ -2,7 +2,7 @@ import { useRuntimeConfig } from '#imports' export default { name: 'csv', - extensions: ['.csv'], + extentions: ['.csv'], parse: async (_id, content) => { const config = { ...useRuntimeConfig().content?.csv || {} } diff --git a/src/runtime/server/transformers/json.ts b/src/runtime/server/transformers/json.ts index fd5139630..b8ca081b1 100644 --- a/src/runtime/server/transformers/json.ts +++ b/src/runtime/server/transformers/json.ts @@ -2,7 +2,7 @@ import destr from 'destr' export default { name: 'Json', - extensions: ['.json', '.json5'], + extentions: ['.json', '.json5'], parse: async (_id, content) => { let parsed = content diff --git a/src/runtime/server/transformers/markdown.ts b/src/runtime/server/transformers/markdown.ts index 58d6cbca0..900ff57a7 100644 --- a/src/runtime/server/transformers/markdown.ts +++ b/src/runtime/server/transformers/markdown.ts @@ -10,7 +10,7 @@ const importPlugin = async (p: [string, any]) => ([ export default { name: 'markdown', - extensions: ['.md'], + extentions: ['.md'], parse: async (_id, content) => { const config: MarkdownOptions = { ...useRuntimeConfig().content?.markdown || {} } config.rehypePlugins = await Promise.all((config.rehypePlugins || []).map(importPlugin)) diff --git a/src/runtime/server/transformers/path-meta.ts b/src/runtime/server/transformers/path-meta.ts index 61c03f6b9..2cdb67156 100644 --- a/src/runtime/server/transformers/path-meta.ts +++ b/src/runtime/server/transformers/path-meta.ts @@ -23,7 +23,7 @@ const describeId = (_id: string) => { export default { name: 'path-meta', - extensions: ['.*'], + extentions: ['.*'], transform (content) { const { locales, defaultLocale } = useRuntimeConfig().content || {} const { _source, _file, _path, _extension } = describeId(content._id) diff --git a/src/runtime/server/transformers/shiki.ts b/src/runtime/server/transformers/shiki.ts index e2c698586..4dbd20736 100644 --- a/src/runtime/server/transformers/shiki.ts +++ b/src/runtime/server/transformers/shiki.ts @@ -8,7 +8,7 @@ const withContentBase = (url: string) => { export default { name: 'markdown', - extensions: ['.md'], + extentions: ['.md'], transform: async (content) => { const codeBlocks = [] visit( diff --git a/src/runtime/server/transformers/yaml.ts b/src/runtime/server/transformers/yaml.ts index 50d5636c4..94d3189f8 100644 --- a/src/runtime/server/transformers/yaml.ts +++ b/src/runtime/server/transformers/yaml.ts @@ -2,7 +2,7 @@ import { parseFrontMatter } from '../../markdown-parser' export default { name: 'Yaml', - extensions: ['.yml', '.yaml'], + extentions: ['.yml', '.yaml'], parse: async (_id, content) => { const { data } = await parseFrontMatter(`---\n${content}\n---`) From 27339073fac1edfb464ebe563846bd2125997931 Mon Sep 17 00:00:00 2001 From: Harlan Wilton Date: Sun, 5 Jun 2022 12:20:57 +1000 Subject: [PATCH 3/3] fix: resolve revert conflict --- playground/content/real-content/content.md | 2 +- src/runtime/server/transformers/csv.ts | 2 +- src/runtime/server/transformers/json.ts | 2 +- src/runtime/server/transformers/markdown.ts | 2 +- src/runtime/server/transformers/path-meta.ts | 2 +- src/runtime/server/transformers/shiki.ts | 2 +- src/runtime/server/transformers/yaml.ts | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/playground/content/real-content/content.md b/playground/content/real-content/content.md index 5b90d6a4b..5bb9e07b9 100644 --- a/playground/content/real-content/content.md +++ b/playground/content/real-content/content.md @@ -89,7 +89,7 @@ Parsers and Transformers can be defined using `defineContentPlugin`: ```ts export default defineContentPlugin({ name: 'plugin-name', - extentions: ['.md'], + extensions: ['.md'], parse: async (id, content) => {}, transform: async content => {} }) diff --git a/src/runtime/server/transformers/csv.ts b/src/runtime/server/transformers/csv.ts index 873d0df55..949d887b2 100644 --- a/src/runtime/server/transformers/csv.ts +++ b/src/runtime/server/transformers/csv.ts @@ -2,7 +2,7 @@ import { useRuntimeConfig } from '#imports' export default { name: 'csv', - extentions: ['.csv'], + extensions: ['.csv'], parse: async (_id, content) => { const config = { ...useRuntimeConfig().content?.csv || {} } diff --git a/src/runtime/server/transformers/json.ts b/src/runtime/server/transformers/json.ts index b8ca081b1..fd5139630 100644 --- a/src/runtime/server/transformers/json.ts +++ b/src/runtime/server/transformers/json.ts @@ -2,7 +2,7 @@ import destr from 'destr' export default { name: 'Json', - extentions: ['.json', '.json5'], + extensions: ['.json', '.json5'], parse: async (_id, content) => { let parsed = content diff --git a/src/runtime/server/transformers/markdown.ts b/src/runtime/server/transformers/markdown.ts index 900ff57a7..58d6cbca0 100644 --- a/src/runtime/server/transformers/markdown.ts +++ b/src/runtime/server/transformers/markdown.ts @@ -10,7 +10,7 @@ const importPlugin = async (p: [string, any]) => ([ export default { name: 'markdown', - extentions: ['.md'], + extensions: ['.md'], parse: async (_id, content) => { const config: MarkdownOptions = { ...useRuntimeConfig().content?.markdown || {} } config.rehypePlugins = await Promise.all((config.rehypePlugins || []).map(importPlugin)) diff --git a/src/runtime/server/transformers/path-meta.ts b/src/runtime/server/transformers/path-meta.ts index 2cdb67156..61c03f6b9 100644 --- a/src/runtime/server/transformers/path-meta.ts +++ b/src/runtime/server/transformers/path-meta.ts @@ -23,7 +23,7 @@ const describeId = (_id: string) => { export default { name: 'path-meta', - extentions: ['.*'], + extensions: ['.*'], transform (content) { const { locales, defaultLocale } = useRuntimeConfig().content || {} const { _source, _file, _path, _extension } = describeId(content._id) diff --git a/src/runtime/server/transformers/shiki.ts b/src/runtime/server/transformers/shiki.ts index 4dbd20736..e2c698586 100644 --- a/src/runtime/server/transformers/shiki.ts +++ b/src/runtime/server/transformers/shiki.ts @@ -8,7 +8,7 @@ const withContentBase = (url: string) => { export default { name: 'markdown', - extentions: ['.md'], + extensions: ['.md'], transform: async (content) => { const codeBlocks = [] visit( diff --git a/src/runtime/server/transformers/yaml.ts b/src/runtime/server/transformers/yaml.ts index 94d3189f8..50d5636c4 100644 --- a/src/runtime/server/transformers/yaml.ts +++ b/src/runtime/server/transformers/yaml.ts @@ -2,7 +2,7 @@ import { parseFrontMatter } from '../../markdown-parser' export default { name: 'Yaml', - extentions: ['.yml', '.yaml'], + extensions: ['.yml', '.yaml'], parse: async (_id, content) => { const { data } = await parseFrontMatter(`---\n${content}\n---`)