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
|
@@ -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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"}
|