@isentinel/jest-roblox 0.2.7 → 0.3.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/dist/index.d.mts CHANGED
@@ -1,51 +1,268 @@
1
- import { A as defineConfig, C as FormatterEntry, D as ROOT_ONLY_KEYS, E as ProjectTestConfig, M as Argv, O as ResolvedConfig, S as DisplayName, T as ProjectEntry, _ as ResolvedProjectConfig, a as formatExecuteOutput, b as ConfigInput, c as Backend, d as extractJsonFromOutput, f as parseJestOutput, g as TestStatus, h as TestFileResult, i as execute, j as defineProject, k as SnapshotFormatOptions, l as BackendOptions, m as TestCaseResult, n as ExecuteResult, o as TimingResult, p as JestResult, r as FormatOutputOptions, s as SourceMapper, t as ExecuteOptions, u as BackendResult, v as CliOptions, w as InlineProjectConfig, x as DEFAULT_CONFIG, y as Config } from "./executor-COuwZJJX.mjs";
1
+ import { _ as SnapshotFormatOptions, a as DisplayName, b as defineProject, c as GlobalTestConfig, d as ProjectEntry, f as ProjectTestConfig, g as SharedTestConfig, h as SHARED_TEST_KEYS, i as DEFAULT_CONFIG, l as InlineProjectConfig, m as ResolvedConfig, n as Config, o as FormatterEntry, p as ROOT_CLI_KEYS, r as ConfigInput, s as GLOBAL_TEST_KEYS, t as CliOptions, u as JEST_ARGV_EXCLUDED_KEYS, v as WorkspaceConfig, y as defineConfig } from "./schema-BpjBo-Aw.mjs";
2
+ import { type } from "arktype";
2
3
  import { WebSocket, WebSocketServer } from "ws";
3
- import buffer from "node:buffer";
4
+ import { StorageClient } from "@bedrock-rbx/ocale/storage";
4
5
 
5
- //#region packages/roblox-runner/dist/index.d.mts
6
- //#region src/http-client.d.ts
7
- interface HttpResponse {
8
- body: unknown;
9
- headers?: Record<string, string | undefined>;
10
- ok: boolean;
11
- status: number;
6
+ //#region src/coverage/types.d.ts
7
+ /**
8
+ * Raw hit counts for a single file, keyed by statement/function index.
9
+ */
10
+ interface RawFileCoverage {
11
+ b?: Record<string, Array<number>>;
12
+ f?: Record<string, number>;
13
+ s: Record<string, number>;
12
14
  }
13
- interface RequestOptions {
14
- body?: unknown;
15
- headers?: Record<string, string>;
15
+ /**
16
+ * Raw coverage data for all files, keyed by original Luau-relative path.
17
+ */
18
+ type RawCoverageData = Record<string, RawFileCoverage>;
19
+ //#endregion
20
+ //#region src/memory-store/sorted-map-client.d.ts
21
+ /**
22
+ * Slim per-package summary published mid-task via the MemoryStore SortedMap.
23
+ * Intentionally compact — Roblox caps SortedMap items at 32 KB, so we leave
24
+ * the full `jestOutput` JSON out of streaming and reconstruct it from the
25
+ * task's final envelope. Streaming only needs enough fields to render a
26
+ * one-line progress message.
27
+ */
28
+ interface StreamingResultEntry {
29
+ elapsedMs: number;
30
+ numFailedTests: number;
31
+ numPassedTests: number;
32
+ numPendingTests: number;
33
+ pkg: string;
34
+ project: string;
35
+ success: boolean;
36
+ }
37
+ interface StreamingResultRecord {
38
+ id: string;
39
+ value: StreamingResultEntry;
16
40
  }
17
- interface HttpClient {
18
- request(method: string, url: string, options?: RequestOptions): Promise<HttpResponse>;
41
+ /**
42
+ * Minimal surface used by streaming polling — lets backends and tests
43
+ * stand in a stub without depending on the SDK class hierarchy.
44
+ */
45
+ interface StreamingResultReader {
46
+ delete(itemId: string): Promise<void>;
47
+ readAll(): Promise<Array<StreamingResultRecord>>;
19
48
  }
20
49
  //#endregion
21
- //#region src/backends/open-cloud.d.ts
22
- interface OpenCloudCredentials {
50
+ //#region src/types/jest-result.d.ts
51
+ type TestStatus = "disabled" | "failed" | "passed" | "pending" | "skipped" | "todo";
52
+ interface TestCaseResult {
53
+ ancestorTitles: Array<string>;
54
+ duration?: number;
55
+ failureMessages: Array<string>;
56
+ fullName: string;
57
+ location?: {
58
+ column: number;
59
+ line: number;
60
+ };
61
+ numPassingAsserts?: number;
62
+ retryReasons?: Array<string>;
63
+ status: TestStatus;
64
+ title: string;
65
+ }
66
+ interface TestFileResult {
67
+ failureMessage?: string;
68
+ numFailingTests: number;
69
+ numPassingTests: number;
70
+ numPendingTests: number;
71
+ testFilePath: string;
72
+ testResults: Array<TestCaseResult>;
73
+ }
74
+ interface SnapshotSummary {
75
+ added: number;
76
+ didUpdate?: boolean;
77
+ filesRemoved?: number;
78
+ matched: number;
79
+ total: number;
80
+ unchecked?: number;
81
+ unmatched: number;
82
+ updated: number;
83
+ }
84
+ interface JestResult {
85
+ numFailedTests: number;
86
+ numPassedTests: number;
87
+ numPendingTests: number;
88
+ numTodoTests?: number;
89
+ numTotalTests: number;
90
+ snapshot?: SnapshotSummary;
91
+ startTime: number;
92
+ success: boolean;
93
+ testResults: Array<TestFileResult>;
94
+ }
95
+ //#endregion
96
+ //#region src/reporter/parser.d.ts
97
+ type SnapshotWrites = Record<string, string>;
98
+ interface ParseResult {
99
+ coverageData?: RawCoverageData;
100
+ luauTiming?: Record<string, number>;
101
+ result: JestResult;
102
+ setupSeconds?: number;
103
+ snapshotWrites?: SnapshotWrites;
104
+ }
105
+ declare function extractJsonFromOutput(output: string): string | undefined;
106
+ declare function parseJestOutput(output: string): ParseResult;
107
+ //#endregion
108
+ //#region src/backends/interface.d.ts
109
+ interface EnvelopeEntry {
110
+ bannerOutput?: string;
111
+ elapsedMs?: number;
112
+ gameOutput?: string;
113
+ jestOutput: string;
114
+ pkg?: string;
115
+ project?: string;
116
+ snapshotWrites?: SnapshotWrites;
117
+ }
118
+ interface ProjectJob {
119
+ config: ResolvedConfig;
120
+ displayColor?: string;
121
+ displayName: string;
122
+ /**
123
+ * Workspace-mode only: the npm package name (e.g. `@halcyon/foo`) that
124
+ * owns this project. Combined with `displayName` it forms the lookup key
125
+ * used by work-stealing to match Luau-emitted entries to jobs. Outside
126
+ * workspace mode this is undefined and the lookup falls back to
127
+ * `displayName` alone.
128
+ */
129
+ pkg?: string;
130
+ /**
131
+ * Studio-only: filtered list of DataModel paths that should receive
132
+ * runtime `jest.config` ModuleScript injection. The CLI excludes mount
133
+ * paths where a user-authored `jest.config.luau` already exists on
134
+ * disk (synced by Rojo); injecting over those would either overwrite
135
+ * the canonical config or trigger the plugin's structural collision
136
+ * check. The Studio backend forwards this array (parallel to
137
+ * `configs`) as `runtimeStubMounts[i]` in the WebSocket payload; the
138
+ * plugin's Run Mode runner iterates only this list, never the
139
+ * unfiltered `cfg.projects`. Empty is meaningful — the project has no
140
+ * mounts needing runtime injection. Open-cloud backend ignores this
141
+ * field; it bakes stubs into the place file via the synthesizer.
142
+ */
143
+ runtimeInjectionPaths?: Array<string>;
144
+ testFiles: Array<string>;
145
+ }
146
+ interface StreamingHooks {
147
+ /**
148
+ * Called once per newly-observed SortedMap entry, in the order the
149
+ * backend's poll loop drains them. Duplicates from work-stealing
150
+ * fault-recovery are NOT filtered here — consumers handle that
151
+ * (the StreamingAggregator drops repeat pkg/project keys).
152
+ */
153
+ onPackageResult: (entry: StreamingResultEntry) => void;
154
+ /**
155
+ * Optional poll cadence in milliseconds. Defaults to 250ms — fast
156
+ * enough to feel live without saturating the Open Cloud rate limit.
157
+ */
158
+ pollMs?: number;
159
+ reader: StreamingResultReader;
160
+ }
161
+ interface BackendOptions {
162
+ jobs: Array<ProjectJob>;
163
+ /**
164
+ * Open-Cloud-only: number of concurrent Open Cloud Luau execution sessions
165
+ * to fire. Unset or 1 means one session carrying all jobs. `"auto"` resolves
166
+ * to min(jobs.length, 3). Studio backend must error when this is set to
167
+ * anything other than undefined/1 (Phase 4 enforces at the CLI layer).
168
+ */
169
+ parallel?: "auto" | number;
170
+ /**
171
+ * Workspace mode: pre-built Luau script that the backend should send
172
+ * verbatim instead of generating one from `jobs`. Used by the staged
173
+ * materializer pipeline so the CLI layer chooses the script and the
174
+ * backend stays unaware of the difference.
175
+ */
176
+ scriptOverride?: string;
177
+ /**
178
+ * Open-Cloud-only, work-stealing only: when provided, the backend polls
179
+ * the SortedMap concurrently with executeScript and invokes
180
+ * `onPackageResult` per newly-observed entry. Consumed entries are
181
+ * deleted to avoid re-emission. Streaming is best-effort: failure to
182
+ * poll/delete does not affect the final results returned in the task
183
+ * envelope.
184
+ */
185
+ streaming?: StreamingHooks;
186
+ /**
187
+ * Open-Cloud-only: when true, fire `parallel` tasks all running the SAME
188
+ * `scriptOverride` (no static job-bucket split). Each task pulls work from
189
+ * a MemoryStore queue (set up upstream) and returns whatever subset of
190
+ * packages it processed. Backend aggregates entries across all task
191
+ * envelopes and maps each to the matching `ProjectJob.displayName` by the
192
+ * entry's `pkg` field. `scriptOverride` is required when this is true.
193
+ */
194
+ workStealing?: boolean;
195
+ }
196
+ interface BackendTiming {
197
+ executionMs: number;
198
+ uploadMs?: number;
199
+ }
200
+ interface RawBackendEntry {
201
+ entry: EnvelopeEntry;
202
+ fallbackGameOutput?: string;
203
+ }
204
+ interface BackendResult {
205
+ rawResults: Array<RawBackendEntry>;
206
+ timing: BackendTiming;
207
+ }
208
+ interface Backend {
209
+ close?(): Promise<void> | void;
210
+ readonly kind: BackendKind;
211
+ runTests(options: BackendOptions): Promise<BackendResult>;
212
+ }
213
+ type BackendKind = "open-cloud" | "studio";
214
+ //#endregion
215
+ //#region packages/roblox-runner/dist/index.d.mts
216
+ //#endregion
217
+ //#region src/types.d.ts
218
+ interface RunnerCredentials {
23
219
  apiKey: string;
24
220
  placeId: string;
25
221
  universeId: string;
26
222
  }
223
+ interface UploadPlaceOptions {
224
+ placeFilePath: string;
225
+ }
226
+ interface UploadPlaceResult {
227
+ uploadMs: number;
228
+ versionNumber: number;
229
+ }
230
+ interface ExecuteScriptOptions {
231
+ script: string;
232
+ timeout: number;
233
+ }
234
+ interface ScriptResult {
235
+ durationMs: number;
236
+ outputs: Array<string>;
237
+ }
238
+ interface RemoteRunner {
239
+ executeScript(options: ExecuteScriptOptions): Promise<ScriptResult>;
240
+ uploadPlace(options: UploadPlaceOptions): Promise<UploadPlaceResult>;
241
+ } //#endregion
242
+ //#region src/credentials.d.ts
243
+ //#endregion
244
+ //#region src/backends/open-cloud.d.ts
245
+ type OpenCloudCredentials = RunnerCredentials;
27
246
  interface OpenCloudOptions {
28
- http?: HttpClient;
29
- readFile?: FileReader;
30
- sleep?: (ms: number) => Promise<void>;
247
+ /**
248
+ * Inject a pre-built {@link RemoteRunner}. When provided, the
249
+ * `credentials` argument to {@link OpenCloudBackend} is ignored —
250
+ * the injected runner already owns its own credentials. Intended
251
+ * primarily as a test seam.
252
+ */
253
+ runner?: RemoteRunner;
31
254
  }
32
- type FileReader = (path: string) => buffer.Buffer;
33
255
  declare class OpenCloudBackend implements Backend {
34
- private readonly baseUrl;
35
- private readonly credentials;
36
- private readonly http;
37
- private readonly readFile;
38
- private readonly sleepFn;
256
+ private readonly runner;
39
257
  readonly kind = "open-cloud";
40
258
  constructor(credentials: OpenCloudCredentials, options?: OpenCloudOptions);
41
259
  runTests(options: BackendOptions): Promise<BackendResult>;
42
- private createExecutionTask;
43
- private pollForCompletion;
44
260
  private runBucket;
45
- private uploadOrReuseCached;
46
- private uploadPlaceData;
261
+ private runStaticBuckets;
262
+ private runStealingTask;
263
+ private runWorkStealing;
47
264
  }
48
- declare function createOpenCloudBackend(): OpenCloudBackend;
265
+ declare function createOpenCloudBackend(credentials: OpenCloudCredentials): OpenCloudBackend;
49
266
  //#endregion
50
267
  //#region src/backends/studio.d.ts
51
268
  interface PreConnected {
@@ -68,9 +285,7 @@ declare class StudioBackend implements Backend {
68
285
  constructor(options: StudioOptions);
69
286
  close(): void;
70
287
  runTests(options: BackendOptions): Promise<BackendResult>;
71
- private buildProjectResult;
72
288
  private executeViaPlugin;
73
- private parseEnvelope;
74
289
  private waitForResult;
75
290
  }
76
291
  declare function createStudioBackend(options: StudioOptions): StudioBackend;
@@ -79,6 +294,126 @@ declare function createStudioBackend(options: StudioOptions): StudioBackend;
79
294
  declare function resolveConfig(config: Config): ResolvedConfig;
80
295
  declare function loadConfig(configPath?: string, cwd?: string): Promise<ResolvedConfig>;
81
296
  //#endregion
297
+ //#region packages/rojo-utils/dist/index.d.mts
298
+ interface Mount {
299
+ dataModelPath: string;
300
+ fsPath: string;
301
+ }
302
+ //#endregion
303
+ //#region src/config/projects.d.ts
304
+ interface ResolvedProjectConfig {
305
+ config: ResolvedConfig;
306
+ displayColor?: string;
307
+ displayName: string;
308
+ /** Original include patterns (with TS extensions) for filesystem discovery. */
309
+ include: Array<string>;
310
+ /**
311
+ * Single resolved output directory (workspace-relative). Set only when
312
+ * resolution produced exactly one mount; undefined when the project spans
313
+ * multiple rojo mounts. Kept for back-compat; new code should consume
314
+ * `rojoMounts` instead.
315
+ */
316
+ outDir?: string;
317
+ /** DataModel paths Jest walks up from to discover test configs. */
318
+ projects: Array<string>;
319
+ /** Internal: FS↔DataModel pairs for stub generation and shadow sync. */
320
+ rojoMounts: Array<Mount>;
321
+ /** Luau-side testMatch patterns (extensions stripped). */
322
+ testMatch: Array<string>;
323
+ }
324
+ //#endregion
325
+ //#region src/source-mapper/index.d.ts
326
+ interface MappedLocation {
327
+ luauLine: number;
328
+ luauPath: string;
329
+ sourceContent?: string;
330
+ tsColumn?: number;
331
+ tsLine?: number;
332
+ tsPath?: string;
333
+ }
334
+ interface MappedFailure {
335
+ locations: Array<MappedLocation>;
336
+ message: string;
337
+ }
338
+ interface SourceMapper {
339
+ mapFailureMessage(message: string): string;
340
+ mapFailureWithLocations(message: string): MappedFailure;
341
+ resolveDisplayPath(testFilePath: string): string;
342
+ resolveTestFilePath(testFilePath: string): string | undefined;
343
+ }
344
+ //#endregion
345
+ //#region src/types/timing.d.ts
346
+ interface TimingResult {
347
+ coverageMs?: number;
348
+ executionMs: number;
349
+ setupMs?: number;
350
+ startTime: number;
351
+ testsMs: number;
352
+ totalMs: number;
353
+ uploadMs?: number;
354
+ }
355
+ //#endregion
356
+ //#region src/executor.d.ts
357
+ interface ExecuteResult {
358
+ coverageData?: RawCoverageData;
359
+ exitCode: number;
360
+ gameOutput?: string;
361
+ output: string;
362
+ result: JestResult;
363
+ snapshotWriteFailures?: number;
364
+ sourceMapper?: SourceMapper;
365
+ timing: TimingResult;
366
+ }
367
+ interface FormatOutputOptions {
368
+ config: ResolvedConfig;
369
+ result: JestResult;
370
+ snapshotWriteFailures?: number;
371
+ sourceMapper?: SourceMapper;
372
+ timing: TimingResult;
373
+ version: string;
374
+ }
375
+ interface ProjectInput {
376
+ config: ResolvedConfig;
377
+ displayColor?: string;
378
+ displayName?: string;
379
+ pkg?: string;
380
+ /** Studio-only: forwarded to `ProjectJob.runtimeInjectionPaths`. */
381
+ runtimeInjectionPaths?: Array<string>;
382
+ testFiles: Array<string>;
383
+ }
384
+ interface RunProjectsOptions {
385
+ backend: Backend;
386
+ deferFormatting?: boolean;
387
+ parallel?: "auto" | number;
388
+ projects: Array<ProjectInput>;
389
+ scriptOverride?: string;
390
+ startTime: number;
391
+ streaming?: StreamingHooks;
392
+ version: string;
393
+ workStealing?: boolean;
394
+ }
395
+ interface RunProjectsResult {
396
+ backendTiming: BackendTiming;
397
+ results: Array<ExecuteResult>;
398
+ }
399
+ declare function formatExecuteOutput(options: FormatOutputOptions): string;
400
+ /**
401
+ * Unified orchestration entry point: builds jobs for every input project,
402
+ * dispatches them through the backend in one call, shapes each raw envelope
403
+ * entry into a `ProjectBackendResult`, then maps each through per-project
404
+ * post-processing. Single-, multi-, and workspace-run callers all funnel
405
+ * through here so the build→execute→shape→process sequence lives in
406
+ * exactly one place.
407
+ *
408
+ * Ordering contract: the returned `results` array is in the same order as
409
+ * `options.projects`. Backends MUST return `rawResults` in the same order
410
+ * as the submitted `jobs` envelope — `runProjects` indexes into `jobs[i]`
411
+ * to recover each project's resolved config and pair it with the matching
412
+ * raw entry, so out-of-order results would post-process with the wrong
413
+ * config.
414
+ */
415
+ declare function runProjects(options: RunProjectsOptions): Promise<RunProjectsResult>;
416
+ //#endregion
82
417
  //#region src/formatters/formatter.d.ts
83
418
  interface FormatOptions {
84
419
  collectCoverage?: boolean;
@@ -88,6 +423,8 @@ interface FormatOptions {
88
423
  outputFile?: string;
89
424
  rootDir: string;
90
425
  showLuau?: boolean;
426
+ slowTestThreshold?: number;
427
+ snapshotWriteFailures?: number;
91
428
  sourceMapper?: SourceMapper;
92
429
  typeErrors?: number;
93
430
  verbose: boolean;
@@ -100,6 +437,10 @@ interface Styles {
100
437
  received: ColorFunc;
101
438
  };
102
439
  dim: ColorFunc;
440
+ duration: {
441
+ fast: ColorFunc;
442
+ slow: ColorFunc;
443
+ };
103
444
  failBadge: ColorFunc;
104
445
  lineNumber: ColorFunc;
105
446
  location: ColorFunc;
@@ -108,6 +449,7 @@ interface Styles {
108
449
  file: ColorFunc;
109
450
  };
110
451
  runBadge: ColorFunc;
452
+ slowTestThreshold: number;
111
453
  status: {
112
454
  fail: ColorFunc;
113
455
  pass: ColorFunc;
@@ -139,18 +481,12 @@ declare function formatFailure({
139
481
  useColor?: boolean;
140
482
  }): string;
141
483
  declare function formatTestSummary(result: JestResult, timing: TimingResult, styles?: Styles, options?: {
484
+ snapshotWriteFailures?: number;
142
485
  typeErrors?: number;
143
486
  }): string;
144
487
  declare function formatResult(result: JestResult, timing: TimingResult, options: FormatOptions): string;
145
488
  //#endregion
146
489
  //#region src/formatters/github-actions.d.ts
147
- interface GitHubActionsOptions {
148
- repository?: string;
149
- serverUrl?: string;
150
- sha?: string;
151
- sourceMapper?: SourceMapper;
152
- workspace?: string;
153
- }
154
490
  interface GitHubActionsFormatterOptions {
155
491
  /**
156
492
  * Whether to emit `::error` workflow commands for test failures.
@@ -210,6 +546,13 @@ interface JobSummaryOptions {
210
546
  */
211
547
  outputPath: string | undefined;
212
548
  }
549
+ interface GitHubActionsOptions {
550
+ repository?: string;
551
+ serverUrl?: string;
552
+ sha?: string;
553
+ sourceMapper?: SourceMapper;
554
+ workspace?: string;
555
+ }
213
556
  declare function formatAnnotations(result: JestResult, options: GitHubActionsOptions): string;
214
557
  declare function formatJobSummary(result: JestResult, options: GitHubActionsOptions): string;
215
558
  //#endregion
@@ -217,6 +560,182 @@ declare function formatJobSummary(result: JestResult, options: GitHubActionsOpti
217
560
  declare function formatJson(result: JestResult): string;
218
561
  declare function writeJsonFile(result: JestResult, filePath: string): Promise<void>;
219
562
  //#endregion
563
+ //#region src/coverage/mapper.d.ts
564
+ interface MappedFileCoverage {
565
+ b: Record<string, Array<number>>;
566
+ branchMap: Record<string, {
567
+ loc: {
568
+ end: {
569
+ column: number;
570
+ line: number;
571
+ };
572
+ start: {
573
+ column: number;
574
+ line: number;
575
+ };
576
+ };
577
+ locations: Array<{
578
+ end: {
579
+ column: number;
580
+ line: number;
581
+ };
582
+ start: {
583
+ column: number;
584
+ line: number;
585
+ };
586
+ }>;
587
+ type: string;
588
+ }>;
589
+ f: Record<string, number>;
590
+ fnMap: Record<string, {
591
+ loc: {
592
+ end: {
593
+ column: number;
594
+ line: number;
595
+ };
596
+ start: {
597
+ column: number;
598
+ line: number;
599
+ };
600
+ };
601
+ name: string;
602
+ }>;
603
+ path: string;
604
+ s: Record<string, number>;
605
+ statementMap: Record<string, {
606
+ end: {
607
+ column: number;
608
+ line: number;
609
+ };
610
+ start: {
611
+ column: number;
612
+ line: number;
613
+ };
614
+ }>;
615
+ }
616
+ interface MappedCoverageResult {
617
+ files: Record<string, MappedFileCoverage>;
618
+ }
619
+ //#endregion
620
+ //#region src/run/types.d.ts
621
+ type RunMode = "multi" | "single" | "workspace";
622
+ interface ProjectResult {
623
+ displayColor?: string;
624
+ displayName: string;
625
+ result: ExecuteResult;
626
+ }
627
+ interface MultiProjectMerged {
628
+ coverageData?: ExecuteResult["coverageData"];
629
+ sourceMapper?: SourceMapper;
630
+ }
631
+ interface SingleRunResult {
632
+ mode: "single";
633
+ preCoverageMs: number;
634
+ runtimeResult?: ExecuteResult;
635
+ typecheckResult?: JestResult;
636
+ validationExitCode?: 2;
637
+ }
638
+ interface MultiRunResult {
639
+ collectCoverageFrom?: Array<string>;
640
+ merged: MultiProjectMerged;
641
+ mode: "multi";
642
+ preCoverageMs: number;
643
+ projectResults: Array<ProjectResult>;
644
+ typecheckResult?: JestResult;
645
+ validationExitCode?: 2;
646
+ validationMessage?: string;
647
+ }
648
+ interface WorkspaceRunResult {
649
+ /**
650
+ * Pre-aggregated TS-coord coverage merged from every package's
651
+ * `coverageData + coverageManifest`. Skips the single-package
652
+ * `loadCoverageManifest(rootDir)` path entirely. Undefined when
653
+ * `collectCoverage` is off or no package produced coverage data.
654
+ */
655
+ coverageMapped?: MappedCoverageResult;
656
+ /**
657
+ * Consensus-resolved Aggregated Game Output path the runner wrote (if any).
658
+ * Surfaced so formatters point "View …" hints at the file that exists,
659
+ * rather than the workspace-root `config.gameOutput` (which the runner does
660
+ * not consult).
661
+ */
662
+ gameOutput?: string;
663
+ merged: MultiProjectMerged;
664
+ mode: "workspace";
665
+ /** Consensus-resolved aggregated result path the runner wrote (if any). */
666
+ outputFile?: string;
667
+ preCoverageMs: number;
668
+ projectResults: Array<ProjectResult>;
669
+ typecheckResult?: JestResult;
670
+ validationExitCode?: 2;
671
+ validationMessage?: string;
672
+ }
673
+ type RunResult = MultiRunResult | SingleRunResult | WorkspaceRunResult;
674
+ interface RunOptions {
675
+ cli: CliOptions;
676
+ config: ResolvedConfig;
677
+ }
678
+ //#endregion
679
+ //#region src/run.d.ts
680
+ declare function runJestRoblox(cli: CliOptions, config: ResolvedConfig): Promise<RunResult>;
681
+ //#endregion
682
+ //#region node_modules/.pnpm/@rbxts+jest@3.13.3-ts.1/node_modules/@rbxts/jest/src/config.d.ts
683
+ interface ReporterConfig {
684
+ reporter: string | ModuleScript;
685
+ options?: Record<string, any>;
686
+ }
687
+ type Argv = Partial<{
688
+ all: boolean;
689
+ automock: boolean;
690
+ bail: boolean | number;
691
+ changedSince: string;
692
+ ci: boolean;
693
+ clearCache: boolean;
694
+ clearMocks: boolean;
695
+ color: boolean;
696
+ colors: boolean;
697
+ config: string;
698
+ coverage: boolean;
699
+ debug: boolean;
700
+ env: string;
701
+ expand: boolean;
702
+ globals: string;
703
+ init: boolean;
704
+ injectGlobals: boolean;
705
+ json: boolean;
706
+ maxWorkers: number | string;
707
+ noStackTrace: boolean;
708
+ outputFile: string;
709
+ preset: string | undefined;
710
+ projects: Array<string>;
711
+ reporters: Array<string | ModuleScript | ReporterConfig>;
712
+ resetMocks: boolean;
713
+ resetModules: boolean;
714
+ restoreMocks: boolean;
715
+ rootDir: Instance;
716
+ roots: Array<string>;
717
+ runInBand: boolean;
718
+ selectProjects: Array<string>;
719
+ setupFiles: Array<ModuleScript>;
720
+ setupFilesAfterEnv: Array<ModuleScript>;
721
+ showConfig: boolean;
722
+ silent: boolean;
723
+ snapshotSerializers: Array<string>;
724
+ testEnvironment: string;
725
+ testEnvironmentOptions: string;
726
+ testFailureExitCode: string | undefined;
727
+ testMatch: Array<string>;
728
+ testNamePattern: string;
729
+ testPathIgnorePatterns: Array<string>;
730
+ testPathPattern: Array<string>;
731
+ testRegex: string | Array<string>;
732
+ testTimeout: number | undefined;
733
+ timers: string;
734
+ updateSnapshot: boolean;
735
+ verbose: boolean;
736
+ version: boolean;
737
+ }>;
738
+ //#endregion
220
739
  //#region src/test-script.d.ts
221
740
  type JestArgv = Argv & {
222
741
  snapshotFormat?: SnapshotFormatOptions;
@@ -550,4 +1069,4 @@ declare function visitExpression(expression: AstExpr, visitor: LuauVisitor): voi
550
1069
  declare function visitStatement(statement: AstStat, visitor: LuauVisitor): void;
551
1070
  declare function visitBlock(block: AstStatBlock, visitor: LuauVisitor): void; //#endregion
552
1071
  //#endregion
553
- export { type AstExpr, type AstExprBinary, type AstExprCall, type AstExprFunction, type AstStat, type AstStatBlock, type Backend, type BackendOptions, type CliOptions, type Config, type ConfigInput, DEFAULT_CONFIG, type DisplayName, type ExecuteOptions, type ExecuteResult, type FormatOutputOptions, type FormatterEntry, type GameOutputEntry, type GitHubActionsFormatterOptions, type InlineProjectConfig, type JestArgv, type JestResult, type LuauSpan, type LuauVisitor, OpenCloudBackend, type ProjectEntry, type ProjectTestConfig, ROOT_ONLY_KEYS, type ResolvedConfig, type ResolvedProjectConfig, StudioBackend, type TestCaseResult, type TestDefinition, type TestFileResult, type TestStatus, type TscErrorInfo, type TypecheckOptions, buildJestArgv, createOpenCloudBackend, createStudioBackend, defineConfig, defineProject, execute, extractJsonFromOutput, formatAnnotations, formatExecuteOutput, formatFailure, formatGameOutputNotice, formatJobSummary, formatJson, formatResult, formatTestSummary, generateTestScript, loadConfig, parseGameOutput, parseJestOutput, resolveConfig, runTypecheck, visitBlock, visitExpression, visitStatement, writeGameOutput, writeJsonFile };
1072
+ export { type AstExpr, type AstExprBinary, type AstExprCall, type AstExprFunction, type AstStat, type AstStatBlock, type Backend, type BackendOptions, type CliOptions, type Config, type ConfigInput, DEFAULT_CONFIG, type DisplayName, type ExecuteResult, type FormatOutputOptions, type FormatterEntry, GLOBAL_TEST_KEYS, type GameOutputEntry, type GitHubActionsFormatterOptions, type GlobalTestConfig, type InlineProjectConfig, JEST_ARGV_EXCLUDED_KEYS, type JestArgv, type JestResult, type LuauSpan, type LuauVisitor, type MultiProjectMerged, type MultiRunResult, OpenCloudBackend, type ProjectEntry, type ProjectInput, type ProjectResult, type ProjectTestConfig, ROOT_CLI_KEYS, type ResolvedConfig, type ResolvedProjectConfig, type RunMode, type RunOptions, type RunProjectsOptions, type RunProjectsResult, type RunResult, SHARED_TEST_KEYS, type SharedTestConfig, type SingleRunResult, StudioBackend, type TestCaseResult, type TestDefinition, type TestFileResult, type TestStatus, type TscErrorInfo, type TypecheckOptions, type WorkspaceConfig, type WorkspaceRunResult, buildJestArgv, createOpenCloudBackend, createStudioBackend, defineConfig, defineProject, extractJsonFromOutput, formatAnnotations, formatExecuteOutput, formatFailure, formatGameOutputNotice, formatJobSummary, formatJson, formatResult, formatTestSummary, generateTestScript, loadConfig, parseGameOutput, parseJestOutput, resolveConfig, runJestRoblox, runProjects, runTypecheck, visitBlock, visitExpression, visitStatement, writeGameOutput, writeJsonFile };
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import { B as createOpenCloudBackend, C as formatFailure, E as formatTestSummary, F as loadConfig, H as generateTestScript, I as resolveConfig, K as defineConfig, L as StudioBackend, Q as parseJestOutput, R as createStudioBackend, T as formatResult, U as DEFAULT_CONFIG, V as buildJestArgv, W as ROOT_ONLY_KEYS, Z as extractJsonFromOutput, a as formatAnnotations, b as formatJson, c as visitBlock, f as execute, i as runTypecheck, l as visitExpression, m as formatExecuteOutput, n as parseGameOutput, o as formatJobSummary, q as defineProject, r as writeGameOutput, t as formatGameOutputNotice, u as visitStatement, x as writeJsonFile, z as OpenCloudBackend } from "./game-output-CCPIQMWm.mjs";
2
- export { DEFAULT_CONFIG, OpenCloudBackend, ROOT_ONLY_KEYS, StudioBackend, buildJestArgv, createOpenCloudBackend, createStudioBackend, defineConfig, defineProject, execute, extractJsonFromOutput, formatAnnotations, formatExecuteOutput, formatFailure, formatGameOutputNotice, formatJobSummary, formatJson, formatResult, formatTestSummary, generateTestScript, loadConfig, parseGameOutput, parseJestOutput, resolveConfig, runTypecheck, visitBlock, visitExpression, visitStatement, writeGameOutput, writeJsonFile };
1
+ import { B as defineProject, C as formatFailure, F as JEST_ARGV_EXCLUDED_KEYS, I as ROOT_CLI_KEYS, L as SHARED_TEST_KEYS, M as resolveConfig, N as DEFAULT_CONFIG, O as extractJsonFromOutput, P as GLOBAL_TEST_KEYS, S as writeJsonFile, T as formatTestSummary, _ as runProjects, a as visitStatement, b as writeGameOutput, c as OpenCloudBackend, d as generateTestScript, g as formatExecuteOutput, h as formatJobSummary, i as visitExpression, j as loadConfig, k as parseJestOutput, l as createOpenCloudBackend, m as formatAnnotations, n as runTypecheck, o as StudioBackend, r as visitBlock, s as createStudioBackend, t as runJestRoblox, u as buildJestArgv, v as formatGameOutputNotice, w as formatResult, x as formatJson, y as parseGameOutput, z as defineConfig } from "./run-BEUPi80L.mjs";
2
+ export { DEFAULT_CONFIG, GLOBAL_TEST_KEYS, JEST_ARGV_EXCLUDED_KEYS, OpenCloudBackend, ROOT_CLI_KEYS, SHARED_TEST_KEYS, StudioBackend, buildJestArgv, createOpenCloudBackend, createStudioBackend, defineConfig, defineProject, extractJsonFromOutput, formatAnnotations, formatExecuteOutput, formatFailure, formatGameOutputNotice, formatJobSummary, formatJson, formatResult, formatTestSummary, generateTestScript, loadConfig, parseGameOutput, parseJestOutput, resolveConfig, runJestRoblox, runProjects, runTypecheck, visitBlock, visitExpression, visitStatement, writeGameOutput, writeJsonFile };