@isentinel/jest-roblox 0.2.6 → 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/README.md +234 -46
- package/dist/cli.d.mts +2 -4
- package/dist/cli.mjs +113 -2812
- package/dist/index.d.mts +559 -40
- package/dist/index.mjs +2 -2
- package/dist/run-BEUPi80L.mjs +9834 -0
- package/dist/{executor-COuwZJJX.d.mts → schema-BpjBo-Aw.d.mts} +139 -301
- package/dist/sea-entry.cjs +40211 -40255
- package/package.json +29 -25
- package/plugin/JestRobloxRunner.rbxm +0 -0
- package/plugin/plugin.project.json +1 -1
- package/plugin/src/init.server.luau +39 -0
- package/plugin/src/test-in-run-mode.server.luau +117 -2
- package/dist/game-output-CCPIQMWm.mjs +0 -3643
- package/dist/sea/jest-roblox +0 -0
- package/plugin/out/shared/entry.luau +0 -9
- package/plugin/out/shared/instance-resolver.luau +0 -88
- package/plugin/out/shared/mock/CoreScriptSyncService.luau +0 -19
- package/plugin/out/shared/mock/FileSystemService.luau +0 -30
- package/plugin/out/shared/promise.luau +0 -2006
- package/plugin/out/shared/runner.luau +0 -301
- package/plugin/out/shared/setup-timing.luau +0 -89
- package/plugin/out/shared/snapshot-patch.luau +0 -94
package/dist/index.d.mts
CHANGED
|
@@ -1,51 +1,268 @@
|
|
|
1
|
-
import {
|
|
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
|
|
4
|
+
import { StorageClient } from "@bedrock-rbx/ocale/storage";
|
|
4
5
|
|
|
5
|
-
//#region
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
-
|
|
18
|
-
|
|
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/
|
|
22
|
-
|
|
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
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
|
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
|
|
46
|
-
private
|
|
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
|
|
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
|
|
2
|
-
export { DEFAULT_CONFIG, OpenCloudBackend,
|
|
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 };
|