@valkyrianlabs/payload-markdown-docs 0.5.1 → 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,6 +3,7 @@ export type DocsSetPayloadOperations = {
3
3
  find: (args: {
4
4
  collection: string;
5
5
  depth?: number;
6
+ draft?: boolean;
6
7
  limit?: number;
7
8
  overrideAccess?: boolean;
8
9
  where?: unknown;
@@ -12,6 +13,7 @@ export type DocsSetPayloadOperations = {
12
13
  update?: (args: {
13
14
  collection: string;
14
15
  data: Record<string, unknown>;
16
+ draft?: boolean;
15
17
  id: string;
16
18
  overrideAccess?: boolean;
17
19
  }) => Promise<Record<string, unknown>>;
@@ -43,18 +45,20 @@ export declare const isEd25519AuthEnabled: (auth: {
43
45
  ed25519?: boolean | PayloadMarkdownDocsAuthToggle;
44
46
  mode?: "disabled";
45
47
  } | undefined) => boolean;
46
- export declare const updateDocsSetAfterSync: ({ aiExport, collectionSlug, docsCount, docsSetId, now, payload, syncRunId, }: {
48
+ export declare const updateDocsSetAfterSync: ({ aiExport, collectionSlug, docsCount, docsSetId, now, payload, publish, syncRunId, }: {
47
49
  aiExport?: unknown;
48
50
  collectionSlug: string;
49
51
  docsCount: number;
50
52
  docsSetId: PayloadRecordId;
51
53
  now: Date;
52
54
  payload: DocsSetPayloadOperations;
55
+ publish: boolean;
53
56
  syncRunId?: PayloadRecordId;
54
57
  }) => Promise<void>;
55
- export declare const findDocsSetBySlug: ({ slug, collectionSlug, docsGroupsCollectionSlug, payload, }: {
58
+ export declare const findDocsSetBySlug: ({ slug, collectionSlug, docsGroupsCollectionSlug, includeDrafts, payload, }: {
56
59
  collectionSlug: string;
57
60
  docsGroupsCollectionSlug: string;
61
+ includeDrafts?: boolean;
58
62
  payload: DocsSetPayloadOperations;
59
63
  slug: string;
60
64
  }) => Promise<ResolvedDocsSet | undefined>;
@@ -47,7 +47,7 @@ const authToggleEnabled = (toggle, defaultValue)=>{
47
47
  };
48
48
  export const isGitHubOidcAuthEnabled = (auth)=>auth?.mode !== 'disabled' && authToggleEnabled(auth?.githubOidc, false);
49
49
  export const isEd25519AuthEnabled = (auth)=>auth?.mode !== 'disabled' && authToggleEnabled(auth?.ed25519, false);
50
- export const updateDocsSetAfterSync = async ({ aiExport, collectionSlug, docsCount, docsSetId, now, payload, syncRunId })=>{
50
+ export const updateDocsSetAfterSync = async ({ aiExport, collectionSlug, docsCount, docsSetId, now, payload, publish, syncRunId })=>{
51
51
  if (!payload.update) {
52
52
  return;
53
53
  }
@@ -55,6 +55,7 @@ export const updateDocsSetAfterSync = async ({ aiExport, collectionSlug, docsCou
55
55
  id: String(docsSetId),
56
56
  collection: collectionSlug,
57
57
  data: {
58
+ _status: publish ? 'published' : 'draft',
58
59
  aiExport: aiExport ?? null,
59
60
  sync: {
60
61
  docsCount,
@@ -63,6 +64,7 @@ export const updateDocsSetAfterSync = async ({ aiExport, collectionSlug, docsCou
63
64
  lastSyncRunId: syncRunId
64
65
  }
65
66
  },
67
+ draft: !publish,
66
68
  overrideAccess: true
67
69
  });
68
70
  };
@@ -147,11 +149,12 @@ const getGroupsById = async ({ collectionSlug, payload })=>{
147
149
  ];
148
150
  }));
149
151
  };
150
- export const findDocsSetBySlug = async ({ slug, collectionSlug, docsGroupsCollectionSlug, payload })=>{
152
+ export const findDocsSetBySlug = async ({ slug, collectionSlug, docsGroupsCollectionSlug, includeDrafts = false, payload })=>{
151
153
  const [result, groupsById] = await Promise.all([
152
154
  payload.find({
153
155
  collection: collectionSlug,
154
156
  depth: 0,
157
+ draft: includeDrafts,
155
158
  limit: 1,
156
159
  overrideAccess: true,
157
160
  where: {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/payload/docsSets.ts"],"sourcesContent":["import type { PayloadMarkdownDocsAuthToggle } from '../types.js'\n\nimport {\n deriveDocsSetRouteBase,\n joinRouteSegments,\n normalizeRoutePath,\n} from '../routing/index.js'\n\nexport type DocsSetPayloadOperations = {\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: string\n overrideAccess?: boolean\n }) => Promise<Record<string, unknown>>\n}\n\nexport type PayloadRecordId = number | string\n\nexport type ResolvedDocsGroup = {\n id: PayloadRecordId\n parentId?: string\n routePath: string\n slug: string\n}\n\nexport type ResolvedDocsSet = {\n advancedSecurity?: {\n allowedWorkflowRefs: string[]\n enabled: boolean\n }\n allowPullRequests: boolean\n branch: string\n groupId?: string\n id: PayloadRecordId\n routeBase: string\n slug: string\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>): PayloadRecordId | 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 getString = (value: unknown): string | undefined =>\n typeof value === 'string' && value.trim() !== '' ? value.trim() : undefined\n\nconst getStringArray = (value: unknown): string[] => {\n if (!Array.isArray(value)) {\n return []\n }\n\n return value.flatMap((item) => {\n if (typeof item === 'string' && item.trim() !== '') {\n return [item.trim()]\n }\n\n if (isRecord(item)) {\n const nestedValue = getString(item.value)\n\n return nestedValue ? [nestedValue] : []\n }\n\n return []\n })\n}\n\nconst authToggleEnabled = (\n toggle: boolean | PayloadMarkdownDocsAuthToggle | undefined,\n defaultValue: boolean,\n): boolean => {\n if (toggle === undefined) {\n return defaultValue\n }\n\n if (typeof toggle === 'boolean') {\n return toggle\n }\n\n return toggle.enabled !== false\n}\n\nexport const isGitHubOidcAuthEnabled = (\n auth: { githubOidc?: boolean | PayloadMarkdownDocsAuthToggle; mode?: 'disabled' } | undefined,\n): boolean => auth?.mode !== 'disabled' && authToggleEnabled(auth?.githubOidc, false)\n\nexport const isEd25519AuthEnabled = (\n auth: { ed25519?: boolean | PayloadMarkdownDocsAuthToggle; mode?: 'disabled' } | undefined,\n): boolean => auth?.mode !== 'disabled' && authToggleEnabled(auth?.ed25519, false)\n\nexport const updateDocsSetAfterSync = async ({\n aiExport,\n collectionSlug,\n docsCount,\n docsSetId,\n now,\n payload,\n syncRunId,\n}: {\n aiExport?: unknown\n collectionSlug: string\n docsCount: number\n docsSetId: PayloadRecordId\n now: Date\n payload: DocsSetPayloadOperations\n syncRunId?: PayloadRecordId\n}): Promise<void> => {\n if (!payload.update) {\n return\n }\n\n await payload.update({\n id: String(docsSetId),\n collection: collectionSlug,\n data: {\n aiExport: aiExport ?? null,\n sync: {\n docsCount,\n lastStatus: 'success',\n lastSyncedAt: now.toISOString(),\n lastSyncRunId: syncRunId,\n },\n },\n overrideAccess: true,\n })\n}\n\nconst toResolvedGroup = (\n doc: unknown,\n groupsById: Map<string, unknown>,\n seen = new Set<string>(),\n): ResolvedDocsGroup | undefined => {\n if (!isRecord(doc)) {\n return undefined\n }\n\n const id = getRecordId(doc)\n const slug = getString(doc.slug)\n\n if (!id || !slug) {\n return undefined\n }\n\n const stringId = String(id)\n\n if (seen.has(stringId)) {\n return {\n id,\n slug,\n routePath: joinRouteSegments(slug),\n }\n }\n\n const parentId = getRelationshipId(doc.parent)\n const parentDoc = parentId ? groupsById.get(parentId) : undefined\n const parentGroup = parentDoc\n ? toResolvedGroup(parentDoc, groupsById, new Set([stringId, ...seen]))\n : undefined\n\n return {\n id,\n slug,\n parentId,\n routePath: joinRouteSegments(parentGroup?.routePath, slug),\n }\n}\n\nconst toResolvedDocsSet = ({\n doc,\n groupsById,\n}: {\n doc: unknown\n groupsById: Map<string, unknown>\n}): ResolvedDocsSet | undefined => {\n if (!isRecord(doc)) {\n return undefined\n }\n\n const id = getRecordId(doc)\n const slug = getString(doc.slug)\n\n if (!id || !slug) {\n return undefined\n }\n\n const groupId = getRelationshipId(doc.group)\n const group = groupId ? toResolvedGroup(groupsById.get(groupId), groupsById) : undefined\n const advancedSecurity = isRecord(doc.advancedSecurity)\n ? doc.advancedSecurity\n : undefined\n const advancedSecurityEnabled = advancedSecurity?.enabled === true\n\n return {\n id,\n ...(advancedSecurityEnabled\n ? {\n advancedSecurity: {\n allowedWorkflowRefs: getStringArray(advancedSecurity.allowedWorkflowRefs),\n enabled: true,\n },\n }\n : {}),\n slug,\n allowPullRequests: doc.allowPullRequests === true,\n branch: getString(doc.branch) ?? 'main',\n groupId,\n routeBase: normalizeRoutePath(\n deriveDocsSetRouteBase({\n docsSetSlug: slug,\n groupRoutePath: group?.routePath,\n }),\n ),\n }\n}\n\nconst getGroupsById = async ({\n collectionSlug,\n payload,\n}: {\n collectionSlug: string\n payload: DocsSetPayloadOperations\n}): Promise<Map<string, unknown>> => {\n const result = await payload.find({\n collection: collectionSlug,\n depth: 0,\n limit: 1000,\n overrideAccess: true,\n })\n\n return new Map(\n result.docs.flatMap((doc) => {\n if (!isRecord(doc)) {\n return []\n }\n\n const id = getRecordId(doc)\n\n return id === undefined ? [] : [[String(id), doc]]\n }),\n )\n}\n\nexport const findDocsSetBySlug = async ({\n slug,\n collectionSlug,\n docsGroupsCollectionSlug,\n payload,\n}: {\n collectionSlug: string\n docsGroupsCollectionSlug: string\n payload: DocsSetPayloadOperations\n slug: string\n}): Promise<ResolvedDocsSet | undefined> => {\n const [result, groupsById] = await Promise.all([\n payload.find({\n collection: collectionSlug,\n depth: 0,\n limit: 1,\n overrideAccess: true,\n where: {\n slug: {\n equals: slug,\n },\n },\n }),\n getGroupsById({\n collectionSlug: docsGroupsCollectionSlug,\n payload,\n }),\n ])\n\n return toResolvedDocsSet({\n doc: result.docs[0],\n groupsById,\n })\n}\n\nexport const findDocsSetByRouteBase = async ({\n collectionSlug,\n docsGroupsCollectionSlug,\n payload,\n routeBase,\n}: {\n collectionSlug: string\n docsGroupsCollectionSlug: string\n payload: DocsSetPayloadOperations\n routeBase: string\n}): Promise<ResolvedDocsSet | undefined> => {\n const [result, groupsById] = await Promise.all([\n payload.find({\n collection: collectionSlug,\n depth: 0,\n limit: 1000,\n overrideAccess: true,\n }),\n getGroupsById({\n collectionSlug: docsGroupsCollectionSlug,\n payload,\n }),\n ])\n const normalizedRouteBase = normalizeRoutePath(routeBase)\n\n return result.docs\n .map((doc) =>\n toResolvedDocsSet({\n doc,\n groupsById,\n }),\n )\n .find((docsSet) => docsSet?.routeBase === normalizedRouteBase)\n}\n"],"names":["deriveDocsSetRouteBase","joinRouteSegments","normalizeRoutePath","isRecord","value","Array","isArray","getRecordId","doc","id","undefined","getRelationshipId","String","getString","trim","getStringArray","flatMap","item","nestedValue","authToggleEnabled","toggle","defaultValue","enabled","isGitHubOidcAuthEnabled","auth","mode","githubOidc","isEd25519AuthEnabled","ed25519","updateDocsSetAfterSync","aiExport","collectionSlug","docsCount","docsSetId","now","payload","syncRunId","update","collection","data","sync","lastStatus","lastSyncedAt","toISOString","lastSyncRunId","overrideAccess","toResolvedGroup","groupsById","seen","Set","slug","stringId","has","routePath","parentId","parent","parentDoc","get","parentGroup","toResolvedDocsSet","groupId","group","advancedSecurity","advancedSecurityEnabled","allowedWorkflowRefs","allowPullRequests","branch","routeBase","docsSetSlug","groupRoutePath","getGroupsById","result","find","depth","limit","Map","docs","findDocsSetBySlug","docsGroupsCollectionSlug","Promise","all","where","equals","findDocsSetByRouteBase","normalizedRouteBase","map","docsSet"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/payload/docsSets.ts"],"sourcesContent":["import type { PayloadMarkdownDocsAuthToggle } from '../types.js'\n\nimport { deriveDocsSetRouteBase, joinRouteSegments, normalizeRoutePath } from '../routing/index.js'\n\nexport type DocsSetPayloadOperations = {\n find: (args: {\n collection: string\n depth?: number\n draft?: boolean\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 draft?: boolean\n id: string\n overrideAccess?: boolean\n }) => Promise<Record<string, unknown>>\n}\n\nexport type PayloadRecordId = number | string\n\nexport type ResolvedDocsGroup = {\n id: PayloadRecordId\n parentId?: string\n routePath: string\n slug: string\n}\n\nexport type ResolvedDocsSet = {\n advancedSecurity?: {\n allowedWorkflowRefs: string[]\n enabled: boolean\n }\n allowPullRequests: boolean\n branch: string\n groupId?: string\n id: PayloadRecordId\n routeBase: string\n slug: string\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>): PayloadRecordId | 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 getString = (value: unknown): string | undefined =>\n typeof value === 'string' && value.trim() !== '' ? value.trim() : undefined\n\nconst getStringArray = (value: unknown): string[] => {\n if (!Array.isArray(value)) {\n return []\n }\n\n return value.flatMap((item) => {\n if (typeof item === 'string' && item.trim() !== '') {\n return [item.trim()]\n }\n\n if (isRecord(item)) {\n const nestedValue = getString(item.value)\n\n return nestedValue ? [nestedValue] : []\n }\n\n return []\n })\n}\n\nconst authToggleEnabled = (\n toggle: boolean | PayloadMarkdownDocsAuthToggle | undefined,\n defaultValue: boolean,\n): boolean => {\n if (toggle === undefined) {\n return defaultValue\n }\n\n if (typeof toggle === 'boolean') {\n return toggle\n }\n\n return toggle.enabled !== false\n}\n\nexport const isGitHubOidcAuthEnabled = (\n auth: { githubOidc?: boolean | PayloadMarkdownDocsAuthToggle; mode?: 'disabled' } | undefined,\n): boolean => auth?.mode !== 'disabled' && authToggleEnabled(auth?.githubOidc, false)\n\nexport const isEd25519AuthEnabled = (\n auth: { ed25519?: boolean | PayloadMarkdownDocsAuthToggle; mode?: 'disabled' } | undefined,\n): boolean => auth?.mode !== 'disabled' && authToggleEnabled(auth?.ed25519, false)\n\nexport const updateDocsSetAfterSync = async ({\n aiExport,\n collectionSlug,\n docsCount,\n docsSetId,\n now,\n payload,\n publish,\n syncRunId,\n}: {\n aiExport?: unknown\n collectionSlug: string\n docsCount: number\n docsSetId: PayloadRecordId\n now: Date\n payload: DocsSetPayloadOperations\n publish: boolean\n syncRunId?: PayloadRecordId\n}): Promise<void> => {\n if (!payload.update) {\n return\n }\n\n await payload.update({\n id: String(docsSetId),\n collection: collectionSlug,\n data: {\n _status: publish ? 'published' : 'draft',\n aiExport: aiExport ?? null,\n sync: {\n docsCount,\n lastStatus: 'success',\n lastSyncedAt: now.toISOString(),\n lastSyncRunId: syncRunId,\n },\n },\n draft: !publish,\n overrideAccess: true,\n })\n}\n\nconst toResolvedGroup = (\n doc: unknown,\n groupsById: Map<string, unknown>,\n seen = new Set<string>(),\n): ResolvedDocsGroup | undefined => {\n if (!isRecord(doc)) {\n return undefined\n }\n\n const id = getRecordId(doc)\n const slug = getString(doc.slug)\n\n if (!id || !slug) {\n return undefined\n }\n\n const stringId = String(id)\n\n if (seen.has(stringId)) {\n return {\n id,\n slug,\n routePath: joinRouteSegments(slug),\n }\n }\n\n const parentId = getRelationshipId(doc.parent)\n const parentDoc = parentId ? groupsById.get(parentId) : undefined\n const parentGroup = parentDoc\n ? toResolvedGroup(parentDoc, groupsById, new Set([stringId, ...seen]))\n : undefined\n\n return {\n id,\n slug,\n parentId,\n routePath: joinRouteSegments(parentGroup?.routePath, slug),\n }\n}\n\nconst toResolvedDocsSet = ({\n doc,\n groupsById,\n}: {\n doc: unknown\n groupsById: Map<string, unknown>\n}): ResolvedDocsSet | undefined => {\n if (!isRecord(doc)) {\n return undefined\n }\n\n const id = getRecordId(doc)\n const slug = getString(doc.slug)\n\n if (!id || !slug) {\n return undefined\n }\n\n const groupId = getRelationshipId(doc.group)\n const group = groupId ? toResolvedGroup(groupsById.get(groupId), groupsById) : undefined\n const advancedSecurity = isRecord(doc.advancedSecurity) ? doc.advancedSecurity : undefined\n const advancedSecurityEnabled = advancedSecurity?.enabled === true\n\n return {\n id,\n ...(advancedSecurityEnabled\n ? {\n advancedSecurity: {\n allowedWorkflowRefs: getStringArray(advancedSecurity.allowedWorkflowRefs),\n enabled: true,\n },\n }\n : {}),\n slug,\n allowPullRequests: doc.allowPullRequests === true,\n branch: getString(doc.branch) ?? 'main',\n groupId,\n routeBase: normalizeRoutePath(\n deriveDocsSetRouteBase({\n docsSetSlug: slug,\n groupRoutePath: group?.routePath,\n }),\n ),\n }\n}\n\nconst getGroupsById = async ({\n collectionSlug,\n payload,\n}: {\n collectionSlug: string\n payload: DocsSetPayloadOperations\n}): Promise<Map<string, unknown>> => {\n const result = await payload.find({\n collection: collectionSlug,\n depth: 0,\n limit: 1000,\n overrideAccess: true,\n })\n\n return new Map(\n result.docs.flatMap((doc) => {\n if (!isRecord(doc)) {\n return []\n }\n\n const id = getRecordId(doc)\n\n return id === undefined ? [] : [[String(id), doc]]\n }),\n )\n}\n\nexport const findDocsSetBySlug = async ({\n slug,\n collectionSlug,\n docsGroupsCollectionSlug,\n includeDrafts = false,\n payload,\n}: {\n collectionSlug: string\n docsGroupsCollectionSlug: string\n includeDrafts?: boolean\n payload: DocsSetPayloadOperations\n slug: string\n}): Promise<ResolvedDocsSet | undefined> => {\n const [result, groupsById] = await Promise.all([\n payload.find({\n collection: collectionSlug,\n depth: 0,\n draft: includeDrafts,\n limit: 1,\n overrideAccess: true,\n where: {\n slug: {\n equals: slug,\n },\n },\n }),\n getGroupsById({\n collectionSlug: docsGroupsCollectionSlug,\n payload,\n }),\n ])\n\n return toResolvedDocsSet({\n doc: result.docs[0],\n groupsById,\n })\n}\n\nexport const findDocsSetByRouteBase = async ({\n collectionSlug,\n docsGroupsCollectionSlug,\n payload,\n routeBase,\n}: {\n collectionSlug: string\n docsGroupsCollectionSlug: string\n payload: DocsSetPayloadOperations\n routeBase: string\n}): Promise<ResolvedDocsSet | undefined> => {\n const [result, groupsById] = await Promise.all([\n payload.find({\n collection: collectionSlug,\n depth: 0,\n limit: 1000,\n overrideAccess: true,\n }),\n getGroupsById({\n collectionSlug: docsGroupsCollectionSlug,\n payload,\n }),\n ])\n const normalizedRouteBase = normalizeRoutePath(routeBase)\n\n return result.docs\n .map((doc) =>\n toResolvedDocsSet({\n doc,\n groupsById,\n }),\n )\n .find((docsSet) => docsSet?.routeBase === normalizedRouteBase)\n}\n"],"names":["deriveDocsSetRouteBase","joinRouteSegments","normalizeRoutePath","isRecord","value","Array","isArray","getRecordId","doc","id","undefined","getRelationshipId","String","getString","trim","getStringArray","flatMap","item","nestedValue","authToggleEnabled","toggle","defaultValue","enabled","isGitHubOidcAuthEnabled","auth","mode","githubOidc","isEd25519AuthEnabled","ed25519","updateDocsSetAfterSync","aiExport","collectionSlug","docsCount","docsSetId","now","payload","publish","syncRunId","update","collection","data","_status","sync","lastStatus","lastSyncedAt","toISOString","lastSyncRunId","draft","overrideAccess","toResolvedGroup","groupsById","seen","Set","slug","stringId","has","routePath","parentId","parent","parentDoc","get","parentGroup","toResolvedDocsSet","groupId","group","advancedSecurity","advancedSecurityEnabled","allowedWorkflowRefs","allowPullRequests","branch","routeBase","docsSetSlug","groupRoutePath","getGroupsById","result","find","depth","limit","Map","docs","findDocsSetBySlug","docsGroupsCollectionSlug","includeDrafts","Promise","all","where","equals","findDocsSetByRouteBase","normalizedRouteBase","map","docsSet"],"mappings":"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"}
@@ -3,6 +3,7 @@ export type ExistingDocsPayloadOperations = {
3
3
  find: (args: {
4
4
  collection: string;
5
5
  depth?: number;
6
+ draft?: boolean;
6
7
  limit?: number;
7
8
  overrideAccess?: boolean;
8
9
  where?: unknown;
@@ -28,16 +29,18 @@ export type ExistingPayloadDocsRecord = {
28
29
  };
29
30
  } & ExistingDocsRecord;
30
31
  export declare const toExistingDocsRecord: (doc: ExistingPayloadDocsRecord) => ExistingDocsRecord;
31
- export declare const findExistingPayloadDocsRecords: ({ collectionSlug, docsSetId, markdownFieldName, payload, sourceId, }: {
32
+ export declare const findExistingPayloadDocsRecords: ({ collectionSlug, docsSetId, draft, markdownFieldName, payload, sourceId, }: {
32
33
  collectionSlug: string;
33
34
  docsSetId?: number | string;
35
+ draft?: boolean;
34
36
  markdownFieldName: string;
35
37
  payload: ExistingDocsPayloadOperations;
36
38
  sourceId: string;
37
39
  }) => Promise<ExistingPayloadDocsRecord[]>;
38
- export declare const findExistingDocsRecords: ({ collectionSlug, docsSetId, markdownFieldName, payload, sourceId, }: {
40
+ export declare const findExistingDocsRecords: ({ collectionSlug, docsSetId, draft, markdownFieldName, payload, sourceId, }: {
39
41
  collectionSlug: string;
40
42
  docsSetId?: number | string;
43
+ draft?: boolean;
41
44
  markdownFieldName: string;
42
45
  payload: ExistingDocsPayloadOperations;
43
46
  sourceId: string;
@@ -52,12 +52,14 @@ export const toExistingDocsRecord = (doc)=>({
52
52
  route: doc.route,
53
53
  sourceHash: doc.sourceHash,
54
54
  sourcePath: doc.sourcePath,
55
+ status: doc.status,
55
56
  title: doc.title
56
57
  });
57
- export const findExistingPayloadDocsRecords = async ({ collectionSlug, docsSetId, markdownFieldName, payload, sourceId })=>{
58
+ export const findExistingPayloadDocsRecords = async ({ collectionSlug, docsSetId, draft, markdownFieldName, payload, sourceId })=>{
58
59
  const result = await payload.find({
59
60
  collection: collectionSlug,
60
61
  depth: 0,
62
+ draft,
61
63
  limit: 1000,
62
64
  overrideAccess: true,
63
65
  where: docsSetId ? {
@@ -84,10 +86,11 @@ export const findExistingPayloadDocsRecords = async ({ collectionSlug, docsSetId
84
86
  markdownFieldName
85
87
  })).filter((doc)=>doc !== undefined);
86
88
  };
87
- export const findExistingDocsRecords = async ({ collectionSlug, docsSetId, markdownFieldName, payload, sourceId })=>{
89
+ export const findExistingDocsRecords = async ({ collectionSlug, docsSetId, draft, markdownFieldName, payload, sourceId })=>{
88
90
  const docs = await findExistingPayloadDocsRecords({
89
91
  collectionSlug,
90
92
  docsSetId,
93
+ draft,
91
94
  markdownFieldName,
92
95
  payload,
93
96
  sourceId
@@ -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 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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"}
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 draft?: boolean\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 status: doc.status,\n title: doc.title,\n})\n\nexport const findExistingPayloadDocsRecords = async ({\n collectionSlug,\n docsSetId,\n draft,\n markdownFieldName,\n payload,\n sourceId,\n}: {\n collectionSlug: string\n docsSetId?: number | string\n draft?: boolean\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 draft,\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 draft,\n markdownFieldName,\n payload,\n sourceId,\n}: {\n collectionSlug: string\n docsSetId?: number | string\n draft?: boolean\n markdownFieldName: string\n payload: ExistingDocsPayloadOperations\n sourceId: string\n}): Promise<ExistingDocsRecord[]> => {\n const docs = await findExistingPayloadDocsRecords({\n collectionSlug,\n docsSetId,\n draft,\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","draft","payload","result","find","collection","depth","limit","overrideAccess","where","or","equals","docs","map","filter","findExistingDocsRecords"],"mappings":"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"}
@@ -2,6 +2,7 @@ export type RouteCollisionPayloadOperations = {
2
2
  find: (args: {
3
3
  collection: string;
4
4
  depth?: number;
5
+ draft?: boolean;
5
6
  limit?: number;
6
7
  overrideAccess?: boolean;
7
8
  where?: unknown;
@@ -14,9 +15,10 @@ export type DocsRouteCollisionIssue = {
14
15
  route: string;
15
16
  };
16
17
  export declare const findDuplicateDesiredRouteCollisions: (routes: string[]) => DocsRouteCollisionIssue[];
17
- export declare const findExistingDocsRouteCollisions: ({ collectionSlug, docsSetId, payload, routes, sourceId, }: {
18
+ export declare const findExistingDocsRouteCollisions: ({ collectionSlug, docsSetId, includeDrafts, payload, routes, sourceId, }: {
18
19
  collectionSlug: string;
19
20
  docsSetId?: number | string;
21
+ includeDrafts?: boolean;
20
22
  payload: RouteCollisionPayloadOperations;
21
23
  routes: string[];
22
24
  sourceId: string;
@@ -35,7 +35,7 @@ export const findDuplicateDesiredRouteCollisions = (routes)=>findRouteReservatio
35
35
  ownerType: 'doc',
36
36
  route
37
37
  }))).map(collisionToIssue);
38
- export const findExistingDocsRouteCollisions = async ({ collectionSlug, docsSetId, payload, routes, sourceId })=>{
38
+ export const findExistingDocsRouteCollisions = async ({ collectionSlug, docsSetId, includeDrafts = false, payload, routes, sourceId })=>{
39
39
  const normalizedRoutes = [
40
40
  ...new Set(routes.map(normalizeRoutePath))
41
41
  ];
@@ -45,6 +45,7 @@ export const findExistingDocsRouteCollisions = async ({ collectionSlug, docsSetI
45
45
  const result = await payload.find({
46
46
  collection: collectionSlug,
47
47
  depth: 0,
48
+ draft: includeDrafts,
48
49
  limit: 1000,
49
50
  overrideAccess: true,
50
51
  where: {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/payload/routeCollisions.ts"],"sourcesContent":["import type { DocsRouteCollision } from '../routing/index.js'\n\nimport {\n findPageRouteCollisions,\n findRouteReservationCollisions,\n normalizeRoutePath,\n} from '../routing/index.js'\n\nexport type RouteCollisionPayloadOperations = {\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 DocsRouteCollisionIssue = {\n reason: string\n route: string\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>): 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 getNestedString = (\n value: Record<string, unknown>,\n dottedPath: string,\n): string | undefined => {\n const segments = dottedPath.split('.')\n let current: unknown = value\n\n for (const segment of segments) {\n if (!isRecord(current)) {\n return undefined\n }\n\n current = current[segment]\n }\n\n return typeof current === 'string' ? current : undefined\n}\n\nconst collisionToIssue = (collision: DocsRouteCollision): DocsRouteCollisionIssue => ({\n reason: collision.reason,\n route: collision.first.route === collision.second.route\n ? collision.first.route\n : `${collision.first.route} <> ${collision.second.route}`,\n})\n\nexport const findDuplicateDesiredRouteCollisions = (\n routes: string[],\n): DocsRouteCollisionIssue[] =>\n findRouteReservationCollisions(\n routes.map((route, index) => ({\n ownerId: `desired-${index}`,\n ownerType: 'doc',\n route,\n })),\n ).map(collisionToIssue)\n\nexport const findExistingDocsRouteCollisions = async ({\n collectionSlug,\n docsSetId,\n payload,\n routes,\n sourceId,\n}: {\n collectionSlug: string\n docsSetId?: number | string\n payload: RouteCollisionPayloadOperations\n routes: string[]\n sourceId: string\n}): Promise<DocsRouteCollisionIssue[]> => {\n const normalizedRoutes = [...new Set(routes.map(normalizeRoutePath))]\n\n if (normalizedRoutes.length === 0) {\n return []\n }\n\n const result = await payload.find({\n collection: collectionSlug,\n depth: 0,\n limit: 1000,\n overrideAccess: true,\n where: {\n route: {\n in: normalizedRoutes,\n },\n },\n })\n\n return result.docs.flatMap((doc) => {\n if (!isRecord(doc) || typeof doc.route !== 'string') {\n return []\n }\n\n const existingDocsSetId = getRelationshipId(doc.docsSet)\n const existingSourceId = getNestedString(doc, 'sync.sourceId')\n const sameOwner = docsSetId\n ? existingDocsSetId === String(docsSetId) ||\n (!existingDocsSetId && existingSourceId === sourceId)\n : !existingDocsSetId && existingSourceId === sourceId\n\n if (sameOwner) {\n return []\n }\n\n return [\n {\n reason: 'existing_doc_route_collision',\n route: normalizeRoutePath(doc.route),\n },\n ]\n })\n}\n\nexport const findConfiguredPagesRouteCollisions = async ({\n allowBridgePages,\n bridgeField,\n collectionSlug,\n docsSetRouteBase,\n payload,\n routeField,\n}: {\n allowBridgePages: boolean\n bridgeField: string\n collectionSlug: string\n docsSetRouteBase: string\n payload: RouteCollisionPayloadOperations\n routeField: string\n}): Promise<DocsRouteCollisionIssue[]> => {\n const result = await payload.find({\n collection: collectionSlug,\n depth: 0,\n limit: 1000,\n overrideAccess: true,\n })\n\n const collisions = findPageRouteCollisions({\n allowBridgePages,\n docsSetRouteBase,\n pages: result.docs.flatMap((doc) => {\n if (!isRecord(doc)) {\n return []\n }\n\n const route = getNestedString(doc, routeField)\n\n if (!route) {\n return []\n }\n\n return [\n {\n id: getRecordId(doc),\n bridge: doc[bridgeField] === true,\n route,\n },\n ]\n }),\n })\n\n return collisions.map(collisionToIssue)\n}\n"],"names":["findPageRouteCollisions","findRouteReservationCollisions","normalizeRoutePath","isRecord","value","Array","isArray","getRecordId","doc","id","String","undefined","getRelationshipId","getNestedString","dottedPath","segments","split","current","segment","collisionToIssue","collision","reason","route","first","second","findDuplicateDesiredRouteCollisions","routes","map","index","ownerId","ownerType","findExistingDocsRouteCollisions","collectionSlug","docsSetId","payload","sourceId","normalizedRoutes","Set","length","result","find","collection","depth","limit","overrideAccess","where","in","docs","flatMap","existingDocsSetId","docsSet","existingSourceId","sameOwner","findConfiguredPagesRouteCollisions","allowBridgePages","bridgeField","docsSetRouteBase","routeField","collisions","pages","bridge"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/payload/routeCollisions.ts"],"sourcesContent":["import type { DocsRouteCollision } from '../routing/index.js'\n\nimport {\n findPageRouteCollisions,\n findRouteReservationCollisions,\n normalizeRoutePath,\n} from '../routing/index.js'\n\nexport type RouteCollisionPayloadOperations = {\n find: (args: {\n collection: string\n depth?: number\n draft?: boolean\n limit?: number\n overrideAccess?: boolean\n where?: unknown\n }) => Promise<{\n docs: unknown[]\n }>\n}\n\nexport type DocsRouteCollisionIssue = {\n reason: string\n route: string\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>): 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 getNestedString = (\n value: Record<string, unknown>,\n dottedPath: string,\n): string | undefined => {\n const segments = dottedPath.split('.')\n let current: unknown = value\n\n for (const segment of segments) {\n if (!isRecord(current)) {\n return undefined\n }\n\n current = current[segment]\n }\n\n return typeof current === 'string' ? current : undefined\n}\n\nconst collisionToIssue = (collision: DocsRouteCollision): DocsRouteCollisionIssue => ({\n reason: collision.reason,\n route:\n collision.first.route === collision.second.route\n ? collision.first.route\n : `${collision.first.route} <> ${collision.second.route}`,\n})\n\nexport const findDuplicateDesiredRouteCollisions = (routes: string[]): DocsRouteCollisionIssue[] =>\n findRouteReservationCollisions(\n routes.map((route, index) => ({\n ownerId: `desired-${index}`,\n ownerType: 'doc',\n route,\n })),\n ).map(collisionToIssue)\n\nexport const findExistingDocsRouteCollisions = async ({\n collectionSlug,\n docsSetId,\n includeDrafts = false,\n payload,\n routes,\n sourceId,\n}: {\n collectionSlug: string\n docsSetId?: number | string\n includeDrafts?: boolean\n payload: RouteCollisionPayloadOperations\n routes: string[]\n sourceId: string\n}): Promise<DocsRouteCollisionIssue[]> => {\n const normalizedRoutes = [...new Set(routes.map(normalizeRoutePath))]\n\n if (normalizedRoutes.length === 0) {\n return []\n }\n\n const result = await payload.find({\n collection: collectionSlug,\n depth: 0,\n draft: includeDrafts,\n limit: 1000,\n overrideAccess: true,\n where: {\n route: {\n in: normalizedRoutes,\n },\n },\n })\n\n return result.docs.flatMap((doc) => {\n if (!isRecord(doc) || typeof doc.route !== 'string') {\n return []\n }\n\n const existingDocsSetId = getRelationshipId(doc.docsSet)\n const existingSourceId = getNestedString(doc, 'sync.sourceId')\n const sameOwner = docsSetId\n ? existingDocsSetId === String(docsSetId) ||\n (!existingDocsSetId && existingSourceId === sourceId)\n : !existingDocsSetId && existingSourceId === sourceId\n\n if (sameOwner) {\n return []\n }\n\n return [\n {\n reason: 'existing_doc_route_collision',\n route: normalizeRoutePath(doc.route),\n },\n ]\n })\n}\n\nexport const findConfiguredPagesRouteCollisions = async ({\n allowBridgePages,\n bridgeField,\n collectionSlug,\n docsSetRouteBase,\n payload,\n routeField,\n}: {\n allowBridgePages: boolean\n bridgeField: string\n collectionSlug: string\n docsSetRouteBase: string\n payload: RouteCollisionPayloadOperations\n routeField: string\n}): Promise<DocsRouteCollisionIssue[]> => {\n const result = await payload.find({\n collection: collectionSlug,\n depth: 0,\n limit: 1000,\n overrideAccess: true,\n })\n\n const collisions = findPageRouteCollisions({\n allowBridgePages,\n docsSetRouteBase,\n pages: result.docs.flatMap((doc) => {\n if (!isRecord(doc)) {\n return []\n }\n\n const route = getNestedString(doc, routeField)\n\n if (!route) {\n return []\n }\n\n return [\n {\n id: getRecordId(doc),\n bridge: doc[bridgeField] === true,\n route,\n },\n ]\n }),\n })\n\n return collisions.map(collisionToIssue)\n}\n"],"names":["findPageRouteCollisions","findRouteReservationCollisions","normalizeRoutePath","isRecord","value","Array","isArray","getRecordId","doc","id","String","undefined","getRelationshipId","getNestedString","dottedPath","segments","split","current","segment","collisionToIssue","collision","reason","route","first","second","findDuplicateDesiredRouteCollisions","routes","map","index","ownerId","ownerType","findExistingDocsRouteCollisions","collectionSlug","docsSetId","includeDrafts","payload","sourceId","normalizedRoutes","Set","length","result","find","collection","depth","draft","limit","overrideAccess","where","in","docs","flatMap","existingDocsSetId","docsSet","existingSourceId","sameOwner","findConfiguredPagesRouteCollisions","allowBridgePages","bridgeField","docsSetRouteBase","routeField","collisions","pages","bridge"],"mappings":"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"}
@@ -5,6 +5,7 @@ export type ExistingDocsRecord = {
5
5
  route: string;
6
6
  sourceHash?: string;
7
7
  sourcePath: string;
8
+ status?: 'draft' | 'published';
8
9
  title?: string;
9
10
  };
10
11
  export type PlannedDocChange = {
package/dist/sync/plan.js CHANGED
@@ -33,7 +33,9 @@ export const planDocsSync = ({ deleteBehavior, desired, existing })=>{
33
33
  });
34
34
  continue;
35
35
  }
36
- if (current.sourceHash === desiredFile.sha256) {
36
+ const desiredStatus = desired.publish ? 'published' : 'draft';
37
+ const hasStatusMismatch = current.status !== undefined && current.status !== desiredStatus;
38
+ if (current.sourceHash === desiredFile.sha256 && !hasStatusMismatch) {
37
39
  plan.unchanged.push({
38
40
  current,
39
41
  desired: desiredFile,
@@ -45,7 +47,7 @@ export const planDocsSync = ({ deleteBehavior, desired, existing })=>{
45
47
  plan.update.push({
46
48
  current,
47
49
  desired: desiredFile,
48
- reason: 'Existing source hash differs from desired source hash.',
50
+ reason: hasStatusMismatch ? 'Existing draft status differs from desired publish state.' : 'Existing source hash differs from desired source hash.',
49
51
  sourcePath: desiredFile.path
50
52
  });
51
53
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/sync/plan.ts"],"sourcesContent":["import type {\n DocsDeleteBehavior,\n ValidatedDocsManifest,\n ValidatedDocsManifestFile,\n} from './manifest.js'\nimport type { DocsValidationIssue } from './validate.js'\n\nexport type ExistingDocsRecord = {\n archived?: boolean\n route: string\n sourceHash?: string\n sourcePath: string\n title?: string\n}\n\nexport type PlannedDocChange = {\n current?: ExistingDocsRecord\n desired?: ValidatedDocsManifestFile\n reason: string\n sourcePath: string\n}\n\nexport type DocsSyncPlan = {\n archive: PlannedDocChange[]\n create: PlannedDocChange[]\n delete: PlannedDocChange[]\n draft: PlannedDocChange[]\n unchanged: PlannedDocChange[]\n update: PlannedDocChange[]\n warnings: DocsValidationIssue[]\n}\n\nconst createEmptyPlan = (): DocsSyncPlan => ({\n archive: [],\n create: [],\n delete: [],\n draft: [],\n unchanged: [],\n update: [],\n warnings: [],\n})\n\nexport const planDocsSync = ({\n deleteBehavior,\n desired,\n existing,\n}: {\n deleteBehavior?: DocsDeleteBehavior\n desired: ValidatedDocsManifest\n existing: ExistingDocsRecord[]\n}): DocsSyncPlan => {\n const plan = createEmptyPlan()\n const effectiveDeleteBehavior = deleteBehavior ?? desired.deleteBehavior ?? 'archive'\n const existingBySourcePath = new Map<string, ExistingDocsRecord>()\n\n for (const existingRecord of existing) {\n if (existingBySourcePath.has(existingRecord.sourcePath)) {\n plan.warnings.push({\n code: 'duplicate_existing_path',\n message: `Existing docs contain duplicate sourcePath \"${existingRecord.sourcePath}\".`,\n path: existingRecord.sourcePath,\n })\n continue\n }\n\n existingBySourcePath.set(existingRecord.sourcePath, existingRecord)\n }\n\n const desiredSourcePaths = new Set(desired.files.map((file) => file.path))\n\n for (const desiredFile of desired.files) {\n const current = existingBySourcePath.get(desiredFile.path)\n\n if (!current) {\n plan.create.push({\n desired: desiredFile,\n reason: 'No existing doc has this sourcePath.',\n sourcePath: desiredFile.path,\n })\n continue\n }\n\n if (current.sourceHash === desiredFile.sha256) {\n plan.unchanged.push({\n current,\n desired: desiredFile,\n reason: 'Existing source hash matches desired source hash.',\n sourcePath: desiredFile.path,\n })\n continue\n }\n\n plan.update.push({\n current,\n desired: desiredFile,\n reason: 'Existing source hash differs from desired source hash.',\n sourcePath: desiredFile.path,\n })\n }\n\n for (const current of existingBySourcePath.values()) {\n if (desiredSourcePaths.has(current.sourcePath)) {\n continue\n }\n\n const change = {\n current,\n reason: 'Existing doc is missing from desired manifest.',\n sourcePath: current.sourcePath,\n }\n\n if (effectiveDeleteBehavior === 'archive') {\n plan.archive.push(change)\n } else if (effectiveDeleteBehavior === 'delete') {\n plan.delete.push(change)\n } else if (effectiveDeleteBehavior === 'draft') {\n plan.draft.push(change)\n }\n }\n\n return plan\n}\n"],"names":["createEmptyPlan","archive","create","delete","draft","unchanged","update","warnings","planDocsSync","deleteBehavior","desired","existing","plan","effectiveDeleteBehavior","existingBySourcePath","Map","existingRecord","has","sourcePath","push","code","message","path","set","desiredSourcePaths","Set","files","map","file","desiredFile","current","get","reason","sourceHash","sha256","values","change"],"mappings":"AAgCA,MAAMA,kBAAkB,IAAqB,CAAA;QAC3CC,SAAS,EAAE;QACXC,QAAQ,EAAE;QACVC,QAAQ,EAAE;QACVC,OAAO,EAAE;QACTC,WAAW,EAAE;QACbC,QAAQ,EAAE;QACVC,UAAU,EAAE;IACd,CAAA;AAEA,OAAO,MAAMC,eAAe,CAAC,EAC3BC,cAAc,EACdC,OAAO,EACPC,QAAQ,EAKT;IACC,MAAMC,OAAOZ;IACb,MAAMa,0BAA0BJ,kBAAkBC,QAAQD,cAAc,IAAI;IAC5E,MAAMK,uBAAuB,IAAIC;IAEjC,KAAK,MAAMC,kBAAkBL,SAAU;QACrC,IAAIG,qBAAqBG,GAAG,CAACD,eAAeE,UAAU,GAAG;YACvDN,KAAKL,QAAQ,CAACY,IAAI,CAAC;gBACjBC,MAAM;gBACNC,SAAS,CAAC,4CAA4C,EAAEL,eAAeE,UAAU,CAAC,EAAE,CAAC;gBACrFI,MAAMN,eAAeE,UAAU;YACjC;YACA;QACF;QAEAJ,qBAAqBS,GAAG,CAACP,eAAeE,UAAU,EAAEF;IACtD;IAEA,MAAMQ,qBAAqB,IAAIC,IAAIf,QAAQgB,KAAK,CAACC,GAAG,CAAC,CAACC,OAASA,KAAKN,IAAI;IAExE,KAAK,MAAMO,eAAenB,QAAQgB,KAAK,CAAE;QACvC,MAAMI,UAAUhB,qBAAqBiB,GAAG,CAACF,YAAYP,IAAI;QAEzD,IAAI,CAACQ,SAAS;YACZlB,KAAKV,MAAM,CAACiB,IAAI,CAAC;gBACfT,SAASmB;gBACTG,QAAQ;gBACRd,YAAYW,YAAYP,IAAI;YAC9B;YACA;QACF;QAEA,IAAIQ,QAAQG,UAAU,KAAKJ,YAAYK,MAAM,EAAE;YAC7CtB,KAAKP,SAAS,CAACc,IAAI,CAAC;gBAClBW;gBACApB,SAASmB;gBACTG,QAAQ;gBACRd,YAAYW,YAAYP,IAAI;YAC9B;YACA;QACF;QAEAV,KAAKN,MAAM,CAACa,IAAI,CAAC;YACfW;YACApB,SAASmB;YACTG,QAAQ;YACRd,YAAYW,YAAYP,IAAI;QAC9B;IACF;IAEA,KAAK,MAAMQ,WAAWhB,qBAAqBqB,MAAM,GAAI;QACnD,IAAIX,mBAAmBP,GAAG,CAACa,QAAQZ,UAAU,GAAG;YAC9C;QACF;QAEA,MAAMkB,SAAS;YACbN;YACAE,QAAQ;YACRd,YAAYY,QAAQZ,UAAU;QAChC;QAEA,IAAIL,4BAA4B,WAAW;YACzCD,KAAKX,OAAO,CAACkB,IAAI,CAACiB;QACpB,OAAO,IAAIvB,4BAA4B,UAAU;YAC/CD,KAAKT,MAAM,CAACgB,IAAI,CAACiB;QACnB,OAAO,IAAIvB,4BAA4B,SAAS;YAC9CD,KAAKR,KAAK,CAACe,IAAI,CAACiB;QAClB;IACF;IAEA,OAAOxB;AACT,EAAC"}
1
+ {"version":3,"sources":["../../src/sync/plan.ts"],"sourcesContent":["import type {\n DocsDeleteBehavior,\n ValidatedDocsManifest,\n ValidatedDocsManifestFile,\n} from './manifest.js'\nimport type { DocsValidationIssue } from './validate.js'\n\nexport type ExistingDocsRecord = {\n archived?: boolean\n route: string\n sourceHash?: string\n sourcePath: string\n status?: 'draft' | 'published'\n title?: string\n}\n\nexport type PlannedDocChange = {\n current?: ExistingDocsRecord\n desired?: ValidatedDocsManifestFile\n reason: string\n sourcePath: string\n}\n\nexport type DocsSyncPlan = {\n archive: PlannedDocChange[]\n create: PlannedDocChange[]\n delete: PlannedDocChange[]\n draft: PlannedDocChange[]\n unchanged: PlannedDocChange[]\n update: PlannedDocChange[]\n warnings: DocsValidationIssue[]\n}\n\nconst createEmptyPlan = (): DocsSyncPlan => ({\n archive: [],\n create: [],\n delete: [],\n draft: [],\n unchanged: [],\n update: [],\n warnings: [],\n})\n\nexport const planDocsSync = ({\n deleteBehavior,\n desired,\n existing,\n}: {\n deleteBehavior?: DocsDeleteBehavior\n desired: ValidatedDocsManifest\n existing: ExistingDocsRecord[]\n}): DocsSyncPlan => {\n const plan = createEmptyPlan()\n const effectiveDeleteBehavior = deleteBehavior ?? desired.deleteBehavior ?? 'archive'\n const existingBySourcePath = new Map<string, ExistingDocsRecord>()\n\n for (const existingRecord of existing) {\n if (existingBySourcePath.has(existingRecord.sourcePath)) {\n plan.warnings.push({\n code: 'duplicate_existing_path',\n message: `Existing docs contain duplicate sourcePath \"${existingRecord.sourcePath}\".`,\n path: existingRecord.sourcePath,\n })\n continue\n }\n\n existingBySourcePath.set(existingRecord.sourcePath, existingRecord)\n }\n\n const desiredSourcePaths = new Set(desired.files.map((file) => file.path))\n\n for (const desiredFile of desired.files) {\n const current = existingBySourcePath.get(desiredFile.path)\n\n if (!current) {\n plan.create.push({\n desired: desiredFile,\n reason: 'No existing doc has this sourcePath.',\n sourcePath: desiredFile.path,\n })\n continue\n }\n\n const desiredStatus = desired.publish ? 'published' : 'draft'\n const hasStatusMismatch = current.status !== undefined && current.status !== desiredStatus\n\n if (current.sourceHash === desiredFile.sha256 && !hasStatusMismatch) {\n plan.unchanged.push({\n current,\n desired: desiredFile,\n reason: 'Existing source hash matches desired source hash.',\n sourcePath: desiredFile.path,\n })\n continue\n }\n\n plan.update.push({\n current,\n desired: desiredFile,\n reason: hasStatusMismatch\n ? 'Existing draft status differs from desired publish state.'\n : 'Existing source hash differs from desired source hash.',\n sourcePath: desiredFile.path,\n })\n }\n\n for (const current of existingBySourcePath.values()) {\n if (desiredSourcePaths.has(current.sourcePath)) {\n continue\n }\n\n const change = {\n current,\n reason: 'Existing doc is missing from desired manifest.',\n sourcePath: current.sourcePath,\n }\n\n if (effectiveDeleteBehavior === 'archive') {\n plan.archive.push(change)\n } else if (effectiveDeleteBehavior === 'delete') {\n plan.delete.push(change)\n } else if (effectiveDeleteBehavior === 'draft') {\n plan.draft.push(change)\n }\n }\n\n return plan\n}\n"],"names":["createEmptyPlan","archive","create","delete","draft","unchanged","update","warnings","planDocsSync","deleteBehavior","desired","existing","plan","effectiveDeleteBehavior","existingBySourcePath","Map","existingRecord","has","sourcePath","push","code","message","path","set","desiredSourcePaths","Set","files","map","file","desiredFile","current","get","reason","desiredStatus","publish","hasStatusMismatch","status","undefined","sourceHash","sha256","values","change"],"mappings":"AAiCA,MAAMA,kBAAkB,IAAqB,CAAA;QAC3CC,SAAS,EAAE;QACXC,QAAQ,EAAE;QACVC,QAAQ,EAAE;QACVC,OAAO,EAAE;QACTC,WAAW,EAAE;QACbC,QAAQ,EAAE;QACVC,UAAU,EAAE;IACd,CAAA;AAEA,OAAO,MAAMC,eAAe,CAAC,EAC3BC,cAAc,EACdC,OAAO,EACPC,QAAQ,EAKT;IACC,MAAMC,OAAOZ;IACb,MAAMa,0BAA0BJ,kBAAkBC,QAAQD,cAAc,IAAI;IAC5E,MAAMK,uBAAuB,IAAIC;IAEjC,KAAK,MAAMC,kBAAkBL,SAAU;QACrC,IAAIG,qBAAqBG,GAAG,CAACD,eAAeE,UAAU,GAAG;YACvDN,KAAKL,QAAQ,CAACY,IAAI,CAAC;gBACjBC,MAAM;gBACNC,SAAS,CAAC,4CAA4C,EAAEL,eAAeE,UAAU,CAAC,EAAE,CAAC;gBACrFI,MAAMN,eAAeE,UAAU;YACjC;YACA;QACF;QAEAJ,qBAAqBS,GAAG,CAACP,eAAeE,UAAU,EAAEF;IACtD;IAEA,MAAMQ,qBAAqB,IAAIC,IAAIf,QAAQgB,KAAK,CAACC,GAAG,CAAC,CAACC,OAASA,KAAKN,IAAI;IAExE,KAAK,MAAMO,eAAenB,QAAQgB,KAAK,CAAE;QACvC,MAAMI,UAAUhB,qBAAqBiB,GAAG,CAACF,YAAYP,IAAI;QAEzD,IAAI,CAACQ,SAAS;YACZlB,KAAKV,MAAM,CAACiB,IAAI,CAAC;gBACfT,SAASmB;gBACTG,QAAQ;gBACRd,YAAYW,YAAYP,IAAI;YAC9B;YACA;QACF;QAEA,MAAMW,gBAAgBvB,QAAQwB,OAAO,GAAG,cAAc;QACtD,MAAMC,oBAAoBL,QAAQM,MAAM,KAAKC,aAAaP,QAAQM,MAAM,KAAKH;QAE7E,IAAIH,QAAQQ,UAAU,KAAKT,YAAYU,MAAM,IAAI,CAACJ,mBAAmB;YACnEvB,KAAKP,SAAS,CAACc,IAAI,CAAC;gBAClBW;gBACApB,SAASmB;gBACTG,QAAQ;gBACRd,YAAYW,YAAYP,IAAI;YAC9B;YACA;QACF;QAEAV,KAAKN,MAAM,CAACa,IAAI,CAAC;YACfW;YACApB,SAASmB;YACTG,QAAQG,oBACJ,8DACA;YACJjB,YAAYW,YAAYP,IAAI;QAC9B;IACF;IAEA,KAAK,MAAMQ,WAAWhB,qBAAqB0B,MAAM,GAAI;QACnD,IAAIhB,mBAAmBP,GAAG,CAACa,QAAQZ,UAAU,GAAG;YAC9C;QACF;QAEA,MAAMuB,SAAS;YACbX;YACAE,QAAQ;YACRd,YAAYY,QAAQZ,UAAU;QAChC;QAEA,IAAIL,4BAA4B,WAAW;YACzCD,KAAKX,OAAO,CAACkB,IAAI,CAACsB;QACpB,OAAO,IAAI5B,4BAA4B,UAAU;YAC/CD,KAAKT,MAAM,CAACgB,IAAI,CAACsB;QACnB,OAAO,IAAI5B,4BAA4B,SAAS;YAC9CD,KAAKR,KAAK,CAACe,IAAI,CAACsB;QAClB;IACF;IAEA,OAAO7B;AACT,EAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@valkyrianlabs/payload-markdown-docs",
3
- "version": "0.5.1",
3
+ "version": "0.5.3",
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"