From b2305f88cb8550712e2de24eec2dd93f4948aaa0 Mon Sep 17 00:00:00 2001 From: Harlan Wilton Date: Fri, 26 May 2023 17:04:18 +0800 Subject: [PATCH] fix: enable node duplicate merging Fixes #21 --- packages/unhead-schema-org/src/core/util.ts | 5 +++- .../src/nodes/Breadcrumb/index.test.ts | 29 +++++++++++++++++-- .../src/nodes/WebPage/index.test.ts | 6 ++++ vitest.config.ts | 4 +++ 4 files changed, 40 insertions(+), 4 deletions(-) diff --git a/packages/unhead-schema-org/src/core/util.ts b/packages/unhead-schema-org/src/core/util.ts index ffabdfa..773c139 100644 --- a/packages/unhead-schema-org/src/core/util.ts +++ b/packages/unhead-schema-org/src/core/util.ts @@ -1,4 +1,5 @@ import { hash } from 'ohash' +import { defu } from 'defu' import type { Id, SchemaOrgNode } from '../types' import { resolveAsGraphKey } from '../utils' @@ -37,9 +38,11 @@ export function dedupeNodes(nodes: SchemaOrgNode[]) { ...(groupedKeys.primitives || []).sort(), ...(groupedKeys.relations || []).sort(), ] - const newNode = {} as SchemaOrgNode + let newNode = {} as SchemaOrgNode for (const key of keys) newNode[key] = n[key] + if (dedupedNodes[nodeKey]) + newNode = defu(newNode, dedupedNodes[nodeKey]) as SchemaOrgNode dedupedNodes[nodeKey] = newNode } return Object.values(dedupedNodes) diff --git a/packages/unhead-schema-org/src/nodes/Breadcrumb/index.test.ts b/packages/unhead-schema-org/src/nodes/Breadcrumb/index.test.ts index 616400f..6a5788a 100644 --- a/packages/unhead-schema-org/src/nodes/Breadcrumb/index.test.ts +++ b/packages/unhead-schema-org/src/nodes/Breadcrumb/index.test.ts @@ -67,7 +67,7 @@ describe('defineBreadcrumb', async () => { defineBreadcrumb({ '@id': '#subbreadcrumb', 'itemListElement': [ - { name: 'Some other link', item: '/blog/test' }, + { name: 'Some other link', item: '/blog/foo' }, ], }), @@ -75,7 +75,7 @@ describe('defineBreadcrumb', async () => { '@id': '#subbreadcrumb', 'custom': 'test', 'itemListElement': [ - { name: 'Some other link', item: '/blog/test' }, + { name: 'Some other link', item: '/blog/bar' }, ], }), ]) @@ -94,6 +94,23 @@ describe('defineBreadcrumb', async () => { "name": "Some joining page", "position": 3, }, + { + "@type": "ListItem", + "item": "https://example.com", + "name": "Home", + "position": 1, + }, + { + "@type": "ListItem", + "item": "https://example.com/blog", + "name": "Blog", + "position": 2, + }, + { + "@type": "ListItem", + "name": "My Article", + "position": 4, + }, ], }, { @@ -103,7 +120,13 @@ describe('defineBreadcrumb', async () => { "itemListElement": [ { "@type": "ListItem", - "item": "https://example.com/blog/test", + "item": "https://example.com/blog/bar", + "name": "Some other link", + "position": 1, + }, + { + "@type": "ListItem", + "item": "https://example.com/blog/foo", "name": "Some other link", "position": 1, }, diff --git a/packages/unhead-schema-org/src/nodes/WebPage/index.test.ts b/packages/unhead-schema-org/src/nodes/WebPage/index.test.ts index ee455f3..57056dd 100644 --- a/packages/unhead-schema-org/src/nodes/WebPage/index.test.ts +++ b/packages/unhead-schema-org/src/nodes/WebPage/index.test.ts @@ -402,6 +402,12 @@ describe('defineWebPage', () => { "https://example.com/", ], }, + { + "@type": "ReadAction", + "target": [ + "https://example.com/", + ], + }, ], "url": "https://example.com/", }, diff --git a/vitest.config.ts b/vitest.config.ts index d047677..670cf8f 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -5,6 +5,10 @@ import { defineConfig } from 'vite' export default defineConfig({ test: { + include: [ + 'packages/**/src/**/*.test.ts', + 'test/**/*.test.ts', + ], env: { NODE_ENV: 'development', },