@valkyrianlabs/payload-markdown-docs 0.1.0-canary.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 (204) hide show
  1. package/README.md +195 -0
  2. package/dist/admin/DocsSetManager.d.ts +2 -0
  3. package/dist/admin/DocsSetManager.js +298 -0
  4. package/dist/admin/DocsSetManager.js.map +1 -0
  5. package/dist/admin/docsSetManagerData.d.ts +25 -0
  6. package/dist/admin/docsSetManagerData.js +266 -0
  7. package/dist/admin/docsSetManagerData.js.map +1 -0
  8. package/dist/admin/docsSetManagerTypes.d.ts +103 -0
  9. package/dist/admin/docsSetManagerTypes.js +3 -0
  10. package/dist/admin/docsSetManagerTypes.js.map +1 -0
  11. package/dist/admin/index.d.ts +3 -0
  12. package/dist/admin/index.js +4 -0
  13. package/dist/admin/index.js.map +1 -0
  14. package/dist/cli/commands/install.d.ts +2 -0
  15. package/dist/cli/commands/install.js +211 -0
  16. package/dist/cli/commands/install.js.map +1 -0
  17. package/dist/cli/commands/keygen.d.ts +2 -0
  18. package/dist/cli/commands/keygen.js +89 -0
  19. package/dist/cli/commands/keygen.js.map +1 -0
  20. package/dist/cli/commands/manifest.d.ts +2 -0
  21. package/dist/cli/commands/manifest.js +50 -0
  22. package/dist/cli/commands/manifest.js.map +1 -0
  23. package/dist/cli/commands/plan.d.ts +2 -0
  24. package/dist/cli/commands/plan.js +110 -0
  25. package/dist/cli/commands/plan.js.map +1 -0
  26. package/dist/cli/commands/push.d.ts +3 -0
  27. package/dist/cli/commands/push.js +308 -0
  28. package/dist/cli/commands/push.js.map +1 -0
  29. package/dist/cli/commands/validate.d.ts +3 -0
  30. package/dist/cli/commands/validate.js +109 -0
  31. package/dist/cli/commands/validate.js.map +1 -0
  32. package/dist/cli/filesystem.d.ts +20 -0
  33. package/dist/cli/filesystem.js +96 -0
  34. package/dist/cli/filesystem.js.map +1 -0
  35. package/dist/cli/format.d.ts +35 -0
  36. package/dist/cli/format.js +76 -0
  37. package/dist/cli/format.js.map +1 -0
  38. package/dist/cli/http.d.ts +19 -0
  39. package/dist/cli/http.js +39 -0
  40. package/dist/cli/http.js.map +1 -0
  41. package/dist/cli/index.d.ts +3 -0
  42. package/dist/cli/index.js +214 -0
  43. package/dist/cli/index.js.map +1 -0
  44. package/dist/cli/parseArgs.d.ts +5 -0
  45. package/dist/cli/parseArgs.js +219 -0
  46. package/dist/cli/parseArgs.js.map +1 -0
  47. package/dist/cli/types.d.ts +51 -0
  48. package/dist/cli/types.js +3 -0
  49. package/dist/cli/types.js.map +1 -0
  50. package/dist/collections/docs.d.ts +9 -0
  51. package/dist/collections/docs.js +168 -0
  52. package/dist/collections/docs.js.map +1 -0
  53. package/dist/collections/docsGroups.d.ts +5 -0
  54. package/dist/collections/docsGroups.js +57 -0
  55. package/dist/collections/docsGroups.js.map +1 -0
  56. package/dist/collections/docsSets.d.ts +8 -0
  57. package/dist/collections/docsSets.js +158 -0
  58. package/dist/collections/docsSets.js.map +1 -0
  59. package/dist/collections/index.d.ts +10 -0
  60. package/dist/collections/index.js +7 -0
  61. package/dist/collections/index.js.map +1 -0
  62. package/dist/collections/nonces.d.ts +6 -0
  63. package/dist/collections/nonces.js +57 -0
  64. package/dist/collections/nonces.js.map +1 -0
  65. package/dist/collections/syncRuns.d.ts +5 -0
  66. package/dist/collections/syncRuns.js +139 -0
  67. package/dist/collections/syncRuns.js.map +1 -0
  68. package/dist/constants.d.ts +21 -0
  69. package/dist/constants.js +23 -0
  70. package/dist/constants.js.map +1 -0
  71. package/dist/endpoints/index.d.ts +2 -0
  72. package/dist/endpoints/index.js +3 -0
  73. package/dist/endpoints/index.js.map +1 -0
  74. package/dist/endpoints/sync.d.ts +47 -0
  75. package/dist/endpoints/sync.js +616 -0
  76. package/dist/endpoints/sync.js.map +1 -0
  77. package/dist/index.d.ts +9 -0
  78. package/dist/index.js +7 -0
  79. package/dist/index.js.map +1 -0
  80. package/dist/next/PayloadMarkdownDocsPage.d.ts +7 -0
  81. package/dist/next/PayloadMarkdownDocsPage.js +142 -0
  82. package/dist/next/PayloadMarkdownDocsPage.js.map +1 -0
  83. package/dist/next/index.d.ts +9 -0
  84. package/dist/next/index.js +7 -0
  85. package/dist/next/index.js.map +1 -0
  86. package/dist/next/markdown.d.ts +14 -0
  87. package/dist/next/markdown.js +232 -0
  88. package/dist/next/markdown.js.map +1 -0
  89. package/dist/next/metadata.d.ts +3 -0
  90. package/dist/next/metadata.js +33 -0
  91. package/dist/next/metadata.js.map +1 -0
  92. package/dist/next/records.d.ts +14 -0
  93. package/dist/next/records.js +146 -0
  94. package/dist/next/records.js.map +1 -0
  95. package/dist/next/route.d.ts +6 -0
  96. package/dist/next/route.js +271 -0
  97. package/dist/next/route.js.map +1 -0
  98. package/dist/next/sidebar.d.ts +15 -0
  99. package/dist/next/sidebar.js +137 -0
  100. package/dist/next/sidebar.js.map +1 -0
  101. package/dist/next/types.d.ts +117 -0
  102. package/dist/next/types.js +3 -0
  103. package/dist/next/types.js.map +1 -0
  104. package/dist/payload/applyDocsSync.d.ts +54 -0
  105. package/dist/payload/applyDocsSync.js +176 -0
  106. package/dist/payload/applyDocsSync.js.map +1 -0
  107. package/dist/payload/docsConflicts.d.ts +12 -0
  108. package/dist/payload/docsConflicts.js +34 -0
  109. package/dist/payload/docsConflicts.js.map +1 -0
  110. package/dist/payload/docsData.d.ts +23 -0
  111. package/dist/payload/docsData.js +59 -0
  112. package/dist/payload/docsData.js.map +1 -0
  113. package/dist/payload/docsSets.d.ts +38 -0
  114. package/dist/payload/docsSets.js +57 -0
  115. package/dist/payload/docsSets.js.map +1 -0
  116. package/dist/payload/existingDocs.d.ts +43 -0
  117. package/dist/payload/existingDocs.js +97 -0
  118. package/dist/payload/existingDocs.js.map +1 -0
  119. package/dist/payload/index.d.ts +15 -0
  120. package/dist/payload/index.js +10 -0
  121. package/dist/payload/index.js.map +1 -0
  122. package/dist/payload/routeCollisions.d.ts +31 -0
  123. package/dist/payload/routeCollisions.js +104 -0
  124. package/dist/payload/routeCollisions.js.map +1 -0
  125. package/dist/payload/syncRuns.d.ts +60 -0
  126. package/dist/payload/syncRuns.js +53 -0
  127. package/dist/payload/syncRuns.js.map +1 -0
  128. package/dist/plugin.d.ts +3 -0
  129. package/dist/plugin.js +165 -0
  130. package/dist/plugin.js.map +1 -0
  131. package/dist/routing/index.d.ts +3 -0
  132. package/dist/routing/index.js +4 -0
  133. package/dist/routing/index.js.map +1 -0
  134. package/dist/routing/paths.d.ts +7 -0
  135. package/dist/routing/paths.js +23 -0
  136. package/dist/routing/paths.js.map +1 -0
  137. package/dist/routing/reservations.d.ts +37 -0
  138. package/dist/routing/reservations.js +79 -0
  139. package/dist/routing/reservations.js.map +1 -0
  140. package/dist/security/canonical.d.ts +12 -0
  141. package/dist/security/canonical.js +24 -0
  142. package/dist/security/canonical.js.map +1 -0
  143. package/dist/security/githubOidc.d.ts +45 -0
  144. package/dist/security/githubOidc.js +177 -0
  145. package/dist/security/githubOidc.js.map +1 -0
  146. package/dist/security/headers.d.ts +22 -0
  147. package/dist/security/headers.js +44 -0
  148. package/dist/security/headers.js.map +1 -0
  149. package/dist/security/index.d.ts +15 -0
  150. package/dist/security/index.js +9 -0
  151. package/dist/security/index.js.map +1 -0
  152. package/dist/security/jwks.d.ts +20 -0
  153. package/dist/security/jwks.js +40 -0
  154. package/dist/security/jwks.js.map +1 -0
  155. package/dist/security/jwt.d.ts +10 -0
  156. package/dist/security/jwt.js +42 -0
  157. package/dist/security/jwt.js.map +1 -0
  158. package/dist/security/nonce.d.ts +34 -0
  159. package/dist/security/nonce.js +43 -0
  160. package/dist/security/nonce.js.map +1 -0
  161. package/dist/security/sign.d.ts +13 -0
  162. package/dist/security/sign.js +39 -0
  163. package/dist/security/sign.js.map +1 -0
  164. package/dist/security/verify.d.ts +28 -0
  165. package/dist/security/verify.js +54 -0
  166. package/dist/security/verify.js.map +1 -0
  167. package/dist/skills/codex/SKILL.md +173 -0
  168. package/dist/skills/codex/examples/docs-page.md +42 -0
  169. package/dist/skills/codex/examples/github-actions.md +64 -0
  170. package/dist/skills/codex/reference/admin.md +28 -0
  171. package/dist/skills/codex/reference/frontmatter.md +39 -0
  172. package/dist/skills/codex/reference/payload-markdown-directives.md +77 -0
  173. package/dist/skills/codex/reference/routing.md +35 -0
  174. package/dist/skills/codex/reference/sync.md +35 -0
  175. package/dist/skills/codex/reference/troubleshooting.md +53 -0
  176. package/dist/skills/codex/reference/workflow.md +39 -0
  177. package/dist/sync/aiExportManifest.d.ts +58 -0
  178. package/dist/sync/aiExportManifest.js +430 -0
  179. package/dist/sync/aiExportManifest.js.map +1 -0
  180. package/dist/sync/frontmatter.d.ts +28 -0
  181. package/dist/sync/frontmatter.js +210 -0
  182. package/dist/sync/frontmatter.js.map +1 -0
  183. package/dist/sync/hash.d.ts +1 -0
  184. package/dist/sync/hash.js +8 -0
  185. package/dist/sync/hash.js.map +1 -0
  186. package/dist/sync/index.d.ts +12 -0
  187. package/dist/sync/index.js +9 -0
  188. package/dist/sync/index.js.map +1 -0
  189. package/dist/sync/manifest.d.ts +58 -0
  190. package/dist/sync/manifest.js +21 -0
  191. package/dist/sync/manifest.js.map +1 -0
  192. package/dist/sync/paths.d.ts +16 -0
  193. package/dist/sync/paths.js +116 -0
  194. package/dist/sync/paths.js.map +1 -0
  195. package/dist/sync/plan.d.ts +29 -0
  196. package/dist/sync/plan.js +72 -0
  197. package/dist/sync/plan.js.map +1 -0
  198. package/dist/sync/validate.d.ts +26 -0
  199. package/dist/sync/validate.js +308 -0
  200. package/dist/sync/validate.js.map +1 -0
  201. package/dist/types.d.ts +84 -0
  202. package/dist/types.js +3 -0
  203. package/dist/types.js.map +1 -0
  204. package/package.json +143 -0
package/README.md ADDED
@@ -0,0 +1,195 @@
1
+ # @valkyrianlabs/payload-markdown-docs
2
+
3
+ Git-backed Markdown documentation sync for Payload CMS, powered by `@valkyrianlabs/payload-markdown`.
4
+
5
+ `payload-markdown-docs` lets developers and agents maintain Markdown in a repo-local `docs/` folder, validate it in CI, sign a manifest, and publish it into server-owned Payload docs sets.
6
+
7
+ The client sends docs content. The Payload plugin decides where it may go.
8
+
9
+ ## Current Status
10
+
11
+ Implemented:
12
+
13
+ - docs groups and docs sets as the user-facing model
14
+ - generated/internal docs records linked to docs sets
15
+ - route reservations and optional docs-side Pages collision checks
16
+ - signed sync endpoint with nonce replay protection
17
+ - CLI commands for `validate`, `manifest`, `plan`, `keygen`, and signed `push`
18
+ - dedicated docs create/update/archive/draft/delete lifecycle behind server gates
19
+ - publishing controls for draft-enabled dedicated docs collections
20
+ - read-only `/next` route adapter, sidebar helper, metadata helper, and page component
21
+ - read-only Docs Set Admin Manager
22
+ - local agent skill installer
23
+ - GitHub Actions OIDC auth mode
24
+ - real `/docs` dogfood documentation set
25
+
26
+ Not implemented yet:
27
+
28
+ - existing collection targets
29
+ - block targets
30
+ - inline override editing from the docs set manager
31
+
32
+ ## Install
33
+
34
+ ```bash
35
+ pnpm add @valkyrianlabs/payload-markdown-docs @valkyrianlabs/payload-markdown
36
+ ```
37
+
38
+ ## Minimal Config
39
+
40
+ ```ts
41
+ import { payloadMarkdownDocs } from '@valkyrianlabs/payload-markdown-docs'
42
+ import { buildConfig } from 'payload'
43
+
44
+ export default buildConfig({
45
+ plugins: [
46
+ payloadMarkdownDocs({
47
+ enabled: true,
48
+ }),
49
+ ],
50
+ })
51
+ ```
52
+
53
+ ## Dedicated Docs Config
54
+
55
+ ```ts
56
+ payloadMarkdownDocs({
57
+ enabled: true,
58
+
59
+ auth: {
60
+ mode: 'ed25519',
61
+ keys: [
62
+ {
63
+ id: 'github-actions-main',
64
+ publicKey: process.env.DOCS_SYNC_PUBLIC_KEY!,
65
+ },
66
+ ],
67
+ },
68
+
69
+ target: {
70
+ type: 'docsCollection',
71
+ enableDrafts: true,
72
+ },
73
+
74
+ sources: [
75
+ {
76
+ id: 'main-docs',
77
+ root: 'docs',
78
+ routeBase: '/docs',
79
+ },
80
+ ],
81
+
82
+ sync: {
83
+ allowWrites: true,
84
+ allowPublish: true,
85
+ allowHardDelete: false,
86
+ defaultPublishMode: 'draft',
87
+ deleteBehavior: 'archive',
88
+ },
89
+ })
90
+ ```
91
+
92
+ GitHub Actions can use OIDC instead of a long-lived private key:
93
+
94
+ ```ts
95
+ payloadMarkdownDocs({
96
+ enabled: true,
97
+
98
+ auth: {
99
+ mode: 'github-oidc',
100
+ audience: 'payload-markdown-docs',
101
+ allowedRepositories: ['valkyrianlabs/payload-markdown-docs'],
102
+ allowedRefs: ['refs/heads/main'],
103
+ },
104
+
105
+ target: {
106
+ type: 'docsCollection',
107
+ enableDrafts: true,
108
+ },
109
+
110
+ sync: {
111
+ allowWrites: true,
112
+ allowPublish: true,
113
+ },
114
+ })
115
+ ```
116
+
117
+ ## Quick Commands
118
+
119
+ ```bash
120
+ pnpm exec payload-markdown-docs keygen --out .docs-sync
121
+ pnpm exec payload-markdown-docs validate ./docs --source main-docs
122
+ pnpm exec payload-markdown-docs manifest ./docs --source main-docs --pretty
123
+ pnpm exec payload-markdown-docs plan ./docs --source main-docs
124
+ pnpm exec payload-markdown-docs install skill --codex
125
+ ```
126
+
127
+ Signed dry-run:
128
+
129
+ ```bash
130
+ pnpm exec payload-markdown-docs push ./docs \
131
+ --endpoint "$DOCS_SYNC_ENDPOINT" \
132
+ --source main-docs \
133
+ --key-id github-actions-main \
134
+ --private-key-file .docs-sync/docs-sync-private.pem \
135
+ --dry-run
136
+ ```
137
+
138
+ Signed sync and publish:
139
+
140
+ ```bash
141
+ pnpm exec payload-markdown-docs push ./docs \
142
+ --endpoint "$DOCS_SYNC_ENDPOINT" \
143
+ --source main-docs \
144
+ --key-id github-actions-main \
145
+ --private-key-env DOCS_SYNC_PRIVATE_KEY \
146
+ --sync \
147
+ --publish
148
+ ```
149
+
150
+ GitHub OIDC sync from Actions:
151
+
152
+ ```bash
153
+ pnpm exec payload-markdown-docs push ./docs \
154
+ --endpoint "$DOCS_SYNC_ENDPOINT" \
155
+ --source main-docs \
156
+ --github-oidc \
157
+ --oidc-audience payload-markdown-docs \
158
+ --sync \
159
+ --publish
160
+ ```
161
+
162
+ `--sync` requires `sync.allowWrites: true`. `--publish` requires `sync.allowPublish: true` and `target.enableDrafts: true`. Hard delete requires `sync.allowHardDelete: true`.
163
+
164
+ ## Documentation
165
+
166
+ The real plugin docs now live in [`docs/`](docs/index.md). Start with:
167
+
168
+ - [Overview](docs/index.md)
169
+ - [Installation](docs/getting-started/installation.md)
170
+ - [Quick Start](docs/getting-started/quick-start.md)
171
+ - [Architecture](docs/concepts/architecture.md)
172
+ - [GitHub OIDC](docs/configuration/github-oidc.md)
173
+ - [GitHub Actions](docs/workflow/ci-github-actions.md)
174
+ - [Agent Skill Installer](docs/workflow/agent-skill-installer.md)
175
+ - [Route Adapter](docs/frontend/route-adapter.md)
176
+ - [Docs Set Admin Manager](docs/admin/docs-set-manager.md)
177
+ - [Troubleshooting](docs/reference/troubleshooting.md)
178
+
179
+ The `/docs` tree is also dogfood material for the plugin: it uses supported frontmatter, root-relative internal links, and `payload-markdown` directives.
180
+
181
+ ## Examples
182
+
183
+ - `examples/docs/` is a small fixture docs tree.
184
+ - `examples/github-actions/publish-docs.yml` shows PR dry-run and main-branch sync/publish.
185
+ - `examples/next/app-docs-route.md` shows the native route adapter pattern.
186
+ - `dev/README.md` documents the local end-to-end dev harness for fixtures, seed scripts, signed push, and route adapter checks.
187
+
188
+ ## Roadmap
189
+
190
+ Next major work:
191
+
192
+ - existing collection or block bridges only if still needed
193
+ - skill update/verify and drift-check workflow polish
194
+
195
+ See [`.codex/scratch/roadmap.md`](.codex/scratch/roadmap.md) for the working implementation roadmap.
@@ -0,0 +1,2 @@
1
+ import type { UIFieldServerProps } from 'payload';
2
+ export declare const DocsSetManager: ({ id, field, payload, req, }: UIFieldServerProps) => Promise<import("react/jsx-runtime").JSX.Element>;
@@ -0,0 +1,298 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { DEFAULT_DOCS_COLLECTION_SLUG, DEFAULT_DOCS_SETS_COLLECTION_SLUG } from '../constants.js';
3
+ import { getDocsSetManagerData } from './docsSetManagerData.js';
4
+ const getFieldCustom = (field)=>{
5
+ const custom = 'custom' in field ? field.custom : undefined;
6
+ if (!custom || typeof custom !== 'object') {
7
+ return {};
8
+ }
9
+ return custom;
10
+ };
11
+ const formatDate = (value)=>{
12
+ if (!value) {
13
+ return 'Never';
14
+ }
15
+ const date = new Date(value);
16
+ if (Number.isNaN(date.getTime())) {
17
+ return value;
18
+ }
19
+ return date.toISOString();
20
+ };
21
+ const StatusLabel = ({ item })=>{
22
+ if (item.archived) {
23
+ return /*#__PURE__*/ _jsx("span", {
24
+ children: "archived"
25
+ });
26
+ }
27
+ if (item.draft) {
28
+ return /*#__PURE__*/ _jsx("span", {
29
+ children: "draft"
30
+ });
31
+ }
32
+ if (item.published) {
33
+ return /*#__PURE__*/ _jsx("span", {
34
+ children: "published"
35
+ });
36
+ }
37
+ return /*#__PURE__*/ _jsx("span", {
38
+ children: "synced"
39
+ });
40
+ };
41
+ const OverrideSummary = ({ item })=>{
42
+ if (item.overrideSummary.length === 0) {
43
+ return /*#__PURE__*/ _jsx("span", {
44
+ children: "none"
45
+ });
46
+ }
47
+ return /*#__PURE__*/ _jsx("span", {
48
+ children: item.overrideSummary.join(', ')
49
+ });
50
+ };
51
+ const renderDocItem = (item)=>{
52
+ if (item.kind === 'folder') {
53
+ return /*#__PURE__*/ _jsxs("details", {
54
+ children: [
55
+ /*#__PURE__*/ _jsx("summary", {
56
+ children: item.title
57
+ }),
58
+ /*#__PURE__*/ _jsx("div", {
59
+ children: item.children?.map((child)=>renderDocItem(child))
60
+ })
61
+ ]
62
+ }, item.id);
63
+ }
64
+ return /*#__PURE__*/ _jsxs("details", {
65
+ children: [
66
+ /*#__PURE__*/ _jsx("summary", {
67
+ children: item.sourcePath
68
+ }),
69
+ /*#__PURE__*/ _jsxs("dl", {
70
+ children: [
71
+ /*#__PURE__*/ _jsxs("div", {
72
+ children: [
73
+ /*#__PURE__*/ _jsx("dt", {
74
+ children: "Route"
75
+ }),
76
+ /*#__PURE__*/ _jsx("dd", {
77
+ children: item.route || 'Missing route'
78
+ })
79
+ ]
80
+ }),
81
+ /*#__PURE__*/ _jsxs("div", {
82
+ children: [
83
+ /*#__PURE__*/ _jsx("dt", {
84
+ children: "Title"
85
+ }),
86
+ /*#__PURE__*/ _jsx("dd", {
87
+ children: item.title
88
+ })
89
+ ]
90
+ }),
91
+ /*#__PURE__*/ _jsxs("div", {
92
+ children: [
93
+ /*#__PURE__*/ _jsx("dt", {
94
+ children: "Status"
95
+ }),
96
+ /*#__PURE__*/ _jsx("dd", {
97
+ children: /*#__PURE__*/ _jsx(StatusLabel, {
98
+ item: item
99
+ })
100
+ })
101
+ ]
102
+ }),
103
+ /*#__PURE__*/ _jsxs("div", {
104
+ children: [
105
+ /*#__PURE__*/ _jsx("dt", {
106
+ children: "Overrides"
107
+ }),
108
+ /*#__PURE__*/ _jsx("dd", {
109
+ children: /*#__PURE__*/ _jsx(OverrideSummary, {
110
+ item: item
111
+ })
112
+ })
113
+ ]
114
+ })
115
+ ]
116
+ }),
117
+ item.adminURL ? /*#__PURE__*/ _jsx("a", {
118
+ href: item.adminURL,
119
+ children: "Open generated doc"
120
+ }) : null
121
+ ]
122
+ }, item.id);
123
+ };
124
+ const Summary = ({ data })=>/*#__PURE__*/ _jsxs("dl", {
125
+ children: [
126
+ /*#__PURE__*/ _jsxs("div", {
127
+ children: [
128
+ /*#__PURE__*/ _jsx("dt", {
129
+ children: "Docs"
130
+ }),
131
+ /*#__PURE__*/ _jsx("dd", {
132
+ children: data.summary.total
133
+ })
134
+ ]
135
+ }),
136
+ /*#__PURE__*/ _jsxs("div", {
137
+ children: [
138
+ /*#__PURE__*/ _jsx("dt", {
139
+ children: "Archived"
140
+ }),
141
+ /*#__PURE__*/ _jsx("dd", {
142
+ children: data.summary.archived
143
+ })
144
+ ]
145
+ }),
146
+ /*#__PURE__*/ _jsxs("div", {
147
+ children: [
148
+ /*#__PURE__*/ _jsx("dt", {
149
+ children: "Drafts"
150
+ }),
151
+ /*#__PURE__*/ _jsx("dd", {
152
+ children: data.summary.drafts
153
+ })
154
+ ]
155
+ }),
156
+ /*#__PURE__*/ _jsxs("div", {
157
+ children: [
158
+ /*#__PURE__*/ _jsx("dt", {
159
+ children: "Published"
160
+ }),
161
+ /*#__PURE__*/ _jsx("dd", {
162
+ children: data.summary.published
163
+ })
164
+ ]
165
+ }),
166
+ /*#__PURE__*/ _jsxs("div", {
167
+ children: [
168
+ /*#__PURE__*/ _jsx("dt", {
169
+ children: "Hidden from nav"
170
+ }),
171
+ /*#__PURE__*/ _jsx("dd", {
172
+ children: data.summary.hiddenFromNav
173
+ })
174
+ ]
175
+ }),
176
+ /*#__PURE__*/ _jsxs("div", {
177
+ children: [
178
+ /*#__PURE__*/ _jsx("dt", {
179
+ children: "With overrides"
180
+ }),
181
+ /*#__PURE__*/ _jsx("dd", {
182
+ children: data.summary.withOverrides
183
+ })
184
+ ]
185
+ }),
186
+ /*#__PURE__*/ _jsxs("div", {
187
+ children: [
188
+ /*#__PURE__*/ _jsx("dt", {
189
+ children: "Last sync"
190
+ }),
191
+ /*#__PURE__*/ _jsx("dd", {
192
+ children: formatDate(data.sync?.lastSyncedAt)
193
+ })
194
+ ]
195
+ }),
196
+ /*#__PURE__*/ _jsxs("div", {
197
+ children: [
198
+ /*#__PURE__*/ _jsx("dt", {
199
+ children: "Last status"
200
+ }),
201
+ /*#__PURE__*/ _jsx("dd", {
202
+ children: data.sync?.lastStatus ?? 'unknown'
203
+ })
204
+ ]
205
+ })
206
+ ]
207
+ });
208
+ export const DocsSetManager = async ({ id, field, payload, req })=>{
209
+ const custom = getFieldCustom(field);
210
+ const docsCollectionSlug = custom.docsCollectionSlug ?? DEFAULT_DOCS_COLLECTION_SLUG;
211
+ const docsSetsCollectionSlug = custom.docsSetsCollectionSlug ?? DEFAULT_DOCS_SETS_COLLECTION_SLUG;
212
+ if (!id) {
213
+ return /*#__PURE__*/ _jsxs("section", {
214
+ children: [
215
+ /*#__PURE__*/ _jsx("h2", {
216
+ children: "Generated Docs"
217
+ }),
218
+ /*#__PURE__*/ _jsx("p", {
219
+ children: "Save this docs set before reviewing generated docs records."
220
+ })
221
+ ]
222
+ });
223
+ }
224
+ const data = await getDocsSetManagerData({
225
+ adminRoute: req.payload.config.routes.admin,
226
+ docsCollectionSlug,
227
+ docsSetId: String(id),
228
+ docsSetsCollectionSlug,
229
+ payload: payload
230
+ });
231
+ return /*#__PURE__*/ _jsxs("section", {
232
+ children: [
233
+ /*#__PURE__*/ _jsxs("header", {
234
+ children: [
235
+ /*#__PURE__*/ _jsx("h2", {
236
+ children: "Generated Docs"
237
+ }),
238
+ /*#__PURE__*/ _jsxs("p", {
239
+ children: [
240
+ "Review generated docs records for ",
241
+ data.docsSet.title,
242
+ ". Source docs remain Git-backed; per-doc overrides can be edited by opening a generated doc."
243
+ ]
244
+ })
245
+ ]
246
+ }),
247
+ /*#__PURE__*/ _jsxs("section", {
248
+ children: [
249
+ /*#__PURE__*/ _jsx("h3", {
250
+ children: "Route Base"
251
+ }),
252
+ /*#__PURE__*/ _jsx("p", {
253
+ children: data.docsSet.routeBase || 'No route base configured'
254
+ })
255
+ ]
256
+ }),
257
+ /*#__PURE__*/ _jsxs("section", {
258
+ children: [
259
+ /*#__PURE__*/ _jsx("h3", {
260
+ children: "Sync Summary"
261
+ }),
262
+ /*#__PURE__*/ _jsx(Summary, {
263
+ data: data
264
+ })
265
+ ]
266
+ }),
267
+ data.warnings.length > 0 ? /*#__PURE__*/ _jsxs("section", {
268
+ children: [
269
+ /*#__PURE__*/ _jsx("h3", {
270
+ children: "Warnings"
271
+ }),
272
+ /*#__PURE__*/ _jsx("ul", {
273
+ children: data.warnings.map((warning)=>/*#__PURE__*/ _jsxs("li", {
274
+ children: [
275
+ warning.sourcePath ? `${warning.sourcePath}: ` : null,
276
+ warning.message
277
+ ]
278
+ }, `${warning.docId ?? 'docs-set'}:${warning.message}`))
279
+ })
280
+ ]
281
+ }) : null,
282
+ /*#__PURE__*/ _jsxs("section", {
283
+ children: [
284
+ /*#__PURE__*/ _jsx("h3", {
285
+ children: "Generated Docs"
286
+ }),
287
+ data.tree.length > 0 ? /*#__PURE__*/ _jsx("div", {
288
+ children: data.tree.map((item)=>renderDocItem(item))
289
+ }) : /*#__PURE__*/ _jsx("p", {
290
+ children: "No generated docs records are linked to this docs set yet."
291
+ })
292
+ ]
293
+ })
294
+ ]
295
+ });
296
+ };
297
+
298
+ //# sourceMappingURL=DocsSetManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/admin/DocsSetManager.tsx"],"sourcesContent":["import type { UIFieldServerProps } from 'payload'\nimport type { ReactNode } from 'react'\n\nimport type {\n DocsSetManagerData,\n DocsSetManagerDocItem,\n DocsSetManagerPayloadOperations,\n} from './docsSetManagerTypes.js'\n\nimport {\n DEFAULT_DOCS_COLLECTION_SLUG,\n DEFAULT_DOCS_SETS_COLLECTION_SLUG,\n} from '../constants.js'\nimport { getDocsSetManagerData } from './docsSetManagerData.js'\n\ntype DocsSetManagerFieldCustom = {\n docsCollectionSlug?: string\n docsSetsCollectionSlug?: string\n}\n\nconst getFieldCustom = (\n field: UIFieldServerProps['field'],\n): DocsSetManagerFieldCustom => {\n const custom = 'custom' in field ? field.custom : undefined\n\n if (!custom || typeof custom !== 'object') {\n return {}\n }\n\n return custom as DocsSetManagerFieldCustom\n}\n\nconst formatDate = (value?: string): string => {\n if (!value) {\n return 'Never'\n }\n\n const date = new Date(value)\n\n if (Number.isNaN(date.getTime())) {\n return value\n }\n\n return date.toISOString()\n}\n\nconst StatusLabel = ({ item }: { item: DocsSetManagerDocItem }) => {\n if (item.archived) {\n return <span>archived</span>\n }\n\n if (item.draft) {\n return <span>draft</span>\n }\n\n if (item.published) {\n return <span>published</span>\n }\n\n return <span>synced</span>\n}\n\nconst OverrideSummary = ({ item }: { item: DocsSetManagerDocItem }) => {\n if (item.overrideSummary.length === 0) {\n return <span>none</span>\n }\n\n return <span>{item.overrideSummary.join(', ')}</span>\n}\n\nconst renderDocItem = (item: DocsSetManagerDocItem): ReactNode => {\n if (item.kind === 'folder') {\n return (\n <details key={item.id}>\n <summary>{item.title}</summary>\n <div>\n {item.children?.map((child) => renderDocItem(child))}\n </div>\n </details>\n )\n }\n\n return (\n <details key={item.id}>\n <summary>{item.sourcePath}</summary>\n <dl>\n <div>\n <dt>Route</dt>\n <dd>{item.route || 'Missing route'}</dd>\n </div>\n <div>\n <dt>Title</dt>\n <dd>{item.title}</dd>\n </div>\n <div>\n <dt>Status</dt>\n <dd>\n <StatusLabel item={item} />\n </dd>\n </div>\n <div>\n <dt>Overrides</dt>\n <dd>\n <OverrideSummary item={item} />\n </dd>\n </div>\n </dl>\n {item.adminURL ? <a href={item.adminURL}>Open generated doc</a> : null}\n </details>\n )\n}\n\nconst Summary = ({ data }: { data: DocsSetManagerData }) => (\n <dl>\n <div>\n <dt>Docs</dt>\n <dd>{data.summary.total}</dd>\n </div>\n <div>\n <dt>Archived</dt>\n <dd>{data.summary.archived}</dd>\n </div>\n <div>\n <dt>Drafts</dt>\n <dd>{data.summary.drafts}</dd>\n </div>\n <div>\n <dt>Published</dt>\n <dd>{data.summary.published}</dd>\n </div>\n <div>\n <dt>Hidden from nav</dt>\n <dd>{data.summary.hiddenFromNav}</dd>\n </div>\n <div>\n <dt>With overrides</dt>\n <dd>{data.summary.withOverrides}</dd>\n </div>\n <div>\n <dt>Last sync</dt>\n <dd>{formatDate(data.sync?.lastSyncedAt)}</dd>\n </div>\n <div>\n <dt>Last status</dt>\n <dd>{data.sync?.lastStatus ?? 'unknown'}</dd>\n </div>\n </dl>\n)\n\nexport const DocsSetManager = async ({\n id,\n field,\n payload,\n req,\n}: UIFieldServerProps) => {\n const custom = getFieldCustom(field)\n const docsCollectionSlug = custom.docsCollectionSlug ?? DEFAULT_DOCS_COLLECTION_SLUG\n const docsSetsCollectionSlug =\n custom.docsSetsCollectionSlug ?? DEFAULT_DOCS_SETS_COLLECTION_SLUG\n\n if (!id) {\n return (\n <section>\n <h2>Generated Docs</h2>\n <p>Save this docs set before reviewing generated docs records.</p>\n </section>\n )\n }\n\n const data = await getDocsSetManagerData({\n adminRoute: req.payload.config.routes.admin,\n docsCollectionSlug,\n docsSetId: String(id),\n docsSetsCollectionSlug,\n payload: payload as DocsSetManagerPayloadOperations,\n })\n\n return (\n <section>\n <header>\n <h2>Generated Docs</h2>\n <p>\n Review generated docs records for {data.docsSet.title}. Source docs remain\n Git-backed; per-doc overrides can be edited by opening a generated doc.\n </p>\n </header>\n\n <section>\n <h3>Route Base</h3>\n <p>{data.docsSet.routeBase || 'No route base configured'}</p>\n </section>\n\n <section>\n <h3>Sync Summary</h3>\n <Summary data={data} />\n </section>\n\n {data.warnings.length > 0 ? (\n <section>\n <h3>Warnings</h3>\n <ul>\n {data.warnings.map((warning) => (\n <li key={`${warning.docId ?? 'docs-set'}:${warning.message}`}>\n {warning.sourcePath ? `${warning.sourcePath}: ` : null}\n {warning.message}\n </li>\n ))}\n </ul>\n </section>\n ) : null}\n\n <section>\n <h3>Generated Docs</h3>\n {data.tree.length > 0 ? (\n <div>{data.tree.map((item) => renderDocItem(item))}</div>\n ) : (\n <p>No generated docs records are linked to this docs set yet.</p>\n )}\n </section>\n </section>\n )\n}\n"],"names":["DEFAULT_DOCS_COLLECTION_SLUG","DEFAULT_DOCS_SETS_COLLECTION_SLUG","getDocsSetManagerData","getFieldCustom","field","custom","undefined","formatDate","value","date","Date","Number","isNaN","getTime","toISOString","StatusLabel","item","archived","span","draft","published","OverrideSummary","overrideSummary","length","join","renderDocItem","kind","details","summary","title","div","children","map","child","id","sourcePath","dl","dt","dd","route","adminURL","a","href","Summary","data","total","drafts","hiddenFromNav","withOverrides","sync","lastSyncedAt","lastStatus","DocsSetManager","payload","req","docsCollectionSlug","docsSetsCollectionSlug","section","h2","p","adminRoute","config","routes","admin","docsSetId","String","header","docsSet","h3","routeBase","warnings","ul","warning","li","message","docId","tree"],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { DocsSetManagerData, DocsSetManagerPayloadOperations, RawDocsRecord, RawDocsSetRecord } from './docsSetManagerTypes.js';
2
+ export declare const getGeneratedDocAdminURL: ({ id, adminRoute, docsCollectionSlug, }: {
3
+ adminRoute?: string;
4
+ docsCollectionSlug: string;
5
+ id: string;
6
+ }) => string;
7
+ export declare const buildDocsSetManagerData: ({ adminRoute, docs, docsCollectionSlug, docsSet, }: {
8
+ adminRoute?: string;
9
+ docs: RawDocsRecord[];
10
+ docsCollectionSlug?: string;
11
+ docsSet: RawDocsSetRecord;
12
+ }) => DocsSetManagerData;
13
+ export declare const isDocsRecordForDocsSet: ({ doc, docsSetId, sourceId, }: {
14
+ doc: RawDocsRecord;
15
+ docsSetId: string;
16
+ sourceId: string;
17
+ }) => boolean;
18
+ export declare const getDocsSetManagerData: ({ adminRoute, docsCollectionSlug, docsSetId, docsSetsCollectionSlug, overrideAccess, payload, }: {
19
+ adminRoute?: string;
20
+ docsCollectionSlug?: string;
21
+ docsSetId: string;
22
+ docsSetsCollectionSlug?: string;
23
+ overrideAccess?: boolean;
24
+ payload: DocsSetManagerPayloadOperations;
25
+ }) => Promise<DocsSetManagerData>;