lens-content-processor 0.1.0 → 0.2.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/flattener/index.js +25 -7
- package/dist/flattener/index.js.map +1 -1
- package/dist/index.js +23 -2
- package/dist/index.js.map +1 -1
- package/dist/parser/learning-outcome.js +16 -1
- package/dist/parser/learning-outcome.js.map +1 -1
- package/dist/parser/lens.js +18 -0
- package/dist/parser/lens.js.map +1 -1
- package/dist/parser/wikilink.d.ts +28 -0
- package/dist/parser/wikilink.js +154 -0
- package/dist/parser/wikilink.js.map +1 -1
- package/package.json +1 -1
- package/dist/bundler/article.test.d.ts +0 -1
- package/dist/bundler/article.test.js +0 -212
- package/dist/bundler/article.test.js.map +0 -1
- package/dist/bundler/video.test.d.ts +0 -1
- package/dist/bundler/video.test.js +0 -95
- package/dist/bundler/video.test.js.map +0 -1
- package/dist/cli.test.d.ts +0 -1
- package/dist/cli.test.js +0 -45
- package/dist/cli.test.js.map +0 -1
- package/dist/flattener/index.test.d.ts +0 -1
- package/dist/flattener/index.test.js +0 -547
- package/dist/flattener/index.test.js.map +0 -1
- package/dist/fs/read-vault.test.d.ts +0 -1
- package/dist/fs/read-vault.test.js +0 -37
- package/dist/fs/read-vault.test.js.map +0 -1
- package/dist/parser/course.test.d.ts +0 -1
- package/dist/parser/course.test.js +0 -117
- package/dist/parser/course.test.js.map +0 -1
- package/dist/parser/frontmatter.test.d.ts +0 -1
- package/dist/parser/frontmatter.test.js +0 -54
- package/dist/parser/frontmatter.test.js.map +0 -1
- package/dist/parser/learning-outcome.test.d.ts +0 -1
- package/dist/parser/learning-outcome.test.js +0 -75
- package/dist/parser/learning-outcome.test.js.map +0 -1
- package/dist/parser/lens.test.d.ts +0 -1
- package/dist/parser/lens.test.js +0 -453
- package/dist/parser/lens.test.js.map +0 -1
- package/dist/parser/module.test.d.ts +0 -1
- package/dist/parser/module.test.js +0 -99
- package/dist/parser/module.test.js.map +0 -1
- package/dist/parser/sections.test.d.ts +0 -1
- package/dist/parser/sections.test.js +0 -297
- package/dist/parser/sections.test.js.map +0 -1
- package/dist/parser/wikilink.test.d.ts +0 -1
- package/dist/parser/wikilink.test.js +0 -76
- package/dist/parser/wikilink.test.js.map +0 -1
- package/dist/validator/field-typos.test.d.ts +0 -1
- package/dist/validator/field-typos.test.js +0 -41
- package/dist/validator/field-typos.test.js.map +0 -1
- package/dist/validator/field-values.test.d.ts +0 -1
- package/dist/validator/field-values.test.js +0 -45
- package/dist/validator/field-values.test.js.map +0 -1
- package/dist/validator/segment-fields.test.d.ts +0 -1
- package/dist/validator/segment-fields.test.js +0 -73
- package/dist/validator/segment-fields.test.js.map +0 -1
- package/dist/validator/standalone.test.d.ts +0 -1
- package/dist/validator/standalone.test.js +0 -190
- package/dist/validator/standalone.test.js.map +0 -1
- package/dist/validator/uuid.test.d.ts +0 -1
- package/dist/validator/uuid.test.js +0 -229
- package/dist/validator/uuid.test.js.map +0 -1
|
@@ -1,297 +0,0 @@
|
|
|
1
|
-
// src/parser/sections.test.ts
|
|
2
|
-
import { describe, it, expect } from 'vitest';
|
|
3
|
-
import { parseSections, MODULE_SECTION_TYPES, LENS_SECTION_TYPES, LO_SECTION_TYPES } from './sections.js';
|
|
4
|
-
describe('parseSections', () => {
|
|
5
|
-
it('splits content by H1 headers for modules', () => {
|
|
6
|
-
const content = `
|
|
7
|
-
# Learning Outcome: First Section
|
|
8
|
-
source:: [[../Learning Outcomes/lo1.md|LO1]]
|
|
9
|
-
|
|
10
|
-
# Page: Second Section
|
|
11
|
-
id:: 123
|
|
12
|
-
|
|
13
|
-
Some content here.
|
|
14
|
-
`;
|
|
15
|
-
const result = parseSections(content, 1, MODULE_SECTION_TYPES);
|
|
16
|
-
expect(result.sections).toHaveLength(2);
|
|
17
|
-
expect(result.sections[0].type).toBe('learning-outcome');
|
|
18
|
-
expect(result.sections[0].title).toBe('First Section');
|
|
19
|
-
expect(result.sections[1].type).toBe('page');
|
|
20
|
-
expect(result.sections[1].title).toBe('Second Section');
|
|
21
|
-
});
|
|
22
|
-
it('splits content by H3 headers for lens files', () => {
|
|
23
|
-
const content = `
|
|
24
|
-
### Text: Introduction
|
|
25
|
-
|
|
26
|
-
#### Text
|
|
27
|
-
content:: Hello world.
|
|
28
|
-
|
|
29
|
-
### Article: Deep Dive
|
|
30
|
-
source:: [[../articles/deep.md|Article]]
|
|
31
|
-
`;
|
|
32
|
-
const result = parseSections(content, 3, LENS_SECTION_TYPES);
|
|
33
|
-
expect(result.sections).toHaveLength(2);
|
|
34
|
-
expect(result.sections[0].type).toBe('text');
|
|
35
|
-
expect(result.sections[1].type).toBe('article');
|
|
36
|
-
});
|
|
37
|
-
it('extracts fields from section body', () => {
|
|
38
|
-
const content = `
|
|
39
|
-
# Learning Outcome: Test
|
|
40
|
-
source:: [[../Learning Outcomes/lo1.md|LO1]]
|
|
41
|
-
optional:: true
|
|
42
|
-
`;
|
|
43
|
-
const result = parseSections(content, 1, MODULE_SECTION_TYPES);
|
|
44
|
-
expect(result.sections[0].fields.source).toBe('[[../Learning Outcomes/lo1.md|LO1]]');
|
|
45
|
-
expect(result.sections[0].fields.optional).toBe('true');
|
|
46
|
-
});
|
|
47
|
-
it('returns error for unknown section type', () => {
|
|
48
|
-
const content = `
|
|
49
|
-
# Unknown: Bad Section
|
|
50
|
-
content:: here
|
|
51
|
-
`;
|
|
52
|
-
const result = parseSections(content, 1, MODULE_SECTION_TYPES);
|
|
53
|
-
expect(result.errors).toHaveLength(1);
|
|
54
|
-
expect(result.errors[0].message).toContain('Unknown section type');
|
|
55
|
-
});
|
|
56
|
-
describe('multiline fields', () => {
|
|
57
|
-
it('parses content:: spanning multiple lines', () => {
|
|
58
|
-
const content = `
|
|
59
|
-
### Text: Intro
|
|
60
|
-
|
|
61
|
-
#### Text
|
|
62
|
-
content::
|
|
63
|
-
This is line one.
|
|
64
|
-
This is line two.
|
|
65
|
-
This is line three.
|
|
66
|
-
|
|
67
|
-
#### Chat
|
|
68
|
-
instructions:: Next segment
|
|
69
|
-
`;
|
|
70
|
-
const result = parseSections(content, 3, LENS_SECTION_TYPES);
|
|
71
|
-
// The section body should contain the multiline content
|
|
72
|
-
expect(result.sections[0].body).toContain('content::\nThis is line one.');
|
|
73
|
-
});
|
|
74
|
-
it('parses field with value on next line after ::', () => {
|
|
75
|
-
const content = `
|
|
76
|
-
## Lens:
|
|
77
|
-
source::
|
|
78
|
-
![[../Lenses/test]]
|
|
79
|
-
`;
|
|
80
|
-
const result = parseSections(content, 2, LO_SECTION_TYPES);
|
|
81
|
-
expect(result.sections[0].fields.source).toBe('![[../Lenses/test]]');
|
|
82
|
-
});
|
|
83
|
-
it('parses multiline field that continues until next field', () => {
|
|
84
|
-
const content = `
|
|
85
|
-
## Lens: Test
|
|
86
|
-
instructions::
|
|
87
|
-
First line.
|
|
88
|
-
Second line.
|
|
89
|
-
Third line.
|
|
90
|
-
source:: [[test.md|Test]]
|
|
91
|
-
`;
|
|
92
|
-
const result = parseSections(content, 2, LO_SECTION_TYPES);
|
|
93
|
-
expect(result.sections[0].fields.instructions).toBe('First line.\nSecond line.\nThird line.');
|
|
94
|
-
expect(result.sections[0].fields.source).toBe('[[test.md|Test]]');
|
|
95
|
-
});
|
|
96
|
-
it('parses multiline field that continues until end of section', () => {
|
|
97
|
-
const content = `
|
|
98
|
-
### Text: Notes
|
|
99
|
-
|
|
100
|
-
#### Text
|
|
101
|
-
content::
|
|
102
|
-
Line one.
|
|
103
|
-
Line two.
|
|
104
|
-
Line three.
|
|
105
|
-
`;
|
|
106
|
-
const result = parseSections(content, 3, LENS_SECTION_TYPES);
|
|
107
|
-
// The parseFields function should extract multiline content
|
|
108
|
-
// Note: body contains subsections too, we need to test fields parsing
|
|
109
|
-
expect(result.sections[0].body).toContain('content::\nLine one.');
|
|
110
|
-
});
|
|
111
|
-
it('handles field with empty value followed by content on next line', () => {
|
|
112
|
-
const content = `
|
|
113
|
-
# Page: Welcome
|
|
114
|
-
id:: abc-123
|
|
115
|
-
content::
|
|
116
|
-
Welcome to the course.
|
|
117
|
-
This is the intro text.
|
|
118
|
-
`;
|
|
119
|
-
const result = parseSections(content, 1, MODULE_SECTION_TYPES);
|
|
120
|
-
expect(result.sections[0].fields.id).toBe('abc-123');
|
|
121
|
-
expect(result.sections[0].fields.content).toBe('Welcome to the course.\nThis is the intro text.');
|
|
122
|
-
});
|
|
123
|
-
});
|
|
124
|
-
describe('empty section titles', () => {
|
|
125
|
-
it('handles empty section title (colon with no title after)', () => {
|
|
126
|
-
const content = `
|
|
127
|
-
## Lens:
|
|
128
|
-
source:: [[../Lenses/test.md|Test]]
|
|
129
|
-
|
|
130
|
-
## Lens:
|
|
131
|
-
source:: [[../Lenses/other.md|Other]]
|
|
132
|
-
`;
|
|
133
|
-
const result = parseSections(content, 2, LO_SECTION_TYPES);
|
|
134
|
-
expect(result.sections).toHaveLength(2);
|
|
135
|
-
expect(result.sections[0].title).toBe('');
|
|
136
|
-
expect(result.sections[0].type).toBe('lens');
|
|
137
|
-
expect(result.sections[1].title).toBe('');
|
|
138
|
-
});
|
|
139
|
-
it('handles empty section title with trailing whitespace', () => {
|
|
140
|
-
const content = `
|
|
141
|
-
## Lens:
|
|
142
|
-
source:: [[../Lenses/test.md|Test]]
|
|
143
|
-
`;
|
|
144
|
-
const result = parseSections(content, 2, LO_SECTION_TYPES);
|
|
145
|
-
expect(result.sections).toHaveLength(1);
|
|
146
|
-
expect(result.sections[0].title).toBe('');
|
|
147
|
-
expect(result.sections[0].type).toBe('lens');
|
|
148
|
-
});
|
|
149
|
-
});
|
|
150
|
-
describe('duplicate field warnings', () => {
|
|
151
|
-
it('warns about duplicate field definitions', () => {
|
|
152
|
-
const content = `
|
|
153
|
-
# Page: Test
|
|
154
|
-
content:: First value
|
|
155
|
-
content:: Second value
|
|
156
|
-
`;
|
|
157
|
-
const result = parseSections(content, 1, MODULE_SECTION_TYPES, 'test.md');
|
|
158
|
-
expect(result.errors.some(e => e.severity === 'warning' &&
|
|
159
|
-
e.message.includes('Duplicate'))).toBe(true);
|
|
160
|
-
});
|
|
161
|
-
it('uses the last value when field is duplicated', () => {
|
|
162
|
-
const content = `
|
|
163
|
-
# Page: Test
|
|
164
|
-
id:: first-id
|
|
165
|
-
id:: second-id
|
|
166
|
-
`;
|
|
167
|
-
const result = parseSections(content, 1, MODULE_SECTION_TYPES, 'test.md');
|
|
168
|
-
// The last value should win
|
|
169
|
-
expect(result.sections[0].fields.id).toBe('second-id');
|
|
170
|
-
});
|
|
171
|
-
it('does not warn when different fields are defined', () => {
|
|
172
|
-
const content = `
|
|
173
|
-
# Page: Test
|
|
174
|
-
id:: some-id
|
|
175
|
-
content:: Some content
|
|
176
|
-
`;
|
|
177
|
-
const result = parseSections(content, 1, MODULE_SECTION_TYPES, 'test.md');
|
|
178
|
-
// No warnings about duplicates
|
|
179
|
-
expect(result.errors.filter(e => e.severity === 'warning' &&
|
|
180
|
-
e.message.includes('Duplicate'))).toHaveLength(0);
|
|
181
|
-
});
|
|
182
|
-
it('does not warn about duplicate fields when they are in different sub-sections', () => {
|
|
183
|
-
// This is the real-world case: a Lens file with multiple Text segments,
|
|
184
|
-
// each with their own content:: field. These are NOT duplicates.
|
|
185
|
-
const content = `
|
|
186
|
-
### Article: Cascades and Cycles
|
|
187
|
-
source:: [[../articles/cascades.md]]
|
|
188
|
-
|
|
189
|
-
#### Text
|
|
190
|
-
content::
|
|
191
|
-
Introduction paragraph explaining cybernetics and feedback loops.
|
|
192
|
-
|
|
193
|
-
#### Article-excerpt
|
|
194
|
-
from:: "Cascades are when"
|
|
195
|
-
to:: "neutron multiplication factor"
|
|
196
|
-
|
|
197
|
-
#### Text
|
|
198
|
-
content::
|
|
199
|
-
What are the properties that make something a cycle rather than a cascade?
|
|
200
|
-
|
|
201
|
-
#### Chat: Discussion
|
|
202
|
-
instructions::
|
|
203
|
-
TLDR of what the user just read about cascades and cycles.
|
|
204
|
-
Discuss the difference between cascades and cycles.
|
|
205
|
-
|
|
206
|
-
### Video: Intelligence Explosion
|
|
207
|
-
source:: [[../video_transcripts/intelligence.md]]
|
|
208
|
-
|
|
209
|
-
#### Text
|
|
210
|
-
content::
|
|
211
|
-
Watch this video about intelligence feedback loops.
|
|
212
|
-
|
|
213
|
-
#### Video-excerpt
|
|
214
|
-
from:: 0:00
|
|
215
|
-
to:: 14:49
|
|
216
|
-
|
|
217
|
-
#### Text
|
|
218
|
-
content::
|
|
219
|
-
What surprised you about the video?
|
|
220
|
-
|
|
221
|
-
#### Chat: Video Discussion
|
|
222
|
-
instructions::
|
|
223
|
-
Discuss what the user learned from the video.
|
|
224
|
-
`;
|
|
225
|
-
const result = parseSections(content, 3, LENS_SECTION_TYPES, 'test-lens.md');
|
|
226
|
-
// Should have 2 sections (Article and Video)
|
|
227
|
-
expect(result.sections).toHaveLength(2);
|
|
228
|
-
// Should NOT have any duplicate field warnings
|
|
229
|
-
const duplicateWarnings = result.errors.filter(e => e.severity === 'warning' &&
|
|
230
|
-
e.message.includes('Duplicate'));
|
|
231
|
-
expect(duplicateWarnings).toHaveLength(0);
|
|
232
|
-
// Verify the sections were parsed correctly
|
|
233
|
-
expect(result.sections[0].type).toBe('article');
|
|
234
|
-
expect(result.sections[0].title).toBe('Cascades and Cycles');
|
|
235
|
-
expect(result.sections[0].fields.source).toBe('[[../articles/cascades.md]]');
|
|
236
|
-
expect(result.sections[1].type).toBe('video');
|
|
237
|
-
expect(result.sections[1].title).toBe('Intelligence Explosion');
|
|
238
|
-
expect(result.sections[1].fields.source).toBe('[[../video_transcripts/intelligence.md]]');
|
|
239
|
-
});
|
|
240
|
-
it('still warns about actual duplicates within the same sub-section', () => {
|
|
241
|
-
const content = `
|
|
242
|
-
### Text: Intro
|
|
243
|
-
|
|
244
|
-
#### Text
|
|
245
|
-
content:: First paragraph
|
|
246
|
-
content:: Second paragraph that overwrites the first
|
|
247
|
-
`;
|
|
248
|
-
const result = parseSections(content, 3, LENS_SECTION_TYPES, 'test.md');
|
|
249
|
-
// This IS a real duplicate - same field twice within the same #### Text segment
|
|
250
|
-
const duplicateWarnings = result.errors.filter(e => e.severity === 'warning' &&
|
|
251
|
-
e.message.includes('Duplicate'));
|
|
252
|
-
expect(duplicateWarnings).toHaveLength(1);
|
|
253
|
-
expect(duplicateWarnings[0].message).toContain("content");
|
|
254
|
-
});
|
|
255
|
-
});
|
|
256
|
-
describe('special characters in titles', () => {
|
|
257
|
-
it('handles ampersand in section title', () => {
|
|
258
|
-
const content = `
|
|
259
|
-
# Page: Safety & Alignment
|
|
260
|
-
content:: This section covers both topics.
|
|
261
|
-
`;
|
|
262
|
-
const result = parseSections(content, 1, MODULE_SECTION_TYPES, 'test.md');
|
|
263
|
-
expect(result.sections).toHaveLength(1);
|
|
264
|
-
expect(result.sections[0].title).toBe('Safety & Alignment');
|
|
265
|
-
expect(result.sections[0].type).toBe('page');
|
|
266
|
-
expect(result.errors).toHaveLength(0);
|
|
267
|
-
});
|
|
268
|
-
it('handles apostrophe in section title', () => {
|
|
269
|
-
const content = `
|
|
270
|
-
# Page: What's Next
|
|
271
|
-
content:: Looking ahead.
|
|
272
|
-
`;
|
|
273
|
-
const result = parseSections(content, 1, MODULE_SECTION_TYPES, 'test.md');
|
|
274
|
-
expect(result.sections).toHaveLength(1);
|
|
275
|
-
expect(result.sections[0].title).toBe("What's Next");
|
|
276
|
-
});
|
|
277
|
-
it('handles colon in section title', () => {
|
|
278
|
-
const content = `
|
|
279
|
-
# Page: Part 1: Introduction
|
|
280
|
-
content:: The beginning.
|
|
281
|
-
`;
|
|
282
|
-
const result = parseSections(content, 1, MODULE_SECTION_TYPES, 'test.md');
|
|
283
|
-
expect(result.sections).toHaveLength(1);
|
|
284
|
-
expect(result.sections[0].title).toBe('Part 1: Introduction');
|
|
285
|
-
});
|
|
286
|
-
it('handles multiple special characters in section title', () => {
|
|
287
|
-
const content = `
|
|
288
|
-
# Page: AI Safety & Alignment: What's at Stake?
|
|
289
|
-
content:: Important questions.
|
|
290
|
-
`;
|
|
291
|
-
const result = parseSections(content, 1, MODULE_SECTION_TYPES, 'test.md');
|
|
292
|
-
expect(result.sections).toHaveLength(1);
|
|
293
|
-
expect(result.sections[0].title).toBe("AI Safety & Alignment: What's at Stake?");
|
|
294
|
-
});
|
|
295
|
-
});
|
|
296
|
-
});
|
|
297
|
-
//# sourceMappingURL=sections.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sections.test.js","sourceRoot":"","sources":["../../src/parser/sections.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
// src/parser/wikilink.test.ts
|
|
2
|
-
import { describe, it, expect } from 'vitest';
|
|
3
|
-
import { parseWikilink, resolveWikilinkPath, findFileWithExtension } from './wikilink';
|
|
4
|
-
describe('parseWikilink', () => {
|
|
5
|
-
it('extracts path and display text', () => {
|
|
6
|
-
const result = parseWikilink('[[../Learning Outcomes/lo1.md|My LO]]');
|
|
7
|
-
expect(result?.path).toBe('../Learning Outcomes/lo1.md');
|
|
8
|
-
expect(result?.display).toBe('My LO');
|
|
9
|
-
});
|
|
10
|
-
it('handles wikilink without display text', () => {
|
|
11
|
-
const result = parseWikilink('[[path/to/file.md]]');
|
|
12
|
-
expect(result?.path).toBe('path/to/file.md');
|
|
13
|
-
expect(result?.display).toBeUndefined();
|
|
14
|
-
});
|
|
15
|
-
it('returns null for non-wikilink', () => {
|
|
16
|
-
expect(parseWikilink('not a wikilink')).toBeNull();
|
|
17
|
-
expect(parseWikilink('[regular](link)')).toBeNull();
|
|
18
|
-
});
|
|
19
|
-
it('handles embed syntax ![[path]]', () => {
|
|
20
|
-
const result = parseWikilink('![[images/diagram.png]]');
|
|
21
|
-
expect(result?.path).toBe('images/diagram.png');
|
|
22
|
-
expect(result?.isEmbed).toBe(true);
|
|
23
|
-
});
|
|
24
|
-
it('handles embed with display text ![[path|alt text]]', () => {
|
|
25
|
-
const result = parseWikilink('![[images/diagram.png|Architecture diagram]]');
|
|
26
|
-
expect(result?.path).toBe('images/diagram.png');
|
|
27
|
-
expect(result?.display).toBe('Architecture diagram');
|
|
28
|
-
expect(result?.isEmbed).toBe(true);
|
|
29
|
-
});
|
|
30
|
-
});
|
|
31
|
-
describe('resolveWikilinkPath', () => {
|
|
32
|
-
it('resolves relative path from source file', () => {
|
|
33
|
-
const resolved = resolveWikilinkPath('../Learning Outcomes/lo1.md', 'modules/intro.md');
|
|
34
|
-
expect(resolved).toBe('Learning Outcomes/lo1.md');
|
|
35
|
-
});
|
|
36
|
-
it('handles nested paths', () => {
|
|
37
|
-
const resolved = resolveWikilinkPath('../Lenses/category/lens1.md', 'Learning Outcomes/lo1.md');
|
|
38
|
-
expect(resolved).toBe('Lenses/category/lens1.md');
|
|
39
|
-
});
|
|
40
|
-
it('resolves path without .md extension', () => {
|
|
41
|
-
const resolved = resolveWikilinkPath('../modules/introduction', 'courses/default.md');
|
|
42
|
-
expect(resolved).toBe('modules/introduction');
|
|
43
|
-
});
|
|
44
|
-
});
|
|
45
|
-
describe('findFileWithExtension', () => {
|
|
46
|
-
it('finds file with exact path', () => {
|
|
47
|
-
const files = new Map([
|
|
48
|
-
['modules/intro.md', 'content'],
|
|
49
|
-
]);
|
|
50
|
-
const result = findFileWithExtension('modules/intro.md', files);
|
|
51
|
-
expect(result).toBe('modules/intro.md');
|
|
52
|
-
});
|
|
53
|
-
it('finds file by adding .md extension', () => {
|
|
54
|
-
const files = new Map([
|
|
55
|
-
['modules/intro.md', 'content'],
|
|
56
|
-
]);
|
|
57
|
-
const result = findFileWithExtension('modules/intro', files);
|
|
58
|
-
expect(result).toBe('modules/intro.md');
|
|
59
|
-
});
|
|
60
|
-
it('returns null when file not found', () => {
|
|
61
|
-
const files = new Map([
|
|
62
|
-
['modules/other.md', 'content'],
|
|
63
|
-
]);
|
|
64
|
-
const result = findFileWithExtension('modules/intro', files);
|
|
65
|
-
expect(result).toBeNull();
|
|
66
|
-
});
|
|
67
|
-
it('prefers exact match over .md extension', () => {
|
|
68
|
-
const files = new Map([
|
|
69
|
-
['modules/intro', 'exact content'],
|
|
70
|
-
['modules/intro.md', 'md content'],
|
|
71
|
-
]);
|
|
72
|
-
const result = findFileWithExtension('modules/intro', files);
|
|
73
|
-
expect(result).toBe('modules/intro');
|
|
74
|
-
});
|
|
75
|
-
});
|
|
76
|
-
//# sourceMappingURL=wikilink.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"wikilink.test.js","sourceRoot":"","sources":["../../src/parser/wikilink.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
// src/validator/field-typos.test.ts
|
|
2
|
-
import { describe, it, expect } from 'vitest';
|
|
3
|
-
import { detectFieldTypos } from './field-typos.js';
|
|
4
|
-
describe('field typo detection', () => {
|
|
5
|
-
it('suggests correction for misspelled field "contnet" -> "content"', () => {
|
|
6
|
-
const warnings = detectFieldTypos({ contnet: 'value' }, 'test.md', 10);
|
|
7
|
-
expect(warnings).toHaveLength(1);
|
|
8
|
-
expect(warnings[0].message).toContain("'contnet'");
|
|
9
|
-
expect(warnings[0].suggestion).toContain("'content'");
|
|
10
|
-
expect(warnings[0].severity).toBe('warning');
|
|
11
|
-
});
|
|
12
|
-
it('suggests correction for "intructions" -> "instructions"', () => {
|
|
13
|
-
const warnings = detectFieldTypos({ intructions: 'value' }, 'test.md', 10);
|
|
14
|
-
expect(warnings).toHaveLength(1);
|
|
15
|
-
expect(warnings[0].suggestion).toContain("'instructions'");
|
|
16
|
-
});
|
|
17
|
-
it('suggests correction for "souce" -> "source"', () => {
|
|
18
|
-
const warnings = detectFieldTypos({ souce: 'value' }, 'test.md', 10);
|
|
19
|
-
expect(warnings).toHaveLength(1);
|
|
20
|
-
expect(warnings[0].suggestion).toContain("'source'");
|
|
21
|
-
});
|
|
22
|
-
it('ignores valid field names', () => {
|
|
23
|
-
const warnings = detectFieldTypos({ content: 'value', optional: 'true', instructions: 'do something' }, 'test.md', 10);
|
|
24
|
-
expect(warnings).toHaveLength(0);
|
|
25
|
-
});
|
|
26
|
-
it('does not suggest for completely unrelated field names', () => {
|
|
27
|
-
// "xyz123" is not close to any known field
|
|
28
|
-
const warnings = detectFieldTypos({ xyz123: 'value' }, 'test.md', 10);
|
|
29
|
-
expect(warnings).toHaveLength(0);
|
|
30
|
-
});
|
|
31
|
-
it('includes file and line in warnings', () => {
|
|
32
|
-
const warnings = detectFieldTypos({ contnet: 'value' }, 'Lenses/myfile.md', 42);
|
|
33
|
-
expect(warnings[0].file).toBe('Lenses/myfile.md');
|
|
34
|
-
expect(warnings[0].line).toBe(42);
|
|
35
|
-
});
|
|
36
|
-
it('handles multiple typos in same fields object', () => {
|
|
37
|
-
const warnings = detectFieldTypos({ contnet: 'value', intructions: 'do something' }, 'test.md', 10);
|
|
38
|
-
expect(warnings).toHaveLength(2);
|
|
39
|
-
});
|
|
40
|
-
});
|
|
41
|
-
//# sourceMappingURL=field-typos.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"field-typos.test.js","sourceRoot":"","sources":["../../src/validator/field-typos.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
// src/validator/field-values.test.ts
|
|
2
|
-
import { describe, it, expect } from 'vitest';
|
|
3
|
-
import { validateFieldValues } from './field-values.js';
|
|
4
|
-
describe('validateFieldValues', () => {
|
|
5
|
-
describe('boolean field validation', () => {
|
|
6
|
-
it('warns about optional:: field with non-boolean value', () => {
|
|
7
|
-
const warnings = validateFieldValues({ optional: 'yes' }, 'test.md', 10);
|
|
8
|
-
expect(warnings).toHaveLength(1);
|
|
9
|
-
expect(warnings[0].message).toContain("'optional'");
|
|
10
|
-
expect(warnings[0].suggestion).toContain("'true' or 'false'");
|
|
11
|
-
expect(warnings[0].severity).toBe('warning');
|
|
12
|
-
});
|
|
13
|
-
it('warns about hidePreviousContentFromUser:: with non-boolean value', () => {
|
|
14
|
-
const warnings = validateFieldValues({ hidePreviousContentFromUser: '1' }, 'test.md', 10);
|
|
15
|
-
expect(warnings).toHaveLength(1);
|
|
16
|
-
expect(warnings[0].message).toContain("'hidePreviousContentFromUser'");
|
|
17
|
-
});
|
|
18
|
-
it('warns about hidePreviousContentFromTutor:: with non-boolean value', () => {
|
|
19
|
-
const warnings = validateFieldValues({ hidePreviousContentFromTutor: 'yes' }, 'test.md', 10);
|
|
20
|
-
expect(warnings).toHaveLength(1);
|
|
21
|
-
expect(warnings[0].message).toContain("'hidePreviousContentFromTutor'");
|
|
22
|
-
});
|
|
23
|
-
it('warns about multiple boolean fields with non-boolean values', () => {
|
|
24
|
-
const warnings = validateFieldValues({ optional: 'yes', hidePreviousContentFromUser: '1' }, 'test.md', 10);
|
|
25
|
-
expect(warnings).toHaveLength(2);
|
|
26
|
-
});
|
|
27
|
-
it('does not warn about boolean field with "true"', () => {
|
|
28
|
-
const warnings = validateFieldValues({ optional: 'true' }, 'test.md', 10);
|
|
29
|
-
expect(warnings).toHaveLength(0);
|
|
30
|
-
});
|
|
31
|
-
it('does not warn about boolean field with "false"', () => {
|
|
32
|
-
const warnings = validateFieldValues({ optional: 'false' }, 'test.md', 10);
|
|
33
|
-
expect(warnings).toHaveLength(0);
|
|
34
|
-
});
|
|
35
|
-
it('accepts case-insensitive boolean values (True, FALSE)', () => {
|
|
36
|
-
const warnings = validateFieldValues({ optional: 'True', hidePreviousContentFromUser: 'FALSE' }, 'test.md', 10);
|
|
37
|
-
expect(warnings).toHaveLength(0);
|
|
38
|
-
});
|
|
39
|
-
it('does not warn about non-boolean fields with any value', () => {
|
|
40
|
-
const warnings = validateFieldValues({ content: 'some text', instructions: 'do something', source: '[[file.md]]' }, 'test.md', 10);
|
|
41
|
-
expect(warnings).toHaveLength(0);
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
});
|
|
45
|
-
//# sourceMappingURL=field-values.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"field-values.test.js","sourceRoot":"","sources":["../../src/validator/field-values.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
// src/validator/segment-fields.test.ts
|
|
2
|
-
import { describe, it, expect } from 'vitest';
|
|
3
|
-
import { validateSegmentFields } from './segment-fields.js';
|
|
4
|
-
describe('validateSegmentFields', () => {
|
|
5
|
-
describe('text segment', () => {
|
|
6
|
-
it('allows content and optional fields', () => {
|
|
7
|
-
const warnings = validateSegmentFields('text', { content: 'Some text', optional: 'true' }, 'test.md', 10);
|
|
8
|
-
expect(warnings).toHaveLength(0);
|
|
9
|
-
});
|
|
10
|
-
it('warns about from:: in text segment', () => {
|
|
11
|
-
const warnings = validateSegmentFields('text', { content: 'Some text', from: 'Start here' }, 'test.md', 10);
|
|
12
|
-
expect(warnings).toHaveLength(1);
|
|
13
|
-
expect(warnings[0].message).toContain('from');
|
|
14
|
-
expect(warnings[0].message).toContain('text');
|
|
15
|
-
expect(warnings[0].severity).toBe('warning');
|
|
16
|
-
});
|
|
17
|
-
it('warns about to:: in text segment', () => {
|
|
18
|
-
const warnings = validateSegmentFields('text', { content: 'Some text', to: 'End here' }, 'test.md', 10);
|
|
19
|
-
expect(warnings).toHaveLength(1);
|
|
20
|
-
expect(warnings[0].message).toContain('to');
|
|
21
|
-
});
|
|
22
|
-
});
|
|
23
|
-
describe('chat segment', () => {
|
|
24
|
-
it('allows instructions, optional, and hide fields', () => {
|
|
25
|
-
const warnings = validateSegmentFields('chat', {
|
|
26
|
-
instructions: 'Do something',
|
|
27
|
-
optional: 'false',
|
|
28
|
-
hidePreviousContentFromUser: 'true',
|
|
29
|
-
hidePreviousContentFromTutor: 'false',
|
|
30
|
-
}, 'test.md', 10);
|
|
31
|
-
expect(warnings).toHaveLength(0);
|
|
32
|
-
});
|
|
33
|
-
it('warns about from:: in chat segment', () => {
|
|
34
|
-
const warnings = validateSegmentFields('chat', { instructions: 'Do something', from: '1:00' }, 'test.md', 10);
|
|
35
|
-
expect(warnings).toHaveLength(1);
|
|
36
|
-
expect(warnings[0].message).toContain('from');
|
|
37
|
-
expect(warnings[0].message).toContain('chat');
|
|
38
|
-
});
|
|
39
|
-
it('warns about to:: in chat segment', () => {
|
|
40
|
-
const warnings = validateSegmentFields('chat', { instructions: 'Do something', to: '2:00' }, 'test.md', 10);
|
|
41
|
-
expect(warnings).toHaveLength(1);
|
|
42
|
-
expect(warnings[0].message).toContain('to');
|
|
43
|
-
});
|
|
44
|
-
});
|
|
45
|
-
describe('article-excerpt segment', () => {
|
|
46
|
-
it('allows from, to, and optional fields', () => {
|
|
47
|
-
const warnings = validateSegmentFields('article-excerpt', { from: 'Start', to: 'End', optional: 'true' }, 'test.md', 10);
|
|
48
|
-
expect(warnings).toHaveLength(0);
|
|
49
|
-
});
|
|
50
|
-
it('does not warn about from/to in excerpt segment', () => {
|
|
51
|
-
const warnings = validateSegmentFields('article-excerpt', { from: 'Start', to: 'End' }, 'test.md', 10);
|
|
52
|
-
expect(warnings).toHaveLength(0);
|
|
53
|
-
});
|
|
54
|
-
});
|
|
55
|
-
describe('video-excerpt segment', () => {
|
|
56
|
-
it('allows from, to, and optional fields', () => {
|
|
57
|
-
const warnings = validateSegmentFields('video-excerpt', { from: '1:00', to: '5:00', optional: 'false' }, 'test.md', 10);
|
|
58
|
-
expect(warnings).toHaveLength(0);
|
|
59
|
-
});
|
|
60
|
-
});
|
|
61
|
-
describe('unknown segment type', () => {
|
|
62
|
-
it('returns no warnings for unknown segment type', () => {
|
|
63
|
-
const warnings = validateSegmentFields('unknown-type', { content: 'value', from: '1:00' }, 'test.md', 10);
|
|
64
|
-
expect(warnings).toHaveLength(0);
|
|
65
|
-
});
|
|
66
|
-
});
|
|
67
|
-
it('includes file and line in warnings', () => {
|
|
68
|
-
const warnings = validateSegmentFields('text', { content: 'value', from: 'start' }, 'Lenses/test.md', 42);
|
|
69
|
-
expect(warnings[0].file).toBe('Lenses/test.md');
|
|
70
|
-
expect(warnings[0].line).toBe(42);
|
|
71
|
-
});
|
|
72
|
-
});
|
|
73
|
-
//# sourceMappingURL=segment-fields.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"segment-fields.test.js","sourceRoot":"","sources":["../../src/validator/segment-fields.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|