@valkyrianlabs/payload-markdown-docs 0.4.3 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/dist/admin/DocsSetManager.js +7 -40
  2. package/dist/admin/DocsSetManager.js.map +1 -1
  3. package/dist/cli/commands/push.js.map +1 -1
  4. package/dist/cli/format.d.ts +1 -3
  5. package/dist/cli/format.js +1 -2
  6. package/dist/cli/format.js.map +1 -1
  7. package/dist/collections/docs.js +18 -0
  8. package/dist/collections/docs.js.map +1 -1
  9. package/dist/collections/docsSets.d.ts +1 -3
  10. package/dist/collections/docsSets.js +17 -10
  11. package/dist/collections/docsSets.js.map +1 -1
  12. package/dist/collections/syncRuns.js +0 -9
  13. package/dist/collections/syncRuns.js.map +1 -1
  14. package/dist/endpoints/index.d.ts +0 -2
  15. package/dist/endpoints/index.js +0 -1
  16. package/dist/endpoints/index.js.map +1 -1
  17. package/dist/endpoints/sync.d.ts +0 -2
  18. package/dist/endpoints/sync.js +4 -15
  19. package/dist/endpoints/sync.js.map +1 -1
  20. package/dist/next/records.d.ts +4 -0
  21. package/dist/next/records.js +7 -0
  22. package/dist/next/records.js.map +1 -1
  23. package/dist/next/route.js +34 -13
  24. package/dist/next/route.js.map +1 -1
  25. package/dist/next/types.d.ts +1 -0
  26. package/dist/next/types.js.map +1 -1
  27. package/dist/payload/applyDocsSync.d.ts +2 -3
  28. package/dist/payload/applyDocsSync.js +4 -6
  29. package/dist/payload/applyDocsSync.js.map +1 -1
  30. package/dist/payload/docsConflicts.js +12 -1
  31. package/dist/payload/docsConflicts.js.map +1 -1
  32. package/dist/payload/docsData.d.ts +2 -5
  33. package/dist/payload/docsData.js +6 -8
  34. package/dist/payload/docsData.js.map +1 -1
  35. package/dist/payload/existingDocs.d.ts +1 -0
  36. package/dist/payload/existingDocs.js +1 -0
  37. package/dist/payload/existingDocs.js.map +1 -1
  38. package/dist/payload/index.d.ts +11 -11
  39. package/dist/payload/index.js.map +1 -1
  40. package/dist/payload/populatePublishedAt.d.ts +2 -0
  41. package/dist/payload/populatePublishedAt.js +14 -0
  42. package/dist/payload/populatePublishedAt.js.map +1 -0
  43. package/dist/payload/syncRuns.d.ts +1 -2
  44. package/dist/payload/syncRuns.js +1 -2
  45. package/dist/payload/syncRuns.js.map +1 -1
  46. package/dist/plugin.js +0 -3
  47. package/dist/plugin.js.map +1 -1
  48. package/dist/skills/codex/reference/admin.md +0 -1
  49. package/dist/types.d.ts +0 -1
  50. package/dist/types.js.map +1 -1
  51. package/package.json +1 -1
  52. package/dist/endpoints/publishGeneratedDocs.d.ts +0 -6
  53. package/dist/endpoints/publishGeneratedDocs.js +0 -76
  54. package/dist/endpoints/publishGeneratedDocs.js.map +0 -1
  55. package/dist/payload/publishGeneratedDocs.d.ts +0 -29
  56. package/dist/payload/publishGeneratedDocs.js +0 -78
  57. package/dist/payload/publishGeneratedDocs.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/payload/syncRuns.ts"],"sourcesContent":["import type {\n DocsDeleteBehavior,\n DocsSyncMode,\n DocsValidationIssue,\n} from '../sync/index.js'\n\nexport type SyncRunStatus = 'failed' | 'pending' | 'success'\n\nexport type SyncRunSummary = {\n archive: number\n create: number\n delete: number\n draft: number\n unchanged: number\n update: number\n warnings: number\n}\n\nexport type PayloadRecordId = number | string\n\nexport type SyncRunsPayloadOperations = {\n create: (args: {\n collection: string\n data: Record<string, unknown>\n overrideAccess?: boolean\n }) => Promise<Record<string, unknown>>\n update?: (args: {\n collection: string\n data: Record<string, unknown>\n id: PayloadRecordId\n overrideAccess?: boolean\n }) => Promise<Record<string, unknown>>\n}\n\nexport type CreateSyncRunAuditInput = {\n actor?: string\n bodyHash: string\n branch?: string\n collectionSlug: string\n commit?: string\n completedAt: Date\n deleteBehavior: DocsDeleteBehavior\n effectivePublishMode?: 'draft' | 'preserve' | 'published'\n errors: DocsValidationIssue[]\n fileCount: number\n keyId: string\n mode: DocsSyncMode\n payload: SyncRunsPayloadOperations\n publishRequested: boolean\n repository?: string\n sourceId: string\n startedAt: Date\n status: SyncRunStatus\n summary: SyncRunSummary\n totalBytes: number\n warnings: DocsValidationIssue[]\n}\n\nconst issueToArrayRow = (issue: DocsValidationIssue): { message: string } => ({\n message: issue.path ? `${issue.path}: ${issue.message}` : issue.message,\n})\n\nexport const createSyncRunAudit = async ({\n actor,\n bodyHash,\n branch,\n collectionSlug,\n commit,\n completedAt,\n deleteBehavior,\n effectivePublishMode,\n errors,\n fileCount,\n keyId,\n mode,\n payload,\n publishRequested,\n repository,\n sourceId,\n startedAt,\n status,\n summary,\n totalBytes,\n warnings,\n}: CreateSyncRunAuditInput): Promise<Record<string, unknown>> =>\n payload.create({\n collection: collectionSlug,\n data: {\n actor,\n bodyHash,\n branch,\n commit,\n completedAt: completedAt.toISOString(),\n deleteBehavior,\n effectivePublishMode,\n errors: errors.map(issueToArrayRow),\n fileCount,\n keyId,\n mode,\n publishRequested,\n repository,\n sourceId,\n startedAt: startedAt.toISOString(),\n status,\n summary,\n totalBytes,\n warnings: warnings.map(issueToArrayRow),\n },\n overrideAccess: true,\n })\n\nexport const getRecordId = (\n record: Record<string, unknown>,\n): PayloadRecordId | undefined => {\n if (typeof record.id === 'string' || typeof record.id === 'number') {\n return record.id\n }\n\n return undefined\n}\n\nexport const updateSyncRunAudit = async ({\n collectionSlug,\n completedAt,\n errors,\n payload,\n status,\n summary,\n syncRunId,\n warnings,\n}: {\n collectionSlug: string\n completedAt: Date\n errors?: DocsValidationIssue[]\n payload: SyncRunsPayloadOperations\n status: SyncRunStatus\n summary?: SyncRunSummary\n syncRunId: PayloadRecordId\n warnings?: DocsValidationIssue[]\n}): Promise<Record<string, unknown> | undefined> => {\n if (!payload.update) {\n return undefined\n }\n\n return payload.update({\n id: syncRunId,\n collection: collectionSlug,\n data: {\n completedAt: completedAt.toISOString(),\n errors: errors?.map(issueToArrayRow),\n status,\n summary,\n warnings: warnings?.map(issueToArrayRow),\n },\n overrideAccess: true,\n })\n}\n"],"names":["issueToArrayRow","issue","message","path","createSyncRunAudit","actor","bodyHash","branch","collectionSlug","commit","completedAt","deleteBehavior","effectivePublishMode","errors","fileCount","keyId","mode","payload","publishRequested","repository","sourceId","startedAt","status","summary","totalBytes","warnings","create","collection","data","toISOString","map","overrideAccess","getRecordId","record","id","undefined","updateSyncRunAudit","syncRunId","update"],"mappings":"AA0DA,MAAMA,kBAAkB,CAACC,QAAqD,CAAA;QAC5EC,SAASD,MAAME,IAAI,GAAG,GAAGF,MAAME,IAAI,CAAC,EAAE,EAAEF,MAAMC,OAAO,EAAE,GAAGD,MAAMC,OAAO;IACzE,CAAA;AAEA,OAAO,MAAME,qBAAqB,OAAO,EACvCC,KAAK,EACLC,QAAQ,EACRC,MAAM,EACNC,cAAc,EACdC,MAAM,EACNC,WAAW,EACXC,cAAc,EACdC,oBAAoB,EACpBC,MAAM,EACNC,SAAS,EACTC,KAAK,EACLC,IAAI,EACJC,OAAO,EACPC,gBAAgB,EAChBC,UAAU,EACVC,QAAQ,EACRC,SAAS,EACTC,MAAM,EACNC,OAAO,EACPC,UAAU,EACVC,QAAQ,EACgB,GACxBR,QAAQS,MAAM,CAAC;QACbC,YAAYnB;QACZoB,MAAM;YACJvB;YACAC;YACAC;YACAE;YACAC,aAAaA,YAAYmB,WAAW;YACpClB;YACAC;YACAC,QAAQA,OAAOiB,GAAG,CAAC9B;YACnBc;YACAC;YACAC;YACAE;YACAC;YACAC;YACAC,WAAWA,UAAUQ,WAAW;YAChCP;YACAC;YACAC;YACAC,UAAUA,SAASK,GAAG,CAAC9B;QACzB;QACA+B,gBAAgB;IAClB,GAAE;AAEJ,OAAO,MAAMC,cAAc,CACzBC;IAEA,IAAI,OAAOA,OAAOC,EAAE,KAAK,YAAY,OAAOD,OAAOC,EAAE,KAAK,UAAU;QAClE,OAAOD,OAAOC,EAAE;IAClB;IAEA,OAAOC;AACT,EAAC;AAED,OAAO,MAAMC,qBAAqB,OAAO,EACvC5B,cAAc,EACdE,WAAW,EACXG,MAAM,EACNI,OAAO,EACPK,MAAM,EACNC,OAAO,EACPc,SAAS,EACTZ,QAAQ,EAUT;IACC,IAAI,CAACR,QAAQqB,MAAM,EAAE;QACnB,OAAOH;IACT;IAEA,OAAOlB,QAAQqB,MAAM,CAAC;QACpBJ,IAAIG;QACJV,YAAYnB;QACZoB,MAAM;YACJlB,aAAaA,YAAYmB,WAAW;YACpChB,QAAQA,QAAQiB,IAAI9B;YACpBsB;YACAC;YACAE,UAAUA,UAAUK,IAAI9B;QAC1B;QACA+B,gBAAgB;IAClB;AACF,EAAC"}
1
+ {"version":3,"sources":["../../src/payload/syncRuns.ts"],"sourcesContent":["import type { DocsDeleteBehavior, DocsSyncMode, DocsValidationIssue } from '../sync/index.js'\n\nexport type SyncRunStatus = 'failed' | 'pending' | 'success'\n\nexport type SyncRunSummary = {\n archive: number\n create: number\n delete: number\n draft: number\n unchanged: number\n update: number\n warnings: number\n}\n\nexport type PayloadRecordId = number | string\n\nexport type SyncRunsPayloadOperations = {\n create: (args: {\n collection: string\n data: Record<string, unknown>\n overrideAccess?: boolean\n }) => Promise<Record<string, unknown>>\n update?: (args: {\n collection: string\n data: Record<string, unknown>\n id: PayloadRecordId\n overrideAccess?: boolean\n }) => Promise<Record<string, unknown>>\n}\n\nexport type CreateSyncRunAuditInput = {\n actor?: string\n bodyHash: string\n branch?: string\n collectionSlug: string\n commit?: string\n completedAt: Date\n deleteBehavior: DocsDeleteBehavior\n errors: DocsValidationIssue[]\n fileCount: number\n keyId: string\n mode: DocsSyncMode\n payload: SyncRunsPayloadOperations\n publishRequested: boolean\n repository?: string\n sourceId: string\n startedAt: Date\n status: SyncRunStatus\n summary: SyncRunSummary\n totalBytes: number\n warnings: DocsValidationIssue[]\n}\n\nconst issueToArrayRow = (issue: DocsValidationIssue): { message: string } => ({\n message: issue.path ? `${issue.path}: ${issue.message}` : issue.message,\n})\n\nexport const createSyncRunAudit = async ({\n actor,\n bodyHash,\n branch,\n collectionSlug,\n commit,\n completedAt,\n deleteBehavior,\n errors,\n fileCount,\n keyId,\n mode,\n payload,\n publishRequested,\n repository,\n sourceId,\n startedAt,\n status,\n summary,\n totalBytes,\n warnings,\n}: CreateSyncRunAuditInput): Promise<Record<string, unknown>> =>\n payload.create({\n collection: collectionSlug,\n data: {\n actor,\n bodyHash,\n branch,\n commit,\n completedAt: completedAt.toISOString(),\n deleteBehavior,\n errors: errors.map(issueToArrayRow),\n fileCount,\n keyId,\n mode,\n publishRequested,\n repository,\n sourceId,\n startedAt: startedAt.toISOString(),\n status,\n summary,\n totalBytes,\n warnings: warnings.map(issueToArrayRow),\n },\n overrideAccess: true,\n })\n\nexport const getRecordId = (record: Record<string, unknown>): PayloadRecordId | undefined => {\n if (typeof record.id === 'string' || typeof record.id === 'number') {\n return record.id\n }\n\n return undefined\n}\n\nexport const updateSyncRunAudit = async ({\n collectionSlug,\n completedAt,\n errors,\n payload,\n status,\n summary,\n syncRunId,\n warnings,\n}: {\n collectionSlug: string\n completedAt: Date\n errors?: DocsValidationIssue[]\n payload: SyncRunsPayloadOperations\n status: SyncRunStatus\n summary?: SyncRunSummary\n syncRunId: PayloadRecordId\n warnings?: DocsValidationIssue[]\n}): Promise<Record<string, unknown> | undefined> => {\n if (!payload.update) {\n return undefined\n }\n\n return payload.update({\n id: syncRunId,\n collection: collectionSlug,\n data: {\n completedAt: completedAt.toISOString(),\n errors: errors?.map(issueToArrayRow),\n status,\n summary,\n warnings: warnings?.map(issueToArrayRow),\n },\n overrideAccess: true,\n })\n}\n"],"names":["issueToArrayRow","issue","message","path","createSyncRunAudit","actor","bodyHash","branch","collectionSlug","commit","completedAt","deleteBehavior","errors","fileCount","keyId","mode","payload","publishRequested","repository","sourceId","startedAt","status","summary","totalBytes","warnings","create","collection","data","toISOString","map","overrideAccess","getRecordId","record","id","undefined","updateSyncRunAudit","syncRunId","update"],"mappings":"AAqDA,MAAMA,kBAAkB,CAACC,QAAqD,CAAA;QAC5EC,SAASD,MAAME,IAAI,GAAG,GAAGF,MAAME,IAAI,CAAC,EAAE,EAAEF,MAAMC,OAAO,EAAE,GAAGD,MAAMC,OAAO;IACzE,CAAA;AAEA,OAAO,MAAME,qBAAqB,OAAO,EACvCC,KAAK,EACLC,QAAQ,EACRC,MAAM,EACNC,cAAc,EACdC,MAAM,EACNC,WAAW,EACXC,cAAc,EACdC,MAAM,EACNC,SAAS,EACTC,KAAK,EACLC,IAAI,EACJC,OAAO,EACPC,gBAAgB,EAChBC,UAAU,EACVC,QAAQ,EACRC,SAAS,EACTC,MAAM,EACNC,OAAO,EACPC,UAAU,EACVC,QAAQ,EACgB,GACxBR,QAAQS,MAAM,CAAC;QACbC,YAAYlB;QACZmB,MAAM;YACJtB;YACAC;YACAC;YACAE;YACAC,aAAaA,YAAYkB,WAAW;YACpCjB;YACAC,QAAQA,OAAOiB,GAAG,CAAC7B;YACnBa;YACAC;YACAC;YACAE;YACAC;YACAC;YACAC,WAAWA,UAAUQ,WAAW;YAChCP;YACAC;YACAC;YACAC,UAAUA,SAASK,GAAG,CAAC7B;QACzB;QACA8B,gBAAgB;IAClB,GAAE;AAEJ,OAAO,MAAMC,cAAc,CAACC;IAC1B,IAAI,OAAOA,OAAOC,EAAE,KAAK,YAAY,OAAOD,OAAOC,EAAE,KAAK,UAAU;QAClE,OAAOD,OAAOC,EAAE;IAClB;IAEA,OAAOC;AACT,EAAC;AAED,OAAO,MAAMC,qBAAqB,OAAO,EACvC3B,cAAc,EACdE,WAAW,EACXE,MAAM,EACNI,OAAO,EACPK,MAAM,EACNC,OAAO,EACPc,SAAS,EACTZ,QAAQ,EAUT;IACC,IAAI,CAACR,QAAQqB,MAAM,EAAE;QACnB,OAAOH;IACT;IAEA,OAAOlB,QAAQqB,MAAM,CAAC;QACpBJ,IAAIG;QACJV,YAAYlB;QACZmB,MAAM;YACJjB,aAAaA,YAAYkB,WAAW;YACpChB,QAAQA,QAAQiB,IAAI7B;YACpBqB;YACAC;YACAE,UAAUA,UAAUK,IAAI7B;QAC1B;QACA8B,gBAAgB;IAClB;AACF,EAAC"}
package/dist/plugin.js CHANGED
@@ -120,9 +120,7 @@ export const payloadMarkdownDocs = (pluginOptions = {})=>(incomingConfig)=>{
120
120
  ...docsSetsEnabled ? [
121
121
  createDocsSetsCollection({
122
122
  slug: docsSetsCollectionSlug,
123
- allowPublish: pluginOptions.sync?.allowPublish === true,
124
123
  docsCollectionSlug: docsEnabled ? docsCollectionSlug : undefined,
125
- docsEnableDrafts: enableDrafts,
126
124
  docsGroupsCollectionSlug,
127
125
  syncRunsCollectionSlug: syncRunsEnabled ? syncRunsCollectionSlug : undefined
128
126
  })
@@ -172,7 +170,6 @@ export const payloadMarkdownDocs = (pluginOptions = {})=>(incomingConfig)=>{
172
170
  allowPublish: pluginOptions.sync?.allowPublish,
173
171
  allowWrites: pluginOptions.sync?.allowWrites,
174
172
  auth: pluginOptions.auth,
175
- defaultPublishMode: pluginOptions.sync?.defaultPublishMode,
176
173
  deleteBehavior: pluginOptions.sync?.deleteBehavior,
177
174
  docsCollectionSlug,
178
175
  docsEnabled,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/plugin.ts"],"sourcesContent":["import type { Config, Plugin } from 'payload'\n\nimport type { PayloadMarkdownDocsConfig } from './types.js'\n\nimport {\n createDocsCollection,\n createDocsGroupsCollection,\n createDocsKeysCollection,\n createDocsSetsCollection,\n createDocsTrustedCollection,\n createNoncesCollection,\n createSyncRunsCollection,\n} from './collections/index.js'\nimport {\n DEFAULT_DOCS_COLLECTION_SLUG,\n DEFAULT_DOCS_GROUPS_COLLECTION_SLUG,\n DEFAULT_DOCS_KEYS_COLLECTION_SLUG,\n DEFAULT_DOCS_SETS_COLLECTION_SLUG,\n DEFAULT_DOCS_SYNC_ENDPOINT_PATH,\n DEFAULT_DOCS_SYNC_NONCES_COLLECTION_SLUG,\n DEFAULT_DOCS_SYNC_RUNS_COLLECTION_SLUG,\n DEFAULT_DOCS_TRUSTED_COLLECTION_SLUG,\n DEFAULT_MARKDOWN_FIELD_NAME,\n DEFAULT_MAX_BODY_BYTES,\n DEFAULT_MEDIA_COLLECTION_SLUG,\n DEFAULT_PAGES_BRIDGE_FIELD,\n DEFAULT_PAGES_COLLECTION_SLUG,\n DEFAULT_PAGES_ROUTE_FIELD,\n} from './constants.js'\nimport { createSyncEndpoint } from './endpoints/index.js'\n\ntype ResolvedCollectionOptions = {\n docsCollectionSlug: string\n docsEnabled: boolean\n docsGroupsCollectionSlug: string\n docsGroupsEnabled: boolean\n docsKeysCollectionSlug: string\n docsKeysEnabled: boolean\n docsSetsCollectionSlug: string\n docsSetsEnabled: boolean\n docsTrustedCollectionSlug: string\n docsTrustedEnabled: boolean\n enableDrafts: boolean\n heroImageMediaCollectionSlugs?: string[]\n markdownFieldName: string\n noncesCollectionSlug: string\n noncesEnabled: boolean\n syncRunsCollectionSlug: string\n syncRunsEnabled: boolean\n}\n\nconst normalizeEndpointPath = (path: string): string => {\n const normalized = `/${path.trim()}`.replace(/\\/+/g, '/')\n\n return normalized.length > 1 ? normalized.replace(/\\/+$/g, '') : normalized\n}\n\nconst resolveHeroImageMediaCollectionSlugs = (\n pluginOptions: PayloadMarkdownDocsConfig,\n): string[] | undefined => {\n if (pluginOptions.target?.heroImage === false) {\n return undefined\n }\n\n const additionalMediaCollections =\n typeof pluginOptions.target?.heroImage === 'object'\n ? (pluginOptions.target.heroImage.additionalMediaCollections ?? [])\n : []\n\n return [\n ...new Set([\n DEFAULT_MEDIA_COLLECTION_SLUG,\n ...additionalMediaCollections.map((slug) => slug.trim()).filter(Boolean),\n ]),\n ]\n}\n\nconst resolveCollectionOptions = (\n pluginOptions: PayloadMarkdownDocsConfig,\n): ResolvedCollectionOptions => {\n if (pluginOptions.target?.type !== undefined && pluginOptions.target.type !== 'docsCollection') {\n throw new Error(\n 'payloadMarkdownDocs: target.type only supports \"docsCollection\". existingCollection is not supported.',\n )\n }\n\n const docsSlugFromTarget = pluginOptions.target?.slug\n const docsSlugFromCollections = pluginOptions.collections?.docs?.slug\n\n if (\n docsSlugFromTarget &&\n docsSlugFromCollections &&\n docsSlugFromTarget !== docsSlugFromCollections\n ) {\n throw new Error(\n 'payloadMarkdownDocs: target.slug and collections.docs.slug must match when both are provided.',\n )\n }\n\n return {\n docsCollectionSlug:\n docsSlugFromTarget ?? docsSlugFromCollections ?? DEFAULT_DOCS_COLLECTION_SLUG,\n docsEnabled: pluginOptions.collections?.docs?.enabled !== false,\n docsGroupsCollectionSlug:\n pluginOptions.collections?.docsGroups?.slug ?? DEFAULT_DOCS_GROUPS_COLLECTION_SLUG,\n docsGroupsEnabled: pluginOptions.collections?.docsGroups?.enabled !== false,\n docsKeysCollectionSlug:\n pluginOptions.collections?.docsKeys?.slug ?? DEFAULT_DOCS_KEYS_COLLECTION_SLUG,\n docsKeysEnabled: pluginOptions.collections?.docsKeys?.enabled !== false,\n docsSetsCollectionSlug:\n pluginOptions.collections?.docsSets?.slug ?? DEFAULT_DOCS_SETS_COLLECTION_SLUG,\n docsSetsEnabled: pluginOptions.collections?.docsSets?.enabled !== false,\n docsTrustedCollectionSlug:\n pluginOptions.collections?.docsTrusted?.slug ?? DEFAULT_DOCS_TRUSTED_COLLECTION_SLUG,\n docsTrustedEnabled: pluginOptions.collections?.docsTrusted?.enabled !== false,\n enableDrafts: pluginOptions.target?.enableDrafts === true,\n heroImageMediaCollectionSlugs: resolveHeroImageMediaCollectionSlugs(pluginOptions),\n markdownFieldName: pluginOptions.target?.markdownField ?? DEFAULT_MARKDOWN_FIELD_NAME,\n noncesCollectionSlug:\n pluginOptions.collections?.nonces?.slug ?? DEFAULT_DOCS_SYNC_NONCES_COLLECTION_SLUG,\n noncesEnabled: pluginOptions.collections?.nonces?.enabled !== false,\n syncRunsCollectionSlug:\n pluginOptions.collections?.syncRuns?.slug ?? DEFAULT_DOCS_SYNC_RUNS_COLLECTION_SLUG,\n syncRunsEnabled: pluginOptions.collections?.syncRuns?.enabled !== false,\n }\n}\n\nconst assertCollectionOptionCompatibility = ({\n docsGroupsEnabled,\n docsSetsEnabled,\n}: ResolvedCollectionOptions) => {\n if (docsSetsEnabled && !docsGroupsEnabled) {\n throw new Error(\n 'payloadMarkdownDocs: collections.docsSets requires collections.docsGroups to be enabled.',\n )\n }\n}\n\nconst assertNoCollectionSlugConflicts = (\n incomingConfig: Config,\n collectionSlugsToAdd: string[],\n) => {\n const duplicateRequestedSlug = collectionSlugsToAdd.find(\n (slug, index) => collectionSlugsToAdd.indexOf(slug) !== index,\n )\n\n if (duplicateRequestedSlug) {\n throw new Error(\n `payloadMarkdownDocs: collection slug \"${duplicateRequestedSlug}\" is configured more than once.`,\n )\n }\n\n const existingCollectionSlugs = new Set(\n incomingConfig.collections?.map((collection) => collection.slug) ?? [],\n )\n\n const conflictingSlug = collectionSlugsToAdd.find((slug) => existingCollectionSlugs.has(slug))\n\n if (conflictingSlug) {\n throw new Error(\n `payloadMarkdownDocs: collection slug \"${conflictingSlug}\" already exists in the Payload config.`,\n )\n }\n}\n\nexport const payloadMarkdownDocs =\n (pluginOptions: PayloadMarkdownDocsConfig = {}): Plugin =>\n (incomingConfig: Config): Config => {\n if (pluginOptions.enabled === false) {\n return incomingConfig\n }\n\n const {\n docsCollectionSlug,\n docsEnabled,\n docsGroupsCollectionSlug,\n docsGroupsEnabled,\n docsKeysCollectionSlug,\n docsKeysEnabled,\n docsSetsCollectionSlug,\n docsSetsEnabled,\n docsTrustedCollectionSlug,\n docsTrustedEnabled,\n enableDrafts,\n heroImageMediaCollectionSlugs,\n markdownFieldName,\n noncesCollectionSlug,\n noncesEnabled,\n syncRunsCollectionSlug,\n syncRunsEnabled,\n } = resolveCollectionOptions(pluginOptions)\n assertCollectionOptionCompatibility({\n docsCollectionSlug,\n docsEnabled,\n docsGroupsCollectionSlug,\n docsGroupsEnabled,\n docsKeysCollectionSlug,\n docsKeysEnabled,\n docsSetsCollectionSlug,\n docsSetsEnabled,\n docsTrustedCollectionSlug,\n docsTrustedEnabled,\n enableDrafts,\n heroImageMediaCollectionSlugs,\n markdownFieldName,\n noncesCollectionSlug,\n noncesEnabled,\n syncRunsCollectionSlug,\n syncRunsEnabled,\n })\n const endpointPath = normalizeEndpointPath(\n pluginOptions.endpoint?.path ?? DEFAULT_DOCS_SYNC_ENDPOINT_PATH,\n )\n\n const collectionSlugsToAdd = [\n ...(docsGroupsEnabled ? [docsGroupsCollectionSlug] : []),\n ...(docsSetsEnabled ? [docsSetsCollectionSlug] : []),\n ...(docsKeysEnabled ? [docsKeysCollectionSlug] : []),\n ...(docsTrustedEnabled ? [docsTrustedCollectionSlug] : []),\n ...(docsEnabled ? [docsCollectionSlug] : []),\n ...(syncRunsEnabled ? [syncRunsCollectionSlug] : []),\n ...(noncesEnabled ? [noncesCollectionSlug] : []),\n ]\n\n assertNoCollectionSlugConflicts(incomingConfig, collectionSlugsToAdd)\n\n const addedCollections = [\n ...(docsGroupsEnabled\n ? [\n createDocsGroupsCollection({\n slug: docsGroupsCollectionSlug,\n }),\n ]\n : []),\n ...(docsSetsEnabled\n ? [\n createDocsSetsCollection({\n slug: docsSetsCollectionSlug,\n allowPublish: pluginOptions.sync?.allowPublish === true,\n docsCollectionSlug: docsEnabled ? docsCollectionSlug : undefined,\n docsEnableDrafts: enableDrafts,\n docsGroupsCollectionSlug,\n syncRunsCollectionSlug: syncRunsEnabled ? syncRunsCollectionSlug : undefined,\n }),\n ]\n : []),\n ...(docsKeysEnabled\n ? [\n createDocsKeysCollection({\n slug: docsKeysCollectionSlug,\n }),\n ]\n : []),\n ...(docsTrustedEnabled\n ? [\n createDocsTrustedCollection({\n slug: docsTrustedCollectionSlug,\n }),\n ]\n : []),\n ...(docsEnabled\n ? [\n createDocsCollection({\n slug: docsCollectionSlug,\n docsSetsCollectionSlug: docsSetsEnabled ? docsSetsCollectionSlug : undefined,\n enableDrafts,\n heroImageMediaCollectionSlugs,\n markdownFieldName,\n syncRunsCollectionSlug: syncRunsEnabled ? syncRunsCollectionSlug : undefined,\n }),\n ]\n : []),\n ...(syncRunsEnabled\n ? [\n createSyncRunsCollection({\n slug: syncRunsCollectionSlug,\n }),\n ]\n : []),\n ...(noncesEnabled\n ? [\n createNoncesCollection({\n slug: noncesCollectionSlug,\n syncRunsCollectionSlug: syncRunsEnabled ? syncRunsCollectionSlug : undefined,\n }),\n ]\n : []),\n ]\n\n return {\n ...incomingConfig,\n collections: [...(incomingConfig.collections ?? []), ...addedCollections],\n endpoints: [\n ...(incomingConfig.endpoints ?? []),\n createSyncEndpoint({\n allowHardDelete: pluginOptions.sync?.allowHardDelete,\n allowPublish: pluginOptions.sync?.allowPublish,\n allowWrites: pluginOptions.sync?.allowWrites,\n auth: pluginOptions.auth,\n defaultPublishMode: pluginOptions.sync?.defaultPublishMode,\n deleteBehavior: pluginOptions.sync?.deleteBehavior,\n docsCollectionSlug,\n docsEnabled,\n docsEnableDrafts: enableDrafts,\n docsGroupsCollectionSlug,\n docsKeysCollectionSlug,\n docsKeysEnabled,\n docsSetsCollectionSlug,\n docsSetsEnabled,\n docsTrustedCollectionSlug,\n docsTrustedEnabled,\n endpointPath,\n markdownFieldName,\n maxBodyBytes: pluginOptions.endpoint?.maxBodyBytes ?? DEFAULT_MAX_BODY_BYTES,\n noncesCollectionSlug,\n noncesEnabled,\n requireDryRunBeforeApply: pluginOptions.sync?.requireDryRunBeforeApply,\n routing: {\n pages: {\n allowBridgePages: pluginOptions.routing?.pages?.allowBridgePages ?? true,\n bridgeField: pluginOptions.routing?.pages?.bridgeField ?? DEFAULT_PAGES_BRIDGE_FIELD,\n collection: pluginOptions.routing?.pages?.collection ?? DEFAULT_PAGES_COLLECTION_SLUG,\n enabled: pluginOptions.routing?.pages?.enabled === true,\n routeField: pluginOptions.routing?.pages?.routeField ?? DEFAULT_PAGES_ROUTE_FIELD,\n },\n },\n syncRunsCollectionSlug,\n syncRunsEnabled,\n }),\n ],\n }\n }\n"],"names":["createDocsCollection","createDocsGroupsCollection","createDocsKeysCollection","createDocsSetsCollection","createDocsTrustedCollection","createNoncesCollection","createSyncRunsCollection","DEFAULT_DOCS_COLLECTION_SLUG","DEFAULT_DOCS_GROUPS_COLLECTION_SLUG","DEFAULT_DOCS_KEYS_COLLECTION_SLUG","DEFAULT_DOCS_SETS_COLLECTION_SLUG","DEFAULT_DOCS_SYNC_ENDPOINT_PATH","DEFAULT_DOCS_SYNC_NONCES_COLLECTION_SLUG","DEFAULT_DOCS_SYNC_RUNS_COLLECTION_SLUG","DEFAULT_DOCS_TRUSTED_COLLECTION_SLUG","DEFAULT_MARKDOWN_FIELD_NAME","DEFAULT_MAX_BODY_BYTES","DEFAULT_MEDIA_COLLECTION_SLUG","DEFAULT_PAGES_BRIDGE_FIELD","DEFAULT_PAGES_COLLECTION_SLUG","DEFAULT_PAGES_ROUTE_FIELD","createSyncEndpoint","normalizeEndpointPath","path","normalized","trim","replace","length","resolveHeroImageMediaCollectionSlugs","pluginOptions","target","heroImage","undefined","additionalMediaCollections","Set","map","slug","filter","Boolean","resolveCollectionOptions","type","Error","docsSlugFromTarget","docsSlugFromCollections","collections","docs","docsCollectionSlug","docsEnabled","enabled","docsGroupsCollectionSlug","docsGroups","docsGroupsEnabled","docsKeysCollectionSlug","docsKeys","docsKeysEnabled","docsSetsCollectionSlug","docsSets","docsSetsEnabled","docsTrustedCollectionSlug","docsTrusted","docsTrustedEnabled","enableDrafts","heroImageMediaCollectionSlugs","markdownFieldName","markdownField","noncesCollectionSlug","nonces","noncesEnabled","syncRunsCollectionSlug","syncRuns","syncRunsEnabled","assertCollectionOptionCompatibility","assertNoCollectionSlugConflicts","incomingConfig","collectionSlugsToAdd","duplicateRequestedSlug","find","index","indexOf","existingCollectionSlugs","collection","conflictingSlug","has","payloadMarkdownDocs","endpointPath","endpoint","addedCollections","allowPublish","sync","docsEnableDrafts","endpoints","allowHardDelete","allowWrites","auth","defaultPublishMode","deleteBehavior","maxBodyBytes","requireDryRunBeforeApply","routing","pages","allowBridgePages","bridgeField","routeField"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/plugin.ts"],"sourcesContent":["import type { Config, Plugin } from 'payload'\n\nimport type { PayloadMarkdownDocsConfig } from './types.js'\n\nimport {\n createDocsCollection,\n createDocsGroupsCollection,\n createDocsKeysCollection,\n createDocsSetsCollection,\n createDocsTrustedCollection,\n createNoncesCollection,\n createSyncRunsCollection,\n} from './collections/index.js'\nimport {\n DEFAULT_DOCS_COLLECTION_SLUG,\n DEFAULT_DOCS_GROUPS_COLLECTION_SLUG,\n DEFAULT_DOCS_KEYS_COLLECTION_SLUG,\n DEFAULT_DOCS_SETS_COLLECTION_SLUG,\n DEFAULT_DOCS_SYNC_ENDPOINT_PATH,\n DEFAULT_DOCS_SYNC_NONCES_COLLECTION_SLUG,\n DEFAULT_DOCS_SYNC_RUNS_COLLECTION_SLUG,\n DEFAULT_DOCS_TRUSTED_COLLECTION_SLUG,\n DEFAULT_MARKDOWN_FIELD_NAME,\n DEFAULT_MAX_BODY_BYTES,\n DEFAULT_MEDIA_COLLECTION_SLUG,\n DEFAULT_PAGES_BRIDGE_FIELD,\n DEFAULT_PAGES_COLLECTION_SLUG,\n DEFAULT_PAGES_ROUTE_FIELD,\n} from './constants.js'\nimport { createSyncEndpoint } from './endpoints/index.js'\n\ntype ResolvedCollectionOptions = {\n docsCollectionSlug: string\n docsEnabled: boolean\n docsGroupsCollectionSlug: string\n docsGroupsEnabled: boolean\n docsKeysCollectionSlug: string\n docsKeysEnabled: boolean\n docsSetsCollectionSlug: string\n docsSetsEnabled: boolean\n docsTrustedCollectionSlug: string\n docsTrustedEnabled: boolean\n enableDrafts: boolean\n heroImageMediaCollectionSlugs?: string[]\n markdownFieldName: string\n noncesCollectionSlug: string\n noncesEnabled: boolean\n syncRunsCollectionSlug: string\n syncRunsEnabled: boolean\n}\n\nconst normalizeEndpointPath = (path: string): string => {\n const normalized = `/${path.trim()}`.replace(/\\/+/g, '/')\n\n return normalized.length > 1 ? normalized.replace(/\\/+$/g, '') : normalized\n}\n\nconst resolveHeroImageMediaCollectionSlugs = (\n pluginOptions: PayloadMarkdownDocsConfig,\n): string[] | undefined => {\n if (pluginOptions.target?.heroImage === false) {\n return undefined\n }\n\n const additionalMediaCollections =\n typeof pluginOptions.target?.heroImage === 'object'\n ? (pluginOptions.target.heroImage.additionalMediaCollections ?? [])\n : []\n\n return [\n ...new Set([\n DEFAULT_MEDIA_COLLECTION_SLUG,\n ...additionalMediaCollections.map((slug) => slug.trim()).filter(Boolean),\n ]),\n ]\n}\n\nconst resolveCollectionOptions = (\n pluginOptions: PayloadMarkdownDocsConfig,\n): ResolvedCollectionOptions => {\n if (pluginOptions.target?.type !== undefined && pluginOptions.target.type !== 'docsCollection') {\n throw new Error(\n 'payloadMarkdownDocs: target.type only supports \"docsCollection\". existingCollection is not supported.',\n )\n }\n\n const docsSlugFromTarget = pluginOptions.target?.slug\n const docsSlugFromCollections = pluginOptions.collections?.docs?.slug\n\n if (\n docsSlugFromTarget &&\n docsSlugFromCollections &&\n docsSlugFromTarget !== docsSlugFromCollections\n ) {\n throw new Error(\n 'payloadMarkdownDocs: target.slug and collections.docs.slug must match when both are provided.',\n )\n }\n\n return {\n docsCollectionSlug:\n docsSlugFromTarget ?? docsSlugFromCollections ?? DEFAULT_DOCS_COLLECTION_SLUG,\n docsEnabled: pluginOptions.collections?.docs?.enabled !== false,\n docsGroupsCollectionSlug:\n pluginOptions.collections?.docsGroups?.slug ?? DEFAULT_DOCS_GROUPS_COLLECTION_SLUG,\n docsGroupsEnabled: pluginOptions.collections?.docsGroups?.enabled !== false,\n docsKeysCollectionSlug:\n pluginOptions.collections?.docsKeys?.slug ?? DEFAULT_DOCS_KEYS_COLLECTION_SLUG,\n docsKeysEnabled: pluginOptions.collections?.docsKeys?.enabled !== false,\n docsSetsCollectionSlug:\n pluginOptions.collections?.docsSets?.slug ?? DEFAULT_DOCS_SETS_COLLECTION_SLUG,\n docsSetsEnabled: pluginOptions.collections?.docsSets?.enabled !== false,\n docsTrustedCollectionSlug:\n pluginOptions.collections?.docsTrusted?.slug ?? DEFAULT_DOCS_TRUSTED_COLLECTION_SLUG,\n docsTrustedEnabled: pluginOptions.collections?.docsTrusted?.enabled !== false,\n enableDrafts: pluginOptions.target?.enableDrafts === true,\n heroImageMediaCollectionSlugs: resolveHeroImageMediaCollectionSlugs(pluginOptions),\n markdownFieldName: pluginOptions.target?.markdownField ?? DEFAULT_MARKDOWN_FIELD_NAME,\n noncesCollectionSlug:\n pluginOptions.collections?.nonces?.slug ?? DEFAULT_DOCS_SYNC_NONCES_COLLECTION_SLUG,\n noncesEnabled: pluginOptions.collections?.nonces?.enabled !== false,\n syncRunsCollectionSlug:\n pluginOptions.collections?.syncRuns?.slug ?? DEFAULT_DOCS_SYNC_RUNS_COLLECTION_SLUG,\n syncRunsEnabled: pluginOptions.collections?.syncRuns?.enabled !== false,\n }\n}\n\nconst assertCollectionOptionCompatibility = ({\n docsGroupsEnabled,\n docsSetsEnabled,\n}: ResolvedCollectionOptions) => {\n if (docsSetsEnabled && !docsGroupsEnabled) {\n throw new Error(\n 'payloadMarkdownDocs: collections.docsSets requires collections.docsGroups to be enabled.',\n )\n }\n}\n\nconst assertNoCollectionSlugConflicts = (\n incomingConfig: Config,\n collectionSlugsToAdd: string[],\n) => {\n const duplicateRequestedSlug = collectionSlugsToAdd.find(\n (slug, index) => collectionSlugsToAdd.indexOf(slug) !== index,\n )\n\n if (duplicateRequestedSlug) {\n throw new Error(\n `payloadMarkdownDocs: collection slug \"${duplicateRequestedSlug}\" is configured more than once.`,\n )\n }\n\n const existingCollectionSlugs = new Set(\n incomingConfig.collections?.map((collection) => collection.slug) ?? [],\n )\n\n const conflictingSlug = collectionSlugsToAdd.find((slug) => existingCollectionSlugs.has(slug))\n\n if (conflictingSlug) {\n throw new Error(\n `payloadMarkdownDocs: collection slug \"${conflictingSlug}\" already exists in the Payload config.`,\n )\n }\n}\n\nexport const payloadMarkdownDocs =\n (pluginOptions: PayloadMarkdownDocsConfig = {}): Plugin =>\n (incomingConfig: Config): Config => {\n if (pluginOptions.enabled === false) {\n return incomingConfig\n }\n\n const {\n docsCollectionSlug,\n docsEnabled,\n docsGroupsCollectionSlug,\n docsGroupsEnabled,\n docsKeysCollectionSlug,\n docsKeysEnabled,\n docsSetsCollectionSlug,\n docsSetsEnabled,\n docsTrustedCollectionSlug,\n docsTrustedEnabled,\n enableDrafts,\n heroImageMediaCollectionSlugs,\n markdownFieldName,\n noncesCollectionSlug,\n noncesEnabled,\n syncRunsCollectionSlug,\n syncRunsEnabled,\n } = resolveCollectionOptions(pluginOptions)\n assertCollectionOptionCompatibility({\n docsCollectionSlug,\n docsEnabled,\n docsGroupsCollectionSlug,\n docsGroupsEnabled,\n docsKeysCollectionSlug,\n docsKeysEnabled,\n docsSetsCollectionSlug,\n docsSetsEnabled,\n docsTrustedCollectionSlug,\n docsTrustedEnabled,\n enableDrafts,\n heroImageMediaCollectionSlugs,\n markdownFieldName,\n noncesCollectionSlug,\n noncesEnabled,\n syncRunsCollectionSlug,\n syncRunsEnabled,\n })\n const endpointPath = normalizeEndpointPath(\n pluginOptions.endpoint?.path ?? DEFAULT_DOCS_SYNC_ENDPOINT_PATH,\n )\n\n const collectionSlugsToAdd = [\n ...(docsGroupsEnabled ? [docsGroupsCollectionSlug] : []),\n ...(docsSetsEnabled ? [docsSetsCollectionSlug] : []),\n ...(docsKeysEnabled ? [docsKeysCollectionSlug] : []),\n ...(docsTrustedEnabled ? [docsTrustedCollectionSlug] : []),\n ...(docsEnabled ? [docsCollectionSlug] : []),\n ...(syncRunsEnabled ? [syncRunsCollectionSlug] : []),\n ...(noncesEnabled ? [noncesCollectionSlug] : []),\n ]\n\n assertNoCollectionSlugConflicts(incomingConfig, collectionSlugsToAdd)\n\n const addedCollections = [\n ...(docsGroupsEnabled\n ? [\n createDocsGroupsCollection({\n slug: docsGroupsCollectionSlug,\n }),\n ]\n : []),\n ...(docsSetsEnabled\n ? [\n createDocsSetsCollection({\n slug: docsSetsCollectionSlug,\n docsCollectionSlug: docsEnabled ? docsCollectionSlug : undefined,\n docsGroupsCollectionSlug,\n syncRunsCollectionSlug: syncRunsEnabled ? syncRunsCollectionSlug : undefined,\n }),\n ]\n : []),\n ...(docsKeysEnabled\n ? [\n createDocsKeysCollection({\n slug: docsKeysCollectionSlug,\n }),\n ]\n : []),\n ...(docsTrustedEnabled\n ? [\n createDocsTrustedCollection({\n slug: docsTrustedCollectionSlug,\n }),\n ]\n : []),\n ...(docsEnabled\n ? [\n createDocsCollection({\n slug: docsCollectionSlug,\n docsSetsCollectionSlug: docsSetsEnabled ? docsSetsCollectionSlug : undefined,\n enableDrafts,\n heroImageMediaCollectionSlugs,\n markdownFieldName,\n syncRunsCollectionSlug: syncRunsEnabled ? syncRunsCollectionSlug : undefined,\n }),\n ]\n : []),\n ...(syncRunsEnabled\n ? [\n createSyncRunsCollection({\n slug: syncRunsCollectionSlug,\n }),\n ]\n : []),\n ...(noncesEnabled\n ? [\n createNoncesCollection({\n slug: noncesCollectionSlug,\n syncRunsCollectionSlug: syncRunsEnabled ? syncRunsCollectionSlug : undefined,\n }),\n ]\n : []),\n ]\n\n return {\n ...incomingConfig,\n collections: [...(incomingConfig.collections ?? []), ...addedCollections],\n endpoints: [\n ...(incomingConfig.endpoints ?? []),\n createSyncEndpoint({\n allowHardDelete: pluginOptions.sync?.allowHardDelete,\n allowPublish: pluginOptions.sync?.allowPublish,\n allowWrites: pluginOptions.sync?.allowWrites,\n auth: pluginOptions.auth,\n deleteBehavior: pluginOptions.sync?.deleteBehavior,\n docsCollectionSlug,\n docsEnabled,\n docsEnableDrafts: enableDrafts,\n docsGroupsCollectionSlug,\n docsKeysCollectionSlug,\n docsKeysEnabled,\n docsSetsCollectionSlug,\n docsSetsEnabled,\n docsTrustedCollectionSlug,\n docsTrustedEnabled,\n endpointPath,\n markdownFieldName,\n maxBodyBytes: pluginOptions.endpoint?.maxBodyBytes ?? DEFAULT_MAX_BODY_BYTES,\n noncesCollectionSlug,\n noncesEnabled,\n requireDryRunBeforeApply: pluginOptions.sync?.requireDryRunBeforeApply,\n routing: {\n pages: {\n allowBridgePages: pluginOptions.routing?.pages?.allowBridgePages ?? true,\n bridgeField: pluginOptions.routing?.pages?.bridgeField ?? DEFAULT_PAGES_BRIDGE_FIELD,\n collection: pluginOptions.routing?.pages?.collection ?? DEFAULT_PAGES_COLLECTION_SLUG,\n enabled: pluginOptions.routing?.pages?.enabled === true,\n routeField: pluginOptions.routing?.pages?.routeField ?? DEFAULT_PAGES_ROUTE_FIELD,\n },\n },\n syncRunsCollectionSlug,\n syncRunsEnabled,\n }),\n ],\n }\n }\n"],"names":["createDocsCollection","createDocsGroupsCollection","createDocsKeysCollection","createDocsSetsCollection","createDocsTrustedCollection","createNoncesCollection","createSyncRunsCollection","DEFAULT_DOCS_COLLECTION_SLUG","DEFAULT_DOCS_GROUPS_COLLECTION_SLUG","DEFAULT_DOCS_KEYS_COLLECTION_SLUG","DEFAULT_DOCS_SETS_COLLECTION_SLUG","DEFAULT_DOCS_SYNC_ENDPOINT_PATH","DEFAULT_DOCS_SYNC_NONCES_COLLECTION_SLUG","DEFAULT_DOCS_SYNC_RUNS_COLLECTION_SLUG","DEFAULT_DOCS_TRUSTED_COLLECTION_SLUG","DEFAULT_MARKDOWN_FIELD_NAME","DEFAULT_MAX_BODY_BYTES","DEFAULT_MEDIA_COLLECTION_SLUG","DEFAULT_PAGES_BRIDGE_FIELD","DEFAULT_PAGES_COLLECTION_SLUG","DEFAULT_PAGES_ROUTE_FIELD","createSyncEndpoint","normalizeEndpointPath","path","normalized","trim","replace","length","resolveHeroImageMediaCollectionSlugs","pluginOptions","target","heroImage","undefined","additionalMediaCollections","Set","map","slug","filter","Boolean","resolveCollectionOptions","type","Error","docsSlugFromTarget","docsSlugFromCollections","collections","docs","docsCollectionSlug","docsEnabled","enabled","docsGroupsCollectionSlug","docsGroups","docsGroupsEnabled","docsKeysCollectionSlug","docsKeys","docsKeysEnabled","docsSetsCollectionSlug","docsSets","docsSetsEnabled","docsTrustedCollectionSlug","docsTrusted","docsTrustedEnabled","enableDrafts","heroImageMediaCollectionSlugs","markdownFieldName","markdownField","noncesCollectionSlug","nonces","noncesEnabled","syncRunsCollectionSlug","syncRuns","syncRunsEnabled","assertCollectionOptionCompatibility","assertNoCollectionSlugConflicts","incomingConfig","collectionSlugsToAdd","duplicateRequestedSlug","find","index","indexOf","existingCollectionSlugs","collection","conflictingSlug","has","payloadMarkdownDocs","endpointPath","endpoint","addedCollections","endpoints","allowHardDelete","sync","allowPublish","allowWrites","auth","deleteBehavior","docsEnableDrafts","maxBodyBytes","requireDryRunBeforeApply","routing","pages","allowBridgePages","bridgeField","routeField"],"mappings":"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"}
@@ -14,7 +14,6 @@ It shows:
14
14
  - hero images on generated docs records
15
15
  - generated docs grouped by source path
16
16
  - links to generated docs records
17
- - a publish action for draft generated docs when draft publishing is enabled
18
17
 
19
18
  Per-doc overrides live on generated docs records:
20
19
 
package/dist/types.d.ts CHANGED
@@ -57,7 +57,6 @@ export type PayloadMarkdownDocsSyncConfig = {
57
57
  allowHardDelete?: boolean;
58
58
  allowPublish?: boolean;
59
59
  allowWrites?: boolean;
60
- defaultPublishMode?: 'draft' | 'preserve' | 'published';
61
60
  deleteBehavior?: 'archive' | 'delete' | 'draft' | 'ignore';
62
61
  requireDryRunBeforeApply?: boolean;
63
62
  };
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts"],"sourcesContent":["export type PayloadMarkdownDocsConfig = {\n auth?: PayloadMarkdownDocsAuthConfig\n collections?: PayloadMarkdownDocsCollectionsConfig\n enabled?: boolean\n endpoint?: PayloadMarkdownDocsEndpointConfig\n routing?: PayloadMarkdownDocsRoutingConfig\n sync?: PayloadMarkdownDocsSyncConfig\n target?: PayloadMarkdownDocsTargetConfig\n}\n\nexport type PayloadMarkdownDocsEndpointConfig = {\n maxBodyBytes?: number\n path?: string\n}\n\nexport type PayloadMarkdownDocsAuthConfig =\n | {\n ed25519?: boolean | PayloadMarkdownDocsAuthToggle\n githubOidc?: boolean | PayloadMarkdownDocsAuthToggle\n }\n | {\n mode: 'disabled'\n }\n\nexport type PayloadMarkdownDocsAuthToggle = {\n enabled?: boolean\n}\n\nexport type PayloadMarkdownDocsCollectionConfig = {\n enabled?: boolean\n slug?: string\n}\n\nexport type PayloadMarkdownDocsCollectionsConfig = {\n docs?: PayloadMarkdownDocsCollectionConfig\n docsGroups?: PayloadMarkdownDocsCollectionConfig\n docsKeys?: PayloadMarkdownDocsCollectionConfig\n docsSets?: PayloadMarkdownDocsCollectionConfig\n docsTrusted?: PayloadMarkdownDocsCollectionConfig\n nonces?: PayloadMarkdownDocsCollectionConfig\n syncRuns?: PayloadMarkdownDocsCollectionConfig\n}\n\nexport type PayloadMarkdownDocsPagesRoutingConfig = {\n allowBridgePages?: boolean\n bridgeField?: string\n collection?: string\n enabled?: boolean\n routeField?: string\n}\n\nexport type PayloadMarkdownDocsRoutingConfig = {\n pages?: PayloadMarkdownDocsPagesRoutingConfig\n}\n\nexport type PayloadMarkdownDocsTargetConfig = {\n enableDrafts?: boolean\n heroImage?: false | PayloadMarkdownDocsHeroImageConfig\n markdownField?: string\n slug?: string\n type?: 'docsCollection'\n}\n\nexport type PayloadMarkdownDocsHeroImageConfig = {\n additionalMediaCollections?: string[]\n}\n\nexport type PayloadMarkdownDocsSyncConfig = {\n allowHardDelete?: boolean\n allowPublish?: boolean\n allowWrites?: boolean\n defaultPublishMode?: 'draft' | 'preserve' | 'published'\n deleteBehavior?: 'archive' | 'delete' | 'draft' | 'ignore'\n requireDryRunBeforeApply?: boolean\n}\n"],"names":[],"mappings":"AAmEA,WAOC"}
1
+ {"version":3,"sources":["../src/types.ts"],"sourcesContent":["export type PayloadMarkdownDocsConfig = {\n auth?: PayloadMarkdownDocsAuthConfig\n collections?: PayloadMarkdownDocsCollectionsConfig\n enabled?: boolean\n endpoint?: PayloadMarkdownDocsEndpointConfig\n routing?: PayloadMarkdownDocsRoutingConfig\n sync?: PayloadMarkdownDocsSyncConfig\n target?: PayloadMarkdownDocsTargetConfig\n}\n\nexport type PayloadMarkdownDocsEndpointConfig = {\n maxBodyBytes?: number\n path?: string\n}\n\nexport type PayloadMarkdownDocsAuthConfig =\n | {\n ed25519?: boolean | PayloadMarkdownDocsAuthToggle\n githubOidc?: boolean | PayloadMarkdownDocsAuthToggle\n }\n | {\n mode: 'disabled'\n }\n\nexport type PayloadMarkdownDocsAuthToggle = {\n enabled?: boolean\n}\n\nexport type PayloadMarkdownDocsCollectionConfig = {\n enabled?: boolean\n slug?: string\n}\n\nexport type PayloadMarkdownDocsCollectionsConfig = {\n docs?: PayloadMarkdownDocsCollectionConfig\n docsGroups?: PayloadMarkdownDocsCollectionConfig\n docsKeys?: PayloadMarkdownDocsCollectionConfig\n docsSets?: PayloadMarkdownDocsCollectionConfig\n docsTrusted?: PayloadMarkdownDocsCollectionConfig\n nonces?: PayloadMarkdownDocsCollectionConfig\n syncRuns?: PayloadMarkdownDocsCollectionConfig\n}\n\nexport type PayloadMarkdownDocsPagesRoutingConfig = {\n allowBridgePages?: boolean\n bridgeField?: string\n collection?: string\n enabled?: boolean\n routeField?: string\n}\n\nexport type PayloadMarkdownDocsRoutingConfig = {\n pages?: PayloadMarkdownDocsPagesRoutingConfig\n}\n\nexport type PayloadMarkdownDocsTargetConfig = {\n enableDrafts?: boolean\n heroImage?: false | PayloadMarkdownDocsHeroImageConfig\n markdownField?: string\n slug?: string\n type?: 'docsCollection'\n}\n\nexport type PayloadMarkdownDocsHeroImageConfig = {\n additionalMediaCollections?: string[]\n}\n\nexport type PayloadMarkdownDocsSyncConfig = {\n allowHardDelete?: boolean\n allowPublish?: boolean\n allowWrites?: boolean\n deleteBehavior?: 'archive' | 'delete' | 'draft' | 'ignore'\n requireDryRunBeforeApply?: boolean\n}\n"],"names":[],"mappings":"AAmEA,WAMC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@valkyrianlabs/payload-markdown-docs",
3
- "version": "0.4.3",
3
+ "version": "0.5.1",
4
4
  "description": "Git-backed Markdown documentation sync for Payload CMS, powered by payload-markdown.",
5
5
  "bin": {
6
6
  "payload-markdown-docs": "./dist/cli/index.js"
@@ -1,6 +0,0 @@
1
- import type { Endpoint } from 'payload';
2
- export type CreatePublishGeneratedDocsEndpointOptions = {
3
- docsCollectionSlug: string;
4
- docsSetsCollectionSlug: string;
5
- };
6
- export declare const createPublishGeneratedDocsEndpoint: ({ docsCollectionSlug, docsSetsCollectionSlug, }: CreatePublishGeneratedDocsEndpointOptions) => Endpoint;
@@ -1,76 +0,0 @@
1
- import { publishGeneratedDocsForSet } from '../payload/publishGeneratedDocs.js';
2
- const jsonResponse = (body, status = 200)=>Response.json(body, {
3
- status
4
- });
5
- const getRouteParam = (req, key)=>{
6
- const value = req.routeParams?.[key];
7
- if (typeof value === 'string' || typeof value === 'number') {
8
- return value;
9
- }
10
- return undefined;
11
- };
12
- const getRedirectTarget = (req)=>{
13
- if (!req.url) {
14
- return undefined;
15
- }
16
- const url = new URL(req.url);
17
- const redirect = url.searchParams.get('redirect');
18
- if (!redirect || !redirect.startsWith('/') || redirect.startsWith('//')) {
19
- return undefined;
20
- }
21
- return redirect;
22
- };
23
- const redirectResponse = (location)=>new Response(null, {
24
- headers: {
25
- Location: location
26
- },
27
- status: 303
28
- });
29
- export const createPublishGeneratedDocsEndpoint = ({ docsCollectionSlug, docsSetsCollectionSlug })=>({
30
- handler: async (req)=>{
31
- if (!req.user) {
32
- return jsonResponse({
33
- error: 'Unauthorized',
34
- ok: false
35
- }, 401);
36
- }
37
- const docsSetId = getRouteParam(req, 'id');
38
- if (docsSetId === undefined) {
39
- return jsonResponse({
40
- error: 'Missing docs set id.',
41
- ok: false
42
- }, 400);
43
- }
44
- try {
45
- await req.payload.findByID({
46
- id: docsSetId,
47
- collection: docsSetsCollectionSlug,
48
- depth: 0,
49
- overrideAccess: false,
50
- user: req.user
51
- });
52
- } catch {
53
- return jsonResponse({
54
- error: 'Forbidden',
55
- ok: false
56
- }, 403);
57
- }
58
- const summary = await publishGeneratedDocsForSet({
59
- docsCollectionSlug,
60
- docsSetId,
61
- payload: req.payload
62
- });
63
- const redirect = getRedirectTarget(req);
64
- if (redirect) {
65
- return redirectResponse(redirect);
66
- }
67
- return jsonResponse({
68
- ok: true,
69
- summary
70
- });
71
- },
72
- method: 'post',
73
- path: '/:id/publish-generated-docs'
74
- });
75
-
76
- //# sourceMappingURL=publishGeneratedDocs.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/endpoints/publishGeneratedDocs.ts"],"sourcesContent":["import type { Endpoint, PayloadRequest } from 'payload'\n\nimport type { PublishGeneratedDocsPayloadOperations } from '../payload/publishGeneratedDocs.js'\n\nimport { publishGeneratedDocsForSet } from '../payload/publishGeneratedDocs.js'\n\nexport type CreatePublishGeneratedDocsEndpointOptions = {\n docsCollectionSlug: string\n docsSetsCollectionSlug: string\n}\n\ntype AccessCheckedPayload = {\n findByID: (args: Record<string, unknown>) => Promise<unknown>\n}\n\nconst jsonResponse = (body: Record<string, unknown>, status = 200): Response =>\n Response.json(body, {\n status,\n })\n\nconst getRouteParam = (req: PayloadRequest, key: string): number | string | undefined => {\n const value = req.routeParams?.[key]\n\n if (typeof value === 'string' || typeof value === 'number') {\n return value\n }\n\n return undefined\n}\n\nconst getRedirectTarget = (req: PayloadRequest): string | undefined => {\n if (!req.url) {\n return undefined\n }\n\n const url = new URL(req.url)\n const redirect = url.searchParams.get('redirect')\n\n if (!redirect || !redirect.startsWith('/') || redirect.startsWith('//')) {\n return undefined\n }\n\n return redirect\n}\n\nconst redirectResponse = (location: string): Response =>\n new Response(null, {\n headers: {\n Location: location,\n },\n status: 303,\n })\n\nexport const createPublishGeneratedDocsEndpoint = ({\n docsCollectionSlug,\n docsSetsCollectionSlug,\n}: CreatePublishGeneratedDocsEndpointOptions): Endpoint => ({\n handler: async (req) => {\n if (!req.user) {\n return jsonResponse(\n {\n error: 'Unauthorized',\n ok: false,\n },\n 401,\n )\n }\n\n const docsSetId = getRouteParam(req, 'id')\n\n if (docsSetId === undefined) {\n return jsonResponse(\n {\n error: 'Missing docs set id.',\n ok: false,\n },\n 400,\n )\n }\n\n try {\n await (req.payload as unknown as AccessCheckedPayload).findByID({\n id: docsSetId,\n collection: docsSetsCollectionSlug,\n depth: 0,\n overrideAccess: false,\n user: req.user,\n })\n } catch {\n return jsonResponse(\n {\n error: 'Forbidden',\n ok: false,\n },\n 403,\n )\n }\n\n const summary = await publishGeneratedDocsForSet({\n docsCollectionSlug,\n docsSetId,\n payload: req.payload as unknown as PublishGeneratedDocsPayloadOperations,\n })\n const redirect = getRedirectTarget(req)\n\n if (redirect) {\n return redirectResponse(redirect)\n }\n\n return jsonResponse({\n ok: true,\n summary,\n })\n },\n method: 'post',\n path: '/:id/publish-generated-docs',\n})\n"],"names":["publishGeneratedDocsForSet","jsonResponse","body","status","Response","json","getRouteParam","req","key","value","routeParams","undefined","getRedirectTarget","url","URL","redirect","searchParams","get","startsWith","redirectResponse","location","headers","Location","createPublishGeneratedDocsEndpoint","docsCollectionSlug","docsSetsCollectionSlug","handler","user","error","ok","docsSetId","payload","findByID","id","collection","depth","overrideAccess","summary","method","path"],"mappings":"AAIA,SAASA,0BAA0B,QAAQ,qCAAoC;AAW/E,MAAMC,eAAe,CAACC,MAA+BC,SAAS,GAAG,GAC/DC,SAASC,IAAI,CAACH,MAAM;QAClBC;IACF;AAEF,MAAMG,gBAAgB,CAACC,KAAqBC;IAC1C,MAAMC,QAAQF,IAAIG,WAAW,EAAE,CAACF,IAAI;IAEpC,IAAI,OAAOC,UAAU,YAAY,OAAOA,UAAU,UAAU;QAC1D,OAAOA;IACT;IAEA,OAAOE;AACT;AAEA,MAAMC,oBAAoB,CAACL;IACzB,IAAI,CAACA,IAAIM,GAAG,EAAE;QACZ,OAAOF;IACT;IAEA,MAAME,MAAM,IAAIC,IAAIP,IAAIM,GAAG;IAC3B,MAAME,WAAWF,IAAIG,YAAY,CAACC,GAAG,CAAC;IAEtC,IAAI,CAACF,YAAY,CAACA,SAASG,UAAU,CAAC,QAAQH,SAASG,UAAU,CAAC,OAAO;QACvE,OAAOP;IACT;IAEA,OAAOI;AACT;AAEA,MAAMI,mBAAmB,CAACC,WACxB,IAAIhB,SAAS,MAAM;QACjBiB,SAAS;YACPC,UAAUF;QACZ;QACAjB,QAAQ;IACV;AAEF,OAAO,MAAMoB,qCAAqC,CAAC,EACjDC,kBAAkB,EAClBC,sBAAsB,EACoB,GAAgB,CAAA;QAC1DC,SAAS,OAAOnB;YACd,IAAI,CAACA,IAAIoB,IAAI,EAAE;gBACb,OAAO1B,aACL;oBACE2B,OAAO;oBACPC,IAAI;gBACN,GACA;YAEJ;YAEA,MAAMC,YAAYxB,cAAcC,KAAK;YAErC,IAAIuB,cAAcnB,WAAW;gBAC3B,OAAOV,aACL;oBACE2B,OAAO;oBACPC,IAAI;gBACN,GACA;YAEJ;YAEA,IAAI;gBACF,MAAM,AAACtB,IAAIwB,OAAO,CAAqCC,QAAQ,CAAC;oBAC9DC,IAAIH;oBACJI,YAAYT;oBACZU,OAAO;oBACPC,gBAAgB;oBAChBT,MAAMpB,IAAIoB,IAAI;gBAChB;YACF,EAAE,OAAM;gBACN,OAAO1B,aACL;oBACE2B,OAAO;oBACPC,IAAI;gBACN,GACA;YAEJ;YAEA,MAAMQ,UAAU,MAAMrC,2BAA2B;gBAC/CwB;gBACAM;gBACAC,SAASxB,IAAIwB,OAAO;YACtB;YACA,MAAMhB,WAAWH,kBAAkBL;YAEnC,IAAIQ,UAAU;gBACZ,OAAOI,iBAAiBJ;YAC1B;YAEA,OAAOd,aAAa;gBAClB4B,IAAI;gBACJQ;YACF;QACF;QACAC,QAAQ;QACRC,MAAM;IACR,CAAA,EAAE"}
@@ -1,29 +0,0 @@
1
- export type PublishGeneratedDocsPayloadOperations = {
2
- find: (args: {
3
- collection: string;
4
- depth?: number;
5
- limit?: number;
6
- overrideAccess?: boolean;
7
- where?: unknown;
8
- }) => Promise<{
9
- docs: unknown[];
10
- }>;
11
- update: (args: {
12
- collection: string;
13
- data: Record<string, unknown>;
14
- id: number | string;
15
- overrideAccess?: boolean;
16
- }) => Promise<unknown>;
17
- };
18
- export type PublishGeneratedDocsResult = {
19
- archived: number;
20
- drafts: number;
21
- published: number;
22
- total: number;
23
- updated: number;
24
- };
25
- export declare const publishGeneratedDocsForSet: ({ docsCollectionSlug, docsSetId, payload, }: {
26
- docsCollectionSlug: string;
27
- docsSetId: number | string;
28
- payload: PublishGeneratedDocsPayloadOperations;
29
- }) => Promise<PublishGeneratedDocsResult>;
@@ -1,78 +0,0 @@
1
- const isRecord = (value)=>typeof value === 'object' && value !== null && !Array.isArray(value);
2
- const getRecordId = (doc)=>{
3
- if (typeof doc.id === 'string' || typeof doc.id === 'number') {
4
- return doc.id;
5
- }
6
- return undefined;
7
- };
8
- const getRelationshipId = (value)=>{
9
- if (typeof value === 'string' || typeof value === 'number') {
10
- return String(value);
11
- }
12
- if (isRecord(value)) {
13
- const id = getRecordId(value);
14
- return id === undefined ? undefined : String(id);
15
- }
16
- return undefined;
17
- };
18
- const isArchived = (doc)=>{
19
- const sync = isRecord(doc.sync) ? doc.sync : undefined;
20
- return sync?.archived === true;
21
- };
22
- export const publishGeneratedDocsForSet = async ({ docsCollectionSlug, docsSetId, payload })=>{
23
- const result = await payload.find({
24
- collection: docsCollectionSlug,
25
- depth: 0,
26
- limit: 1000,
27
- overrideAccess: true,
28
- where: {
29
- docsSet: {
30
- equals: docsSetId
31
- }
32
- }
33
- });
34
- const summary = {
35
- archived: 0,
36
- drafts: 0,
37
- published: 0,
38
- total: 0,
39
- updated: 0
40
- };
41
- for (const rawDoc of result.docs){
42
- if (!isRecord(rawDoc)) {
43
- continue;
44
- }
45
- if (getRelationshipId(rawDoc.docsSet) !== String(docsSetId)) {
46
- continue;
47
- }
48
- summary.total += 1;
49
- if (isArchived(rawDoc)) {
50
- summary.archived += 1;
51
- continue;
52
- }
53
- if (rawDoc._status === 'published') {
54
- summary.published += 1;
55
- continue;
56
- }
57
- if (rawDoc._status === 'draft') {
58
- summary.drafts += 1;
59
- }
60
- const id = getRecordId(rawDoc);
61
- if (id === undefined) {
62
- continue;
63
- }
64
- await payload.update({
65
- id,
66
- collection: docsCollectionSlug,
67
- data: {
68
- _status: 'published'
69
- },
70
- overrideAccess: true
71
- });
72
- summary.updated += 1;
73
- summary.published += 1;
74
- }
75
- return summary;
76
- };
77
-
78
- //# sourceMappingURL=publishGeneratedDocs.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/payload/publishGeneratedDocs.ts"],"sourcesContent":["export type PublishGeneratedDocsPayloadOperations = {\n find: (args: {\n collection: string\n depth?: number\n limit?: number\n overrideAccess?: boolean\n where?: unknown\n }) => Promise<{\n docs: unknown[]\n }>\n update: (args: {\n collection: string\n data: Record<string, unknown>\n id: number | string\n overrideAccess?: boolean\n }) => Promise<unknown>\n}\n\nexport type PublishGeneratedDocsResult = {\n archived: number\n drafts: number\n published: number\n total: number\n updated: number\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\nconst getRecordId = (doc: Record<string, unknown>): number | string | undefined => {\n if (typeof doc.id === 'string' || typeof doc.id === 'number') {\n return doc.id\n }\n\n return undefined\n}\n\nconst getRelationshipId = (value: unknown): string | undefined => {\n if (typeof value === 'string' || typeof value === 'number') {\n return String(value)\n }\n\n if (isRecord(value)) {\n const id = getRecordId(value)\n\n return id === undefined ? undefined : String(id)\n }\n\n return undefined\n}\n\nconst isArchived = (doc: Record<string, unknown>): boolean => {\n const sync = isRecord(doc.sync) ? doc.sync : undefined\n\n return sync?.archived === true\n}\n\nexport const publishGeneratedDocsForSet = async ({\n docsCollectionSlug,\n docsSetId,\n payload,\n}: {\n docsCollectionSlug: string\n docsSetId: number | string\n payload: PublishGeneratedDocsPayloadOperations\n}): Promise<PublishGeneratedDocsResult> => {\n const result = await payload.find({\n collection: docsCollectionSlug,\n depth: 0,\n limit: 1000,\n overrideAccess: true,\n where: {\n docsSet: {\n equals: docsSetId,\n },\n },\n })\n\n const summary: PublishGeneratedDocsResult = {\n archived: 0,\n drafts: 0,\n published: 0,\n total: 0,\n updated: 0,\n }\n\n for (const rawDoc of result.docs) {\n if (!isRecord(rawDoc)) {\n continue\n }\n\n if (getRelationshipId(rawDoc.docsSet) !== String(docsSetId)) {\n continue\n }\n\n summary.total += 1\n\n if (isArchived(rawDoc)) {\n summary.archived += 1\n continue\n }\n\n if (rawDoc._status === 'published') {\n summary.published += 1\n continue\n }\n\n if (rawDoc._status === 'draft') {\n summary.drafts += 1\n }\n\n const id = getRecordId(rawDoc)\n\n if (id === undefined) {\n continue\n }\n\n await payload.update({\n id,\n collection: docsCollectionSlug,\n data: {\n _status: 'published',\n },\n overrideAccess: true,\n })\n summary.updated += 1\n summary.published += 1\n }\n\n return summary\n}\n"],"names":["isRecord","value","Array","isArray","getRecordId","doc","id","undefined","getRelationshipId","String","isArchived","sync","archived","publishGeneratedDocsForSet","docsCollectionSlug","docsSetId","payload","result","find","collection","depth","limit","overrideAccess","where","docsSet","equals","summary","drafts","published","total","updated","rawDoc","docs","_status","update","data"],"mappings":"AA0BA,MAAMA,WAAW,CAACC,QAChB,OAAOA,UAAU,YAAYA,UAAU,QAAQ,CAACC,MAAMC,OAAO,CAACF;AAEhE,MAAMG,cAAc,CAACC;IACnB,IAAI,OAAOA,IAAIC,EAAE,KAAK,YAAY,OAAOD,IAAIC,EAAE,KAAK,UAAU;QAC5D,OAAOD,IAAIC,EAAE;IACf;IAEA,OAAOC;AACT;AAEA,MAAMC,oBAAoB,CAACP;IACzB,IAAI,OAAOA,UAAU,YAAY,OAAOA,UAAU,UAAU;QAC1D,OAAOQ,OAAOR;IAChB;IAEA,IAAID,SAASC,QAAQ;QACnB,MAAMK,KAAKF,YAAYH;QAEvB,OAAOK,OAAOC,YAAYA,YAAYE,OAAOH;IAC/C;IAEA,OAAOC;AACT;AAEA,MAAMG,aAAa,CAACL;IAClB,MAAMM,OAAOX,SAASK,IAAIM,IAAI,IAAIN,IAAIM,IAAI,GAAGJ;IAE7C,OAAOI,MAAMC,aAAa;AAC5B;AAEA,OAAO,MAAMC,6BAA6B,OAAO,EAC/CC,kBAAkB,EAClBC,SAAS,EACTC,OAAO,EAKR;IACC,MAAMC,SAAS,MAAMD,QAAQE,IAAI,CAAC;QAChCC,YAAYL;QACZM,OAAO;QACPC,OAAO;QACPC,gBAAgB;QAChBC,OAAO;YACLC,SAAS;gBACPC,QAAQV;YACV;QACF;IACF;IAEA,MAAMW,UAAsC;QAC1Cd,UAAU;QACVe,QAAQ;QACRC,WAAW;QACXC,OAAO;QACPC,SAAS;IACX;IAEA,KAAK,MAAMC,UAAUd,OAAOe,IAAI,CAAE;QAChC,IAAI,CAAChC,SAAS+B,SAAS;YACrB;QACF;QAEA,IAAIvB,kBAAkBuB,OAAOP,OAAO,MAAMf,OAAOM,YAAY;YAC3D;QACF;QAEAW,QAAQG,KAAK,IAAI;QAEjB,IAAInB,WAAWqB,SAAS;YACtBL,QAAQd,QAAQ,IAAI;YACpB;QACF;QAEA,IAAImB,OAAOE,OAAO,KAAK,aAAa;YAClCP,QAAQE,SAAS,IAAI;YACrB;QACF;QAEA,IAAIG,OAAOE,OAAO,KAAK,SAAS;YAC9BP,QAAQC,MAAM,IAAI;QACpB;QAEA,MAAMrB,KAAKF,YAAY2B;QAEvB,IAAIzB,OAAOC,WAAW;YACpB;QACF;QAEA,MAAMS,QAAQkB,MAAM,CAAC;YACnB5B;YACAa,YAAYL;YACZqB,MAAM;gBACJF,SAAS;YACX;YACAX,gBAAgB;QAClB;QACAI,QAAQI,OAAO,IAAI;QACnBJ,QAAQE,SAAS,IAAI;IACvB;IAEA,OAAOF;AACT,EAAC"}