@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
@@ -1 +1 @@
1
- {"version":3,"file":"approval.d.ts","sourceRoot":"","sources":["../../../../src/publishing/pipeline/steps/approval.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAI/C;;;;;;;;;;GAUG;AACH,eAAO,MAAM,YAAY,EAAE,YA+C1B,CAAA"}
1
+ {"version":3,"file":"approval.d.ts","sourceRoot":"","sources":["../../../../src/publishing/pipeline/steps/approval.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAI/C;;;;;;;;;;GAUG;AACH,eAAO,MAAM,YAAY,EAAE,YA+C1B,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import { documentContentHash } from '../../../utils/content-hash.js';
2
+ import { PUBLISHING_UNAVAILABLE } from '../../messages.js';
2
3
  import { APPROVALS_RESOLVER_SYMBOL } from '../../../approvals/symbol.js';
3
4
  /**
4
5
  * Gates publish on a granted approval when the document's policy demands
@@ -20,8 +21,8 @@ export const approvalStep = async (ctx) => {
20
21
  return {
21
22
  pass: false,
22
23
  code: 'approval-resolver-missing',
23
- reason: 'Document requires approval but no approval resolver is configured',
24
- suggestion: 'Register approvalsPlugin in your Payload config (it attaches the resolver automatically) or pass an explicit `approvalResolver` to publishingPlugin.',
24
+ reason: PUBLISHING_UNAVAILABLE,
25
+ detail: 'The document requires approval but no approval resolver is configured. Register approvalsPlugin in your Payload config (it attaches the resolver automatically) or pass an explicit `approvalResolver` to publishingPlugin.',
25
26
  };
26
27
  }
27
28
  /*
@@ -41,8 +42,9 @@ export const approvalStep = async (ctx) => {
41
42
  return {
42
43
  pass: false,
43
44
  code: 'approval-required',
44
- reason: 'This document requires approval and no granted approval exists for the current version',
45
- suggestion: 'Call publish with action "request_approval" to ask for one. Once it is granted, publishing will succeed.',
45
+ reason: 'This needs approval before it can be published.',
46
+ // An MCP caller's `publish` adds how to request one, in its own terms.
47
+ suggestion: 'Ask an approver to review this version. Any edit after approval needs a fresh approval.',
46
48
  };
47
49
  }
48
50
  return { pass: true };
@@ -1 +1 @@
1
- {"version":3,"file":"approval.js","sourceRoot":"","sources":["../../../../src/publishing/pipeline/steps/approval.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAA;AAGpE,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAA;AAGxE;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,YAAY,GAAiB,KAAK,EAAE,GAAG,EAAE,EAAE;IACtD,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,CAEzC,CAAA;IACb,IAAI,CAAC,MAAM,EAAE,CAAC,kBAAkB,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;IAExD,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,IAAI,uBAAuB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IACrF,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;YACL,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,2BAA2B;YACjC,MAAM,EAAE,mEAAmE;YAC3E,UAAU,EACR,sJAAsJ;SACzJ,CAAA;IACH,CAAC;IAED;;;;;;;;;;MAUE;IACF,MAAM,SAAS,GAAG,MAAM,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IACzD,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,iBAAiB,CAC/C,GAAG,CAAC,UAAU,CAAC,IAAI,EACnB,GAAG,CAAC,UAAU,EACd,SAAS,CACV,CAAA;IAED,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;YACL,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,mBAAmB;YACzB,MAAM,EACJ,wFAAwF;YAC1F,UAAU,EACR,0GAA0G;SAC7G,CAAA;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;AACvB,CAAC,CAAA;AAED,SAAS,uBAAuB,CAAC,OAAe;IAC9C,MAAM,KAAK,GAAI,OAAmC,CAAC,yBAAyB,CAAC,CAAA;IAC7E,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,CAAE,KAA0B,CAAC,CAAC,CAAC,SAAS,CAAA;AAC9F,CAAC"}
1
+ {"version":3,"file":"approval.js","sourceRoot":"","sources":["../../../../src/publishing/pipeline/steps/approval.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAA;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAG1D,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAA;AAGxE;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,YAAY,GAAiB,KAAK,EAAE,GAAG,EAAE,EAAE;IACtD,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,CAEzC,CAAA;IACb,IAAI,CAAC,MAAM,EAAE,CAAC,kBAAkB,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;IAExD,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,IAAI,uBAAuB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IACrF,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;YACL,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,2BAA2B;YACjC,MAAM,EAAE,sBAAsB;YAC9B,MAAM,EACJ,6NAA6N;SAChO,CAAA;IACH,CAAC;IAED;;;;;;;;;;MAUE;IACF,MAAM,SAAS,GAAG,MAAM,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IACzD,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,iBAAiB,CAC/C,GAAG,CAAC,UAAU,CAAC,IAAI,EACnB,GAAG,CAAC,UAAU,EACd,SAAS,CACV,CAAA;IAED,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;YACL,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,mBAAmB;YACzB,MAAM,EAAE,iDAAiD;YACzD,uEAAuE;YACvE,UAAU,EACR,yFAAyF;SAC5F,CAAA;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;AACvB,CAAC,CAAA;AAED,SAAS,uBAAuB,CAAC,OAAe;IAC9C,MAAM,KAAK,GAAI,OAAmC,CAAC,yBAAyB,CAAC,CAAA;IAC7E,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,CAAE,KAA0B,CAAC,CAAC,CAAC,SAAS,CAAA;AAC9F,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"composition.d.ts","sourceRoot":"","sources":["../../../../src/publishing/pipeline/steps/composition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8CAA8C,CAAA;AAI5E,OAAO,KAAK,EAAkC,YAAY,EAAE,MAAM,aAAa,CAAA;AAE/E;;;GAGG;AACH,eAAO,MAAM,2BAA2B,eAEvC,CAAA;AAED,sFAAsF;AACtF,eAAO,MAAM,0BAA0B,eAA0D,CAAA;AA4BjG;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,EAAE,YAqF7B,CAAA;AA0GD,6EAA6E;AAC7E,wBAAgB,UAAU,CACxB,SAAS,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,GAAG,SAAS,EACrD,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,MAAM,EAAE,GAAG,SAAS,CAiBtB;AAID,2DAA2D;AAC3D,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAYlD"}
1
+ {"version":3,"file":"composition.d.ts","sourceRoot":"","sources":["../../../../src/publishing/pipeline/steps/composition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8CAA8C,CAAA;AAK5E,OAAO,KAAK,EAAkC,YAAY,EAAE,MAAM,aAAa,CAAA;AAG/E;;;GAGG;AACH,eAAO,MAAM,2BAA2B,eAEvC,CAAA;AAED,sFAAsF;AACtF,eAAO,MAAM,0BAA0B,eAA0D,CAAA;AA8BjG;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,EAAE,YAkG7B,CAAA;AAiHD,6EAA6E;AAC7E,wBAAgB,UAAU,CACxB,SAAS,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,GAAG,SAAS,EACrD,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,MAAM,EAAE,GAAG,SAAS,CAiBtB;AAID,2DAA2D;AAC3D,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAYlD"}
@@ -1,4 +1,6 @@
1
1
  import { lintRecipe } from '@forumone/throughline-design-system/recipes';
2
+ import { PUBLISHING_UNAVAILABLE, TELL_AN_ADMINISTRATOR, plural } from '../../messages.js';
3
+ import { blockLabel, fieldConfigFor } from '../where.js';
2
4
  /**
3
5
  * Symbol the Component Server's plugin (C5) attaches its composition
4
6
  * validator to. Keep in sync with the components package.
@@ -36,23 +38,37 @@ export const compositionStep = async (ctx) => {
36
38
  return {
37
39
  pass: false,
38
40
  code: 'components-server-missing',
39
- reason: 'Composition step requires the components plugin to be registered before publishingPlugin',
40
- suggestion: 'Register `componentsPlugin` in your Payload config before `publishingPlugin`. Both must share the same Payload instance.',
41
+ reason: PUBLISHING_UNAVAILABLE,
42
+ detail: 'The composition step requires the components plugin. Register `componentsPlugin` in your Payload config before `publishingPlugin`; both must share the same Payload instance.',
41
43
  };
42
44
  }
43
- const result = await validator({ blocks });
44
- const errors = result.issues
45
- .filter((issue) => issue.severity === 'error')
46
- .map((issue) => {
45
+ // Each block named as the editor picked it: its label in this collection's
46
+ // layout field, which is where a host's renamed block shows its new name.
47
+ const config = fieldConfigFor(ctx);
48
+ const result = await validator({ blocks, label: (type) => blockLabel(config, type) });
49
+ const toIssue = (issue) => {
47
50
  const out = {
48
- severity: 'error',
51
+ severity: issue.severity,
49
52
  message: issue.message,
50
53
  rule: issue.rule,
51
54
  };
52
55
  if (issue.blockIndex !== undefined)
53
56
  out.field = `${ctx.collection.layoutField}[${issue.blockIndex}]`;
54
57
  return out;
55
- });
58
+ };
59
+ const errors = result.issues
60
+ .filter((issue) => issue.severity === 'error')
61
+ .map(toIssue);
62
+ /*
63
+ A warning does not block, and used to be dropped here — so the one rule that
64
+ only warns, a component missing the sibling its contract expects, reached
65
+ nobody (forumone-2026#805). It now rides on the result's `warnings`, which a
66
+ publish reports beside its success.
67
+ */
68
+ const warnings = result.issues
69
+ .filter((issue) => issue.severity === 'warning')
70
+ .map((issue) => issue.message);
71
+ const carried = warnings.length > 0 ? { warnings } : {};
56
72
  if (gate) {
57
73
  for (const [index, block] of typed.entries()) {
58
74
  if (block.blockType !== gate.blockType)
@@ -71,7 +87,7 @@ export const compositionStep = async (ctx) => {
71
87
  errors.push({
72
88
  severity: 'error',
73
89
  rule: 'empty-block',
74
- message: `The ${block.blockType} block has nothing in it (${empty.join(', ')} are all empty), so it would publish as an empty band. Fill it or remove it.`,
90
+ message: `This ${blockLabel(config, block.blockType)} block is empty, so it would show as a blank band on the page. Fill it in or remove it.`,
75
91
  field: `${ctx.collection.layoutField}[${index}]`,
76
92
  });
77
93
  }
@@ -79,14 +95,15 @@ export const compositionStep = async (ctx) => {
79
95
  }
80
96
  if (errors.length > 0) {
81
97
  return {
98
+ ...carried,
82
99
  pass: false,
83
100
  code: 'composition-errors',
84
- reason: `${errors.length} composition error${errors.length === 1 ? '' : 's'}`,
101
+ reason: `${plural(errors.length, 'problem')} with the blocks to fix before this can be published.`,
85
102
  issues: errors,
86
- suggestion: 'Fix the composition errors. Common causes: duplicate Heroes, forbidden adjacent blocks, unknown component types, or a composed section whose recipe is not approved.',
103
+ suggestion: 'Each problem below names the block.',
87
104
  };
88
105
  }
89
- return { pass: true };
106
+ return { pass: true, ...carried };
90
107
  };
91
108
  /*
92
109
  A composed section may publish only when its recipe would pass review today
@@ -115,7 +132,7 @@ async function checkComposedSection(ctx, gate, block, index) {
115
132
  const reference = block[gate.recipeField ?? 'recipe'];
116
133
  const id = reference && typeof reference === 'object' ? reference.id : reference;
117
134
  if (typeof id !== 'string' && typeof id !== 'number') {
118
- return [issue('recipe-missing', 'This composed section has no recipe.')];
135
+ return [issue('recipe-missing', 'This section has no recipe chosen. Choose one, or remove the block.')];
119
136
  }
120
137
  const recipe = (await ctx.payload.findByID({
121
138
  collection: gate.collection,
@@ -125,13 +142,15 @@ async function checkComposedSection(ctx, gate, block, index) {
125
142
  disableErrors: true,
126
143
  }));
127
144
  if (!recipe) {
128
- return [issue('recipe-missing', `The recipe this composed section uses (${id}) no longer exists.`)];
145
+ return [
146
+ issue('recipe-missing', `The recipe this section was built from no longer exists (${id}). Choose another, or remove the block.`),
147
+ ];
129
148
  }
130
149
  const name = String(recipe['name'] ?? id);
131
150
  const approved = gate.isApproved ? gate.isApproved(recipe) : recipe['status'] === 'approved';
132
151
  if (!approved) {
133
152
  return [
134
- issue('recipe-not-approved', `The composed section uses the recipe "${name}", which has not been approved. Approve it in the admin, then publish.`),
153
+ issue('recipe-not-approved', `This section uses the recipe "${name}", which hasn't been approved. Approve it, or ask someone who can, then publish.`),
135
154
  ];
136
155
  }
137
156
  const issues = [];
@@ -139,7 +158,7 @@ async function checkComposedSection(ctx, gate, block, index) {
139
158
  if (manifest) {
140
159
  const lint = lintRecipe({ contract: recipe['contract'], tree: recipe['tree'] }, await manifest());
141
160
  for (const found of lint.filter((l) => l.severity === 'error')) {
142
- issues.push(issue('recipe-lint', `The recipe "${name}" no longer passes against the design system: ${found.path}: ${found.message}`));
161
+ issues.push(issue('recipe-lint', `The recipe "${name}" no longer matches the design system, so this section can't be published. Choose another recipe, or ${TELL_AN_ADMINISTRATOR}. (${found.path}: ${found.message})`));
143
162
  }
144
163
  }
145
164
  const fields = recipe['contract']
@@ -148,7 +167,7 @@ async function checkComposedSection(ctx, gate, block, index) {
148
167
  for (const f of fields) {
149
168
  const value = content[f.name];
150
169
  if (f.required && (value === undefined || value === null || value === '')) {
151
- issues.push(issue('recipe-content', `"${f.name}" is required by the recipe "${name}" and is empty.`));
170
+ issues.push(issue('recipe-content', `"${f.name}" is empty, and the recipe "${name}" needs it. Fill it in.`));
152
171
  }
153
172
  }
154
173
  return issues;
@@ -1 +1 @@
1
- {"version":3,"file":"composition.js","sourceRoot":"","sources":["../../../../src/publishing/pipeline/steps/composition.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"composition.js","sourceRoot":"","sources":["../../../../src/publishing/pipeline/steps/composition.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,10 @@ import type { PipelineStep } from '../types.js';
7
7
  * Both fields live under the configured `policyField` on the document.
8
8
  * Missing or null values are treated as "no policy applies" — the step
9
9
  * passes.
10
+ *
11
+ * The time is written into `reason` in the site's configured zone
12
+ * (`timeZone`, UTC by default) and named, and returned as `when` too, so the
13
+ * admin can say it in the editor's own zone instead.
10
14
  */
11
15
  export declare const embargoStep: PipelineStep;
12
16
  //# sourceMappingURL=embargo.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"embargo.d.ts","sourceRoot":"","sources":["../../../../src/publishing/pipeline/steps/embargo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE/C;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW,EAAE,YA6BzB,CAAA"}
1
+ {"version":3,"file":"embargo.d.ts","sourceRoot":"","sources":["../../../../src/publishing/pipeline/steps/embargo.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE/C;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,WAAW,EAAE,YAiCzB,CAAA"}
@@ -1,3 +1,4 @@
1
+ import { messageDate } from '../../messages.js';
1
2
  /**
2
3
  * Enforces the document's policy:
3
4
  * - `embargoedUntil`: blocks publish until that time has passed
@@ -6,6 +7,10 @@
6
7
  * Both fields live under the configured `policyField` on the document.
7
8
  * Missing or null values are treated as "no policy applies" — the step
8
9
  * passes.
10
+ *
11
+ * The time is written into `reason` in the site's configured zone
12
+ * (`timeZone`, UTC by default) and named, and returned as `when` too, so the
13
+ * admin can say it in the editor's own zone instead.
9
14
  */
10
15
  export const embargoStep = async (ctx) => {
11
16
  const policy = ctx.document[ctx.collection.policyField];
@@ -14,20 +19,24 @@ export const embargoStep = async (ctx) => {
14
19
  const now = Date.now();
15
20
  const embargoedUntil = parseDate(policy['embargoedUntil']);
16
21
  if (embargoedUntil !== null && embargoedUntil > now) {
22
+ const when = messageDate(embargoedUntil, ctx.options.timeZone);
17
23
  return {
18
24
  pass: false,
19
25
  code: 'embargoed',
20
- reason: `Embargoed until ${new Date(embargoedUntil).toISOString()}`,
21
- suggestion: 'Wait until the embargo expires, update the embargoedUntil date, or schedule publish for after the embargo.',
26
+ reason: `This can't go live until ${when.text}.`,
27
+ suggestion: 'Wait until then, change the embargo date, or schedule it to publish after that time.',
28
+ when,
22
29
  };
23
30
  }
24
31
  const expiresAt = parseDate(policy['expiresAt']);
25
32
  if (expiresAt !== null && expiresAt < now) {
33
+ const when = messageDate(expiresAt, ctx.options.timeZone);
26
34
  return {
27
35
  pass: false,
28
36
  code: 'expired',
29
- reason: `Content expired on ${new Date(expiresAt).toISOString()}`,
30
- suggestion: 'Update the expiresAt date or unpublish this content.',
37
+ reason: `This content expired on ${when.text}.`,
38
+ suggestion: 'Change the expiry date, or unpublish it.',
39
+ when,
31
40
  };
32
41
  }
33
42
  return { pass: true };
@@ -1 +1 @@
1
- {"version":3,"file":"embargo.js","sourceRoot":"","sources":["../../../../src/publishing/pipeline/steps/embargo.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,WAAW,GAAiB,KAAK,EAAE,GAAG,EAAE,EAAE;IACrD,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,CAEzC,CAAA;IACb,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;IAElC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IACtB,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAA;IAC1D,IAAI,cAAc,KAAK,IAAI,IAAI,cAAc,GAAG,GAAG,EAAE,CAAC;QACpD,OAAO;YACL,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,WAAW;YACjB,MAAM,EAAE,mBAAmB,IAAI,IAAI,CAAC,cAAc,CAAC,CAAC,WAAW,EAAE,EAAE;YACnE,UAAU,EACR,4GAA4G;SAC/G,CAAA;IACH,CAAC;IAED,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAA;IAChD,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,GAAG,GAAG,EAAE,CAAC;QAC1C,OAAO;YACL,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,sBAAsB,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE;YACjE,UAAU,EAAE,sDAAsD;SACnE,CAAA;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;AACvB,CAAC,CAAA;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAA;IAC1C,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IAC5B,OAAO,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA;AACrC,CAAC"}
1
+ {"version":3,"file":"embargo.js","sourceRoot":"","sources":["../../../../src/publishing/pipeline/steps/embargo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAG/C;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,WAAW,GAAiB,KAAK,EAAE,GAAG,EAAE,EAAE;IACrD,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,CAEzC,CAAA;IACb,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;IAElC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IACtB,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAA;IAC1D,IAAI,cAAc,KAAK,IAAI,IAAI,cAAc,GAAG,GAAG,EAAE,CAAC;QACpD,MAAM,IAAI,GAAG,WAAW,CAAC,cAAc,EAAE,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;QAC9D,OAAO;YACL,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,WAAW;YACjB,MAAM,EAAE,4BAA4B,IAAI,CAAC,IAAI,GAAG;YAChD,UAAU,EACR,sFAAsF;YACxF,IAAI;SACL,CAAA;IACH,CAAC;IAED,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAA;IAChD,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,GAAG,GAAG,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,WAAW,CAAC,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;QACzD,OAAO;YACL,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,2BAA2B,IAAI,CAAC,IAAI,GAAG;YAC/C,UAAU,EAAE,0CAA0C;YACtD,IAAI;SACL,CAAA;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;AACvB,CAAC,CAAA;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAA;IAC1C,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IAC5B,OAAO,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA;AACrC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../../../src/publishing/pipeline/steps/execute.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAiB,YAAY,EAAE,MAAM,aAAa,CAAA;AAE9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AACH,eAAO,MAAM,WAAW,EAAE,YAwEzB,CAAA"}
1
+ {"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../../../src/publishing/pipeline/steps/execute.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAiB,YAAY,EAAE,MAAM,aAAa,CAAA;AAE9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AACH,eAAO,MAAM,WAAW,EAAE,YA+EzB,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import { sendEventSafely } from '../../events.js';
2
+ import { plural } from '../../messages.js';
2
3
  /**
3
4
  * Performs the actual publish: writes `_status: 'published'`, stamps the
4
5
  * publishedAt field on a first publish, then fires `content/page.published`
@@ -80,11 +81,14 @@ export const executeStep = async (ctx) => {
80
81
  // Somebody is in the document. Not a failure to investigate — a state that
81
82
  // resolves itself, and one the caller can act on: wait, or ask them.
82
83
  if (isLocked(error)) {
84
+ const holder = await lockHolder(ctx);
83
85
  return {
84
86
  pass: false,
85
87
  code: 'document-locked',
86
- reason: 'Somebody is editing this document right now',
87
- suggestion: 'A lock is released when the editor closes the document, and expires on its own a few minutes after they stop. Try again, or ask them to finish.',
88
+ reason: `${holder ?? 'Someone else'} is editing this right now.`,
89
+ // It resolves itself, and has to say so, or it reads as a failure to
90
+ // investigate.
91
+ suggestion: "Try again once they've closed it, or ask them to finish. If they've left it open, it frees up on its own a few minutes after they stop.",
88
92
  };
89
93
  }
90
94
  const issues = fieldIssues(error);
@@ -95,10 +99,11 @@ export const executeStep = async (ctx) => {
95
99
  throw error;
96
100
  return {
97
101
  pass: false,
102
+ // No suggestion: Payload's own messages say what each field needs, and
103
+ // the admin marks the fields and says so.
98
104
  code: 'field-validation-failed',
99
- reason: `${issues.length} field${issues.length === 1 ? '' : 's'} the collection will not accept`,
105
+ reason: `${plural(issues.length, 'field')} ${issues.length === 1 ? 'needs' : 'need'} fixing before this can be published.`,
100
106
  issues,
101
- suggestion: 'These are required by the collection rather than by a policy check, so they must be filled before this document can be published.',
102
107
  };
103
108
  }
104
109
  // The write has landed. From here the publish has happened, so nothing
@@ -113,7 +118,7 @@ export const executeStep = async (ctx) => {
113
118
  previousPublishedAt,
114
119
  isFirstPublish: wasFirstPublish,
115
120
  },
116
- });
121
+ }, ctx.payload.logger);
117
122
  return { pass: true, ...(warning ? { warnings: [warning] } : {}) };
118
123
  };
119
124
  /**
@@ -146,6 +151,44 @@ function fieldIssues(error) {
146
151
  }
147
152
  return issues;
148
153
  }
154
+ /**
155
+ * The name of whoever holds the document's lock, or `undefined` when it cannot
156
+ * be read. Payload's `Locked` carries only a sentence naming the document's id;
157
+ * the lock row names the user, and "Sam is editing this" is something an
158
+ * editor can act on — they can ask Sam.
159
+ *
160
+ * Best effort, and past access control: the holder's name is what the admin's
161
+ * own lock modal shows anybody who opens the document.
162
+ */
163
+ async function lockHolder(ctx) {
164
+ try {
165
+ const found = await ctx.payload.find({
166
+ collection: 'payload-locked-documents',
167
+ where: {
168
+ and: [
169
+ { 'document.relationTo': { equals: ctx.collection.slug } },
170
+ { 'document.value': { equals: ctx.documentId } },
171
+ ],
172
+ },
173
+ sort: '-updatedAt',
174
+ limit: 1,
175
+ depth: 1,
176
+ overrideAccess: true,
177
+ });
178
+ const user = found.docs[0]?.user?.value;
179
+ if (!user || typeof user !== 'object')
180
+ return undefined;
181
+ const { name, email } = user;
182
+ if (typeof name === 'string' && name.trim() !== '')
183
+ return name;
184
+ if (typeof email === 'string' && email.trim() !== '')
185
+ return email;
186
+ return undefined;
187
+ }
188
+ catch {
189
+ return undefined;
190
+ }
191
+ }
149
192
  /**
150
193
  * Payload's `Locked`, read structurally for the same reason as `fieldIssues`
151
194
  * below it: two copies of `payload` under one tree make `instanceof` false for
@@ -1 +1 @@
1
- {"version":3,"file":"execute.js","sourceRoot":"","sources":["../../../../src/publishing/pipeline/steps/execute.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"execute.js","sourceRoot":"","sources":["../../../../src/publishing/pipeline/steps/execute.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,6 @@
1
1
  import type { PipelineStep } from '../types.js';
2
+ /** Also what unpublish, schedule and unschedule say for a document that is not there. */
3
+ export declare const NOT_FOUND = "This document couldn't be found. It may have been deleted or moved to the trash.";
2
4
  /**
3
5
  * Verifies the document exists and isn't already published with no
4
6
  * outstanding draft changes. The publish operation should be idempotent
@@ -1 +1 @@
1
- {"version":3,"file":"exist.d.ts","sourceRoot":"","sources":["../../../../src/publishing/pipeline/steps/exist.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE/C;;;;;GAKG;AACH,eAAO,MAAM,SAAS,EAAE,YAgBvB,CAAA"}
1
+ {"version":3,"file":"exist.d.ts","sourceRoot":"","sources":["../../../../src/publishing/pipeline/steps/exist.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE/C,yFAAyF;AACzF,eAAO,MAAM,SAAS,qFAC8D,CAAA;AAEpF;;;;;GAKG;AACH,eAAO,MAAM,SAAS,EAAE,YAgBvB,CAAA"}
@@ -1,3 +1,5 @@
1
+ /** Also what unpublish, schedule and unschedule say for a document that is not there. */
2
+ export const NOT_FOUND = "This document couldn't be found. It may have been deleted or moved to the trash.";
1
3
  /**
2
4
  * Verifies the document exists and isn't already published with no
3
5
  * outstanding draft changes. The publish operation should be idempotent
@@ -6,15 +8,15 @@
6
8
  */
7
9
  export const existStep = async (ctx) => {
8
10
  if (!ctx.document || Object.keys(ctx.document).length === 0) {
9
- return { pass: false, code: 'not-found', reason: 'Document not found' };
11
+ return { pass: false, code: 'not-found', reason: NOT_FOUND };
10
12
  }
11
13
  const isPublished = ctx.document['_status'] === 'published';
12
14
  if (isPublished && !hasUnpublishedChanges(ctx.document, ctx.collection.publishedAtField)) {
13
15
  return {
14
16
  pass: false,
15
17
  code: 'already-published',
16
- reason: 'Document is already published with no unpublished changes',
17
- suggestion: 'Make a draft change first, then publish.',
18
+ reason: "There's nothing new to publish.",
19
+ suggestion: 'Make a change first, then publish.',
18
20
  };
19
21
  }
20
22
  return { pass: true };
@@ -1 +1 @@
1
- {"version":3,"file":"exist.js","sourceRoot":"","sources":["../../../../src/publishing/pipeline/steps/exist.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,SAAS,GAAiB,KAAK,EAAE,GAAG,EAAE,EAAE;IACnD,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5D,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAA;IACzE,CAAC;IAED,MAAM,WAAW,GAAG,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,WAAW,CAAA;IAC3D,IAAI,WAAW,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACzF,OAAO;YACL,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,mBAAmB;YACzB,MAAM,EAAE,2DAA2D;YACnE,UAAU,EAAE,0CAA0C;SACvD,CAAA;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;AACvB,CAAC,CAAA;AAED,SAAS,qBAAqB,CAC5B,GAA4B,EAC5B,gBAAwB;IAExB,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,CAAC,CAAA;IACnC,MAAM,YAAY,GAAG,GAAG,CAAC,gBAAgB,CAAC,CAAA;IAC1C,MAAM,SAAS,GAAG,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC7E,MAAM,WAAW,GAAG,OAAO,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACnF,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAA;IACrE,OAAO,SAAS,GAAG,WAAW,CAAA;AAChC,CAAC"}
1
+ {"version":3,"file":"exist.js","sourceRoot":"","sources":["../../../../src/publishing/pipeline/steps/exist.ts"],"names":[],"mappings":"AAEA,yFAAyF;AACzF,MAAM,CAAC,MAAM,SAAS,GACpB,kFAAkF,CAAA;AAEpF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,SAAS,GAAiB,KAAK,EAAE,GAAG,EAAE,EAAE;IACnD,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5D,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;IAC9D,CAAC;IAED,MAAM,WAAW,GAAG,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,WAAW,CAAA;IAC3D,IAAI,WAAW,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACzF,OAAO;YACL,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,mBAAmB;YACzB,MAAM,EAAE,iCAAiC;YACzC,UAAU,EAAE,oCAAoC;SACjD,CAAA;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;AACvB,CAAC,CAAA;AAED,SAAS,qBAAqB,CAC5B,GAA4B,EAC5B,gBAAwB;IAExB,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,CAAC,CAAA;IACnC,MAAM,YAAY,GAAG,GAAG,CAAC,gBAAgB,CAAC,CAAA;IAC1C,MAAM,SAAS,GAAG,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC7E,MAAM,WAAW,GAAG,OAAO,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACnF,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAA;IACrE,OAAO,SAAS,GAAG,WAAW,CAAA;AAChC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { PipelineStep } from '../types.js';
2
+ export declare const linkTargetsStep: PipelineStep;
3
+ //# sourceMappingURL=link-targets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link-targets.d.ts","sourceRoot":"","sources":["../../../../src/publishing/pipeline/steps/link-targets.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAkC,YAAY,EAAE,MAAM,aAAa,CAAA;AAuP/E,eAAO,MAAM,eAAe,EAAE,YA6E7B,CAAA"}