@valkyrianlabs/payload-markdown-docs 0.5.1 → 0.5.3

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.
@@ -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 {\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":"AAYA,SACEA,4BAA4B,EAC5BC,mCAAmC,EACnCC,iCAAiC,EACjCC,2BAA2B,QACtB,kBAAiB;AACxB,SACEC,sBAAsB,EACtBC,iBAAiB,EACjBC,kBAAkB,QACb,sBAAqB;AAC5B,SACEC,sBAAsB,QACjB,mBAAkB;AACzB,SACEC,iBAAiB,EACjBC,QAAQ,EACRC,mBAAmB,EACnBC,mBAAmB,EACnBC,oBAAoB,EACpBC,iBAAiB,QACZ,eAAc;AAqBrB,MAAMC,yBAAyB,CAC7BC,cAC6B,CAAA;QAC7BC,MAAMD,aAAaC,QAAQhB;QAC3BiB,YAAYF,aAAaE,cAAchB;QACvCiB,UAAUH,aAAaG,YAAYhB;IACrC,CAAA;AAEA,MAAMiB,eAAe,CAAC,EACpBC,IAAI,EACJC,IAAI,EAC0D;IAC9D,IAAIA,SAASC,WAAW;QACtB,OAAOhB,mBAAmBe;IAC5B;IAEA,IAAIE,MAAMC,OAAO,CAACJ,OAAO;QACvB,OAAOd,mBAAmBc,KAAKK,MAAM,KAAK,IAAI,MAAML,KAAKM,IAAI,CAAC;IAChE;IAEA,IAAI,OAAON,SAAS,UAAU;QAC5B,OAAOd,mBAAmBc;IAC5B;IAEA,OAAO;AACT;AAEA,MAAMO,2BAA2B,CAACC,QAChCA,MAAMC,WAAW,GAAGC,QAAQ,CAAC,SAASF,MAAMG,KAAK,CAAC,GAAG,CAAC,KAAKT;AAE7D,MAAMU,gBAAgB,OAAO,EAC3BjB,WAAW,EACXkB,cAAc,EACdC,OAAO,EAKR;IACC,MAAMC,SAAS,MAAMD,QAAQE,IAAI,CAAC;QAChCC,YAAYtB,YAAYE,UAAU;QAClCqB,OAAO;QACPC,OAAO;QACPN;IACF;IAEA,OAAO,IAAIO,IACTL,OAAOnB,IAAI,CAACyB,OAAO,CAAC,CAACC;QACnB,IAAI,CAACjC,SAASiC,MAAM;YAClB,OAAO,EAAE;QACX;QAEA,MAAMC,KAAKnC,kBAAkBkC;QAE7B,OAAOC,KAAK;YAAC;gBAACA;gBAAID;aAAI;SAAC,GAAG,EAAE;IAC9B;AAEJ;AAEA,MAAME,oBAAoB,CAAC,EACzBC,OAAO,EACPC,UAAU,EACVC,OAAO,IAAIC,KAAa,EAKzB;IACC,IAAI,CAACH,WAAWE,KAAKE,GAAG,CAACJ,UAAU;QACjC,OAAOvB;IACT;IAEA,MAAM4B,QAAQJ,WAAWK,GAAG,CAACN;IAC7B,MAAMO,gBAAgBzC,oBAAoBuC;IAE1C,IAAI,CAACE,eAAehC,MAAM;QACxB,OAAOE;IACT;IAEA,MAAM+B,kBAAkB5C,SAASyC,SAC7BN,kBAAkB;QAChBC,SAASrC,kBAAkB0C,MAAMI,MAAM;QACvCR;QACAC,MAAM,IAAIC,IAAI;YAACH;eAAYE;SAAK;IAClC,KACAzB;IAEJ,OAAOjB,kBAAkBgD,iBAAiBD,cAAchC,IAAI;AAC9D;AAEA,MAAMmC,2BAA2B,CAAC,EAChCb,GAAG,EACHc,OAAO,EACPV,UAAU,EAKX;IACC,IAAI,CAACU,SAASpC,MAAM;QAClB,OAAOoC;IACT;IAEA,MAAMC,iBAAiBhD,SAASiC,OAC5BE,kBAAkB;QAChBC,SAASrC,kBAAkBkC,IAAIQ,KAAK;QACpCJ;IACF,KACAxB;IAEJ,OAAO;QACL,GAAGkC,OAAO;QACVE,WAAWtD,uBAAuB;YAChCuD,aAAaH,QAAQpC,IAAI;YACzBqC;QACF;IACF;AACF;AAEA,MAAMG,yBAAyB,OAAO,EACpC7C,WAAW,EACXkB,cAAc,EACdC,OAAO,EACPwB,SAAS,EAMV;IACC,MAAM,CAACvB,QAAQW,WAAW,GAAG,MAAMe,QAAQC,GAAG,CAAC;QAC7C5B,QAAQE,IAAI,CAAC;YACXC,YAAYtB,YAAYG,QAAQ;YAChCoB,OAAO;YACPC,OAAO;YACPN;QACF;QACAD,cAAc;YACZjB;YACAkB;YACAC;QACF;KACD;IAED,OAAOC,OAAOnB,IAAI,CACf+C,GAAG,CAAC,CAACrB,MACJa,yBAAyB;YACvBb;YACAc,SAAS3C,kBAAkB6B;YAC3BI;QACF,IAEDV,IAAI,CAAC,CAACoB,UAAYA,SAASE,cAAcA;AAC9C;AAEA,MAAMM,8BAA8B,OAAO,EACzCjD,WAAW,EACXkD,MAAM,EACNhC,cAAc,EACdC,OAAO,EAMR;IACC,MAAM,CAACC,QAAQW,WAAW,GAAG,MAAMe,QAAQC,GAAG,CAAC;QAC7C5B,QAAQE,IAAI,CAAC;YACXC,YAAYtB,YAAYG,QAAQ;YAChCoB,OAAO;YACPC,OAAO;YACPN;QACF;QACAD,cAAc;YACZjB;YACAkB;YACAC;QACF;KACD;IAED,OAAOC,OAAOnB,IAAI,CACf+C,GAAG,CAAC,CAACrB,MACJa,yBAAyB;YACvBb;YACAc,SAAS3C,kBAAkB6B;YAC3BI;QACF,IAEDV,IAAI,CAAC,CAACoB,UAAYA,SAASU,UAAUD,WAAWA;AACrD;AAEA,MAAME,8BAA8B,OAAO,EACzCpD,WAAW,EACXkB,cAAc,EACdC,OAAO,EACPN,KAAK,EAMN;IACC,MAAM8B,YAAY/B,yBAAyBC;IAE3C,IAAI,CAAC8B,WAAW;QACd,OAAOpC;IACT;IAEA,MAAMkC,UAAU,MAAMI,uBAAuB;QAC3C7C;QACAkB;QACAC;QACAwB;IACF;IAEA,OACEF,WACAQ,4BAA4B;QAC1BjD;QACAkD,QAAQrC;QACRK;QACAC;IACF;AAEJ;AAEA,MAAMkC,iBAAiB,OAAO,EAC5BrD,WAAW,EACXyC,OAAO,EACPa,aAAa,EACbC,aAAa,EACbrC,cAAc,EACdC,OAAO,EAQR;IACC,MAAMC,SAAS,MAAMD,QAAQE,IAAI,CAAC;QAChCC,YAAYtB,YAAYC,IAAI;QAC5BsB,OAAO;QACPC,OAAO;QACPN;QACAsC,OAAO;YACLf,SAAS;gBACPgB,QAAQhB,QAAQb,EAAE;YACpB;QACF;IACF;IAEA,OAAOR,OAAOnB,IAAI,CACf+C,GAAG,CAAC,CAACrB,MACJ9B,qBAAqB;YACnB8B;YACA4B;QACF,IAEDG,MAAM,CACL,CAACC,SACCA,WAAWpD,aACXZ,oBAAoB;YAClB2D;YACAK;QACF;AAER;AAEA,MAAMC,qBAAqB,CACzBC,OACAC;IAEA,IAAID,MAAME,KAAK,KAAKD,OAAOC,KAAK,EAAE;QAChC,OAAOF,MAAME,KAAK,GAAGD,OAAOC,KAAK;IACnC;IAEA,MAAMC,eAAeH,MAAMI,KAAK,CAACC,aAAa,CAACJ,OAAOG,KAAK;IAE3D,IAAID,iBAAiB,GAAG;QACtB,OAAOA;IACT;IAEA,MAAMG,cAAcN,MAAMO,UAAU,CAACF,aAAa,CAACJ,OAAOM,UAAU;IAEpE,OAAOD,gBAAgB,IAAIA,cAAcN,MAAMjC,EAAE,CAACsC,aAAa,CAACJ,OAAOlC,EAAE;AAC3E;AAEA,MAAMyC,6BAA6B,CACjC5B,UAC0B,CAAA;QAC1B6B,WAAW7B,QAAQE,SAAS;QAC5B4B,SAAS,EAAE;QACXC,aAAa;QACbT,OAAO,EAAE;QACTU,SAAS;QACTvB,QAAQ,GAAGT,QAAQE,SAAS,CAAC,GAAG,CAAC;QACjCyB,YAAY;QACZH,OAAOxB,QAAQwB,KAAK;QACpBS,SAAS;IACX,CAAA;AAEA,MAAMC,mBAAmB,CAAC,EACxBC,QAAQ,EACRC,OAAO,EAIR;IAIC,MAAMC,sBAAsB,IAAIrD,IAAIoD,QAAQ7B,GAAG,CAAC,CAACW,SAAW;YAACA,OAAOS,UAAU;YAAET;SAAO;IACvF,MAAMoB,gBAAqD,EAAE;IAC7D,MAAMC,oBAAoB,IAAI/C;IAC9B,MAAMgD,WAAkC,EAAE;IAE1C,KAAK,MAAMC,eAAeN,SAASb,KAAK,CAAE;QACxCiB,kBAAkBG,GAAG,CAACD;QACtB,MAAMvB,SAASmB,oBAAoB1C,GAAG,CAAC8C;QAEvC,IAAI,CAACvB,QAAQ;YACXsB,SAASG,IAAI,CAAC;gBACZC,MAAM;gBACNC,SAAS,CAAC,+BAA+B,EAAEJ,YAAY,+CAA+C,CAAC;gBACvG5E,MAAMsE,SAASR,UAAU;YAC3B;YACA;QACF;QAEAW,cAAcK,IAAI,CAACzB;IACrB;IAEA,IAAIiB,SAASH,OAAO,KAAK,UAAU;QACjC,OAAO;YACLc,SAASR;YACTE;QACF;IACF;IAEA,MAAMR,UAAUI,QACbnB,MAAM,CAAC,CAACC,SAAW,CAACqB,kBAAkB9C,GAAG,CAACyB,OAAOS,UAAU,GAC3DoB,IAAI,CAAC5B;IAER,OAAO;QACL2B,SAAS;eAAIR;eAAkBN;SAAQ;QACvCQ;IACF;AACF;AAEA,MAAMQ,wBAAwB,CAACC,WAC7BA,SAASC,OAAO,CAAC,oBAAoB,CAACC,OAAOC,QAAgBC,aAC3DD,OAAOnF,MAAM,IAAI,IAAI,GAAG,IAAIqF,MAAM,CAAC,KAAKD,YAAY,GAAG,GAAGD,OAAO,EAAE,EAAEC,YAAY;AAGrF,MAAME,eAAe,CAACrC,SACpBA,OAAOM,KAAK,CAACgC,IAAI,MAAMtC,OAAOS,UAAU;AAE1C,MAAM8B,uBAAuB,CAAC,EAC5BzD,OAAO,EACPmC,QAAQ,EACRC,OAAO,EAKR;IACC,MAAMsB,QAAkB,EAAE;IAC1B,MAAMlC,QAAQW,SAASX,KAAK,IAAIxB,QAAQwB,KAAK;IAC7C,MAAMK,YAAYM,SAASN,SAAS,IAAI7B,QAAQE,SAAS;IACzD,MAAMO,SAAS0B,SAAS1B,MAAM,IAAI,GAAGT,QAAQE,SAAS,CAAC,GAAG,CAAC;IAE3DwD,MAAMf,IAAI,CAAC,CAAC,EAAE,EAAEnB,OAAO;IACvBkC,MAAMf,IAAI,CAAC;IACXe,MAAMf,IAAI,CAAC,CAAC,WAAW,EAAEd,WAAW;IACpC6B,MAAMf,IAAI,CAAC,CAAC,QAAQ,EAAElC,QAAQ;IAE9B,IAAI0B,SAASwB,WAAW,EAAE;QACxBD,MAAMf,IAAI,CAAC,IAAIR,SAASwB,WAAW,CAACH,IAAI;IAC1C;IAEA,IAAIrB,SAASyB,QAAQ,EAAE;QACrBF,MAAMf,IAAI,CAAC,IAAIR,SAASyB,QAAQ,CAACJ,IAAI;IACvC;IAEA,KAAK,MAAMtC,UAAUkB,QAAS;QAC5B,MAAMyB,UAAU3C,OAAO2C,OAAO,EAAEL;QAEhC,IAAI,CAACK,SAAS;YACZ;QACF;QAEA,IAAI1B,SAASJ,WAAW,KAAK,YAAY;YACvC2B,MAAMf,IAAI,CAAC,IAAIkB;YACf;QACF;QAEAH,MAAMf,IAAI,CAAC,IAAI,CAAC,GAAG,EAAEY,aAAarC,SAAS,EAAE,IAAI8B,sBAAsBa;IACzE;IAEA,OAAO,GAAGH,MAAMxF,IAAI,CAAC,MAAMgF,OAAO,CAAC,WAAW,UAAUY,OAAO,GAAG,EAAE,CAAC;AACvE;AAEA,OAAO,MAAMC,0CAA0C,OAAO,EAC5DnG,IAAI,EACJL,aAAayG,iBAAiB,EAC9BnD,gBAAgB,KAAK,EACrBC,gBAAgBnE,2BAA2B,EAC3C,2EAA2E;AAC3E,0FAA0F;AAC1F8B,iBAAiB,IAAI,EACrBZ,IAAI,EACJa,OAAO,EACwC;IAG/C,MAAMN,QAAQT,aAAa;QACzBC;QACAC;IACF;IACA,MAAMN,cAAcD,uBAAuB0G;IAC3C,MAAMhE,UAAU,MAAMW,4BAA4B;QAChDpD;QACAkB;QACAC;QACAN;IACF;IAEA,IAAI,CAAC4B,SAAS;QACZ,OAAO;IACT;IAEA,MAAMmC,WAAWnC,QAAQU,QAAQ,IAAIkB,2BAA2B5B;IAChE,MAAMoC,UAAU,AACd,CAAA,MAAMxB,eAAe;QACnBrD;QACAyC;QACAa;QACAC;QACArC;QACAC;IACF,EAAC,EACDuC,MAAM,CACN,CAACC,SACC,CAACnE,uBAAuB;YACtB+E,SAASK,SAASL,OAAO;YACzBH,YAAYT,OAAOS,UAAU;QAC/B;IAEJ,MAAMmB,UAAUZ,iBAAiB;QAC/BC;QACAC;IACF;IAEA,OAAO;QACL6B,MAAM;QACNC,aAAa;QACblE;QACAiD,UAAUQ,qBAAqB;YAC7BzD;YACAmC;YACAC,SAASU,QAAQA,OAAO;QAC1B;QACArC,QAAQ0B,SAAS1B,MAAM,IAAI,GAAGT,QAAQE,SAAS,CAAC,GAAG,CAAC;QACpD9B;QACAoE,UAAUM,QAAQN,QAAQ;IAC5B;AACF,EAAC;AAED,OAAO,MAAM2B,4CAA4C,OACvDC;IAEA,MAAMC,WAAW,MAAMN,wCAAwCK;IAE/D,IAAI,CAACC,UAAU;QACb,OAAO;IACT;IAEA,OAAO,IAAIC,SAASD,SAASpB,QAAQ,EAAE;QACrCsB,SAAS;YACP,gBAAgBF,SAASH,WAAW;QACtC;QACAM,QAAQ;IACV;AACF,EAAC"}
1
+ {"version":3,"sources":["../../src/next/markdown.ts"],"sourcesContent":["import type { DocsAiExportManifest, DocsValidationIssue } 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 { deriveDocsSetRouteBase, joinRouteSegments, normalizeRoutePath } from '../routing/index.js'\nimport { isExcludedFromAiExport } from '../sync/index.js'\nimport {\n getRelationshipId,\n isRecord,\n isVisibleDocsRecord,\n isVisibleDocsSet,\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 = 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 includeDrafts,\n overrideAccess,\n payload,\n routeBase,\n}: {\n collections: ResolvedCollectionSlugs\n includeDrafts: boolean\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 draft: includeDrafts,\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(\n (docsSet) => docsSet?.routeBase === routeBase && isVisibleDocsSet({ docsSet, includeDrafts }),\n )\n}\n\nconst findDocsSetByAiExportOutput = async ({\n collections,\n includeDrafts,\n output,\n overrideAccess,\n payload,\n}: {\n collections: ResolvedCollectionSlugs\n includeDrafts: boolean\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 draft: includeDrafts,\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(\n (docsSet) =>\n docsSet?.aiExport?.output === output && isVisibleDocsSet({ docsSet, includeDrafts }),\n )\n}\n\nconst findDocsSetForMarkdownRoute = async ({\n collections,\n includeDrafts,\n overrideAccess,\n payload,\n route,\n}: {\n collections: ResolvedCollectionSlugs\n includeDrafts: boolean\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 includeDrafts,\n overrideAccess,\n payload,\n routeBase,\n })\n\n return (\n docsSet ??\n findDocsSetByAiExportOutput({\n collections,\n includeDrafts,\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 draft: includeDrafts,\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\n .join('\\n')\n .replace(/\\n{4,}/g, '\\n\\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<null | ResolvedPayloadMarkdownDocsMarkdownRoute> => {\n const route = getRoutePath({\n slug,\n path,\n })\n const collections = resolveCollectionSlugs(collectionOptions)\n const docsSet = await findDocsSetForMarkdownRoute({\n collections,\n includeDrafts,\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","isVisibleDocsSet","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","includeDrafts","Promise","all","draft","map","findDocsSetByAiExportOutput","output","aiExport","findDocsSetForMarkdownRoute","getDocsRecords","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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"}
@@ -83,6 +83,7 @@ const findDocsSetById = async ({ id, collections, includeDrafts, overrideAccess,
83
83
  payload.find({
84
84
  collection: collections.docsSets,
85
85
  depth: 0,
86
+ draft: includeDrafts,
86
87
  limit: 1,
87
88
  overrideAccess,
88
89
  where: {
@@ -112,6 +113,7 @@ const findDocsSetByRouteBase = async ({ collections, includeDrafts, overrideAcce
112
113
  payload.find({
113
114
  collection: collections.docsSets,
114
115
  depth: 0,
116
+ draft: includeDrafts,
115
117
  limit: 1000,
116
118
  overrideAccess
117
119
  }),
@@ -135,6 +137,7 @@ const findDocsSetByRoutePrefix = async ({ collections, includeDrafts, overrideAc
135
137
  payload.find({
136
138
  collection: collections.docsSets,
137
139
  depth: 0,
140
+ draft: includeDrafts,
138
141
  limit: 1000,
139
142
  overrideAccess
140
143
  }),
@@ -196,6 +199,7 @@ const findDocsRecordByRoute = async ({ collections, includeDrafts, markdownField
196
199
  const result = await payload.find({
197
200
  collection: collections.docs,
198
201
  depth: 1,
202
+ draft: includeDrafts,
199
203
  limit: 5,
200
204
  overrideAccess,
201
205
  where: {
@@ -269,6 +273,7 @@ const findGroupIndexRoute = async ({ collections, includeDrafts, overrideAccess,
269
273
  const docsSetsResult = await payload.find({
270
274
  collection: collections.docsSets,
271
275
  depth: 0,
276
+ draft: includeDrafts,
272
277
  limit: 1000,
273
278
  overrideAccess
274
279
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/next/route.ts"],"sourcesContent":["import type {\n PayloadMarkdownDocsCollectionSlugs,\n PayloadMarkdownDocsReadPayload,\n ResolvedPayloadMarkdownDocsRecord,\n ResolvedPayloadMarkdownDocsRoute,\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 isRouteDescendant,\n joinRouteSegments,\n normalizeRoutePath,\n} from '../routing/index.js'\nimport {\n getRelationshipId,\n isRecord,\n isVisibleDocsRecord,\n isVisibleDocsSet,\n toResolvedDocsGroup,\n toResolvedDocsRecord,\n toResolvedDocsSet,\n} from './records.js'\nimport { getPayloadMarkdownDocsSidebar } from './sidebar.js'\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\nexport const getPayloadMarkdownDocsRoutePath = ({\n slug,\n path,\n}: {\n path?: string\n slug?: string | string[]\n}): string => {\n if (path !== undefined) {\n return normalizeRoutePath(path)\n }\n\n if (Array.isArray(slug)) {\n return slug.length === 0 ? '/' : joinRouteSegments(...slug)\n }\n\n if (typeof slug === 'string') {\n return normalizeRoutePath(slug)\n }\n\n return '/'\n}\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\n if (!isRecord(group)) {\n return undefined\n }\n\n const slug = typeof group.slug === 'string' ? group.slug : undefined\n\n if (!slug) {\n return undefined\n }\n\n const parentRoutePath = getGroupRoutePath({\n groupId: getRelationshipId(group.parent),\n groupsById,\n seen: new Set([groupId, ...seen]),\n })\n\n return joinRouteSegments(parentRoutePath, 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 groupId = isRecord(doc) ? getRelationshipId(doc.group) : undefined\n const groupRoutePath = getGroupRoutePath({\n groupId,\n groupsById,\n })\n\n return {\n ...docsSet,\n routeBase: deriveDocsSetRouteBase({\n docsSetSlug: docsSet.slug,\n groupRoutePath,\n }),\n }\n}\n\nconst findDocsSetById = async ({\n id,\n collections,\n includeDrafts,\n overrideAccess,\n payload,\n}: {\n collections: ResolvedCollectionSlugs\n id: string\n includeDrafts: boolean\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: 1,\n overrideAccess,\n where: {\n id: {\n equals: id,\n },\n },\n }),\n getGroupsById({\n collections,\n overrideAccess,\n payload,\n }),\n ])\n\n const docsSet = withComputedDocsSetRoute({\n doc: result.docs[0],\n docsSet: toResolvedDocsSet(result.docs[0]),\n groupsById,\n })\n\n return docsSet && isVisibleDocsSet({ docsSet, includeDrafts }) ? docsSet : undefined\n}\n\nconst findDocsSetByRouteBase = async ({\n collections,\n includeDrafts,\n overrideAccess,\n payload,\n route,\n}: {\n collections: ResolvedCollectionSlugs\n includeDrafts: boolean\n overrideAccess: boolean\n payload: PayloadMarkdownDocsReadPayload\n route: 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 .filter(\n (docsSet): docsSet is ResolvedPayloadMarkdownDocsSet =>\n docsSet !== undefined && isVisibleDocsSet({ docsSet, includeDrafts }),\n )\n .find((docsSet) => docsSet?.routeBase === route)\n}\n\nconst findDocsSetByRoutePrefix = async ({\n collections,\n includeDrafts,\n overrideAccess,\n payload,\n route,\n}: {\n collections: ResolvedCollectionSlugs\n includeDrafts: boolean\n overrideAccess: boolean\n payload: PayloadMarkdownDocsReadPayload\n route: 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 .filter((docsSet): docsSet is ResolvedPayloadMarkdownDocsSet => {\n if (!docsSet) {\n return false\n }\n\n if (!isVisibleDocsSet({ docsSet, includeDrafts })) {\n return false\n }\n\n return docsSet.routeBase === route || isRouteDescendant(docsSet.routeBase, route)\n })\n .sort((first, second) => second.routeBase.length - first.routeBase.length)[0]\n}\n\nconst getRelatedDocsSet = (doc: unknown): ResolvedPayloadMarkdownDocsSet | undefined => {\n if (!isRecord(doc) || !isRecord(doc.docsSet)) {\n return undefined\n }\n\n return toResolvedDocsSet(doc.docsSet)\n}\n\nconst findDocsSetForRecord = async ({\n collections,\n doc,\n includeDrafts,\n overrideAccess,\n payload,\n record,\n}: {\n collections: ResolvedCollectionSlugs\n doc: unknown\n includeDrafts: boolean\n overrideAccess: boolean\n payload: PayloadMarkdownDocsReadPayload\n record: ResolvedPayloadMarkdownDocsRecord\n}): Promise<ResolvedPayloadMarkdownDocsSet | undefined> => {\n if (record.docsSetId) {\n return findDocsSetById({\n id: record.docsSetId,\n collections,\n includeDrafts,\n overrideAccess,\n payload,\n })\n }\n\n const relatedDocsSet = getRelatedDocsSet(doc)\n\n if (relatedDocsSet && isVisibleDocsSet({ docsSet: relatedDocsSet, includeDrafts })) {\n return relatedDocsSet\n }\n\n return findDocsSetByRoutePrefix({\n collections,\n includeDrafts,\n overrideAccess,\n payload,\n route: record.route,\n })\n}\n\nconst findDocsRecordByRoute = async ({\n collections,\n includeDrafts,\n markdownField,\n overrideAccess,\n payload,\n route,\n}: {\n collections: ResolvedCollectionSlugs\n includeDrafts: boolean\n markdownField: string\n overrideAccess: boolean\n payload: PayloadMarkdownDocsReadPayload\n route: string\n}): Promise<\n | {\n doc: unknown\n record: ResolvedPayloadMarkdownDocsRecord\n }\n | undefined\n> => {\n const result = await payload.find({\n collection: collections.docs,\n depth: 1,\n limit: 5,\n overrideAccess,\n where: {\n route: {\n equals: route,\n },\n },\n })\n\n for (const doc of result.docs) {\n const record = toResolvedDocsRecord({\n doc,\n markdownField,\n })\n\n if (\n record &&\n record.route === route &&\n isVisibleDocsRecord({\n includeDrafts,\n record,\n })\n ) {\n return {\n doc,\n record,\n }\n }\n }\n\n return undefined\n}\n\nconst findDocsSetIndexRecord = 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 | undefined> => {\n const result = await findDocsRecordByRoute({\n collections,\n includeDrafts,\n markdownField,\n overrideAccess,\n payload,\n route: docsSet.routeBase,\n })\n\n if (!result) {\n return undefined\n }\n\n if (result.record.docsSetId && result.record.docsSetId !== docsSet.id) {\n return undefined\n }\n\n if (isRecord(result.doc)) {\n const relatedDocsSetId = getRelationshipId(result.doc.docsSet)\n\n if (relatedDocsSetId && relatedDocsSetId !== docsSet.id) {\n return undefined\n }\n }\n\n return result.record\n}\n\nconst findGroupIndexRoute = async ({\n collections,\n includeDrafts,\n overrideAccess,\n payload,\n route,\n}: {\n collections: ResolvedCollectionSlugs\n includeDrafts: boolean\n overrideAccess: boolean\n payload: PayloadMarkdownDocsReadPayload\n route: string\n}): Promise<ResolvedPayloadMarkdownDocsRoute | undefined> => {\n const groupsById = await getGroupsById({\n collections,\n overrideAccess,\n payload,\n })\n const group = [...groupsById.entries()]\n .map(([groupId, doc]) => {\n const resolved = toResolvedDocsGroup(doc)\n const routePath = getGroupRoutePath({\n groupId,\n groupsById,\n })\n\n return resolved && routePath\n ? {\n ...resolved,\n routePath,\n }\n : undefined\n })\n .find((candidate) => candidate?.routePath === route && candidate.serveIndex)\n\n if (!group) {\n return undefined\n }\n\n const docsSetsResult = await payload.find({\n collection: collections.docsSets,\n depth: 0,\n limit: 1000,\n overrideAccess,\n })\n const docsSets = docsSetsResult.docs\n .filter((doc) => isRecord(doc) && getRelationshipId(doc.group) === group.id)\n .map((doc) =>\n withComputedDocsSetRoute({\n doc,\n docsSet: toResolvedDocsSet(doc),\n groupsById,\n }),\n )\n .filter((docsSet): docsSet is ResolvedPayloadMarkdownDocsSet => docsSet !== undefined)\n .filter((docsSet) => isVisibleDocsSet({ docsSet, includeDrafts }))\n .sort((first, second) => {\n if (first.order !== second.order) {\n return first.order - second.order\n }\n\n return first.routeBase.localeCompare(second.routeBase)\n })\n\n return {\n type: 'docsGroupIndex',\n docsSets,\n group,\n route,\n }\n}\n\nexport const resolvePayloadMarkdownDocsRoute = 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 is enforced explicitly.\n overrideAccess = true,\n path,\n payload,\n}: ResolvePayloadMarkdownDocsRouteOptions): Promise<null | ResolvedPayloadMarkdownDocsRoute> => {\n const route = getPayloadMarkdownDocsRoutePath({\n slug,\n path,\n })\n const collections = resolveCollectionSlugs(collectionOptions)\n const docsSet = await findDocsSetByRouteBase({\n collections,\n includeDrafts,\n overrideAccess,\n payload,\n route,\n })\n\n if (docsSet) {\n const [doc, sidebar] = await Promise.all([\n findDocsSetIndexRecord({\n collections,\n docsSet,\n includeDrafts,\n markdownField,\n overrideAccess,\n payload,\n }),\n getPayloadMarkdownDocsSidebar({\n collections: collectionOptions,\n docsSet,\n includeDrafts,\n markdownField,\n overrideAccess,\n payload,\n }),\n ])\n\n return {\n ...(doc ? { doc } : {}),\n type: 'docsSetIndex',\n docsSet,\n route,\n sidebar,\n }\n }\n\n const docResult = await findDocsRecordByRoute({\n collections,\n includeDrafts,\n markdownField,\n overrideAccess,\n payload,\n route,\n })\n\n if (docResult) {\n const resolvedDocsSet = await findDocsSetForRecord({\n collections,\n doc: docResult.doc,\n includeDrafts,\n overrideAccess,\n payload,\n record: docResult.record,\n })\n\n if (resolvedDocsSet) {\n const sidebar = await getPayloadMarkdownDocsSidebar({\n collections: collectionOptions,\n docsSet: resolvedDocsSet,\n includeDrafts,\n markdownField,\n overrideAccess,\n payload,\n })\n\n return {\n type: 'doc',\n doc: docResult.record,\n docsSet: resolvedDocsSet,\n route,\n sidebar,\n }\n }\n }\n\n const groupRoute = await findGroupIndexRoute({\n collections,\n includeDrafts,\n overrideAccess,\n payload,\n route,\n })\n\n return groupRoute ?? null\n}\n"],"names":["DEFAULT_DOCS_COLLECTION_SLUG","DEFAULT_DOCS_GROUPS_COLLECTION_SLUG","DEFAULT_DOCS_SETS_COLLECTION_SLUG","DEFAULT_MARKDOWN_FIELD_NAME","deriveDocsSetRouteBase","isRouteDescendant","joinRouteSegments","normalizeRoutePath","getRelationshipId","isRecord","isVisibleDocsRecord","isVisibleDocsSet","toResolvedDocsGroup","toResolvedDocsRecord","toResolvedDocsSet","getPayloadMarkdownDocsSidebar","resolveCollectionSlugs","collections","docs","docsGroups","docsSets","getPayloadMarkdownDocsRoutePath","slug","path","undefined","Array","isArray","length","getGroupsById","overrideAccess","payload","result","find","collection","depth","limit","Map","flatMap","doc","id","getGroupRoutePath","groupId","groupsById","seen","Set","has","group","get","parentRoutePath","parent","withComputedDocsSetRoute","docsSet","groupRoutePath","routeBase","docsSetSlug","findDocsSetById","includeDrafts","Promise","all","where","equals","findDocsSetByRouteBase","route","map","filter","findDocsSetByRoutePrefix","sort","first","second","getRelatedDocsSet","findDocsSetForRecord","record","docsSetId","relatedDocsSet","findDocsRecordByRoute","markdownField","findDocsSetIndexRecord","relatedDocsSetId","findGroupIndexRoute","entries","resolved","routePath","candidate","serveIndex","docsSetsResult","order","localeCompare","type","resolvePayloadMarkdownDocsRoute","collectionOptions","sidebar","docResult","resolvedDocsSet","groupRoute"],"mappings":"AASA,SACEA,4BAA4B,EAC5BC,mCAAmC,EACnCC,iCAAiC,EACjCC,2BAA2B,QACtB,kBAAiB;AACxB,SACEC,sBAAsB,EACtBC,iBAAiB,EACjBC,iBAAiB,EACjBC,kBAAkB,QACb,sBAAqB;AAC5B,SACEC,iBAAiB,EACjBC,QAAQ,EACRC,mBAAmB,EACnBC,gBAAgB,EAChBC,mBAAmB,EACnBC,oBAAoB,EACpBC,iBAAiB,QACZ,eAAc;AACrB,SAASC,6BAA6B,QAAQ,eAAc;AAQ5D,MAAMC,yBAAyB,CAC7BC,cAC6B,CAAA;QAC7BC,MAAMD,aAAaC,QAAQlB;QAC3BmB,YAAYF,aAAaE,cAAclB;QACvCmB,UAAUH,aAAaG,YAAYlB;IACrC,CAAA;AAEA,OAAO,MAAMmB,kCAAkC,CAAC,EAC9CC,IAAI,EACJC,IAAI,EAIL;IACC,IAAIA,SAASC,WAAW;QACtB,OAAOjB,mBAAmBgB;IAC5B;IAEA,IAAIE,MAAMC,OAAO,CAACJ,OAAO;QACvB,OAAOA,KAAKK,MAAM,KAAK,IAAI,MAAMrB,qBAAqBgB;IACxD;IAEA,IAAI,OAAOA,SAAS,UAAU;QAC5B,OAAOf,mBAAmBe;IAC5B;IAEA,OAAO;AACT,EAAC;AAED,MAAMM,gBAAgB,OAAO,EAC3BX,WAAW,EACXY,cAAc,EACdC,OAAO,EAKR;IACC,MAAMC,SAAS,MAAMD,QAAQE,IAAI,CAAC;QAChCC,YAAYhB,YAAYE,UAAU;QAClCe,OAAO;QACPC,OAAO;QACPN;IACF;IAEA,OAAO,IAAIO,IACTL,OAAOb,IAAI,CAACmB,OAAO,CAAC,CAACC;QACnB,IAAI,CAAC7B,SAAS6B,MAAM;YAClB,OAAO,EAAE;QACX;QAEA,MAAMC,KAAK/B,kBAAkB8B;QAE7B,OAAOC,KAAK;YAAC;gBAACA;gBAAID;aAAI;SAAC,GAAG,EAAE;IAC9B;AAEJ;AAEA,MAAME,oBAAoB,CAAC,EACzBC,OAAO,EACPC,UAAU,EACVC,OAAO,IAAIC,KAAa,EAKzB;IACC,IAAI,CAACH,WAAWE,KAAKE,GAAG,CAACJ,UAAU;QACjC,OAAOjB;IACT;IAEA,MAAMsB,QAAQJ,WAAWK,GAAG,CAACN;IAE7B,IAAI,CAAChC,SAASqC,QAAQ;QACpB,OAAOtB;IACT;IAEA,MAAMF,OAAO,OAAOwB,MAAMxB,IAAI,KAAK,WAAWwB,MAAMxB,IAAI,GAAGE;IAE3D,IAAI,CAACF,MAAM;QACT,OAAOE;IACT;IAEA,MAAMwB,kBAAkBR,kBAAkB;QACxCC,SAASjC,kBAAkBsC,MAAMG,MAAM;QACvCP;QACAC,MAAM,IAAIC,IAAI;YAACH;eAAYE;SAAK;IAClC;IAEA,OAAOrC,kBAAkB0C,iBAAiB1B;AAC5C;AAEA,MAAM4B,2BAA2B,CAAC,EAChCZ,GAAG,EACHa,OAAO,EACPT,UAAU,EAKX;IACC,IAAI,CAACS,SAAS7B,MAAM;QAClB,OAAO6B;IACT;IAEA,MAAMV,UAAUhC,SAAS6B,OAAO9B,kBAAkB8B,IAAIQ,KAAK,IAAItB;IAC/D,MAAM4B,iBAAiBZ,kBAAkB;QACvCC;QACAC;IACF;IAEA,OAAO;QACL,GAAGS,OAAO;QACVE,WAAWjD,uBAAuB;YAChCkD,aAAaH,QAAQ7B,IAAI;YACzB8B;QACF;IACF;AACF;AAEA,MAAMG,kBAAkB,OAAO,EAC7BhB,EAAE,EACFtB,WAAW,EACXuC,aAAa,EACb3B,cAAc,EACdC,OAAO,EAOR;IACC,MAAM,CAACC,QAAQW,WAAW,GAAG,MAAMe,QAAQC,GAAG,CAAC;QAC7C5B,QAAQE,IAAI,CAAC;YACXC,YAAYhB,YAAYG,QAAQ;YAChCc,OAAO;YACPC,OAAO;YACPN;YACA8B,OAAO;gBACLpB,IAAI;oBACFqB,QAAQrB;gBACV;YACF;QACF;QACAX,cAAc;YACZX;YACAY;YACAC;QACF;KACD;IAED,MAAMqB,UAAUD,yBAAyB;QACvCZ,KAAKP,OAAOb,IAAI,CAAC,EAAE;QACnBiC,SAASrC,kBAAkBiB,OAAOb,IAAI,CAAC,EAAE;QACzCwB;IACF;IAEA,OAAOS,WAAWxC,iBAAiB;QAAEwC;QAASK;IAAc,KAAKL,UAAU3B;AAC7E;AAEA,MAAMqC,yBAAyB,OAAO,EACpC5C,WAAW,EACXuC,aAAa,EACb3B,cAAc,EACdC,OAAO,EACPgC,KAAK,EAON;IACC,MAAM,CAAC/B,QAAQW,WAAW,GAAG,MAAMe,QAAQC,GAAG,CAAC;QAC7C5B,QAAQE,IAAI,CAAC;YACXC,YAAYhB,YAAYG,QAAQ;YAChCc,OAAO;YACPC,OAAO;YACPN;QACF;QACAD,cAAc;YACZX;YACAY;YACAC;QACF;KACD;IAED,OAAOC,OAAOb,IAAI,CACf6C,GAAG,CAAC,CAACzB,MACJY,yBAAyB;YACvBZ;YACAa,SAASrC,kBAAkBwB;YAC3BI;QACF,IAEDsB,MAAM,CACL,CAACb,UACCA,YAAY3B,aAAab,iBAAiB;YAAEwC;YAASK;QAAc,IAEtExB,IAAI,CAAC,CAACmB,UAAYA,SAASE,cAAcS;AAC9C;AAEA,MAAMG,2BAA2B,OAAO,EACtChD,WAAW,EACXuC,aAAa,EACb3B,cAAc,EACdC,OAAO,EACPgC,KAAK,EAON;IACC,MAAM,CAAC/B,QAAQW,WAAW,GAAG,MAAMe,QAAQC,GAAG,CAAC;QAC7C5B,QAAQE,IAAI,CAAC;YACXC,YAAYhB,YAAYG,QAAQ;YAChCc,OAAO;YACPC,OAAO;YACPN;QACF;QACAD,cAAc;YACZX;YACAY;YACAC;QACF;KACD;IAED,OAAOC,OAAOb,IAAI,CACf6C,GAAG,CAAC,CAACzB,MACJY,yBAAyB;YACvBZ;YACAa,SAASrC,kBAAkBwB;YAC3BI;QACF,IAEDsB,MAAM,CAAC,CAACb;QACP,IAAI,CAACA,SAAS;YACZ,OAAO;QACT;QAEA,IAAI,CAACxC,iBAAiB;YAAEwC;YAASK;QAAc,IAAI;YACjD,OAAO;QACT;QAEA,OAAOL,QAAQE,SAAS,KAAKS,SAASzD,kBAAkB8C,QAAQE,SAAS,EAAES;IAC7E,GACCI,IAAI,CAAC,CAACC,OAAOC,SAAWA,OAAOf,SAAS,CAAC1B,MAAM,GAAGwC,MAAMd,SAAS,CAAC1B,MAAM,CAAC,CAAC,EAAE;AACjF;AAEA,MAAM0C,oBAAoB,CAAC/B;IACzB,IAAI,CAAC7B,SAAS6B,QAAQ,CAAC7B,SAAS6B,IAAIa,OAAO,GAAG;QAC5C,OAAO3B;IACT;IAEA,OAAOV,kBAAkBwB,IAAIa,OAAO;AACtC;AAEA,MAAMmB,uBAAuB,OAAO,EAClCrD,WAAW,EACXqB,GAAG,EACHkB,aAAa,EACb3B,cAAc,EACdC,OAAO,EACPyC,MAAM,EAQP;IACC,IAAIA,OAAOC,SAAS,EAAE;QACpB,OAAOjB,gBAAgB;YACrBhB,IAAIgC,OAAOC,SAAS;YACpBvD;YACAuC;YACA3B;YACAC;QACF;IACF;IAEA,MAAM2C,iBAAiBJ,kBAAkB/B;IAEzC,IAAImC,kBAAkB9D,iBAAiB;QAAEwC,SAASsB;QAAgBjB;IAAc,IAAI;QAClF,OAAOiB;IACT;IAEA,OAAOR,yBAAyB;QAC9BhD;QACAuC;QACA3B;QACAC;QACAgC,OAAOS,OAAOT,KAAK;IACrB;AACF;AAEA,MAAMY,wBAAwB,OAAO,EACnCzD,WAAW,EACXuC,aAAa,EACbmB,aAAa,EACb9C,cAAc,EACdC,OAAO,EACPgC,KAAK,EAQN;IAOC,MAAM/B,SAAS,MAAMD,QAAQE,IAAI,CAAC;QAChCC,YAAYhB,YAAYC,IAAI;QAC5BgB,OAAO;QACPC,OAAO;QACPN;QACA8B,OAAO;YACLG,OAAO;gBACLF,QAAQE;YACV;QACF;IACF;IAEA,KAAK,MAAMxB,OAAOP,OAAOb,IAAI,CAAE;QAC7B,MAAMqD,SAAS1D,qBAAqB;YAClCyB;YACAqC;QACF;QAEA,IACEJ,UACAA,OAAOT,KAAK,KAAKA,SACjBpD,oBAAoB;YAClB8C;YACAe;QACF,IACA;YACA,OAAO;gBACLjC;gBACAiC;YACF;QACF;IACF;IAEA,OAAO/C;AACT;AAEA,MAAMoD,yBAAyB,OAAO,EACpC3D,WAAW,EACXkC,OAAO,EACPK,aAAa,EACbmB,aAAa,EACb9C,cAAc,EACdC,OAAO,EAQR;IACC,MAAMC,SAAS,MAAM2C,sBAAsB;QACzCzD;QACAuC;QACAmB;QACA9C;QACAC;QACAgC,OAAOX,QAAQE,SAAS;IAC1B;IAEA,IAAI,CAACtB,QAAQ;QACX,OAAOP;IACT;IAEA,IAAIO,OAAOwC,MAAM,CAACC,SAAS,IAAIzC,OAAOwC,MAAM,CAACC,SAAS,KAAKrB,QAAQZ,EAAE,EAAE;QACrE,OAAOf;IACT;IAEA,IAAIf,SAASsB,OAAOO,GAAG,GAAG;QACxB,MAAMuC,mBAAmBrE,kBAAkBuB,OAAOO,GAAG,CAACa,OAAO;QAE7D,IAAI0B,oBAAoBA,qBAAqB1B,QAAQZ,EAAE,EAAE;YACvD,OAAOf;QACT;IACF;IAEA,OAAOO,OAAOwC,MAAM;AACtB;AAEA,MAAMO,sBAAsB,OAAO,EACjC7D,WAAW,EACXuC,aAAa,EACb3B,cAAc,EACdC,OAAO,EACPgC,KAAK,EAON;IACC,MAAMpB,aAAa,MAAMd,cAAc;QACrCX;QACAY;QACAC;IACF;IACA,MAAMgB,QAAQ;WAAIJ,WAAWqC,OAAO;KAAG,CACpChB,GAAG,CAAC,CAAC,CAACtB,SAASH,IAAI;QAClB,MAAM0C,WAAWpE,oBAAoB0B;QACrC,MAAM2C,YAAYzC,kBAAkB;YAClCC;YACAC;QACF;QAEA,OAAOsC,YAAYC,YACf;YACE,GAAGD,QAAQ;YACXC;QACF,IACAzD;IACN,GACCQ,IAAI,CAAC,CAACkD,YAAcA,WAAWD,cAAcnB,SAASoB,UAAUC,UAAU;IAE7E,IAAI,CAACrC,OAAO;QACV,OAAOtB;IACT;IAEA,MAAM4D,iBAAiB,MAAMtD,QAAQE,IAAI,CAAC;QACxCC,YAAYhB,YAAYG,QAAQ;QAChCc,OAAO;QACPC,OAAO;QACPN;IACF;IACA,MAAMT,WAAWgE,eAAelE,IAAI,CACjC8C,MAAM,CAAC,CAAC1B,MAAQ7B,SAAS6B,QAAQ9B,kBAAkB8B,IAAIQ,KAAK,MAAMA,MAAMP,EAAE,EAC1EwB,GAAG,CAAC,CAACzB,MACJY,yBAAyB;YACvBZ;YACAa,SAASrC,kBAAkBwB;YAC3BI;QACF,IAEDsB,MAAM,CAAC,CAACb,UAAuDA,YAAY3B,WAC3EwC,MAAM,CAAC,CAACb,UAAYxC,iBAAiB;YAAEwC;YAASK;QAAc,IAC9DU,IAAI,CAAC,CAACC,OAAOC;QACZ,IAAID,MAAMkB,KAAK,KAAKjB,OAAOiB,KAAK,EAAE;YAChC,OAAOlB,MAAMkB,KAAK,GAAGjB,OAAOiB,KAAK;QACnC;QAEA,OAAOlB,MAAMd,SAAS,CAACiC,aAAa,CAAClB,OAAOf,SAAS;IACvD;IAEF,OAAO;QACLkC,MAAM;QACNnE;QACA0B;QACAgB;IACF;AACF;AAEA,OAAO,MAAM0B,kCAAkC,OAAO,EACpDlE,IAAI,EACJL,aAAawE,iBAAiB,EAC9BjC,gBAAgB,KAAK,EACrBmB,gBAAgBxE,2BAA2B,EAC3C,2EAA2E;AAC3E,4EAA4E;AAC5E0B,iBAAiB,IAAI,EACrBN,IAAI,EACJO,OAAO,EACgC;IACvC,MAAMgC,QAAQzC,gCAAgC;QAC5CC;QACAC;IACF;IACA,MAAMN,cAAcD,uBAAuByE;IAC3C,MAAMtC,UAAU,MAAMU,uBAAuB;QAC3C5C;QACAuC;QACA3B;QACAC;QACAgC;IACF;IAEA,IAAIX,SAAS;QACX,MAAM,CAACb,KAAKoD,QAAQ,GAAG,MAAMjC,QAAQC,GAAG,CAAC;YACvCkB,uBAAuB;gBACrB3D;gBACAkC;gBACAK;gBACAmB;gBACA9C;gBACAC;YACF;YACAf,8BAA8B;gBAC5BE,aAAawE;gBACbtC;gBACAK;gBACAmB;gBACA9C;gBACAC;YACF;SACD;QAED,OAAO;YACL,GAAIQ,MAAM;gBAAEA;YAAI,IAAI,CAAC,CAAC;YACtBiD,MAAM;YACNpC;YACAW;YACA4B;QACF;IACF;IAEA,MAAMC,YAAY,MAAMjB,sBAAsB;QAC5CzD;QACAuC;QACAmB;QACA9C;QACAC;QACAgC;IACF;IAEA,IAAI6B,WAAW;QACb,MAAMC,kBAAkB,MAAMtB,qBAAqB;YACjDrD;YACAqB,KAAKqD,UAAUrD,GAAG;YAClBkB;YACA3B;YACAC;YACAyC,QAAQoB,UAAUpB,MAAM;QAC1B;QAEA,IAAIqB,iBAAiB;YACnB,MAAMF,UAAU,MAAM3E,8BAA8B;gBAClDE,aAAawE;gBACbtC,SAASyC;gBACTpC;gBACAmB;gBACA9C;gBACAC;YACF;YAEA,OAAO;gBACLyD,MAAM;gBACNjD,KAAKqD,UAAUpB,MAAM;gBACrBpB,SAASyC;gBACT9B;gBACA4B;YACF;QACF;IACF;IAEA,MAAMG,aAAa,MAAMf,oBAAoB;QAC3C7D;QACAuC;QACA3B;QACAC;QACAgC;IACF;IAEA,OAAO+B,cAAc;AACvB,EAAC"}
1
+ {"version":3,"sources":["../../src/next/route.ts"],"sourcesContent":["import type {\n PayloadMarkdownDocsCollectionSlugs,\n PayloadMarkdownDocsReadPayload,\n ResolvedPayloadMarkdownDocsRecord,\n ResolvedPayloadMarkdownDocsRoute,\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 isRouteDescendant,\n joinRouteSegments,\n normalizeRoutePath,\n} from '../routing/index.js'\nimport {\n getRelationshipId,\n isRecord,\n isVisibleDocsRecord,\n isVisibleDocsSet,\n toResolvedDocsGroup,\n toResolvedDocsRecord,\n toResolvedDocsSet,\n} from './records.js'\nimport { getPayloadMarkdownDocsSidebar } from './sidebar.js'\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\nexport const getPayloadMarkdownDocsRoutePath = ({\n slug,\n path,\n}: {\n path?: string\n slug?: string | string[]\n}): string => {\n if (path !== undefined) {\n return normalizeRoutePath(path)\n }\n\n if (Array.isArray(slug)) {\n return slug.length === 0 ? '/' : joinRouteSegments(...slug)\n }\n\n if (typeof slug === 'string') {\n return normalizeRoutePath(slug)\n }\n\n return '/'\n}\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\n if (!isRecord(group)) {\n return undefined\n }\n\n const slug = typeof group.slug === 'string' ? group.slug : undefined\n\n if (!slug) {\n return undefined\n }\n\n const parentRoutePath = getGroupRoutePath({\n groupId: getRelationshipId(group.parent),\n groupsById,\n seen: new Set([groupId, ...seen]),\n })\n\n return joinRouteSegments(parentRoutePath, 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 groupId = isRecord(doc) ? getRelationshipId(doc.group) : undefined\n const groupRoutePath = getGroupRoutePath({\n groupId,\n groupsById,\n })\n\n return {\n ...docsSet,\n routeBase: deriveDocsSetRouteBase({\n docsSetSlug: docsSet.slug,\n groupRoutePath,\n }),\n }\n}\n\nconst findDocsSetById = async ({\n id,\n collections,\n includeDrafts,\n overrideAccess,\n payload,\n}: {\n collections: ResolvedCollectionSlugs\n id: string\n includeDrafts: boolean\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 draft: includeDrafts,\n limit: 1,\n overrideAccess,\n where: {\n id: {\n equals: id,\n },\n },\n }),\n getGroupsById({\n collections,\n overrideAccess,\n payload,\n }),\n ])\n\n const docsSet = withComputedDocsSetRoute({\n doc: result.docs[0],\n docsSet: toResolvedDocsSet(result.docs[0]),\n groupsById,\n })\n\n return docsSet && isVisibleDocsSet({ docsSet, includeDrafts }) ? docsSet : undefined\n}\n\nconst findDocsSetByRouteBase = async ({\n collections,\n includeDrafts,\n overrideAccess,\n payload,\n route,\n}: {\n collections: ResolvedCollectionSlugs\n includeDrafts: boolean\n overrideAccess: boolean\n payload: PayloadMarkdownDocsReadPayload\n route: string\n}): Promise<ResolvedPayloadMarkdownDocsSet | undefined> => {\n const [result, groupsById] = await Promise.all([\n payload.find({\n collection: collections.docsSets,\n depth: 0,\n draft: includeDrafts,\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 .filter(\n (docsSet): docsSet is ResolvedPayloadMarkdownDocsSet =>\n docsSet !== undefined && isVisibleDocsSet({ docsSet, includeDrafts }),\n )\n .find((docsSet) => docsSet?.routeBase === route)\n}\n\nconst findDocsSetByRoutePrefix = async ({\n collections,\n includeDrafts,\n overrideAccess,\n payload,\n route,\n}: {\n collections: ResolvedCollectionSlugs\n includeDrafts: boolean\n overrideAccess: boolean\n payload: PayloadMarkdownDocsReadPayload\n route: string\n}): Promise<ResolvedPayloadMarkdownDocsSet | undefined> => {\n const [result, groupsById] = await Promise.all([\n payload.find({\n collection: collections.docsSets,\n depth: 0,\n draft: includeDrafts,\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 .filter((docsSet): docsSet is ResolvedPayloadMarkdownDocsSet => {\n if (!docsSet) {\n return false\n }\n\n if (!isVisibleDocsSet({ docsSet, includeDrafts })) {\n return false\n }\n\n return docsSet.routeBase === route || isRouteDescendant(docsSet.routeBase, route)\n })\n .sort((first, second) => second.routeBase.length - first.routeBase.length)[0]\n}\n\nconst getRelatedDocsSet = (doc: unknown): ResolvedPayloadMarkdownDocsSet | undefined => {\n if (!isRecord(doc) || !isRecord(doc.docsSet)) {\n return undefined\n }\n\n return toResolvedDocsSet(doc.docsSet)\n}\n\nconst findDocsSetForRecord = async ({\n collections,\n doc,\n includeDrafts,\n overrideAccess,\n payload,\n record,\n}: {\n collections: ResolvedCollectionSlugs\n doc: unknown\n includeDrafts: boolean\n overrideAccess: boolean\n payload: PayloadMarkdownDocsReadPayload\n record: ResolvedPayloadMarkdownDocsRecord\n}): Promise<ResolvedPayloadMarkdownDocsSet | undefined> => {\n if (record.docsSetId) {\n return findDocsSetById({\n id: record.docsSetId,\n collections,\n includeDrafts,\n overrideAccess,\n payload,\n })\n }\n\n const relatedDocsSet = getRelatedDocsSet(doc)\n\n if (relatedDocsSet && isVisibleDocsSet({ docsSet: relatedDocsSet, includeDrafts })) {\n return relatedDocsSet\n }\n\n return findDocsSetByRoutePrefix({\n collections,\n includeDrafts,\n overrideAccess,\n payload,\n route: record.route,\n })\n}\n\nconst findDocsRecordByRoute = async ({\n collections,\n includeDrafts,\n markdownField,\n overrideAccess,\n payload,\n route,\n}: {\n collections: ResolvedCollectionSlugs\n includeDrafts: boolean\n markdownField: string\n overrideAccess: boolean\n payload: PayloadMarkdownDocsReadPayload\n route: string\n}): Promise<\n | {\n doc: unknown\n record: ResolvedPayloadMarkdownDocsRecord\n }\n | undefined\n> => {\n const result = await payload.find({\n collection: collections.docs,\n depth: 1,\n draft: includeDrafts,\n limit: 5,\n overrideAccess,\n where: {\n route: {\n equals: route,\n },\n },\n })\n\n for (const doc of result.docs) {\n const record = toResolvedDocsRecord({\n doc,\n markdownField,\n })\n\n if (\n record &&\n record.route === route &&\n isVisibleDocsRecord({\n includeDrafts,\n record,\n })\n ) {\n return {\n doc,\n record,\n }\n }\n }\n\n return undefined\n}\n\nconst findDocsSetIndexRecord = 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 | undefined> => {\n const result = await findDocsRecordByRoute({\n collections,\n includeDrafts,\n markdownField,\n overrideAccess,\n payload,\n route: docsSet.routeBase,\n })\n\n if (!result) {\n return undefined\n }\n\n if (result.record.docsSetId && result.record.docsSetId !== docsSet.id) {\n return undefined\n }\n\n if (isRecord(result.doc)) {\n const relatedDocsSetId = getRelationshipId(result.doc.docsSet)\n\n if (relatedDocsSetId && relatedDocsSetId !== docsSet.id) {\n return undefined\n }\n }\n\n return result.record\n}\n\nconst findGroupIndexRoute = async ({\n collections,\n includeDrafts,\n overrideAccess,\n payload,\n route,\n}: {\n collections: ResolvedCollectionSlugs\n includeDrafts: boolean\n overrideAccess: boolean\n payload: PayloadMarkdownDocsReadPayload\n route: string\n}): Promise<ResolvedPayloadMarkdownDocsRoute | undefined> => {\n const groupsById = await getGroupsById({\n collections,\n overrideAccess,\n payload,\n })\n const group = [...groupsById.entries()]\n .map(([groupId, doc]) => {\n const resolved = toResolvedDocsGroup(doc)\n const routePath = getGroupRoutePath({\n groupId,\n groupsById,\n })\n\n return resolved && routePath\n ? {\n ...resolved,\n routePath,\n }\n : undefined\n })\n .find((candidate) => candidate?.routePath === route && candidate.serveIndex)\n\n if (!group) {\n return undefined\n }\n\n const docsSetsResult = await payload.find({\n collection: collections.docsSets,\n depth: 0,\n draft: includeDrafts,\n limit: 1000,\n overrideAccess,\n })\n const docsSets = docsSetsResult.docs\n .filter((doc) => isRecord(doc) && getRelationshipId(doc.group) === group.id)\n .map((doc) =>\n withComputedDocsSetRoute({\n doc,\n docsSet: toResolvedDocsSet(doc),\n groupsById,\n }),\n )\n .filter((docsSet): docsSet is ResolvedPayloadMarkdownDocsSet => docsSet !== undefined)\n .filter((docsSet) => isVisibleDocsSet({ docsSet, includeDrafts }))\n .sort((first, second) => {\n if (first.order !== second.order) {\n return first.order - second.order\n }\n\n return first.routeBase.localeCompare(second.routeBase)\n })\n\n return {\n type: 'docsGroupIndex',\n docsSets,\n group,\n route,\n }\n}\n\nexport const resolvePayloadMarkdownDocsRoute = 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 is enforced explicitly.\n overrideAccess = true,\n path,\n payload,\n}: ResolvePayloadMarkdownDocsRouteOptions): Promise<null | ResolvedPayloadMarkdownDocsRoute> => {\n const route = getPayloadMarkdownDocsRoutePath({\n slug,\n path,\n })\n const collections = resolveCollectionSlugs(collectionOptions)\n const docsSet = await findDocsSetByRouteBase({\n collections,\n includeDrafts,\n overrideAccess,\n payload,\n route,\n })\n\n if (docsSet) {\n const [doc, sidebar] = await Promise.all([\n findDocsSetIndexRecord({\n collections,\n docsSet,\n includeDrafts,\n markdownField,\n overrideAccess,\n payload,\n }),\n getPayloadMarkdownDocsSidebar({\n collections: collectionOptions,\n docsSet,\n includeDrafts,\n markdownField,\n overrideAccess,\n payload,\n }),\n ])\n\n return {\n ...(doc ? { doc } : {}),\n type: 'docsSetIndex',\n docsSet,\n route,\n sidebar,\n }\n }\n\n const docResult = await findDocsRecordByRoute({\n collections,\n includeDrafts,\n markdownField,\n overrideAccess,\n payload,\n route,\n })\n\n if (docResult) {\n const resolvedDocsSet = await findDocsSetForRecord({\n collections,\n doc: docResult.doc,\n includeDrafts,\n overrideAccess,\n payload,\n record: docResult.record,\n })\n\n if (resolvedDocsSet) {\n const sidebar = await getPayloadMarkdownDocsSidebar({\n collections: collectionOptions,\n docsSet: resolvedDocsSet,\n includeDrafts,\n markdownField,\n overrideAccess,\n payload,\n })\n\n return {\n type: 'doc',\n doc: docResult.record,\n docsSet: resolvedDocsSet,\n route,\n sidebar,\n }\n }\n }\n\n const groupRoute = await findGroupIndexRoute({\n collections,\n includeDrafts,\n overrideAccess,\n payload,\n route,\n })\n\n return groupRoute ?? null\n}\n"],"names":["DEFAULT_DOCS_COLLECTION_SLUG","DEFAULT_DOCS_GROUPS_COLLECTION_SLUG","DEFAULT_DOCS_SETS_COLLECTION_SLUG","DEFAULT_MARKDOWN_FIELD_NAME","deriveDocsSetRouteBase","isRouteDescendant","joinRouteSegments","normalizeRoutePath","getRelationshipId","isRecord","isVisibleDocsRecord","isVisibleDocsSet","toResolvedDocsGroup","toResolvedDocsRecord","toResolvedDocsSet","getPayloadMarkdownDocsSidebar","resolveCollectionSlugs","collections","docs","docsGroups","docsSets","getPayloadMarkdownDocsRoutePath","slug","path","undefined","Array","isArray","length","getGroupsById","overrideAccess","payload","result","find","collection","depth","limit","Map","flatMap","doc","id","getGroupRoutePath","groupId","groupsById","seen","Set","has","group","get","parentRoutePath","parent","withComputedDocsSetRoute","docsSet","groupRoutePath","routeBase","docsSetSlug","findDocsSetById","includeDrafts","Promise","all","draft","where","equals","findDocsSetByRouteBase","route","map","filter","findDocsSetByRoutePrefix","sort","first","second","getRelatedDocsSet","findDocsSetForRecord","record","docsSetId","relatedDocsSet","findDocsRecordByRoute","markdownField","findDocsSetIndexRecord","relatedDocsSetId","findGroupIndexRoute","entries","resolved","routePath","candidate","serveIndex","docsSetsResult","order","localeCompare","type","resolvePayloadMarkdownDocsRoute","collectionOptions","sidebar","docResult","resolvedDocsSet","groupRoute"],"mappings":"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"}
@@ -1,5 +1,4 @@
1
1
  import { DEFAULT_DOCS_COLLECTION_SLUG, DEFAULT_MARKDOWN_FIELD_NAME } from '../constants.js';
2
- import { joinRouteSegments } from '../routing/index.js';
3
2
  import { isVisibleDocsRecord, toResolvedDocsRecord } from './records.js';
4
3
  const titleCaseSegment = (segment)=>segment.split(/[-_]+/).filter(Boolean).map((part)=>`${part.charAt(0).toUpperCase()}${part.slice(1)}`).join(' ');
5
4
  const getSidebarLabel = (record)=>record.overrides?.navTitle ?? record.navTitle ?? record.title ?? record.sourcePath;
@@ -11,6 +10,17 @@ const getSourcePathSegments = (sourcePath)=>{
11
10
  }
12
11
  return segments;
13
12
  };
13
+ const getSidebarPath = (segments)=>segments.join('/');
14
+ const getFolderPaths = (records)=>{
15
+ const folderPaths = new Set();
16
+ for (const record of records){
17
+ const segments = getSourcePathSegments(record.sourcePath);
18
+ for(let index = 1; index < segments.length; index += 1){
19
+ folderPaths.add(getSidebarPath(segments.slice(0, index)));
20
+ }
21
+ }
22
+ return folderPaths;
23
+ };
14
24
  const compareSidebarItems = (first, second)=>{
15
25
  if (first.order !== second.order) {
16
26
  return first.order - second.order;
@@ -25,7 +35,7 @@ const sortSidebarTree = (items)=>{
25
35
  }
26
36
  }
27
37
  };
28
- const getOrCreateFolderNode = ({ currentItems, depth, docsSet, order, segment, sourcePath })=>{
38
+ const getOrCreateFolderNode = ({ currentItems, depth, order, segment, sourcePath })=>{
29
39
  const existing = currentItems.find((item)=>item.sourcePath === sourcePath);
30
40
  if (existing) {
31
41
  existing.order = Math.min(existing.order, order);
@@ -36,13 +46,12 @@ const getOrCreateFolderNode = ({ currentItems, depth, docsSet, order, segment, s
36
46
  depth,
37
47
  label: titleCaseSegment(segment),
38
48
  order,
39
- route: docsSet ? joinRouteSegments(docsSet.routeBase, sourcePath) : `/${sourcePath}`,
40
49
  sourcePath
41
50
  };
42
51
  currentItems.push(node);
43
52
  return node;
44
53
  };
45
- const mergeLeafIntoTree = ({ docsSet, record, rootItems })=>{
54
+ const mergeLeafIntoTree = ({ folderPaths, record, rootItems })=>{
46
55
  const segments = getSourcePathSegments(record.sourcePath);
47
56
  if (segments.length === 0) {
48
57
  rootItems.push({
@@ -56,15 +65,16 @@ const mergeLeafIntoTree = ({ docsSet, record, rootItems })=>{
56
65
  }
57
66
  let currentItems = rootItems;
58
67
  for (const [index, segment] of segments.entries()){
59
- const sourcePath = segments.slice(0, index + 1).join('/');
68
+ const sourcePath = getSidebarPath(segments.slice(0, index + 1));
60
69
  const isLeaf = index === segments.length - 1;
61
70
  if (isLeaf) {
62
71
  const existing = currentItems.find((item)=>item.sourcePath === sourcePath);
72
+ const itemSourcePath = folderPaths.has(sourcePath) ? sourcePath : record.sourcePath;
63
73
  if (existing) {
64
74
  existing.label = getSidebarLabel(record);
65
75
  existing.order = record.order;
66
76
  existing.route = record.route;
67
- existing.sourcePath = record.sourcePath;
77
+ existing.sourcePath = itemSourcePath;
68
78
  existing.children ??= [];
69
79
  return;
70
80
  }
@@ -73,14 +83,13 @@ const mergeLeafIntoTree = ({ docsSet, record, rootItems })=>{
73
83
  label: getSidebarLabel(record),
74
84
  order: record.order,
75
85
  route: record.route,
76
- sourcePath: record.sourcePath
86
+ sourcePath: itemSourcePath
77
87
  });
78
88
  return;
79
89
  }
80
90
  const folder = getOrCreateFolderNode({
81
91
  currentItems,
82
92
  depth: index,
83
- docsSet,
84
93
  order: record.order,
85
94
  segment,
86
95
  sourcePath
@@ -100,9 +109,10 @@ export const buildPayloadMarkdownDocsSidebar = (records, options = {})=>{
100
109
  }
101
110
  return first.sourcePath.localeCompare(second.sourcePath);
102
111
  });
112
+ const folderPaths = getFolderPaths(visibleRecords);
103
113
  for (const record of visibleRecords){
104
114
  mergeLeafIntoTree({
105
- docsSet: options.docsSet,
115
+ folderPaths,
106
116
  record,
107
117
  rootItems: sidebar
108
118
  });
@@ -116,6 +126,7 @@ overrideAccess = true, payload })=>{
116
126
  const result = await payload.find({
117
127
  collection: collections?.docs ?? DEFAULT_DOCS_COLLECTION_SLUG,
118
128
  depth: 0,
129
+ draft: includeDrafts,
119
130
  limit: 1000,
120
131
  overrideAccess,
121
132
  where: {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/next/sidebar.ts"],"sourcesContent":["import type {\n PayloadMarkdownDocsCollectionSlugs,\n PayloadMarkdownDocsReadPayload,\n PayloadMarkdownDocsSidebarItem,\n ResolvedPayloadMarkdownDocsRecord,\n ResolvedPayloadMarkdownDocsSet,\n} from './types.js'\n\nimport {\n DEFAULT_DOCS_COLLECTION_SLUG,\n DEFAULT_MARKDOWN_FIELD_NAME,\n} from '../constants.js'\nimport { joinRouteSegments } from '../routing/index.js'\nimport {\n isVisibleDocsRecord,\n toResolvedDocsRecord,\n} from './records.js'\n\nexport type BuildPayloadMarkdownDocsSidebarOptions = {\n docsSet?: ResolvedPayloadMarkdownDocsSet\n includeDrafts?: boolean\n}\n\nexport type GetPayloadMarkdownDocsSidebarOptions = {\n collections?: PayloadMarkdownDocsCollectionSlugs\n docsSet: ResolvedPayloadMarkdownDocsSet\n includeDrafts?: boolean\n markdownField?: string\n overrideAccess?: boolean\n payload: PayloadMarkdownDocsReadPayload\n}\n\nconst titleCaseSegment = (segment: string): string =>\n segment\n .split(/[-_]+/)\n .filter(Boolean)\n .map((part) => `${part.charAt(0).toUpperCase()}${part.slice(1)}`)\n .join(' ')\n\nconst getSidebarLabel = (record: ResolvedPayloadMarkdownDocsRecord): string =>\n record.overrides?.navTitle ?? record.navTitle ?? record.title ?? record.sourcePath\n\nconst getSourcePathSegments = (sourcePath: string): string[] => {\n const withoutExtension = sourcePath.replace(/\\.md$/i, '')\n const segments = withoutExtension.split('/').filter(Boolean)\n\n if (segments.at(-1) === 'index') {\n return segments.slice(0, -1)\n }\n\n return segments\n}\n\nconst compareSidebarItems = (\n first: PayloadMarkdownDocsSidebarItem,\n second: PayloadMarkdownDocsSidebarItem,\n): number => {\n if (first.order !== second.order) {\n return first.order - second.order\n }\n\n return first.sourcePath.localeCompare(second.sourcePath)\n}\n\nconst sortSidebarTree = (items: PayloadMarkdownDocsSidebarItem[]) => {\n items.sort(compareSidebarItems)\n\n for (const item of items) {\n if (item.children) {\n sortSidebarTree(item.children)\n }\n }\n}\n\nconst getOrCreateFolderNode = ({\n currentItems,\n depth,\n docsSet,\n order,\n segment,\n sourcePath,\n}: {\n currentItems: PayloadMarkdownDocsSidebarItem[]\n depth: number\n docsSet?: ResolvedPayloadMarkdownDocsSet\n order: number\n segment: string\n sourcePath: string\n}): PayloadMarkdownDocsSidebarItem => {\n const existing = currentItems.find((item) => item.sourcePath === sourcePath)\n\n if (existing) {\n existing.order = Math.min(existing.order, order)\n return existing\n }\n\n const node: PayloadMarkdownDocsSidebarItem = {\n children: [],\n depth,\n label: titleCaseSegment(segment),\n order,\n route: docsSet ? joinRouteSegments(docsSet.routeBase, sourcePath) : `/${sourcePath}`,\n sourcePath,\n }\n\n currentItems.push(node)\n\n return node\n}\n\nconst mergeLeafIntoTree = ({\n docsSet,\n record,\n rootItems,\n}: {\n docsSet?: ResolvedPayloadMarkdownDocsSet\n record: ResolvedPayloadMarkdownDocsRecord\n rootItems: PayloadMarkdownDocsSidebarItem[]\n}) => {\n const segments = getSourcePathSegments(record.sourcePath)\n\n if (segments.length === 0) {\n rootItems.push({\n depth: 0,\n label: getSidebarLabel(record),\n order: record.order,\n route: record.route,\n sourcePath: record.sourcePath,\n })\n return\n }\n\n let currentItems = rootItems\n\n for (const [index, segment] of segments.entries()) {\n const sourcePath = segments.slice(0, index + 1).join('/')\n const isLeaf = index === segments.length - 1\n\n if (isLeaf) {\n const existing = currentItems.find((item) => item.sourcePath === sourcePath)\n\n if (existing) {\n existing.label = getSidebarLabel(record)\n existing.order = record.order\n existing.route = record.route\n existing.sourcePath = record.sourcePath\n existing.children ??= []\n return\n }\n\n currentItems.push({\n depth: index,\n label: getSidebarLabel(record),\n order: record.order,\n route: record.route,\n sourcePath: record.sourcePath,\n })\n return\n }\n\n const folder = getOrCreateFolderNode({\n currentItems,\n depth: index,\n docsSet,\n order: record.order,\n segment,\n sourcePath,\n })\n\n folder.children ??= []\n currentItems = folder.children\n }\n}\n\nexport const buildPayloadMarkdownDocsSidebar = (\n records: ResolvedPayloadMarkdownDocsRecord[],\n options: BuildPayloadMarkdownDocsSidebarOptions = {},\n): PayloadMarkdownDocsSidebarItem[] => {\n const sidebar: PayloadMarkdownDocsSidebarItem[] = []\n const visibleRecords = records\n .filter((record) =>\n isVisibleDocsRecord({\n includeDrafts: options.includeDrafts,\n record,\n }),\n )\n .filter((record) => record.overrides?.hideFromNav !== true)\n .sort((first, second) => {\n if (first.order !== second.order) {\n return first.order - second.order\n }\n\n return first.sourcePath.localeCompare(second.sourcePath)\n })\n\n for (const record of visibleRecords) {\n mergeLeafIntoTree({\n docsSet: options.docsSet,\n record,\n rootItems: sidebar,\n })\n }\n\n sortSidebarTree(sidebar)\n\n return sidebar\n}\n\nexport const getPayloadMarkdownDocsSidebar = async ({\n collections,\n docsSet,\n includeDrafts = false,\n markdownField = DEFAULT_MARKDOWN_FIELD_NAME,\n // Sidebar data reads plugin-owned generated docs server-side.\n // Access is overridden here, then nav visibility is enforced explicitly.\n overrideAccess = true,\n payload,\n}: GetPayloadMarkdownDocsSidebarOptions): Promise<PayloadMarkdownDocsSidebarItem[]> => {\n const result = await payload.find({\n collection: collections?.docs ?? DEFAULT_DOCS_COLLECTION_SLUG,\n depth: 0,\n limit: 1000,\n overrideAccess,\n where: {\n docsSet: {\n equals: docsSet.id,\n },\n },\n })\n\n const records = result.docs\n .map((doc) =>\n toResolvedDocsRecord({\n doc,\n markdownField,\n }),\n )\n .filter(\n (record): record is ResolvedPayloadMarkdownDocsRecord => record !== undefined,\n )\n\n return buildPayloadMarkdownDocsSidebar(records, {\n docsSet,\n includeDrafts,\n })\n}\n"],"names":["DEFAULT_DOCS_COLLECTION_SLUG","DEFAULT_MARKDOWN_FIELD_NAME","joinRouteSegments","isVisibleDocsRecord","toResolvedDocsRecord","titleCaseSegment","segment","split","filter","Boolean","map","part","charAt","toUpperCase","slice","join","getSidebarLabel","record","overrides","navTitle","title","sourcePath","getSourcePathSegments","withoutExtension","replace","segments","at","compareSidebarItems","first","second","order","localeCompare","sortSidebarTree","items","sort","item","children","getOrCreateFolderNode","currentItems","depth","docsSet","existing","find","Math","min","node","label","route","routeBase","push","mergeLeafIntoTree","rootItems","length","index","entries","isLeaf","folder","buildPayloadMarkdownDocsSidebar","records","options","sidebar","visibleRecords","includeDrafts","hideFromNav","getPayloadMarkdownDocsSidebar","collections","markdownField","overrideAccess","payload","result","collection","docs","limit","where","equals","id","doc","undefined"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/next/sidebar.ts"],"sourcesContent":["import type {\n PayloadMarkdownDocsCollectionSlugs,\n PayloadMarkdownDocsReadPayload,\n PayloadMarkdownDocsSidebarItem,\n ResolvedPayloadMarkdownDocsRecord,\n ResolvedPayloadMarkdownDocsSet,\n} from './types.js'\n\nimport { DEFAULT_DOCS_COLLECTION_SLUG, DEFAULT_MARKDOWN_FIELD_NAME } from '../constants.js'\nimport { isVisibleDocsRecord, toResolvedDocsRecord } from './records.js'\n\nexport type BuildPayloadMarkdownDocsSidebarOptions = {\n docsSet?: ResolvedPayloadMarkdownDocsSet\n includeDrafts?: boolean\n}\n\nexport type GetPayloadMarkdownDocsSidebarOptions = {\n collections?: PayloadMarkdownDocsCollectionSlugs\n docsSet: ResolvedPayloadMarkdownDocsSet\n includeDrafts?: boolean\n markdownField?: string\n overrideAccess?: boolean\n payload: PayloadMarkdownDocsReadPayload\n}\n\nconst titleCaseSegment = (segment: string): string =>\n segment\n .split(/[-_]+/)\n .filter(Boolean)\n .map((part) => `${part.charAt(0).toUpperCase()}${part.slice(1)}`)\n .join(' ')\n\nconst getSidebarLabel = (record: ResolvedPayloadMarkdownDocsRecord): string =>\n record.overrides?.navTitle ?? record.navTitle ?? record.title ?? record.sourcePath\n\nconst getSourcePathSegments = (sourcePath: string): string[] => {\n const withoutExtension = sourcePath.replace(/\\.md$/i, '')\n const segments = withoutExtension.split('/').filter(Boolean)\n\n if (segments.at(-1) === 'index') {\n return segments.slice(0, -1)\n }\n\n return segments\n}\n\nconst getSidebarPath = (segments: string[]): string => segments.join('/')\n\nconst getFolderPaths = (records: ResolvedPayloadMarkdownDocsRecord[]): Set<string> => {\n const folderPaths = new Set<string>()\n\n for (const record of records) {\n const segments = getSourcePathSegments(record.sourcePath)\n\n for (let index = 1; index < segments.length; index += 1) {\n folderPaths.add(getSidebarPath(segments.slice(0, index)))\n }\n }\n\n return folderPaths\n}\n\nconst compareSidebarItems = (\n first: PayloadMarkdownDocsSidebarItem,\n second: PayloadMarkdownDocsSidebarItem,\n): number => {\n if (first.order !== second.order) {\n return first.order - second.order\n }\n\n return first.sourcePath.localeCompare(second.sourcePath)\n}\n\nconst sortSidebarTree = (items: PayloadMarkdownDocsSidebarItem[]) => {\n items.sort(compareSidebarItems)\n\n for (const item of items) {\n if (item.children) {\n sortSidebarTree(item.children)\n }\n }\n}\n\nconst getOrCreateFolderNode = ({\n currentItems,\n depth,\n order,\n segment,\n sourcePath,\n}: {\n currentItems: PayloadMarkdownDocsSidebarItem[]\n depth: number\n order: number\n segment: string\n sourcePath: string\n}): PayloadMarkdownDocsSidebarItem => {\n const existing = currentItems.find((item) => item.sourcePath === sourcePath)\n\n if (existing) {\n existing.order = Math.min(existing.order, order)\n return existing\n }\n\n const node: PayloadMarkdownDocsSidebarItem = {\n children: [],\n depth,\n label: titleCaseSegment(segment),\n order,\n sourcePath,\n }\n\n currentItems.push(node)\n\n return node\n}\n\nconst mergeLeafIntoTree = ({\n folderPaths,\n record,\n rootItems,\n}: {\n folderPaths: Set<string>\n record: ResolvedPayloadMarkdownDocsRecord\n rootItems: PayloadMarkdownDocsSidebarItem[]\n}) => {\n const segments = getSourcePathSegments(record.sourcePath)\n\n if (segments.length === 0) {\n rootItems.push({\n depth: 0,\n label: getSidebarLabel(record),\n order: record.order,\n route: record.route,\n sourcePath: record.sourcePath,\n })\n return\n }\n\n let currentItems = rootItems\n\n for (const [index, segment] of segments.entries()) {\n const sourcePath = getSidebarPath(segments.slice(0, index + 1))\n const isLeaf = index === segments.length - 1\n\n if (isLeaf) {\n const existing = currentItems.find((item) => item.sourcePath === sourcePath)\n const itemSourcePath = folderPaths.has(sourcePath) ? sourcePath : record.sourcePath\n\n if (existing) {\n existing.label = getSidebarLabel(record)\n existing.order = record.order\n existing.route = record.route\n existing.sourcePath = itemSourcePath\n existing.children ??= []\n return\n }\n\n currentItems.push({\n depth: index,\n label: getSidebarLabel(record),\n order: record.order,\n route: record.route,\n sourcePath: itemSourcePath,\n })\n return\n }\n\n const folder = getOrCreateFolderNode({\n currentItems,\n depth: index,\n order: record.order,\n segment,\n sourcePath,\n })\n\n folder.children ??= []\n currentItems = folder.children\n }\n}\n\nexport const buildPayloadMarkdownDocsSidebar = (\n records: ResolvedPayloadMarkdownDocsRecord[],\n options: BuildPayloadMarkdownDocsSidebarOptions = {},\n): PayloadMarkdownDocsSidebarItem[] => {\n const sidebar: PayloadMarkdownDocsSidebarItem[] = []\n const visibleRecords = records\n .filter((record) =>\n isVisibleDocsRecord({\n includeDrafts: options.includeDrafts,\n record,\n }),\n )\n .filter((record) => record.overrides?.hideFromNav !== true)\n .sort((first, second) => {\n if (first.order !== second.order) {\n return first.order - second.order\n }\n\n return first.sourcePath.localeCompare(second.sourcePath)\n })\n const folderPaths = getFolderPaths(visibleRecords)\n\n for (const record of visibleRecords) {\n mergeLeafIntoTree({\n folderPaths,\n record,\n rootItems: sidebar,\n })\n }\n\n sortSidebarTree(sidebar)\n\n return sidebar\n}\n\nexport const getPayloadMarkdownDocsSidebar = async ({\n collections,\n docsSet,\n includeDrafts = false,\n markdownField = DEFAULT_MARKDOWN_FIELD_NAME,\n // Sidebar data reads plugin-owned generated docs server-side.\n // Access is overridden here, then nav visibility is enforced explicitly.\n overrideAccess = true,\n payload,\n}: GetPayloadMarkdownDocsSidebarOptions): Promise<PayloadMarkdownDocsSidebarItem[]> => {\n const result = await payload.find({\n collection: collections?.docs ?? DEFAULT_DOCS_COLLECTION_SLUG,\n depth: 0,\n draft: includeDrafts,\n limit: 1000,\n overrideAccess,\n where: {\n docsSet: {\n equals: docsSet.id,\n },\n },\n })\n\n const records = result.docs\n .map((doc) =>\n toResolvedDocsRecord({\n doc,\n markdownField,\n }),\n )\n .filter((record): record is ResolvedPayloadMarkdownDocsRecord => record !== undefined)\n\n return buildPayloadMarkdownDocsSidebar(records, {\n docsSet,\n includeDrafts,\n })\n}\n"],"names":["DEFAULT_DOCS_COLLECTION_SLUG","DEFAULT_MARKDOWN_FIELD_NAME","isVisibleDocsRecord","toResolvedDocsRecord","titleCaseSegment","segment","split","filter","Boolean","map","part","charAt","toUpperCase","slice","join","getSidebarLabel","record","overrides","navTitle","title","sourcePath","getSourcePathSegments","withoutExtension","replace","segments","at","getSidebarPath","getFolderPaths","records","folderPaths","Set","index","length","add","compareSidebarItems","first","second","order","localeCompare","sortSidebarTree","items","sort","item","children","getOrCreateFolderNode","currentItems","depth","existing","find","Math","min","node","label","push","mergeLeafIntoTree","rootItems","route","entries","isLeaf","itemSourcePath","has","folder","buildPayloadMarkdownDocsSidebar","options","sidebar","visibleRecords","includeDrafts","hideFromNav","getPayloadMarkdownDocsSidebar","collections","docsSet","markdownField","overrideAccess","payload","result","collection","docs","draft","limit","where","equals","id","doc","undefined"],"mappings":"AAQA,SAASA,4BAA4B,EAAEC,2BAA2B,QAAQ,kBAAiB;AAC3F,SAASC,mBAAmB,EAAEC,oBAAoB,QAAQ,eAAc;AAgBxE,MAAMC,mBAAmB,CAACC,UACxBA,QACGC,KAAK,CAAC,SACNC,MAAM,CAACC,SACPC,GAAG,CAAC,CAACC,OAAS,GAAGA,KAAKC,MAAM,CAAC,GAAGC,WAAW,KAAKF,KAAKG,KAAK,CAAC,IAAI,EAC/DC,IAAI,CAAC;AAEV,MAAMC,kBAAkB,CAACC,SACvBA,OAAOC,SAAS,EAAEC,YAAYF,OAAOE,QAAQ,IAAIF,OAAOG,KAAK,IAAIH,OAAOI,UAAU;AAEpF,MAAMC,wBAAwB,CAACD;IAC7B,MAAME,mBAAmBF,WAAWG,OAAO,CAAC,UAAU;IACtD,MAAMC,WAAWF,iBAAiBhB,KAAK,CAAC,KAAKC,MAAM,CAACC;IAEpD,IAAIgB,SAASC,EAAE,CAAC,CAAC,OAAO,SAAS;QAC/B,OAAOD,SAASX,KAAK,CAAC,GAAG,CAAC;IAC5B;IAEA,OAAOW;AACT;AAEA,MAAME,iBAAiB,CAACF,WAA+BA,SAASV,IAAI,CAAC;AAErE,MAAMa,iBAAiB,CAACC;IACtB,MAAMC,cAAc,IAAIC;IAExB,KAAK,MAAMd,UAAUY,QAAS;QAC5B,MAAMJ,WAAWH,sBAAsBL,OAAOI,UAAU;QAExD,IAAK,IAAIW,QAAQ,GAAGA,QAAQP,SAASQ,MAAM,EAAED,SAAS,EAAG;YACvDF,YAAYI,GAAG,CAACP,eAAeF,SAASX,KAAK,CAAC,GAAGkB;QACnD;IACF;IAEA,OAAOF;AACT;AAEA,MAAMK,sBAAsB,CAC1BC,OACAC;IAEA,IAAID,MAAME,KAAK,KAAKD,OAAOC,KAAK,EAAE;QAChC,OAAOF,MAAME,KAAK,GAAGD,OAAOC,KAAK;IACnC;IAEA,OAAOF,MAAMf,UAAU,CAACkB,aAAa,CAACF,OAAOhB,UAAU;AACzD;AAEA,MAAMmB,kBAAkB,CAACC;IACvBA,MAAMC,IAAI,CAACP;IAEX,KAAK,MAAMQ,QAAQF,MAAO;QACxB,IAAIE,KAAKC,QAAQ,EAAE;YACjBJ,gBAAgBG,KAAKC,QAAQ;QAC/B;IACF;AACF;AAEA,MAAMC,wBAAwB,CAAC,EAC7BC,YAAY,EACZC,KAAK,EACLT,KAAK,EACLhC,OAAO,EACPe,UAAU,EAOX;IACC,MAAM2B,WAAWF,aAAaG,IAAI,CAAC,CAACN,OAASA,KAAKtB,UAAU,KAAKA;IAEjE,IAAI2B,UAAU;QACZA,SAASV,KAAK,GAAGY,KAAKC,GAAG,CAACH,SAASV,KAAK,EAAEA;QAC1C,OAAOU;IACT;IAEA,MAAMI,OAAuC;QAC3CR,UAAU,EAAE;QACZG;QACAM,OAAOhD,iBAAiBC;QACxBgC;QACAjB;IACF;IAEAyB,aAAaQ,IAAI,CAACF;IAElB,OAAOA;AACT;AAEA,MAAMG,oBAAoB,CAAC,EACzBzB,WAAW,EACXb,MAAM,EACNuC,SAAS,EAKV;IACC,MAAM/B,WAAWH,sBAAsBL,OAAOI,UAAU;IAExD,IAAII,SAASQ,MAAM,KAAK,GAAG;QACzBuB,UAAUF,IAAI,CAAC;YACbP,OAAO;YACPM,OAAOrC,gBAAgBC;YACvBqB,OAAOrB,OAAOqB,KAAK;YACnBmB,OAAOxC,OAAOwC,KAAK;YACnBpC,YAAYJ,OAAOI,UAAU;QAC/B;QACA;IACF;IAEA,IAAIyB,eAAeU;IAEnB,KAAK,MAAM,CAACxB,OAAO1B,QAAQ,IAAImB,SAASiC,OAAO,GAAI;QACjD,MAAMrC,aAAaM,eAAeF,SAASX,KAAK,CAAC,GAAGkB,QAAQ;QAC5D,MAAM2B,SAAS3B,UAAUP,SAASQ,MAAM,GAAG;QAE3C,IAAI0B,QAAQ;YACV,MAAMX,WAAWF,aAAaG,IAAI,CAAC,CAACN,OAASA,KAAKtB,UAAU,KAAKA;YACjE,MAAMuC,iBAAiB9B,YAAY+B,GAAG,CAACxC,cAAcA,aAAaJ,OAAOI,UAAU;YAEnF,IAAI2B,UAAU;gBACZA,SAASK,KAAK,GAAGrC,gBAAgBC;gBACjC+B,SAASV,KAAK,GAAGrB,OAAOqB,KAAK;gBAC7BU,SAASS,KAAK,GAAGxC,OAAOwC,KAAK;gBAC7BT,SAAS3B,UAAU,GAAGuC;gBACtBZ,SAASJ,QAAQ,KAAK,EAAE;gBACxB;YACF;YAEAE,aAAaQ,IAAI,CAAC;gBAChBP,OAAOf;gBACPqB,OAAOrC,gBAAgBC;gBACvBqB,OAAOrB,OAAOqB,KAAK;gBACnBmB,OAAOxC,OAAOwC,KAAK;gBACnBpC,YAAYuC;YACd;YACA;QACF;QAEA,MAAME,SAASjB,sBAAsB;YACnCC;YACAC,OAAOf;YACPM,OAAOrB,OAAOqB,KAAK;YACnBhC;YACAe;QACF;QAEAyC,OAAOlB,QAAQ,KAAK,EAAE;QACtBE,eAAegB,OAAOlB,QAAQ;IAChC;AACF;AAEA,OAAO,MAAMmB,kCAAkC,CAC7ClC,SACAmC,UAAkD,CAAC,CAAC;IAEpD,MAAMC,UAA4C,EAAE;IACpD,MAAMC,iBAAiBrC,QACpBrB,MAAM,CAAC,CAACS,SACPd,oBAAoB;YAClBgE,eAAeH,QAAQG,aAAa;YACpClD;QACF,IAEDT,MAAM,CAAC,CAACS,SAAWA,OAAOC,SAAS,EAAEkD,gBAAgB,MACrD1B,IAAI,CAAC,CAACN,OAAOC;QACZ,IAAID,MAAME,KAAK,KAAKD,OAAOC,KAAK,EAAE;YAChC,OAAOF,MAAME,KAAK,GAAGD,OAAOC,KAAK;QACnC;QAEA,OAAOF,MAAMf,UAAU,CAACkB,aAAa,CAACF,OAAOhB,UAAU;IACzD;IACF,MAAMS,cAAcF,eAAesC;IAEnC,KAAK,MAAMjD,UAAUiD,eAAgB;QACnCX,kBAAkB;YAChBzB;YACAb;YACAuC,WAAWS;QACb;IACF;IAEAzB,gBAAgByB;IAEhB,OAAOA;AACT,EAAC;AAED,OAAO,MAAMI,gCAAgC,OAAO,EAClDC,WAAW,EACXC,OAAO,EACPJ,gBAAgB,KAAK,EACrBK,gBAAgBtE,2BAA2B,EAC3C,8DAA8D;AAC9D,yEAAyE;AACzEuE,iBAAiB,IAAI,EACrBC,OAAO,EAC8B;IACrC,MAAMC,SAAS,MAAMD,QAAQzB,IAAI,CAAC;QAChC2B,YAAYN,aAAaO,QAAQ5E;QACjC8C,OAAO;QACP+B,OAAOX;QACPY,OAAO;QACPN;QACAO,OAAO;YACLT,SAAS;gBACPU,QAAQV,QAAQW,EAAE;YACpB;QACF;IACF;IAEA,MAAMrD,UAAU8C,OAAOE,IAAI,CACxBnE,GAAG,CAAC,CAACyE,MACJ/E,qBAAqB;YACnB+E;YACAX;QACF,IAEDhE,MAAM,CAAC,CAACS,SAAwDA,WAAWmE;IAE9E,OAAOrB,gCAAgClC,SAAS;QAC9C0C;QACAJ;IACF;AACF,EAAC"}
@@ -2,6 +2,7 @@ import type { DocsAiExportManifest } from '../sync/index.js';
2
2
  export type PayloadMarkdownDocsFindArgs = {
3
3
  collection: string;
4
4
  depth?: number;
5
+ draft?: boolean;
5
6
  limit?: number;
6
7
  overrideAccess?: boolean;
7
8
  sort?: string;
@@ -86,7 +87,7 @@ export type PayloadMarkdownDocsSidebarItem = {
86
87
  hidden?: boolean;
87
88
  label: string;
88
89
  order: number;
89
- route: string;
90
+ route?: string;
90
91
  sourcePath: string;
91
92
  };
92
93
  export type ResolvedPayloadMarkdownDocsRoute = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/next/types.ts"],"sourcesContent":["import type { DocsAiExportManifest } from '../sync/index.js'\n\nexport type PayloadMarkdownDocsFindArgs = {\n collection: string\n depth?: number\n limit?: number\n overrideAccess?: boolean\n sort?: string\n where?: unknown\n}\n\nexport type PayloadMarkdownDocsReadPayload = {\n find: (args: PayloadMarkdownDocsFindArgs) => Promise<{\n docs: unknown[]\n }>\n}\n\nexport type PayloadMarkdownDocsCollectionSlugs = {\n docs?: string\n docsGroups?: string\n docsSets?: string\n}\n\nexport type ResolvePayloadMarkdownDocsRouteOptions = {\n collections?: PayloadMarkdownDocsCollectionSlugs\n includeDrafts?: boolean\n markdownField?: string\n overrideAccess?: boolean\n path?: string\n payload: PayloadMarkdownDocsReadPayload\n slug?: string | string[]\n}\n\nexport type PayloadMarkdownDocsDefaults = {\n sidebarMode?: 'auto' | 'hidden' | 'manual'\n}\n\nexport type PayloadMarkdownDocsOverrides = {\n hideFromNav?: boolean\n navTitle?: string\n}\n\nexport type PayloadMarkdownDocsHeroImage = {\n alt?: string\n height?: number\n id?: string\n relationTo?: string\n url: string\n width?: number\n}\n\nexport type ResolvedPayloadMarkdownDocsSet = {\n aiExport?: DocsAiExportManifest\n defaults?: PayloadMarkdownDocsDefaults\n description?: string\n id: string\n navTitle?: string\n order: number\n routeBase: string\n slug?: string\n status?: 'draft' | 'published'\n title: string\n}\n\nexport type ResolvedPayloadMarkdownDocsGroup = {\n description?: string\n id: string\n navTitle?: string\n order: number\n routePath: string\n serveIndex: boolean\n slug?: string\n title: string\n}\n\nexport type ResolvedPayloadMarkdownDocsRecord = {\n archived: boolean\n content?: string\n depth: number\n description?: string\n docsSetId?: string\n heroImage?: PayloadMarkdownDocsHeroImage\n id: string\n navTitle?: string\n order: number\n overrides?: PayloadMarkdownDocsOverrides\n route: string\n sourceHash?: string\n sourcePath: string\n status?: 'draft' | 'published'\n title: string\n}\n\nexport type PayloadMarkdownDocsSidebarItem = {\n children?: PayloadMarkdownDocsSidebarItem[]\n depth: number\n hidden?: boolean\n label: string\n order: number\n route: string\n sourcePath: string\n}\n\nexport type ResolvedPayloadMarkdownDocsRoute =\n | {\n doc: ResolvedPayloadMarkdownDocsRecord\n docsSet: ResolvedPayloadMarkdownDocsSet\n route: string\n sidebar: PayloadMarkdownDocsSidebarItem[]\n type: 'doc'\n }\n | {\n doc?: ResolvedPayloadMarkdownDocsRecord\n docsSet: ResolvedPayloadMarkdownDocsSet\n route: string\n sidebar: PayloadMarkdownDocsSidebarItem[]\n type: 'docsSetIndex'\n }\n | {\n docsSets: ResolvedPayloadMarkdownDocsSet[]\n group: ResolvedPayloadMarkdownDocsGroup\n route: string\n type: 'docsGroupIndex'\n }\n\nexport type PayloadMarkdownDocsMetadata = {\n description?: string\n title?: string\n}\n"],"names":[],"mappings":"AA6HA,WAGC"}
1
+ {"version":3,"sources":["../../src/next/types.ts"],"sourcesContent":["import type { DocsAiExportManifest } from '../sync/index.js'\n\nexport type PayloadMarkdownDocsFindArgs = {\n collection: string\n depth?: number\n draft?: boolean\n limit?: number\n overrideAccess?: boolean\n sort?: string\n where?: unknown\n}\n\nexport type PayloadMarkdownDocsReadPayload = {\n find: (args: PayloadMarkdownDocsFindArgs) => Promise<{\n docs: unknown[]\n }>\n}\n\nexport type PayloadMarkdownDocsCollectionSlugs = {\n docs?: string\n docsGroups?: string\n docsSets?: string\n}\n\nexport type ResolvePayloadMarkdownDocsRouteOptions = {\n collections?: PayloadMarkdownDocsCollectionSlugs\n includeDrafts?: boolean\n markdownField?: string\n overrideAccess?: boolean\n path?: string\n payload: PayloadMarkdownDocsReadPayload\n slug?: string | string[]\n}\n\nexport type PayloadMarkdownDocsDefaults = {\n sidebarMode?: 'auto' | 'hidden' | 'manual'\n}\n\nexport type PayloadMarkdownDocsOverrides = {\n hideFromNav?: boolean\n navTitle?: string\n}\n\nexport type PayloadMarkdownDocsHeroImage = {\n alt?: string\n height?: number\n id?: string\n relationTo?: string\n url: string\n width?: number\n}\n\nexport type ResolvedPayloadMarkdownDocsSet = {\n aiExport?: DocsAiExportManifest\n defaults?: PayloadMarkdownDocsDefaults\n description?: string\n id: string\n navTitle?: string\n order: number\n routeBase: string\n slug?: string\n status?: 'draft' | 'published'\n title: string\n}\n\nexport type ResolvedPayloadMarkdownDocsGroup = {\n description?: string\n id: string\n navTitle?: string\n order: number\n routePath: string\n serveIndex: boolean\n slug?: string\n title: string\n}\n\nexport type ResolvedPayloadMarkdownDocsRecord = {\n archived: boolean\n content?: string\n depth: number\n description?: string\n docsSetId?: string\n heroImage?: PayloadMarkdownDocsHeroImage\n id: string\n navTitle?: string\n order: number\n overrides?: PayloadMarkdownDocsOverrides\n route: string\n sourceHash?: string\n sourcePath: string\n status?: 'draft' | 'published'\n title: string\n}\n\nexport type PayloadMarkdownDocsSidebarItem = {\n children?: PayloadMarkdownDocsSidebarItem[]\n depth: number\n hidden?: boolean\n label: string\n order: number\n route?: string\n sourcePath: string\n}\n\nexport type ResolvedPayloadMarkdownDocsRoute =\n | {\n doc: ResolvedPayloadMarkdownDocsRecord\n docsSet: ResolvedPayloadMarkdownDocsSet\n route: string\n sidebar: PayloadMarkdownDocsSidebarItem[]\n type: 'doc'\n }\n | {\n doc?: ResolvedPayloadMarkdownDocsRecord\n docsSet: ResolvedPayloadMarkdownDocsSet\n route: string\n sidebar: PayloadMarkdownDocsSidebarItem[]\n type: 'docsSetIndex'\n }\n | {\n docsSets: ResolvedPayloadMarkdownDocsSet[]\n group: ResolvedPayloadMarkdownDocsGroup\n route: string\n type: 'docsGroupIndex'\n }\n\nexport type PayloadMarkdownDocsMetadata = {\n description?: string\n title?: string\n}\n"],"names":[],"mappings":"AA8HA,WAGC"}
@@ -5,6 +5,7 @@ export type ApplyDocsSyncPayloadOperations = {
5
5
  create: (args: {
6
6
  collection: string;
7
7
  data: Record<string, unknown>;
8
+ draft?: boolean;
8
9
  overrideAccess?: boolean;
9
10
  }) => Promise<Record<string, unknown>>;
10
11
  delete?: (args: {
@@ -15,6 +16,7 @@ export type ApplyDocsSyncPayloadOperations = {
15
16
  update: (args: {
16
17
  collection: string;
17
18
  data: Record<string, unknown>;
19
+ draft?: boolean;
18
20
  id: string;
19
21
  overrideAccess?: boolean;
20
22
  }) => Promise<Record<string, unknown>>;
@@ -9,6 +9,9 @@ export const assertApplyDeleteBehaviorSupported = (deleteBehavior, { allowHardDe
9
9
  }
10
10
  return allowHardDelete;
11
11
  };
12
+ const getDocsWriteDraftOption = ({ docsEnableDrafts, publish })=>docsEnableDrafts ? {
13
+ draft: !publish
14
+ } : {};
12
15
  export const applyDocsSync = async ({ collectionSlug, deleteBehavior, docsEnableDrafts, docsSetId, existing, manifest, markdownFieldName, now, payload, plan, publish, syncRunId })=>{
13
16
  const existingBySourcePath = new Map(existing.map((record)=>[
14
17
  record.sourcePath,
@@ -39,6 +42,10 @@ export const applyDocsSync = async ({ collectionSlug, deleteBehavior, docsEnable
39
42
  reactivate: 0,
40
43
  update: 0
41
44
  };
45
+ const writeDraftOption = getDocsWriteDraftOption({
46
+ docsEnableDrafts,
47
+ publish
48
+ });
42
49
  for (const change of plan.create){
43
50
  if (!change.desired) {
44
51
  continue;
@@ -55,6 +62,7 @@ export const applyDocsSync = async ({ collectionSlug, deleteBehavior, docsEnable
55
62
  publish,
56
63
  syncRunId
57
64
  }),
65
+ ...writeDraftOption,
58
66
  overrideAccess: true
59
67
  });
60
68
  writes.create += 1;
@@ -80,6 +88,7 @@ export const applyDocsSync = async ({ collectionSlug, deleteBehavior, docsEnable
80
88
  publish,
81
89
  syncRunId
82
90
  }),
91
+ ...writeDraftOption,
83
92
  overrideAccess: true
84
93
  });
85
94
  writes.update += 1;
@@ -105,6 +114,7 @@ export const applyDocsSync = async ({ collectionSlug, deleteBehavior, docsEnable
105
114
  publish,
106
115
  syncRunId
107
116
  }),
117
+ ...writeDraftOption,
108
118
  overrideAccess: true
109
119
  });
110
120
  writes.reactivate += 1;
@@ -123,6 +133,7 @@ export const applyDocsSync = async ({ collectionSlug, deleteBehavior, docsEnable
123
133
  now,
124
134
  syncRunId
125
135
  }),
136
+ ...writeDraftOption,
126
137
  overrideAccess: true
127
138
  });
128
139
  writes.archive += 1;
@@ -143,6 +154,9 @@ export const applyDocsSync = async ({ collectionSlug, deleteBehavior, docsEnable
143
154
  now,
144
155
  syncRunId
145
156
  }),
157
+ ...docsEnableDrafts ? {
158
+ draft: true
159
+ } : {},
146
160
  overrideAccess: true
147
161
  });
148
162
  writes.draft += 1;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/payload/applyDocsSync.ts"],"sourcesContent":["import type { DocsDeleteBehavior, DocsSyncPlan, ValidatedDocsManifest } from '../sync/index.js'\nimport type { DocsSyncConflict } from './docsConflicts.js'\nimport type { ExistingPayloadDocsRecord } from './existingDocs.js'\n\nimport { findDocsSyncConflicts } from './docsConflicts.js'\nimport { buildArchiveData, buildDocsData } from './docsData.js'\n\nexport type ApplyDocsSyncPayloadOperations = {\n create: (args: {\n collection: string\n data: Record<string, unknown>\n overrideAccess?: boolean\n }) => Promise<Record<string, unknown>>\n delete?: (args: {\n collection: string\n id: string\n overrideAccess?: boolean\n }) => Promise<Record<string, unknown>>\n update: (args: {\n collection: string\n data: Record<string, unknown>\n id: string\n overrideAccess?: boolean\n }) => Promise<Record<string, unknown>>\n}\n\nexport type ApplyDocsSyncResult =\n | {\n conflicts: DocsSyncConflict[]\n ok: false\n }\n | {\n ok: true\n writes: {\n archive: number\n create: number\n delete: number\n draft: number\n reactivate: number\n update: number\n }\n }\n\nexport const assertApplyDeleteBehaviorSupported = (\n deleteBehavior: DocsDeleteBehavior,\n {\n allowHardDelete = false,\n docsEnableDrafts = false,\n }: {\n allowHardDelete?: boolean\n docsEnableDrafts?: boolean\n } = {},\n): boolean => {\n if (deleteBehavior === 'archive' || deleteBehavior === 'ignore') {\n return true\n }\n\n if (deleteBehavior === 'draft') {\n return docsEnableDrafts\n }\n\n return allowHardDelete\n}\n\nexport const applyDocsSync = async ({\n collectionSlug,\n deleteBehavior,\n docsEnableDrafts,\n docsSetId,\n existing,\n manifest,\n markdownFieldName,\n now,\n payload,\n plan,\n publish,\n syncRunId,\n}: {\n collectionSlug: string\n deleteBehavior: DocsDeleteBehavior\n docsEnableDrafts: boolean\n docsSetId?: number | string\n existing: ExistingPayloadDocsRecord[]\n manifest: ValidatedDocsManifest\n markdownFieldName: string\n now: Date\n payload: ApplyDocsSyncPayloadOperations\n plan: DocsSyncPlan\n publish: boolean\n syncRunId?: number | string\n}): Promise<ApplyDocsSyncResult> => {\n const existingBySourcePath = new Map(existing.map((record) => [record.sourcePath, record]))\n const reactivations = plan.unchanged.filter((change) => change.current?.archived)\n const conflicts = findDocsSyncConflicts({\n existingBySourcePath,\n plannedChanges: [\n ...plan.update,\n ...plan.archive,\n ...plan.draft,\n ...plan.delete,\n ...reactivations,\n ],\n })\n\n if (conflicts.length > 0) {\n return {\n conflicts,\n ok: false,\n }\n }\n\n const writes = {\n archive: 0,\n create: 0,\n delete: 0,\n draft: 0,\n reactivate: 0,\n update: 0,\n }\n\n for (const change of plan.create) {\n if (!change.desired) {\n continue\n }\n\n await payload.create({\n collection: collectionSlug,\n data: buildDocsData({\n desired: change.desired,\n docsEnableDrafts,\n docsSetId,\n manifest,\n markdownFieldName,\n now,\n publish,\n syncRunId,\n }),\n overrideAccess: true,\n })\n writes.create += 1\n }\n\n for (const change of plan.update) {\n if (!change.desired) {\n continue\n }\n\n const current = existingBySourcePath.get(change.sourcePath)\n\n if (!current) {\n continue\n }\n\n await payload.update({\n id: current.id,\n collection: collectionSlug,\n data: buildDocsData({\n desired: change.desired,\n docsEnableDrafts,\n docsSetId,\n manifest,\n markdownFieldName,\n now,\n publish,\n syncRunId,\n }),\n overrideAccess: true,\n })\n writes.update += 1\n }\n\n for (const change of reactivations) {\n if (!change.desired) {\n continue\n }\n\n const current = existingBySourcePath.get(change.sourcePath)\n\n if (!current) {\n continue\n }\n\n await payload.update({\n id: current.id,\n collection: collectionSlug,\n data: buildDocsData({\n desired: change.desired,\n docsEnableDrafts,\n docsSetId,\n manifest,\n markdownFieldName,\n now,\n publish,\n syncRunId,\n }),\n overrideAccess: true,\n })\n writes.reactivate += 1\n }\n\n if (deleteBehavior === 'archive') {\n for (const change of plan.archive) {\n const current = existingBySourcePath.get(change.sourcePath)\n\n if (!current) {\n continue\n }\n\n await payload.update({\n id: current.id,\n collection: collectionSlug,\n data: buildArchiveData({\n docsEnableDrafts,\n now,\n syncRunId,\n }),\n overrideAccess: true,\n })\n writes.archive += 1\n }\n }\n\n if (deleteBehavior === 'draft') {\n for (const change of plan.draft) {\n const current = existingBySourcePath.get(change.sourcePath)\n\n if (!current) {\n continue\n }\n\n await payload.update({\n id: current.id,\n collection: collectionSlug,\n data: buildArchiveData({\n docsEnableDrafts,\n draftMissing: true,\n now,\n syncRunId,\n }),\n overrideAccess: true,\n })\n writes.draft += 1\n }\n }\n\n if (deleteBehavior === 'delete') {\n if (!payload.delete) {\n throw new Error('Payload delete operation is required for hard delete.')\n }\n\n for (const change of plan.delete) {\n const current = existingBySourcePath.get(change.sourcePath)\n\n if (!current) {\n continue\n }\n\n await payload.delete({\n id: current.id,\n collection: collectionSlug,\n overrideAccess: true,\n })\n writes.delete += 1\n }\n }\n\n return {\n ok: true,\n writes,\n }\n}\n"],"names":["findDocsSyncConflicts","buildArchiveData","buildDocsData","assertApplyDeleteBehaviorSupported","deleteBehavior","allowHardDelete","docsEnableDrafts","applyDocsSync","collectionSlug","docsSetId","existing","manifest","markdownFieldName","now","payload","plan","publish","syncRunId","existingBySourcePath","Map","map","record","sourcePath","reactivations","unchanged","filter","change","current","archived","conflicts","plannedChanges","update","archive","draft","delete","length","ok","writes","create","reactivate","desired","collection","data","overrideAccess","get","id","draftMissing","Error"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/payload/applyDocsSync.ts"],"sourcesContent":["import type { DocsDeleteBehavior, DocsSyncPlan, ValidatedDocsManifest } from '../sync/index.js'\nimport type { DocsSyncConflict } from './docsConflicts.js'\nimport type { ExistingPayloadDocsRecord } from './existingDocs.js'\n\nimport { findDocsSyncConflicts } from './docsConflicts.js'\nimport { buildArchiveData, buildDocsData } from './docsData.js'\n\nexport type ApplyDocsSyncPayloadOperations = {\n create: (args: {\n collection: string\n data: Record<string, unknown>\n draft?: boolean\n overrideAccess?: boolean\n }) => Promise<Record<string, unknown>>\n delete?: (args: {\n collection: string\n id: string\n overrideAccess?: boolean\n }) => Promise<Record<string, unknown>>\n update: (args: {\n collection: string\n data: Record<string, unknown>\n draft?: boolean\n id: string\n overrideAccess?: boolean\n }) => Promise<Record<string, unknown>>\n}\n\nexport type ApplyDocsSyncResult =\n | {\n conflicts: DocsSyncConflict[]\n ok: false\n }\n | {\n ok: true\n writes: {\n archive: number\n create: number\n delete: number\n draft: number\n reactivate: number\n update: number\n }\n }\n\nexport const assertApplyDeleteBehaviorSupported = (\n deleteBehavior: DocsDeleteBehavior,\n {\n allowHardDelete = false,\n docsEnableDrafts = false,\n }: {\n allowHardDelete?: boolean\n docsEnableDrafts?: boolean\n } = {},\n): boolean => {\n if (deleteBehavior === 'archive' || deleteBehavior === 'ignore') {\n return true\n }\n\n if (deleteBehavior === 'draft') {\n return docsEnableDrafts\n }\n\n return allowHardDelete\n}\n\nconst getDocsWriteDraftOption = ({\n docsEnableDrafts,\n publish,\n}: {\n docsEnableDrafts: boolean\n publish: boolean\n}): { draft?: boolean } => (docsEnableDrafts ? { draft: !publish } : {})\n\nexport const applyDocsSync = async ({\n collectionSlug,\n deleteBehavior,\n docsEnableDrafts,\n docsSetId,\n existing,\n manifest,\n markdownFieldName,\n now,\n payload,\n plan,\n publish,\n syncRunId,\n}: {\n collectionSlug: string\n deleteBehavior: DocsDeleteBehavior\n docsEnableDrafts: boolean\n docsSetId?: number | string\n existing: ExistingPayloadDocsRecord[]\n manifest: ValidatedDocsManifest\n markdownFieldName: string\n now: Date\n payload: ApplyDocsSyncPayloadOperations\n plan: DocsSyncPlan\n publish: boolean\n syncRunId?: number | string\n}): Promise<ApplyDocsSyncResult> => {\n const existingBySourcePath = new Map(existing.map((record) => [record.sourcePath, record]))\n const reactivations = plan.unchanged.filter((change) => change.current?.archived)\n const conflicts = findDocsSyncConflicts({\n existingBySourcePath,\n plannedChanges: [\n ...plan.update,\n ...plan.archive,\n ...plan.draft,\n ...plan.delete,\n ...reactivations,\n ],\n })\n\n if (conflicts.length > 0) {\n return {\n conflicts,\n ok: false,\n }\n }\n\n const writes = {\n archive: 0,\n create: 0,\n delete: 0,\n draft: 0,\n reactivate: 0,\n update: 0,\n }\n const writeDraftOption = getDocsWriteDraftOption({\n docsEnableDrafts,\n publish,\n })\n\n for (const change of plan.create) {\n if (!change.desired) {\n continue\n }\n\n await payload.create({\n collection: collectionSlug,\n data: buildDocsData({\n desired: change.desired,\n docsEnableDrafts,\n docsSetId,\n manifest,\n markdownFieldName,\n now,\n publish,\n syncRunId,\n }),\n ...writeDraftOption,\n overrideAccess: true,\n })\n writes.create += 1\n }\n\n for (const change of plan.update) {\n if (!change.desired) {\n continue\n }\n\n const current = existingBySourcePath.get(change.sourcePath)\n\n if (!current) {\n continue\n }\n\n await payload.update({\n id: current.id,\n collection: collectionSlug,\n data: buildDocsData({\n desired: change.desired,\n docsEnableDrafts,\n docsSetId,\n manifest,\n markdownFieldName,\n now,\n publish,\n syncRunId,\n }),\n ...writeDraftOption,\n overrideAccess: true,\n })\n writes.update += 1\n }\n\n for (const change of reactivations) {\n if (!change.desired) {\n continue\n }\n\n const current = existingBySourcePath.get(change.sourcePath)\n\n if (!current) {\n continue\n }\n\n await payload.update({\n id: current.id,\n collection: collectionSlug,\n data: buildDocsData({\n desired: change.desired,\n docsEnableDrafts,\n docsSetId,\n manifest,\n markdownFieldName,\n now,\n publish,\n syncRunId,\n }),\n ...writeDraftOption,\n overrideAccess: true,\n })\n writes.reactivate += 1\n }\n\n if (deleteBehavior === 'archive') {\n for (const change of plan.archive) {\n const current = existingBySourcePath.get(change.sourcePath)\n\n if (!current) {\n continue\n }\n\n await payload.update({\n id: current.id,\n collection: collectionSlug,\n data: buildArchiveData({\n docsEnableDrafts,\n now,\n syncRunId,\n }),\n ...writeDraftOption,\n overrideAccess: true,\n })\n writes.archive += 1\n }\n }\n\n if (deleteBehavior === 'draft') {\n for (const change of plan.draft) {\n const current = existingBySourcePath.get(change.sourcePath)\n\n if (!current) {\n continue\n }\n\n await payload.update({\n id: current.id,\n collection: collectionSlug,\n data: buildArchiveData({\n docsEnableDrafts,\n draftMissing: true,\n now,\n syncRunId,\n }),\n ...(docsEnableDrafts ? { draft: true } : {}),\n overrideAccess: true,\n })\n writes.draft += 1\n }\n }\n\n if (deleteBehavior === 'delete') {\n if (!payload.delete) {\n throw new Error('Payload delete operation is required for hard delete.')\n }\n\n for (const change of plan.delete) {\n const current = existingBySourcePath.get(change.sourcePath)\n\n if (!current) {\n continue\n }\n\n await payload.delete({\n id: current.id,\n collection: collectionSlug,\n overrideAccess: true,\n })\n writes.delete += 1\n }\n }\n\n return {\n ok: true,\n writes,\n }\n}\n"],"names":["findDocsSyncConflicts","buildArchiveData","buildDocsData","assertApplyDeleteBehaviorSupported","deleteBehavior","allowHardDelete","docsEnableDrafts","getDocsWriteDraftOption","publish","draft","applyDocsSync","collectionSlug","docsSetId","existing","manifest","markdownFieldName","now","payload","plan","syncRunId","existingBySourcePath","Map","map","record","sourcePath","reactivations","unchanged","filter","change","current","archived","conflicts","plannedChanges","update","archive","delete","length","ok","writes","create","reactivate","writeDraftOption","desired","collection","data","overrideAccess","get","id","draftMissing","Error"],"mappings":"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"}