@forumone/throughline 2.1.0 → 2.2.0-next-332baf9
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.
- package/CHANGELOG.md +15 -0
- package/dist/migrate/exports.json +11 -0
- package/dist/publishing/index.d.ts +8 -0
- package/dist/publishing/index.d.ts.map +1 -1
- package/dist/publishing/index.js +7 -0
- package/dist/publishing/index.js.map +1 -1
- package/dist/publishing/options.d.ts +13 -0
- package/dist/publishing/options.d.ts.map +1 -1
- package/dist/publishing/options.js.map +1 -1
- package/dist/publishing/pipeline/index.d.ts.map +1 -1
- package/dist/publishing/pipeline/index.js +7 -7
- package/dist/publishing/pipeline/index.js.map +1 -1
- package/dist/publishing/pipeline/steps/link-targets.d.ts +3 -0
- package/dist/publishing/pipeline/steps/link-targets.d.ts.map +1 -0
- package/dist/publishing/pipeline/steps/link-targets.js +269 -0
- package/dist/publishing/pipeline/steps/link-targets.js.map +1 -0
- package/dist/references/index.d.ts +4 -2
- package/dist/references/index.d.ts.map +1 -1
- package/dist/references/index.js +2 -1
- package/dist/references/index.js.map +1 -1
- package/dist/references/links.d.ts +45 -0
- package/dist/references/links.d.ts.map +1 -0
- package/dist/references/links.js +117 -0
- package/dist/references/links.js.map +1 -0
- package/dist/references/walk.d.ts +59 -0
- package/dist/references/walk.d.ts.map +1 -1
- package/dist/references/walk.js +83 -41
- package/dist/references/walk.js.map +1 -1
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# @forumone/throughline
|
|
2
2
|
|
|
3
|
+
## 2.2.0-next-332baf9
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 332baf9: Publishing refuses a page whose internal links go to a draft, trashed or deleted document (forumone-2026#756). A new pipeline step, `link-targets`, runs after `required-fields` and looks up every link's target. A deleted target, a trashed one, or an unpublished one in a collection with drafts blocks the publish (`code: 'link-targets'`). Each issue names the block or field and the target's title, and its `field` is the link's own path, so the admin marks it. An unpublished target with a scheduled publish time is a warning, not a block.
|
|
8
|
+
|
|
9
|
+
**This is a new blocking step, and it's on by default.** After upgrading, a page that already links to a draft or trashed page can't be published until the link is fixed. `get_publish_status` and `check` report it like any other blocker. To switch it off, set `publishing: { linkTargets: { enabled: false } }`.
|
|
10
|
+
|
|
11
|
+
A link is either an internal link in Lexical rich text, or a relationship field marked with `custom: { throughlineLinkTarget: true }`. The design-system generator's `linkField` now marks its `reference`, so every generated link is covered without changes. To cover a hand-written link field, wrap it in `markLinkTarget` from `@forumone/throughline/publishing`. A marked reference whose sibling `mode` isn't `internal` is ignored, and `markLinkTarget(field, { when })` takes a different rule. The structural walk behind `referencesIn` is now `walkDocument`, exported from `/media` along with `linkTargetsIn`.
|
|
12
|
+
|
|
13
|
+
### Patch Changes
|
|
14
|
+
|
|
15
|
+
- Updated dependencies [332baf9]
|
|
16
|
+
- @forumone/throughline-design-system@2.2.0-next-332baf9
|
|
17
|
+
|
|
3
18
|
## 2.1.0
|
|
4
19
|
|
|
5
20
|
### Minor Changes
|
|
@@ -188,8 +188,12 @@
|
|
|
188
188
|
"JobTrigger": ["@forumone/throughline/jobs"],
|
|
189
189
|
"JobsAdapter": ["@forumone/throughline/jobs"],
|
|
190
190
|
"KeyParts": ["@forumone/throughline/media"],
|
|
191
|
+
"LINK_TARGET_KEY": ["@forumone/throughline/media", "@forumone/throughline/publishing"],
|
|
191
192
|
"LISTED": ["@forumone/throughline/fields"],
|
|
192
193
|
"LOCKED_DOCUMENTS_SLUG": ["@forumone/throughline"],
|
|
194
|
+
"LinkTarget": ["@forumone/throughline/media", "@forumone/throughline/publishing"],
|
|
195
|
+
"LinkTargetMarker": ["@forumone/throughline/media", "@forumone/throughline/publishing"],
|
|
196
|
+
"LinkTargetsInOptions": ["@forumone/throughline/media", "@forumone/throughline/publishing"],
|
|
193
197
|
"LockHolder": ["@forumone/throughline/content"],
|
|
194
198
|
"Logger": ["@forumone/throughline"],
|
|
195
199
|
"MANUAL_SYNC_EVENT": ["@forumone/throughline/integrations"],
|
|
@@ -314,6 +318,9 @@
|
|
|
314
318
|
"WEBHOOK_INTEGRATION_ID": ["@forumone/throughline/integrations"],
|
|
315
319
|
"WORK_TOOLS": ["@forumone/throughline/editorial"],
|
|
316
320
|
"WORK_TOOL_DESCRIPTORS": ["@forumone/throughline/editorial"],
|
|
321
|
+
"WalkDocumentOptions": ["@forumone/throughline/media"],
|
|
322
|
+
"WalkLocation": ["@forumone/throughline/media"],
|
|
323
|
+
"WalkVisitor": ["@forumone/throughline/media"],
|
|
317
324
|
"WebhookConfig": ["@forumone/throughline/integrations"],
|
|
318
325
|
"WorkOptions": ["@forumone/throughline/editorial"],
|
|
319
326
|
"WorkRow": ["@forumone/throughline/editorial"],
|
|
@@ -472,10 +479,13 @@
|
|
|
472
479
|
"jobPayload": ["@forumone/throughline/jobs"],
|
|
473
480
|
"keepOrStampPublishedAt": ["@forumone/throughline/fields"],
|
|
474
481
|
"linkLabelsCheck": ["@forumone/throughline/publishing"],
|
|
482
|
+
"linkTargetMarker": ["@forumone/throughline/media"],
|
|
483
|
+
"linkTargetsIn": ["@forumone/throughline/media", "@forumone/throughline/publishing"],
|
|
475
484
|
"listHref": ["@forumone/throughline/editorial"],
|
|
476
485
|
"lockHolder": ["@forumone/throughline/content"],
|
|
477
486
|
"lockRefusal": ["@forumone/throughline/content"],
|
|
478
487
|
"mapFields": ["@forumone/throughline/fields"],
|
|
488
|
+
"markLinkTarget": ["@forumone/throughline/media", "@forumone/throughline/publishing"],
|
|
479
489
|
"matchCommands": ["@forumone/throughline/editorial"],
|
|
480
490
|
"matchRank": ["@forumone/throughline/editorial"],
|
|
481
491
|
"mcpApiKeyAccess": ["@forumone/throughline"],
|
|
@@ -562,6 +572,7 @@
|
|
|
562
572
|
"usedBy": ["@forumone/throughline/fields"],
|
|
563
573
|
"validateBlock": ["@forumone/throughline/content"],
|
|
564
574
|
"verifyActionToken": ["@forumone/throughline/approvals"],
|
|
575
|
+
"walkDocument": ["@forumone/throughline/media"],
|
|
565
576
|
"webhookIntegration": ["@forumone/throughline/integrations"],
|
|
566
577
|
"whereQuery": ["@forumone/throughline/editorial"],
|
|
567
578
|
"withMeta": ["@forumone/throughline"],
|
|
@@ -38,4 +38,12 @@ export { publishAtScheduledTimeJob } from './jobs/publish-at-scheduled-time.js';
|
|
|
38
38
|
export { createTagRevalidationHooks } from './jobs/revalidate-tag-hooks.js';
|
|
39
39
|
export type { CollectionTagHookOptions, GlobalTagHookOptions, RevalidateTagFn, TagRevalidationHooks, TagRevalidationOptions, TagSelector, } from './jobs/revalidate-tag-hooks.js';
|
|
40
40
|
export type { ExecuteScheduledPublishesOptions, PublishAtScheduledTimeOptions, RevalidateFn, RevalidateOnPublishOptions, RevalidatePathsInput, ScheduledCollectionConfig, ScheduledPublishRequest, ScheduledPublishResult, } from '../jobs/workflow-types.js';
|
|
41
|
+
/**
|
|
42
|
+
* Links, for the `link-targets` step: a host marks its own hand-written link
|
|
43
|
+
* fields with `markLinkTarget` so a link to a draft, trashed or deleted page
|
|
44
|
+
* is refused at publish. The fields the design-system generator builds are
|
|
45
|
+
* marked already.
|
|
46
|
+
*/
|
|
47
|
+
export { LINK_TARGET_KEY, linkTargetsIn, markLinkTarget } from '../references/links.js';
|
|
48
|
+
export type { LinkTarget, LinkTargetMarker, LinkTargetsInOptions } from '../references/links.js';
|
|
41
49
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/publishing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAE9C,YAAY,EACV,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,qBAAqB,EACrB,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,cAAc,CAAA;AAErB,YAAY,EACV,eAAe,EACf,cAAc,EACd,YAAY,EACZ,kBAAkB,GACnB,MAAM,qBAAqB,CAAA;AAE5B;;;;GAIG;AACH,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,cAAc,CAAA;AAErB,YAAY,EACV,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,cAAc,CAAA;AAErB;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAEtD;;;;GAIG;AACH,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAA;AAGtE,OAAO,EACL,6BAA6B,EAC7B,YAAY,EACZ,qBAAqB,EACrB,eAAe,GAChB,MAAM,mBAAmB,CAAA;AAG1B,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAA;AACxE,OAAO,EAAE,4BAA4B,EAAE,MAAM,uCAAuC,CAAA;AACpF,OAAO,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAA;AAC/E,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAA;AAC3E,YAAY,EACV,wBAAwB,EACxB,oBAAoB,EACpB,eAAe,EACf,oBAAoB,EACpB,sBAAsB,EACtB,WAAW,GACZ,MAAM,gCAAgC,CAAA;AACvC,YAAY,EACV,gCAAgC,EAChC,6BAA6B,EAC7B,YAAY,EACZ,0BAA0B,EAC1B,oBAAoB,EACpB,yBAAyB,EACzB,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,2BAA2B,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/publishing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAE9C,YAAY,EACV,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,qBAAqB,EACrB,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,cAAc,CAAA;AAErB,YAAY,EACV,eAAe,EACf,cAAc,EACd,YAAY,EACZ,kBAAkB,GACnB,MAAM,qBAAqB,CAAA;AAE5B;;;;GAIG;AACH,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,cAAc,CAAA;AAErB,YAAY,EACV,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,cAAc,CAAA;AAErB;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAEtD;;;;GAIG;AACH,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAA;AAGtE,OAAO,EACL,6BAA6B,EAC7B,YAAY,EACZ,qBAAqB,EACrB,eAAe,GAChB,MAAM,mBAAmB,CAAA;AAG1B,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAA;AACxE,OAAO,EAAE,4BAA4B,EAAE,MAAM,uCAAuC,CAAA;AACpF,OAAO,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAA;AAC/E,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAA;AAC3E,YAAY,EACV,wBAAwB,EACxB,oBAAoB,EACpB,eAAe,EACf,oBAAoB,EACpB,sBAAsB,EACtB,WAAW,GACZ,MAAM,gCAAgC,CAAA;AACvC,YAAY,EACV,gCAAgC,EAChC,6BAA6B,EAC7B,YAAY,EACZ,0BAA0B,EAC1B,oBAAoB,EACpB,yBAAyB,EACzB,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,2BAA2B,CAAA;AAElC;;;;;GAKG;AACH,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AACvF,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA"}
|
package/dist/publishing/index.js
CHANGED
|
@@ -35,4 +35,11 @@ export { revalidateOnPublishJob } from './jobs/revalidate-on-publish.js';
|
|
|
35
35
|
export { executeScheduledPublishesJob } from './jobs/execute-scheduled-publishes.js';
|
|
36
36
|
export { publishAtScheduledTimeJob } from './jobs/publish-at-scheduled-time.js';
|
|
37
37
|
export { createTagRevalidationHooks } from './jobs/revalidate-tag-hooks.js';
|
|
38
|
+
/**
|
|
39
|
+
* Links, for the `link-targets` step: a host marks its own hand-written link
|
|
40
|
+
* fields with `markLinkTarget` so a link to a draft, trashed or deleted page
|
|
41
|
+
* is refused at publish. The fields the design-system generator builds are
|
|
42
|
+
* marked already.
|
|
43
|
+
*/
|
|
44
|
+
export { LINK_TARGET_KEY, linkTargetsIn, markLinkTarget } from '../references/links.js';
|
|
38
45
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/publishing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAmB9C;;;;GAIG;AACH,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,cAAc,CAAA;AAerB;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAEtD;;;;GAIG;AACH,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAA;AAEtE,uFAAuF;AACvF,OAAO,EACL,6BAA6B,EAC7B,YAAY,EACZ,qBAAqB,EACrB,eAAe,GAChB,MAAM,mBAAmB,CAAA;AAE1B,gFAAgF;AAChF,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAA;AACxE,OAAO,EAAE,4BAA4B,EAAE,MAAM,uCAAuC,CAAA;AACpF,OAAO,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAA;AAC/E,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/publishing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAmB9C;;;;GAIG;AACH,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,cAAc,CAAA;AAerB;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAEtD;;;;GAIG;AACH,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAA;AAEtE,uFAAuF;AACvF,OAAO,EACL,6BAA6B,EAC7B,YAAY,EACZ,qBAAqB,EACrB,eAAe,GAChB,MAAM,mBAAmB,CAAA;AAE1B,gFAAgF;AAChF,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAA;AACxE,OAAO,EAAE,4BAA4B,EAAE,MAAM,uCAAuC,CAAA;AACpF,OAAO,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAA;AAC/E,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAA;AAoB3E;;;;;GAKG;AACH,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA"}
|
|
@@ -67,6 +67,19 @@ export interface PublishingPluginOptions extends BaseCorePluginOptions {
|
|
|
67
67
|
* plugin ships a fix. Switch one off here and supply your own.
|
|
68
68
|
*/
|
|
69
69
|
disableAccessibilityChecks?: string[];
|
|
70
|
+
/**
|
|
71
|
+
* Optional: the `link-targets` step, which refuses a publish whose internal
|
|
72
|
+
* links go to a draft, a document in the trash, or one that has been
|
|
73
|
+
* deleted. On by default; `{ enabled: false }` switches it off.
|
|
74
|
+
*
|
|
75
|
+
* A link is a relationship field marked with `markLinkTarget` (every link
|
|
76
|
+
* the design-system generator builds already is) or an internal link in
|
|
77
|
+
* rich text. A target that is not published but has a scheduled publish
|
|
78
|
+
* time is a warning rather than a block.
|
|
79
|
+
*/
|
|
80
|
+
linkTargets?: {
|
|
81
|
+
enabled?: boolean;
|
|
82
|
+
};
|
|
70
83
|
/** Optional: resolver consulted when a document's policy requires approval. */
|
|
71
84
|
approvalResolver?: ApprovalResolver;
|
|
72
85
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/publishing/options.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/publishing/options.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/publishing/options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAGxD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/publishing/options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAGxD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAsIvB,MAAM,2BAA2B,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACvC,qBAAqB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5C,cAAc,EAAE,CAAC;SACd,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SACxE,QAAQ,EAAE;CACd,CAAC,CAAA;AAEF;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,OAAgC;IAC9D,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAA;IAC7F,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAA;IACnF,CAAC;IACD,KAAK,MAAM,UAAU,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,2BAA2B,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;QAChE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YAC5C,MAAM,IAAI,KAAK,CAAC,+BAA+B,MAAM,EAAE,CAAC,CAAA;QAC1D,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,OAAgC,EAChC,IAAY;IAEZ,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;IAC/D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,eAAe,IAAI,sFAAsF,CAC1G,CAAA;IACH,CAAC;IACD,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,QAAQ;QAC3C,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,KAAK;QAClC,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,QAAQ;QAC3C,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,MAAM;QACrC,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,IAAI,aAAa;QAC1D,qBAAqB,EAAE,MAAM,CAAC,qBAAqB,IAAI,oBAAoB;QAC3E,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5E,CAAA;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/publishing/pipeline/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/publishing/pipeline/index.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAgB,MAAM,YAAY,CAAA;AAmE/E;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAO1F;AAED;;;;;;;;;GASG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAG5F;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAW5F;AAED,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA"}
|
|
@@ -2,6 +2,7 @@ import { existStep } from './steps/exist.js';
|
|
|
2
2
|
import { compositionStep } from './steps/composition.js';
|
|
3
3
|
import { accessibilityStep } from './steps/accessibility.js';
|
|
4
4
|
import { requiredFieldsStep } from './steps/required-fields.js';
|
|
5
|
+
import { linkTargetsStep } from './steps/link-targets.js';
|
|
5
6
|
import { embargoStep } from './steps/embargo.js';
|
|
6
7
|
import { approvalStep } from './steps/approval.js';
|
|
7
8
|
import { executeStep } from './steps/execute.js';
|
|
@@ -10,6 +11,8 @@ const PREFLIGHT_STEPS = [
|
|
|
10
11
|
{ name: 'composition', step: compositionStep },
|
|
11
12
|
{ name: 'accessibility', step: accessibilityStep },
|
|
12
13
|
{ name: 'required-fields', step: requiredFieldsStep },
|
|
14
|
+
// The last content check, and the first to read other documents.
|
|
15
|
+
{ name: 'link-targets', step: linkTargetsStep },
|
|
13
16
|
{ name: 'embargo', step: embargoStep },
|
|
14
17
|
{ name: 'approval', step: approvalStep },
|
|
15
18
|
];
|
|
@@ -29,13 +32,10 @@ const ORDERED_STEPS = [
|
|
|
29
32
|
* differs between the two callers, and that difference is the only reason there
|
|
30
33
|
* are still two.
|
|
31
34
|
*
|
|
32
|
-
*
|
|
33
|
-
* a
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
* step both warns and fails, or an earlier step learns to warn, dropping them
|
|
37
|
-
* would be silent. That is also why there is no test for it: the pipeline has no
|
|
38
|
-
* way to produce the case.
|
|
35
|
+
* A warning can reach a *failure* envelope: `link-targets` warns about a link
|
|
36
|
+
* to a scheduled page and can fail on another link in the same run, and an
|
|
37
|
+
* earlier step's warnings are carried past a later failure. `runPublishPipeline`
|
|
38
|
+
* spreads them onto the failure so neither is dropped silently.
|
|
39
39
|
*/
|
|
40
40
|
async function runSteps(context, steps) {
|
|
41
41
|
const warnings = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/publishing/pipeline/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAQhD,MAAM,eAAe,GAAkB;IACrC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE;IAClC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,eAAe,EAAE;IAC9C,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,iBAAiB,EAAE;IAClD,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,kBAAkB,EAAE;IACrD,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE;IACtC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE;CACzC,CAAA;AAED,MAAM,aAAa,GAAkB;IACnC,GAAG,eAAe;IAClB,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE;CACvC,CAAA;AAED
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/publishing/pipeline/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;AAkO/E,eAAO,MAAM,eAAe,EAAE,YA0E7B,CAAA"}
|
|
@@ -0,0 +1,269 @@
|
|
|
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
|
+
function quoted(title) {
|
|
95
|
+
return title ? `"${title}"` : undefined;
|
|
96
|
+
}
|
|
97
|
+
function messageFor(link, verdict, singular) {
|
|
98
|
+
const where = `A link in ${placeOf(link)}`;
|
|
99
|
+
switch (verdict.kind) {
|
|
100
|
+
case 'deleted':
|
|
101
|
+
return `${where} goes to ${article(singular)} ${singular} that has been deleted. Change the link.`;
|
|
102
|
+
case 'trash': {
|
|
103
|
+
const name = quoted(verdict.title) ?? `${article(singular)} ${singular}`;
|
|
104
|
+
return `${where} goes to ${name}, which is in the trash. Restore it, or change the link.`;
|
|
105
|
+
}
|
|
106
|
+
case 'draft': {
|
|
107
|
+
const name = quoted(verdict.title);
|
|
108
|
+
return name
|
|
109
|
+
? `${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.`
|
|
110
|
+
: `${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.`;
|
|
111
|
+
}
|
|
112
|
+
case 'scheduled': {
|
|
113
|
+
const name = quoted(verdict.title) ?? `${article(singular)} ${singular}`;
|
|
114
|
+
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.`;
|
|
115
|
+
}
|
|
116
|
+
case 'published':
|
|
117
|
+
return '';
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
function hasDrafts(config) {
|
|
121
|
+
const { versions } = config;
|
|
122
|
+
return Boolean(versions && typeof versions === 'object' && versions.drafts);
|
|
123
|
+
}
|
|
124
|
+
function titleOf(doc, field) {
|
|
125
|
+
const value = doc?.[field];
|
|
126
|
+
return typeof value === 'string' && value.trim() !== '' ? value : undefined;
|
|
127
|
+
}
|
|
128
|
+
/** One collection's targets, classified. One query, plus one for unpublished targets that may be scheduled. */
|
|
129
|
+
async function classify(ctx, slug, config, ids) {
|
|
130
|
+
const drafts = hasDrafts(config);
|
|
131
|
+
const titleField = config.admin?.useAsTitle ?? 'id';
|
|
132
|
+
const select = { [titleField]: true };
|
|
133
|
+
if (drafts)
|
|
134
|
+
select['_status'] = true;
|
|
135
|
+
if (config.trash)
|
|
136
|
+
select['deletedAt'] = true;
|
|
137
|
+
const found = await ctx.payload.find({
|
|
138
|
+
collection: slug,
|
|
139
|
+
where: { id: { in: ids } },
|
|
140
|
+
draft: false,
|
|
141
|
+
...(config.trash ? { trash: true } : {}),
|
|
142
|
+
depth: 0,
|
|
143
|
+
overrideAccess: true,
|
|
144
|
+
limit: ids.length,
|
|
145
|
+
pagination: false,
|
|
146
|
+
select,
|
|
147
|
+
});
|
|
148
|
+
const rows = new Map();
|
|
149
|
+
for (const doc of found.docs)
|
|
150
|
+
rows.set(String(doc['id']), doc);
|
|
151
|
+
const verdicts = new Map();
|
|
152
|
+
const unpublished = [];
|
|
153
|
+
for (const id of ids) {
|
|
154
|
+
const row = rows.get(String(id));
|
|
155
|
+
if (!row)
|
|
156
|
+
verdicts.set(String(id), { kind: 'deleted' });
|
|
157
|
+
else if (row['deletedAt'])
|
|
158
|
+
verdicts.set(String(id), { kind: 'trash', title: titleOf(row, titleField) });
|
|
159
|
+
else if (drafts && row['_status'] !== 'published')
|
|
160
|
+
unpublished.push(id);
|
|
161
|
+
else
|
|
162
|
+
verdicts.set(String(id), { kind: 'published' });
|
|
163
|
+
}
|
|
164
|
+
const publishable = ctx.options.collections.some((c) => c.slug === slug);
|
|
165
|
+
const scheduledField = publishable
|
|
166
|
+
? resolveCollection(ctx.options, slug).scheduledPublishField
|
|
167
|
+
: undefined;
|
|
168
|
+
let latest = new Map();
|
|
169
|
+
if (unpublished.length > 0) {
|
|
170
|
+
const drafted = await ctx.payload.find({
|
|
171
|
+
collection: slug,
|
|
172
|
+
where: { id: { in: unpublished } },
|
|
173
|
+
draft: true,
|
|
174
|
+
depth: 0,
|
|
175
|
+
overrideAccess: true,
|
|
176
|
+
limit: unpublished.length,
|
|
177
|
+
pagination: false,
|
|
178
|
+
select: { [titleField]: true, ...(scheduledField ? { [scheduledField]: true } : {}) },
|
|
179
|
+
});
|
|
180
|
+
latest = new Map(drafted.docs.map((d) => [String(d['id']), d]));
|
|
181
|
+
}
|
|
182
|
+
for (const id of unpublished) {
|
|
183
|
+
const draft = latest.get(String(id));
|
|
184
|
+
const title = titleOf(draft, titleField) ?? titleOf(rows.get(String(id)), titleField);
|
|
185
|
+
const scheduled = scheduledField ? draft?.[scheduledField] : undefined;
|
|
186
|
+
verdicts.set(String(id), scheduled !== undefined && scheduled !== null && scheduled !== ''
|
|
187
|
+
? { kind: 'scheduled', title }
|
|
188
|
+
: { kind: 'draft', title });
|
|
189
|
+
}
|
|
190
|
+
return verdicts;
|
|
191
|
+
}
|
|
192
|
+
/** The document as stored, ids unpopulated; the pipeline's copy when it cannot be read. */
|
|
193
|
+
async function storedDocument(ctx) {
|
|
194
|
+
const stored = await ctx.payload.findByID({
|
|
195
|
+
collection: ctx.collection.slug,
|
|
196
|
+
id: ctx.documentId,
|
|
197
|
+
draft: true,
|
|
198
|
+
depth: 0,
|
|
199
|
+
overrideAccess: true,
|
|
200
|
+
disableErrors: true,
|
|
201
|
+
});
|
|
202
|
+
return stored ?? ctx.document;
|
|
203
|
+
}
|
|
204
|
+
export const linkTargetsStep = async (ctx) => {
|
|
205
|
+
if (ctx.options.linkTargets?.enabled === false)
|
|
206
|
+
return { pass: true };
|
|
207
|
+
const own = configOf(ctx.payload, ctx.collection.slug);
|
|
208
|
+
if (!own)
|
|
209
|
+
return { pass: true };
|
|
210
|
+
let links;
|
|
211
|
+
const verdicts = new Map();
|
|
212
|
+
try {
|
|
213
|
+
const data = await storedDocument(ctx);
|
|
214
|
+
links = linkTargetsIn(own.fields, data, {
|
|
215
|
+
blocks: blockRegistry(ctx.payload),
|
|
216
|
+
}).filter((link) => !(link.relationTo === ctx.collection.slug && String(link.id) === ctx.documentId));
|
|
217
|
+
if (links.length === 0)
|
|
218
|
+
return { pass: true };
|
|
219
|
+
const byCollection = new Map();
|
|
220
|
+
for (const link of links) {
|
|
221
|
+
const ids = byCollection.get(link.relationTo) ?? new Map();
|
|
222
|
+
ids.set(String(link.id), link.id);
|
|
223
|
+
byCollection.set(link.relationTo, ids);
|
|
224
|
+
}
|
|
225
|
+
for (const [slug, ids] of byCollection) {
|
|
226
|
+
const config = configOf(ctx.payload, slug);
|
|
227
|
+
// A collection the config no longer has: nothing to ask, and nothing a reader can reach either way.
|
|
228
|
+
if (!config)
|
|
229
|
+
continue;
|
|
230
|
+
for (const [id, verdict] of await classify(ctx, slug, config, [...ids.values()])) {
|
|
231
|
+
verdicts.set(keyOf(slug, id), verdict);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
ctx.payload.logger?.error?.({ err: error }, '[publishing] link-targets: could not read link targets');
|
|
237
|
+
return {
|
|
238
|
+
pass: false,
|
|
239
|
+
code: CODE,
|
|
240
|
+
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.",
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
const errors = [];
|
|
244
|
+
const warnings = [];
|
|
245
|
+
for (const link of links) {
|
|
246
|
+
const verdict = verdicts.get(keyOf(link.relationTo, link.id));
|
|
247
|
+
if (!verdict || verdict.kind === 'published')
|
|
248
|
+
continue;
|
|
249
|
+
const message = messageFor(link, verdict, singularOf(configOf(ctx.payload, link.relationTo), link.relationTo));
|
|
250
|
+
if (verdict.kind === 'scheduled') {
|
|
251
|
+
warnings.push(message);
|
|
252
|
+
continue;
|
|
253
|
+
}
|
|
254
|
+
errors.push({ field: link.at.dataPath, message, severity: 'error', rule: verdict.kind });
|
|
255
|
+
}
|
|
256
|
+
const carried = warnings.length ? { warnings } : {};
|
|
257
|
+
if (errors.length === 0)
|
|
258
|
+
return { pass: true, ...carried };
|
|
259
|
+
return {
|
|
260
|
+
...carried,
|
|
261
|
+
pass: false,
|
|
262
|
+
code: CODE,
|
|
263
|
+
reason: errors.length === 1
|
|
264
|
+
? "1 link goes to a page readers can't see"
|
|
265
|
+
: `${errors.length} links go to pages readers can't see`,
|
|
266
|
+
issues: errors,
|
|
267
|
+
};
|
|
268
|
+
};
|
|
269
|
+
//# 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":"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"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
export { couldReference, pointsAt, referencesIn, referencesTo } from './walk.js';
|
|
2
|
-
export type { Reference, ReferencesInOptions } from './walk.js';
|
|
1
|
+
export { couldReference, pointsAt, referencesIn, referencesTo, walkDocument } from './walk.js';
|
|
2
|
+
export type { Reference, ReferencesInOptions, WalkDocumentOptions, WalkLocation, WalkVisitor, } from './walk.js';
|
|
3
|
+
export { LINK_TARGET_KEY, linkTargetMarker, linkTargetsIn, markLinkTarget } from './links.js';
|
|
4
|
+
export type { LinkTarget, LinkTargetMarker, LinkTargetsInOptions } from './links.js';
|
|
3
5
|
export { blockRegistry, describeReferences, findReferencedIds, findReferences } from './find.js';
|
|
4
6
|
export type { DocumentReferences, FindReferencesOptions } from './find.js';
|
|
5
7
|
export { movesToTrash, referenceRefusal, refuseDeleteWhileReferenced, refuseTrashWhileReferenced, } from './guards.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/references/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/references/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAC9F,YAAY,EACV,SAAS,EACT,mBAAmB,EACnB,mBAAmB,EACnB,YAAY,EACZ,WAAW,GACZ,MAAM,WAAW,CAAA;AAElB,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAC7F,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAEpF,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAChG,YAAY,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAA;AAE1E,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,2BAA2B,EAC3B,0BAA0B,GAC3B,MAAM,aAAa,CAAA;AACpB,YAAY,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAExD,OAAO,EACL,eAAe,EACf,0BAA0B,EAC1B,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,YAAY,CAAA;AACnB,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAEnD,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AACjF,YAAY,EAAE,0BAA0B,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA"}
|
package/dist/references/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export { couldReference, pointsAt, referencesIn, referencesTo } from './walk.js';
|
|
1
|
+
export { couldReference, pointsAt, referencesIn, referencesTo, walkDocument } from './walk.js';
|
|
2
|
+
export { LINK_TARGET_KEY, linkTargetMarker, linkTargetsIn, markLinkTarget } from './links.js';
|
|
2
3
|
export { blockRegistry, describeReferences, findReferencedIds, findReferences } from './find.js';
|
|
3
4
|
export { movesToTrash, referenceRefusal, refuseDeleteWhileReferenced, refuseTrashWhileReferenced, } from './guards.js';
|
|
4
5
|
export { REFERENCE_TOOLS, REFERENCE_TOOL_DESCRIPTORS, createCanDeleteTool, createFindReferencesTool, } from './tools.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/references/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/references/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAS9F,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAG7F,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAGhG,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,2BAA2B,EAC3B,0BAA0B,GAC3B,MAAM,aAAa,CAAA;AAGpB,OAAO,EACL,eAAe,EACf,0BAA0B,EAC1B,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,YAAY,CAAA;AAGnB,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { Block, Field } from 'payload';
|
|
2
|
+
import { type WalkLocation } from './walk.js';
|
|
3
|
+
/** The key a relationship field's `custom` carries to say it is a link. */
|
|
4
|
+
export declare const LINK_TARGET_KEY = "throughlineLinkTarget";
|
|
5
|
+
/**
|
|
6
|
+
* What the marker may hold. `true` follows the generator's rule: the reference
|
|
7
|
+
* counts unless a sibling `mode` says the link goes somewhere else. `when`
|
|
8
|
+
* replaces that rule for a link group shaped differently — it is handed the
|
|
9
|
+
* group's data and answers whether the reference is the live branch.
|
|
10
|
+
*/
|
|
11
|
+
export type LinkTargetMarker = true | {
|
|
12
|
+
when?: (siblings: Record<string, unknown>) => boolean;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Marks a hand-written relationship field as a link target, so the publish
|
|
16
|
+
* pipeline's `link-targets` step checks where it goes.
|
|
17
|
+
*
|
|
18
|
+
* ```ts
|
|
19
|
+
* markLinkTarget({ name: 'page', type: 'relationship', relationTo: ['pages', 'posts'] })
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export declare function markLinkTarget<T extends Field>(field: T, marker?: LinkTargetMarker): T;
|
|
23
|
+
/** The marker on a field, when it is a relationship or upload carrying one. */
|
|
24
|
+
export declare function linkTargetMarker(field: Field): LinkTargetMarker | undefined;
|
|
25
|
+
/** One link to another document, and where in this one it is. */
|
|
26
|
+
export interface LinkTarget {
|
|
27
|
+
/** The linked document's collection. */
|
|
28
|
+
relationTo: string;
|
|
29
|
+
/** The linked document's id, as it appears in the data. */
|
|
30
|
+
id: number | string;
|
|
31
|
+
/** Whether it was found in a marked field or in rich text. */
|
|
32
|
+
source: 'field' | 'richText';
|
|
33
|
+
/** The walk's location: human path, data path, block and top-level field. */
|
|
34
|
+
at: WalkLocation;
|
|
35
|
+
}
|
|
36
|
+
export interface LinkTargetsInOptions {
|
|
37
|
+
/** As `ReferencesInOptions.blocks`: the config's registry, for `blockReferences` and Lexical blocks. */
|
|
38
|
+
blocks?: readonly Block[] | ReadonlyMap<string, Block>;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Every link inside one document. Pure, like `referencesIn`: the field config
|
|
42
|
+
* and the data in, the links out, and no database.
|
|
43
|
+
*/
|
|
44
|
+
export declare function linkTargetsIn(fields: readonly Field[], data: Record<string, unknown> | undefined, options?: LinkTargetsInOptions): LinkTarget[];
|
|
45
|
+
//# sourceMappingURL=links.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"links.d.ts","sourceRoot":"","sources":["../../src/references/links.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC3C,OAAO,EAAuC,KAAK,YAAY,EAAE,MAAM,WAAW,CAAA;AA8BlF,2EAA2E;AAC3E,eAAO,MAAM,eAAe,0BAA0B,CAAA;AAEtD;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,IAAI,GAAG;IAAE,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAA;CAAE,CAAA;AAE/F;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,GAAE,gBAAuB,GAAG,CAAC,CAG5F;AAED,+EAA+E;AAC/E,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,GAAG,gBAAgB,GAAG,SAAS,CAO3E;AAED,iEAAiE;AACjE,MAAM,WAAW,UAAU;IACzB,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAA;IAClB,2DAA2D;IAC3D,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,8DAA8D;IAC9D,MAAM,EAAE,OAAO,GAAG,UAAU,CAAA;IAC5B,6EAA6E;IAC7E,EAAE,EAAE,YAAY,CAAA;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,wGAAwG;IACxG,MAAM,CAAC,EAAE,SAAS,KAAK,EAAE,GAAG,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;CACvD;AAgCD;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,SAAS,KAAK,EAAE,EACxB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EACzC,OAAO,GAAE,oBAAyB,GACjC,UAAU,EAAE,CA4Bd"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { idOf, walkDocument } from './walk.js';
|
|
2
|
+
/*
|
|
3
|
+
Which documents one document links to, found by the same structural walk as
|
|
4
|
+
`referencesIn` (forumone-2026#756).
|
|
5
|
+
|
|
6
|
+
## What counts as a link
|
|
7
|
+
|
|
8
|
+
Not every relationship. An author, a list of related articles or a form block's
|
|
9
|
+
form are relationships, and a draft one of those is somebody else's problem. A
|
|
10
|
+
link is a place a reader can follow to another page, and there are two:
|
|
11
|
+
|
|
12
|
+
- **A relationship field marked as a link target**, with
|
|
13
|
+
`custom: { [LINK_TARGET_KEY]: true }`. Throughline's design-system generator
|
|
14
|
+
marks the `reference` of every link it builds; a host marks its own
|
|
15
|
+
hand-written link fields the same way, with `markLinkTarget`. That marker is
|
|
16
|
+
how the platform finds a site's links without learning its schema.
|
|
17
|
+
- **A Lexical internal link**: a `link` or `autolink` node whose `linkType` is
|
|
18
|
+
`internal`, pointing at `doc: { relationTo, value }`.
|
|
19
|
+
|
|
20
|
+
## A reference the reader cannot reach is not a link
|
|
21
|
+
|
|
22
|
+
A generated link is a group with a `mode`, and only `internal` follows the
|
|
23
|
+
reference: switch a link to "Another site" and the old reference stays stored
|
|
24
|
+
beside the URL. So a marked field whose siblings carry a `mode` other than
|
|
25
|
+
`internal` is skipped, which is the same rule the renderer uses (`mode` absent
|
|
26
|
+
means internal). A host whose link group decides differently passes a `when`
|
|
27
|
+
in the marker instead.
|
|
28
|
+
*/
|
|
29
|
+
/** The key a relationship field's `custom` carries to say it is a link. */
|
|
30
|
+
export const LINK_TARGET_KEY = 'throughlineLinkTarget';
|
|
31
|
+
/**
|
|
32
|
+
* Marks a hand-written relationship field as a link target, so the publish
|
|
33
|
+
* pipeline's `link-targets` step checks where it goes.
|
|
34
|
+
*
|
|
35
|
+
* ```ts
|
|
36
|
+
* markLinkTarget({ name: 'page', type: 'relationship', relationTo: ['pages', 'posts'] })
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export function markLinkTarget(field, marker = true) {
|
|
40
|
+
const custom = field.custom;
|
|
41
|
+
return { ...field, custom: { ...custom, [LINK_TARGET_KEY]: marker } };
|
|
42
|
+
}
|
|
43
|
+
/** The marker on a field, when it is a relationship or upload carrying one. */
|
|
44
|
+
export function linkTargetMarker(field) {
|
|
45
|
+
if (field.type !== 'relationship' && field.type !== 'upload')
|
|
46
|
+
return undefined;
|
|
47
|
+
const custom = field.custom;
|
|
48
|
+
const marker = custom?.[LINK_TARGET_KEY];
|
|
49
|
+
if (marker === true)
|
|
50
|
+
return true;
|
|
51
|
+
if (marker && typeof marker === 'object')
|
|
52
|
+
return marker;
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
function isLive(marker, siblings) {
|
|
56
|
+
if (marker !== true && marker.when)
|
|
57
|
+
return marker.when(siblings);
|
|
58
|
+
const mode = siblings['mode'];
|
|
59
|
+
return mode === undefined || mode === null || mode === 'internal';
|
|
60
|
+
}
|
|
61
|
+
/** `{ relationTo, id }` pairs out of a relationship value. */
|
|
62
|
+
function targetsIn(field, value) {
|
|
63
|
+
const { relationTo } = field;
|
|
64
|
+
const entries = Array.isArray(value) ? value : [value];
|
|
65
|
+
const out = [];
|
|
66
|
+
for (const entry of entries) {
|
|
67
|
+
if (Array.isArray(relationTo)) {
|
|
68
|
+
// Polymorphic: `{ relationTo, value }`.
|
|
69
|
+
if (!entry || typeof entry !== 'object')
|
|
70
|
+
continue;
|
|
71
|
+
const { relationTo: to, value: held } = entry;
|
|
72
|
+
const id = idOf(held);
|
|
73
|
+
if (typeof to === 'string' && id !== undefined)
|
|
74
|
+
out.push({ relationTo: to, id });
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
if (typeof relationTo !== 'string')
|
|
78
|
+
continue;
|
|
79
|
+
const id = idOf(entry);
|
|
80
|
+
if (id !== undefined)
|
|
81
|
+
out.push({ relationTo, id });
|
|
82
|
+
}
|
|
83
|
+
return out;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Every link inside one document. Pure, like `referencesIn`: the field config
|
|
87
|
+
* and the data in, the links out, and no database.
|
|
88
|
+
*/
|
|
89
|
+
export function linkTargetsIn(fields, data, options = {}) {
|
|
90
|
+
const out = [];
|
|
91
|
+
walkDocument(fields, data, {
|
|
92
|
+
field(field, value, siblings, at) {
|
|
93
|
+
const marker = linkTargetMarker(field);
|
|
94
|
+
if (!marker)
|
|
95
|
+
return false;
|
|
96
|
+
if (isLive(marker, siblings)) {
|
|
97
|
+
for (const target of targetsIn(field, value))
|
|
98
|
+
out.push({ ...target, source: 'field', at });
|
|
99
|
+
}
|
|
100
|
+
return true;
|
|
101
|
+
},
|
|
102
|
+
richTextNode(node, at) {
|
|
103
|
+
if (node['type'] !== 'link' && node['type'] !== 'autolink')
|
|
104
|
+
return;
|
|
105
|
+
const fields = node['fields'];
|
|
106
|
+
if (fields?.['linkType'] !== 'internal')
|
|
107
|
+
return;
|
|
108
|
+
const doc = fields['doc'];
|
|
109
|
+
const id = idOf(doc?.value);
|
|
110
|
+
if (typeof doc?.relationTo === 'string' && id !== undefined) {
|
|
111
|
+
out.push({ relationTo: doc.relationTo, id, source: 'richText', at });
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
}, options);
|
|
115
|
+
return out;
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=links.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"links.js","sourceRoot":"","sources":["../../src/references/links.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,8 +22,67 @@ export interface ReferencesInOptions {
|
|
|
22
22
|
*/
|
|
23
23
|
blocks?: readonly Block[] | ReadonlyMap<string, Block>;
|
|
24
24
|
}
|
|
25
|
+
export type NamedField = Field & {
|
|
26
|
+
name: string;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* The id out of a relationship value. An id at `depth: 0`, a populated object
|
|
30
|
+
* above it. `String({ id: 3 })` is `[object Object]`, which matches nothing and
|
|
31
|
+
* fails open, so the object case is handled rather than coerced.
|
|
32
|
+
*/
|
|
33
|
+
export declare function idOf(value: unknown): number | string | undefined;
|
|
25
34
|
/** Whether an upload or relationship field can point at `collection`. */
|
|
26
35
|
export declare function pointsAt(field: Field, collection: CollectionSlug): boolean;
|
|
36
|
+
/** Where the walk is, as a visitor sees it. */
|
|
37
|
+
export interface WalkLocation {
|
|
38
|
+
/** A human-readable path: `layout[3] › ImageHero › image`. */
|
|
39
|
+
path: string;
|
|
40
|
+
/**
|
|
41
|
+
* The data path in the form the publish checks report: `layout[3].image`.
|
|
42
|
+
* Inside rich text it stays the rich-text field's own path, because nothing
|
|
43
|
+
* inside the editor state is a field the admin can mark.
|
|
44
|
+
*/
|
|
45
|
+
dataPath: string;
|
|
46
|
+
/** Whether the walk is inside a block, and so past any foreign key. */
|
|
47
|
+
viaBlock: boolean;
|
|
48
|
+
/** The outermost `blocks` row the walk is inside: its index and its config. */
|
|
49
|
+
block?: {
|
|
50
|
+
index: number;
|
|
51
|
+
block: Block;
|
|
52
|
+
} | undefined;
|
|
53
|
+
/** The top-level field, or named tab, the walk is under. */
|
|
54
|
+
top?: {
|
|
55
|
+
name: string;
|
|
56
|
+
label?: unknown;
|
|
57
|
+
} | undefined;
|
|
58
|
+
/** Whether the walk is inside rich text. */
|
|
59
|
+
inRichText: boolean;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* What a walk does at each stop. Both are optional; a visitor that implements
|
|
63
|
+
* neither walks the document and learns nothing.
|
|
64
|
+
*/
|
|
65
|
+
export interface WalkVisitor {
|
|
66
|
+
/**
|
|
67
|
+
* Every named field that holds a value, with the data object it sits in.
|
|
68
|
+
* Return `true` to keep the walk out of the value — a relationship that has
|
|
69
|
+
* been read should not be walked as though it were a group.
|
|
70
|
+
*/
|
|
71
|
+
field?: (field: NamedField, value: unknown, siblings: Record<string, unknown>, at: WalkLocation) => boolean | void;
|
|
72
|
+
/** Every Lexical node, at the location of the rich-text field it is in. */
|
|
73
|
+
richTextNode?: (node: Record<string, unknown>, at: WalkLocation) => void;
|
|
74
|
+
}
|
|
75
|
+
export interface WalkDocumentOptions {
|
|
76
|
+
/** As `ReferencesInOptions.blocks`. */
|
|
77
|
+
blocks?: readonly Block[] | ReadonlyMap<string, Block>;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Walks one document's data alongside its field config, calling the visitor at
|
|
81
|
+
* every field and every rich-text node. The structure `referencesIn` and
|
|
82
|
+
* `linkTargetsIn` share: each says what it is looking for, and neither restates
|
|
83
|
+
* how groups, tabs, arrays, blocks and rich text nest.
|
|
84
|
+
*/
|
|
85
|
+
export declare function walkDocument(fields: readonly Field[], data: Record<string, unknown> | undefined, visitor: WalkVisitor, options?: WalkDocumentOptions): void;
|
|
27
86
|
/**
|
|
28
87
|
* Every reference to `collection` inside one document. Pure: it takes the field
|
|
29
88
|
* config and the data and touches nothing, so the whole decision is testable
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"walk.d.ts","sourceRoot":"","sources":["../../src/references/walk.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"walk.d.ts","sourceRoot":"","sources":["../../src/references/walk.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAqD3D,oDAAoD;AACpD,MAAM,WAAW,SAAS;IACxB,+DAA+D;IAC/D,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAA;IACZ;;;;OAIG;IACH,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,2DAA2D;IAC3D,UAAU,EAAE,cAAc,CAAA;IAC1B;;;;OAIG;IACH,MAAM,CAAC,EAAE,SAAS,KAAK,EAAE,GAAG,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;CACvD;AAED,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAUjD;;;;GAIG;AACH,wBAAgB,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAOhE;AAED,yEAAyE;AACzE,wBAAgB,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,cAAc,GAAG,OAAO,CAI1E;AAoBD,+CAA+C;AAC/C,MAAM,WAAW,YAAY;IAC3B,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAA;IACZ;;;;OAIG;IACH,QAAQ,EAAE,MAAM,CAAA;IAChB,uEAAuE;IACvE,QAAQ,EAAE,OAAO,CAAA;IACjB,+EAA+E;IAC/E,KAAK,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,GAAG,SAAS,CAAA;IACnD,4DAA4D;IAC5D,GAAG,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,SAAS,CAAA;IACnD,4CAA4C;IAC5C,UAAU,EAAE,OAAO,CAAA;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;OAIG;IACH,KAAK,CAAC,EAAE,CACN,KAAK,EAAE,UAAU,EACjB,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,EAAE,EAAE,YAAY,KACb,OAAO,GAAG,IAAI,CAAA;IACnB,2EAA2E;IAC3E,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,YAAY,KAAK,IAAI,CAAA;CACzE;AAED,MAAM,WAAW,mBAAmB;IAClC,uCAAuC;IACvC,MAAM,CAAC,EAAE,SAAS,KAAK,EAAE,GAAG,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;CACvD;AAmLD;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,SAAS,KAAK,EAAE,EACxB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EACzC,OAAO,EAAE,WAAW,EACpB,OAAO,GAAE,mBAAwB,GAChC,IAAI,CAON;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,SAAS,KAAK,EAAE,EACxB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EACzC,OAAO,EAAE,mBAAmB,GAC3B,SAAS,EAAE,CA+Bb;AAED,gEAAgE;AAChE,wBAAgB,YAAY,CAC1B,MAAM,EAAE,SAAS,KAAK,EAAE,EACxB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EACzC,OAAO,EAAE,mBAAmB,GAAG;IAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,GACrD,SAAS,EAAE,CAIb;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,EAAE,UAAU,EAAE,cAAc,GAAG,OAAO,CAW5F"}
|
package/dist/references/walk.js
CHANGED
|
@@ -9,7 +9,7 @@ function childrenOf(field) {
|
|
|
9
9
|
* above it. `String({ id: 3 })` is `[object Object]`, which matches nothing and
|
|
10
10
|
* fails open, so the object case is handled rather than coerced.
|
|
11
11
|
*/
|
|
12
|
-
function idOf(value) {
|
|
12
|
+
export function idOf(value) {
|
|
13
13
|
if (typeof value === 'number' || typeof value === 'string')
|
|
14
14
|
return value;
|
|
15
15
|
if (value && typeof value === 'object' && 'id' in value) {
|
|
@@ -63,44 +63,45 @@ function blocksOf(field, registry) {
|
|
|
63
63
|
}
|
|
64
64
|
return own;
|
|
65
65
|
}
|
|
66
|
+
/** `here` one step down into `name`, in both path forms. */
|
|
67
|
+
function into(at, name) {
|
|
68
|
+
return {
|
|
69
|
+
...at,
|
|
70
|
+
path: at.path ? `${at.path} › ${name}` : name,
|
|
71
|
+
dataPath: at.inRichText ? at.dataPath : at.dataPath ? `${at.dataPath}.${name}` : name,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
66
74
|
/**
|
|
67
|
-
* Rich text:
|
|
68
|
-
* block they name. Shape-matched rather than typed against
|
|
69
|
-
* union, because the column was written by whatever editor
|
|
75
|
+
* Rich text: every node goes to the visitor, and `block` / `inlineBlock` nodes
|
|
76
|
+
* are walked as the block they name. Shape-matched rather than typed against
|
|
77
|
+
* Lexical's node union, because the column was written by whatever editor
|
|
78
|
+
* version was current.
|
|
70
79
|
*/
|
|
71
|
-
function walkRichText(value,
|
|
80
|
+
function walkRichText(value, at, walk) {
|
|
72
81
|
if (!value || typeof value !== 'object')
|
|
73
82
|
return;
|
|
74
83
|
if (Array.isArray(value)) {
|
|
75
84
|
for (const entry of value)
|
|
76
|
-
walkRichText(entry,
|
|
85
|
+
walkRichText(entry, at, walk);
|
|
77
86
|
return;
|
|
78
87
|
}
|
|
79
88
|
const node = value;
|
|
80
|
-
|
|
81
|
-
? 'embedded upload'
|
|
82
|
-
: node['type'] === 'relationship'
|
|
83
|
-
? 'embedded link'
|
|
84
|
-
: undefined;
|
|
85
|
-
if (embedded && node['relationTo'] === ctx.collection) {
|
|
86
|
-
const id = idOf(node['value']);
|
|
87
|
-
if (id !== undefined)
|
|
88
|
-
ctx.out.push({ id, path: `${path} › ${embedded}`, viaBlock });
|
|
89
|
-
}
|
|
89
|
+
walk.visitor.richTextNode?.(node, at);
|
|
90
90
|
if (node['type'] === 'block' || node['type'] === 'inlineBlock') {
|
|
91
91
|
const fields = node['fields'];
|
|
92
92
|
const slug = typeof fields?.['blockType'] === 'string' ? fields['blockType'] : undefined;
|
|
93
|
-
const block = slug ?
|
|
93
|
+
const block = slug ? walk.registry.get(slug) : undefined;
|
|
94
94
|
// An unknown block is skipped rather than guessed at, as in a `blocks` field.
|
|
95
|
-
if (block && fields)
|
|
96
|
-
walkFields(block.fields, fields, `${path} › ${block.slug}`, true,
|
|
95
|
+
if (block && fields) {
|
|
96
|
+
walkFields(block.fields, fields, { ...at, path: `${at.path} › ${block.slug}`, viaBlock: true, inRichText: true }, walk);
|
|
97
|
+
}
|
|
97
98
|
}
|
|
98
99
|
for (const key of ['root', 'children']) {
|
|
99
100
|
if (key in node)
|
|
100
|
-
walkRichText(node[key],
|
|
101
|
+
walkRichText(node[key], at, walk);
|
|
101
102
|
}
|
|
102
103
|
}
|
|
103
|
-
function walkFields(fields, data,
|
|
104
|
+
function walkFields(fields, data, at, walk) {
|
|
104
105
|
if (!data)
|
|
105
106
|
return;
|
|
106
107
|
for (const field of fields) {
|
|
@@ -109,46 +110,53 @@ function walkFields(fields, data, path, viaBlock, ctx) {
|
|
|
109
110
|
if (field.type === 'tabs' && 'tabs' in field && Array.isArray(field.tabs)) {
|
|
110
111
|
for (const tab of field.tabs) {
|
|
111
112
|
const named = 'name' in tab && typeof tab.name === 'string' ? tab.name : undefined;
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
113
|
+
if (!named) {
|
|
114
|
+
walkFields(tab.fields, data, at, walk);
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
const here = into(at, named);
|
|
118
|
+
walkFields(tab.fields, data[named], { ...here, top: at.top ?? { name: named, label: tab.label } }, walk);
|
|
115
119
|
}
|
|
116
120
|
continue;
|
|
117
121
|
}
|
|
118
|
-
walkFields(childrenOf(field), data,
|
|
122
|
+
walkFields(childrenOf(field), data, at, walk);
|
|
119
123
|
continue;
|
|
120
124
|
}
|
|
121
125
|
const value = data[field.name];
|
|
122
126
|
if (value === undefined || value === null)
|
|
123
127
|
continue;
|
|
124
|
-
const here =
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
+
const here = {
|
|
129
|
+
...into(at, field.name),
|
|
130
|
+
top: at.top ?? { name: field.name, label: field.label },
|
|
131
|
+
};
|
|
132
|
+
if (walk.visitor.field?.(field, value, data, here) === true)
|
|
128
133
|
continue;
|
|
129
|
-
}
|
|
130
134
|
switch (field.type) {
|
|
131
135
|
case 'richText':
|
|
132
|
-
walkRichText(value, here,
|
|
136
|
+
walkRichText(value, here, walk);
|
|
133
137
|
break;
|
|
134
138
|
case 'group':
|
|
135
|
-
walkFields(childrenOf(field), value, here,
|
|
139
|
+
walkFields(childrenOf(field), value, here, walk);
|
|
136
140
|
break;
|
|
137
141
|
case 'array':
|
|
138
142
|
if (Array.isArray(value)) {
|
|
139
143
|
value.forEach((row, index) => {
|
|
140
|
-
walkFields(childrenOf(field), row,
|
|
144
|
+
walkFields(childrenOf(field), row, {
|
|
145
|
+
...here,
|
|
146
|
+
path: `${here.path}[${index}]`,
|
|
147
|
+
dataPath: here.inRichText ? here.dataPath : `${here.dataPath}[${index}]`,
|
|
148
|
+
}, walk);
|
|
141
149
|
});
|
|
142
150
|
}
|
|
143
151
|
break;
|
|
144
152
|
case 'blocks': {
|
|
145
153
|
if (!Array.isArray(value))
|
|
146
154
|
break;
|
|
147
|
-
const own = blocksOf(field,
|
|
155
|
+
const own = blocksOf(field, walk.registry);
|
|
148
156
|
value.forEach((row, index) => {
|
|
149
157
|
const entry = row;
|
|
150
158
|
const slug = typeof entry['blockType'] === 'string' ? entry['blockType'] : undefined;
|
|
151
|
-
const block = slug ? (own.get(slug) ??
|
|
159
|
+
const block = slug ? (own.get(slug) ?? walk.registry.get(slug)) : undefined;
|
|
152
160
|
/*
|
|
153
161
|
A row whose `blockType` names no known block is skipped rather than
|
|
154
162
|
guessed at: the config and the data disagree, and inventing a field
|
|
@@ -156,7 +164,13 @@ function walkFields(fields, data, path, viaBlock, ctx) {
|
|
|
156
164
|
*/
|
|
157
165
|
if (!block)
|
|
158
166
|
return;
|
|
159
|
-
walkFields(block.fields, entry,
|
|
167
|
+
walkFields(block.fields, entry, {
|
|
168
|
+
...here,
|
|
169
|
+
path: `${here.path}[${index}] › ${block.slug}`,
|
|
170
|
+
dataPath: here.inRichText ? here.dataPath : `${here.dataPath}[${index}]`,
|
|
171
|
+
viaBlock: true,
|
|
172
|
+
block: here.block ?? { index, block },
|
|
173
|
+
}, walk);
|
|
160
174
|
});
|
|
161
175
|
break;
|
|
162
176
|
}
|
|
@@ -172,6 +186,15 @@ function registryOf(blocks) {
|
|
|
172
186
|
return blocks;
|
|
173
187
|
return new Map(blocks.map((block) => [block.slug, block]));
|
|
174
188
|
}
|
|
189
|
+
/**
|
|
190
|
+
* Walks one document's data alongside its field config, calling the visitor at
|
|
191
|
+
* every field and every rich-text node. The structure `referencesIn` and
|
|
192
|
+
* `linkTargetsIn` share: each says what it is looking for, and neither restates
|
|
193
|
+
* how groups, tabs, arrays, blocks and rich text nest.
|
|
194
|
+
*/
|
|
195
|
+
export function walkDocument(fields, data, visitor, options = {}) {
|
|
196
|
+
walkFields(fields, data, { path: '', dataPath: '', viaBlock: false, inRichText: false }, { registry: registryOf(options.blocks), visitor });
|
|
197
|
+
}
|
|
175
198
|
/**
|
|
176
199
|
* Every reference to `collection` inside one document. Pure: it takes the field
|
|
177
200
|
* config and the data and touches nothing, so the whole decision is testable
|
|
@@ -179,11 +202,30 @@ function registryOf(blocks) {
|
|
|
179
202
|
*/
|
|
180
203
|
export function referencesIn(fields, data, options) {
|
|
181
204
|
const out = [];
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
205
|
+
const { collection } = options;
|
|
206
|
+
walkDocument(fields, data, {
|
|
207
|
+
field(field, value, _siblings, at) {
|
|
208
|
+
if (!pointsAt(field, collection))
|
|
209
|
+
return false;
|
|
210
|
+
for (const id of idsIn(value, collection)) {
|
|
211
|
+
out.push({ id, path: at.path, viaBlock: at.viaBlock });
|
|
212
|
+
}
|
|
213
|
+
return true;
|
|
214
|
+
},
|
|
215
|
+
richTextNode(node, at) {
|
|
216
|
+
const embedded = node['type'] === 'upload'
|
|
217
|
+
? 'embedded upload'
|
|
218
|
+
: node['type'] === 'relationship'
|
|
219
|
+
? 'embedded link'
|
|
220
|
+
: undefined;
|
|
221
|
+
if (!embedded || node['relationTo'] !== collection)
|
|
222
|
+
return;
|
|
223
|
+
const id = idOf(node['value']);
|
|
224
|
+
if (id !== undefined) {
|
|
225
|
+
out.push({ id, path: `${at.path} › ${embedded}`, viaBlock: at.viaBlock });
|
|
226
|
+
}
|
|
227
|
+
},
|
|
228
|
+
}, options);
|
|
187
229
|
return out;
|
|
188
230
|
}
|
|
189
231
|
/** The references to one document, comparing ids as strings. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"walk.js","sourceRoot":"","sources":["../../src/references/walk.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"walk.js","sourceRoot":"","sources":["../../src/references/walk.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forumone/throughline",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.0-next-332baf9",
|
|
4
4
|
"description": "Throughline: an editorial platform for Payload CMS. Publishing, approvals, audit, integrations, email and jobs, with every feature reachable over MCP.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -166,7 +166,7 @@
|
|
|
166
166
|
"dependencies": {
|
|
167
167
|
"zod": "^3.23.0",
|
|
168
168
|
"zod-to-json-schema": "^3.25.2",
|
|
169
|
-
"@forumone/throughline-design-system": "2.
|
|
169
|
+
"@forumone/throughline-design-system": "2.2.0-next-332baf9"
|
|
170
170
|
},
|
|
171
171
|
"devDependencies": {
|
|
172
172
|
"@payloadcms/db-sqlite": "^3.83.0",
|
|
@@ -189,7 +189,7 @@
|
|
|
189
189
|
"typescript": "^5.6.0",
|
|
190
190
|
"vitest": "^4.1.10",
|
|
191
191
|
"@forumone/throughline-eslint-config": "0.0.1",
|
|
192
|
-
"@forumone/throughline-reference-ds": "0.3.
|
|
192
|
+
"@forumone/throughline-reference-ds": "0.3.22-next-332baf9",
|
|
193
193
|
"@forumone/throughline-tsconfig": "0.0.1"
|
|
194
194
|
},
|
|
195
195
|
"scripts": {
|