lens-content-processor 0.79.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 +245 -114
- 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 +883 -639
- 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 +5 -1
- package/dist/parser/lens.js +22 -7
- 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 +4 -3
- package/dist/parser/question-embeds.js.map +1 -1
- package/dist/parser/sections.d.ts +10 -0
- package/dist/parser/sections.js +8 -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
|
@@ -1,69 +1,73 @@
|
|
|
1
1
|
import { lensCardsIn } from './lens-cards.js';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
2
|
+
/**
|
|
3
|
+
* The content ids of every module group, by group key (`parentSlug ?? slug`).
|
|
4
|
+
*
|
|
5
|
+
* A module that contains `# Submodule:` boundaries is split into multiple
|
|
6
|
+
* FlattenedModules at flatten time (slug `parent/sub-1`, `parent/sub-2`, …),
|
|
7
|
+
* each carrying its own sections. From an authoring perspective these are
|
|
8
|
+
* still one curriculum unit — a hidden Lens import in one submodule should
|
|
9
|
+
* satisfy a card link from a sibling submodule. Group siblings by their
|
|
10
|
+
* parent slug for the membership check.
|
|
11
|
+
*/
|
|
12
|
+
export function cardModuleGroups(pages) {
|
|
10
13
|
const groupContentIds = new Map();
|
|
11
|
-
for (const
|
|
12
|
-
if (
|
|
14
|
+
for (const page of pages) {
|
|
15
|
+
if (page.slug.startsWith('lens/'))
|
|
13
16
|
continue;
|
|
14
|
-
const groupKey =
|
|
17
|
+
const groupKey = page.parentSlug ?? page.slug;
|
|
15
18
|
let s = groupContentIds.get(groupKey);
|
|
16
19
|
if (!s) {
|
|
17
20
|
s = new Set();
|
|
18
21
|
groupContentIds.set(groupKey, s);
|
|
19
22
|
}
|
|
20
|
-
for (const
|
|
21
|
-
|
|
22
|
-
s.add(section.contentId);
|
|
23
|
-
}
|
|
23
|
+
for (const id of page.contentIds)
|
|
24
|
+
s.add(id);
|
|
24
25
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
26
|
+
return new Map([...groupContentIds].map(([key, ids]) => [key, [...ids]]));
|
|
27
|
+
}
|
|
28
|
+
/** Every card of one page that targets a lens outside the page's module group. */
|
|
29
|
+
export function checkCardModuleMembership(mod, groups) {
|
|
30
|
+
const errors = [];
|
|
31
|
+
// Skip standalone-lens pseudo-modules (lens/ prefix). They are single-lens
|
|
32
|
+
// entries created for lenses not imported by any real module. Checking
|
|
33
|
+
// card membership from their narrow perspective generates false positives.
|
|
34
|
+
if (mod.slug.startsWith('lens/'))
|
|
35
|
+
return errors;
|
|
36
|
+
const groupKey = mod.parentSlug ?? mod.slug;
|
|
37
|
+
const groupIds = new Set(groups.get(groupKey));
|
|
38
|
+
for (const section of mod.sections) {
|
|
39
|
+
for (const seg of section.segments) {
|
|
40
|
+
if (seg.type !== 'text')
|
|
41
|
+
continue;
|
|
42
|
+
if (!seg.content.includes('data-lens-card='))
|
|
43
|
+
continue;
|
|
44
|
+
for (const data of lensCardsIn(seg.content)) {
|
|
45
|
+
if (data.targetType !== 'lens')
|
|
38
46
|
continue;
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
suggestion: `Either import the Lens into module "${groupKey}", or mark the directive as intentional by appending {allow-external}: ${directive}.`,
|
|
64
|
-
severity: 'error',
|
|
65
|
-
});
|
|
66
|
-
}
|
|
47
|
+
const targetId = data.contentId;
|
|
48
|
+
if (!targetId)
|
|
49
|
+
continue; // missing contentId is a separate validation problem
|
|
50
|
+
if (groupIds.has(targetId))
|
|
51
|
+
continue; // same module-group: OK
|
|
52
|
+
if (data.allowExternal)
|
|
53
|
+
continue; // explicit external opt-in: OK
|
|
54
|
+
// Echo back the exact directive with the flag appended so the
|
|
55
|
+
// author can copy-paste it. Falls back to a `<path>` placeholder
|
|
56
|
+
// for older card data without targetPath.
|
|
57
|
+
const directive = data.targetPath
|
|
58
|
+
? `\`::card[[${data.targetPath}]]{allow-external}\``
|
|
59
|
+
: '`::card[[<path>]]{allow-external}`';
|
|
60
|
+
errors.push({
|
|
61
|
+
// Card directives live inside the section's source — typically an
|
|
62
|
+
// imported Lens, not the module file itself. Prefer the section's
|
|
63
|
+
// sourcePath so the error points at the file the author needs to
|
|
64
|
+
// edit. Falls back to mod.sourcePath for inline lenses defined in
|
|
65
|
+
// the module file directly.
|
|
66
|
+
file: section.sourcePath ?? mod.sourcePath ?? `module:${mod.slug}`,
|
|
67
|
+
message: `Card targets Lens "${data.title ?? targetId}" which is not imported by module "${groupKey}".`,
|
|
68
|
+
suggestion: `Either import the Lens into module "${groupKey}", or mark the directive as intentional by appending {allow-external}: ${directive}.`,
|
|
69
|
+
severity: 'error',
|
|
70
|
+
});
|
|
67
71
|
}
|
|
68
72
|
}
|
|
69
73
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"card-module-membership.js","sourceRoot":"","sources":["../../src/validator/card-module-membership.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"card-module-membership.js","sourceRoot":"","sources":["../../src/validator/card-module-membership.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { CRITIC_MARKUP_FORMS } from "../criticmarkup-forms.js";
|
|
|
2
2
|
import { isContentTextFile } from "../parser/widget.js";
|
|
3
3
|
// The forms whose accept vs reject outputs differ: additions, deletions,
|
|
4
4
|
// substitutions. Comments and highlights publish identically either way.
|
|
5
|
-
const PENDING_FORMS = CRITIC_MARKUP_FORMS.filter((form) => form.
|
|
5
|
+
const PENDING_FORMS = CRITIC_MARKUP_FORMS.filter((form) => form.accepted !== form.rejected);
|
|
6
6
|
const CONTENT_DIRS = [
|
|
7
7
|
"modules/",
|
|
8
8
|
"courses/",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"criticmarkup.js","sourceRoot":"","sources":["../../src/validator/criticmarkup.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"criticmarkup.js","sourceRoot":"","sources":["../../src/validator/criticmarkup.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,yEAAyE;AACzE,yEAAyE;AACzE,MAAM,aAAa,GAAG,mBAAmB,CAAC,MAAM,CAC9C,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,CAC1C,CAAC;AAEF,MAAM,YAAY,GAAG;IACnB,UAAU;IACV,UAAU;IACV,WAAW;IACX,SAAS;IACT,oBAAoB;IACpB,oBAAoB;IACpB,UAAU;CACX,CAAC;AAEF,uEAAuE;AACvE,MAAM,UAAU,yBAAyB,CAAC,IAAY;IACpD,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3C,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;AAChF,CAAC;AAED,8DAA8D;AAC9D,SAAS,OAAO,CAAC,KAAa;IAC5B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3C,OAAO,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;AACtE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CACvC,OAAe,EACf,IAAY;IAEZ,MAAM,KAAK,GAAkD,EAAE,CAAC;IAEhE,KAAK,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,aAAa,EAAE,CAAC;QACzC,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAM,CAAC;YAC3B,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;YACxD,KAAK,CAAC,IAAI,CAAC;gBACT,KAAK;gBACL,KAAK,EAAE;oBACL,IAAI;oBACJ,IAAI;oBACJ,OAAO,EAAE,wBAAwB,IAAI,gBAAgB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;oBACxE,UAAU,EACR,+DAA+D;wBAC/D,+DAA+D;oBACjE,QAAQ,EAAE,SAAS;iBACpB;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,gEAAgE;IAChE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACxC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -4,7 +4,7 @@ import type { ContentError } from '../index.js';
|
|
|
4
4
|
* This measures the minimum number of single-character edits
|
|
5
5
|
* (insertions, deletions, substitutions) needed to change one string into another.
|
|
6
6
|
*/
|
|
7
|
-
export declare function levenshtein(a: string, b: string): number;
|
|
7
|
+
export declare function levenshtein(a: string, b: string, max?: number): number;
|
|
8
8
|
/**
|
|
9
9
|
* Detect likely typos in field names by comparing against known fields.
|
|
10
10
|
*
|
|
@@ -4,31 +4,31 @@ import { ALL_KNOWN_FIELDS, REMOVED_FIELDS } from '../content-schema.js';
|
|
|
4
4
|
* This measures the minimum number of single-character edits
|
|
5
5
|
* (insertions, deletions, substitutions) needed to change one string into another.
|
|
6
6
|
*/
|
|
7
|
-
export function levenshtein(a, b) {
|
|
8
|
-
|
|
9
|
-
//
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
for (let j = 0; j <= a.length; j++)
|
|
15
|
-
|
|
16
|
-
}
|
|
17
|
-
// Fill in the rest of the matrix
|
|
7
|
+
export function levenshtein(a, b, max = Infinity) {
|
|
8
|
+
// Two rows of the table. No row has a smaller least value than the row
|
|
9
|
+
// before it, so with a bound, a row whose least value is above `max` ends
|
|
10
|
+
// the work: the answer is then some number above `max`.
|
|
11
|
+
if (Math.abs(a.length - b.length) > max)
|
|
12
|
+
return max + 1;
|
|
13
|
+
let previous = [];
|
|
14
|
+
for (let j = 0; j <= a.length; j++)
|
|
15
|
+
previous.push(j);
|
|
18
16
|
for (let i = 1; i <= b.length; i++) {
|
|
17
|
+
const current = [i];
|
|
18
|
+
let least = i;
|
|
19
19
|
for (let j = 1; j <= a.length; j++) {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
matrix[i - 1][j] + 1 // deletion
|
|
27
|
-
);
|
|
28
|
-
}
|
|
20
|
+
const cell = b[i - 1] === a[j - 1]
|
|
21
|
+
? previous[j - 1]
|
|
22
|
+
: Math.min(previous[j - 1], current[j - 1], previous[j]) + 1;
|
|
23
|
+
current.push(cell);
|
|
24
|
+
if (cell < least)
|
|
25
|
+
least = cell;
|
|
29
26
|
}
|
|
27
|
+
if (least > max)
|
|
28
|
+
return max + 1;
|
|
29
|
+
previous = current;
|
|
30
30
|
}
|
|
31
|
-
return
|
|
31
|
+
return previous[a.length];
|
|
32
32
|
}
|
|
33
33
|
/**
|
|
34
34
|
* Detect likely typos in field names by comparing against known fields.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"field-typos.js","sourceRoot":"","sources":["../../src/validator/field-typos.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAExE;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,CAAS,EAAE,CAAS
|
|
1
|
+
{"version":3,"file":"field-typos.js","sourceRoot":"","sources":["../../src/validator/field-typos.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { FlattenedModule } from "../index.js";
|
|
2
|
+
import type { ErrorCandidate } from "../dedupe-errors.js";
|
|
2
3
|
/**
|
|
3
|
-
* Broad safety-net validation on the flattened output
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Broad safety-net validation on the flattened output: empty sections (no
|
|
5
|
+
* segments) and empty segments (no content) that specific validators might
|
|
6
|
+
* have missed. These are the errors of one page; `moduleFile` names the file
|
|
7
|
+
* of sections that have no source path. An empty segment is reported once
|
|
8
|
+
* over all pages (a lens that several modules copy has it in each), so its
|
|
9
|
+
* error carries the segment's key as `once`.
|
|
6
10
|
*/
|
|
7
|
-
export declare function
|
|
11
|
+
export declare function outputIntegrityCandidates(module: FlattenedModule, moduleFile: string): ErrorCandidate[];
|
|
@@ -1,57 +1,55 @@
|
|
|
1
1
|
import { getSourceLine } from "../source-location.js";
|
|
2
2
|
/**
|
|
3
|
-
* Broad safety-net validation on the flattened output
|
|
4
|
-
*
|
|
5
|
-
*
|
|
3
|
+
* Broad safety-net validation on the flattened output: empty sections (no
|
|
4
|
+
* segments) and empty segments (no content) that specific validators might
|
|
5
|
+
* have missed. These are the errors of one page; `moduleFile` names the file
|
|
6
|
+
* of sections that have no source path. An empty segment is reported once
|
|
7
|
+
* over all pages (a lens that several modules copy has it in each), so its
|
|
8
|
+
* error carries the segment's key as `once`.
|
|
6
9
|
*/
|
|
7
|
-
export function
|
|
8
|
-
const
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
if (section.segments.length === 0) {
|
|
16
|
-
errors.push({
|
|
10
|
+
export function outputIntegrityCandidates(module, moduleFile) {
|
|
11
|
+
const candidates = [];
|
|
12
|
+
for (const section of module.sections) {
|
|
13
|
+
const file = section.sourcePath ?? moduleFile;
|
|
14
|
+
const sectionLabel = section.meta.title ?? section.type;
|
|
15
|
+
if (section.segments.length === 0) {
|
|
16
|
+
candidates.push({
|
|
17
|
+
error: {
|
|
17
18
|
file,
|
|
18
19
|
line: getSourceLine(section),
|
|
19
20
|
message: `Section "${sectionLabel}" has no segments`,
|
|
20
21
|
severity: "error",
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
break;
|
|
50
|
-
// chat segments have no required content body
|
|
51
|
-
}
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
for (let i = 0; i < section.segments.length; i++) {
|
|
27
|
+
const segment = section.segments[i];
|
|
28
|
+
const sourceLine = getSourceLine(segment) ?? getSourceLine(section);
|
|
29
|
+
const reportEmpty = (message) => candidates.push({
|
|
30
|
+
error: { file, line: sourceLine, message, severity: "error" },
|
|
31
|
+
once: `${file}\0${sourceLine ?? ""}\0${segment.type}`,
|
|
32
|
+
});
|
|
33
|
+
switch (segment.type) {
|
|
34
|
+
case "text":
|
|
35
|
+
if (!segment.content?.trim()) {
|
|
36
|
+
reportEmpty(`Empty text segment in "${sectionLabel}" (segment ${i + 1})`);
|
|
37
|
+
}
|
|
38
|
+
break;
|
|
39
|
+
case "article":
|
|
40
|
+
if (!segment.content?.trim()) {
|
|
41
|
+
reportEmpty(`Empty article segment in "${sectionLabel}" (segment ${i + 1})`);
|
|
42
|
+
}
|
|
43
|
+
break;
|
|
44
|
+
case "video":
|
|
45
|
+
if (!segment.transcript?.length) {
|
|
46
|
+
reportEmpty(`Empty video transcript in "${sectionLabel}" (segment ${i + 1})`);
|
|
47
|
+
}
|
|
48
|
+
break;
|
|
49
|
+
// chat segments have no required content body
|
|
52
50
|
}
|
|
53
51
|
}
|
|
54
52
|
}
|
|
55
|
-
return
|
|
53
|
+
return candidates;
|
|
56
54
|
}
|
|
57
55
|
//# sourceMappingURL=output-integrity.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output-integrity.js","sourceRoot":"","sources":["../../src/validator/output-integrity.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"output-integrity.js","sourceRoot":"","sources":["../../src/validator/output-integrity.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD;;;;;;;GAOG;AACH,MAAM,UAAU,yBAAyB,CACvC,MAAuB,EACvB,UAAkB;IAElB,MAAM,UAAU,GAAqB,EAAE,CAAC;IAExC,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,IAAI,UAAU,CAAC;QAC9C,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;QAExD,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,UAAU,CAAC,IAAI,CAAC;gBACd,KAAK,EAAE;oBACL,IAAI;oBACJ,IAAI,EAAE,aAAa,CAAC,OAAO,CAAC;oBAC5B,OAAO,EAAE,YAAY,YAAY,mBAAmB;oBACpD,QAAQ,EAAE,OAAO;iBAClB;aACF,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACjD,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;YACpE,MAAM,WAAW,GAAG,CAAC,OAAe,EAAE,EAAE,CACtC,UAAU,CAAC,IAAI,CAAC;gBACd,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE;gBAC7D,IAAI,EAAE,GAAG,IAAI,KAAK,UAAU,IAAI,EAAE,KAAK,OAAO,CAAC,IAAI,EAAE;aACtD,CAAC,CAAC;YAEL,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;gBACrB,KAAK,MAAM;oBACT,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;wBAC7B,WAAW,CACT,0BAA0B,YAAY,cAAc,CAAC,GAAG,CAAC,GAAG,CAC7D,CAAC;oBACJ,CAAC;oBACD,MAAM;gBACR,KAAK,SAAS;oBACZ,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;wBAC7B,WAAW,CACT,6BAA6B,YAAY,cAAc,CAAC,GAAG,CAAC,GAAG,CAChE,CAAC;oBACJ,CAAC;oBACD,MAAM;gBACR,KAAK,OAAO;oBACV,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;wBAChC,WAAW,CACT,8BAA8B,YAAY,cAAc,CAAC,GAAG,CAAC,GAAG,CACjE,CAAC;oBACJ,CAAC;oBACD,MAAM;gBACR,8CAA8C;YAChD,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
package/dist/validator/tier.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ export type ContentTier = "production" | "wip" | "ignored";
|
|
|
6
6
|
* the tier below, skill-tree visibility in skill-tree.ts — so no rule parses
|
|
7
7
|
* frontmatter a second time.
|
|
8
8
|
*/
|
|
9
|
-
export declare function buildTagMap(files:
|
|
9
|
+
export declare function buildTagMap(files: ReadonlyMap<string, string>): Map<string, string[]>;
|
|
10
10
|
/**
|
|
11
11
|
* Determine content tier from lower-cased frontmatter tags.
|
|
12
12
|
* - tags containing 'validator-ignore' → 'ignored'
|
|
@@ -15,7 +15,7 @@ export declare function buildTagMap(files: Map<string, string>): Map<string, str
|
|
|
15
15
|
*/
|
|
16
16
|
export declare function getTierFromTags(tags: string[]): ContentTier;
|
|
17
17
|
/** Tier of every file in a tag map (see buildTagMap). */
|
|
18
|
-
export declare function buildTierMap(tagMap:
|
|
18
|
+
export declare function buildTierMap(tagMap: ReadonlyMap<string, string[]>): Map<string, ContentTier>;
|
|
19
19
|
/**
|
|
20
20
|
* Check for tier violations when a parent references a child.
|
|
21
21
|
* Returns a ContentError if the reference violates tier rules, null otherwise.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tier.js","sourceRoot":"","sources":["../../src/validator/tier.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAIxD;;;;;GAKG;AACH,MAAM,UAAU,WAAW,
|
|
1
|
+
{"version":3,"file":"tier.js","sourceRoot":"","sources":["../../src/validator/tier.ts"],"names":[],"mappings":"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"}
|
package/dist/validator/uuid.d.ts
CHANGED
|
@@ -17,7 +17,7 @@ export interface UuidEntry {
|
|
|
17
17
|
* learner meets it. So the copies must agree on what is asked and how it is
|
|
18
18
|
* graded (QUESTION_IDENTITY); presentation (feedback-instructions,
|
|
19
19
|
* force-feedback, placeholder, optional, reveal text, shuffle) may differ.
|
|
20
|
-
* One module holds at most one copy (
|
|
20
|
+
* One module holds at most one copy (sharedQuestionCandidates in
|
|
21
21
|
* index.ts).
|
|
22
22
|
*/
|
|
23
23
|
export interface SharedQuestion {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lens-content-processor",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.80.0",
|
|
4
4
|
"description": "Parser and validator for Lens educational content (Markdown modules, lenses, learning outcomes)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -36,6 +36,7 @@
|
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@types/mdast": "^4.0.4",
|
|
38
38
|
"@types/node": "^22.0.0",
|
|
39
|
+
"better-sqlite3": "12.9.0",
|
|
39
40
|
"tsx": "^4.0.0",
|
|
40
41
|
"typescript": "^5.7.0",
|
|
41
42
|
"vitest": "^3.0.0"
|