@samsara-dev/appwright 0.3.4 → 0.4.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/CHANGELOG.md CHANGED
@@ -1,5 +1,30 @@
1
1
  # appwright
2
2
 
3
+ ## 0.4.0
4
+
5
+ ### Minor Changes
6
+
7
+ - ddb33f3: Add BrowserStack `updateAppSettings` support for iOS devices, including runtime helpers, provider capability forwarding, and documentation.
8
+
9
+ ## 0.3.5
10
+
11
+ ### Patch Changes
12
+
13
+ - fa4a618: Add configurable idle timeout for BrowserStack provider
14
+
15
+ Users can now configure the idle timeout for BrowserStack sessions using the `idleTimeout` property in the device configuration. This sets the maximum time (in seconds) a session can remain idle without receiving any commands before BrowserStack terminates it. The default value remains 180 seconds (3 minutes) for backward compatibility.
16
+
17
+ Example usage:
18
+
19
+ ```ts
20
+ device: {
21
+ provider: "browserstack",
22
+ name: "Google Pixel 8",
23
+ osVersion: "14.0",
24
+ idleTimeout: 300, // Optional: 5 minutes
25
+ }
26
+ ```
27
+
3
28
  ## 0.3.4
4
29
 
5
30
  ### Patch Changes
package/README.md CHANGED
@@ -109,12 +109,44 @@ the provider in your config.
109
109
  osVersion: "14.0",
110
110
  appiumVersion: "3.1.0", // Override if your BrowserStack account does not yet support Appium 3
111
111
  appProfiling: true, // Optional: enable BrowserStack App Performance profiling
112
+ idleTimeout: 300, // Optional: max session idle time in seconds (default: 180)
112
113
  },
113
114
  buildPath: "app-release.apk",
114
115
  },
115
116
  },
116
117
  ```
117
118
 
119
+ #### iOS App Settings (BrowserStack)
120
+
121
+ Configure iOS permissions by default in your config:
122
+
123
+ ```ts
124
+ {
125
+ name: "ios",
126
+ use: {
127
+ platform: Platform.IOS,
128
+ device: {
129
+ provider: "browserstack",
130
+ name: "iPhone 16 Pro",
131
+ osVersion: "18",
132
+ updateAppSettings: {
133
+ "Permission Settings": {
134
+ Location: {
135
+ "ALLOW LOCATION ACCESS": "Always",
136
+ "Precise Location": "ON"
137
+ }
138
+ }
139
+ }
140
+ },
141
+ buildPath: "bs://<app-id>",
142
+ },
143
+ }
144
+
145
+ // Tests run with permissions already granted - no setup needed!
146
+ ```
147
+
148
+ See the [iOS App Settings documentation](./docs/ios-app-settings-browserstack.md) for more details.
149
+
118
150
  #### Run tests on LambdaTest
119
151
 
120
152
  Appwright supports LambdaTest out of the box. To run tests on LambdaTest, configure
@@ -1,5 +1,5 @@
1
1
  import type { Client as WebDriverClient } from "webdriver";
2
- import { AppwrightLocator, ExtractType, Platform, TimeoutOptions, VisualTraceConfig } from "../types";
2
+ import { AppwrightLocator, ExtractType, IosAppSettings, IosPermissionSettings, Platform, TimeoutOptions, VisualTraceConfig } from "../types";
3
3
  import { z } from "zod";
4
4
  import { LLMModel } from "@empiricalrun/llm";
5
5
  import { TestInfo } from "@playwright/test";
@@ -196,5 +196,44 @@ export declare class Device {
196
196
  * To fill input fields using the selectors use `sendKeyStrokes` method from locator
197
197
  */
198
198
  sendKeyStrokes(value: string): Promise<void>;
199
+ /**
200
+ * Updates iOS app settings via BrowserStack executor (mid-session).
201
+ * For default settings, prefer configuring them in appwright.config.ts.
202
+ *
203
+ * @param args - Permission settings or Settings bundle entries
204
+ * @example
205
+ * // Update permissions mid-session
206
+ * await device.updateAppSettings({
207
+ * 'Permission Settings': { Camera: 'Allow' }
208
+ * });
209
+ *
210
+ * @example
211
+ * // Update custom settings
212
+ * await device.updateAppSettings({
213
+ * 'DarkMode': 1,
214
+ * 'Environment': 'production'
215
+ * });
216
+ */
217
+ updateAppSettings(args: IosAppSettings): Promise<void>;
218
+ /**
219
+ * Convenience method for updating iOS permission settings mid-session.
220
+ * For default permissions, prefer configuring them in appwright.config.ts.
221
+ *
222
+ * @param settings - iOS permission settings to update
223
+ * @example
224
+ * await device.updatePermissionSettings({
225
+ * Location: {
226
+ * 'ALLOW LOCATION ACCESS': 'Always',
227
+ * 'Precise Location': 'ON'
228
+ * },
229
+ * Camera: 'Allow'
230
+ * });
231
+ */
232
+ updatePermissionSettings(settings: IosPermissionSettings): Promise<void>;
233
+ /**
234
+ * Validates that the current platform is iOS and provider is BrowserStack.
235
+ * @private
236
+ */
237
+ private assertIOSBrowserStack;
199
238
  }
200
239
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/device/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/device/index.ts"],"names":[],"mappings":"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"}
@@ -56,6 +56,8 @@ let Device = (() => {
56
56
  let _screenshot_decorators;
57
57
  let _scroll_decorators;
58
58
  let _sendKeyStrokes_decorators;
59
+ let _updateAppSettings_decorators;
60
+ let _updatePermissionSettings_decorators;
59
61
  return class Device {
60
62
  static {
61
63
  const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
@@ -70,6 +72,8 @@ let Device = (() => {
70
72
  _screenshot_decorators = [utils_1.boxedStep];
71
73
  _scroll_decorators = [utils_1.boxedStep];
72
74
  _sendKeyStrokes_decorators = [utils_1.boxedStep];
75
+ _updateAppSettings_decorators = [utils_1.boxedStep];
76
+ _updatePermissionSettings_decorators = [utils_1.boxedStep];
73
77
  __esDecorate(this, null, _tap_decorators, { kind: "method", name: "tap", static: false, private: false, access: { has: obj => "tap" in obj, get: obj => obj.tap }, metadata: _metadata }, null, _instanceExtraInitializers);
74
78
  __esDecorate(this, null, _terminateApp_decorators, { kind: "method", name: "terminateApp", static: false, private: false, access: { has: obj => "terminateApp" in obj, get: obj => obj.terminateApp }, metadata: _metadata }, null, _instanceExtraInitializers);
75
79
  __esDecorate(this, null, _activateApp_decorators, { kind: "method", name: "activateApp", static: false, private: false, access: { has: obj => "activateApp" in obj, get: obj => obj.activateApp }, metadata: _metadata }, null, _instanceExtraInitializers);
@@ -81,6 +85,8 @@ let Device = (() => {
81
85
  __esDecorate(this, null, _screenshot_decorators, { kind: "method", name: "screenshot", static: false, private: false, access: { has: obj => "screenshot" in obj, get: obj => obj.screenshot }, metadata: _metadata }, null, _instanceExtraInitializers);
82
86
  __esDecorate(this, null, _scroll_decorators, { kind: "method", name: "scroll", static: false, private: false, access: { has: obj => "scroll" in obj, get: obj => obj.scroll }, metadata: _metadata }, null, _instanceExtraInitializers);
83
87
  __esDecorate(this, null, _sendKeyStrokes_decorators, { kind: "method", name: "sendKeyStrokes", static: false, private: false, access: { has: obj => "sendKeyStrokes" in obj, get: obj => obj.sendKeyStrokes }, metadata: _metadata }, null, _instanceExtraInitializers);
88
+ __esDecorate(this, null, _updateAppSettings_decorators, { kind: "method", name: "updateAppSettings", static: false, private: false, access: { has: obj => "updateAppSettings" in obj, get: obj => obj.updateAppSettings }, metadata: _metadata }, null, _instanceExtraInitializers);
89
+ __esDecorate(this, null, _updatePermissionSettings_decorators, { kind: "method", name: "updatePermissionSettings", static: false, private: false, access: { has: obj => "updatePermissionSettings" in obj, get: obj => obj.updatePermissionSettings }, metadata: _metadata }, null, _instanceExtraInitializers);
84
90
  if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
85
91
  }
86
92
  webDriverClient = __runInitializers(this, _instanceExtraInitializers);
@@ -458,6 +464,65 @@ let Device = (() => {
458
464
  ]);
459
465
  await this.webDriverClient.releaseActions();
460
466
  }
467
+ /**
468
+ * Updates iOS app settings via BrowserStack executor (mid-session).
469
+ * For default settings, prefer configuring them in appwright.config.ts.
470
+ *
471
+ * @param args - Permission settings or Settings bundle entries
472
+ * @example
473
+ * // Update permissions mid-session
474
+ * await device.updateAppSettings({
475
+ * 'Permission Settings': { Camera: 'Allow' }
476
+ * });
477
+ *
478
+ * @example
479
+ * // Update custom settings
480
+ * await device.updateAppSettings({
481
+ * 'DarkMode': 1,
482
+ * 'Environment': 'production'
483
+ * });
484
+ */
485
+ async updateAppSettings(args) {
486
+ this.assertIOSBrowserStack("updateAppSettings");
487
+ const executor = {
488
+ action: "updateAppSettings",
489
+ arguments: args,
490
+ };
491
+ const script = `browserstack_executor: ${JSON.stringify(executor)}`;
492
+ await this.webDriverClient.executeScript(script, []);
493
+ }
494
+ /**
495
+ * Convenience method for updating iOS permission settings mid-session.
496
+ * For default permissions, prefer configuring them in appwright.config.ts.
497
+ *
498
+ * @param settings - iOS permission settings to update
499
+ * @example
500
+ * await device.updatePermissionSettings({
501
+ * Location: {
502
+ * 'ALLOW LOCATION ACCESS': 'Always',
503
+ * 'Precise Location': 'ON'
504
+ * },
505
+ * Camera: 'Allow'
506
+ * });
507
+ */
508
+ async updatePermissionSettings(settings) {
509
+ return this.updateAppSettings({ "Permission Settings": settings });
510
+ }
511
+ /**
512
+ * Validates that the current platform is iOS and provider is BrowserStack.
513
+ * @private
514
+ */
515
+ assertIOSBrowserStack(methodName) {
516
+ if (this.getPlatform() !== types_1.Platform.IOS) {
517
+ throw new Error(`${methodName} is only supported on iOS platform. ` +
518
+ `Current platform: ${this.getPlatform()}`);
519
+ }
520
+ if (this.provider !== "browserstack") {
521
+ throw new Error(`${methodName} is only supported with BrowserStack provider. ` +
522
+ `Current provider: ${this.provider}. ` +
523
+ `See https://www.browserstack.com/docs/app-automate/appium/advanced-features/ios-app-settings`);
524
+ }
525
+ }
461
526
  };
462
527
  })();
463
528
  exports.Device = Device;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/browserstack/index.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,eAAe,EACf,cAAc,EAEf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAqDtC,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;IAwDX,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;IAMlC,OAAO,CAAC,cAAc;YASR,YAAY;YAgBZ,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;IAuFlD,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;CAuDrB"}
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;AAqDtC,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;IAwDX,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;IAMlC,OAAO,CAAC,cAAc;YASR,YAAY;YAgBZ,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;IAuFlD,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;CA2FrB"}
@@ -8,6 +8,7 @@ const async_retry_1 = __importDefault(require("async-retry"));
8
8
  const fs_1 = __importDefault(require("fs"));
9
9
  const form_data_1 = __importDefault(require("form-data"));
10
10
  const path_1 = __importDefault(require("path"));
11
+ const types_1 = require("../../types");
11
12
  const device_1 = require("../../device");
12
13
  const logger_1 = require("../../logger");
13
14
  const API_BASE_URL = "https://api-cloud.browserstack.com/app-automate";
@@ -240,7 +241,7 @@ class BrowserStackDeviceProvider {
240
241
  networkLogs: true,
241
242
  appiumVersion: configuredAppiumVersion,
242
243
  enableCameraImageInjection: deviceConfig?.enableCameraImageInjection,
243
- idleTimeout: 180,
244
+ idleTimeout: deviceConfig?.idleTimeout ?? 180,
244
245
  deviceName: deviceConfig?.name,
245
246
  osVersion: deviceConfig.osVersion,
246
247
  platformName: platformName,
@@ -254,6 +255,35 @@ class BrowserStackDeviceProvider {
254
255
  if (typeof deviceConfig?.appProfiling === "boolean") {
255
256
  bstackOptions.appProfiling = deviceConfig.appProfiling;
256
257
  }
258
+ // iOS App Settings support (capability-based for session start)
259
+ if (platformName === types_1.Platform.IOS) {
260
+ // Support environment variable override for CI/CD
261
+ const envSettingsJson = process.env.APPWRIGHT_BS_UPDATE_APP_SETTINGS_JSON;
262
+ let updateAppSettings;
263
+ if (envSettingsJson) {
264
+ try {
265
+ updateAppSettings = JSON.parse(envSettingsJson);
266
+ }
267
+ catch (e) {
268
+ throw new Error("APPWRIGHT_BS_UPDATE_APP_SETTINGS_JSON is not valid JSON. " +
269
+ "Provide a valid JSON string.");
270
+ }
271
+ }
272
+ else {
273
+ updateAppSettings = deviceConfig?.updateAppSettings;
274
+ }
275
+ if (updateAppSettings && typeof updateAppSettings === "object") {
276
+ // Add to bstack:options as per BrowserStack documentation
277
+ bstackOptions.updateAppSettings = updateAppSettings;
278
+ // Log for debugging (without exposing sensitive data)
279
+ const u = updateAppSettings;
280
+ const hasPermissions = !!u["Permission Settings"];
281
+ const customKeys = Object.keys(u).filter((k) => k !== "Permission Settings");
282
+ if (hasPermissions || customKeys.length > 0) {
283
+ logger_1.logger.log(`iOS app settings configured: permissions=${hasPermissions}, custom_keys=${customKeys.length}`);
284
+ }
285
+ }
286
+ }
257
287
  return {
258
288
  port: 443,
259
289
  path: "/wd/hub",
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const vitest_1 = require("vitest");
7
7
  const test_1 = __importDefault(require("@playwright/test"));
8
8
  const device_1 = require("../device");
9
+ const types_1 = require("../types");
9
10
  // Override Playwright's test.step/info to work in Vitest environment
10
11
  // so boxedStep decorator can execute without throwing.
11
12
  test_1.default.step = vitest_1.vi.fn(async (_name, body) => await body());
@@ -35,4 +36,81 @@ const createDevice = (executeScript = vitest_1.vi.fn()) => {
35
36
  ]);
36
37
  });
37
38
  });
39
+ (0, vitest_1.describe)("iOS App Settings (BrowserStack)", () => {
40
+ (0, vitest_1.describe)("updateAppSettings", () => {
41
+ (0, vitest_1.test)("formats browserstack_executor correctly for settings bundle", async () => {
42
+ const { device, executeScript } = createDevice();
43
+ vitest_1.vi.spyOn(device, "getPlatform").mockReturnValue(types_1.Platform.IOS);
44
+ device["provider"] = "browserstack";
45
+ const settings = {
46
+ DarkMode: 1,
47
+ Environment: "staging",
48
+ "Child Settings": { "Child Setting 1": "abc" },
49
+ };
50
+ await device.updateAppSettings(settings);
51
+ (0, vitest_1.expect)(executeScript).toHaveBeenCalledWith(vitest_1.expect.stringContaining("browserstack_executor:"), []);
52
+ const call = executeScript.mock.calls[0][0];
53
+ const [, payloadString] = call.split("browserstack_executor: ");
54
+ if (!payloadString) {
55
+ throw new Error("Expected browserstack_executor payload to be present");
56
+ }
57
+ const payload = JSON.parse(payloadString);
58
+ (0, vitest_1.expect)(payload).toEqual({
59
+ action: "updateAppSettings",
60
+ arguments: settings,
61
+ });
62
+ });
63
+ (0, vitest_1.test)("formats permission settings correctly", async () => {
64
+ const { device, executeScript } = createDevice();
65
+ vitest_1.vi.spyOn(device, "getPlatform").mockReturnValue(types_1.Platform.IOS);
66
+ device["provider"] = "browserstack";
67
+ const permissions = {
68
+ "Permission Settings": {
69
+ Location: {
70
+ "ALLOW LOCATION ACCESS": "Always",
71
+ "Precise Location": "ON",
72
+ },
73
+ Camera: "Allow",
74
+ },
75
+ };
76
+ await device.updateAppSettings(permissions);
77
+ const call = executeScript.mock.calls[0][0];
78
+ const [, payloadString] = call.split("browserstack_executor: ");
79
+ if (!payloadString) {
80
+ throw new Error("Expected browserstack_executor payload to be present");
81
+ }
82
+ const payload = JSON.parse(payloadString);
83
+ (0, vitest_1.expect)(payload.arguments).toEqual(permissions);
84
+ });
85
+ (0, vitest_1.test)("throws descriptive error for Android platform", async () => {
86
+ const { device } = createDevice();
87
+ vitest_1.vi.spyOn(device, "getPlatform").mockReturnValue(types_1.Platform.ANDROID);
88
+ device["provider"] = "browserstack";
89
+ await (0, vitest_1.expect)(device.updateAppSettings({})).rejects.toThrow("updateAppSettings is only supported on iOS platform. Current platform: android");
90
+ });
91
+ (0, vitest_1.test)("throws descriptive error for non-BrowserStack provider", async () => {
92
+ const { device } = createDevice();
93
+ vitest_1.vi.spyOn(device, "getPlatform").mockReturnValue(types_1.Platform.IOS);
94
+ device["provider"] = "emulator";
95
+ await (0, vitest_1.expect)(device.updateAppSettings({})).rejects.toThrow(/only supported with BrowserStack provider.*Current provider: emulator/);
96
+ });
97
+ });
98
+ (0, vitest_1.describe)("updatePermissionSettings", () => {
99
+ (0, vitest_1.test)("wraps settings in 'Permission Settings' key", async () => {
100
+ const { device } = createDevice();
101
+ vitest_1.vi.spyOn(device, "getPlatform").mockReturnValue(types_1.Platform.IOS);
102
+ device["provider"] = "browserstack";
103
+ const updateSpy = vitest_1.vi.spyOn(device, "updateAppSettings");
104
+ const permissions = {
105
+ Camera: "Allow",
106
+ Photos: "All Photos",
107
+ Notifications: { "Allow Notifications": "ON" },
108
+ };
109
+ await device.updatePermissionSettings(permissions);
110
+ (0, vitest_1.expect)(updateSpy).toHaveBeenCalledWith({
111
+ "Permission Settings": permissions,
112
+ });
113
+ });
114
+ });
115
+ });
38
116
  });
@@ -1,6 +1,6 @@
1
1
  import { defineConfig } from "vitest/config";
2
2
  export default defineConfig({
3
3
  test: {
4
- exclude: ["example/**", "node_modules/**", "dist/**"],
4
+ exclude: ["**/example/**", "node_modules/**", "dist/**"],
5
5
  },
6
6
  });
@@ -104,6 +104,28 @@ export type BrowserStackConfig = {
104
104
  * Defaults to false. When true, BrowserStack captures detailed performance metrics.
105
105
  */
106
106
  appProfiling?: boolean;
107
+ /**
108
+ * Maximum time (in seconds) that a test session can remain idle without any commands.
109
+ * BrowserStack terminates sessions that exceed this timeout.
110
+ * Defaults to 180 seconds (3 minutes).
111
+ */
112
+ idleTimeout?: number;
113
+ /**
114
+ * iOS app settings to configure at session start.
115
+ * Can include Permission Settings and/or custom Settings Bundle entries.
116
+ * Only supported on iOS devices with BrowserStack provider.
117
+ *
118
+ * @example
119
+ * ```ts
120
+ * {
121
+ * 'Permission Settings': {
122
+ * Location: { 'ALLOW LOCATION ACCESS': 'Always' }
123
+ * },
124
+ * 'Environment': 'staging'
125
+ * }
126
+ * ```
127
+ */
128
+ updateAppSettings?: IosAppSettings;
107
129
  };
108
130
  export type LambdaTestConfig = {
109
131
  provider: "lambdatest";
@@ -173,6 +195,36 @@ export type EmulatorConfig = {
173
195
  */
174
196
  orientation?: DeviceOrientation;
175
197
  };
198
+ /**
199
+ * iOS permission settings structure (based on BrowserStack API).
200
+ * Supports both simple string values and nested objects for permissions.
201
+ */
202
+ export type IosPermissionSettings = Partial<{
203
+ Location: Partial<{
204
+ "ALLOW LOCATION ACCESS": "Always" | "While Using the App" | "Never";
205
+ "Precise Location": "ON" | "OFF";
206
+ }>;
207
+ Camera: "Allow" | "Deny";
208
+ Contacts: "Allow" | "Deny";
209
+ Photos: "Add Photos Only" | "Selected Photos" | "All Photos" | "None";
210
+ Notifications: Partial<{
211
+ "Allow Notifications": "ON" | "OFF";
212
+ }>;
213
+ Language: string;
214
+ }>;
215
+ /**
216
+ * Settings bundle for custom app settings (iOS Settings Bundle).
217
+ */
218
+ export type IosSettingsBundle = Record<string, unknown>;
219
+ /**
220
+ * Combined type for all iOS settings (permissions + custom).
221
+ * Can include Permission Settings, custom Settings Bundle entries, or both.
222
+ */
223
+ export type IosAppSettings = {
224
+ "Permission Settings": IosPermissionSettings;
225
+ } | IosSettingsBundle | ({
226
+ "Permission Settings": IosPermissionSettings;
227
+ } & IosSettingsBundle);
176
228
  export declare enum Platform {
177
229
  ANDROID = "android",
178
230
  IOS = "ios"
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
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.3.4",
3
+ "version": "0.4.0",
4
4
  "publishConfig": {
5
5
  "registry": "https://registry.npmjs.org/",
6
6
  "access": "public"