@quenty/nevermore-cli 4.18.0 → 4.19.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/CHANGELOG.md +11 -0
- package/dist/commands/tools-command/ci-post-test-results.d.ts.map +1 -1
- package/dist/commands/tools-command/ci-post-test-results.js +18 -0
- package/dist/commands/tools-command/ci-post-test-results.js.map +1 -1
- package/dist/commands/tools-command/strip-sourcemap-jest-command.d.ts.map +1 -1
- package/dist/commands/tools-command/strip-sourcemap-jest-command.js.map +1 -1
- package/dist/utils/linting/parsers/moonwave-parser.d.ts.map +1 -1
- package/dist/utils/linting/parsers/moonwave-parser.js +2 -6
- package/dist/utils/linting/parsers/moonwave-parser.js.map +1 -1
- package/dist/utils/sourcemap/index.d.ts +4 -0
- package/dist/utils/sourcemap/index.d.ts.map +1 -0
- package/dist/utils/sourcemap/index.js +3 -0
- package/dist/utils/sourcemap/index.js.map +1 -0
- package/dist/utils/sourcemap/sourcemap-loader.d.ts +10 -0
- package/dist/utils/sourcemap/sourcemap-loader.d.ts.map +1 -0
- package/dist/utils/sourcemap/sourcemap-loader.js +29 -0
- package/dist/utils/sourcemap/sourcemap-loader.js.map +1 -0
- package/dist/utils/sourcemap/sourcemap-resolver.d.ts +30 -0
- package/dist/utils/sourcemap/sourcemap-resolver.d.ts.map +1 -0
- package/dist/utils/sourcemap/sourcemap-resolver.js +58 -0
- package/dist/utils/sourcemap/sourcemap-resolver.js.map +1 -0
- package/dist/utils/sourcemap/sourcemap-resolver.test.d.ts +2 -0
- package/dist/utils/sourcemap/sourcemap-resolver.test.d.ts.map +1 -0
- package/dist/utils/sourcemap/sourcemap-resolver.test.js +106 -0
- package/dist/utils/sourcemap/sourcemap-resolver.test.js.map +1 -0
- package/dist/utils/sourcemap/sourcemap-types.d.ts +13 -0
- package/dist/utils/sourcemap/sourcemap-types.d.ts.map +1 -0
- package/dist/utils/sourcemap/sourcemap-types.js +2 -0
- package/dist/utils/sourcemap/sourcemap-types.js.map +1 -0
- package/dist/utils/testing/parsers/index.d.ts +3 -0
- package/dist/utils/testing/parsers/index.d.ts.map +1 -0
- package/dist/utils/testing/parsers/index.js +3 -0
- package/dist/utils/testing/parsers/index.js.map +1 -0
- package/dist/utils/testing/parsers/jest-lua-parser.d.ts +41 -0
- package/dist/utils/testing/parsers/jest-lua-parser.d.ts.map +1 -0
- package/dist/utils/testing/parsers/jest-lua-parser.js +222 -0
- package/dist/utils/testing/parsers/jest-lua-parser.js.map +1 -0
- package/dist/utils/testing/parsers/jest-lua-parser.test.d.ts +2 -0
- package/dist/utils/testing/parsers/jest-lua-parser.test.d.ts.map +1 -0
- package/dist/utils/testing/parsers/jest-lua-parser.test.js +297 -0
- package/dist/utils/testing/parsers/jest-lua-parser.test.js.map +1 -0
- package/dist/utils/testing/parsers/roblox-path-resolver.d.ts +24 -0
- package/dist/utils/testing/parsers/roblox-path-resolver.d.ts.map +1 -0
- package/dist/utils/testing/parsers/roblox-path-resolver.js +71 -0
- package/dist/utils/testing/parsers/roblox-path-resolver.js.map +1 -0
- package/dist/utils/testing/parsers/roblox-path-resolver.test.d.ts +2 -0
- package/dist/utils/testing/parsers/roblox-path-resolver.test.d.ts.map +1 -0
- package/dist/utils/testing/parsers/roblox-path-resolver.test.js +76 -0
- package/dist/utils/testing/parsers/roblox-path-resolver.test.js.map +1 -0
- package/dist/utils/testing/test-log-parser.d.ts.map +1 -1
- package/dist/utils/testing/test-log-parser.js +2 -1
- package/dist/utils/testing/test-log-parser.js.map +1 -1
- package/package.json +6 -6
- package/src/commands/tools-command/ci-post-test-results.ts +26 -0
- package/src/commands/tools-command/strip-sourcemap-jest-command.ts +1 -7
- package/src/utils/linting/parsers/moonwave-parser.ts +2 -7
- package/src/utils/sourcemap/index.ts +3 -0
- package/src/utils/sourcemap/sourcemap-loader.ts +33 -0
- package/src/utils/sourcemap/sourcemap-resolver.test.ts +150 -0
- package/src/utils/sourcemap/sourcemap-resolver.ts +75 -0
- package/src/utils/sourcemap/sourcemap-types.ts +12 -0
- package/src/utils/testing/parsers/index.ts +2 -0
- package/src/utils/testing/parsers/jest-lua-parser.test.ts +350 -0
- package/src/utils/testing/parsers/jest-lua-parser.ts +279 -0
- package/src/utils/testing/parsers/roblox-path-resolver.test.ts +129 -0
- package/src/utils/testing/parsers/roblox-path-resolver.ts +85 -0
- package/src/utils/testing/test-log-parser.ts +3 -1
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parser for Jest-lua verbose output (`verbose=true, ci=true`).
|
|
3
|
+
*
|
|
4
|
+
* Handles two failure modes:
|
|
5
|
+
*
|
|
6
|
+
* 1. **Jest assertion failures** — `●` blocks:
|
|
7
|
+
* ```
|
|
8
|
+
* ● ObservableList > add and remove > should track count
|
|
9
|
+
*
|
|
10
|
+
* expect(received).toEqual(expected)
|
|
11
|
+
*
|
|
12
|
+
* Expected: 3
|
|
13
|
+
* Received: 2
|
|
14
|
+
*
|
|
15
|
+
* at ServerScriptService.observablecollection.Shared.ObservableList.spec:45
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* 2. **Runtime errors** — `Stack Begin`/`Stack End` blocks:
|
|
19
|
+
* ```
|
|
20
|
+
* Error: attempt to index nil with "Connect"
|
|
21
|
+
* Stack Begin
|
|
22
|
+
* Script 'ServerScriptService.maid.Shared.Maid.spec', Line 23
|
|
23
|
+
* Stack End
|
|
24
|
+
* ```
|
|
25
|
+
*
|
|
26
|
+
* The parser is intentionally lenient — it extracts what it can, skips what
|
|
27
|
+
* it can't, and never crashes on unexpected input.
|
|
28
|
+
*/
|
|
29
|
+
import * as fs from 'fs';
|
|
30
|
+
import { OutputHelper } from '@quenty/cli-output-helpers';
|
|
31
|
+
import { resolveRobloxTestPath } from './roblox-path-resolver.js';
|
|
32
|
+
/** Matches `at ServerScriptService.pkg.Path.spec:45` (with line number) */
|
|
33
|
+
const AT_LOCATION_PATTERN = /^\s+at\s+(.+):(\d+)\s*$/;
|
|
34
|
+
/** Matches `at ServerScriptService.pkg.Path.spec` (without line number) */
|
|
35
|
+
const AT_LOCATION_NO_LINE_PATTERN = /^\s+at\s+(\S+)\s*$/;
|
|
36
|
+
/** Matches `Script 'ServerScriptService.pkg.Path.spec', Line 23` */
|
|
37
|
+
const SCRIPT_LOCATION_PATTERN = /Script '([^']+)', Line (\d+)/;
|
|
38
|
+
/** Matches the Jest failure header: `● TestSuite > nested > test name` */
|
|
39
|
+
const FAILURE_HEADER_PATTERN = /^\s*●\s+(.+)$/;
|
|
40
|
+
/**
|
|
41
|
+
* Search a `.spec.lua` file for an `it()` call matching `testName`.
|
|
42
|
+
* Returns the 1-indexed line number, or `undefined` if not found.
|
|
43
|
+
*/
|
|
44
|
+
function _findTestLineInFile(filePath, testName) {
|
|
45
|
+
let content;
|
|
46
|
+
try {
|
|
47
|
+
content = fs.readFileSync(filePath, 'utf-8');
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
const lines = content.split('\n');
|
|
53
|
+
for (let i = 0; i < lines.length; i++) {
|
|
54
|
+
if (lines[i].includes(`it("${testName}"`) ||
|
|
55
|
+
lines[i].includes(`it('${testName}'`)) {
|
|
56
|
+
return i + 1;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Parse Jest-lua verbose output into `Diagnostic[]`.
|
|
63
|
+
*
|
|
64
|
+
* @param raw - Raw test output (may include ANSI codes)
|
|
65
|
+
* @param options.packageName - Package name for fallback path resolution
|
|
66
|
+
*/
|
|
67
|
+
export function parseJestLuaOutput(raw, options) {
|
|
68
|
+
const diagnostics = [];
|
|
69
|
+
const clean = OutputHelper.stripAnsi(raw);
|
|
70
|
+
const lines = clean.split('\n');
|
|
71
|
+
let state = 0 /* State.IDLE */;
|
|
72
|
+
let failureCtx;
|
|
73
|
+
let stackCtx;
|
|
74
|
+
let lastNonEmptyLine = '';
|
|
75
|
+
function _emitFailure(ctx) {
|
|
76
|
+
const message = ctx.messageLines
|
|
77
|
+
.join('\n')
|
|
78
|
+
.trim();
|
|
79
|
+
// 3-tier line resolution:
|
|
80
|
+
// 1. Primary: line number extracted from `at <path>:<line>` or similar
|
|
81
|
+
// 2. Secondary: search the resolved .spec.lua file for the it() call
|
|
82
|
+
// 3. Tertiary: fall back to line 1
|
|
83
|
+
let file;
|
|
84
|
+
let line;
|
|
85
|
+
if (ctx.file) {
|
|
86
|
+
file = resolveRobloxTestPath(ctx.file, options.sourcemapResolver);
|
|
87
|
+
if (ctx.line) {
|
|
88
|
+
line = ctx.line;
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
const segments = ctx.title.split(' > ');
|
|
92
|
+
const testName = segments[segments.length - 1].trim();
|
|
93
|
+
line = _findTestLineInFile(file, testName) ?? 1;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
file = `src/${options.packageName}/src`;
|
|
98
|
+
line = 1;
|
|
99
|
+
}
|
|
100
|
+
diagnostics.push({
|
|
101
|
+
file,
|
|
102
|
+
line,
|
|
103
|
+
severity: 'error',
|
|
104
|
+
title: ctx.title,
|
|
105
|
+
message: message || 'Test failed',
|
|
106
|
+
source: 'jest-lua',
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
function _emitStack(ctx) {
|
|
110
|
+
const file = ctx.file
|
|
111
|
+
? resolveRobloxTestPath(ctx.file, options.sourcemapResolver)
|
|
112
|
+
: `src/${options.packageName}/src`;
|
|
113
|
+
const line = ctx.line ?? 1;
|
|
114
|
+
diagnostics.push({
|
|
115
|
+
file,
|
|
116
|
+
line,
|
|
117
|
+
severity: 'error',
|
|
118
|
+
title: 'Runtime error',
|
|
119
|
+
message: ctx.errorMessage || 'Unknown runtime error',
|
|
120
|
+
source: 'jest-lua',
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
for (const rawLine of lines) {
|
|
124
|
+
switch (state) {
|
|
125
|
+
case 0 /* State.IDLE */: {
|
|
126
|
+
const failureMatch = rawLine.match(FAILURE_HEADER_PATTERN);
|
|
127
|
+
if (failureMatch) {
|
|
128
|
+
failureCtx = {
|
|
129
|
+
title: failureMatch[1].trim(),
|
|
130
|
+
messageLines: [],
|
|
131
|
+
};
|
|
132
|
+
state = 1 /* State.FAILURE_BLOCK */;
|
|
133
|
+
break;
|
|
134
|
+
}
|
|
135
|
+
if (rawLine.trim() === 'Stack Begin') {
|
|
136
|
+
stackCtx = {
|
|
137
|
+
errorMessage: lastNonEmptyLine,
|
|
138
|
+
};
|
|
139
|
+
state = 2 /* State.STACK_BLOCK */;
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
if (rawLine.trim() !== '') {
|
|
143
|
+
lastNonEmptyLine = rawLine.trim();
|
|
144
|
+
}
|
|
145
|
+
break;
|
|
146
|
+
}
|
|
147
|
+
case 1 /* State.FAILURE_BLOCK */: {
|
|
148
|
+
if (!failureCtx) {
|
|
149
|
+
state = 0 /* State.IDLE */;
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
const atMatch = rawLine.match(AT_LOCATION_PATTERN);
|
|
153
|
+
if (atMatch) {
|
|
154
|
+
failureCtx.file = atMatch[1];
|
|
155
|
+
failureCtx.line = parseInt(atMatch[2], 10);
|
|
156
|
+
_emitFailure(failureCtx);
|
|
157
|
+
failureCtx = undefined;
|
|
158
|
+
state = 0 /* State.IDLE */;
|
|
159
|
+
break;
|
|
160
|
+
}
|
|
161
|
+
const atNoLineMatch = rawLine.match(AT_LOCATION_NO_LINE_PATTERN);
|
|
162
|
+
if (atNoLineMatch) {
|
|
163
|
+
failureCtx.file = atNoLineMatch[1];
|
|
164
|
+
_emitFailure(failureCtx);
|
|
165
|
+
failureCtx = undefined;
|
|
166
|
+
state = 0 /* State.IDLE */;
|
|
167
|
+
break;
|
|
168
|
+
}
|
|
169
|
+
const nextFailure = rawLine.match(FAILURE_HEADER_PATTERN);
|
|
170
|
+
if (nextFailure) {
|
|
171
|
+
_emitFailure(failureCtx);
|
|
172
|
+
failureCtx = {
|
|
173
|
+
title: nextFailure[1].trim(),
|
|
174
|
+
messageLines: [],
|
|
175
|
+
};
|
|
176
|
+
break;
|
|
177
|
+
}
|
|
178
|
+
if (rawLine.trim() === 'Stack Begin') {
|
|
179
|
+
_emitFailure(failureCtx);
|
|
180
|
+
stackCtx = {
|
|
181
|
+
errorMessage: failureCtx.messageLines.length > 0
|
|
182
|
+
? failureCtx.messageLines[failureCtx.messageLines.length - 1].trim()
|
|
183
|
+
: failureCtx.title,
|
|
184
|
+
};
|
|
185
|
+
failureCtx = undefined;
|
|
186
|
+
state = 2 /* State.STACK_BLOCK */;
|
|
187
|
+
break;
|
|
188
|
+
}
|
|
189
|
+
failureCtx.messageLines.push(rawLine);
|
|
190
|
+
break;
|
|
191
|
+
}
|
|
192
|
+
case 2 /* State.STACK_BLOCK */: {
|
|
193
|
+
if (!stackCtx) {
|
|
194
|
+
state = 0 /* State.IDLE */;
|
|
195
|
+
break;
|
|
196
|
+
}
|
|
197
|
+
const scriptMatch = rawLine.match(SCRIPT_LOCATION_PATTERN);
|
|
198
|
+
if (scriptMatch) {
|
|
199
|
+
stackCtx.file = scriptMatch[1];
|
|
200
|
+
stackCtx.line = parseInt(scriptMatch[2], 10);
|
|
201
|
+
break;
|
|
202
|
+
}
|
|
203
|
+
if (rawLine.trim() === 'Stack End') {
|
|
204
|
+
_emitStack(stackCtx);
|
|
205
|
+
stackCtx = undefined;
|
|
206
|
+
state = 0 /* State.IDLE */;
|
|
207
|
+
break;
|
|
208
|
+
}
|
|
209
|
+
break;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
// Flush any pending context at end of input
|
|
214
|
+
if (failureCtx && state === 1 /* State.FAILURE_BLOCK */) {
|
|
215
|
+
_emitFailure(failureCtx);
|
|
216
|
+
}
|
|
217
|
+
if (stackCtx && state === 2 /* State.STACK_BLOCK */) {
|
|
218
|
+
_emitStack(stackCtx);
|
|
219
|
+
}
|
|
220
|
+
return diagnostics;
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=jest-lua-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jest-lua-parser.js","sourceRoot":"","sources":["../../../../src/utils/testing/parsers/jest-lua-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jest-lua-parser.test.d.ts","sourceRoot":"","sources":["../../../../src/utils/testing/parsers/jest-lua-parser.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
+
import { parseJestLuaOutput } from './jest-lua-parser.js';
|
|
3
|
+
import { SourcemapResolver } from '../../sourcemap/index.js';
|
|
4
|
+
// Mock fs.readFileSync for _findTestLineInFile
|
|
5
|
+
vi.mock('fs', () => ({
|
|
6
|
+
readFileSync: vi.fn(() => {
|
|
7
|
+
throw new Error('ENOENT');
|
|
8
|
+
}),
|
|
9
|
+
}));
|
|
10
|
+
describe('parseJestLuaOutput', () => {
|
|
11
|
+
beforeEach(() => {
|
|
12
|
+
vi.restoreAllMocks();
|
|
13
|
+
});
|
|
14
|
+
it('parses a single assertion failure with at location', () => {
|
|
15
|
+
const input = [
|
|
16
|
+
' ● ObservableList > add and remove > should track count',
|
|
17
|
+
'',
|
|
18
|
+
' expect(received).toEqual(expected)',
|
|
19
|
+
'',
|
|
20
|
+
' Expected: 3',
|
|
21
|
+
' Received: 2',
|
|
22
|
+
'',
|
|
23
|
+
' at ServerScriptService.observablecollection.Shared.ObservableList.spec:45',
|
|
24
|
+
].join('\n');
|
|
25
|
+
const result = parseJestLuaOutput(input, {
|
|
26
|
+
packageName: 'observablecollection',
|
|
27
|
+
});
|
|
28
|
+
expect(result).toHaveLength(1);
|
|
29
|
+
expect(result[0]).toEqual({
|
|
30
|
+
file: 'src/observablecollection/src/Shared/ObservableList.spec.lua',
|
|
31
|
+
line: 45,
|
|
32
|
+
severity: 'error',
|
|
33
|
+
title: 'ObservableList > add and remove > should track count',
|
|
34
|
+
message: expect.stringContaining('expect(received).toEqual(expected)'),
|
|
35
|
+
source: 'jest-lua',
|
|
36
|
+
});
|
|
37
|
+
expect(result[0].message).toContain('Expected: 3');
|
|
38
|
+
expect(result[0].message).toContain('Received: 2');
|
|
39
|
+
});
|
|
40
|
+
it('parses multiple failures in one log', () => {
|
|
41
|
+
const input = [
|
|
42
|
+
' ● Suite > test one',
|
|
43
|
+
'',
|
|
44
|
+
' Expected: 1',
|
|
45
|
+
' Received: 2',
|
|
46
|
+
'',
|
|
47
|
+
' at ServerScriptService.mypkg.Shared.Foo.spec:10',
|
|
48
|
+
'',
|
|
49
|
+
' ● Suite > test two',
|
|
50
|
+
'',
|
|
51
|
+
' Expected: true',
|
|
52
|
+
' Received: false',
|
|
53
|
+
'',
|
|
54
|
+
' at ServerScriptService.mypkg.Shared.Bar.spec:20',
|
|
55
|
+
].join('\n');
|
|
56
|
+
const result = parseJestLuaOutput(input, { packageName: 'mypkg' });
|
|
57
|
+
expect(result).toHaveLength(2);
|
|
58
|
+
expect(result[0].title).toBe('Suite > test one');
|
|
59
|
+
expect(result[0].line).toBe(10);
|
|
60
|
+
expect(result[1].title).toBe('Suite > test two');
|
|
61
|
+
expect(result[1].line).toBe(20);
|
|
62
|
+
});
|
|
63
|
+
it('parses nested 3+ level test hierarchy', () => {
|
|
64
|
+
const input = [
|
|
65
|
+
' ● Level1 > Level2 > Level3 > Level4 > deep test',
|
|
66
|
+
'',
|
|
67
|
+
' failure message',
|
|
68
|
+
'',
|
|
69
|
+
' at ServerScriptService.pkg.Shared.Deep.spec:99',
|
|
70
|
+
].join('\n');
|
|
71
|
+
const result = parseJestLuaOutput(input, { packageName: 'pkg' });
|
|
72
|
+
expect(result).toHaveLength(1);
|
|
73
|
+
expect(result[0].title).toBe('Level1 > Level2 > Level3 > Level4 > deep test');
|
|
74
|
+
});
|
|
75
|
+
it('falls back to line 1 when no at location and file not found', () => {
|
|
76
|
+
const input = [
|
|
77
|
+
' ● Suite > test without location',
|
|
78
|
+
'',
|
|
79
|
+
' some error happened',
|
|
80
|
+
'',
|
|
81
|
+
'Test Suites: 1 failed, 1 total',
|
|
82
|
+
].join('\n');
|
|
83
|
+
const result = parseJestLuaOutput(input, { packageName: 'mypkg' });
|
|
84
|
+
expect(result).toHaveLength(1);
|
|
85
|
+
expect(result[0].line).toBe(1);
|
|
86
|
+
expect(result[0].file).toBe('src/mypkg/src');
|
|
87
|
+
});
|
|
88
|
+
it('searches spec file for it() call when at location has no line number', async () => {
|
|
89
|
+
const { readFileSync } = await import('fs');
|
|
90
|
+
const mockedReadFileSync = vi.mocked(readFileSync);
|
|
91
|
+
mockedReadFileSync.mockReturnValue([
|
|
92
|
+
'local require = require(script.Parent.loader).load(script)',
|
|
93
|
+
'',
|
|
94
|
+
'describe("Suite", function()',
|
|
95
|
+
' it("my test name", function()',
|
|
96
|
+
' -- test body',
|
|
97
|
+
' end)',
|
|
98
|
+
'end)',
|
|
99
|
+
].join('\n'));
|
|
100
|
+
const input = [
|
|
101
|
+
' ● Suite > my test name',
|
|
102
|
+
'',
|
|
103
|
+
' assertion failed',
|
|
104
|
+
'',
|
|
105
|
+
' at ServerScriptService.mypkg.Shared.Foo.spec',
|
|
106
|
+
].join('\n');
|
|
107
|
+
const result = parseJestLuaOutput(input, { packageName: 'mypkg' });
|
|
108
|
+
expect(result).toHaveLength(1);
|
|
109
|
+
expect(result[0].file).toBe('src/mypkg/src/Shared/Foo.spec.lua');
|
|
110
|
+
expect(result[0].line).toBe(4);
|
|
111
|
+
});
|
|
112
|
+
it('parses a runtime error with Stack Begin/Stack End', () => {
|
|
113
|
+
const input = [
|
|
114
|
+
'Error: attempt to index nil with "Connect"',
|
|
115
|
+
'Stack Begin',
|
|
116
|
+
"Script 'ServerScriptService.maid.Shared.Maid.spec', Line 23",
|
|
117
|
+
'Stack End',
|
|
118
|
+
].join('\n');
|
|
119
|
+
const result = parseJestLuaOutput(input, { packageName: 'maid' });
|
|
120
|
+
expect(result).toHaveLength(1);
|
|
121
|
+
expect(result[0]).toEqual({
|
|
122
|
+
file: 'src/maid/src/Shared/Maid.spec.lua',
|
|
123
|
+
line: 23,
|
|
124
|
+
severity: 'error',
|
|
125
|
+
title: 'Runtime error',
|
|
126
|
+
message: 'Error: attempt to index nil with "Connect"',
|
|
127
|
+
source: 'jest-lua',
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
it('parses mixed Jest failures and runtime errors', () => {
|
|
131
|
+
const input = [
|
|
132
|
+
' ● Suite > assertion test',
|
|
133
|
+
'',
|
|
134
|
+
' Expected: 1',
|
|
135
|
+
' Received: 2',
|
|
136
|
+
'',
|
|
137
|
+
' at ServerScriptService.pkg.Shared.Foo.spec:10',
|
|
138
|
+
'',
|
|
139
|
+
'Error: attempt to call nil value',
|
|
140
|
+
'Stack Begin',
|
|
141
|
+
"Script 'ServerScriptService.pkg.Shared.Bar.spec', Line 5",
|
|
142
|
+
'Stack End',
|
|
143
|
+
].join('\n');
|
|
144
|
+
const result = parseJestLuaOutput(input, { packageName: 'pkg' });
|
|
145
|
+
expect(result).toHaveLength(2);
|
|
146
|
+
expect(result[0].title).toBe('Suite > assertion test');
|
|
147
|
+
expect(result[0].source).toBe('jest-lua');
|
|
148
|
+
expect(result[1].title).toBe('Runtime error');
|
|
149
|
+
expect(result[1].line).toBe(5);
|
|
150
|
+
});
|
|
151
|
+
it('returns empty array for all-passing output', () => {
|
|
152
|
+
const input = [
|
|
153
|
+
'PASS ServerScriptService.maid',
|
|
154
|
+
' Maid',
|
|
155
|
+
' ✓ should create (5 ms)',
|
|
156
|
+
' ✓ should destroy (2 ms)',
|
|
157
|
+
'',
|
|
158
|
+
'Test Suites: 1 passed, 1 total',
|
|
159
|
+
'Tests: 2 passed, 2 total',
|
|
160
|
+
].join('\n');
|
|
161
|
+
const result = parseJestLuaOutput(input, { packageName: 'maid' });
|
|
162
|
+
expect(result).toEqual([]);
|
|
163
|
+
});
|
|
164
|
+
it('strips ANSI escape codes cleanly', () => {
|
|
165
|
+
const input = [
|
|
166
|
+
' \x1b[31m●\x1b[39m \x1b[1mSuite > test\x1b[22m',
|
|
167
|
+
'',
|
|
168
|
+
' \x1b[31mExpected: 1\x1b[39m',
|
|
169
|
+
' \x1b[32mReceived: 2\x1b[39m',
|
|
170
|
+
'',
|
|
171
|
+
' at ServerScriptService.pkg.Shared.Foo.spec:10',
|
|
172
|
+
].join('\n');
|
|
173
|
+
const result = parseJestLuaOutput(input, { packageName: 'pkg' });
|
|
174
|
+
expect(result).toHaveLength(1);
|
|
175
|
+
expect(result[0].title).toBe('Suite > test');
|
|
176
|
+
expect(result[0].line).toBe(10);
|
|
177
|
+
// Ensure no ANSI codes leaked into the message
|
|
178
|
+
expect(result[0].message).not.toMatch(/\x1b/);
|
|
179
|
+
});
|
|
180
|
+
it('handles truncated/incomplete output without crashing', () => {
|
|
181
|
+
const input = [
|
|
182
|
+
' ● Suite > incomplete test',
|
|
183
|
+
'',
|
|
184
|
+
' partial error message',
|
|
185
|
+
// No at-line, no Stack Begin, just ends
|
|
186
|
+
].join('\n');
|
|
187
|
+
const result = parseJestLuaOutput(input, { packageName: 'pkg' });
|
|
188
|
+
// Should still emit a diagnostic with fallback location
|
|
189
|
+
expect(result).toHaveLength(1);
|
|
190
|
+
expect(result[0].title).toBe('Suite > incomplete test');
|
|
191
|
+
expect(result[0].line).toBe(1);
|
|
192
|
+
});
|
|
193
|
+
it('handles empty input', () => {
|
|
194
|
+
const result = parseJestLuaOutput('', { packageName: 'pkg' });
|
|
195
|
+
expect(result).toEqual([]);
|
|
196
|
+
});
|
|
197
|
+
it('uses last stack frame for location in multi-frame stack', () => {
|
|
198
|
+
const input = [
|
|
199
|
+
'Error: bad argument',
|
|
200
|
+
'Stack Begin',
|
|
201
|
+
"Script 'ServerScriptService.pkg.Shared.Inner', Line 10",
|
|
202
|
+
"Script 'ServerScriptService.pkg.Shared.Outer.spec', Line 30",
|
|
203
|
+
'Stack End',
|
|
204
|
+
].join('\n');
|
|
205
|
+
const result = parseJestLuaOutput(input, { packageName: 'pkg' });
|
|
206
|
+
expect(result).toHaveLength(1);
|
|
207
|
+
expect(result[0].file).toBe('src/pkg/src/Shared/Outer.spec.lua');
|
|
208
|
+
expect(result[0].line).toBe(30);
|
|
209
|
+
});
|
|
210
|
+
describe('with sourcemap resolver', () => {
|
|
211
|
+
const repoRoot = '/repo';
|
|
212
|
+
const sourcemap = {
|
|
213
|
+
name: 'Nevermore',
|
|
214
|
+
className: 'DataModel',
|
|
215
|
+
children: [
|
|
216
|
+
{
|
|
217
|
+
name: 'mypkg',
|
|
218
|
+
className: 'Folder',
|
|
219
|
+
filePaths: [`${repoRoot}/src/mypkg/default.project.json`],
|
|
220
|
+
children: [
|
|
221
|
+
{
|
|
222
|
+
name: 'Shared',
|
|
223
|
+
className: 'Folder',
|
|
224
|
+
children: [
|
|
225
|
+
{
|
|
226
|
+
name: 'Foo',
|
|
227
|
+
className: 'ModuleScript',
|
|
228
|
+
filePaths: [`${repoRoot}/src/mypkg/src/Shared/Foo.lua`],
|
|
229
|
+
children: [
|
|
230
|
+
{
|
|
231
|
+
name: 'Foo.spec',
|
|
232
|
+
className: 'ModuleScript',
|
|
233
|
+
filePaths: [
|
|
234
|
+
`${repoRoot}/src/mypkg/src/Shared/Foo.spec.lua`,
|
|
235
|
+
],
|
|
236
|
+
},
|
|
237
|
+
],
|
|
238
|
+
},
|
|
239
|
+
],
|
|
240
|
+
},
|
|
241
|
+
],
|
|
242
|
+
},
|
|
243
|
+
],
|
|
244
|
+
};
|
|
245
|
+
const resolver = SourcemapResolver.fromSourcemap(sourcemap, repoRoot);
|
|
246
|
+
it('uses sourcemap resolver for assertion failure paths', () => {
|
|
247
|
+
const input = [
|
|
248
|
+
' ● Suite > test one',
|
|
249
|
+
'',
|
|
250
|
+
' Expected: 1',
|
|
251
|
+
' Received: 2',
|
|
252
|
+
'',
|
|
253
|
+
' at ServerScriptService.mypkg.Shared.Foo.Foo.spec:10',
|
|
254
|
+
].join('\n');
|
|
255
|
+
const result = parseJestLuaOutput(input, {
|
|
256
|
+
packageName: 'mypkg',
|
|
257
|
+
sourcemapResolver: resolver,
|
|
258
|
+
});
|
|
259
|
+
expect(result).toHaveLength(1);
|
|
260
|
+
expect(result[0].file).toBe('src/mypkg/src/Shared/Foo.spec.lua');
|
|
261
|
+
expect(result[0].line).toBe(10);
|
|
262
|
+
});
|
|
263
|
+
it('uses sourcemap resolver for runtime error paths', () => {
|
|
264
|
+
const input = [
|
|
265
|
+
'Error: attempt to index nil',
|
|
266
|
+
'Stack Begin',
|
|
267
|
+
"Script 'ServerScriptService.mypkg.Shared.Foo.Foo.spec', Line 5",
|
|
268
|
+
'Stack End',
|
|
269
|
+
].join('\n');
|
|
270
|
+
const result = parseJestLuaOutput(input, {
|
|
271
|
+
packageName: 'mypkg',
|
|
272
|
+
sourcemapResolver: resolver,
|
|
273
|
+
});
|
|
274
|
+
expect(result).toHaveLength(1);
|
|
275
|
+
expect(result[0].file).toBe('src/mypkg/src/Shared/Foo.spec.lua');
|
|
276
|
+
expect(result[0].line).toBe(5);
|
|
277
|
+
});
|
|
278
|
+
it('falls back to heuristic when sourcemap has no mapping', () => {
|
|
279
|
+
const input = [
|
|
280
|
+
' ● Suite > test one',
|
|
281
|
+
'',
|
|
282
|
+
' Expected: 1',
|
|
283
|
+
' Received: 2',
|
|
284
|
+
'',
|
|
285
|
+
' at ServerScriptService.unknown.Shared.Bar.spec:10',
|
|
286
|
+
].join('\n');
|
|
287
|
+
const result = parseJestLuaOutput(input, {
|
|
288
|
+
packageName: 'unknown',
|
|
289
|
+
sourcemapResolver: resolver,
|
|
290
|
+
});
|
|
291
|
+
expect(result).toHaveLength(1);
|
|
292
|
+
// Falls back to heuristic
|
|
293
|
+
expect(result[0].file).toBe('src/unknown/src/Shared/Bar.spec.lua');
|
|
294
|
+
});
|
|
295
|
+
});
|
|
296
|
+
});
|
|
297
|
+
//# sourceMappingURL=jest-lua-parser.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jest-lua-parser.test.js","sourceRoot":"","sources":["../../../../src/utils/testing/parsers/jest-lua-parser.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts Roblox instance paths from Jest-lua output back to
|
|
3
|
+
* repo-relative local filesystem paths.
|
|
4
|
+
*
|
|
5
|
+
* Two strategies:
|
|
6
|
+
*
|
|
7
|
+
* 1. **Sourcemap** (preferred) — Uses the authoritative `sourcemap.json`
|
|
8
|
+
* mapping from `rojo sourcemap --absolute`. Exact and handles all
|
|
9
|
+
* project layouts.
|
|
10
|
+
*
|
|
11
|
+
* 2. **Heuristic** (fallback) — Assumes `src/{slug}/src/` layout and
|
|
12
|
+
* hard-codes `.spec`/`.story` as known dotted suffixes. Works when no
|
|
13
|
+
* sourcemap is available.
|
|
14
|
+
*/
|
|
15
|
+
import type { SourcemapResolver } from '../../sourcemap/index.js';
|
|
16
|
+
/**
|
|
17
|
+
* Resolve a Roblox instance path (from Jest-lua or a stack trace) to a
|
|
18
|
+
* repo-relative filesystem path.
|
|
19
|
+
*
|
|
20
|
+
* When a `sourcemapResolver` is provided, it is tried first. Falls back to
|
|
21
|
+
* the heuristic if the resolver doesn't have a mapping.
|
|
22
|
+
*/
|
|
23
|
+
export declare function resolveRobloxTestPath(instancePath: string, sourcemapResolver?: SourcemapResolver): string;
|
|
24
|
+
//# sourceMappingURL=roblox-path-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roblox-path-resolver.d.ts","sourceRoot":"","sources":["../../../../src/utils/testing/parsers/roblox-path-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAIlE;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,MAAM,EACpB,iBAAiB,CAAC,EAAE,iBAAiB,GACpC,MAAM,CAOR"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts Roblox instance paths from Jest-lua output back to
|
|
3
|
+
* repo-relative local filesystem paths.
|
|
4
|
+
*
|
|
5
|
+
* Two strategies:
|
|
6
|
+
*
|
|
7
|
+
* 1. **Sourcemap** (preferred) — Uses the authoritative `sourcemap.json`
|
|
8
|
+
* mapping from `rojo sourcemap --absolute`. Exact and handles all
|
|
9
|
+
* project layouts.
|
|
10
|
+
*
|
|
11
|
+
* 2. **Heuristic** (fallback) — Assumes `src/{slug}/src/` layout and
|
|
12
|
+
* hard-codes `.spec`/`.story` as known dotted suffixes. Works when no
|
|
13
|
+
* sourcemap is available.
|
|
14
|
+
*/
|
|
15
|
+
const SSS_PREFIX = 'ServerScriptService.';
|
|
16
|
+
/**
|
|
17
|
+
* Resolve a Roblox instance path (from Jest-lua or a stack trace) to a
|
|
18
|
+
* repo-relative filesystem path.
|
|
19
|
+
*
|
|
20
|
+
* When a `sourcemapResolver` is provided, it is tried first. Falls back to
|
|
21
|
+
* the heuristic if the resolver doesn't have a mapping.
|
|
22
|
+
*/
|
|
23
|
+
export function resolveRobloxTestPath(instancePath, sourcemapResolver) {
|
|
24
|
+
if (sourcemapResolver) {
|
|
25
|
+
const resolved = sourcemapResolver.resolve(instancePath);
|
|
26
|
+
if (resolved)
|
|
27
|
+
return resolved;
|
|
28
|
+
}
|
|
29
|
+
return _resolveHeuristic(instancePath);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Heuristic fallback: assumes `src/{slug}/src/` layout.
|
|
33
|
+
*
|
|
34
|
+
* Handles optional `:LINE` suffixes and missing `ServerScriptService.` prefix.
|
|
35
|
+
*/
|
|
36
|
+
function _resolveHeuristic(instancePath) {
|
|
37
|
+
// Strip :LINE suffix if present
|
|
38
|
+
let path = instancePath.replace(/:\d+$/, '');
|
|
39
|
+
// Strip ServerScriptService. prefix
|
|
40
|
+
if (path.startsWith(SSS_PREFIX)) {
|
|
41
|
+
path = path.slice(SSS_PREFIX.length);
|
|
42
|
+
}
|
|
43
|
+
// First dot-separated segment is the package slug
|
|
44
|
+
const dotIndex = path.indexOf('.');
|
|
45
|
+
if (dotIndex === -1) {
|
|
46
|
+
// Just a package name with no sub-path — return the src dir
|
|
47
|
+
return `src/${path}/src`;
|
|
48
|
+
}
|
|
49
|
+
const packageSlug = path.slice(0, dotIndex);
|
|
50
|
+
const remaining = path.slice(dotIndex + 1);
|
|
51
|
+
// Split into segments. In Rojo, dots in filenames (e.g. "Maid.spec.lua"
|
|
52
|
+
// becomes instance "Maid.spec") are ambiguous with the hierarchy separator.
|
|
53
|
+
// Rejoin known filename suffixes like ".spec" and ".story" with a dot
|
|
54
|
+
// instead of a slash.
|
|
55
|
+
const segments = remaining.split('.');
|
|
56
|
+
const rejoined = [];
|
|
57
|
+
for (let i = 0; i < segments.length; i++) {
|
|
58
|
+
const seg = segments[i];
|
|
59
|
+
// If this segment is a known file suffix, merge it with the previous
|
|
60
|
+
if (i > 0 &&
|
|
61
|
+
(seg === 'spec' || seg === 'story')) {
|
|
62
|
+
rejoined[rejoined.length - 1] += `.${seg}`;
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
rejoined.push(seg);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const subPath = rejoined.join('/');
|
|
69
|
+
return `src/${packageSlug}/src/${subPath}.lua`;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=roblox-path-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roblox-path-resolver.js","sourceRoot":"","sources":["../../../../src/utils/testing/parsers/roblox-path-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,MAAM,UAAU,GAAG,sBAAsB,CAAC;AAE1C;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CACnC,YAAoB,EACpB,iBAAqC;IAErC,IAAI,iBAAiB,EAAE,CAAC;QACtB,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACzD,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;IAChC,CAAC;IAED,OAAO,iBAAiB,CAAC,YAAY,CAAC,CAAC;AACzC,CAAC;AAED;;;;GAIG;AACH,SAAS,iBAAiB,CAAC,YAAoB;IAC7C,gCAAgC;IAChC,IAAI,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAE7C,oCAAoC;IACpC,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAChC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,kDAAkD;IAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;QACpB,4DAA4D;QAC5D,OAAO,OAAO,IAAI,MAAM,CAAC;IAC3B,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;IAE3C,wEAAwE;IACxE,4EAA4E;IAC5E,sEAAsE;IACtE,sBAAsB;IACtB,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACxB,qEAAqE;QACrE,IACE,CAAC,GAAG,CAAC;YACL,CAAC,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,OAAO,CAAC,EACnC,CAAC;YACD,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;QAC7C,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnC,OAAO,OAAO,WAAW,QAAQ,OAAO,MAAM,CAAC;AACjD,CAAC"}
|