@qapilot/appium-module 1.0.0 → 1.1.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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # @qapilot/appium-module
2
2
 
3
- Appium W3C WebDriver module for interacting with devices across **BrowserStack**, **LambdaTest**, and **local Appium** servers. Exposes a unified `invokeCommand` API that normalizes provider-specific differences (URLs, auth headers, capability formats) behind a single interface.
3
+ A unified Appium W3C WebDriver client for **BrowserStack**, **LambdaTest**, and **local Appium** servers. One `invokeCommand` API, any provider, full TypeScript support.
4
4
 
5
5
  ## Installation
6
6
 
@@ -8,22 +8,21 @@ Appium W3C WebDriver module for interacting with devices across **BrowserStack**
8
8
  npm install @qapilot/appium-module
9
9
  ```
10
10
 
11
- If you plan to use the built-in HTTP server mode, also install `express`:
11
+ No additional `@types` package is needed types are bundled with the package.
12
12
 
13
- ```bash
14
- npm install express
15
- ```
13
+ ---
16
14
 
17
15
  ## Usage
18
16
 
19
- ### Programmatic (library mode)
20
-
21
- Import `invokeCommand` and call any W3C WebDriver command against any supported provider.
17
+ Import `invokeCommand` and call any supported command against any provider.
22
18
 
23
19
  ```typescript
24
20
  import { invokeCommand } from '@qapilot/appium-module';
21
+ ```
22
+
23
+ ### BrowserStack
25
24
 
26
- // Create a session on BrowserStack
25
+ ```typescript
27
26
  const session = await invokeCommand({
28
27
  commandName: 'createSession',
29
28
  provider: 'browserstack',
@@ -40,101 +39,88 @@ const session = await invokeCommand({
40
39
  },
41
40
  },
42
41
  });
43
-
44
- if (!session.success) {
45
- throw new Error(session.error?.message);
46
- }
47
-
48
- const { sessionId } = session.data;
49
-
50
- // Find an element
51
- const element = await invokeCommand({
52
- commandName: 'findElement',
53
- provider: 'browserstack',
54
- credentials: { username: process.env.BS_USER, accessKey: process.env.BS_KEY },
55
- params: { sessionId, using: 'accessibility id', value: 'loginButton' },
56
- });
57
-
58
- // Click it
59
- await invokeCommand({
60
- commandName: 'clickElement',
61
- provider: 'browserstack',
62
- credentials: { username: process.env.BS_USER, accessKey: process.env.BS_KEY },
63
- params: { sessionId, elementId: element.data.elementId },
64
- });
65
-
66
- // Take a screenshot
67
- const screenshot = await invokeCommand({
68
- commandName: 'getScreenshot',
69
- provider: 'browserstack',
70
- credentials: { username: process.env.BS_USER, accessKey: process.env.BS_KEY },
71
- params: { sessionId },
72
- });
73
-
74
- // Delete the session
75
- await invokeCommand({
76
- commandName: 'deleteSession',
77
- provider: 'browserstack',
78
- credentials: { username: process.env.BS_USER, accessKey: process.env.BS_KEY },
79
- params: { sessionId },
80
- });
81
42
  ```
82
43
 
83
- ### Local Appium
44
+ ### LambdaTest
84
45
 
85
46
  ```typescript
86
- import { invokeCommand } from '@qapilot/appium-module';
87
-
88
47
  const session = await invokeCommand({
89
48
  commandName: 'createSession',
90
- provider: 'local',
49
+ provider: 'lambdatest',
91
50
  credentials: {
92
- hubUrl: 'http://localhost:4723',
51
+ username: process.env.LT_USER,
52
+ accessKey: process.env.LT_KEY,
93
53
  },
94
54
  params: {
95
55
  capabilities: {
96
56
  platformName: 'Android',
97
- 'appium:automationName': 'UiAutomator2',
98
- 'appium:deviceName': 'emulator-5554',
57
+ 'appium:deviceName': 'Galaxy S21',
58
+ 'appium:app': 'lt://<app-id>',
99
59
  },
100
60
  },
101
61
  });
102
62
  ```
103
63
 
104
- ### LambdaTest
64
+ ### Local Appium
105
65
 
106
66
  ```typescript
107
- import { invokeCommand } from '@qapilot/appium-module';
108
-
109
67
  const session = await invokeCommand({
110
68
  commandName: 'createSession',
111
- provider: 'lambdatest',
69
+ provider: 'local',
112
70
  credentials: {
113
- username: process.env.LT_USER,
114
- accessKey: process.env.LT_KEY,
71
+ hubUrl: 'http://localhost:4723',
115
72
  },
116
73
  params: {
117
74
  capabilities: {
118
75
  platformName: 'Android',
119
- 'appium:deviceName': 'Galaxy S21',
120
- 'appium:app': 'lt://<app-id>',
76
+ 'appium:automationName': 'UiAutomator2',
77
+ 'appium:deviceName': 'emulator-5554',
121
78
  },
122
79
  },
123
80
  });
124
81
  ```
125
82
 
83
+ ---
84
+
126
85
  ## Supported Commands
127
86
 
128
- | Category | Commands |
129
- |----------|----------|
130
- | Session | `createSession`, `getSession`, `deleteSession` |
131
- | Element | `findElement`, `findElements`, `clickElement`, `setValue`, `clearElement`, `getElementText`, `getElementAttribute`, `getElementDisplayed`, `getElementRect`, `getElementLocation`, `getElementSize` |
132
- | Page | `getScreenshot`, `getSource` |
133
- | Actions | `performActions`, `touchPerform` |
134
- | Context | `getContext`, `setContext`, `getContexts` |
135
- | Window | `getWindow`, `getWindowHandles`, `switchWindow` |
136
- | Device | `hideKeyboard`, `isKeyboardShown`, `pressKeycode`, `activateApp`, `terminateApp`, `setOrientation`, `setLocation` |
137
- | Script | `executeScript`, `executeScriptSync` |
87
+ All commands are invoked via `invokeCommand({ commandName, provider, credentials, params })`.
88
+
89
+ | Category | Command | Key `params` |
90
+ |----------|---------|--------------|
91
+ | **Session** | `createSession` | `capabilities` |
92
+ | | `getSession` | `sessionId` |
93
+ | | `deleteSession` | `sessionId` |
94
+ | **Element** | `findElement` | `sessionId`, `using`, `value` |
95
+ | | `findElements` | `sessionId`, `using`, `value` |
96
+ | | `clickElement` | `sessionId`, `elementId` |
97
+ | | `setValue` | `sessionId`, `elementId`, `text` |
98
+ | | `clearElement` | `sessionId`, `elementId` |
99
+ | | `getElementText` | `sessionId`, `elementId` |
100
+ | | `getElementAttribute` | `sessionId`, `elementId`, `attribute` |
101
+ | | `getElementDisplayed` | `sessionId`, `elementId` |
102
+ | | `getElementRect` | `sessionId`, `elementId` |
103
+ | | `getElementLocation` | `sessionId`, `elementId` |
104
+ | | `getElementSize` | `sessionId`, `elementId` |
105
+ | **Page** | `getScreenshot` | `sessionId` |
106
+ | | `getSource` | `sessionId` |
107
+ | **Actions** | `performActions` | `sessionId`, `actions` |
108
+ | | `touchPerform` | `sessionId`, `actions` |
109
+ | **Context** | `getContext` | `sessionId` |
110
+ | | `setContext` | `sessionId`, `name` |
111
+ | | `getContexts` | `sessionId` |
112
+ | **Window** | `getWindow` | `sessionId` |
113
+ | | `getWindowHandles` | `sessionId` |
114
+ | | `switchWindow` | `sessionId`, `handle` |
115
+ | **Device** | `hideKeyboard` | `sessionId` |
116
+ | | `isKeyboardShown` | `sessionId` |
117
+ | | `pressKeycode` | `sessionId`, `keycode` |
118
+ | | `activateApp` | `sessionId`, `appId` |
119
+ | | `terminateApp` | `sessionId`, `appId` |
120
+ | | `setOrientation` | `sessionId`, `orientation` |
121
+ | | `setLocation` | `sessionId`, `latitude`, `longitude` |
122
+ | **Script** | `executeScript` | `sessionId`, `script`, `args` |
123
+ | | `executeScriptSync` | `sessionId`, `script`, `args` |
138
124
 
139
125
  Get the full list at runtime:
140
126
 
@@ -143,46 +129,56 @@ import { getSupportedCommands } from '@qapilot/appium-module';
143
129
  console.log(getSupportedCommands());
144
130
  ```
145
131
 
146
- ## Extending
132
+ ---
147
133
 
148
- ### Custom Providers
134
+ ## Response Shape
135
+
136
+ Every `invokeCommand` call returns an `ExecuteResponse<T>`:
149
137
 
150
138
  ```typescript
151
- import { registerProvider, BaseProvider } from '@qapilot/appium-module';
152
- import type { IAppiumProvider, ProviderCredentials, AppiumServiceError } from '@qapilot/appium-module';
139
+ {
140
+ success: boolean;
141
+ data?: T; // present when success is true
142
+ error?: { // present when success is false
143
+ message: string;
144
+ statusCode?: number;
145
+ };
146
+ }
147
+ ```
153
148
 
154
- class SauceLabsProvider extends BaseProvider implements IAppiumProvider {
155
- readonly name = 'saucelabs' as any;
156
- protected readonly hubBaseUrl = 'https://ondemand.us-west-1.saucelabs.com';
157
- protected readonly wdHubPath = '/wd/hub';
149
+ Always check `success` before accessing `data`:
158
150
 
159
- buildUrl(_sessionId: string | null, path: string, credentials: ProviderCredentials): string {
160
- return `${this.buildBaseUrl(credentials)}${path}`;
161
- }
151
+ ```typescript
152
+ const result = await invokeCommand({ commandName: 'findElement', ... });
162
153
 
163
- buildHeaders(credentials: ProviderCredentials): Record<string, string> {
164
- return {
165
- 'Content-Type': 'application/json',
166
- Authorization: this.buildBasicAuthHeader(credentials),
167
- };
168
- }
154
+ if (!result.success) {
155
+ throw new Error(result.error?.message);
156
+ }
169
157
 
170
- normalizeCapabilities(caps: Record<string, unknown>): Record<string, unknown> {
171
- return caps;
172
- }
158
+ const { elementId } = result.data;
159
+ ```
173
160
 
174
- normalizeError(statusCode: number, body: unknown): AppiumServiceError {
175
- return this.mapW3CError(statusCode, body);
176
- }
161
+ ---
177
162
 
178
- getDefaultCapabilities(): Record<string, unknown> {
179
- return {};
180
- }
181
- }
163
+ ## TypeScript Types
182
164
 
183
- registerProvider(new SauceLabsProvider());
165
+ All types are exported from the main entry point:
166
+
167
+ ```typescript
168
+ import type {
169
+ ExecuteRequest,
170
+ ExecuteResponse,
171
+ ProviderName,
172
+ ProviderCredentials,
173
+ AppiumServiceError,
174
+ IAppiumProvider,
175
+ } from '@qapilot/appium-module';
184
176
  ```
185
177
 
178
+ ---
179
+
180
+ ## Extending
181
+
186
182
  ### Custom Commands
187
183
 
188
184
  ```typescript
@@ -205,64 +201,45 @@ class ShakeDeviceCommand extends BaseCommand<{ sessionId: string }, void> {
205
201
  registerCommand(new ShakeDeviceCommand());
206
202
  ```
207
203
 
208
- ## HTTP Server Mode
209
-
210
- The package also ships a standalone Express HTTP server that exposes the command invoker over REST. This is useful when you want to call Appium from a language other than Node.js, or from a microservice over HTTP.
211
-
212
- ```bash
213
- # Run the server directly
214
- npx @qapilot/appium-module/server
215
-
216
- # Or in your own project (after installing express):
217
- node node_modules/@qapilot/appium-module/dist/server.js
218
- ```
204
+ ### Custom Providers
219
205
 
220
- ### `POST /api/v1/execute`
206
+ ```typescript
207
+ import { registerProvider, BaseProvider } from '@qapilot/appium-module';
208
+ import type { IAppiumProvider, ProviderCredentials, AppiumServiceError } from '@qapilot/appium-module';
221
209
 
222
- ```json
223
- {
224
- "commandName": "findElement",
225
- "provider": "browserstack",
226
- "credentials": { "username": "...", "accessKey": "..." },
227
- "params": { "sessionId": "abc123", "using": "xpath", "value": "//button" }
228
- }
229
- ```
210
+ class SauceLabsProvider extends BaseProvider implements IAppiumProvider {
211
+ readonly name = 'saucelabs' as any;
212
+ protected readonly hubBaseUrl = 'https://ondemand.us-west-1.saucelabs.com';
213
+ protected readonly wdHubPath = '/wd/hub';
230
214
 
231
- ### `GET /api/v1/commands` list all registered commands
232
- ### `GET /api/v1/providers` — list all registered providers
233
- ### `GET /api/v1/health` — liveness probe
215
+ buildUrl(_sessionId: string | null, path: string, credentials: ProviderCredentials): string {
216
+ return `${this.buildBaseUrl(credentials)}${path}`;
217
+ }
234
218
 
235
- Environment variables for server mode:
219
+ buildHeaders(credentials: ProviderCredentials): Record<string, string> {
220
+ return {
221
+ 'Content-Type': 'application/json',
222
+ Authorization: this.buildBasicAuthHeader(credentials),
223
+ };
224
+ }
236
225
 
237
- | Variable | Default | Description |
238
- |----------|---------|-------------|
239
- | `PORT` | `8000` | HTTP port to listen on |
240
- | `NODE_ENV` | `development` | Set to `production` for JSON logging |
241
- | `LOG_LEVEL` | `info` | Pino log level |
242
- | `LOCAL_APPIUM_URL` | `http://localhost:4723` | Default URL for the `local` provider |
226
+ normalizeCapabilities(caps: Record<string, unknown>): Record<string, unknown> {
227
+ return caps;
228
+ }
243
229
 
244
- ## TypeScript
230
+ normalizeError(statusCode: number, body: unknown): AppiumServiceError {
231
+ return this.mapW3CError(statusCode, body);
232
+ }
245
233
 
246
- All types are exported from the main entry point:
234
+ getDefaultCapabilities(): Record<string, unknown> {
235
+ return {};
236
+ }
237
+ }
247
238
 
248
- ```typescript
249
- import type {
250
- ExecuteRequest,
251
- ExecuteResponse,
252
- ProviderName,
253
- ProviderCredentials,
254
- AppiumServiceError,
255
- IAppiumProvider,
256
- } from '@qapilot/appium-module';
239
+ registerProvider(new SauceLabsProvider());
257
240
  ```
258
241
 
259
- ## Publishing
260
-
261
- ```bash
262
- npm run build # compile TypeScript to dist/
263
- npm login # authenticate with npm
264
- npm publish --access public
265
- ```
242
+ ---
266
243
 
267
244
  ## License
268
245
 
@@ -7,7 +7,7 @@ interface ExecuteScriptParams extends Record<string, unknown> {
7
7
  export declare class ExecuteScriptCommand extends BaseCommand<ExecuteScriptParams, unknown> {
8
8
  readonly name = "executeScript";
9
9
  readonly method: "POST";
10
- readonly pathTemplate = "/session/{sessionId}/execute";
10
+ readonly pathTemplate = "/session/{sessionId}/execute/async";
11
11
  validate(params: ExecuteScriptParams): void;
12
12
  buildBody(params: ExecuteScriptParams): unknown;
13
13
  parseResponse(raw: unknown): unknown;
@@ -1 +1 @@
1
- {"version":3,"file":"execute-script.command.d.ts","sourceRoot":"","sources":["../../../src/commands/script/execute-script.command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,UAAU,mBAAoB,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC3D,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;CAClB;AAED,qBAAa,oBAAqB,SAAQ,WAAW,CAAC,mBAAmB,EAAE,OAAO,CAAC;IACjF,QAAQ,CAAC,IAAI,mBAAmB;IAChC,QAAQ,CAAC,MAAM,EAAG,MAAM,CAAU;IAClC,QAAQ,CAAC,YAAY,kCAAkC;IAE9C,QAAQ,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI;IAUpD,SAAS,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO;IAO/C,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO;CAIrC"}
1
+ {"version":3,"file":"execute-script.command.d.ts","sourceRoot":"","sources":["../../../src/commands/script/execute-script.command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,UAAU,mBAAoB,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC3D,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;CAClB;AAED,qBAAa,oBAAqB,SAAQ,WAAW,CAAC,mBAAmB,EAAE,OAAO,CAAC;IACjF,QAAQ,CAAC,IAAI,mBAAmB;IAChC,QAAQ,CAAC,MAAM,EAAG,MAAM,CAAU;IAClC,QAAQ,CAAC,YAAY,wCAAwC;IAEpD,QAAQ,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI;IAUpD,SAAS,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO;IAO/C,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO;CAIrC"}
@@ -3,7 +3,7 @@ import { BaseCommand } from '../base.command.js';
3
3
  export class ExecuteScriptCommand extends BaseCommand {
4
4
  name = 'executeScript';
5
5
  method = 'POST';
6
- pathTemplate = '/session/{sessionId}/execute';
6
+ pathTemplate = '/session/{sessionId}/execute/async';
7
7
  validate(params) {
8
8
  if (!params.script) {
9
9
  throw new AppiumError({
@@ -1 +1 @@
1
- {"version":3,"file":"execute-script.command.js","sourceRoot":"","sources":["../../../src/commands/script/execute-script.command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAQjD,MAAM,OAAO,oBAAqB,SAAQ,WAAyC;IACxE,IAAI,GAAG,eAAe,CAAC;IACvB,MAAM,GAAG,MAAe,CAAC;IACzB,YAAY,GAAG,8BAA8B,CAAC;IAE9C,QAAQ,CAAC,MAA2B;QAC3C,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,IAAI,WAAW,CAAC;gBACpB,IAAI,EAAE,eAAe,CAAC,gBAAgB;gBACtC,OAAO,EAAE,+FAA+F;gBACxG,UAAU,EAAE,GAAG;aAChB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,SAAS,CAAC,MAA2B;QACnC,OAAO;YACL,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE;SACxB,CAAC;IACJ,CAAC;IAED,aAAa,CAAC,GAAY;QACxB,MAAM,IAAI,GAAG,GAA8B,CAAC;QAC5C,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;CACF"}
1
+ {"version":3,"file":"execute-script.command.js","sourceRoot":"","sources":["../../../src/commands/script/execute-script.command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAQjD,MAAM,OAAO,oBAAqB,SAAQ,WAAyC;IACxE,IAAI,GAAG,eAAe,CAAC;IACvB,MAAM,GAAG,MAAe,CAAC;IACzB,YAAY,GAAG,oCAAoC,CAAC;IAEpD,QAAQ,CAAC,MAA2B;QAC3C,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,IAAI,WAAW,CAAC;gBACpB,IAAI,EAAE,eAAe,CAAC,gBAAgB;gBACtC,OAAO,EAAE,+FAA+F;gBACxG,UAAU,EAAE,GAAG;aAChB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,SAAS,CAAC,MAA2B;QACnC,OAAO;YACL,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE;SACxB,CAAC;IACJ,CAAC;IAED,aAAa,CAAC,GAAY;QACxB,MAAM,IAAI,GAAG,GAA8B,CAAC;QAC5C,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"request-validator.d.ts","sourceRoot":"","sources":["../../../src/http/middleware/request-validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAsB/D,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CAgB5F"}
1
+ {"version":3,"file":"request-validator.d.ts","sourceRoot":"","sources":["../../../src/http/middleware/request-validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAuB/D,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CAgB5F"}
@@ -16,6 +16,7 @@ const executeRequestSchema = z.object({
16
16
  .optional()
17
17
  .default({}),
18
18
  params: z.record(z.unknown()).optional().default({}),
19
+ timeoutMs: z.number().int().positive().optional(),
19
20
  });
20
21
  export function validateExecuteRequest(req, res, next) {
21
22
  const result = executeRequestSchema.safeParse(req.body);
@@ -1 +1 @@
1
- {"version":3,"file":"request-validator.js","sourceRoot":"","sources":["../../../src/http/middleware/request-validator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,yBAAyB,CAAC;IACzD,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE;QACxD,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;YACf,OAAO,EAAE,0DAA0D;SACpE,CAAC;KACH,CAAC;IACF,WAAW,EAAE,CAAC;SACX,MAAM,CAAC;QACN,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC/B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAChC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;KACpC,CAAC;SACD,QAAQ,EAAE;SACV,OAAO,CAAC,EAAE,CAAC;IACd,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;CACrD,CAAC,CAAC;AAEH,MAAM,UAAU,sBAAsB,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB;IACpF,MAAM,MAAM,GAAG,oBAAoB,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACxD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9F,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE;gBACL,IAAI,EAAE,eAAe,CAAC,gBAAgB;gBACtC,OAAO,EAAE,oBAAoB,MAAM,EAAE;gBACrC,UAAU,EAAE,GAAG;aAChB;SACF,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IACD,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACvB,IAAI,EAAE,CAAC;AACT,CAAC"}
1
+ {"version":3,"file":"request-validator.js","sourceRoot":"","sources":["../../../src/http/middleware/request-validator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,yBAAyB,CAAC;IACzD,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE;QACxD,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;YACf,OAAO,EAAE,0DAA0D;SACpE,CAAC;KACH,CAAC;IACF,WAAW,EAAE,CAAC;SACX,MAAM,CAAC;QACN,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC/B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAChC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;KACpC,CAAC;SACD,QAAQ,EAAE;SACV,OAAO,CAAC,EAAE,CAAC;IACd,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IACpD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;CAClD,CAAC,CAAC;AAEH,MAAM,UAAU,sBAAsB,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB;IACpF,MAAM,MAAM,GAAG,oBAAoB,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACxD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9F,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE;gBACL,IAAI,EAAE,eAAe,CAAC,gBAAgB;gBACtC,OAAO,EAAE,oBAAoB,MAAM,EAAE;gBACrC,UAAU,EAAE,GAAG;aAChB;SACF,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IACD,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACvB,IAAI,EAAE,CAAC;AACT,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"command-invoker.d.ts","sourceRoot":"","sources":["../../src/invoker/command-invoker.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAcjF,wBAAsB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAqGrF"}
1
+ {"version":3,"file":"command-invoker.d.ts","sourceRoot":"","sources":["../../src/invoker/command-invoker.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAejF,wBAAsB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAsGrF"}
@@ -3,9 +3,9 @@ import { AppiumError, AppiumErrorCode } from '../types/error.types.js';
3
3
  import { getCommand } from '../commands/command.registry.js';
4
4
  import { getProvider } from '../providers/provider.factory.js';
5
5
  import logger from '../logger/index.js';
6
+ const DEFAULT_TIMEOUT = Number(process.env['APPIUM_HTTP_TIMEOUT_MS']) || 120_000;
6
7
  function createAxiosInstance() {
7
8
  return axios.create({
8
- timeout: 120_000,
9
9
  validateStatus: () => true, // handle all statuses manually
10
10
  });
11
11
  }
@@ -19,10 +19,10 @@ export async function invokeCommand(request) {
19
19
  const resolvedParams = commandName === 'createSession' && params['capabilities'] != null
20
20
  ? {
21
21
  ...params,
22
- capabilities: {
22
+ capabilities: provider.normalizeCapabilities({
23
23
  ...provider.getDefaultCapabilities(),
24
24
  ...params['capabilities'],
25
- },
25
+ }),
26
26
  }
27
27
  : params;
28
28
  const requestConfig = command.buildRequestConfig(resolvedParams);
@@ -36,6 +36,7 @@ export async function invokeCommand(request) {
36
36
  url,
37
37
  headers,
38
38
  data: requestConfig.body,
39
+ timeout: request.timeoutMs ?? DEFAULT_TIMEOUT,
39
40
  });
40
41
  if (response.status >= 400) {
41
42
  const error = provider.normalizeError(response.status, response.data);
@@ -1 +1 @@
1
- {"version":3,"file":"command-invoker.js","sourceRoot":"","sources":["../../src/invoker/command-invoker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"command-invoker.js","sourceRoot":"","sources":["../../src/invoker/command-invoker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,UAAU,EAAsB,MAAM,OAAO,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAEvE,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAC/D,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAExC,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,IAAI,OAAO,CAAC;AAEjF,SAAS,mBAAmB;IAC1B,OAAO,KAAK,CAAC,MAAM,CAAC;QAClB,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,+BAA+B;KAC5D,CAAC,CAAC;AACL,CAAC;AAED,MAAM,IAAI,GAAG,mBAAmB,EAAE,CAAC;AAEnC,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAuB;IACzD,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAE7E,MAAM,OAAO,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;IAE3C,0EAA0E;IAC1E,qDAAqD;IACrD,MAAM,cAAc,GAClB,WAAW,KAAK,eAAe,IAAI,MAAM,CAAC,cAAc,CAAC,IAAI,IAAI;QAC/D,CAAC,CAAC;YACE,GAAG,MAAM;YACT,YAAY,EAAE,QAAQ,CAAC,qBAAqB,CAAC;gBAC3C,GAAG,QAAQ,CAAC,sBAAsB,EAAE;gBACpC,GAAI,MAAM,CAAC,cAAc,CAA6B;aACvD,CAAC;SACH;QACH,CAAC,CAAC,MAAM,CAAC;IAEb,MAAM,aAAa,GAAG,OAAO,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAC;IACjE,MAAM,SAAS,GAAG,OAAO,cAAc,CAAC,WAAW,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAEvG,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAC1E,MAAM,OAAO,GAAG,QAAQ,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;IAEnD,MAAM,CAAC,KAAK,CACV,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,aAAa,CAAC,MAAM,EAAE,EAChE,mBAAmB,CACpB,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC;YAClC,MAAM,EAAE,aAAa,CAAC,MAAM;YAC5B,GAAG;YACH,OAAO;YACP,IAAI,EAAE,aAAa,CAAC,IAAI;YACxB,OAAO,EAAE,OAAO,CAAC,SAAS,IAAI,eAAe;SAC9C,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;YACtE,MAAM,CAAC,IAAI,CACT,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,EACtF,gCAAgC,CACjC,CAAC;YACF,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE;oBACL,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,UAAU,EAAE,KAAK,CAAC,UAAU;oBAC5B,GAAG,EAAE,KAAK,CAAC,GAAG;iBACf;aACF,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAElD,MAAM,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC;QAE9F,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACjC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,WAAW,EAAE,CAAC;YAC/B,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE;oBACL,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,UAAU,EAAE,GAAG,CAAC,UAAU;oBAC1B,GAAG,EAAE,GAAG,CAAC,GAAG;iBACb;aACF,CAAC;QACJ,CAAC;QAED,IAAI,GAAG,YAAY,UAAU,EAAE,CAAC;YAC9B,MAAM,cAAc,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC;YACrC,MAAM,CAAC,KAAK,CACV,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,EACxD,cAAc,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,qBAAqB,CAChE,CAAC;YACF,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE;oBACL,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,eAAe,CAAC,oBAAoB,CAAC,CAAC,CAAC,eAAe,CAAC,aAAa;oBAC3F,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,UAAU,EAAE,GAAG,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG;oBACvC,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,IAAI;iBACxB;aACF,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,MAAM,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE,EAAE,2CAA2C,CAAC,CAAC;QAClG,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE;gBACL,IAAI,EAAE,eAAe,CAAC,aAAa;gBACnC,OAAO;gBACP,UAAU,EAAE,GAAG;aAChB;SACF,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/logger/index.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAgBxB,QAAA,MAAM,MAAM,6BAMX,CAAC;AAEF,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/logger/index.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAqBxB,QAAA,MAAM,MAAM,6BAMX,CAAC;AAEF,eAAe,MAAM,CAAC"}
@@ -1,16 +1,22 @@
1
1
  import pino from 'pino';
2
2
  const isDev = process.env['NODE_ENV'] !== 'production';
3
3
  const level = process.env['LOG_LEVEL'] ?? 'info';
4
- const transport = isDev
5
- ? pino.transport({
6
- target: 'pino-pretty',
7
- options: {
8
- colorize: true,
9
- translateTime: 'SYS:standard',
10
- ignore: 'pid,hostname',
11
- },
12
- })
13
- : undefined;
4
+ let transport;
5
+ if (isDev) {
6
+ try {
7
+ transport = pino.transport({
8
+ target: 'pino-pretty',
9
+ options: {
10
+ colorize: true,
11
+ translateTime: 'SYS:standard',
12
+ ignore: 'pid,hostname',
13
+ },
14
+ });
15
+ }
16
+ catch {
17
+ // pino-pretty not installed — fall back to default pino output
18
+ }
19
+ }
14
20
  const logger = pino({
15
21
  level,
16
22
  base: { service: 'appium-http-service' },
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/logger/index.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,YAAY,CAAC;AACvD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,MAAM,CAAC;AAEjD,MAAM,SAAS,GAAG,KAAK;IACrB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;QACb,MAAM,EAAE,aAAa;QACrB,OAAO,EAAE;YACP,QAAQ,EAAE,IAAI;YACd,aAAa,EAAE,cAAc;YAC7B,MAAM,EAAE,cAAc;SACvB;KACF,CAAC;IACJ,CAAC,CAAC,SAAS,CAAC;AAEd,MAAM,MAAM,GAAG,IAAI,CACjB;IACE,KAAK;IACL,IAAI,EAAE,EAAE,OAAO,EAAE,qBAAqB,EAAE;CACzC,EACD,SAAS,CACV,CAAC;AAEF,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/logger/index.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,YAAY,CAAC;AACvD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,MAAM,CAAC;AAEjD,IAAI,SAAwD,CAAC;AAC7D,IAAI,KAAK,EAAE,CAAC;IACV,IAAI,CAAC;QACH,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;YACzB,MAAM,EAAE,aAAa;YACrB,OAAO,EAAE;gBACP,QAAQ,EAAE,IAAI;gBACd,aAAa,EAAE,cAAc;gBAC7B,MAAM,EAAE,cAAc;aACvB;SACF,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,+DAA+D;IACjE,CAAC;AACH,CAAC;AAED,MAAM,MAAM,GAAG,IAAI,CACjB;IACE,KAAK;IACL,IAAI,EAAE,EAAE,OAAO,EAAE,qBAAqB,EAAE;CACzC,EACD,SAAS,CACV,CAAC;AAEF,eAAe,MAAM,CAAC"}
@@ -5,6 +5,7 @@ export interface ExecuteRequest {
5
5
  provider: ProviderName;
6
6
  credentials: ProviderCredentials;
7
7
  params: Record<string, unknown>;
8
+ timeoutMs?: number;
8
9
  }
9
10
  export interface ExecuteResponse<T = unknown> {
10
11
  success: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"command.types.d.ts","sourceRoot":"","sources":["../../src/types/command.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE7E,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,YAAY,CAAC;IACvB,WAAW,EAAE,mBAAmB,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,OAAO;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,eAAe,CAAC;QACtB,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,GAAG,CAAC,EAAE,OAAO,CAAC;KACf,CAAC;CACH;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB"}
1
+ {"version":3,"file":"command.types.d.ts","sourceRoot":"","sources":["../../src/types/command.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE7E,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,YAAY,CAAC;IACvB,WAAW,EAAE,mBAAmB,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,OAAO;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,eAAe,CAAC;QACtB,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,GAAG,CAAC,EAAE,OAAO,CAAC;KACf,CAAC;CACH;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qapilot/appium-module",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "Appium W3C WebDriver module for interacting with devices across BrowserStack, LambdaTest, and local Appium servers",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -24,6 +24,7 @@
24
24
  "dev": "tsx watch src/server.ts",
25
25
  "build": "tsc",
26
26
  "start": "node dist/server.js",
27
+ "test": "tsx scripts/release-test/src/runner.ts",
27
28
  "typecheck": "tsc --noEmit",
28
29
  "prepublishOnly": "npm run build"
29
30
  },