@webnumseoagent/next 0.1.18 → 0.1.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/client.ts +35 -4
- package/dist/client.js +51 -3
- package/package.json +1 -1
package/client.ts
CHANGED
|
@@ -20,7 +20,7 @@ interface SeoFields {
|
|
|
20
20
|
title?: string;
|
|
21
21
|
description?: string;
|
|
22
22
|
canonical?: string;
|
|
23
|
-
robots?: { index?: boolean; follow?: boolean };
|
|
23
|
+
robots?: { index?: boolean; follow?: boolean; noarchive?: boolean; nosnippet?: boolean; noimageindex?: boolean };
|
|
24
24
|
og?: { title?: string; description?: string; image?: string; siteName?: string; locale?: string };
|
|
25
25
|
twitter?: { card?: string; image?: string; site?: string };
|
|
26
26
|
facebook?: { appId?: string; admins?: string }; // fb:app_id / fb:admins (admins — через запятую)
|
|
@@ -44,9 +44,30 @@ async function fetchJson<T>(path: string, revalidate = 300): Promise<T | null> {
|
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
+
// Next допускает robots и строкой ("noindex, nofollow"), и объектом. Чтобы не потерять
|
|
48
|
+
// строковый дефолт сайта при наложении директив, разбираем его в объект (токены точным
|
|
49
|
+
// сравнением — иначе "follow" совпал бы внутри "nofollow"). Незнакомые директивы (max-snippet…)
|
|
50
|
+
// опускаем — они редки, а оверрайд и так намеренный.
|
|
51
|
+
function robotsFromString(s: string): Record<string, unknown> {
|
|
52
|
+
const out: Record<string, unknown> = {};
|
|
53
|
+
for (const raw of s.split(",")) {
|
|
54
|
+
switch (raw.trim().toLowerCase()) {
|
|
55
|
+
case "noindex": out.index = false; break;
|
|
56
|
+
case "index": out.index = true; break;
|
|
57
|
+
case "nofollow": out.follow = false; break;
|
|
58
|
+
case "follow": out.follow = true; break;
|
|
59
|
+
case "noarchive": out.noarchive = true; break;
|
|
60
|
+
case "nosnippet": out.nosnippet = true; break;
|
|
61
|
+
case "noimageindex": out.noimageindex = true; break;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return out;
|
|
65
|
+
}
|
|
66
|
+
|
|
47
67
|
// Накладывает удалённый конфиг ПОВЕРХ скомпилированных дефолтов сайта.
|
|
48
|
-
// robots: index
|
|
49
|
-
//
|
|
68
|
+
// robots: index/follow меняем ТОЛЬКО при явном булеве (иначе сохраняем дефолт сайта — защита
|
|
69
|
+
// от случайного деиндекса); ограничительные директивы (noarchive/nosnippet/noimageindex)
|
|
70
|
+
// добавляем поверх дефолта сайта только когда явно включены.
|
|
50
71
|
function mergeIntoMetadata(fallback: Metadata, f: SeoFields): Metadata {
|
|
51
72
|
const m: Metadata = { ...fallback };
|
|
52
73
|
if (f.title) {
|
|
@@ -61,7 +82,17 @@ function mergeIntoMetadata(fallback: Metadata, f: SeoFields): Metadata {
|
|
|
61
82
|
if (f.description) m.description = f.description;
|
|
62
83
|
if (f.canonical) m.alternates = { ...(m.alternates ?? {}), canonical: f.canonical };
|
|
63
84
|
if (f.robots) {
|
|
64
|
-
|
|
85
|
+
const r = f.robots;
|
|
86
|
+
const base: Record<string, unknown> =
|
|
87
|
+
typeof m.robots === "string" ? robotsFromString(m.robots)
|
|
88
|
+
: m.robots && typeof m.robots === "object" ? { ...(m.robots as Record<string, unknown>) }
|
|
89
|
+
: {};
|
|
90
|
+
if (typeof r.index === "boolean") base.index = r.index; // false → noindex; true → index; иначе не трогаем
|
|
91
|
+
if (typeof r.follow === "boolean") base.follow = r.follow;
|
|
92
|
+
if (r.noarchive) base.noarchive = true;
|
|
93
|
+
if (r.nosnippet) base.nosnippet = true;
|
|
94
|
+
if (r.noimageindex) base.noimageindex = true;
|
|
95
|
+
m.robots = base as Metadata["robots"];
|
|
65
96
|
}
|
|
66
97
|
if (f.og) {
|
|
67
98
|
m.openGraph = {
|
package/dist/client.js
CHANGED
|
@@ -39,9 +39,43 @@ async function fetchJson(path, revalidate = 300) {
|
|
|
39
39
|
return null;
|
|
40
40
|
}
|
|
41
41
|
}
|
|
42
|
+
// Next допускает robots и строкой ("noindex, nofollow"), и объектом. Чтобы не потерять
|
|
43
|
+
// строковый дефолт сайта при наложении директив, разбираем его в объект (токены точным
|
|
44
|
+
// сравнением — иначе "follow" совпал бы внутри "nofollow"). Незнакомые директивы (max-snippet…)
|
|
45
|
+
// опускаем — они редки, а оверрайд и так намеренный.
|
|
46
|
+
function robotsFromString(s) {
|
|
47
|
+
const out = {};
|
|
48
|
+
for (const raw of s.split(",")) {
|
|
49
|
+
switch (raw.trim().toLowerCase()) {
|
|
50
|
+
case "noindex":
|
|
51
|
+
out.index = false;
|
|
52
|
+
break;
|
|
53
|
+
case "index":
|
|
54
|
+
out.index = true;
|
|
55
|
+
break;
|
|
56
|
+
case "nofollow":
|
|
57
|
+
out.follow = false;
|
|
58
|
+
break;
|
|
59
|
+
case "follow":
|
|
60
|
+
out.follow = true;
|
|
61
|
+
break;
|
|
62
|
+
case "noarchive":
|
|
63
|
+
out.noarchive = true;
|
|
64
|
+
break;
|
|
65
|
+
case "nosnippet":
|
|
66
|
+
out.nosnippet = true;
|
|
67
|
+
break;
|
|
68
|
+
case "noimageindex":
|
|
69
|
+
out.noimageindex = true;
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return out;
|
|
74
|
+
}
|
|
42
75
|
// Накладывает удалённый конфиг ПОВЕРХ скомпилированных дефолтов сайта.
|
|
43
|
-
// robots: index
|
|
44
|
-
//
|
|
76
|
+
// robots: index/follow меняем ТОЛЬКО при явном булеве (иначе сохраняем дефолт сайта — защита
|
|
77
|
+
// от случайного деиндекса); ограничительные директивы (noarchive/nosnippet/noimageindex)
|
|
78
|
+
// добавляем поверх дефолта сайта только когда явно включены.
|
|
45
79
|
function mergeIntoMetadata(fallback, f) {
|
|
46
80
|
const m = { ...fallback };
|
|
47
81
|
if (f.title) {
|
|
@@ -59,7 +93,21 @@ function mergeIntoMetadata(fallback, f) {
|
|
|
59
93
|
if (f.canonical)
|
|
60
94
|
m.alternates = { ...(m.alternates ?? {}), canonical: f.canonical };
|
|
61
95
|
if (f.robots) {
|
|
62
|
-
|
|
96
|
+
const r = f.robots;
|
|
97
|
+
const base = typeof m.robots === "string" ? robotsFromString(m.robots)
|
|
98
|
+
: m.robots && typeof m.robots === "object" ? { ...m.robots }
|
|
99
|
+
: {};
|
|
100
|
+
if (typeof r.index === "boolean")
|
|
101
|
+
base.index = r.index; // false → noindex; true → index; иначе не трогаем
|
|
102
|
+
if (typeof r.follow === "boolean")
|
|
103
|
+
base.follow = r.follow;
|
|
104
|
+
if (r.noarchive)
|
|
105
|
+
base.noarchive = true;
|
|
106
|
+
if (r.nosnippet)
|
|
107
|
+
base.nosnippet = true;
|
|
108
|
+
if (r.noimageindex)
|
|
109
|
+
base.noimageindex = true;
|
|
110
|
+
m.robots = base;
|
|
63
111
|
}
|
|
64
112
|
if (f.og) {
|
|
65
113
|
m.openGraph = {
|
package/package.json
CHANGED