lens-content-processor 0.1.0 → 0.2.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/dist/cli.js +5 -1
- package/dist/cli.js.map +1 -1
- 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
package/dist/parser/lens.test.js
DELETED
|
@@ -1,453 +0,0 @@
|
|
|
1
|
-
// src/parser/lens.test.ts
|
|
2
|
-
import { describe, it, expect } from 'vitest';
|
|
3
|
-
import { parseLens } from './lens.js';
|
|
4
|
-
describe('parseLens', () => {
|
|
5
|
-
it('parses lens with text segment (H3 section, H4 segment)', () => {
|
|
6
|
-
const content = `---
|
|
7
|
-
id: 550e8400-e29b-41d4-a716-446655440002
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
### Text: Introduction
|
|
11
|
-
|
|
12
|
-
#### Text
|
|
13
|
-
content:: This is introductory content.
|
|
14
|
-
`;
|
|
15
|
-
const result = parseLens(content, 'Lenses/lens1.md');
|
|
16
|
-
expect(result.lens?.id).toBe('550e8400-e29b-41d4-a716-446655440002');
|
|
17
|
-
expect(result.lens?.sections).toHaveLength(1);
|
|
18
|
-
expect(result.lens?.sections[0].type).toBe('text');
|
|
19
|
-
expect(result.lens?.sections[0].segments[0].type).toBe('text');
|
|
20
|
-
expect(result.lens?.sections[0].segments[0].content).toBe('This is introductory content.');
|
|
21
|
-
});
|
|
22
|
-
it('parses article section with excerpt', () => {
|
|
23
|
-
const content = `---
|
|
24
|
-
id: 550e8400-e29b-41d4-a716-446655440002
|
|
25
|
-
---
|
|
26
|
-
|
|
27
|
-
### Article: Deep Dive
|
|
28
|
-
source:: [[../articles/deep-dive.md|Article]]
|
|
29
|
-
|
|
30
|
-
#### Article-excerpt
|
|
31
|
-
from:: "The key insight is"
|
|
32
|
-
to:: "understanding this concept."
|
|
33
|
-
`;
|
|
34
|
-
const result = parseLens(content, 'Lenses/lens1.md');
|
|
35
|
-
expect(result.lens?.sections[0].type).toBe('lens-article');
|
|
36
|
-
expect(result.lens?.sections[0].source).toBe('[[../articles/deep-dive.md|Article]]');
|
|
37
|
-
expect(result.lens?.sections[0].segments[0].type).toBe('article-excerpt');
|
|
38
|
-
// Note: from/to are parsed as strings here, converted to anchors during bundling
|
|
39
|
-
expect(result.lens?.sections[0].segments[0].fromAnchor).toBe('The key insight is');
|
|
40
|
-
expect(result.lens?.sections[0].segments[0].toAnchor).toBe('understanding this concept.');
|
|
41
|
-
});
|
|
42
|
-
it('parses video section with timestamp excerpt', () => {
|
|
43
|
-
const content = `---
|
|
44
|
-
id: 550e8400-e29b-41d4-a716-446655440002
|
|
45
|
-
---
|
|
46
|
-
|
|
47
|
-
### Video: Expert Interview
|
|
48
|
-
source:: [[../video_transcripts/interview.md|Video]]
|
|
49
|
-
|
|
50
|
-
#### Video-excerpt
|
|
51
|
-
from:: 1:30
|
|
52
|
-
to:: 5:45
|
|
53
|
-
`;
|
|
54
|
-
const result = parseLens(content, 'Lenses/lens1.md');
|
|
55
|
-
expect(result.lens?.sections[0].type).toBe('lens-video');
|
|
56
|
-
expect(result.lens?.sections[0].source).toBe('[[../video_transcripts/interview.md|Video]]');
|
|
57
|
-
expect(result.lens?.sections[0].segments[0].type).toBe('video-excerpt');
|
|
58
|
-
// Parsed as strings, converted to seconds during bundling
|
|
59
|
-
expect(result.lens?.sections[0].segments[0].fromTimeStr).toBe('1:30');
|
|
60
|
-
expect(result.lens?.sections[0].segments[0].toTimeStr).toBe('5:45');
|
|
61
|
-
});
|
|
62
|
-
it('requires source field in article/video sections', () => {
|
|
63
|
-
const content = `---
|
|
64
|
-
id: 550e8400-e29b-41d4-a716-446655440002
|
|
65
|
-
---
|
|
66
|
-
|
|
67
|
-
### Article: No Source
|
|
68
|
-
|
|
69
|
-
#### Article-excerpt
|
|
70
|
-
from:: "Start"
|
|
71
|
-
to:: "End"
|
|
72
|
-
`;
|
|
73
|
-
const result = parseLens(content, 'Lenses/bad.md');
|
|
74
|
-
expect(result.errors.some(e => e.message.includes('source'))).toBe(true);
|
|
75
|
-
});
|
|
76
|
-
it('parses text segment with multiline content', () => {
|
|
77
|
-
const content = `---
|
|
78
|
-
id: test-id
|
|
79
|
-
---
|
|
80
|
-
|
|
81
|
-
### Text: Introduction
|
|
82
|
-
|
|
83
|
-
#### Text
|
|
84
|
-
content::
|
|
85
|
-
Line one of content.
|
|
86
|
-
Line two of content.
|
|
87
|
-
Line three of content.
|
|
88
|
-
|
|
89
|
-
#### Chat
|
|
90
|
-
instructions:: Do something
|
|
91
|
-
`;
|
|
92
|
-
const result = parseLens(content, 'Lenses/test.md');
|
|
93
|
-
expect(result.lens?.sections[0].segments[0].type).toBe('text');
|
|
94
|
-
expect(result.lens?.sections[0].segments[0].content).toContain('Line one');
|
|
95
|
-
expect(result.lens?.sections[0].segments[0].content).toContain('Line two');
|
|
96
|
-
expect(result.lens?.sections[0].segments[0].content).toContain('Line three');
|
|
97
|
-
});
|
|
98
|
-
it('parses video-excerpt with only to:: (from defaults to 0:00)', () => {
|
|
99
|
-
const content = `---
|
|
100
|
-
id: test-id
|
|
101
|
-
---
|
|
102
|
-
|
|
103
|
-
### Video: Test Video
|
|
104
|
-
source:: [[../video_transcripts/test.md|Video]]
|
|
105
|
-
|
|
106
|
-
#### Video-excerpt
|
|
107
|
-
to:: 14:49
|
|
108
|
-
`;
|
|
109
|
-
const result = parseLens(content, 'Lenses/test.md');
|
|
110
|
-
expect(result.lens?.sections[0].segments[0].type).toBe('video-excerpt');
|
|
111
|
-
expect(result.lens?.sections[0].segments[0].fromTimeStr).toBe('0:00');
|
|
112
|
-
expect(result.lens?.sections[0].segments[0].toTimeStr).toBe('14:49');
|
|
113
|
-
});
|
|
114
|
-
it('parses chat segment with multiline instructions', () => {
|
|
115
|
-
const content = `---
|
|
116
|
-
id: test-id
|
|
117
|
-
---
|
|
118
|
-
|
|
119
|
-
### Text: Discussion
|
|
120
|
-
|
|
121
|
-
#### Chat
|
|
122
|
-
instructions::
|
|
123
|
-
First line of instructions.
|
|
124
|
-
Second line with more details.
|
|
125
|
-
|
|
126
|
-
Topics to cover:
|
|
127
|
-
- Topic one
|
|
128
|
-
- Topic two
|
|
129
|
-
|
|
130
|
-
hidePreviousContentFromUser:: false
|
|
131
|
-
`;
|
|
132
|
-
const result = parseLens(content, 'Lenses/test.md');
|
|
133
|
-
const chatSegment = result.lens?.sections[0].segments[0];
|
|
134
|
-
expect(chatSegment?.type).toBe('chat');
|
|
135
|
-
expect(chatSegment?.instructions).toContain('First line');
|
|
136
|
-
expect(chatSegment?.instructions).toContain('Topic one');
|
|
137
|
-
expect(chatSegment?.instructions).toContain('Topic two');
|
|
138
|
-
});
|
|
139
|
-
it('parses article-excerpt with only from:: (to end of article)', () => {
|
|
140
|
-
const content = `---
|
|
141
|
-
id: test-id
|
|
142
|
-
---
|
|
143
|
-
|
|
144
|
-
### Article: Test Article
|
|
145
|
-
source:: [[../articles/test.md|Article]]
|
|
146
|
-
|
|
147
|
-
#### Article-excerpt
|
|
148
|
-
from:: "Start here"
|
|
149
|
-
`;
|
|
150
|
-
const result = parseLens(content, 'Lenses/test.md');
|
|
151
|
-
expect(result.errors).toHaveLength(0);
|
|
152
|
-
expect(result.lens?.sections[0].segments[0].type).toBe('article-excerpt');
|
|
153
|
-
expect(result.lens?.sections[0].segments[0].fromAnchor).toBe('Start here');
|
|
154
|
-
expect(result.lens?.sections[0].segments[0].toAnchor).toBeUndefined();
|
|
155
|
-
});
|
|
156
|
-
it('parses article-excerpt with only to:: (from start of article)', () => {
|
|
157
|
-
const content = `---
|
|
158
|
-
id: test-id
|
|
159
|
-
---
|
|
160
|
-
|
|
161
|
-
### Article: Test Article
|
|
162
|
-
source:: [[../articles/test.md|Article]]
|
|
163
|
-
|
|
164
|
-
#### Article-excerpt
|
|
165
|
-
to:: "End here"
|
|
166
|
-
`;
|
|
167
|
-
const result = parseLens(content, 'Lenses/test.md');
|
|
168
|
-
expect(result.errors).toHaveLength(0);
|
|
169
|
-
expect(result.lens?.sections[0].segments[0].type).toBe('article-excerpt');
|
|
170
|
-
expect(result.lens?.sections[0].segments[0].fromAnchor).toBeUndefined();
|
|
171
|
-
expect(result.lens?.sections[0].segments[0].toAnchor).toBe('End here');
|
|
172
|
-
});
|
|
173
|
-
it('parses empty article-excerpt (entire article)', () => {
|
|
174
|
-
const content = `---
|
|
175
|
-
id: test-id
|
|
176
|
-
---
|
|
177
|
-
|
|
178
|
-
### Article: Test Article
|
|
179
|
-
source:: [[../articles/test.md|Article]]
|
|
180
|
-
|
|
181
|
-
#### Article-excerpt
|
|
182
|
-
`;
|
|
183
|
-
const result = parseLens(content, 'Lenses/test.md');
|
|
184
|
-
expect(result.errors).toHaveLength(0);
|
|
185
|
-
expect(result.lens?.sections[0].segments[0].type).toBe('article-excerpt');
|
|
186
|
-
expect(result.lens?.sections[0].segments[0].fromAnchor).toBeUndefined();
|
|
187
|
-
expect(result.lens?.sections[0].segments[0].toAnchor).toBeUndefined();
|
|
188
|
-
});
|
|
189
|
-
it('parses chat segment with title', () => {
|
|
190
|
-
const content = `---
|
|
191
|
-
id: test-id
|
|
192
|
-
---
|
|
193
|
-
|
|
194
|
-
### Text: Discussion
|
|
195
|
-
|
|
196
|
-
#### Chat: Discussion on AI Basics
|
|
197
|
-
instructions:: Talk about AI basics.
|
|
198
|
-
`;
|
|
199
|
-
const result = parseLens(content, 'Lenses/test.md');
|
|
200
|
-
const chatSegment = result.lens?.sections[0].segments[0];
|
|
201
|
-
expect(chatSegment?.type).toBe('chat');
|
|
202
|
-
expect(chatSegment?.title).toBe('Discussion on AI Basics');
|
|
203
|
-
expect(chatSegment?.instructions).toBe('Talk about AI basics.');
|
|
204
|
-
});
|
|
205
|
-
// Task 7.2: Field in wrong segment type
|
|
206
|
-
it('warns about from:: field in text segment', () => {
|
|
207
|
-
const content = `---
|
|
208
|
-
id: test-id
|
|
209
|
-
---
|
|
210
|
-
|
|
211
|
-
### Text: Wrong Field
|
|
212
|
-
|
|
213
|
-
#### Text
|
|
214
|
-
content:: Some text.
|
|
215
|
-
from:: "This is wrong"
|
|
216
|
-
`;
|
|
217
|
-
const result = parseLens(content, 'Lenses/test.md');
|
|
218
|
-
expect(result.errors.some(e => e.severity === 'warning' &&
|
|
219
|
-
e.message.includes('from') &&
|
|
220
|
-
e.message.includes('text'))).toBe(true);
|
|
221
|
-
});
|
|
222
|
-
it('warns about to:: field in chat segment', () => {
|
|
223
|
-
const content = `---
|
|
224
|
-
id: test-id
|
|
225
|
-
---
|
|
226
|
-
|
|
227
|
-
### Text: Wrong Field
|
|
228
|
-
|
|
229
|
-
#### Chat
|
|
230
|
-
instructions:: Do something.
|
|
231
|
-
to:: "This is wrong"
|
|
232
|
-
`;
|
|
233
|
-
const result = parseLens(content, 'Lenses/test.md');
|
|
234
|
-
expect(result.errors.some(e => e.severity === 'warning' &&
|
|
235
|
-
e.message.includes('to') &&
|
|
236
|
-
e.message.includes('chat'))).toBe(true);
|
|
237
|
-
});
|
|
238
|
-
it('does not warn about from/to in article-excerpt', () => {
|
|
239
|
-
const content = `---
|
|
240
|
-
id: test-id
|
|
241
|
-
---
|
|
242
|
-
|
|
243
|
-
### Article: Test Article
|
|
244
|
-
source:: [[../articles/test.md|Article]]
|
|
245
|
-
|
|
246
|
-
#### Article-excerpt
|
|
247
|
-
from:: "Start"
|
|
248
|
-
to:: "End"
|
|
249
|
-
`;
|
|
250
|
-
const result = parseLens(content, 'Lenses/test.md');
|
|
251
|
-
// No warnings about from/to in article-excerpt
|
|
252
|
-
expect(result.errors.filter(e => e.severity === 'warning' &&
|
|
253
|
-
(e.message.includes('from') || e.message.includes('to')))).toHaveLength(0);
|
|
254
|
-
});
|
|
255
|
-
// Task 7.3: Empty content field warning
|
|
256
|
-
it('warns about empty content:: field in text segment', () => {
|
|
257
|
-
const content = `---
|
|
258
|
-
id: test-id
|
|
259
|
-
---
|
|
260
|
-
|
|
261
|
-
### Text: Empty Content
|
|
262
|
-
|
|
263
|
-
#### Text
|
|
264
|
-
content::
|
|
265
|
-
`;
|
|
266
|
-
const result = parseLens(content, 'Lenses/test.md');
|
|
267
|
-
expect(result.errors.some(e => e.severity === 'warning' &&
|
|
268
|
-
e.message.toLowerCase().includes('empty'))).toBe(true);
|
|
269
|
-
});
|
|
270
|
-
it('warns about whitespace-only content:: field', () => {
|
|
271
|
-
const content = `---
|
|
272
|
-
id: test-id
|
|
273
|
-
---
|
|
274
|
-
|
|
275
|
-
### Text: Whitespace Only
|
|
276
|
-
|
|
277
|
-
#### Text
|
|
278
|
-
content::
|
|
279
|
-
`;
|
|
280
|
-
const result = parseLens(content, 'Lenses/test.md');
|
|
281
|
-
expect(result.errors.some(e => e.severity === 'warning' &&
|
|
282
|
-
e.message.toLowerCase().includes('empty'))).toBe(true);
|
|
283
|
-
});
|
|
284
|
-
it('does not warn about content:: with actual text', () => {
|
|
285
|
-
const content = `---
|
|
286
|
-
id: test-id
|
|
287
|
-
---
|
|
288
|
-
|
|
289
|
-
### Text: Has Content
|
|
290
|
-
|
|
291
|
-
#### Text
|
|
292
|
-
content:: This is real content.
|
|
293
|
-
`;
|
|
294
|
-
const result = parseLens(content, 'Lenses/test.md');
|
|
295
|
-
// No empty content warnings
|
|
296
|
-
expect(result.errors.filter(e => e.severity === 'warning' &&
|
|
297
|
-
e.message.toLowerCase().includes('empty'))).toHaveLength(0);
|
|
298
|
-
});
|
|
299
|
-
// Task 7.5: Empty segment warning
|
|
300
|
-
describe('empty segment warnings', () => {
|
|
301
|
-
it('warns about empty segment with no fields', () => {
|
|
302
|
-
const content = `---
|
|
303
|
-
id: test-id
|
|
304
|
-
---
|
|
305
|
-
|
|
306
|
-
### Text: Has Empty
|
|
307
|
-
|
|
308
|
-
#### Chat
|
|
309
|
-
|
|
310
|
-
#### Text
|
|
311
|
-
content:: Real content here.
|
|
312
|
-
`;
|
|
313
|
-
const result = parseLens(content, 'Lenses/test.md');
|
|
314
|
-
expect(result.errors.some(e => e.severity === 'warning' &&
|
|
315
|
-
e.message.toLowerCase().includes('empty') &&
|
|
316
|
-
e.message.toLowerCase().includes('chat'))).toBe(true);
|
|
317
|
-
});
|
|
318
|
-
it('warns about segment with only whitespace', () => {
|
|
319
|
-
const content = `---
|
|
320
|
-
id: test-id
|
|
321
|
-
---
|
|
322
|
-
|
|
323
|
-
### Text: Has Empty
|
|
324
|
-
|
|
325
|
-
#### Text
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
#### Chat
|
|
330
|
-
instructions:: Do something.
|
|
331
|
-
`;
|
|
332
|
-
const result = parseLens(content, 'Lenses/test.md');
|
|
333
|
-
expect(result.errors.some(e => e.severity === 'warning' &&
|
|
334
|
-
e.message.toLowerCase().includes('empty'))).toBe(true);
|
|
335
|
-
});
|
|
336
|
-
it('does not warn about segment with fields', () => {
|
|
337
|
-
const content = `---
|
|
338
|
-
id: test-id
|
|
339
|
-
---
|
|
340
|
-
|
|
341
|
-
### Text: Has Content
|
|
342
|
-
|
|
343
|
-
#### Text
|
|
344
|
-
content:: Some content.
|
|
345
|
-
|
|
346
|
-
#### Chat
|
|
347
|
-
instructions:: Do something.
|
|
348
|
-
`;
|
|
349
|
-
const result = parseLens(content, 'Lenses/test.md');
|
|
350
|
-
// No empty segment warnings
|
|
351
|
-
expect(result.errors.filter(e => e.severity === 'warning' &&
|
|
352
|
-
e.message.toLowerCase().includes('empty') &&
|
|
353
|
-
e.message.toLowerCase().includes('segment'))).toHaveLength(0);
|
|
354
|
-
});
|
|
355
|
-
});
|
|
356
|
-
// Task 7.6: Section with no segments warning
|
|
357
|
-
describe('section with no segments warnings', () => {
|
|
358
|
-
it('warns about section with no segments', () => {
|
|
359
|
-
const content = `---
|
|
360
|
-
id: test-id
|
|
361
|
-
---
|
|
362
|
-
|
|
363
|
-
### Article: Empty Section
|
|
364
|
-
source:: [[../articles/test.md|Article]]
|
|
365
|
-
`;
|
|
366
|
-
const result = parseLens(content, 'Lenses/test.md');
|
|
367
|
-
expect(result.errors.some(e => e.severity === 'warning' &&
|
|
368
|
-
e.message.toLowerCase().includes('no segments'))).toBe(true);
|
|
369
|
-
});
|
|
370
|
-
it('warns about text section with no segments', () => {
|
|
371
|
-
const content = `---
|
|
372
|
-
id: test-id
|
|
373
|
-
---
|
|
374
|
-
|
|
375
|
-
### Text: Empty Text Section
|
|
376
|
-
`;
|
|
377
|
-
const result = parseLens(content, 'Lenses/test.md');
|
|
378
|
-
expect(result.errors.some(e => e.severity === 'warning' &&
|
|
379
|
-
e.message.toLowerCase().includes('no segments'))).toBe(true);
|
|
380
|
-
});
|
|
381
|
-
it('does not warn about section with segments', () => {
|
|
382
|
-
const content = `---
|
|
383
|
-
id: test-id
|
|
384
|
-
---
|
|
385
|
-
|
|
386
|
-
### Article: Has Content
|
|
387
|
-
source:: [[../articles/test.md|Article]]
|
|
388
|
-
|
|
389
|
-
#### Article-excerpt
|
|
390
|
-
from:: "Start"
|
|
391
|
-
to:: "End"
|
|
392
|
-
`;
|
|
393
|
-
const result = parseLens(content, 'Lenses/test.md');
|
|
394
|
-
// No warnings about no segments
|
|
395
|
-
expect(result.errors.filter(e => e.severity === 'warning' &&
|
|
396
|
-
e.message.toLowerCase().includes('no segments'))).toHaveLength(0);
|
|
397
|
-
});
|
|
398
|
-
});
|
|
399
|
-
// Task 7.7: Boolean field with non-boolean value
|
|
400
|
-
describe('boolean field value validation', () => {
|
|
401
|
-
it('warns about optional:: field with non-boolean value', () => {
|
|
402
|
-
const content = `---
|
|
403
|
-
id: test-id
|
|
404
|
-
---
|
|
405
|
-
|
|
406
|
-
### Text: Test
|
|
407
|
-
|
|
408
|
-
#### Text
|
|
409
|
-
content:: Some content.
|
|
410
|
-
optional:: yes
|
|
411
|
-
`;
|
|
412
|
-
const result = parseLens(content, 'Lenses/test.md');
|
|
413
|
-
expect(result.errors.some(e => e.severity === 'warning' &&
|
|
414
|
-
e.message.includes("'optional'") &&
|
|
415
|
-
e.message.includes('non-boolean'))).toBe(true);
|
|
416
|
-
});
|
|
417
|
-
it('warns about hidePreviousContentFromUser:: with non-boolean value', () => {
|
|
418
|
-
const content = `---
|
|
419
|
-
id: test-id
|
|
420
|
-
---
|
|
421
|
-
|
|
422
|
-
### Text: Test
|
|
423
|
-
|
|
424
|
-
#### Chat
|
|
425
|
-
instructions:: Do something.
|
|
426
|
-
hidePreviousContentFromUser:: 1
|
|
427
|
-
`;
|
|
428
|
-
const result = parseLens(content, 'Lenses/test.md');
|
|
429
|
-
expect(result.errors.some(e => e.severity === 'warning' &&
|
|
430
|
-
e.message.includes("'hidePreviousContentFromUser'") &&
|
|
431
|
-
e.message.includes('non-boolean'))).toBe(true);
|
|
432
|
-
});
|
|
433
|
-
it('does not warn about boolean fields with valid values', () => {
|
|
434
|
-
const content = `---
|
|
435
|
-
id: test-id
|
|
436
|
-
---
|
|
437
|
-
|
|
438
|
-
### Text: Test
|
|
439
|
-
|
|
440
|
-
#### Chat
|
|
441
|
-
instructions:: Do something.
|
|
442
|
-
hidePreviousContentFromUser:: true
|
|
443
|
-
hidePreviousContentFromTutor:: false
|
|
444
|
-
optional:: true
|
|
445
|
-
`;
|
|
446
|
-
const result = parseLens(content, 'Lenses/test.md');
|
|
447
|
-
// No warnings about boolean values
|
|
448
|
-
expect(result.errors.filter(e => e.severity === 'warning' &&
|
|
449
|
-
e.message.includes('non-boolean'))).toHaveLength(0);
|
|
450
|
-
});
|
|
451
|
-
});
|
|
452
|
-
});
|
|
453
|
-
//# sourceMappingURL=lens.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lens.test.js","sourceRoot":"","sources":["../../src/parser/lens.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
// src/parser/module.test.ts
|
|
2
|
-
import { describe, it, expect } from 'vitest';
|
|
3
|
-
import { parseModule, parsePageTextSegments } from './module.js';
|
|
4
|
-
describe('parseModule', () => {
|
|
5
|
-
it('parses complete module', () => {
|
|
6
|
-
const content = `---
|
|
7
|
-
slug: intro
|
|
8
|
-
title: Introduction
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
# Learning Outcome: First Topic
|
|
12
|
-
source:: [[../Learning Outcomes/lo1.md|LO1]]
|
|
13
|
-
`;
|
|
14
|
-
const result = parseModule(content, 'modules/intro.md');
|
|
15
|
-
expect(result.module?.slug).toBe('intro');
|
|
16
|
-
expect(result.module?.title).toBe('Introduction');
|
|
17
|
-
expect(result.module?.sections).toHaveLength(1);
|
|
18
|
-
expect(result.errors).toHaveLength(0);
|
|
19
|
-
});
|
|
20
|
-
it('collects errors from all parsing stages', () => {
|
|
21
|
-
const content = `# No frontmatter
|
|
22
|
-
|
|
23
|
-
# Unknown: Bad Type
|
|
24
|
-
`;
|
|
25
|
-
const result = parseModule(content, 'modules/bad.md');
|
|
26
|
-
expect(result.errors.length).toBeGreaterThan(0);
|
|
27
|
-
expect(result.errors.some(e => e.message.includes('frontmatter'))).toBe(true);
|
|
28
|
-
});
|
|
29
|
-
it('parses Page section with ## Text content', () => {
|
|
30
|
-
const content = `---
|
|
31
|
-
slug: test
|
|
32
|
-
title: Test Module
|
|
33
|
-
---
|
|
34
|
-
|
|
35
|
-
# Page: Welcome
|
|
36
|
-
id:: d1e2f3a4-5678-90ab-cdef-1234567890ab
|
|
37
|
-
|
|
38
|
-
## Text
|
|
39
|
-
content::
|
|
40
|
-
This is the welcome text.
|
|
41
|
-
It spans multiple lines.
|
|
42
|
-
`;
|
|
43
|
-
const result = parseModule(content, 'modules/test.md');
|
|
44
|
-
expect(result.module?.sections).toHaveLength(1);
|
|
45
|
-
expect(result.module?.sections[0].type).toBe('page');
|
|
46
|
-
expect(result.module?.sections[0].fields.id).toBe('d1e2f3a4-5678-90ab-cdef-1234567890ab');
|
|
47
|
-
// The body should contain the ## Text subsection
|
|
48
|
-
expect(result.module?.sections[0].body).toContain('## Text');
|
|
49
|
-
expect(result.module?.sections[0].body).toContain('content::');
|
|
50
|
-
});
|
|
51
|
-
});
|
|
52
|
-
describe('parsePageTextSegments', () => {
|
|
53
|
-
it('parses ## Text subsection with multiline content', () => {
|
|
54
|
-
const body = `id:: d1e2f3a4-5678-90ab-cdef-1234567890ab
|
|
55
|
-
|
|
56
|
-
## Text
|
|
57
|
-
content::
|
|
58
|
-
This is the welcome text.
|
|
59
|
-
It spans multiple lines.
|
|
60
|
-
`;
|
|
61
|
-
const segments = parsePageTextSegments(body);
|
|
62
|
-
expect(segments).toHaveLength(1);
|
|
63
|
-
expect(segments[0].type).toBe('text');
|
|
64
|
-
expect(segments[0].content).toContain('welcome text');
|
|
65
|
-
expect(segments[0].content).toContain('multiple lines');
|
|
66
|
-
});
|
|
67
|
-
it('parses multiple ## Text subsections', () => {
|
|
68
|
-
const body = `id:: some-id
|
|
69
|
-
|
|
70
|
-
## Text
|
|
71
|
-
content::
|
|
72
|
-
First text segment.
|
|
73
|
-
|
|
74
|
-
## Text
|
|
75
|
-
content::
|
|
76
|
-
Second text segment.
|
|
77
|
-
`;
|
|
78
|
-
const segments = parsePageTextSegments(body);
|
|
79
|
-
expect(segments).toHaveLength(2);
|
|
80
|
-
expect(segments[0].content).toContain('First text');
|
|
81
|
-
expect(segments[1].content).toContain('Second text');
|
|
82
|
-
});
|
|
83
|
-
it('returns empty array when no ## Text subsections', () => {
|
|
84
|
-
const body = `id:: some-id
|
|
85
|
-
no text subsections here
|
|
86
|
-
`;
|
|
87
|
-
const segments = parsePageTextSegments(body);
|
|
88
|
-
expect(segments).toHaveLength(0);
|
|
89
|
-
});
|
|
90
|
-
it('handles content:: on same line', () => {
|
|
91
|
-
const body = `## Text
|
|
92
|
-
content:: Single line content.
|
|
93
|
-
`;
|
|
94
|
-
const segments = parsePageTextSegments(body);
|
|
95
|
-
expect(segments).toHaveLength(1);
|
|
96
|
-
expect(segments[0].content).toBe('Single line content.');
|
|
97
|
-
});
|
|
98
|
-
});
|
|
99
|
-
//# sourceMappingURL=module.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"module.test.js","sourceRoot":"","sources":["../../src/parser/module.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|