@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,50 @@
1
+ import { resolveSeoNames } from '../plugin.js';
2
+ import { resolveSeoMetadataCore } from '../resolvers/metadata.js';
3
+ import { isPublicSeoDocument, resolveCanonicalRobotsSeo } from '../resolvers/effective.js';
4
+ import { loadDocumentWithoutFallback, loadSettingsWithoutFallback } from '../utils/locale.js';
5
+ import { getSeoRuntimeConfig } from './config.js';
6
+ const getLocales = (payload, activeLocale) => {
7
+ const configured = payload.config?.localization?.locales ?? [];
8
+ const locales = configured.map((locale) => typeof locale === 'string' ? locale : locale.code).filter((locale) => Boolean(locale));
9
+ return [...new Set([...(activeLocale ? [activeLocale] : []), ...locales])];
10
+ };
11
+ /** Shared translation eligibility used by metadata and XML sitemap alternates. */
12
+ export const resolveSeoAlternates = async ({ payload, collection, locale, document, config, names, settings, }) => {
13
+ const id = document.id;
14
+ if (typeof id !== 'string' && typeof id !== 'number')
15
+ return {};
16
+ const alternates = {};
17
+ for (const alternateLocale of getLocales(payload, locale)) {
18
+ try {
19
+ const alternateDocument = alternateLocale === locale ? document : await loadDocumentWithoutFallback({ payload, collection, id, locale: alternateLocale });
20
+ const effective = await resolveCanonicalRobotsSeo({ collection, config, document: alternateDocument, locale: alternateLocale, names, settings });
21
+ if (isPublicSeoDocument(alternateDocument) && effective.robots.index !== 'noindex' && effective.canonical.url && !effective.canonical.external)
22
+ alternates[alternateLocale] = effective.canonical.url;
23
+ }
24
+ catch {
25
+ config.diagnostics?.({ area: 'metadata', collection, documentId: id, locale: alternateLocale, message: 'Translation metadata resolution failed.' });
26
+ }
27
+ }
28
+ if (config.hreflang?.xDefaultLocale && alternates[config.hreflang.xDefaultLocale])
29
+ alternates['x-default'] = alternates[config.hreflang.xDefaultLocale];
30
+ return alternates;
31
+ };
32
+ export const resolveSeoMetadata = async ({ payload, collection, locale, ...input }) => {
33
+ const config = getSeoRuntimeConfig(payload);
34
+ if (!config?.collections[collection])
35
+ return {};
36
+ const names = resolveSeoNames(config.names);
37
+ let document;
38
+ try {
39
+ document = 'id' in input ? await loadDocumentWithoutFallback({ payload, collection, id: input.id, locale }) : input.document;
40
+ const settings = await loadSettingsWithoutFallback({ payload, slug: names.settingsGlobal, locale });
41
+ const result = await resolveSeoMetadataCore({ collection, config, document, locale, names, settings });
42
+ const alternates = await resolveSeoAlternates({ payload, collection, locale, document, config, names, settings });
43
+ return Object.keys(alternates).length ? { ...result, alternates } : result;
44
+ }
45
+ catch {
46
+ config.diagnostics?.({ area: 'metadata', collection, locale, message: 'Metadata resolution failed.' });
47
+ return {};
48
+ }
49
+ };
50
+ //# sourceMappingURL=metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/helpers/metadata.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { SeoDocument, SeoLocalApiOptions, SeoPayload, SeoPreview } from '../types.js';
2
+ type DocumentInput = {
3
+ document: SeoDocument;
4
+ id?: never;
5
+ } | {
6
+ document?: never;
7
+ id: string | number;
8
+ };
9
+ /** Server-backed preview projection with exactly the same resolution inputs as production metadata. */
10
+ export declare const resolveSeoPreview: ({ payload, collection, locale, ...source }: {
11
+ payload: SeoPayload;
12
+ collection: string;
13
+ locale: string;
14
+ /** Supply this only for a request-scoped Admin preview. */
15
+ access?: SeoLocalApiOptions;
16
+ } & DocumentInput) => Promise<SeoPreview>;
17
+ export {};
18
+ //# sourceMappingURL=preview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../../src/helpers/preview.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAM1F,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;AAEtG,uGAAuG;AACvG,eAAO,MAAM,iBAAiB,GAAU,4CAA4C;IAClF,OAAO,EAAE,UAAU,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,2DAA2D;IAC3D,MAAM,CAAC,EAAE,kBAAkB,CAAA;CAC5B,GAAG,aAAa,KAAG,OAAO,CAAC,UAAU,CAcrC,CAAA"}
@@ -0,0 +1,23 @@
1
+ import { resolveSeoNames } from '../plugin.js';
2
+ import { projectSeoPreview, resolveEffectiveSeo } from '../resolvers/effective.js';
3
+ import { loadDocumentWithoutFallback, loadSettingsWithoutFallback } from '../utils/locale.js';
4
+ import { getSeoRuntimeConfig } from './config.js';
5
+ /** Server-backed preview projection with exactly the same resolution inputs as production metadata. */
6
+ export const resolveSeoPreview = async ({ payload, collection, locale, ...source }) => {
7
+ const config = getSeoRuntimeConfig(payload);
8
+ if (!config?.collections[collection])
9
+ return { robots: { index: 'index', follow: 'follow' } };
10
+ const names = resolveSeoNames(config.names);
11
+ try {
12
+ const document = 'id' in source
13
+ ? await loadDocumentWithoutFallback({ payload, collection, id: source.id, locale, access: source.access })
14
+ : source.document;
15
+ const settings = await loadSettingsWithoutFallback({ payload, slug: names.settingsGlobal, locale, access: source.access });
16
+ return projectSeoPreview(await resolveEffectiveSeo({ collection, config, document, locale, names, settings }));
17
+ }
18
+ catch {
19
+ config.diagnostics?.({ area: 'metadata', collection, locale, message: 'Preview resolution failed.' });
20
+ return { robots: { index: 'index', follow: 'follow' } };
21
+ }
22
+ };
23
+ //# sourceMappingURL=preview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview.js","sourceRoot":"","sources":["../../src/helpers/preview.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAClF,OAAO,EAAE,2BAA2B,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAA;AAC7F,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAIjD,uGAAuG;AACvG,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,EAM/D,EAAuB,EAAE;IACxC,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAA;IAC3C,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,UAAU,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAA;IAC7F,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAC3C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,IAAI,MAAM;YAC7B,CAAC,CAAC,MAAM,2BAA2B,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,CAAC,EAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;YAC3G,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAA;QACnB,MAAM,QAAQ,GAAG,MAAM,2BAA2B,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAA;QAC1H,OAAO,iBAAiB,CAAC,MAAM,mBAAmB,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;IAChH,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,4BAA4B,EAAE,CAAC,CAAA;QACrG,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAA;IACzD,CAAC;AACH,CAAC,CAAA"}
@@ -0,0 +1,10 @@
1
+ import type { SeoPayload } from '../types.js';
2
+ export type SeoRedirect = {
3
+ destination: string;
4
+ statusCode: 301 | 302;
5
+ };
6
+ export declare const findSeoRedirect: ({ payload, sourcePath }: {
7
+ payload: SeoPayload;
8
+ sourcePath: string;
9
+ }) => Promise<SeoRedirect | null>;
10
+ //# sourceMappingURL=redirects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redirects.d.ts","sourceRoot":"","sources":["../../src/helpers/redirects.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAK7C,MAAM,MAAM,WAAW,GAAG;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,GAAG,GAAG,GAAG,CAAA;CAAE,CAAA;AAExE,eAAO,MAAM,eAAe,GAAU,yBAAyB;IAAE,OAAO,EAAE,UAAU,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,KAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAoBtI,CAAA"}
@@ -0,0 +1,27 @@
1
+ import { resolveSeoNames } from '../plugin.js';
2
+ import { normalizeRedirectPath, isAbsoluteHttpUrl } from '../utils/validation.js';
3
+ import { getSeoRuntimeConfig } from './config.js';
4
+ export const findSeoRedirect = async ({ payload, sourcePath }) => {
5
+ const source = normalizeRedirectPath(sourcePath);
6
+ const config = getSeoRuntimeConfig(payload);
7
+ if (!source || !config || !payload.find)
8
+ return null;
9
+ try {
10
+ const result = await payload.find({
11
+ collection: resolveSeoNames(config.names).redirectsCollection,
12
+ depth: 0,
13
+ limit: 1,
14
+ pagination: false,
15
+ select: { destination: true, destinationType: true, statusCode: true },
16
+ where: { and: [{ source: { equals: source } }, { enabled: { equals: true } }] },
17
+ });
18
+ const redirect = result.docs[0] ?? {};
19
+ const statusCode = redirect.statusCode === 301 || redirect.statusCode === '301' ? 301 : redirect.statusCode === 302 || redirect.statusCode === '302' ? 302 : undefined;
20
+ const destination = redirect.destinationType === 'internal' ? normalizeRedirectPath(redirect.destination) : isAbsoluteHttpUrl(redirect.destination) ? redirect.destination.trim() : null;
21
+ return destination && statusCode ? { destination, statusCode } : null;
22
+ }
23
+ catch {
24
+ return null;
25
+ }
26
+ };
27
+ //# sourceMappingURL=redirects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redirects.js","sourceRoot":"","sources":["../../src/helpers/redirects.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAIjD,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAAE,EAAE,OAAO,EAAE,UAAU,EAA+C,EAA+B,EAAE;IACzI,MAAM,MAAM,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAA;IAChD,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAA;IAC3C,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI;QAAE,OAAO,IAAI,CAAA;IACpD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;YAChC,UAAU,EAAE,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,mBAAmB;YAC7D,KAAK,EAAE,CAAC;YACR,KAAK,EAAE,CAAC;YACR,UAAU,EAAE,KAAK;YACjB,MAAM,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE;YACtE,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE;SAChF,CAAC,CAAA;QACF,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QACrC,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,KAAK,GAAG,IAAI,QAAQ,CAAC,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,KAAK,GAAG,IAAI,QAAQ,CAAC,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAA;QACtK,MAAM,WAAW,GAAG,QAAQ,CAAC,eAAe,KAAK,UAAU,CAAC,CAAC,CAAC,qBAAqB,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;QACxL,OAAO,WAAW,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;IACvE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC,CAAA"}
@@ -0,0 +1,6 @@
1
+ import type { SeoPayload } from '../types.js';
2
+ export declare const renderRobotsTxt: ({ payload, locale }: {
3
+ payload: SeoPayload;
4
+ locale: string;
5
+ }) => Promise<string>;
6
+ //# sourceMappingURL=robots.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"robots.d.ts","sourceRoot":"","sources":["../../src/helpers/robots.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,UAAU,EAAE,MAAM,aAAa,CAAA;AAS1D,eAAO,MAAM,eAAe,GAAU,qBAAqB;IAAE,OAAO,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,KAAG,OAAO,CAAC,MAAM,CA+BlH,CAAA"}
@@ -0,0 +1,46 @@
1
+ import { resolveSeoNames } from '../plugin.js';
2
+ import { loadSettingsWithoutFallback } from '../utils/locale.js';
3
+ import { nonEmptyString } from '../utils/urls.js';
4
+ import { hasLineBreak, isAbsoluteHttpUrl } from '../utils/validation.js';
5
+ import { getSeoRuntimeConfig } from './config.js';
6
+ const object = (value) => value !== null && typeof value === 'object' && !Array.isArray(value) ? value : {};
7
+ export const renderRobotsTxt = async ({ payload, locale }) => {
8
+ const config = getSeoRuntimeConfig(payload);
9
+ if (!config)
10
+ return '';
11
+ try {
12
+ const settings = await loadSettingsWithoutFallback({ payload, slug: resolveSeoNames(config.names).settingsGlobal, locale });
13
+ const robots = object(settings.robots);
14
+ if (robots.mode === 'override')
15
+ return typeof robots.overrideText === 'string' ? robots.overrideText : '';
16
+ const groups = Array.isArray(robots.groups) ? robots.groups : [];
17
+ const sections = groups.flatMap((group) => {
18
+ const value = object(group);
19
+ const userAgent = nonEmptyString(value.userAgent);
20
+ if (!userAgent || hasLineBreak(userAgent))
21
+ return [];
22
+ const lines = [`User-agent: ${userAgent}`];
23
+ for (const allow of Array.isArray(value.allow) ? value.allow : []) {
24
+ const path = nonEmptyString(object(allow).path);
25
+ if (path && !hasLineBreak(path))
26
+ lines.push(`Allow: ${path}`);
27
+ }
28
+ for (const disallow of Array.isArray(value.disallow) ? value.disallow : []) {
29
+ const path = nonEmptyString(object(disallow).path);
30
+ if (path && !hasLineBreak(path))
31
+ lines.push(`Disallow: ${path}`);
32
+ }
33
+ return [lines.join('\n')];
34
+ });
35
+ const sitemapUrls = config.robots?.resolveSitemapUrls ? await config.robots.resolveSitemapUrls({ locale }) : [];
36
+ const sitemapLines = sitemapUrls.filter((url) => isAbsoluteHttpUrl(url) && !hasLineBreak(url)).map((url) => `Sitemap: ${url.trim()}`);
37
+ if (sitemapLines.length)
38
+ sections.push(sitemapLines.join('\n'));
39
+ return sections.join('\n\n');
40
+ }
41
+ catch {
42
+ config.diagnostics?.({ area: 'robots', locale, message: 'robots.txt resolution failed.' });
43
+ return '';
44
+ }
45
+ };
46
+ //# sourceMappingURL=robots.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"robots.js","sourceRoot":"","sources":["../../src/helpers/robots.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { SeoDocument, SeoPayload } from '../types.js';
2
+ export declare const renderSchemaJsonLd: (input: {
3
+ payload: SeoPayload;
4
+ collection: string;
5
+ locale: string;
6
+ document: SeoDocument;
7
+ } | {
8
+ payload: SeoPayload;
9
+ collection: string;
10
+ locale: string;
11
+ id: string | number;
12
+ }) => Promise<Record<string, unknown> | null>;
13
+ /** Safe for embedding in an HTML JSON script element. */
14
+ export declare const serializeJsonLd: (schema: Record<string, unknown>) => string;
15
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/helpers/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAG1D,eAAO,MAAM,kBAAkB,GAAU,OAAO;IAC9C,OAAO,EAAE,UAAU,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,WAAW,CAAA;CACtB,GAAG;IACF,OAAO,EAAE,UAAU,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;CACpB,KAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAqD,CAAA;AAE/F,yDAAyD;AACzD,eAAO,MAAM,eAAe,GAAI,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,MACiC,CAAA"}
@@ -0,0 +1,5 @@
1
+ import { resolveSeoMetadata } from './metadata.js';
2
+ export const renderSchemaJsonLd = async (input) => (await resolveSeoMetadata(input)).schema ?? null;
3
+ /** Safe for embedding in an HTML JSON script element. */
4
+ export const serializeJsonLd = (schema) => JSON.stringify(schema).replace(/</g, '\\u003c').replace(/>/g, '\\u003e').replace(/&/g, '\\u0026');
5
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/helpers/schema.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAElD,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EAAE,KAUxC,EAA2C,EAAE,CAAC,CAAC,MAAM,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,IAAI,IAAI,CAAA;AAE/F,yDAAyD;AACzD,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,MAA+B,EAAU,EAAE,CACzE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA"}
@@ -0,0 +1,11 @@
1
+ import type { SeoPayload } from '../types.js';
2
+ export declare const renderSitemapXml: ({ payload, collection, locale, page }: {
3
+ payload: SeoPayload;
4
+ collection: string;
5
+ locale: string;
6
+ page: number;
7
+ }) => Promise<string>;
8
+ export declare const renderSitemapIndexXml: ({ payload }: {
9
+ payload: SeoPayload;
10
+ }) => Promise<string>;
11
+ //# sourceMappingURL=sitemap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sitemap.d.ts","sourceRoot":"","sources":["../../src/helpers/sitemap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,UAAU,EAAE,MAAM,aAAa,CAAA;AA2E1D,eAAO,MAAM,gBAAgB,GAAU,uCAAuC;IAAE,OAAO,EAAE,UAAU,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,KAAG,OAAO,CAAC,MAAM,CAYvK,CAAA;AAcD,eAAO,MAAM,qBAAqB,GAAU,aAAa;IAAE,OAAO,EAAE,UAAU,CAAA;CAAE,KAAG,OAAO,CAAC,MAAM,CAwBhG,CAAA"}
@@ -0,0 +1,131 @@
1
+ import { resolveSeoNames } from '../plugin.js';
2
+ import { resolveCanonicalRobotsSeo, resolveSitemapEligibility } from '../resolvers/effective.js';
3
+ import { isAbsoluteHttpUrl } from '../utils/validation.js';
4
+ import { isSameSiteUrl, normalizeCanonicalUrl } from '../utils/urls.js';
5
+ import { getSeoRuntimeConfig } from './config.js';
6
+ import { resolveSeoAlternates } from './metadata.js';
7
+ const PAGE_SIZE = 25_000;
8
+ const RESOLUTION_CONCURRENCY = 16;
9
+ const escapeXml = (value) => value.replace(/[&<>"']/g, (character) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&apos;' })[character]);
10
+ const xmlDocument = (body) => `<?xml version="1.0" encoding="UTF-8"?>\n${body}`;
11
+ const empty = () => xmlDocument('<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"/>');
12
+ const validDate = (value) => {
13
+ const date = value instanceof Date ? value : typeof value === 'string' ? new Date(value) : undefined;
14
+ return date && !Number.isNaN(date.getTime()) ? date.toISOString() : undefined;
15
+ };
16
+ const sitemapSelect = (fields, seoField) => {
17
+ if (!fields?.length)
18
+ return undefined;
19
+ return Object.fromEntries([...new Set(['updatedAt', '_status', 'deletedAt', '_deleted', seoField, ...fields])].map((field) => [field, true]));
20
+ };
21
+ /**
22
+ * Resolves the complete locale dataset before slicing it into chunks. Collisions
23
+ * are keyed by the final normalized canonical URL; the first eligible document
24
+ * in Payload's stable query order wins.
25
+ */
26
+ const resolveSitemapEntries = async ({ payload, collection, locale }) => {
27
+ const config = getSeoRuntimeConfig(payload);
28
+ const collectionConfig = config?.collections[collection];
29
+ if (!config || !payload.find || !collectionConfig || collectionConfig.sitemap?.enabled === false)
30
+ return [];
31
+ const names = resolveSeoNames(config.names);
32
+ const settings = await payload.findGlobal({ slug: names.settingsGlobal, locale, fallbackLocale: false, draft: false });
33
+ const select = sitemapSelect(collectionConfig.sitemap?.fields, names.seoField);
34
+ const count = await payload.find({ collection, locale, fallbackLocale: false, draft: false, depth: 0, limit: 0, pagination: false });
35
+ const entries = [];
36
+ const seen = new Set();
37
+ for (let rawPage = 1; rawPage <= Math.ceil((count.totalDocs ?? 0) / PAGE_SIZE); rawPage++) {
38
+ const result = await payload.find({ collection, locale, fallbackLocale: false, draft: false, depth: 0, limit: PAGE_SIZE, page: rawPage, ...(select ? { select } : {}) });
39
+ const resolved = await mapBounded(result.docs, RESOLUTION_CONCURRENCY, async (document) => {
40
+ try {
41
+ const input = { collection, config, document, locale, names, settings };
42
+ const effective = await resolveCanonicalRobotsSeo(input);
43
+ if (!(await resolveSitemapEligibility({ effective, document, input })))
44
+ return null;
45
+ const url = normalizeCanonicalUrl(effective.canonical.url, config.url?.trailingSlash ?? 'never');
46
+ if (!url)
47
+ return null;
48
+ let lastmod = validDate(document.updatedAt);
49
+ if (collectionConfig.lastModified)
50
+ lastmod = validDate(await collectionConfig.lastModified({ collection, document, locale }));
51
+ return { url, ...(lastmod ? { lastmod } : {}), alternates: await resolveSeoAlternates({ payload, collection, locale, document, config, names, settings }) };
52
+ }
53
+ catch {
54
+ config.diagnostics?.({ area: 'sitemap', collection, documentId: typeof document.id === 'string' || typeof document.id === 'number' ? document.id : undefined, locale, message: 'Sitemap document resolution failed.' });
55
+ return null;
56
+ }
57
+ });
58
+ for (const entry of resolved) {
59
+ if (!entry)
60
+ continue;
61
+ if (seen.has(entry.url)) {
62
+ config.diagnostics?.({ area: 'sitemap', collection, locale, message: 'Sitemap canonical collision omitted.' });
63
+ continue;
64
+ }
65
+ seen.add(entry.url);
66
+ entries.push(entry);
67
+ }
68
+ }
69
+ return entries;
70
+ };
71
+ const renderEntry = (entry) => {
72
+ const alternates = Object.entries(entry.alternates).map(([locale, url]) => `<xhtml:link rel="alternate" hreflang="${escapeXml(locale)}" href="${escapeXml(url)}"/>`).join('');
73
+ return `<url><loc>${escapeXml(entry.url)}</loc>${entry.lastmod ? `<lastmod>${entry.lastmod}</lastmod>` : ''}${alternates}</url>`;
74
+ };
75
+ export const renderSitemapXml = async ({ payload, collection, locale, page }) => {
76
+ if (!Number.isInteger(page) || page < 1)
77
+ return empty();
78
+ try {
79
+ const entries = await resolveSitemapEntries({ payload, collection, locale });
80
+ const chunk = entries.slice((page - 1) * PAGE_SIZE, page * PAGE_SIZE);
81
+ const xhtml = chunk.some((entry) => Object.keys(entry.alternates).length);
82
+ return xmlDocument(`<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"${xhtml ? ' xmlns:xhtml="http://www.w3.org/1999/xhtml"' : ''}>${chunk.map(renderEntry).join('')}</urlset>`);
83
+ }
84
+ catch {
85
+ const config = getSeoRuntimeConfig(payload);
86
+ config?.diagnostics?.({ area: 'sitemap', collection, locale, message: 'Sitemap resolution failed.' });
87
+ return empty();
88
+ }
89
+ };
90
+ const mapBounded = async (items, concurrency, mapper) => {
91
+ const results = new Array(items.length);
92
+ let next = 0;
93
+ await Promise.all(Array.from({ length: Math.min(concurrency, items.length) }, async () => {
94
+ while (next < items.length) {
95
+ const index = next++;
96
+ results[index] = await mapper(items[index]);
97
+ }
98
+ }));
99
+ return results;
100
+ };
101
+ export const renderSitemapIndexXml = async ({ payload }) => {
102
+ const config = getSeoRuntimeConfig(payload);
103
+ if (!config || !payload.find)
104
+ return xmlDocument('<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"/>');
105
+ const locales = payload.config?.localization?.locales?.map((locale) => typeof locale === 'string' ? locale : locale.code).filter((locale) => Boolean(locale)) ?? [];
106
+ const effectiveLocales = locales.length ? locales : [''];
107
+ const entries = [];
108
+ for (const [collection, collectionConfig] of Object.entries(config.collections)) {
109
+ if (collectionConfig.sitemap?.enabled === false)
110
+ continue;
111
+ for (const locale of effectiveLocales) {
112
+ try {
113
+ const count = (await resolveSitemapEntries({ payload, collection, locale })).length;
114
+ for (let page = 1; page <= Math.ceil(count / PAGE_SIZE); page++) {
115
+ const resolvedUrl = await config.resolveChunkUrl({ collection, locale, page });
116
+ if (!isAbsoluteHttpUrl(resolvedUrl))
117
+ continue;
118
+ const url = resolvedUrl.trim();
119
+ const normalizedUrl = isSameSiteUrl(config.siteUrl, url) ? normalizeCanonicalUrl(url, config.url?.trailingSlash ?? 'never') : url;
120
+ if (normalizedUrl)
121
+ entries.push(`<sitemap><loc>${escapeXml(normalizedUrl)}</loc></sitemap>`);
122
+ }
123
+ }
124
+ catch {
125
+ config.diagnostics?.({ area: 'sitemap', collection, locale, message: 'Sitemap index chunk resolution failed.' });
126
+ }
127
+ }
128
+ }
129
+ return xmlDocument(`<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">${entries.join('')}</sitemapindex>`);
130
+ };
131
+ //# sourceMappingURL=sitemap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sitemap.js","sourceRoot":"","sources":["../../src/helpers/sitemap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export { seoPlugin } from './plugin.js';
2
+ export { loadDocumentWithoutFallback, loadSettingsWithoutFallback } from './utils/locale.js';
3
+ export { getByPath } from './resolvers/document.js';
4
+ export { resolveSeoMetadataCore } from './resolvers/metadata.js';
5
+ export { resolveCanonical, resolveCanonicalRobotsSeo, resolveEffectiveRobots, resolveEffectiveSeo, isPublicSeoDocument, projectSeoPreview, resolveSitemapEligibility, resolveSocialMetadata, resolveStructuredData, } from './resolvers/effective.js';
6
+ export { resolveSeoMetadata } from './helpers/metadata.js';
7
+ export { resolveSeoPreview } from './helpers/preview.js';
8
+ export { renderSchemaJsonLd, serializeJsonLd } from './helpers/schema.js';
9
+ export { findSeoRedirect } from './helpers/redirects.js';
10
+ export { renderRobotsTxt } from './helpers/robots.js';
11
+ export { renderSitemapIndexXml, renderSitemapXml } from './helpers/sitemap.js';
12
+ export { DEFAULT_SEO_NAMES, SEO_PREVIEWS_ADMIN_COMPONENT, SEO_RAW_JSON_ADMIN_COMPONENT, SEO_SCHEMA_VALUE_OVERRIDES_ADMIN_COMPONENT, SEO_PLUGIN_MARKER, } from './types.js';
13
+ export type { ResolveDocumentUrl, ResolveBreadcrumbs, ResolveLastModified, ResolveMediaUrl, ResolveRobotsSitemapUrls, ResolveSitemapChunkUrl, SeoAdminCustom, SeoCollectionConfig, SeoDocument, SeoDiagnostic, SeoDocumentFieldMappings, SeoBreadcrumbItem, SeoDisabledPluginConfig, SeoEnabledPluginConfig, SeoGeneratedNames, SeoPluginAccess, SeoPluginConfig, SeoSchemaType, SeoSitemapConfig, SeoPayload, SeoLocalApiOptions, SeoRobotsDirectives, RobotsMode, CanonicalMode, TrailingSlashPolicy, SeoSocialMetadata, ResolvedEffectiveSeo, ResolvedSitemapSeo, SeoPreview, ResolvedSeoMetadata, } from './types.js';
14
+ export type { SeoRedirect } from './helpers/redirects.js';
15
+ export { seoPlugin as default } from './plugin.js';
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,2BAA2B,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAA;AAC5F,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAA;AAChE,OAAO,EACL,gBAAgB,EAChB,yBAAyB,EACzB,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,yBAAyB,EACzB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAC9E,OAAO,EACL,iBAAiB,EACjB,4BAA4B,EAC5B,4BAA4B,EAC5B,0CAA0C,EAC1C,iBAAiB,GAClB,MAAM,YAAY,CAAA;AACnB,YAAY,EACV,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,wBAAwB,EACxB,sBAAsB,EACtB,cAAc,EACd,mBAAmB,EACnB,WAAW,EACX,aAAa,EACb,wBAAwB,EACxB,iBAAiB,EACjB,uBAAuB,EACvB,sBAAsB,EACtB,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,UAAU,EACV,kBAAkB,EAClB,mBAAmB,EACnB,UAAU,EACV,aAAa,EACb,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EAClB,UAAU,EACV,mBAAmB,GACpB,MAAM,YAAY,CAAA;AACnB,YAAY,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAEzD,OAAO,EAAE,SAAS,IAAI,OAAO,EAAE,MAAM,aAAa,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,14 @@
1
+ export { seoPlugin } from './plugin.js';
2
+ export { loadDocumentWithoutFallback, loadSettingsWithoutFallback } from './utils/locale.js';
3
+ export { getByPath } from './resolvers/document.js';
4
+ export { resolveSeoMetadataCore } from './resolvers/metadata.js';
5
+ export { resolveCanonical, resolveCanonicalRobotsSeo, resolveEffectiveRobots, resolveEffectiveSeo, isPublicSeoDocument, projectSeoPreview, resolveSitemapEligibility, resolveSocialMetadata, resolveStructuredData, } from './resolvers/effective.js';
6
+ export { resolveSeoMetadata } from './helpers/metadata.js';
7
+ export { resolveSeoPreview } from './helpers/preview.js';
8
+ export { renderSchemaJsonLd, serializeJsonLd } from './helpers/schema.js';
9
+ export { findSeoRedirect } from './helpers/redirects.js';
10
+ export { renderRobotsTxt } from './helpers/robots.js';
11
+ export { renderSitemapIndexXml, renderSitemapXml } from './helpers/sitemap.js';
12
+ export { DEFAULT_SEO_NAMES, SEO_PREVIEWS_ADMIN_COMPONENT, SEO_RAW_JSON_ADMIN_COMPONENT, SEO_SCHEMA_VALUE_OVERRIDES_ADMIN_COMPONENT, SEO_PLUGIN_MARKER, } from './types.js';
13
+ export { seoPlugin as default } from './plugin.js';
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,2BAA2B,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAA;AAC5F,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAA;AAChE,OAAO,EACL,gBAAgB,EAChB,yBAAyB,EACzB,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,yBAAyB,EACzB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAC9E,OAAO,EACL,iBAAiB,EACjB,4BAA4B,EAC5B,4BAA4B,EAC5B,0CAA0C,EAC1C,iBAAiB,GAClB,MAAM,YAAY,CAAA;AAmCnB,OAAO,EAAE,SAAS,IAAI,OAAO,EAAE,MAAM,aAAa,CAAA"}
package/dist/next.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ import type { SeoDocument, SeoPayload } from './types.js';
2
+ /** Structural Next.js Metadata projection; no Next.js runtime import is required. */
3
+ export declare const resolveNextMetadata: (input: {
4
+ payload: SeoPayload;
5
+ collection: string;
6
+ locale: string;
7
+ document: SeoDocument;
8
+ } | {
9
+ payload: SeoPayload;
10
+ collection: string;
11
+ locale: string;
12
+ id: string | number;
13
+ }) => Promise<Record<string, unknown>>;
14
+ //# sourceMappingURL=next.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next.d.ts","sourceRoot":"","sources":["../src/next.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAIzD,qFAAqF;AACrF,eAAO,MAAM,mBAAmB,GAAU,OAAO;IAC/C,OAAO,EAAE,UAAU,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,WAAW,CAAA;CACtB,GAAG;IACF,OAAO,EAAE,UAAU,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;CACpB,KAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAclC,CAAA"}
package/dist/next.js ADDED
@@ -0,0 +1,24 @@
1
+ import { resolveSeoMetadata } from './helpers/metadata.js';
2
+ import { robotsContent } from './utils/robots.js';
3
+ /** Structural Next.js Metadata projection; no Next.js runtime import is required. */
4
+ export const resolveNextMetadata = async (input) => {
5
+ const metadata = await resolveSeoMetadata(input);
6
+ const result = {};
7
+ if (metadata.title)
8
+ result.title = metadata.title;
9
+ if (metadata.description)
10
+ result.description = metadata.description;
11
+ if (metadata.canonicalUrl || metadata.alternates)
12
+ result.alternates = { ...(metadata.canonicalUrl ? { canonical: metadata.canonicalUrl } : {}), ...(metadata.alternates ? { languages: metadata.alternates } : {}) };
13
+ if (metadata.robots) {
14
+ result.robots = metadata.robots.custom?.length
15
+ ? robotsContent(metadata.robots)
16
+ : { ...(metadata.robots.index ? { index: metadata.robots.index === 'index' } : {}), ...(metadata.robots.follow ? { follow: metadata.robots.follow === 'follow' } : {}) };
17
+ }
18
+ if (metadata.openGraph)
19
+ result.openGraph = { ...metadata.openGraph, ...(metadata.openGraph.image ? { images: [metadata.openGraph.image] } : {}) };
20
+ if (metadata.twitter)
21
+ result.twitter = { ...metadata.twitter, ...(metadata.twitter.image ? { images: [metadata.twitter.image] } : {}) };
22
+ return result;
23
+ };
24
+ //# sourceMappingURL=next.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next.js","sourceRoot":"","sources":["../src/next.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEjD,qFAAqF;AACrF,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EAAE,KAUzC,EAAoC,EAAE;IACrC,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,KAAK,CAAC,CAAA;IAChD,MAAM,MAAM,GAA4B,EAAE,CAAA;IAC1C,IAAI,QAAQ,CAAC,KAAK;QAAE,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAA;IACjD,IAAI,QAAQ,CAAC,WAAW;QAAE,MAAM,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAA;IACnE,IAAI,QAAQ,CAAC,YAAY,IAAI,QAAQ,CAAC,UAAU;QAAE,MAAM,CAAC,UAAU,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;IACpN,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM;YAC5C,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC;YAChC,CAAC,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;IAC5K,CAAC;IACD,IAAI,QAAQ,CAAC,SAAS;QAAE,MAAM,CAAC,SAAS,GAAG,EAAE,GAAG,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;IACjJ,IAAI,QAAQ,CAAC,OAAO;QAAE,MAAM,CAAC,OAAO,GAAG,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;IACvI,OAAO,MAAM,CAAA;AACf,CAAC,CAAA"}
@@ -0,0 +1,12 @@
1
+ import type { Plugin } from 'payload';
2
+ import { type SeoEnabledPluginConfig, type SeoPluginConfig } from './types.js';
3
+ export declare const resolveSeoNames: (names?: SeoPluginConfig["names"]) => {
4
+ redirectsCollection: string;
5
+ seoField: string;
6
+ settingsGlobal: string;
7
+ };
8
+ /** Validates the plugin-owned configuration before any Payload config is changed. */
9
+ export declare const validateSeoPluginConfig: (config: SeoEnabledPluginConfig) => void;
10
+ export declare const seoPlugin: (pluginConfig?: SeoPluginConfig) => Plugin;
11
+ export default seoPlugin;
12
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA2B,MAAM,EAAa,MAAM,SAAS,CAAA;AAEzE,OAAO,EAIL,KAAK,sBAAsB,EAC3B,KAAK,eAAe,EACrB,MAAM,YAAY,CAAA;AA8GnB,eAAO,MAAM,eAAe,GAAI,QAAQ,eAAe,CAAC,OAAO,CAAC;;;;CAG9D,CAAA;AAEF,qFAAqF;AACrF,eAAO,MAAM,uBAAuB,GAAI,QAAQ,sBAAsB,KAAG,IAoExE,CAAA;AA6CD,eAAO,MAAM,SAAS,GACnB,eAAc,eAAuC,KAAG,MAmDxD,CAAA;AAEH,eAAe,SAAS,CAAA"}