@forumone/throughline 2.1.0 → 2.2.0-next-623d42c

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 (183) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/dist/approvals/endpoints/action.d.ts.map +1 -1
  3. package/dist/approvals/endpoints/action.js +27 -8
  4. package/dist/approvals/endpoints/action.js.map +1 -1
  5. package/dist/approvals/tokens.d.ts +3 -0
  6. package/dist/approvals/tokens.d.ts.map +1 -1
  7. package/dist/approvals/tokens.js +1 -1
  8. package/dist/approvals/tokens.js.map +1 -1
  9. package/dist/authoring/tools.d.ts.map +1 -1
  10. package/dist/authoring/tools.js +6 -1
  11. package/dist/authoring/tools.js.map +1 -1
  12. package/dist/components/tools/validate-composition.d.ts.map +1 -1
  13. package/dist/components/tools/validate-composition.js +4 -1
  14. package/dist/components/tools/validate-composition.js.map +1 -1
  15. package/dist/components/validation/composition.d.ts +9 -1
  16. package/dist/components/validation/composition.d.ts.map +1 -1
  17. package/dist/components/validation/composition.js +9 -7
  18. package/dist/components/validation/composition.js.map +1 -1
  19. package/dist/exports/client.d.ts +3 -0
  20. package/dist/exports/client.d.ts.map +1 -1
  21. package/dist/exports/client.js +2 -0
  22. package/dist/exports/client.js.map +1 -1
  23. package/dist/fields/slug.d.ts.map +1 -1
  24. package/dist/fields/slug.js +4 -1
  25. package/dist/fields/slug.js.map +1 -1
  26. package/dist/integrations/admin/SyncButton.d.ts.map +1 -1
  27. package/dist/integrations/admin/SyncButton.js +11 -5
  28. package/dist/integrations/admin/SyncButton.js.map +1 -1
  29. package/dist/integrations/admin/sync-client.d.ts +2 -0
  30. package/dist/integrations/admin/sync-client.d.ts.map +1 -1
  31. package/dist/integrations/admin/sync-client.js +7 -1
  32. package/dist/integrations/admin/sync-client.js.map +1 -1
  33. package/dist/integrations/collection.d.ts +1 -1
  34. package/dist/integrations/collection.d.ts.map +1 -1
  35. package/dist/integrations/collection.js +11 -4
  36. package/dist/integrations/collection.js.map +1 -1
  37. package/dist/integrations/sync/status.d.ts +17 -4
  38. package/dist/integrations/sync/status.d.ts.map +1 -1
  39. package/dist/integrations/sync/status.js +37 -6
  40. package/dist/integrations/sync/status.js.map +1 -1
  41. package/dist/media/hooks.d.ts.map +1 -1
  42. package/dist/media/hooks.js +11 -9
  43. package/dist/media/hooks.js.map +1 -1
  44. package/dist/migrate/exports.json +16 -0
  45. package/dist/publishing/admin/FirstErrorProvider.d.ts +24 -0
  46. package/dist/publishing/admin/FirstErrorProvider.d.ts.map +1 -0
  47. package/dist/publishing/admin/FirstErrorProvider.js +100 -0
  48. package/dist/publishing/admin/FirstErrorProvider.js.map +1 -0
  49. package/dist/publishing/admin/PublishButton.d.ts.map +1 -1
  50. package/dist/publishing/admin/PublishButton.js +18 -3
  51. package/dist/publishing/admin/PublishButton.js.map +1 -1
  52. package/dist/publishing/admin/SchedulePublishField.d.ts.map +1 -1
  53. package/dist/publishing/admin/SchedulePublishField.js +25 -10
  54. package/dist/publishing/admin/SchedulePublishField.js.map +1 -1
  55. package/dist/publishing/admin/UnpublishButton.d.ts.map +1 -1
  56. package/dist/publishing/admin/UnpublishButton.js +9 -3
  57. package/dist/publishing/admin/UnpublishButton.js.map +1 -1
  58. package/dist/publishing/admin/first-error.d.ts +60 -0
  59. package/dist/publishing/admin/first-error.d.ts.map +1 -0
  60. package/dist/publishing/admin/first-error.js +211 -0
  61. package/dist/publishing/admin/first-error.js.map +1 -0
  62. package/dist/publishing/admin/publishing-client.d.ts +33 -4
  63. package/dist/publishing/admin/publishing-client.d.ts.map +1 -1
  64. package/dist/publishing/admin/publishing-client.js +56 -21
  65. package/dist/publishing/admin/publishing-client.js.map +1 -1
  66. package/dist/publishing/admin/schedule-state.d.ts +31 -4
  67. package/dist/publishing/admin/schedule-state.d.ts.map +1 -1
  68. package/dist/publishing/admin/schedule-state.js +26 -14
  69. package/dist/publishing/admin/schedule-state.js.map +1 -1
  70. package/dist/publishing/checks/alt-text.d.ts.map +1 -1
  71. package/dist/publishing/checks/alt-text.js +3 -1
  72. package/dist/publishing/checks/alt-text.js.map +1 -1
  73. package/dist/publishing/checks/heading-hierarchy.d.ts +9 -3
  74. package/dist/publishing/checks/heading-hierarchy.d.ts.map +1 -1
  75. package/dist/publishing/checks/heading-hierarchy.js +19 -6
  76. package/dist/publishing/checks/heading-hierarchy.js.map +1 -1
  77. package/dist/publishing/checks/link-labels.js +1 -1
  78. package/dist/publishing/checks/link-labels.js.map +1 -1
  79. package/dist/publishing/endpoints/admin.d.ts.map +1 -1
  80. package/dist/publishing/endpoints/admin.js +26 -7
  81. package/dist/publishing/endpoints/admin.js.map +1 -1
  82. package/dist/publishing/events.d.ts +15 -1
  83. package/dist/publishing/events.d.ts.map +1 -1
  84. package/dist/publishing/events.js +17 -2
  85. package/dist/publishing/events.js.map +1 -1
  86. package/dist/publishing/hooks/block-status-writes.js +5 -2
  87. package/dist/publishing/hooks/block-status-writes.js.map +1 -1
  88. package/dist/publishing/hooks/schedule-events.d.ts.map +1 -1
  89. package/dist/publishing/hooks/schedule-events.js +5 -7
  90. package/dist/publishing/hooks/schedule-events.js.map +1 -1
  91. package/dist/publishing/index.d.ts +9 -1
  92. package/dist/publishing/index.d.ts.map +1 -1
  93. package/dist/publishing/index.js +7 -0
  94. package/dist/publishing/index.js.map +1 -1
  95. package/dist/publishing/messages.d.ts +63 -0
  96. package/dist/publishing/messages.d.ts.map +1 -0
  97. package/dist/publishing/messages.js +84 -0
  98. package/dist/publishing/messages.js.map +1 -0
  99. package/dist/publishing/options.d.ts +46 -1
  100. package/dist/publishing/options.d.ts.map +1 -1
  101. package/dist/publishing/options.js +8 -0
  102. package/dist/publishing/options.js.map +1 -1
  103. package/dist/publishing/pipeline/finish.d.ts +12 -0
  104. package/dist/publishing/pipeline/finish.d.ts.map +1 -0
  105. package/dist/publishing/pipeline/finish.js +24 -0
  106. package/dist/publishing/pipeline/finish.js.map +1 -0
  107. package/dist/publishing/pipeline/index.d.ts.map +1 -1
  108. package/dist/publishing/pipeline/index.js +11 -8
  109. package/dist/publishing/pipeline/index.js.map +1 -1
  110. package/dist/publishing/pipeline/steps/accessibility.d.ts +3 -3
  111. package/dist/publishing/pipeline/steps/accessibility.d.ts.map +1 -1
  112. package/dist/publishing/pipeline/steps/accessibility.js +17 -9
  113. package/dist/publishing/pipeline/steps/accessibility.js.map +1 -1
  114. package/dist/publishing/pipeline/steps/approval.d.ts.map +1 -1
  115. package/dist/publishing/pipeline/steps/approval.js +6 -4
  116. package/dist/publishing/pipeline/steps/approval.js.map +1 -1
  117. package/dist/publishing/pipeline/steps/composition.d.ts.map +1 -1
  118. package/dist/publishing/pipeline/steps/composition.js +36 -17
  119. package/dist/publishing/pipeline/steps/composition.js.map +1 -1
  120. package/dist/publishing/pipeline/steps/embargo.d.ts +4 -0
  121. package/dist/publishing/pipeline/steps/embargo.d.ts.map +1 -1
  122. package/dist/publishing/pipeline/steps/embargo.js +13 -4
  123. package/dist/publishing/pipeline/steps/embargo.js.map +1 -1
  124. package/dist/publishing/pipeline/steps/execute.d.ts.map +1 -1
  125. package/dist/publishing/pipeline/steps/execute.js +48 -5
  126. package/dist/publishing/pipeline/steps/execute.js.map +1 -1
  127. package/dist/publishing/pipeline/steps/exist.d.ts +2 -0
  128. package/dist/publishing/pipeline/steps/exist.d.ts.map +1 -1
  129. package/dist/publishing/pipeline/steps/exist.js +5 -3
  130. package/dist/publishing/pipeline/steps/exist.js.map +1 -1
  131. package/dist/publishing/pipeline/steps/link-targets.d.ts +3 -0
  132. package/dist/publishing/pipeline/steps/link-targets.d.ts.map +1 -0
  133. package/dist/publishing/pipeline/steps/link-targets.js +293 -0
  134. package/dist/publishing/pipeline/steps/link-targets.js.map +1 -0
  135. package/dist/publishing/pipeline/steps/required-fields.d.ts.map +1 -1
  136. package/dist/publishing/pipeline/steps/required-fields.js +7 -5
  137. package/dist/publishing/pipeline/steps/required-fields.js.map +1 -1
  138. package/dist/publishing/pipeline/types.d.ts +25 -0
  139. package/dist/publishing/pipeline/types.d.ts.map +1 -1
  140. package/dist/publishing/pipeline/where.d.ts +13 -0
  141. package/dist/publishing/pipeline/where.d.ts.map +1 -0
  142. package/dist/publishing/pipeline/where.js +44 -0
  143. package/dist/publishing/pipeline/where.js.map +1 -0
  144. package/dist/publishing/plugin.d.ts.map +1 -1
  145. package/dist/publishing/plugin.js +22 -0
  146. package/dist/publishing/plugin.js.map +1 -1
  147. package/dist/publishing/service.d.ts +26 -17
  148. package/dist/publishing/service.d.ts.map +1 -1
  149. package/dist/publishing/service.js +43 -32
  150. package/dist/publishing/service.js.map +1 -1
  151. package/dist/publishing/tools/get-publish-status.d.ts.map +1 -1
  152. package/dist/publishing/tools/get-publish-status.js +4 -0
  153. package/dist/publishing/tools/get-publish-status.js.map +1 -1
  154. package/dist/publishing/tools/rollback.d.ts.map +1 -1
  155. package/dist/publishing/tools/rollback.js +1 -1
  156. package/dist/publishing/tools/rollback.js.map +1 -1
  157. package/dist/references/UsedOnPanel.d.ts.map +1 -1
  158. package/dist/references/UsedOnPanel.js +1 -1
  159. package/dist/references/UsedOnPanel.js.map +1 -1
  160. package/dist/references/find.d.ts +12 -1
  161. package/dist/references/find.d.ts.map +1 -1
  162. package/dist/references/find.js +24 -5
  163. package/dist/references/find.js.map +1 -1
  164. package/dist/references/guards.d.ts.map +1 -1
  165. package/dist/references/guards.js +9 -2
  166. package/dist/references/guards.js.map +1 -1
  167. package/dist/references/index.d.ts +4 -2
  168. package/dist/references/index.d.ts.map +1 -1
  169. package/dist/references/index.js +2 -1
  170. package/dist/references/index.js.map +1 -1
  171. package/dist/references/links.d.ts +45 -0
  172. package/dist/references/links.d.ts.map +1 -0
  173. package/dist/references/links.js +117 -0
  174. package/dist/references/links.js.map +1 -0
  175. package/dist/references/walk.d.ts +70 -0
  176. package/dist/references/walk.d.ts.map +1 -1
  177. package/dist/references/walk.js +88 -41
  178. package/dist/references/walk.js.map +1 -1
  179. package/dist/utils/field-path.d.ts +56 -0
  180. package/dist/utils/field-path.d.ts.map +1 -0
  181. package/dist/utils/field-path.js +146 -0
  182. package/dist/utils/field-path.js.map +1 -0
  183. package/package.json +6 -5
@@ -0,0 +1,293 @@
1
+ import { blockRegistry } from '../../../references/find.js';
2
+ import { linkTargetsIn } from '../../../references/links.js';
3
+ import { resolveCollection } from '../../options.js';
4
+ /*
5
+ Refuses a publish whose links go to pages readers cannot see (forumone-2026#756).
6
+
7
+ An internal link stores a relationship and the renderer resolves it when the
8
+ page is read. If the target is a draft, in the trash or deleted, the link
9
+ renders as nothing or as a 404, and nothing told the editor who published the
10
+ page. Moving a page to the trash is routine since the content trash, so this got
11
+ likelier rather than rarer.
12
+
13
+ ## Its own step, not an accessibility check
14
+
15
+ The accessibility checks are pure functions of the document. This one has to
16
+ ask the database about other documents, so it is a step with `ctx.payload`, and
17
+ it runs after the pure content checks and before the policy steps.
18
+
19
+ ## What it reads
20
+
21
+ - **The document again, at `depth: 0`.** The pipeline's copy was read at
22
+ Payload's default depth, and population replaces a trashed target with
23
+ `null`: the very link this is looking for would have lost its id.
24
+ - **Each linked collection once**, `where: { id: { in } }`, with `trash: true`
25
+ so a trashed target comes back with its `deletedAt` rather than looking
26
+ deleted, and `draft: false` so `_status` is the live row's.
27
+ - **The latest draft of unpublished targets**, only in collections that can
28
+ carry a schedule, because a schedule lives on the latest version.
29
+
30
+ All with `overrideAccess: true`: the question is what a reader will get, not
31
+ what the person publishing may read.
32
+
33
+ ## The verdicts
34
+
35
+ - not found: deleted, an error;
36
+ - `deletedAt` set: in the trash, an error;
37
+ - drafts enabled and not published: an error, unless the target is publishable
38
+ and has a scheduled publish time, which is a warning. A page scheduled to go
39
+ live with the page it links to is legitimate;
40
+ - anything else, including a collection without drafts: published.
41
+
42
+ A link back to the document being published is skipped: publishing it is what
43
+ makes it live.
44
+ */
45
+ const CODE = 'link-targets';
46
+ function keyOf(relationTo, id) {
47
+ return `${relationTo}\u0000${String(id)}`;
48
+ }
49
+ function configOf(payload, slug) {
50
+ const collections = payload
51
+ .collections;
52
+ return collections?.[slug]?.config;
53
+ }
54
+ /** A label that may be a string, a record of translations, or a function. */
55
+ function textOf(label) {
56
+ if (typeof label === 'string' && label.trim() !== '')
57
+ return label;
58
+ if (label && typeof label === 'object') {
59
+ const record = label;
60
+ const preferred = record['en'] ?? Object.values(record).find((v) => typeof v === 'string');
61
+ if (typeof preferred === 'string' && preferred.trim() !== '')
62
+ return preferred;
63
+ }
64
+ return undefined;
65
+ }
66
+ /** `CardGrid` → `Card Grid`, `heroImage` → `Hero image`, for a config with no label. */
67
+ function humanize(name) {
68
+ const words = name
69
+ .replace(/([a-z0-9])([A-Z])/g, '$1 $2')
70
+ .replace(/[_-]+/g, ' ')
71
+ .trim();
72
+ return words.charAt(0).toUpperCase() + words.slice(1);
73
+ }
74
+ function article(noun) {
75
+ return /^[aeiou]/i.test(noun) ? 'an' : 'a';
76
+ }
77
+ function singularOf(config, slug) {
78
+ const labels = config?.labels;
79
+ return textOf(labels?.singular) ?? humanize(slug);
80
+ }
81
+ function blockLabel(block) {
82
+ const labels = block.labels;
83
+ return textOf(labels?.singular) ?? humanize(block.slug);
84
+ }
85
+ /** Where the link is, in the editor's terms: "block 3 (Card Grid)", "the Body field". */
86
+ function placeOf(link) {
87
+ const { block, top } = link.at;
88
+ if (block)
89
+ return `block ${block.index + 1} (${blockLabel(block.block)})`;
90
+ if (top)
91
+ return `the ${textOf(top.label) ?? humanize(top.name)} field`;
92
+ return 'this page';
93
+ }
94
+ /**
95
+ * The same place as an issue's `where`, which the admin prints before the
96
+ * message: "Block 3 (Card Grid)", "Body". `undefined` when there is no place
97
+ * more particular than the page.
98
+ */
99
+ function whereOf(link) {
100
+ const { block, top } = link.at;
101
+ if (block)
102
+ return `Block ${block.index + 1} (${blockLabel(block.block)})`;
103
+ if (top)
104
+ return textOf(top.label) ?? humanize(top.name);
105
+ return undefined;
106
+ }
107
+ function quoted(title) {
108
+ return title ? `"${title}"` : undefined;
109
+ }
110
+ /**
111
+ * An issue's message, which goes out beside its `where` and so starts "This
112
+ * link"; a warning is a line on its own, and says where the link is itself.
113
+ */
114
+ function messageFor(link, verdict, singular, placed) {
115
+ const where = placed ? 'This link' : `A link in ${placeOf(link)}`;
116
+ switch (verdict.kind) {
117
+ case 'deleted':
118
+ return `${where} goes to ${article(singular)} ${singular} that has been deleted. Change the link.`;
119
+ case 'trash': {
120
+ const name = quoted(verdict.title) ?? `${article(singular)} ${singular}`;
121
+ return `${where} goes to ${name}, which is in the trash. Restore it, or change the link.`;
122
+ }
123
+ case 'draft': {
124
+ const name = quoted(verdict.title);
125
+ return name
126
+ ? `${where} goes to ${name}, which is a draft, so readers would get a page that doesn't exist. Publish ${name} first, or change the link.`
127
+ : `${where} goes to ${article(singular)} ${singular} that is a draft, so readers would get a page that doesn't exist. Publish it first, or change the link.`;
128
+ }
129
+ case 'scheduled': {
130
+ const name = quoted(verdict.title) ?? `${article(singular)} ${singular}`;
131
+ return `${where} goes to ${name}, which isn't published yet but is scheduled to be. Until it goes live, readers who follow the link will get a page that doesn't exist.`;
132
+ }
133
+ case 'published':
134
+ return '';
135
+ }
136
+ }
137
+ function hasDrafts(config) {
138
+ const { versions } = config;
139
+ return Boolean(versions && typeof versions === 'object' && versions.drafts);
140
+ }
141
+ function titleOf(doc, field) {
142
+ const value = doc?.[field];
143
+ return typeof value === 'string' && value.trim() !== '' ? value : undefined;
144
+ }
145
+ /** One collection's targets, classified. One query, plus one for unpublished targets that may be scheduled. */
146
+ async function classify(ctx, slug, config, ids) {
147
+ const drafts = hasDrafts(config);
148
+ const titleField = config.admin?.useAsTitle ?? 'id';
149
+ const select = { [titleField]: true };
150
+ if (drafts)
151
+ select['_status'] = true;
152
+ if (config.trash)
153
+ select['deletedAt'] = true;
154
+ const found = await ctx.payload.find({
155
+ collection: slug,
156
+ where: { id: { in: ids } },
157
+ draft: false,
158
+ ...(config.trash ? { trash: true } : {}),
159
+ depth: 0,
160
+ overrideAccess: true,
161
+ limit: ids.length,
162
+ pagination: false,
163
+ select,
164
+ });
165
+ const rows = new Map();
166
+ for (const doc of found.docs)
167
+ rows.set(String(doc['id']), doc);
168
+ const verdicts = new Map();
169
+ const unpublished = [];
170
+ for (const id of ids) {
171
+ const row = rows.get(String(id));
172
+ if (!row)
173
+ verdicts.set(String(id), { kind: 'deleted' });
174
+ else if (row['deletedAt'])
175
+ verdicts.set(String(id), { kind: 'trash', title: titleOf(row, titleField) });
176
+ else if (drafts && row['_status'] !== 'published')
177
+ unpublished.push(id);
178
+ else
179
+ verdicts.set(String(id), { kind: 'published' });
180
+ }
181
+ const publishable = ctx.options.collections.some((c) => c.slug === slug);
182
+ const scheduledField = publishable
183
+ ? resolveCollection(ctx.options, slug).scheduledPublishField
184
+ : undefined;
185
+ let latest = new Map();
186
+ if (unpublished.length > 0) {
187
+ const drafted = await ctx.payload.find({
188
+ collection: slug,
189
+ where: { id: { in: unpublished } },
190
+ draft: true,
191
+ depth: 0,
192
+ overrideAccess: true,
193
+ limit: unpublished.length,
194
+ pagination: false,
195
+ select: { [titleField]: true, ...(scheduledField ? { [scheduledField]: true } : {}) },
196
+ });
197
+ latest = new Map(drafted.docs.map((d) => [String(d['id']), d]));
198
+ }
199
+ for (const id of unpublished) {
200
+ const draft = latest.get(String(id));
201
+ const title = titleOf(draft, titleField) ?? titleOf(rows.get(String(id)), titleField);
202
+ const scheduled = scheduledField ? draft?.[scheduledField] : undefined;
203
+ verdicts.set(String(id), scheduled !== undefined && scheduled !== null && scheduled !== ''
204
+ ? { kind: 'scheduled', title }
205
+ : { kind: 'draft', title });
206
+ }
207
+ return verdicts;
208
+ }
209
+ /** The document as stored, ids unpopulated; the pipeline's copy when it cannot be read. */
210
+ async function storedDocument(ctx) {
211
+ const stored = await ctx.payload.findByID({
212
+ collection: ctx.collection.slug,
213
+ id: ctx.documentId,
214
+ draft: true,
215
+ depth: 0,
216
+ overrideAccess: true,
217
+ disableErrors: true,
218
+ });
219
+ return stored ?? ctx.document;
220
+ }
221
+ export const linkTargetsStep = async (ctx) => {
222
+ if (ctx.options.linkTargets?.enabled === false)
223
+ return { pass: true };
224
+ const own = configOf(ctx.payload, ctx.collection.slug);
225
+ if (!own)
226
+ return { pass: true };
227
+ let links;
228
+ const verdicts = new Map();
229
+ try {
230
+ const data = await storedDocument(ctx);
231
+ links = linkTargetsIn(own.fields, data, {
232
+ blocks: blockRegistry(ctx.payload),
233
+ }).filter((link) => !(link.relationTo === ctx.collection.slug && String(link.id) === ctx.documentId));
234
+ if (links.length === 0)
235
+ return { pass: true };
236
+ const byCollection = new Map();
237
+ for (const link of links) {
238
+ const ids = byCollection.get(link.relationTo) ?? new Map();
239
+ ids.set(String(link.id), link.id);
240
+ byCollection.set(link.relationTo, ids);
241
+ }
242
+ for (const [slug, ids] of byCollection) {
243
+ const config = configOf(ctx.payload, slug);
244
+ // A collection the config no longer has: nothing to ask, and nothing a reader can reach either way.
245
+ if (!config)
246
+ continue;
247
+ for (const [id, verdict] of await classify(ctx, slug, config, [...ids.values()])) {
248
+ verdicts.set(keyOf(slug, id), verdict);
249
+ }
250
+ }
251
+ }
252
+ catch (error) {
253
+ ctx.payload.logger?.error?.({ err: error }, '[publishing] link-targets: could not read link targets');
254
+ return {
255
+ pass: false,
256
+ code: CODE,
257
+ reason: "Couldn't check where this page's links go, so it hasn't been published. Try again, and if it keeps happening, tell a site administrator.",
258
+ };
259
+ }
260
+ const errors = [];
261
+ const warnings = [];
262
+ for (const link of links) {
263
+ const verdict = verdicts.get(keyOf(link.relationTo, link.id));
264
+ if (!verdict || verdict.kind === 'published')
265
+ continue;
266
+ const singular = singularOf(configOf(ctx.payload, link.relationTo), link.relationTo);
267
+ if (verdict.kind === 'scheduled') {
268
+ warnings.push(messageFor(link, verdict, singular, false));
269
+ continue;
270
+ }
271
+ const where = whereOf(link);
272
+ errors.push({
273
+ field: link.at.dataPath,
274
+ message: messageFor(link, verdict, singular, where !== undefined),
275
+ severity: 'error',
276
+ rule: verdict.kind,
277
+ ...(where ? { where } : {}),
278
+ });
279
+ }
280
+ const carried = warnings.length ? { warnings } : {};
281
+ if (errors.length === 0)
282
+ return { pass: true, ...carried };
283
+ return {
284
+ ...carried,
285
+ pass: false,
286
+ code: CODE,
287
+ reason: errors.length === 1
288
+ ? "1 link goes to a page readers can't see."
289
+ : `${errors.length} links go to pages readers can't see.`,
290
+ issues: errors,
291
+ };
292
+ };
293
+ //# sourceMappingURL=link-targets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link-targets.js","sourceRoot":"","sources":["../../../../src/publishing/pipeline/steps/link-targets.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAmB,MAAM,8BAA8B,CAAA;AAC7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAGpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwCE;AAEF,MAAM,IAAI,GAAG,cAAc,CAAA;AAS3B,SAAS,KAAK,CAAC,UAAkB,EAAE,EAAmB;IACpD,OAAO,GAAG,UAAU,SAAS,MAAM,CAAC,EAAE,CAAC,EAAE,CAAA;AAC3C,CAAC;AAED,SAAS,QAAQ,CAAC,OAAgB,EAAE,IAAY;IAC9C,MAAM,WAAW,GAAI,OAA2E;SAC7F,WAAW,CAAA;IACd,OAAO,WAAW,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;AACpC,CAAC;AAED,6EAA6E;AAC7E,SAAS,MAAM,CAAC,KAAc;IAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,KAAK,CAAA;IAClE,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,KAAgC,CAAA;QAC/C,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAA;QAC1F,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO,SAAS,CAAA;IAChF,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,wFAAwF;AACxF,SAAS,QAAQ,CAAC,IAAY;IAC5B,MAAM,KAAK,GAAG,IAAI;SACf,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC;SACtC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,IAAI,EAAE,CAAA;IACT,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AACvD,CAAC;AAED,SAAS,OAAO,CAAC,IAAY;IAC3B,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAA;AAC5C,CAAC;AAED,SAAS,UAAU,CAAC,MAAoC,EAAE,IAAY;IACpE,MAAM,MAAM,GAAG,MAAM,EAAE,MAA4C,CAAA;IACnE,OAAO,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAA;AACnD,CAAC;AAED,SAAS,UAAU,CAAC,KAAY;IAC9B,MAAM,MAAM,GAAG,KAAK,CAAC,MAA4C,CAAA;IACjE,OAAO,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;AACzD,CAAC;AAED,yFAAyF;AACzF,SAAS,OAAO,CAAC,IAAgB;IAC/B,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,CAAA;IAC9B,IAAI,KAAK;QAAE,OAAO,SAAS,KAAK,CAAC,KAAK,GAAG,CAAC,KAAK,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAA;IACzE,IAAI,GAAG;QAAE,OAAO,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAA;IACtE,OAAO,WAAW,CAAA;AACpB,CAAC;AAED;;;;GAIG;AACH,SAAS,OAAO,CAAC,IAAgB;IAC/B,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,CAAA;IAC9B,IAAI,KAAK;QAAE,OAAO,SAAS,KAAK,CAAC,KAAK,GAAG,CAAC,KAAK,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAA;IACzE,IAAI,GAAG;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACvD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,SAAS,MAAM,CAAC,KAAyB;IACvC,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,SAAS,CAAA;AACzC,CAAC;AAED;;;GAGG;AACH,SAAS,UAAU,CACjB,IAAgB,EAChB,OAAgB,EAChB,QAAgB,EAChB,MAAe;IAEf,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,OAAO,CAAC,IAAI,CAAC,EAAE,CAAA;IACjE,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,SAAS;YACZ,OAAO,GAAG,KAAK,YAAY,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,0CAA0C,CAAA;QACpG,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,EAAE,CAAA;YACxE,OAAO,GAAG,KAAK,YAAY,IAAI,0DAA0D,CAAA;QAC3F,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;YAClC,OAAO,IAAI;gBACT,CAAC,CAAC,GAAG,KAAK,YAAY,IAAI,+EAA+E,IAAI,6BAA6B;gBAC1I,CAAC,CAAC,GAAG,KAAK,YAAY,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,yGAAyG,CAAA;QAChK,CAAC;QACD,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,EAAE,CAAA;YACxE,OAAO,GAAG,KAAK,YAAY,IAAI,yIAAyI,CAAA;QAC1K,CAAC;QACD,KAAK,WAAW;YACd,OAAO,EAAE,CAAA;IACb,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,MAAwB;IACzC,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAA;IAC3B,OAAO,OAAO,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAA;AAC7E,CAAC;AAED,SAAS,OAAO,CAAC,GAAwC,EAAE,KAAa;IACtE,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,CAAA;IAC1B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;AAC7E,CAAC;AAED,+GAA+G;AAC/G,KAAK,UAAU,QAAQ,CACrB,GAAoB,EACpB,IAAY,EACZ,MAAwB,EACxB,GAAwB;IAExB,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAA;IAChC,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,EAAE,UAAU,IAAI,IAAI,CAAA;IACnD,MAAM,MAAM,GAAyB,EAAE,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,CAAA;IAC3D,IAAI,MAAM;QAAE,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI,CAAA;IACpC,IAAI,MAAM,CAAC,KAAK;QAAE,MAAM,CAAC,WAAW,CAAC,GAAG,IAAI,CAAA;IAE5C,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;QACnC,UAAU,EAAE,IAAI;QAChB,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE;QAC1B,KAAK,EAAE,KAAK;QACZ,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxC,KAAK,EAAE,CAAC;QACR,cAAc,EAAE,IAAI;QACpB,KAAK,EAAE,GAAG,CAAC,MAAM;QACjB,UAAU,EAAE,KAAK;QACjB,MAAM;KACP,CAAC,CAAA;IACF,MAAM,IAAI,GAAG,IAAI,GAAG,EAAmC,CAAA;IACvD,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAiC;QAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAE3F,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAmB,CAAA;IAC3C,MAAM,WAAW,GAAwB,EAAE,CAAA;IAC3C,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;QAChC,IAAI,CAAC,GAAG;YAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;aAClD,IAAI,GAAG,CAAC,WAAW,CAAC;YACvB,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,CAAC,CAAA;aACzE,IAAI,MAAM,IAAI,GAAG,CAAC,SAAS,CAAC,KAAK,WAAW;YAAE,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;;YAClE,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAA;IACtD,CAAC;IAED,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;IACxE,MAAM,cAAc,GAAG,WAAW;QAChC,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,qBAAqB;QAC5D,CAAC,CAAC,SAAS,CAAA;IACb,IAAI,MAAM,GAAG,IAAI,GAAG,EAAmC,CAAA;IACvD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;YACrC,UAAU,EAAE,IAAI;YAChB,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE;YAClC,KAAK,EAAE,IAAI;YACX,KAAK,EAAE,CAAC;YACR,cAAc,EAAE,IAAI;YACpB,KAAK,EAAE,WAAW,CAAC,MAAM;YACzB,UAAU,EAAE,KAAK;YACjB,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;SACtF,CAAC,CAAA;QACF,MAAM,GAAG,IAAI,GAAG,CAAE,OAAO,CAAC,IAAkC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IAChG,CAAC;IACD,KAAK,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;QACpC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,CAAA;QACrF,MAAM,SAAS,GAAG,cAAc,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QACtE,QAAQ,CAAC,GAAG,CACV,MAAM,CAAC,EAAE,CAAC,EACV,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,EAAE;YAC/D,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE;YAC9B,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAC7B,CAAA;IACH,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,2FAA2F;AAC3F,KAAK,UAAU,cAAc,CAAC,GAAoB;IAChD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC;QACxC,UAAU,EAAE,GAAG,CAAC,UAAU,CAAC,IAAI;QAC/B,EAAE,EAAE,GAAG,CAAC,UAAU;QAClB,KAAK,EAAE,IAAI;QACX,KAAK,EAAE,CAAC;QACR,cAAc,EAAE,IAAI;QACpB,aAAa,EAAE,IAAI;KACpB,CAAC,CAAA;IACF,OAAQ,MAAyC,IAAI,GAAG,CAAC,QAAQ,CAAA;AACnE,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAiB,KAAK,EAAE,GAAG,EAAE,EAAE;IACzD,IAAI,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,KAAK,KAAK;QAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;IAErE,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;IACtD,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;IAE/B,IAAI,KAAmB,CAAA;IACvB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAmB,CAAA;IAC3C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAA;QACtC,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,MAAiB,EAAE,IAAI,EAAE;YACjD,MAAM,EAAE,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC;SACnC,CAAC,CAAC,MAAM,CACP,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,KAAK,GAAG,CAAC,UAAU,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,UAAU,CAAC,CAC3F,CAAA;QACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;QAE7C,MAAM,YAAY,GAAG,IAAI,GAAG,EAAwC,CAAA;QACpE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,GAAG,EAA2B,CAAA;YACnF,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAA;YACjC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,CAAA;QACxC,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,YAAY,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;YAC1C,oGAAoG;YACpG,IAAI,CAAC,MAAM;gBAAE,SAAQ;YACrB,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,MAAM,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC;gBACjF,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,CAAA;YACxC,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,CACzB,EAAE,GAAG,EAAE,KAAK,EAAE,EACd,wDAAwD,CACzD,CAAA;QACD,OAAO;YACL,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,IAAI;YACV,MAAM,EACJ,0IAA0I;SAC7I,CAAA;IACH,CAAC;IAED,MAAM,MAAM,GAAoB,EAAE,CAAA;IAClC,MAAM,QAAQ,GAAa,EAAE,CAAA;IAC7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;QAC7D,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW;YAAE,SAAQ;QACtD,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAA;QACpF,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACjC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAA;YACzD,SAAQ;QACV,CAAC;QACD,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;QAC3B,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,QAAQ;YACvB,OAAO,EAAE,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,KAAK,SAAS,CAAC;YACjE,QAAQ,EAAE,OAAO;YACjB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5B,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IACnD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAA;IAE1D,OAAO;QACL,GAAG,OAAO;QACV,IAAI,EAAE,KAAK;QACX,IAAI,EAAE,IAAI;QACV,MAAM,EACJ,MAAM,CAAC,MAAM,KAAK,CAAC;YACjB,CAAC,CAAC,0CAA0C;YAC5C,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,uCAAuC;QAC7D,MAAM,EAAE,MAAM;KACf,CAAA;AACH,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"required-fields.d.ts","sourceRoot":"","sources":["../../../../src/publishing/pipeline/steps/required-fields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,YAAY,EAAE,MAAM,aAAa,CAAA;AAE9D;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,EAAE,YAiDhC,CAAA"}
1
+ {"version":3,"file":"required-fields.d.ts","sourceRoot":"","sources":["../../../../src/publishing/pipeline/steps/required-fields.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAiB,YAAY,EAAE,MAAM,aAAa,CAAA;AAE9D;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,EAAE,YAkDhC,CAAA"}
@@ -1,3 +1,4 @@
1
+ import { plural } from '../../messages.js';
1
2
  /**
2
3
  * Verifies SEO title/description, slug, and any per-collection required
3
4
  * fields are populated. SEO requirements are non-negotiable: a published
@@ -10,21 +11,21 @@ export const requiredFieldsStep = async (ctx) => {
10
11
  if (!nonEmptyString(seo?.['title'])) {
11
12
  issues.push({
12
13
  field: `${ctx.collection.seoField}.title`,
13
- message: 'SEO title is required',
14
+ message: "Add an SEO title. It's the title shown in search results and on the browser tab.",
14
15
  severity: 'error',
15
16
  });
16
17
  }
17
18
  if (!nonEmptyString(seo?.['description'])) {
18
19
  issues.push({
19
20
  field: `${ctx.collection.seoField}.description`,
20
- message: 'SEO description is required',
21
+ message: 'Add an SEO description. Search engines show it under the title.',
21
22
  severity: 'error',
22
23
  });
23
24
  }
24
25
  if (!nonEmptyString(ctx.document[ctx.collection.slugField])) {
25
26
  issues.push({
26
27
  field: ctx.collection.slugField,
27
- message: 'Slug is required',
28
+ message: "Add a slug, the last part of this page's web address.",
28
29
  severity: 'error',
29
30
  });
30
31
  }
@@ -42,9 +43,10 @@ export const requiredFieldsStep = async (ctx) => {
42
43
  return {
43
44
  pass: false,
44
45
  code: 'required-fields-missing',
45
- reason: `${issues.length} required field${issues.length === 1 ? '' : 's'} missing`,
46
+ reason: `${plural(issues.length, 'required field')} ${issues.length === 1 ? 'is' : 'are'} empty.`,
47
+ // No suggestion: each issue says what to add, and the admin marks the
48
+ // fields themselves and says so.
46
49
  issues,
47
- suggestion: 'Fill in the missing fields and try again.',
48
50
  };
49
51
  }
50
52
  return { pass: true };
@@ -1 +1 @@
1
- {"version":3,"file":"required-fields.js","sourceRoot":"","sources":["../../../../src/publishing/pipeline/steps/required-fields.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAiB,KAAK,EAAE,GAAG,EAAE,EAAE;IAC5D,MAAM,MAAM,GAAoB,EAAE,CAAA;IAClC,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAwC,CAAA;IAExF,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,GAAG,GAAG,CAAC,UAAU,CAAC,QAAQ,QAAQ;YACzC,OAAO,EAAE,uBAAuB;YAChC,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAA;IACJ,CAAC;IACD,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,GAAG,GAAG,CAAC,UAAU,CAAC,QAAQ,cAAc;YAC/C,OAAO,EAAE,6BAA6B;YACtC,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;QAC5D,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,GAAG,CAAC,UAAU,CAAC,SAAS;YAC/B,OAAO,EAAE,kBAAkB;YAC3B,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,MAAM,QAAQ,IAAI,GAAG,CAAC,UAAU,CAAC,cAAc,IAAI,EAAE,EAAE,CAAC;QAC3D,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAA;QAClD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YAC1D,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,QAAQ,CAAC,IAAI;gBACpB,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,QAAQ,EAAE,OAAO;aAClB,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO;YACL,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,yBAAyB;YAC/B,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,kBAAkB,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,UAAU;YAClF,MAAM;YACN,UAAU,EAAE,2CAA2C;SACxD,CAAA;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;AACvB,CAAC,CAAA;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAA;AACzD,CAAC;AAED,SAAS,OAAO,CAAC,GAA4B,EAAE,IAAY;IACzD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAU,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE;QACtD,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YACnC,OAAQ,GAA+B,CAAC,OAAO,CAAC,CAAA;QAClD,CAAC;QACD,OAAO,SAAS,CAAA;IAClB,CAAC,EAAE,GAAG,CAAC,CAAA;AACT,CAAC"}
1
+ {"version":3,"file":"required-fields.js","sourceRoot":"","sources":["../../../../src/publishing/pipeline/steps/required-fields.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAG1C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAiB,KAAK,EAAE,GAAG,EAAE,EAAE;IAC5D,MAAM,MAAM,GAAoB,EAAE,CAAA;IAClC,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAwC,CAAA;IAExF,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,GAAG,GAAG,CAAC,UAAU,CAAC,QAAQ,QAAQ;YACzC,OAAO,EAAE,kFAAkF;YAC3F,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAA;IACJ,CAAC;IACD,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,GAAG,GAAG,CAAC,UAAU,CAAC,QAAQ,cAAc;YAC/C,OAAO,EAAE,iEAAiE;YAC1E,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;QAC5D,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,GAAG,CAAC,UAAU,CAAC,SAAS;YAC/B,OAAO,EAAE,uDAAuD;YAChE,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,MAAM,QAAQ,IAAI,GAAG,CAAC,UAAU,CAAC,cAAc,IAAI,EAAE,EAAE,CAAC;QAC3D,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAA;QAClD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YAC1D,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,QAAQ,CAAC,IAAI;gBACpB,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,QAAQ,EAAE,OAAO;aAClB,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO;YACL,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,yBAAyB;YAC/B,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS;YACjG,sEAAsE;YACtE,iCAAiC;YACjC,MAAM;SACP,CAAA;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;AACvB,CAAC,CAAA;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAA;AACzD,CAAC;AAED,SAAS,OAAO,CAAC,GAA4B,EAAE,IAAY;IACzD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAU,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE;QACtD,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YACnC,OAAQ,GAA+B,CAAC,OAAO,CAAC,CAAA;QAClD,CAAC;QACD,OAAO,SAAS,CAAA;IAClB,CAAC,EAAE,GAAG,CAAC,CAAA;AACT,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import type { Inngest } from 'inngest';
2
2
  import type { Payload, TypedUser } from 'payload';
3
3
  import type { AuthenticatedUser } from '../../plugin-contract/mcp.js';
4
+ import type { MessageDate } from '../messages.js';
4
5
  import type { AccessibilityIssue, PublishingPluginOptions, ResolvedCollection } from '../options.js';
5
6
  export interface PipelineActor {
6
7
  user: AuthenticatedUser | null;
@@ -44,13 +45,35 @@ export interface PipelineContext {
44
45
  }
45
46
  export type PipelineIssue = AccessibilityIssue & {
46
47
  rule?: string;
48
+ /**
49
+ * Where `field` is, as the editor sees it: `Block 3 (Image Hero) › Image`.
50
+ * Filled in by the pipeline from the collection's own labels, so a check
51
+ * reports a path and never has to know them. Absent when the path cannot be
52
+ * followed, in which case nothing better than the message itself is known.
53
+ * forumone-2026#805.
54
+ */
55
+ where?: string;
47
56
  };
57
+ /**
58
+ * The date a block is about — an embargo's end, an expiry — as written into
59
+ * its `reason`. See `MessageDate` in `../messages.ts`.
60
+ */
61
+ export type PipelineDate = MessageDate;
48
62
  export interface PipelineStepResult {
49
63
  pass: boolean;
50
64
  reason?: string;
51
65
  code?: string;
52
66
  issues?: PipelineIssue[];
53
67
  suggestion?: string;
68
+ /** The date in `reason`, so the admin can say it in the editor's own zone. */
69
+ when?: PipelineDate;
70
+ /**
71
+ * What a developer needs to fix a block no editor can: a plugin missing, a
72
+ * resolver not wired. Logged by the pipeline, kept in the result for an MCP
73
+ * caller, and never shown in the admin, whose `reason` says to tell a site
74
+ * administrator instead.
75
+ */
76
+ detail?: string;
54
77
  /**
55
78
  * Non-fatal problems. The step did what it was asked to; something
56
79
  * adjacent to it did not. Warnings never fail a step.
@@ -65,6 +88,8 @@ export interface PipelineResult {
65
88
  code?: string;
66
89
  issues?: PipelineIssue[];
67
90
  suggestion?: string;
91
+ when?: PipelineDate;
92
+ detail?: string;
68
93
  publishedAt?: string;
69
94
  /** Non-fatal problems collected across the steps that ran. */
70
95
  warnings?: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/publishing/pipeline/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AACjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AACrE,OAAO,KAAK,EACV,kBAAkB,EAClB,uBAAuB,EACvB,kBAAkB,EACnB,MAAM,eAAe,CAAA;AAEtB,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,iBAAiB,GAAG,IAAI,CAAA;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC9B;;;;;;;;;;;;;;;;;;OAkBG;IACH,eAAe,CAAC,EAAE,SAAS,GAAG,SAAS,CAAA;CACxC;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC/B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC9B,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACpC;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,uBAAuB,CAAA;IAChC,UAAU,EAAE,kBAAkB,CAAA;IAC9B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,aAAa,CAAA;IACpB,IAAI,CAAC,EAAE,YAAY,GAAG,SAAS,CAAA;CAChC;AAED,MAAM,MAAM,aAAa,GAAG,kBAAkB,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAElE,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,OAAO,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,aAAa,EAAE,CAAA;IACxB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CACpB;AAED,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,eAAe,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAA;AAEpF,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,aAAa,EAAE,CAAA;IACxB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CACpB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/publishing/pipeline/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AACjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AACrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,KAAK,EACV,kBAAkB,EAClB,uBAAuB,EACvB,kBAAkB,EACnB,MAAM,eAAe,CAAA;AAEtB,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,iBAAiB,GAAG,IAAI,CAAA;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC9B;;;;;;;;;;;;;;;;;;OAkBG;IACH,eAAe,CAAC,EAAE,SAAS,GAAG,SAAS,CAAA;CACxC;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC/B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC9B,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACpC;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,uBAAuB,CAAA;IAChC,UAAU,EAAE,kBAAkB,CAAA;IAC9B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,aAAa,CAAA;IACpB,IAAI,CAAC,EAAE,YAAY,GAAG,SAAS,CAAA;CAChC;AAED,MAAM,MAAM,aAAa,GAAG,kBAAkB,GAAG;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAA;IACb;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,WAAW,CAAA;AAEtC,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,OAAO,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,aAAa,EAAE,CAAA;IACxB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,8EAA8E;IAC9E,IAAI,CAAC,EAAE,YAAY,CAAA;IACnB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CACpB;AAED,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,eAAe,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAA;AAEpF,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,aAAa,EAAE,CAAA;IACxB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,IAAI,CAAC,EAAE,YAAY,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CACpB"}
@@ -0,0 +1,13 @@
1
+ import { type FieldConfig } from '../../utils/field-path.js';
2
+ import type { PipelineContext, PipelineIssue } from './types.js';
3
+ export { describeFieldPath, type FieldConfig } from '../../utils/field-path.js';
4
+ /** The config for `ctx.collection`, or `undefined` when Payload has none to give. */
5
+ export declare function fieldConfigFor(ctx: Pick<PipelineContext, 'payload' | 'collection'>): FieldConfig | undefined;
6
+ /**
7
+ * The label a block of `type` has in the collection's layout field, or the
8
+ * component's display name when the config does not say.
9
+ */
10
+ export declare function blockLabel(config: FieldConfig | undefined, type: string): string;
11
+ /** Fills in `where` on every issue whose path can be described. */
12
+ export declare function withWhere(issues: PipelineIssue[], config: FieldConfig | undefined, document: Record<string, unknown>): PipelineIssue[];
13
+ //# sourceMappingURL=where.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"where.d.ts","sourceRoot":"","sources":["../../../src/publishing/pipeline/where.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,WAAW,EAMjB,MAAM,2BAA2B,CAAA;AAClC,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAWhE,OAAO,EAAE,iBAAiB,EAAE,KAAK,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAE/E,qFAAqF;AACrF,wBAAgB,cAAc,CAC5B,GAAG,EAAE,IAAI,CAAC,eAAe,EAAE,SAAS,GAAG,YAAY,CAAC,GACnD,WAAW,GAAG,SAAS,CAYzB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAKhF;AAED,mEAAmE;AACnE,wBAAgB,SAAS,CACvB,MAAM,EAAE,aAAa,EAAE,EACvB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,aAAa,EAAE,CAOjB"}
@@ -0,0 +1,44 @@
1
+ import { componentDisplayName } from '@forumone/throughline-design-system/contract';
2
+ import { describeFieldPath, findBlock, findField, labelText, } from '../../utils/field-path.js';
3
+ /*
4
+ Where an issue is, in the editor's words. forumone-2026#805.
5
+
6
+ Every issue a step returns gains a `where` — `Block 3 (Image Hero) › Image`,
7
+ `SEO › Title` — from the collection's own field config, by
8
+ `describeFieldPath`. So a site's own checks get it too, report a path, and
9
+ never have to know a label.
10
+ */
11
+ export { describeFieldPath } from '../../utils/field-path.js';
12
+ /** The config for `ctx.collection`, or `undefined` when Payload has none to give. */
13
+ export function fieldConfigFor(ctx) {
14
+ const payload = ctx.payload;
15
+ const fields = payload.collections?.[ctx.collection.slug]?.config?.fields;
16
+ if (!Array.isArray(fields))
17
+ return undefined;
18
+ return {
19
+ fields,
20
+ ...(Array.isArray(payload.config?.blocks) ? { blocks: payload.config.blocks } : {}),
21
+ layoutField: ctx.collection.layoutField,
22
+ };
23
+ }
24
+ /**
25
+ * The label a block of `type` has in the collection's layout field, or the
26
+ * component's display name when the config does not say.
27
+ */
28
+ export function blockLabel(config, type) {
29
+ const layout = config?.layoutField !== undefined ? findField(config.fields, config.layoutField)?.field : undefined;
30
+ const block = layout?.type === 'blocks' && config ? findBlock(layout, type, config) : undefined;
31
+ return labelText(block?.labels?.singular) ?? componentDisplayName(type);
32
+ }
33
+ /** Fills in `where` on every issue whose path can be described. */
34
+ export function withWhere(issues, config, document) {
35
+ if (!config)
36
+ return issues;
37
+ return issues.map((issue) => {
38
+ if (issue.where || !issue.field)
39
+ return issue;
40
+ const where = describeFieldPath(issue.field, config, document);
41
+ return where ? { ...issue, where } : issue;
42
+ });
43
+ }
44
+ //# sourceMappingURL=where.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"where.js","sourceRoot":"","sources":["../../../src/publishing/pipeline/where.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,8CAA8C,CAAA;AACnF,OAAO,EAIL,iBAAiB,EACjB,SAAS,EACT,SAAS,EACT,SAAS,GACV,MAAM,2BAA2B,CAAA;AAGlC;;;;;;;EAOE;AAEF,OAAO,EAAE,iBAAiB,EAAoB,MAAM,2BAA2B,CAAA;AAE/E,qFAAqF;AACrF,MAAM,UAAU,cAAc,CAC5B,GAAoD;IAEpD,MAAM,OAAO,GAAG,GAAG,CAAC,OAGnB,CAAA;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAA;IACzE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAA;IAC5C,OAAO;QACL,MAAM;QACN,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnF,WAAW,EAAE,GAAG,CAAC,UAAU,CAAC,WAAW;KACxC,CAAA;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,MAA+B,EAAE,IAAY;IACtE,MAAM,MAAM,GACV,MAAM,EAAE,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;IACrG,MAAM,KAAK,GAAG,MAAM,EAAE,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAC/F,OAAO,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,oBAAoB,CAAC,IAAI,CAAC,CAAA;AACzE,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,SAAS,CACvB,MAAuB,EACvB,MAA+B,EAC/B,QAAiC;IAEjC,IAAI,CAAC,MAAM;QAAE,OAAO,MAAM,CAAA;IAC1B,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC1B,IAAI,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,KAAK;YAAE,OAAO,KAAK,CAAA;QAC7C,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAA;QAC9D,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAA;IAC5C,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/publishing/plugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAI7D,OAAO,EAAE,KAAK,uBAAuB,EAAsC,MAAM,cAAc,CAAA;AAmB/F,eAAO,MAAM,gBAAgB,EAAE,UAAU,CAAC,uBAAuB,CA8H9D,CAAA"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/publishing/plugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAI7D,OAAO,EAAE,KAAK,uBAAuB,EAAsC,MAAM,cAAc,CAAA;AAmB/F,eAAO,MAAM,gBAAgB,EAAE,UAAU,CAAC,uBAAuB,CAiI9D,CAAA"}
@@ -74,6 +74,9 @@ export const publishingPlugin = (rawOptions) => (incomingConfig) => {
74
74
  options.mcpTools?.declare(PUBLISHING_TOOL_DESCRIPTORS, { serverName: 'publishing' });
75
75
  return {
76
76
  ...incomingConfig,
77
+ ...(adminComponents && options.goToFirstError !== false
78
+ ? { admin: withFirstErrorProvider(incomingConfig.admin) }
79
+ : {}),
77
80
  collections: modifiedCollections,
78
81
  endpoints: [
79
82
  ...(incomingConfig.endpoints ?? []),
@@ -123,6 +126,25 @@ export const publishingPlugin = (rawOptions) => (incomingConfig) => {
123
126
  },
124
127
  };
125
128
  };
129
+ /**
130
+ * Adds the provider that takes an editor to the first invalid field after a
131
+ * failed save, publish or schedule (forumone-2026#805). Admin-wide, because a
132
+ * save fails the same way on every collection, publishable or not. Added once,
133
+ * however the config was assembled.
134
+ */
135
+ function withFirstErrorProvider(admin) {
136
+ const providers = admin?.components?.providers ?? [];
137
+ const already = providers.some((p) => typeof p === 'object' && p !== null && 'exportName' in p && p.exportName === 'FirstErrorProvider');
138
+ return {
139
+ ...(admin ?? {}),
140
+ components: {
141
+ ...(admin?.components ?? {}),
142
+ providers: already
143
+ ? providers
144
+ : [...providers, { path: CLIENT_ENTRY, exportName: 'FirstErrorProvider' }],
145
+ },
146
+ };
147
+ }
126
148
  /**
127
149
  * Points the collection's Publish / Unpublish slots at the plugin's own
128
150
  * controls, so a stock admin can publish without any host-side code.
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/publishing/plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/publishing/plugin.ts"],"names":[],"mappings":"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"}