@quenty/nevermore-cli 4.49.0 → 4.50.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -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 +7 -3
- package/dist/commands/tools-command/ci-post-test-results.js.map +1 -1
- package/dist/utils/batch/changed-packages-utils.d.ts +8 -0
- package/dist/utils/batch/changed-packages-utils.d.ts.map +1 -1
- package/dist/utils/batch/changed-packages-utils.js +9 -11
- package/dist/utils/batch/changed-packages-utils.js.map +1 -1
- package/dist/utils/testing/batch-run.e2e.test.js +2 -2
- package/dist/utils/testing/batch-run.e2e.test.js.map +1 -1
- package/dist/utils/testing/parsers/annotation-workspace.d.ts +17 -0
- package/dist/utils/testing/parsers/annotation-workspace.d.ts.map +1 -0
- package/dist/utils/testing/parsers/annotation-workspace.js +47 -0
- package/dist/utils/testing/parsers/annotation-workspace.js.map +1 -0
- package/dist/utils/testing/parsers/index.d.ts +0 -1
- package/dist/utils/testing/parsers/index.d.ts.map +1 -1
- package/dist/utils/testing/parsers/index.js +0 -1
- package/dist/utils/testing/parsers/index.js.map +1 -1
- package/dist/utils/testing/parsers/jest-lua-parser.d.ts +14 -29
- package/dist/utils/testing/parsers/jest-lua-parser.d.ts.map +1 -1
- package/dist/utils/testing/parsers/jest-lua-parser.js +85 -100
- package/dist/utils/testing/parsers/jest-lua-parser.js.map +1 -1
- package/dist/utils/testing/parsers/jest-lua-parser.test.js +359 -56
- package/dist/utils/testing/parsers/jest-lua-parser.test.js.map +1 -1
- package/dist/utils/testing/parsers/roblox-path-resolver.d.ts +23 -17
- package/dist/utils/testing/parsers/roblox-path-resolver.d.ts.map +1 -1
- package/dist/utils/testing/parsers/roblox-path-resolver.js +89 -54
- package/dist/utils/testing/parsers/roblox-path-resolver.js.map +1 -1
- package/dist/utils/testing/parsers/roblox-path-resolver.test.js +76 -36
- package/dist/utils/testing/parsers/roblox-path-resolver.test.js.map +1 -1
- package/dist/utils/testing/runner/combined-project-generator.d.ts.map +1 -1
- package/dist/utils/testing/runner/combined-project-generator.js +5 -6
- package/dist/utils/testing/runner/combined-project-generator.js.map +1 -1
- package/dist/utils/testing/runner/test-project-slug.d.ts +11 -0
- package/dist/utils/testing/runner/test-project-slug.d.ts.map +1 -0
- package/dist/utils/testing/runner/test-project-slug.js +11 -0
- package/dist/utils/testing/runner/test-project-slug.js.map +1 -0
- package/package.json +6 -6
- package/src/commands/tools-command/ci-post-test-results.ts +7 -2
- package/src/utils/batch/changed-packages-utils.ts +21 -12
- package/src/utils/testing/batch-run.e2e.test.ts +6 -2
- package/src/utils/testing/parsers/annotation-workspace.ts +74 -0
- package/src/utils/testing/parsers/index.ts +0 -1
- package/src/utils/testing/parsers/jest-lua-parser.test.ts +433 -65
- package/src/utils/testing/parsers/jest-lua-parser.ts +131 -109
- package/src/utils/testing/parsers/roblox-path-resolver.test.ts +144 -61
- package/src/utils/testing/parsers/roblox-path-resolver.ts +117 -56
- package/src/utils/testing/runner/combined-project-generator.ts +9 -13
- package/src/utils/testing/runner/test-project-slug.ts +18 -0
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -1,47 +1,27 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Parser for Jest-lua verbose output (`verbose=true, ci=true`).
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
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.
|
|
4
|
+
* Emits one diagnostic per `●` failure block and per `Stack Begin`/`Stack End`
|
|
5
|
+
* runtime error, at the innermost frame that resolves to a repo file,
|
|
6
|
+
* preferring the package under test. Diagnostics with no resolvable frame
|
|
7
|
+
* carry no file. Unexpected input is skipped, never thrown on.
|
|
28
8
|
*/
|
|
29
9
|
import * as fs from 'fs';
|
|
10
|
+
import * as path from 'path';
|
|
30
11
|
import { OutputHelper } from '@quenty/cli-output-helpers';
|
|
31
|
-
import {
|
|
32
|
-
/**
|
|
33
|
-
const
|
|
34
|
-
/**
|
|
35
|
-
const
|
|
36
|
-
/**
|
|
37
|
-
const
|
|
38
|
-
/**
|
|
12
|
+
import { tryResolveRobloxSourceFile } from './roblox-path-resolver.js';
|
|
13
|
+
/** `at ServerScriptService.pkg.Path.spec:45`, line optional */
|
|
14
|
+
const AT_FRAME_PATTERN = /^\s+at\s+(\S+?)(?::(\d+))?\s*$/;
|
|
15
|
+
/** `ServerScriptService.pkg.Path:1263 function requireModule`, any service root */
|
|
16
|
+
const BARE_FRAME_PATTERN = /^\s+(\[string "[^"]+"\]|[A-Za-z_][\w-]*(?:\.[^\s:"]+)+):(\d+)(?:\s+function\s+\S+)?\s*$/;
|
|
17
|
+
/** `Script '[string "ServerScriptService.pkg.Path"]', Line 23` */
|
|
18
|
+
const SCRIPT_FRAME_PATTERN = /Script '(.+?)', Line (\d+)/;
|
|
19
|
+
/** `<chunk>:214:` location prefixes inside error messages */
|
|
20
|
+
const MESSAGE_LOCATION_PATTERN = /(\[string "[^"]+"\]|ServerScriptService\.[^\s:"]+):(\d+):/g;
|
|
21
|
+
/** `● TestSuite › nested › test name` */
|
|
39
22
|
const FAILURE_HEADER_PATTERN = /^\s*●\s+(.+)$/;
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
* Returns the 1-indexed line number, or `undefined` if not found.
|
|
43
|
-
*/
|
|
44
|
-
function _findTestLineInFile(filePath, testName) {
|
|
23
|
+
const TITLE_SEPARATOR_PATTERN = / [›>] /;
|
|
24
|
+
function _findTestLineInFile(filePath, title) {
|
|
45
25
|
let content;
|
|
46
26
|
try {
|
|
47
27
|
content = fs.readFileSync(filePath, 'utf-8');
|
|
@@ -50,54 +30,67 @@ function _findTestLineInFile(filePath, testName) {
|
|
|
50
30
|
return undefined;
|
|
51
31
|
}
|
|
52
32
|
const lines = content.split('\n');
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
33
|
+
const names = title.split(TITLE_SEPARATOR_PATTERN).map((name) => name.trim());
|
|
34
|
+
for (const name of names.reverse()) {
|
|
35
|
+
const index = lines.findIndex((line) => line.includes(`("${name}"`) || line.includes(`('${name}'`));
|
|
36
|
+
if (index !== -1)
|
|
37
|
+
return index + 1;
|
|
58
38
|
}
|
|
59
39
|
return undefined;
|
|
60
40
|
}
|
|
41
|
+
function _parseFrameLine(rawLine) {
|
|
42
|
+
const match = rawLine.match(BARE_FRAME_PATTERN) ?? rawLine.match(AT_FRAME_PATTERN);
|
|
43
|
+
if (!match)
|
|
44
|
+
return undefined;
|
|
45
|
+
return {
|
|
46
|
+
instancePath: match[1],
|
|
47
|
+
line: match[2] ? parseInt(match[2], 10) : undefined,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function _parseMessageLocations(message) {
|
|
51
|
+
return [...message.matchAll(MESSAGE_LOCATION_PATTERN)].map((match) => ({
|
|
52
|
+
instancePath: match[1],
|
|
53
|
+
line: parseInt(match[2], 10),
|
|
54
|
+
}));
|
|
55
|
+
}
|
|
56
|
+
function _resolveLocation(frames, options) {
|
|
57
|
+
let fallback;
|
|
58
|
+
for (const frame of frames) {
|
|
59
|
+
const resolved = tryResolveRobloxSourceFile(frame.instancePath, options);
|
|
60
|
+
if (!resolved)
|
|
61
|
+
continue;
|
|
62
|
+
const location = { ...resolved, line: frame.line };
|
|
63
|
+
if (resolved.isPackageUnderTest) {
|
|
64
|
+
return location;
|
|
65
|
+
}
|
|
66
|
+
fallback ??= location;
|
|
67
|
+
}
|
|
68
|
+
return fallback;
|
|
69
|
+
}
|
|
61
70
|
/**
|
|
62
71
|
* Parse Jest-lua verbose output into `Diagnostic[]`.
|
|
63
72
|
*
|
|
64
73
|
* @param raw - Raw test output (may include ANSI codes)
|
|
65
|
-
* @param options.packageName - Package name for fallback path resolution
|
|
66
74
|
*/
|
|
67
75
|
export function parseJestLuaOutput(raw, options) {
|
|
68
76
|
const diagnostics = [];
|
|
69
77
|
const clean = OutputHelper.stripAnsi(raw);
|
|
70
78
|
const lines = clean.split('\n');
|
|
79
|
+
const repoRoot = options.repoRoot ?? process.cwd();
|
|
71
80
|
let state = 0 /* State.IDLE */;
|
|
72
81
|
let failureCtx;
|
|
73
82
|
let stackCtx;
|
|
74
83
|
let lastNonEmptyLine = '';
|
|
75
84
|
function _emitFailure(ctx) {
|
|
76
85
|
const message = ctx.messageLines.join('\n').trim();
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
let file;
|
|
82
|
-
let line;
|
|
83
|
-
if (ctx.file) {
|
|
84
|
-
file = resolveRobloxTestPath(ctx.file, options.sourcemapResolver);
|
|
85
|
-
if (ctx.line) {
|
|
86
|
-
line = ctx.line;
|
|
87
|
-
}
|
|
88
|
-
else {
|
|
89
|
-
const segments = ctx.title.split(' > ');
|
|
90
|
-
const testName = segments[segments.length - 1].trim();
|
|
91
|
-
line = _findTestLineInFile(file, testName) ?? 1;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
else {
|
|
95
|
-
file = `src/${options.packageName}/src`;
|
|
96
|
-
line = 1;
|
|
86
|
+
const location = _resolveLocation([...ctx.frames, ..._parseMessageLocations(message)], options);
|
|
87
|
+
let line = location?.line;
|
|
88
|
+
if (location?.isPackageUnderTest && line === undefined) {
|
|
89
|
+
line = _findTestLineInFile(path.join(repoRoot, location.file), ctx.title);
|
|
97
90
|
}
|
|
98
91
|
diagnostics.push({
|
|
99
|
-
file,
|
|
100
|
-
line,
|
|
92
|
+
...(location ? { file: location.file } : {}),
|
|
93
|
+
...(line !== undefined ? { line } : {}),
|
|
101
94
|
severity: 'error',
|
|
102
95
|
title: ctx.title,
|
|
103
96
|
message: message || 'Test failed',
|
|
@@ -105,20 +98,17 @@ export function parseJestLuaOutput(raw, options) {
|
|
|
105
98
|
});
|
|
106
99
|
}
|
|
107
100
|
function _emitStack(ctx) {
|
|
108
|
-
const
|
|
109
|
-
? resolveRobloxTestPath(ctx.file, options.sourcemapResolver)
|
|
110
|
-
: `src/${options.packageName}/src`;
|
|
111
|
-
const line = ctx.line ?? 1;
|
|
101
|
+
const location = _resolveLocation([...ctx.frames, ..._parseMessageLocations(ctx.errorMessage)], options);
|
|
112
102
|
diagnostics.push({
|
|
113
|
-
file,
|
|
114
|
-
line,
|
|
103
|
+
...(location ? { file: location.file, line: location.line ?? 1 } : {}),
|
|
115
104
|
severity: 'error',
|
|
116
105
|
title: 'Runtime error',
|
|
117
106
|
message: ctx.errorMessage || 'Unknown runtime error',
|
|
118
107
|
source: 'jest-lua',
|
|
119
108
|
});
|
|
120
109
|
}
|
|
121
|
-
for (
|
|
110
|
+
for (let i = 0; i < lines.length; i++) {
|
|
111
|
+
const rawLine = lines[i];
|
|
122
112
|
switch (state) {
|
|
123
113
|
case 0 /* State.IDLE */: {
|
|
124
114
|
const failureMatch = rawLine.match(FAILURE_HEADER_PATTERN);
|
|
@@ -126,6 +116,7 @@ export function parseJestLuaOutput(raw, options) {
|
|
|
126
116
|
failureCtx = {
|
|
127
117
|
title: failureMatch[1].trim(),
|
|
128
118
|
messageLines: [],
|
|
119
|
+
frames: [],
|
|
129
120
|
};
|
|
130
121
|
state = 1 /* State.FAILURE_BLOCK */;
|
|
131
122
|
break;
|
|
@@ -133,6 +124,7 @@ export function parseJestLuaOutput(raw, options) {
|
|
|
133
124
|
if (rawLine.trim() === 'Stack Begin') {
|
|
134
125
|
stackCtx = {
|
|
135
126
|
errorMessage: lastNonEmptyLine,
|
|
127
|
+
frames: [],
|
|
136
128
|
};
|
|
137
129
|
state = 2 /* State.STACK_BLOCK */;
|
|
138
130
|
break;
|
|
@@ -147,30 +139,9 @@ export function parseJestLuaOutput(raw, options) {
|
|
|
147
139
|
state = 0 /* State.IDLE */;
|
|
148
140
|
break;
|
|
149
141
|
}
|
|
150
|
-
const
|
|
151
|
-
if (
|
|
152
|
-
failureCtx.
|
|
153
|
-
failureCtx.line = parseInt(atMatch[2], 10);
|
|
154
|
-
_emitFailure(failureCtx);
|
|
155
|
-
failureCtx = undefined;
|
|
156
|
-
state = 0 /* State.IDLE */;
|
|
157
|
-
break;
|
|
158
|
-
}
|
|
159
|
-
const atNoLineMatch = rawLine.match(AT_LOCATION_NO_LINE_PATTERN);
|
|
160
|
-
if (atNoLineMatch) {
|
|
161
|
-
failureCtx.file = atNoLineMatch[1];
|
|
162
|
-
_emitFailure(failureCtx);
|
|
163
|
-
failureCtx = undefined;
|
|
164
|
-
state = 0 /* State.IDLE */;
|
|
165
|
-
break;
|
|
166
|
-
}
|
|
167
|
-
const nextFailure = rawLine.match(FAILURE_HEADER_PATTERN);
|
|
168
|
-
if (nextFailure) {
|
|
169
|
-
_emitFailure(failureCtx);
|
|
170
|
-
failureCtx = {
|
|
171
|
-
title: nextFailure[1].trim(),
|
|
172
|
-
messageLines: [],
|
|
173
|
-
};
|
|
142
|
+
const frame = _parseFrameLine(rawLine);
|
|
143
|
+
if (frame) {
|
|
144
|
+
failureCtx.frames.push(frame);
|
|
174
145
|
break;
|
|
175
146
|
}
|
|
176
147
|
if (rawLine.trim() === 'Stack Begin') {
|
|
@@ -179,12 +150,24 @@ export function parseJestLuaOutput(raw, options) {
|
|
|
179
150
|
errorMessage: failureCtx.messageLines.length > 0
|
|
180
151
|
? failureCtx.messageLines[failureCtx.messageLines.length - 1].trim()
|
|
181
152
|
: failureCtx.title,
|
|
153
|
+
frames: [],
|
|
182
154
|
};
|
|
183
155
|
failureCtx = undefined;
|
|
184
156
|
state = 2 /* State.STACK_BLOCK */;
|
|
185
157
|
break;
|
|
186
158
|
}
|
|
187
|
-
|
|
159
|
+
const endsBlock = FAILURE_HEADER_PATTERN.test(rawLine) ||
|
|
160
|
+
(failureCtx.frames.length > 0 && rawLine.trim() !== '');
|
|
161
|
+
if (endsBlock) {
|
|
162
|
+
_emitFailure(failureCtx);
|
|
163
|
+
failureCtx = undefined;
|
|
164
|
+
state = 0 /* State.IDLE */;
|
|
165
|
+
i--;
|
|
166
|
+
break;
|
|
167
|
+
}
|
|
168
|
+
if (failureCtx.frames.length === 0) {
|
|
169
|
+
failureCtx.messageLines.push(rawLine);
|
|
170
|
+
}
|
|
188
171
|
break;
|
|
189
172
|
}
|
|
190
173
|
case 2 /* State.STACK_BLOCK */: {
|
|
@@ -192,10 +175,12 @@ export function parseJestLuaOutput(raw, options) {
|
|
|
192
175
|
state = 0 /* State.IDLE */;
|
|
193
176
|
break;
|
|
194
177
|
}
|
|
195
|
-
const scriptMatch = rawLine.match(
|
|
178
|
+
const scriptMatch = rawLine.match(SCRIPT_FRAME_PATTERN);
|
|
196
179
|
if (scriptMatch) {
|
|
197
|
-
stackCtx.
|
|
198
|
-
|
|
180
|
+
stackCtx.frames.push({
|
|
181
|
+
instancePath: scriptMatch[1],
|
|
182
|
+
line: parseInt(scriptMatch[2], 10),
|
|
183
|
+
});
|
|
199
184
|
break;
|
|
200
185
|
}
|
|
201
186
|
if (rawLine.trim() === 'Stack End') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jest-lua-parser.js","sourceRoot":"","sources":["../../../../src/utils/testing/parsers/jest-lua-parser.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"jest-lua-parser.js","sourceRoot":"","sources":["../../../../src/utils/testing/parsers/jest-lua-parser.ts"],"names":[],"mappings":"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"}
|