@prodisco/search-libs 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.
- package/LICENSE +21 -0
- package/README.md +379 -0
- package/dist/__tests__/extractor.test.d.ts +5 -0
- package/dist/__tests__/extractor.test.d.ts.map +1 -0
- package/dist/__tests__/extractor.test.js +452 -0
- package/dist/__tests__/extractor.test.js.map +1 -0
- package/dist/__tests__/library-indexer.test.d.ts +5 -0
- package/dist/__tests__/library-indexer.test.d.ts.map +1 -0
- package/dist/__tests__/library-indexer.test.js +611 -0
- package/dist/__tests__/library-indexer.test.js.map +1 -0
- package/dist/__tests__/schema.test.d.ts +5 -0
- package/dist/__tests__/schema.test.d.ts.map +1 -0
- package/dist/__tests__/schema.test.js +231 -0
- package/dist/__tests__/schema.test.js.map +1 -0
- package/dist/__tests__/script-parser.test.d.ts +5 -0
- package/dist/__tests__/script-parser.test.d.ts.map +1 -0
- package/dist/__tests__/script-parser.test.js +178 -0
- package/dist/__tests__/script-parser.test.js.map +1 -0
- package/dist/__tests__/search-engine.test.d.ts +5 -0
- package/dist/__tests__/search-engine.test.d.ts.map +1 -0
- package/dist/__tests__/search-engine.test.js +497 -0
- package/dist/__tests__/search-engine.test.js.map +1 -0
- package/dist/extractor/ast-parser.d.ts +48 -0
- package/dist/extractor/ast-parser.d.ts.map +1 -0
- package/dist/extractor/ast-parser.js +118 -0
- package/dist/extractor/ast-parser.js.map +1 -0
- package/dist/extractor/function-extractor.d.ts +20 -0
- package/dist/extractor/function-extractor.d.ts.map +1 -0
- package/dist/extractor/function-extractor.js +169 -0
- package/dist/extractor/function-extractor.js.map +1 -0
- package/dist/extractor/index.d.ts +22 -0
- package/dist/extractor/index.d.ts.map +1 -0
- package/dist/extractor/index.js +194 -0
- package/dist/extractor/index.js.map +1 -0
- package/dist/extractor/method-extractor.d.ts +30 -0
- package/dist/extractor/method-extractor.d.ts.map +1 -0
- package/dist/extractor/method-extractor.js +163 -0
- package/dist/extractor/method-extractor.js.map +1 -0
- package/dist/extractor/package-resolver.d.ts +77 -0
- package/dist/extractor/package-resolver.d.ts.map +1 -0
- package/dist/extractor/package-resolver.js +766 -0
- package/dist/extractor/package-resolver.js.map +1 -0
- package/dist/extractor/type-extractor.d.ts +15 -0
- package/dist/extractor/type-extractor.d.ts.map +1 -0
- package/dist/extractor/type-extractor.js +206 -0
- package/dist/extractor/type-extractor.js.map +1 -0
- package/dist/extractor/types.d.ts +116 -0
- package/dist/extractor/types.d.ts.map +1 -0
- package/dist/extractor/types.js +5 -0
- package/dist/extractor/types.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/library-indexer.d.ts +104 -0
- package/dist/library-indexer.d.ts.map +1 -0
- package/dist/library-indexer.js +295 -0
- package/dist/library-indexer.js.map +1 -0
- package/dist/schema/base-schema.d.ts +63 -0
- package/dist/schema/base-schema.d.ts.map +1 -0
- package/dist/schema/base-schema.js +63 -0
- package/dist/schema/base-schema.js.map +1 -0
- package/dist/schema/index.d.ts +6 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +6 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/schema-builder.d.ts +47 -0
- package/dist/schema/schema-builder.d.ts.map +1 -0
- package/dist/schema/schema-builder.js +236 -0
- package/dist/schema/schema-builder.js.map +1 -0
- package/dist/script/index.d.ts +6 -0
- package/dist/script/index.d.ts.map +1 -0
- package/dist/script/index.js +5 -0
- package/dist/script/index.js.map +1 -0
- package/dist/script/script-parser.d.ts +18 -0
- package/dist/script/script-parser.d.ts.map +1 -0
- package/dist/script/script-parser.js +246 -0
- package/dist/script/script-parser.js.map +1 -0
- package/dist/script/types.d.ts +32 -0
- package/dist/script/types.d.ts.map +1 -0
- package/dist/script/types.js +5 -0
- package/dist/script/types.js.map +1 -0
- package/dist/search/index.d.ts +7 -0
- package/dist/search/index.d.ts.map +1 -0
- package/dist/search/index.js +7 -0
- package/dist/search/index.js.map +1 -0
- package/dist/search/query-builder.d.ts +59 -0
- package/dist/search/query-builder.d.ts.map +1 -0
- package/dist/search/query-builder.js +103 -0
- package/dist/search/query-builder.js.map +1 -0
- package/dist/search/result-formatter.d.ts +61 -0
- package/dist/search/result-formatter.d.ts.map +1 -0
- package/dist/search/result-formatter.js +170 -0
- package/dist/search/result-formatter.js.map +1 -0
- package/dist/search/search-engine.d.ts +105 -0
- package/dist/search/search-engine.d.ts.map +1 -0
- package/dist/search/search-engine.js +245 -0
- package/dist/search/search-engine.js.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for the schema module
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect } from 'vitest';
|
|
5
|
+
import { baseSchema } from '../schema/base-schema.js';
|
|
6
|
+
import { buildTypeDocument, buildMethodDocument, buildFunctionDocument, buildScriptDocument, } from '../schema/schema-builder.js';
|
|
7
|
+
describe('Base Schema', () => {
|
|
8
|
+
it('has required id field', () => {
|
|
9
|
+
expect(baseSchema.id).toBe('string');
|
|
10
|
+
});
|
|
11
|
+
it('has documentType as enum', () => {
|
|
12
|
+
expect(baseSchema.documentType).toBe('enum');
|
|
13
|
+
});
|
|
14
|
+
it('has name field for search', () => {
|
|
15
|
+
expect(baseSchema.name).toBe('string');
|
|
16
|
+
});
|
|
17
|
+
it('has description field for search', () => {
|
|
18
|
+
expect(baseSchema.description).toBe('string');
|
|
19
|
+
});
|
|
20
|
+
it('has searchTokens field for enhanced search', () => {
|
|
21
|
+
expect(baseSchema.searchTokens).toBe('string');
|
|
22
|
+
});
|
|
23
|
+
it('has library and category as enum for filtering', () => {
|
|
24
|
+
expect(baseSchema.library).toBe('enum');
|
|
25
|
+
expect(baseSchema.category).toBe('enum');
|
|
26
|
+
});
|
|
27
|
+
it('has type-specific fields', () => {
|
|
28
|
+
expect(baseSchema.properties).toBe('string');
|
|
29
|
+
expect(baseSchema.typeDefinition).toBe('string');
|
|
30
|
+
expect(baseSchema.nestedTypes).toBe('string');
|
|
31
|
+
expect(baseSchema.typeKind).toBe('enum');
|
|
32
|
+
});
|
|
33
|
+
it('has method-specific fields', () => {
|
|
34
|
+
expect(baseSchema.parameters).toBe('string');
|
|
35
|
+
expect(baseSchema.returnType).toBe('string');
|
|
36
|
+
expect(baseSchema.signature).toBe('string');
|
|
37
|
+
expect(baseSchema.className).toBe('string');
|
|
38
|
+
});
|
|
39
|
+
it('has script-specific fields', () => {
|
|
40
|
+
expect(baseSchema.filePath).toBe('string');
|
|
41
|
+
expect(baseSchema.keywords).toBe('string');
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
describe('Schema Builder', () => {
|
|
45
|
+
describe('buildTypeDocument', () => {
|
|
46
|
+
it('builds a document from ExtractedType', () => {
|
|
47
|
+
const extractedType = {
|
|
48
|
+
name: 'V1Pod',
|
|
49
|
+
kind: 'class',
|
|
50
|
+
description: 'A Pod resource.',
|
|
51
|
+
library: '@kubernetes/client-node',
|
|
52
|
+
sourceFile: '/path/to/file.d.ts',
|
|
53
|
+
properties: [
|
|
54
|
+
{ name: 'metadata', type: 'V1ObjectMeta', optional: true },
|
|
55
|
+
{ name: 'spec', type: 'V1PodSpec', optional: true },
|
|
56
|
+
],
|
|
57
|
+
nestedTypes: ['V1ObjectMeta', 'V1PodSpec'],
|
|
58
|
+
};
|
|
59
|
+
const doc = buildTypeDocument(extractedType);
|
|
60
|
+
// ID includes library for uniqueness
|
|
61
|
+
expect(doc.id).toBe('type:@kubernetes/client-node:V1Pod');
|
|
62
|
+
expect(doc.documentType).toBe('type');
|
|
63
|
+
expect(doc.name).toBe('V1Pod');
|
|
64
|
+
expect(doc.description).toBe('A Pod resource.');
|
|
65
|
+
expect(doc.library).toBe('@kubernetes/client-node');
|
|
66
|
+
expect(doc.category).toBe('class');
|
|
67
|
+
expect(doc.typeKind).toBe('class');
|
|
68
|
+
expect(doc.nestedTypes).toBe('V1ObjectMeta, V1PodSpec');
|
|
69
|
+
expect(doc.searchTokens).toContain('V1Pod');
|
|
70
|
+
});
|
|
71
|
+
it('includes properties as JSON', () => {
|
|
72
|
+
const extractedType = {
|
|
73
|
+
name: 'TestType',
|
|
74
|
+
kind: 'interface',
|
|
75
|
+
description: 'Test type.',
|
|
76
|
+
library: 'test-lib',
|
|
77
|
+
sourceFile: '/path/to/file.d.ts',
|
|
78
|
+
properties: [
|
|
79
|
+
{ name: 'id', type: 'string', optional: false },
|
|
80
|
+
{ name: 'value', type: 'number', optional: true },
|
|
81
|
+
],
|
|
82
|
+
nestedTypes: [],
|
|
83
|
+
};
|
|
84
|
+
const doc = buildTypeDocument(extractedType);
|
|
85
|
+
const properties = JSON.parse(doc.properties);
|
|
86
|
+
expect(properties.length).toBe(2);
|
|
87
|
+
expect(properties[0].name).toBe('id');
|
|
88
|
+
expect(properties[1].optional).toBe(true);
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
describe('buildMethodDocument', () => {
|
|
92
|
+
it('builds a document from ExtractedMethod', () => {
|
|
93
|
+
const extractedMethod = {
|
|
94
|
+
name: 'listNamespacedPod',
|
|
95
|
+
className: 'CoreV1Api',
|
|
96
|
+
description: 'List pods in a namespace.',
|
|
97
|
+
library: '@kubernetes/client-node',
|
|
98
|
+
sourceFile: '/path/to/file.d.ts',
|
|
99
|
+
parameters: [
|
|
100
|
+
{ name: 'namespace', type: 'string', optional: false },
|
|
101
|
+
{ name: 'pretty', type: 'string', optional: true },
|
|
102
|
+
],
|
|
103
|
+
returnType: 'Promise<V1PodList>',
|
|
104
|
+
isAsync: true,
|
|
105
|
+
isStatic: false,
|
|
106
|
+
};
|
|
107
|
+
const doc = buildMethodDocument(extractedMethod);
|
|
108
|
+
// ID includes library and className for uniqueness
|
|
109
|
+
expect(doc.id).toBe('method:@kubernetes/client-node:CoreV1Api:listNamespacedPod');
|
|
110
|
+
expect(doc.documentType).toBe('method');
|
|
111
|
+
expect(doc.name).toBe('listNamespacedPod');
|
|
112
|
+
expect(doc.description).toBe('List pods in a namespace.');
|
|
113
|
+
expect(doc.library).toBe('@kubernetes/client-node');
|
|
114
|
+
expect(doc.className).toBe('CoreV1Api');
|
|
115
|
+
expect(doc.returnType).toBe('Promise<V1PodList>');
|
|
116
|
+
expect(doc.searchTokens).toContain('listNamespacedPod');
|
|
117
|
+
});
|
|
118
|
+
it('extracts action category from method name', () => {
|
|
119
|
+
const extractedMethod = {
|
|
120
|
+
name: 'createDeployment',
|
|
121
|
+
className: 'AppsV1Api',
|
|
122
|
+
description: 'Create a deployment.',
|
|
123
|
+
library: '@kubernetes/client-node',
|
|
124
|
+
sourceFile: '/path/to/file.d.ts',
|
|
125
|
+
parameters: [],
|
|
126
|
+
returnType: 'Promise<V1Deployment>',
|
|
127
|
+
isAsync: true,
|
|
128
|
+
isStatic: false,
|
|
129
|
+
};
|
|
130
|
+
const doc = buildMethodDocument(extractedMethod);
|
|
131
|
+
expect(doc.category).toBe('create');
|
|
132
|
+
});
|
|
133
|
+
it('includes parameters as JSON', () => {
|
|
134
|
+
const extractedMethod = {
|
|
135
|
+
name: 'getItem',
|
|
136
|
+
className: 'Api',
|
|
137
|
+
description: 'Get an item.',
|
|
138
|
+
library: 'test-lib',
|
|
139
|
+
sourceFile: '/path/to/file.d.ts',
|
|
140
|
+
parameters: [
|
|
141
|
+
{ name: 'id', type: 'string', optional: false },
|
|
142
|
+
{ name: 'options', type: 'Options', optional: true },
|
|
143
|
+
],
|
|
144
|
+
returnType: 'Promise<Item>',
|
|
145
|
+
isAsync: true,
|
|
146
|
+
isStatic: false,
|
|
147
|
+
};
|
|
148
|
+
const doc = buildMethodDocument(extractedMethod);
|
|
149
|
+
const parameters = JSON.parse(doc.parameters);
|
|
150
|
+
expect(parameters.length).toBe(2);
|
|
151
|
+
expect(parameters[0].name).toBe('id');
|
|
152
|
+
expect(parameters[1].optional).toBe(true);
|
|
153
|
+
});
|
|
154
|
+
it('builds signature from method info', () => {
|
|
155
|
+
const extractedMethod = {
|
|
156
|
+
name: 'queryRange',
|
|
157
|
+
className: 'LokiClient',
|
|
158
|
+
description: 'Query logs over a time range.',
|
|
159
|
+
library: '@prodisco/loki-client',
|
|
160
|
+
sourceFile: '/path/to/file.d.ts',
|
|
161
|
+
parameters: [
|
|
162
|
+
{ name: 'logQL', type: 'string', optional: false },
|
|
163
|
+
{ name: 'start', type: 'Date', optional: false },
|
|
164
|
+
{ name: 'end', type: 'Date', optional: false },
|
|
165
|
+
],
|
|
166
|
+
returnType: 'Promise<QueryResult>',
|
|
167
|
+
isAsync: true,
|
|
168
|
+
isStatic: false,
|
|
169
|
+
};
|
|
170
|
+
const doc = buildMethodDocument(extractedMethod);
|
|
171
|
+
expect(doc.signature).toContain('queryRange');
|
|
172
|
+
expect(doc.signature).toContain('logQL');
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
describe('buildFunctionDocument', () => {
|
|
176
|
+
it('builds a document from ExtractedFunction', () => {
|
|
177
|
+
const extractedFunction = {
|
|
178
|
+
name: 'mean',
|
|
179
|
+
description: 'Calculate the arithmetic mean.',
|
|
180
|
+
library: 'simple-statistics',
|
|
181
|
+
sourceFile: '/path/to/file.d.ts',
|
|
182
|
+
parameters: [{ name: 'values', type: 'number[]', optional: false }],
|
|
183
|
+
returnType: 'number',
|
|
184
|
+
isAsync: false,
|
|
185
|
+
signature: 'mean(values: number[]): number',
|
|
186
|
+
};
|
|
187
|
+
const doc = buildFunctionDocument(extractedFunction);
|
|
188
|
+
// ID includes library for uniqueness
|
|
189
|
+
expect(doc.id).toBe('function:simple-statistics:mean');
|
|
190
|
+
expect(doc.documentType).toBe('function');
|
|
191
|
+
expect(doc.name).toBe('mean');
|
|
192
|
+
expect(doc.description).toBe('Calculate the arithmetic mean.');
|
|
193
|
+
expect(doc.library).toBe('simple-statistics');
|
|
194
|
+
expect(doc.category).toBe('descriptive');
|
|
195
|
+
expect(doc.returnType).toBe('number');
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
describe('buildScriptDocument', () => {
|
|
199
|
+
it('builds a document from CachedScript', () => {
|
|
200
|
+
const script = {
|
|
201
|
+
filename: 'list-pods.ts',
|
|
202
|
+
filePath: '/path/to/list-pods.ts',
|
|
203
|
+
description: 'List all pods in the cluster.',
|
|
204
|
+
resourceTypes: ['pod'],
|
|
205
|
+
keywords: ['list', 'pods', 'kubernetes'],
|
|
206
|
+
apiClasses: ['CoreV1Api'],
|
|
207
|
+
};
|
|
208
|
+
const doc = buildScriptDocument(script);
|
|
209
|
+
expect(doc.id).toBe('script:list-pods.ts');
|
|
210
|
+
expect(doc.documentType).toBe('script');
|
|
211
|
+
expect(doc.name).toBe('list-pods'); // Filename without .ts extension
|
|
212
|
+
expect(doc.description).toBe('List all pods in the cluster.');
|
|
213
|
+
expect(doc.library).toBe('CoreV1Api'); // First API class
|
|
214
|
+
expect(doc.filePath).toBe('/path/to/list-pods.ts');
|
|
215
|
+
expect(doc.keywords).toBe('list pods kubernetes');
|
|
216
|
+
});
|
|
217
|
+
it('handles empty keywords', () => {
|
|
218
|
+
const script = {
|
|
219
|
+
filename: 'empty-script.ts',
|
|
220
|
+
filePath: '/path/to/empty-script.ts',
|
|
221
|
+
description: 'A script with no keywords.',
|
|
222
|
+
resourceTypes: [],
|
|
223
|
+
keywords: [],
|
|
224
|
+
apiClasses: [],
|
|
225
|
+
};
|
|
226
|
+
const doc = buildScriptDocument(script);
|
|
227
|
+
expect(doc.keywords).toBe('');
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
//# sourceMappingURL=schema.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.test.js","sourceRoot":"","sources":["../../src/__tests__/schema.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"script-parser.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/script-parser.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for the script parser module
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
5
|
+
import { writeFileSync, existsSync, mkdirSync, rmSync } from 'fs';
|
|
6
|
+
import { join } from 'path';
|
|
7
|
+
import { parseScript, parseScriptsFromDirectory } from '../script/index.js';
|
|
8
|
+
describe('Script Parser', () => {
|
|
9
|
+
const testDir = `/tmp/search-libs-script-test-${Date.now()}`;
|
|
10
|
+
const testScriptPath = join(testDir, 'test-script.ts');
|
|
11
|
+
beforeEach(() => {
|
|
12
|
+
// Create test directory
|
|
13
|
+
if (!existsSync(testDir)) {
|
|
14
|
+
mkdirSync(testDir, { recursive: true });
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
afterEach(() => {
|
|
18
|
+
// Clean up test directory
|
|
19
|
+
if (existsSync(testDir)) {
|
|
20
|
+
rmSync(testDir, { recursive: true });
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
describe('parseScript', () => {
|
|
24
|
+
it('parses a script with JSDoc comment', () => {
|
|
25
|
+
const code = `/**
|
|
26
|
+
* List all pods in the default namespace.
|
|
27
|
+
* Uses CoreV1Api to fetch pod information.
|
|
28
|
+
*/
|
|
29
|
+
import * as k8s from '@kubernetes/client-node';
|
|
30
|
+
|
|
31
|
+
const kc = new k8s.KubeConfig();
|
|
32
|
+
kc.loadFromDefault();
|
|
33
|
+
const api = kc.makeApiClient(k8s.CoreV1Api);
|
|
34
|
+
|
|
35
|
+
async function main() {
|
|
36
|
+
const response = await api.listNamespacedPod({ namespace: 'default' });
|
|
37
|
+
console.log(response.items);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
main();
|
|
41
|
+
`;
|
|
42
|
+
writeFileSync(testScriptPath, code);
|
|
43
|
+
const script = parseScript(testScriptPath);
|
|
44
|
+
expect(script).toBeDefined();
|
|
45
|
+
expect(script?.filename).toBe('test-script.ts');
|
|
46
|
+
expect(script?.description).toContain('List all pods');
|
|
47
|
+
expect(script?.filePath).toBe(testScriptPath);
|
|
48
|
+
});
|
|
49
|
+
it('extracts API class references from script content', () => {
|
|
50
|
+
const code = `/**
|
|
51
|
+
* Test script.
|
|
52
|
+
*/
|
|
53
|
+
import * as k8s from '@kubernetes/client-node';
|
|
54
|
+
|
|
55
|
+
const kc = new k8s.KubeConfig();
|
|
56
|
+
const coreApi = kc.makeApiClient(k8s.CoreV1Api);
|
|
57
|
+
const appsApi = kc.makeApiClient(k8s.AppsV1Api);
|
|
58
|
+
`;
|
|
59
|
+
writeFileSync(testScriptPath, code);
|
|
60
|
+
const script = parseScript(testScriptPath);
|
|
61
|
+
expect(script).toBeDefined();
|
|
62
|
+
expect(script?.apiClasses).toContain('CoreV1Api');
|
|
63
|
+
expect(script?.apiClasses).toContain('AppsV1Api');
|
|
64
|
+
});
|
|
65
|
+
it('extracts keywords from description', () => {
|
|
66
|
+
const code = `/**
|
|
67
|
+
* Get deployment replicas and scale information.
|
|
68
|
+
* This script monitors deployment health.
|
|
69
|
+
*/
|
|
70
|
+
const x = 1;
|
|
71
|
+
`;
|
|
72
|
+
writeFileSync(testScriptPath, code);
|
|
73
|
+
const script = parseScript(testScriptPath);
|
|
74
|
+
expect(script).toBeDefined();
|
|
75
|
+
expect(script?.keywords.length).toBeGreaterThan(0);
|
|
76
|
+
expect(script?.keywords.some((k) => k.toLowerCase().includes('deployment'))).toBe(true);
|
|
77
|
+
});
|
|
78
|
+
it('returns null for non-existent file', () => {
|
|
79
|
+
const script = parseScript('/non/existent/path/script.ts');
|
|
80
|
+
expect(script).toBeNull();
|
|
81
|
+
});
|
|
82
|
+
it('handles script without JSDoc comment', () => {
|
|
83
|
+
const code = `
|
|
84
|
+
const x = 1;
|
|
85
|
+
console.log(x);
|
|
86
|
+
`;
|
|
87
|
+
writeFileSync(testScriptPath, code);
|
|
88
|
+
const script = parseScript(testScriptPath);
|
|
89
|
+
expect(script).toBeDefined();
|
|
90
|
+
// When no JSDoc, description is generated from filename
|
|
91
|
+
expect(script?.description).toContain('Script:');
|
|
92
|
+
});
|
|
93
|
+
it('handles multi-line JSDoc comments', () => {
|
|
94
|
+
const code = `/**
|
|
95
|
+
* First line of description.
|
|
96
|
+
* Second line of description.
|
|
97
|
+
* Third line with more details.
|
|
98
|
+
*/
|
|
99
|
+
const x = 1;
|
|
100
|
+
`;
|
|
101
|
+
writeFileSync(testScriptPath, code);
|
|
102
|
+
const script = parseScript(testScriptPath);
|
|
103
|
+
expect(script).toBeDefined();
|
|
104
|
+
expect(script?.description).toContain('First line');
|
|
105
|
+
expect(script?.description).toContain('Second line');
|
|
106
|
+
});
|
|
107
|
+
it('detects Prometheus API usage', () => {
|
|
108
|
+
const code = `/**
|
|
109
|
+
* Query Prometheus metrics.
|
|
110
|
+
*/
|
|
111
|
+
const { PrometheusDriver } = require('prometheus-query');
|
|
112
|
+
const prom = new PrometheusDriver({ endpoint: 'http://localhost:9090' });
|
|
113
|
+
await prom.instantQuery('up');
|
|
114
|
+
`;
|
|
115
|
+
writeFileSync(testScriptPath, code);
|
|
116
|
+
const script = parseScript(testScriptPath);
|
|
117
|
+
expect(script).toBeDefined();
|
|
118
|
+
expect(script?.apiClasses).toContain('PrometheusDriver');
|
|
119
|
+
});
|
|
120
|
+
it('detects Loki client usage', () => {
|
|
121
|
+
const code = `/**
|
|
122
|
+
* Query Loki logs.
|
|
123
|
+
*/
|
|
124
|
+
const { LokiClient } = require('@prodisco/loki-client');
|
|
125
|
+
const client = new LokiClient({ baseUrl: 'http://localhost:3100' });
|
|
126
|
+
await client.queryRange('{app="test"}');
|
|
127
|
+
`;
|
|
128
|
+
writeFileSync(testScriptPath, code);
|
|
129
|
+
const script = parseScript(testScriptPath);
|
|
130
|
+
expect(script).toBeDefined();
|
|
131
|
+
expect(script?.apiClasses).toContain('LokiClient');
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
describe('parseScriptsFromDirectory', () => {
|
|
135
|
+
it('parses all TypeScript scripts in a directory', () => {
|
|
136
|
+
// Create multiple test scripts
|
|
137
|
+
writeFileSync(join(testDir, 'script1.ts'), '/** Script 1 description */\nconst x = 1;');
|
|
138
|
+
writeFileSync(join(testDir, 'script2.ts'), '/** Script 2 description */\nconst y = 2;');
|
|
139
|
+
writeFileSync(join(testDir, 'not-a-script.txt'), 'This is not a script');
|
|
140
|
+
const scripts = parseScriptsFromDirectory(testDir);
|
|
141
|
+
expect(scripts.length).toBe(2);
|
|
142
|
+
expect(scripts.some((s) => s.filename === 'script1.ts')).toBe(true);
|
|
143
|
+
expect(scripts.some((s) => s.filename === 'script2.ts')).toBe(true);
|
|
144
|
+
});
|
|
145
|
+
it('recursively parses scripts when option is set', () => {
|
|
146
|
+
// Create subdirectory with scripts
|
|
147
|
+
const subDir = join(testDir, 'subdir');
|
|
148
|
+
mkdirSync(subDir, { recursive: true });
|
|
149
|
+
writeFileSync(join(testDir, 'root-script.ts'), '/** Root */\nconst x = 1;');
|
|
150
|
+
writeFileSync(join(subDir, 'sub-script.ts'), '/** Sub */\nconst y = 2;');
|
|
151
|
+
const scripts = parseScriptsFromDirectory(testDir, { recursive: true });
|
|
152
|
+
expect(scripts.length).toBe(2);
|
|
153
|
+
expect(scripts.some((s) => s.filename === 'root-script.ts')).toBe(true);
|
|
154
|
+
expect(scripts.some((s) => s.filename === 'sub-script.ts')).toBe(true);
|
|
155
|
+
});
|
|
156
|
+
it('only parses root level by default', () => {
|
|
157
|
+
// Create subdirectory with scripts
|
|
158
|
+
const subDir = join(testDir, 'subdir');
|
|
159
|
+
mkdirSync(subDir, { recursive: true });
|
|
160
|
+
writeFileSync(join(testDir, 'root-script.ts'), '/** Root */\nconst x = 1;');
|
|
161
|
+
writeFileSync(join(subDir, 'sub-script.ts'), '/** Sub */\nconst y = 2;');
|
|
162
|
+
const scripts = parseScriptsFromDirectory(testDir);
|
|
163
|
+
expect(scripts.length).toBe(1);
|
|
164
|
+
expect(scripts[0].filename).toBe('root-script.ts');
|
|
165
|
+
});
|
|
166
|
+
it('returns empty array for non-existent directory', () => {
|
|
167
|
+
const scripts = parseScriptsFromDirectory('/non/existent/directory');
|
|
168
|
+
expect(scripts).toEqual([]);
|
|
169
|
+
});
|
|
170
|
+
it('returns empty array for empty directory', () => {
|
|
171
|
+
const emptyDir = join(testDir, 'empty');
|
|
172
|
+
mkdirSync(emptyDir, { recursive: true });
|
|
173
|
+
const scripts = parseScriptsFromDirectory(emptyDir);
|
|
174
|
+
expect(scripts).toEqual([]);
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
//# sourceMappingURL=script-parser.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"script-parser.test.js","sourceRoot":"","sources":["../../src/__tests__/script-parser.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-engine.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/search-engine.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|