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.
Files changed (65) hide show
  1. package/dist/cli.js +5 -1
  2. package/dist/cli.js.map +1 -1
  3. package/dist/flattener/index.js +25 -7
  4. package/dist/flattener/index.js.map +1 -1
  5. package/dist/index.js +23 -2
  6. package/dist/index.js.map +1 -1
  7. package/dist/parser/learning-outcome.js +16 -1
  8. package/dist/parser/learning-outcome.js.map +1 -1
  9. package/dist/parser/lens.js +18 -0
  10. package/dist/parser/lens.js.map +1 -1
  11. package/dist/parser/wikilink.d.ts +28 -0
  12. package/dist/parser/wikilink.js +154 -0
  13. package/dist/parser/wikilink.js.map +1 -1
  14. package/package.json +1 -1
  15. package/dist/bundler/article.test.d.ts +0 -1
  16. package/dist/bundler/article.test.js +0 -212
  17. package/dist/bundler/article.test.js.map +0 -1
  18. package/dist/bundler/video.test.d.ts +0 -1
  19. package/dist/bundler/video.test.js +0 -95
  20. package/dist/bundler/video.test.js.map +0 -1
  21. package/dist/cli.test.d.ts +0 -1
  22. package/dist/cli.test.js +0 -45
  23. package/dist/cli.test.js.map +0 -1
  24. package/dist/flattener/index.test.d.ts +0 -1
  25. package/dist/flattener/index.test.js +0 -547
  26. package/dist/flattener/index.test.js.map +0 -1
  27. package/dist/fs/read-vault.test.d.ts +0 -1
  28. package/dist/fs/read-vault.test.js +0 -37
  29. package/dist/fs/read-vault.test.js.map +0 -1
  30. package/dist/parser/course.test.d.ts +0 -1
  31. package/dist/parser/course.test.js +0 -117
  32. package/dist/parser/course.test.js.map +0 -1
  33. package/dist/parser/frontmatter.test.d.ts +0 -1
  34. package/dist/parser/frontmatter.test.js +0 -54
  35. package/dist/parser/frontmatter.test.js.map +0 -1
  36. package/dist/parser/learning-outcome.test.d.ts +0 -1
  37. package/dist/parser/learning-outcome.test.js +0 -75
  38. package/dist/parser/learning-outcome.test.js.map +0 -1
  39. package/dist/parser/lens.test.d.ts +0 -1
  40. package/dist/parser/lens.test.js +0 -453
  41. package/dist/parser/lens.test.js.map +0 -1
  42. package/dist/parser/module.test.d.ts +0 -1
  43. package/dist/parser/module.test.js +0 -99
  44. package/dist/parser/module.test.js.map +0 -1
  45. package/dist/parser/sections.test.d.ts +0 -1
  46. package/dist/parser/sections.test.js +0 -297
  47. package/dist/parser/sections.test.js.map +0 -1
  48. package/dist/parser/wikilink.test.d.ts +0 -1
  49. package/dist/parser/wikilink.test.js +0 -76
  50. package/dist/parser/wikilink.test.js.map +0 -1
  51. package/dist/validator/field-typos.test.d.ts +0 -1
  52. package/dist/validator/field-typos.test.js +0 -41
  53. package/dist/validator/field-typos.test.js.map +0 -1
  54. package/dist/validator/field-values.test.d.ts +0 -1
  55. package/dist/validator/field-values.test.js +0 -45
  56. package/dist/validator/field-values.test.js.map +0 -1
  57. package/dist/validator/segment-fields.test.d.ts +0 -1
  58. package/dist/validator/segment-fields.test.js +0 -73
  59. package/dist/validator/segment-fields.test.js.map +0 -1
  60. package/dist/validator/standalone.test.d.ts +0 -1
  61. package/dist/validator/standalone.test.js +0 -190
  62. package/dist/validator/standalone.test.js.map +0 -1
  63. package/dist/validator/uuid.test.d.ts +0 -1
  64. package/dist/validator/uuid.test.js +0 -229
  65. 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":"AAAA,8BAA8B;AAC9B,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEvF,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,MAAM,GAAG,aAAa,CAAC,uCAAuC,CAAC,CAAC;QAEtE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QACzD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,MAAM,GAAG,aAAa,CAAC,qBAAqB,CAAC,CAAC;QAEpD,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QACnD,MAAM,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,MAAM,GAAG,aAAa,CAAC,yBAAyB,CAAC,CAAC;QAExD,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,MAAM,GAAG,aAAa,CAAC,8CAA8C,CAAC,CAAC;QAE7E,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,QAAQ,GAAG,mBAAmB,CAClC,6BAA6B,EAC7B,kBAAkB,CACnB,CAAC;QAEF,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,QAAQ,GAAG,mBAAmB,CAClC,6BAA6B,EAC7B,0BAA0B,CAC3B,CAAC;QAEF,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,QAAQ,GAAG,mBAAmB,CAClC,yBAAyB,EACzB,oBAAoB,CACrB,CAAC;QAEF,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC;YACpB,CAAC,kBAAkB,EAAE,SAAS,CAAC;SAChC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,qBAAqB,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;QAChE,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC;YACpB,CAAC,kBAAkB,EAAE,SAAS,CAAC;SAChC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,qBAAqB,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;QAC7D,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC;YACpB,CAAC,kBAAkB,EAAE,SAAS,CAAC;SAChC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,qBAAqB,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;QAC7D,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC;YACpB,CAAC,eAAe,EAAE,eAAe,CAAC;YAClC,CAAC,kBAAkB,EAAE,YAAY,CAAC;SACnC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,qBAAqB,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;QAC7D,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -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 {};