@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,24 +1,30 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* Maps Roblox instance paths from Jest-lua output to existing repo-relative
|
|
3
|
+
* source files, through `sourcemap.json` or else the `<package dir>/src/`
|
|
4
|
+
* layout.
|
|
4
5
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
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.
|
|
6
|
+
* A package's npm name (`@quenty/playermock`), directory (`src/player-mock`),
|
|
7
|
+
* Rojo project name (`playermock`) and test-place slug (`gameproduct` for
|
|
8
|
+
* `src/gameproductservice`) can all differ; see `AnnotationWorkspace`.
|
|
14
9
|
*/
|
|
15
10
|
import type { SourcemapResolver } from '../../sourcemap/index.js';
|
|
11
|
+
import type { AnnotationWorkspace } from './annotation-workspace.js';
|
|
12
|
+
export interface RobloxSourceResolveOptions {
|
|
13
|
+
sourcemapResolver?: SourcemapResolver;
|
|
14
|
+
workspace?: AnnotationWorkspace;
|
|
15
|
+
/** npm name of the package under test, e.g. `@quenty/gameproductservice` */
|
|
16
|
+
packageName?: string;
|
|
17
|
+
/** Repo root that holds the workspace. Defaults to cwd. */
|
|
18
|
+
repoRoot?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface ResolvedSourceFile {
|
|
21
|
+
file: string;
|
|
22
|
+
/** False for dependency copies and sibling packages. */
|
|
23
|
+
isPackageUnderTest: boolean;
|
|
24
|
+
}
|
|
16
25
|
/**
|
|
17
|
-
* Resolve
|
|
18
|
-
*
|
|
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.
|
|
26
|
+
* Resolve an instance path (no `:LINE` suffix) to an existing repo-relative
|
|
27
|
+
* source file, or `undefined` when none matches.
|
|
22
28
|
*/
|
|
23
|
-
export declare function
|
|
29
|
+
export declare function tryResolveRobloxSourceFile(instancePath: string, options?: RobloxSourceResolveOptions): ResolvedSourceFile | undefined;
|
|
24
30
|
//# sourceMappingURL=roblox-path-resolver.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roblox-path-resolver.d.ts","sourceRoot":"","sources":["../../../../src/utils/testing/parsers/roblox-path-resolver.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"roblox-path-resolver.d.ts","sourceRoot":"","sources":["../../../../src/utils/testing/parsers/roblox-path-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EACV,mBAAmB,EAEpB,MAAM,2BAA2B,CAAC;AAenC,MAAM,WAAW,0BAA0B;IACzC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE,0BAA+B,GACvC,kBAAkB,GAAG,SAAS,CA6DhC"}
|
|
@@ -1,70 +1,105 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* Maps Roblox instance paths from Jest-lua output to existing repo-relative
|
|
3
|
+
* source files, through `sourcemap.json` or else the `<package dir>/src/`
|
|
4
|
+
* layout.
|
|
4
5
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
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.
|
|
6
|
+
* A package's npm name (`@quenty/playermock`), directory (`src/player-mock`),
|
|
7
|
+
* Rojo project name (`playermock`) and test-place slug (`gameproduct` for
|
|
8
|
+
* `src/gameproductservice`) can all differ; see `AnnotationWorkspace`.
|
|
14
9
|
*/
|
|
10
|
+
import * as fs from 'fs';
|
|
11
|
+
import * as path from 'path';
|
|
15
12
|
const SERVER_SCRIPT_SERVICE_PREFIX = 'ServerScriptService.';
|
|
13
|
+
const NODE_MODULES_SEGMENT = '.node_modules.';
|
|
14
|
+
const QUENTY_SCOPE = '@quenty/';
|
|
15
|
+
const QUENTY_SCOPE_SEGMENT = '@quenty.';
|
|
16
|
+
const CHUNK_NAME_PATTERN = /^\[string "(.*)"\]$/;
|
|
17
|
+
// Rojo strips `.server`/`.client` from script instance names.
|
|
18
|
+
const SOURCE_EXTENSIONS = ['', '.server', '.client'].flatMap((kind) => [
|
|
19
|
+
`${kind}.lua`,
|
|
20
|
+
`${kind}.luau`,
|
|
21
|
+
`/init${kind}.lua`,
|
|
22
|
+
`/init${kind}.luau`,
|
|
23
|
+
]);
|
|
16
24
|
/**
|
|
17
|
-
* Resolve
|
|
18
|
-
*
|
|
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.
|
|
25
|
+
* Resolve an instance path (no `:LINE` suffix) to an existing repo-relative
|
|
26
|
+
* source file, or `undefined` when none matches.
|
|
22
27
|
*/
|
|
23
|
-
export function
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
+
export function tryResolveRobloxSourceFile(instancePath, options = {}) {
|
|
29
|
+
let unwrapped = _unwrapChunkName(instancePath);
|
|
30
|
+
// Roblox truncates long chunk names: `...@quenty.servic..."]`
|
|
31
|
+
if (unwrapped.endsWith('...'))
|
|
32
|
+
return undefined;
|
|
33
|
+
if (unwrapped.startsWith(SERVER_SCRIPT_SERVICE_PREFIX)) {
|
|
34
|
+
unwrapped = unwrapped.slice(SERVER_SCRIPT_SERVICE_PREFIX.length);
|
|
28
35
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
path = path.slice(SERVER_SCRIPT_SERVICE_PREFIX.length);
|
|
36
|
+
const packagesByName = options.workspace?.packagesByName;
|
|
37
|
+
let workspacePackage;
|
|
38
|
+
let packageInstanceName;
|
|
39
|
+
let rest;
|
|
40
|
+
let isPackageUnderTest = false;
|
|
41
|
+
const nodeModulesIndex = unwrapped.lastIndexOf(NODE_MODULES_SEGMENT);
|
|
42
|
+
if (nodeModulesIndex !== -1) {
|
|
43
|
+
const dependencyPath = unwrapped.slice(nodeModulesIndex + NODE_MODULES_SEGMENT.length);
|
|
44
|
+
if (!dependencyPath.startsWith(QUENTY_SCOPE_SEGMENT))
|
|
45
|
+
return undefined;
|
|
46
|
+
[packageInstanceName, rest] = _splitFirstSegment(dependencyPath.slice(QUENTY_SCOPE_SEGMENT.length));
|
|
47
|
+
workspacePackage = packagesByName?.get(QUENTY_SCOPE + packageInstanceName);
|
|
42
48
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
49
|
+
else {
|
|
50
|
+
[packageInstanceName, rest] = _splitFirstSegment(unwrapped);
|
|
51
|
+
const packageUnderTest = options.packageName
|
|
52
|
+
? packagesByName?.get(options.packageName)
|
|
53
|
+
: undefined;
|
|
54
|
+
if (packageUnderTest?.testSlugs.includes(packageInstanceName)) {
|
|
55
|
+
workspacePackage = packageUnderTest;
|
|
56
|
+
isPackageUnderTest = true;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
const dir = workspacePackage?.dir ?? `src/${packageInstanceName}`;
|
|
60
|
+
// The sourcemap names packages by Rojo project name, not folder.
|
|
61
|
+
const sourcemapNames = new Set([
|
|
62
|
+
workspacePackage?.projectName ?? packageInstanceName,
|
|
63
|
+
path.posix.basename(dir),
|
|
64
|
+
]);
|
|
65
|
+
for (const name of sourcemapNames) {
|
|
66
|
+
const mapped = options.sourcemapResolver?.resolve(SERVER_SCRIPT_SERVICE_PREFIX + name + (rest ? `.${rest}` : ''));
|
|
67
|
+
if (mapped)
|
|
68
|
+
return { file: mapped, isPackageUnderTest };
|
|
69
|
+
}
|
|
70
|
+
const repoRoot = options.repoRoot ?? process.cwd();
|
|
71
|
+
const base = _resolveHeuristic(dir, rest);
|
|
72
|
+
for (const extension of SOURCE_EXTENSIONS) {
|
|
73
|
+
const file = `${base}${extension}`;
|
|
74
|
+
if (fs.existsSync(path.join(repoRoot, file))) {
|
|
75
|
+
return { file, isPackageUnderTest };
|
|
76
|
+
}
|
|
48
77
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
80
|
+
function _unwrapChunkName(name) {
|
|
81
|
+
const match = name.trim().match(CHUNK_NAME_PATTERN);
|
|
82
|
+
return match ? match[1] : name.trim();
|
|
83
|
+
}
|
|
84
|
+
function _splitFirstSegment(dottedPath) {
|
|
85
|
+
const dotIndex = dottedPath.indexOf('.');
|
|
86
|
+
return dotIndex === -1
|
|
87
|
+
? [dottedPath, '']
|
|
88
|
+
: [dottedPath.slice(0, dotIndex), dottedPath.slice(dotIndex + 1)];
|
|
89
|
+
}
|
|
90
|
+
function _resolveHeuristic(dir, rest) {
|
|
91
|
+
if (!rest)
|
|
92
|
+
return `${dir}/src`;
|
|
93
|
+
// Rojo turns `Maid.spec.lua` into instance `Maid.spec`, so rejoin suffixes.
|
|
56
94
|
const rejoined = [];
|
|
57
|
-
for (
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
if (i > 0 && (seg === 'spec' || seg === 'story')) {
|
|
61
|
-
rejoined[rejoined.length - 1] += `.${seg}`;
|
|
95
|
+
for (const segment of rest.split('.')) {
|
|
96
|
+
if (rejoined.length > 0 && (segment === 'spec' || segment === 'story')) {
|
|
97
|
+
rejoined[rejoined.length - 1] += `.${segment}`;
|
|
62
98
|
}
|
|
63
99
|
else {
|
|
64
|
-
rejoined.push(
|
|
100
|
+
rejoined.push(segment);
|
|
65
101
|
}
|
|
66
102
|
}
|
|
67
|
-
|
|
68
|
-
return `src/${packageSlug}/src/${subPath}.lua`;
|
|
103
|
+
return `${dir}/src/${rejoined.join('/')}`;
|
|
69
104
|
}
|
|
70
105
|
//# sourceMappingURL=roblox-path-resolver.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roblox-path-resolver.js","sourceRoot":"","sources":["../../../../src/utils/testing/parsers/roblox-path-resolver.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"roblox-path-resolver.js","sourceRoot":"","sources":["../../../../src/utils/testing/parsers/roblox-path-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAO7B,MAAM,4BAA4B,GAAG,sBAAsB,CAAC;AAC5D,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;AAC9C,MAAM,YAAY,GAAG,UAAU,CAAC;AAChC,MAAM,oBAAoB,GAAG,UAAU,CAAC;AACxC,MAAM,kBAAkB,GAAG,qBAAqB,CAAC;AACjD,8DAA8D;AAC9D,MAAM,iBAAiB,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;IACrE,GAAG,IAAI,MAAM;IACb,GAAG,IAAI,OAAO;IACd,QAAQ,IAAI,MAAM;IAClB,QAAQ,IAAI,OAAO;CACpB,CAAC,CAAC;AAiBH;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CACxC,YAAoB,EACpB,UAAsC,EAAE;IAExC,IAAI,SAAS,GAAG,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAE/C,8DAA8D;IAC9D,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAEhD,IAAI,SAAS,CAAC,UAAU,CAAC,4BAA4B,CAAC,EAAE,CAAC;QACvD,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,4BAA4B,CAAC,MAAM,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,cAAc,GAAG,OAAO,CAAC,SAAS,EAAE,cAAc,CAAC;IAEzD,IAAI,gBAAwD,CAAC;IAC7D,IAAI,mBAA2B,CAAC;IAChC,IAAI,IAAY,CAAC;IACjB,IAAI,kBAAkB,GAAG,KAAK,CAAC;IAE/B,MAAM,gBAAgB,GAAG,SAAS,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC;IACrE,IAAI,gBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC;QAC5B,MAAM,cAAc,GAAG,SAAS,CAAC,KAAK,CACpC,gBAAgB,GAAG,oBAAoB,CAAC,MAAM,CAC/C,CAAC;QACF,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,oBAAoB,CAAC;YAAE,OAAO,SAAS,CAAC;QACvE,CAAC,mBAAmB,EAAE,IAAI,CAAC,GAAG,kBAAkB,CAC9C,cAAc,CAAC,KAAK,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAClD,CAAC;QACF,gBAAgB,GAAG,cAAc,EAAE,GAAG,CAAC,YAAY,GAAG,mBAAmB,CAAC,CAAC;IAC7E,CAAC;SAAM,CAAC;QACN,CAAC,mBAAmB,EAAE,IAAI,CAAC,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAC5D,MAAM,gBAAgB,GAAG,OAAO,CAAC,WAAW;YAC1C,CAAC,CAAC,cAAc,EAAE,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC;YAC1C,CAAC,CAAC,SAAS,CAAC;QACd,IAAI,gBAAgB,EAAE,SAAS,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;YAC9D,gBAAgB,GAAG,gBAAgB,CAAC;YACpC,kBAAkB,GAAG,IAAI,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,MAAM,GAAG,GAAG,gBAAgB,EAAE,GAAG,IAAI,OAAO,mBAAmB,EAAE,CAAC;IAClE,iEAAiE;IACjE,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;QAC7B,gBAAgB,EAAE,WAAW,IAAI,mBAAmB;QACpD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;KACzB,CAAC,CAAC;IACH,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAC/C,4BAA4B,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAC/D,CAAC;QACF,IAAI,MAAM;YAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC1D,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACnD,MAAM,IAAI,GAAG,iBAAiB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC1C,KAAK,MAAM,SAAS,IAAI,iBAAiB,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,GAAG,IAAI,GAAG,SAAS,EAAE,CAAC;QACnC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;YAC7C,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC;QACtC,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACpD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;AACxC,CAAC;AAED,SAAS,kBAAkB,CAAC,UAAkB;IAC5C,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACzC,OAAO,QAAQ,KAAK,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC;QAClB,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAW,EAAE,IAAY;IAClD,IAAI,CAAC,IAAI;QAAE,OAAO,GAAG,GAAG,MAAM,CAAC;IAE/B,4EAA4E;IAC5E,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACtC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,OAAO,CAAC,EAAE,CAAC;YACvE,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,OAAO,EAAE,CAAC;QACjD,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,OAAO,GAAG,GAAG,QAAQ,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAC5C,CAAC"}
|
|
@@ -1,30 +1,77 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import {
|
|
1
|
+
import { beforeAll, describe, it, expect } from 'vitest';
|
|
2
|
+
import { fileURLToPath } from 'url';
|
|
3
|
+
import { tryResolveRobloxSourceFile } from './roblox-path-resolver.js';
|
|
3
4
|
import { SourcemapResolver } from '../../sourcemap/index.js';
|
|
4
|
-
|
|
5
|
+
import { tryLoadAnnotationWorkspaceAsync, } from './annotation-workspace.js';
|
|
6
|
+
const REPO_ROOT = fileURLToPath(new URL('../../../../../../', import.meta.url));
|
|
7
|
+
let workspace;
|
|
8
|
+
beforeAll(async () => {
|
|
9
|
+
workspace = await tryLoadAnnotationWorkspaceAsync(REPO_ROOT);
|
|
10
|
+
}, 30000);
|
|
11
|
+
function resolveFile(instancePath, packageName) {
|
|
12
|
+
return tryResolveRobloxSourceFile(instancePath, {
|
|
13
|
+
repoRoot: REPO_ROOT,
|
|
14
|
+
workspace,
|
|
15
|
+
packageName,
|
|
16
|
+
})?.file;
|
|
17
|
+
}
|
|
18
|
+
describe('tryResolveRobloxSourceFile', () => {
|
|
5
19
|
it('resolves a standard ServerScriptService path', () => {
|
|
6
|
-
expect(
|
|
20
|
+
expect(resolveFile('ServerScriptService.observablecollection.Shared.ObservableList.spec')).toBe('src/observablecollection/src/Shared/ObservableList.spec.lua');
|
|
7
21
|
});
|
|
8
22
|
it('resolves a nested subdirectory path', () => {
|
|
9
|
-
expect(
|
|
23
|
+
expect(resolveFile('ServerScriptService.observablecollection.Shared.SortedList.ObservableSortedList')).toBe('src/observablecollection/src/Shared/SortedList/ObservableSortedList.lua');
|
|
10
24
|
});
|
|
11
|
-
it('
|
|
12
|
-
expect(
|
|
25
|
+
it('handles missing ServerScriptService prefix', () => {
|
|
26
|
+
expect(resolveFile('maid.Shared.MaidTaskUtils.spec')).toBe('src/maid/src/Shared/MaidTaskUtils.spec.lua');
|
|
13
27
|
});
|
|
14
|
-
it('
|
|
15
|
-
expect(
|
|
28
|
+
it('unwraps a chunk-name wrapper', () => {
|
|
29
|
+
expect(resolveFile('[string "ServerScriptService.saveslot.Server.HasSaveSlotsDataStore"]')).toBe('src/saveslot/src/Server/HasSaveSlotsDataStore.lua');
|
|
16
30
|
});
|
|
17
|
-
it('
|
|
18
|
-
expect(
|
|
31
|
+
it('maps a nested dependency copy to its own package', () => {
|
|
32
|
+
expect(resolveFile('ServerScriptService.saveslot.node_modules.@quenty.adorneedata.node_modules.@quenty.attributeutils.node_modules.@quenty.baseobject.node_modules.@quenty.maid.Shared.Maid')).toBe('src/maid/src/Shared/Maid.lua');
|
|
19
33
|
});
|
|
20
|
-
it('
|
|
21
|
-
expect(
|
|
34
|
+
it('maps a dependency whose folder differs from its npm name', () => {
|
|
35
|
+
expect(resolveFile('[string "ServerScriptService.gameproduct.node_modules.@quenty.playermock.Shared.PlayerMock"]')).toBe('src/player-mock/src/Shared/PlayerMock.lua');
|
|
22
36
|
});
|
|
23
|
-
it('
|
|
24
|
-
expect(
|
|
37
|
+
it('resolves a package root module to its init file', () => {
|
|
38
|
+
expect(resolveFile('[string "ServerScriptService.studiobridge.node_modules.@quenty.nevermore-test-runner.node_modules.@quenty.loader"]')).toBe('src/loader/src/init.lua');
|
|
25
39
|
});
|
|
26
|
-
it('
|
|
27
|
-
expect(
|
|
40
|
+
it('maps the test slug of the package under test to its folder', () => {
|
|
41
|
+
expect(tryResolveRobloxSourceFile('ServerScriptService.gameproduct.Server.Cmdr.GameProductCmdrService', {
|
|
42
|
+
repoRoot: REPO_ROOT,
|
|
43
|
+
workspace,
|
|
44
|
+
packageName: '@quenty/gameproductservice',
|
|
45
|
+
})).toEqual({
|
|
46
|
+
file: 'src/gameproductservice/src/Server/Cmdr/GameProductCmdrService.lua',
|
|
47
|
+
isPackageUnderTest: true,
|
|
48
|
+
});
|
|
49
|
+
expect(resolveFile('ServerScriptService.playermock.Shared.PlayerMock', '@quenty/playermock')).toBe('src/player-mock/src/Shared/PlayerMock.lua');
|
|
50
|
+
});
|
|
51
|
+
it('resolves a package outside src/ by its workspace directory', () => {
|
|
52
|
+
expect(resolveFile('ServerScriptService.studiobridge.commands.console.exec.execute.spec', '@quenty/studio-bridge')).toBe('tools/studio-bridge/src/commands/console/exec/execute.spec.lua');
|
|
53
|
+
});
|
|
54
|
+
it('tries the script file names Rojo strips', () => {
|
|
55
|
+
expect(resolveFile('ServerScriptService.x.node_modules.@quenty.preview-plugin')).toBe('plugins/preview-plugin/src/init.server.lua');
|
|
56
|
+
});
|
|
57
|
+
it('flags dependency frames as not under test', () => {
|
|
58
|
+
expect(tryResolveRobloxSourceFile('ServerScriptService.saveslot.node_modules.@quenty.binder.Shared.Binder', { repoRoot: REPO_ROOT, workspace, packageName: '@quenty/saveslot' })).toEqual({
|
|
59
|
+
file: 'src/binder/src/Shared/Binder.lua',
|
|
60
|
+
isPackageUnderTest: false,
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
it('does not remap a sibling package frame into the package under test', () => {
|
|
64
|
+
expect(resolveFile('ServerScriptService.othersibling.Server.SaveSlotService', '@quenty/saveslot')).toBeUndefined();
|
|
65
|
+
expect(resolveFile('ServerScriptService.Script', '@quenty/saveslot')).toBeUndefined();
|
|
66
|
+
});
|
|
67
|
+
it('rejects vendored, truncated and missing paths', () => {
|
|
68
|
+
for (const instancePath of [
|
|
69
|
+
'ServerScriptService.studiobridge.node_modules.@quenty.nevermore-test-runner.node_modules.@quentystudios.Jest._Index.jsdotlua_promise@3.5.2.promise',
|
|
70
|
+
'[string "ServerScriptService.gameproduct.node_modules.@quenty.playermock.node_modules.@quenty.servic..."]',
|
|
71
|
+
'ServerScriptService.unknownpkg.Shared.Foo',
|
|
72
|
+
]) {
|
|
73
|
+
expect(resolveFile(instancePath)).toBeUndefined();
|
|
74
|
+
}
|
|
28
75
|
});
|
|
29
76
|
describe('with sourcemap resolver', () => {
|
|
30
77
|
const repoRoot = '/repo';
|
|
@@ -33,26 +80,19 @@ describe('resolveRobloxTestPath', () => {
|
|
|
33
80
|
className: 'DataModel',
|
|
34
81
|
children: [
|
|
35
82
|
{
|
|
36
|
-
name: '
|
|
83
|
+
name: 'playermock',
|
|
37
84
|
className: 'Folder',
|
|
38
|
-
filePaths: [`${repoRoot}/src/
|
|
85
|
+
filePaths: [`${repoRoot}/src/player-mock/default.project.json`],
|
|
39
86
|
children: [
|
|
40
87
|
{
|
|
41
88
|
name: 'Shared',
|
|
42
89
|
className: 'Folder',
|
|
43
90
|
children: [
|
|
44
91
|
{
|
|
45
|
-
name: '
|
|
92
|
+
name: 'PlayerMock',
|
|
46
93
|
className: 'ModuleScript',
|
|
47
|
-
filePaths: [
|
|
48
|
-
|
|
49
|
-
{
|
|
50
|
-
name: 'MyModule.spec',
|
|
51
|
-
className: 'ModuleScript',
|
|
52
|
-
filePaths: [
|
|
53
|
-
`${repoRoot}/src/mypkg/src/Shared/MyModule.spec.lua`,
|
|
54
|
-
],
|
|
55
|
-
},
|
|
94
|
+
filePaths: [
|
|
95
|
+
`${repoRoot}/src/player-mock/src/Shared/PlayerMock.lua`,
|
|
56
96
|
],
|
|
57
97
|
},
|
|
58
98
|
],
|
|
@@ -62,14 +102,14 @@ describe('resolveRobloxTestPath', () => {
|
|
|
62
102
|
],
|
|
63
103
|
};
|
|
64
104
|
const resolver = SourcemapResolver.fromSourcemap(sourcemap, repoRoot);
|
|
65
|
-
it('
|
|
66
|
-
expect(
|
|
67
|
-
});
|
|
68
|
-
it('falls back to heuristic when sourcemap has no mapping', () => {
|
|
69
|
-
expect(resolveRobloxTestPath('ServerScriptService.unknownpkg.Shared.Foo.spec', resolver)).toBe('src/unknownpkg/src/Shared/Foo.spec.lua');
|
|
105
|
+
it('looks up dependency copies under their Rojo project name', () => {
|
|
106
|
+
expect(tryResolveRobloxSourceFile('ServerScriptService.gameproduct.node_modules.@quenty.playermock.Shared.PlayerMock', { repoRoot, sourcemapResolver: resolver })?.file).toBe('src/player-mock/src/Shared/PlayerMock.lua');
|
|
70
107
|
});
|
|
71
|
-
it('
|
|
72
|
-
expect(
|
|
108
|
+
it('returns undefined when neither sourcemap nor repo has the file', () => {
|
|
109
|
+
expect(tryResolveRobloxSourceFile('ServerScriptService.unknownpkg.Shared.Foo', {
|
|
110
|
+
repoRoot,
|
|
111
|
+
sourcemapResolver: resolver,
|
|
112
|
+
})).toBeUndefined();
|
|
73
113
|
});
|
|
74
114
|
});
|
|
75
115
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roblox-path-resolver.test.js","sourceRoot":"","sources":["../../../../src/utils/testing/parsers/roblox-path-resolver.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"roblox-path-resolver.test.js","sourceRoot":"","sources":["../../../../src/utils/testing/parsers/roblox-path-resolver.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"combined-project-generator.d.ts","sourceRoot":"","sources":["../../../../src/utils/testing/runner/combined-project-generator.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,YAAY,EAEb,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,uCAAuC,CAAC;
|
|
1
|
+
{"version":3,"file":"combined-project-generator.d.ts","sourceRoot":"","sources":["../../../../src/utils/testing/runner/combined-project-generator.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,YAAY,EAEb,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,uCAAuC,CAAC;AAOzE;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,QAAmB,CAAC;AAExD,gFAAgF;AAChF,MAAM,WAAW,kBAAkB;IACjC,yDAAyD;IACzD,QAAQ,EAAE,MAAM,CAAC;IACjB,mFAAmF;IACnF,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,wEAAwE;IACxE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,+EAA+E;IAC/E,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,mFAAmF;IACnF,aAAa,EAAE,YAAY,CAAC;IAC5B,sFAAsF;IACtF,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,sCAAsC,CAAC;AAEzE,8EAA8E;AAC9E,MAAM,WAAW,qBAAqB;IACpC,mBAAmB,CAAC,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAChD,sBAAsB,CAAC,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACnD,cAAc,CAAC,IAAI,IAAI,CAAC;IACxB,cAAc,CAAC,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;CAC/C;AAWD;;;;;;;GAOG;AACH,wBAAsB,4BAA4B,CAAC,OAAO,EAAE;IAC1D,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,qBAAqB,CAAC;CAClC,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAsIjC;AA+ED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAC/B,KAAK,EAAE,CAAC,EAAE,EACV,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,EAC3B,QAAQ,EAAE,MAAM,GACf,CAAC,EAAE,EAAE,CAqBP;AAED,mDAAmD;AACnD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAErD"}
|
|
@@ -3,6 +3,7 @@ import * as path from 'path';
|
|
|
3
3
|
import { BuildContext, resolvePackagePath, } from '@quenty/nevermore-template-helpers';
|
|
4
4
|
import { OutputHelper } from '@quenty/cli-output-helpers';
|
|
5
5
|
import { recompressPlace } from '../../build/place-recompression.js';
|
|
6
|
+
import { findTestProjectSlug, } from './test-project-slug.js';
|
|
6
7
|
/**
|
|
7
8
|
* Budget for one combined place, as uploaded (recompressed). Under the upload
|
|
8
9
|
* limit (`PLACE_UPLOAD_MAX_BYTES`), and under the 100 MB Roblox documents as
|
|
@@ -193,14 +194,12 @@ async function _extractSlugAsync(batchTargetName, projectPath) {
|
|
|
193
194
|
throw new Error(`Cannot read test project for ${batchTargetName}: ${projectPath}`);
|
|
194
195
|
}
|
|
195
196
|
const project = JSON.parse(content);
|
|
196
|
-
|
|
197
|
-
if (!serverScriptService) {
|
|
197
|
+
if (!project.tree?.ServerScriptService) {
|
|
198
198
|
throw new Error(`Test project for ${batchTargetName} is missing ServerScriptService in tree`);
|
|
199
199
|
}
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
}
|
|
200
|
+
const slug = findTestProjectSlug(project);
|
|
201
|
+
if (slug) {
|
|
202
|
+
return slug;
|
|
204
203
|
}
|
|
205
204
|
throw new Error(`Test project for ${batchTargetName} has no entry under ServerScriptService`);
|
|
206
205
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"combined-project-generator.js","sourceRoot":"","sources":["../../../../src/utils/testing/runner/combined-project-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EACL,YAAY,EACZ,kBAAkB,GACnB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAG1D,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"combined-project-generator.js","sourceRoot":"","sources":["../../../../src/utils/testing/runner/combined-project-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface TestRojoProject {
|
|
2
|
+
tree?: {
|
|
3
|
+
ServerScriptService?: Record<string, unknown>;
|
|
4
|
+
};
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* A package's instance name in its test place: the first non-`$`,
|
|
8
|
+
* non-`Script` key under ServerScriptService.
|
|
9
|
+
*/
|
|
10
|
+
export declare function findTestProjectSlug(project: TestRojoProject): string | undefined;
|
|
11
|
+
//# sourceMappingURL=test-project-slug.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-project-slug.d.ts","sourceRoot":"","sources":["../../../../src/utils/testing/runner/test-project-slug.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE;QAAE,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;CAC1D;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,eAAe,GACvB,MAAM,GAAG,SAAS,CAOpB"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A package's instance name in its test place: the first non-`$`,
|
|
3
|
+
* non-`Script` key under ServerScriptService.
|
|
4
|
+
*/
|
|
5
|
+
export function findTestProjectSlug(project) {
|
|
6
|
+
const serverScriptService = project.tree?.ServerScriptService;
|
|
7
|
+
if (!serverScriptService)
|
|
8
|
+
return undefined;
|
|
9
|
+
return Object.keys(serverScriptService).find((key) => !key.startsWith('$') && key !== 'Script');
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=test-project-slug.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-project-slug.js","sourceRoot":"","sources":["../../../../src/utils/testing/runner/test-project-slug.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAAwB;IAExB,MAAM,mBAAmB,GAAG,OAAO,CAAC,IAAI,EAAE,mBAAmB,CAAC;IAC9D,IAAI,CAAC,mBAAmB;QAAE,OAAO,SAAS,CAAC;IAE3C,OAAO,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAC1C,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,QAAQ,CAClD,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@quenty/nevermore-cli",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.50.1",
|
|
4
4
|
"description": "CLI interface for Nevermore",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"keywords": [
|
|
@@ -25,11 +25,11 @@
|
|
|
25
25
|
"Quenty"
|
|
26
26
|
],
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@quenty/cli-output-helpers": "1.
|
|
29
|
-
"@quenty/nevermore-cli-helpers": "1.
|
|
28
|
+
"@quenty/cli-output-helpers": "1.19.1",
|
|
29
|
+
"@quenty/nevermore-cli-helpers": "1.20.1",
|
|
30
30
|
"@quenty/nevermore-deploy": "1.1.1",
|
|
31
|
-
"@quenty/nevermore-template-helpers": "1.
|
|
32
|
-
"@quenty/studio-bridge": "0.
|
|
31
|
+
"@quenty/nevermore-template-helpers": "1.21.1",
|
|
32
|
+
"@quenty/studio-bridge": "0.22.1",
|
|
33
33
|
"execa": "^9.6.1",
|
|
34
34
|
"find-git-root": "^1.0.4",
|
|
35
35
|
"inquirer": "^13.2.0",
|
|
@@ -60,5 +60,5 @@
|
|
|
60
60
|
"engines": {
|
|
61
61
|
"node": ">=16"
|
|
62
62
|
},
|
|
63
|
-
"gitHead": "
|
|
63
|
+
"gitHead": "e663d6c2e0577e2831040d2a922a3c636fb62007"
|
|
64
64
|
}
|
|
@@ -2,6 +2,7 @@ import { CommandModule } from 'yargs';
|
|
|
2
2
|
import { OutputHelper } from '@quenty/cli-output-helpers';
|
|
3
3
|
import {
|
|
4
4
|
type Diagnostic,
|
|
5
|
+
dedupeDiagnostics,
|
|
5
6
|
emitAnnotations,
|
|
6
7
|
writeAnnotationSummaryAsync,
|
|
7
8
|
} from '@quenty/cli-output-helpers/reporting';
|
|
@@ -16,6 +17,7 @@ import {
|
|
|
16
17
|
} from '../../utils/testing/reporting/index.js';
|
|
17
18
|
import { parseJestLuaOutput } from '../../utils/testing/parsers/index.js';
|
|
18
19
|
import { tryLoadSourcemapResolver } from '../../utils/sourcemap/index.js';
|
|
20
|
+
import { tryLoadAnnotationWorkspaceAsync } from '../../utils/testing/parsers/annotation-workspace.js';
|
|
19
21
|
|
|
20
22
|
type ErrorReporter = Reporter & {
|
|
21
23
|
setError(error: string): void;
|
|
@@ -99,14 +101,17 @@ export const ciPostTestResultsCommand: CommandModule<
|
|
|
99
101
|
|
|
100
102
|
// Emit test failure annotations
|
|
101
103
|
const sourcemapResolver = tryLoadSourcemapResolver(process.cwd());
|
|
102
|
-
const
|
|
104
|
+
const workspace = await tryLoadAnnotationWorkspaceAsync(process.cwd());
|
|
105
|
+
const parsedDiagnostics: Diagnostic[] = [];
|
|
103
106
|
for (const failure of state.getFailures()) {
|
|
104
107
|
const diagnostics = parseJestLuaOutput(failure.logs, {
|
|
105
108
|
packageName: failure.packageName,
|
|
106
109
|
sourcemapResolver,
|
|
110
|
+
workspace,
|
|
107
111
|
});
|
|
108
|
-
|
|
112
|
+
parsedDiagnostics.push(...diagnostics);
|
|
109
113
|
}
|
|
114
|
+
const allDiagnostics = dedupeDiagnostics(parsedDiagnostics);
|
|
110
115
|
|
|
111
116
|
if (allDiagnostics.length > 0) {
|
|
112
117
|
OutputHelper.info(
|