@voltkit/volt-test 0.1.2

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 (52) hide show
  1. package/dist/artifacts.d.ts +18 -0
  2. package/dist/artifacts.js +109 -0
  3. package/dist/artifacts.js.map +1 -0
  4. package/dist/config.d.ts +16 -0
  5. package/dist/config.js +154 -0
  6. package/dist/config.js.map +1 -0
  7. package/dist/drivers/file-dialog.d.ts +22 -0
  8. package/dist/drivers/file-dialog.js +119 -0
  9. package/dist/drivers/file-dialog.js.map +1 -0
  10. package/dist/drivers/index.d.ts +6 -0
  11. package/dist/drivers/index.js +4 -0
  12. package/dist/drivers/index.js.map +1 -0
  13. package/dist/drivers/menu.d.ts +17 -0
  14. package/dist/drivers/menu.js +34 -0
  15. package/dist/drivers/menu.js.map +1 -0
  16. package/dist/drivers/tray.d.ts +13 -0
  17. package/dist/drivers/tray.js +27 -0
  18. package/dist/drivers/tray.js.map +1 -0
  19. package/dist/fs.d.ts +9 -0
  20. package/dist/fs.js +49 -0
  21. package/dist/fs.js.map +1 -0
  22. package/dist/index.d.ts +9 -0
  23. package/dist/index.js +7 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/launcher.d.ts +42 -0
  26. package/dist/launcher.js +172 -0
  27. package/dist/launcher.js.map +1 -0
  28. package/dist/path.d.ts +1 -0
  29. package/dist/path.js +11 -0
  30. package/dist/path.js.map +1 -0
  31. package/dist/process.d.ts +10 -0
  32. package/dist/process.js +71 -0
  33. package/dist/process.js.map +1 -0
  34. package/dist/runner.d.ts +11 -0
  35. package/dist/runner.js +230 -0
  36. package/dist/runner.js.map +1 -0
  37. package/dist/suites/hello-world.d.ts +15 -0
  38. package/dist/suites/hello-world.js +139 -0
  39. package/dist/suites/hello-world.js.map +1 -0
  40. package/dist/suites/index.d.ts +2 -0
  41. package/dist/suites/index.js +3 -0
  42. package/dist/suites/index.js.map +1 -0
  43. package/dist/suites/ipc-demo.d.ts +26 -0
  44. package/dist/suites/ipc-demo.js +287 -0
  45. package/dist/suites/ipc-demo.js.map +1 -0
  46. package/dist/types.d.ts +48 -0
  47. package/dist/types.js +2 -0
  48. package/dist/types.js.map +1 -0
  49. package/dist/window.d.ts +13 -0
  50. package/dist/window.js +65 -0
  51. package/dist/window.js.map +1 -0
  52. package/package.json +36 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { VoltTestSuite } from '../types.js';
2
+ export interface HelloWorldSmokeSuiteOptions {
3
+ name?: string;
4
+ projectDir?: string;
5
+ timeoutMs?: number;
6
+ }
7
+ export interface HelloWorldSmokePayload {
8
+ ok: boolean;
9
+ heading: string;
10
+ ping: {
11
+ pong: number;
12
+ };
13
+ durationMs: number;
14
+ }
15
+ export declare function createHelloWorldSmokeSuite(options?: HelloWorldSmokeSuiteOptions): VoltTestSuite;
@@ -0,0 +1,139 @@
1
+ import { existsSync, rmSync, writeFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { VoltAppLauncher } from '../launcher.js';
4
+ const RESULT_FILE = '.volt-smoke-result.json';
5
+ export function createHelloWorldSmokeSuite(options = {}) {
6
+ const name = options.name ?? 'hello-world-smoke';
7
+ const projectDir = options.projectDir ?? 'examples/hello-world';
8
+ const timeoutMs = options.timeoutMs ?? 120_000;
9
+ return {
10
+ name,
11
+ timeoutMs,
12
+ async run(context) {
13
+ const launcher = new VoltAppLauncher({
14
+ repoRoot: context.repoRoot,
15
+ cliEntryPath: context.cliEntryPath,
16
+ logger: context.logger,
17
+ });
18
+ await launcher.run({
19
+ sourceProjectDir: projectDir,
20
+ resultFile: RESULT_FILE,
21
+ timeoutMs: context.timeoutMs,
22
+ prepareProject: prepareHelloWorldSmokeProject,
23
+ validatePayload: validateHelloWorldPayload,
24
+ artifactsDir: context.artifactsDir,
25
+ });
26
+ await context.captureScreenshot(`${name}-post-run`);
27
+ },
28
+ };
29
+ }
30
+ function prepareHelloWorldSmokeProject(projectDir) {
31
+ writeFileSync(join(projectDir, 'src', 'backend.ts'), HELLO_WORLD_BACKEND_SOURCE, 'utf8');
32
+ writeFileSync(join(projectDir, 'src', 'main.ts'), HELLO_WORLD_FRONTEND_SOURCE, 'utf8');
33
+ const tsConfigPath = join(projectDir, 'volt.config.ts');
34
+ if (existsSync(tsConfigPath)) {
35
+ rmSync(tsConfigPath, { force: true });
36
+ }
37
+ writeFileSync(join(projectDir, 'volt.config.mjs'), HELLO_WORLD_CONFIG_SOURCE, 'utf8');
38
+ }
39
+ function validateHelloWorldPayload(payload) {
40
+ const value = asRecord(payload);
41
+ if (!value) {
42
+ throw new Error('[volt:test] hello-world smoke payload must be an object.');
43
+ }
44
+ if (value.ok !== true) {
45
+ throw new Error(`[volt:test] hello-world smoke failed: ${JSON.stringify(payload)}`);
46
+ }
47
+ const heading = value.heading;
48
+ if (typeof heading !== 'string' || heading.trim().length === 0) {
49
+ throw new Error('[volt:test] hello-world smoke payload missing heading text.');
50
+ }
51
+ const ping = asRecord(value.ping);
52
+ if (!ping || typeof ping.pong !== 'number') {
53
+ throw new Error('[volt:test] hello-world smoke payload missing ping.pong number.');
54
+ }
55
+ const durationMs = value.durationMs;
56
+ if (typeof durationMs !== 'number' || !Number.isFinite(durationMs) || durationMs < 0) {
57
+ throw new Error('[volt:test] hello-world smoke payload missing durationMs number.');
58
+ }
59
+ return {
60
+ ok: true,
61
+ heading,
62
+ ping: { pong: ping.pong },
63
+ durationMs,
64
+ };
65
+ }
66
+ function asRecord(value) {
67
+ if (!value || typeof value !== 'object') {
68
+ return null;
69
+ }
70
+ return value;
71
+ }
72
+ const HELLO_WORLD_BACKEND_SOURCE = `
73
+ import { ipcMain } from 'volt:ipc';
74
+ import * as voltFs from 'volt:fs';
75
+ import * as voltWindow from 'volt:window';
76
+
77
+ const RESULT_FILE = '.volt-smoke-result.json';
78
+
79
+ ipcMain.handle('ping', () => ({ pong: Date.now() }));
80
+
81
+ ipcMain.handle('smoke:complete', async (payload) => {
82
+ await voltFs.writeFile(RESULT_FILE, JSON.stringify(payload));
83
+ setTimeout(() => {
84
+ voltWindow.quit();
85
+ }, 50);
86
+ return { ok: true };
87
+ });
88
+ `.trimStart();
89
+ const HELLO_WORLD_FRONTEND_SOURCE = `
90
+ interface VoltBridge {
91
+ invoke(method: string, args?: unknown): Promise<unknown>;
92
+ }
93
+
94
+ declare global {
95
+ interface Window {
96
+ __volt__?: VoltBridge;
97
+ }
98
+ }
99
+
100
+ async function runSmoke(): Promise<void> {
101
+ const bridge = window.__volt__;
102
+ if (!bridge?.invoke) {
103
+ throw new Error('window.__volt__.invoke is unavailable');
104
+ }
105
+
106
+ const startedAt = Date.now();
107
+ try {
108
+ const heading = document.querySelector('h1')?.textContent ?? '';
109
+ const ping = await bridge.invoke('ping');
110
+ await bridge.invoke('smoke:complete', {
111
+ ok: true,
112
+ heading,
113
+ ping,
114
+ durationMs: Date.now() - startedAt,
115
+ });
116
+ } catch (error) {
117
+ await bridge.invoke('smoke:complete', {
118
+ ok: false,
119
+ error: error instanceof Error ? error.message : String(error),
120
+ });
121
+ }
122
+ }
123
+
124
+ void runSmoke();
125
+ `.trimStart();
126
+ const HELLO_WORLD_CONFIG_SOURCE = `
127
+ export default {
128
+ name: 'Hello World',
129
+ version: '0.1.0',
130
+ backend: './src/backend.ts',
131
+ permissions: ['fs'],
132
+ window: {
133
+ width: 800,
134
+ height: 600,
135
+ title: 'Hello Volt!',
136
+ },
137
+ };
138
+ `.trimStart();
139
+ //# sourceMappingURL=hello-world.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hello-world.js","sourceRoot":"","sources":["../../src/suites/hello-world.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { createHelloWorldSmokeSuite, type HelloWorldSmokePayload, type HelloWorldSmokeSuiteOptions, } from './hello-world.js';
2
+ export { createIpcDemoSmokeSuite, type IpcDemoSmokePayload, type IpcDemoSmokeSuiteOptions, } from './ipc-demo.js';
@@ -0,0 +1,3 @@
1
+ export { createHelloWorldSmokeSuite, } from './hello-world.js';
2
+ export { createIpcDemoSmokeSuite, } from './ipc-demo.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/suites/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,GAG3B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,uBAAuB,GAGxB,MAAM,eAAe,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { type AutomationEvent } from '../drivers/index.js';
2
+ import type { VoltTestSuite } from '../types.js';
3
+ export interface IpcDemoSmokeSuiteOptions {
4
+ name?: string;
5
+ projectDir?: string;
6
+ timeoutMs?: number;
7
+ }
8
+ export interface IpcDemoSmokePayload {
9
+ ok: boolean;
10
+ ping: {
11
+ pong: number;
12
+ };
13
+ echo: {
14
+ message: string;
15
+ sentAt: string;
16
+ };
17
+ compute: {
18
+ sum: number;
19
+ product: number;
20
+ };
21
+ nativeSetup: unknown;
22
+ status: unknown;
23
+ dbList: unknown;
24
+ events: AutomationEvent[];
25
+ }
26
+ export declare function createIpcDemoSmokeSuite(options?: IpcDemoSmokeSuiteOptions): VoltTestSuite;
@@ -0,0 +1,287 @@
1
+ import { readFileSync, rmSync, writeFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { MenuAutomationDriver, TrayAutomationDriver } from '../drivers/index.js';
4
+ import { VoltAppLauncher } from '../launcher.js';
5
+ import { assertWindowReady, parseWindowStatus } from '../window.js';
6
+ const RESULT_FILE = '.volt-smoke-result.json';
7
+ export function createIpcDemoSmokeSuite(options = {}) {
8
+ const name = options.name ?? 'ipc-demo-smoke';
9
+ const projectDir = options.projectDir ?? 'examples/ipc-demo';
10
+ const timeoutMs = options.timeoutMs ?? 120_000;
11
+ return {
12
+ name,
13
+ timeoutMs,
14
+ async run(context) {
15
+ const launcher = new VoltAppLauncher({
16
+ repoRoot: context.repoRoot,
17
+ cliEntryPath: context.cliEntryPath,
18
+ logger: context.logger,
19
+ });
20
+ const menuDriver = new MenuAutomationDriver();
21
+ const trayDriver = new TrayAutomationDriver();
22
+ const payload = await launcher.run({
23
+ sourceProjectDir: projectDir,
24
+ resultFile: RESULT_FILE,
25
+ timeoutMs: context.timeoutMs,
26
+ prepareProject: prepareIpcDemoSmokeProject,
27
+ validatePayload: validateIpcDemoPayload,
28
+ artifactsDir: context.artifactsDir,
29
+ });
30
+ const menuSetup = menuDriver.parseSetupPayload(payload.nativeSetup);
31
+ const traySetup = trayDriver.parseSetupPayload(payload.nativeSetup);
32
+ const windowStatus = parseWindowStatus(payload.status);
33
+ if (!menuSetup.shortcutRegistered) {
34
+ context.logger.warn('[volt:test] ipc-demo shortcut registration failed (accepted in headless CI).');
35
+ }
36
+ if (!traySetup.trayReady) {
37
+ context.logger.warn('[volt:test] ipc-demo tray setup reported trayReady=false (accepted in headless CI).');
38
+ }
39
+ const menuClicks = menuDriver.countClickEvents(payload.events);
40
+ const trayClicks = trayDriver.countClickEvents(payload.events);
41
+ assertWindowReady(windowStatus, 1);
42
+ context.logger.log(`[volt:test] ipc-demo event summary: menuClicks=${menuClicks}, trayClicks=${trayClicks}, totalEvents=${payload.events.length}`);
43
+ await context.captureScreenshot(`${name}-post-run`);
44
+ },
45
+ };
46
+ }
47
+ function prepareIpcDemoSmokeProject(projectDir) {
48
+ const backendPath = join(projectDir, 'src', 'backend.ts');
49
+ const backendSource = readFileSync(backendPath, 'utf8');
50
+ writeFileSync(backendPath, patchBackendForSmoke(backendSource), 'utf8');
51
+ const tsConfigPath = join(projectDir, 'volt.config.ts');
52
+ rmSync(tsConfigPath, { force: true });
53
+ writeFileSync(join(projectDir, 'volt.config.mjs'), IPC_DEMO_SMOKE_CONFIG_SOURCE, 'utf8');
54
+ const mainPath = join(projectDir, 'src', 'main.ts');
55
+ writeFileSync(mainPath, IPC_DEMO_FRONTEND_SMOKE_SOURCE, 'utf8');
56
+ }
57
+ function validateIpcDemoPayload(payload) {
58
+ const value = asRecord(payload);
59
+ if (!value) {
60
+ throw new Error('[volt:test] ipc-demo smoke payload must be an object.');
61
+ }
62
+ if (value.ok !== true) {
63
+ throw new Error(`[volt:test] ipc-demo smoke failed: ${JSON.stringify(payload)}`);
64
+ }
65
+ const ping = asRecord(value.ping);
66
+ if (!ping || typeof ping.pong !== 'number') {
67
+ throw new Error('[volt:test] ipc-demo smoke payload missing ping.pong number.');
68
+ }
69
+ const echo = asRecord(value.echo);
70
+ if (!echo || typeof echo.message !== 'string' || typeof echo.sentAt !== 'string') {
71
+ throw new Error('[volt:test] ipc-demo smoke payload missing echo object.');
72
+ }
73
+ const compute = asRecord(value.compute);
74
+ const computeSum = compute?.sum;
75
+ const computeProduct = compute?.product;
76
+ if (!compute
77
+ || typeof computeSum !== 'number'
78
+ || typeof computeProduct !== 'number'
79
+ || computeSum !== 23
80
+ || computeProduct !== 42) {
81
+ throw new Error('[volt:test] ipc-demo smoke payload has invalid compute result.');
82
+ }
83
+ const events = normalizeEvents(value.events);
84
+ if (events.length === 0) {
85
+ throw new Error('[volt:test] ipc-demo smoke payload must include at least one native event.');
86
+ }
87
+ const dbList = value.dbList;
88
+ if (!Array.isArray(dbList) || dbList.length === 0) {
89
+ throw new Error('[volt:test] ipc-demo smoke payload expected non-empty dbList.');
90
+ }
91
+ return {
92
+ ok: true,
93
+ ping: { pong: ping.pong },
94
+ echo: {
95
+ message: echo.message,
96
+ sentAt: echo.sentAt,
97
+ },
98
+ compute: {
99
+ sum: computeSum,
100
+ product: computeProduct,
101
+ },
102
+ nativeSetup: value.nativeSetup,
103
+ status: value.status,
104
+ dbList,
105
+ events,
106
+ };
107
+ }
108
+ function normalizeEvents(value) {
109
+ if (!Array.isArray(value)) {
110
+ return [];
111
+ }
112
+ return value
113
+ .map((entry) => {
114
+ const record = asRecord(entry);
115
+ if (!record || typeof record.event !== 'string') {
116
+ return null;
117
+ }
118
+ return {
119
+ event: record.event,
120
+ payload: record.payload,
121
+ };
122
+ })
123
+ .filter((entry) => entry !== null);
124
+ }
125
+ function patchBackendForSmoke(source) {
126
+ let next = source;
127
+ const fsImport = "import * as voltFs from 'volt:fs';";
128
+ if (!next.includes(fsImport)) {
129
+ const anchorImport = "import * as voltEvents from 'volt:events';";
130
+ if (!next.includes(anchorImport)) {
131
+ throw new Error('[volt:test] failed to patch ipc-demo backend: expected voltEvents import anchor.');
132
+ }
133
+ next = next.replace(anchorImport, `${anchorImport}\n${fsImport}`);
134
+ }
135
+ if (next.includes("ipcMain.handle('smoke:complete'")) {
136
+ return next;
137
+ }
138
+ return `${next.trimEnd()}
139
+
140
+ const IPC_DEMO_SMOKE_RESULT_FILE = '.volt-smoke-result.json';
141
+
142
+ ipcMain.handle('smoke:complete', async (payload: unknown) => {
143
+ await voltFs.writeFile(IPC_DEMO_SMOKE_RESULT_FILE, JSON.stringify(payload));
144
+ setTimeout(() => {
145
+ voltWindow.quit();
146
+ }, 50);
147
+ return { ok: true };
148
+ });
149
+ `;
150
+ }
151
+ function asRecord(value) {
152
+ if (!value || typeof value !== 'object') {
153
+ return null;
154
+ }
155
+ return value;
156
+ }
157
+ const IPC_DEMO_SMOKE_CONFIG_SOURCE = `
158
+ export default {
159
+ name: 'IPC Demo',
160
+ version: '0.1.0',
161
+ backend: './src/backend.ts',
162
+ window: {
163
+ width: 980,
164
+ height: 760,
165
+ title: 'Volt IPC Demo',
166
+ minWidth: 860,
167
+ minHeight: 640,
168
+ },
169
+ permissions: ['clipboard', 'db', 'menu', 'globalShortcut', 'tray', 'secureStorage', 'fs'],
170
+ };
171
+ `.trimStart();
172
+ const IPC_DEMO_FRONTEND_SMOKE_SOURCE = `
173
+ interface VoltBridge {
174
+ invoke(method: string, args?: unknown): Promise<unknown>;
175
+ on(event: string, callback: (payload: unknown) => void): void;
176
+ off(event: string, callback: (payload: unknown) => void): void;
177
+ }
178
+
179
+ interface AutomationEvent {
180
+ event: string;
181
+ payload: unknown;
182
+ }
183
+
184
+ declare global {
185
+ interface Window {
186
+ __volt__?: VoltBridge;
187
+ }
188
+ }
189
+
190
+ const events: AutomationEvent[] = [];
191
+
192
+ function appendEvent(event: string, payload: unknown): void {
193
+ events.push({ event, payload });
194
+ }
195
+
196
+ function bindEvent(bridge: VoltBridge, event: string): void {
197
+ bridge.on(event, (payload) => {
198
+ appendEvent(event, payload);
199
+ });
200
+ }
201
+
202
+ function asRecord(value: unknown): Record<string, unknown> | null {
203
+ if (!value || typeof value !== 'object') {
204
+ return null;
205
+ }
206
+ return value as Record<string, unknown>;
207
+ }
208
+
209
+ function sleep(milliseconds: number): Promise<void> {
210
+ return new Promise((resolve) => {
211
+ setTimeout(resolve, milliseconds);
212
+ });
213
+ }
214
+
215
+ function isWindowReadyStatus(value: unknown): boolean {
216
+ const root = asRecord(value);
217
+ const runtime = asRecord(root?.runtime);
218
+ const windowCount = runtime?.windowCount;
219
+ return typeof windowCount === 'number' && windowCount >= 1;
220
+ }
221
+
222
+ async function waitForWindowReady(bridge: VoltBridge, timeoutMs: number): Promise<unknown> {
223
+ const startedAt = Date.now();
224
+ let lastStatus: unknown = null;
225
+
226
+ while (Date.now() - startedAt <= timeoutMs) {
227
+ lastStatus = await bridge.invoke('status');
228
+ if (isWindowReadyStatus(lastStatus)) {
229
+ return lastStatus;
230
+ }
231
+ await sleep(120);
232
+ }
233
+
234
+ throw new Error(
235
+ 'timed out waiting for native-ready window status: '
236
+ + JSON.stringify(lastStatus),
237
+ );
238
+ }
239
+
240
+ async function runSmoke(): Promise<void> {
241
+ const bridge = window.__volt__;
242
+ if (!bridge?.invoke || !bridge.on) {
243
+ throw new Error('window.__volt__ bridge is unavailable');
244
+ }
245
+
246
+ bindEvent(bridge, 'demo:menu-click');
247
+ bindEvent(bridge, 'demo:tray-click');
248
+ bindEvent(bridge, 'demo:native-ready');
249
+ bindEvent(bridge, 'demo:native-error');
250
+ bindEvent(bridge, 'demo:db-updated');
251
+
252
+ try {
253
+ const readyStatus = await waitForWindowReady(bridge, 12_000);
254
+ const ping = await bridge.invoke('ping');
255
+ const echoPayload = {
256
+ message: 'smoke-echo',
257
+ sentAt: new Date().toISOString(),
258
+ };
259
+ const echo = await bridge.invoke('echo', echoPayload);
260
+ const compute = await bridge.invoke('compute', { a: 21, b: 2 });
261
+ const nativeSetup = await bridge.invoke('native:setup');
262
+ await bridge.invoke('db:add', { message: 'smoke-row' });
263
+ const dbList = await bridge.invoke('db:list');
264
+ const status = await bridge.invoke('status');
265
+
266
+ await bridge.invoke('smoke:complete', {
267
+ ok: true,
268
+ ping,
269
+ echo,
270
+ compute,
271
+ nativeSetup,
272
+ status: status ?? readyStatus,
273
+ dbList,
274
+ events,
275
+ });
276
+ } catch (error) {
277
+ await bridge.invoke('smoke:complete', {
278
+ ok: false,
279
+ error: error instanceof Error ? error.message : String(error),
280
+ events,
281
+ });
282
+ }
283
+ }
284
+
285
+ void runSmoke();
286
+ `.trimStart();
287
+ //# sourceMappingURL=ipc-demo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipc-demo.js","sourceRoot":"","sources":["../../src/suites/ipc-demo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ export interface VoltTestLogger {
2
+ log(message: string): void;
3
+ warn(message: string): void;
4
+ error(message: string): void;
5
+ }
6
+ export interface VoltTestArtifactCaptureResult {
7
+ path: string;
8
+ captured: boolean;
9
+ }
10
+ export interface VoltTestSuiteContext {
11
+ repoRoot: string;
12
+ cliEntryPath: string;
13
+ logger: VoltTestLogger;
14
+ timeoutMs: number;
15
+ suiteName: string;
16
+ attempt: number;
17
+ artifactsDir: string;
18
+ captureScreenshot(name?: string): Promise<VoltTestArtifactCaptureResult>;
19
+ }
20
+ export interface VoltTestSuite {
21
+ name: string;
22
+ timeoutMs?: number;
23
+ run(context: VoltTestSuiteContext): Promise<void>;
24
+ }
25
+ export interface VoltTestConfig {
26
+ timeoutMs?: number;
27
+ retries?: number;
28
+ artifactDir?: string;
29
+ suites: VoltTestSuite[];
30
+ }
31
+ export interface LoadedVoltTestConfig {
32
+ configPath: string;
33
+ config: VoltTestConfig;
34
+ }
35
+ export interface LoadVoltTestConfigOptions {
36
+ configPath?: string;
37
+ strict?: boolean;
38
+ }
39
+ export interface RunSuitesOptions {
40
+ cliEntryPath: string;
41
+ suiteNames?: readonly string[];
42
+ timeoutMs?: number;
43
+ retries?: number;
44
+ artifactDir?: string;
45
+ captureScreenshots?: boolean;
46
+ repoRoot?: string;
47
+ logger?: VoltTestLogger;
48
+ }
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ export interface WindowRuntimeStatus {
2
+ windowCount: number;
3
+ nativeReady: boolean;
4
+ shortcut?: string;
5
+ }
6
+ export interface WaitForWindowStatusOptions {
7
+ timeoutMs: number;
8
+ intervalMs?: number;
9
+ description?: string;
10
+ }
11
+ export declare function waitForWindowStatus(readStatus: () => Promise<unknown>, predicate: (status: WindowRuntimeStatus) => boolean, options: WaitForWindowStatusOptions): Promise<WindowRuntimeStatus>;
12
+ export declare function assertWindowReady(status: WindowRuntimeStatus, minimumWindowCount?: number): void;
13
+ export declare function parseWindowStatus(payload: unknown): WindowRuntimeStatus;
package/dist/window.js ADDED
@@ -0,0 +1,65 @@
1
+ import { setTimeout as delay } from 'node:timers/promises';
2
+ export async function waitForWindowStatus(readStatus, predicate, options) {
3
+ const timeoutMs = options.timeoutMs;
4
+ const intervalMs = options.intervalMs ?? 150;
5
+ const description = options.description ?? 'window status condition';
6
+ const startedAt = Date.now();
7
+ let lastStatus = null;
8
+ while (Date.now() - startedAt <= timeoutMs) {
9
+ const parsed = parseWindowStatus(readStatus ? await readStatus() : null);
10
+ lastStatus = parsed;
11
+ if (predicate(parsed)) {
12
+ return parsed;
13
+ }
14
+ await delay(intervalMs);
15
+ }
16
+ const lastSnapshot = lastStatus ? JSON.stringify(lastStatus) : 'none';
17
+ throw new Error(`[volt:test] timed out waiting for ${description} after ${timeoutMs}ms (last status: ${lastSnapshot}).`);
18
+ }
19
+ export function assertWindowReady(status, minimumWindowCount = 1) {
20
+ if (!Number.isInteger(minimumWindowCount) || minimumWindowCount <= 0) {
21
+ throw new Error('[volt:test] minimumWindowCount must be a positive integer.');
22
+ }
23
+ if (status.windowCount < minimumWindowCount) {
24
+ throw new Error(`[volt:test] expected at least ${minimumWindowCount} open window(s), got ${status.windowCount}.`);
25
+ }
26
+ if (!status.nativeReady) {
27
+ throw new Error('[volt:test] expected native integrations to be ready but nativeReady=false.');
28
+ }
29
+ }
30
+ export function parseWindowStatus(payload) {
31
+ const root = asRecord(payload);
32
+ if (!root) {
33
+ throw new Error('[volt:test] invalid window status payload: expected object.');
34
+ }
35
+ const runtime = asRecord(root.runtime);
36
+ if (!runtime) {
37
+ throw new Error('[volt:test] invalid window status payload: missing runtime object.');
38
+ }
39
+ const windowCountValue = runtime.windowCount;
40
+ if (typeof windowCountValue !== 'number' || !Number.isInteger(windowCountValue) || windowCountValue < 0) {
41
+ throw new Error('[volt:test] invalid window status payload: runtime.windowCount must be >= 0.');
42
+ }
43
+ const windowCount = windowCountValue;
44
+ const nativeReady = runtime.nativeReady;
45
+ if (typeof nativeReady !== 'boolean') {
46
+ throw new Error('[volt:test] invalid window status payload: runtime.nativeReady must be boolean.');
47
+ }
48
+ const shortcutValue = runtime.shortcut;
49
+ if (shortcutValue !== undefined && typeof shortcutValue !== 'string') {
50
+ throw new Error('[volt:test] invalid window status payload: runtime.shortcut must be a string when set.');
51
+ }
52
+ const shortcut = typeof shortcutValue === 'string' ? shortcutValue : undefined;
53
+ return {
54
+ windowCount,
55
+ nativeReady,
56
+ shortcut,
57
+ };
58
+ }
59
+ function asRecord(value) {
60
+ if (!value || typeof value !== 'object') {
61
+ return null;
62
+ }
63
+ return value;
64
+ }
65
+ //# sourceMappingURL=window.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"window.js","sourceRoot":"","sources":["../src/window.ts"],"names":[],"mappings":"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"}