diff --git a/.changeset/four-clocks-buy.md b/.changeset/four-clocks-buy.md new file mode 100644 index 0000000..c2f4aac --- /dev/null +++ b/.changeset/four-clocks-buy.md @@ -0,0 +1,5 @@ +--- +"remark-fff": patch +--- + +Version 1.2.0-alpha.2 diff --git a/packages/remark-fff/package.json b/packages/remark-fff/package.json index 07fc5d2..16c464a 100644 --- a/packages/remark-fff/package.json +++ b/packages/remark-fff/package.json @@ -47,6 +47,7 @@ "api-extractor": "api-extractor run --local --verbose" }, "dependencies": { + "@fastify/deepmerge": "^1.3.0", "fff-flavored-frontmatter": "workspace:*", "unified": "^11.0.4" }, diff --git a/packages/remark-fff/src/plugin.ts b/packages/remark-fff/src/plugin.ts index 80b12f0..c8abf04 100644 --- a/packages/remark-fff/src/plugin.ts +++ b/packages/remark-fff/src/plugin.ts @@ -1,5 +1,6 @@ import type { Plugin, Transformer } from 'unified' +import deepmerge from '@fastify/deepmerge' import { strict, transform } from 'fff-flavored-frontmatter' import type { RemarkFFFOptions } from './types' @@ -19,6 +20,7 @@ export const remarkFFF: Plugin<[RemarkFFFOptions]> }, ): Transformer => (_tree, file) => { + const merge = deepmerge({ all: true }) let targets: string[] | undefined // Compatible with old target parameters before 1.2. @@ -62,9 +64,9 @@ export const remarkFFF: Plugin<[RemarkFFFOptions]> ) file.data = targets - ? { - ...file.data, - ...targets.reduceRight((output, key) => ({ [key]: output }), output), - } + ? merge( + file.data, + targets.reduceRight((output, key) => ({ [key]: output }), output), + ) : output } diff --git a/packages/remark-fff/test/frontmatter.spec.ts b/packages/remark-fff/test/frontmatter.spec.ts index 95b8e7c..fde88ea 100644 --- a/packages/remark-fff/test/frontmatter.spec.ts +++ b/packages/remark-fff/test/frontmatter.spec.ts @@ -13,16 +13,22 @@ describe('remark-fff', () => { it('mdsvex-hugo', () => { const file = new VFile({ data: { + a: 'b', fm: { draft: true, images: 'https://fff.js.org/glowing_star.svg', }, }, }) - const { fm } = remark().use(remarkFrontmatter).use(remarkFFF, { - presets: [hugo], - target: 'mdsvex', - }).processSync(file).data as { fm: FFFFlavoredFrontmatter } + const { a, fm } = remark() + .use(remarkFrontmatter).use(remarkFFF, { + presets: [hugo], + target: 'mdsvex', + }).processSync(file).data as { + a: string + fm: FFFFlavoredFrontmatter + } + expect(a).toEqual('b') // expect(fm.image).toEqual('https://fff.js.org/glowing_star.svg') expect(fm.flags).toEqual(['draft']) }) @@ -30,6 +36,7 @@ describe('remark-fff', () => { const file = new VFile({ data: { astro: { + a: 'b', frontmatter: { categories: ['foo', 'bar', 'baz'], date: '2023-01-01', @@ -39,15 +46,17 @@ describe('remark-fff', () => { }, }, }) - const { frontmatter: fm } = remark() + const { a, frontmatter: fm } = remark() .use(remarkFrontmatter) .use(remarkFFF, { presets: [hexo], target: 'astro', }) .processSync(file).data.astro as { + a: string frontmatter: FFFFlavoredFrontmatter } + expect(a).toEqual('b') expect(fm.created).toEqual('2023-01-01') expect(fm.summary).toEqual('lorem ipsum') // expect(fm.tags).toEqual(['fooo', 'baar', 'baaz', 'foo', 'bar', 'baz']) @@ -142,6 +151,9 @@ describe('remark-fff strict mode', () => { }, }, }, + e: { + f: 'g', + }, }, }, }) @@ -151,7 +163,13 @@ describe('remark-fff strict mode', () => { presets: [{ created: 'date' }], target: ['a', 'b', 'c', 'd'], }) - .processSync(file).data as { a: { b: { c: { d: FFFFlavoredFrontmatter } } } } + .processSync(file).data as { + a: { + b: { c: { d: FFFFlavoredFrontmatter } } + e: { f: string } + } + } expect(data.a.b.c.d.created).toEqual('2023-12-25') + expect(data.a.e.f).toEqual('g') }) }) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 809225b..ff0115a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -147,6 +147,9 @@ importers: packages/remark-fff: dependencies: + '@fastify/deepmerge': + specifier: ^1.3.0 + version: 1.3.0 fff-flavored-frontmatter: specifier: workspace:* version: link:../fff-flavored-frontmatter @@ -2204,6 +2207,10 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true + /@fastify/deepmerge@1.3.0: + resolution: {integrity: sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==} + dev: false + /@humanwhocodes/config-array@0.11.13: resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} engines: {node: '>=10.10.0'}