lens-content-processor 0.78.0 → 0.80.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/dist/authoring-markup.d.ts +22 -0
- package/dist/authoring-markup.js +24 -0
- package/dist/authoring-markup.js.map +1 -1
- package/dist/cache.d.ts +10 -0
- package/dist/cache.js +6 -5
- package/dist/cache.js.map +1 -1
- package/dist/cli-steps.d.ts +37 -0
- package/dist/cli-steps.js +80 -0
- package/dist/cli-steps.js.map +1 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.js +52 -70
- package/dist/cli.js.map +1 -1
- package/dist/course-graph.d.ts +2 -2
- package/dist/course-graph.js +7 -2
- package/dist/course-graph.js.map +1 -1
- package/dist/criticmarkup-forms.d.ts +8 -6
- package/dist/criticmarkup-forms.js +22 -19
- package/dist/criticmarkup-forms.js.map +1 -1
- package/dist/dedupe-errors.d.ts +16 -0
- package/dist/dedupe-errors.js +23 -9
- package/dist/dedupe-errors.js.map +1 -1
- package/dist/dependency-cache.d.ts +15 -5
- package/dist/dependency-cache.js +33 -74
- package/dist/dependency-cache.js.map +1 -1
- package/dist/dropped.d.ts +114 -0
- package/dist/dropped.js +253 -0
- package/dist/dropped.js.map +1 -0
- package/dist/engine/assemble.d.ts +44 -0
- package/dist/engine/assemble.js +132 -0
- package/dist/engine/assemble.js.map +1 -0
- package/dist/engine/build.d.ts +8 -0
- package/dist/engine/build.js +558 -0
- package/dist/engine/build.js.map +1 -0
- package/dist/engine/file-facts.d.ts +26 -0
- package/dist/engine/file-facts.js +63 -0
- package/dist/engine/file-facts.js.map +1 -0
- package/dist/engine/git-source.d.ts +35 -0
- package/dist/engine/git-source.js +242 -0
- package/dist/engine/git-source.js.map +1 -0
- package/dist/engine/overlay.d.ts +43 -0
- package/dist/engine/overlay.js +167 -0
- package/dist/engine/overlay.js.map +1 -0
- package/dist/engine/protocol.d.ts +146 -0
- package/dist/engine/protocol.js +40 -0
- package/dist/engine/protocol.js.map +1 -0
- package/dist/engine/reader.d.ts +133 -0
- package/dist/engine/reader.js +298 -0
- package/dist/engine/reader.js.map +1 -0
- package/dist/engine/sources.d.ts +39 -0
- package/dist/engine/sources.js +137 -0
- package/dist/engine/sources.js.map +1 -0
- package/dist/engine/sqlite-store.d.ts +99 -0
- package/dist/engine/sqlite-store.js +452 -0
- package/dist/engine/sqlite-store.js.map +1 -0
- package/dist/engine/store.d.ts +85 -0
- package/dist/engine/store.js +31 -0
- package/dist/engine/store.js.map +1 -0
- package/dist/engine/tables.d.ts +15 -0
- package/dist/engine/tables.js +70 -0
- package/dist/engine/tables.js.map +1 -0
- package/dist/engine/units.d.ts +58 -0
- package/dist/engine/units.js +186 -0
- package/dist/engine/units.js.map +1 -0
- package/dist/engine/version.d.ts +6 -0
- package/dist/engine/version.js +21 -0
- package/dist/engine/version.js.map +1 -0
- package/dist/engine/worker.d.ts +1 -0
- package/dist/engine/worker.js +220 -0
- package/dist/engine/worker.js.map +1 -0
- package/dist/flattener/index.d.ts +34 -17
- package/dist/flattener/index.js +247 -116
- package/dist/flattener/index.js.map +1 -1
- package/dist/flattener/resolve-text-links.d.ts +15 -14
- package/dist/flattener/resolve-text-links.js +24 -25
- package/dist/flattener/resolve-text-links.js.map +1 -1
- package/dist/glossary.d.ts +2 -2
- package/dist/glossary.js.map +1 -1
- package/dist/index.d.ts +168 -2
- package/dist/index.js +888 -616
- package/dist/index.js.map +1 -1
- package/dist/markdown-parse.d.ts +6 -0
- package/dist/markdown-parse.js +14 -0
- package/dist/markdown-parse.js.map +1 -1
- package/dist/parser/learning-outcome.js +11 -2
- package/dist/parser/learning-outcome.js.map +1 -1
- package/dist/parser/lens.d.ts +15 -2
- package/dist/parser/lens.js +38 -11
- package/dist/parser/lens.js.map +1 -1
- package/dist/parser/meeting-doc.d.ts +2 -1
- package/dist/parser/meeting-doc.js +2 -1
- package/dist/parser/meeting-doc.js.map +1 -1
- package/dist/parser/module.d.ts +3 -1
- package/dist/parser/module.js +7 -5
- package/dist/parser/module.js.map +1 -1
- package/dist/parser/question-embeds.d.ts +46 -0
- package/dist/parser/question-embeds.js +302 -0
- package/dist/parser/question-embeds.js.map +1 -0
- package/dist/parser/response-segments.js +12 -0
- package/dist/parser/response-segments.js.map +1 -1
- package/dist/parser/sections.d.ts +18 -0
- package/dist/parser/sections.js +31 -3
- package/dist/parser/sections.js.map +1 -1
- package/dist/parser/widget.d.ts +2 -1
- package/dist/parser/widget.js.map +1 -1
- package/dist/parser/wikilink.d.ts +13 -3
- package/dist/parser/wikilink.js +55 -34
- package/dist/parser/wikilink.js.map +1 -1
- package/dist/reference-graph.d.ts +21 -3
- package/dist/reference-graph.js +35 -12
- package/dist/reference-graph.js.map +1 -1
- package/dist/same-page-links.d.ts +11 -1
- package/dist/same-page-links.js +9 -0
- package/dist/same-page-links.js.map +1 -1
- package/dist/skill-tree.d.ts +2 -1
- package/dist/skill-tree.js.map +1 -1
- package/dist/source-location.d.ts +0 -4
- package/dist/source-location.js +0 -43
- package/dist/source-location.js.map +1 -1
- package/dist/validator/card-module-membership.d.ts +17 -1
- package/dist/validator/card-module-membership.js +60 -56
- package/dist/validator/card-module-membership.js.map +1 -1
- package/dist/validator/criticmarkup.js +1 -1
- package/dist/validator/criticmarkup.js.map +1 -1
- package/dist/validator/field-typos.d.ts +1 -1
- package/dist/validator/field-typos.js +21 -21
- package/dist/validator/field-typos.js.map +1 -1
- package/dist/validator/output-integrity.d.ts +9 -5
- package/dist/validator/output-integrity.js +43 -45
- package/dist/validator/output-integrity.js.map +1 -1
- package/dist/validator/tier.d.ts +2 -2
- package/dist/validator/tier.js.map +1 -1
- package/dist/validator/uuid.d.ts +1 -1
- package/package.json +2 -1
|
@@ -23,6 +23,28 @@ export declare function stripAuthoringMarkupForValidation(content: string): stri
|
|
|
23
23
|
* (shared with the pending-suggestion validator); see that table.
|
|
24
24
|
*/
|
|
25
25
|
export declare function stripCriticMarkup(content: string): string;
|
|
26
|
+
/**
|
|
27
|
+
* The drafts view: content with every pending CriticMarkup suggestion
|
|
28
|
+
* accepted, read from the same table as stripCriticMarkup. Additions keep
|
|
29
|
+
* their text, deletions go, substitutions take their new text; comments go
|
|
30
|
+
* and highlights keep their text, as in the approved view.
|
|
31
|
+
*
|
|
32
|
+
* It matches "Accept All" in the Lens Editor (lens-relay: the review page
|
|
33
|
+
* applies each suggestion with y-sweet-core's critic_surgical.rs and leaves
|
|
34
|
+
* comments and highlights, which publishing resolves the same way; the
|
|
35
|
+
* in-editor accept is lens-editor/src/lib/criticmarkup-actions.ts). The relay
|
|
36
|
+
* MCP's accepted_view (crates/relay/src/mcp/tools/critic_markup.rs) differs in
|
|
37
|
+
* two ways, and this follows the editor in both:
|
|
38
|
+
* - Substitutions: accepted_view leaves {~~old~>new~~} as text, which the
|
|
39
|
+
* publish strip then turns into the old text. Here it is the new text.
|
|
40
|
+
* - Fenced code: accepted_view leaves markup inside ``` fences as text. Here
|
|
41
|
+
* it is resolved like markup anywhere else, as the approved view does; left
|
|
42
|
+
* as text, the publish strip would reject every fenced suggestion.
|
|
43
|
+
* Nested suggestions resolve in one pass, in table order, as in the approved
|
|
44
|
+
* view. The review page resolves overlapping suggestions over several presses,
|
|
45
|
+
* so badly nested markup can end differently there.
|
|
46
|
+
*/
|
|
47
|
+
export declare function acceptAllSuggestions(content: string): string;
|
|
26
48
|
/**
|
|
27
49
|
* Strip all authoring markup (CriticMarkup + Obsidian comments) from content.
|
|
28
50
|
* Call before parsing or publishing learner-facing content.
|
package/dist/authoring-markup.js
CHANGED
|
@@ -46,6 +46,30 @@ export function stripAuthoringMarkupForValidation(content) {
|
|
|
46
46
|
export function stripCriticMarkup(content) {
|
|
47
47
|
return CRITIC_MARKUP_FORMS.reduce((text, form) => text.replace(form.re, form.rejected), content);
|
|
48
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* The drafts view: content with every pending CriticMarkup suggestion
|
|
51
|
+
* accepted, read from the same table as stripCriticMarkup. Additions keep
|
|
52
|
+
* their text, deletions go, substitutions take their new text; comments go
|
|
53
|
+
* and highlights keep their text, as in the approved view.
|
|
54
|
+
*
|
|
55
|
+
* It matches "Accept All" in the Lens Editor (lens-relay: the review page
|
|
56
|
+
* applies each suggestion with y-sweet-core's critic_surgical.rs and leaves
|
|
57
|
+
* comments and highlights, which publishing resolves the same way; the
|
|
58
|
+
* in-editor accept is lens-editor/src/lib/criticmarkup-actions.ts). The relay
|
|
59
|
+
* MCP's accepted_view (crates/relay/src/mcp/tools/critic_markup.rs) differs in
|
|
60
|
+
* two ways, and this follows the editor in both:
|
|
61
|
+
* - Substitutions: accepted_view leaves {~~old~>new~~} as text, which the
|
|
62
|
+
* publish strip then turns into the old text. Here it is the new text.
|
|
63
|
+
* - Fenced code: accepted_view leaves markup inside ``` fences as text. Here
|
|
64
|
+
* it is resolved like markup anywhere else, as the approved view does; left
|
|
65
|
+
* as text, the publish strip would reject every fenced suggestion.
|
|
66
|
+
* Nested suggestions resolve in one pass, in table order, as in the approved
|
|
67
|
+
* view. The review page resolves overlapping suggestions over several presses,
|
|
68
|
+
* so badly nested markup can end differently there.
|
|
69
|
+
*/
|
|
70
|
+
export function acceptAllSuggestions(content) {
|
|
71
|
+
return CRITIC_MARKUP_FORMS.reduce((text, form) => text.replace(form.re, form.accepted), content);
|
|
72
|
+
}
|
|
49
73
|
/**
|
|
50
74
|
* Strip all authoring markup (CriticMarkup + Obsidian comments) from content.
|
|
51
75
|
* Call before parsing or publishing learner-facing content.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authoring-markup.js","sourceRoot":"","sources":["../src/authoring-markup.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"authoring-markup.js","sourceRoot":"","sources":["../src/authoring-markup.ts"],"names":[],"mappings":"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"}
|
package/dist/cache.d.ts
CHANGED
|
@@ -1,3 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hash of every code file in the running processor's own directory tree
|
|
3
|
+
* (src/** under tsx; dist/** in the published package) plus the package
|
|
4
|
+
* manifest and lockfile one level up — parsing behavior lives in the
|
|
5
|
+
* dependencies as much as in this repo's code, so a dependency bump must
|
|
6
|
+
* invalidate entries too. Any such change therefore invalidates every cache
|
|
7
|
+
* entry, which is what makes a hit exactly as trustworthy as a recompute.
|
|
8
|
+
* The engine's validator version (engine/version.ts) uses the same hash.
|
|
9
|
+
*/
|
|
10
|
+
export declare function computeCodeFingerprint(): string;
|
|
1
11
|
export declare class FileResultCache {
|
|
2
12
|
private readonly dir;
|
|
3
13
|
private readonly salt;
|
package/dist/cache.js
CHANGED
|
@@ -15,7 +15,7 @@ import { mkdirSync, readFileSync, readdirSync, renameSync, rmSync, statSync, uti
|
|
|
15
15
|
import { createHash } from "crypto";
|
|
16
16
|
import { dirname, join } from "path";
|
|
17
17
|
import { fileURLToPath } from "url";
|
|
18
|
-
import {
|
|
18
|
+
import { decodeUnit, encodeUnit } from "./engine/units.js";
|
|
19
19
|
/** Entries untouched for this long are deleted by the startup prune. */
|
|
20
20
|
const MAX_ENTRY_AGE_MS = 14 * 24 * 60 * 60 * 1000;
|
|
21
21
|
/** Startup prune runs at most this often (tracked via a marker file). */
|
|
@@ -30,8 +30,9 @@ function sha256(data) {
|
|
|
30
30
|
* dependencies as much as in this repo's code, so a dependency bump must
|
|
31
31
|
* invalidate entries too. Any such change therefore invalidates every cache
|
|
32
32
|
* entry, which is what makes a hit exactly as trustworthy as a recompute.
|
|
33
|
+
* The engine's validator version (engine/version.ts) uses the same hash.
|
|
33
34
|
*/
|
|
34
|
-
function computeCodeFingerprint() {
|
|
35
|
+
export function computeCodeFingerprint() {
|
|
35
36
|
const root = dirname(fileURLToPath(import.meta.url));
|
|
36
37
|
const hash = createHash("sha256");
|
|
37
38
|
const walk = (dir, rel) => {
|
|
@@ -116,7 +117,7 @@ export class FileResultCache {
|
|
|
116
117
|
// Entries are wrapped ({v, data}) so bytes that decode to SOME valid
|
|
117
118
|
// JSON — but not to something put() wrote — are still rejected, deleted,
|
|
118
119
|
// and recomputed, exactly like invalid JSON from a torn write. data
|
|
119
|
-
//
|
|
120
|
+
// is encoded as the build layer encodes a unit's output (engine/units.ts).
|
|
120
121
|
const entry = JSON.parse(raw);
|
|
121
122
|
if (entry === null ||
|
|
122
123
|
typeof entry !== "object" ||
|
|
@@ -125,7 +126,7 @@ export class FileResultCache {
|
|
|
125
126
|
!("data" in entry)) {
|
|
126
127
|
throw new Error("not a cache entry");
|
|
127
128
|
}
|
|
128
|
-
value =
|
|
129
|
+
value = decodeUnit(entry.data);
|
|
129
130
|
}
|
|
130
131
|
catch {
|
|
131
132
|
try {
|
|
@@ -152,7 +153,7 @@ export class FileResultCache {
|
|
|
152
153
|
const file = this.entryPath(kind, path, content);
|
|
153
154
|
const tmp = `${file}.${process.pid}.tmp`;
|
|
154
155
|
try {
|
|
155
|
-
writeFileSync(tmp, JSON.stringify({ v: 1, data:
|
|
156
|
+
writeFileSync(tmp, JSON.stringify({ v: 1, data: encodeUnit(value) }), "utf-8");
|
|
156
157
|
renameSync(tmp, file); // atomic: concurrent readers see old-or-new, never partial
|
|
157
158
|
}
|
|
158
159
|
catch (error) {
|
package/dist/cache.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,EAAE;AACF,8EAA8E;AAC9E,4EAA4E;AAC5E,2EAA2E;AAC3E,+EAA+E;AAC/E,0EAA0E;AAC1E,EAAE;AACF,4EAA4E;AAC5E,+EAA+E;AAC/E,6EAA6E;AAC7E,0EAA0E;AAC1E,wEAAwE;AAExE,OAAO,EACL,SAAS,EACT,YAAY,EACZ,WAAW,EACX,UAAU,EACV,MAAM,EACN,QAAQ,EACR,UAAU,EACV,aAAa,GACd,MAAM,IAAI,CAAC;AACZ,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { ContentError, UrlToValidate } from "./index.js";
|
|
2
|
+
import type { FileResultCache } from "./cache.js";
|
|
3
|
+
import { UrlCache } from "./validator/url-cache.js";
|
|
4
|
+
/**
|
|
5
|
+
* The course reachability map of the validator page (reference-graph.ts).
|
|
6
|
+
* Degradable (per AGENTS.md): it only feeds that page's course filter, so a
|
|
7
|
+
* failure must never break content processing for the whole platform; the
|
|
8
|
+
* map is then empty.
|
|
9
|
+
*/
|
|
10
|
+
export declare function courseReachability(build: () => Record<string, string[]>): Record<string, string[]>;
|
|
11
|
+
/**
|
|
12
|
+
* The per-course checks (course-graph.ts), in the order `errors` gets them.
|
|
13
|
+
* Degradable (per AGENTS.md): they only add warnings, so a failure must never
|
|
14
|
+
* break content processing for the whole platform. It becomes one warning
|
|
15
|
+
* instead, because silence would read as "no course-graph problems". `cache`
|
|
16
|
+
* is cli.ts's --cache-dir, which keeps the title scan of each file.
|
|
17
|
+
*/
|
|
18
|
+
export declare function courseGraphChecks(files: ReadonlyMap<string, string>, cache?: FileResultCache): ContentError[];
|
|
19
|
+
/**
|
|
20
|
+
* `errors` (already deduped) with the course-graph checks merged in. The
|
|
21
|
+
* platform repeats this merge in Python when the checks run as their own job
|
|
22
|
+
* (core/content/course_graph.py).
|
|
23
|
+
*/
|
|
24
|
+
export declare function withCourseGraph(errors: ContentError[], files: ReadonlyMap<string, string>, cache?: FileResultCache): ContentError[];
|
|
25
|
+
/** What --defer-urls adds to the output. */
|
|
26
|
+
export interface DeferredUrlReport {
|
|
27
|
+
urlIssues: ContentError[];
|
|
28
|
+
staleUrlCount: number;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* --defer-urls, zero network: issues from still-fresh URL cache entries, and
|
|
32
|
+
* how many unique URLs need a live check. The platform runs those later
|
|
33
|
+
* (--check-urls-only) and replaces urlIssues wholesale, so they stay out of
|
|
34
|
+
* `errors`. The report depends on the time, so the engine computes it per job
|
|
35
|
+
* and never stores it.
|
|
36
|
+
*/
|
|
37
|
+
export declare function deferredUrlReport(errors: ContentError[], urlsToValidate: UrlToValidate[], cache?: UrlCache): DeferredUrlReport;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// The steps the CLI runs after processContent: the course reachability map,
|
|
2
|
+
// the per-course checks, and the --defer-urls report. cli.ts and the engine
|
|
3
|
+
// (engine/assemble.ts) both call these, so the platform's two paths emit the
|
|
4
|
+
// same output.
|
|
5
|
+
import { courseGraphIssues, partnerNameIssues } from "./course-graph.js";
|
|
6
|
+
import { dedupeErrors } from "./dedupe-errors.js";
|
|
7
|
+
import { materializeUrlIssue } from "./validator/url-reachability.js";
|
|
8
|
+
import { UrlCache } from "./validator/url-cache.js";
|
|
9
|
+
/**
|
|
10
|
+
* The course reachability map of the validator page (reference-graph.ts).
|
|
11
|
+
* Degradable (per AGENTS.md): it only feeds that page's course filter, so a
|
|
12
|
+
* failure must never break content processing for the whole platform; the
|
|
13
|
+
* map is then empty.
|
|
14
|
+
*/
|
|
15
|
+
export function courseReachability(build) {
|
|
16
|
+
try {
|
|
17
|
+
return build();
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
console.error("buildFileToCourses failed; serving validation without the course filter:", error instanceof Error ? error.message : error);
|
|
21
|
+
return {};
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* The per-course checks (course-graph.ts), in the order `errors` gets them.
|
|
26
|
+
* Degradable (per AGENTS.md): they only add warnings, so a failure must never
|
|
27
|
+
* break content processing for the whole platform. It becomes one warning
|
|
28
|
+
* instead, because silence would read as "no course-graph problems". `cache`
|
|
29
|
+
* is cli.ts's --cache-dir, which keeps the title scan of each file.
|
|
30
|
+
*/
|
|
31
|
+
export function courseGraphChecks(files, cache) {
|
|
32
|
+
try {
|
|
33
|
+
return [...courseGraphIssues(files, cache), ...partnerNameIssues(files)];
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
console.error("courseGraphIssues failed; serving validation without course-graph checks:", error instanceof Error ? error.message : error);
|
|
37
|
+
return [
|
|
38
|
+
{
|
|
39
|
+
file: "(course graph)",
|
|
40
|
+
code: "course-graph.failed",
|
|
41
|
+
severity: "warning",
|
|
42
|
+
message: `Course-graph checks did not run: ${error instanceof Error ? error.message : String(error)}`,
|
|
43
|
+
},
|
|
44
|
+
];
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* `errors` (already deduped) with the course-graph checks merged in. The
|
|
49
|
+
* platform repeats this merge in Python when the checks run as their own job
|
|
50
|
+
* (core/content/course_graph.py).
|
|
51
|
+
*/
|
|
52
|
+
export function withCourseGraph(errors, files, cache) {
|
|
53
|
+
return dedupeErrors([...errors, ...courseGraphChecks(files, cache)]);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* --defer-urls, zero network: issues from still-fresh URL cache entries, and
|
|
57
|
+
* how many unique URLs need a live check. The platform runs those later
|
|
58
|
+
* (--check-urls-only) and replaces urlIssues wholesale, so they stay out of
|
|
59
|
+
* `errors`. The report depends on the time, so the engine computes it per job
|
|
60
|
+
* and never stores it.
|
|
61
|
+
*/
|
|
62
|
+
export function deferredUrlReport(errors, urlsToValidate, cache = UrlCache.load()) {
|
|
63
|
+
const cachedIssues = [];
|
|
64
|
+
for (const entry of urlsToValidate) {
|
|
65
|
+
const outcome = cache.getFresh(entry.url);
|
|
66
|
+
if (!outcome)
|
|
67
|
+
continue;
|
|
68
|
+
const issue = materializeUrlIssue(entry, outcome);
|
|
69
|
+
if (issue)
|
|
70
|
+
cachedIssues.push(issue);
|
|
71
|
+
}
|
|
72
|
+
// Dedupe against content errors exactly like the default mode's combined
|
|
73
|
+
// dedupe, then keep only the URL tail (errors are already deduped, so the
|
|
74
|
+
// slice boundary is exact).
|
|
75
|
+
return {
|
|
76
|
+
urlIssues: dedupeErrors([...errors, ...cachedIssues]).slice(errors.length),
|
|
77
|
+
staleUrlCount: cache.staleCount(urlsToValidate),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=cli-steps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-steps.js","sourceRoot":"","sources":["../src/cli-steps.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,4EAA4E;AAC5E,6EAA6E;AAC7E,eAAe;AAIf,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEpD;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAAqC;IAErC,IAAI,CAAC;QACH,OAAO,KAAK,EAAE,CAAC;IACjB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,0EAA0E,EAC1E,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAC/C,CAAC;QACF,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAkC,EAClC,KAAuB;IAEvB,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,2EAA2E,EAC3E,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAC/C,CAAC;QACF,OAAO;YACL;gBACE,IAAI,EAAE,gBAAgB;gBACtB,IAAI,EAAE,qBAAqB;gBAC3B,QAAQ,EAAE,SAAS;gBACnB,OAAO,EAAE,oCAAoC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;aACtG;SACF,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAC7B,MAAsB,EACtB,KAAkC,EAClC,KAAuB;IAEvB,OAAO,YAAY,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;AACvE,CAAC;AAQD;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAAsB,EACtB,cAA+B,EAC/B,QAAkB,QAAQ,CAAC,IAAI,EAAE;IAEjC,MAAM,YAAY,GAAmB,EAAE,CAAC;IACxC,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,MAAM,KAAK,GAAG,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAClD,IAAI,KAAK;YAAE,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IACD,yEAAyE;IACzE,0EAA0E;IAC1E,4BAA4B;IAC5B,OAAO;QACL,SAAS,EAAE,YAAY,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;QAC1E,aAAa,EAAE,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC;KAChD,CAAC;AACJ,CAAC"}
|
package/dist/cli.d.ts
CHANGED
|
@@ -11,6 +11,11 @@ export interface CliOptions {
|
|
|
11
11
|
skipUrls: boolean;
|
|
12
12
|
/** Directory for the per-file result cache (see cache.ts). null = no caching. */
|
|
13
13
|
cacheDir: string | null;
|
|
14
|
+
/** Leave the course-graph checks out of `errors`. The platform runs them as a
|
|
15
|
+
* separate background job (--course-graph-only) and merges them itself. */
|
|
16
|
+
skipCourseGraph: boolean;
|
|
17
|
+
/** Print only the course-graph issues of the input, as a JSON array. */
|
|
18
|
+
courseGraphOnly: boolean;
|
|
14
19
|
}
|
|
15
20
|
/**
|
|
16
21
|
* The CLI's JSON output: the core ProcessResult plus a course-reachability map
|
|
@@ -23,3 +28,5 @@ export type CliResult = ProcessResult & {
|
|
|
23
28
|
};
|
|
24
29
|
export declare function parseArgs(argv: string[]): CliOptions;
|
|
25
30
|
export declare function run(options: CliOptions): Promise<CliResult>;
|
|
31
|
+
/** processContent and the CLI's own steps, over files already read. */
|
|
32
|
+
export declare function runOn(files: Map<string, string>, options: Pick<CliOptions, "cacheDir" | "skipCourseGraph">): CliResult;
|
package/dist/cli.js
CHANGED
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
// src/cli.ts
|
|
3
3
|
import { readVaultFiles } from "./fs/read-vault.js";
|
|
4
4
|
import { processContent, FileResultCache, } from "./index.js";
|
|
5
|
-
import { validateUrls
|
|
5
|
+
import { validateUrls } from "./validator/url-reachability.js";
|
|
6
6
|
import { UrlCache } from "./validator/url-cache.js";
|
|
7
7
|
import { buildFileToCourses } from "./reference-graph.js";
|
|
8
8
|
import { dedupeErrors } from "./dedupe-errors.js";
|
|
9
|
-
import {
|
|
9
|
+
import { courseGraphChecks, courseReachability, deferredUrlReport, withCourseGraph, } from "./cli-steps.js";
|
|
10
10
|
import { readFile, writeFile } from "fs/promises";
|
|
11
11
|
export function parseArgs(argv) {
|
|
12
12
|
const args = argv.slice(2);
|
|
@@ -18,6 +18,8 @@ export function parseArgs(argv) {
|
|
|
18
18
|
let checkUrlsOnly = false;
|
|
19
19
|
let skipUrls = false;
|
|
20
20
|
let cacheDir = null;
|
|
21
|
+
let skipCourseGraph = false;
|
|
22
|
+
let courseGraphOnly = false;
|
|
21
23
|
for (let i = 0; i < args.length; i++) {
|
|
22
24
|
if (args[i] === "--output" || args[i] === "-o") {
|
|
23
25
|
outputPath = args[i + 1] || null;
|
|
@@ -43,6 +45,12 @@ export function parseArgs(argv) {
|
|
|
43
45
|
else if (args[i] === "--skip-urls") {
|
|
44
46
|
skipUrls = true;
|
|
45
47
|
}
|
|
48
|
+
else if (args[i] === "--skip-course-graph") {
|
|
49
|
+
skipCourseGraph = true;
|
|
50
|
+
}
|
|
51
|
+
else if (args[i] === "--course-graph-only") {
|
|
52
|
+
courseGraphOnly = true;
|
|
53
|
+
}
|
|
46
54
|
else if (!args[i].startsWith("-")) {
|
|
47
55
|
vaultPath = args[i];
|
|
48
56
|
}
|
|
@@ -56,6 +64,8 @@ export function parseArgs(argv) {
|
|
|
56
64
|
checkUrlsOnly,
|
|
57
65
|
skipUrls,
|
|
58
66
|
cacheDir,
|
|
67
|
+
skipCourseGraph,
|
|
68
|
+
courseGraphOnly,
|
|
59
69
|
};
|
|
60
70
|
}
|
|
61
71
|
async function readStdin() {
|
|
@@ -65,59 +75,48 @@ async function readStdin() {
|
|
|
65
75
|
}
|
|
66
76
|
return Buffer.concat(chunks).toString("utf-8");
|
|
67
77
|
}
|
|
68
|
-
|
|
69
|
-
let files;
|
|
78
|
+
async function readFiles(options) {
|
|
70
79
|
if (options.stdin || options.inputPath) {
|
|
71
80
|
// JSON { "path": "content", ... } from stdin or a file
|
|
72
81
|
const input = options.inputPath
|
|
73
82
|
? await readFile(options.inputPath, "utf-8")
|
|
74
83
|
: await readStdin();
|
|
75
|
-
|
|
84
|
+
return new Map(Object.entries(JSON.parse(input)));
|
|
76
85
|
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
throw new Error("Vault path is required (or use --stdin / --input)");
|
|
80
|
-
}
|
|
81
|
-
files = await readVaultFiles(options.vaultPath);
|
|
86
|
+
if (!options.vaultPath) {
|
|
87
|
+
throw new Error("Vault path is required (or use --stdin / --input)");
|
|
82
88
|
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
89
|
+
return readVaultFiles(options.vaultPath);
|
|
90
|
+
}
|
|
91
|
+
/** --cache-dir's cache. FileResultCache.open returns undefined on any
|
|
92
|
+
* failure: processing then simply runs uncached. */
|
|
93
|
+
function openCache({ cacheDir, }) {
|
|
94
|
+
return cacheDir ? FileResultCache.open(cacheDir) : undefined;
|
|
95
|
+
}
|
|
96
|
+
export async function run(options) {
|
|
97
|
+
return runOn(await readFiles(options), options);
|
|
98
|
+
}
|
|
99
|
+
/** processContent and the CLI's own steps, over files already read. */
|
|
100
|
+
export function runOn(files, options) {
|
|
101
|
+
const cache = openCache(options);
|
|
88
102
|
const result = processContent(files, cache);
|
|
89
103
|
// Course-reachability map for the validator page. Computed here, not in
|
|
90
104
|
// processContent, so it stays out of the Python-parity / fixture output.
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
let fileToCourses = {};
|
|
95
|
-
try {
|
|
96
|
-
fileToCourses = buildFileToCourses(files);
|
|
97
|
-
}
|
|
98
|
-
catch (error) {
|
|
99
|
-
console.error("buildFileToCourses failed; serving validation without the course filter:", error instanceof Error ? error.message : error);
|
|
105
|
+
const fileToCourses = courseReachability(() => buildFileToCourses(files));
|
|
106
|
+
if (!options.skipCourseGraph) {
|
|
107
|
+
result.errors = withCourseGraph(result.errors, files, cache);
|
|
100
108
|
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
]);
|
|
109
|
+
return { ...result, fileToCourses };
|
|
110
|
+
}
|
|
111
|
+
async function emit(value, outputPath) {
|
|
112
|
+
const json = JSON.stringify(value, null, 2);
|
|
113
|
+
if (outputPath) {
|
|
114
|
+
await writeFile(outputPath, json, "utf-8");
|
|
115
|
+
console.error(`Written to ${outputPath}`);
|
|
109
116
|
}
|
|
110
|
-
|
|
111
|
-
console.
|
|
112
|
-
// Say so in the output too: silence would read as "no course-graph problems".
|
|
113
|
-
result.errors.push({
|
|
114
|
-
file: "(course graph)",
|
|
115
|
-
code: "course-graph.failed",
|
|
116
|
-
severity: "warning",
|
|
117
|
-
message: `Course-graph checks did not run: ${error instanceof Error ? error.message : String(error)}`,
|
|
118
|
-
});
|
|
117
|
+
else {
|
|
118
|
+
console.log(json);
|
|
119
119
|
}
|
|
120
|
-
return { ...result, fileToCourses };
|
|
121
120
|
}
|
|
122
121
|
async function main() {
|
|
123
122
|
const options = parseArgs(process.argv);
|
|
@@ -125,6 +124,11 @@ async function main() {
|
|
|
125
124
|
console.error("--defer-urls and --check-urls-only are mutually exclusive");
|
|
126
125
|
process.exit(1);
|
|
127
126
|
}
|
|
127
|
+
if (options.courseGraphOnly &&
|
|
128
|
+
(options.checkUrlsOnly || options.skipCourseGraph)) {
|
|
129
|
+
console.error("--course-graph-only cannot be combined with --check-urls-only or --skip-course-graph");
|
|
130
|
+
process.exit(1);
|
|
131
|
+
}
|
|
128
132
|
if (options.checkUrlsOnly) {
|
|
129
133
|
try {
|
|
130
134
|
const urls = JSON.parse(await readStdin());
|
|
@@ -144,31 +148,16 @@ async function main() {
|
|
|
144
148
|
process.exit(1);
|
|
145
149
|
}
|
|
146
150
|
try {
|
|
151
|
+
if (options.courseGraphOnly) {
|
|
152
|
+
await emit(courseGraphChecks(await readFiles(options), openCache(options)), options.outputPath);
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
147
155
|
const result = await run(options);
|
|
148
156
|
let output = result;
|
|
149
157
|
if (options.deferUrls) {
|
|
150
|
-
// Zero network: materialize issues from still-fresh cache entries and
|
|
151
|
-
// report how many unique URLs would need a live check. The consumer
|
|
152
|
-
// (backend) runs those later via --check-urls-only and replaces
|
|
153
|
-
// urlIssues wholesale — hence issues stay OUT of `errors` here.
|
|
154
|
-
const cache = UrlCache.load();
|
|
155
|
-
const cachedIssues = [];
|
|
156
|
-
for (const entry of result.urlsToValidate) {
|
|
157
|
-
const outcome = cache.getFresh(entry.url);
|
|
158
|
-
if (!outcome)
|
|
159
|
-
continue;
|
|
160
|
-
const issue = materializeUrlIssue(entry, outcome);
|
|
161
|
-
if (issue)
|
|
162
|
-
cachedIssues.push(issue);
|
|
163
|
-
}
|
|
164
|
-
// Dedupe against content errors exactly like the default mode's combined
|
|
165
|
-
// dedupe, then keep only the URL tail (errors are already deduped, so
|
|
166
|
-
// the slice boundary is exact).
|
|
167
|
-
const urlIssues = dedupeErrors([...result.errors, ...cachedIssues]).slice(result.errors.length);
|
|
168
158
|
output = {
|
|
169
159
|
...result,
|
|
170
|
-
|
|
171
|
-
staleUrlCount: cache.staleCount(result.urlsToValidate),
|
|
160
|
+
...deferredUrlReport(result.errors, result.urlsToValidate),
|
|
172
161
|
};
|
|
173
162
|
}
|
|
174
163
|
else if (!options.skipUrls && result.urlsToValidate.length > 0) {
|
|
@@ -177,14 +166,7 @@ async function main() {
|
|
|
177
166
|
// deduped, and can themselves repeat (same unreachable URL twice).
|
|
178
167
|
result.errors = dedupeErrors([...result.errors, ...urlWarnings]);
|
|
179
168
|
}
|
|
180
|
-
|
|
181
|
-
if (options.outputPath) {
|
|
182
|
-
await writeFile(options.outputPath, json, "utf-8");
|
|
183
|
-
console.error(`Written to ${options.outputPath}`);
|
|
184
|
-
}
|
|
185
|
-
else {
|
|
186
|
-
console.log(json);
|
|
187
|
-
}
|
|
169
|
+
await emit(output, options.outputPath);
|
|
188
170
|
}
|
|
189
171
|
catch (error) {
|
|
190
172
|
console.error("Error:", error instanceof Error ? error.message : error);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,aAAa;AACb,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EACL,cAAc,EACd,eAAe,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/course-graph.d.ts
CHANGED
|
@@ -2,5 +2,5 @@ import type { ContentError } from "./index.js";
|
|
|
2
2
|
import type { FileResultCache } from "./cache.js";
|
|
3
3
|
/** cache: per-file memo of the title scan (the bulk of the cost), keyed by
|
|
4
4
|
* the file and the title pattern it was scanned with. */
|
|
5
|
-
export declare function courseGraphIssues(
|
|
6
|
-
export declare function partnerNameIssues(
|
|
5
|
+
export declare function courseGraphIssues(input: ReadonlyMap<string, string>, cache?: FileResultCache): ContentError[];
|
|
6
|
+
export declare function partnerNameIssues(input: ReadonlyMap<string, string>): ContentError[];
|
package/dist/course-graph.js
CHANGED
|
@@ -33,6 +33,7 @@ import { parseFrontmatter, HTML_FRONTMATTER_OPEN, HTML_FRONTMATTER_CLOSE, } from
|
|
|
33
33
|
import { isContentTextFile } from "./parser/widget.js";
|
|
34
34
|
import { stripAuthoringMarkup, stripAuthoringMarkupForValidation, } from "./authoring-markup.js";
|
|
35
35
|
import { buildTagMap, buildTierMap } from "./validator/tier.js";
|
|
36
|
+
import { inPathOrder } from "./engine/reader.js";
|
|
36
37
|
import { ALL_STRUCTURAL_TYPES, MARKDOWN_CONTENT_FIELDS, } from "./parser/sections.js";
|
|
37
38
|
function frontmatterTitle(path, content) {
|
|
38
39
|
const { frontmatter } = parseFrontmatter(stripAuthoringMarkup(content), path);
|
|
@@ -182,7 +183,10 @@ function escape(s) {
|
|
|
182
183
|
}
|
|
183
184
|
/** cache: per-file memo of the title scan (the bulk of the cost), keyed by
|
|
184
185
|
* the file and the title pattern it was scanned with. */
|
|
185
|
-
export function courseGraphIssues(
|
|
186
|
+
export function courseGraphIssues(input, cache) {
|
|
187
|
+
// Path order, so same-title lenses and same-line findings come out in one
|
|
188
|
+
// order whatever order the caller lists the files in.
|
|
189
|
+
const files = inPathOrder(input);
|
|
186
190
|
const titles = lensTitles(files);
|
|
187
191
|
if (!titles.size)
|
|
188
192
|
return [];
|
|
@@ -273,7 +277,8 @@ export function courseGraphIssues(files, cache) {
|
|
|
273
277
|
})
|
|
274
278
|
.sort(byPlace);
|
|
275
279
|
}
|
|
276
|
-
export function partnerNameIssues(
|
|
280
|
+
export function partnerNameIssues(input) {
|
|
281
|
+
const files = inPathOrder(input); // as in courseGraphIssues
|
|
277
282
|
const tier = buildTierMap(buildTagMap(files));
|
|
278
283
|
const scanned = memoized((p) => scan(p, files.get(p) ?? ""));
|
|
279
284
|
const text = memoized((p) => scanned(p).lines.join("\n"));
|