Skip to content

Commit 57df261

Browse files
committed
next compatibility
1 parent bbce21c commit 57df261

5 files changed

Lines changed: 28 additions & 11 deletions

File tree

packages/meta/README.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,10 @@ generateMetadata({ title: "About" })
6464
// Output: <title>About | My Site</title>
6565

6666
generateMetadata({ title: null })
67-
// Output: <title>Default Title | My Site</title>
67+
// Output: <title>Default Title</title>
6868

6969
generateMetadata({})
70-
// Output: <title>Default Title | My Site</title>
70+
// Output: <title>Default Title</title>
7171
```
7272

7373
To opt out of the title template on a specific page, use `title.absolute`:
@@ -77,6 +77,8 @@ generateMetadata({ title: { absolute: "Home" } })
7777
// Output: <title>Home</title> (template is ignored)
7878
```
7979

80+
`%s` placeholders are all replaced. For example, `template: "%s | %s | My Site"` with `title: "Docs"` renders `<title>Docs | Docs | My Site</title>`.
81+
8082
## Reference
8183

8284
### `generateMetadata`

packages/meta/src/index.test.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,13 +67,13 @@ describe("createMetadataGenerator", () => {
6767
test("uses default when title is null", () => {
6868
const result = generateMetadata({ title: null });
6969

70-
expect(result.meta).toContainEqual({ title: "My Site | My Site" });
70+
expect(result.meta).toContainEqual({ title: "My Site" });
7171
});
7272

7373
test("uses default when title is undefined", () => {
7474
const result = generateMetadata({});
7575

76-
expect(result.meta).toContainEqual({ title: "My Site | My Site" });
76+
expect(result.meta).toContainEqual({ title: "My Site" });
7777
});
7878

7979
test("ignores template when title is absolute", () => {
@@ -145,5 +145,15 @@ describe("createMetadataGenerator", () => {
145145

146146
expect(result.meta).toContainEqual({ title: " | Site" });
147147
});
148+
149+
test("replaces all %s placeholders", () => {
150+
const generateMetadata = createMetadataGenerator({
151+
titleTemplate: { default: "Site", template: "%s | %s | Site" },
152+
});
153+
154+
const result = generateMetadata({ title: "Docs" });
155+
156+
expect(result.meta).toContainEqual({ title: "Docs | Docs | Site" });
157+
});
148158
});
149159
});

packages/meta/src/index.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,16 @@ function resolveTitle(
3434
) {
3535
title = metadata.title.absolute;
3636
} else {
37-
title = options.titleTemplate
38-
? options.titleTemplate.template.replace(
39-
"%s",
40-
metadata.title ?? options.titleTemplate.default,
41-
)
42-
: metadata.title;
37+
const { titleTemplate } = options;
38+
if (!titleTemplate) {
39+
title = metadata.title;
40+
} else {
41+
if (typeof metadata.title === "string") {
42+
title = titleTemplate.template.split("%s").join(metadata.title);
43+
} else {
44+
title = titleTemplate.default;
45+
}
46+
}
4347
}
4448

4549
return title;

playground/src/meta.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { createMetadataGenerator } from "tanstack-meta";
22

33
export const generateMetadata = createMetadataGenerator({
44
titleTemplate: {
5-
default: "TanStack",
5+
default: "TanStack | High Quality Open-Source Software for Web Developers",
66
template: "%s | High Quality Open-Source Software for Web Developers",
77
},
88
});

playground/src/routes/__root.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ export const Route = createRootRoute({
1717

1818
const { meta, links } = generateMetadata({
1919
charSet: "utf-8",
20+
title: "TanStack",
2021
viewport: {
2122
width: "device-width",
2223
initialScale: 1,

0 commit comments

Comments
 (0)