@actuate-media/cms-core 0.81.0 → 0.83.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 (57) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/__tests__/api/admin-contracts.test.js +5 -0
  3. package/dist/__tests__/api/admin-contracts.test.js.map +1 -1
  4. package/dist/__tests__/api/public-seo.test.js +8 -7
  5. package/dist/__tests__/api/public-seo.test.js.map +1 -1
  6. package/dist/__tests__/api/route-contracts.test.js +4 -0
  7. package/dist/__tests__/api/route-contracts.test.js.map +1 -1
  8. package/dist/__tests__/api/sitemap-pagination.test.js +9 -9
  9. package/dist/__tests__/api/sitemap-pagination.test.js.map +1 -1
  10. package/dist/__tests__/auth/team.test.js +16 -1
  11. package/dist/__tests__/auth/team.test.js.map +1 -1
  12. package/dist/__tests__/seo/sitemap-public.test.d.ts +2 -0
  13. package/dist/__tests__/seo/sitemap-public.test.d.ts.map +1 -0
  14. package/dist/__tests__/seo/sitemap-public.test.js +52 -0
  15. package/dist/__tests__/seo/sitemap-public.test.js.map +1 -0
  16. package/dist/actions.d.ts.map +1 -1
  17. package/dist/actions.js +6 -2
  18. package/dist/actions.js.map +1 -1
  19. package/dist/api/routes/redirects.d.ts.map +1 -1
  20. package/dist/api/routes/redirects.js +81 -33
  21. package/dist/api/routes/redirects.js.map +1 -1
  22. package/dist/api/routes/seo-public.d.ts.map +1 -1
  23. package/dist/api/routes/seo-public.js +45 -12
  24. package/dist/api/routes/seo-public.js.map +1 -1
  25. package/dist/api/routes/users.d.ts.map +1 -1
  26. package/dist/api/routes/users.js +13 -4
  27. package/dist/api/routes/users.js.map +1 -1
  28. package/dist/auth/team.d.ts +12 -0
  29. package/dist/auth/team.d.ts.map +1 -1
  30. package/dist/auth/team.js +82 -25
  31. package/dist/auth/team.js.map +1 -1
  32. package/dist/config/define.d.ts +1 -1
  33. package/dist/config/define.d.ts.map +1 -1
  34. package/dist/config/types.d.ts +14 -0
  35. package/dist/config/types.d.ts.map +1 -1
  36. package/dist/db/__tests__/find-in-batches.test.d.ts +2 -0
  37. package/dist/db/__tests__/find-in-batches.test.d.ts.map +1 -0
  38. package/dist/db/__tests__/find-in-batches.test.js +26 -0
  39. package/dist/db/__tests__/find-in-batches.test.js.map +1 -0
  40. package/dist/db/find-in-batches.d.ts +12 -0
  41. package/dist/db/find-in-batches.d.ts.map +1 -0
  42. package/dist/db/find-in-batches.js +20 -0
  43. package/dist/db/find-in-batches.js.map +1 -0
  44. package/dist/index.d.ts +1 -1
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js.map +1 -1
  47. package/dist/seo/audit-runner.d.ts.map +1 -1
  48. package/dist/seo/audit-runner.js +7 -1
  49. package/dist/seo/audit-runner.js.map +1 -1
  50. package/dist/seo/audit-signals.d.ts.map +1 -1
  51. package/dist/seo/audit-signals.js +17 -2
  52. package/dist/seo/audit-signals.js.map +1 -1
  53. package/dist/seo/sitemap-public.d.ts +43 -0
  54. package/dist/seo/sitemap-public.d.ts.map +1 -0
  55. package/dist/seo/sitemap-public.js +213 -0
  56. package/dist/seo/sitemap-public.js.map +1 -0
  57. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"audit-signals.d.ts","sourceRoot":"","sources":["../../src/seo/audit-signals.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAqB5E,kEAAkE;AAClE,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,SAAS,GACZ,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,gBAAgB,GAAG,eAAe,CAAC,CAAC,CAgBtE;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,gBAAgB,EAAE,EAC5B,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,cAAc,EAAE,CAAA;CAAO,GACnE,iBAAiB,CAAC,aAAa,CAAC,CA4ClC;AAED,sEAAsE;AACtE,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,SAAS,EACb,QAAQ,EAAE,gBAAgB,EAAE,EAC5B,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,iBAAiB,CAAC,CAgB5B"}
1
+ {"version":3,"file":"audit-signals.d.ts","sourceRoot":"","sources":["../../src/seo/audit-signals.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAEtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAqB5E,kEAAkE;AAClE,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,SAAS,GACZ,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,gBAAgB,GAAG,eAAe,CAAC,CAAC,CA8BtE;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,gBAAgB,EAAE,EAC5B,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,cAAc,EAAE,CAAA;CAAO,GACnE,iBAAiB,CAAC,aAAa,CAAC,CA4ClC;AAED,sEAAsE;AACtE,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,SAAS,EACb,QAAQ,EAAE,gBAAgB,EAAE,EAC5B,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,iBAAiB,CAAC,CA8B5B"}
@@ -3,6 +3,7 @@
3
3
  * static broken-internal-link detection (no outbound HTTP; safe for cron/audit).
4
4
  */
5
5
  import { detectChainsAndLoops, normalizeRedirectPath, resolveChain, buildEdgeMap, } from '../redirects/graph.js';
6
+ import { findInBatches } from '../db/find-in-batches.js';
6
7
  const HREF_REGEX = /href=["']([^"']+)["']/gi;
7
8
  function normalizePath(path, siteUrl) {
8
9
  const trimmed = path.trim();
@@ -23,7 +24,14 @@ function normalizePath(path, siteUrl) {
23
24
  export async function gatherRedirectSignals(db) {
24
25
  if (!db?.redirect?.findMany)
25
26
  return { redirectChains: 0, redirectLoops: 0 };
26
- const rows = await db.redirect.findMany({}).catch(() => []);
27
+ const rows = await findInBatches(({ take, cursor }) => db.redirect
28
+ .findMany({
29
+ take,
30
+ ...(cursor ? { skip: 1, cursor: { id: cursor } } : {}),
31
+ orderBy: { id: 'asc' },
32
+ select: { id: true, source: true, destination: true, enabled: true },
33
+ })
34
+ .catch(() => []));
27
35
  const rules = rows.map((r) => ({
28
36
  id: r.id,
29
37
  from: r.source,
@@ -93,7 +101,14 @@ export async function gatherAuditSignals(db, entities, siteUrl) {
93
101
  const redirectPart = await gatherRedirectSignals(db);
94
102
  let redirectRules = [];
95
103
  if (db?.redirect?.findMany) {
96
- const rows = await db.redirect.findMany({}).catch(() => []);
104
+ const rows = await findInBatches(({ take, cursor }) => db.redirect
105
+ .findMany({
106
+ take,
107
+ ...(cursor ? { skip: 1, cursor: { id: cursor } } : {}),
108
+ orderBy: { id: 'asc' },
109
+ select: { id: true, source: true, destination: true, enabled: true },
110
+ })
111
+ .catch(() => []));
97
112
  redirectRules = rows.map((r) => ({
98
113
  id: r.id,
99
114
  from: r.source,
@@ -1 +1 @@
1
- {"version":3,"file":"audit-signals.js","sourceRoot":"","sources":["../../src/seo/audit-signals.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"audit-signals.js","sourceRoot":"","sources":["../../src/seo/audit-signals.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Public sitemap URL naming (Yoast-style) and browser-facing XSLT stylesheets.
3
+ *
4
+ * Google limits each sitemap file to 50,000 URLs or 50 MB uncompressed. We split
5
+ * at 45,000 URLs (see SITEMAP_PAGE_SIZE) and name pages:
6
+ * `{base}-sitemap.xml` → page 0
7
+ * `{base}-sitemap2.xml` → page 1
8
+ * `{base}-sitemap3.xml` → page 2
9
+ *
10
+ * @see https://developers.google.com/search/docs/crawling-indexing/sitemaps/large-sitemaps
11
+ */
12
+ /** Yoast-style base name for a collection in sitemap filenames. */
13
+ export declare function sitemapBaseName(collection: {
14
+ slug: string;
15
+ type?: 'page' | 'post';
16
+ }): string;
17
+ /** Build the public filename for a paginated collection sitemap. */
18
+ export declare function collectionSitemapFilename(baseName: string, pageIndex: number): string;
19
+ /** Canonical public URL for a collection sitemap page (no /api/cms prefix). */
20
+ export declare function collectionSitemapPublicUrl(siteBase: string, baseName: string, pageIndex: number): string;
21
+ /**
22
+ * Parse a Yoast-style sitemap filename.
23
+ * Returns null when the name does not match `{base}-sitemap{N}.xml`.
24
+ */
25
+ export declare function parseCollectionSitemapFilename(filename: string): {
26
+ baseName: string;
27
+ pageIndex: number;
28
+ } | null;
29
+ /** Resolve a collection from a sitemap base name or legacy `{slug}.xml` slug. */
30
+ export declare function resolveCollectionFromSitemapSlug<T extends {
31
+ slug: string;
32
+ type?: 'page' | 'post';
33
+ }>(collections: T[], slugParam: string): {
34
+ collection: T;
35
+ pageIndex: number;
36
+ } | null;
37
+ /** XML stylesheet processing instruction for human-readable browser output. */
38
+ export declare function sitemapStylesheetPi(siteBase: string, kind: 'index' | 'urlset'): string;
39
+ /** XSLT for `<sitemapindex>` — lists child sitemaps (Yoast index layout). */
40
+ export declare const SITEMAP_INDEX_XSL = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<xsl:stylesheet version=\"1.0\"\n xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"\n xmlns:s=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n <xsl:output method=\"html\" encoding=\"UTF-8\" indent=\"yes\"/>\n <xsl:template match=\"/\">\n <html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\"/>\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/>\n <title>XML Sitemap Index</title>\n <style>\n * { box-sizing: border-box; }\n body {\n margin: 0;\n padding: 2rem 1.5rem 3rem;\n font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif;\n font-size: 1rem;\n line-height: 1.5;\n color: #18181b;\n background: #fafafa;\n }\n .wrap { max-width: 72rem; margin: 0 auto; }\n h1 { font-size: 1.5rem; font-weight: 500; margin: 0 0 0.5rem; }\n .lead { color: #52525b; margin: 0 0 0.25rem; }\n .meta { color: #71717a; font-size: 0.875rem; margin: 0 0 1.5rem; }\n .meta a { color: #2563eb; }\n table {\n width: 100%;\n border-collapse: collapse;\n background: #fff;\n border: 1px solid #e4e4e7;\n border-radius: 0.5rem;\n overflow: hidden;\n }\n th, td {\n padding: 0.625rem 0.875rem;\n text-align: left;\n border-bottom: 1px solid #f4f4f5;\n vertical-align: top;\n }\n th {\n font-size: 0.875rem;\n font-weight: 500;\n color: #52525b;\n background: #f4f4f5;\n }\n tr:nth-child(even) td { background: #fafafa; }\n tr:last-child td { border-bottom: 0; }\n td.num, th.num { text-align: center; width: 5rem; }\n td.date, th.date { width: 12rem; white-space: nowrap; }\n a { color: #2563eb; word-break: break-all; }\n a:hover { text-decoration: underline; }\n @media (prefers-color-scheme: dark) {\n body { color: #fafafa; background: #09090b; }\n .lead { color: #a1a1aa; }\n .meta { color: #71717a; }\n table { background: #18181b; border-color: #27272a; }\n th { background: #27272a; color: #d4d4d8; }\n th, td { border-bottom-color: #27272a; }\n tr:nth-child(even) td { background: #111113; }\n a { color: #60a5fa; }\n }\n</style>\n </head>\n <body>\n <div class=\"wrap\">\n <h1>XML Sitemap Index</h1>\n <p class=\"lead\">Generated by Actuate CMS \u2014 meant for consumption by search engines.</p>\n <p class=\"meta\">\n Learn more at <a href=\"https://www.sitemaps.org/\">sitemaps.org</a>.\n This index contains <strong><xsl:value-of select=\"count(s:sitemapindex/s:sitemap)\"/></strong> sitemaps.\n </p>\n <table>\n <thead>\n <tr>\n <th>Sitemap</th>\n <th class=\"date\">Last Modified</th>\n </tr>\n </thead>\n <tbody>\n <xsl:for-each select=\"s:sitemapindex/s:sitemap\">\n <tr>\n <td><a href=\"{s:loc}\"><xsl:value-of select=\"s:loc\"/></a></td>\n <td class=\"date\"><xsl:value-of select=\"s:lastmod\"/></td>\n </tr>\n </xsl:for-each>\n </tbody>\n </table>\n </div>\n </body>\n </html>\n </xsl:template>\n</xsl:stylesheet>";
41
+ /** XSLT for `<urlset>` — URL list with image counts (Yoast urlset layout). */
42
+ export declare const SITEMAP_URLSET_XSL = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<xsl:stylesheet version=\"1.0\"\n xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"\n xmlns:s=\"http://www.sitemaps.org/schemas/sitemap/0.9\"\n xmlns:image=\"http://www.google.com/schemas/sitemap-image/1.1\">\n <xsl:output method=\"html\" encoding=\"UTF-8\" indent=\"yes\"/>\n <xsl:template match=\"/\">\n <html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\"/>\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/>\n <title>XML Sitemap</title>\n <style>\n * { box-sizing: border-box; }\n body {\n margin: 0;\n padding: 2rem 1.5rem 3rem;\n font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif;\n font-size: 1rem;\n line-height: 1.5;\n color: #18181b;\n background: #fafafa;\n }\n .wrap { max-width: 72rem; margin: 0 auto; }\n h1 { font-size: 1.5rem; font-weight: 500; margin: 0 0 0.5rem; }\n .lead { color: #52525b; margin: 0 0 0.25rem; }\n .meta { color: #71717a; font-size: 0.875rem; margin: 0 0 1.5rem; }\n .meta a { color: #2563eb; }\n table {\n width: 100%;\n border-collapse: collapse;\n background: #fff;\n border: 1px solid #e4e4e7;\n border-radius: 0.5rem;\n overflow: hidden;\n }\n th, td {\n padding: 0.625rem 0.875rem;\n text-align: left;\n border-bottom: 1px solid #f4f4f5;\n vertical-align: top;\n }\n th {\n font-size: 0.875rem;\n font-weight: 500;\n color: #52525b;\n background: #f4f4f5;\n }\n tr:nth-child(even) td { background: #fafafa; }\n tr:last-child td { border-bottom: 0; }\n td.num, th.num { text-align: center; width: 5rem; }\n td.date, th.date { width: 12rem; white-space: nowrap; }\n a { color: #2563eb; word-break: break-all; }\n a:hover { text-decoration: underline; }\n @media (prefers-color-scheme: dark) {\n body { color: #fafafa; background: #09090b; }\n .lead { color: #a1a1aa; }\n .meta { color: #71717a; }\n table { background: #18181b; border-color: #27272a; }\n th { background: #27272a; color: #d4d4d8; }\n th, td { border-bottom-color: #27272a; }\n tr:nth-child(even) td { background: #111113; }\n a { color: #60a5fa; }\n }\n</style>\n </head>\n <body>\n <div class=\"wrap\">\n <h1>XML Sitemap</h1>\n <p class=\"lead\">Generated by Actuate CMS \u2014 meant for consumption by search engines.</p>\n <p class=\"meta\">\n Learn more at <a href=\"https://www.sitemaps.org/\">sitemaps.org</a>.\n This sitemap contains <strong><xsl:value-of select=\"count(s:urlset/s:url)\"/></strong> URLs.\n </p>\n <table>\n <thead>\n <tr>\n <th>URL</th>\n <th class=\"num\">Images</th>\n <th class=\"date\">Last Modified</th>\n </tr>\n </thead>\n <tbody>\n <xsl:for-each select=\"s:urlset/s:url\">\n <tr>\n <td><a href=\"{s:loc}\"><xsl:value-of select=\"s:loc\"/></a></td>\n <td class=\"num\"><xsl:value-of select=\"count(image:image)\"/></td>\n <td class=\"date\"><xsl:value-of select=\"s:lastmod\"/></td>\n </tr>\n </xsl:for-each>\n </tbody>\n </table>\n </div>\n </body>\n </html>\n </xsl:template>\n</xsl:stylesheet>";
43
+ //# sourceMappingURL=sitemap-public.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sitemap-public.d.ts","sourceRoot":"","sources":["../../src/seo/sitemap-public.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,mEAAmE;AACnE,wBAAgB,eAAe,CAAC,UAAU,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,GAAG,MAAM,CAI5F;AAED,oEAAoE;AACpE,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAGrF;AAED,+EAA+E;AAC/E,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB,MAAM,CAGR;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,MAAM,GACf;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAUhD;AAED,iFAAiF;AACjF,wBAAgB,gCAAgC,CAC9C,CAAC,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,EAClD,WAAW,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG;IAAE,UAAU,EAAE,CAAC,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAalF;AAED,+EAA+E;AAC/E,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAItF;AAwDD,6EAA6E;AAC7E,eAAO,MAAM,iBAAiB,8qGAyCZ,CAAA;AAElB,8EAA8E;AAC9E,eAAO,MAAM,kBAAkB,k1GA4Cb,CAAA"}
@@ -0,0 +1,213 @@
1
+ /**
2
+ * Public sitemap URL naming (Yoast-style) and browser-facing XSLT stylesheets.
3
+ *
4
+ * Google limits each sitemap file to 50,000 URLs or 50 MB uncompressed. We split
5
+ * at 45,000 URLs (see SITEMAP_PAGE_SIZE) and name pages:
6
+ * `{base}-sitemap.xml` → page 0
7
+ * `{base}-sitemap2.xml` → page 1
8
+ * `{base}-sitemap3.xml` → page 2
9
+ *
10
+ * @see https://developers.google.com/search/docs/crawling-indexing/sitemaps/large-sitemaps
11
+ */
12
+ /** Yoast-style base name for a collection in sitemap filenames. */
13
+ export function sitemapBaseName(collection) {
14
+ if (collection.type === 'page' && collection.slug === 'pages')
15
+ return 'page';
16
+ if (collection.type === 'post' && collection.slug === 'posts')
17
+ return 'post';
18
+ return collection.slug;
19
+ }
20
+ /** Build the public filename for a paginated collection sitemap. */
21
+ export function collectionSitemapFilename(baseName, pageIndex) {
22
+ if (pageIndex <= 0)
23
+ return `${baseName}-sitemap.xml`;
24
+ return `${baseName}-sitemap${pageIndex + 1}.xml`;
25
+ }
26
+ /** Canonical public URL for a collection sitemap page (no /api/cms prefix). */
27
+ export function collectionSitemapPublicUrl(siteBase, baseName, pageIndex) {
28
+ const base = siteBase.replace(/\/+$/, '');
29
+ return `${base}/${collectionSitemapFilename(baseName, pageIndex)}`;
30
+ }
31
+ /**
32
+ * Parse a Yoast-style sitemap filename.
33
+ * Returns null when the name does not match `{base}-sitemap{N}.xml`.
34
+ */
35
+ export function parseCollectionSitemapFilename(filename) {
36
+ const normalized = filename.replace(/\.xml$/i, '');
37
+ const match = normalized.match(/^(.+)-sitemap(\d+)?$/i);
38
+ if (!match)
39
+ return null;
40
+ const baseName = match[1];
41
+ const suffix = match[2];
42
+ if (!suffix)
43
+ return { baseName, pageIndex: 0 };
44
+ const pageIndex = Number.parseInt(suffix, 10) - 1;
45
+ if (!Number.isFinite(pageIndex) || pageIndex < 0)
46
+ return null;
47
+ return { baseName, pageIndex };
48
+ }
49
+ /** Resolve a collection from a sitemap base name or legacy `{slug}.xml` slug. */
50
+ export function resolveCollectionFromSitemapSlug(collections, slugParam) {
51
+ const yoast = parseCollectionSitemapFilename(slugParam);
52
+ if (yoast) {
53
+ const collection = collections.find((c) => sitemapBaseName(c) === yoast.baseName);
54
+ if (collection)
55
+ return { collection, pageIndex: yoast.pageIndex };
56
+ return null;
57
+ }
58
+ // Legacy `/sitemaps/{collectionSlug}.xml` (optional `?page=N` handled by caller).
59
+ const legacySlug = slugParam.replace(/\.xml$/i, '');
60
+ const collection = collections.find((c) => c.slug === legacySlug);
61
+ if (collection)
62
+ return { collection, pageIndex: 0 };
63
+ return null;
64
+ }
65
+ /** XML stylesheet processing instruction for human-readable browser output. */
66
+ export function sitemapStylesheetPi(siteBase, kind) {
67
+ const base = siteBase.replace(/\/+$/, '');
68
+ const href = kind === 'index' ? `${base}/sitemap-index.xsl` : `${base}/sitemap.xsl`;
69
+ return `<?xml-stylesheet type="text/xsl" href="${href}"?>`;
70
+ }
71
+ const XSL_BASE_CSS = `
72
+ * { box-sizing: border-box; }
73
+ body {
74
+ margin: 0;
75
+ padding: 2rem 1.5rem 3rem;
76
+ font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
77
+ font-size: 1rem;
78
+ line-height: 1.5;
79
+ color: #18181b;
80
+ background: #fafafa;
81
+ }
82
+ .wrap { max-width: 72rem; margin: 0 auto; }
83
+ h1 { font-size: 1.5rem; font-weight: 500; margin: 0 0 0.5rem; }
84
+ .lead { color: #52525b; margin: 0 0 0.25rem; }
85
+ .meta { color: #71717a; font-size: 0.875rem; margin: 0 0 1.5rem; }
86
+ .meta a { color: #2563eb; }
87
+ table {
88
+ width: 100%;
89
+ border-collapse: collapse;
90
+ background: #fff;
91
+ border: 1px solid #e4e4e7;
92
+ border-radius: 0.5rem;
93
+ overflow: hidden;
94
+ }
95
+ th, td {
96
+ padding: 0.625rem 0.875rem;
97
+ text-align: left;
98
+ border-bottom: 1px solid #f4f4f5;
99
+ vertical-align: top;
100
+ }
101
+ th {
102
+ font-size: 0.875rem;
103
+ font-weight: 500;
104
+ color: #52525b;
105
+ background: #f4f4f5;
106
+ }
107
+ tr:nth-child(even) td { background: #fafafa; }
108
+ tr:last-child td { border-bottom: 0; }
109
+ td.num, th.num { text-align: center; width: 5rem; }
110
+ td.date, th.date { width: 12rem; white-space: nowrap; }
111
+ a { color: #2563eb; word-break: break-all; }
112
+ a:hover { text-decoration: underline; }
113
+ @media (prefers-color-scheme: dark) {
114
+ body { color: #fafafa; background: #09090b; }
115
+ .lead { color: #a1a1aa; }
116
+ .meta { color: #71717a; }
117
+ table { background: #18181b; border-color: #27272a; }
118
+ th { background: #27272a; color: #d4d4d8; }
119
+ th, td { border-bottom-color: #27272a; }
120
+ tr:nth-child(even) td { background: #111113; }
121
+ a { color: #60a5fa; }
122
+ }
123
+ `;
124
+ /** XSLT for `<sitemapindex>` — lists child sitemaps (Yoast index layout). */
125
+ export const SITEMAP_INDEX_XSL = `<?xml version="1.0" encoding="UTF-8"?>
126
+ <xsl:stylesheet version="1.0"
127
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
128
+ xmlns:s="http://www.sitemaps.org/schemas/sitemap/0.9">
129
+ <xsl:output method="html" encoding="UTF-8" indent="yes"/>
130
+ <xsl:template match="/">
131
+ <html lang="en">
132
+ <head>
133
+ <meta charset="UTF-8"/>
134
+ <meta name="viewport" content="width=device-width, initial-scale=1"/>
135
+ <title>XML Sitemap Index</title>
136
+ <style>${XSL_BASE_CSS}</style>
137
+ </head>
138
+ <body>
139
+ <div class="wrap">
140
+ <h1>XML Sitemap Index</h1>
141
+ <p class="lead">Generated by Actuate CMS — meant for consumption by search engines.</p>
142
+ <p class="meta">
143
+ Learn more at <a href="https://www.sitemaps.org/">sitemaps.org</a>.
144
+ This index contains <strong><xsl:value-of select="count(s:sitemapindex/s:sitemap)"/></strong> sitemaps.
145
+ </p>
146
+ <table>
147
+ <thead>
148
+ <tr>
149
+ <th>Sitemap</th>
150
+ <th class="date">Last Modified</th>
151
+ </tr>
152
+ </thead>
153
+ <tbody>
154
+ <xsl:for-each select="s:sitemapindex/s:sitemap">
155
+ <tr>
156
+ <td><a href="{s:loc}"><xsl:value-of select="s:loc"/></a></td>
157
+ <td class="date"><xsl:value-of select="s:lastmod"/></td>
158
+ </tr>
159
+ </xsl:for-each>
160
+ </tbody>
161
+ </table>
162
+ </div>
163
+ </body>
164
+ </html>
165
+ </xsl:template>
166
+ </xsl:stylesheet>`;
167
+ /** XSLT for `<urlset>` — URL list with image counts (Yoast urlset layout). */
168
+ export const SITEMAP_URLSET_XSL = `<?xml version="1.0" encoding="UTF-8"?>
169
+ <xsl:stylesheet version="1.0"
170
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
171
+ xmlns:s="http://www.sitemaps.org/schemas/sitemap/0.9"
172
+ xmlns:image="http://www.google.com/schemas/sitemap-image/1.1">
173
+ <xsl:output method="html" encoding="UTF-8" indent="yes"/>
174
+ <xsl:template match="/">
175
+ <html lang="en">
176
+ <head>
177
+ <meta charset="UTF-8"/>
178
+ <meta name="viewport" content="width=device-width, initial-scale=1"/>
179
+ <title>XML Sitemap</title>
180
+ <style>${XSL_BASE_CSS}</style>
181
+ </head>
182
+ <body>
183
+ <div class="wrap">
184
+ <h1>XML Sitemap</h1>
185
+ <p class="lead">Generated by Actuate CMS — meant for consumption by search engines.</p>
186
+ <p class="meta">
187
+ Learn more at <a href="https://www.sitemaps.org/">sitemaps.org</a>.
188
+ This sitemap contains <strong><xsl:value-of select="count(s:urlset/s:url)"/></strong> URLs.
189
+ </p>
190
+ <table>
191
+ <thead>
192
+ <tr>
193
+ <th>URL</th>
194
+ <th class="num">Images</th>
195
+ <th class="date">Last Modified</th>
196
+ </tr>
197
+ </thead>
198
+ <tbody>
199
+ <xsl:for-each select="s:urlset/s:url">
200
+ <tr>
201
+ <td><a href="{s:loc}"><xsl:value-of select="s:loc"/></a></td>
202
+ <td class="num"><xsl:value-of select="count(image:image)"/></td>
203
+ <td class="date"><xsl:value-of select="s:lastmod"/></td>
204
+ </tr>
205
+ </xsl:for-each>
206
+ </tbody>
207
+ </table>
208
+ </div>
209
+ </body>
210
+ </html>
211
+ </xsl:template>
212
+ </xsl:stylesheet>`;
213
+ //# sourceMappingURL=sitemap-public.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sitemap-public.js","sourceRoot":"","sources":["../../src/seo/sitemap-public.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@actuate-media/cms-core",
3
- "version": "0.81.0",
3
+ "version": "0.83.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/actuate-media/actuatecms.git",