@valkyrianlabs/payload-markdown-docs 0.4.2 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/collections/docs.d.ts +2 -1
  2. package/dist/collections/docs.js +31 -1
  3. package/dist/collections/docs.js.map +1 -1
  4. package/dist/collections/docsSets.d.ts +2 -1
  5. package/dist/collections/docsSets.js +3 -2
  6. package/dist/collections/docsSets.js.map +1 -1
  7. package/dist/constants.d.ts +1 -0
  8. package/dist/constants.js +1 -0
  9. package/dist/constants.js.map +1 -1
  10. package/dist/endpoints/publishGeneratedDocs.d.ts +2 -1
  11. package/dist/endpoints/publishGeneratedDocs.js +2 -1
  12. package/dist/endpoints/publishGeneratedDocs.js.map +1 -1
  13. package/dist/index.d.ts +3 -3
  14. package/dist/index.js +1 -1
  15. package/dist/index.js.map +1 -1
  16. package/dist/next/PayloadMarkdownDocsPage.js +81 -23
  17. package/dist/next/PayloadMarkdownDocsPage.js.map +1 -1
  18. package/dist/next/index.d.ts +6 -6
  19. package/dist/next/index.js.map +1 -1
  20. package/dist/next/records.js +19 -0
  21. package/dist/next/records.js.map +1 -1
  22. package/dist/next/types.d.ts +9 -0
  23. package/dist/next/types.js.map +1 -1
  24. package/dist/payload/docsConflicts.js +12 -1
  25. package/dist/payload/docsConflicts.js.map +1 -1
  26. package/dist/payload/docsData.js +2 -0
  27. package/dist/payload/docsData.js.map +1 -1
  28. package/dist/payload/existingDocs.d.ts +1 -0
  29. package/dist/payload/existingDocs.js +1 -0
  30. package/dist/payload/existingDocs.js.map +1 -1
  31. package/dist/payload/publishGeneratedDocs.d.ts +2 -1
  32. package/dist/payload/publishGeneratedDocs.js +20 -6
  33. package/dist/payload/publishGeneratedDocs.js.map +1 -1
  34. package/dist/plugin.js +18 -2
  35. package/dist/plugin.js.map +1 -1
  36. package/dist/skills/codex/reference/admin.md +1 -0
  37. package/dist/types.d.ts +4 -0
  38. package/dist/types.js.map +1 -1
  39. package/package.json +1 -1
@@ -2,8 +2,9 @@ import type { CollectionConfig } from 'payload';
2
2
  export type CreateDocsCollectionOptions = {
3
3
  docsSetsCollectionSlug?: string;
4
4
  enableDrafts?: boolean;
5
+ heroImageMediaCollectionSlugs?: string[];
5
6
  markdownFieldName: string;
6
7
  slug: string;
7
8
  syncRunsCollectionSlug?: string;
8
9
  };
9
- export declare const createDocsCollection: ({ slug, docsSetsCollectionSlug, enableDrafts, markdownFieldName, syncRunsCollectionSlug, }: CreateDocsCollectionOptions) => CollectionConfig;
10
+ export declare const createDocsCollection: ({ slug, docsSetsCollectionSlug, enableDrafts, heroImageMediaCollectionSlugs, markdownFieldName, syncRunsCollectionSlug, }: CreateDocsCollectionOptions) => CollectionConfig;
@@ -1,6 +1,28 @@
1
1
  import { markdownField } from '@valkyrianlabs/payload-markdown';
2
2
  import { MANAGED_BY } from '../constants.js';
3
- export const createDocsCollection = ({ slug, docsSetsCollectionSlug, enableDrafts = false, markdownFieldName, syncRunsCollectionSlug })=>({
3
+ const createHeroImageField = (relationToSlugs)=>{
4
+ const fieldBase = {
5
+ name: 'heroImage',
6
+ type: 'upload',
7
+ admin: {
8
+ description: 'Optional hero image rendered above generated docs content.'
9
+ },
10
+ displayPreview: true,
11
+ label: 'Hero Image',
12
+ maxDepth: 1
13
+ };
14
+ if (relationToSlugs.length === 1) {
15
+ return {
16
+ ...fieldBase,
17
+ relationTo: relationToSlugs[0] ?? 'media'
18
+ };
19
+ }
20
+ return {
21
+ ...fieldBase,
22
+ relationTo: relationToSlugs
23
+ };
24
+ };
25
+ export const createDocsCollection = ({ slug, docsSetsCollectionSlug, enableDrafts = false, heroImageMediaCollectionSlugs, markdownFieldName, syncRunsCollectionSlug })=>({
4
26
  slug,
5
27
  admin: {
6
28
  defaultColumns: [
@@ -67,6 +89,9 @@ export const createDocsCollection = ({ slug, docsSetsCollectionSlug, enableDraft
67
89
  type: 'relationship',
68
90
  relationTo: slug
69
91
  },
92
+ ...heroImageMediaCollectionSlugs?.length ? [
93
+ createHeroImageField(heroImageMediaCollectionSlugs)
94
+ ] : [],
70
95
  markdownField({
71
96
  name: markdownFieldName,
72
97
  label: 'Content'
@@ -105,6 +130,11 @@ export const createDocsCollection = ({ slug, docsSetsCollectionSlug, enableDraft
105
130
  type: 'text',
106
131
  index: true
107
132
  },
133
+ {
134
+ name: 'contentHashAtLastSync',
135
+ type: 'text',
136
+ index: true
137
+ },
108
138
  {
109
139
  name: 'lastSyncedAt',
110
140
  type: 'date'
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/collections/docs.ts"],"sourcesContent":["import type { CollectionConfig } from 'payload'\n\nimport { markdownField } from '@valkyrianlabs/payload-markdown'\n\nimport { MANAGED_BY } from '../constants.js'\n\nexport type CreateDocsCollectionOptions = {\n docsSetsCollectionSlug?: string\n enableDrafts?: boolean\n markdownFieldName: string\n slug: string\n syncRunsCollectionSlug?: string\n}\n\nexport const createDocsCollection = ({\n slug,\n docsSetsCollectionSlug,\n enableDrafts = false,\n markdownFieldName,\n syncRunsCollectionSlug,\n}: CreateDocsCollectionOptions): CollectionConfig => ({\n slug,\n admin: {\n defaultColumns: ['title', 'route', 'sourcePath', 'updatedAt'],\n hidden: true,\n useAsTitle: 'title',\n },\n fields: [\n {\n name: 'title',\n type: 'text',\n required: true,\n },\n {\n name: 'navTitle',\n type: 'text',\n },\n {\n name: 'description',\n type: 'textarea',\n },\n {\n name: 'route',\n type: 'text',\n index: true,\n required: true,\n unique: true,\n },\n {\n name: 'sourcePath',\n type: 'text',\n index: true,\n required: true,\n },\n ...(docsSetsCollectionSlug\n ? [\n {\n name: 'docsSet',\n type: 'relationship' as const,\n index: true,\n relationTo: docsSetsCollectionSlug,\n },\n ]\n : []),\n {\n name: 'sourceHash',\n type: 'text',\n index: true,\n },\n {\n name: 'depth',\n type: 'number',\n defaultValue: 0,\n },\n {\n name: 'order',\n type: 'number',\n defaultValue: 0,\n },\n {\n name: 'parent',\n type: 'relationship',\n relationTo: slug,\n },\n markdownField({\n name: markdownFieldName,\n label: 'Content',\n }),\n {\n name: 'overrides',\n type: 'group',\n fields: [\n {\n name: 'navTitle',\n type: 'text',\n },\n {\n name: 'hideFromNav',\n type: 'checkbox',\n defaultValue: false,\n },\n ],\n },\n {\n name: 'sync',\n type: 'group',\n fields: [\n {\n name: 'sourceId',\n type: 'text',\n index: true,\n },\n {\n name: 'sourcePath',\n type: 'text',\n index: true,\n },\n {\n name: 'sourceHashAtLastSync',\n type: 'text',\n index: true,\n },\n {\n name: 'lastSyncedAt',\n type: 'date',\n },\n ...(syncRunsCollectionSlug\n ? [\n {\n name: 'lastSyncRunId',\n type: 'relationship' as const,\n relationTo: syncRunsCollectionSlug,\n },\n ]\n : []),\n {\n name: 'managedBy',\n type: 'text',\n defaultValue: MANAGED_BY,\n },\n {\n name: 'archived',\n type: 'checkbox',\n defaultValue: false,\n index: true,\n },\n {\n name: 'archivedAt',\n type: 'date',\n },\n ],\n },\n ],\n ...(enableDrafts\n ? {\n versions: {\n drafts: true,\n },\n }\n : {}),\n})\n"],"names":["markdownField","MANAGED_BY","createDocsCollection","slug","docsSetsCollectionSlug","enableDrafts","markdownFieldName","syncRunsCollectionSlug","admin","defaultColumns","hidden","useAsTitle","fields","name","type","required","index","unique","relationTo","defaultValue","label","versions","drafts"],"mappings":"AAEA,SAASA,aAAa,QAAQ,kCAAiC;AAE/D,SAASC,UAAU,QAAQ,kBAAiB;AAU5C,OAAO,MAAMC,uBAAuB,CAAC,EACnCC,IAAI,EACJC,sBAAsB,EACtBC,eAAe,KAAK,EACpBC,iBAAiB,EACjBC,sBAAsB,EACM,GAAwB,CAAA;QACpDJ;QACAK,OAAO;YACLC,gBAAgB;gBAAC;gBAAS;gBAAS;gBAAc;aAAY;YAC7DC,QAAQ;YACRC,YAAY;QACd;QACAC,QAAQ;YACN;gBACEC,MAAM;gBACNC,MAAM;gBACNC,UAAU;YACZ;YACA;gBACEF,MAAM;gBACNC,MAAM;YACR;YACA;gBACED,MAAM;gBACNC,MAAM;YACR;YACA;gBACED,MAAM;gBACNC,MAAM;gBACNE,OAAO;gBACPD,UAAU;gBACVE,QAAQ;YACV;YACA;gBACEJ,MAAM;gBACNC,MAAM;gBACNE,OAAO;gBACPD,UAAU;YACZ;eACIX,yBACA;gBACE;oBACES,MAAM;oBACNC,MAAM;oBACNE,OAAO;oBACPE,YAAYd;gBACd;aACD,GACD,EAAE;YACN;gBACES,MAAM;gBACNC,MAAM;gBACNE,OAAO;YACT;YACA;gBACEH,MAAM;gBACNC,MAAM;gBACNK,cAAc;YAChB;YACA;gBACEN,MAAM;gBACNC,MAAM;gBACNK,cAAc;YAChB;YACA;gBACEN,MAAM;gBACNC,MAAM;gBACNI,YAAYf;YACd;YACAH,cAAc;gBACZa,MAAMP;gBACNc,OAAO;YACT;YACA;gBACEP,MAAM;gBACNC,MAAM;gBACNF,QAAQ;oBACN;wBACEC,MAAM;wBACNC,MAAM;oBACR;oBACA;wBACED,MAAM;wBACNC,MAAM;wBACNK,cAAc;oBAChB;iBACD;YACH;YACA;gBACEN,MAAM;gBACNC,MAAM;gBACNF,QAAQ;oBACN;wBACEC,MAAM;wBACNC,MAAM;wBACNE,OAAO;oBACT;oBACA;wBACEH,MAAM;wBACNC,MAAM;wBACNE,OAAO;oBACT;oBACA;wBACEH,MAAM;wBACNC,MAAM;wBACNE,OAAO;oBACT;oBACA;wBACEH,MAAM;wBACNC,MAAM;oBACR;uBACIP,yBACA;wBACE;4BACEM,MAAM;4BACNC,MAAM;4BACNI,YAAYX;wBACd;qBACD,GACD,EAAE;oBACN;wBACEM,MAAM;wBACNC,MAAM;wBACNK,cAAclB;oBAChB;oBACA;wBACEY,MAAM;wBACNC,MAAM;wBACNK,cAAc;wBACdH,OAAO;oBACT;oBACA;wBACEH,MAAM;wBACNC,MAAM;oBACR;iBACD;YACH;SACD;QACD,GAAIT,eACA;YACEgB,UAAU;gBACRC,QAAQ;YACV;QACF,IACA,CAAC,CAAC;IACR,CAAA,EAAE"}
1
+ {"version":3,"sources":["../../src/collections/docs.ts"],"sourcesContent":["import type { CollectionConfig, Field } from 'payload'\n\nimport { markdownField } from '@valkyrianlabs/payload-markdown'\n\nimport { MANAGED_BY } from '../constants.js'\n\nexport type CreateDocsCollectionOptions = {\n docsSetsCollectionSlug?: string\n enableDrafts?: boolean\n heroImageMediaCollectionSlugs?: string[]\n markdownFieldName: string\n slug: string\n syncRunsCollectionSlug?: string\n}\n\nconst createHeroImageField = (relationToSlugs: string[]): Field => {\n const fieldBase = {\n name: 'heroImage',\n type: 'upload' as const,\n admin: {\n description: 'Optional hero image rendered above generated docs content.',\n },\n displayPreview: true,\n label: 'Hero Image',\n maxDepth: 1,\n }\n\n if (relationToSlugs.length === 1) {\n return {\n ...fieldBase,\n relationTo: relationToSlugs[0] ?? 'media',\n }\n }\n\n return {\n ...fieldBase,\n relationTo: relationToSlugs,\n }\n}\n\nexport const createDocsCollection = ({\n slug,\n docsSetsCollectionSlug,\n enableDrafts = false,\n heroImageMediaCollectionSlugs,\n markdownFieldName,\n syncRunsCollectionSlug,\n}: CreateDocsCollectionOptions): CollectionConfig => ({\n slug,\n admin: {\n defaultColumns: ['title', 'route', 'sourcePath', 'updatedAt'],\n hidden: true,\n useAsTitle: 'title',\n },\n fields: [\n {\n name: 'title',\n type: 'text',\n required: true,\n },\n {\n name: 'navTitle',\n type: 'text',\n },\n {\n name: 'description',\n type: 'textarea',\n },\n {\n name: 'route',\n type: 'text',\n index: true,\n required: true,\n unique: true,\n },\n {\n name: 'sourcePath',\n type: 'text',\n index: true,\n required: true,\n },\n ...(docsSetsCollectionSlug\n ? [\n {\n name: 'docsSet',\n type: 'relationship' as const,\n index: true,\n relationTo: docsSetsCollectionSlug,\n },\n ]\n : []),\n {\n name: 'sourceHash',\n type: 'text',\n index: true,\n },\n {\n name: 'depth',\n type: 'number',\n defaultValue: 0,\n },\n {\n name: 'order',\n type: 'number',\n defaultValue: 0,\n },\n {\n name: 'parent',\n type: 'relationship',\n relationTo: slug,\n },\n ...(heroImageMediaCollectionSlugs?.length\n ? [createHeroImageField(heroImageMediaCollectionSlugs)]\n : []),\n markdownField({\n name: markdownFieldName,\n label: 'Content',\n }),\n {\n name: 'overrides',\n type: 'group',\n fields: [\n {\n name: 'navTitle',\n type: 'text',\n },\n {\n name: 'hideFromNav',\n type: 'checkbox',\n defaultValue: false,\n },\n ],\n },\n {\n name: 'sync',\n type: 'group',\n fields: [\n {\n name: 'sourceId',\n type: 'text',\n index: true,\n },\n {\n name: 'sourcePath',\n type: 'text',\n index: true,\n },\n {\n name: 'sourceHashAtLastSync',\n type: 'text',\n index: true,\n },\n {\n name: 'contentHashAtLastSync',\n type: 'text',\n index: true,\n },\n {\n name: 'lastSyncedAt',\n type: 'date',\n },\n ...(syncRunsCollectionSlug\n ? [\n {\n name: 'lastSyncRunId',\n type: 'relationship' as const,\n relationTo: syncRunsCollectionSlug,\n },\n ]\n : []),\n {\n name: 'managedBy',\n type: 'text',\n defaultValue: MANAGED_BY,\n },\n {\n name: 'archived',\n type: 'checkbox',\n defaultValue: false,\n index: true,\n },\n {\n name: 'archivedAt',\n type: 'date',\n },\n ],\n },\n ],\n ...(enableDrafts\n ? {\n versions: {\n drafts: true,\n },\n }\n : {}),\n})\n"],"names":["markdownField","MANAGED_BY","createHeroImageField","relationToSlugs","fieldBase","name","type","admin","description","displayPreview","label","maxDepth","length","relationTo","createDocsCollection","slug","docsSetsCollectionSlug","enableDrafts","heroImageMediaCollectionSlugs","markdownFieldName","syncRunsCollectionSlug","defaultColumns","hidden","useAsTitle","fields","required","index","unique","defaultValue","versions","drafts"],"mappings":"AAEA,SAASA,aAAa,QAAQ,kCAAiC;AAE/D,SAASC,UAAU,QAAQ,kBAAiB;AAW5C,MAAMC,uBAAuB,CAACC;IAC5B,MAAMC,YAAY;QAChBC,MAAM;QACNC,MAAM;QACNC,OAAO;YACLC,aAAa;QACf;QACAC,gBAAgB;QAChBC,OAAO;QACPC,UAAU;IACZ;IAEA,IAAIR,gBAAgBS,MAAM,KAAK,GAAG;QAChC,OAAO;YACL,GAAGR,SAAS;YACZS,YAAYV,eAAe,CAAC,EAAE,IAAI;QACpC;IACF;IAEA,OAAO;QACL,GAAGC,SAAS;QACZS,YAAYV;IACd;AACF;AAEA,OAAO,MAAMW,uBAAuB,CAAC,EACnCC,IAAI,EACJC,sBAAsB,EACtBC,eAAe,KAAK,EACpBC,6BAA6B,EAC7BC,iBAAiB,EACjBC,sBAAsB,EACM,GAAwB,CAAA;QACpDL;QACAR,OAAO;YACLc,gBAAgB;gBAAC;gBAAS;gBAAS;gBAAc;aAAY;YAC7DC,QAAQ;YACRC,YAAY;QACd;QACAC,QAAQ;YACN;gBACEnB,MAAM;gBACNC,MAAM;gBACNmB,UAAU;YACZ;YACA;gBACEpB,MAAM;gBACNC,MAAM;YACR;YACA;gBACED,MAAM;gBACNC,MAAM;YACR;YACA;gBACED,MAAM;gBACNC,MAAM;gBACNoB,OAAO;gBACPD,UAAU;gBACVE,QAAQ;YACV;YACA;gBACEtB,MAAM;gBACNC,MAAM;gBACNoB,OAAO;gBACPD,UAAU;YACZ;eACIT,yBACA;gBACE;oBACEX,MAAM;oBACNC,MAAM;oBACNoB,OAAO;oBACPb,YAAYG;gBACd;aACD,GACD,EAAE;YACN;gBACEX,MAAM;gBACNC,MAAM;gBACNoB,OAAO;YACT;YACA;gBACErB,MAAM;gBACNC,MAAM;gBACNsB,cAAc;YAChB;YACA;gBACEvB,MAAM;gBACNC,MAAM;gBACNsB,cAAc;YAChB;YACA;gBACEvB,MAAM;gBACNC,MAAM;gBACNO,YAAYE;YACd;eACIG,+BAA+BN,SAC/B;gBAACV,qBAAqBgB;aAA+B,GACrD,EAAE;YACNlB,cAAc;gBACZK,MAAMc;gBACNT,OAAO;YACT;YACA;gBACEL,MAAM;gBACNC,MAAM;gBACNkB,QAAQ;oBACN;wBACEnB,MAAM;wBACNC,MAAM;oBACR;oBACA;wBACED,MAAM;wBACNC,MAAM;wBACNsB,cAAc;oBAChB;iBACD;YACH;YACA;gBACEvB,MAAM;gBACNC,MAAM;gBACNkB,QAAQ;oBACN;wBACEnB,MAAM;wBACNC,MAAM;wBACNoB,OAAO;oBACT;oBACA;wBACErB,MAAM;wBACNC,MAAM;wBACNoB,OAAO;oBACT;oBACA;wBACErB,MAAM;wBACNC,MAAM;wBACNoB,OAAO;oBACT;oBACA;wBACErB,MAAM;wBACNC,MAAM;wBACNoB,OAAO;oBACT;oBACA;wBACErB,MAAM;wBACNC,MAAM;oBACR;uBACIc,yBACA;wBACE;4BACEf,MAAM;4BACNC,MAAM;4BACNO,YAAYO;wBACd;qBACD,GACD,EAAE;oBACN;wBACEf,MAAM;wBACNC,MAAM;wBACNsB,cAAc3B;oBAChB;oBACA;wBACEI,MAAM;wBACNC,MAAM;wBACNsB,cAAc;wBACdF,OAAO;oBACT;oBACA;wBACErB,MAAM;wBACNC,MAAM;oBACR;iBACD;YACH;SACD;QACD,GAAIW,eACA;YACEY,UAAU;gBACRC,QAAQ;YACV;QACF,IACA,CAAC,CAAC;IACR,CAAA,EAAE"}
@@ -4,7 +4,8 @@ export type CreateDocsSetsCollectionOptions = {
4
4
  docsCollectionSlug?: string;
5
5
  docsEnableDrafts?: boolean;
6
6
  docsGroupsCollectionSlug: string;
7
+ markdownFieldName: string;
7
8
  slug: string;
8
9
  syncRunsCollectionSlug?: string;
9
10
  };
10
- export declare const createDocsSetsCollection: ({ slug, allowPublish, docsCollectionSlug, docsEnableDrafts, docsGroupsCollectionSlug, syncRunsCollectionSlug, }: CreateDocsSetsCollectionOptions) => CollectionConfig;
11
+ export declare const createDocsSetsCollection: ({ slug, allowPublish, docsCollectionSlug, docsEnableDrafts, docsGroupsCollectionSlug, markdownFieldName, syncRunsCollectionSlug, }: CreateDocsSetsCollectionOptions) => CollectionConfig;
@@ -1,6 +1,6 @@
1
1
  import { DOCS_GLOBALS_ADMIN_GROUP, DOCS_SET_MANAGER_COMPONENT } from '../constants.js';
2
2
  import { createPublishGeneratedDocsEndpoint } from '../endpoints/publishGeneratedDocs.js';
3
- export const createDocsSetsCollection = ({ slug, allowPublish = false, docsCollectionSlug, docsEnableDrafts = false, docsGroupsCollectionSlug, syncRunsCollectionSlug })=>({
3
+ export const createDocsSetsCollection = ({ slug, allowPublish = false, docsCollectionSlug, docsEnableDrafts = false, docsGroupsCollectionSlug, markdownFieldName, syncRunsCollectionSlug })=>({
4
4
  slug,
5
5
  admin: {
6
6
  defaultColumns: [
@@ -15,7 +15,8 @@ export const createDocsSetsCollection = ({ slug, allowPublish = false, docsColle
15
15
  endpoints: docsCollectionSlug && docsEnableDrafts && allowPublish ? [
16
16
  createPublishGeneratedDocsEndpoint({
17
17
  docsCollectionSlug,
18
- docsSetsCollectionSlug: slug
18
+ docsSetsCollectionSlug: slug,
19
+ markdownFieldName
19
20
  })
20
21
  ] : undefined,
21
22
  fields: [
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/collections/docsSets.ts"],"sourcesContent":["import type { CollectionConfig } from 'payload'\n\nimport {\n DOCS_GLOBALS_ADMIN_GROUP,\n DOCS_SET_MANAGER_COMPONENT,\n} from '../constants.js'\nimport { createPublishGeneratedDocsEndpoint } from '../endpoints/publishGeneratedDocs.js'\n\nexport type CreateDocsSetsCollectionOptions = {\n allowPublish?: boolean\n docsCollectionSlug?: string\n docsEnableDrafts?: boolean\n docsGroupsCollectionSlug: string\n slug: string\n syncRunsCollectionSlug?: string\n}\n\nexport const createDocsSetsCollection = ({\n slug,\n allowPublish = false,\n docsCollectionSlug,\n docsEnableDrafts = false,\n docsGroupsCollectionSlug,\n syncRunsCollectionSlug,\n}: CreateDocsSetsCollectionOptions): CollectionConfig => ({\n slug,\n admin: {\n defaultColumns: ['title', 'slug', 'branch', 'updatedAt'],\n group: DOCS_GLOBALS_ADMIN_GROUP,\n useAsTitle: 'title',\n },\n endpoints:\n docsCollectionSlug && docsEnableDrafts && allowPublish\n ? [\n createPublishGeneratedDocsEndpoint({\n docsCollectionSlug,\n docsSetsCollectionSlug: slug,\n }),\n ]\n : undefined,\n fields: [\n {\n name: 'title',\n type: 'text',\n required: true,\n },\n {\n name: 'slug',\n type: 'text',\n index: true,\n required: true,\n unique: true,\n },\n {\n name: 'group',\n type: 'relationship',\n relationTo: docsGroupsCollectionSlug,\n },\n {\n name: 'branch',\n type: 'text',\n admin: {\n description:\n 'Git branch allowed to publish this docs set. The full Git ref is handled internally.',\n },\n defaultValue: 'main',\n },\n {\n name: 'allowPullRequests',\n type: 'checkbox',\n admin: {\n description:\n 'Allow GitHub pull request events to dry-run or publish this docs set.',\n },\n defaultValue: false,\n },\n {\n name: 'description',\n type: 'textarea',\n },\n {\n name: 'advancedSecurity',\n type: 'group',\n admin: {\n description:\n 'Optional workflow lock-down. Leave disabled to allow any workflow from a trusted GitHub owner/repository and branch.',\n },\n fields: [\n {\n name: 'enabled',\n type: 'checkbox',\n admin: {\n description:\n 'When enabled, only the workflow refs listed below can publish this docs set.',\n },\n defaultValue: false,\n },\n {\n name: 'allowedWorkflowRefs',\n type: 'array',\n admin: {\n condition: (_data, siblingData) => siblingData?.enabled === true,\n description:\n 'Exact GitHub workflow refs, for example owner/repo/.github/workflows/publish-docs.yml@refs/heads/main.',\n },\n fields: [\n {\n name: 'value',\n type: 'text',\n required: true,\n },\n ],\n validate: (value, { siblingData }) => {\n const advancedSecurityData =\n typeof siblingData === 'object' && siblingData !== null\n ? (siblingData as { enabled?: unknown })\n : undefined\n\n if (\n advancedSecurityData?.enabled === true &&\n (!Array.isArray(value) || value.length === 0)\n ) {\n return 'Add at least one workflow ref or disable advanced security.'\n }\n\n return true\n },\n },\n ],\n },\n {\n name: 'aiExport',\n type: 'json',\n admin: {\n description:\n 'Parsed index.ai.yml control data for the raw Markdown AI export route.',\n },\n },\n {\n name: 'sync',\n type: 'group',\n fields: [\n {\n name: 'lastSyncedAt',\n type: 'date',\n },\n ...(syncRunsCollectionSlug\n ? [\n {\n name: 'lastSyncRunId',\n type: 'relationship' as const,\n relationTo: syncRunsCollectionSlug,\n },\n ]\n : []),\n {\n name: 'lastStatus',\n type: 'select',\n options: ['failed', 'pending', 'success'],\n },\n {\n name: 'docsCount',\n type: 'number',\n defaultValue: 0,\n },\n ],\n },\n ...(docsCollectionSlug\n ? [\n {\n name: 'docsSetManager',\n type: 'ui' as const,\n admin: {\n components: {\n Field: DOCS_SET_MANAGER_COMPONENT,\n },\n custom: {\n allowPublish,\n docsCollectionSlug,\n docsEnableDrafts,\n docsGroupsCollectionSlug,\n docsSetsCollectionSlug: slug,\n },\n },\n },\n ]\n : []),\n ],\n labels: {\n plural: 'Sets',\n singular: 'Set',\n },\n})\n"],"names":["DOCS_GLOBALS_ADMIN_GROUP","DOCS_SET_MANAGER_COMPONENT","createPublishGeneratedDocsEndpoint","createDocsSetsCollection","slug","allowPublish","docsCollectionSlug","docsEnableDrafts","docsGroupsCollectionSlug","syncRunsCollectionSlug","admin","defaultColumns","group","useAsTitle","endpoints","docsSetsCollectionSlug","undefined","fields","name","type","required","index","unique","relationTo","description","defaultValue","condition","_data","siblingData","enabled","validate","value","advancedSecurityData","Array","isArray","length","options","components","Field","custom","labels","plural","singular"],"mappings":"AAEA,SACEA,wBAAwB,EACxBC,0BAA0B,QACrB,kBAAiB;AACxB,SAASC,kCAAkC,QAAQ,uCAAsC;AAWzF,OAAO,MAAMC,2BAA2B,CAAC,EACvCC,IAAI,EACJC,eAAe,KAAK,EACpBC,kBAAkB,EAClBC,mBAAmB,KAAK,EACxBC,wBAAwB,EACxBC,sBAAsB,EACU,GAAwB,CAAA;QACxDL;QACAM,OAAO;YACLC,gBAAgB;gBAAC;gBAAS;gBAAQ;gBAAU;aAAY;YACxDC,OAAOZ;YACPa,YAAY;QACd;QACAC,WACER,sBAAsBC,oBAAoBF,eACtC;YACEH,mCAAmC;gBACjCI;gBACAS,wBAAwBX;YAC1B;SACD,GACDY;QACNC,QAAQ;YACN;gBACEC,MAAM;gBACNC,MAAM;gBACNC,UAAU;YACZ;YACA;gBACEF,MAAM;gBACNC,MAAM;gBACNE,OAAO;gBACPD,UAAU;gBACVE,QAAQ;YACV;YACA;gBACEJ,MAAM;gBACNC,MAAM;gBACNI,YAAYf;YACd;YACA;gBACEU,MAAM;gBACNC,MAAM;gBACNT,OAAO;oBACLc,aACE;gBACJ;gBACAC,cAAc;YAChB;YACA;gBACEP,MAAM;gBACNC,MAAM;gBACNT,OAAO;oBACLc,aACE;gBACJ;gBACAC,cAAc;YAChB;YACA;gBACEP,MAAM;gBACNC,MAAM;YACR;YACA;gBACED,MAAM;gBACNC,MAAM;gBACNT,OAAO;oBACLc,aACE;gBACJ;gBACAP,QAAQ;oBACN;wBACEC,MAAM;wBACNC,MAAM;wBACNT,OAAO;4BACLc,aACE;wBACJ;wBACAC,cAAc;oBAChB;oBACA;wBACEP,MAAM;wBACNC,MAAM;wBACNT,OAAO;4BACLgB,WAAW,CAACC,OAAOC,cAAgBA,aAAaC,YAAY;4BAC5DL,aACE;wBACJ;wBACAP,QAAQ;4BACN;gCACEC,MAAM;gCACNC,MAAM;gCACNC,UAAU;4BACZ;yBACD;wBACDU,UAAU,CAACC,OAAO,EAAEH,WAAW,EAAE;4BAC/B,MAAMI,uBACJ,OAAOJ,gBAAgB,YAAYA,gBAAgB,OAC9CA,cACDZ;4BAEN,IACEgB,sBAAsBH,YAAY,QACjC,CAAA,CAACI,MAAMC,OAAO,CAACH,UAAUA,MAAMI,MAAM,KAAK,CAAA,GAC3C;gCACA,OAAO;4BACT;4BAEA,OAAO;wBACT;oBACF;iBACD;YACH;YACA;gBACEjB,MAAM;gBACNC,MAAM;gBACNT,OAAO;oBACLc,aACE;gBACJ;YACF;YACA;gBACEN,MAAM;gBACNC,MAAM;gBACNF,QAAQ;oBACN;wBACEC,MAAM;wBACNC,MAAM;oBACR;uBACIV,yBACA;wBACE;4BACES,MAAM;4BACNC,MAAM;4BACNI,YAAYd;wBACd;qBACD,GACD,EAAE;oBACN;wBACES,MAAM;wBACNC,MAAM;wBACNiB,SAAS;4BAAC;4BAAU;4BAAW;yBAAU;oBAC3C;oBACA;wBACElB,MAAM;wBACNC,MAAM;wBACNM,cAAc;oBAChB;iBACD;YACH;eACInB,qBACA;gBACE;oBACEY,MAAM;oBACNC,MAAM;oBACNT,OAAO;wBACL2B,YAAY;4BACVC,OAAOrC;wBACT;wBACAsC,QAAQ;4BACNlC;4BACAC;4BACAC;4BACAC;4BACAO,wBAAwBX;wBAC1B;oBACF;gBACF;aACD,GACD,EAAE;SACP;QACDoC,QAAQ;YACNC,QAAQ;YACRC,UAAU;QACZ;IACF,CAAA,EAAE"}
1
+ {"version":3,"sources":["../../src/collections/docsSets.ts"],"sourcesContent":["import type { CollectionConfig } from 'payload'\n\nimport { DOCS_GLOBALS_ADMIN_GROUP, DOCS_SET_MANAGER_COMPONENT } from '../constants.js'\nimport { createPublishGeneratedDocsEndpoint } from '../endpoints/publishGeneratedDocs.js'\n\nexport type CreateDocsSetsCollectionOptions = {\n allowPublish?: boolean\n docsCollectionSlug?: string\n docsEnableDrafts?: boolean\n docsGroupsCollectionSlug: string\n markdownFieldName: string\n slug: string\n syncRunsCollectionSlug?: string\n}\n\nexport const createDocsSetsCollection = ({\n slug,\n allowPublish = false,\n docsCollectionSlug,\n docsEnableDrafts = false,\n docsGroupsCollectionSlug,\n markdownFieldName,\n syncRunsCollectionSlug,\n}: CreateDocsSetsCollectionOptions): CollectionConfig => ({\n slug,\n admin: {\n defaultColumns: ['title', 'slug', 'branch', 'updatedAt'],\n group: DOCS_GLOBALS_ADMIN_GROUP,\n useAsTitle: 'title',\n },\n endpoints:\n docsCollectionSlug && docsEnableDrafts && allowPublish\n ? [\n createPublishGeneratedDocsEndpoint({\n docsCollectionSlug,\n docsSetsCollectionSlug: slug,\n markdownFieldName,\n }),\n ]\n : undefined,\n fields: [\n {\n name: 'title',\n type: 'text',\n required: true,\n },\n {\n name: 'slug',\n type: 'text',\n index: true,\n required: true,\n unique: true,\n },\n {\n name: 'group',\n type: 'relationship',\n relationTo: docsGroupsCollectionSlug,\n },\n {\n name: 'branch',\n type: 'text',\n admin: {\n description:\n 'Git branch allowed to publish this docs set. The full Git ref is handled internally.',\n },\n defaultValue: 'main',\n },\n {\n name: 'allowPullRequests',\n type: 'checkbox',\n admin: {\n description: 'Allow GitHub pull request events to dry-run or publish this docs set.',\n },\n defaultValue: false,\n },\n {\n name: 'description',\n type: 'textarea',\n },\n {\n name: 'advancedSecurity',\n type: 'group',\n admin: {\n description:\n 'Optional workflow lock-down. Leave disabled to allow any workflow from a trusted GitHub owner/repository and branch.',\n },\n fields: [\n {\n name: 'enabled',\n type: 'checkbox',\n admin: {\n description:\n 'When enabled, only the workflow refs listed below can publish this docs set.',\n },\n defaultValue: false,\n },\n {\n name: 'allowedWorkflowRefs',\n type: 'array',\n admin: {\n condition: (_data, siblingData) => siblingData?.enabled === true,\n description:\n 'Exact GitHub workflow refs, for example owner/repo/.github/workflows/publish-docs.yml@refs/heads/main.',\n },\n fields: [\n {\n name: 'value',\n type: 'text',\n required: true,\n },\n ],\n validate: (value, { siblingData }) => {\n const advancedSecurityData =\n typeof siblingData === 'object' && siblingData !== null\n ? (siblingData as { enabled?: unknown })\n : undefined\n\n if (\n advancedSecurityData?.enabled === true &&\n (!Array.isArray(value) || value.length === 0)\n ) {\n return 'Add at least one workflow ref or disable advanced security.'\n }\n\n return true\n },\n },\n ],\n },\n {\n name: 'aiExport',\n type: 'json',\n admin: {\n description: 'Parsed index.ai.yml control data for the raw Markdown AI export route.',\n },\n },\n {\n name: 'sync',\n type: 'group',\n fields: [\n {\n name: 'lastSyncedAt',\n type: 'date',\n },\n ...(syncRunsCollectionSlug\n ? [\n {\n name: 'lastSyncRunId',\n type: 'relationship' as const,\n relationTo: syncRunsCollectionSlug,\n },\n ]\n : []),\n {\n name: 'lastStatus',\n type: 'select',\n options: ['failed', 'pending', 'success'],\n },\n {\n name: 'docsCount',\n type: 'number',\n defaultValue: 0,\n },\n ],\n },\n ...(docsCollectionSlug\n ? [\n {\n name: 'docsSetManager',\n type: 'ui' as const,\n admin: {\n components: {\n Field: DOCS_SET_MANAGER_COMPONENT,\n },\n custom: {\n allowPublish,\n docsCollectionSlug,\n docsEnableDrafts,\n docsGroupsCollectionSlug,\n docsSetsCollectionSlug: slug,\n },\n },\n },\n ]\n : []),\n ],\n labels: {\n plural: 'Sets',\n singular: 'Set',\n },\n})\n"],"names":["DOCS_GLOBALS_ADMIN_GROUP","DOCS_SET_MANAGER_COMPONENT","createPublishGeneratedDocsEndpoint","createDocsSetsCollection","slug","allowPublish","docsCollectionSlug","docsEnableDrafts","docsGroupsCollectionSlug","markdownFieldName","syncRunsCollectionSlug","admin","defaultColumns","group","useAsTitle","endpoints","docsSetsCollectionSlug","undefined","fields","name","type","required","index","unique","relationTo","description","defaultValue","condition","_data","siblingData","enabled","validate","value","advancedSecurityData","Array","isArray","length","options","components","Field","custom","labels","plural","singular"],"mappings":"AAEA,SAASA,wBAAwB,EAAEC,0BAA0B,QAAQ,kBAAiB;AACtF,SAASC,kCAAkC,QAAQ,uCAAsC;AAYzF,OAAO,MAAMC,2BAA2B,CAAC,EACvCC,IAAI,EACJC,eAAe,KAAK,EACpBC,kBAAkB,EAClBC,mBAAmB,KAAK,EACxBC,wBAAwB,EACxBC,iBAAiB,EACjBC,sBAAsB,EACU,GAAwB,CAAA;QACxDN;QACAO,OAAO;YACLC,gBAAgB;gBAAC;gBAAS;gBAAQ;gBAAU;aAAY;YACxDC,OAAOb;YACPc,YAAY;QACd;QACAC,WACET,sBAAsBC,oBAAoBF,eACtC;YACEH,mCAAmC;gBACjCI;gBACAU,wBAAwBZ;gBACxBK;YACF;SACD,GACDQ;QACNC,QAAQ;YACN;gBACEC,MAAM;gBACNC,MAAM;gBACNC,UAAU;YACZ;YACA;gBACEF,MAAM;gBACNC,MAAM;gBACNE,OAAO;gBACPD,UAAU;gBACVE,QAAQ;YACV;YACA;gBACEJ,MAAM;gBACNC,MAAM;gBACNI,YAAYhB;YACd;YACA;gBACEW,MAAM;gBACNC,MAAM;gBACNT,OAAO;oBACLc,aACE;gBACJ;gBACAC,cAAc;YAChB;YACA;gBACEP,MAAM;gBACNC,MAAM;gBACNT,OAAO;oBACLc,aAAa;gBACf;gBACAC,cAAc;YAChB;YACA;gBACEP,MAAM;gBACNC,MAAM;YACR;YACA;gBACED,MAAM;gBACNC,MAAM;gBACNT,OAAO;oBACLc,aACE;gBACJ;gBACAP,QAAQ;oBACN;wBACEC,MAAM;wBACNC,MAAM;wBACNT,OAAO;4BACLc,aACE;wBACJ;wBACAC,cAAc;oBAChB;oBACA;wBACEP,MAAM;wBACNC,MAAM;wBACNT,OAAO;4BACLgB,WAAW,CAACC,OAAOC,cAAgBA,aAAaC,YAAY;4BAC5DL,aACE;wBACJ;wBACAP,QAAQ;4BACN;gCACEC,MAAM;gCACNC,MAAM;gCACNC,UAAU;4BACZ;yBACD;wBACDU,UAAU,CAACC,OAAO,EAAEH,WAAW,EAAE;4BAC/B,MAAMI,uBACJ,OAAOJ,gBAAgB,YAAYA,gBAAgB,OAC9CA,cACDZ;4BAEN,IACEgB,sBAAsBH,YAAY,QACjC,CAAA,CAACI,MAAMC,OAAO,CAACH,UAAUA,MAAMI,MAAM,KAAK,CAAA,GAC3C;gCACA,OAAO;4BACT;4BAEA,OAAO;wBACT;oBACF;iBACD;YACH;YACA;gBACEjB,MAAM;gBACNC,MAAM;gBACNT,OAAO;oBACLc,aAAa;gBACf;YACF;YACA;gBACEN,MAAM;gBACNC,MAAM;gBACNF,QAAQ;oBACN;wBACEC,MAAM;wBACNC,MAAM;oBACR;uBACIV,yBACA;wBACE;4BACES,MAAM;4BACNC,MAAM;4BACNI,YAAYd;wBACd;qBACD,GACD,EAAE;oBACN;wBACES,MAAM;wBACNC,MAAM;wBACNiB,SAAS;4BAAC;4BAAU;4BAAW;yBAAU;oBAC3C;oBACA;wBACElB,MAAM;wBACNC,MAAM;wBACNM,cAAc;oBAChB;iBACD;YACH;eACIpB,qBACA;gBACE;oBACEa,MAAM;oBACNC,MAAM;oBACNT,OAAO;wBACL2B,YAAY;4BACVC,OAAOtC;wBACT;wBACAuC,QAAQ;4BACNnC;4BACAC;4BACAC;4BACAC;4BACAQ,wBAAwBZ;wBAC1B;oBACF;gBACF;aACD,GACD,EAAE;SACP;QACDqC,QAAQ;YACNC,QAAQ;YACRC,UAAU;QACZ;IACF,CAAA,EAAE"}
@@ -8,6 +8,7 @@ export declare const DEFAULT_DOCS_SYNC_RUNS_COLLECTION_SLUG = "docs-sync-runs";
8
8
  export declare const DEFAULT_DOCS_TRUSTED_COLLECTION_SLUG = "docs-trusted";
9
9
  export declare const DEFAULT_DOCS_SYNC_ENDPOINT_PATH = "/payload-markdown-docs/sync";
10
10
  export declare const DEFAULT_MARKDOWN_FIELD_NAME = "content";
11
+ export declare const DEFAULT_MEDIA_COLLECTION_SLUG = "media";
11
12
  export declare const DOCS_SET_MANAGER_COMPONENT = "@valkyrianlabs/payload-markdown-docs/admin#DocsSetManager";
12
13
  export declare const DEFAULT_PAGES_BRIDGE_FIELD = "docsBridge";
13
14
  export declare const DEFAULT_PAGES_COLLECTION_SLUG = "pages";
package/dist/constants.js CHANGED
@@ -8,6 +8,7 @@ export const DEFAULT_DOCS_SYNC_RUNS_COLLECTION_SLUG = 'docs-sync-runs';
8
8
  export const DEFAULT_DOCS_TRUSTED_COLLECTION_SLUG = 'docs-trusted';
9
9
  export const DEFAULT_DOCS_SYNC_ENDPOINT_PATH = '/payload-markdown-docs/sync';
10
10
  export const DEFAULT_MARKDOWN_FIELD_NAME = 'content';
11
+ export const DEFAULT_MEDIA_COLLECTION_SLUG = 'media';
11
12
  export const DOCS_SET_MANAGER_COMPONENT = '@valkyrianlabs/payload-markdown-docs/admin#DocsSetManager';
12
13
  export const DEFAULT_PAGES_BRIDGE_FIELD = 'docsBridge';
13
14
  export const DEFAULT_PAGES_COLLECTION_SLUG = 'pages';
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants.ts"],"sourcesContent":["export const DEFAULT_DOCS_COLLECTION_SLUG = 'docs'\nexport const DEFAULT_DOCS_GROUPS_COLLECTION_SLUG = 'docs-groups'\nexport const DEFAULT_DOCS_KEYS_COLLECTION_SLUG = 'docs-keys'\nexport const DEFAULT_DOCS_ROUTE_BASE = '/docs'\nexport const DEFAULT_DOCS_SETS_COLLECTION_SLUG = 'docs-sets'\nexport const DEFAULT_DOCS_SYNC_NONCES_COLLECTION_SLUG = 'docs-sync-nonces'\nexport const DEFAULT_DOCS_SYNC_RUNS_COLLECTION_SLUG = 'docs-sync-runs'\nexport const DEFAULT_DOCS_TRUSTED_COLLECTION_SLUG = 'docs-trusted'\nexport const DEFAULT_DOCS_SYNC_ENDPOINT_PATH = '/payload-markdown-docs/sync'\nexport const DEFAULT_MARKDOWN_FIELD_NAME = 'content'\nexport const DOCS_SET_MANAGER_COMPONENT =\n '@valkyrianlabs/payload-markdown-docs/admin#DocsSetManager'\nexport const DEFAULT_PAGES_BRIDGE_FIELD = 'docsBridge'\nexport const DEFAULT_PAGES_COLLECTION_SLUG = 'pages'\nexport const DEFAULT_PAGES_ROUTE_FIELD = 'slug'\nexport const DEFAULT_MAX_DOCS_FILE_BYTES = 500_000\nexport const DEFAULT_MAX_DOCS_FILES = 500\nexport const DEFAULT_MAX_DOCS_TOTAL_BYTES = 5_000_000\nexport const DEFAULT_MAX_BODY_BYTES = 5_000_000\nexport const DEFAULT_MAX_SKEW_SECONDS = 300\nexport const DEFAULT_NONCE_TTL_SECONDS = 600\nexport const DEFAULT_GITHUB_OIDC_ISSUER =\n 'https://token.actions.githubusercontent.com'\nexport const MANAGED_BY = 'payload-markdown-docs'\nexport const DOCS_GLOBALS_ADMIN_GROUP = 'Docs Globals'\n"],"names":["DEFAULT_DOCS_COLLECTION_SLUG","DEFAULT_DOCS_GROUPS_COLLECTION_SLUG","DEFAULT_DOCS_KEYS_COLLECTION_SLUG","DEFAULT_DOCS_ROUTE_BASE","DEFAULT_DOCS_SETS_COLLECTION_SLUG","DEFAULT_DOCS_SYNC_NONCES_COLLECTION_SLUG","DEFAULT_DOCS_SYNC_RUNS_COLLECTION_SLUG","DEFAULT_DOCS_TRUSTED_COLLECTION_SLUG","DEFAULT_DOCS_SYNC_ENDPOINT_PATH","DEFAULT_MARKDOWN_FIELD_NAME","DOCS_SET_MANAGER_COMPONENT","DEFAULT_PAGES_BRIDGE_FIELD","DEFAULT_PAGES_COLLECTION_SLUG","DEFAULT_PAGES_ROUTE_FIELD","DEFAULT_MAX_DOCS_FILE_BYTES","DEFAULT_MAX_DOCS_FILES","DEFAULT_MAX_DOCS_TOTAL_BYTES","DEFAULT_MAX_BODY_BYTES","DEFAULT_MAX_SKEW_SECONDS","DEFAULT_NONCE_TTL_SECONDS","DEFAULT_GITHUB_OIDC_ISSUER","MANAGED_BY","DOCS_GLOBALS_ADMIN_GROUP"],"mappings":"AAAA,OAAO,MAAMA,+BAA+B,OAAM;AAClD,OAAO,MAAMC,sCAAsC,cAAa;AAChE,OAAO,MAAMC,oCAAoC,YAAW;AAC5D,OAAO,MAAMC,0BAA0B,QAAO;AAC9C,OAAO,MAAMC,oCAAoC,YAAW;AAC5D,OAAO,MAAMC,2CAA2C,mBAAkB;AAC1E,OAAO,MAAMC,yCAAyC,iBAAgB;AACtE,OAAO,MAAMC,uCAAuC,eAAc;AAClE,OAAO,MAAMC,kCAAkC,8BAA6B;AAC5E,OAAO,MAAMC,8BAA8B,UAAS;AACpD,OAAO,MAAMC,6BACX,4DAA2D;AAC7D,OAAO,MAAMC,6BAA6B,aAAY;AACtD,OAAO,MAAMC,gCAAgC,QAAO;AACpD,OAAO,MAAMC,4BAA4B,OAAM;AAC/C,OAAO,MAAMC,8BAA8B,QAAO;AAClD,OAAO,MAAMC,yBAAyB,IAAG;AACzC,OAAO,MAAMC,+BAA+B,UAAS;AACrD,OAAO,MAAMC,yBAAyB,UAAS;AAC/C,OAAO,MAAMC,2BAA2B,IAAG;AAC3C,OAAO,MAAMC,4BAA4B,IAAG;AAC5C,OAAO,MAAMC,6BACX,8CAA6C;AAC/C,OAAO,MAAMC,aAAa,wBAAuB;AACjD,OAAO,MAAMC,2BAA2B,eAAc"}
1
+ {"version":3,"sources":["../src/constants.ts"],"sourcesContent":["export const DEFAULT_DOCS_COLLECTION_SLUG = 'docs'\nexport const DEFAULT_DOCS_GROUPS_COLLECTION_SLUG = 'docs-groups'\nexport const DEFAULT_DOCS_KEYS_COLLECTION_SLUG = 'docs-keys'\nexport const DEFAULT_DOCS_ROUTE_BASE = '/docs'\nexport const DEFAULT_DOCS_SETS_COLLECTION_SLUG = 'docs-sets'\nexport const DEFAULT_DOCS_SYNC_NONCES_COLLECTION_SLUG = 'docs-sync-nonces'\nexport const DEFAULT_DOCS_SYNC_RUNS_COLLECTION_SLUG = 'docs-sync-runs'\nexport const DEFAULT_DOCS_TRUSTED_COLLECTION_SLUG = 'docs-trusted'\nexport const DEFAULT_DOCS_SYNC_ENDPOINT_PATH = '/payload-markdown-docs/sync'\nexport const DEFAULT_MARKDOWN_FIELD_NAME = 'content'\nexport const DEFAULT_MEDIA_COLLECTION_SLUG = 'media'\nexport const DOCS_SET_MANAGER_COMPONENT =\n '@valkyrianlabs/payload-markdown-docs/admin#DocsSetManager'\nexport const DEFAULT_PAGES_BRIDGE_FIELD = 'docsBridge'\nexport const DEFAULT_PAGES_COLLECTION_SLUG = 'pages'\nexport const DEFAULT_PAGES_ROUTE_FIELD = 'slug'\nexport const DEFAULT_MAX_DOCS_FILE_BYTES = 500_000\nexport const DEFAULT_MAX_DOCS_FILES = 500\nexport const DEFAULT_MAX_DOCS_TOTAL_BYTES = 5_000_000\nexport const DEFAULT_MAX_BODY_BYTES = 5_000_000\nexport const DEFAULT_MAX_SKEW_SECONDS = 300\nexport const DEFAULT_NONCE_TTL_SECONDS = 600\nexport const DEFAULT_GITHUB_OIDC_ISSUER = 'https://token.actions.githubusercontent.com'\nexport const MANAGED_BY = 'payload-markdown-docs'\nexport const DOCS_GLOBALS_ADMIN_GROUP = 'Docs Globals'\n"],"names":["DEFAULT_DOCS_COLLECTION_SLUG","DEFAULT_DOCS_GROUPS_COLLECTION_SLUG","DEFAULT_DOCS_KEYS_COLLECTION_SLUG","DEFAULT_DOCS_ROUTE_BASE","DEFAULT_DOCS_SETS_COLLECTION_SLUG","DEFAULT_DOCS_SYNC_NONCES_COLLECTION_SLUG","DEFAULT_DOCS_SYNC_RUNS_COLLECTION_SLUG","DEFAULT_DOCS_TRUSTED_COLLECTION_SLUG","DEFAULT_DOCS_SYNC_ENDPOINT_PATH","DEFAULT_MARKDOWN_FIELD_NAME","DEFAULT_MEDIA_COLLECTION_SLUG","DOCS_SET_MANAGER_COMPONENT","DEFAULT_PAGES_BRIDGE_FIELD","DEFAULT_PAGES_COLLECTION_SLUG","DEFAULT_PAGES_ROUTE_FIELD","DEFAULT_MAX_DOCS_FILE_BYTES","DEFAULT_MAX_DOCS_FILES","DEFAULT_MAX_DOCS_TOTAL_BYTES","DEFAULT_MAX_BODY_BYTES","DEFAULT_MAX_SKEW_SECONDS","DEFAULT_NONCE_TTL_SECONDS","DEFAULT_GITHUB_OIDC_ISSUER","MANAGED_BY","DOCS_GLOBALS_ADMIN_GROUP"],"mappings":"AAAA,OAAO,MAAMA,+BAA+B,OAAM;AAClD,OAAO,MAAMC,sCAAsC,cAAa;AAChE,OAAO,MAAMC,oCAAoC,YAAW;AAC5D,OAAO,MAAMC,0BAA0B,QAAO;AAC9C,OAAO,MAAMC,oCAAoC,YAAW;AAC5D,OAAO,MAAMC,2CAA2C,mBAAkB;AAC1E,OAAO,MAAMC,yCAAyC,iBAAgB;AACtE,OAAO,MAAMC,uCAAuC,eAAc;AAClE,OAAO,MAAMC,kCAAkC,8BAA6B;AAC5E,OAAO,MAAMC,8BAA8B,UAAS;AACpD,OAAO,MAAMC,gCAAgC,QAAO;AACpD,OAAO,MAAMC,6BACX,4DAA2D;AAC7D,OAAO,MAAMC,6BAA6B,aAAY;AACtD,OAAO,MAAMC,gCAAgC,QAAO;AACpD,OAAO,MAAMC,4BAA4B,OAAM;AAC/C,OAAO,MAAMC,8BAA8B,QAAO;AAClD,OAAO,MAAMC,yBAAyB,IAAG;AACzC,OAAO,MAAMC,+BAA+B,UAAS;AACrD,OAAO,MAAMC,yBAAyB,UAAS;AAC/C,OAAO,MAAMC,2BAA2B,IAAG;AAC3C,OAAO,MAAMC,4BAA4B,IAAG;AAC5C,OAAO,MAAMC,6BAA6B,8CAA6C;AACvF,OAAO,MAAMC,aAAa,wBAAuB;AACjD,OAAO,MAAMC,2BAA2B,eAAc"}
@@ -2,5 +2,6 @@ import type { Endpoint } from 'payload';
2
2
  export type CreatePublishGeneratedDocsEndpointOptions = {
3
3
  docsCollectionSlug: string;
4
4
  docsSetsCollectionSlug: string;
5
+ markdownFieldName: string;
5
6
  };
6
- export declare const createPublishGeneratedDocsEndpoint: ({ docsCollectionSlug, docsSetsCollectionSlug, }: CreatePublishGeneratedDocsEndpointOptions) => Endpoint;
7
+ export declare const createPublishGeneratedDocsEndpoint: ({ docsCollectionSlug, docsSetsCollectionSlug, markdownFieldName, }: CreatePublishGeneratedDocsEndpointOptions) => Endpoint;
@@ -26,7 +26,7 @@ const redirectResponse = (location)=>new Response(null, {
26
26
  },
27
27
  status: 303
28
28
  });
29
- export const createPublishGeneratedDocsEndpoint = ({ docsCollectionSlug, docsSetsCollectionSlug })=>({
29
+ export const createPublishGeneratedDocsEndpoint = ({ docsCollectionSlug, docsSetsCollectionSlug, markdownFieldName })=>({
30
30
  handler: async (req)=>{
31
31
  if (!req.user) {
32
32
  return jsonResponse({
@@ -58,6 +58,7 @@ export const createPublishGeneratedDocsEndpoint = ({ docsCollectionSlug, docsSet
58
58
  const summary = await publishGeneratedDocsForSet({
59
59
  docsCollectionSlug,
60
60
  docsSetId,
61
+ markdownFieldName,
61
62
  payload: req.payload
62
63
  });
63
64
  const redirect = getRedirectTarget(req);
@@ -1 +1 @@
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
+ {"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 markdownFieldName: 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 markdownFieldName,\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 markdownFieldName,\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","markdownFieldName","handler","user","error","ok","docsSetId","payload","findByID","id","collection","depth","overrideAccess","summary","method","path"],"mappings":"AAIA,SAASA,0BAA0B,QAAQ,qCAAoC;AAY/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,EACtBC,iBAAiB,EACyB,GAAgB,CAAA;QAC1DC,SAAS,OAAOpB;YACd,IAAI,CAACA,IAAIqB,IAAI,EAAE;gBACb,OAAO3B,aACL;oBACE4B,OAAO;oBACPC,IAAI;gBACN,GACA;YAEJ;YAEA,MAAMC,YAAYzB,cAAcC,KAAK;YAErC,IAAIwB,cAAcpB,WAAW;gBAC3B,OAAOV,aACL;oBACE4B,OAAO;oBACPC,IAAI;gBACN,GACA;YAEJ;YAEA,IAAI;gBACF,MAAM,AAACvB,IAAIyB,OAAO,CAAqCC,QAAQ,CAAC;oBAC9DC,IAAIH;oBACJI,YAAYV;oBACZW,OAAO;oBACPC,gBAAgB;oBAChBT,MAAMrB,IAAIqB,IAAI;gBAChB;YACF,EAAE,OAAM;gBACN,OAAO3B,aACL;oBACE4B,OAAO;oBACPC,IAAI;gBACN,GACA;YAEJ;YAEA,MAAMQ,UAAU,MAAMtC,2BAA2B;gBAC/CwB;gBACAO;gBACAL;gBACAM,SAASzB,IAAIyB,OAAO;YACtB;YACA,MAAMjB,WAAWH,kBAAkBL;YAEnC,IAAIQ,UAAU;gBACZ,OAAOI,iBAAiBJ;YAC1B;YAEA,OAAOd,aAAa;gBAClB6B,IAAI;gBACJQ;YACF;QACF;QACAC,QAAQ;QACRC,MAAM;IACR,CAAA,EAAE"}
package/dist/index.d.ts CHANGED
@@ -1,9 +1,9 @@
1
- export { 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_MAX_DOCS_FILE_BYTES, DEFAULT_MAX_DOCS_FILES, DEFAULT_MAX_DOCS_TOTAL_BYTES, DEFAULT_MAX_SKEW_SECONDS, DEFAULT_NONCE_TTL_SECONDS, DEFAULT_PAGES_BRIDGE_FIELD, DEFAULT_PAGES_COLLECTION_SLUG, DEFAULT_PAGES_ROUTE_FIELD, DOCS_GLOBALS_ADMIN_GROUP, DOCS_SET_MANAGER_COMPONENT, } from './constants.js';
1
+ export { 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_MAX_DOCS_FILE_BYTES, DEFAULT_MAX_DOCS_FILES, DEFAULT_MAX_DOCS_TOTAL_BYTES, DEFAULT_MAX_SKEW_SECONDS, DEFAULT_MEDIA_COLLECTION_SLUG, DEFAULT_NONCE_TTL_SECONDS, DEFAULT_PAGES_BRIDGE_FIELD, DEFAULT_PAGES_COLLECTION_SLUG, DEFAULT_PAGES_ROUTE_FIELD, DOCS_GLOBALS_ADMIN_GROUP, DOCS_SET_MANAGER_COMPONENT, } from './constants.js';
2
2
  export { payloadMarkdownDocs } from './plugin.js';
3
3
  export { deriveDocsSetRouteBase, findPageRouteCollisions, findRouteReservationCollisions, isRouteDescendant, joinRouteSegments, normalizeRoutePath, } from './routing/index.js';
4
4
  export type { DocsRouteCollision, DocsRouteCollisionReason, DocsRouteReservation, DocsRouteReservationOwnerType, } from './routing/index.js';
5
5
  export { signDocsSyncRequest } from './security/index.js';
6
- export type { SignDocsSyncRequestOptions, SignedDocsSyncRequest, } from './security/index.js';
6
+ export type { SignDocsSyncRequestOptions, SignedDocsSyncRequest } from './security/index.js';
7
7
  export { buildDocsManifest, deriveRouteFromSourcePath, inferTitleFromMarkdown, normalizeDocsPath, parseDocsFrontmatter, planDocsSync, resolveDocsTitle, sha256Hex, titleFromSourcePath, validateDocsManifest, } from './sync/index.js';
8
8
  export type { DocsDeleteBehavior, DocsFrontmatter, DocsManifest, DocsManifestFile, DocsManifestInputFile, DocsManifestSource, DocsSyncMode, DocsSyncPlan, DocsValidationErrorCode, DocsValidationIssue, DocsValidationOptions, DocsValidationResult, ExistingDocsRecord, ParseDocsFrontmatterResult, PlannedDocChange, ValidatedDocsManifest, ValidatedDocsManifestFile, } from './sync/index.js';
9
- export type { PayloadMarkdownDocsAuthConfig, PayloadMarkdownDocsCollectionConfig, PayloadMarkdownDocsCollectionsConfig, PayloadMarkdownDocsConfig, PayloadMarkdownDocsEndpointConfig, PayloadMarkdownDocsPagesRoutingConfig, PayloadMarkdownDocsRoutingConfig, PayloadMarkdownDocsSyncConfig, PayloadMarkdownDocsTargetConfig, } from './types.js';
9
+ export type { PayloadMarkdownDocsAuthConfig, PayloadMarkdownDocsCollectionConfig, PayloadMarkdownDocsCollectionsConfig, PayloadMarkdownDocsConfig, PayloadMarkdownDocsEndpointConfig, PayloadMarkdownDocsHeroImageConfig, PayloadMarkdownDocsPagesRoutingConfig, PayloadMarkdownDocsRoutingConfig, PayloadMarkdownDocsSyncConfig, PayloadMarkdownDocsTargetConfig, } from './types.js';
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- export { 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_MAX_DOCS_FILE_BYTES, DEFAULT_MAX_DOCS_FILES, DEFAULT_MAX_DOCS_TOTAL_BYTES, DEFAULT_MAX_SKEW_SECONDS, DEFAULT_NONCE_TTL_SECONDS, DEFAULT_PAGES_BRIDGE_FIELD, DEFAULT_PAGES_COLLECTION_SLUG, DEFAULT_PAGES_ROUTE_FIELD, DOCS_GLOBALS_ADMIN_GROUP, DOCS_SET_MANAGER_COMPONENT } from './constants.js';
1
+ export { 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_MAX_DOCS_FILE_BYTES, DEFAULT_MAX_DOCS_FILES, DEFAULT_MAX_DOCS_TOTAL_BYTES, DEFAULT_MAX_SKEW_SECONDS, DEFAULT_MEDIA_COLLECTION_SLUG, DEFAULT_NONCE_TTL_SECONDS, DEFAULT_PAGES_BRIDGE_FIELD, DEFAULT_PAGES_COLLECTION_SLUG, DEFAULT_PAGES_ROUTE_FIELD, DOCS_GLOBALS_ADMIN_GROUP, DOCS_SET_MANAGER_COMPONENT } from './constants.js';
2
2
  export { payloadMarkdownDocs } from './plugin.js';
3
3
  export { deriveDocsSetRouteBase, findPageRouteCollisions, findRouteReservationCollisions, isRouteDescendant, joinRouteSegments, normalizeRoutePath } from './routing/index.js';
4
4
  export { signDocsSyncRequest } from './security/index.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export {\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_MAX_DOCS_FILE_BYTES,\n DEFAULT_MAX_DOCS_FILES,\n DEFAULT_MAX_DOCS_TOTAL_BYTES,\n DEFAULT_MAX_SKEW_SECONDS,\n DEFAULT_NONCE_TTL_SECONDS,\n DEFAULT_PAGES_BRIDGE_FIELD,\n DEFAULT_PAGES_COLLECTION_SLUG,\n DEFAULT_PAGES_ROUTE_FIELD,\n DOCS_GLOBALS_ADMIN_GROUP,\n DOCS_SET_MANAGER_COMPONENT,\n} from './constants.js'\nexport { payloadMarkdownDocs } from './plugin.js'\nexport {\n deriveDocsSetRouteBase,\n findPageRouteCollisions,\n findRouteReservationCollisions,\n isRouteDescendant,\n joinRouteSegments,\n normalizeRoutePath,\n} from './routing/index.js'\nexport type {\n DocsRouteCollision,\n DocsRouteCollisionReason,\n DocsRouteReservation,\n DocsRouteReservationOwnerType,\n} from './routing/index.js'\nexport { signDocsSyncRequest } from './security/index.js'\nexport type {\n SignDocsSyncRequestOptions,\n SignedDocsSyncRequest,\n} from './security/index.js'\nexport {\n buildDocsManifest,\n deriveRouteFromSourcePath,\n inferTitleFromMarkdown,\n normalizeDocsPath,\n parseDocsFrontmatter,\n planDocsSync,\n resolveDocsTitle,\n sha256Hex,\n titleFromSourcePath,\n validateDocsManifest,\n} from './sync/index.js'\nexport type {\n DocsDeleteBehavior,\n DocsFrontmatter,\n DocsManifest,\n DocsManifestFile,\n DocsManifestInputFile,\n DocsManifestSource,\n DocsSyncMode,\n DocsSyncPlan,\n DocsValidationErrorCode,\n DocsValidationIssue,\n DocsValidationOptions,\n DocsValidationResult,\n ExistingDocsRecord,\n ParseDocsFrontmatterResult,\n PlannedDocChange,\n ValidatedDocsManifest,\n ValidatedDocsManifestFile,\n} from './sync/index.js'\nexport type {\n PayloadMarkdownDocsAuthConfig,\n PayloadMarkdownDocsCollectionConfig,\n PayloadMarkdownDocsCollectionsConfig,\n PayloadMarkdownDocsConfig,\n PayloadMarkdownDocsEndpointConfig,\n PayloadMarkdownDocsPagesRoutingConfig,\n PayloadMarkdownDocsRoutingConfig,\n PayloadMarkdownDocsSyncConfig,\n PayloadMarkdownDocsTargetConfig,\n} from './types.js'\n"],"names":["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_MAX_DOCS_FILE_BYTES","DEFAULT_MAX_DOCS_FILES","DEFAULT_MAX_DOCS_TOTAL_BYTES","DEFAULT_MAX_SKEW_SECONDS","DEFAULT_NONCE_TTL_SECONDS","DEFAULT_PAGES_BRIDGE_FIELD","DEFAULT_PAGES_COLLECTION_SLUG","DEFAULT_PAGES_ROUTE_FIELD","DOCS_GLOBALS_ADMIN_GROUP","DOCS_SET_MANAGER_COMPONENT","payloadMarkdownDocs","deriveDocsSetRouteBase","findPageRouteCollisions","findRouteReservationCollisions","isRouteDescendant","joinRouteSegments","normalizeRoutePath","signDocsSyncRequest","buildDocsManifest","deriveRouteFromSourcePath","inferTitleFromMarkdown","normalizeDocsPath","parseDocsFrontmatter","planDocsSync","resolveDocsTitle","sha256Hex","titleFromSourcePath","validateDocsManifest"],"mappings":"AAAA,SACEA,4BAA4B,EAC5BC,mCAAmC,EACnCC,iCAAiC,EACjCC,iCAAiC,EACjCC,+BAA+B,EAC/BC,wCAAwC,EACxCC,sCAAsC,EACtCC,oCAAoC,EACpCC,2BAA2B,EAC3BC,sBAAsB,EACtBC,2BAA2B,EAC3BC,sBAAsB,EACtBC,4BAA4B,EAC5BC,wBAAwB,EACxBC,yBAAyB,EACzBC,0BAA0B,EAC1BC,6BAA6B,EAC7BC,yBAAyB,EACzBC,wBAAwB,EACxBC,0BAA0B,QACrB,iBAAgB;AACvB,SAASC,mBAAmB,QAAQ,cAAa;AACjD,SACEC,sBAAsB,EACtBC,uBAAuB,EACvBC,8BAA8B,EAC9BC,iBAAiB,EACjBC,iBAAiB,EACjBC,kBAAkB,QACb,qBAAoB;AAO3B,SAASC,mBAAmB,QAAQ,sBAAqB;AAKzD,SACEC,iBAAiB,EACjBC,yBAAyB,EACzBC,sBAAsB,EACtBC,iBAAiB,EACjBC,oBAAoB,EACpBC,YAAY,EACZC,gBAAgB,EAChBC,SAAS,EACTC,mBAAmB,EACnBC,oBAAoB,QACf,kBAAiB"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export {\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_MAX_DOCS_FILE_BYTES,\n DEFAULT_MAX_DOCS_FILES,\n DEFAULT_MAX_DOCS_TOTAL_BYTES,\n DEFAULT_MAX_SKEW_SECONDS,\n DEFAULT_MEDIA_COLLECTION_SLUG,\n DEFAULT_NONCE_TTL_SECONDS,\n DEFAULT_PAGES_BRIDGE_FIELD,\n DEFAULT_PAGES_COLLECTION_SLUG,\n DEFAULT_PAGES_ROUTE_FIELD,\n DOCS_GLOBALS_ADMIN_GROUP,\n DOCS_SET_MANAGER_COMPONENT,\n} from './constants.js'\nexport { payloadMarkdownDocs } from './plugin.js'\nexport {\n deriveDocsSetRouteBase,\n findPageRouteCollisions,\n findRouteReservationCollisions,\n isRouteDescendant,\n joinRouteSegments,\n normalizeRoutePath,\n} from './routing/index.js'\nexport type {\n DocsRouteCollision,\n DocsRouteCollisionReason,\n DocsRouteReservation,\n DocsRouteReservationOwnerType,\n} from './routing/index.js'\nexport { signDocsSyncRequest } from './security/index.js'\nexport type { SignDocsSyncRequestOptions, SignedDocsSyncRequest } from './security/index.js'\nexport {\n buildDocsManifest,\n deriveRouteFromSourcePath,\n inferTitleFromMarkdown,\n normalizeDocsPath,\n parseDocsFrontmatter,\n planDocsSync,\n resolveDocsTitle,\n sha256Hex,\n titleFromSourcePath,\n validateDocsManifest,\n} from './sync/index.js'\nexport type {\n DocsDeleteBehavior,\n DocsFrontmatter,\n DocsManifest,\n DocsManifestFile,\n DocsManifestInputFile,\n DocsManifestSource,\n DocsSyncMode,\n DocsSyncPlan,\n DocsValidationErrorCode,\n DocsValidationIssue,\n DocsValidationOptions,\n DocsValidationResult,\n ExistingDocsRecord,\n ParseDocsFrontmatterResult,\n PlannedDocChange,\n ValidatedDocsManifest,\n ValidatedDocsManifestFile,\n} from './sync/index.js'\nexport type {\n PayloadMarkdownDocsAuthConfig,\n PayloadMarkdownDocsCollectionConfig,\n PayloadMarkdownDocsCollectionsConfig,\n PayloadMarkdownDocsConfig,\n PayloadMarkdownDocsEndpointConfig,\n PayloadMarkdownDocsHeroImageConfig,\n PayloadMarkdownDocsPagesRoutingConfig,\n PayloadMarkdownDocsRoutingConfig,\n PayloadMarkdownDocsSyncConfig,\n PayloadMarkdownDocsTargetConfig,\n} from './types.js'\n"],"names":["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_MAX_DOCS_FILE_BYTES","DEFAULT_MAX_DOCS_FILES","DEFAULT_MAX_DOCS_TOTAL_BYTES","DEFAULT_MAX_SKEW_SECONDS","DEFAULT_MEDIA_COLLECTION_SLUG","DEFAULT_NONCE_TTL_SECONDS","DEFAULT_PAGES_BRIDGE_FIELD","DEFAULT_PAGES_COLLECTION_SLUG","DEFAULT_PAGES_ROUTE_FIELD","DOCS_GLOBALS_ADMIN_GROUP","DOCS_SET_MANAGER_COMPONENT","payloadMarkdownDocs","deriveDocsSetRouteBase","findPageRouteCollisions","findRouteReservationCollisions","isRouteDescendant","joinRouteSegments","normalizeRoutePath","signDocsSyncRequest","buildDocsManifest","deriveRouteFromSourcePath","inferTitleFromMarkdown","normalizeDocsPath","parseDocsFrontmatter","planDocsSync","resolveDocsTitle","sha256Hex","titleFromSourcePath","validateDocsManifest"],"mappings":"AAAA,SACEA,4BAA4B,EAC5BC,mCAAmC,EACnCC,iCAAiC,EACjCC,iCAAiC,EACjCC,+BAA+B,EAC/BC,wCAAwC,EACxCC,sCAAsC,EACtCC,oCAAoC,EACpCC,2BAA2B,EAC3BC,sBAAsB,EACtBC,2BAA2B,EAC3BC,sBAAsB,EACtBC,4BAA4B,EAC5BC,wBAAwB,EACxBC,6BAA6B,EAC7BC,yBAAyB,EACzBC,0BAA0B,EAC1BC,6BAA6B,EAC7BC,yBAAyB,EACzBC,wBAAwB,EACxBC,0BAA0B,QACrB,iBAAgB;AACvB,SAASC,mBAAmB,QAAQ,cAAa;AACjD,SACEC,sBAAsB,EACtBC,uBAAuB,EACvBC,8BAA8B,EAC9BC,iBAAiB,EACjBC,iBAAiB,EACjBC,kBAAkB,QACb,qBAAoB;AAO3B,SAASC,mBAAmB,QAAQ,sBAAqB;AAEzD,SACEC,iBAAiB,EACjBC,yBAAyB,EACzBC,sBAAsB,EACtBC,iBAAiB,EACjBC,oBAAoB,EACpBC,YAAY,EACZC,gBAAgB,EAChBC,SAAS,EACTC,mBAAmB,EACnBC,oBAAoB,QACf,kBAAiB"}
@@ -1,6 +1,22 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { DEFAULT_DOCS_COLLECTION_SLUG } from '../constants.js';
3
3
  const cx = (...values)=>values.filter(Boolean).join(' ');
4
+ const docsLayoutStyles = `
5
+ [data-payload-markdown-docs-layout] {
6
+ display: grid;
7
+ gap: 2.5rem;
8
+ grid-template-columns: minmax(0, 1fr);
9
+ }
10
+
11
+ @media (min-width: 1024px) {
12
+ [data-payload-markdown-docs-layout="with-sidebar"] {
13
+ grid-template-columns: 16rem minmax(0, 1fr);
14
+ }
15
+ }
16
+ `;
17
+ const getDocsLayoutStyle = (hasHero)=>hasHero ? {} : {
18
+ marginTop: '6rem'
19
+ };
4
20
  const renderSidebarItems = (items, activeRoute, depth = 0)=>{
5
21
  if (items.length === 0) {
6
22
  return null;
@@ -51,6 +67,32 @@ const DocsHeader = ({ doc, docsSet })=>{
51
67
  ]
52
68
  });
53
69
  };
70
+ const DocsHero = ({ heroImage, title })=>{
71
+ if (!heroImage) {
72
+ return null;
73
+ }
74
+ return /*#__PURE__*/ _jsx("figure", {
75
+ className: "mb-10 overflow-hidden rounded-xl border border-border bg-white/[0.03]",
76
+ "data-payload-markdown-docs-hero": true,
77
+ style: {
78
+ borderRadius: '0.75rem',
79
+ marginBottom: '2.5rem',
80
+ overflow: 'hidden'
81
+ },
82
+ children: /*#__PURE__*/ _jsx("img", {
83
+ alt: heroImage.alt ?? title,
84
+ className: "block h-auto w-full",
85
+ height: heroImage.height,
86
+ src: heroImage.url,
87
+ style: {
88
+ display: 'block',
89
+ height: 'auto',
90
+ width: '100%'
91
+ },
92
+ width: heroImage.width
93
+ })
94
+ });
95
+ };
54
96
  export const PayloadMarkdownDocsPage = async ({ collectionSlug = DEFAULT_DOCS_COLLECTION_SLUG, renderSidebar = true, resolved })=>{
55
97
  if (resolved.type === 'docsGroupIndex') {
56
98
  return /*#__PURE__*/ _jsx("main", {
@@ -106,32 +148,48 @@ export const PayloadMarkdownDocsPage = async ({ collectionSlug = DEFAULT_DOCS_CO
106
148
  collectionSlug,
107
149
  markdown: resolved.doc?.content
108
150
  });
109
- return /*#__PURE__*/ _jsx("main", {
151
+ const hasHero = Boolean(resolved.doc?.heroImage);
152
+ const hasSidebar = renderSidebar && resolved.sidebar.length > 0;
153
+ return /*#__PURE__*/ _jsxs("main", {
110
154
  className: "min-h-screen bg-background text-foreground",
111
155
  "data-payload-markdown-docs-route": resolved.route,
112
- children: /*#__PURE__*/ _jsxs("div", {
113
- className: cx('mx-auto grid w-full max-w-7xl gap-10 px-6 py-10 lg:px-8', renderSidebar && resolved.sidebar.length > 0 ? 'lg:grid-cols-[16rem_minmax(0,1fr)]' : 'lg:grid-cols-[minmax(0,1fr)]'),
114
- children: [
115
- renderSidebar && resolved.sidebar.length > 0 ? /*#__PURE__*/ _jsx("aside", {
116
- className: "lg:sticky lg:top-8 lg:self-start",
117
- children: /*#__PURE__*/ _jsx("nav", {
118
- "aria-label": "Docs navigation",
119
- className: "rounded-xl border border-border bg-white/[0.03] p-3",
120
- children: renderSidebarItems(resolved.sidebar, resolved.route)
156
+ children: [
157
+ /*#__PURE__*/ _jsx("style", {
158
+ children: docsLayoutStyles
159
+ }),
160
+ /*#__PURE__*/ _jsxs("div", {
161
+ className: "mx-auto w-full max-w-7xl px-6 py-10 lg:px-8",
162
+ "data-payload-markdown-docs-layout": hasSidebar ? 'with-sidebar' : 'default',
163
+ style: getDocsLayoutStyle(hasHero),
164
+ children: [
165
+ hasSidebar ? /*#__PURE__*/ _jsx("aside", {
166
+ className: "lg:sticky lg:top-8 lg:self-start",
167
+ style: {
168
+ alignSelf: 'start'
169
+ },
170
+ children: /*#__PURE__*/ _jsx("nav", {
171
+ "aria-label": "Docs navigation",
172
+ className: "rounded-xl border border-border bg-white/[0.03] p-3",
173
+ children: renderSidebarItems(resolved.sidebar, resolved.route)
174
+ })
175
+ }) : null,
176
+ /*#__PURE__*/ _jsxs("article", {
177
+ className: "min-w-0 max-w-4xl",
178
+ children: [
179
+ /*#__PURE__*/ _jsx(DocsHero, {
180
+ heroImage: resolved.doc?.heroImage,
181
+ title: resolved.doc?.title ?? resolved.docsSet.title
182
+ }),
183
+ /*#__PURE__*/ _jsx(DocsHeader, {
184
+ doc: resolved.doc,
185
+ docsSet: resolved.docsSet
186
+ }),
187
+ markdown
188
+ ]
121
189
  })
122
- }) : null,
123
- /*#__PURE__*/ _jsxs("article", {
124
- className: "min-w-0 max-w-4xl",
125
- children: [
126
- /*#__PURE__*/ _jsx(DocsHeader, {
127
- doc: resolved.doc,
128
- docsSet: resolved.docsSet
129
- }),
130
- markdown
131
- ]
132
- })
133
- ]
134
- })
190
+ ]
191
+ })
192
+ ]
135
193
  });
136
194
  };
137
195
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/next/PayloadMarkdownDocsPage.tsx"],"sourcesContent":["import type { ReactNode } from 'react'\n\nimport type {\n PayloadMarkdownDocsSidebarItem,\n ResolvedPayloadMarkdownDocsRecord,\n ResolvedPayloadMarkdownDocsRoute,\n ResolvedPayloadMarkdownDocsSet,\n} from './types.js'\n\nimport { DEFAULT_DOCS_COLLECTION_SLUG } from '../constants.js'\n\nexport type PayloadMarkdownDocsPageProps = {\n collectionSlug?: string\n renderSidebar?: boolean\n resolved: ResolvedPayloadMarkdownDocsRoute\n}\n\nconst cx = (...values: (false | null | string | undefined)[]): string =>\n values.filter(Boolean).join(' ')\n\nconst renderSidebarItems = (\n items: PayloadMarkdownDocsSidebarItem[],\n activeRoute: string,\n depth = 0,\n): ReactNode => {\n if (items.length === 0) {\n return null\n }\n\n return (\n <ul\n className={cx(\n depth === 0\n ? 'space-y-1'\n : 'ml-3 mt-1 space-y-1 border-l border-border pl-3',\n )}\n >\n {items.map((item) => (\n <li key={item.route}>\n <a\n className={cx(\n 'block rounded-lg px-3 py-2 text-sm leading-5 transition-colors',\n item.route === activeRoute\n ? 'bg-cyan-400/10 text-cyan-200'\n : 'text-foreground/70 hover:bg-white/[0.04] hover:text-foreground',\n )}\n href={item.route}\n >\n {item.label}\n </a>\n {item.children\n ? renderSidebarItems(item.children, activeRoute, depth + 1)\n : null}\n </li>\n ))}\n </ul>\n )\n}\n\nconst renderMarkdown = async ({\n collectionSlug,\n markdown,\n}: {\n collectionSlug: string\n markdown?: string\n}): Promise<ReactNode> => {\n if (!markdown?.trim()) {\n return null\n }\n\n const { MarkdownRenderer } = await import('@valkyrianlabs/payload-markdown/server')\n\n return MarkdownRenderer({\n className: 'min-w-0',\n collectionSlug,\n markdown,\n scope: 'field',\n size: 'md',\n variant: 'docs',\n wrapperClassName: 'min-w-0',\n })\n}\n\nconst DocsHeader = ({\n doc,\n docsSet,\n}: {\n doc?: ResolvedPayloadMarkdownDocsRecord\n docsSet: ResolvedPayloadMarkdownDocsSet\n}) => {\n const description =\n doc?.description ??\n docsSet.description\n const title = doc?.title ?? docsSet.title\n\n return (\n <header className=\"mb-10 border-b border-border pb-8\">\n <h1 className=\"text-4xl font-semibold tracking-tight text-foreground md:text-5xl\">\n {title}\n </h1>\n {description ? (\n <p className=\"mt-4 max-w-3xl text-lg leading-8 text-foreground/70\">\n {description}\n </p>\n ) : null}\n </header>\n )\n}\n\nexport const PayloadMarkdownDocsPage = async ({\n collectionSlug = DEFAULT_DOCS_COLLECTION_SLUG,\n renderSidebar = true,\n resolved,\n}: PayloadMarkdownDocsPageProps) => {\n if (resolved.type === 'docsGroupIndex') {\n return (\n <main\n className=\"min-h-screen bg-background text-foreground\"\n data-payload-markdown-docs-route={resolved.route}\n >\n <div className=\"mx-auto w-full max-w-6xl px-6 py-14 lg:px-8\">\n <header className=\"mb-10 border-b border-border pb-8\">\n <p className=\"mb-3 text-sm font-medium uppercase tracking-wide text-cyan-300\">\n Docs\n </p>\n <h1 className=\"text-4xl font-semibold tracking-tight md:text-5xl\">\n {resolved.group.navTitle ?? resolved.group.title}\n </h1>\n {resolved.group.description ? (\n <p className=\"mt-4 max-w-3xl text-lg leading-8 text-foreground/70\">\n {resolved.group.description}\n </p>\n ) : null}\n </header>\n {resolved.docsSets.length > 0 ? (\n <nav aria-label=\"Docs sets\">\n <ul className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {resolved.docsSets.map((docsSet) => (\n <li key={docsSet.id}>\n <a\n className=\"block rounded-xl border border-border bg-white/[0.03] p-5 transition-colors hover:bg-white/[0.06]\"\n href={docsSet.routeBase}\n >\n <span className=\"text-base font-semibold text-foreground\">\n {docsSet.navTitle ?? docsSet.title}\n </span>\n {docsSet.description ? (\n <span className=\"mt-2 block text-sm leading-6 text-foreground/65\">\n {docsSet.description}\n </span>\n ) : null}\n </a>\n </li>\n ))}\n </ul>\n </nav>\n ) : null}\n </div>\n </main>\n )\n }\n\n const markdown = await renderMarkdown({\n collectionSlug,\n markdown: resolved.doc?.content,\n })\n\n return (\n <main\n className=\"min-h-screen bg-background text-foreground\"\n data-payload-markdown-docs-route={resolved.route}\n >\n <div\n className={cx(\n 'mx-auto grid w-full max-w-7xl gap-10 px-6 py-10 lg:px-8',\n renderSidebar && resolved.sidebar.length > 0\n ? 'lg:grid-cols-[16rem_minmax(0,1fr)]'\n : 'lg:grid-cols-[minmax(0,1fr)]',\n )}\n >\n {renderSidebar && resolved.sidebar.length > 0 ? (\n <aside className=\"lg:sticky lg:top-8 lg:self-start\">\n <nav\n aria-label=\"Docs navigation\"\n className=\"rounded-xl border border-border bg-white/[0.03] p-3\"\n >\n {renderSidebarItems(resolved.sidebar, resolved.route)}\n </nav>\n </aside>\n ) : null}\n <article className=\"min-w-0 max-w-4xl\">\n <DocsHeader doc={resolved.doc} docsSet={resolved.docsSet} />\n {markdown}\n </article>\n </div>\n </main>\n )\n}\n"],"names":["DEFAULT_DOCS_COLLECTION_SLUG","cx","values","filter","Boolean","join","renderSidebarItems","items","activeRoute","depth","length","ul","className","map","item","li","a","route","href","label","children","renderMarkdown","collectionSlug","markdown","trim","MarkdownRenderer","scope","size","variant","wrapperClassName","DocsHeader","doc","docsSet","description","title","header","h1","p","PayloadMarkdownDocsPage","renderSidebar","resolved","type","main","data-payload-markdown-docs-route","div","group","navTitle","docsSets","nav","aria-label","routeBase","span","id","content","sidebar","aside","article"],"mappings":";AASA,SAASA,4BAA4B,QAAQ,kBAAiB;AAQ9D,MAAMC,KAAK,CAAC,GAAGC,SACbA,OAAOC,MAAM,CAACC,SAASC,IAAI,CAAC;AAE9B,MAAMC,qBAAqB,CACzBC,OACAC,aACAC,QAAQ,CAAC;IAET,IAAIF,MAAMG,MAAM,KAAK,GAAG;QACtB,OAAO;IACT;IAEA,qBACE,KAACC;QACCC,WAAWX,GACTQ,UAAU,IACN,cACA;kBAGLF,MAAMM,GAAG,CAAC,CAACC,qBACV,MAACC;;kCACC,KAACC;wBACCJ,WAAWX,GACT,kEACAa,KAAKG,KAAK,KAAKT,cACX,iCACA;wBAENU,MAAMJ,KAAKG,KAAK;kCAEfH,KAAKK,KAAK;;oBAEZL,KAAKM,QAAQ,GACVd,mBAAmBQ,KAAKM,QAAQ,EAAEZ,aAAaC,QAAQ,KACvD;;eAdGK,KAAKG,KAAK;;AAmB3B;AAEA,MAAMI,iBAAiB,OAAO,EAC5BC,cAAc,EACdC,QAAQ,EAIT;IACC,IAAI,CAACA,UAAUC,QAAQ;QACrB,OAAO;IACT;IAEA,MAAM,EAAEC,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC;IAE1C,OAAOA,iBAAiB;QACtBb,WAAW;QACXU;QACAC;QACAG,OAAO;QACPC,MAAM;QACNC,SAAS;QACTC,kBAAkB;IACpB;AACF;AAEA,MAAMC,aAAa,CAAC,EAClBC,GAAG,EACHC,OAAO,EAIR;IACC,MAAMC,cACJF,KAAKE,eACLD,QAAQC,WAAW;IACrB,MAAMC,QAAQH,KAAKG,SAASF,QAAQE,KAAK;IAEzC,qBACE,MAACC;QAAOvB,WAAU;;0BAChB,KAACwB;gBAAGxB,WAAU;0BACXsB;;YAEFD,4BACC,KAACI;gBAAEzB,WAAU;0BACVqB;iBAED;;;AAGV;AAEA,OAAO,MAAMK,0BAA0B,OAAO,EAC5ChB,iBAAiBtB,4BAA4B,EAC7CuC,gBAAgB,IAAI,EACpBC,QAAQ,EACqB;IAC7B,IAAIA,SAASC,IAAI,KAAK,kBAAkB;QACtC,qBACE,KAACC;YACC9B,WAAU;YACV+B,oCAAkCH,SAASvB,KAAK;sBAEhD,cAAA,MAAC2B;gBAAIhC,WAAU;;kCACb,MAACuB;wBAAOvB,WAAU;;0CAChB,KAACyB;gCAAEzB,WAAU;0CAAiE;;0CAG9E,KAACwB;gCAAGxB,WAAU;0CACX4B,SAASK,KAAK,CAACC,QAAQ,IAAIN,SAASK,KAAK,CAACX,KAAK;;4BAEjDM,SAASK,KAAK,CAACZ,WAAW,iBACzB,KAACI;gCAAEzB,WAAU;0CACV4B,SAASK,KAAK,CAACZ,WAAW;iCAE3B;;;oBAELO,SAASO,QAAQ,CAACrC,MAAM,GAAG,kBAC1B,KAACsC;wBAAIC,cAAW;kCACd,cAAA,KAACtC;4BAAGC,WAAU;sCACX4B,SAASO,QAAQ,CAAClC,GAAG,CAAC,CAACmB,wBACtB,KAACjB;8CACC,cAAA,MAACC;wCACCJ,WAAU;wCACVM,MAAMc,QAAQkB,SAAS;;0DAEvB,KAACC;gDAAKvC,WAAU;0DACboB,QAAQc,QAAQ,IAAId,QAAQE,KAAK;;4CAEnCF,QAAQC,WAAW,iBAClB,KAACkB;gDAAKvC,WAAU;0DACboB,QAAQC,WAAW;iDAEpB;;;mCAZCD,QAAQoB,EAAE;;yBAkBvB;;;;IAIZ;IAEA,MAAM7B,WAAW,MAAMF,eAAe;QACpCC;QACAC,UAAUiB,SAAST,GAAG,EAAEsB;IAC1B;IAEA,qBACE,KAACX;QACC9B,WAAU;QACV+B,oCAAkCH,SAASvB,KAAK;kBAEhD,cAAA,MAAC2B;YACChC,WAAWX,GACT,2DACAsC,iBAAiBC,SAASc,OAAO,CAAC5C,MAAM,GAAG,IACvC,uCACA;;gBAGL6B,iBAAiBC,SAASc,OAAO,CAAC5C,MAAM,GAAG,kBAC1C,KAAC6C;oBAAM3C,WAAU;8BACf,cAAA,KAACoC;wBACCC,cAAW;wBACXrC,WAAU;kCAETN,mBAAmBkC,SAASc,OAAO,EAAEd,SAASvB,KAAK;;qBAGtD;8BACJ,MAACuC;oBAAQ5C,WAAU;;sCACjB,KAACkB;4BAAWC,KAAKS,SAAST,GAAG;4BAAEC,SAASQ,SAASR,OAAO;;wBACvDT;;;;;;AAKX,EAAC"}
1
+ {"version":3,"sources":["../../src/next/PayloadMarkdownDocsPage.tsx"],"sourcesContent":["import type { CSSProperties, ReactNode } from 'react'\n\nimport type {\n PayloadMarkdownDocsHeroImage,\n PayloadMarkdownDocsSidebarItem,\n ResolvedPayloadMarkdownDocsRecord,\n ResolvedPayloadMarkdownDocsRoute,\n ResolvedPayloadMarkdownDocsSet,\n} from './types.js'\n\nimport { DEFAULT_DOCS_COLLECTION_SLUG } from '../constants.js'\n\nexport type PayloadMarkdownDocsPageProps = {\n collectionSlug?: string\n renderSidebar?: boolean\n resolved: ResolvedPayloadMarkdownDocsRoute\n}\n\nconst cx = (...values: (false | null | string | undefined)[]): string =>\n values.filter(Boolean).join(' ')\n\nconst docsLayoutStyles = `\n[data-payload-markdown-docs-layout] {\n display: grid;\n gap: 2.5rem;\n grid-template-columns: minmax(0, 1fr);\n}\n\n@media (min-width: 1024px) {\n [data-payload-markdown-docs-layout=\"with-sidebar\"] {\n grid-template-columns: 16rem minmax(0, 1fr);\n }\n}\n`\n\nconst getDocsLayoutStyle = (hasHero: boolean): CSSProperties =>\n hasHero\n ? {}\n : {\n marginTop: '6rem',\n }\n\nconst renderSidebarItems = (\n items: PayloadMarkdownDocsSidebarItem[],\n activeRoute: string,\n depth = 0,\n): ReactNode => {\n if (items.length === 0) {\n return null\n }\n\n return (\n <ul\n className={cx(depth === 0 ? 'space-y-1' : 'ml-3 mt-1 space-y-1 border-l border-border pl-3')}\n >\n {items.map((item) => (\n <li key={item.route}>\n <a\n className={cx(\n 'block rounded-lg px-3 py-2 text-sm leading-5 transition-colors',\n item.route === activeRoute\n ? 'bg-cyan-400/10 text-cyan-200'\n : 'text-foreground/70 hover:bg-white/[0.04] hover:text-foreground',\n )}\n href={item.route}\n >\n {item.label}\n </a>\n {item.children ? renderSidebarItems(item.children, activeRoute, depth + 1) : null}\n </li>\n ))}\n </ul>\n )\n}\n\nconst renderMarkdown = async ({\n collectionSlug,\n markdown,\n}: {\n collectionSlug: string\n markdown?: string\n}): Promise<ReactNode> => {\n if (!markdown?.trim()) {\n return null\n }\n\n const { MarkdownRenderer } = await import('@valkyrianlabs/payload-markdown/server')\n\n return MarkdownRenderer({\n className: 'min-w-0',\n collectionSlug,\n markdown,\n scope: 'field',\n size: 'md',\n variant: 'docs',\n wrapperClassName: 'min-w-0',\n })\n}\n\nconst DocsHeader = ({\n doc,\n docsSet,\n}: {\n doc?: ResolvedPayloadMarkdownDocsRecord\n docsSet: ResolvedPayloadMarkdownDocsSet\n}) => {\n const description = doc?.description ?? docsSet.description\n const title = doc?.title ?? docsSet.title\n\n return (\n <header className=\"mb-10 border-b border-border pb-8\">\n <h1 className=\"text-4xl font-semibold tracking-tight text-foreground md:text-5xl\">{title}</h1>\n {description ? (\n <p className=\"mt-4 max-w-3xl text-lg leading-8 text-foreground/70\">{description}</p>\n ) : null}\n </header>\n )\n}\n\nconst DocsHero = ({\n heroImage,\n title,\n}: {\n heroImage?: PayloadMarkdownDocsHeroImage\n title: string\n}) => {\n if (!heroImage) {\n return null\n }\n\n return (\n <figure\n className=\"mb-10 overflow-hidden rounded-xl border border-border bg-white/[0.03]\"\n data-payload-markdown-docs-hero\n style={{\n borderRadius: '0.75rem',\n marginBottom: '2.5rem',\n overflow: 'hidden',\n }}\n >\n <img\n alt={heroImage.alt ?? title}\n className=\"block h-auto w-full\"\n height={heroImage.height}\n src={heroImage.url}\n style={{\n display: 'block',\n height: 'auto',\n width: '100%',\n }}\n width={heroImage.width}\n />\n </figure>\n )\n}\n\nexport const PayloadMarkdownDocsPage = async ({\n collectionSlug = DEFAULT_DOCS_COLLECTION_SLUG,\n renderSidebar = true,\n resolved,\n}: PayloadMarkdownDocsPageProps) => {\n if (resolved.type === 'docsGroupIndex') {\n return (\n <main\n className=\"min-h-screen bg-background text-foreground\"\n data-payload-markdown-docs-route={resolved.route}\n >\n <div className=\"mx-auto w-full max-w-6xl px-6 py-14 lg:px-8\">\n <header className=\"mb-10 border-b border-border pb-8\">\n <p className=\"mb-3 text-sm font-medium uppercase tracking-wide text-cyan-300\">Docs</p>\n <h1 className=\"text-4xl font-semibold tracking-tight md:text-5xl\">\n {resolved.group.navTitle ?? resolved.group.title}\n </h1>\n {resolved.group.description ? (\n <p className=\"mt-4 max-w-3xl text-lg leading-8 text-foreground/70\">\n {resolved.group.description}\n </p>\n ) : null}\n </header>\n {resolved.docsSets.length > 0 ? (\n <nav aria-label=\"Docs sets\">\n <ul className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {resolved.docsSets.map((docsSet) => (\n <li key={docsSet.id}>\n <a\n className=\"block rounded-xl border border-border bg-white/[0.03] p-5 transition-colors hover:bg-white/[0.06]\"\n href={docsSet.routeBase}\n >\n <span className=\"text-base font-semibold text-foreground\">\n {docsSet.navTitle ?? docsSet.title}\n </span>\n {docsSet.description ? (\n <span className=\"mt-2 block text-sm leading-6 text-foreground/65\">\n {docsSet.description}\n </span>\n ) : null}\n </a>\n </li>\n ))}\n </ul>\n </nav>\n ) : null}\n </div>\n </main>\n )\n }\n\n const markdown = await renderMarkdown({\n collectionSlug,\n markdown: resolved.doc?.content,\n })\n const hasHero = Boolean(resolved.doc?.heroImage)\n const hasSidebar = renderSidebar && resolved.sidebar.length > 0\n\n return (\n <main\n className=\"min-h-screen bg-background text-foreground\"\n data-payload-markdown-docs-route={resolved.route}\n >\n <style>{docsLayoutStyles}</style>\n <div\n className=\"mx-auto w-full max-w-7xl px-6 py-10 lg:px-8\"\n data-payload-markdown-docs-layout={hasSidebar ? 'with-sidebar' : 'default'}\n style={getDocsLayoutStyle(hasHero)}\n >\n {hasSidebar ? (\n <aside\n className=\"lg:sticky lg:top-8 lg:self-start\"\n style={{\n alignSelf: 'start',\n }}\n >\n <nav\n aria-label=\"Docs navigation\"\n className=\"rounded-xl border border-border bg-white/[0.03] p-3\"\n >\n {renderSidebarItems(resolved.sidebar, resolved.route)}\n </nav>\n </aside>\n ) : null}\n <article className=\"min-w-0 max-w-4xl\">\n <DocsHero\n heroImage={resolved.doc?.heroImage}\n title={resolved.doc?.title ?? resolved.docsSet.title}\n />\n <DocsHeader doc={resolved.doc} docsSet={resolved.docsSet} />\n {markdown}\n </article>\n </div>\n </main>\n )\n}\n"],"names":["DEFAULT_DOCS_COLLECTION_SLUG","cx","values","filter","Boolean","join","docsLayoutStyles","getDocsLayoutStyle","hasHero","marginTop","renderSidebarItems","items","activeRoute","depth","length","ul","className","map","item","li","a","route","href","label","children","renderMarkdown","collectionSlug","markdown","trim","MarkdownRenderer","scope","size","variant","wrapperClassName","DocsHeader","doc","docsSet","description","title","header","h1","p","DocsHero","heroImage","figure","data-payload-markdown-docs-hero","style","borderRadius","marginBottom","overflow","img","alt","height","src","url","display","width","PayloadMarkdownDocsPage","renderSidebar","resolved","type","main","data-payload-markdown-docs-route","div","group","navTitle","docsSets","nav","aria-label","routeBase","span","id","content","hasSidebar","sidebar","data-payload-markdown-docs-layout","aside","alignSelf","article"],"mappings":"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"}
@@ -1,11 +1,11 @@
1
- export { getPayloadMarkdownDocsLinks, } from './links.js';
2
- export type { GetPayloadMarkdownDocsLinksOptions, PayloadMarkdownDocsLink, } from './links.js';
1
+ export { getPayloadMarkdownDocsLinks } from './links.js';
2
+ export type { GetPayloadMarkdownDocsLinksOptions, PayloadMarkdownDocsLink } from './links.js';
3
3
  export { createPayloadMarkdownDocsMarkdownResponse, resolvePayloadMarkdownDocsMarkdownRoute, } from './markdown.js';
4
4
  export type { ResolvedPayloadMarkdownDocsMarkdownRoute, ResolvePayloadMarkdownDocsMarkdownRouteOptions, } from './markdown.js';
5
- export { generatePayloadMarkdownDocsMetadata, getPayloadMarkdownDocsMetadata, } from './metadata.js';
5
+ export { generatePayloadMarkdownDocsMetadata, getPayloadMarkdownDocsMetadata } from './metadata.js';
6
6
  export { PayloadMarkdownDocsPage } from './PayloadMarkdownDocsPage.js';
7
7
  export type { PayloadMarkdownDocsPageProps } from './PayloadMarkdownDocsPage.js';
8
- export { getPayloadMarkdownDocsRoutePath, resolvePayloadMarkdownDocsRoute, } from './route.js';
9
- export { buildPayloadMarkdownDocsSidebar, getPayloadMarkdownDocsSidebar, } from './sidebar.js';
8
+ export { getPayloadMarkdownDocsRoutePath, resolvePayloadMarkdownDocsRoute } from './route.js';
9
+ export { buildPayloadMarkdownDocsSidebar, getPayloadMarkdownDocsSidebar } from './sidebar.js';
10
10
  export type { BuildPayloadMarkdownDocsSidebarOptions, GetPayloadMarkdownDocsSidebarOptions, } from './sidebar.js';
11
- export type { PayloadMarkdownDocsCollectionSlugs, PayloadMarkdownDocsDefaults, PayloadMarkdownDocsFindArgs, PayloadMarkdownDocsMetadata, PayloadMarkdownDocsOverrides, PayloadMarkdownDocsReadPayload, PayloadMarkdownDocsSidebarItem, ResolvedPayloadMarkdownDocsGroup, ResolvedPayloadMarkdownDocsRecord, ResolvedPayloadMarkdownDocsRoute, ResolvedPayloadMarkdownDocsSet, ResolvePayloadMarkdownDocsRouteOptions, } from './types.js';
11
+ export type { PayloadMarkdownDocsCollectionSlugs, PayloadMarkdownDocsDefaults, PayloadMarkdownDocsFindArgs, PayloadMarkdownDocsHeroImage, PayloadMarkdownDocsMetadata, PayloadMarkdownDocsOverrides, PayloadMarkdownDocsReadPayload, PayloadMarkdownDocsSidebarItem, ResolvedPayloadMarkdownDocsGroup, ResolvedPayloadMarkdownDocsRecord, ResolvedPayloadMarkdownDocsRoute, ResolvedPayloadMarkdownDocsSet, ResolvePayloadMarkdownDocsRouteOptions, } from './types.js';
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/next/index.ts"],"sourcesContent":["export {\n getPayloadMarkdownDocsLinks,\n} from './links.js'\nexport type {\n GetPayloadMarkdownDocsLinksOptions,\n PayloadMarkdownDocsLink,\n} from './links.js'\nexport {\n createPayloadMarkdownDocsMarkdownResponse,\n resolvePayloadMarkdownDocsMarkdownRoute,\n} from './markdown.js'\nexport type {\n ResolvedPayloadMarkdownDocsMarkdownRoute,\n ResolvePayloadMarkdownDocsMarkdownRouteOptions,\n} from './markdown.js'\nexport {\n generatePayloadMarkdownDocsMetadata,\n getPayloadMarkdownDocsMetadata,\n} from './metadata.js'\nexport { PayloadMarkdownDocsPage } from './PayloadMarkdownDocsPage.js'\nexport type { PayloadMarkdownDocsPageProps } from './PayloadMarkdownDocsPage.js'\nexport {\n getPayloadMarkdownDocsRoutePath,\n resolvePayloadMarkdownDocsRoute,\n} from './route.js'\nexport {\n buildPayloadMarkdownDocsSidebar,\n getPayloadMarkdownDocsSidebar,\n} from './sidebar.js'\nexport type {\n BuildPayloadMarkdownDocsSidebarOptions,\n GetPayloadMarkdownDocsSidebarOptions,\n} from './sidebar.js'\nexport type {\n PayloadMarkdownDocsCollectionSlugs,\n PayloadMarkdownDocsDefaults,\n PayloadMarkdownDocsFindArgs,\n PayloadMarkdownDocsMetadata,\n PayloadMarkdownDocsOverrides,\n PayloadMarkdownDocsReadPayload,\n PayloadMarkdownDocsSidebarItem,\n ResolvedPayloadMarkdownDocsGroup,\n ResolvedPayloadMarkdownDocsRecord,\n ResolvedPayloadMarkdownDocsRoute,\n ResolvedPayloadMarkdownDocsSet,\n ResolvePayloadMarkdownDocsRouteOptions,\n} from './types.js'\n"],"names":["getPayloadMarkdownDocsLinks","createPayloadMarkdownDocsMarkdownResponse","resolvePayloadMarkdownDocsMarkdownRoute","generatePayloadMarkdownDocsMetadata","getPayloadMarkdownDocsMetadata","PayloadMarkdownDocsPage","getPayloadMarkdownDocsRoutePath","resolvePayloadMarkdownDocsRoute","buildPayloadMarkdownDocsSidebar","getPayloadMarkdownDocsSidebar"],"mappings":"AAAA,SACEA,2BAA2B,QACtB,aAAY;AAKnB,SACEC,yCAAyC,EACzCC,uCAAuC,QAClC,gBAAe;AAKtB,SACEC,mCAAmC,EACnCC,8BAA8B,QACzB,gBAAe;AACtB,SAASC,uBAAuB,QAAQ,+BAA8B;AAEtE,SACEC,+BAA+B,EAC/BC,+BAA+B,QAC1B,aAAY;AACnB,SACEC,+BAA+B,EAC/BC,6BAA6B,QACxB,eAAc"}
1
+ {"version":3,"sources":["../../src/next/index.ts"],"sourcesContent":["export { getPayloadMarkdownDocsLinks } from './links.js'\nexport type { GetPayloadMarkdownDocsLinksOptions, PayloadMarkdownDocsLink } from './links.js'\nexport {\n createPayloadMarkdownDocsMarkdownResponse,\n resolvePayloadMarkdownDocsMarkdownRoute,\n} from './markdown.js'\nexport type {\n ResolvedPayloadMarkdownDocsMarkdownRoute,\n ResolvePayloadMarkdownDocsMarkdownRouteOptions,\n} from './markdown.js'\nexport { generatePayloadMarkdownDocsMetadata, getPayloadMarkdownDocsMetadata } from './metadata.js'\nexport { PayloadMarkdownDocsPage } from './PayloadMarkdownDocsPage.js'\nexport type { PayloadMarkdownDocsPageProps } from './PayloadMarkdownDocsPage.js'\nexport { getPayloadMarkdownDocsRoutePath, resolvePayloadMarkdownDocsRoute } from './route.js'\nexport { buildPayloadMarkdownDocsSidebar, getPayloadMarkdownDocsSidebar } from './sidebar.js'\nexport type {\n BuildPayloadMarkdownDocsSidebarOptions,\n GetPayloadMarkdownDocsSidebarOptions,\n} from './sidebar.js'\nexport type {\n PayloadMarkdownDocsCollectionSlugs,\n PayloadMarkdownDocsDefaults,\n PayloadMarkdownDocsFindArgs,\n PayloadMarkdownDocsHeroImage,\n PayloadMarkdownDocsMetadata,\n PayloadMarkdownDocsOverrides,\n PayloadMarkdownDocsReadPayload,\n PayloadMarkdownDocsSidebarItem,\n ResolvedPayloadMarkdownDocsGroup,\n ResolvedPayloadMarkdownDocsRecord,\n ResolvedPayloadMarkdownDocsRoute,\n ResolvedPayloadMarkdownDocsSet,\n ResolvePayloadMarkdownDocsRouteOptions,\n} from './types.js'\n"],"names":["getPayloadMarkdownDocsLinks","createPayloadMarkdownDocsMarkdownResponse","resolvePayloadMarkdownDocsMarkdownRoute","generatePayloadMarkdownDocsMetadata","getPayloadMarkdownDocsMetadata","PayloadMarkdownDocsPage","getPayloadMarkdownDocsRoutePath","resolvePayloadMarkdownDocsRoute","buildPayloadMarkdownDocsSidebar","getPayloadMarkdownDocsSidebar"],"mappings":"AAAA,SAASA,2BAA2B,QAAQ,aAAY;AAExD,SACEC,yCAAyC,EACzCC,uCAAuC,QAClC,gBAAe;AAKtB,SAASC,mCAAmC,EAAEC,8BAA8B,QAAQ,gBAAe;AACnG,SAASC,uBAAuB,QAAQ,+BAA8B;AAEtE,SAASC,+BAA+B,EAAEC,+BAA+B,QAAQ,aAAY;AAC7F,SAASC,+BAA+B,EAAEC,6BAA6B,QAAQ,eAAc"}
@@ -40,6 +40,24 @@ const toOverrides = (value)=>{
40
40
  });
41
41
  return Object.keys(overrides).length > 0 ? overrides : undefined;
42
42
  };
43
+ const toHeroImage = (value)=>{
44
+ const media = isRecord(value) && isRecord(value.value) ? value.value : value;
45
+ if (!isRecord(media)) {
46
+ return undefined;
47
+ }
48
+ const url = getOptionalString(media, 'url');
49
+ if (!url) {
50
+ return undefined;
51
+ }
52
+ return cleanObject({
53
+ id: getRecordId(media),
54
+ alt: getOptionalString(media, 'alt'),
55
+ height: getOptionalNumber(media, 'height'),
56
+ relationTo: isRecord(value) ? getOptionalString(value, 'relationTo') : undefined,
57
+ url,
58
+ width: getOptionalNumber(media, 'width')
59
+ });
60
+ };
43
61
  export const toResolvedDocsSet = (doc)=>{
44
62
  if (!isRecord(doc)) {
45
63
  return undefined;
@@ -110,6 +128,7 @@ export const toResolvedDocsRecord = ({ doc, markdownField })=>{
110
128
  depth: getOptionalNumber(doc, 'depth') ?? 0,
111
129
  description: getOptionalString(doc, 'description'),
112
130
  docsSetId: getRelationshipId(doc.docsSet),
131
+ heroImage: toHeroImage(doc.heroImage),
113
132
  navTitle: getOptionalString(doc, 'navTitle'),
114
133
  order: getOptionalNumber(doc, 'order') ?? 0,
115
134
  overrides: toOverrides(doc.overrides),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/next/records.ts"],"sourcesContent":["import type {\n PayloadMarkdownDocsDefaults,\n PayloadMarkdownDocsOverrides,\n ResolvedPayloadMarkdownDocsGroup,\n ResolvedPayloadMarkdownDocsRecord,\n ResolvedPayloadMarkdownDocsSet,\n} from './types.js'\n\nimport {\n deriveDocsSetRouteBase,\n normalizeRoutePath,\n} from '../routing/index.js'\nimport {\n isAiMarkdownExportManifestPath,\n validateDocsAiExportManifest,\n} from '../sync/index.js'\n\nexport const isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\nexport const getRecordId = (doc: Record<string, unknown>): string | undefined => {\n if (typeof doc.id === 'string' || typeof doc.id === 'number') {\n return String(doc.id)\n }\n\n return undefined\n}\n\nexport const getRelationshipId = (value: unknown): string | undefined => {\n if (typeof value === 'string' || typeof value === 'number') {\n return String(value)\n }\n\n if (isRecord(value)) {\n return getRecordId(value)\n }\n\n return undefined\n}\n\nconst getOptionalString = (\n doc: Record<string, unknown>,\n key: string,\n): string | undefined => (typeof doc[key] === 'string' ? doc[key] : undefined)\n\nconst getOptionalNumber = (\n doc: Record<string, unknown>,\n key: string,\n): number | undefined => (typeof doc[key] === 'number' ? doc[key] : undefined)\n\nconst getOptionalBoolean = (\n doc: Record<string, unknown>,\n key: string,\n): boolean | undefined => (typeof doc[key] === 'boolean' ? doc[key] : undefined)\n\nconst cleanObject = <T extends Record<string, unknown>>(input: T): Partial<T> =>\n Object.fromEntries(\n Object.entries(input).filter(([, value]) => value !== undefined && value !== null),\n ) as Partial<T>\n\nconst toDefaults = (value: unknown): PayloadMarkdownDocsDefaults | undefined => {\n if (!isRecord(value)) {\n return undefined\n }\n\n const sidebarMode: PayloadMarkdownDocsDefaults['sidebarMode'] =\n value.sidebarMode === 'auto' ||\n value.sidebarMode === 'hidden' ||\n value.sidebarMode === 'manual'\n ? value.sidebarMode\n : undefined\n const defaults = cleanObject({\n sidebarMode,\n } satisfies PayloadMarkdownDocsDefaults)\n\n return Object.keys(defaults).length > 0\n ? (defaults as PayloadMarkdownDocsDefaults)\n : undefined\n}\n\nconst toOverrides = (value: unknown): PayloadMarkdownDocsOverrides | undefined => {\n if (!isRecord(value)) {\n return undefined\n }\n\n const overrides = cleanObject({\n hideFromNav: getOptionalBoolean(value, 'hideFromNav'),\n navTitle: getOptionalString(value, 'navTitle'),\n })\n\n return Object.keys(overrides).length > 0 ? overrides : undefined\n}\n\nexport const toResolvedDocsSet = (\n doc: unknown,\n): ResolvedPayloadMarkdownDocsSet | undefined => {\n if (!isRecord(doc)) {\n return undefined\n }\n\n const id = getRecordId(doc)\n const routeBase = getOptionalString(doc, 'routeBase')\n const title = getOptionalString(doc, 'title')\n const slug = getOptionalString(doc, 'slug')\n\n if (!id || !title || (!routeBase && !slug)) {\n return undefined\n }\n\n const aiExportValidation =\n doc.aiExport === undefined || doc.aiExport === null\n ? undefined\n : validateDocsAiExportManifest(doc.aiExport)\n\n return {\n ...(aiExportValidation?.ok ? { aiExport: aiExportValidation.manifest } : {}),\n id,\n slug,\n defaults: toDefaults(doc.defaults),\n description: getOptionalString(doc, 'description'),\n navTitle: getOptionalString(doc, 'navTitle'),\n order: getOptionalNumber(doc, 'order') ?? 0,\n routeBase: normalizeRoutePath(\n routeBase ??\n deriveDocsSetRouteBase({\n docsSetSlug: slug ?? id,\n }),\n ),\n title,\n }\n}\n\nexport const toResolvedDocsGroup = (\n doc: unknown,\n): ResolvedPayloadMarkdownDocsGroup | undefined => {\n if (!isRecord(doc)) {\n return undefined\n }\n\n const id = getRecordId(doc)\n const routePath = getOptionalString(doc, 'routePath')\n const title = getOptionalString(doc, 'title')\n const slug = getOptionalString(doc, 'slug')\n\n if (!id || !title || (!routePath && !slug)) {\n return undefined\n }\n\n return {\n id,\n slug,\n description: getOptionalString(doc, 'description'),\n navTitle: getOptionalString(doc, 'navTitle'),\n order: getOptionalNumber(doc, 'order') ?? 0,\n routePath: normalizeRoutePath(routePath ?? `/${slug}`),\n serveIndex: getOptionalBoolean(doc, 'serveIndex') ?? false,\n title,\n }\n}\n\nexport const toResolvedDocsRecord = ({\n doc,\n markdownField,\n}: {\n doc: unknown\n markdownField: string\n}): ResolvedPayloadMarkdownDocsRecord | undefined => {\n if (!isRecord(doc)) {\n return undefined\n }\n\n const id = getRecordId(doc)\n const route = getOptionalString(doc, 'route')\n const sourcePath = getOptionalString(doc, 'sourcePath')\n const title = getOptionalString(doc, 'title')\n\n if (!id || !route || !sourcePath || !title) {\n return undefined\n }\n\n const sync = isRecord(doc.sync) ? doc.sync : undefined\n const status =\n doc._status === 'draft' || doc._status === 'published' ? doc._status : undefined\n\n return {\n id,\n archived: getOptionalBoolean(sync ?? {}, 'archived') ?? false,\n content:\n typeof doc[markdownField] === 'string' ? doc[markdownField] : undefined,\n depth: getOptionalNumber(doc, 'depth') ?? 0,\n description: getOptionalString(doc, 'description'),\n docsSetId: getRelationshipId(doc.docsSet),\n navTitle: getOptionalString(doc, 'navTitle'),\n order: getOptionalNumber(doc, 'order') ?? 0,\n overrides: toOverrides(doc.overrides),\n route: normalizeRoutePath(route),\n sourceHash: getOptionalString(doc, 'sourceHash'),\n sourcePath,\n status,\n title,\n }\n}\n\nexport const isVisibleDocsRecord = ({\n includeDrafts = false,\n record,\n}: {\n includeDrafts?: boolean\n record: ResolvedPayloadMarkdownDocsRecord\n}): boolean => {\n if (record.archived) {\n return false\n }\n\n if (isAiMarkdownExportManifestPath(record.sourcePath)) {\n return false\n }\n\n if (!includeDrafts && record.status === 'draft') {\n return false\n }\n\n return true\n}\n"],"names":["deriveDocsSetRouteBase","normalizeRoutePath","isAiMarkdownExportManifestPath","validateDocsAiExportManifest","isRecord","value","Array","isArray","getRecordId","doc","id","String","undefined","getRelationshipId","getOptionalString","key","getOptionalNumber","getOptionalBoolean","cleanObject","input","Object","fromEntries","entries","filter","toDefaults","sidebarMode","defaults","keys","length","toOverrides","overrides","hideFromNav","navTitle","toResolvedDocsSet","routeBase","title","slug","aiExportValidation","aiExport","ok","manifest","description","order","docsSetSlug","toResolvedDocsGroup","routePath","serveIndex","toResolvedDocsRecord","markdownField","route","sourcePath","sync","status","_status","archived","content","depth","docsSetId","docsSet","sourceHash","isVisibleDocsRecord","includeDrafts","record"],"mappings":"AAQA,SACEA,sBAAsB,EACtBC,kBAAkB,QACb,sBAAqB;AAC5B,SACEC,8BAA8B,EAC9BC,4BAA4B,QACvB,mBAAkB;AAEzB,OAAO,MAAMC,WAAW,CAACC,QACvB,OAAOA,UAAU,YAAYA,UAAU,QAAQ,CAACC,MAAMC,OAAO,CAACF,OAAM;AAEtE,OAAO,MAAMG,cAAc,CAACC;IAC1B,IAAI,OAAOA,IAAIC,EAAE,KAAK,YAAY,OAAOD,IAAIC,EAAE,KAAK,UAAU;QAC5D,OAAOC,OAAOF,IAAIC,EAAE;IACtB;IAEA,OAAOE;AACT,EAAC;AAED,OAAO,MAAMC,oBAAoB,CAACR;IAChC,IAAI,OAAOA,UAAU,YAAY,OAAOA,UAAU,UAAU;QAC1D,OAAOM,OAAON;IAChB;IAEA,IAAID,SAASC,QAAQ;QACnB,OAAOG,YAAYH;IACrB;IAEA,OAAOO;AACT,EAAC;AAED,MAAME,oBAAoB,CACxBL,KACAM,MACwB,OAAON,GAAG,CAACM,IAAI,KAAK,WAAWN,GAAG,CAACM,IAAI,GAAGH;AAEpE,MAAMI,oBAAoB,CACxBP,KACAM,MACwB,OAAON,GAAG,CAACM,IAAI,KAAK,WAAWN,GAAG,CAACM,IAAI,GAAGH;AAEpE,MAAMK,qBAAqB,CACzBR,KACAM,MACyB,OAAON,GAAG,CAACM,IAAI,KAAK,YAAYN,GAAG,CAACM,IAAI,GAAGH;AAEtE,MAAMM,cAAc,CAAoCC,QACtDC,OAAOC,WAAW,CAChBD,OAAOE,OAAO,CAACH,OAAOI,MAAM,CAAC,CAAC,GAAGlB,MAAM,GAAKA,UAAUO,aAAaP,UAAU;AAGjF,MAAMmB,aAAa,CAACnB;IAClB,IAAI,CAACD,SAASC,QAAQ;QACpB,OAAOO;IACT;IAEA,MAAMa,cACJpB,MAAMoB,WAAW,KAAK,UACtBpB,MAAMoB,WAAW,KAAK,YACtBpB,MAAMoB,WAAW,KAAK,WAClBpB,MAAMoB,WAAW,GACjBb;IACN,MAAMc,WAAWR,YAAY;QAC3BO;IACF;IAEA,OAAOL,OAAOO,IAAI,CAACD,UAAUE,MAAM,GAAG,IACjCF,WACDd;AACN;AAEA,MAAMiB,cAAc,CAACxB;IACnB,IAAI,CAACD,SAASC,QAAQ;QACpB,OAAOO;IACT;IAEA,MAAMkB,YAAYZ,YAAY;QAC5Ba,aAAad,mBAAmBZ,OAAO;QACvC2B,UAAUlB,kBAAkBT,OAAO;IACrC;IAEA,OAAOe,OAAOO,IAAI,CAACG,WAAWF,MAAM,GAAG,IAAIE,YAAYlB;AACzD;AAEA,OAAO,MAAMqB,oBAAoB,CAC/BxB;IAEA,IAAI,CAACL,SAASK,MAAM;QAClB,OAAOG;IACT;IAEA,MAAMF,KAAKF,YAAYC;IACvB,MAAMyB,YAAYpB,kBAAkBL,KAAK;IACzC,MAAM0B,QAAQrB,kBAAkBL,KAAK;IACrC,MAAM2B,OAAOtB,kBAAkBL,KAAK;IAEpC,IAAI,CAACC,MAAM,CAACyB,SAAU,CAACD,aAAa,CAACE,MAAO;QAC1C,OAAOxB;IACT;IAEA,MAAMyB,qBACJ5B,IAAI6B,QAAQ,KAAK1B,aAAaH,IAAI6B,QAAQ,KAAK,OAC3C1B,YACAT,6BAA6BM,IAAI6B,QAAQ;IAE/C,OAAO;QACL,GAAID,oBAAoBE,KAAK;YAAED,UAAUD,mBAAmBG,QAAQ;QAAC,IAAI,CAAC,CAAC;QAC3E9B;QACA0B;QACAV,UAAUF,WAAWf,IAAIiB,QAAQ;QACjCe,aAAa3B,kBAAkBL,KAAK;QACpCuB,UAAUlB,kBAAkBL,KAAK;QACjCiC,OAAO1B,kBAAkBP,KAAK,YAAY;QAC1CyB,WAAWjC,mBACTiC,aACElC,uBAAuB;YACrB2C,aAAaP,QAAQ1B;QACvB;QAEJyB;IACF;AACF,EAAC;AAED,OAAO,MAAMS,sBAAsB,CACjCnC;IAEA,IAAI,CAACL,SAASK,MAAM;QAClB,OAAOG;IACT;IAEA,MAAMF,KAAKF,YAAYC;IACvB,MAAMoC,YAAY/B,kBAAkBL,KAAK;IACzC,MAAM0B,QAAQrB,kBAAkBL,KAAK;IACrC,MAAM2B,OAAOtB,kBAAkBL,KAAK;IAEpC,IAAI,CAACC,MAAM,CAACyB,SAAU,CAACU,aAAa,CAACT,MAAO;QAC1C,OAAOxB;IACT;IAEA,OAAO;QACLF;QACA0B;QACAK,aAAa3B,kBAAkBL,KAAK;QACpCuB,UAAUlB,kBAAkBL,KAAK;QACjCiC,OAAO1B,kBAAkBP,KAAK,YAAY;QAC1CoC,WAAW5C,mBAAmB4C,aAAa,CAAC,CAAC,EAAET,MAAM;QACrDU,YAAY7B,mBAAmBR,KAAK,iBAAiB;QACrD0B;IACF;AACF,EAAC;AAED,OAAO,MAAMY,uBAAuB,CAAC,EACnCtC,GAAG,EACHuC,aAAa,EAId;IACC,IAAI,CAAC5C,SAASK,MAAM;QAClB,OAAOG;IACT;IAEA,MAAMF,KAAKF,YAAYC;IACvB,MAAMwC,QAAQnC,kBAAkBL,KAAK;IACrC,MAAMyC,aAAapC,kBAAkBL,KAAK;IAC1C,MAAM0B,QAAQrB,kBAAkBL,KAAK;IAErC,IAAI,CAACC,MAAM,CAACuC,SAAS,CAACC,cAAc,CAACf,OAAO;QAC1C,OAAOvB;IACT;IAEA,MAAMuC,OAAO/C,SAASK,IAAI0C,IAAI,IAAI1C,IAAI0C,IAAI,GAAGvC;IAC7C,MAAMwC,SACJ3C,IAAI4C,OAAO,KAAK,WAAW5C,IAAI4C,OAAO,KAAK,cAAc5C,IAAI4C,OAAO,GAAGzC;IAEzE,OAAO;QACLF;QACA4C,UAAUrC,mBAAmBkC,QAAQ,CAAC,GAAG,eAAe;QACxDI,SACE,OAAO9C,GAAG,CAACuC,cAAc,KAAK,WAAWvC,GAAG,CAACuC,cAAc,GAAGpC;QAChE4C,OAAOxC,kBAAkBP,KAAK,YAAY;QAC1CgC,aAAa3B,kBAAkBL,KAAK;QACpCgD,WAAW5C,kBAAkBJ,IAAIiD,OAAO;QACxC1B,UAAUlB,kBAAkBL,KAAK;QACjCiC,OAAO1B,kBAAkBP,KAAK,YAAY;QAC1CqB,WAAWD,YAAYpB,IAAIqB,SAAS;QACpCmB,OAAOhD,mBAAmBgD;QAC1BU,YAAY7C,kBAAkBL,KAAK;QACnCyC;QACAE;QACAjB;IACF;AACF,EAAC;AAED,OAAO,MAAMyB,sBAAsB,CAAC,EAClCC,gBAAgB,KAAK,EACrBC,MAAM,EAIP;IACC,IAAIA,OAAOR,QAAQ,EAAE;QACnB,OAAO;IACT;IAEA,IAAIpD,+BAA+B4D,OAAOZ,UAAU,GAAG;QACrD,OAAO;IACT;IAEA,IAAI,CAACW,iBAAiBC,OAAOV,MAAM,KAAK,SAAS;QAC/C,OAAO;IACT;IAEA,OAAO;AACT,EAAC"}
1
+ {"version":3,"sources":["../../src/next/records.ts"],"sourcesContent":["import type {\n PayloadMarkdownDocsDefaults,\n PayloadMarkdownDocsHeroImage,\n PayloadMarkdownDocsOverrides,\n ResolvedPayloadMarkdownDocsGroup,\n ResolvedPayloadMarkdownDocsRecord,\n ResolvedPayloadMarkdownDocsSet,\n} from './types.js'\n\nimport { deriveDocsSetRouteBase, normalizeRoutePath } from '../routing/index.js'\nimport { isAiMarkdownExportManifestPath, validateDocsAiExportManifest } from '../sync/index.js'\n\nexport const isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\nexport const getRecordId = (doc: Record<string, unknown>): string | undefined => {\n if (typeof doc.id === 'string' || typeof doc.id === 'number') {\n return String(doc.id)\n }\n\n return undefined\n}\n\nexport const getRelationshipId = (value: unknown): string | undefined => {\n if (typeof value === 'string' || typeof value === 'number') {\n return String(value)\n }\n\n if (isRecord(value)) {\n return getRecordId(value)\n }\n\n return undefined\n}\n\nconst getOptionalString = (doc: Record<string, unknown>, key: string): string | undefined =>\n typeof doc[key] === 'string' ? doc[key] : undefined\n\nconst getOptionalNumber = (doc: Record<string, unknown>, key: string): number | undefined =>\n typeof doc[key] === 'number' ? doc[key] : undefined\n\nconst getOptionalBoolean = (doc: Record<string, unknown>, key: string): boolean | undefined =>\n typeof doc[key] === 'boolean' ? doc[key] : undefined\n\nconst cleanObject = <T extends Record<string, unknown>>(input: T): Partial<T> =>\n Object.fromEntries(\n Object.entries(input).filter(([, value]) => value !== undefined && value !== null),\n ) as Partial<T>\n\nconst toDefaults = (value: unknown): PayloadMarkdownDocsDefaults | undefined => {\n if (!isRecord(value)) {\n return undefined\n }\n\n const sidebarMode: PayloadMarkdownDocsDefaults['sidebarMode'] =\n value.sidebarMode === 'auto' || value.sidebarMode === 'hidden' || value.sidebarMode === 'manual'\n ? value.sidebarMode\n : undefined\n const defaults = cleanObject({\n sidebarMode,\n } satisfies PayloadMarkdownDocsDefaults)\n\n return Object.keys(defaults).length > 0 ? (defaults as PayloadMarkdownDocsDefaults) : undefined\n}\n\nconst toOverrides = (value: unknown): PayloadMarkdownDocsOverrides | undefined => {\n if (!isRecord(value)) {\n return undefined\n }\n\n const overrides = cleanObject({\n hideFromNav: getOptionalBoolean(value, 'hideFromNav'),\n navTitle: getOptionalString(value, 'navTitle'),\n })\n\n return Object.keys(overrides).length > 0 ? overrides : undefined\n}\n\nconst toHeroImage = (value: unknown): PayloadMarkdownDocsHeroImage | undefined => {\n const media = isRecord(value) && isRecord(value.value) ? value.value : value\n\n if (!isRecord(media)) {\n return undefined\n }\n\n const url = getOptionalString(media, 'url')\n\n if (!url) {\n return undefined\n }\n\n return cleanObject({\n id: getRecordId(media),\n alt: getOptionalString(media, 'alt'),\n height: getOptionalNumber(media, 'height'),\n relationTo: isRecord(value) ? getOptionalString(value, 'relationTo') : undefined,\n url,\n width: getOptionalNumber(media, 'width'),\n }) as PayloadMarkdownDocsHeroImage\n}\n\nexport const toResolvedDocsSet = (doc: unknown): ResolvedPayloadMarkdownDocsSet | undefined => {\n if (!isRecord(doc)) {\n return undefined\n }\n\n const id = getRecordId(doc)\n const routeBase = getOptionalString(doc, 'routeBase')\n const title = getOptionalString(doc, 'title')\n const slug = getOptionalString(doc, 'slug')\n\n if (!id || !title || (!routeBase && !slug)) {\n return undefined\n }\n\n const aiExportValidation =\n doc.aiExport === undefined || doc.aiExport === null\n ? undefined\n : validateDocsAiExportManifest(doc.aiExport)\n\n return {\n ...(aiExportValidation?.ok ? { aiExport: aiExportValidation.manifest } : {}),\n id,\n slug,\n defaults: toDefaults(doc.defaults),\n description: getOptionalString(doc, 'description'),\n navTitle: getOptionalString(doc, 'navTitle'),\n order: getOptionalNumber(doc, 'order') ?? 0,\n routeBase: normalizeRoutePath(\n routeBase ??\n deriveDocsSetRouteBase({\n docsSetSlug: slug ?? id,\n }),\n ),\n title,\n }\n}\n\nexport const toResolvedDocsGroup = (doc: unknown): ResolvedPayloadMarkdownDocsGroup | undefined => {\n if (!isRecord(doc)) {\n return undefined\n }\n\n const id = getRecordId(doc)\n const routePath = getOptionalString(doc, 'routePath')\n const title = getOptionalString(doc, 'title')\n const slug = getOptionalString(doc, 'slug')\n\n if (!id || !title || (!routePath && !slug)) {\n return undefined\n }\n\n return {\n id,\n slug,\n description: getOptionalString(doc, 'description'),\n navTitle: getOptionalString(doc, 'navTitle'),\n order: getOptionalNumber(doc, 'order') ?? 0,\n routePath: normalizeRoutePath(routePath ?? `/${slug}`),\n serveIndex: getOptionalBoolean(doc, 'serveIndex') ?? false,\n title,\n }\n}\n\nexport const toResolvedDocsRecord = ({\n doc,\n markdownField,\n}: {\n doc: unknown\n markdownField: string\n}): ResolvedPayloadMarkdownDocsRecord | undefined => {\n if (!isRecord(doc)) {\n return undefined\n }\n\n const id = getRecordId(doc)\n const route = getOptionalString(doc, 'route')\n const sourcePath = getOptionalString(doc, 'sourcePath')\n const title = getOptionalString(doc, 'title')\n\n if (!id || !route || !sourcePath || !title) {\n return undefined\n }\n\n const sync = isRecord(doc.sync) ? doc.sync : undefined\n const status = doc._status === 'draft' || doc._status === 'published' ? doc._status : undefined\n\n return {\n id,\n archived: getOptionalBoolean(sync ?? {}, 'archived') ?? false,\n content: typeof doc[markdownField] === 'string' ? doc[markdownField] : undefined,\n depth: getOptionalNumber(doc, 'depth') ?? 0,\n description: getOptionalString(doc, 'description'),\n docsSetId: getRelationshipId(doc.docsSet),\n heroImage: toHeroImage(doc.heroImage),\n navTitle: getOptionalString(doc, 'navTitle'),\n order: getOptionalNumber(doc, 'order') ?? 0,\n overrides: toOverrides(doc.overrides),\n route: normalizeRoutePath(route),\n sourceHash: getOptionalString(doc, 'sourceHash'),\n sourcePath,\n status,\n title,\n }\n}\n\nexport const isVisibleDocsRecord = ({\n includeDrafts = false,\n record,\n}: {\n includeDrafts?: boolean\n record: ResolvedPayloadMarkdownDocsRecord\n}): boolean => {\n if (record.archived) {\n return false\n }\n\n if (isAiMarkdownExportManifestPath(record.sourcePath)) {\n return false\n }\n\n if (!includeDrafts && record.status === 'draft') {\n return false\n }\n\n return true\n}\n"],"names":["deriveDocsSetRouteBase","normalizeRoutePath","isAiMarkdownExportManifestPath","validateDocsAiExportManifest","isRecord","value","Array","isArray","getRecordId","doc","id","String","undefined","getRelationshipId","getOptionalString","key","getOptionalNumber","getOptionalBoolean","cleanObject","input","Object","fromEntries","entries","filter","toDefaults","sidebarMode","defaults","keys","length","toOverrides","overrides","hideFromNav","navTitle","toHeroImage","media","url","alt","height","relationTo","width","toResolvedDocsSet","routeBase","title","slug","aiExportValidation","aiExport","ok","manifest","description","order","docsSetSlug","toResolvedDocsGroup","routePath","serveIndex","toResolvedDocsRecord","markdownField","route","sourcePath","sync","status","_status","archived","content","depth","docsSetId","docsSet","heroImage","sourceHash","isVisibleDocsRecord","includeDrafts","record"],"mappings":"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"}
@@ -33,6 +33,14 @@ export type PayloadMarkdownDocsOverrides = {
33
33
  hideFromNav?: boolean;
34
34
  navTitle?: string;
35
35
  };
36
+ export type PayloadMarkdownDocsHeroImage = {
37
+ alt?: string;
38
+ height?: number;
39
+ id?: string;
40
+ relationTo?: string;
41
+ url: string;
42
+ width?: number;
43
+ };
36
44
  export type ResolvedPayloadMarkdownDocsSet = {
37
45
  aiExport?: DocsAiExportManifest;
38
46
  defaults?: PayloadMarkdownDocsDefaults;
@@ -60,6 +68,7 @@ export type ResolvedPayloadMarkdownDocsRecord = {
60
68
  depth: number;
61
69
  description?: string;
62
70
  docsSetId?: string;
71
+ heroImage?: PayloadMarkdownDocsHeroImage;
63
72
  id: string;
64
73
  navTitle?: string;
65
74
  order: number;
@@ -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 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 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 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":"AAkHA,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 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 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":"AA4HA,WAGC"}
@@ -20,7 +20,18 @@ export const findDocsSyncConflicts = ({ existingBySourcePath, plannedChanges })=
20
20
  continue;
21
21
  }
22
22
  const currentContentHash = sha256Hex(current.content ?? '');
23
- if (currentContentHash !== current.sync.sourceHashAtLastSync) {
23
+ const expectedContentHash = current.sync.contentHashAtLastSync;
24
+ if (expectedContentHash) {
25
+ if (currentContentHash !== expectedContentHash) {
26
+ conflicts.push({
27
+ reason: 'current_content_hash_mismatch',
28
+ route: current.route,
29
+ sourcePath: current.sourcePath
30
+ });
31
+ }
32
+ continue;
33
+ }
34
+ if (currentContentHash !== current.sync.sourceHashAtLastSync && current.sourceHash !== current.sync.sourceHashAtLastSync) {
24
35
  conflicts.push({
25
36
  reason: 'current_content_hash_mismatch',
26
37
  route: current.route,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/payload/docsConflicts.ts"],"sourcesContent":["import type { PlannedDocChange } from '../sync/index.js'\nimport type { ExistingPayloadDocsRecord } from './existingDocs.js'\n\nimport { MANAGED_BY } from '../constants.js'\nimport { sha256Hex } from '../sync/index.js'\n\nexport type DocsSyncConflictReason =\n | 'current_content_hash_mismatch'\n | 'missing_current_record'\n | 'unmanaged_record'\n\nexport type DocsSyncConflict = {\n reason: DocsSyncConflictReason\n route?: string\n sourcePath: string\n}\n\nexport const findDocsSyncConflicts = ({\n existingBySourcePath,\n plannedChanges,\n}: {\n existingBySourcePath: Map<string, ExistingPayloadDocsRecord>\n plannedChanges: PlannedDocChange[]\n}): DocsSyncConflict[] => {\n const conflicts: DocsSyncConflict[] = []\n\n for (const change of plannedChanges) {\n const current = existingBySourcePath.get(change.sourcePath)\n\n if (!current) {\n conflicts.push({\n reason: 'missing_current_record',\n sourcePath: change.sourcePath,\n })\n continue\n }\n\n if (current.sync?.managedBy !== MANAGED_BY) {\n conflicts.push({\n reason: 'unmanaged_record',\n route: current.route,\n sourcePath: current.sourcePath,\n })\n continue\n }\n\n const currentContentHash = sha256Hex(current.content ?? '')\n\n if (currentContentHash !== current.sync.sourceHashAtLastSync) {\n conflicts.push({\n reason: 'current_content_hash_mismatch',\n route: current.route,\n sourcePath: current.sourcePath,\n })\n }\n }\n\n return conflicts\n}\n\n"],"names":["MANAGED_BY","sha256Hex","findDocsSyncConflicts","existingBySourcePath","plannedChanges","conflicts","change","current","get","sourcePath","push","reason","sync","managedBy","route","currentContentHash","content","sourceHashAtLastSync"],"mappings":"AAGA,SAASA,UAAU,QAAQ,kBAAiB;AAC5C,SAASC,SAAS,QAAQ,mBAAkB;AAa5C,OAAO,MAAMC,wBAAwB,CAAC,EACpCC,oBAAoB,EACpBC,cAAc,EAIf;IACC,MAAMC,YAAgC,EAAE;IAExC,KAAK,MAAMC,UAAUF,eAAgB;QACnC,MAAMG,UAAUJ,qBAAqBK,GAAG,CAACF,OAAOG,UAAU;QAE1D,IAAI,CAACF,SAAS;YACZF,UAAUK,IAAI,CAAC;gBACbC,QAAQ;gBACRF,YAAYH,OAAOG,UAAU;YAC/B;YACA;QACF;QAEA,IAAIF,QAAQK,IAAI,EAAEC,cAAcb,YAAY;YAC1CK,UAAUK,IAAI,CAAC;gBACbC,QAAQ;gBACRG,OAAOP,QAAQO,KAAK;gBACpBL,YAAYF,QAAQE,UAAU;YAChC;YACA;QACF;QAEA,MAAMM,qBAAqBd,UAAUM,QAAQS,OAAO,IAAI;QAExD,IAAID,uBAAuBR,QAAQK,IAAI,CAACK,oBAAoB,EAAE;YAC5DZ,UAAUK,IAAI,CAAC;gBACbC,QAAQ;gBACRG,OAAOP,QAAQO,KAAK;gBACpBL,YAAYF,QAAQE,UAAU;YAChC;QACF;IACF;IAEA,OAAOJ;AACT,EAAC"}
1
+ {"version":3,"sources":["../../src/payload/docsConflicts.ts"],"sourcesContent":["import type { PlannedDocChange } from '../sync/index.js'\nimport type { ExistingPayloadDocsRecord } from './existingDocs.js'\n\nimport { MANAGED_BY } from '../constants.js'\nimport { sha256Hex } from '../sync/index.js'\n\nexport type DocsSyncConflictReason =\n | 'current_content_hash_mismatch'\n | 'missing_current_record'\n | 'unmanaged_record'\n\nexport type DocsSyncConflict = {\n reason: DocsSyncConflictReason\n route?: string\n sourcePath: string\n}\n\nexport const findDocsSyncConflicts = ({\n existingBySourcePath,\n plannedChanges,\n}: {\n existingBySourcePath: Map<string, ExistingPayloadDocsRecord>\n plannedChanges: PlannedDocChange[]\n}): DocsSyncConflict[] => {\n const conflicts: DocsSyncConflict[] = []\n\n for (const change of plannedChanges) {\n const current = existingBySourcePath.get(change.sourcePath)\n\n if (!current) {\n conflicts.push({\n reason: 'missing_current_record',\n sourcePath: change.sourcePath,\n })\n continue\n }\n\n if (current.sync?.managedBy !== MANAGED_BY) {\n conflicts.push({\n reason: 'unmanaged_record',\n route: current.route,\n sourcePath: current.sourcePath,\n })\n continue\n }\n\n const currentContentHash = sha256Hex(current.content ?? '')\n const expectedContentHash = current.sync.contentHashAtLastSync\n\n if (expectedContentHash) {\n if (currentContentHash !== expectedContentHash) {\n conflicts.push({\n reason: 'current_content_hash_mismatch',\n route: current.route,\n sourcePath: current.sourcePath,\n })\n }\n\n continue\n }\n\n if (\n currentContentHash !== current.sync.sourceHashAtLastSync &&\n current.sourceHash !== current.sync.sourceHashAtLastSync\n ) {\n conflicts.push({\n reason: 'current_content_hash_mismatch',\n route: current.route,\n sourcePath: current.sourcePath,\n })\n }\n }\n\n return conflicts\n}\n"],"names":["MANAGED_BY","sha256Hex","findDocsSyncConflicts","existingBySourcePath","plannedChanges","conflicts","change","current","get","sourcePath","push","reason","sync","managedBy","route","currentContentHash","content","expectedContentHash","contentHashAtLastSync","sourceHashAtLastSync","sourceHash"],"mappings":"AAGA,SAASA,UAAU,QAAQ,kBAAiB;AAC5C,SAASC,SAAS,QAAQ,mBAAkB;AAa5C,OAAO,MAAMC,wBAAwB,CAAC,EACpCC,oBAAoB,EACpBC,cAAc,EAIf;IACC,MAAMC,YAAgC,EAAE;IAExC,KAAK,MAAMC,UAAUF,eAAgB;QACnC,MAAMG,UAAUJ,qBAAqBK,GAAG,CAACF,OAAOG,UAAU;QAE1D,IAAI,CAACF,SAAS;YACZF,UAAUK,IAAI,CAAC;gBACbC,QAAQ;gBACRF,YAAYH,OAAOG,UAAU;YAC/B;YACA;QACF;QAEA,IAAIF,QAAQK,IAAI,EAAEC,cAAcb,YAAY;YAC1CK,UAAUK,IAAI,CAAC;gBACbC,QAAQ;gBACRG,OAAOP,QAAQO,KAAK;gBACpBL,YAAYF,QAAQE,UAAU;YAChC;YACA;QACF;QAEA,MAAMM,qBAAqBd,UAAUM,QAAQS,OAAO,IAAI;QACxD,MAAMC,sBAAsBV,QAAQK,IAAI,CAACM,qBAAqB;QAE9D,IAAID,qBAAqB;YACvB,IAAIF,uBAAuBE,qBAAqB;gBAC9CZ,UAAUK,IAAI,CAAC;oBACbC,QAAQ;oBACRG,OAAOP,QAAQO,KAAK;oBACpBL,YAAYF,QAAQE,UAAU;gBAChC;YACF;YAEA;QACF;QAEA,IACEM,uBAAuBR,QAAQK,IAAI,CAACO,oBAAoB,IACxDZ,QAAQa,UAAU,KAAKb,QAAQK,IAAI,CAACO,oBAAoB,EACxD;YACAd,UAAUK,IAAI,CAAC;gBACbC,QAAQ;gBACRG,OAAOP,QAAQO,KAAK;gBACpBL,YAAYF,QAAQE,UAAU;YAChC;QACF;IACF;IAEA,OAAOJ;AACT,EAAC"}
@@ -1,4 +1,5 @@
1
1
  import { MANAGED_BY } from '../constants.js';
2
+ import { sha256Hex } from '../sync/index.js';
2
3
  export const getDocsDepth = (sourcePath)=>sourcePath === 'index.md' ? 0 : Math.max(0, sourcePath.split('/').length - 1);
3
4
  const getDraftStatusForDocsData = ({ current, docsEnableDrafts, publishMode })=>{
4
5
  if (!docsEnableDrafts) {
@@ -33,6 +34,7 @@ export const buildDocsData = ({ current, desired, docsEnableDrafts, docsSetId, m
33
34
  sync: {
34
35
  archived: false,
35
36
  archivedAt: null,
37
+ contentHashAtLastSync: sha256Hex(desired.content),
36
38
  lastSyncedAt: now.toISOString(),
37
39
  lastSyncRunId: syncRunId,
38
40
  managedBy: MANAGED_BY,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/payload/docsData.ts"],"sourcesContent":["import type {\n ValidatedDocsManifest,\n ValidatedDocsManifestFile,\n} from '../sync/index.js'\nimport type { ExistingPayloadDocsRecord } from './existingDocs.js'\n\nimport { MANAGED_BY } from '../constants.js'\n\nexport type BuildDocsDataInput = {\n current?: ExistingPayloadDocsRecord\n desired: ValidatedDocsManifestFile\n docsEnableDrafts: boolean\n docsSetId?: number | string\n manifest: ValidatedDocsManifest\n markdownFieldName: string\n now: Date\n publishMode: DocsPublishMode\n syncRunId?: number | string\n}\n\nexport type DocsDraftStatus = 'draft' | 'published'\n\nexport type DocsPublishMode = 'draft' | 'preserve' | 'published'\n\nexport const getDocsDepth = (sourcePath: string): number =>\n sourcePath === 'index.md' ? 0 : Math.max(0, sourcePath.split('/').length - 1)\n\nconst getDraftStatusForDocsData = ({\n current,\n docsEnableDrafts,\n publishMode,\n}: {\n current?: ExistingPayloadDocsRecord\n docsEnableDrafts: boolean\n publishMode: DocsPublishMode\n}): DocsDraftStatus | undefined => {\n if (!docsEnableDrafts) {\n return undefined\n }\n\n if (publishMode === 'draft' || publishMode === 'published') {\n return publishMode\n }\n\n return current ? current.status : 'draft'\n}\n\nexport const buildDocsData = ({\n current,\n desired,\n docsEnableDrafts,\n docsSetId,\n manifest,\n markdownFieldName,\n now,\n publishMode,\n syncRunId,\n}: BuildDocsDataInput): Record<string, unknown> => {\n const draftStatus = getDraftStatusForDocsData({\n current,\n docsEnableDrafts,\n publishMode,\n })\n\n return {\n ...(draftStatus ? { _status: draftStatus } : {}),\n depth: getDocsDepth(desired.path),\n description: desired.frontmatter.description,\n ...(docsSetId ? { docsSet: docsSetId } : {}),\n [markdownFieldName]: desired.content,\n navTitle: desired.frontmatter.navTitle,\n order: desired.frontmatter.order ?? 0,\n route: desired.route,\n sourceHash: desired.sha256,\n sourcePath: desired.path,\n sync: {\n archived: false,\n archivedAt: null,\n lastSyncedAt: now.toISOString(),\n lastSyncRunId: syncRunId,\n managedBy: MANAGED_BY,\n sourceHashAtLastSync: desired.sha256,\n sourceId: manifest.source.id,\n sourcePath: desired.path,\n },\n title: desired.title,\n }\n}\n\nexport const buildArchiveData = ({\n docsEnableDrafts = false,\n draftMissing = false,\n now,\n syncRunId,\n}: {\n docsEnableDrafts?: boolean\n draftMissing?: boolean\n now: Date\n syncRunId?: number | string\n}): Record<string, unknown> => ({\n ...(draftMissing && docsEnableDrafts ? { _status: 'draft' } : {}),\n sync: {\n archived: true,\n archivedAt: now.toISOString(),\n lastSyncedAt: now.toISOString(),\n lastSyncRunId: syncRunId,\n managedBy: MANAGED_BY,\n },\n})\n"],"names":["MANAGED_BY","getDocsDepth","sourcePath","Math","max","split","length","getDraftStatusForDocsData","current","docsEnableDrafts","publishMode","undefined","status","buildDocsData","desired","docsSetId","manifest","markdownFieldName","now","syncRunId","draftStatus","_status","depth","path","description","frontmatter","docsSet","content","navTitle","order","route","sourceHash","sha256","sync","archived","archivedAt","lastSyncedAt","toISOString","lastSyncRunId","managedBy","sourceHashAtLastSync","sourceId","source","id","title","buildArchiveData","draftMissing"],"mappings":"AAMA,SAASA,UAAU,QAAQ,kBAAiB;AAkB5C,OAAO,MAAMC,eAAe,CAACC,aAC3BA,eAAe,aAAa,IAAIC,KAAKC,GAAG,CAAC,GAAGF,WAAWG,KAAK,CAAC,KAAKC,MAAM,GAAG,GAAE;AAE/E,MAAMC,4BAA4B,CAAC,EACjCC,OAAO,EACPC,gBAAgB,EAChBC,WAAW,EAKZ;IACC,IAAI,CAACD,kBAAkB;QACrB,OAAOE;IACT;IAEA,IAAID,gBAAgB,WAAWA,gBAAgB,aAAa;QAC1D,OAAOA;IACT;IAEA,OAAOF,UAAUA,QAAQI,MAAM,GAAG;AACpC;AAEA,OAAO,MAAMC,gBAAgB,CAAC,EAC5BL,OAAO,EACPM,OAAO,EACPL,gBAAgB,EAChBM,SAAS,EACTC,QAAQ,EACRC,iBAAiB,EACjBC,GAAG,EACHR,WAAW,EACXS,SAAS,EACU;IACnB,MAAMC,cAAcb,0BAA0B;QAC5CC;QACAC;QACAC;IACF;IAEA,OAAO;QACL,GAAIU,cAAc;YAAEC,SAASD;QAAY,IAAI,CAAC,CAAC;QAC/CE,OAAOrB,aAAaa,QAAQS,IAAI;QAChCC,aAAaV,QAAQW,WAAW,CAACD,WAAW;QAC5C,GAAIT,YAAY;YAAEW,SAASX;QAAU,IAAI,CAAC,CAAC;QAC3C,CAACE,kBAAkB,EAAEH,QAAQa,OAAO;QACpCC,UAAUd,QAAQW,WAAW,CAACG,QAAQ;QACtCC,OAAOf,QAAQW,WAAW,CAACI,KAAK,IAAI;QACpCC,OAAOhB,QAAQgB,KAAK;QACpBC,YAAYjB,QAAQkB,MAAM;QAC1B9B,YAAYY,QAAQS,IAAI;QACxBU,MAAM;YACJC,UAAU;YACVC,YAAY;YACZC,cAAclB,IAAImB,WAAW;YAC7BC,eAAenB;YACfoB,WAAWvC;YACXwC,sBAAsB1B,QAAQkB,MAAM;YACpCS,UAAUzB,SAAS0B,MAAM,CAACC,EAAE;YAC5BzC,YAAYY,QAAQS,IAAI;QAC1B;QACAqB,OAAO9B,QAAQ8B,KAAK;IACtB;AACF,EAAC;AAED,OAAO,MAAMC,mBAAmB,CAAC,EAC/BpC,mBAAmB,KAAK,EACxBqC,eAAe,KAAK,EACpB5B,GAAG,EACHC,SAAS,EAMV,GAA+B,CAAA;QAC9B,GAAI2B,gBAAgBrC,mBAAmB;YAAEY,SAAS;QAAQ,IAAI,CAAC,CAAC;QAChEY,MAAM;YACJC,UAAU;YACVC,YAAYjB,IAAImB,WAAW;YAC3BD,cAAclB,IAAImB,WAAW;YAC7BC,eAAenB;YACfoB,WAAWvC;QACb;IACF,CAAA,EAAE"}
1
+ {"version":3,"sources":["../../src/payload/docsData.ts"],"sourcesContent":["import type { ValidatedDocsManifest, ValidatedDocsManifestFile } from '../sync/index.js'\nimport type { ExistingPayloadDocsRecord } from './existingDocs.js'\n\nimport { MANAGED_BY } from '../constants.js'\nimport { sha256Hex } from '../sync/index.js'\n\nexport type BuildDocsDataInput = {\n current?: ExistingPayloadDocsRecord\n desired: ValidatedDocsManifestFile\n docsEnableDrafts: boolean\n docsSetId?: number | string\n manifest: ValidatedDocsManifest\n markdownFieldName: string\n now: Date\n publishMode: DocsPublishMode\n syncRunId?: number | string\n}\n\nexport type DocsDraftStatus = 'draft' | 'published'\n\nexport type DocsPublishMode = 'draft' | 'preserve' | 'published'\n\nexport const getDocsDepth = (sourcePath: string): number =>\n sourcePath === 'index.md' ? 0 : Math.max(0, sourcePath.split('/').length - 1)\n\nconst getDraftStatusForDocsData = ({\n current,\n docsEnableDrafts,\n publishMode,\n}: {\n current?: ExistingPayloadDocsRecord\n docsEnableDrafts: boolean\n publishMode: DocsPublishMode\n}): DocsDraftStatus | undefined => {\n if (!docsEnableDrafts) {\n return undefined\n }\n\n if (publishMode === 'draft' || publishMode === 'published') {\n return publishMode\n }\n\n return current ? current.status : 'draft'\n}\n\nexport const buildDocsData = ({\n current,\n desired,\n docsEnableDrafts,\n docsSetId,\n manifest,\n markdownFieldName,\n now,\n publishMode,\n syncRunId,\n}: BuildDocsDataInput): Record<string, unknown> => {\n const draftStatus = getDraftStatusForDocsData({\n current,\n docsEnableDrafts,\n publishMode,\n })\n\n return {\n ...(draftStatus ? { _status: draftStatus } : {}),\n depth: getDocsDepth(desired.path),\n description: desired.frontmatter.description,\n ...(docsSetId ? { docsSet: docsSetId } : {}),\n [markdownFieldName]: desired.content,\n navTitle: desired.frontmatter.navTitle,\n order: desired.frontmatter.order ?? 0,\n route: desired.route,\n sourceHash: desired.sha256,\n sourcePath: desired.path,\n sync: {\n archived: false,\n archivedAt: null,\n contentHashAtLastSync: sha256Hex(desired.content),\n lastSyncedAt: now.toISOString(),\n lastSyncRunId: syncRunId,\n managedBy: MANAGED_BY,\n sourceHashAtLastSync: desired.sha256,\n sourceId: manifest.source.id,\n sourcePath: desired.path,\n },\n title: desired.title,\n }\n}\n\nexport const buildArchiveData = ({\n docsEnableDrafts = false,\n draftMissing = false,\n now,\n syncRunId,\n}: {\n docsEnableDrafts?: boolean\n draftMissing?: boolean\n now: Date\n syncRunId?: number | string\n}): Record<string, unknown> => ({\n ...(draftMissing && docsEnableDrafts ? { _status: 'draft' } : {}),\n sync: {\n archived: true,\n archivedAt: now.toISOString(),\n lastSyncedAt: now.toISOString(),\n lastSyncRunId: syncRunId,\n managedBy: MANAGED_BY,\n },\n})\n"],"names":["MANAGED_BY","sha256Hex","getDocsDepth","sourcePath","Math","max","split","length","getDraftStatusForDocsData","current","docsEnableDrafts","publishMode","undefined","status","buildDocsData","desired","docsSetId","manifest","markdownFieldName","now","syncRunId","draftStatus","_status","depth","path","description","frontmatter","docsSet","content","navTitle","order","route","sourceHash","sha256","sync","archived","archivedAt","contentHashAtLastSync","lastSyncedAt","toISOString","lastSyncRunId","managedBy","sourceHashAtLastSync","sourceId","source","id","title","buildArchiveData","draftMissing"],"mappings":"AAGA,SAASA,UAAU,QAAQ,kBAAiB;AAC5C,SAASC,SAAS,QAAQ,mBAAkB;AAkB5C,OAAO,MAAMC,eAAe,CAACC,aAC3BA,eAAe,aAAa,IAAIC,KAAKC,GAAG,CAAC,GAAGF,WAAWG,KAAK,CAAC,KAAKC,MAAM,GAAG,GAAE;AAE/E,MAAMC,4BAA4B,CAAC,EACjCC,OAAO,EACPC,gBAAgB,EAChBC,WAAW,EAKZ;IACC,IAAI,CAACD,kBAAkB;QACrB,OAAOE;IACT;IAEA,IAAID,gBAAgB,WAAWA,gBAAgB,aAAa;QAC1D,OAAOA;IACT;IAEA,OAAOF,UAAUA,QAAQI,MAAM,GAAG;AACpC;AAEA,OAAO,MAAMC,gBAAgB,CAAC,EAC5BL,OAAO,EACPM,OAAO,EACPL,gBAAgB,EAChBM,SAAS,EACTC,QAAQ,EACRC,iBAAiB,EACjBC,GAAG,EACHR,WAAW,EACXS,SAAS,EACU;IACnB,MAAMC,cAAcb,0BAA0B;QAC5CC;QACAC;QACAC;IACF;IAEA,OAAO;QACL,GAAIU,cAAc;YAAEC,SAASD;QAAY,IAAI,CAAC,CAAC;QAC/CE,OAAOrB,aAAaa,QAAQS,IAAI;QAChCC,aAAaV,QAAQW,WAAW,CAACD,WAAW;QAC5C,GAAIT,YAAY;YAAEW,SAASX;QAAU,IAAI,CAAC,CAAC;QAC3C,CAACE,kBAAkB,EAAEH,QAAQa,OAAO;QACpCC,UAAUd,QAAQW,WAAW,CAACG,QAAQ;QACtCC,OAAOf,QAAQW,WAAW,CAACI,KAAK,IAAI;QACpCC,OAAOhB,QAAQgB,KAAK;QACpBC,YAAYjB,QAAQkB,MAAM;QAC1B9B,YAAYY,QAAQS,IAAI;QACxBU,MAAM;YACJC,UAAU;YACVC,YAAY;YACZC,uBAAuBpC,UAAUc,QAAQa,OAAO;YAChDU,cAAcnB,IAAIoB,WAAW;YAC7BC,eAAepB;YACfqB,WAAWzC;YACX0C,sBAAsB3B,QAAQkB,MAAM;YACpCU,UAAU1B,SAAS2B,MAAM,CAACC,EAAE;YAC5B1C,YAAYY,QAAQS,IAAI;QAC1B;QACAsB,OAAO/B,QAAQ+B,KAAK;IACtB;AACF,EAAC;AAED,OAAO,MAAMC,mBAAmB,CAAC,EAC/BrC,mBAAmB,KAAK,EACxBsC,eAAe,KAAK,EACpB7B,GAAG,EACHC,SAAS,EAMV,GAA+B,CAAA;QAC9B,GAAI4B,gBAAgBtC,mBAAmB;YAAEY,SAAS;QAAQ,IAAI,CAAC,CAAC;QAChEY,MAAM;YACJC,UAAU;YACVC,YAAYjB,IAAIoB,WAAW;YAC3BD,cAAcnB,IAAIoB,WAAW;YAC7BC,eAAepB;YACfqB,WAAWzC;QACb;IACF,CAAA,EAAE"}
@@ -18,6 +18,7 @@ export type ExistingPayloadDocsRecord = {
18
18
  sync?: {
19
19
  archived?: boolean;
20
20
  archivedAt?: null | string;
21
+ contentHashAtLastSync?: string;
21
22
  lastSyncedAt?: string;
22
23
  lastSyncRunId?: string;
23
24
  managedBy?: string;
@@ -36,6 +36,7 @@ const toExistingPayloadDocsRecord = ({ doc, markdownFieldName })=>{
36
36
  sync: sync ? {
37
37
  archived: typeof sync.archived === 'boolean' ? sync.archived : undefined,
38
38
  archivedAt: typeof sync.archivedAt === 'string' || sync.archivedAt === null ? sync.archivedAt : undefined,
39
+ contentHashAtLastSync: typeof sync.contentHashAtLastSync === 'string' ? sync.contentHashAtLastSync : undefined,
39
40
  lastSyncedAt: typeof sync.lastSyncedAt === 'string' ? sync.lastSyncedAt : undefined,
40
41
  lastSyncRunId: typeof sync.lastSyncRunId === 'string' ? sync.lastSyncRunId : undefined,
41
42
  managedBy: typeof sync.managedBy === 'string' ? sync.managedBy : undefined,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/payload/existingDocs.ts"],"sourcesContent":["import type { ExistingDocsRecord } from '../sync/index.js'\n\nexport type ExistingDocsPayloadOperations = {\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}\n\nexport type ExistingPayloadDocsRecord = {\n content?: string\n docsSetId?: number | string\n id: string\n status?: 'draft' | 'published'\n sync?: {\n archived?: boolean\n archivedAt?: null | string\n lastSyncedAt?: string\n lastSyncRunId?: string\n managedBy?: string\n sourceHashAtLastSync?: string\n sourceId?: string\n sourcePath?: string\n }\n} & ExistingDocsRecord\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>): string | undefined => {\n if (typeof doc.id === 'string' || typeof doc.id === 'number') {\n return String(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 return getRecordId(value)\n }\n\n return undefined\n}\n\nconst toExistingPayloadDocsRecord = ({\n doc,\n markdownFieldName,\n}: {\n doc: unknown\n markdownFieldName: string\n}): ExistingPayloadDocsRecord | undefined => {\n if (!isRecord(doc)) {\n return undefined\n }\n\n const id = getRecordId(doc)\n\n if (!id || typeof doc.route !== 'string' || typeof doc.sourcePath !== 'string') {\n return undefined\n }\n\n const sync = isRecord(doc.sync) ? doc.sync : undefined\n const status =\n doc._status === 'draft' || doc._status === 'published'\n ? doc._status\n : undefined\n\n return {\n id,\n archived: typeof sync?.archived === 'boolean' ? sync.archived : undefined,\n content:\n typeof doc[markdownFieldName] === 'string' ? doc[markdownFieldName] : undefined,\n docsSetId: getRelationshipId(doc.docsSet),\n route: doc.route,\n sourceHash: typeof doc.sourceHash === 'string' ? doc.sourceHash : undefined,\n sourcePath: doc.sourcePath,\n status,\n sync: sync\n ? {\n archived: typeof sync.archived === 'boolean' ? sync.archived : undefined,\n archivedAt:\n typeof sync.archivedAt === 'string' || sync.archivedAt === null\n ? sync.archivedAt\n : undefined,\n lastSyncedAt:\n typeof sync.lastSyncedAt === 'string' ? sync.lastSyncedAt : undefined,\n lastSyncRunId:\n typeof sync.lastSyncRunId === 'string' ? sync.lastSyncRunId : undefined,\n managedBy: typeof sync.managedBy === 'string' ? sync.managedBy : undefined,\n sourceHashAtLastSync:\n typeof sync.sourceHashAtLastSync === 'string'\n ? sync.sourceHashAtLastSync\n : undefined,\n sourceId: typeof sync.sourceId === 'string' ? sync.sourceId : undefined,\n sourcePath: typeof sync.sourcePath === 'string' ? sync.sourcePath : undefined,\n }\n : undefined,\n title: typeof doc.title === 'string' ? doc.title : undefined,\n }\n}\n\nexport const toExistingDocsRecord = (\n doc: ExistingPayloadDocsRecord,\n): ExistingDocsRecord => ({\n archived: doc.archived,\n route: doc.route,\n sourceHash: doc.sourceHash,\n sourcePath: doc.sourcePath,\n title: doc.title,\n})\n\nexport const findExistingPayloadDocsRecords = async ({\n collectionSlug,\n docsSetId,\n markdownFieldName,\n payload,\n sourceId,\n}: {\n collectionSlug: string\n docsSetId?: number | string\n markdownFieldName: string\n payload: ExistingDocsPayloadOperations\n sourceId: string\n}): Promise<ExistingPayloadDocsRecord[]> => {\n const result = await payload.find({\n collection: collectionSlug,\n depth: 0,\n limit: 1000,\n overrideAccess: true,\n where: docsSetId\n ? {\n or: [\n {\n docsSet: {\n equals: docsSetId,\n },\n },\n {\n 'sync.sourceId': {\n equals: sourceId,\n },\n },\n ],\n }\n : {\n 'sync.sourceId': {\n equals: sourceId,\n },\n },\n })\n\n return result.docs\n .map((doc) =>\n toExistingPayloadDocsRecord({\n doc,\n markdownFieldName,\n }),\n )\n .filter((doc): doc is ExistingPayloadDocsRecord => doc !== undefined)\n}\n\nexport const findExistingDocsRecords = async ({\n collectionSlug,\n docsSetId,\n markdownFieldName,\n payload,\n sourceId,\n}: {\n collectionSlug: string\n docsSetId?: number | string\n markdownFieldName: string\n payload: ExistingDocsPayloadOperations\n sourceId: string\n}): Promise<ExistingDocsRecord[]> => {\n const docs = await findExistingPayloadDocsRecords({\n collectionSlug,\n docsSetId,\n markdownFieldName,\n payload,\n sourceId,\n })\n\n return docs.map(toExistingDocsRecord)\n}\n"],"names":["isRecord","value","Array","isArray","getRecordId","doc","id","String","undefined","getRelationshipId","toExistingPayloadDocsRecord","markdownFieldName","route","sourcePath","sync","status","_status","archived","content","docsSetId","docsSet","sourceHash","archivedAt","lastSyncedAt","lastSyncRunId","managedBy","sourceHashAtLastSync","sourceId","title","toExistingDocsRecord","findExistingPayloadDocsRecords","collectionSlug","payload","result","find","collection","depth","limit","overrideAccess","where","or","equals","docs","map","filter","findExistingDocsRecords"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/payload/existingDocs.ts"],"sourcesContent":["import type { ExistingDocsRecord } from '../sync/index.js'\n\nexport type ExistingDocsPayloadOperations = {\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}\n\nexport type ExistingPayloadDocsRecord = {\n content?: string\n docsSetId?: number | string\n id: string\n status?: 'draft' | 'published'\n sync?: {\n archived?: boolean\n archivedAt?: null | string\n contentHashAtLastSync?: string\n lastSyncedAt?: string\n lastSyncRunId?: string\n managedBy?: string\n sourceHashAtLastSync?: string\n sourceId?: string\n sourcePath?: string\n }\n} & ExistingDocsRecord\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>): string | undefined => {\n if (typeof doc.id === 'string' || typeof doc.id === 'number') {\n return String(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 return getRecordId(value)\n }\n\n return undefined\n}\n\nconst toExistingPayloadDocsRecord = ({\n doc,\n markdownFieldName,\n}: {\n doc: unknown\n markdownFieldName: string\n}): ExistingPayloadDocsRecord | undefined => {\n if (!isRecord(doc)) {\n return undefined\n }\n\n const id = getRecordId(doc)\n\n if (!id || typeof doc.route !== 'string' || typeof doc.sourcePath !== 'string') {\n return undefined\n }\n\n const sync = isRecord(doc.sync) ? doc.sync : undefined\n const status = doc._status === 'draft' || doc._status === 'published' ? doc._status : undefined\n\n return {\n id,\n archived: typeof sync?.archived === 'boolean' ? sync.archived : undefined,\n content: typeof doc[markdownFieldName] === 'string' ? doc[markdownFieldName] : undefined,\n docsSetId: getRelationshipId(doc.docsSet),\n route: doc.route,\n sourceHash: typeof doc.sourceHash === 'string' ? doc.sourceHash : undefined,\n sourcePath: doc.sourcePath,\n status,\n sync: sync\n ? {\n archived: typeof sync.archived === 'boolean' ? sync.archived : undefined,\n archivedAt:\n typeof sync.archivedAt === 'string' || sync.archivedAt === null\n ? sync.archivedAt\n : undefined,\n contentHashAtLastSync:\n typeof sync.contentHashAtLastSync === 'string' ? sync.contentHashAtLastSync : undefined,\n lastSyncedAt: typeof sync.lastSyncedAt === 'string' ? sync.lastSyncedAt : undefined,\n lastSyncRunId: typeof sync.lastSyncRunId === 'string' ? sync.lastSyncRunId : undefined,\n managedBy: typeof sync.managedBy === 'string' ? sync.managedBy : undefined,\n sourceHashAtLastSync:\n typeof sync.sourceHashAtLastSync === 'string' ? sync.sourceHashAtLastSync : undefined,\n sourceId: typeof sync.sourceId === 'string' ? sync.sourceId : undefined,\n sourcePath: typeof sync.sourcePath === 'string' ? sync.sourcePath : undefined,\n }\n : undefined,\n title: typeof doc.title === 'string' ? doc.title : undefined,\n }\n}\n\nexport const toExistingDocsRecord = (doc: ExistingPayloadDocsRecord): ExistingDocsRecord => ({\n archived: doc.archived,\n route: doc.route,\n sourceHash: doc.sourceHash,\n sourcePath: doc.sourcePath,\n title: doc.title,\n})\n\nexport const findExistingPayloadDocsRecords = async ({\n collectionSlug,\n docsSetId,\n markdownFieldName,\n payload,\n sourceId,\n}: {\n collectionSlug: string\n docsSetId?: number | string\n markdownFieldName: string\n payload: ExistingDocsPayloadOperations\n sourceId: string\n}): Promise<ExistingPayloadDocsRecord[]> => {\n const result = await payload.find({\n collection: collectionSlug,\n depth: 0,\n limit: 1000,\n overrideAccess: true,\n where: docsSetId\n ? {\n or: [\n {\n docsSet: {\n equals: docsSetId,\n },\n },\n {\n 'sync.sourceId': {\n equals: sourceId,\n },\n },\n ],\n }\n : {\n 'sync.sourceId': {\n equals: sourceId,\n },\n },\n })\n\n return result.docs\n .map((doc) =>\n toExistingPayloadDocsRecord({\n doc,\n markdownFieldName,\n }),\n )\n .filter((doc): doc is ExistingPayloadDocsRecord => doc !== undefined)\n}\n\nexport const findExistingDocsRecords = async ({\n collectionSlug,\n docsSetId,\n markdownFieldName,\n payload,\n sourceId,\n}: {\n collectionSlug: string\n docsSetId?: number | string\n markdownFieldName: string\n payload: ExistingDocsPayloadOperations\n sourceId: string\n}): Promise<ExistingDocsRecord[]> => {\n const docs = await findExistingPayloadDocsRecords({\n collectionSlug,\n docsSetId,\n markdownFieldName,\n payload,\n sourceId,\n })\n\n return docs.map(toExistingDocsRecord)\n}\n"],"names":["isRecord","value","Array","isArray","getRecordId","doc","id","String","undefined","getRelationshipId","toExistingPayloadDocsRecord","markdownFieldName","route","sourcePath","sync","status","_status","archived","content","docsSetId","docsSet","sourceHash","archivedAt","contentHashAtLastSync","lastSyncedAt","lastSyncRunId","managedBy","sourceHashAtLastSync","sourceId","title","toExistingDocsRecord","findExistingPayloadDocsRecords","collectionSlug","payload","result","find","collection","depth","limit","overrideAccess","where","or","equals","docs","map","filter","findExistingDocsRecords"],"mappings":"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"}
@@ -22,8 +22,9 @@ export type PublishGeneratedDocsResult = {
22
22
  total: number;
23
23
  updated: number;
24
24
  };
25
- export declare const publishGeneratedDocsForSet: ({ docsCollectionSlug, docsSetId, payload, }: {
25
+ export declare const publishGeneratedDocsForSet: ({ docsCollectionSlug, docsSetId, markdownFieldName, payload, }: {
26
26
  docsCollectionSlug: string;
27
27
  docsSetId: number | string;
28
+ markdownFieldName: string;
28
29
  payload: PublishGeneratedDocsPayloadOperations;
29
30
  }) => Promise<PublishGeneratedDocsResult>;
@@ -1,3 +1,4 @@
1
+ import { sha256Hex } from '../sync/index.js';
1
2
  const isRecord = (value)=>typeof value === 'object' && value !== null && !Array.isArray(value);
2
3
  const getRecordId = (doc)=>{
3
4
  if (typeof doc.id === 'string' || typeof doc.id === 'number') {
@@ -19,7 +20,7 @@ const isArchived = (doc)=>{
19
20
  const sync = isRecord(doc.sync) ? doc.sync : undefined;
20
21
  return sync?.archived === true;
21
22
  };
22
- export const publishGeneratedDocsForSet = async ({ docsCollectionSlug, docsSetId, payload })=>{
23
+ export const publishGeneratedDocsForSet = async ({ docsCollectionSlug, docsSetId, markdownFieldName, payload })=>{
23
24
  const result = await payload.find({
24
25
  collection: docsCollectionSlug,
25
26
  depth: 0,
@@ -50,11 +51,16 @@ export const publishGeneratedDocsForSet = async ({ docsCollectionSlug, docsSetId
50
51
  summary.archived += 1;
51
52
  continue;
52
53
  }
54
+ const sync = isRecord(rawDoc.sync) ? rawDoc.sync : {};
55
+ const content = typeof rawDoc[markdownFieldName] === 'string' ? rawDoc[markdownFieldName] : '';
56
+ const contentHashAtLastSync = sha256Hex(content);
57
+ const needsContentHashUpdate = sync.contentHashAtLastSync !== contentHashAtLastSync;
53
58
  if (rawDoc._status === 'published') {
54
59
  summary.published += 1;
55
- continue;
56
- }
57
- if (rawDoc._status === 'draft') {
60
+ if (!needsContentHashUpdate) {
61
+ continue;
62
+ }
63
+ } else if (rawDoc._status === 'draft') {
58
64
  summary.drafts += 1;
59
65
  }
60
66
  const id = getRecordId(rawDoc);
@@ -65,12 +71,20 @@ export const publishGeneratedDocsForSet = async ({ docsCollectionSlug, docsSetId
65
71
  id,
66
72
  collection: docsCollectionSlug,
67
73
  data: {
68
- _status: 'published'
74
+ ...rawDoc._status === 'published' ? {} : {
75
+ _status: 'published'
76
+ },
77
+ sync: {
78
+ ...sync,
79
+ contentHashAtLastSync
80
+ }
69
81
  },
70
82
  overrideAccess: true
71
83
  });
72
84
  summary.updated += 1;
73
- summary.published += 1;
85
+ if (rawDoc._status !== 'published') {
86
+ summary.published += 1;
87
+ }
74
88
  }
75
89
  return summary;
76
90
  };
@@ -1 +1 @@
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"}
1
+ {"version":3,"sources":["../../src/payload/publishGeneratedDocs.ts"],"sourcesContent":["import { sha256Hex } from '../sync/index.js'\n\nexport 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 markdownFieldName,\n payload,\n}: {\n docsCollectionSlug: string\n docsSetId: number | string\n markdownFieldName: 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 const sync = isRecord(rawDoc.sync) ? rawDoc.sync : {}\n const content = typeof rawDoc[markdownFieldName] === 'string' ? rawDoc[markdownFieldName] : ''\n const contentHashAtLastSync = sha256Hex(content)\n const needsContentHashUpdate = sync.contentHashAtLastSync !== contentHashAtLastSync\n\n if (rawDoc._status === 'published') {\n summary.published += 1\n\n if (!needsContentHashUpdate) {\n continue\n }\n } else 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 ...(rawDoc._status === 'published' ? {} : { _status: 'published' }),\n sync: {\n ...sync,\n contentHashAtLastSync,\n },\n },\n overrideAccess: true,\n })\n summary.updated += 1\n\n if (rawDoc._status !== 'published') {\n summary.published += 1\n }\n }\n\n return summary\n}\n"],"names":["sha256Hex","isRecord","value","Array","isArray","getRecordId","doc","id","undefined","getRelationshipId","String","isArchived","sync","archived","publishGeneratedDocsForSet","docsCollectionSlug","docsSetId","markdownFieldName","payload","result","find","collection","depth","limit","overrideAccess","where","docsSet","equals","summary","drafts","published","total","updated","rawDoc","docs","content","contentHashAtLastSync","needsContentHashUpdate","_status","update","data"],"mappings":"AAAA,SAASA,SAAS,QAAQ,mBAAkB;AA4B5C,MAAMC,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,iBAAiB,EACjBC,OAAO,EAMR;IACC,MAAMC,SAAS,MAAMD,QAAQE,IAAI,CAAC;QAChCC,YAAYN;QACZO,OAAO;QACPC,OAAO;QACPC,gBAAgB;QAChBC,OAAO;YACLC,SAAS;gBACPC,QAAQX;YACV;QACF;IACF;IAEA,MAAMY,UAAsC;QAC1Cf,UAAU;QACVgB,QAAQ;QACRC,WAAW;QACXC,OAAO;QACPC,SAAS;IACX;IAEA,KAAK,MAAMC,UAAUd,OAAOe,IAAI,CAAE;QAChC,IAAI,CAACjC,SAASgC,SAAS;YACrB;QACF;QAEA,IAAIxB,kBAAkBwB,OAAOP,OAAO,MAAMhB,OAAOM,YAAY;YAC3D;QACF;QAEAY,QAAQG,KAAK,IAAI;QAEjB,IAAIpB,WAAWsB,SAAS;YACtBL,QAAQf,QAAQ,IAAI;YACpB;QACF;QAEA,MAAMD,OAAOX,SAASgC,OAAOrB,IAAI,IAAIqB,OAAOrB,IAAI,GAAG,CAAC;QACpD,MAAMuB,UAAU,OAAOF,MAAM,CAAChB,kBAAkB,KAAK,WAAWgB,MAAM,CAAChB,kBAAkB,GAAG;QAC5F,MAAMmB,wBAAwBpC,UAAUmC;QACxC,MAAME,yBAAyBzB,KAAKwB,qBAAqB,KAAKA;QAE9D,IAAIH,OAAOK,OAAO,KAAK,aAAa;YAClCV,QAAQE,SAAS,IAAI;YAErB,IAAI,CAACO,wBAAwB;gBAC3B;YACF;QACF,OAAO,IAAIJ,OAAOK,OAAO,KAAK,SAAS;YACrCV,QAAQC,MAAM,IAAI;QACpB;QAEA,MAAMtB,KAAKF,YAAY4B;QAEvB,IAAI1B,OAAOC,WAAW;YACpB;QACF;QAEA,MAAMU,QAAQqB,MAAM,CAAC;YACnBhC;YACAc,YAAYN;YACZyB,MAAM;gBACJ,GAAIP,OAAOK,OAAO,KAAK,cAAc,CAAC,IAAI;oBAAEA,SAAS;gBAAY,CAAC;gBAClE1B,MAAM;oBACJ,GAAGA,IAAI;oBACPwB;gBACF;YACF;YACAZ,gBAAgB;QAClB;QACAI,QAAQI,OAAO,IAAI;QAEnB,IAAIC,OAAOK,OAAO,KAAK,aAAa;YAClCV,QAAQE,SAAS,IAAI;QACvB;IACF;IAEA,OAAOF;AACT,EAAC"}
package/dist/plugin.js CHANGED
@@ -1,10 +1,22 @@
1
1
  import { createDocsCollection, createDocsGroupsCollection, createDocsKeysCollection, createDocsSetsCollection, createDocsTrustedCollection, createNoncesCollection, createSyncRunsCollection } from './collections/index.js';
2
- import { 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_PAGES_BRIDGE_FIELD, DEFAULT_PAGES_COLLECTION_SLUG, DEFAULT_PAGES_ROUTE_FIELD } from './constants.js';
2
+ import { 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 } from './constants.js';
3
3
  import { createSyncEndpoint } from './endpoints/index.js';
4
4
  const normalizeEndpointPath = (path)=>{
5
5
  const normalized = `/${path.trim()}`.replace(/\/+/g, '/');
6
6
  return normalized.length > 1 ? normalized.replace(/\/+$/g, '') : normalized;
7
7
  };
8
+ const resolveHeroImageMediaCollectionSlugs = (pluginOptions)=>{
9
+ if (pluginOptions.target?.heroImage === false) {
10
+ return undefined;
11
+ }
12
+ const additionalMediaCollections = typeof pluginOptions.target?.heroImage === 'object' ? pluginOptions.target.heroImage.additionalMediaCollections ?? [] : [];
13
+ return [
14
+ ...new Set([
15
+ DEFAULT_MEDIA_COLLECTION_SLUG,
16
+ ...additionalMediaCollections.map((slug)=>slug.trim()).filter(Boolean)
17
+ ])
18
+ ];
19
+ };
8
20
  const resolveCollectionOptions = (pluginOptions)=>{
9
21
  if (pluginOptions.target?.type !== undefined && pluginOptions.target.type !== 'docsCollection') {
10
22
  throw new Error('payloadMarkdownDocs: target.type only supports "docsCollection". existingCollection is not supported.');
@@ -26,6 +38,7 @@ const resolveCollectionOptions = (pluginOptions)=>{
26
38
  docsTrustedCollectionSlug: pluginOptions.collections?.docsTrusted?.slug ?? DEFAULT_DOCS_TRUSTED_COLLECTION_SLUG,
27
39
  docsTrustedEnabled: pluginOptions.collections?.docsTrusted?.enabled !== false,
28
40
  enableDrafts: pluginOptions.target?.enableDrafts === true,
41
+ heroImageMediaCollectionSlugs: resolveHeroImageMediaCollectionSlugs(pluginOptions),
29
42
  markdownFieldName: pluginOptions.target?.markdownField ?? DEFAULT_MARKDOWN_FIELD_NAME,
30
43
  noncesCollectionSlug: pluginOptions.collections?.nonces?.slug ?? DEFAULT_DOCS_SYNC_NONCES_COLLECTION_SLUG,
31
44
  noncesEnabled: pluginOptions.collections?.nonces?.enabled !== false,
@@ -53,7 +66,7 @@ export const payloadMarkdownDocs = (pluginOptions = {})=>(incomingConfig)=>{
53
66
  if (pluginOptions.enabled === false) {
54
67
  return incomingConfig;
55
68
  }
56
- const { docsCollectionSlug, docsEnabled, docsGroupsCollectionSlug, docsGroupsEnabled, docsKeysCollectionSlug, docsKeysEnabled, docsSetsCollectionSlug, docsSetsEnabled, docsTrustedCollectionSlug, docsTrustedEnabled, enableDrafts, markdownFieldName, noncesCollectionSlug, noncesEnabled, syncRunsCollectionSlug, syncRunsEnabled } = resolveCollectionOptions(pluginOptions);
69
+ const { docsCollectionSlug, docsEnabled, docsGroupsCollectionSlug, docsGroupsEnabled, docsKeysCollectionSlug, docsKeysEnabled, docsSetsCollectionSlug, docsSetsEnabled, docsTrustedCollectionSlug, docsTrustedEnabled, enableDrafts, heroImageMediaCollectionSlugs, markdownFieldName, noncesCollectionSlug, noncesEnabled, syncRunsCollectionSlug, syncRunsEnabled } = resolveCollectionOptions(pluginOptions);
57
70
  assertCollectionOptionCompatibility({
58
71
  docsCollectionSlug,
59
72
  docsEnabled,
@@ -66,6 +79,7 @@ export const payloadMarkdownDocs = (pluginOptions = {})=>(incomingConfig)=>{
66
79
  docsTrustedCollectionSlug,
67
80
  docsTrustedEnabled,
68
81
  enableDrafts,
82
+ heroImageMediaCollectionSlugs,
69
83
  markdownFieldName,
70
84
  noncesCollectionSlug,
71
85
  noncesEnabled,
@@ -110,6 +124,7 @@ export const payloadMarkdownDocs = (pluginOptions = {})=>(incomingConfig)=>{
110
124
  docsCollectionSlug: docsEnabled ? docsCollectionSlug : undefined,
111
125
  docsEnableDrafts: enableDrafts,
112
126
  docsGroupsCollectionSlug,
127
+ markdownFieldName,
113
128
  syncRunsCollectionSlug: syncRunsEnabled ? syncRunsCollectionSlug : undefined
114
129
  })
115
130
  ] : [],
@@ -128,6 +143,7 @@ export const payloadMarkdownDocs = (pluginOptions = {})=>(incomingConfig)=>{
128
143
  slug: docsCollectionSlug,
129
144
  docsSetsCollectionSlug: docsSetsEnabled ? docsSetsCollectionSlug : undefined,
130
145
  enableDrafts,
146
+ heroImageMediaCollectionSlugs,
131
147
  markdownFieldName,
132
148
  syncRunsCollectionSlug: syncRunsEnabled ? syncRunsCollectionSlug : undefined
133
149
  })
@@ -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_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 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 resolveCollectionOptions = (\n pluginOptions: PayloadMarkdownDocsConfig,\n): ResolvedCollectionOptions => {\n if (\n pluginOptions.target?.type !== undefined &&\n pluginOptions.target.type !== 'docsCollection'\n ) {\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:\n pluginOptions.target?.enableDrafts === true,\n markdownFieldName:\n 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) =>\n existingCollectionSlugs.has(slug),\n )\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 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 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\n ? docsSetsCollectionSlug\n : undefined,\n enableDrafts,\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:\n pluginOptions.routing?.pages?.allowBridgePages ?? true,\n bridgeField:\n pluginOptions.routing?.pages?.bridgeField ?? DEFAULT_PAGES_BRIDGE_FIELD,\n collection:\n pluginOptions.routing?.pages?.collection ?? DEFAULT_PAGES_COLLECTION_SLUG,\n enabled: pluginOptions.routing?.pages?.enabled === true,\n routeField:\n 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_PAGES_BRIDGE_FIELD","DEFAULT_PAGES_COLLECTION_SLUG","DEFAULT_PAGES_ROUTE_FIELD","createSyncEndpoint","normalizeEndpointPath","path","normalized","trim","replace","length","resolveCollectionOptions","pluginOptions","target","type","undefined","Error","docsSlugFromTarget","slug","docsSlugFromCollections","collections","docs","docsCollectionSlug","docsEnabled","enabled","docsGroupsCollectionSlug","docsGroups","docsGroupsEnabled","docsKeysCollectionSlug","docsKeys","docsKeysEnabled","docsSetsCollectionSlug","docsSets","docsSetsEnabled","docsTrustedCollectionSlug","docsTrusted","docsTrustedEnabled","enableDrafts","markdownFieldName","markdownField","noncesCollectionSlug","nonces","noncesEnabled","syncRunsCollectionSlug","syncRuns","syncRunsEnabled","assertCollectionOptionCompatibility","assertNoCollectionSlugConflicts","incomingConfig","collectionSlugsToAdd","duplicateRequestedSlug","find","index","indexOf","existingCollectionSlugs","Set","map","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 allowPublish: pluginOptions.sync?.allowPublish === true,\n docsCollectionSlug: docsEnabled ? docsCollectionSlug : undefined,\n docsEnableDrafts: enableDrafts,\n docsGroupsCollectionSlug,\n markdownFieldName,\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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"}
@@ -11,6 +11,7 @@ It shows:
11
11
  - draft and published docs
12
12
  - hidden-from-nav docs
13
13
  - docs with overrides
14
+ - hero images on generated docs records
14
15
  - generated docs grouped by source path
15
16
  - links to generated docs records
16
17
  - a publish action for draft generated docs when draft publishing is enabled
package/dist/types.d.ts CHANGED
@@ -45,10 +45,14 @@ export type PayloadMarkdownDocsRoutingConfig = {
45
45
  };
46
46
  export type PayloadMarkdownDocsTargetConfig = {
47
47
  enableDrafts?: boolean;
48
+ heroImage?: false | PayloadMarkdownDocsHeroImageConfig;
48
49
  markdownField?: string;
49
50
  slug?: string;
50
51
  type?: 'docsCollection';
51
52
  };
53
+ export type PayloadMarkdownDocsHeroImageConfig = {
54
+ additionalMediaCollections?: string[];
55
+ };
52
56
  export type PayloadMarkdownDocsSyncConfig = {
53
57
  allowHardDelete?: boolean;
54
58
  allowPublish?: boolean;
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 {\n enableDrafts?: boolean\n markdownField?: string\n slug?: string\n type?: 'docsCollection'\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":"AA+DA,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 defaultPublishMode?: 'draft' | 'preserve' | 'published'\n deleteBehavior?: 'archive' | 'delete' | 'draft' | 'ignore'\n requireDryRunBeforeApply?: boolean\n}\n"],"names":[],"mappings":"AAmEA,WAOC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@valkyrianlabs/payload-markdown-docs",
3
- "version": "0.4.2",
3
+ "version": "0.5.0",
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"