@milehimikey/em 1.7.2 → 1.8.1
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/.claude/skills/event-modeling/SKILL.md +92 -65
- package/.claude/skills/event-modeling/reference/conform.md +45 -20
- package/.claude/skills/event-modeling/reference/em-dsl.md +132 -55
- package/.claude/skills/event-modeling/reference/extract.md +5 -4
- package/.claude/skills/event-modeling/reference/implement.md +34 -22
- package/.claude/skills/event-modeling/templates/model-readme.md +8 -5
- package/.claude/skills/event-modeling/templates/slice.md +19 -5
- package/README.md +6 -4
- package/dist/catalog/docJoin.d.ts +28 -3
- package/dist/catalog/docJoin.js +82 -13
- package/dist/catalog/docJoin.js.map +1 -1
- package/dist/catalog/docModelConsistencyValidate.d.ts +8 -0
- package/dist/catalog/docModelConsistencyValidate.js +335 -0
- package/dist/catalog/docModelConsistencyValidate.js.map +1 -0
- package/dist/catalog/noteBindingValidate.d.ts +8 -0
- package/dist/catalog/noteBindingValidate.js +133 -0
- package/dist/catalog/noteBindingValidate.js.map +1 -0
- package/dist/catalog/pages.js +3 -3
- package/dist/catalog/pages.js.map +1 -1
- package/dist/catalog/sliceDoc.d.ts +14 -0
- package/dist/catalog/sliceDoc.js +22 -0
- package/dist/catalog/sliceDoc.js.map +1 -1
- package/dist/catalog/sliceReadyValidate.d.ts +18 -0
- package/dist/catalog/sliceReadyValidate.js +25 -1
- package/dist/catalog/sliceReadyValidate.js.map +1 -1
- package/dist/cli/agentsMd.d.ts +15 -0
- package/dist/cli/agentsMd.js +72 -0
- package/dist/cli/agentsMd.js.map +1 -0
- package/dist/cli/conformScope.d.ts +86 -0
- package/dist/cli/conformScope.js +156 -0
- package/dist/cli/conformScope.js.map +1 -0
- package/dist/cli/contract.d.ts +7 -0
- package/dist/cli/contract.js +27 -0
- package/dist/cli/contract.js.map +1 -0
- package/dist/cli/coverage.d.ts +71 -0
- package/dist/cli/coverage.js +177 -0
- package/dist/cli/coverage.js.map +1 -0
- package/dist/cli/markImplemented.d.ts +34 -0
- package/dist/cli/markImplemented.js +180 -0
- package/dist/cli/markImplemented.js.map +1 -0
- package/dist/cli/migrateReactionShape.d.ts +62 -0
- package/dist/cli/migrateReactionShape.js +283 -0
- package/dist/cli/migrateReactionShape.js.map +1 -0
- package/dist/cli/sliceIndex.d.ts +49 -0
- package/dist/cli/sliceIndex.js +115 -0
- package/dist/cli/sliceIndex.js.map +1 -0
- package/dist/cli/sliceNew.d.ts +18 -0
- package/dist/cli/sliceNew.js +53 -0
- package/dist/cli/sliceNew.js.map +1 -0
- package/dist/cli/stateFile.d.ts +74 -0
- package/dist/cli/stateFile.js +191 -0
- package/dist/cli/stateFile.js.map +1 -0
- package/dist/cli.js +535 -43
- package/dist/cli.js.map +1 -1
- package/dist/emit/coverageJson.d.ts +8 -0
- package/dist/emit/coverageJson.js +30 -0
- package/dist/emit/coverageJson.js.map +1 -0
- package/dist/emit/diffJson.d.ts +9 -1
- package/dist/emit/diffJson.js +44 -1
- package/dist/emit/diffJson.js.map +1 -1
- package/dist/emit/dot.js +41 -10
- package/dist/emit/dot.js.map +1 -1
- package/dist/emit/json.d.ts +77 -4
- package/dist/emit/json.js +78 -4
- package/dist/emit/json.js.map +1 -1
- package/dist/emit/validateJson.d.ts +52 -0
- package/dist/emit/validateJson.js +120 -0
- package/dist/emit/validateJson.js.map +1 -0
- package/dist/mcp/main.d.ts +2 -0
- package/dist/mcp/main.js +20 -0
- package/dist/mcp/main.js.map +1 -0
- package/dist/mcp/server.d.ts +11 -0
- package/dist/mcp/server.js +260 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/model/model.d.ts +30 -1
- package/dist/model/model.js +26 -0
- package/dist/model/model.js.map +1 -1
- package/dist/model/rules.d.ts +114 -0
- package/dist/model/rules.js +116 -4
- package/dist/model/rules.js.map +1 -1
- package/dist/model/validate.js +92 -8
- package/dist/model/validate.js.map +1 -1
- package/dist/parser/ast.d.ts +47 -0
- package/dist/parser/lexer.d.ts +16 -0
- package/dist/parser/lexer.js +44 -2
- package/dist/parser/lexer.js.map +1 -1
- package/dist/parser/parser.js +354 -20
- package/dist/parser/parser.js.map +1 -1
- package/dist/render/drawNotes.d.ts +11 -1
- package/dist/render/drawNotes.js +28 -3
- package/dist/render/drawNotes.js.map +1 -1
- package/dist/render/render.js +116 -23
- package/dist/render/render.js.map +1 -1
- package/dist/render/serve.d.ts +4 -0
- package/dist/render/serve.js +27 -239
- package/dist/render/serve.js.map +1 -1
- package/dist/render/sliceOverlay.d.ts +7 -2
- package/dist/render/sliceOverlay.js +19 -7
- package/dist/render/sliceOverlay.js.map +1 -1
- package/dist/render/sliceStatus.d.ts +7 -3
- package/dist/render/sliceStatus.js +48 -12
- package/dist/render/sliceStatus.js.map +1 -1
- package/dist/render/viewerHtml.d.ts +1 -0
- package/dist/render/viewerHtml.js +5 -0
- package/dist/render/viewerHtml.js.map +1 -0
- package/dist/render/watch.d.ts +10 -0
- package/dist/render/watch.js +29 -0
- package/dist/render/watch.js.map +1 -1
- package/dist/templates.d.ts +20 -1
- package/dist/templates.js +172 -3
- package/dist/templates.js.map +1 -1
- package/dist/util/markers.d.ts +13 -0
- package/dist/util/markers.js +30 -0
- package/dist/util/markers.js.map +1 -0
- package/dist/util/walkDir.d.ts +10 -1
- package/dist/util/walkDir.js +11 -7
- package/dist/util/walkDir.js.map +1 -1
- package/package.json +12 -3
- package/.claude/skills/event-modeling/templates/live.html +0 -117
package/dist/catalog/docJoin.js
CHANGED
|
@@ -14,10 +14,50 @@
|
|
|
14
14
|
// note binding is a normal, unremarkable state (a slice that hasn't reached specify yet); a
|
|
15
15
|
// binding pointing at a missing file, or a doc whose frontmatter is missing or malformed, are
|
|
16
16
|
// both broken-contract states and warn.
|
|
17
|
+
//
|
|
18
|
+
// Cross-slice binding (MIL-121): the canonical two-slice Automation/Translation shape (MIL-120)
|
|
19
|
+
// splits one design conversation across a view-only slice and its reaction+command+event slice,
|
|
20
|
+
// but a team may still want ONE doc to cover both. A `note "slices/<other-key>.md"` pointing at
|
|
21
|
+
// a DIFFERENT slice's canonical path is an explicit request to borrow that doc — honored only
|
|
22
|
+
// when the other end also ratifies it, via that doc's own frontmatter `covers:` list naming this
|
|
23
|
+
// slice's key. This is a two-ended handshake by design: an unratified cross-note (the target
|
|
24
|
+
// doc doesn't list this slice in `covers`, is missing, or has unusable frontmatter) leaves the
|
|
25
|
+
// slice silently unbound (`no-doc-bound`) rather than warning here — a one-sided note is exactly
|
|
26
|
+
// the same "hasn't reached specify yet" state as no note at all *from this module's point of
|
|
27
|
+
// view*. Canonical binding (a note naming this slice's own path) always takes precedence and is
|
|
28
|
+
// checked first, unchanged from before this ticket.
|
|
29
|
+
//
|
|
30
|
+
// MIL-126 gives the silent cases above (and a canonically-bound slice's OTHER, now-pointless
|
|
31
|
+
// notes) their own diagnostic instead of staying silent forever: see
|
|
32
|
+
// catalog/noteBindingValidate.ts, a sibling module, not folded in here — same reasoning as
|
|
33
|
+
// lineageValidate.ts/frontmatterCoherenceValidate.ts staying separate from this one, and it
|
|
34
|
+
// needs a second, cross-cutting pass over EVERY doc-shaped note on a slice (not just the winning
|
|
35
|
+
// one) to tell "extra" from "dangling" from "unratified". It reuses `NOTE_SLICE_PATH` and
|
|
36
|
+
// `resolveCrossCandidate` below rather than re-deriving the ratification predicate.
|
|
17
37
|
import { makeDiag } from "../model/rules.js";
|
|
18
38
|
import { classifyImplementationDrift } from "./driftSignal.js";
|
|
19
39
|
import { readSliceDoc } from "./readSliceDoc.js";
|
|
20
40
|
import { hasUsableFrontmatter } from "./sliceDoc.js";
|
|
41
|
+
// Matches a `note "slices/<key>.md"` value's path shape, to pull `<key>` back out for the
|
|
42
|
+
// MIL-121 cross-binding search below (and MIL-126's mismatch sweep, catalog/noteBindingValidate.ts)
|
|
43
|
+
// — same kebab-slug grammar sliceDoc.ts's SLICE_REF uses.
|
|
44
|
+
export const NOTE_SLICE_PATH = /^slices\/([a-z0-9]+(?:-[a-z0-9]+)*)\.md$/i;
|
|
45
|
+
/**
|
|
46
|
+
* Resolves a single `slices/<candidateKey>.md` cross-binding candidate — the exact ratification
|
|
47
|
+
* predicate `resolveSliceDocJoin`'s cross-binding search (MIL-121) applies, extracted so
|
|
48
|
+
* `noteBindingValidate.ts` (MIL-126) can classify a *non*-winning candidate's reason without
|
|
49
|
+
* re-deriving what "ratifies" means. One source of truth for both.
|
|
50
|
+
*/
|
|
51
|
+
export function resolveCrossCandidate(baseDir, candidateKey, sliceKey) {
|
|
52
|
+
const doc = readSliceDoc(baseDir, candidateKey);
|
|
53
|
+
if (!doc)
|
|
54
|
+
return { status: "missing" };
|
|
55
|
+
if (!hasUsableFrontmatter(doc))
|
|
56
|
+
return { status: "unusable" };
|
|
57
|
+
if (!doc.covers.includes(sliceKey))
|
|
58
|
+
return { status: "unratified" };
|
|
59
|
+
return { status: "ratified", doc };
|
|
60
|
+
}
|
|
21
61
|
const EMPTY_CONTENT = {
|
|
22
62
|
status: null,
|
|
23
63
|
version: null,
|
|
@@ -38,6 +78,33 @@ export function resolveSliceDocJoin(slice, sliceKey, baseDir, elementRefOf) {
|
|
|
38
78
|
const path = `slices/${sliceKey}.md`;
|
|
39
79
|
const boundEls = slice.elements.filter((el) => el.note === path);
|
|
40
80
|
if (boundEls.length === 0) {
|
|
81
|
+
// No canonical binding — MIL-121: look for a ratified cross-binding before giving up. Walk
|
|
82
|
+
// elements in declaration order (deterministic "first wins") for a `note "slices/<other>.md"`
|
|
83
|
+
// naming a DIFFERENT slice, and accept the first one `resolveCrossCandidate` reports as
|
|
84
|
+
// ratified. Anything short of that (missing file, unusable frontmatter, or no ratifying
|
|
85
|
+
// `covers` entry) is silently not a binding at all here (same as no note ever having been
|
|
86
|
+
// written) — MIL-126's noteBindingValidate.ts is where that non-winning candidate's specific
|
|
87
|
+
// reason becomes its own diagnostic, using this same predicate.
|
|
88
|
+
for (const el of slice.elements) {
|
|
89
|
+
if (!el.note)
|
|
90
|
+
continue;
|
|
91
|
+
const m = el.note.match(NOTE_SLICE_PATH);
|
|
92
|
+
if (!m)
|
|
93
|
+
continue;
|
|
94
|
+
const otherKey = m[1].toLowerCase();
|
|
95
|
+
if (otherKey === sliceKey)
|
|
96
|
+
continue; // already handled above; can't happen if we got here
|
|
97
|
+
const result = resolveCrossCandidate(baseDir, otherKey, sliceKey);
|
|
98
|
+
if (result.status !== "ratified")
|
|
99
|
+
continue;
|
|
100
|
+
// Normalized (lowercased) path, NOT `el.note` verbatim: `otherKey` is lowercased before
|
|
101
|
+
// the readSliceDoc() call above (NOTE_SLICE_PATH is case-insensitive), so a mixed-case
|
|
102
|
+
// note like `note "slices/Request-Payment.md"` must still report the path it actually
|
|
103
|
+
// read — `slices/request-payment.md` — not the note's original casing. Otherwise a
|
|
104
|
+
// consumer that re-derives the key from `doc.path` (sliceReadyValidate.ts) would try to
|
|
105
|
+
// re-read the mixed-case path and get null on a case-sensitive filesystem.
|
|
106
|
+
return { doc: foundDoc(`slices/${otherKey}.md`, result.doc), diagnostics: [] };
|
|
107
|
+
}
|
|
41
108
|
return { doc: { found: false, path, reason: "no-doc-bound", ...EMPTY_CONTENT }, diagnostics: [] };
|
|
42
109
|
}
|
|
43
110
|
const parsed = readSliceDoc(baseDir, sliceKey);
|
|
@@ -67,20 +134,22 @@ export function resolveSliceDocJoin(slice, sliceKey, baseDir, elementRefOf) {
|
|
|
67
134
|
],
|
|
68
135
|
};
|
|
69
136
|
}
|
|
137
|
+
return { doc: foundDoc(path, parsed), diagnostics: [] };
|
|
138
|
+
}
|
|
139
|
+
/** Builds the `found: true, reason: null` doc join result shared by a canonical binding and a
|
|
140
|
+
* ratified MIL-121 cross-binding — `path` is whichever path the content actually came from. */
|
|
141
|
+
function foundDoc(path, parsed) {
|
|
70
142
|
return {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
driftSignal: classifyImplementationDrift(parsed),
|
|
82
|
-
},
|
|
83
|
-
diagnostics: [],
|
|
143
|
+
found: true,
|
|
144
|
+
path,
|
|
145
|
+
reason: null,
|
|
146
|
+
status: parsed.status,
|
|
147
|
+
version: parsed.version,
|
|
148
|
+
implementedIn: parsed.implementedIn,
|
|
149
|
+
splitFrom: parsed.splitFrom,
|
|
150
|
+
mergedFrom: parsed.mergedFrom,
|
|
151
|
+
supersededBy: parsed.supersededBy,
|
|
152
|
+
driftSignal: classifyImplementationDrift(parsed),
|
|
84
153
|
};
|
|
85
154
|
}
|
|
86
155
|
//# sourceMappingURL=docJoin.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docJoin.js","sourceRoot":"","sources":["../../src/catalog/docJoin.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,4FAA4F;AAC5F,6FAA6F;AAC7F,2FAA2F;AAC3F,4FAA4F;AAC5F,uFAAuF;AACvF,6FAA6F;AAC7F,oFAAoF;AACpF,0FAA0F;AAC1F,4FAA4F;AAC5F,EAAE;AACF,oFAAoF;AACpF,6FAA6F;AAC7F,4FAA4F;AAC5F,8FAA8F;AAC9F,wCAAwC;
|
|
1
|
+
{"version":3,"file":"docJoin.js","sourceRoot":"","sources":["../../src/catalog/docJoin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { NormalizedModel } from "../model/model.js";
|
|
2
|
+
import { RefsResult } from "../model/refs.js";
|
|
3
|
+
import { Diagnostic } from "../model/validate.js";
|
|
4
|
+
/**
|
|
5
|
+
* Resolve every slice's doc consistency findings. `baseDir` is the `.em` file's directory, same
|
|
6
|
+
* convention every other doc/note path in em uses.
|
|
7
|
+
*/
|
|
8
|
+
export declare function validateDocModelConsistency(model: NormalizedModel, refs: RefsResult, baseDir: string): Diagnostic[];
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
// `em validate`'s doc↔model consistency check (MIL-124): the "internal surface" of the conform
|
|
3
|
+
// phase (does a bound slice doc's structured claims still agree with the `.em` model?) has always
|
|
4
|
+
// been checked by agent judgment. This module makes the mechanically-checkable core of that
|
|
5
|
+
// judgment call deterministic — the same fs-aware-sibling shape as catalog/lineageValidate.ts
|
|
6
|
+
// (MIL-84), catalog/frontmatterCoherenceValidate.ts (MIL-85), and catalog/noteBindingValidate.ts
|
|
7
|
+
// (MIL-126): a module next to model/validate.ts, not folded into it, because it needs
|
|
8
|
+
// `baseDir`/fs access the rest of validate deliberately never touches.
|
|
9
|
+
//
|
|
10
|
+
// Four things are checked, each declare-gated so a thin/draft doc stays silent rather than
|
|
11
|
+
// nagging (matching this codebase's bar for an unconditional rule — see the sibling modules
|
|
12
|
+
// above):
|
|
13
|
+
//
|
|
14
|
+
// 1. pattern: frontmatter `pattern:` vs the deterministic classification `classify.ts`'s
|
|
15
|
+
// `classifySlicePattern()` computes from the `.em` AST — the same function `em export`
|
|
16
|
+
// publishes as `slice.pattern`. Checked against the doc's OWNING slice only (the slice whose
|
|
17
|
+
// own export key the doc's canonical path names) — `classifySlicePattern` is inherently
|
|
18
|
+
// single-slice, so a MIL-121 cross-covered doc's `pattern:` is compared against the primary
|
|
19
|
+
// slice it's canonically bound to, not some blend of the whole covered union. Silent when
|
|
20
|
+
// the owning slice classifies as `unclassified` — nothing authoritative to compare against.
|
|
21
|
+
//
|
|
22
|
+
// 2. element rosters, per kind (command/event/view), both directions: the doc body's own
|
|
23
|
+
// stable markers (`**Command:** \`Name\``, `**Event:** \`Name\`` [`→ context \`Ctx\``],
|
|
24
|
+
// `- **View:** \`Name\` ...`) versus the model's elements of that kind. A kind with zero
|
|
25
|
+
// markers in the doc is silent for that kind entirely — partial/draft docs are normal, and
|
|
26
|
+
// this mirrors the field-level declare-gating below. `→ context` is deliberately never
|
|
27
|
+
// compared against the model's `@Context` tag — out of scope for this ticket (judgment call,
|
|
28
|
+
// see this module's test file / the MIL-124 report).
|
|
29
|
+
//
|
|
30
|
+
// 3. fields, per matched Command/Event: a markdown field table (first column = field name)
|
|
31
|
+
// found in the marker's own section (before the next `##` heading or marker) versus the
|
|
32
|
+
// model element's `{ fields }` block. Compared only when BOTH sides declare at least one
|
|
33
|
+
// field — either side lacking fields entirely is silent, matching the roster gating above.
|
|
34
|
+
// Name comparison (rosters and fields alike) uses `model.ts`'s own `normalizeName()`, so
|
|
35
|
+
// case/spacing conventions match how the DSL itself resolves names — never a second,
|
|
36
|
+
// independently-invented comparison.
|
|
37
|
+
//
|
|
38
|
+
// MIL-121 cross-covered docs: a doc can be the resolved binding (via `docJoin.ts`'s
|
|
39
|
+
// `resolveSliceDocJoin`) for more than one slice — its own canonical slice, plus any slice whose
|
|
40
|
+
// `covers:`-ratified cross-note points at it. This module resolves every slice's binding exactly
|
|
41
|
+
// that way (never re-deriving binding semantics), groups slices by resolved doc path, and checks
|
|
42
|
+
// each doc ONCE against the UNION of elements across every slice it's bound to — not once per
|
|
43
|
+
// slice, which would double-report the same disagreement. Findings anchor at whichever slice the
|
|
44
|
+
// model-side element actually lives in (element line + refs) for "model has it, doc doesn't
|
|
45
|
+
// mention it"; at the doc's OWNING slice (the one canonically bound to this doc's path — falling
|
|
46
|
+
// back to the earliest-declared covered slice if none is, an edge case that needs a floating
|
|
47
|
+
// `covers`-only doc with no slice of its own) for "doc names it, nothing in the model does" and
|
|
48
|
+
// for the pattern check, since neither has one specific model element to point at.
|
|
49
|
+
//
|
|
50
|
+
// Body-marker/table parsing lives here, not in sliceDoc.ts: it operates on `SliceDoc.body` (the
|
|
51
|
+
// post-frontmatter text sliceDoc.ts already exposes) but needs to talk in terms of element
|
|
52
|
+
// *kinds*, which is this rule's vocabulary, not the doc parser's. `pattern` is the one exception
|
|
53
|
+
// — a genuine frontmatter scalar sliceDoc.ts didn't parse onto the struct before this ticket — so
|
|
54
|
+
// it was added there instead (one line, alongside `status`/`version`), keeping every other
|
|
55
|
+
// frontmatter field's parsing in one place.
|
|
56
|
+
//
|
|
57
|
+
// All warnings, never errors — a genuine doc/model disagreement is worth flagging, but it's
|
|
58
|
+
// never a build-breaking condition (same posture every other fs-aware validate rule takes).
|
|
59
|
+
import { normalizeName } from "../model/model.js";
|
|
60
|
+
import { pushDiag } from "../model/rules.js";
|
|
61
|
+
import { classifySlicePattern, slicePatternLabel } from "./classify.js";
|
|
62
|
+
import { resolveSliceDocJoin } from "./docJoin.js";
|
|
63
|
+
import { readSliceDoc } from "./readSliceDoc.js";
|
|
64
|
+
const COMMAND_MARKER = /^\*\*Command:\*\*\s*`([^`]+)`\s*$/;
|
|
65
|
+
const EVENT_MARKER = /^\*\*Event:\*\*\s*`([^`]+)`(?:\s*→\s*context\s*`[^`]+`\s*)?$/;
|
|
66
|
+
const VIEW_MARKER = /^-\s*\*\*View:\*\*\s*`([^`]+)`/;
|
|
67
|
+
function matchMarker(line) {
|
|
68
|
+
const cmd = COMMAND_MARKER.exec(line);
|
|
69
|
+
if (cmd)
|
|
70
|
+
return { kind: "command", name: cmd[1].trim() };
|
|
71
|
+
const evt = EVENT_MARKER.exec(line);
|
|
72
|
+
if (evt)
|
|
73
|
+
return { kind: "event", name: evt[1].trim() };
|
|
74
|
+
const view = VIEW_MARKER.exec(line);
|
|
75
|
+
if (view)
|
|
76
|
+
return { kind: "view", name: view[1].trim() };
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
const TABLE_ROW = /^\s*\|/;
|
|
80
|
+
const TABLE_SEPARATOR_CELL = /^:?-+:?$/;
|
|
81
|
+
const PLACEHOLDER = /\{\{.*\}\}/;
|
|
82
|
+
function splitRow(line) {
|
|
83
|
+
const trimmed = line.trim().replace(/^\|/, "").replace(/\|$/, "");
|
|
84
|
+
return trimmed.split("|").map((c) => c.trim());
|
|
85
|
+
}
|
|
86
|
+
function cleanCell(raw) {
|
|
87
|
+
if (raw === undefined)
|
|
88
|
+
return null;
|
|
89
|
+
const stripped = raw.replace(/^`|`$/g, "").trim();
|
|
90
|
+
if (!stripped || PLACEHOLDER.test(raw))
|
|
91
|
+
return null;
|
|
92
|
+
return stripped;
|
|
93
|
+
}
|
|
94
|
+
/** Finds the first markdown table between `start` and `end` (exclusive) whose header's first
|
|
95
|
+
* column reads "Field" (case/spacing-insensitive) — the shape every field table in the template
|
|
96
|
+
* uses (`| Field | Type | ... |`). Returns null when no such table exists, or every data row is
|
|
97
|
+
* a template placeholder (an unfilled `{{field}}` row is the same as no table — nothing real was
|
|
98
|
+
* declared yet). */
|
|
99
|
+
function findFieldTable(lines, start, end) {
|
|
100
|
+
for (let i = start; i < end - 1; i++) {
|
|
101
|
+
if (!TABLE_ROW.test(lines[i]) || !TABLE_ROW.test(lines[i + 1]))
|
|
102
|
+
continue;
|
|
103
|
+
const sepCells = splitRow(lines[i + 1]);
|
|
104
|
+
if (sepCells.length === 0 || !sepCells.every((c) => TABLE_SEPARATOR_CELL.test(c)))
|
|
105
|
+
continue;
|
|
106
|
+
const headerCells = splitRow(lines[i]);
|
|
107
|
+
if (normalizeName(headerCells[0] ?? "") !== "field")
|
|
108
|
+
continue;
|
|
109
|
+
const typeIdx = headerCells.findIndex((c, idx) => idx > 0 && normalizeName(c) === "type");
|
|
110
|
+
const fields = [];
|
|
111
|
+
for (let j = i + 2; j < end; j++) {
|
|
112
|
+
if (!TABLE_ROW.test(lines[j]))
|
|
113
|
+
break;
|
|
114
|
+
const cells = splitRow(lines[j]);
|
|
115
|
+
const name = cleanCell(cells[0]);
|
|
116
|
+
if (!name)
|
|
117
|
+
continue; // blank or placeholder row — not a real field declaration
|
|
118
|
+
const type = typeIdx >= 0 ? cleanCell(cells[typeIdx]) : null;
|
|
119
|
+
fields.push({ name, type });
|
|
120
|
+
}
|
|
121
|
+
return fields.length > 0 ? fields : null;
|
|
122
|
+
}
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
/** Parses every Command/Event/View marker out of a slice doc's body, each paired with its own
|
|
126
|
+
* field table (command/event only) when one follows before the next `##` heading or marker.
|
|
127
|
+
* Tolerant by construction: only the exact template marker shapes match at all (see the regexes
|
|
128
|
+
* above); anything else — prose, a differently-shaped table, a heading that isn't `##` — is
|
|
129
|
+
* simply not recognized, never a parse error. */
|
|
130
|
+
function parseDocMarkers(body) {
|
|
131
|
+
const lines = body.split(/\r?\n/);
|
|
132
|
+
const hits = [];
|
|
133
|
+
for (let i = 0; i < lines.length; i++) {
|
|
134
|
+
const m = matchMarker(lines[i]);
|
|
135
|
+
if (m)
|
|
136
|
+
hits.push({ ...m, idx: i });
|
|
137
|
+
}
|
|
138
|
+
return hits.map((hit) => {
|
|
139
|
+
let end = lines.length;
|
|
140
|
+
for (let j = hit.idx + 1; j < lines.length; j++) {
|
|
141
|
+
if (/^##\s/.test(lines[j]) || matchMarker(lines[j])) {
|
|
142
|
+
end = j;
|
|
143
|
+
break;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
const fieldsTable = hit.kind === "view" ? null : findFieldTable(lines, hit.idx + 1, end);
|
|
147
|
+
return { kind: hit.kind, name: hit.name, bodyLine: hit.idx, fieldsTable };
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
/** First-occurrence-wins map of a marker kind's declared names, normalized — mirrors every other
|
|
151
|
+
* "first wins" dedup convention in this codebase (docJoin.ts's cross-binding search, etc.). A
|
|
152
|
+
* doc that (unusually) declares the same command/event/view name twice is not this rule's
|
|
153
|
+
* business; only the first table (if any) is what gets compared. */
|
|
154
|
+
function firstByName(markers, kind) {
|
|
155
|
+
const map = new Map();
|
|
156
|
+
for (const m of markers) {
|
|
157
|
+
if (m.kind !== kind)
|
|
158
|
+
continue;
|
|
159
|
+
const key = normalizeName(m.name);
|
|
160
|
+
if (!map.has(key))
|
|
161
|
+
map.set(key, m);
|
|
162
|
+
}
|
|
163
|
+
return map;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Resolve every slice's doc consistency findings. `baseDir` is the `.em` file's directory, same
|
|
167
|
+
* convention every other doc/note path in em uses.
|
|
168
|
+
*/
|
|
169
|
+
export function validateDocModelConsistency(model, refs, baseDir) {
|
|
170
|
+
const diags = [];
|
|
171
|
+
// Resolve every slice's actual doc binding exactly the way `em export` does — never re-deriving
|
|
172
|
+
// canonical-vs-cross-binding precedence — and group slices by the resolved doc path so a
|
|
173
|
+
// MIL-121 cross-covered doc is checked once against the union, not once per covered slice.
|
|
174
|
+
const groups = new Map();
|
|
175
|
+
model.slices.forEach((slice, i) => {
|
|
176
|
+
const sliceKey = refs.sliceKeys[i];
|
|
177
|
+
const { doc } = resolveSliceDocJoin(slice, sliceKey, baseDir, (id) => refs.refById.get(id));
|
|
178
|
+
if (!doc.found || doc.reason !== null)
|
|
179
|
+
return; // unbound, missing file, or unusable frontmatter
|
|
180
|
+
const arr = groups.get(doc.path);
|
|
181
|
+
if (arr)
|
|
182
|
+
arr.push(i);
|
|
183
|
+
else
|
|
184
|
+
groups.set(doc.path, [i]);
|
|
185
|
+
});
|
|
186
|
+
const docCache = new Map();
|
|
187
|
+
const docForKey = (key) => {
|
|
188
|
+
if (!docCache.has(key))
|
|
189
|
+
docCache.set(key, readSliceDoc(baseDir, key));
|
|
190
|
+
return docCache.get(key);
|
|
191
|
+
};
|
|
192
|
+
for (const [docPath, sliceIndices] of groups) {
|
|
193
|
+
const docKey = docPath.replace(/^slices\//, "").replace(/\.md$/, "");
|
|
194
|
+
const parsed = docForKey(docKey);
|
|
195
|
+
if (!parsed)
|
|
196
|
+
continue; // defensive — resolveSliceDocJoin already guaranteed this file parses
|
|
197
|
+
// The "owning" slice is the one canonically bound to this exact doc (its own export key ==
|
|
198
|
+
// docKey) — the anchor for findings with no single model element to point at. A doc reached
|
|
199
|
+
// ONLY via a `covers`-ratified cross-note, whose own canonical key names no slice currently
|
|
200
|
+
// in the model, has no such slice; fall back to the earliest-declared covered slice instead,
|
|
201
|
+
// same "first wins" determinism as everywhere else in this module.
|
|
202
|
+
const ownerIdx = sliceIndices.find((i) => refs.sliceKeys[i] === docKey) ?? Math.min(...sliceIndices);
|
|
203
|
+
const ownerSlice = model.slices[ownerIdx];
|
|
204
|
+
const ownerKey = refs.sliceKeys[ownerIdx];
|
|
205
|
+
checkPattern(diags, parsed, ownerSlice, ownerKey, docPath);
|
|
206
|
+
const markers = parseDocMarkers(parsed.body);
|
|
207
|
+
const coveredNames = sliceIndices.map((i) => model.slices[i].name);
|
|
208
|
+
for (const kind of ["command", "event", "view"]) {
|
|
209
|
+
const docByName = firstByName(markers, kind);
|
|
210
|
+
if (docByName.size === 0)
|
|
211
|
+
continue; // kind not declared in this doc at all — silent
|
|
212
|
+
const modelEls = [];
|
|
213
|
+
for (const i of sliceIndices)
|
|
214
|
+
for (const el of model.slices[i].elements)
|
|
215
|
+
if (el.kind === kind)
|
|
216
|
+
modelEls.push(el);
|
|
217
|
+
const modelByName = new Map();
|
|
218
|
+
for (const el of modelEls) {
|
|
219
|
+
const key = normalizeName(el.name);
|
|
220
|
+
const list = modelByName.get(key);
|
|
221
|
+
if (list)
|
|
222
|
+
list.push(el);
|
|
223
|
+
else
|
|
224
|
+
modelByName.set(key, [el]);
|
|
225
|
+
}
|
|
226
|
+
checkRosterDirections(diags, kind, docPath, docByName, modelByName, ownerSlice, ownerKey, coveredNames, model, refs);
|
|
227
|
+
if (kind !== "view")
|
|
228
|
+
checkFields(diags, kind, docPath, docByName, modelByName, model, refs);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
return diags;
|
|
232
|
+
}
|
|
233
|
+
function checkPattern(diags, doc, ownerSlice, ownerKey, docPath) {
|
|
234
|
+
if (!doc.pattern)
|
|
235
|
+
return; // usable-frontmatter gate already guarantees presence in practice; defensive
|
|
236
|
+
const classified = classifySlicePattern(ownerSlice);
|
|
237
|
+
if (classified === "unclassified")
|
|
238
|
+
return; // nothing authoritative to compare the doc's claim against
|
|
239
|
+
if (normalizeName(doc.pattern) === classified)
|
|
240
|
+
return;
|
|
241
|
+
pushDiag(diags, "doc-model-pattern-mismatch", {
|
|
242
|
+
message: `slice doc "${docPath}" declares \`pattern: ${doc.pattern}\`, but the model classifies slice ` +
|
|
243
|
+
`"${ownerSlice.name}" as "${classified}" (${slicePatternLabel(classified)}) — see src/catalog/classify.ts`,
|
|
244
|
+
line: ownerSlice.line,
|
|
245
|
+
refs: [ownerKey],
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
function checkRosterDirections(diags, kind, docPath, docByName, modelByName, ownerSlice, ownerKey, coveredNames, model, refs) {
|
|
249
|
+
const coverage = coveredNames.length > 1 ? ` (covering slices: ${coveredNames.map((n) => `"${n}"`).join(", ")})` : "";
|
|
250
|
+
// (a) the doc names a command/event/view the model doesn't have.
|
|
251
|
+
for (const [key, marker] of docByName) {
|
|
252
|
+
if (modelByName.has(key))
|
|
253
|
+
continue;
|
|
254
|
+
pushDiag(diags, "doc-model-element-not-in-model", {
|
|
255
|
+
message: `slice doc "${docPath}" declares ${kind} \`${marker.name}\`, but no ${kind} named "${marker.name}" exists in the model${coverage}`,
|
|
256
|
+
line: ownerSlice.line,
|
|
257
|
+
refs: [ownerKey],
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
// (b) the model has a command/event/view this doc never mentions.
|
|
261
|
+
for (const [key, els] of modelByName) {
|
|
262
|
+
if (docByName.has(key))
|
|
263
|
+
continue;
|
|
264
|
+
const el = els[0];
|
|
265
|
+
const sliceKey = refs.sliceKeys[el.sliceIndex];
|
|
266
|
+
const sliceName = model.slices[el.sliceIndex].name;
|
|
267
|
+
pushDiag(diags, "doc-model-element-not-in-doc", {
|
|
268
|
+
message: `slice "${sliceName}" has ${kind} "${el.name}", but slice doc "${docPath}" doesn't declare it — expected ${markerHint(kind, el.name)}`,
|
|
269
|
+
line: el.line,
|
|
270
|
+
refs: [sliceKey, refs.refById.get(el.id)],
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
function markerHint(kind, name) {
|
|
275
|
+
if (kind === "view")
|
|
276
|
+
return `a "- **View:** \`${name}\` ..." marker`;
|
|
277
|
+
const label = kind === "command" ? "Command" : "Event";
|
|
278
|
+
return `a "**${label}:** \`${name}\`" marker`;
|
|
279
|
+
}
|
|
280
|
+
function checkFields(diags, kind, docPath, docByName, modelByName, model, refs) {
|
|
281
|
+
for (const [key, marker] of docByName) {
|
|
282
|
+
if (!marker.fieldsTable)
|
|
283
|
+
continue; // doc declares no fields for this element — silent
|
|
284
|
+
const modelMatches = modelByName.get(key);
|
|
285
|
+
if (!modelMatches)
|
|
286
|
+
continue; // already reported as doc-model-element-not-in-model above
|
|
287
|
+
const el = modelMatches[0];
|
|
288
|
+
if (!el.fields || el.fields.length === 0)
|
|
289
|
+
continue; // model declares no fields — silent
|
|
290
|
+
const docFields = new Map();
|
|
291
|
+
for (const f of marker.fieldsTable) {
|
|
292
|
+
const k = normalizeName(f.name);
|
|
293
|
+
if (!docFields.has(k))
|
|
294
|
+
docFields.set(k, f);
|
|
295
|
+
}
|
|
296
|
+
const modelFields = new Map();
|
|
297
|
+
for (const f of el.fields) {
|
|
298
|
+
const k = normalizeName(f.name);
|
|
299
|
+
if (!modelFields.has(k))
|
|
300
|
+
modelFields.set(k, f);
|
|
301
|
+
}
|
|
302
|
+
const sliceKey = refs.sliceKeys[el.sliceIndex];
|
|
303
|
+
const sliceName = model.slices[el.sliceIndex].name;
|
|
304
|
+
const elRef = refs.refById.get(el.id);
|
|
305
|
+
const elRefs = [sliceKey, elRef];
|
|
306
|
+
for (const [fk, df] of docFields) {
|
|
307
|
+
if (modelFields.has(fk))
|
|
308
|
+
continue;
|
|
309
|
+
pushDiag(diags, "doc-model-field-mismatch", {
|
|
310
|
+
message: `slice doc "${docPath}"'s ${kind} \`${marker.name}\` field table lists "${df.name}", but ${kind} "${el.name}" (slice "${sliceName}") has no such field`,
|
|
311
|
+
line: el.line,
|
|
312
|
+
refs: elRefs,
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
for (const [fk, mf] of modelFields) {
|
|
316
|
+
const df = docFields.get(fk);
|
|
317
|
+
if (!df) {
|
|
318
|
+
pushDiag(diags, "doc-model-field-mismatch", {
|
|
319
|
+
message: `${kind} "${el.name}" (slice "${sliceName}") has field "${mf.name}", but slice doc "${docPath}"'s ${kind} \`${marker.name}\` field table doesn't list it`,
|
|
320
|
+
line: el.line,
|
|
321
|
+
refs: elRefs,
|
|
322
|
+
});
|
|
323
|
+
continue;
|
|
324
|
+
}
|
|
325
|
+
if (df.type && mf.type && normalizeName(df.type) !== normalizeName(mf.type)) {
|
|
326
|
+
pushDiag(diags, "doc-model-field-mismatch", {
|
|
327
|
+
message: `field "${mf.name}" on ${kind} "${el.name}" (slice "${sliceName}") is typed \`${mf.type}\` in the model but \`${df.type}\` in slice doc "${docPath}"`,
|
|
328
|
+
line: el.line,
|
|
329
|
+
refs: elRefs,
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
//# sourceMappingURL=docModelConsistencyValidate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docModelConsistencyValidate.js","sourceRoot":"","sources":["../../src/catalog/docModelConsistencyValidate.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,+FAA+F;AAC/F,kGAAkG;AAClG,4FAA4F;AAC5F,8FAA8F;AAC9F,iGAAiG;AACjG,sFAAsF;AACtF,uEAAuE;AACvE,EAAE;AACF,2FAA2F;AAC3F,4FAA4F;AAC5F,UAAU;AACV,EAAE;AACF,2FAA2F;AAC3F,4FAA4F;AAC5F,kGAAkG;AAClG,6FAA6F;AAC7F,iGAAiG;AACjG,+FAA+F;AAC/F,iGAAiG;AACjG,EAAE;AACF,2FAA2F;AAC3F,6FAA6F;AAC7F,8FAA8F;AAC9F,gGAAgG;AAChG,4FAA4F;AAC5F,kGAAkG;AAClG,0DAA0D;AAC1D,EAAE;AACF,6FAA6F;AAC7F,6FAA6F;AAC7F,8FAA8F;AAC9F,gGAAgG;AAChG,8FAA8F;AAC9F,0FAA0F;AAC1F,0CAA0C;AAC1C,EAAE;AACF,oFAAoF;AACpF,iGAAiG;AACjG,iGAAiG;AACjG,iGAAiG;AACjG,8FAA8F;AAC9F,iGAAiG;AACjG,4FAA4F;AAC5F,iGAAiG;AACjG,6FAA6F;AAC7F,gGAAgG;AAChG,mFAAmF;AACnF,EAAE;AACF,gGAAgG;AAChG,2FAA2F;AAC3F,iGAAiG;AACjG,kGAAkG;AAClG,2FAA2F;AAC3F,4CAA4C;AAC5C,EAAE;AACF,4FAA4F;AAC5F,4FAA4F;AAE5F,OAAO,EAAmC,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGnF,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AA8BjD,MAAM,cAAc,GAAG,mCAAmC,CAAC;AAC3D,MAAM,YAAY,GAAG,8DAA8D,CAAC;AACpF,MAAM,WAAW,GAAG,gCAAgC,CAAC;AAErD,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,GAAG;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;IACzD,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,GAAG;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;IACvD,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;IACxD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,SAAS,GAAG,QAAQ,CAAC;AAC3B,MAAM,oBAAoB,GAAG,UAAU,CAAC;AACxC,MAAM,WAAW,GAAG,YAAY,CAAC;AAEjC,SAAS,QAAQ,CAAC,IAAY;IAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAClE,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,SAAS,CAAC,GAAuB;IACxC,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAClD,IAAI,CAAC,QAAQ,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACpD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;qBAIqB;AACrB,SAAS,cAAc,CAAC,KAAe,EAAE,KAAa,EAAE,GAAW;IACjE,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,SAAS;QACzE,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACxC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAAE,SAAS;QAC5F,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACvC,IAAI,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO;YAAE,SAAS;QAC9D,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC;QAE1F,MAAM,MAAM,GAAe,EAAE,CAAC;QAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YACjC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAAE,MAAM;YACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACjC,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACjC,IAAI,CAAC,IAAI;gBAAE,SAAS,CAAC,0DAA0D;YAC/E,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC7D,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9B,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;kDAIkD;AAClD,SAAS,eAAe,CAAC,IAAY;IACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,IAAI,GAA2D,EAAE,CAAC;IACxE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACtB,IAAI,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC;QACvB,KAAK,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAChD,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpD,GAAG,GAAG,CAAC,CAAC;gBACR,MAAM;YACR,CAAC;QACH,CAAC;QACD,MAAM,WAAW,GAAG,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;QACzF,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,GAAG,EAAE,WAAW,EAAE,CAAC;IAC5E,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;qEAGqE;AACrE,SAAS,WAAW,CAAC,OAAoB,EAAE,IAAgB;IACzD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAqB,CAAC;IACzC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI;YAAE,SAAS;QAC9B,MAAM,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,2BAA2B,CAAC,KAAsB,EAAE,IAAgB,EAAE,OAAe;IACnG,MAAM,KAAK,GAAiB,EAAE,CAAC;IAE/B,gGAAgG;IAChG,yFAAyF;IACzF,2FAA2F;IAC3F,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC3C,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,EAAE,GAAG,EAAE,GAAG,mBAAmB,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC,CAAC;QAC7F,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI;YAAE,OAAO,CAAC,iDAAiD;QAChG,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,GAAG;YAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;YAChB,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA2B,CAAC;IACpD,MAAM,SAAS,GAAG,CAAC,GAAW,EAAmB,EAAE;QACjD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QACtE,OAAO,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;IAC5B,CAAC,CAAC;IAEF,KAAK,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC,IAAI,MAAM,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACrE,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM;YAAE,SAAS,CAAC,sEAAsE;QAE7F,2FAA2F;QAC3F,4FAA4F;QAC5F,4FAA4F;QAC5F,6FAA6F;QAC7F,mEAAmE;QACnE,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC;QACrG,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAE1C,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAE3D,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAEnE,KAAK,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAU,EAAE,CAAC;YACzD,MAAM,SAAS,GAAG,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC7C,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC;gBAAE,SAAS,CAAC,gDAAgD;YAEpF,MAAM,QAAQ,GAAc,EAAE,CAAC;YAC/B,KAAK,MAAM,CAAC,IAAI,YAAY;gBAAE,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ;oBAAE,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI;wBAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjH,MAAM,WAAW,GAAG,IAAI,GAAG,EAAqB,CAAC;YACjD,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;gBAC1B,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;gBACnC,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAClC,IAAI,IAAI;oBAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;;oBACnB,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAClC,CAAC;YAED,qBAAqB,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YACrH,IAAI,IAAI,KAAK,MAAM;gBAAE,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QAC9F,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,YAAY,CACnB,KAAmB,EACnB,GAAa,EACb,UAAiB,EACjB,QAAgB,EAChB,OAAe;IAEf,IAAI,CAAC,GAAG,CAAC,OAAO;QAAE,OAAO,CAAC,6EAA6E;IACvG,MAAM,UAAU,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;IACpD,IAAI,UAAU,KAAK,cAAc;QAAE,OAAO,CAAC,2DAA2D;IACtG,IAAI,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,UAAU;QAAE,OAAO;IACtD,QAAQ,CAAC,KAAK,EAAE,4BAA4B,EAAE;QAC5C,OAAO,EACL,cAAc,OAAO,yBAAyB,GAAG,CAAC,OAAO,qCAAqC;YAC9F,IAAI,UAAU,CAAC,IAAI,SAAS,UAAU,MAAM,iBAAiB,CAAC,UAAU,CAAC,iCAAiC;QAC5G,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,IAAI,EAAE,CAAC,QAAQ,CAAC;KACjB,CAAC,CAAC;AACL,CAAC;AAED,SAAS,qBAAqB,CAC5B,KAAmB,EACnB,IAAgB,EAChB,OAAe,EACf,SAAiC,EACjC,WAAmC,EACnC,UAAiB,EACjB,QAAgB,EAChB,YAAsB,EACtB,KAAsB,EACtB,IAAgB;IAEhB,MAAM,QAAQ,GACZ,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,sBAAsB,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAEvG,iEAAiE;IACjE,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QACtC,IAAI,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QACnC,QAAQ,CAAC,KAAK,EAAE,gCAAgC,EAAE;YAChD,OAAO,EAAE,cAAc,OAAO,cAAc,IAAI,MAAM,MAAM,CAAC,IAAI,cAAc,IAAI,WAAW,MAAM,CAAC,IAAI,wBAAwB,QAAQ,EAAE;YAC3I,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,IAAI,EAAE,CAAC,QAAQ,CAAC;SACjB,CAAC,CAAC;IACL,CAAC;IAED,kEAAkE;IAClE,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,WAAW,EAAE,CAAC;QACrC,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QACjC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;QAC/C,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;QACnD,QAAQ,CAAC,KAAK,EAAE,8BAA8B,EAAE;YAC9C,OAAO,EAAE,UAAU,SAAS,SAAS,IAAI,KAAK,EAAE,CAAC,IAAI,qBAAqB,OAAO,mCAAmC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE;YAC/I,IAAI,EAAE,EAAE,CAAC,IAAI;YACb,IAAI,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAE,CAAC;SAC3C,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,IAAgB,EAAE,IAAY;IAChD,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,oBAAoB,IAAI,gBAAgB,CAAC;IACrE,MAAM,KAAK,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;IACvD,OAAO,QAAQ,KAAK,SAAS,IAAI,YAAY,CAAC;AAChD,CAAC;AAED,SAAS,WAAW,CAClB,KAAmB,EACnB,IAAyB,EACzB,OAAe,EACf,SAAiC,EACjC,WAAmC,EACnC,KAAsB,EACtB,IAAgB;IAEhB,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QACtC,IAAI,CAAC,MAAM,CAAC,WAAW;YAAE,SAAS,CAAC,mDAAmD;QACtF,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,CAAC,YAAY;YAAE,SAAS,CAAC,2DAA2D;QACxF,MAAM,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,CAAC,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS,CAAC,oCAAoC;QAExF,MAAM,SAAS,GAAG,IAAI,GAAG,EAAoB,CAAC;QAC9C,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YACnC,MAAM,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAChC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;gBAAE,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,CAAC;QACD,MAAM,WAAW,GAAG,IAAI,GAAG,EAA2C,CAAC;QACvE,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC;YAC1B,MAAM,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAChC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;gBAAE,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;QAC/C,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;QACnD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAE,CAAC;QACvC,MAAM,MAAM,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAEjC,KAAK,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,SAAS;YAClC,QAAQ,CAAC,KAAK,EAAE,0BAA0B,EAAE;gBAC1C,OAAO,EAAE,cAAc,OAAO,OAAO,IAAI,MAAM,MAAM,CAAC,IAAI,yBAAyB,EAAE,CAAC,IAAI,UAAU,IAAI,KAAK,EAAE,CAAC,IAAI,aAAa,SAAS,sBAAsB;gBAChK,IAAI,EAAE,EAAE,CAAC,IAAI;gBACb,IAAI,EAAE,MAAM;aACb,CAAC,CAAC;QACL,CAAC;QACD,KAAK,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC;YACnC,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC7B,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,QAAQ,CAAC,KAAK,EAAE,0BAA0B,EAAE;oBAC1C,OAAO,EAAE,GAAG,IAAI,KAAK,EAAE,CAAC,IAAI,aAAa,SAAS,iBAAiB,EAAE,CAAC,IAAI,qBAAqB,OAAO,OAAO,IAAI,MAAM,MAAM,CAAC,IAAI,gCAAgC;oBAClK,IAAI,EAAE,EAAE,CAAC,IAAI;oBACb,IAAI,EAAE,MAAM;iBACb,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YACD,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,aAAa,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,aAAa,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5E,QAAQ,CAAC,KAAK,EAAE,0BAA0B,EAAE;oBAC1C,OAAO,EAAE,UAAU,EAAE,CAAC,IAAI,QAAQ,IAAI,KAAK,EAAE,CAAC,IAAI,aAAa,SAAS,iBAAiB,EAAE,CAAC,IAAI,yBAAyB,EAAE,CAAC,IAAI,oBAAoB,OAAO,GAAG;oBAC9J,IAAI,EAAE,EAAE,CAAC,IAAI;oBACb,IAAI,EAAE,MAAM;iBACb,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { NormalizedModel } from "../model/model.js";
|
|
2
|
+
import { RefsResult } from "../model/refs.js";
|
|
3
|
+
import { Diagnostic } from "../model/validate.js";
|
|
4
|
+
/**
|
|
5
|
+
* Resolve every slice's note-binding mismatches. `baseDir` is the `.em` file's directory, same
|
|
6
|
+
* convention every other doc/note path in em uses.
|
|
7
|
+
*/
|
|
8
|
+
export declare function validateNoteBindings(model: NormalizedModel, refs: RefsResult, baseDir: string): Diagnostic[];
|