functional-examples 0.0.1 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/README.md +63 -44
  2. package/README.md.template +28 -54
  3. package/dist/cli/commands/scan.d.ts +1 -1
  4. package/dist/cli/index.d.ts +2 -2
  5. package/dist/config/resolver.d.ts.map +1 -1
  6. package/dist/config/resolver.js +25 -2
  7. package/dist/config/resolver.js.map +1 -1
  8. package/dist/config/schema.d.ts +10 -0
  9. package/dist/config/schema.d.ts.map +1 -1
  10. package/dist/config/schema.js +6 -0
  11. package/dist/config/schema.js.map +1 -1
  12. package/dist/files/reader.d.ts +4 -20
  13. package/dist/files/reader.d.ts.map +1 -1
  14. package/dist/files/reader.js +6 -22
  15. package/dist/files/reader.js.map +1 -1
  16. package/dist/index.d.ts +2 -3
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +2 -1
  19. package/dist/index.js.map +1 -1
  20. package/dist/plugins/pipeline.d.ts +2 -1
  21. package/dist/plugins/pipeline.d.ts.map +1 -1
  22. package/dist/plugins/pipeline.js +4 -3
  23. package/dist/plugins/pipeline.js.map +1 -1
  24. package/dist/regions/defaults.d.ts +11 -0
  25. package/dist/regions/defaults.d.ts.map +1 -0
  26. package/dist/regions/defaults.js +20 -0
  27. package/dist/regions/defaults.js.map +1 -0
  28. package/dist/regions/parser.d.ts +18 -56
  29. package/dist/regions/parser.d.ts.map +1 -1
  30. package/dist/regions/parser.js +81 -149
  31. package/dist/regions/parser.js.map +1 -1
  32. package/dist/scanner/scanner.d.ts.map +1 -1
  33. package/dist/scanner/scanner.js +14 -5
  34. package/dist/scanner/scanner.js.map +1 -1
  35. package/dist/types/index.d.ts +2 -1
  36. package/dist/types/index.d.ts.map +1 -1
  37. package/dist/types/index.js +2 -0
  38. package/dist/types/index.js.map +1 -1
  39. package/package.json +2 -2
  40. package/dist/config/index.spec.d.ts.map +0 -1
  41. package/dist/config/index.spec.js +0 -142
  42. package/dist/config/index.spec.js.map +0 -1
  43. package/dist/extractors/loader.d.ts.map +0 -1
  44. package/dist/extractors/loader.js +0 -120
  45. package/dist/extractors/loader.js.map +0 -1
  46. package/dist/extractors/meta-yml-fn.d.ts.map +0 -1
  47. package/dist/extractors/meta-yml-fn.js +0 -66
  48. package/dist/extractors/meta-yml-fn.js.map +0 -1
  49. package/dist/extractors/meta-yml.d.ts.map +0 -1
  50. package/dist/extractors/meta-yml.js +0 -65
  51. package/dist/extractors/meta-yml.js.map +0 -1
  52. package/dist/extractors/registry.d.ts.map +0 -1
  53. package/dist/extractors/registry.js +0 -114
  54. package/dist/extractors/registry.js.map +0 -1
  55. package/dist/extractors/registry.spec.d.ts.map +0 -1
  56. package/dist/extractors/registry.spec.js +0 -102
  57. package/dist/extractors/registry.spec.js.map +0 -1
  58. package/dist/extractors/yaml-frontmatter-fn.d.ts.map +0 -1
  59. package/dist/extractors/yaml-frontmatter-fn.js +0 -73
  60. package/dist/extractors/yaml-frontmatter-fn.js.map +0 -1
  61. package/dist/extractors/yaml-frontmatter.d.ts.map +0 -1
  62. package/dist/extractors/yaml-frontmatter.js +0 -83
  63. package/dist/extractors/yaml-frontmatter.js.map +0 -1
  64. package/dist/extractors/yaml-frontmatter.spec.d.ts.map +0 -1
  65. package/dist/extractors/yaml-frontmatter.spec.js +0 -134
  66. package/dist/extractors/yaml-frontmatter.spec.js.map +0 -1
  67. package/dist/regions/index.d.ts +0 -7
  68. package/dist/regions/index.d.ts.map +0 -1
  69. package/dist/regions/index.js +0 -6
  70. package/dist/regions/index.js.map +0 -1
  71. package/dist/regions/languages.d.ts +0 -15
  72. package/dist/regions/languages.d.ts.map +0 -1
  73. package/dist/regions/languages.js +0 -182
  74. package/dist/regions/languages.js.map +0 -1
  75. package/dist/regions/parser.spec.d.ts.map +0 -1
  76. package/dist/regions/parser.spec.js +0 -190
  77. package/dist/regions/parser.spec.js.map +0 -1
  78. package/dist/regions/types.d.ts +0 -37
  79. package/dist/regions/types.d.ts.map +0 -1
  80. package/dist/regions/types.js +0 -5
  81. package/dist/regions/types.js.map +0 -1
  82. package/dist/scanner/scanner.spec.d.ts.map +0 -1
  83. package/dist/scanner/scanner.spec.js +0 -262
  84. package/dist/scanner/scanner.spec.js.map +0 -1
@@ -1,262 +0,0 @@
1
- import { describe, it, expect, vi } from 'vitest';
2
- import { scanExamples } from './scanner.js';
3
- /**
4
- * Create a mock extractor for testing
5
- */
6
- function createMockExtractor(name, result) {
7
- return {
8
- name,
9
- extract: vi.fn().mockResolvedValue({
10
- examples: [],
11
- errors: [],
12
- claimedFiles: new Set(),
13
- ...result,
14
- }),
15
- };
16
- }
17
- /**
18
- * Create a mock example for testing
19
- */
20
- function createMockExample(id, extractorName, files) {
21
- return {
22
- id,
23
- title: `Example ${id}`,
24
- rootPath: `/test/${id}`,
25
- files: files.map((f) => ({
26
- absolutePath: f,
27
- relativePath: f.split('/').pop() ?? f,
28
- })),
29
- metadata: {},
30
- extractorName,
31
- };
32
- }
33
- describe('scanExamples', () => {
34
- describe('basic operation', () => {
35
- it('returns empty result when no extractors provided', async () => {
36
- const result = await scanExamples({
37
- root: '/test',
38
- extractors: [],
39
- });
40
- expect(result.examples).toEqual([]);
41
- expect(result.errors).toHaveLength(1);
42
- expect(result.errors[0].message).toBe('No extractors provided');
43
- });
44
- it('runs extractors in parallel and collects results', async () => {
45
- const example1 = createMockExample('ex1', 'extractor-a', ['/test/a.ts']);
46
- const example2 = createMockExample('ex2', 'extractor-b', ['/test/b.ts']);
47
- const extractorA = createMockExtractor('extractor-a', {
48
- examples: [example1],
49
- claimedFiles: new Set(['/test/a.ts']),
50
- });
51
- const extractorB = createMockExtractor('extractor-b', {
52
- examples: [example2],
53
- claimedFiles: new Set(['/test/b.ts']),
54
- });
55
- const result = await scanExamples({
56
- root: '/test',
57
- extractors: [extractorA, extractorB],
58
- });
59
- expect(extractorA.extract).toHaveBeenCalledWith('/test', expect.any(Object));
60
- expect(extractorB.extract).toHaveBeenCalledWith('/test', expect.any(Object));
61
- expect(result.examples).toHaveLength(2);
62
- expect(result.examples.map((e) => e.id)).toEqual(['ex1', 'ex2']);
63
- expect(result.errors).toHaveLength(0);
64
- expect(result.conflicts).toHaveLength(0);
65
- });
66
- it('collects errors from extractors', async () => {
67
- const extractor = createMockExtractor('extractor-a', {
68
- errors: [{ path: '/test/bad.ts', message: 'Invalid syntax' }],
69
- });
70
- const result = await scanExamples({
71
- root: '/test',
72
- extractors: [extractor],
73
- });
74
- expect(result.errors).toHaveLength(1);
75
- expect(result.errors[0].message).toBe('Invalid syntax');
76
- });
77
- it('handles extractor exceptions gracefully', async () => {
78
- const extractor = {
79
- name: 'failing-extractor',
80
- extract: vi.fn().mockRejectedValue(new Error('Extractor crashed')),
81
- };
82
- const result = await scanExamples({
83
- root: '/test',
84
- extractors: [extractor],
85
- });
86
- expect(result.errors).toHaveLength(1);
87
- expect(result.errors[0].message).toContain('Extractor "failing-extractor" failed');
88
- expect(result.errors[0].message).toContain('Extractor crashed');
89
- });
90
- });
91
- describe('conflict detection', () => {
92
- it('detects when multiple extractors claim the same file', async () => {
93
- const sharedFile = '/test/shared.ts';
94
- const example1 = createMockExample('ex1', 'extractor-a', [sharedFile]);
95
- const example2 = createMockExample('ex2', 'extractor-b', [sharedFile]);
96
- const extractorA = createMockExtractor('extractor-a', {
97
- examples: [example1],
98
- claimedFiles: new Set([sharedFile]),
99
- });
100
- const extractorB = createMockExtractor('extractor-b', {
101
- examples: [example2],
102
- claimedFiles: new Set([sharedFile]),
103
- });
104
- const result = await scanExamples({
105
- root: '/test',
106
- extractors: [extractorA, extractorB],
107
- });
108
- expect(result.conflicts).toHaveLength(1);
109
- expect(result.conflicts[0].filePath).toBe(sharedFile);
110
- expect(result.conflicts[0].claimants).toEqual(['extractor-a', 'extractor-b']);
111
- expect(result.conflicts[0].resolution).toBe('error');
112
- expect(result.stats.conflictsDetected).toBe(1);
113
- expect(result.stats.conflictsResolved).toBe(0);
114
- });
115
- it('adds error for unresolved conflicts', async () => {
116
- const sharedFile = '/test/shared.ts';
117
- const extractorA = createMockExtractor('extractor-a', {
118
- examples: [createMockExample('ex1', 'extractor-a', [sharedFile])],
119
- claimedFiles: new Set([sharedFile]),
120
- });
121
- const extractorB = createMockExtractor('extractor-b', {
122
- examples: [createMockExample('ex2', 'extractor-b', [sharedFile])],
123
- claimedFiles: new Set([sharedFile]),
124
- });
125
- const result = await scanExamples({
126
- root: '/test',
127
- extractors: [extractorA, extractorB],
128
- });
129
- expect(result.errors).toHaveLength(1);
130
- expect(result.errors[0].message).toContain('claimed by multiple extractors');
131
- expect(result.errors[0].message).toContain('extractor-a');
132
- expect(result.errors[0].message).toContain('extractor-b');
133
- });
134
- it('excludes examples with conflicting files from results', async () => {
135
- const sharedFile = '/test/shared.ts';
136
- const extractorA = createMockExtractor('extractor-a', {
137
- examples: [createMockExample('ex1', 'extractor-a', [sharedFile])],
138
- claimedFiles: new Set([sharedFile]),
139
- });
140
- const extractorB = createMockExtractor('extractor-b', {
141
- examples: [createMockExample('ex2', 'extractor-b', [sharedFile])],
142
- claimedFiles: new Set([sharedFile]),
143
- });
144
- const result = await scanExamples({
145
- root: '/test',
146
- extractors: [extractorA, extractorB],
147
- });
148
- // Both examples should be excluded due to unresolved conflict
149
- expect(result.examples).toHaveLength(0);
150
- });
151
- });
152
- describe('conflict resolution via path mappings', () => {
153
- it('resolves conflicts using path mappings', async () => {
154
- const sharedFile = '/test/cli-forge/example.ts';
155
- const example1 = createMockExample('ex1', 'frontmatter', [sharedFile]);
156
- const example2 = createMockExample('ex2', 'meta-yml', [sharedFile]);
157
- const extractorA = createMockExtractor('frontmatter', {
158
- examples: [example1],
159
- claimedFiles: new Set([sharedFile]),
160
- });
161
- const extractorB = createMockExtractor('meta-yml', {
162
- examples: [example2],
163
- claimedFiles: new Set([sharedFile]),
164
- });
165
- const result = await scanExamples({
166
- root: '/test',
167
- extractors: [extractorA, extractorB],
168
- pathMappings: [
169
- { pattern: '**/cli-forge/**', extractor: 'frontmatter' },
170
- ],
171
- });
172
- expect(result.conflicts).toHaveLength(1);
173
- expect(result.conflicts[0].resolution).toBe('path-mapping');
174
- expect(result.conflicts[0].winner).toBe('frontmatter');
175
- expect(result.stats.conflictsResolved).toBe(1);
176
- // Only the winning extractor's example should be included
177
- expect(result.examples).toHaveLength(1);
178
- expect(result.examples[0].extractorName).toBe('frontmatter');
179
- });
180
- it('ignores path mappings that do not match any claimant', async () => {
181
- const sharedFile = '/test/shared.ts';
182
- const extractorA = createMockExtractor('extractor-a', {
183
- examples: [createMockExample('ex1', 'extractor-a', [sharedFile])],
184
- claimedFiles: new Set([sharedFile]),
185
- });
186
- const extractorB = createMockExtractor('extractor-b', {
187
- examples: [createMockExample('ex2', 'extractor-b', [sharedFile])],
188
- claimedFiles: new Set([sharedFile]),
189
- });
190
- const result = await scanExamples({
191
- root: '/test',
192
- extractors: [extractorA, extractorB],
193
- pathMappings: [
194
- // This mapping specifies an extractor that didn't claim the file
195
- { pattern: '**/*.ts', extractor: 'non-existent' },
196
- ],
197
- });
198
- // Conflict remains unresolved
199
- expect(result.conflicts[0].resolution).toBe('error');
200
- });
201
- });
202
- describe('include/exclude filtering', () => {
203
- it('excludes examples matching exclude patterns', async () => {
204
- const example1 = createMockExample('ex1', 'extractor', ['/test/src/a.ts']);
205
- const example2 = createMockExample('ex2', 'extractor', ['/test/dist/b.ts']);
206
- example1.rootPath = '/test/src/a.ts';
207
- example2.rootPath = '/test/dist/b.ts';
208
- const extractor = createMockExtractor('extractor', {
209
- examples: [example1, example2],
210
- claimedFiles: new Set(['/test/src/a.ts', '/test/dist/b.ts']),
211
- });
212
- const result = await scanExamples({
213
- root: '/test',
214
- extractors: [extractor],
215
- exclude: ['**/dist/**'],
216
- });
217
- expect(result.examples).toHaveLength(1);
218
- expect(result.examples[0].id).toBe('ex1');
219
- });
220
- it('includes only examples matching include patterns', async () => {
221
- const example1 = createMockExample('ex1', 'extractor', ['/test/examples/a.ts']);
222
- const example2 = createMockExample('ex2', 'extractor', ['/test/src/b.ts']);
223
- example1.rootPath = '/test/examples/a.ts';
224
- example2.rootPath = '/test/src/b.ts';
225
- const extractor = createMockExtractor('extractor', {
226
- examples: [example1, example2],
227
- claimedFiles: new Set(['/test/examples/a.ts', '/test/src/b.ts']),
228
- });
229
- const result = await scanExamples({
230
- root: '/test',
231
- extractors: [extractor],
232
- include: ['**/examples/**'],
233
- });
234
- expect(result.examples).toHaveLength(1);
235
- expect(result.examples[0].id).toBe('ex1');
236
- });
237
- });
238
- describe('statistics', () => {
239
- it('reports accurate statistics', async () => {
240
- const example1 = createMockExample('ex1', 'extractor-a', ['/test/a.ts', '/test/b.ts']);
241
- const example2 = createMockExample('ex2', 'extractor-b', ['/test/c.ts']);
242
- const extractorA = createMockExtractor('extractor-a', {
243
- examples: [example1],
244
- claimedFiles: new Set(['/test/a.ts', '/test/b.ts']),
245
- });
246
- const extractorB = createMockExtractor('extractor-b', {
247
- examples: [example2],
248
- claimedFiles: new Set(['/test/c.ts']),
249
- });
250
- const result = await scanExamples({
251
- root: '/test',
252
- extractors: [extractorA, extractorB],
253
- });
254
- expect(result.stats.filesClaimed).toBe(3);
255
- expect(result.stats.examplesFound).toBe(2);
256
- expect(result.stats.conflictsDetected).toBe(0);
257
- expect(result.stats.conflictsResolved).toBe(0);
258
- expect(result.stats.durationMs).toBeGreaterThanOrEqual(0);
259
- });
260
- });
261
- });
262
- //# sourceMappingURL=scanner.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scanner.spec.js","sourceRoot":"","sources":["../../src/scanner/scanner.spec.ts"],"names":[],"mappings":"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"}