@sittari/payload-seo 0.1.0

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.
Files changed (126) hide show
  1. package/README.md +38 -0
  2. package/dist/admin/ResetRawJson.d.ts +4 -0
  3. package/dist/admin/ResetRawJson.d.ts.map +1 -0
  4. package/dist/admin/ResetRawJson.js +53 -0
  5. package/dist/admin/ResetRawJson.js.map +1 -0
  6. package/dist/admin/SchemaValueOverrides.d.ts +4 -0
  7. package/dist/admin/SchemaValueOverrides.d.ts.map +1 -0
  8. package/dist/admin/SchemaValueOverrides.js +46 -0
  9. package/dist/admin/SchemaValueOverrides.js.map +1 -0
  10. package/dist/admin/SeoPreviews.d.ts +4 -0
  11. package/dist/admin/SeoPreviews.d.ts.map +1 -0
  12. package/dist/admin/SeoPreviews.js +172 -0
  13. package/dist/admin/SeoPreviews.js.map +1 -0
  14. package/dist/admin/preview-document.d.ts +7 -0
  15. package/dist/admin/preview-document.d.ts.map +1 -0
  16. package/dist/admin/preview-document.js +50 -0
  17. package/dist/admin/preview-document.js.map +1 -0
  18. package/dist/admin/translations.d.ts +236 -0
  19. package/dist/admin/translations.d.ts.map +1 -0
  20. package/dist/admin/translations.js +67 -0
  21. package/dist/admin/translations.js.map +1 -0
  22. package/dist/admin/use-admin-text.d.ts +4 -0
  23. package/dist/admin/use-admin-text.d.ts.map +1 -0
  24. package/dist/admin/use-admin-text.js +9 -0
  25. package/dist/admin/use-admin-text.js.map +1 -0
  26. package/dist/collections/redirects.d.ts +7 -0
  27. package/dist/collections/redirects.d.ts.map +1 -0
  28. package/dist/collections/redirects.js +71 -0
  29. package/dist/collections/redirects.js.map +1 -0
  30. package/dist/endpoints/preview.d.ts +4 -0
  31. package/dist/endpoints/preview.d.ts.map +1 -0
  32. package/dist/endpoints/preview.js +170 -0
  33. package/dist/endpoints/preview.js.map +1 -0
  34. package/dist/exports/client.d.ts +4 -0
  35. package/dist/exports/client.d.ts.map +1 -0
  36. package/dist/exports/client.js +5 -0
  37. package/dist/exports/client.js.map +1 -0
  38. package/dist/exports/types.d.ts +3 -0
  39. package/dist/exports/types.d.ts.map +1 -0
  40. package/dist/exports/types.js +2 -0
  41. package/dist/exports/types.js.map +1 -0
  42. package/dist/fields/seo.d.ts +11 -0
  43. package/dist/fields/seo.d.ts.map +1 -0
  44. package/dist/fields/seo.js +187 -0
  45. package/dist/fields/seo.js.map +1 -0
  46. package/dist/globals/seo-settings.d.ts +8 -0
  47. package/dist/globals/seo-settings.d.ts.map +1 -0
  48. package/dist/globals/seo-settings.js +73 -0
  49. package/dist/globals/seo-settings.js.map +1 -0
  50. package/dist/helpers/config.d.ts +5 -0
  51. package/dist/helpers/config.d.ts.map +1 -0
  52. package/dist/helpers/config.js +7 -0
  53. package/dist/helpers/config.js.map +1 -0
  54. package/dist/helpers/metadata.d.ts +27 -0
  55. package/dist/helpers/metadata.d.ts.map +1 -0
  56. package/dist/helpers/metadata.js +50 -0
  57. package/dist/helpers/metadata.js.map +1 -0
  58. package/dist/helpers/preview.d.ts +18 -0
  59. package/dist/helpers/preview.d.ts.map +1 -0
  60. package/dist/helpers/preview.js +23 -0
  61. package/dist/helpers/preview.js.map +1 -0
  62. package/dist/helpers/redirects.d.ts +10 -0
  63. package/dist/helpers/redirects.d.ts.map +1 -0
  64. package/dist/helpers/redirects.js +27 -0
  65. package/dist/helpers/redirects.js.map +1 -0
  66. package/dist/helpers/robots.d.ts +6 -0
  67. package/dist/helpers/robots.d.ts.map +1 -0
  68. package/dist/helpers/robots.js +46 -0
  69. package/dist/helpers/robots.js.map +1 -0
  70. package/dist/helpers/schema.d.ts +15 -0
  71. package/dist/helpers/schema.d.ts.map +1 -0
  72. package/dist/helpers/schema.js +5 -0
  73. package/dist/helpers/schema.js.map +1 -0
  74. package/dist/helpers/sitemap.d.ts +11 -0
  75. package/dist/helpers/sitemap.d.ts.map +1 -0
  76. package/dist/helpers/sitemap.js +131 -0
  77. package/dist/helpers/sitemap.js.map +1 -0
  78. package/dist/index.d.ts +16 -0
  79. package/dist/index.d.ts.map +1 -0
  80. package/dist/index.js +14 -0
  81. package/dist/index.js.map +1 -0
  82. package/dist/next.d.ts +14 -0
  83. package/dist/next.d.ts.map +1 -0
  84. package/dist/next.js +24 -0
  85. package/dist/next.js.map +1 -0
  86. package/dist/plugin.d.ts +12 -0
  87. package/dist/plugin.d.ts.map +1 -0
  88. package/dist/plugin.js +260 -0
  89. package/dist/plugin.js.map +1 -0
  90. package/dist/resolvers/document.d.ts +5 -0
  91. package/dist/resolvers/document.d.ts.map +1 -0
  92. package/dist/resolvers/document.js +15 -0
  93. package/dist/resolvers/document.js.map +1 -0
  94. package/dist/resolvers/effective.d.ts +33 -0
  95. package/dist/resolvers/effective.d.ts.map +1 -0
  96. package/dist/resolvers/effective.js +225 -0
  97. package/dist/resolvers/effective.js.map +1 -0
  98. package/dist/resolvers/metadata.d.ts +13 -0
  99. package/dist/resolvers/metadata.d.ts.map +1 -0
  100. package/dist/resolvers/metadata.js +24 -0
  101. package/dist/resolvers/metadata.js.map +1 -0
  102. package/dist/types.d.ts +261 -0
  103. package/dist/types.d.ts.map +1 -0
  104. package/dist/types.js +12 -0
  105. package/dist/types.js.map +1 -0
  106. package/dist/utils/generated-schema.d.ts +11 -0
  107. package/dist/utils/generated-schema.d.ts.map +1 -0
  108. package/dist/utils/generated-schema.js +69 -0
  109. package/dist/utils/generated-schema.js.map +1 -0
  110. package/dist/utils/locale.d.ts +17 -0
  111. package/dist/utils/locale.d.ts.map +1 -0
  112. package/dist/utils/locale.js +5 -0
  113. package/dist/utils/locale.js.map +1 -0
  114. package/dist/utils/robots.d.ts +11 -0
  115. package/dist/utils/robots.d.ts.map +1 -0
  116. package/dist/utils/robots.js +35 -0
  117. package/dist/utils/robots.js.map +1 -0
  118. package/dist/utils/urls.d.ts +9 -0
  119. package/dist/utils/urls.d.ts.map +1 -0
  120. package/dist/utils/urls.js +48 -0
  121. package/dist/utils/urls.js.map +1 -0
  122. package/dist/utils/validation.d.ts +20 -0
  123. package/dist/utils/validation.d.ts.map +1 -0
  124. package/dist/utils/validation.js +56 -0
  125. package/dist/utils/validation.js.map +1 -0
  126. package/package.json +69 -0
@@ -0,0 +1,170 @@
1
+ import { canAccessAdmin } from 'payload';
2
+ import { resolveSeoPreview } from '../helpers/preview.js';
3
+ import { getSeoRuntimeConfig } from '../helpers/config.js';
4
+ import { resolveSeoNames } from '../plugin.js';
5
+ import { SEO_PLUGIN_MARKER } from '../types.js';
6
+ import { isPlainJsonObject } from '../utils/validation.js';
7
+ const object = (value) => isPlainJsonObject(value) ? value : undefined;
8
+ const findField = (fields, name) => {
9
+ for (const field of fields ?? []) {
10
+ if ('name' in field && field.name === name)
11
+ return field;
12
+ if ('fields' in field && Array.isArray(field.fields)) {
13
+ const found = findField(field.fields, name);
14
+ if (found)
15
+ return found;
16
+ }
17
+ if (field.type === 'tabs') {
18
+ for (const tab of field.tabs) {
19
+ const found = findField(tab.fields, name);
20
+ if (found)
21
+ return found;
22
+ }
23
+ }
24
+ }
25
+ return undefined;
26
+ };
27
+ const merge = (base, overlay) => Object.entries(overlay).reduce((result, [key, value]) => {
28
+ const inherited = result[key];
29
+ result[key] = isPlainJsonObject(inherited) && isPlainJsonObject(value) ? merge(inherited, value) : value;
30
+ return result;
31
+ }, { ...base });
32
+ const relationId = (value) => typeof value === 'string' || typeof value === 'number' ? value : undefined;
33
+ const readPath = (document, path) => path.split('.').filter(Boolean).reduce((value, segment) => value !== null && typeof value === 'object' && !Array.isArray(value)
34
+ ? value[segment]
35
+ : undefined, document);
36
+ const writePath = (document, path, value) => {
37
+ const segments = path.split('.').filter(Boolean);
38
+ if (!segments.length)
39
+ return;
40
+ let target = document;
41
+ for (const segment of segments.slice(0, -1)) {
42
+ const current = target[segment];
43
+ if (!isPlainJsonObject(current))
44
+ target[segment] = {};
45
+ target = target[segment];
46
+ }
47
+ target[segments.at(-1)] = value;
48
+ };
49
+ /** Payload Admin serializes upload fields as IDs. Resolve only the preview image
50
+ * inputs so the configured media URL callback receives the media document it expects. */
51
+ const hydratePreviewMedia = async ({ collection, config, document, locale, req, }) => {
52
+ if (!config)
53
+ return document;
54
+ const mediaCollection = config.collections[collection]?.media?.collection ?? config.media.collection;
55
+ const paths = ['seo.openGraph.image', 'seo.twitter.image'];
56
+ const mappedImage = config.collections[collection]?.fields?.image;
57
+ if (mappedImage)
58
+ paths.push(mappedImage);
59
+ await Promise.all(paths.map(async (path) => {
60
+ const id = relationId(readPath(document, path));
61
+ if (id === undefined)
62
+ return;
63
+ try {
64
+ const media = await req.payload.findByID({
65
+ collection: mediaCollection,
66
+ id,
67
+ locale,
68
+ fallbackLocale: false,
69
+ depth: 0,
70
+ overrideAccess: false,
71
+ req,
72
+ user: req.user,
73
+ });
74
+ writePath(document, path, media);
75
+ }
76
+ catch {
77
+ // Keep the unresolved ID. The shared resolver will omit it safely.
78
+ }
79
+ }));
80
+ return document;
81
+ };
82
+ const localeIsConfigured = (payload, locale) => {
83
+ const configured = payload.config?.localization?.locales;
84
+ // Payload has no locale registry when localization is disabled. In that
85
+ // mode the host may use its own fixed locale label, so only validate against
86
+ // a registry when one actually exists.
87
+ if (!configured?.length)
88
+ return true;
89
+ return configured.some((item) => (typeof item === 'string' ? item : item.code) === locale);
90
+ };
91
+ const hasPreviewAccess = async (req, collection, seoField, document) => {
92
+ const config = req.payload.config?.collections?.find((candidate) => candidate.slug === collection);
93
+ if (!config)
94
+ return false;
95
+ const collectionAccess = config.access?.read;
96
+ if (typeof collectionAccess === 'function') {
97
+ const allowed = await collectionAccess({ req });
98
+ // A query is safe only when an ID read below enforces it. Never use it to
99
+ // authorize an unsaved create preview.
100
+ if (allowed !== true && (!document || allowed === false))
101
+ return false;
102
+ }
103
+ const field = findField(config.fields, seoField);
104
+ const fieldAccess = field?.access?.read;
105
+ if (typeof fieldAccess === 'function' && await fieldAccess({ req, doc: document, data: document, siblingData: document }) !== true)
106
+ return false;
107
+ return true;
108
+ };
109
+ /** Resolves an authenticated Admin form's unsaved values with the production SEO resolver. */
110
+ export const createSeoPreviewEndpoint = (collection) => ({
111
+ path: '/seo-preview',
112
+ method: 'post',
113
+ handler: async (req) => {
114
+ if (!req.user)
115
+ return Response.json({ message: 'Unauthorized' }, { status: 401 });
116
+ try {
117
+ await canAccessAdmin({ req });
118
+ }
119
+ catch {
120
+ return Response.json({ message: 'Forbidden' }, { status: 403 });
121
+ }
122
+ let body;
123
+ try {
124
+ body = await req.json?.();
125
+ }
126
+ catch {
127
+ return Response.json({ message: 'Invalid preview request.' }, { status: 400 });
128
+ }
129
+ const input = object(body);
130
+ const document = object(input?.document);
131
+ const locale = typeof input?.locale === 'string' ? input.locale : undefined;
132
+ if (!document || locale === undefined || !localeIsConfigured(req.payload, locale))
133
+ return Response.json({ message: 'Invalid preview request.' }, { status: 400 });
134
+ const config = getSeoRuntimeConfig(req.payload);
135
+ if (!config?.collections[collection])
136
+ return Response.json({ message: 'Not found' }, { status: 404 });
137
+ const names = resolveSeoNames(config.names);
138
+ const id = document.id;
139
+ if (id !== undefined && typeof id !== 'string' && typeof id !== 'number')
140
+ return Response.json({ message: 'Invalid preview request.' }, { status: 400 });
141
+ let persisted;
142
+ if (id !== undefined) {
143
+ try {
144
+ // Admin previews must be able to resolve a draft-only document, but the
145
+ // Local API still applies the current user's collection access rules.
146
+ persisted = await req.payload.findByID({ collection, id, locale, fallbackLocale: false, draft: true, depth: 0, overrideAccess: false, req, user: req.user });
147
+ }
148
+ catch {
149
+ return Response.json({ message: 'Forbidden' }, { status: 403 });
150
+ }
151
+ }
152
+ if (!(await hasPreviewAccess(req, collection, names.seoField, persisted)))
153
+ return Response.json({ message: 'Forbidden' }, { status: 403 });
154
+ const previewDocument = await hydratePreviewMedia({
155
+ collection,
156
+ config,
157
+ document: persisted ? merge(persisted, document) : document,
158
+ locale,
159
+ req,
160
+ });
161
+ return Response.json(await resolveSeoPreview({
162
+ payload: req.payload,
163
+ collection,
164
+ document: previewDocument,
165
+ locale,
166
+ }));
167
+ },
168
+ custom: { seo: { marker: SEO_PLUGIN_MARKER } },
169
+ });
170
+ //# sourceMappingURL=preview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview.js","sourceRoot":"","sources":["../../src/endpoints/preview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAA6B,MAAM,SAAS,CAAA;AAEnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,iBAAiB,EAAqC,MAAM,aAAa,CAAA;AAClF,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAE1D,MAAM,MAAM,GAAG,CAAC,KAAc,EAA2B,EAAE,CACzD,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;AAE9C,MAAM,SAAS,GAAG,CAAC,MAAoC,EAAE,IAAY,EAAqB,EAAE;IAC1F,KAAK,MAAM,KAAK,IAAI,MAAM,IAAI,EAAE,EAAE,CAAC;QACjC,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO,KAAK,CAAA;QACxD,IAAI,QAAQ,IAAI,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YACrD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;YAC3C,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAA;QACzB,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC1B,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBAC7B,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;gBACzC,IAAI,KAAK;oBAAE,OAAO,KAAK,CAAA;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA;AAED,MAAM,KAAK,GAAG,CAAC,IAAiB,EAAE,OAAoB,EAAe,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,CAAc,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;IAC3I,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;IAC7B,MAAM,CAAC,GAAG,CAAC,GAAG,iBAAiB,CAAC,SAAS,CAAC,IAAI,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IACxG,OAAO,MAAM,CAAA;AACf,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC,CAAA;AAEf,MAAM,UAAU,GAAG,CAAC,KAAc,EAA+B,EAAE,CACjE,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;AAE5E,MAAM,QAAQ,GAAG,CAAC,QAAqB,EAAE,IAAY,EAAW,EAAE,CAChE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAU,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CACjE,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;IAClE,CAAC,CAAE,KAAqB,CAAC,OAAO,CAAC;IACjC,CAAC,CAAC,SAAS,EACf,QAAQ,CAAC,CAAA;AAEX,MAAM,SAAS,GAAG,CAAC,QAAqB,EAAE,IAAY,EAAE,KAAc,EAAQ,EAAE;IAC9E,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAChD,IAAI,CAAC,QAAQ,CAAC,MAAM;QAAE,OAAM;IAC5B,IAAI,MAAM,GAAgB,QAAQ,CAAA;IAClC,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAA;QAC/B,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC;YAAE,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAA;QACrD,MAAM,GAAG,MAAM,CAAC,OAAO,CAAgB,CAAA;IACzC,CAAC;IACD,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,GAAG,KAAK,CAAA;AAClC,CAAC,CAAA;AAED;yFACyF;AACzF,MAAM,mBAAmB,GAAG,KAAK,EAAE,EACjC,UAAU,EACV,MAAM,EACN,QAAQ,EACR,MAAM,EACN,GAAG,GAOJ,EAAwB,EAAE;IACzB,IAAI,CAAC,MAAM;QAAE,OAAO,QAAQ,CAAA;IAC5B,MAAM,eAAe,GAAG,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,UAAU,IAAI,MAAM,CAAC,KAAK,CAAC,UAAU,CAAA;IACpG,MAAM,KAAK,GAAG,CAAC,qBAAqB,EAAE,mBAAmB,CAAC,CAAA;IAC1D,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,KAAK,CAAA;IACjE,IAAI,WAAW;QAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IAExC,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACzC,MAAM,EAAE,GAAG,UAAU,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAA;QAC/C,IAAI,EAAE,KAAK,SAAS;YAAE,OAAM;QAC5B,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAO,GAAG,CAAC,OAAsB,CAAC,QAAQ,CAAC;gBACvD,UAAU,EAAE,eAAe;gBAC3B,EAAE;gBACF,MAAM;gBACN,cAAc,EAAE,KAAK;gBACrB,KAAK,EAAE,CAAC;gBACR,cAAc,EAAE,KAAK;gBACrB,GAAG;gBACH,IAAI,EAAE,GAAG,CAAC,IAAI;aACf,CAAC,CAAA;YACF,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;QAClC,CAAC;QAAC,MAAM,CAAC;YACP,mEAAmE;QACrE,CAAC;IACH,CAAC,CAAC,CAAC,CAAA;IACH,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAED,MAAM,kBAAkB,GAAG,CAAC,OAAmB,EAAE,MAAc,EAAW,EAAE;IAC1E,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAA;IACxD,wEAAwE;IACxE,6EAA6E;IAC7E,uCAAuC;IACvC,IAAI,CAAC,UAAU,EAAE,MAAM;QAAE,OAAO,IAAI,CAAA;IACpC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,CAAA;AAC5F,CAAC,CAAA;AAED,MAAM,gBAAgB,GAAG,KAAK,EAAE,GAAQ,EAAE,UAAkB,EAAE,QAAgB,EAAE,QAAsB,EAAoB,EAAE;IAC1H,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC,SAAc,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,UAAU,CAAC,CAAA;IACvG,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IACzB,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,IAAI,CAAA;IAC5C,IAAI,OAAO,gBAAgB,KAAK,UAAU,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,EAAE,GAAG,EAAE,CAAC,CAAA;QAC/C,0EAA0E;QAC1E,uCAAuC;QACvC,IAAI,OAAO,KAAK,IAAI,IAAI,CAAC,CAAC,QAAQ,IAAI,OAAO,KAAK,KAAK,CAAC;YAAE,OAAO,KAAK,CAAA;IACxE,CAAC;IACD,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAQ,CAAA;IACvD,MAAM,WAAW,GAAG,KAAK,EAAE,MAAM,EAAE,IAAI,CAAA;IACvC,IAAI,OAAO,WAAW,KAAK,UAAU,IAAI,MAAM,WAAW,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,KAAK,IAAI;QAAE,OAAO,KAAK,CAAA;IAChJ,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,8FAA8F;AAC9F,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,UAAkB,EAA0B,EAAE,CAAC,CAAC;IACvF,IAAI,EAAE,cAAc;IACpB,MAAM,EAAE,MAAM;IACd,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACrB,IAAI,CAAC,GAAG,CAAC,IAAI;YAAE,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QACjF,IAAI,CAAC;YACH,MAAM,cAAc,CAAC,EAAE,GAAG,EAAE,CAAC,CAAA;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QACjE,CAAC;QAED,IAAI,IAAa,CAAA;QACjB,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,CAAA;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,0BAA0B,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QAChF,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;QAC1B,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;QACxC,MAAM,MAAM,GAAG,OAAO,KAAK,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAA;QAC3E,IAAI,CAAC,QAAQ,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,OAAgC,EAAE,MAAM,CAAC;YAAE,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,0BAA0B,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QAE1L,MAAM,MAAM,GAAG,mBAAmB,CAAC,GAAG,CAAC,OAAgC,CAAC,CAAA;QACxE,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,UAAU,CAAC;YAAE,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QACrG,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAC3C,MAAM,EAAE,GAAG,QAAQ,CAAC,EAAE,CAAA;QACtB,IAAI,EAAE,KAAK,SAAS,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,OAAO,EAAE,KAAK,QAAQ;YAAE,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,0BAA0B,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QAExJ,IAAI,SAAkC,CAAA;QACtC,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;YACrB,IAAI,CAAC;gBACH,wEAAwE;gBACxE,sEAAsE;gBACtE,SAAS,GAAG,MAAO,GAAG,CAAC,OAAiC,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAA;YACzL,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;YACjE,CAAC;QACH,CAAC;QACD,IAAI,CAAC,CAAC,MAAM,gBAAgB,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YAAE,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QAE1I,MAAM,eAAe,GAAG,MAAM,mBAAmB,CAAC;YAChD,UAAU;YACV,MAAM;YACN,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ;YAC3D,MAAM;YACN,GAAG;SACJ,CAAC,CAAA;QACF,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,iBAAiB,CAAC;YAC3C,OAAO,EAAE,GAAG,CAAC,OAAgC;YAC7C,UAAU;YACV,QAAQ,EAAE,eAAe;YACzB,MAAM;SACP,CAAC,CAAC,CAAA;IACL,CAAC;IACD,MAAM,EAAE,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,iBAAiB,EAAE,EAAE;CAC/C,CAAC,CAAA"}
@@ -0,0 +1,4 @@
1
+ export { ResetRawJson } from '../admin/ResetRawJson.js';
2
+ export { SchemaValueOverrides } from '../admin/SchemaValueOverrides.js';
3
+ export { SeoPreviews } from '../admin/SeoPreviews.js';
4
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/exports/client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAA;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA"}
@@ -0,0 +1,5 @@
1
+ 'use client';
2
+ export { ResetRawJson } from '../admin/ResetRawJson.js';
3
+ export { SchemaValueOverrides } from '../admin/SchemaValueOverrides.js';
4
+ export { SeoPreviews } from '../admin/SeoPreviews.js';
5
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/exports/client.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAA;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA"}
@@ -0,0 +1,3 @@
1
+ export type { ResolveDocumentUrl, ResolveLastModified, ResolveMediaUrl, ResolveRobotsSitemapUrls, ResolveSitemapChunkUrl, SeoAdminCustom, SeoCollectionConfig, SeoDocument, SeoDiagnostic, SeoDocumentFieldMappings, SeoDisabledPluginConfig, SeoEnabledPluginConfig, SeoGeneratedNames, SeoPluginAccess, SeoPluginConfig, SeoSchemaType, SeoSitemapConfig, SeoPayload, SeoRobotsDirectives, RobotsMode, CanonicalMode, TrailingSlashPolicy, SeoSocialMetadata, ResolvedEffectiveSeo, SeoPreview, ResolvedSeoMetadata, } from '../types.js';
2
+ export type { SeoRedirect } from '../helpers/redirects.js';
3
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/exports/types.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,wBAAwB,EACxB,sBAAsB,EACtB,cAAc,EACd,mBAAmB,EACnB,WAAW,EACX,aAAa,EACb,wBAAwB,EACxB,uBAAuB,EACvB,sBAAsB,EACtB,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,UAAU,EACV,mBAAmB,EACnB,UAAU,EACV,aAAa,EACb,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,UAAU,EACV,mBAAmB,GACpB,MAAM,aAAa,CAAA;AACpB,YAAY,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/exports/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,11 @@
1
+ import type { Field, GroupField } from 'payload';
2
+ import { type SeoCollectionConfig } from '../types.js';
3
+ export declare const isSupportedVisualField: (field: Field) => boolean;
4
+ /** Creates the localized, marked SEO group attached to each enabled document. */
5
+ export declare const createSeoField: ({ collection, mediaCollection, name, trailingSlashPolicy, }: {
6
+ collection: SeoCollectionConfig;
7
+ mediaCollection: string;
8
+ name: string;
9
+ trailingSlashPolicy?: "always" | "never";
10
+ }) => GroupField;
11
+ //# sourceMappingURL=seo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo.d.ts","sourceRoot":"","sources":["../../src/fields/seo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAa,MAAM,SAAS,CAAA;AAE3D,OAAO,EAKL,KAAK,mBAAmB,EACzB,MAAM,aAAa,CAAA;AA0CpB,eAAO,MAAM,sBAAsB,GAAI,OAAO,KAAK,KAAG,OACD,CAAA;AAmBrD,iFAAiF;AACjF,eAAO,MAAM,cAAc,GAAI,6DAK5B;IACD,UAAU,EAAE,mBAAmB,CAAA;IAC/B,eAAe,EAAE,MAAM,CAAA;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,mBAAmB,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAA;CACzC,KAAG,UAiIH,CAAA"}
@@ -0,0 +1,187 @@
1
+ import { SEO_PLUGIN_MARKER, SEO_PREVIEWS_ADMIN_COMPONENT, SEO_RAW_JSON_ADMIN_COMPONENT, SEO_SCHEMA_VALUE_OVERRIDES_ADMIN_COMPONENT, } from '../types.js';
2
+ import { adminLabel, adminTabLabel, adminText } from '../admin/translations.js';
3
+ import { validateCanonicalUrl, validateJson } from '../utils/validation.js';
4
+ const localized = true;
5
+ const socialCards = [
6
+ { label: adminLabel('summary'), value: 'summary' },
7
+ { label: adminLabel('summaryLargeImage'), value: 'summary_large_image' },
8
+ ];
9
+ const visualFieldTypes = new Set(['text', 'textarea', 'number', 'checkbox', 'select', 'date', 'upload']);
10
+ const schemaTypeIs = (seoField, data, ...types) => {
11
+ if (!data || typeof data !== 'object')
12
+ return false;
13
+ const seo = data[seoField];
14
+ if (!seo || typeof seo !== 'object')
15
+ return false;
16
+ const schema = seo.schema;
17
+ return Boolean(schema && typeof schema === 'object' && types.includes(schema.type));
18
+ };
19
+ const createBuiltInVisualFields = (seoField, imageCollection) => {
20
+ const when = (...types) => (data) => schemaTypeIs(seoField, data, ...types);
21
+ return [
22
+ { name: 'name', type: 'text', label: adminLabel('name'), admin: { condition: when('WebPage', 'Product', 'Organization', 'LocalBusiness') } },
23
+ { name: 'image', type: 'upload', label: adminLabel('image'), relationTo: imageCollection },
24
+ { name: 'about', type: 'textarea', label: adminLabel('about'), admin: { condition: when('WebPage') } },
25
+ { name: 'headline', type: 'text', label: adminLabel('headline'), admin: { condition: when('Article') } },
26
+ { name: 'author', type: 'text', label: adminLabel('author'), admin: { condition: when('Article') } },
27
+ { name: 'datePublished', type: 'date', label: adminLabel('datePublished'), admin: { condition: when('Article') } },
28
+ { name: 'dateModified', type: 'date', label: adminLabel('dateModified'), admin: { condition: when('Article') } },
29
+ { name: 'description', type: 'textarea', label: adminLabel('productDescription'), admin: { condition: when('Product') } },
30
+ { name: 'sku', type: 'text', label: adminLabel('sku'), admin: { condition: when('Product') } },
31
+ { name: 'brand', type: 'text', label: adminLabel('brand'), admin: { condition: when('Product') } },
32
+ { name: 'price', type: 'number', label: adminLabel('price'), admin: { condition: when('Product') } },
33
+ { name: 'priceCurrency', type: 'text', label: adminLabel('priceCurrency'), admin: { condition: when('Product') } },
34
+ { name: 'telephone', type: 'text', label: adminLabel('telephone'), admin: { condition: when('LocalBusiness') } },
35
+ { name: 'address', type: 'textarea', label: adminLabel('address'), admin: { condition: when('LocalBusiness') } },
36
+ { name: 'question', type: 'text', label: adminLabel('question'), admin: { condition: when('FAQPage') } },
37
+ { name: 'answer', type: 'textarea', label: adminLabel('answer'), admin: { condition: when('FAQPage') } },
38
+ ];
39
+ };
40
+ export const isSupportedVisualField = (field) => 'name' in field && visualFieldTypes.has(field.type);
41
+ const schemaOptions = [
42
+ 'WebPage',
43
+ 'Article',
44
+ 'Product',
45
+ 'Organization',
46
+ 'LocalBusiness',
47
+ 'FAQPage',
48
+ ].map((value) => ({ label: value, value }));
49
+ const uploadField = (name, relationTo) => ({
50
+ name,
51
+ type: 'upload',
52
+ label: adminLabel('image'),
53
+ relationTo,
54
+ localized,
55
+ });
56
+ /** Creates the localized, marked SEO group attached to each enabled document. */
57
+ export const createSeoField = ({ collection, mediaCollection, name, trailingSlashPolicy, }) => {
58
+ const imageCollection = collection.media?.collection ?? mediaCollection;
59
+ const customVisualFields = (collection.visualFields ?? []).map((field) => ({ ...field, localized }));
60
+ const visualFields = [...createBuiltInVisualFields(name, imageCollection), ...customVisualFields]
61
+ .reduce((fields, field) => {
62
+ const fieldName = 'name' in field ? field.name : undefined;
63
+ const index = fieldName ? fields.findIndex((candidate) => 'name' in candidate && candidate.name === fieldName) : -1;
64
+ if (index >= 0)
65
+ fields[index] = field;
66
+ else
67
+ fields.push(field);
68
+ return fields;
69
+ }, [])
70
+ .map((field) => ({ ...field, localized }));
71
+ return {
72
+ name,
73
+ type: 'group',
74
+ label: adminLabel('seo'),
75
+ ...(collection.access ? { access: collection.access } : {}),
76
+ admin: { custom: { seo: { marker: SEO_PLUGIN_MARKER } } },
77
+ fields: [
78
+ {
79
+ type: 'tabs',
80
+ tabs: [
81
+ {
82
+ label: adminTabLabel('general'),
83
+ fields: [
84
+ { name: 'title', type: 'text', label: adminLabel('title'), localized },
85
+ { name: 'description', type: 'textarea', label: adminLabel('description'), localized },
86
+ { name: 'focusKeyword', type: 'text', label: adminLabel('focusKeyword'), localized },
87
+ ],
88
+ },
89
+ {
90
+ label: adminTabLabel('canonical'),
91
+ fields: [{
92
+ name: 'canonical', type: 'group', label: adminLabel('canonical'), fields: [
93
+ { name: 'mode', type: 'select', label: adminLabel('canonicalMode'), localized, defaultValue: 'auto', required: true, options: [{ label: adminLabel('auto'), value: 'auto' }, { label: adminLabel('manual'), value: 'manual' }, { label: adminLabel('none'), value: 'none' }] },
94
+ {
95
+ name: 'url', type: 'text', label: adminLabel('canonicalUrl'), localized, validate: (value, { siblingData, req } = {}) => siblingData?.mode === 'manual' && !value
96
+ ? adminText('validationManualCanonical', req?.i18n?.language)
97
+ : validateCanonicalUrl(value, { req }, trailingSlashPolicy),
98
+ admin: { condition: (_, siblingData) => siblingData?.mode === 'manual' },
99
+ },
100
+ ],
101
+ }],
102
+ },
103
+ {
104
+ label: adminTabLabel('robots'),
105
+ fields: [{
106
+ name: 'robots', type: 'group', label: adminLabel('robots'), fields: [
107
+ {
108
+ name: 'mode', type: 'select', label: adminLabel('robotsMode'), localized, defaultValue: 'inherit', required: true,
109
+ options: [
110
+ { label: 'Inherit', value: 'inherit' }, { label: 'Index, follow', value: 'index-follow' },
111
+ { label: 'No index, follow', value: 'noindex-follow' }, { label: 'Index, nofollow', value: 'index-nofollow' },
112
+ { label: 'No index, nofollow', value: 'noindex-nofollow' }, { label: 'Custom directives', value: 'custom' },
113
+ ],
114
+ },
115
+ { name: 'directives', type: 'text', label: adminLabel('robots'), localized, admin: { condition: (_, siblingData) => siblingData?.mode === 'custom' } },
116
+ ],
117
+ }],
118
+ },
119
+ {
120
+ label: adminTabLabel('openGraph'),
121
+ fields: [{
122
+ name: 'openGraph', type: 'group', label: adminLabel('openGraph'), fields: [
123
+ { name: 'title', type: 'text', label: adminLabel('title'), localized },
124
+ { name: 'description', type: 'textarea', label: adminLabel('description'), localized },
125
+ uploadField('image', imageCollection),
126
+ ],
127
+ }],
128
+ },
129
+ {
130
+ label: adminTabLabel('twitter'),
131
+ fields: [{
132
+ name: 'twitter', type: 'group', label: adminLabel('twitter'), fields: [
133
+ { name: 'title', type: 'text', label: adminLabel('title'), localized },
134
+ { name: 'description', type: 'textarea', label: adminLabel('description'), localized },
135
+ uploadField('image', imageCollection),
136
+ { name: 'card', type: 'select', label: adminLabel('card'), localized, options: socialCards },
137
+ { name: 'site', type: 'text', label: adminLabel('twitter'), localized },
138
+ { name: 'creator', type: 'text', label: adminLabel('author'), localized },
139
+ ],
140
+ }],
141
+ },
142
+ {
143
+ label: adminTabLabel('schema'),
144
+ fields: [{
145
+ name: 'schema', type: 'group', label: adminLabel('schema'), fields: [
146
+ { name: 'type', type: 'select', label: adminLabel('schemaType'), localized, defaultValue: collection.schemaType, required: true, options: schemaOptions },
147
+ {
148
+ name: 'values', type: 'group', label: adminLabel('schemaOverrides'), localized, fields: visualFields,
149
+ admin: {
150
+ components: { Field: SEO_SCHEMA_VALUE_OVERRIDES_ADMIN_COMPONENT },
151
+ custom: { seo: { schemaMappings: collection.schema ?? {} } },
152
+ },
153
+ },
154
+ {
155
+ name: 'rawJson', type: 'textarea', label: adminLabel('rawJson'), localized, validate: validateJson,
156
+ admin: {
157
+ components: { Field: SEO_RAW_JSON_ADMIN_COMPONENT },
158
+ custom: {
159
+ seo: {
160
+ collectionSchema: collection.schema ?? {},
161
+ defaultType: collection.schemaType,
162
+ marker: SEO_PLUGIN_MARKER,
163
+ seoField: name,
164
+ },
165
+ },
166
+ },
167
+ },
168
+ ],
169
+ }],
170
+ },
171
+ {
172
+ label: adminTabLabel('previews'),
173
+ fields: [{
174
+ name: 'previews',
175
+ type: 'ui',
176
+ admin: {
177
+ components: { Field: SEO_PREVIEWS_ADMIN_COMPONENT },
178
+ custom: { seo: { seoField: name } },
179
+ },
180
+ }],
181
+ },
182
+ ],
183
+ },
184
+ ],
185
+ };
186
+ };
187
+ //# sourceMappingURL=seo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo.js","sourceRoot":"","sources":["../../src/fields/seo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { GlobalConfig } from 'payload';
2
+ import { type SeoPluginAccess } from '../types.js';
3
+ export declare const createSeoSettingsGlobal: ({ access, slug, mediaCollection }: {
4
+ access?: SeoPluginAccess["settings"];
5
+ slug: string;
6
+ mediaCollection: string;
7
+ }) => GlobalConfig;
8
+ //# sourceMappingURL=seo-settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo-settings.d.ts","sourceRoot":"","sources":["../../src/globals/seo-settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAE3C,OAAO,EAAqB,KAAK,eAAe,EAAE,MAAM,aAAa,CAAA;AAIrE,eAAO,MAAM,uBAAuB,GAAI,mCAAmC;IAAE,MAAM,CAAC,EAAE,eAAe,CAAC,UAAU,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,KAAG,YAoE3J,CAAA"}
@@ -0,0 +1,73 @@
1
+ import { SEO_PLUGIN_MARKER } from '../types.js';
2
+ import { adminLabel, adminTabLabel } from '../admin/translations.js';
3
+ import { validateAbsoluteHttpUrl, validateRobotsToken } from '../utils/validation.js';
4
+ export const createSeoSettingsGlobal = ({ access, slug, mediaCollection }) => ({
5
+ slug,
6
+ label: adminLabel('seoSettings'),
7
+ access: { read: access?.read ?? (() => false), update: access?.update ?? (() => false) },
8
+ admin: {
9
+ custom: { seo: { marker: SEO_PLUGIN_MARKER } },
10
+ group: "SEO"
11
+ },
12
+ fields: [
13
+ {
14
+ type: 'tabs',
15
+ tabs: [
16
+ {
17
+ label: adminTabLabel('siteDefaults'),
18
+ fields: [
19
+ { name: 'siteName', type: 'text', label: adminLabel('siteName'), localized: true },
20
+ { name: 'titleTemplate', type: 'text', label: adminLabel('titleTemplate'), localized: true },
21
+ { name: 'defaultDescription', type: 'textarea', label: adminLabel('defaultDescription'), localized: true },
22
+ ],
23
+ },
24
+ {
25
+ label: adminTabLabel('socialDefaults'),
26
+ fields: [
27
+ { name: 'defaultOpenGraphImage', type: 'upload', label: adminLabel('defaultOpenGraphImage'), relationTo: mediaCollection, localized: true },
28
+ { name: 'defaultTwitterCard', type: 'select', label: adminLabel('defaultTwitterCard'), localized: true, options: [{ label: adminLabel('summary'), value: 'summary' }, { label: adminLabel('summaryLargeImage'), value: 'summary_large_image' }] },
29
+ { name: 'defaultOpenGraphType', type: 'text', label: adminLabel('openGraph'), localized: true },
30
+ { name: 'defaultTwitterSite', type: 'text', label: adminLabel('twitter'), localized: true },
31
+ { name: 'defaultTwitterCreator', type: 'text', label: adminLabel('author'), localized: true },
32
+ { name: 'defaultLocale', type: 'text', label: adminLabel('siteDefaults'), localized: true },
33
+ ],
34
+ },
35
+ {
36
+ label: adminTabLabel('defaultRobots'),
37
+ fields: [{
38
+ name: 'defaultRobots', type: 'group', label: adminLabel('defaultRobots'), localized: true, fields: [
39
+ { name: 'mode', type: 'select', label: adminLabel('defaultRobots'), required: true, defaultValue: 'index-follow', options: [{ label: 'Index, follow', value: 'index-follow' }, { label: 'No index, follow', value: 'noindex-follow' }, { label: 'Index, nofollow', value: 'index-nofollow' }, { label: 'No index, nofollow', value: 'noindex-nofollow' }, { label: 'Custom directives', value: 'custom' }] },
40
+ { name: 'directives', type: 'text', label: adminLabel('robots'), admin: { condition: (_, siblingData) => siblingData?.mode === 'custom' } },
41
+ ]
42
+ }],
43
+ },
44
+ {
45
+ label: adminTabLabel('organizationSchema'),
46
+ fields: [{
47
+ name: 'organizationSchema', type: 'group', label: adminLabel('organizationSchema'), localized: true, fields: [
48
+ { name: 'name', type: 'text', label: adminLabel('organizationName') }, { name: 'url', type: 'text', label: adminLabel('organizationUrl'), validate: validateAbsoluteHttpUrl }, { name: 'logo', type: 'upload', label: adminLabel('organizationLogo'), relationTo: mediaCollection },
49
+ { name: 'sameAs', type: 'array', label: adminLabel('organizationSchema'), fields: [{ name: 'url', type: 'text', label: adminLabel('organizationUrl'), validate: validateAbsoluteHttpUrl }] },
50
+ ]
51
+ }],
52
+ },
53
+ {
54
+ label: adminTabLabel('robotsTxt'),
55
+ fields: [{
56
+ name: 'robots', type: 'group', label: adminLabel('robots'), localized: true, fields: [
57
+ { name: 'mode', type: 'select', label: adminLabel('robotsMode'), required: true, defaultValue: 'generated', options: [{ label: adminLabel('generated'), value: 'generated' }, { label: adminLabel('override'), value: 'override' }] },
58
+ {
59
+ name: 'groups', type: 'array', label: adminLabel('groups'), fields: [
60
+ { name: 'userAgent', type: 'text', label: adminLabel('userAgent'), required: true, validate: validateRobotsToken },
61
+ { name: 'allow', type: 'array', label: adminLabel('allow'), fields: [{ name: 'path', type: 'text', label: adminLabel('path'), validate: validateRobotsToken }] },
62
+ { name: 'disallow', type: 'array', label: adminLabel('disallow'), fields: [{ name: 'path', type: 'text', label: adminLabel('path'), validate: validateRobotsToken }] },
63
+ ]
64
+ },
65
+ { name: 'overrideText', type: 'textarea', label: adminLabel('overrideText'), admin: { condition: (_, siblingData) => siblingData?.mode === 'override' } },
66
+ ]
67
+ }],
68
+ },
69
+ ],
70
+ },
71
+ ],
72
+ });
73
+ //# sourceMappingURL=seo-settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo-settings.js","sourceRoot":"","sources":["../../src/globals/seo-settings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { SeoEnabledPluginConfig, SeoPayload } from '../types.js';
2
+ export declare const SEO_RUNTIME_CONFIG_KEY = "@sittari/payload-seo/config";
3
+ /** Gets the server-only plugin configuration retained on Payload's config object. */
4
+ export declare const getSeoRuntimeConfig: (payload: SeoPayload) => SeoEnabledPluginConfig | undefined;
5
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/helpers/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAErE,eAAO,MAAM,sBAAsB,gCAAgC,CAAA;AAEnE,qFAAqF;AACrF,eAAO,MAAM,mBAAmB,GAAI,SAAS,UAAU,KAAG,sBAAsB,GAAG,SAGlF,CAAA"}
@@ -0,0 +1,7 @@
1
+ export const SEO_RUNTIME_CONFIG_KEY = '@sittari/payload-seo/config';
2
+ /** Gets the server-only plugin configuration retained on Payload's config object. */
3
+ export const getSeoRuntimeConfig = (payload) => {
4
+ const value = payload.config?.custom?.[SEO_RUNTIME_CONFIG_KEY];
5
+ return value !== null && typeof value === 'object' ? value : undefined;
6
+ };
7
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/helpers/config.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,sBAAsB,GAAG,6BAA6B,CAAA;AAEnE,qFAAqF;AACrF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,OAAmB,EAAsC,EAAE;IAC7F,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,sBAAsB,CAAC,CAAA;IAC9D,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAA+B,CAAC,CAAC,CAAC,SAAS,CAAA;AAClG,CAAC,CAAA"}
@@ -0,0 +1,27 @@
1
+ import type { ResolvedSeoMetadata, SeoDocument, SeoPayload } from '../types.js';
2
+ import { resolveSeoNames } from '../plugin.js';
3
+ import { getSeoRuntimeConfig } from './config.js';
4
+ type DocumentInput = {
5
+ document: SeoDocument;
6
+ id?: never;
7
+ } | {
8
+ document?: never;
9
+ id: string | number;
10
+ };
11
+ /** Shared translation eligibility used by metadata and XML sitemap alternates. */
12
+ export declare const resolveSeoAlternates: ({ payload, collection, locale, document, config, names, settings, }: {
13
+ payload: SeoPayload;
14
+ collection: string;
15
+ locale: string;
16
+ document: SeoDocument;
17
+ config: NonNullable<ReturnType<typeof getSeoRuntimeConfig>>;
18
+ names: ReturnType<typeof resolveSeoNames>;
19
+ settings: SeoDocument;
20
+ }) => Promise<Record<string, string>>;
21
+ export declare const resolveSeoMetadata: ({ payload, collection, locale, ...input }: {
22
+ payload: SeoPayload;
23
+ collection: string;
24
+ locale: string;
25
+ } & DocumentInput) => Promise<ResolvedSeoMetadata>;
26
+ export {};
27
+ //# sourceMappingURL=metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/helpers/metadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAI9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAEjD,KAAK,aAAa,GAAG;IAAE,QAAQ,EAAE,WAAW,CAAC;IAAC,EAAE,CAAC,EAAE,KAAK,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,EAAE,KAAK,CAAC;IAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,CAAA;AAQtG,kFAAkF;AAClF,eAAO,MAAM,oBAAoB,GAAU,qEAQxC;IACD,OAAO,EAAE,UAAU,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,WAAW,CAAA;IACrB,MAAM,EAAE,WAAW,CAAC,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC,CAAA;IAC3D,KAAK,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,CAAA;IACzC,QAAQ,EAAE,WAAW,CAAA;CACtB,KAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAejC,CAAA;AAED,eAAO,MAAM,kBAAkB,GAAU,2CAA2C;IAClF,OAAO,EAAE,UAAU,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;CACf,GAAG,aAAa,KAAG,OAAO,CAAC,mBAAmB,CAe9C,CAAA"}