@samsara-dev/appwright 0.9.12 → 0.9.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +24 -0
- package/dist/device/index.d.ts +3 -2
- package/dist/device/index.d.ts.map +1 -1
- package/dist/device/index.js +4 -2
- package/dist/gptDriver/index.d.ts +5 -2
- package/dist/gptDriver/index.d.ts.map +1 -1
- package/dist/gptDriver/index.js +23 -2
- package/dist/providers/awsDeviceFarm/index.d.ts.map +1 -1
- package/dist/providers/awsDeviceFarm/index.js +1 -1
- package/dist/providers/browserstack/index.d.ts.map +1 -1
- package/dist/providers/browserstack/index.js +1 -1
- package/dist/providers/emulator/index.d.ts.map +1 -1
- package/dist/providers/emulator/index.js +1 -1
- package/dist/providers/lambdatest/index.d.ts.map +1 -1
- package/dist/providers/lambdatest/index.js +1 -1
- package/dist/providers/local/index.d.ts.map +1 -1
- package/dist/providers/local/index.js +1 -1
- package/dist/tests/gptDriver.spec.d.ts +2 -0
- package/dist/tests/gptDriver.spec.d.ts.map +1 -0
- package/dist/tests/gptDriver.spec.js +131 -0
- package/dist/types/index.d.ts +15 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,29 @@
|
|
|
1
1
|
# appwright
|
|
2
2
|
|
|
3
|
+
## 0.9.15
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 7e70815: Fix stale testId in GPT Driver when using persistent device fixtures
|
|
8
|
+
|
|
9
|
+
Update testId on the cached gpt-driver-node instance before every API call
|
|
10
|
+
so persistent device fixtures (scope: "worker") report the correct test in
|
|
11
|
+
GPT Driver sessions. Previously the testId was baked in on first use and
|
|
12
|
+
never updated, causing all subsequent tests and resetToHome teardowns to
|
|
13
|
+
report the same stale testId on the MobileBoost dashboard.
|
|
14
|
+
|
|
15
|
+
## 0.9.14
|
|
16
|
+
|
|
17
|
+
### Patch Changes
|
|
18
|
+
|
|
19
|
+
- c7b7722: Switch GPT Driver cachingMode from FULL_SCREEN to INTERACTION_REGION
|
|
20
|
+
|
|
21
|
+
## 0.9.13
|
|
22
|
+
|
|
23
|
+
### Patch Changes
|
|
24
|
+
|
|
25
|
+
- 1148964: Upgrade gpt-driver-node to ^1.0.8 and expose additionalUserContext config option for passing app-specific context to GPT Driver AI
|
|
26
|
+
|
|
3
27
|
## 0.9.12
|
|
4
28
|
|
|
5
29
|
### Patch Changes
|
package/dist/device/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Client as WebDriverClient } from "webdriver";
|
|
2
|
-
import { AppwrightLocator, DeviceProvider, ExtractType, IosAppSettings, IosPermissionSettings, Platform, TimeoutOptions, VisualTraceConfig } from "../types";
|
|
2
|
+
import { AppwrightLocator, DeviceProvider, ExtractType, GptDriverConfig, IosAppSettings, IosPermissionSettings, Platform, TimeoutOptions, VisualTraceConfig } from "../types";
|
|
3
3
|
import { type AiExecuteOptions } from "../gptDriver";
|
|
4
4
|
import { z } from "zod";
|
|
5
5
|
import { LLMModel } from "@empiricalrun/llm";
|
|
@@ -12,13 +12,14 @@ export declare class Device {
|
|
|
12
12
|
private bundleId;
|
|
13
13
|
private timeoutOpts;
|
|
14
14
|
private provider;
|
|
15
|
+
private gptDriverOptions?;
|
|
15
16
|
private visualTraceService?;
|
|
16
17
|
private deviceProvider?;
|
|
17
18
|
private persistentSyncEnabled;
|
|
18
19
|
private activePersistentKey?;
|
|
19
20
|
private cleanupCallback?;
|
|
20
21
|
private _gptDriverProvider;
|
|
21
|
-
constructor(webDriverClient: WebDriverClient, bundleId: string | undefined, timeoutOpts: TimeoutOptions, provider: string, deviceProvider?: DeviceProvider, cleanupCallback?: () => Promise<void
|
|
22
|
+
constructor(webDriverClient: WebDriverClient, bundleId: string | undefined, timeoutOpts: TimeoutOptions, provider: string, deviceProvider?: DeviceProvider, cleanupCallback?: () => Promise<void>, gptDriverOptions?: GptDriverConfig | undefined);
|
|
22
23
|
attachDeviceProvider(provider: DeviceProvider): void;
|
|
23
24
|
enablePersistentStatusSync(): void;
|
|
24
25
|
ensurePersistentLifecycle(testInfo: TestInfo): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/device/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,IAAI,eAAe,EAAE,MAAM,WAAW,CAAC;AAE3D,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,cAAc,EACd,qBAAqB,EACrB,QAAQ,EACR,cAAc,EACd,iBAAiB,EAClB,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,KAAK,gBAAgB,EAAqB,MAAM,cAAc,CAAC;AAIxE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAO7C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,KAAK,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7E,qBAAa,MAAM;IASf,OAAO,CAAC,eAAe;IACvB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,QAAQ;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/device/index.ts"],"names":[],"mappings":"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"}
|
package/dist/device/index.js
CHANGED
|
@@ -100,17 +100,19 @@ let Device = (() => {
|
|
|
100
100
|
bundleId;
|
|
101
101
|
timeoutOpts;
|
|
102
102
|
provider;
|
|
103
|
+
gptDriverOptions;
|
|
103
104
|
visualTraceService;
|
|
104
105
|
deviceProvider;
|
|
105
106
|
persistentSyncEnabled = false;
|
|
106
107
|
activePersistentKey;
|
|
107
108
|
cleanupCallback;
|
|
108
109
|
_gptDriverProvider = null;
|
|
109
|
-
constructor(webDriverClient, bundleId, timeoutOpts, provider, deviceProvider, cleanupCallback) {
|
|
110
|
+
constructor(webDriverClient, bundleId, timeoutOpts, provider, deviceProvider, cleanupCallback, gptDriverOptions) {
|
|
110
111
|
this.webDriverClient = webDriverClient;
|
|
111
112
|
this.bundleId = bundleId;
|
|
112
113
|
this.timeoutOpts = timeoutOpts;
|
|
113
114
|
this.provider = provider;
|
|
115
|
+
this.gptDriverOptions = gptDriverOptions;
|
|
114
116
|
this.deviceProvider = deviceProvider;
|
|
115
117
|
this.cleanupCallback = cleanupCallback;
|
|
116
118
|
}
|
|
@@ -223,7 +225,7 @@ let Device = (() => {
|
|
|
223
225
|
};
|
|
224
226
|
gptDriverProvider() {
|
|
225
227
|
if (!this._gptDriverProvider) {
|
|
226
|
-
this._gptDriverProvider = new gptDriver_1.GptDriverProvider(this.webDriverClient);
|
|
228
|
+
this._gptDriverProvider = new gptDriver_1.GptDriverProvider(this.webDriverClient, this.gptDriverOptions);
|
|
227
229
|
}
|
|
228
230
|
return this._gptDriverProvider;
|
|
229
231
|
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import type { Client as WebDriverClient } from "webdriver";
|
|
2
|
+
import type { GptDriverConfig } from "../types";
|
|
2
3
|
/**
|
|
3
4
|
* Options for aiExecute. Intentionally exposes only appiumHandler;
|
|
4
|
-
* cachingMode is set globally at provider init (
|
|
5
|
+
* cachingMode is set globally at provider init (INTERACTION_REGION),
|
|
5
6
|
* and useSmartLoop is not yet surfaced.
|
|
6
7
|
*/
|
|
7
8
|
export interface AiExecuteOptions {
|
|
@@ -29,8 +30,10 @@ export interface GptDriverApi {
|
|
|
29
30
|
*/
|
|
30
31
|
export declare class GptDriverProvider implements GptDriverApi {
|
|
31
32
|
private webDriverClient;
|
|
33
|
+
private options?;
|
|
32
34
|
private driver;
|
|
33
|
-
|
|
35
|
+
private testIdWarned;
|
|
36
|
+
constructor(webDriverClient: WebDriverClient, options?: GptDriverConfig | undefined);
|
|
34
37
|
private getAppiumUrl;
|
|
35
38
|
private getDriver;
|
|
36
39
|
private requireDriver;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/gptDriver/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,IAAI,eAAe,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/gptDriver/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,IAAI,eAAe,EAAE,MAAM,WAAW,CAAC;AAG3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAIhD;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1E,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAClE,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;CAC9D;AAED;;;;;;;;;GASG;AACH,qBAAa,iBAAkB,YAAW,YAAY;IAKlD,OAAO,CAAC,eAAe;IACvB,OAAO,CAAC,OAAO,CAAC;IALlB,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,YAAY,CAAS;gBAGnB,eAAe,EAAE,eAAe,EAChC,OAAO,CAAC,EAAE,eAAe,YAAA;IAGnC,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,SAAS;IA0BjB,OAAO,CAAC,aAAa;IA8BrB,OAAO,CAAC,mBAAmB;IAW3B,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,aAAa;IAMf,SAAS,CACb,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,IAAI,CAAC;IAkBV,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAaxC,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAa/C,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAajE,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAWnE"}
|
package/dist/gptDriver/index.js
CHANGED
|
@@ -75,9 +75,12 @@ let GptDriverProvider = (() => {
|
|
|
75
75
|
if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
76
76
|
}
|
|
77
77
|
webDriverClient = __runInitializers(this, _instanceExtraInitializers);
|
|
78
|
+
options;
|
|
78
79
|
driver = null;
|
|
79
|
-
|
|
80
|
+
testIdWarned = false;
|
|
81
|
+
constructor(webDriverClient, options) {
|
|
80
82
|
this.webDriverClient = webDriverClient;
|
|
83
|
+
this.options = options;
|
|
81
84
|
}
|
|
82
85
|
getAppiumUrl() {
|
|
83
86
|
const { protocol, hostname, port, path, user, key } = this.webDriverClient.options;
|
|
@@ -98,8 +101,11 @@ let GptDriverProvider = (() => {
|
|
|
98
101
|
// gpt-driver-node expects webdriverio Browser type but webdriver Client is API-compatible at runtime
|
|
99
102
|
driver: this.webDriverClient,
|
|
100
103
|
serverConfig: { url: this.getAppiumUrl() },
|
|
101
|
-
cachingMode: "
|
|
104
|
+
cachingMode: "INTERACTION_REGION",
|
|
102
105
|
testId: test_1.default.info()?.testId ?? `test-${Date.now()}`,
|
|
106
|
+
...(this.options?.additionalUserContext != null && {
|
|
107
|
+
additionalUserContext: this.options.additionalUserContext,
|
|
108
|
+
}),
|
|
103
109
|
});
|
|
104
110
|
console.debug("[GptDriver] Initialized successfully");
|
|
105
111
|
return this.driver;
|
|
@@ -110,6 +116,21 @@ let GptDriverProvider = (() => {
|
|
|
110
116
|
test_1.default.skip(true, "GPT Driver not configured. Set GPT_DRIVER_API_KEY environment variable.");
|
|
111
117
|
throw new Error("GPT Driver not configured");
|
|
112
118
|
}
|
|
119
|
+
// Update testId to current test context so persistent device fixtures
|
|
120
|
+
// report the correct test in GPT Driver API calls.
|
|
121
|
+
// gpt-driver-node declares testId as private in TS but it's a plain
|
|
122
|
+
// JS property at runtime — safe to mutate directly.
|
|
123
|
+
// TODO: Replace with public setTestId() if gpt-driver-node exposes one.
|
|
124
|
+
const currentTestId = test_1.default.info()?.testId;
|
|
125
|
+
if (currentTestId && "testId" in driver) {
|
|
126
|
+
driver.testId = currentTestId;
|
|
127
|
+
}
|
|
128
|
+
else if (currentTestId && !this.testIdWarned) {
|
|
129
|
+
console.warn("[GptDriver] Cannot update testId — property not found on driver instance. " +
|
|
130
|
+
"GPT Driver sessions may be attributed to the wrong test. " +
|
|
131
|
+
"Check if gpt-driver-node renamed or removed the testId field.");
|
|
132
|
+
this.testIdWarned = true;
|
|
133
|
+
}
|
|
113
134
|
return driver;
|
|
114
135
|
}
|
|
115
136
|
validateInstruction(instruction, methodName) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/awsDeviceFarm/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EACL,eAAe,EACf,cAAc,EAGf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AA+BtC,qBAAa,qBAAsB,YAAW,cAAc;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+B;IACvD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;IACnD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,gBAAgB,CAAC,CAAS;gBAGhC,OAAO,EAAE,WAAW,CAAC,eAAe,CAAC,EACrC,WAAW,EAAE,MAAM,GAAG,SAAS;IAwD3B,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IA8B5B,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/awsDeviceFarm/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EACL,eAAe,EACf,cAAc,EAGf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AA+BtC,qBAAa,qBAAsB,YAAW,cAAc;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+B;IACvD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;IACnD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,gBAAgB,CAAC,CAAS;gBAGhC,OAAO,EAAE,WAAW,CAAC,eAAe,CAAC,EACrC,WAAW,EAAE,MAAM,GAAG,SAAS;IAwD3B,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IA8B5B,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;IA6D5B,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAMtC,OAAO,CAAC,iBAAiB;YASX,iBAAiB;YA6CjB,uBAAuB;YAmCvB,mBAAmB;YAgCnB,oBAAoB;IA0ClC,OAAO,CAAC,iBAAiB;IAmBzB,OAAO,CAAC,iBAAiB;YA8CX,UAAU;WA4CX,aAAa,CACxB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;mBAiFnC,iBAAiB;mBA6BjB,wBAAwB;IAwB7C,OAAO,CAAC,MAAM,CAAC,oBAAoB;YAQrB,iBAAiB;CAgBhC"}
|
|
@@ -132,7 +132,7 @@ class AWSDeviceFarmProvider {
|
|
|
132
132
|
};
|
|
133
133
|
return new device_1.Device(webDriverClient, this.appBundleId, testOptions, this.project.use.device?.provider, this, async () => {
|
|
134
134
|
await this.stopRemoteSession();
|
|
135
|
-
});
|
|
135
|
+
}, this.project.use.gptDriver);
|
|
136
136
|
}
|
|
137
137
|
async syncTestDetails() {
|
|
138
138
|
// AWS Device Farm does not currently expose an API to update session metadata like name or status.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/browserstack/index.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,eAAe,EACf,cAAc,EAGf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AA0DtC,qBAAa,0BAA2B,YAAW,cAAc;IAC/D,OAAO,CAAC,cAAc,CAAC,CAA6B;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,OAAO,CAA+B;gBAG5C,OAAO,EAAE,WAAW,CAAC,eAAe,CAAC,EACrC,WAAW,EAAE,MAAM,GAAG,SAAS;IAU3B,WAAW;IA0EX,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;IAMlC,OAAO,CAAC,cAAc;YASR,YAAY;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/browserstack/index.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,eAAe,EACf,cAAc,EAGf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AA0DtC,qBAAa,0BAA2B,YAAW,cAAc;IAC/D,OAAO,CAAC,cAAc,CAAC,CAA6B;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,OAAO,CAA+B;gBAG5C,OAAO,EAAE,WAAW,CAAC,eAAe,CAAC,EACrC,WAAW,EAAE,MAAM,GAAG,SAAS;IAU3B,WAAW;IA0EX,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;IAMlC,OAAO,CAAC,cAAc;YASR,YAAY;YAoCZ,iBAAiB;YAKjB,yBAAyB;WAK1B,aAAa,CACxB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAmGlD,eAAe,CAAC,OAAO,EAAE;QAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf;IA2BD,OAAO,CAAC,YAAY;CAuLrB"}
|
|
@@ -139,7 +139,7 @@ class BrowserStackDeviceProvider {
|
|
|
139
139
|
const testOptions = {
|
|
140
140
|
expectTimeout: this.project.use.expectTimeout,
|
|
141
141
|
};
|
|
142
|
-
return new device_1.Device(webDriverClient, bundleId, testOptions, this.project.use.device?.provider, this);
|
|
142
|
+
return new device_1.Device(webDriverClient, bundleId, testOptions, this.project.use.device?.provider, this, undefined, this.project.use.gptDriver);
|
|
143
143
|
}
|
|
144
144
|
async getSessionDetails() {
|
|
145
145
|
const data = await getSessionDetails(this.sessionId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/emulator/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,cAAc,EAIf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAQtC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAI/C,qBAAa,gBAAiB,YAAW,cAAc;IAInD,OAAO,CAAC,OAAO;IAHjB,SAAS,CAAC,EAAE,MAAM,CAAC;gBAGT,OAAO,EAAE,WAAW,CAAC,eAAe,CAAC,EAC7C,WAAW,EAAE,MAAM,GAAG,SAAS;IAS3B,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;IAI5B,WAAW;YA8BH,YAAY;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/emulator/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,cAAc,EAIf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAQtC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAI/C,qBAAa,gBAAiB,YAAW,cAAc;IAInD,OAAO,CAAC,OAAO;IAHjB,SAAS,CAAC,EAAE,MAAM,CAAC;gBAGT,OAAO,EAAE,WAAW,CAAC,eAAe,CAAC,EAC7C,WAAW,EAAE,MAAM,GAAG,SAAS;IAS3B,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;IAI5B,WAAW;YA8BH,YAAY;YA2BZ,YAAY;CAuD3B"}
|
|
@@ -50,7 +50,7 @@ Follow the steps mentioned in ${androidSimulatorConfigDocLink} to run test on An
|
|
|
50
50
|
const testOptions = {
|
|
51
51
|
expectTimeout,
|
|
52
52
|
};
|
|
53
|
-
return new device_1.Device(webDriverClient, undefined, testOptions, this.project.use.device?.provider, this);
|
|
53
|
+
return new device_1.Device(webDriverClient, undefined, testOptions, this.project.use.device?.provider, this, undefined, this.project.use.gptDriver);
|
|
54
54
|
}
|
|
55
55
|
async createConfig() {
|
|
56
56
|
const platformName = this.project.use.platform;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/lambdatest/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAoB,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAwDtC,qBAAa,wBAAyB,YAAW,cAAc;IAM3D,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,WAAW;IANrB,OAAO,CAAC,cAAc,CAAC,CAA2B;IAClD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,WAAW,CAAgC;gBAGzC,OAAO,EAAE,WAAW,CAAC,eAAe,CAAC,EACrC,WAAW,EAAE,MAAM,GAAG,SAAS;IASnC,WAAW;IA8DX,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;IAMlC,OAAO,CAAC,cAAc;YASR,YAAY;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/lambdatest/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAoB,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAwDtC,qBAAa,wBAAyB,YAAW,cAAc;IAM3D,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,WAAW;IANrB,OAAO,CAAC,cAAc,CAAC,CAA2B;IAClD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,WAAW,CAAgC;gBAGzC,OAAO,EAAE,WAAW,CAAC,eAAe,CAAC,EACrC,WAAW,EAAE,MAAM,GAAG,SAAS;IASnC,WAAW;IA8DX,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;IAMlC,OAAO,CAAC,cAAc;YASR,YAAY;WAkBb,aAAa,CACxB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IA+ElD,eAAe,CAAC,OAAO,EAAE;QAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf;IA0BD,OAAO,CAAC,oBAAoB;IAuB5B,OAAO,CAAC,YAAY;CA8CrB"}
|
|
@@ -119,7 +119,7 @@ class LambdaTestDeviceProvider {
|
|
|
119
119
|
const testOptions = {
|
|
120
120
|
expectTimeout: this.project.use.expectTimeout,
|
|
121
121
|
};
|
|
122
|
-
return new device_1.Device(webDriverClient, this.appBundleId, testOptions, this.project.use.device?.provider, this);
|
|
122
|
+
return new device_1.Device(webDriverClient, this.appBundleId, testOptions, this.project.use.device?.provider, this, undefined, this.project.use.gptDriver);
|
|
123
123
|
}
|
|
124
124
|
static async downloadVideo(sessionId, outputDir, fileName) {
|
|
125
125
|
const sessionData = await getSessionDetails(sessionId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/local/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,cAAc,EAIf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAa/C,qBAAa,mBAAoB,YAAW,cAAc;IAItD,OAAO,CAAC,OAAO;IAHjB,SAAS,CAAC,EAAE,MAAM,CAAC;gBAGT,OAAO,EAAE,WAAW,CAAC,eAAe,CAAC,EAC7C,WAAW,EAAE,MAAM,GAAG,SAAS;IAS3B,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;IAI5B,WAAW;YAgBH,YAAY;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/local/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,cAAc,EAIf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAa/C,qBAAa,mBAAoB,YAAW,cAAc;IAItD,OAAO,CAAC,OAAO;IAHjB,SAAS,CAAC,EAAE,MAAM,CAAC;gBAGT,OAAO,EAAE,WAAW,CAAC,eAAe,CAAC,EAC7C,WAAW,EAAE,MAAM,GAAG,SAAS;IAS3B,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;IAI5B,WAAW;YAgBH,YAAY;YA4BZ,YAAY;CAkE3B"}
|
|
@@ -41,7 +41,7 @@ class LocalDeviceProvider {
|
|
|
41
41
|
const testOptions = {
|
|
42
42
|
expectTimeout,
|
|
43
43
|
};
|
|
44
|
-
return new device_1.Device(webDriverClient, bundleId, testOptions, this.project.use.device?.provider, this);
|
|
44
|
+
return new device_1.Device(webDriverClient, bundleId, testOptions, this.project.use.device?.provider, this, undefined, this.project.use.gptDriver);
|
|
45
45
|
}
|
|
46
46
|
async createConfig() {
|
|
47
47
|
const platformName = this.project.use.platform;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gptDriver.spec.d.ts","sourceRoot":"","sources":["../../src/tests/gptDriver.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const vitest_1 = require("vitest");
|
|
7
|
+
const test_1 = __importDefault(require("@playwright/test"));
|
|
8
|
+
// --- Mock gpt-driver-node ---
|
|
9
|
+
// vi.hoisted runs before vi.mock hoisting, so variables are available in the factory
|
|
10
|
+
const { MockGptDriver, mockAiExecute } = vitest_1.vi.hoisted(() => {
|
|
11
|
+
const mockAiExecute = vitest_1.vi.fn().mockResolvedValue(undefined);
|
|
12
|
+
// Must use function (not arrow) so it can be called with `new`
|
|
13
|
+
const MockGptDriver = vitest_1.vi.fn(function (config) {
|
|
14
|
+
this.aiExecute = mockAiExecute;
|
|
15
|
+
this.assert = vitest_1.vi.fn().mockResolvedValue(undefined);
|
|
16
|
+
this.assertBulk = vitest_1.vi.fn().mockResolvedValue(undefined);
|
|
17
|
+
this.checkBulk = vitest_1.vi.fn().mockResolvedValue({});
|
|
18
|
+
this.extract = vitest_1.vi.fn().mockResolvedValue({});
|
|
19
|
+
this.testId = config.testId;
|
|
20
|
+
});
|
|
21
|
+
return { MockGptDriver, mockAiExecute };
|
|
22
|
+
});
|
|
23
|
+
vitest_1.vi.mock("gpt-driver-node", () => ({ default: MockGptDriver }));
|
|
24
|
+
// --- Mock Playwright test helpers ---
|
|
25
|
+
let currentTestId = "test-initial";
|
|
26
|
+
test_1.default.step = vitest_1.vi.fn(async (_name, body) => await body());
|
|
27
|
+
test_1.default.info = () => currentTestId ? { testId: currentTestId } : undefined;
|
|
28
|
+
test_1.default.skip = vitest_1.vi.fn();
|
|
29
|
+
const gptDriver_1 = require("../gptDriver");
|
|
30
|
+
function createProvider() {
|
|
31
|
+
return new gptDriver_1.GptDriverProvider({
|
|
32
|
+
options: {
|
|
33
|
+
protocol: "http",
|
|
34
|
+
hostname: "localhost",
|
|
35
|
+
port: 4723,
|
|
36
|
+
path: "/wd/hub",
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
(0, vitest_1.describe)("GptDriverProvider", () => {
|
|
41
|
+
(0, vitest_1.beforeEach)(() => {
|
|
42
|
+
vitest_1.vi.clearAllMocks();
|
|
43
|
+
currentTestId = "test-initial";
|
|
44
|
+
process.env.GPT_DRIVER_API_KEY = "fake-key";
|
|
45
|
+
});
|
|
46
|
+
(0, vitest_1.afterEach)(() => {
|
|
47
|
+
delete process.env.GPT_DRIVER_API_KEY;
|
|
48
|
+
});
|
|
49
|
+
(0, vitest_1.describe)("testId tracks current test context", () => {
|
|
50
|
+
(0, vitest_1.test)("initializes testId from first call's test context", async () => {
|
|
51
|
+
const provider = createProvider();
|
|
52
|
+
currentTestId = "test-first";
|
|
53
|
+
await provider.aiExecute("login");
|
|
54
|
+
const driver = provider.driver;
|
|
55
|
+
(0, vitest_1.expect)(driver.testId).toBe("test-first");
|
|
56
|
+
});
|
|
57
|
+
(0, vitest_1.test)("updates testId when a different test uses the same device", async () => {
|
|
58
|
+
const provider = createProvider();
|
|
59
|
+
// Test A runs
|
|
60
|
+
currentTestId = "test-aaa";
|
|
61
|
+
await provider.aiExecute("tap the submit button");
|
|
62
|
+
(0, vitest_1.expect)(provider.driver.testId).toBe("test-aaa");
|
|
63
|
+
// Test B runs on the same persistent device
|
|
64
|
+
currentTestId = "test-bbb";
|
|
65
|
+
await provider.aiExecute("verify the results screen");
|
|
66
|
+
(0, vitest_1.expect)(provider.driver.testId).toBe("test-bbb");
|
|
67
|
+
});
|
|
68
|
+
(0, vitest_1.test)("fixture teardown uses the current test's ID, not the first", async () => {
|
|
69
|
+
const provider = createProvider();
|
|
70
|
+
// Test A runs
|
|
71
|
+
currentTestId = "test-aaa";
|
|
72
|
+
await provider.aiExecute("perform action");
|
|
73
|
+
// Fixture teardown runs in Test A's context
|
|
74
|
+
await provider.aiExecute("navigate back to home");
|
|
75
|
+
(0, vitest_1.expect)(provider.driver.testId).toBe("test-aaa");
|
|
76
|
+
// Test B starts with new context
|
|
77
|
+
currentTestId = "test-bbb";
|
|
78
|
+
await provider.aiExecute("perform another action");
|
|
79
|
+
(0, vitest_1.expect)(provider.driver.testId).toBe("test-bbb");
|
|
80
|
+
// Fixture teardown runs in Test B's context
|
|
81
|
+
await provider.aiExecute("navigate back to home");
|
|
82
|
+
(0, vitest_1.expect)(provider.driver.testId).toBe("test-bbb");
|
|
83
|
+
});
|
|
84
|
+
(0, vitest_1.test)("preserves testId when test.info() returns undefined", async () => {
|
|
85
|
+
const provider = createProvider();
|
|
86
|
+
currentTestId = "test-known";
|
|
87
|
+
await provider.aiExecute("do something");
|
|
88
|
+
(0, vitest_1.expect)(provider.driver.testId).toBe("test-known");
|
|
89
|
+
// Worker teardown — no test context
|
|
90
|
+
currentTestId = undefined;
|
|
91
|
+
await provider.aiExecute("cleanup");
|
|
92
|
+
(0, vitest_1.expect)(provider.driver.testId).toBe("test-known");
|
|
93
|
+
});
|
|
94
|
+
(0, vitest_1.test)("warns once if testId property is missing from driver", async () => {
|
|
95
|
+
const provider = createProvider();
|
|
96
|
+
const warnSpy = vitest_1.vi.spyOn(console, "warn").mockImplementation(() => { });
|
|
97
|
+
currentTestId = "test-aaa";
|
|
98
|
+
await provider.aiExecute("initialize");
|
|
99
|
+
// Remove testId to simulate SDK rename/removal
|
|
100
|
+
delete provider.driver.testId;
|
|
101
|
+
currentTestId = "test-bbb";
|
|
102
|
+
await provider.aiExecute("second call");
|
|
103
|
+
(0, vitest_1.expect)(warnSpy).toHaveBeenCalledTimes(1);
|
|
104
|
+
(0, vitest_1.expect)(warnSpy).toHaveBeenCalledWith(vitest_1.expect.stringContaining("Cannot update testId"));
|
|
105
|
+
// Should not warn again on subsequent calls
|
|
106
|
+
currentTestId = "test-ccc";
|
|
107
|
+
await provider.aiExecute("third call");
|
|
108
|
+
(0, vitest_1.expect)(warnSpy).toHaveBeenCalledTimes(1);
|
|
109
|
+
warnSpy.mockRestore();
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
(0, vitest_1.describe)("lazy singleton", () => {
|
|
113
|
+
(0, vitest_1.test)("creates GptDriver instance only once", async () => {
|
|
114
|
+
const provider = createProvider();
|
|
115
|
+
currentTestId = "test-1";
|
|
116
|
+
await provider.aiExecute("first");
|
|
117
|
+
currentTestId = "test-2";
|
|
118
|
+
await provider.aiExecute("second");
|
|
119
|
+
currentTestId = "test-3";
|
|
120
|
+
await provider.aiExecute("third");
|
|
121
|
+
(0, vitest_1.expect)(MockGptDriver).toHaveBeenCalledTimes(1);
|
|
122
|
+
});
|
|
123
|
+
(0, vitest_1.test)("does not create GptDriver when API key is missing", async () => {
|
|
124
|
+
delete process.env.GPT_DRIVER_API_KEY;
|
|
125
|
+
const provider = createProvider();
|
|
126
|
+
// Should call test.skip and throw
|
|
127
|
+
await (0, vitest_1.expect)(provider.aiExecute("anything")).rejects.toThrow("GPT Driver not configured");
|
|
128
|
+
(0, vitest_1.expect)(MockGptDriver).not.toHaveBeenCalled();
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
});
|
package/dist/types/index.d.ts
CHANGED
|
@@ -43,6 +43,21 @@ export type AppwrightConfig = {
|
|
|
43
43
|
buildPath: string;
|
|
44
44
|
appBundleId: string;
|
|
45
45
|
expectTimeout: number;
|
|
46
|
+
/**
|
|
47
|
+
* Configuration for the GPT Driver AI integration.
|
|
48
|
+
*/
|
|
49
|
+
gptDriver?: GptDriverConfig;
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Configuration for GPT Driver passed through to the gpt-driver-node SDK.
|
|
53
|
+
*/
|
|
54
|
+
export type GptDriverConfig = {
|
|
55
|
+
/**
|
|
56
|
+
* Additional context passed to the GPT Driver AI for every interaction.
|
|
57
|
+
* Use this to provide app-specific knowledge (e.g. AGENTS.md content)
|
|
58
|
+
* that helps the AI understand your app's UI and behavior.
|
|
59
|
+
*/
|
|
60
|
+
additionalUserContext?: string;
|
|
46
61
|
};
|
|
47
62
|
/**
|
|
48
63
|
* Configuration for Visual Trace screenshot capture
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,KAAK,EAAE,sCAAsC,EAAE,MAAM,6BAA6B,CAAC;AAC1F,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;AAEtE,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B;;OAEG;IACH,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,WAAW,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9B;;OAEG;IACH,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAE7B;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE;QAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACrB;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IAEpB,aAAa,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@samsara-dev/appwright",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.15",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"registry": "https://registry.npmjs.org/",
|
|
6
6
|
"access": "public"
|
|
@@ -48,19 +48,19 @@
|
|
|
48
48
|
"async-retry": "^1.3.3",
|
|
49
49
|
"fluent-ffmpeg": "^2.1.3",
|
|
50
50
|
"form-data": "4.0.5",
|
|
51
|
+
"gpt-driver-node": "^1.0.8",
|
|
51
52
|
"node-fetch": "^3.3.2",
|
|
52
53
|
"picocolors": "^1.1.0",
|
|
53
|
-
"webdriver": "^8.36.1"
|
|
54
|
-
"gpt-driver-node": "^1.0.6"
|
|
54
|
+
"webdriver": "^8.36.1"
|
|
55
55
|
},
|
|
56
56
|
"devDependencies": {
|
|
57
57
|
"@changesets/cli": "^2.29.8",
|
|
58
58
|
"@empiricalrun/eslint-config": "^0.5.0",
|
|
59
59
|
"@empiricalrun/typescript-config": "^0.3.0",
|
|
60
|
+
"@eslint/js": "^9.39.0",
|
|
60
61
|
"@types/async-retry": "^1.4.9",
|
|
61
62
|
"@types/fluent-ffmpeg": "^2.1.28",
|
|
62
63
|
"@types/node": "^22.5.2",
|
|
63
|
-
"@eslint/js": "^9.39.0",
|
|
64
64
|
"eslint": "9.39.2",
|
|
65
65
|
"typedoc": "0.28.15",
|
|
66
66
|
"vitest": "^4.0.16"
|