Skip to content

Commit d52718e

Browse files
authored
Merge pull request #6 from forge-42/metadata-update
generate meta tags update
2 parents 2e6a478 + 28bc97a commit d52718e

5 files changed

Lines changed: 82 additions & 16 deletions

File tree

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@forge42/seo-tools",
3-
"version": "1.3.0",
3+
"version": "1.4.0",
44
"private": false,
55
"keywords": ["seo", "remix-seo", "seo-tools", "structured-data", "sitemap", "robots", "canonical", "seo-alternate"],
66
"description": "Framework agnostic set of helpers designed to help you create, maintain and develop your SEO",

src/remix/metadata.test.ts

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import { type MetaData, generateMeta } from "./metadata"
2+
3+
describe("generateMeta suite", () => {
4+
const baseMetaData: MetaData = {
5+
title: "Test Page",
6+
description: "This is a test page.",
7+
url: "https://example.com",
8+
image: "",
9+
}
10+
11+
const baseExpected = [
12+
{ title: "Test Page" },
13+
{ property: "og:title", content: "Test Page" },
14+
{ property: "og:description", name: "description", content: "This is a test page." },
15+
{ property: "og:url", content: "https://example.com" },
16+
{ name: "twitter:card", property: "twitter:card", content: "summary_large_image" },
17+
]
18+
19+
it("generates meta tags with required fields", () => {
20+
expect(generateMeta(baseMetaData)).toEqual(baseExpected)
21+
})
22+
23+
it("includes og:image if image is provided", () => {
24+
const metaData = { ...baseMetaData, image: "https://picsum.photos/200/300" }
25+
expect(generateMeta(metaData)).toEqual([
26+
...baseExpected,
27+
{ property: "og:image", content: "https://picsum.photos/200/300" },
28+
])
29+
})
30+
31+
it("includes og:site_name if siteName is provided", () => {
32+
const metaData = { ...baseMetaData, siteName: "Example Site" }
33+
expect(generateMeta(metaData)).toEqual([...baseExpected, { name: "og:site_name", content: "Example Site" }])
34+
})
35+
36+
it("uses custom twitterCard if provided", () => {
37+
const metaData = { ...baseMetaData, twitterCard: "summary" }
38+
const expected = baseExpected.map((tag) =>
39+
tag.name === "twitter:card" ? { name: "twitter:card", property: "twitter:card", content: "summary" } : tag
40+
)
41+
expect(generateMeta(metaData)).toEqual(expected)
42+
})
43+
44+
it("includes additional meta descriptors", () => {
45+
const metaData = { ...baseMetaData, image: "https://picsum.photos/200/300" }
46+
const additional = [
47+
{ property: "og:type", content: "website" },
48+
{ name: "twitter:site", content: "@example" },
49+
]
50+
51+
expect(generateMeta(metaData, additional)).toEqual([
52+
...baseExpected,
53+
{ property: "og:image", content: "https://picsum.photos/200/300" },
54+
...additional,
55+
])
56+
})
57+
58+
it("handles empty additional data array", () => {
59+
const metaData = { ...baseMetaData, image: "https://picsum.photos/200/300" }
60+
expect(generateMeta(metaData, [])).toEqual([
61+
...baseExpected,
62+
{ property: "og:image", content: "https://picsum.photos/200/300" },
63+
])
64+
})
65+
})

src/remix/metadata.ts

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,6 @@ export interface MetaData {
4949
* this also generates the twitter:description and og:description meta tags.
5050
*/
5151
description: string
52-
/**
53-
* The keywords of the page.
54-
*/
55-
keywords?: string[]
5652
/**
5753
* The url of the page.
5854
* this generates the og:url meta tag.
@@ -68,6 +64,13 @@ export interface MetaData {
6864
* this generates the og:site_name meta tag.
6965
*/
7066
siteName?: string
67+
/**
68+
* The twitter card type of the page.
69+
* this generates the twitter:card meta tag.
70+
* this is optional and will default to "summary_large_image".
71+
* @default "summary_large_image"
72+
*/
73+
twitterCard?: string
7174
}
7275
/**
7376
* Generate meta tags for Remix to be consumed by the meta function.
@@ -80,18 +83,15 @@ export interface MetaData {
8083
* @returns MetaDescriptor[] - Remix compatible meta tags
8184
*/
8285
export const generateMeta = (metaData: MetaData, additionalData?: MetaDescriptor[]) => {
83-
const { title, description, url, siteName, image, keywords } = metaData
86+
const { title, description, url, siteName, image, twitterCard = "summary_large_image" } = metaData
8487
return [
8588
{ title },
86-
{ name: "twitter:title", content: title },
87-
{ name: "og:title", content: title },
88-
{ name: "description", content: description },
89-
{ name: "twitter:description", content: description },
90-
{ name: "og:description", content: description },
91-
{ name: "og:url", content: url },
92-
...(keywords ? [{ name: "keywords", content: keywords.join(", ") }] : []),
89+
{ property: "og:title", content: title },
90+
{ property: "og:description", name: "description", content: description },
91+
{ property: "og:url", content: url },
92+
{ name: "twitter:card", property: "twitter:card", content: twitterCard },
9393
...(siteName ? [{ name: "og:site_name", content: siteName }] : []),
94-
...(image ? [{ name: "og:image", content: image }] : []),
94+
...(image ? [{ property: "og:image", content: image }] : []),
9595
...(additionalData ?? []),
9696
]
9797
}

test-apps/remix-vite/app/routes/_index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export const meta: MetaFunction = () => {
99
title: "test",
1010
description: "test",
1111
url: "test",
12+
image: "https://picsum.photos/200/300",
1213
}, [
1314
{
1415
"script:ld+json": article({

0 commit comments

Comments
 (0)