@vibe-validate/extractors 0.17.4 → 0.17.5
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/extractor-registry.d.ts.map +1 -1
- package/dist/extractor-registry.js +8 -8
- package/dist/extractor-registry.js.map +1 -1
- package/dist/extractors/ava/index.d.ts.map +1 -1
- package/dist/extractors/ava/index.js +15 -14
- package/dist/extractors/ava/index.js.map +1 -1
- package/dist/extractors/ava/index.test.js +30 -20
- package/dist/extractors/ava/index.test.js.map +1 -1
- package/dist/extractors/eslint/index.d.ts.map +1 -1
- package/dist/extractors/eslint/index.js +1 -1
- package/dist/extractors/eslint/index.js.map +1 -1
- package/dist/extractors/eslint/index.test.js.map +1 -1
- package/dist/extractors/generic/index.test.js.map +1 -1
- package/dist/extractors/jasmine/index.test.js.map +1 -1
- package/dist/extractors/jest/index.d.ts.map +1 -1
- package/dist/extractors/jest/index.js.map +1 -1
- package/dist/extractors/jest/index.test.js.map +1 -1
- package/dist/extractors/junit/index.d.ts.map +1 -1
- package/dist/extractors/junit/index.js +5 -5
- package/dist/extractors/junit/index.js.map +1 -1
- package/dist/extractors/junit/index.test.js.map +1 -1
- package/dist/extractors/maven-checkstyle/index.d.ts.map +1 -1
- package/dist/extractors/maven-checkstyle/index.js +1 -1
- package/dist/extractors/maven-checkstyle/index.js.map +1 -1
- package/dist/extractors/maven-checkstyle/index.test.js +2 -2
- package/dist/extractors/maven-checkstyle/index.test.js.map +1 -1
- package/dist/extractors/maven-compiler/index.d.ts.map +1 -1
- package/dist/extractors/maven-compiler/index.js +1 -1
- package/dist/extractors/maven-compiler/index.js.map +1 -1
- package/dist/extractors/maven-compiler/index.test.js +1 -1
- package/dist/extractors/maven-compiler/index.test.js.map +1 -1
- package/dist/extractors/maven-surefire/index.d.ts.map +1 -1
- package/dist/extractors/maven-surefire/index.js.map +1 -1
- package/dist/extractors/maven-surefire/index.test.js.map +1 -1
- package/dist/extractors/mocha/index.test.js.map +1 -1
- package/dist/extractors/playwright/index.test.js.map +1 -1
- package/dist/extractors/tap/index.test.js +2 -2
- package/dist/extractors/tap/index.test.js.map +1 -1
- package/dist/extractors/typescript/index.d.ts.map +1 -1
- package/dist/extractors/typescript/index.js +16 -19
- package/dist/extractors/typescript/index.js.map +1 -1
- package/dist/extractors/typescript/index.test.js.map +1 -1
- package/dist/extractors/vitest/index.d.ts.map +1 -1
- package/dist/extractors/vitest/index.js +16 -7
- package/dist/extractors/vitest/index.js.map +1 -1
- package/dist/extractors/vitest/index.test.js +38 -0
- package/dist/extractors/vitest/index.test.js.map +1 -1
- package/dist/plugin-loader.d.ts.map +1 -1
- package/dist/plugin-loader.js +1 -1
- package/dist/plugin-loader.js.map +1 -1
- package/dist/result-schema-export.d.ts.map +1 -1
- package/dist/result-schema-export.js.map +1 -1
- package/dist/result-schema.d.ts.map +1 -1
- package/dist/result-schema.js +1 -1
- package/dist/result-schema.js.map +1 -1
- package/dist/sandboxed-extractor.d.ts +1 -1
- package/dist/sandboxed-extractor.d.ts.map +1 -1
- package/dist/sandboxed-extractor.js.map +1 -1
- package/dist/scripts/generate-result-schema.js +1 -1
- package/dist/scripts/generate-result-schema.js.map +1 -1
- package/dist/smart-extractor.d.ts.map +1 -1
- package/dist/smart-extractor.js.map +1 -1
- package/dist/utils/guidance-generator.d.ts.map +1 -1
- package/dist/utils/guidance-generator.js +4 -7
- package/dist/utils/guidance-generator.js.map +1 -1
- package/dist/utils/test-framework-utils.d.ts.map +1 -1
- package/dist/utils/test-framework-utils.js.map +1 -1
- package/dist/utils.js +1 -1
- package/dist/utils.js.map +1 -1
- package/package.json +8 -8
- package/dist/ava-extractor.d.ts +0 -24
- package/dist/ava-extractor.d.ts.map +0 -1
- package/dist/ava-extractor.js +0 -343
- package/dist/ava-extractor.js.map +0 -1
- package/dist/eslint-extractor.d.ts +0 -25
- package/dist/eslint-extractor.d.ts.map +0 -1
- package/dist/eslint-extractor.js +0 -145
- package/dist/eslint-extractor.js.map +0 -1
- package/dist/generic-extractor.d.ts +0 -35
- package/dist/generic-extractor.d.ts.map +0 -1
- package/dist/generic-extractor.js +0 -128
- package/dist/generic-extractor.js.map +0 -1
- package/dist/jasmine-extractor.d.ts +0 -23
- package/dist/jasmine-extractor.d.ts.map +0 -1
- package/dist/jasmine-extractor.js +0 -151
- package/dist/jasmine-extractor.js.map +0 -1
- package/dist/jest-extractor.d.ts +0 -29
- package/dist/jest-extractor.d.ts.map +0 -1
- package/dist/jest-extractor.js +0 -174
- package/dist/jest-extractor.js.map +0 -1
- package/dist/junit-extractor.d.ts +0 -24
- package/dist/junit-extractor.d.ts.map +0 -1
- package/dist/junit-extractor.js +0 -193
- package/dist/junit-extractor.js.map +0 -1
- package/dist/maven-checkstyle-extractor.d.ts +0 -20
- package/dist/maven-checkstyle-extractor.d.ts.map +0 -1
- package/dist/maven-checkstyle-extractor.js +0 -208
- package/dist/maven-checkstyle-extractor.js.map +0 -1
- package/dist/maven-compiler-extractor.d.ts +0 -20
- package/dist/maven-compiler-extractor.d.ts.map +0 -1
- package/dist/maven-compiler-extractor.js +0 -218
- package/dist/maven-compiler-extractor.js.map +0 -1
- package/dist/maven-surefire-extractor.d.ts +0 -20
- package/dist/maven-surefire-extractor.d.ts.map +0 -1
- package/dist/maven-surefire-extractor.js +0 -228
- package/dist/maven-surefire-extractor.js.map +0 -1
- package/dist/mocha-extractor.d.ts +0 -23
- package/dist/mocha-extractor.d.ts.map +0 -1
- package/dist/mocha-extractor.js +0 -160
- package/dist/mocha-extractor.js.map +0 -1
- package/dist/playwright-extractor.d.ts +0 -38
- package/dist/playwright-extractor.d.ts.map +0 -1
- package/dist/playwright-extractor.js +0 -239
- package/dist/playwright-extractor.js.map +0 -1
- package/dist/sandbox.test.d.ts +0 -8
- package/dist/sandbox.test.d.ts.map +0 -1
- package/dist/sandbox.test.js +0 -395
- package/dist/sandbox.test.js.map +0 -1
- package/dist/sandboxed-extractor.test.d.ts +0 -5
- package/dist/sandboxed-extractor.test.d.ts.map +0 -1
- package/dist/sandboxed-extractor.test.js +0 -346
- package/dist/sandboxed-extractor.test.js.map +0 -1
- package/dist/tap-extractor.d.ts +0 -24
- package/dist/tap-extractor.d.ts.map +0 -1
- package/dist/tap-extractor.js +0 -217
- package/dist/tap-extractor.js.map +0 -1
- package/dist/typescript-extractor.d.ts +0 -25
- package/dist/typescript-extractor.d.ts.map +0 -1
- package/dist/typescript-extractor.js +0 -96
- package/dist/typescript-extractor.js.map +0 -1
- package/dist/vitest-extractor.d.ts +0 -38
- package/dist/vitest-extractor.d.ts.map +0 -1
- package/dist/vitest-extractor.js +0 -540
- package/dist/vitest-extractor.js.map +0 -1
package/dist/sandbox.test.js
DELETED
|
@@ -1,395 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Sandbox Module Tests
|
|
3
|
-
*
|
|
4
|
-
* Tests secure extractor execution using isolated-vm.
|
|
5
|
-
* These tests validate the sandbox can execute real extractor code safely.
|
|
6
|
-
*/
|
|
7
|
-
import { describe, it, expect } from 'vitest';
|
|
8
|
-
import { runInSandbox, createSandboxedCode, SandboxStatsCollector, } from './sandbox.js';
|
|
9
|
-
describe('Sandbox Module', () => {
|
|
10
|
-
describe('runInSandbox', () => {
|
|
11
|
-
it('should execute simple extractor code successfully', async () => {
|
|
12
|
-
const code = `
|
|
13
|
-
function extract(content) {
|
|
14
|
-
return [
|
|
15
|
-
{ message: 'Test error', severity: 'error' }
|
|
16
|
-
];
|
|
17
|
-
}
|
|
18
|
-
`;
|
|
19
|
-
const result = await runInSandbox({
|
|
20
|
-
code,
|
|
21
|
-
input: 'test input',
|
|
22
|
-
extractorName: 'test'
|
|
23
|
-
});
|
|
24
|
-
expect(result.success).toBe(true);
|
|
25
|
-
expect(result.errors).toHaveLength(1);
|
|
26
|
-
expect(result.errors?.[0].message).toBe('Test error');
|
|
27
|
-
expect(result.stats.durationMs).toBeGreaterThan(0);
|
|
28
|
-
});
|
|
29
|
-
it('should handle extractor that throws an error', async () => {
|
|
30
|
-
const code = `
|
|
31
|
-
function extract(content) {
|
|
32
|
-
throw new Error('Intentional failure');
|
|
33
|
-
}
|
|
34
|
-
`;
|
|
35
|
-
const result = await runInSandbox({
|
|
36
|
-
code,
|
|
37
|
-
input: 'test input',
|
|
38
|
-
extractorName: 'test'
|
|
39
|
-
});
|
|
40
|
-
expect(result.success).toBe(false);
|
|
41
|
-
expect(result.error).toContain('Intentional failure');
|
|
42
|
-
});
|
|
43
|
-
it('should enforce memory limits', async () => {
|
|
44
|
-
const code = `
|
|
45
|
-
function extract(content) {
|
|
46
|
-
// Try to allocate memory and fill it
|
|
47
|
-
const arrays = [];
|
|
48
|
-
try {
|
|
49
|
-
while (true) {
|
|
50
|
-
// Allocate 1MB chunks
|
|
51
|
-
arrays.push(new Array(256 * 1024).fill(1));
|
|
52
|
-
}
|
|
53
|
-
} catch (e) {
|
|
54
|
-
// Memory exhausted - this is expected
|
|
55
|
-
throw new Error('Out of memory');
|
|
56
|
-
}
|
|
57
|
-
return [];
|
|
58
|
-
}
|
|
59
|
-
`;
|
|
60
|
-
const result = await runInSandbox({
|
|
61
|
-
code,
|
|
62
|
-
input: 'test',
|
|
63
|
-
extractorName: 'memory-hog',
|
|
64
|
-
memoryLimitMB: 10, // Very low limit
|
|
65
|
-
timeoutMs: 1000 // Also set timeout to prevent hanging
|
|
66
|
-
});
|
|
67
|
-
// Should fail either due to memory limit or timeout
|
|
68
|
-
expect(result.success).toBe(false);
|
|
69
|
-
expect(result.error).toBeDefined();
|
|
70
|
-
});
|
|
71
|
-
it('should enforce timeout limits', async () => {
|
|
72
|
-
const code = `
|
|
73
|
-
function extract(content) {
|
|
74
|
-
// Infinite loop
|
|
75
|
-
while (true) {}
|
|
76
|
-
return [];
|
|
77
|
-
}
|
|
78
|
-
`;
|
|
79
|
-
const result = await runInSandbox({
|
|
80
|
-
code,
|
|
81
|
-
input: 'test',
|
|
82
|
-
extractorName: 'infinite-loop',
|
|
83
|
-
timeoutMs: 100 // Short timeout
|
|
84
|
-
});
|
|
85
|
-
expect(result.success).toBe(false);
|
|
86
|
-
expect(result.error).toContain('timed out');
|
|
87
|
-
});
|
|
88
|
-
it('should execute real extractor code (TypeScript-like)', async () => {
|
|
89
|
-
const code = String.raw `
|
|
90
|
-
function extract(content) {
|
|
91
|
-
const errors = [];
|
|
92
|
-
const pattern = /error TS(\d+):\s*(.+)/g;
|
|
93
|
-
|
|
94
|
-
let match;
|
|
95
|
-
while ((match = pattern.exec(content)) !== null) {
|
|
96
|
-
errors.push({
|
|
97
|
-
message: match[2].trim(),
|
|
98
|
-
code: 'TS' + match[1],
|
|
99
|
-
severity: 'error'
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
return errors;
|
|
104
|
-
}
|
|
105
|
-
`;
|
|
106
|
-
const input = `
|
|
107
|
-
src/test.ts:10:15 - error TS2322: Type 'string' is not assignable to type 'number'.
|
|
108
|
-
src/test.ts:20:5 - error TS2304: Cannot find name 'undefined'.
|
|
109
|
-
`;
|
|
110
|
-
const result = await runInSandbox({
|
|
111
|
-
code,
|
|
112
|
-
input,
|
|
113
|
-
extractorName: 'typescript'
|
|
114
|
-
});
|
|
115
|
-
expect(result.success).toBe(true);
|
|
116
|
-
expect(result.errors).toHaveLength(2);
|
|
117
|
-
expect(result.errors?.[0].code).toBe('TS2322');
|
|
118
|
-
expect(result.errors?.[1].code).toBe('TS2304');
|
|
119
|
-
});
|
|
120
|
-
it('should execute real extractor code (Maven-like)', async () => {
|
|
121
|
-
const code = String.raw `
|
|
122
|
-
function extract(content) {
|
|
123
|
-
const errors = [];
|
|
124
|
-
const pattern = /\[ERROR\]\s+([^:]+):\[(\d+),(\d+)\]\s+(.+)/g;
|
|
125
|
-
|
|
126
|
-
let match;
|
|
127
|
-
while ((match = pattern.exec(content)) !== null) {
|
|
128
|
-
errors.push({
|
|
129
|
-
file: match[1].trim(),
|
|
130
|
-
line: parseInt(match[2], 10),
|
|
131
|
-
column: parseInt(match[3], 10),
|
|
132
|
-
message: match[4].trim(),
|
|
133
|
-
severity: 'error'
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
return errors;
|
|
138
|
-
}
|
|
139
|
-
`;
|
|
140
|
-
const input = `
|
|
141
|
-
[ERROR] /src/main/java/App.java:[15,20] cannot find symbol
|
|
142
|
-
[ERROR] /src/main/java/Utils.java:[42,8] incompatible types
|
|
143
|
-
`;
|
|
144
|
-
const result = await runInSandbox({
|
|
145
|
-
code,
|
|
146
|
-
input,
|
|
147
|
-
extractorName: 'maven-compiler'
|
|
148
|
-
});
|
|
149
|
-
expect(result.success).toBe(true);
|
|
150
|
-
expect(result.errors).toHaveLength(2);
|
|
151
|
-
expect(result.errors?.[0].file).toContain('App.java');
|
|
152
|
-
expect(result.errors?.[0].line).toBe(15);
|
|
153
|
-
expect(result.errors?.[1].file).toContain('Utils.java');
|
|
154
|
-
expect(result.errors?.[1].line).toBe(42);
|
|
155
|
-
});
|
|
156
|
-
it('should provide accurate performance statistics', async () => {
|
|
157
|
-
const code = `
|
|
158
|
-
function extract(content) {
|
|
159
|
-
// Do some work
|
|
160
|
-
let result = [];
|
|
161
|
-
for (let i = 0; i < 1000; i++) {
|
|
162
|
-
result.push({ message: 'Error ' + i, severity: 'error' });
|
|
163
|
-
}
|
|
164
|
-
return result;
|
|
165
|
-
}
|
|
166
|
-
`;
|
|
167
|
-
const result = await runInSandbox({
|
|
168
|
-
code,
|
|
169
|
-
input: 'test',
|
|
170
|
-
extractorName: 'perf-test'
|
|
171
|
-
});
|
|
172
|
-
expect(result.success).toBe(true);
|
|
173
|
-
expect(result.stats.durationMs).toBeGreaterThan(0);
|
|
174
|
-
expect(result.stats.durationMs).toBeLessThan(1000); // Should be fast
|
|
175
|
-
expect(result.stats.memoryUsedMB).toBeGreaterThan(0);
|
|
176
|
-
});
|
|
177
|
-
it('should handle extractors that return empty arrays', async () => {
|
|
178
|
-
const code = `
|
|
179
|
-
function extract(content) {
|
|
180
|
-
return [];
|
|
181
|
-
}
|
|
182
|
-
`;
|
|
183
|
-
const result = await runInSandbox({
|
|
184
|
-
code,
|
|
185
|
-
input: 'no errors here',
|
|
186
|
-
extractorName: 'clean'
|
|
187
|
-
});
|
|
188
|
-
expect(result.success).toBe(true);
|
|
189
|
-
expect(result.errors).toHaveLength(0);
|
|
190
|
-
});
|
|
191
|
-
it('should handle extractors with complex logic', async () => {
|
|
192
|
-
const code = String.raw `
|
|
193
|
-
function extract(content) {
|
|
194
|
-
const errors = [];
|
|
195
|
-
const lines = content.split('\n');
|
|
196
|
-
|
|
197
|
-
for (let i = 0; i < lines.length; i++) {
|
|
198
|
-
const line = lines[i];
|
|
199
|
-
|
|
200
|
-
// Skip empty lines
|
|
201
|
-
if (!line.trim()) continue;
|
|
202
|
-
|
|
203
|
-
// Parse error format
|
|
204
|
-
if (line.includes('ERROR:')) {
|
|
205
|
-
const parts = line.split('ERROR:');
|
|
206
|
-
if (parts.length === 2) {
|
|
207
|
-
errors.push({
|
|
208
|
-
message: parts[1].trim(),
|
|
209
|
-
line: i + 1,
|
|
210
|
-
severity: 'error'
|
|
211
|
-
});
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
return errors;
|
|
217
|
-
}
|
|
218
|
-
`;
|
|
219
|
-
const input = `
|
|
220
|
-
Line 1: Some output
|
|
221
|
-
Line 2: ERROR: First error
|
|
222
|
-
Line 3: More output
|
|
223
|
-
Line 4: ERROR: Second error
|
|
224
|
-
`;
|
|
225
|
-
const result = await runInSandbox({
|
|
226
|
-
code,
|
|
227
|
-
input,
|
|
228
|
-
extractorName: 'complex'
|
|
229
|
-
});
|
|
230
|
-
expect(result.success).toBe(true);
|
|
231
|
-
expect(result.errors).toHaveLength(2);
|
|
232
|
-
expect(result.errors?.[0].message).toBe('First error');
|
|
233
|
-
expect(result.errors?.[1].message).toBe('Second error');
|
|
234
|
-
});
|
|
235
|
-
});
|
|
236
|
-
describe('createSandboxedCode', () => {
|
|
237
|
-
it('should handle named function declarations', () => {
|
|
238
|
-
function extract(content) {
|
|
239
|
-
return [{ message: content, severity: 'error' }];
|
|
240
|
-
}
|
|
241
|
-
const code = createSandboxedCode(extract);
|
|
242
|
-
expect(code).toContain('function extract(');
|
|
243
|
-
expect(code).toContain('return [');
|
|
244
|
-
});
|
|
245
|
-
it('should handle arrow functions', () => {
|
|
246
|
-
const extract = (content) => {
|
|
247
|
-
return [{ message: content, severity: 'error' }];
|
|
248
|
-
};
|
|
249
|
-
const code = createSandboxedCode(extract);
|
|
250
|
-
expect(code).toContain('function extract(content)');
|
|
251
|
-
});
|
|
252
|
-
});
|
|
253
|
-
describe('SandboxStatsCollector', () => {
|
|
254
|
-
it('should collect execution statistics', async () => {
|
|
255
|
-
const collector = new SandboxStatsCollector();
|
|
256
|
-
const code = `
|
|
257
|
-
function extract(content) {
|
|
258
|
-
return [{ message: 'Test', severity: 'error' }];
|
|
259
|
-
}
|
|
260
|
-
`;
|
|
261
|
-
// Execute multiple times
|
|
262
|
-
for (let i = 0; i < 3; i++) {
|
|
263
|
-
const result = await runInSandbox({
|
|
264
|
-
code,
|
|
265
|
-
input: 'test',
|
|
266
|
-
extractorName: 'stats-test'
|
|
267
|
-
});
|
|
268
|
-
collector.record(result);
|
|
269
|
-
}
|
|
270
|
-
const stats = collector.getStats();
|
|
271
|
-
expect(stats.totalExecutions).toBe(3);
|
|
272
|
-
expect(stats.successfulExecutions).toBe(3);
|
|
273
|
-
expect(stats.failedExecutions).toBe(0);
|
|
274
|
-
expect(stats.averageDurationMs).toBeGreaterThan(0);
|
|
275
|
-
expect(stats.averageMemoryUsedMB).toBeGreaterThan(0);
|
|
276
|
-
});
|
|
277
|
-
it('should track both successful and failed executions', async () => {
|
|
278
|
-
const collector = new SandboxStatsCollector();
|
|
279
|
-
// Successful execution
|
|
280
|
-
const successCode = `
|
|
281
|
-
function extract(content) {
|
|
282
|
-
return [];
|
|
283
|
-
}
|
|
284
|
-
`;
|
|
285
|
-
const successResult = await runInSandbox({
|
|
286
|
-
code: successCode,
|
|
287
|
-
input: 'test',
|
|
288
|
-
extractorName: 'success'
|
|
289
|
-
});
|
|
290
|
-
collector.record(successResult);
|
|
291
|
-
// Failed execution
|
|
292
|
-
const failCode = `
|
|
293
|
-
function extract(content) {
|
|
294
|
-
throw new Error('Fail');
|
|
295
|
-
}
|
|
296
|
-
`;
|
|
297
|
-
const failResult = await runInSandbox({
|
|
298
|
-
code: failCode,
|
|
299
|
-
input: 'test',
|
|
300
|
-
extractorName: 'fail'
|
|
301
|
-
});
|
|
302
|
-
collector.record(failResult);
|
|
303
|
-
const stats = collector.getStats();
|
|
304
|
-
expect(stats.totalExecutions).toBe(2);
|
|
305
|
-
expect(stats.successfulExecutions).toBe(1);
|
|
306
|
-
expect(stats.failedExecutions).toBe(1);
|
|
307
|
-
});
|
|
308
|
-
it('should reset statistics', async () => {
|
|
309
|
-
const collector = new SandboxStatsCollector();
|
|
310
|
-
const code = `
|
|
311
|
-
function extract(content) {
|
|
312
|
-
return [];
|
|
313
|
-
}
|
|
314
|
-
`;
|
|
315
|
-
const result = await runInSandbox({
|
|
316
|
-
code,
|
|
317
|
-
input: 'test',
|
|
318
|
-
extractorName: 'reset-test'
|
|
319
|
-
});
|
|
320
|
-
collector.record(result);
|
|
321
|
-
expect(collector.getStats().totalExecutions).toBe(1);
|
|
322
|
-
collector.reset();
|
|
323
|
-
expect(collector.getStats().totalExecutions).toBe(0);
|
|
324
|
-
expect(collector.getStats().successfulExecutions).toBe(0);
|
|
325
|
-
expect(collector.getStats().failedExecutions).toBe(0);
|
|
326
|
-
});
|
|
327
|
-
});
|
|
328
|
-
describe('Security Tests', () => {
|
|
329
|
-
it('should block access to Node.js process', async () => {
|
|
330
|
-
const code = `
|
|
331
|
-
function extract(content) {
|
|
332
|
-
// Try to access process
|
|
333
|
-
if (typeof process !== 'undefined') {
|
|
334
|
-
return [{ message: 'Process accessible!', severity: 'error' }];
|
|
335
|
-
}
|
|
336
|
-
return [];
|
|
337
|
-
}
|
|
338
|
-
`;
|
|
339
|
-
const result = await runInSandbox({
|
|
340
|
-
code,
|
|
341
|
-
input: 'test',
|
|
342
|
-
extractorName: 'process-test'
|
|
343
|
-
});
|
|
344
|
-
expect(result.success).toBe(true);
|
|
345
|
-
expect(result.errors).toHaveLength(0); // process should be undefined
|
|
346
|
-
});
|
|
347
|
-
it('should block access to require', async () => {
|
|
348
|
-
const code = `
|
|
349
|
-
function extract(content) {
|
|
350
|
-
// Try to use require
|
|
351
|
-
try {
|
|
352
|
-
require('fs');
|
|
353
|
-
return [{ message: 'require accessible!', severity: 'error' }];
|
|
354
|
-
} catch (e) {
|
|
355
|
-
return [];
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
`;
|
|
359
|
-
const result = await runInSandbox({
|
|
360
|
-
code,
|
|
361
|
-
input: 'test',
|
|
362
|
-
extractorName: 'require-test'
|
|
363
|
-
});
|
|
364
|
-
expect(result.success).toBe(true);
|
|
365
|
-
expect(result.errors).toHaveLength(0); // require should fail
|
|
366
|
-
});
|
|
367
|
-
it('should allow safe operations (String, Array, Object, JSON)', async () => {
|
|
368
|
-
const code = String.raw `
|
|
369
|
-
function extract(content) {
|
|
370
|
-
// Use safe APIs
|
|
371
|
-
const lines = content.split('\n');
|
|
372
|
-
const mapped = lines.map(l => l.trim());
|
|
373
|
-
const filtered = mapped.filter(l => l.length > 0);
|
|
374
|
-
const obj = { count: filtered.length };
|
|
375
|
-
const json = JSON.stringify(obj);
|
|
376
|
-
const parsed = JSON.parse(json);
|
|
377
|
-
|
|
378
|
-
return [{
|
|
379
|
-
message: 'Count: ' + parsed.count,
|
|
380
|
-
severity: 'info'
|
|
381
|
-
}];
|
|
382
|
-
}
|
|
383
|
-
`;
|
|
384
|
-
const result = await runInSandbox({
|
|
385
|
-
code,
|
|
386
|
-
input: 'line1\nline2\n\nline3',
|
|
387
|
-
extractorName: 'safe-api-test'
|
|
388
|
-
});
|
|
389
|
-
expect(result.success).toBe(true);
|
|
390
|
-
expect(result.errors).toHaveLength(1);
|
|
391
|
-
expect(result.errors?.[0].message).toBe('Count: 3');
|
|
392
|
-
});
|
|
393
|
-
});
|
|
394
|
-
});
|
|
395
|
-
//# sourceMappingURL=sandbox.test.js.map
|
package/dist/sandbox.test.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sandbox.test.js","sourceRoot":"","sources":["../src/sandbox.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sandboxed-extractor.test.d.ts","sourceRoot":"","sources":["../src/sandboxed-extractor.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|