@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.
Files changed (50) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/commands/tools-command/ci-post-test-results.d.ts.map +1 -1
  3. package/dist/commands/tools-command/ci-post-test-results.js +7 -3
  4. package/dist/commands/tools-command/ci-post-test-results.js.map +1 -1
  5. package/dist/utils/batch/changed-packages-utils.d.ts +8 -0
  6. package/dist/utils/batch/changed-packages-utils.d.ts.map +1 -1
  7. package/dist/utils/batch/changed-packages-utils.js +9 -11
  8. package/dist/utils/batch/changed-packages-utils.js.map +1 -1
  9. package/dist/utils/testing/batch-run.e2e.test.js +2 -2
  10. package/dist/utils/testing/batch-run.e2e.test.js.map +1 -1
  11. package/dist/utils/testing/parsers/annotation-workspace.d.ts +17 -0
  12. package/dist/utils/testing/parsers/annotation-workspace.d.ts.map +1 -0
  13. package/dist/utils/testing/parsers/annotation-workspace.js +47 -0
  14. package/dist/utils/testing/parsers/annotation-workspace.js.map +1 -0
  15. package/dist/utils/testing/parsers/index.d.ts +0 -1
  16. package/dist/utils/testing/parsers/index.d.ts.map +1 -1
  17. package/dist/utils/testing/parsers/index.js +0 -1
  18. package/dist/utils/testing/parsers/index.js.map +1 -1
  19. package/dist/utils/testing/parsers/jest-lua-parser.d.ts +14 -29
  20. package/dist/utils/testing/parsers/jest-lua-parser.d.ts.map +1 -1
  21. package/dist/utils/testing/parsers/jest-lua-parser.js +85 -100
  22. package/dist/utils/testing/parsers/jest-lua-parser.js.map +1 -1
  23. package/dist/utils/testing/parsers/jest-lua-parser.test.js +359 -56
  24. package/dist/utils/testing/parsers/jest-lua-parser.test.js.map +1 -1
  25. package/dist/utils/testing/parsers/roblox-path-resolver.d.ts +23 -17
  26. package/dist/utils/testing/parsers/roblox-path-resolver.d.ts.map +1 -1
  27. package/dist/utils/testing/parsers/roblox-path-resolver.js +89 -54
  28. package/dist/utils/testing/parsers/roblox-path-resolver.js.map +1 -1
  29. package/dist/utils/testing/parsers/roblox-path-resolver.test.js +76 -36
  30. package/dist/utils/testing/parsers/roblox-path-resolver.test.js.map +1 -1
  31. package/dist/utils/testing/runner/combined-project-generator.d.ts.map +1 -1
  32. package/dist/utils/testing/runner/combined-project-generator.js +5 -6
  33. package/dist/utils/testing/runner/combined-project-generator.js.map +1 -1
  34. package/dist/utils/testing/runner/test-project-slug.d.ts +11 -0
  35. package/dist/utils/testing/runner/test-project-slug.d.ts.map +1 -0
  36. package/dist/utils/testing/runner/test-project-slug.js +11 -0
  37. package/dist/utils/testing/runner/test-project-slug.js.map +1 -0
  38. package/package.json +6 -6
  39. package/src/commands/tools-command/ci-post-test-results.ts +7 -2
  40. package/src/utils/batch/changed-packages-utils.ts +21 -12
  41. package/src/utils/testing/batch-run.e2e.test.ts +6 -2
  42. package/src/utils/testing/parsers/annotation-workspace.ts +74 -0
  43. package/src/utils/testing/parsers/index.ts +0 -1
  44. package/src/utils/testing/parsers/jest-lua-parser.test.ts +433 -65
  45. package/src/utils/testing/parsers/jest-lua-parser.ts +131 -109
  46. package/src/utils/testing/parsers/roblox-path-resolver.test.ts +144 -61
  47. package/src/utils/testing/parsers/roblox-path-resolver.ts +117 -56
  48. package/src/utils/testing/runner/combined-project-generator.ts +9 -13
  49. package/src/utils/testing/runner/test-project-slug.ts +18 -0
  50. package/tsconfig.tsbuildinfo +1 -1
@@ -1,24 +1,30 @@
1
1
  /**
2
- * Converts Roblox instance paths from Jest-lua output back to
3
- * repo-relative local filesystem paths.
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
- * 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.
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 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.
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 resolveRobloxTestPath(instancePath: string, sourcemapResolver?: SourcemapResolver): string;
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;;;;;;;;;;;;;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"}
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
- * Converts Roblox instance paths from Jest-lua output back to
3
- * repo-relative local filesystem paths.
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
- * 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.
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 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.
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 resolveRobloxTestPath(instancePath, sourcemapResolver) {
24
- if (sourcemapResolver) {
25
- const resolved = sourcemapResolver.resolve(instancePath);
26
- if (resolved)
27
- return resolved;
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
- 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(SERVER_SCRIPT_SERVICE_PREFIX)) {
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
- // 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`;
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
- 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('.');
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 (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 && (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(seg);
100
+ rejoined.push(segment);
65
101
  }
66
102
  }
67
- const subPath = rejoined.join('/');
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;;;;;;;;;;;;;GAaG;AAIH,MAAM,4BAA4B,GAAG,sBAAsB,CAAC;AAE5D;;;;;;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,4BAA4B,CAAC,EAAE,CAAC;QAClD,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,4BAA4B,CAAC,MAAM,CAAC,CAAC;IACzD,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,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,OAAO,CAAC,EAAE,CAAC;YACjD,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"}
1
+ {"version":3,"file":"roblox-path-resolver.js","sourceRoot":"","sources":["../../../../src/utils/testing/parsers/roblox-path-resolver.ts"],"names":[],"mappings":"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"}
@@ -1,30 +1,77 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { resolveRobloxTestPath } from './roblox-path-resolver.js';
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
- describe('resolveRobloxTestPath', () => {
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(resolveRobloxTestPath('ServerScriptService.observablecollection.Shared.ObservableList.spec')).toBe('src/observablecollection/src/Shared/ObservableList.spec.lua');
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(resolveRobloxTestPath('ServerScriptService.maid.Shared.Maid.spec')).toBe('src/maid/src/Shared/Maid.spec.lua');
23
+ expect(resolveFile('ServerScriptService.observablecollection.Shared.SortedList.ObservableSortedList')).toBe('src/observablecollection/src/Shared/SortedList/ObservableSortedList.lua');
10
24
  });
11
- it('resolves a deeply nested path', () => {
12
- expect(resolveRobloxTestPath('ServerScriptService.blend.Client.Blend.Spring.SpringObject.spec')).toBe('src/blend/src/Client/Blend/Spring/SpringObject.spec.lua');
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('handles missing ServerScriptService prefix as fallback', () => {
15
- expect(resolveRobloxTestPath('observablecollection.Shared.ObservableList.spec')).toBe('src/observablecollection/src/Shared/ObservableList.spec.lua');
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('strips :LINE suffix', () => {
18
- expect(resolveRobloxTestPath('ServerScriptService.observablecollection.Shared.ObservableList.spec:45')).toBe('src/observablecollection/src/Shared/ObservableList.spec.lua');
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('handles path without ServerScriptService prefix and with :LINE suffix', () => {
21
- expect(resolveRobloxTestPath('maid.Shared.Maid.spec:23')).toBe('src/maid/src/Shared/Maid.spec.lua');
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('handles a bare package slug', () => {
24
- expect(resolveRobloxTestPath('ServerScriptService.maid')).toBe('src/maid/src');
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('handles a single-level spec path', () => {
27
- expect(resolveRobloxTestPath('ServerScriptService.maid.Maid.spec')).toBe('src/maid/src/Maid.spec.lua');
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: 'mypkg',
83
+ name: 'playermock',
37
84
  className: 'Folder',
38
- filePaths: [`${repoRoot}/src/mypkg/default.project.json`],
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: 'MyModule',
92
+ name: 'PlayerMock',
46
93
  className: 'ModuleScript',
47
- filePaths: [`${repoRoot}/src/mypkg/src/Shared/MyModule.lua`],
48
- children: [
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('uses sourcemap when path is found', () => {
66
- expect(resolveRobloxTestPath('ServerScriptService.mypkg.Shared.MyModule.MyModule.spec', resolver)).toBe('src/mypkg/src/Shared/MyModule.spec.lua');
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('strips :LINE suffix with sourcemap', () => {
72
- expect(resolveRobloxTestPath('ServerScriptService.mypkg.Shared.MyModule.MyModule.spec:42', resolver)).toBe('src/mypkg/src/Shared/MyModule.spec.lua');
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;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAG7D,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,CACJ,qBAAqB,CACnB,qEAAqE,CACtE,CACF,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CACJ,qBAAqB,CAAC,2CAA2C,CAAC,CACnE,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CACJ,qBAAqB,CACnB,iEAAiE,CAClE,CACF,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,CACJ,qBAAqB,CAAC,iDAAiD,CAAC,CACzE,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC7B,MAAM,CACJ,qBAAqB,CACnB,wEAAwE,CACzE,CACF,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;QAC/E,MAAM,CAAC,qBAAqB,CAAC,0BAA0B,CAAC,CAAC,CAAC,IAAI,CAC5D,mCAAmC,CACpC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,qBAAqB,CAAC,0BAA0B,CAAC,CAAC,CAAC,IAAI,CAC5D,cAAc,CACf,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,qBAAqB,CAAC,oCAAoC,CAAC,CAAC,CAAC,IAAI,CACtE,4BAA4B,CAC7B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACvC,MAAM,QAAQ,GAAG,OAAO,CAAC;QAEzB,MAAM,SAAS,GAAkB;YAC/B,IAAI,EAAE,WAAW;YACjB,SAAS,EAAE,WAAW;YACtB,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,OAAO;oBACb,SAAS,EAAE,QAAQ;oBACnB,SAAS,EAAE,CAAC,GAAG,QAAQ,iCAAiC,CAAC;oBACzD,QAAQ,EAAE;wBACR;4BACE,IAAI,EAAE,QAAQ;4BACd,SAAS,EAAE,QAAQ;4BACnB,QAAQ,EAAE;gCACR;oCACE,IAAI,EAAE,UAAU;oCAChB,SAAS,EAAE,cAAc;oCACzB,SAAS,EAAE,CAAC,GAAG,QAAQ,oCAAoC,CAAC;oCAC5D,QAAQ,EAAE;wCACR;4CACE,IAAI,EAAE,eAAe;4CACrB,SAAS,EAAE,cAAc;4CACzB,SAAS,EAAE;gDACT,GAAG,QAAQ,yCAAyC;6CACrD;yCACF;qCACF;iCACF;6BACF;yBACF;qBACF;iBACF;aACF;SACF,CAAC;QAEF,MAAM,QAAQ,GAAG,iBAAiB,CAAC,aAAa,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAEtE,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,CACJ,qBAAqB,CACnB,yDAAyD,EACzD,QAAQ,CACT,CACF,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;YAC/D,MAAM,CACJ,qBAAqB,CACnB,gDAAgD,EAChD,QAAQ,CACT,CACF,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,CACJ,qBAAqB,CACnB,4DAA4D,EAC5D,QAAQ,CACT,CACF,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,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;AAGzE;;;;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;AAMD,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"}
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
- const serverScriptService = project.tree?.ServerScriptService;
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
- for (const key of Object.keys(serverScriptService)) {
201
- if (!key.startsWith('$') && key !== 'Script') {
202
- return key;
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":"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"}
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.49.0",
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.18.0",
29
- "@quenty/nevermore-cli-helpers": "1.19.0",
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.20.0",
32
- "@quenty/studio-bridge": "0.21.1",
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": "7882030eae407981a58c0adb5fe107757e26103d"
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 allDiagnostics: Diagnostic[] = [];
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
- allDiagnostics.push(...diagnostics);
112
+ parsedDiagnostics.push(...diagnostics);
109
113
  }
114
+ const allDiagnostics = dedupeDiagnostics(parsedDiagnostics);
110
115
 
111
116
  if (allDiagnostics.length > 0) {
112
117
  OutputHelper.info(