@aeptus/aexeo-emdash 0.8.19 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +96 -2
- package/INSTALL.md +113 -4
- package/README.md +12 -5
- package/dist/adapter.d.ts +30 -2
- package/dist/adapter.d.ts.map +1 -1
- package/dist/admin.d.ts.map +1 -1
- package/dist/admin.js +2 -2
- package/dist/configured.d.ts +6 -0
- package/dist/configured.d.ts.map +1 -1
- package/dist/configured.js +505 -70
- package/dist/content-evaluator.d.ts +14 -0
- package/dist/content-evaluator.d.ts.map +1 -0
- package/dist/content.d.ts +51 -0
- package/dist/content.d.ts.map +1 -0
- package/dist/content.js +365 -0
- package/dist/data-route.d.ts +3 -0
- package/dist/data-route.d.ts.map +1 -1
- package/dist/evaluator-sandbox.d.ts +1 -1
- package/dist/evaluator-sandbox.d.ts.map +1 -1
- package/dist/evaluator.d.ts +1 -1
- package/dist/evaluator.d.ts.map +1 -1
- package/dist/findings-view.d.ts +7 -2
- package/dist/findings-view.d.ts.map +1 -1
- package/dist/index.d.ts +15 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +99 -4
- package/dist/inventory.d.ts +51 -0
- package/dist/inventory.d.ts.map +1 -0
- package/dist/plugin.d.ts +30 -3
- package/dist/plugin.d.ts.map +1 -1
- package/dist/presence-check.d.ts +1 -0
- package/dist/presence-check.d.ts.map +1 -1
- package/dist/sandbox-entry.d.ts +2 -1
- package/dist/sandbox-entry.d.ts.map +1 -1
- package/dist/sandbox-entry.js +366 -81
- package/dist/sandbox.d.ts +2 -2
- package/dist/sidecar-url.d.ts.map +1 -1
- package/dist/sidecar.d.ts +7 -1
- package/dist/sidecar.d.ts.map +1 -1
- package/dist/types.d.ts +11 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/wasm-init.d.ts +4 -0
- package/dist/wasm-init.d.ts.map +1 -1
- package/package.json +18 -7
- package/wasm/aexeo_emdash_bridge.d.ts +11 -0
- package/wasm/aexeo_emdash_bridge.js +1 -1
- package/wasm/aexeo_emdash_bridge_bg.d.ts +11 -0
- package/wasm/aexeo_emdash_bridge_bg.js +68 -0
- package/wasm/aexeo_emdash_bridge_bg.wasm +0 -0
- package/wasm/aexeo_emdash_bridge_bg.wasm.d.ts +2 -0
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,102 @@ All notable changes to `@aeptus/aexeo-emdash` are listed here.
|
|
|
4
4
|
The format follows [Keep a Changelog](https://keepachangelog.com/),
|
|
5
5
|
and the project follows [Semantic Versioning](https://semver.org/).
|
|
6
6
|
|
|
7
|
+
## [Unreleased]
|
|
8
|
+
|
|
9
|
+
## [0.9.0] - 2026-11-10
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- Portable content presets with per-collection selection, typed body capabilities and explicit incomplete results.
|
|
14
|
+
- Ordered mappings for multiple content fields and custom blocks, including nested repeats and heading levels, in configured and sandboxed modes.
|
|
15
|
+
- Conservative CMS link inventory export, source locations and aggregate content coverage telemetry.
|
|
16
|
+
- The configured dashboard reports evaluator failures without breaking the editor and tolerates older findings without secondary layers.
|
|
17
|
+
|
|
18
|
+
### Compatibility
|
|
19
|
+
|
|
20
|
+
- Supports EmDash `^1.2.0`. Deploy the matching sidecar when using sandboxed mode.
|
|
21
|
+
- The intelligence widget reports facts and blockers instead of the removed composite score.
|
|
22
|
+
- Existing site and CLI checks remain separate from optional content presets.
|
|
23
|
+
|
|
24
|
+
### Changed
|
|
25
|
+
|
|
26
|
+
- **The dashboard widget no longer shows a composite score.** The "Overall"
|
|
27
|
+
stat and the "Site score is N — below the 60 quality threshold" banner are
|
|
28
|
+
gone; blockers remain the call to action. `SiteIntelligenceScore` loses
|
|
29
|
+
`overall_score`, `answer_pack_score` and `elapsed_us` and gains
|
|
30
|
+
`answer_pack`, and `citation_readiness_score` and `truth_consistency_score`
|
|
31
|
+
may now be `null`, shown as "unknown", when nothing was measured.
|
|
32
|
+
- **Entity presence resolves the newest Common Crawl index at runtime** from
|
|
33
|
+
`collinfo.json` instead of a pinned crawl, so a site first crawled after a
|
|
34
|
+
plugin release is no longer reported `not_found`. Failing to resolve the
|
|
35
|
+
index reports `unreachable`.
|
|
36
|
+
- Support EmDash `^1.2.0` and run the plugin-host integration coverage against
|
|
37
|
+
EmDash `1.2.0`.
|
|
38
|
+
|
|
39
|
+
### Added
|
|
40
|
+
|
|
41
|
+
- **The sandboxed plugin warns when its sidecar is on another version.** The
|
|
42
|
+
Worker reports its version in the `x-aexeo-version` response header, and the
|
|
43
|
+
plugin logs a warning when it differs, since a Worker left behind on an upgrade
|
|
44
|
+
keeps evaluating with older rules.
|
|
45
|
+
|
|
46
|
+
### Security
|
|
47
|
+
|
|
48
|
+
- **EVAL_TOKEN never falls back to plaintext.** When the host cannot encrypt
|
|
49
|
+
the token (usually `EMDASH_ENCRYPTION_KEY` is unset), the Setup page now shows
|
|
50
|
+
an error and changes nothing, where it used to store the token in plaintext KV
|
|
51
|
+
with only a log line. **Behaviour change:** on such a host, saving the Setup
|
|
52
|
+
form fails until the key is set, even for a URL-only change. A token already
|
|
53
|
+
in KV keeps working, and the Setup page says it is unencrypted.
|
|
54
|
+
- **A rotated token is no longer ignored.** Reads preferred settings, so a token
|
|
55
|
+
that fell back to KV during a rotation lost to the older one in settings. A KV
|
|
56
|
+
token is always the newer of the two, and is now read first.
|
|
57
|
+
- **The Setup form rejects trailing-dot hosts** such as `https://localhost./`,
|
|
58
|
+
which passed the loopback check.
|
|
59
|
+
|
|
60
|
+
### Changed
|
|
61
|
+
|
|
62
|
+
- **`aexeo-crawl-worker` upgrade notes.** The Worker refuses every request when
|
|
63
|
+
`EVAL_TOKEN` is shorter than 32 characters, so rotate a shorter token before
|
|
64
|
+
redeploying. It answers `413` above 8 MiB, the limit of emdash's sandbox
|
|
65
|
+
bridge. Malformed bodies and initialization failures now return JSON errors, and
|
|
66
|
+
token comparison is constant-time. It is built with Wrangler 4 and a newer
|
|
67
|
+
compatibility date.
|
|
68
|
+
- **Editors can read findings.** The configured plugin's `admin` and `data`
|
|
69
|
+
routes declare `plugins:read`; emdash otherwise requires `plugins:manage`.
|
|
70
|
+
Refresh, facts and presence stay admin-only, and the `admin` route refuses
|
|
71
|
+
`refresh_findings` for non-admins. The sandboxed entry stays admin-only because
|
|
72
|
+
its `admin` route also saves the Setup form.
|
|
73
|
+
- **The configured plugin declares its network use**: `network:request` and the
|
|
74
|
+
presence sources' hosts, which it was using while declaring only `content:read`.
|
|
75
|
+
|
|
76
|
+
### Fixed
|
|
77
|
+
|
|
78
|
+
- **Concurrent writes no longer lose newer data.** A save older than the stored
|
|
79
|
+
revision is ignored, a slow evaluation does not overwrite the findings of a
|
|
80
|
+
later save or delete, and a Refresh does not overwrite a save that landed during
|
|
81
|
+
the sweep or remove a document created during it.
|
|
82
|
+
- **Deleted content leaves the findings immediately**, through a
|
|
83
|
+
`content:afterDelete` hook, including when it is only trashed. Restoring an
|
|
84
|
+
entry brings it back at its next save or Refresh.
|
|
85
|
+
- **Legacy `document:` entries are removed** by a Refresh that does not see their
|
|
86
|
+
route. They record no collection, so they were previously never removed.
|
|
87
|
+
- **The sandboxed score widget reports the score as unavailable** instead of a
|
|
88
|
+
score of 0, which read as a measured result.
|
|
89
|
+
- **Entity presence no longer reports false results.** Common Crawl searches the
|
|
90
|
+
whole domain, where an exact-URL match reported a site absent when the crawl
|
|
91
|
+
skipped only its home page. Wikipedia and Wikidata records must name the entity
|
|
92
|
+
or a declared alias, ignoring legal forms; a substring used to count, so
|
|
93
|
+
"Pineapple" matched "Apple".
|
|
94
|
+
- **Saving a document no longer reports false site-graph findings or erases
|
|
95
|
+
real ones.** A save evaluates one document as a one-page site, so every
|
|
96
|
+
internal link was reported as broken (`LNK001`) and the page as an orphan
|
|
97
|
+
(`LNK002`), and those results replaced the route's stored findings until the
|
|
98
|
+
next Refresh. Rules that depend on other documents (`LNK001`-`LNK004`,
|
|
99
|
+
`SEO009`, `SEO012`, `SEO016`, `SEO017`, `CNT005`) are now computed by Refresh
|
|
100
|
+
only: a save keeps the route's stored findings for them, so a link fixed or
|
|
101
|
+
added in that save is reflected at the next Refresh.
|
|
102
|
+
|
|
7
103
|
## [0.8.19] - 2026-09-29
|
|
8
104
|
|
|
9
105
|
Updates the EmDash integration to the current plugin and content APIs, and
|
|
@@ -126,8 +222,6 @@ version, since 0.8.19 had never been published.
|
|
|
126
222
|
`deploy`, and only the two declaration files remain tracked. The package
|
|
127
223
|
also gains a README, which it did not have.
|
|
128
224
|
|
|
129
|
-
## [Unreleased]
|
|
130
|
-
|
|
131
225
|
## [0.8.18] - 2026-09-28
|
|
132
226
|
|
|
133
227
|
### Added
|
package/INSTALL.md
CHANGED
|
@@ -5,6 +5,84 @@ site. Findings show up as a Block Kit admin page; a sidebar widget
|
|
|
5
5
|
shows the site's current intelligence score; saves auto-evaluate the
|
|
6
6
|
changed document.
|
|
7
7
|
|
|
8
|
+
## Restricting content presets to specific collections
|
|
9
|
+
|
|
10
|
+
Content presets apply to all evaluated collections by default. Set
|
|
11
|
+
`contentPreset.collections` to select only the collections that use the preset;
|
|
12
|
+
existing site checks continue to run on all configured collections. Use
|
|
13
|
+
`byCollection` to choose an alternate preset for a selected collection.
|
|
14
|
+
For example:
|
|
15
|
+
|
|
16
|
+
```js
|
|
17
|
+
aexeoPlugin({
|
|
18
|
+
contentPreset: {
|
|
19
|
+
name: "article",
|
|
20
|
+
collections: ["blog_posts", "glossary_terms"],
|
|
21
|
+
byCollection: { glossary_terms: "glossary" },
|
|
22
|
+
},
|
|
23
|
+
})
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Content coverage
|
|
27
|
+
|
|
28
|
+
Portable Text bodies provide text, headings, paragraphs and links to content
|
|
29
|
+
presets. A plain text body provides text only. EmDash custom blocks are
|
|
30
|
+
project-specific; their flattened text is available to the legacy site audit,
|
|
31
|
+
but content-preset gates that require body capabilities are reported as
|
|
32
|
+
`not_checked` until a faithful mapping is provided. The configured plugin
|
|
33
|
+
returns `content_preset_incomplete` for such a report, preserving its existing
|
|
34
|
+
fail-closed behavior. This avoids treating unobserved headings, paragraphs or
|
|
35
|
+
links as absent. An explicitly empty body
|
|
36
|
+
is distinct from an unavailable body. When an entry has several candidate
|
|
37
|
+
content fields, the default first-field projection remains unverified because
|
|
38
|
+
it cannot establish which fields appear in the rendered page.
|
|
39
|
+
|
|
40
|
+
For custom blocks in configured mode, declare the ordered rendered content
|
|
41
|
+
fields for each block type in the plugin configuration:
|
|
42
|
+
|
|
43
|
+
```js
|
|
44
|
+
aexeoPlugin({
|
|
45
|
+
contentFieldsByCollection: { pages: ["introduction", "sections"] },
|
|
46
|
+
blockMappings: {
|
|
47
|
+
hero: [
|
|
48
|
+
{ kind: "heading", field: "headline" },
|
|
49
|
+
{ kind: "paragraph", field: "description", optional: true },
|
|
50
|
+
{ kind: "link", field: "linkLabel", hrefField: "linkUrl", optional: true },
|
|
51
|
+
{ kind: "richText", field: "body" },
|
|
52
|
+
],
|
|
53
|
+
faq: [
|
|
54
|
+
{ kind: "heading", field: "heading" },
|
|
55
|
+
{ kind: "repeat", field: "faqs", fields: [
|
|
56
|
+
{ kind: "heading", field: "question", level: 3 },
|
|
57
|
+
{ kind: "paragraph", field: "answer" },
|
|
58
|
+
] },
|
|
59
|
+
],
|
|
60
|
+
},
|
|
61
|
+
})
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
`contentFieldsByCollection` declares the body fields rendered by each selected
|
|
65
|
+
collection, in order. It is an explicit assertion of completeness, so include
|
|
66
|
+
all rendered fields; entries without any selected field remain unavailable.
|
|
67
|
+
In sandboxed mode, enter this object in `Content fields by collection (JSON)`.
|
|
68
|
+
|
|
69
|
+
A block mapping is the site's assertion that those fields cover the rendered content,
|
|
70
|
+
in order. `richText` accepts Portable Text arrays and preserves their headings
|
|
71
|
+
and links; `heading` defaults to h2 and accepts levels 1 through 6. `repeat`
|
|
72
|
+
maps each item in an array;
|
|
73
|
+
`optional: true` permits an absent field without inventing content. Every
|
|
74
|
+
encountered block type must be
|
|
75
|
+
mapped and every mapped field must have the expected type. If not, capabilities
|
|
76
|
+
remain unverified. These options apply to configured-mode saves and both
|
|
77
|
+
refresh routes. In sandboxed mode, enter the same JSON object in the plugin
|
|
78
|
+
settings field `Custom block mappings (JSON)`; it applies to save and Refresh.
|
|
79
|
+
Invalid or unavailable settings leave custom blocks unverified.
|
|
80
|
+
|
|
81
|
+
Adapters supplying an `EmdashDocument` can set `body_capabilities` to a subset
|
|
82
|
+
of `text`, `headings`, `paragraphs` and `links`. Omit it only when all four
|
|
83
|
+
are faithfully represented. These capability declarations describe input
|
|
84
|
+
coverage; they do not validate the content itself.
|
|
85
|
+
|
|
8
86
|
## Two install paths
|
|
9
87
|
|
|
10
88
|
The package exports two factories:
|
|
@@ -31,8 +109,8 @@ when it's actually needed.
|
|
|
31
109
|
(`@astrojs/cloudflare` + `@emdash-cms/cloudflare`'s `sandbox()`
|
|
32
110
|
runner is fine — sandboxed plugins use Worker Loader, configured
|
|
33
111
|
plugins don't, but both adapters import cleanly).
|
|
34
|
-
- EmDash
|
|
35
|
-
|
|
112
|
+
- EmDash `^1.2.0` as a peer dependency. The integration coverage targets
|
|
113
|
+
`1.2.0` with EmDash's official plugin test host.
|
|
36
114
|
|
|
37
115
|
### Install
|
|
38
116
|
|
|
@@ -371,8 +449,10 @@ Node adapter.
|
|
|
371
449
|
evaluated document under `document:<route>`.
|
|
372
450
|
- **Auto-evaluate on save**: emdash's `content:afterSave` hook fires
|
|
373
451
|
for each save, re-evaluates that one document, and updates its
|
|
374
|
-
KV findings entry.
|
|
375
|
-
the next
|
|
452
|
+
KV findings entry. Findings that depend on other documents, such as
|
|
453
|
+
broken internal links, keep their last Refresh result until the next
|
|
454
|
+
Refresh. The dashboard widget reflects the new score on the next page
|
|
455
|
+
load.
|
|
376
456
|
|
|
377
457
|
## Architecture in one paragraph
|
|
378
458
|
|
|
@@ -386,3 +466,32 @@ itself is the same `aexeo-emdash-bridge` Rust crate that powers the
|
|
|
386
466
|
Aexeo CLI; it's compiled to WebAssembly via wasm-pack and imported
|
|
387
467
|
by the host's bundler (Vite + `vite-plugin-wasm`). No separate
|
|
388
468
|
service, no sidecar, no auth token.
|
|
469
|
+
|
|
470
|
+
### Exporting a conservative link inventory
|
|
471
|
+
|
|
472
|
+
For host code with access to EmDash's content API, the package exports
|
|
473
|
+
`exportLinkInventory(content, options)`. Select the collections belonging to
|
|
474
|
+
one publication explicitly and supply the observed site identity:
|
|
475
|
+
|
|
476
|
+
```ts
|
|
477
|
+
import { exportLinkInventory } from "@aeptus/aexeo-emdash";
|
|
478
|
+
|
|
479
|
+
const result = await exportLinkInventory(ctx.content, {
|
|
480
|
+
collections: ["blog_posts", "pages"],
|
|
481
|
+
identity: { origin: "https://example.org", release: "release-id", surface: "public", snapshot: "snapshot-id" },
|
|
482
|
+
});
|
|
483
|
+
// result.inventory matches the link-graph input's inventory shape.
|
|
484
|
+
// Inspect result.issues and result.omitted before using it.
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
The export resolves public URLs through EmDash and paginates each selected
|
|
488
|
+
collection. Entries without public URLs are reported as omitted, and entries
|
|
489
|
+
with URLs default to `unknown` disposition. A host may supply `classify` when
|
|
490
|
+
it has authoritative indexability and alias information. Repeated or missing
|
|
491
|
+
cursors, failures, and page limits are reported. The inventory is always marked
|
|
492
|
+
incomplete because pagination alone cannot establish a transactional snapshot or
|
|
493
|
+
include routes outside the chosen collections. No HTTP endpoint is installed by
|
|
494
|
+
this API. It cannot by itself establish that a crawl and CMS view describe the
|
|
495
|
+
same publication, release and point in time.
|
|
496
|
+
|
|
497
|
+
An optional `onTelemetry` callback receives only elapsed milliseconds and aggregate counts. It is disabled by default and does not receive URLs or content.
|
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Aexeo SEO/GEO content evaluator as an emdash plugin.
|
|
4
4
|
|
|
5
5
|
Adds a Findings admin page, per-document panel, and dashboard
|
|
6
|
-
intelligence
|
|
6
|
+
intelligence facts widget to an emdash site. Saves auto-evaluate the
|
|
7
7
|
changed document; the Refresh button re-evaluates the whole site.
|
|
8
8
|
|
|
9
9
|
## Install
|
|
@@ -43,18 +43,25 @@ troubleshooting list, see [INSTALL.md](./INSTALL.md).
|
|
|
43
43
|
- **Findings page** at `/_emdash/admin/plugins/aexeo-emdash/findings`:
|
|
44
44
|
rule violations across the site, filterable by severity.
|
|
45
45
|
- **Document panel** at `/document`: findings scoped to one document.
|
|
46
|
-
- **Dashboard widget**:
|
|
47
|
-
|
|
46
|
+
- **Dashboard widget**: citation readiness, truth consistency and answer
|
|
47
|
+
structure side by side, with the top blockers. There is no composite score
|
|
48
|
+
or quality threshold, and a dimension with nothing to measure reads
|
|
49
|
+
`unknown`.
|
|
50
|
+
- **Entity presence**: Wikipedia is searched on `en.wikipedia.org` only, so
|
|
51
|
+
`not_found` says nothing about other language editions.
|
|
48
52
|
- **Refresh button**: re-evaluate every document in the configured
|
|
49
53
|
collections (`posts`, `pages` by default).
|
|
50
54
|
- **Auto-evaluate on save**: EmDash's `content:afterSave` hook evaluates
|
|
51
55
|
the saved document and updates its findings. Sandboxed installs need a
|
|
52
56
|
configured evaluator sidecar; configured installs run evaluation in-process.
|
|
57
|
+
Findings that depend on other documents (broken and weak internal links,
|
|
58
|
+
inbound links, hreflang targets, shared canonicals, duplicate metadata and
|
|
59
|
+
text) stay as the last Refresh stored them until the next Refresh.
|
|
53
60
|
|
|
54
61
|
## Compatibility
|
|
55
62
|
|
|
56
|
-
- EmDash
|
|
57
|
-
- Runtime integration coverage targets EmDash `
|
|
63
|
+
- EmDash `^1.2.0` (peer dependency; current supported range)
|
|
64
|
+
- Runtime integration coverage targets EmDash `1.2.0` via the official
|
|
58
65
|
`@emdash-cms/plugin-test` host.
|
|
59
66
|
- Cloudflare Workers via `@astrojs/cloudflare`. The plugin uses
|
|
60
67
|
Cloudflare-specific APIs and silently no-ops on the Node adapter.
|
package/dist/adapter.d.ts
CHANGED
|
@@ -1,10 +1,34 @@
|
|
|
1
1
|
import type { EmdashDocument } from "./types.js";
|
|
2
|
+
/** Ordered fields that the host declares constitute a custom block's content. */
|
|
3
|
+
export type CustomBlockField = {
|
|
4
|
+
kind: "paragraph" | "richText";
|
|
5
|
+
field: string;
|
|
6
|
+
optional?: boolean;
|
|
7
|
+
} | {
|
|
8
|
+
kind: "heading";
|
|
9
|
+
field: string;
|
|
10
|
+
level?: 1 | 2 | 3 | 4 | 5 | 6;
|
|
11
|
+
optional?: boolean;
|
|
12
|
+
} | {
|
|
13
|
+
kind: "link";
|
|
14
|
+
field: string;
|
|
15
|
+
hrefField: string;
|
|
16
|
+
optional?: boolean;
|
|
17
|
+
} | {
|
|
18
|
+
kind: "repeat";
|
|
19
|
+
field: string;
|
|
20
|
+
fields: readonly CustomBlockField[];
|
|
21
|
+
optional?: boolean;
|
|
22
|
+
};
|
|
23
|
+
export type CustomBlockMappings = Record<string, readonly CustomBlockField[]>;
|
|
2
24
|
export interface EmdashContentItem {
|
|
3
25
|
id: string;
|
|
4
26
|
type: string;
|
|
5
27
|
slug: string | null;
|
|
6
28
|
status: string;
|
|
7
29
|
locale: string | null;
|
|
30
|
+
/** Host write timestamp. Orders concurrent saves and Refresh sweeps. */
|
|
31
|
+
updatedAt?: string;
|
|
8
32
|
translationGroup?: string | null;
|
|
9
33
|
data: Record<string, unknown>;
|
|
10
34
|
seo?: {
|
|
@@ -21,6 +45,8 @@ export interface EmdashContentMeta {
|
|
|
21
45
|
title: string;
|
|
22
46
|
/** Exact URL returned by EmDash, or null when this entry has no public route. */
|
|
23
47
|
publicUrl: string | null;
|
|
48
|
+
/** The host's `updatedAt` for the row this entry was adapted from. */
|
|
49
|
+
updatedAt?: string;
|
|
24
50
|
}
|
|
25
51
|
export interface ContentUrlApi {
|
|
26
52
|
getPublicUrl(collection: string, id: string): Promise<string | null>;
|
|
@@ -44,16 +70,18 @@ export interface AdaptedContent {
|
|
|
44
70
|
* accounts for collection URL patterns, locale prefixes, and slash policy;
|
|
45
71
|
* slug-derived paths are not equivalent to the site's actual public URLs.
|
|
46
72
|
*/
|
|
47
|
-
export declare function adaptContentItemWithContext(content: EmdashContentItem, contentApi: ContentUrlApi, defaultLocale?: string): Promise<AdaptedContent>;
|
|
73
|
+
export declare function adaptContentItemWithContext(content: EmdashContentItem, contentApi: ContentUrlApi, defaultLocale?: string, blockMappings?: CustomBlockMappings, contentFields?: readonly string[]): Promise<AdaptedContent>;
|
|
48
74
|
/**
|
|
49
75
|
* Synchronous adapter for callers that do not have a host content API.
|
|
50
76
|
* It deliberately uses a stable identity route; callers should use
|
|
51
77
|
* adaptContentItemWithContext whenever EmDash can resolve the public URL.
|
|
52
78
|
*/
|
|
53
|
-
export declare function contentItemToEmdashDocument(content: EmdashContentItem): EmdashDocument;
|
|
79
|
+
export declare function contentItemToEmdashDocument(content: EmdashContentItem, blockMappings?: CustomBlockMappings): EmdashDocument;
|
|
54
80
|
export declare function adaptContentItem(content: EmdashContentItem, options?: {
|
|
55
81
|
route?: string;
|
|
56
82
|
publicUrl?: string | null;
|
|
57
83
|
defaultLocale?: string;
|
|
84
|
+
blockMappings?: CustomBlockMappings | undefined;
|
|
85
|
+
contentFields?: readonly string[];
|
|
58
86
|
}): AdaptedContent;
|
|
59
87
|
//# sourceMappingURL=adapter.d.ts.map
|
package/dist/adapter.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAqB,MAAM,YAAY,CAAC;AAEpE,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,GAAG,CAAC,EAAE;QACJ,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KAC3B,CAAC;CACH;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,iFAAiF;IACjF,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
|
package/dist/admin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../src/admin.tsx"],"names":[],"mappings":"AAkBA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,eAAO,MAAM,KAAK
|
|
1
|
+
{"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../src/admin.tsx"],"names":[],"mappings":"AAkBA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,eAAO,MAAM,KAAK;IAEhB,iBAAiB;IACjB,aAAa;IACb,gBAAgB;IAChB,oBAAoB;IACpB,gBAAgB;IAIhB,WAAW;IAGX,QAAQ;CACT,CAAC"}
|
package/dist/admin.js
CHANGED
|
@@ -163,7 +163,7 @@ function PillarView({
|
|
|
163
163
|
/* @__PURE__ */ jsx(SeverityBadge, { severity: finding.severity }),
|
|
164
164
|
/* @__PURE__ */ jsx("code", { className: "font-mono text-xs", children: finding.rule_id }),
|
|
165
165
|
/* @__PURE__ */ jsx("span", { className: "flex-1", children: finding.message }),
|
|
166
|
-
finding.layers?.secondaries
|
|
166
|
+
finding.layers?.secondaries?.length ? /* @__PURE__ */ jsx(SecondariesChips, { layers: finding.layers.secondaries }) : null
|
|
167
167
|
] }, i)) })
|
|
168
168
|
] }),
|
|
169
169
|
findings.length === 0 ? sitewide.length === 0 ? /* @__PURE__ */ jsx("p", { className: "text-sm text-kumo-subtle", children: "All clean on this layer." }) : null : /* @__PURE__ */ jsx("div", { className: "overflow-x-auto rounded border border-kumo-line", children: /* @__PURE__ */ jsxs("table", { className: "w-full text-left text-sm", children: [
|
|
@@ -181,7 +181,7 @@ function PillarView({
|
|
|
181
181
|
/* @__PURE__ */ jsx("td", { className: "px-3 py-2 align-top", children: /* @__PURE__ */ jsx("code", { className: "rounded bg-kumo-tint px-1.5 py-0.5 font-mono text-xs", children: finding.rule_id }) }),
|
|
182
182
|
/* @__PURE__ */ jsx("td", { className: "px-3 py-2 align-top", children: /* @__PURE__ */ jsx(SeverityBadge, { severity: finding.severity }) }),
|
|
183
183
|
/* @__PURE__ */ jsx("td", { className: "px-3 py-2 align-top", children: finding.message }),
|
|
184
|
-
/* @__PURE__ */ jsx("td", { className: "px-3 py-2 align-top", children: finding.layers?.secondaries
|
|
184
|
+
/* @__PURE__ */ jsx("td", { className: "px-3 py-2 align-top", children: finding.layers?.secondaries?.length ? /* @__PURE__ */ jsx(SecondariesChips, { layers: finding.layers.secondaries }) : /* @__PURE__ */ jsx("span", { className: "text-xs text-kumo-subtle", children: "\u2014" }) })
|
|
185
185
|
] }, i);
|
|
186
186
|
}) })
|
|
187
187
|
] }) })
|
package/dist/configured.d.ts
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import type { Suppression } from "./suppressions.js";
|
|
2
|
+
import type { ContentPresetOptions } from "./content-evaluator.js";
|
|
3
|
+
import type { CustomBlockMappings } from "./adapter.js";
|
|
2
4
|
export interface ConfiguredPluginOptions {
|
|
5
|
+
blockMappings?: CustomBlockMappings;
|
|
6
|
+
contentFieldsByCollection?: Record<string, readonly string[]>;
|
|
7
|
+
/** Optional portable preset evaluated in addition to the existing site checks. */
|
|
8
|
+
contentPreset?: ContentPresetOptions;
|
|
3
9
|
/**
|
|
4
10
|
* Full override of the swept collections. See `aexeoPlugin` in
|
|
5
11
|
* src/index.ts for the full precedence story.
|
package/dist/configured.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configured.d.ts","sourceRoot":"","sources":["../src/configured.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"configured.d.ts","sourceRoot":"","sources":["../src/configured.ts"],"names":[],"mappings":"AAwCA,OAAO,KAAK,EAAE,WAAW,EAAqB,MAAM,mBAAmB,CAAC;AAKxE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,KAAK,EAAE,mBAAmB,EAAqB,MAAM,cAAc,CAAC;AAuH3E,MAAM,WAAW,uBAAuB;IACtC,aAAa,CAAC,EAAE,mBAAmB,CAAC;IACpC,yBAAyB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC;IAC9D,kFAAkF;IAClF,aAAa,CAAC,EAAE,oBAAoB,CAAC;IACrC;;;OAGG;IACH,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAEhC;;;OAGG;IACH,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAEvC;;;OAGG;IACH,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAEvC;;;;;OAKG;IACH,YAAY,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;CACvC;AAED,wBAAgB,YAAY,CAAC,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAmJ3E;eAIc,YAAY"}
|