@tstdl/base 0.87.2 → 0.87.3

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.
@@ -1,9 +1,9 @@
1
1
  import type { ElementHandle, Frame, FrameLocator, Page } from 'playwright';
2
2
  import type { BrowserContextController } from './browser-context-controller.js';
3
- import type { Delay } from './element-controller.js';
4
3
  import { ElementController } from './element-controller.js';
5
4
  import type { FrameController, FrameControllerOptions } from './frame-controller.js';
6
5
  import { LocatorController } from './locator-controller.js';
6
+ import type { Delay } from './types.js';
7
7
  export type DocumentControllerOptions = {
8
8
  defaultActionDelay?: Delay;
9
9
  defaultTypeDelay?: Delay;
@@ -1,10 +1,6 @@
1
1
  import type { ElementHandle, Locator } from 'playwright';
2
2
  import type { Merge, NonUndefinable, TypedOmit } from '../types.js';
3
- import type { ValueOrProvider } from '../utils/value-or-provider.js';
4
- export type Delay = ValueOrProvider<number>;
5
- export type ActionDelayOptions = {
6
- actionDelay?: Delay;
7
- };
3
+ import type { ActionDelayOptions, Delay, TimeoutOptions } from './types.js';
8
4
  export type TypeDelayOptions = {
9
5
  typeDelay?: Delay;
10
6
  };
@@ -23,6 +19,12 @@ export type Filter = {
23
19
  hasText?: string | RegExp;
24
20
  hasNotText?: string | RegExp;
25
21
  };
22
+ export type BoundingBox = {
23
+ x: number;
24
+ y: number;
25
+ width: number;
26
+ height: number;
27
+ };
26
28
  export declare class ElementController<T extends Locator | ElementHandle = Locator | ElementHandle> implements Pick<Locator, Methods> {
27
29
  readonly locatorOrHandle: T;
28
30
  readonly options: ElementControllerOptions;
@@ -35,6 +37,12 @@ export declare class ElementController<T extends Locator | ElementHandle = Locat
35
37
  * @param elementController
36
38
  */
37
39
  and(elementController: ElementController): ElementController<Locator>;
40
+ /**
41
+ * Get an controller with elements contained in this and the provided controller.
42
+ * Requires locator based controller
43
+ * @param elementController
44
+ */
45
+ or(elementController: ElementController): ElementController<Locator>;
38
46
  /**
39
47
  * Filter out elements with by provided filter.
40
48
  * Requires locator based controller.
@@ -45,12 +53,23 @@ export declare class ElementController<T extends Locator | ElementHandle = Locat
45
53
  * Requires locator based controller.
46
54
  */
47
55
  locate(selectorOrController: string | ElementController, filter?: Filter): ElementController<Locator>;
56
+ first(): ElementController<Locator>;
57
+ last(): ElementController<Locator>;
58
+ nth(index: number): ElementController<Locator>;
59
+ evaluate<R, A>(fn: string | ((element: SVGElement | HTMLElement, argument: A) => R | Promise<R>), argument: A): Promise<R>;
60
+ evaluate<R, A>(fn: string | ((element: SVGElement | HTMLElement, argument?: A) => R | Promise<R>), argument?: A): Promise<R>;
48
61
  /**
49
62
  * Wait for element state
50
63
  * @param state some states may only be usable for either locator or handle
51
64
  * @param options options
52
65
  */
53
66
  waitFor(state?: Parameters<ElementHandle['waitForElementState']>[0] | NonNullable<LocatorOptions<'waitFor', '0'>['state']>, options?: Parameters<ElementHandle['waitForElementState']>[1]): Promise<void>;
67
+ boundingBox(options?: TimeoutOptions): Promise<BoundingBox | null>;
68
+ scrollIntoViewIfNeeded(options?: TimeoutOptions): Promise<void>;
69
+ /**
70
+ * Counts matching elements for locator based or returns 1 for handle based.
71
+ */
72
+ count(): Promise<number>;
54
73
  /**
55
74
  * Check if element exists
56
75
  * @param options.state which state is required in order to be deemed existing
@@ -58,14 +77,14 @@ export declare class ElementController<T extends Locator | ElementHandle = Locat
58
77
  */
59
78
  exists(options?: {
60
79
  state?: 'visible' | 'attached';
61
- timeout?: number;
62
- }): Promise<boolean>;
80
+ } & TimeoutOptions): Promise<boolean>;
63
81
  isVisible(): Promise<boolean>;
64
82
  isHidden(): Promise<boolean>;
65
83
  isEnabled(): Promise<boolean>;
66
84
  isDisabled(): Promise<boolean>;
67
85
  isChecked(): Promise<boolean>;
68
86
  isEditable(): Promise<boolean>;
87
+ clear(options?: Merge<LocatorOptions<'clear', 1>, ActionDelayOptions>): Promise<void>;
69
88
  fill(text: string, options?: Merge<LocatorOptions<'fill', 1>, ActionDelayOptions>): Promise<void>;
70
89
  type(text: string, options?: Merge<TypedOmit<LocatorOptions<'type', 1>, 'delay'>, ActionDelayOptions & TypeDelayOptions>): Promise<void>;
71
90
  press(key: string, options?: Merge<LocatorOptions<'press', 1>, ActionDelayOptions>): Promise<void>;
@@ -81,6 +100,5 @@ export declare class ElementController<T extends Locator | ElementHandle = Locat
81
100
  tap(options?: Merge<LocatorOptions<'tap', 1>, ActionDelayOptions>): Promise<void>;
82
101
  selectText(options?: Merge<LocatorOptions<'selectText', 1>, ActionDelayOptions>): Promise<void>;
83
102
  inputValue(options?: LocatorOptions<'inputValue', 0>): Promise<string>;
84
- private prepareAction;
85
103
  }
86
104
  export {};
@@ -21,11 +21,10 @@ __export(element_controller_exports, {
21
21
  ElementController: () => ElementController
22
22
  });
23
23
  module.exports = __toCommonJS(element_controller_exports);
24
- var import_timing = require("../utils/timing.js");
25
24
  var import_type_guards = require("../utils/type-guards.js");
26
25
  var import_value_or_provider = require("../utils/value-or-provider.js");
27
26
  var import_utils = require("./utils.js");
28
- const filterNonLocatorErrorMessage = "Requires a locator basesd controller";
27
+ const requiresLocatorBasedController = "Requires a locator based controller";
29
28
  class ElementController {
30
29
  locatorOrHandle;
31
30
  options;
@@ -53,17 +52,28 @@ class ElementController {
53
52
  * @param elementController
54
53
  */
55
54
  and(elementController) {
56
- (0, import_utils.assertLocator)(this.locatorOrHandle, filterNonLocatorErrorMessage);
57
- (0, import_utils.assertLocator)(elementController.locatorOrHandle, filterNonLocatorErrorMessage);
55
+ (0, import_utils.assertLocator)(this.locatorOrHandle, requiresLocatorBasedController);
56
+ (0, import_utils.assertLocator)(elementController.locatorOrHandle, requiresLocatorBasedController);
58
57
  const locator = this.locatorOrHandle.and(elementController.locatorOrHandle);
59
58
  return new ElementController(locator, this.options);
60
59
  }
60
+ /**
61
+ * Get an controller with elements contained in this and the provided controller.
62
+ * Requires locator based controller
63
+ * @param elementController
64
+ */
65
+ or(elementController) {
66
+ (0, import_utils.assertLocator)(this.locatorOrHandle, requiresLocatorBasedController);
67
+ (0, import_utils.assertLocator)(elementController.locatorOrHandle, requiresLocatorBasedController);
68
+ const locator = this.locatorOrHandle.or(elementController.locatorOrHandle);
69
+ return new ElementController(locator, this.options);
70
+ }
61
71
  /**
62
72
  * Filter out elements with by provided filter.
63
73
  * Requires locator based controller.
64
74
  */
65
75
  filter(filter) {
66
- (0, import_utils.assertLocator)(this.locatorOrHandle, filterNonLocatorErrorMessage);
76
+ (0, import_utils.assertLocator)(this.locatorOrHandle, requiresLocatorBasedController);
67
77
  const locator = this.locatorOrHandle.filter(convertFilter(filter));
68
78
  return new ElementController(locator, this.options);
69
79
  }
@@ -72,12 +82,33 @@ class ElementController {
72
82
  * Requires locator based controller.
73
83
  */
74
84
  locate(selectorOrController, filter) {
75
- (0, import_utils.assertLocator)(this.locatorOrHandle, filterNonLocatorErrorMessage);
76
- const selector = (0, import_type_guards.isString)(selectorOrController) ? selectorOrController : (0, import_utils.assertLocatorPass)(selectorOrController.locatorOrHandle, filterNonLocatorErrorMessage);
85
+ (0, import_utils.assertLocator)(this.locatorOrHandle, requiresLocatorBasedController);
86
+ const selector = (0, import_type_guards.isString)(selectorOrController) ? selectorOrController : (0, import_utils.assertLocatorPass)(selectorOrController.locatorOrHandle, requiresLocatorBasedController);
77
87
  const convertedFilter = (0, import_type_guards.isDefined)(filter) ? convertFilter(filter) : void 0;
78
88
  const locator = this.locatorOrHandle.locator(selector, convertedFilter);
79
89
  return new ElementController(locator, this.options);
80
90
  }
91
+ first() {
92
+ (0, import_utils.assertLocator)(this.locatorOrHandle, requiresLocatorBasedController);
93
+ const locator = this.locatorOrHandle.first();
94
+ return new ElementController(locator, this.options);
95
+ }
96
+ last() {
97
+ (0, import_utils.assertLocator)(this.locatorOrHandle, requiresLocatorBasedController);
98
+ const locator = this.locatorOrHandle.last();
99
+ return new ElementController(locator, this.options);
100
+ }
101
+ nth(index) {
102
+ (0, import_utils.assertLocator)(this.locatorOrHandle, requiresLocatorBasedController);
103
+ const locator = this.locatorOrHandle.nth(index);
104
+ return new ElementController(locator, this.options);
105
+ }
106
+ async evaluate(fn, argument) {
107
+ if ((0, import_utils.isLocator)(this.locatorOrHandle)) {
108
+ return this.locatorOrHandle.evaluate(fn, argument);
109
+ }
110
+ return this.locatorOrHandle.evaluate(fn, argument);
111
+ }
81
112
  /**
82
113
  * Wait for element state
83
114
  * @param state some states may only be usable for either locator or handle
@@ -89,6 +120,18 @@ class ElementController {
89
120
  }
90
121
  return this.locatorOrHandle.waitForElementState(state, options);
91
122
  }
123
+ async boundingBox(options) {
124
+ return this.locatorOrHandle.boundingBox({ timeout: options?.timeout ?? 1e3 });
125
+ }
126
+ async scrollIntoViewIfNeeded(options) {
127
+ await this.locatorOrHandle.scrollIntoViewIfNeeded({ timeout: options?.timeout ?? 1e3 });
128
+ }
129
+ /**
130
+ * Counts matching elements for locator based or returns 1 for handle based.
131
+ */
132
+ async count() {
133
+ return (0, import_utils.isLocator)(this.locatorOrHandle) ? this.locatorOrHandle.count() : 1;
134
+ }
92
135
  /**
93
136
  * Check if element exists
94
137
  * @param options.state which state is required in order to be deemed existing
@@ -96,7 +139,7 @@ class ElementController {
96
139
  */
97
140
  async exists(options) {
98
141
  try {
99
- await this.waitFor(options?.state ?? "visible", { timeout: options?.timeout ?? 250 });
142
+ await this.waitFor(options?.state ?? "visible", { timeout: options?.timeout ?? 1e3 });
100
143
  return true;
101
144
  } catch (error) {
102
145
  if (error instanceof Error && error.message.includes("violation")) {
@@ -123,97 +166,89 @@ class ElementController {
123
166
  async isEditable() {
124
167
  return this.locatorOrHandle.isEditable();
125
168
  }
169
+ async clear(options) {
170
+ (0, import_utils.assertLocator)(this.locatorOrHandle, requiresLocatorBasedController);
171
+ await (0, import_utils.prepareAction)(options);
172
+ await this.locatorOrHandle.clear(options);
173
+ }
126
174
  async fill(text, options) {
127
- await this.prepareAction(options);
175
+ await (0, import_utils.prepareAction)(options);
128
176
  await this.locatorOrHandle.fill(text, options);
129
177
  }
130
178
  async type(text, options) {
131
- await this.prepareAction(options);
179
+ await (0, import_utils.prepareAction)(options);
132
180
  if ((0, import_type_guards.isUndefined)(this.options.typeDelay)) {
133
181
  await this.locatorOrHandle.type(text, options);
134
182
  } else {
135
183
  for (const char of text) {
136
184
  await this.locatorOrHandle.type(char, options);
137
- await delay(options?.typeDelay ?? this.options.typeDelay);
185
+ await (0, import_utils.delay)(options?.typeDelay ?? this.options.typeDelay);
138
186
  }
139
187
  }
140
188
  }
141
189
  async press(key, options) {
142
- await this.prepareAction(options);
190
+ await (0, import_utils.prepareAction)(options);
143
191
  await this.locatorOrHandle.press(key, options);
144
192
  }
145
193
  async check(options) {
146
- await this.prepareAction(options);
194
+ await (0, import_utils.prepareAction)(options);
147
195
  await this.locatorOrHandle.check(options);
148
196
  }
149
197
  async uncheck(options) {
150
- await this.prepareAction(options);
198
+ await (0, import_utils.prepareAction)(options);
151
199
  await this.locatorOrHandle.uncheck(options);
152
200
  }
153
201
  async setChecked(checked, options) {
154
- await this.prepareAction(options);
202
+ await (0, import_utils.prepareAction)(options);
155
203
  await this.locatorOrHandle.setChecked(checked, options);
156
204
  }
157
205
  async selectOption(option, options) {
158
- await this.prepareAction(options);
206
+ await (0, import_utils.prepareAction)(options);
159
207
  const selectedOptions = await this.locatorOrHandle.selectOption(option, options);
160
208
  return selectedOptions;
161
209
  }
162
210
  async setInputFiles(files, options) {
163
- await this.prepareAction(options);
211
+ await (0, import_utils.prepareAction)(options);
164
212
  await this.locatorOrHandle.setInputFiles(files, options);
165
213
  }
166
214
  async click(options) {
167
- await this.prepareAction(options);
215
+ await (0, import_utils.prepareAction)(options);
168
216
  await this.locatorOrHandle.click({
169
217
  ...options,
170
218
  delay: (0, import_value_or_provider.resolveValueOrProvider)(options?.clickDelay)
171
219
  });
172
220
  }
173
221
  async dblclick(options) {
174
- await this.prepareAction(options);
222
+ await (0, import_utils.prepareAction)(options);
175
223
  await this.locatorOrHandle.dblclick({
176
224
  ...options,
177
225
  delay: (0, import_value_or_provider.resolveValueOrProvider)(options?.clickDelay)
178
226
  });
179
227
  }
180
228
  async hover(options) {
181
- await this.prepareAction(options);
229
+ await (0, import_utils.prepareAction)(options);
182
230
  await this.locatorOrHandle.hover(options);
183
231
  }
184
232
  async focus(options) {
185
- await this.prepareAction(options);
233
+ await (0, import_utils.prepareAction)(options);
186
234
  await this.locatorOrHandle.focus(options);
187
235
  }
188
236
  async tap(options) {
189
- await this.prepareAction(options);
237
+ await (0, import_utils.prepareAction)(options);
190
238
  await this.locatorOrHandle.tap(options);
191
239
  }
192
240
  async selectText(options) {
193
- await this.prepareAction(options);
241
+ await (0, import_utils.prepareAction)(options);
194
242
  await this.locatorOrHandle.selectText(options);
195
243
  }
196
244
  async inputValue(options) {
197
245
  return this.locatorOrHandle.inputValue(options);
198
246
  }
199
- async prepareAction(options) {
200
- const actionDelay = options?.actionDelay ?? this.options.actionDelay;
201
- if ((0, import_type_guards.isDefined)(actionDelay)) {
202
- await this.waitFor("visible", { timeout: (0, import_value_or_provider.resolveValueOrProvider)(options?.timeout) });
203
- await delay(actionDelay);
204
- }
205
- }
206
- }
207
- async function delay(milliseconds) {
208
- if ((0, import_type_guards.isUndefined)(milliseconds)) {
209
- return;
210
- }
211
- await (0, import_timing.timeout)((0, import_value_or_provider.resolveValueOrProvider)(milliseconds));
212
247
  }
213
248
  function convertFilter(filter) {
214
249
  return {
215
- has: (0, import_type_guards.isDefined)(filter.has) ? (0, import_utils.assertLocatorPass)(filter.has.locatorOrHandle, filterNonLocatorErrorMessage) : void 0,
216
- hasNot: (0, import_type_guards.isDefined)(filter.hasNot) ? (0, import_utils.assertLocatorPass)(filter.hasNot.locatorOrHandle, filterNonLocatorErrorMessage) : void 0,
250
+ has: (0, import_type_guards.isDefined)(filter.has) ? (0, import_utils.assertLocatorPass)(filter.has.locatorOrHandle, requiresLocatorBasedController) : void 0,
251
+ hasNot: (0, import_type_guards.isDefined)(filter.hasNot) ? (0, import_utils.assertLocatorPass)(filter.hasNot.locatorOrHandle, requiresLocatorBasedController) : void 0,
217
252
  hasText: filter.hasText,
218
253
  hasNotText: filter.hasNotText
219
254
  };
@@ -5,10 +5,15 @@ import type { Logger } from '../logger/logger.js';
5
5
  import type { BrowserContextController } from './browser-context-controller.js';
6
6
  import type { DocumentControllerOptions } from './document-controller.js';
7
7
  import { DocumentController } from './document-controller.js';
8
+ import { ElementController } from './element-controller.js';
8
9
  import type { FrameController, FrameControllerOptions } from './frame-controller.js';
9
10
  import type { PdfRenderOptions } from './pdf-options.js';
10
11
  import type { Abortable } from './types.js';
11
12
  export type PageControllerOptions = DocumentControllerOptions;
13
+ export type ScrollToCoordinates = {
14
+ x?: number;
15
+ y?: number;
16
+ };
12
17
  export declare class PageController extends DocumentController<Page> implements AsyncDisposable {
13
18
  /** @deprecated should be avoided */
14
19
  readonly page: Page;
@@ -28,6 +33,8 @@ export declare class PageController extends DocumentController<Page> implements
28
33
  */
29
34
  frame(frameSelector: Parameters<Page['frame']>[0], options?: FrameControllerOptions): FrameController;
30
35
  renderPdf(options?: PdfRenderOptions & Abortable): Promise<Uint8Array>;
36
+ scroll(deltaX: number, deltaY: number): Promise<void>;
37
+ scrollTo(coordinatesOrController: ScrollToCoordinates | ElementController): Promise<void>;
31
38
  renderPdfStream(options?: PdfRenderOptions & Abortable): ReadableStream<Uint8Array>;
32
39
  attachLogger(logger: Logger): void;
33
40
  }
@@ -28,6 +28,7 @@ var import_timing = require("../utils/timing.js");
28
28
  var import_type_guards = require("../utils/type-guards.js");
29
29
  var import_units = require("../utils/units.js");
30
30
  var import_document_controller = require("./document-controller.js");
31
+ var import_element_controller = require("./element-controller.js");
31
32
  var import_utils = require("./utils.js");
32
33
  class PageController extends import_document_controller.DocumentController {
33
34
  /** @deprecated should be avoided */
@@ -92,6 +93,52 @@ class PageController extends import_document_controller.DocumentController {
92
93
  const createPdfOptions = convertPdfOptions(options);
93
94
  return (0, import_timing.withTimeout)(options.timeout ?? 30 * import_units.millisecondsPerSecond, this.page.pdf(createPdfOptions), { errorMessage: "Rendering pdf timed out." });
94
95
  }
96
+ async scroll(deltaX, deltaY) {
97
+ await this.page.mouse.wheel(deltaX, deltaY);
98
+ }
99
+ async scrollTo(coordinatesOrController) {
100
+ const viewportSize = this.page.viewportSize();
101
+ if ((0, import_type_guards.isNull)(viewportSize)) {
102
+ throw new Error("Could not get page viewport size.");
103
+ }
104
+ const targetLeft = viewportSize.width / 3;
105
+ const targetRight = viewportSize.width / 3 * 2;
106
+ const targetTop = viewportSize.height / 3;
107
+ const targetBottom = viewportSize.height / 3 * 2;
108
+ const offsetX = viewportSize.width / 10;
109
+ const offsetY = viewportSize.height / 10;
110
+ const isElement = coordinatesOrController instanceof import_element_controller.ElementController;
111
+ while (true) {
112
+ const { scrollWidth, scrollHeight, scrollLeft, scrollTop, clientWidth, clientHeight } = await this.page.evaluate(async () => {
113
+ const { scrollWidth: scrollWidth2, scrollHeight: scrollHeight2, scrollLeft: scrollLeft2, scrollTop: scrollTop2, clientWidth: clientWidth2, clientHeight: clientHeight2 } = document.documentElement;
114
+ return { scrollWidth: scrollWidth2, scrollHeight: scrollHeight2, scrollLeft: scrollLeft2, scrollTop: scrollTop2, clientWidth: clientWidth2, clientHeight: clientHeight2 };
115
+ });
116
+ let targetX;
117
+ let targetY;
118
+ if (isElement) {
119
+ const boundingBox = await coordinatesOrController.boundingBox();
120
+ if ((0, import_type_guards.isNull)(boundingBox)) {
121
+ throw new Error("Could not get element bounding box.");
122
+ }
123
+ targetX = boundingBox.x + boundingBox.width / 2;
124
+ targetY = boundingBox.y + boundingBox.height / 2;
125
+ } else {
126
+ targetX = (0, import_type_guards.isDefined)(coordinatesOrController.x) ? coordinatesOrController.x - scrollLeft : void 0;
127
+ targetY = (0, import_type_guards.isDefined)(coordinatesOrController.y) ? coordinatesOrController.y - scrollTop : void 0;
128
+ }
129
+ const deltaX = (0, import_type_guards.isUndefined)(targetX) ? void 0 : targetX < targetLeft && scrollLeft > 0 ? -offsetX : targetX > targetRight && scrollLeft + clientWidth < scrollWidth ? offsetX : void 0;
130
+ const deltaY = (0, import_type_guards.isUndefined)(targetY) ? void 0 : targetY < targetTop && scrollTop > 0 ? -offsetY : targetY > targetBottom && scrollTop + clientHeight < scrollHeight ? offsetY : void 0;
131
+ if ((0, import_type_guards.isDefined)(deltaY)) {
132
+ await this.page.mouse.wheel(0, deltaY);
133
+ await (0, import_utils.delay)(Math.max(10, 150 - Math.abs(targetY - targetTop) / 10));
134
+ } else if ((0, import_type_guards.isDefined)(deltaX)) {
135
+ await this.page.mouse.wheel(deltaX, 0);
136
+ await (0, import_utils.delay)(Math.max(10, 150 - Math.abs(targetX - targetLeft) / 10));
137
+ } else {
138
+ break;
139
+ }
140
+ }
141
+ }
95
142
  renderPdfStream(options = {}) {
96
143
  return (0, import_readable_stream_from_promise.readableStreamFromPromise)(async () => {
97
144
  const buffer = await this.renderPdf(options);
@@ -1,3 +1,4 @@
1
+ import type { ValueOrProvider } from '../utils/value-or-provider.js';
1
2
  export type TimeoutOptions = {
2
3
  timeout?: number;
3
4
  };
@@ -8,3 +9,7 @@ export type WaitForStateOptions = {
8
9
  export type Abortable = {
9
10
  abort?: AbortSignal;
10
11
  };
12
+ export type Delay = ValueOrProvider<number>;
13
+ export type ActionDelayOptions = {
14
+ actionDelay?: Delay;
15
+ };
@@ -2,6 +2,7 @@ import type { Logger } from '../logger/logger.js';
2
2
  import type { BrowserContext, ElementHandle, Frame, LaunchOptions, Locator, Page } from 'playwright';
3
3
  import type { NewBrowserContextOptions } from './browser-controller.js';
4
4
  import type { NewBrowserOptions } from './browser.service.js';
5
+ import type { ActionDelayOptions, Delay, TimeoutOptions } from './types.js';
5
6
  export declare function getLaunchOptions(options: NewBrowserOptions): LaunchOptions;
6
7
  export declare function mergeNewBrowserContextOptions(a: NewBrowserContextOptions | undefined, b?: NewBrowserContextOptions, c?: NewBrowserContextOptions): NewBrowserContextOptions;
7
8
  export declare function attachLogger(loggable: Page | BrowserContext, logger: Logger): void;
@@ -12,3 +13,5 @@ export declare function isElementHandle(locatorOrHandle: Locator | ElementHandle
12
13
  export declare function isPage(pageOrFrameOrContext: Page | Frame | BrowserContext): pageOrFrameOrContext is Page;
13
14
  export declare function isFrame(pageOrFrameOrContext: Page | Frame | BrowserContext): pageOrFrameOrContext is Frame;
14
15
  export declare function isBrowserContext(pageOrFrameOrContext: Page | Frame | BrowserContext): pageOrFrameOrContext is BrowserContext;
16
+ export declare function prepareAction(options?: ActionDelayOptions & TimeoutOptions): Promise<void>;
17
+ export declare function delay(milliseconds: Delay | undefined): Promise<void>;
package/browser/utils.js CHANGED
@@ -21,17 +21,21 @@ __export(utils_exports, {
21
21
  assertLocator: () => assertLocator,
22
22
  assertLocatorPass: () => assertLocatorPass,
23
23
  attachLogger: () => attachLogger,
24
+ delay: () => delay,
24
25
  getLaunchOptions: () => getLaunchOptions,
25
26
  isBrowserContext: () => isBrowserContext,
26
27
  isElementHandle: () => isElementHandle,
27
28
  isFrame: () => isFrame,
28
29
  isLocator: () => isLocator,
29
30
  isPage: () => isPage,
30
- mergeNewBrowserContextOptions: () => mergeNewBrowserContextOptions
31
+ mergeNewBrowserContextOptions: () => mergeNewBrowserContextOptions,
32
+ prepareAction: () => prepareAction
31
33
  });
32
34
  module.exports = __toCommonJS(utils_exports);
33
35
  var import_object = require("../utils/object/object.js");
36
+ var import_timing = require("../utils/timing.js");
34
37
  var import_type_guards = require("../utils/type-guards.js");
38
+ var import_value_or_provider = require("../utils/value-or-provider.js");
35
39
  const pageLoggerMap = /* @__PURE__ */ new WeakMap();
36
40
  function getLaunchOptions(options) {
37
41
  const { windowSize, browserArguments, headless } = options;
@@ -125,3 +129,15 @@ function isFrame(pageOrFrameOrContext) {
125
129
  function isBrowserContext(pageOrFrameOrContext) {
126
130
  return pageOrFrameOrContext.constructor.name == "BrowserContext";
127
131
  }
132
+ async function prepareAction(options) {
133
+ const actionDelay = options?.actionDelay;
134
+ if ((0, import_type_guards.isDefined)(actionDelay)) {
135
+ await (0, import_timing.timeout)((0, import_value_or_provider.resolveValueOrProvider)(actionDelay));
136
+ }
137
+ }
138
+ async function delay(milliseconds) {
139
+ if ((0, import_type_guards.isUndefined)(milliseconds)) {
140
+ return;
141
+ }
142
+ await (0, import_timing.timeout)((0, import_value_or_provider.resolveValueOrProvider)(milliseconds));
143
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tstdl/base",
3
- "version": "0.87.2",
3
+ "version": "0.87.3",
4
4
  "author": "Patrick Hein",
5
5
  "publishConfig": {
6
6
  "access": "public"