@valkyrianlabs/payload-markdown-docs 0.3.1 → 0.4.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 (98) hide show
  1. package/README.md +76 -176
  2. package/dist/admin/DocsSetManager.js +5 -3
  3. package/dist/admin/DocsSetManager.js.map +1 -1
  4. package/dist/admin/docsSetManagerData.d.ts +6 -5
  5. package/dist/admin/docsSetManagerData.js +60 -33
  6. package/dist/admin/docsSetManagerData.js.map +1 -1
  7. package/dist/admin/docsSetManagerTypes.d.ts +12 -9
  8. package/dist/admin/docsSetManagerTypes.js.map +1 -1
  9. package/dist/cli/commands/manifest.js +1 -2
  10. package/dist/cli/commands/manifest.js.map +1 -1
  11. package/dist/cli/commands/plan.js +1 -2
  12. package/dist/cli/commands/plan.js.map +1 -1
  13. package/dist/cli/commands/push.js +2 -5
  14. package/dist/cli/commands/push.js.map +1 -1
  15. package/dist/cli/commands/validate.js +11 -6
  16. package/dist/cli/commands/validate.js.map +1 -1
  17. package/dist/cli/index.js +5 -14
  18. package/dist/cli/index.js.map +1 -1
  19. package/dist/cli/parseArgs.js +0 -3
  20. package/dist/cli/parseArgs.js.map +1 -1
  21. package/dist/cli/types.d.ts +0 -3
  22. package/dist/cli/types.js.map +1 -1
  23. package/dist/collections/docs.js +0 -24
  24. package/dist/collections/docs.js.map +1 -1
  25. package/dist/collections/docsGroups.js +8 -9
  26. package/dist/collections/docsGroups.js.map +1 -1
  27. package/dist/collections/docsKeys.d.ts +5 -0
  28. package/dist/collections/docsKeys.js +44 -0
  29. package/dist/collections/docsKeys.js.map +1 -0
  30. package/dist/collections/docsSets.js +47 -202
  31. package/dist/collections/docsSets.js.map +1 -1
  32. package/dist/collections/docsTrusted.d.ts +5 -0
  33. package/dist/collections/docsTrusted.js +60 -0
  34. package/dist/collections/docsTrusted.js.map +1 -0
  35. package/dist/collections/index.d.ts +4 -0
  36. package/dist/collections/index.js +2 -0
  37. package/dist/collections/index.js.map +1 -1
  38. package/dist/constants.d.ts +3 -1
  39. package/dist/constants.js +3 -1
  40. package/dist/constants.js.map +1 -1
  41. package/dist/endpoints/sync.d.ts +6 -7
  42. package/dist/endpoints/sync.js +57 -124
  43. package/dist/endpoints/sync.js.map +1 -1
  44. package/dist/index.d.ts +2 -2
  45. package/dist/index.js +1 -1
  46. package/dist/index.js.map +1 -1
  47. package/dist/next/PayloadMarkdownDocsPage.js +2 -6
  48. package/dist/next/PayloadMarkdownDocsPage.js.map +1 -1
  49. package/dist/next/index.d.ts +2 -0
  50. package/dist/next/index.js +1 -0
  51. package/dist/next/index.js.map +1 -1
  52. package/dist/next/links.d.ts +11 -0
  53. package/dist/next/links.js +79 -0
  54. package/dist/next/links.js.map +1 -0
  55. package/dist/next/markdown.js +91 -19
  56. package/dist/next/markdown.js.map +1 -1
  57. package/dist/next/metadata.js +6 -6
  58. package/dist/next/metadata.js.map +1 -1
  59. package/dist/next/records.js +13 -23
  60. package/dist/next/records.js.map +1 -1
  61. package/dist/next/route.js +141 -49
  62. package/dist/next/route.js.map +1 -1
  63. package/dist/next/types.d.ts +0 -14
  64. package/dist/next/types.js.map +1 -1
  65. package/dist/payload/docsKeys.d.ts +20 -0
  66. package/dist/payload/docsKeys.js +29 -0
  67. package/dist/payload/docsKeys.js.map +1 -0
  68. package/dist/payload/docsSets.d.ts +32 -6
  69. package/dist/payload/docsSets.js +146 -83
  70. package/dist/payload/docsSets.js.map +1 -1
  71. package/dist/payload/docsTrusted.d.ts +16 -0
  72. package/dist/payload/docsTrusted.js +49 -0
  73. package/dist/payload/docsTrusted.js.map +1 -0
  74. package/dist/payload/index.d.ts +5 -1
  75. package/dist/payload/index.js +3 -1
  76. package/dist/payload/index.js.map +1 -1
  77. package/dist/plugin.js +36 -9
  78. package/dist/plugin.js.map +1 -1
  79. package/dist/security/githubOidc.d.ts +18 -5
  80. package/dist/security/githubOidc.js +44 -16
  81. package/dist/security/githubOidc.js.map +1 -1
  82. package/dist/security/index.d.ts +1 -1
  83. package/dist/security/index.js.map +1 -1
  84. package/dist/skills/codex/SKILL.md +3 -4
  85. package/dist/skills/codex/examples/github-actions.md +0 -2
  86. package/dist/skills/codex/reference/admin.md +0 -6
  87. package/dist/skills/codex/reference/routing.md +2 -1
  88. package/dist/skills/codex/reference/sync.md +7 -5
  89. package/dist/skills/codex/reference/troubleshooting.md +3 -4
  90. package/dist/skills/codex/reference/workflow.md +0 -1
  91. package/dist/sync/manifest.d.ts +1 -3
  92. package/dist/sync/manifest.js +2 -3
  93. package/dist/sync/manifest.js.map +1 -1
  94. package/dist/sync/validate.js +1 -2
  95. package/dist/sync/validate.js.map +1 -1
  96. package/dist/types.d.ts +7 -50
  97. package/dist/types.js.map +1 -1
  98. package/package.json +4 -4
@@ -1,7 +1,7 @@
1
1
  import { DEFAULT_DOCS_COLLECTION_SLUG, DEFAULT_DOCS_GROUPS_COLLECTION_SLUG, DEFAULT_DOCS_SETS_COLLECTION_SLUG, DEFAULT_MARKDOWN_FIELD_NAME } from '../constants.js';
2
- import { normalizeRoutePath } from '../routing/index.js';
2
+ import { deriveDocsSetRouteBase, joinRouteSegments, normalizeRoutePath } from '../routing/index.js';
3
3
  import { isExcludedFromAiExport } from '../sync/index.js';
4
- import { isVisibleDocsRecord, toResolvedDocsRecord, toResolvedDocsSet } from './records.js';
4
+ import { getRelationshipId, isRecord, isVisibleDocsRecord, toResolvedDocsGroup, toResolvedDocsRecord, toResolvedDocsSet } from './records.js';
5
5
  const resolveCollectionSlugs = (collections)=>({
6
6
  docs: collections?.docs ?? DEFAULT_DOCS_COLLECTION_SLUG,
7
7
  docsGroups: collections?.docsGroups ?? DEFAULT_DOCS_GROUPS_COLLECTION_SLUG,
@@ -20,28 +20,100 @@ const getRoutePath = ({ slug, path })=>{
20
20
  return '/';
21
21
  };
22
22
  const stripMarkdownRouteSuffix = (route)=>route.toLowerCase().endsWith('.md') ? route.slice(0, -3) : undefined;
23
- const findDocsSetByRouteBase = async ({ collections, overrideAccess, payload, routeBase })=>{
24
- const result = await payload.find({
25
- collection: collections.docsSets,
26
- depth: 0,
27
- limit: 1,
28
- overrideAccess,
29
- where: {
30
- routeBase: {
31
- equals: routeBase
32
- }
33
- }
34
- });
35
- return result.docs.map(toResolvedDocsSet).find((docsSet)=>docsSet?.routeBase === routeBase);
36
- };
37
- const findDocsSetByAiExportOutput = async ({ collections, output, overrideAccess, payload })=>{
23
+ const getGroupsById = async ({ collections, overrideAccess, payload })=>{
38
24
  const result = await payload.find({
39
- collection: collections.docsSets,
25
+ collection: collections.docsGroups,
40
26
  depth: 0,
41
27
  limit: 1000,
42
28
  overrideAccess
43
29
  });
44
- return result.docs.map(toResolvedDocsSet).find((docsSet)=>docsSet?.aiExport?.output === output);
30
+ return new Map(result.docs.flatMap((doc)=>{
31
+ if (!isRecord(doc)) {
32
+ return [];
33
+ }
34
+ const id = getRelationshipId(doc);
35
+ return id ? [
36
+ [
37
+ id,
38
+ doc
39
+ ]
40
+ ] : [];
41
+ }));
42
+ };
43
+ const getGroupRoutePath = ({ groupId, groupsById, seen = new Set() })=>{
44
+ if (!groupId || seen.has(groupId)) {
45
+ return undefined;
46
+ }
47
+ const group = groupsById.get(groupId);
48
+ const resolvedGroup = toResolvedDocsGroup(group);
49
+ if (!resolvedGroup?.slug) {
50
+ return undefined;
51
+ }
52
+ const parentRoutePath = isRecord(group) ? getGroupRoutePath({
53
+ groupId: getRelationshipId(group.parent),
54
+ groupsById,
55
+ seen: new Set([
56
+ groupId,
57
+ ...seen
58
+ ])
59
+ }) : undefined;
60
+ return joinRouteSegments(parentRoutePath, resolvedGroup.slug);
61
+ };
62
+ const withComputedDocsSetRoute = ({ doc, docsSet, groupsById })=>{
63
+ if (!docsSet?.slug) {
64
+ return docsSet;
65
+ }
66
+ const groupRoutePath = isRecord(doc) ? getGroupRoutePath({
67
+ groupId: getRelationshipId(doc.group),
68
+ groupsById
69
+ }) : undefined;
70
+ return {
71
+ ...docsSet,
72
+ routeBase: deriveDocsSetRouteBase({
73
+ docsSetSlug: docsSet.slug,
74
+ groupRoutePath
75
+ })
76
+ };
77
+ };
78
+ const findDocsSetByRouteBase = async ({ collections, overrideAccess, payload, routeBase })=>{
79
+ const [result, groupsById] = await Promise.all([
80
+ payload.find({
81
+ collection: collections.docsSets,
82
+ depth: 0,
83
+ limit: 1000,
84
+ overrideAccess
85
+ }),
86
+ getGroupsById({
87
+ collections,
88
+ overrideAccess,
89
+ payload
90
+ })
91
+ ]);
92
+ return result.docs.map((doc)=>withComputedDocsSetRoute({
93
+ doc,
94
+ docsSet: toResolvedDocsSet(doc),
95
+ groupsById
96
+ })).find((docsSet)=>docsSet?.routeBase === routeBase);
97
+ };
98
+ const findDocsSetByAiExportOutput = async ({ collections, output, overrideAccess, payload })=>{
99
+ const [result, groupsById] = await Promise.all([
100
+ payload.find({
101
+ collection: collections.docsSets,
102
+ depth: 0,
103
+ limit: 1000,
104
+ overrideAccess
105
+ }),
106
+ getGroupsById({
107
+ collections,
108
+ overrideAccess,
109
+ payload
110
+ })
111
+ ]);
112
+ return result.docs.map((doc)=>withComputedDocsSetRoute({
113
+ doc,
114
+ docsSet: toResolvedDocsSet(doc),
115
+ groupsById
116
+ })).find((docsSet)=>docsSet?.aiExport?.output === output);
45
117
  };
46
118
  const findDocsSetForMarkdownRoute = async ({ collections, overrideAccess, payload, route })=>{
47
119
  const routeBase = stripMarkdownRouteSuffix(route);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/next/markdown.ts"],"sourcesContent":["import type {\n DocsAiExportManifest,\n DocsValidationIssue,\n} from '../sync/index.js'\nimport type {\n PayloadMarkdownDocsCollectionSlugs,\n PayloadMarkdownDocsReadPayload,\n ResolvedPayloadMarkdownDocsRecord,\n ResolvedPayloadMarkdownDocsSet,\n ResolvePayloadMarkdownDocsRouteOptions,\n} from './types.js'\n\nimport {\n DEFAULT_DOCS_COLLECTION_SLUG,\n DEFAULT_DOCS_GROUPS_COLLECTION_SLUG,\n DEFAULT_DOCS_SETS_COLLECTION_SLUG,\n DEFAULT_MARKDOWN_FIELD_NAME,\n} from '../constants.js'\nimport { normalizeRoutePath } from '../routing/index.js'\nimport {\n isExcludedFromAiExport,\n} from '../sync/index.js'\nimport {\n isVisibleDocsRecord,\n toResolvedDocsRecord,\n toResolvedDocsSet,\n} from './records.js'\n\nexport type ResolvedPayloadMarkdownDocsMarkdownRoute = {\n contentType: 'text/markdown; charset=utf-8'\n docsSet: ResolvedPayloadMarkdownDocsSet\n markdown: string\n output: string\n route: string\n type: 'markdown'\n warnings: DocsValidationIssue[]\n}\n\nexport type ResolvePayloadMarkdownDocsMarkdownRouteOptions =\n ResolvePayloadMarkdownDocsRouteOptions\n\ntype ResolvedCollectionSlugs = {\n docs: string\n docsGroups: string\n docsSets: string\n}\n\nconst resolveCollectionSlugs = (\n collections?: PayloadMarkdownDocsCollectionSlugs,\n): ResolvedCollectionSlugs => ({\n docs: collections?.docs ?? DEFAULT_DOCS_COLLECTION_SLUG,\n docsGroups: collections?.docsGroups ?? DEFAULT_DOCS_GROUPS_COLLECTION_SLUG,\n docsSets: collections?.docsSets ?? DEFAULT_DOCS_SETS_COLLECTION_SLUG,\n})\n\nconst getRoutePath = ({\n slug,\n path,\n}: Pick<ResolvePayloadMarkdownDocsRouteOptions, 'path' | 'slug'>): string => {\n if (path !== undefined) {\n return normalizeRoutePath(path)\n }\n\n if (Array.isArray(slug)) {\n return normalizeRoutePath(slug.length === 0 ? '/' : slug.join('/'))\n }\n\n if (typeof slug === 'string') {\n return normalizeRoutePath(slug)\n }\n\n return '/'\n}\n\nconst stripMarkdownRouteSuffix = (route: string): string | undefined =>\n route.toLowerCase().endsWith('.md') ? route.slice(0, -3) : undefined\n\nconst findDocsSetByRouteBase = async ({\n collections,\n overrideAccess,\n payload,\n routeBase,\n}: {\n collections: ResolvedCollectionSlugs\n overrideAccess: boolean\n payload: PayloadMarkdownDocsReadPayload\n routeBase: string\n}): Promise<ResolvedPayloadMarkdownDocsSet | undefined> => {\n const result = await payload.find({\n collection: collections.docsSets,\n depth: 0,\n limit: 1,\n overrideAccess,\n where: {\n routeBase: {\n equals: routeBase,\n },\n },\n })\n\n return result.docs\n .map(toResolvedDocsSet)\n .find((docsSet) => docsSet?.routeBase === routeBase)\n}\n\nconst findDocsSetByAiExportOutput = async ({\n collections,\n output,\n overrideAccess,\n payload,\n}: {\n collections: ResolvedCollectionSlugs\n output: string\n overrideAccess: boolean\n payload: PayloadMarkdownDocsReadPayload\n}): Promise<ResolvedPayloadMarkdownDocsSet | undefined> => {\n const result = await payload.find({\n collection: collections.docsSets,\n depth: 0,\n limit: 1000,\n overrideAccess,\n })\n\n return result.docs\n .map(toResolvedDocsSet)\n .find((docsSet) => docsSet?.aiExport?.output === output)\n}\n\nconst findDocsSetForMarkdownRoute = async ({\n collections,\n overrideAccess,\n payload,\n route,\n}: {\n collections: ResolvedCollectionSlugs\n overrideAccess: boolean\n payload: PayloadMarkdownDocsReadPayload\n route: string\n}): Promise<ResolvedPayloadMarkdownDocsSet | undefined> => {\n const routeBase = stripMarkdownRouteSuffix(route)\n\n if (!routeBase) {\n return undefined\n }\n\n const docsSet = await findDocsSetByRouteBase({\n collections,\n overrideAccess,\n payload,\n routeBase,\n })\n\n return (\n docsSet ??\n findDocsSetByAiExportOutput({\n collections,\n output: route,\n overrideAccess,\n payload,\n })\n )\n}\n\nconst getDocsRecords = async ({\n collections,\n docsSet,\n includeDrafts,\n markdownField,\n overrideAccess,\n payload,\n}: {\n collections: ResolvedCollectionSlugs\n docsSet: ResolvedPayloadMarkdownDocsSet\n includeDrafts: boolean\n markdownField: string\n overrideAccess: boolean\n payload: PayloadMarkdownDocsReadPayload\n}): Promise<ResolvedPayloadMarkdownDocsRecord[]> => {\n const result = await payload.find({\n collection: collections.docs,\n depth: 0,\n limit: 1000,\n overrideAccess,\n where: {\n docsSet: {\n equals: docsSet.id,\n },\n },\n })\n\n return result.docs\n .map((doc) =>\n toResolvedDocsRecord({\n doc,\n markdownField,\n }),\n )\n .filter(\n (record): record is ResolvedPayloadMarkdownDocsRecord =>\n record !== undefined &&\n isVisibleDocsRecord({\n includeDrafts,\n record,\n }),\n )\n}\n\nconst compareDocsRecords = (\n first: ResolvedPayloadMarkdownDocsRecord,\n second: ResolvedPayloadMarkdownDocsRecord,\n): number => {\n if (first.order !== second.order) {\n return first.order - second.order\n }\n\n const titleCompare = first.title.localeCompare(second.title)\n\n if (titleCompare !== 0) {\n return titleCompare\n }\n\n const pathCompare = first.sourcePath.localeCompare(second.sourcePath)\n\n return pathCompare !== 0 ? pathCompare : first.id.localeCompare(second.id)\n}\n\nconst getDefaultAiExportManifest = (\n docsSet: ResolvedPayloadMarkdownDocsSet,\n): DocsAiExportManifest => ({\n canonical: docsSet.routeBase,\n exclude: [],\n headingMode: 'normalize',\n order: [],\n orphans: 'append',\n output: `${docsSet.routeBase}.md`,\n sourcePath: 'fallback',\n title: docsSet.title,\n version: 1,\n})\n\nconst orderDocsRecords = ({\n manifest,\n records,\n}: {\n manifest: DocsAiExportManifest\n records: ResolvedPayloadMarkdownDocsRecord[]\n}): {\n ordered: ResolvedPayloadMarkdownDocsRecord[]\n warnings: DocsValidationIssue[]\n} => {\n const recordsBySourcePath = new Map(records.map((record) => [record.sourcePath, record]))\n const listedRecords: ResolvedPayloadMarkdownDocsRecord[] = []\n const listedSourcePaths = new Set<string>()\n const warnings: DocsValidationIssue[] = []\n\n for (const orderedPath of manifest.order) {\n listedSourcePaths.add(orderedPath)\n const record = recordsBySourcePath.get(orderedPath)\n\n if (!record) {\n warnings.push({\n code: 'missing_ai_export_order_path',\n message: `AI export manifest order path \"${orderedPath}\" does not exist in the generated docs records.`,\n path: manifest.sourcePath,\n })\n continue\n }\n\n listedRecords.push(record)\n }\n\n if (manifest.orphans === 'ignore') {\n return {\n ordered: listedRecords,\n warnings,\n }\n }\n\n const orphans = records\n .filter((record) => !listedSourcePaths.has(record.sourcePath))\n .sort(compareDocsRecords)\n\n return {\n ordered: [...listedRecords, ...orphans],\n warnings,\n }\n}\n\nconst shiftMarkdownHeadings = (markdown: string): string =>\n markdown.replace(/^(#{1,6})(\\s+)/gm, (match, hashes: string, whitespace: string) =>\n hashes.length >= 5 ? `${'#'.repeat(6)}${whitespace}` : `${hashes}##${whitespace}`,\n )\n\nconst sectionTitle = (record: ResolvedPayloadMarkdownDocsRecord): string =>\n record.title.trim() || record.sourcePath\n\nconst renderMarkdownExport = ({\n docsSet,\n manifest,\n records,\n}: {\n docsSet: ResolvedPayloadMarkdownDocsSet\n manifest: DocsAiExportManifest\n records: ResolvedPayloadMarkdownDocsRecord[]\n}): string => {\n const lines: string[] = []\n const title = manifest.title ?? docsSet.title\n const canonical = manifest.canonical ?? docsSet.routeBase\n const output = manifest.output ?? `${docsSet.routeBase}.md`\n\n lines.push(`# ${title}`)\n lines.push('')\n lines.push(`Canonical: ${canonical}`)\n lines.push(`Output: ${output}`)\n\n if (manifest.description) {\n lines.push('', manifest.description.trim())\n }\n\n if (manifest.preamble) {\n lines.push('', manifest.preamble.trim())\n }\n\n for (const record of records) {\n const content = record.content?.trim()\n\n if (!content) {\n continue\n }\n\n if (manifest.headingMode === 'preserve') {\n lines.push('', content)\n continue\n }\n\n lines.push('', `## ${sectionTitle(record)}`, '', shiftMarkdownHeadings(content))\n }\n\n return `${lines.join('\\n').replace(/\\n{4,}/g, '\\n\\n\\n').trimEnd()}\\n`\n}\n\nexport const resolvePayloadMarkdownDocsMarkdownRoute = async ({\n slug,\n collections: collectionOptions,\n includeDrafts = false,\n markdownField = DEFAULT_MARKDOWN_FIELD_NAME,\n // Route adapter reads plugin-owned generated docs collections server-side.\n // Access is overridden here, then public visibility and manifest exclusions are enforced.\n overrideAccess = true,\n path,\n payload,\n}: ResolvePayloadMarkdownDocsMarkdownRouteOptions): Promise<\n null | ResolvedPayloadMarkdownDocsMarkdownRoute\n> => {\n const route = getRoutePath({\n slug,\n path,\n })\n const collections = resolveCollectionSlugs(collectionOptions)\n const docsSet = await findDocsSetForMarkdownRoute({\n collections,\n overrideAccess,\n payload,\n route,\n })\n\n if (!docsSet) {\n return null\n }\n\n const manifest = docsSet.aiExport ?? getDefaultAiExportManifest(docsSet)\n const records = (\n await getDocsRecords({\n collections,\n docsSet,\n includeDrafts,\n markdownField,\n overrideAccess,\n payload,\n })\n ).filter(\n (record) =>\n !isExcludedFromAiExport({\n exclude: manifest.exclude,\n sourcePath: record.sourcePath,\n }),\n )\n const ordered = orderDocsRecords({\n manifest,\n records,\n })\n\n return {\n type: 'markdown',\n contentType: 'text/markdown; charset=utf-8',\n docsSet,\n markdown: renderMarkdownExport({\n docsSet,\n manifest,\n records: ordered.ordered,\n }),\n output: manifest.output ?? `${docsSet.routeBase}.md`,\n route,\n warnings: ordered.warnings,\n }\n}\n\nexport const createPayloadMarkdownDocsMarkdownResponse = async (\n options: ResolvePayloadMarkdownDocsMarkdownRouteOptions,\n): Promise<null | Response> => {\n const resolved = await resolvePayloadMarkdownDocsMarkdownRoute(options)\n\n if (!resolved) {\n return null\n }\n\n return new Response(resolved.markdown, {\n headers: {\n 'Content-Type': resolved.contentType,\n },\n status: 200,\n })\n}\n"],"names":["DEFAULT_DOCS_COLLECTION_SLUG","DEFAULT_DOCS_GROUPS_COLLECTION_SLUG","DEFAULT_DOCS_SETS_COLLECTION_SLUG","DEFAULT_MARKDOWN_FIELD_NAME","normalizeRoutePath","isExcludedFromAiExport","isVisibleDocsRecord","toResolvedDocsRecord","toResolvedDocsSet","resolveCollectionSlugs","collections","docs","docsGroups","docsSets","getRoutePath","slug","path","undefined","Array","isArray","length","join","stripMarkdownRouteSuffix","route","toLowerCase","endsWith","slice","findDocsSetByRouteBase","overrideAccess","payload","routeBase","result","find","collection","depth","limit","where","equals","map","docsSet","findDocsSetByAiExportOutput","output","aiExport","findDocsSetForMarkdownRoute","getDocsRecords","includeDrafts","markdownField","id","doc","filter","record","compareDocsRecords","first","second","order","titleCompare","title","localeCompare","pathCompare","sourcePath","getDefaultAiExportManifest","canonical","exclude","headingMode","orphans","version","orderDocsRecords","manifest","records","recordsBySourcePath","Map","listedRecords","listedSourcePaths","Set","warnings","orderedPath","add","get","push","code","message","ordered","has","sort","shiftMarkdownHeadings","markdown","replace","match","hashes","whitespace","repeat","sectionTitle","trim","renderMarkdownExport","lines","description","preamble","content","trimEnd","resolvePayloadMarkdownDocsMarkdownRoute","collectionOptions","type","contentType","createPayloadMarkdownDocsMarkdownResponse","options","resolved","Response","headers","status"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/next/markdown.ts"],"sourcesContent":["import type {\n DocsAiExportManifest,\n DocsValidationIssue,\n} from '../sync/index.js'\nimport type {\n PayloadMarkdownDocsCollectionSlugs,\n PayloadMarkdownDocsReadPayload,\n ResolvedPayloadMarkdownDocsRecord,\n ResolvedPayloadMarkdownDocsSet,\n ResolvePayloadMarkdownDocsRouteOptions,\n} from './types.js'\n\nimport {\n DEFAULT_DOCS_COLLECTION_SLUG,\n DEFAULT_DOCS_GROUPS_COLLECTION_SLUG,\n DEFAULT_DOCS_SETS_COLLECTION_SLUG,\n DEFAULT_MARKDOWN_FIELD_NAME,\n} from '../constants.js'\nimport {\n deriveDocsSetRouteBase,\n joinRouteSegments,\n normalizeRoutePath,\n} from '../routing/index.js'\nimport {\n isExcludedFromAiExport,\n} from '../sync/index.js'\nimport {\n getRelationshipId,\n isRecord,\n isVisibleDocsRecord,\n toResolvedDocsGroup,\n toResolvedDocsRecord,\n toResolvedDocsSet,\n} from './records.js'\n\nexport type ResolvedPayloadMarkdownDocsMarkdownRoute = {\n contentType: 'text/markdown; charset=utf-8'\n docsSet: ResolvedPayloadMarkdownDocsSet\n markdown: string\n output: string\n route: string\n type: 'markdown'\n warnings: DocsValidationIssue[]\n}\n\nexport type ResolvePayloadMarkdownDocsMarkdownRouteOptions =\n ResolvePayloadMarkdownDocsRouteOptions\n\ntype ResolvedCollectionSlugs = {\n docs: string\n docsGroups: string\n docsSets: string\n}\n\nconst resolveCollectionSlugs = (\n collections?: PayloadMarkdownDocsCollectionSlugs,\n): ResolvedCollectionSlugs => ({\n docs: collections?.docs ?? DEFAULT_DOCS_COLLECTION_SLUG,\n docsGroups: collections?.docsGroups ?? DEFAULT_DOCS_GROUPS_COLLECTION_SLUG,\n docsSets: collections?.docsSets ?? DEFAULT_DOCS_SETS_COLLECTION_SLUG,\n})\n\nconst getRoutePath = ({\n slug,\n path,\n}: Pick<ResolvePayloadMarkdownDocsRouteOptions, 'path' | 'slug'>): string => {\n if (path !== undefined) {\n return normalizeRoutePath(path)\n }\n\n if (Array.isArray(slug)) {\n return normalizeRoutePath(slug.length === 0 ? '/' : slug.join('/'))\n }\n\n if (typeof slug === 'string') {\n return normalizeRoutePath(slug)\n }\n\n return '/'\n}\n\nconst stripMarkdownRouteSuffix = (route: string): string | undefined =>\n route.toLowerCase().endsWith('.md') ? route.slice(0, -3) : undefined\n\nconst getGroupsById = async ({\n collections,\n overrideAccess,\n payload,\n}: {\n collections: ResolvedCollectionSlugs\n overrideAccess: boolean\n payload: PayloadMarkdownDocsReadPayload\n}): Promise<Map<string, unknown>> => {\n const result = await payload.find({\n collection: collections.docsGroups,\n depth: 0,\n limit: 1000,\n overrideAccess,\n })\n\n return new Map(\n result.docs.flatMap((doc) => {\n if (!isRecord(doc)) {\n return []\n }\n\n const id = getRelationshipId(doc)\n\n return id ? [[id, doc]] : []\n }),\n )\n}\n\nconst getGroupRoutePath = ({\n groupId,\n groupsById,\n seen = new Set<string>(),\n}: {\n groupId?: string\n groupsById: Map<string, unknown>\n seen?: Set<string>\n}): string | undefined => {\n if (!groupId || seen.has(groupId)) {\n return undefined\n }\n\n const group = groupsById.get(groupId)\n const resolvedGroup = toResolvedDocsGroup(group)\n\n if (!resolvedGroup?.slug) {\n return undefined\n }\n\n const parentRoutePath = isRecord(group)\n ? getGroupRoutePath({\n groupId: getRelationshipId(group.parent),\n groupsById,\n seen: new Set([groupId, ...seen]),\n })\n : undefined\n\n return joinRouteSegments(parentRoutePath, resolvedGroup.slug)\n}\n\nconst withComputedDocsSetRoute = ({\n doc,\n docsSet,\n groupsById,\n}: {\n doc: unknown\n docsSet?: ResolvedPayloadMarkdownDocsSet\n groupsById: Map<string, unknown>\n}): ResolvedPayloadMarkdownDocsSet | undefined => {\n if (!docsSet?.slug) {\n return docsSet\n }\n\n const groupRoutePath = isRecord(doc)\n ? getGroupRoutePath({\n groupId: getRelationshipId(doc.group),\n groupsById,\n })\n : undefined\n\n return {\n ...docsSet,\n routeBase: deriveDocsSetRouteBase({\n docsSetSlug: docsSet.slug,\n groupRoutePath,\n }),\n }\n}\n\nconst findDocsSetByRouteBase = async ({\n collections,\n overrideAccess,\n payload,\n routeBase,\n}: {\n collections: ResolvedCollectionSlugs\n overrideAccess: boolean\n payload: PayloadMarkdownDocsReadPayload\n routeBase: string\n}): Promise<ResolvedPayloadMarkdownDocsSet | undefined> => {\n const [result, groupsById] = await Promise.all([\n payload.find({\n collection: collections.docsSets,\n depth: 0,\n limit: 1000,\n overrideAccess,\n }),\n getGroupsById({\n collections,\n overrideAccess,\n payload,\n }),\n ])\n\n return result.docs\n .map((doc) =>\n withComputedDocsSetRoute({\n doc,\n docsSet: toResolvedDocsSet(doc),\n groupsById,\n }),\n )\n .find((docsSet) => docsSet?.routeBase === routeBase)\n}\n\nconst findDocsSetByAiExportOutput = async ({\n collections,\n output,\n overrideAccess,\n payload,\n}: {\n collections: ResolvedCollectionSlugs\n output: string\n overrideAccess: boolean\n payload: PayloadMarkdownDocsReadPayload\n}): Promise<ResolvedPayloadMarkdownDocsSet | undefined> => {\n const [result, groupsById] = await Promise.all([\n payload.find({\n collection: collections.docsSets,\n depth: 0,\n limit: 1000,\n overrideAccess,\n }),\n getGroupsById({\n collections,\n overrideAccess,\n payload,\n }),\n ])\n\n return result.docs\n .map((doc) =>\n withComputedDocsSetRoute({\n doc,\n docsSet: toResolvedDocsSet(doc),\n groupsById,\n }),\n )\n .find((docsSet) => docsSet?.aiExport?.output === output)\n}\n\nconst findDocsSetForMarkdownRoute = async ({\n collections,\n overrideAccess,\n payload,\n route,\n}: {\n collections: ResolvedCollectionSlugs\n overrideAccess: boolean\n payload: PayloadMarkdownDocsReadPayload\n route: string\n}): Promise<ResolvedPayloadMarkdownDocsSet | undefined> => {\n const routeBase = stripMarkdownRouteSuffix(route)\n\n if (!routeBase) {\n return undefined\n }\n\n const docsSet = await findDocsSetByRouteBase({\n collections,\n overrideAccess,\n payload,\n routeBase,\n })\n\n return (\n docsSet ??\n findDocsSetByAiExportOutput({\n collections,\n output: route,\n overrideAccess,\n payload,\n })\n )\n}\n\nconst getDocsRecords = async ({\n collections,\n docsSet,\n includeDrafts,\n markdownField,\n overrideAccess,\n payload,\n}: {\n collections: ResolvedCollectionSlugs\n docsSet: ResolvedPayloadMarkdownDocsSet\n includeDrafts: boolean\n markdownField: string\n overrideAccess: boolean\n payload: PayloadMarkdownDocsReadPayload\n}): Promise<ResolvedPayloadMarkdownDocsRecord[]> => {\n const result = await payload.find({\n collection: collections.docs,\n depth: 0,\n limit: 1000,\n overrideAccess,\n where: {\n docsSet: {\n equals: docsSet.id,\n },\n },\n })\n\n return result.docs\n .map((doc) =>\n toResolvedDocsRecord({\n doc,\n markdownField,\n }),\n )\n .filter(\n (record): record is ResolvedPayloadMarkdownDocsRecord =>\n record !== undefined &&\n isVisibleDocsRecord({\n includeDrafts,\n record,\n }),\n )\n}\n\nconst compareDocsRecords = (\n first: ResolvedPayloadMarkdownDocsRecord,\n second: ResolvedPayloadMarkdownDocsRecord,\n): number => {\n if (first.order !== second.order) {\n return first.order - second.order\n }\n\n const titleCompare = first.title.localeCompare(second.title)\n\n if (titleCompare !== 0) {\n return titleCompare\n }\n\n const pathCompare = first.sourcePath.localeCompare(second.sourcePath)\n\n return pathCompare !== 0 ? pathCompare : first.id.localeCompare(second.id)\n}\n\nconst getDefaultAiExportManifest = (\n docsSet: ResolvedPayloadMarkdownDocsSet,\n): DocsAiExportManifest => ({\n canonical: docsSet.routeBase,\n exclude: [],\n headingMode: 'normalize',\n order: [],\n orphans: 'append',\n output: `${docsSet.routeBase}.md`,\n sourcePath: 'fallback',\n title: docsSet.title,\n version: 1,\n})\n\nconst orderDocsRecords = ({\n manifest,\n records,\n}: {\n manifest: DocsAiExportManifest\n records: ResolvedPayloadMarkdownDocsRecord[]\n}): {\n ordered: ResolvedPayloadMarkdownDocsRecord[]\n warnings: DocsValidationIssue[]\n} => {\n const recordsBySourcePath = new Map(records.map((record) => [record.sourcePath, record]))\n const listedRecords: ResolvedPayloadMarkdownDocsRecord[] = []\n const listedSourcePaths = new Set<string>()\n const warnings: DocsValidationIssue[] = []\n\n for (const orderedPath of manifest.order) {\n listedSourcePaths.add(orderedPath)\n const record = recordsBySourcePath.get(orderedPath)\n\n if (!record) {\n warnings.push({\n code: 'missing_ai_export_order_path',\n message: `AI export manifest order path \"${orderedPath}\" does not exist in the generated docs records.`,\n path: manifest.sourcePath,\n })\n continue\n }\n\n listedRecords.push(record)\n }\n\n if (manifest.orphans === 'ignore') {\n return {\n ordered: listedRecords,\n warnings,\n }\n }\n\n const orphans = records\n .filter((record) => !listedSourcePaths.has(record.sourcePath))\n .sort(compareDocsRecords)\n\n return {\n ordered: [...listedRecords, ...orphans],\n warnings,\n }\n}\n\nconst shiftMarkdownHeadings = (markdown: string): string =>\n markdown.replace(/^(#{1,6})(\\s+)/gm, (match, hashes: string, whitespace: string) =>\n hashes.length >= 5 ? `${'#'.repeat(6)}${whitespace}` : `${hashes}##${whitespace}`,\n )\n\nconst sectionTitle = (record: ResolvedPayloadMarkdownDocsRecord): string =>\n record.title.trim() || record.sourcePath\n\nconst renderMarkdownExport = ({\n docsSet,\n manifest,\n records,\n}: {\n docsSet: ResolvedPayloadMarkdownDocsSet\n manifest: DocsAiExportManifest\n records: ResolvedPayloadMarkdownDocsRecord[]\n}): string => {\n const lines: string[] = []\n const title = manifest.title ?? docsSet.title\n const canonical = manifest.canonical ?? docsSet.routeBase\n const output = manifest.output ?? `${docsSet.routeBase}.md`\n\n lines.push(`# ${title}`)\n lines.push('')\n lines.push(`Canonical: ${canonical}`)\n lines.push(`Output: ${output}`)\n\n if (manifest.description) {\n lines.push('', manifest.description.trim())\n }\n\n if (manifest.preamble) {\n lines.push('', manifest.preamble.trim())\n }\n\n for (const record of records) {\n const content = record.content?.trim()\n\n if (!content) {\n continue\n }\n\n if (manifest.headingMode === 'preserve') {\n lines.push('', content)\n continue\n }\n\n lines.push('', `## ${sectionTitle(record)}`, '', shiftMarkdownHeadings(content))\n }\n\n return `${lines.join('\\n').replace(/\\n{4,}/g, '\\n\\n\\n').trimEnd()}\\n`\n}\n\nexport const resolvePayloadMarkdownDocsMarkdownRoute = async ({\n slug,\n collections: collectionOptions,\n includeDrafts = false,\n markdownField = DEFAULT_MARKDOWN_FIELD_NAME,\n // Route adapter reads plugin-owned generated docs collections server-side.\n // Access is overridden here, then public visibility and manifest exclusions are enforced.\n overrideAccess = true,\n path,\n payload,\n}: ResolvePayloadMarkdownDocsMarkdownRouteOptions): Promise<\n null | ResolvedPayloadMarkdownDocsMarkdownRoute\n> => {\n const route = getRoutePath({\n slug,\n path,\n })\n const collections = resolveCollectionSlugs(collectionOptions)\n const docsSet = await findDocsSetForMarkdownRoute({\n collections,\n overrideAccess,\n payload,\n route,\n })\n\n if (!docsSet) {\n return null\n }\n\n const manifest = docsSet.aiExport ?? getDefaultAiExportManifest(docsSet)\n const records = (\n await getDocsRecords({\n collections,\n docsSet,\n includeDrafts,\n markdownField,\n overrideAccess,\n payload,\n })\n ).filter(\n (record) =>\n !isExcludedFromAiExport({\n exclude: manifest.exclude,\n sourcePath: record.sourcePath,\n }),\n )\n const ordered = orderDocsRecords({\n manifest,\n records,\n })\n\n return {\n type: 'markdown',\n contentType: 'text/markdown; charset=utf-8',\n docsSet,\n markdown: renderMarkdownExport({\n docsSet,\n manifest,\n records: ordered.ordered,\n }),\n output: manifest.output ?? `${docsSet.routeBase}.md`,\n route,\n warnings: ordered.warnings,\n }\n}\n\nexport const createPayloadMarkdownDocsMarkdownResponse = async (\n options: ResolvePayloadMarkdownDocsMarkdownRouteOptions,\n): Promise<null | Response> => {\n const resolved = await resolvePayloadMarkdownDocsMarkdownRoute(options)\n\n if (!resolved) {\n return null\n }\n\n return new Response(resolved.markdown, {\n headers: {\n 'Content-Type': resolved.contentType,\n },\n status: 200,\n })\n}\n"],"names":["DEFAULT_DOCS_COLLECTION_SLUG","DEFAULT_DOCS_GROUPS_COLLECTION_SLUG","DEFAULT_DOCS_SETS_COLLECTION_SLUG","DEFAULT_MARKDOWN_FIELD_NAME","deriveDocsSetRouteBase","joinRouteSegments","normalizeRoutePath","isExcludedFromAiExport","getRelationshipId","isRecord","isVisibleDocsRecord","toResolvedDocsGroup","toResolvedDocsRecord","toResolvedDocsSet","resolveCollectionSlugs","collections","docs","docsGroups","docsSets","getRoutePath","slug","path","undefined","Array","isArray","length","join","stripMarkdownRouteSuffix","route","toLowerCase","endsWith","slice","getGroupsById","overrideAccess","payload","result","find","collection","depth","limit","Map","flatMap","doc","id","getGroupRoutePath","groupId","groupsById","seen","Set","has","group","get","resolvedGroup","parentRoutePath","parent","withComputedDocsSetRoute","docsSet","groupRoutePath","routeBase","docsSetSlug","findDocsSetByRouteBase","Promise","all","map","findDocsSetByAiExportOutput","output","aiExport","findDocsSetForMarkdownRoute","getDocsRecords","includeDrafts","markdownField","where","equals","filter","record","compareDocsRecords","first","second","order","titleCompare","title","localeCompare","pathCompare","sourcePath","getDefaultAiExportManifest","canonical","exclude","headingMode","orphans","version","orderDocsRecords","manifest","records","recordsBySourcePath","listedRecords","listedSourcePaths","warnings","orderedPath","add","push","code","message","ordered","sort","shiftMarkdownHeadings","markdown","replace","match","hashes","whitespace","repeat","sectionTitle","trim","renderMarkdownExport","lines","description","preamble","content","trimEnd","resolvePayloadMarkdownDocsMarkdownRoute","collectionOptions","type","contentType","createPayloadMarkdownDocsMarkdownResponse","options","resolved","Response","headers","status"],"mappings":"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"}
@@ -9,20 +9,20 @@ export const getPayloadMarkdownDocsMetadata = (resolved)=>{
9
9
  }
10
10
  if (resolved.type === 'docsSetIndex' && !resolved.doc) {
11
11
  return compactMetadata({
12
- description: resolved.docsSet.defaults?.seoDescription ?? resolved.docsSet.description,
13
- title: resolved.docsSet.defaults?.seoTitle ?? resolved.docsSet.defaults?.heroTitle ?? resolved.docsSet.navTitle ?? resolved.docsSet.title
12
+ description: resolved.docsSet.description,
13
+ title: resolved.docsSet.navTitle ?? resolved.docsSet.title
14
14
  });
15
15
  }
16
16
  const doc = resolved.doc;
17
17
  if (!doc) {
18
18
  return compactMetadata({
19
- description: resolved.docsSet.defaults?.seoDescription ?? resolved.docsSet.description,
20
- title: resolved.docsSet.defaults?.seoTitle ?? resolved.docsSet.defaults?.heroTitle ?? resolved.docsSet.navTitle ?? resolved.docsSet.title
19
+ description: resolved.docsSet.description,
20
+ title: resolved.docsSet.navTitle ?? resolved.docsSet.title
21
21
  });
22
22
  }
23
23
  return compactMetadata({
24
- description: doc.overrides?.seoDescription ?? doc.overrides?.heroDescription ?? doc.description ?? resolved.docsSet.defaults?.seoDescription ?? resolved.docsSet.description,
25
- title: doc.overrides?.seoTitle ?? doc.overrides?.heroTitle ?? doc.title ?? resolved.docsSet.defaults?.seoTitle ?? resolved.docsSet.title
24
+ description: doc.description ?? resolved.docsSet.description,
25
+ title: doc.title ?? resolved.docsSet.title
26
26
  });
27
27
  };
28
28
  export const generatePayloadMarkdownDocsMetadata = async (options)=>{
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/next/metadata.ts"],"sourcesContent":["import type {\n PayloadMarkdownDocsMetadata,\n ResolvedPayloadMarkdownDocsRoute,\n ResolvePayloadMarkdownDocsRouteOptions,\n} from './types.js'\n\nimport { resolvePayloadMarkdownDocsRoute } from './route.js'\n\nconst compactMetadata = (\n metadata: PayloadMarkdownDocsMetadata,\n): PayloadMarkdownDocsMetadata =>\n Object.fromEntries(\n Object.entries(metadata).filter(([, value]) => value !== undefined && value !== ''),\n ) as PayloadMarkdownDocsMetadata\n\nexport const getPayloadMarkdownDocsMetadata = (\n resolved: ResolvedPayloadMarkdownDocsRoute,\n): PayloadMarkdownDocsMetadata => {\n if (resolved.type === 'docsGroupIndex') {\n return compactMetadata({\n description: resolved.group.description,\n title: resolved.group.navTitle ?? resolved.group.title,\n })\n }\n\n if (resolved.type === 'docsSetIndex' && !resolved.doc) {\n return compactMetadata({\n description:\n resolved.docsSet.defaults?.seoDescription ?? resolved.docsSet.description,\n title:\n resolved.docsSet.defaults?.seoTitle ??\n resolved.docsSet.defaults?.heroTitle ??\n resolved.docsSet.navTitle ??\n resolved.docsSet.title,\n })\n }\n\n const doc = resolved.doc\n\n if (!doc) {\n return compactMetadata({\n description:\n resolved.docsSet.defaults?.seoDescription ?? resolved.docsSet.description,\n title:\n resolved.docsSet.defaults?.seoTitle ??\n resolved.docsSet.defaults?.heroTitle ??\n resolved.docsSet.navTitle ??\n resolved.docsSet.title,\n })\n }\n\n return compactMetadata({\n description:\n doc.overrides?.seoDescription ??\n doc.overrides?.heroDescription ??\n doc.description ??\n resolved.docsSet.defaults?.seoDescription ??\n resolved.docsSet.description,\n title:\n doc.overrides?.seoTitle ??\n doc.overrides?.heroTitle ??\n doc.title ??\n resolved.docsSet.defaults?.seoTitle ??\n resolved.docsSet.title,\n })\n}\n\nexport const generatePayloadMarkdownDocsMetadata = async (\n options: ResolvePayloadMarkdownDocsRouteOptions,\n): Promise<null | PayloadMarkdownDocsMetadata> => {\n const resolved = await resolvePayloadMarkdownDocsRoute(options)\n\n return resolved ? getPayloadMarkdownDocsMetadata(resolved) : null\n}\n"],"names":["resolvePayloadMarkdownDocsRoute","compactMetadata","metadata","Object","fromEntries","entries","filter","value","undefined","getPayloadMarkdownDocsMetadata","resolved","type","description","group","title","navTitle","doc","docsSet","defaults","seoDescription","seoTitle","heroTitle","overrides","heroDescription","generatePayloadMarkdownDocsMetadata","options"],"mappings":"AAMA,SAASA,+BAA+B,QAAQ,aAAY;AAE5D,MAAMC,kBAAkB,CACtBC,WAEAC,OAAOC,WAAW,CAChBD,OAAOE,OAAO,CAACH,UAAUI,MAAM,CAAC,CAAC,GAAGC,MAAM,GAAKA,UAAUC,aAAaD,UAAU;AAGpF,OAAO,MAAME,iCAAiC,CAC5CC;IAEA,IAAIA,SAASC,IAAI,KAAK,kBAAkB;QACtC,OAAOV,gBAAgB;YACrBW,aAAaF,SAASG,KAAK,CAACD,WAAW;YACvCE,OAAOJ,SAASG,KAAK,CAACE,QAAQ,IAAIL,SAASG,KAAK,CAACC,KAAK;QACxD;IACF;IAEA,IAAIJ,SAASC,IAAI,KAAK,kBAAkB,CAACD,SAASM,GAAG,EAAE;QACrD,OAAOf,gBAAgB;YACrBW,aACEF,SAASO,OAAO,CAACC,QAAQ,EAAEC,kBAAkBT,SAASO,OAAO,CAACL,WAAW;YAC3EE,OACEJ,SAASO,OAAO,CAACC,QAAQ,EAAEE,YAC3BV,SAASO,OAAO,CAACC,QAAQ,EAAEG,aAC3BX,SAASO,OAAO,CAACF,QAAQ,IACzBL,SAASO,OAAO,CAACH,KAAK;QAC1B;IACF;IAEA,MAAME,MAAMN,SAASM,GAAG;IAExB,IAAI,CAACA,KAAK;QACR,OAAOf,gBAAgB;YACrBW,aACEF,SAASO,OAAO,CAACC,QAAQ,EAAEC,kBAAkBT,SAASO,OAAO,CAACL,WAAW;YAC3EE,OACEJ,SAASO,OAAO,CAACC,QAAQ,EAAEE,YAC3BV,SAASO,OAAO,CAACC,QAAQ,EAAEG,aAC3BX,SAASO,OAAO,CAACF,QAAQ,IACzBL,SAASO,OAAO,CAACH,KAAK;QAC1B;IACF;IAEA,OAAOb,gBAAgB;QACrBW,aACEI,IAAIM,SAAS,EAAEH,kBACfH,IAAIM,SAAS,EAAEC,mBACfP,IAAIJ,WAAW,IACfF,SAASO,OAAO,CAACC,QAAQ,EAAEC,kBAC3BT,SAASO,OAAO,CAACL,WAAW;QAC9BE,OACEE,IAAIM,SAAS,EAAEF,YACfJ,IAAIM,SAAS,EAAED,aACfL,IAAIF,KAAK,IACTJ,SAASO,OAAO,CAACC,QAAQ,EAAEE,YAC3BV,SAASO,OAAO,CAACH,KAAK;IAC1B;AACF,EAAC;AAED,OAAO,MAAMU,sCAAsC,OACjDC;IAEA,MAAMf,WAAW,MAAMV,gCAAgCyB;IAEvD,OAAOf,WAAWD,+BAA+BC,YAAY;AAC/D,EAAC"}
1
+ {"version":3,"sources":["../../src/next/metadata.ts"],"sourcesContent":["import type {\n PayloadMarkdownDocsMetadata,\n ResolvedPayloadMarkdownDocsRoute,\n ResolvePayloadMarkdownDocsRouteOptions,\n} from './types.js'\n\nimport { resolvePayloadMarkdownDocsRoute } from './route.js'\n\nconst compactMetadata = (\n metadata: PayloadMarkdownDocsMetadata,\n): PayloadMarkdownDocsMetadata =>\n Object.fromEntries(\n Object.entries(metadata).filter(([, value]) => value !== undefined && value !== ''),\n ) as PayloadMarkdownDocsMetadata\n\nexport const getPayloadMarkdownDocsMetadata = (\n resolved: ResolvedPayloadMarkdownDocsRoute,\n): PayloadMarkdownDocsMetadata => {\n if (resolved.type === 'docsGroupIndex') {\n return compactMetadata({\n description: resolved.group.description,\n title: resolved.group.navTitle ?? resolved.group.title,\n })\n }\n\n if (resolved.type === 'docsSetIndex' && !resolved.doc) {\n return compactMetadata({\n description: resolved.docsSet.description,\n title: resolved.docsSet.navTitle ?? resolved.docsSet.title,\n })\n }\n\n const doc = resolved.doc\n\n if (!doc) {\n return compactMetadata({\n description: resolved.docsSet.description,\n title: resolved.docsSet.navTitle ?? resolved.docsSet.title,\n })\n }\n\n return compactMetadata({\n description: doc.description ?? resolved.docsSet.description,\n title: doc.title ?? resolved.docsSet.title,\n })\n}\n\nexport const generatePayloadMarkdownDocsMetadata = async (\n options: ResolvePayloadMarkdownDocsRouteOptions,\n): Promise<null | PayloadMarkdownDocsMetadata> => {\n const resolved = await resolvePayloadMarkdownDocsRoute(options)\n\n return resolved ? getPayloadMarkdownDocsMetadata(resolved) : null\n}\n"],"names":["resolvePayloadMarkdownDocsRoute","compactMetadata","metadata","Object","fromEntries","entries","filter","value","undefined","getPayloadMarkdownDocsMetadata","resolved","type","description","group","title","navTitle","doc","docsSet","generatePayloadMarkdownDocsMetadata","options"],"mappings":"AAMA,SAASA,+BAA+B,QAAQ,aAAY;AAE5D,MAAMC,kBAAkB,CACtBC,WAEAC,OAAOC,WAAW,CAChBD,OAAOE,OAAO,CAACH,UAAUI,MAAM,CAAC,CAAC,GAAGC,MAAM,GAAKA,UAAUC,aAAaD,UAAU;AAGpF,OAAO,MAAME,iCAAiC,CAC5CC;IAEA,IAAIA,SAASC,IAAI,KAAK,kBAAkB;QACtC,OAAOV,gBAAgB;YACrBW,aAAaF,SAASG,KAAK,CAACD,WAAW;YACvCE,OAAOJ,SAASG,KAAK,CAACE,QAAQ,IAAIL,SAASG,KAAK,CAACC,KAAK;QACxD;IACF;IAEA,IAAIJ,SAASC,IAAI,KAAK,kBAAkB,CAACD,SAASM,GAAG,EAAE;QACrD,OAAOf,gBAAgB;YACrBW,aAAaF,SAASO,OAAO,CAACL,WAAW;YACzCE,OAAOJ,SAASO,OAAO,CAACF,QAAQ,IAAIL,SAASO,OAAO,CAACH,KAAK;QAC5D;IACF;IAEA,MAAME,MAAMN,SAASM,GAAG;IAExB,IAAI,CAACA,KAAK;QACR,OAAOf,gBAAgB;YACrBW,aAAaF,SAASO,OAAO,CAACL,WAAW;YACzCE,OAAOJ,SAASO,OAAO,CAACF,QAAQ,IAAIL,SAASO,OAAO,CAACH,KAAK;QAC5D;IACF;IAEA,OAAOb,gBAAgB;QACrBW,aAAaI,IAAIJ,WAAW,IAAIF,SAASO,OAAO,CAACL,WAAW;QAC5DE,OAAOE,IAAIF,KAAK,IAAIJ,SAASO,OAAO,CAACH,KAAK;IAC5C;AACF,EAAC;AAED,OAAO,MAAMI,sCAAsC,OACjDC;IAEA,MAAMT,WAAW,MAAMV,gCAAgCmB;IAEvD,OAAOT,WAAWD,+BAA+BC,YAAY;AAC/D,EAAC"}
@@ -1,4 +1,4 @@
1
- import { normalizeRoutePath } from '../routing/index.js';
1
+ import { deriveDocsSetRouteBase, normalizeRoutePath } from '../routing/index.js';
2
2
  import { isAiMarkdownExportManifestPath, validateDocsAiExportManifest } from '../sync/index.js';
3
3
  export const isRecord = (value)=>typeof value === 'object' && value !== null && !Array.isArray(value);
4
4
  export const getRecordId = (doc)=>{
@@ -26,13 +26,7 @@ const toDefaults = (value)=>{
26
26
  }
27
27
  const sidebarMode = value.sidebarMode === 'auto' || value.sidebarMode === 'hidden' || value.sidebarMode === 'manual' ? value.sidebarMode : undefined;
28
28
  const defaults = cleanObject({
29
- heroDescription: getOptionalString(value, 'heroDescription'),
30
- heroEyebrow: getOptionalString(value, 'heroEyebrow'),
31
- heroTitle: getOptionalString(value, 'heroTitle'),
32
- seoDescription: getOptionalString(value, 'seoDescription'),
33
- seoTitle: getOptionalString(value, 'seoTitle'),
34
- sidebarMode,
35
- theme: getOptionalString(value, 'theme')
29
+ sidebarMode
36
30
  });
37
31
  return Object.keys(defaults).length > 0 ? defaults : undefined;
38
32
  };
@@ -41,14 +35,8 @@ const toOverrides = (value)=>{
41
35
  return undefined;
42
36
  }
43
37
  const overrides = cleanObject({
44
- heroDescription: getOptionalString(value, 'heroDescription'),
45
- heroEyebrow: getOptionalString(value, 'heroEyebrow'),
46
- heroTitle: getOptionalString(value, 'heroTitle'),
47
38
  hideFromNav: getOptionalBoolean(value, 'hideFromNav'),
48
- navTitle: getOptionalString(value, 'navTitle'),
49
- seoDescription: getOptionalString(value, 'seoDescription'),
50
- seoTitle: getOptionalString(value, 'seoTitle'),
51
- theme: getOptionalString(value, 'theme')
39
+ navTitle: getOptionalString(value, 'navTitle')
52
40
  });
53
41
  return Object.keys(overrides).length > 0 ? overrides : undefined;
54
42
  };
@@ -59,7 +47,8 @@ export const toResolvedDocsSet = (doc)=>{
59
47
  const id = getRecordId(doc);
60
48
  const routeBase = getOptionalString(doc, 'routeBase');
61
49
  const title = getOptionalString(doc, 'title');
62
- if (!id || !routeBase || !title) {
50
+ const slug = getOptionalString(doc, 'slug');
51
+ if (!id || !title || !routeBase && !slug) {
63
52
  return undefined;
64
53
  }
65
54
  const aiExportValidation = doc.aiExport === undefined || doc.aiExport === null ? undefined : validateDocsAiExportManifest(doc.aiExport);
@@ -68,14 +57,14 @@ export const toResolvedDocsSet = (doc)=>{
68
57
  aiExport: aiExportValidation.manifest
69
58
  } : {},
70
59
  id,
71
- slug: getOptionalString(doc, 'slug'),
60
+ slug,
72
61
  defaults: toDefaults(doc.defaults),
73
62
  description: getOptionalString(doc, 'description'),
74
63
  navTitle: getOptionalString(doc, 'navTitle'),
75
64
  order: getOptionalNumber(doc, 'order') ?? 0,
76
- routeBase: normalizeRoutePath(routeBase),
77
- sourceId: getOptionalString(doc, 'sourceId'),
78
- sourceRoot: getOptionalString(doc, 'sourceRoot'),
65
+ routeBase: normalizeRoutePath(routeBase ?? deriveDocsSetRouteBase({
66
+ docsSetSlug: slug ?? id
67
+ })),
79
68
  title
80
69
  };
81
70
  };
@@ -86,16 +75,17 @@ export const toResolvedDocsGroup = (doc)=>{
86
75
  const id = getRecordId(doc);
87
76
  const routePath = getOptionalString(doc, 'routePath');
88
77
  const title = getOptionalString(doc, 'title');
89
- if (!id || !routePath || !title) {
78
+ const slug = getOptionalString(doc, 'slug');
79
+ if (!id || !title || !routePath && !slug) {
90
80
  return undefined;
91
81
  }
92
82
  return {
93
83
  id,
94
- slug: getOptionalString(doc, 'slug'),
84
+ slug,
95
85
  description: getOptionalString(doc, 'description'),
96
86
  navTitle: getOptionalString(doc, 'navTitle'),
97
87
  order: getOptionalNumber(doc, 'order') ?? 0,
98
- routePath: normalizeRoutePath(routePath),
88
+ routePath: normalizeRoutePath(routePath ?? `/${slug}`),
99
89
  serveIndex: getOptionalBoolean(doc, 'serveIndex') ?? false,
100
90
  title
101
91
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/next/records.ts"],"sourcesContent":["import type {\n PayloadMarkdownDocsDefaults,\n PayloadMarkdownDocsOverrides,\n ResolvedPayloadMarkdownDocsGroup,\n ResolvedPayloadMarkdownDocsRecord,\n ResolvedPayloadMarkdownDocsSet,\n} from './types.js'\n\nimport { normalizeRoutePath } from '../routing/index.js'\nimport {\n isAiMarkdownExportManifestPath,\n validateDocsAiExportManifest,\n} from '../sync/index.js'\n\nexport const isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\nexport const getRecordId = (doc: Record<string, unknown>): string | undefined => {\n if (typeof doc.id === 'string' || typeof doc.id === 'number') {\n return String(doc.id)\n }\n\n return undefined\n}\n\nexport const getRelationshipId = (value: unknown): string | undefined => {\n if (typeof value === 'string' || typeof value === 'number') {\n return String(value)\n }\n\n if (isRecord(value)) {\n return getRecordId(value)\n }\n\n return undefined\n}\n\nconst getOptionalString = (\n doc: Record<string, unknown>,\n key: string,\n): string | undefined => (typeof doc[key] === 'string' ? doc[key] : undefined)\n\nconst getOptionalNumber = (\n doc: Record<string, unknown>,\n key: string,\n): number | undefined => (typeof doc[key] === 'number' ? doc[key] : undefined)\n\nconst getOptionalBoolean = (\n doc: Record<string, unknown>,\n key: string,\n): boolean | undefined => (typeof doc[key] === 'boolean' ? doc[key] : undefined)\n\nconst cleanObject = <T extends Record<string, unknown>>(input: T): Partial<T> =>\n Object.fromEntries(\n Object.entries(input).filter(([, value]) => value !== undefined && value !== null),\n ) as Partial<T>\n\nconst toDefaults = (value: unknown): PayloadMarkdownDocsDefaults | undefined => {\n if (!isRecord(value)) {\n return undefined\n }\n\n const sidebarMode: PayloadMarkdownDocsDefaults['sidebarMode'] =\n value.sidebarMode === 'auto' ||\n value.sidebarMode === 'hidden' ||\n value.sidebarMode === 'manual'\n ? value.sidebarMode\n : undefined\n const defaults = cleanObject({\n heroDescription: getOptionalString(value, 'heroDescription'),\n heroEyebrow: getOptionalString(value, 'heroEyebrow'),\n heroTitle: getOptionalString(value, 'heroTitle'),\n seoDescription: getOptionalString(value, 'seoDescription'),\n seoTitle: getOptionalString(value, 'seoTitle'),\n sidebarMode,\n theme: getOptionalString(value, 'theme'),\n } satisfies PayloadMarkdownDocsDefaults)\n\n return Object.keys(defaults).length > 0\n ? (defaults as PayloadMarkdownDocsDefaults)\n : undefined\n}\n\nconst toOverrides = (value: unknown): PayloadMarkdownDocsOverrides | undefined => {\n if (!isRecord(value)) {\n return undefined\n }\n\n const overrides = cleanObject({\n heroDescription: getOptionalString(value, 'heroDescription'),\n heroEyebrow: getOptionalString(value, 'heroEyebrow'),\n heroTitle: getOptionalString(value, 'heroTitle'),\n hideFromNav: getOptionalBoolean(value, 'hideFromNav'),\n navTitle: getOptionalString(value, 'navTitle'),\n seoDescription: getOptionalString(value, 'seoDescription'),\n seoTitle: getOptionalString(value, 'seoTitle'),\n theme: getOptionalString(value, 'theme'),\n })\n\n return Object.keys(overrides).length > 0 ? overrides : undefined\n}\n\nexport const toResolvedDocsSet = (\n doc: unknown,\n): ResolvedPayloadMarkdownDocsSet | undefined => {\n if (!isRecord(doc)) {\n return undefined\n }\n\n const id = getRecordId(doc)\n const routeBase = getOptionalString(doc, 'routeBase')\n const title = getOptionalString(doc, 'title')\n\n if (!id || !routeBase || !title) {\n return undefined\n }\n\n const aiExportValidation =\n doc.aiExport === undefined || doc.aiExport === null\n ? undefined\n : validateDocsAiExportManifest(doc.aiExport)\n\n return {\n ...(aiExportValidation?.ok ? { aiExport: aiExportValidation.manifest } : {}),\n id,\n slug: getOptionalString(doc, 'slug'),\n defaults: toDefaults(doc.defaults),\n description: getOptionalString(doc, 'description'),\n navTitle: getOptionalString(doc, 'navTitle'),\n order: getOptionalNumber(doc, 'order') ?? 0,\n routeBase: normalizeRoutePath(routeBase),\n sourceId: getOptionalString(doc, 'sourceId'),\n sourceRoot: getOptionalString(doc, 'sourceRoot'),\n title,\n }\n}\n\nexport const toResolvedDocsGroup = (\n doc: unknown,\n): ResolvedPayloadMarkdownDocsGroup | undefined => {\n if (!isRecord(doc)) {\n return undefined\n }\n\n const id = getRecordId(doc)\n const routePath = getOptionalString(doc, 'routePath')\n const title = getOptionalString(doc, 'title')\n\n if (!id || !routePath || !title) {\n return undefined\n }\n\n return {\n id,\n slug: getOptionalString(doc, 'slug'),\n description: getOptionalString(doc, 'description'),\n navTitle: getOptionalString(doc, 'navTitle'),\n order: getOptionalNumber(doc, 'order') ?? 0,\n routePath: normalizeRoutePath(routePath),\n serveIndex: getOptionalBoolean(doc, 'serveIndex') ?? false,\n title,\n }\n}\n\nexport const toResolvedDocsRecord = ({\n doc,\n markdownField,\n}: {\n doc: unknown\n markdownField: string\n}): ResolvedPayloadMarkdownDocsRecord | undefined => {\n if (!isRecord(doc)) {\n return undefined\n }\n\n const id = getRecordId(doc)\n const route = getOptionalString(doc, 'route')\n const sourcePath = getOptionalString(doc, 'sourcePath')\n const title = getOptionalString(doc, 'title')\n\n if (!id || !route || !sourcePath || !title) {\n return undefined\n }\n\n const sync = isRecord(doc.sync) ? doc.sync : undefined\n const status =\n doc._status === 'draft' || doc._status === 'published' ? doc._status : undefined\n\n return {\n id,\n archived: getOptionalBoolean(sync ?? {}, 'archived') ?? false,\n content:\n typeof doc[markdownField] === 'string' ? doc[markdownField] : undefined,\n depth: getOptionalNumber(doc, 'depth') ?? 0,\n description: getOptionalString(doc, 'description'),\n docsSetId: getRelationshipId(doc.docsSet),\n navTitle: getOptionalString(doc, 'navTitle'),\n order: getOptionalNumber(doc, 'order') ?? 0,\n overrides: toOverrides(doc.overrides),\n route: normalizeRoutePath(route),\n sourceHash: getOptionalString(doc, 'sourceHash'),\n sourcePath,\n status,\n title,\n }\n}\n\nexport const isVisibleDocsRecord = ({\n includeDrafts = false,\n record,\n}: {\n includeDrafts?: boolean\n record: ResolvedPayloadMarkdownDocsRecord\n}): boolean => {\n if (record.archived) {\n return false\n }\n\n if (isAiMarkdownExportManifestPath(record.sourcePath)) {\n return false\n }\n\n if (!includeDrafts && record.status === 'draft') {\n return false\n }\n\n return true\n}\n"],"names":["normalizeRoutePath","isAiMarkdownExportManifestPath","validateDocsAiExportManifest","isRecord","value","Array","isArray","getRecordId","doc","id","String","undefined","getRelationshipId","getOptionalString","key","getOptionalNumber","getOptionalBoolean","cleanObject","input","Object","fromEntries","entries","filter","toDefaults","sidebarMode","defaults","heroDescription","heroEyebrow","heroTitle","seoDescription","seoTitle","theme","keys","length","toOverrides","overrides","hideFromNav","navTitle","toResolvedDocsSet","routeBase","title","aiExportValidation","aiExport","ok","manifest","slug","description","order","sourceId","sourceRoot","toResolvedDocsGroup","routePath","serveIndex","toResolvedDocsRecord","markdownField","route","sourcePath","sync","status","_status","archived","content","depth","docsSetId","docsSet","sourceHash","isVisibleDocsRecord","includeDrafts","record"],"mappings":"AAQA,SAASA,kBAAkB,QAAQ,sBAAqB;AACxD,SACEC,8BAA8B,EAC9BC,4BAA4B,QACvB,mBAAkB;AAEzB,OAAO,MAAMC,WAAW,CAACC,QACvB,OAAOA,UAAU,YAAYA,UAAU,QAAQ,CAACC,MAAMC,OAAO,CAACF,OAAM;AAEtE,OAAO,MAAMG,cAAc,CAACC;IAC1B,IAAI,OAAOA,IAAIC,EAAE,KAAK,YAAY,OAAOD,IAAIC,EAAE,KAAK,UAAU;QAC5D,OAAOC,OAAOF,IAAIC,EAAE;IACtB;IAEA,OAAOE;AACT,EAAC;AAED,OAAO,MAAMC,oBAAoB,CAACR;IAChC,IAAI,OAAOA,UAAU,YAAY,OAAOA,UAAU,UAAU;QAC1D,OAAOM,OAAON;IAChB;IAEA,IAAID,SAASC,QAAQ;QACnB,OAAOG,YAAYH;IACrB;IAEA,OAAOO;AACT,EAAC;AAED,MAAME,oBAAoB,CACxBL,KACAM,MACwB,OAAON,GAAG,CAACM,IAAI,KAAK,WAAWN,GAAG,CAACM,IAAI,GAAGH;AAEpE,MAAMI,oBAAoB,CACxBP,KACAM,MACwB,OAAON,GAAG,CAACM,IAAI,KAAK,WAAWN,GAAG,CAACM,IAAI,GAAGH;AAEpE,MAAMK,qBAAqB,CACzBR,KACAM,MACyB,OAAON,GAAG,CAACM,IAAI,KAAK,YAAYN,GAAG,CAACM,IAAI,GAAGH;AAEtE,MAAMM,cAAc,CAAoCC,QACtDC,OAAOC,WAAW,CAChBD,OAAOE,OAAO,CAACH,OAAOI,MAAM,CAAC,CAAC,GAAGlB,MAAM,GAAKA,UAAUO,aAAaP,UAAU;AAGjF,MAAMmB,aAAa,CAACnB;IAClB,IAAI,CAACD,SAASC,QAAQ;QACpB,OAAOO;IACT;IAEA,MAAMa,cACJpB,MAAMoB,WAAW,KAAK,UACtBpB,MAAMoB,WAAW,KAAK,YACtBpB,MAAMoB,WAAW,KAAK,WAClBpB,MAAMoB,WAAW,GACjBb;IACN,MAAMc,WAAWR,YAAY;QAC3BS,iBAAiBb,kBAAkBT,OAAO;QAC1CuB,aAAad,kBAAkBT,OAAO;QACtCwB,WAAWf,kBAAkBT,OAAO;QACpCyB,gBAAgBhB,kBAAkBT,OAAO;QACzC0B,UAAUjB,kBAAkBT,OAAO;QACnCoB;QACAO,OAAOlB,kBAAkBT,OAAO;IAClC;IAEA,OAAOe,OAAOa,IAAI,CAACP,UAAUQ,MAAM,GAAG,IACjCR,WACDd;AACN;AAEA,MAAMuB,cAAc,CAAC9B;IACnB,IAAI,CAACD,SAASC,QAAQ;QACpB,OAAOO;IACT;IAEA,MAAMwB,YAAYlB,YAAY;QAC5BS,iBAAiBb,kBAAkBT,OAAO;QAC1CuB,aAAad,kBAAkBT,OAAO;QACtCwB,WAAWf,kBAAkBT,OAAO;QACpCgC,aAAapB,mBAAmBZ,OAAO;QACvCiC,UAAUxB,kBAAkBT,OAAO;QACnCyB,gBAAgBhB,kBAAkBT,OAAO;QACzC0B,UAAUjB,kBAAkBT,OAAO;QACnC2B,OAAOlB,kBAAkBT,OAAO;IAClC;IAEA,OAAOe,OAAOa,IAAI,CAACG,WAAWF,MAAM,GAAG,IAAIE,YAAYxB;AACzD;AAEA,OAAO,MAAM2B,oBAAoB,CAC/B9B;IAEA,IAAI,CAACL,SAASK,MAAM;QAClB,OAAOG;IACT;IAEA,MAAMF,KAAKF,YAAYC;IACvB,MAAM+B,YAAY1B,kBAAkBL,KAAK;IACzC,MAAMgC,QAAQ3B,kBAAkBL,KAAK;IAErC,IAAI,CAACC,MAAM,CAAC8B,aAAa,CAACC,OAAO;QAC/B,OAAO7B;IACT;IAEA,MAAM8B,qBACJjC,IAAIkC,QAAQ,KAAK/B,aAAaH,IAAIkC,QAAQ,KAAK,OAC3C/B,YACAT,6BAA6BM,IAAIkC,QAAQ;IAE/C,OAAO;QACL,GAAID,oBAAoBE,KAAK;YAAED,UAAUD,mBAAmBG,QAAQ;QAAC,IAAI,CAAC,CAAC;QAC3EnC;QACAoC,MAAMhC,kBAAkBL,KAAK;QAC7BiB,UAAUF,WAAWf,IAAIiB,QAAQ;QACjCqB,aAAajC,kBAAkBL,KAAK;QACpC6B,UAAUxB,kBAAkBL,KAAK;QACjCuC,OAAOhC,kBAAkBP,KAAK,YAAY;QAC1C+B,WAAWvC,mBAAmBuC;QAC9BS,UAAUnC,kBAAkBL,KAAK;QACjCyC,YAAYpC,kBAAkBL,KAAK;QACnCgC;IACF;AACF,EAAC;AAED,OAAO,MAAMU,sBAAsB,CACjC1C;IAEA,IAAI,CAACL,SAASK,MAAM;QAClB,OAAOG;IACT;IAEA,MAAMF,KAAKF,YAAYC;IACvB,MAAM2C,YAAYtC,kBAAkBL,KAAK;IACzC,MAAMgC,QAAQ3B,kBAAkBL,KAAK;IAErC,IAAI,CAACC,MAAM,CAAC0C,aAAa,CAACX,OAAO;QAC/B,OAAO7B;IACT;IAEA,OAAO;QACLF;QACAoC,MAAMhC,kBAAkBL,KAAK;QAC7BsC,aAAajC,kBAAkBL,KAAK;QACpC6B,UAAUxB,kBAAkBL,KAAK;QACjCuC,OAAOhC,kBAAkBP,KAAK,YAAY;QAC1C2C,WAAWnD,mBAAmBmD;QAC9BC,YAAYpC,mBAAmBR,KAAK,iBAAiB;QACrDgC;IACF;AACF,EAAC;AAED,OAAO,MAAMa,uBAAuB,CAAC,EACnC7C,GAAG,EACH8C,aAAa,EAId;IACC,IAAI,CAACnD,SAASK,MAAM;QAClB,OAAOG;IACT;IAEA,MAAMF,KAAKF,YAAYC;IACvB,MAAM+C,QAAQ1C,kBAAkBL,KAAK;IACrC,MAAMgD,aAAa3C,kBAAkBL,KAAK;IAC1C,MAAMgC,QAAQ3B,kBAAkBL,KAAK;IAErC,IAAI,CAACC,MAAM,CAAC8C,SAAS,CAACC,cAAc,CAAChB,OAAO;QAC1C,OAAO7B;IACT;IAEA,MAAM8C,OAAOtD,SAASK,IAAIiD,IAAI,IAAIjD,IAAIiD,IAAI,GAAG9C;IAC7C,MAAM+C,SACJlD,IAAImD,OAAO,KAAK,WAAWnD,IAAImD,OAAO,KAAK,cAAcnD,IAAImD,OAAO,GAAGhD;IAEzE,OAAO;QACLF;QACAmD,UAAU5C,mBAAmByC,QAAQ,CAAC,GAAG,eAAe;QACxDI,SACE,OAAOrD,GAAG,CAAC8C,cAAc,KAAK,WAAW9C,GAAG,CAAC8C,cAAc,GAAG3C;QAChEmD,OAAO/C,kBAAkBP,KAAK,YAAY;QAC1CsC,aAAajC,kBAAkBL,KAAK;QACpCuD,WAAWnD,kBAAkBJ,IAAIwD,OAAO;QACxC3B,UAAUxB,kBAAkBL,KAAK;QACjCuC,OAAOhC,kBAAkBP,KAAK,YAAY;QAC1C2B,WAAWD,YAAY1B,IAAI2B,SAAS;QACpCoB,OAAOvD,mBAAmBuD;QAC1BU,YAAYpD,kBAAkBL,KAAK;QACnCgD;QACAE;QACAlB;IACF;AACF,EAAC;AAED,OAAO,MAAM0B,sBAAsB,CAAC,EAClCC,gBAAgB,KAAK,EACrBC,MAAM,EAIP;IACC,IAAIA,OAAOR,QAAQ,EAAE;QACnB,OAAO;IACT;IAEA,IAAI3D,+BAA+BmE,OAAOZ,UAAU,GAAG;QACrD,OAAO;IACT;IAEA,IAAI,CAACW,iBAAiBC,OAAOV,MAAM,KAAK,SAAS;QAC/C,OAAO;IACT;IAEA,OAAO;AACT,EAAC"}
1
+ {"version":3,"sources":["../../src/next/records.ts"],"sourcesContent":["import type {\n PayloadMarkdownDocsDefaults,\n PayloadMarkdownDocsOverrides,\n ResolvedPayloadMarkdownDocsGroup,\n ResolvedPayloadMarkdownDocsRecord,\n ResolvedPayloadMarkdownDocsSet,\n} from './types.js'\n\nimport {\n deriveDocsSetRouteBase,\n normalizeRoutePath,\n} from '../routing/index.js'\nimport {\n isAiMarkdownExportManifestPath,\n validateDocsAiExportManifest,\n} from '../sync/index.js'\n\nexport const isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\nexport const getRecordId = (doc: Record<string, unknown>): string | undefined => {\n if (typeof doc.id === 'string' || typeof doc.id === 'number') {\n return String(doc.id)\n }\n\n return undefined\n}\n\nexport const getRelationshipId = (value: unknown): string | undefined => {\n if (typeof value === 'string' || typeof value === 'number') {\n return String(value)\n }\n\n if (isRecord(value)) {\n return getRecordId(value)\n }\n\n return undefined\n}\n\nconst getOptionalString = (\n doc: Record<string, unknown>,\n key: string,\n): string | undefined => (typeof doc[key] === 'string' ? doc[key] : undefined)\n\nconst getOptionalNumber = (\n doc: Record<string, unknown>,\n key: string,\n): number | undefined => (typeof doc[key] === 'number' ? doc[key] : undefined)\n\nconst getOptionalBoolean = (\n doc: Record<string, unknown>,\n key: string,\n): boolean | undefined => (typeof doc[key] === 'boolean' ? doc[key] : undefined)\n\nconst cleanObject = <T extends Record<string, unknown>>(input: T): Partial<T> =>\n Object.fromEntries(\n Object.entries(input).filter(([, value]) => value !== undefined && value !== null),\n ) as Partial<T>\n\nconst toDefaults = (value: unknown): PayloadMarkdownDocsDefaults | undefined => {\n if (!isRecord(value)) {\n return undefined\n }\n\n const sidebarMode: PayloadMarkdownDocsDefaults['sidebarMode'] =\n value.sidebarMode === 'auto' ||\n value.sidebarMode === 'hidden' ||\n value.sidebarMode === 'manual'\n ? value.sidebarMode\n : undefined\n const defaults = cleanObject({\n sidebarMode,\n } satisfies PayloadMarkdownDocsDefaults)\n\n return Object.keys(defaults).length > 0\n ? (defaults as PayloadMarkdownDocsDefaults)\n : undefined\n}\n\nconst toOverrides = (value: unknown): PayloadMarkdownDocsOverrides | undefined => {\n if (!isRecord(value)) {\n return undefined\n }\n\n const overrides = cleanObject({\n hideFromNav: getOptionalBoolean(value, 'hideFromNav'),\n navTitle: getOptionalString(value, 'navTitle'),\n })\n\n return Object.keys(overrides).length > 0 ? overrides : undefined\n}\n\nexport const toResolvedDocsSet = (\n doc: unknown,\n): ResolvedPayloadMarkdownDocsSet | undefined => {\n if (!isRecord(doc)) {\n return undefined\n }\n\n const id = getRecordId(doc)\n const routeBase = getOptionalString(doc, 'routeBase')\n const title = getOptionalString(doc, 'title')\n const slug = getOptionalString(doc, 'slug')\n\n if (!id || !title || (!routeBase && !slug)) {\n return undefined\n }\n\n const aiExportValidation =\n doc.aiExport === undefined || doc.aiExport === null\n ? undefined\n : validateDocsAiExportManifest(doc.aiExport)\n\n return {\n ...(aiExportValidation?.ok ? { aiExport: aiExportValidation.manifest } : {}),\n id,\n slug,\n defaults: toDefaults(doc.defaults),\n description: getOptionalString(doc, 'description'),\n navTitle: getOptionalString(doc, 'navTitle'),\n order: getOptionalNumber(doc, 'order') ?? 0,\n routeBase: normalizeRoutePath(\n routeBase ??\n deriveDocsSetRouteBase({\n docsSetSlug: slug ?? id,\n }),\n ),\n title,\n }\n}\n\nexport const toResolvedDocsGroup = (\n doc: unknown,\n): ResolvedPayloadMarkdownDocsGroup | undefined => {\n if (!isRecord(doc)) {\n return undefined\n }\n\n const id = getRecordId(doc)\n const routePath = getOptionalString(doc, 'routePath')\n const title = getOptionalString(doc, 'title')\n const slug = getOptionalString(doc, 'slug')\n\n if (!id || !title || (!routePath && !slug)) {\n return undefined\n }\n\n return {\n id,\n slug,\n description: getOptionalString(doc, 'description'),\n navTitle: getOptionalString(doc, 'navTitle'),\n order: getOptionalNumber(doc, 'order') ?? 0,\n routePath: normalizeRoutePath(routePath ?? `/${slug}`),\n serveIndex: getOptionalBoolean(doc, 'serveIndex') ?? false,\n title,\n }\n}\n\nexport const toResolvedDocsRecord = ({\n doc,\n markdownField,\n}: {\n doc: unknown\n markdownField: string\n}): ResolvedPayloadMarkdownDocsRecord | undefined => {\n if (!isRecord(doc)) {\n return undefined\n }\n\n const id = getRecordId(doc)\n const route = getOptionalString(doc, 'route')\n const sourcePath = getOptionalString(doc, 'sourcePath')\n const title = getOptionalString(doc, 'title')\n\n if (!id || !route || !sourcePath || !title) {\n return undefined\n }\n\n const sync = isRecord(doc.sync) ? doc.sync : undefined\n const status =\n doc._status === 'draft' || doc._status === 'published' ? doc._status : undefined\n\n return {\n id,\n archived: getOptionalBoolean(sync ?? {}, 'archived') ?? false,\n content:\n typeof doc[markdownField] === 'string' ? doc[markdownField] : undefined,\n depth: getOptionalNumber(doc, 'depth') ?? 0,\n description: getOptionalString(doc, 'description'),\n docsSetId: getRelationshipId(doc.docsSet),\n navTitle: getOptionalString(doc, 'navTitle'),\n order: getOptionalNumber(doc, 'order') ?? 0,\n overrides: toOverrides(doc.overrides),\n route: normalizeRoutePath(route),\n sourceHash: getOptionalString(doc, 'sourceHash'),\n sourcePath,\n status,\n title,\n }\n}\n\nexport const isVisibleDocsRecord = ({\n includeDrafts = false,\n record,\n}: {\n includeDrafts?: boolean\n record: ResolvedPayloadMarkdownDocsRecord\n}): boolean => {\n if (record.archived) {\n return false\n }\n\n if (isAiMarkdownExportManifestPath(record.sourcePath)) {\n return false\n }\n\n if (!includeDrafts && record.status === 'draft') {\n return false\n }\n\n return true\n}\n"],"names":["deriveDocsSetRouteBase","normalizeRoutePath","isAiMarkdownExportManifestPath","validateDocsAiExportManifest","isRecord","value","Array","isArray","getRecordId","doc","id","String","undefined","getRelationshipId","getOptionalString","key","getOptionalNumber","getOptionalBoolean","cleanObject","input","Object","fromEntries","entries","filter","toDefaults","sidebarMode","defaults","keys","length","toOverrides","overrides","hideFromNav","navTitle","toResolvedDocsSet","routeBase","title","slug","aiExportValidation","aiExport","ok","manifest","description","order","docsSetSlug","toResolvedDocsGroup","routePath","serveIndex","toResolvedDocsRecord","markdownField","route","sourcePath","sync","status","_status","archived","content","depth","docsSetId","docsSet","sourceHash","isVisibleDocsRecord","includeDrafts","record"],"mappings":"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"}