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,190 +0,0 @@
1
- // src/validator/standalone.test.ts
2
- import { describe, it, expect } from 'vitest';
3
- import { processContent } from '../index.js';
4
- describe('standalone file validation', () => {
5
- describe('Lenses not referenced by modules', () => {
6
- it('reports structural errors in standalone Lenses', () => {
7
- const files = new Map([
8
- // A lens with missing required content:: field in Text segment
9
- ['Lenses/orphan-lens.md', `---
10
- id: 550e8400-e29b-41d4-a716-446655440001
11
- ---
12
- ### Text: Missing Content
13
-
14
- #### Text
15
- `], // Missing content:: field
16
- ]);
17
- const result = processContent(files);
18
- // Should catch the missing content:: field even though no module uses this lens
19
- expect(result.errors.some(e => e.file.includes('orphan-lens') &&
20
- e.message.toLowerCase().includes('content'))).toBe(true);
21
- });
22
- it('reports missing id in standalone Lens', () => {
23
- const files = new Map([
24
- ['Lenses/no-id-lens.md', `---
25
- title: Missing ID
26
- ---
27
- ### Text: Intro
28
-
29
- #### Text
30
- content:: Hello world
31
- `],
32
- ]);
33
- const result = processContent(files);
34
- expect(result.errors.some(e => e.file.includes('no-id-lens') &&
35
- e.message.toLowerCase().includes('id'))).toBe(true);
36
- });
37
- it('validates article excerpt anchors in standalone Lens', () => {
38
- const files = new Map([
39
- ['Lenses/bad-anchor-lens.md', `---
40
- id: 550e8400-e29b-41d4-a716-446655440002
41
- ---
42
- ### Article: Test
43
- source:: [[../articles/test.md]]
44
-
45
- #### Article-excerpt
46
- from:: This anchor does not exist in the article
47
- to:: Neither does this one
48
- `],
49
- ['articles/test.md', `---
50
- title: Test
51
- ---
52
-
53
- The actual article content is completely different.
54
- `],
55
- ]);
56
- const result = processContent(files);
57
- // Should report anchor not found error
58
- expect(result.errors.some(e => e.file.includes('bad-anchor-lens') &&
59
- e.message.toLowerCase().includes('not found'))).toBe(true);
60
- });
61
- it('validates video excerpt timestamps in standalone Lens', () => {
62
- const files = new Map([
63
- ['Lenses/bad-timestamp-lens.md', `---
64
- id: 550e8400-e29b-41d4-a716-446655440003
65
- ---
66
- ### Video: Test Video
67
- source:: [[../video_transcripts/test.md]]
68
-
69
- #### Video-excerpt
70
- from:: 5:00
71
- to:: 10:00
72
- `],
73
- ['video_transcripts/test.md', `---
74
- title: Test Video
75
- ---
76
-
77
- 0:00 - Introduction to the topic
78
- 1:00 - First main point
79
- 2:00 - Second main point
80
- 3:00 - Conclusion
81
- `],
82
- ]);
83
- const result = processContent(files);
84
- // Should report timestamp not found (5:00 doesn't exist)
85
- expect(result.errors.some(e => e.file.includes('bad-timestamp-lens') &&
86
- e.message.toLowerCase().includes('not found'))).toBe(true);
87
- });
88
- it('reports missing source file in standalone Lens', () => {
89
- const files = new Map([
90
- ['Lenses/missing-source-lens.md', `---
91
- id: 550e8400-e29b-41d4-a716-446655440004
92
- ---
93
- ### Article: Test
94
- source:: [[../articles/nonexistent.md]]
95
-
96
- #### Article-excerpt
97
- from:: start
98
- to:: end
99
- `],
100
- ]);
101
- const result = processContent(files);
102
- // Should report source file not found
103
- expect(result.errors.some(e => e.file.includes('missing-source-lens') &&
104
- e.message.toLowerCase().includes('not found'))).toBe(true);
105
- });
106
- });
107
- describe('Learning Outcomes not referenced by modules', () => {
108
- it('reports structural errors in standalone Learning Outcomes', () => {
109
- const files = new Map([
110
- // An LO with missing source field - NOT referenced by any module
111
- ['Learning Outcomes/orphan-lo.md', `---
112
- id: 550e8400-e29b-41d4-a716-446655440010
113
- ---
114
- ## Lens: Test
115
- `], // Missing source:: field
116
- ]);
117
- const result = processContent(files);
118
- // Should catch the missing source:: field
119
- expect(result.errors.some(e => e.file.includes('orphan-lo') &&
120
- e.message.toLowerCase().includes('source'))).toBe(true);
121
- });
122
- it('reports missing id in standalone Learning Outcome', () => {
123
- const files = new Map([
124
- ['Learning Outcomes/no-id-lo.md', `---
125
- title: Missing ID
126
- ---
127
- ## Lens: Test
128
- source:: [[../Lenses/test.md]]
129
- `],
130
- ]);
131
- const result = processContent(files);
132
- expect(result.errors.some(e => e.file.includes('no-id-lo') &&
133
- e.message.toLowerCase().includes('id'))).toBe(true);
134
- });
135
- it('reports missing Lens section in standalone Learning Outcome', () => {
136
- const files = new Map([
137
- ['Learning Outcomes/no-lens-lo.md', `---
138
- id: 550e8400-e29b-41d4-a716-446655440011
139
- ---
140
- Just some text, no Lens section.
141
- `],
142
- ]);
143
- const result = processContent(files);
144
- expect(result.errors.some(e => e.file.includes('no-lens-lo') &&
145
- e.message.toLowerCase().includes('lens'))).toBe(true);
146
- });
147
- });
148
- describe('no false positives', () => {
149
- it('does not report errors for valid standalone Lens', () => {
150
- const files = new Map([
151
- ['Lenses/valid-lens.md', `---
152
- id: 550e8400-e29b-41d4-a716-446655440020
153
- ---
154
- ### Text: Intro
155
-
156
- #### Text
157
- content:: This is valid content.
158
-
159
- #### Chat
160
- instructions:: Discuss the topic.
161
- `],
162
- ]);
163
- const result = processContent(files);
164
- const lensErrors = result.errors.filter(e => e.file.includes('valid-lens'));
165
- expect(lensErrors).toHaveLength(0);
166
- });
167
- it('does not report errors for valid standalone Learning Outcome', () => {
168
- const files = new Map([
169
- ['Learning Outcomes/valid-lo.md', `---
170
- id: 550e8400-e29b-41d4-a716-446655440021
171
- ---
172
- ## Lens: Introduction
173
- source:: [[../Lenses/intro.md]]
174
- `],
175
- ['Lenses/intro.md', `---
176
- id: 550e8400-e29b-41d4-a716-446655440022
177
- ---
178
- ### Text: Intro
179
-
180
- #### Text
181
- content:: Hello
182
- `],
183
- ]);
184
- const result = processContent(files);
185
- const loErrors = result.errors.filter(e => e.file.includes('valid-lo'));
186
- expect(loErrors).toHaveLength(0);
187
- });
188
- });
189
- });
190
- //# sourceMappingURL=standalone.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"standalone.test.js","sourceRoot":"","sources":["../../src/validator/standalone.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,229 +0,0 @@
1
- // src/validator/uuid.test.ts
2
- import { describe, it, expect } from 'vitest';
3
- import { processContent } from '../index.js';
4
- describe('UUID validation', () => {
5
- describe('format validation', () => {
6
- it('accepts valid UUIDv4 format', () => {
7
- const files = new Map([
8
- ['modules/test.md', `---
9
- slug: test
10
- title: Test Module
11
- contentId: 550e8400-e29b-41d4-a716-446655440000
12
- ---
13
-
14
- # Page: Welcome
15
- `],
16
- ]);
17
- const result = processContent(files);
18
- const uuidErrors = result.errors.filter(e => e.message.toLowerCase().includes('uuid') ||
19
- e.message.toLowerCase().includes('invalid') && e.message.toLowerCase().includes('id'));
20
- expect(uuidErrors).toHaveLength(0);
21
- });
22
- it('rejects invalid UUID format in module contentId', () => {
23
- const files = new Map([
24
- ['modules/test.md', `---
25
- slug: test
26
- title: Test Module
27
- contentId: not-a-valid-uuid
28
- ---
29
-
30
- # Page: Welcome
31
- `],
32
- ]);
33
- const result = processContent(files);
34
- expect(result.errors.some(e => e.message.toLowerCase().includes('uuid') ||
35
- e.message.toLowerCase().includes('invalid'))).toBe(true);
36
- });
37
- it('rejects UUID with wrong number of characters', () => {
38
- const files = new Map([
39
- ['modules/test.md', `---
40
- slug: test
41
- title: Test Module
42
- contentId: 550e8400-e29b-41d4-a716
43
- ---
44
-
45
- # Page: Welcome
46
- `],
47
- ]);
48
- const result = processContent(files);
49
- expect(result.errors.some(e => e.message.toLowerCase().includes('uuid') ||
50
- e.message.toLowerCase().includes('invalid'))).toBe(true);
51
- });
52
- it('rejects UUID with invalid characters', () => {
53
- const files = new Map([
54
- ['modules/test.md', `---
55
- slug: test
56
- title: Test Module
57
- contentId: 550e8400-e29b-41d4-a716-44665544ZZZZ
58
- ---
59
-
60
- # Page: Welcome
61
- `],
62
- ]);
63
- const result = processContent(files);
64
- expect(result.errors.some(e => e.message.toLowerCase().includes('uuid') ||
65
- e.message.toLowerCase().includes('invalid'))).toBe(true);
66
- });
67
- it('rejects invalid UUID in Learning Outcome id', () => {
68
- const files = new Map([
69
- ['Learning Outcomes/lo1.md', `---
70
- id: bad-uuid
71
- ---
72
-
73
- ## Lens: Test
74
- source:: [[../Lenses/lens1.md]]
75
- `],
76
- ['Lenses/lens1.md', `---
77
- id: 550e8400-e29b-41d4-a716-446655440001
78
- ---
79
- ### Text: Intro
80
-
81
- #### Text
82
- content:: Hello
83
- `],
84
- ]);
85
- const result = processContent(files);
86
- expect(result.errors.some(e => e.message.toLowerCase().includes('uuid') ||
87
- e.message.toLowerCase().includes('invalid'))).toBe(true);
88
- });
89
- it('rejects invalid UUID in Lens id', () => {
90
- const files = new Map([
91
- ['Lenses/lens1.md', `---
92
- id: this-is-not-a-uuid
93
- ---
94
- ### Text: Intro
95
-
96
- #### Text
97
- content:: Hello
98
- `],
99
- ]);
100
- const result = processContent(files);
101
- expect(result.errors.some(e => e.message.toLowerCase().includes('uuid') ||
102
- e.message.toLowerCase().includes('invalid'))).toBe(true);
103
- });
104
- });
105
- describe('duplicate detection', () => {
106
- it('detects duplicate contentId across modules', () => {
107
- const files = new Map([
108
- ['modules/module1.md', `---
109
- slug: module1
110
- title: Module One
111
- contentId: 550e8400-e29b-41d4-a716-446655440000
112
- ---
113
-
114
- # Page: Welcome
115
- `],
116
- ['modules/module2.md', `---
117
- slug: module2
118
- title: Module Two
119
- contentId: 550e8400-e29b-41d4-a716-446655440000
120
- ---
121
-
122
- # Page: Hello
123
- `],
124
- ]);
125
- const result = processContent(files);
126
- expect(result.errors.some(e => e.message.toLowerCase().includes('duplicate') &&
127
- e.message.toLowerCase().includes('id'))).toBe(true);
128
- });
129
- it('detects duplicate id across Learning Outcomes', () => {
130
- const files = new Map([
131
- ['Learning Outcomes/lo1.md', `---
132
- id: 550e8400-e29b-41d4-a716-446655440001
133
- ---
134
-
135
- ## Lens: Test
136
- source:: [[../Lenses/lens1.md]]
137
- `],
138
- ['Learning Outcomes/lo2.md', `---
139
- id: 550e8400-e29b-41d4-a716-446655440001
140
- ---
141
-
142
- ## Lens: Test
143
- source:: [[../Lenses/lens1.md]]
144
- `],
145
- ['Lenses/lens1.md', `---
146
- id: 550e8400-e29b-41d4-a716-446655440002
147
- ---
148
- ### Text: Intro
149
-
150
- #### Text
151
- content:: Hello
152
- `],
153
- ]);
154
- const result = processContent(files);
155
- expect(result.errors.some(e => e.message.toLowerCase().includes('duplicate') &&
156
- e.message.toLowerCase().includes('id'))).toBe(true);
157
- });
158
- it('detects duplicate id across Lenses', () => {
159
- const files = new Map([
160
- ['Lenses/lens1.md', `---
161
- id: 550e8400-e29b-41d4-a716-446655440001
162
- ---
163
- ### Text: Intro
164
-
165
- #### Text
166
- content:: Hello
167
- `],
168
- ['Lenses/lens2.md', `---
169
- id: 550e8400-e29b-41d4-a716-446655440001
170
- ---
171
- ### Text: Intro
172
-
173
- #### Text
174
- content:: World
175
- `],
176
- ]);
177
- const result = processContent(files);
178
- expect(result.errors.some(e => e.message.toLowerCase().includes('duplicate') &&
179
- e.message.toLowerCase().includes('id'))).toBe(true);
180
- });
181
- it('detects same UUID used in different contexts (module contentId vs lens id)', () => {
182
- const files = new Map([
183
- ['modules/test.md', `---
184
- slug: test
185
- title: Test Module
186
- contentId: 550e8400-e29b-41d4-a716-446655440000
187
- ---
188
-
189
- # Page: Welcome
190
- `],
191
- ['Lenses/lens1.md', `---
192
- id: 550e8400-e29b-41d4-a716-446655440000
193
- ---
194
- ### Text: Intro
195
-
196
- #### Text
197
- content:: Hello
198
- `],
199
- ]);
200
- const result = processContent(files);
201
- expect(result.errors.some(e => e.message.toLowerCase().includes('duplicate') &&
202
- e.message.toLowerCase().includes('id'))).toBe(true);
203
- });
204
- it('allows different UUIDs across files', () => {
205
- const files = new Map([
206
- ['modules/module1.md', `---
207
- slug: module1
208
- title: Module One
209
- contentId: 550e8400-e29b-41d4-a716-446655440001
210
- ---
211
-
212
- # Page: Welcome
213
- `],
214
- ['modules/module2.md', `---
215
- slug: module2
216
- title: Module Two
217
- contentId: 550e8400-e29b-41d4-a716-446655440002
218
- ---
219
-
220
- # Page: Hello
221
- `],
222
- ]);
223
- const result = processContent(files);
224
- const duplicateErrors = result.errors.filter(e => e.message.toLowerCase().includes('duplicate'));
225
- expect(duplicateErrors).toHaveLength(0);
226
- });
227
- });
228
- });
229
- //# sourceMappingURL=uuid.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"uuid.test.js","sourceRoot":"","sources":["../../src/validator/uuid.test.ts"],"names":[],"mappings":"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"}