@astur-mobile/test 0.1.0-beta.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/dist/index.d.ts +71 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +563 -0
- package/dist/index.js.map +1 -0
- package/package.json +46 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { type Page, type PlaywrightTestConfig } from '@playwright/test';
|
|
2
|
+
import { AsturRuntime, type AsturConfig, type AsturDevice, type Bounds, type MobileContextInfo, type WaitOptions, type WebViewSelector } from '@astur-mobile/core';
|
|
3
|
+
export { by, centerOf, findElement, flattenTree, MobileLocator, pointInBounds } from '@astur-mobile/core';
|
|
4
|
+
export type * from '@astur-mobile/core';
|
|
5
|
+
export interface AsturFixtures {
|
|
6
|
+
device: AsturDevice;
|
|
7
|
+
asturRuntime: AsturRuntime;
|
|
8
|
+
webview: AsturWebViewFactory;
|
|
9
|
+
}
|
|
10
|
+
export interface AsturOptions {
|
|
11
|
+
astur: AsturConfig;
|
|
12
|
+
}
|
|
13
|
+
export type AsturProjectConfig = Omit<NonNullable<PlaywrightTestConfig['projects']>[number], 'use'> & {
|
|
14
|
+
use?: PlaywrightTestConfig['use'] & {
|
|
15
|
+
astur?: AsturConfig;
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
export type AsturPlaywrightConfig = Omit<PlaywrightTestConfig, 'use' | 'projects'> & {
|
|
19
|
+
use?: PlaywrightTestConfig['use'] & {
|
|
20
|
+
astur?: AsturConfig;
|
|
21
|
+
};
|
|
22
|
+
projects?: AsturProjectConfig[];
|
|
23
|
+
};
|
|
24
|
+
export interface AsturWebView {
|
|
25
|
+
context: MobileContextInfo;
|
|
26
|
+
page: Page;
|
|
27
|
+
close(): Promise<void>;
|
|
28
|
+
}
|
|
29
|
+
export type AsturWebViewFactory = (selector?: WebViewSelector) => Promise<AsturWebView>;
|
|
30
|
+
type AsturExpectedText = string | RegExp;
|
|
31
|
+
interface AsturTestFixtures {
|
|
32
|
+
device: AsturDevice;
|
|
33
|
+
webview: AsturWebViewFactory;
|
|
34
|
+
}
|
|
35
|
+
interface AsturWorkerFixtures extends AsturOptions {
|
|
36
|
+
asturRuntime: AsturRuntime;
|
|
37
|
+
_asturWorkerDevice: AsturDevice;
|
|
38
|
+
}
|
|
39
|
+
interface AsturAssertionOptions extends WaitOptions {
|
|
40
|
+
exact?: boolean;
|
|
41
|
+
ignoreCase?: boolean;
|
|
42
|
+
}
|
|
43
|
+
type AsturMatcherResult = Promise<{
|
|
44
|
+
pass: boolean;
|
|
45
|
+
message: () => string;
|
|
46
|
+
}>;
|
|
47
|
+
export declare function createDefaultRuntime(): AsturRuntime;
|
|
48
|
+
export declare function defineConfig(config: AsturPlaywrightConfig): PlaywrightTestConfig;
|
|
49
|
+
export declare const test: import("@playwright/test").TestType<import("@playwright/test").PlaywrightTestArgs & import("@playwright/test").PlaywrightTestOptions & AsturTestFixtures, import("@playwright/test").PlaywrightWorkerArgs & import("@playwright/test").PlaywrightWorkerOptions & AsturWorkerFixtures>;
|
|
50
|
+
export declare function connectWebView(device: AsturDevice, selector?: WebViewSelector): Promise<AsturWebView>;
|
|
51
|
+
export declare const expect: import("@playwright/test").Expect<{
|
|
52
|
+
toBeVisible(actual: unknown, options?: {
|
|
53
|
+
timeout?: number;
|
|
54
|
+
}): Promise<{
|
|
55
|
+
pass: boolean;
|
|
56
|
+
message: () => string;
|
|
57
|
+
}>;
|
|
58
|
+
toBeHidden(actual: unknown, options?: WaitOptions): AsturMatcherResult;
|
|
59
|
+
toExist(actual: unknown, options?: WaitOptions): AsturMatcherResult;
|
|
60
|
+
toBeEnabled(actual: unknown, options?: WaitOptions): AsturMatcherResult;
|
|
61
|
+
toBeDisabled(actual: unknown, options?: WaitOptions): AsturMatcherResult;
|
|
62
|
+
toBeSelected(actual: unknown, options?: WaitOptions): AsturMatcherResult;
|
|
63
|
+
toBeFocused(actual: unknown, options?: WaitOptions): AsturMatcherResult;
|
|
64
|
+
toHaveText(actual: unknown, expected: AsturExpectedText, options?: AsturAssertionOptions): AsturMatcherResult;
|
|
65
|
+
toContainText(actual: unknown, expected: AsturExpectedText, options?: AsturAssertionOptions): AsturMatcherResult;
|
|
66
|
+
toHaveValue(actual: unknown, expected: AsturExpectedText, options?: AsturAssertionOptions): AsturMatcherResult;
|
|
67
|
+
toHaveLabel(actual: unknown, expected: AsturExpectedText, options?: AsturAssertionOptions): AsturMatcherResult;
|
|
68
|
+
toHaveType(actual: unknown, expected: AsturExpectedText, options?: AsturAssertionOptions): AsturMatcherResult;
|
|
69
|
+
toHaveBounds(actual: unknown, expected: Partial<Bounds>, options?: WaitOptions): AsturMatcherResult;
|
|
70
|
+
}>;
|
|
71
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,563 @@
|
|
|
1
|
+
import { defineConfig as definePlaywrightConfig, expect as baseExpect, chromium, _android, test as base } from '@playwright/test';
|
|
2
|
+
import { mkdir, readFile, rm, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { createAndroidDriver } from '@astur-mobile/android';
|
|
6
|
+
import { MobileLocator, waitFor, AsturRuntime } from '@astur-mobile/core';
|
|
7
|
+
import { createIosDriver } from '@astur-mobile/ios';
|
|
8
|
+
export { by, centerOf, findElement, flattenTree, MobileLocator, pointInBounds } from '@astur-mobile/core';
|
|
9
|
+
export function createDefaultRuntime() {
|
|
10
|
+
return new AsturRuntime()
|
|
11
|
+
.register(createAndroidDriver())
|
|
12
|
+
.register(createIosDriver());
|
|
13
|
+
}
|
|
14
|
+
export function defineConfig(config) {
|
|
15
|
+
return definePlaywrightConfig(config);
|
|
16
|
+
}
|
|
17
|
+
export const test = base.extend({
|
|
18
|
+
astur: [
|
|
19
|
+
{
|
|
20
|
+
platform: 'android',
|
|
21
|
+
device: { kind: 'emulator' },
|
|
22
|
+
timeout: 10_000
|
|
23
|
+
},
|
|
24
|
+
{ option: true, scope: 'worker' }
|
|
25
|
+
],
|
|
26
|
+
asturRuntime: [
|
|
27
|
+
async ({}, use) => {
|
|
28
|
+
await use(createDefaultRuntime());
|
|
29
|
+
},
|
|
30
|
+
{ scope: 'worker' }
|
|
31
|
+
],
|
|
32
|
+
_asturWorkerDevice: [
|
|
33
|
+
async ({ astur, asturRuntime }, use, workerInfo) => {
|
|
34
|
+
const reservation = await acquireDeviceReservation(astur, asturRuntime, workerInfo);
|
|
35
|
+
let device;
|
|
36
|
+
try {
|
|
37
|
+
device = await asturRuntime.createDevice(withDefaultWorkerArtifactsDir(reservation.config, workerInfo));
|
|
38
|
+
await use(device);
|
|
39
|
+
}
|
|
40
|
+
finally {
|
|
41
|
+
try {
|
|
42
|
+
await device?.close();
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
await reservation.release();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
{ scope: 'worker' }
|
|
50
|
+
],
|
|
51
|
+
device: async ({ astur, _asturWorkerDevice }, use, testInfo) => {
|
|
52
|
+
const device = _asturWorkerDevice;
|
|
53
|
+
const asturConfig = withDefaultArtifactsDir(astur, testInfo);
|
|
54
|
+
const videoMode = asturConfig.artifacts?.video ?? 'off';
|
|
55
|
+
let recordingStarted = false;
|
|
56
|
+
if (videoMode !== 'off') {
|
|
57
|
+
try {
|
|
58
|
+
await device.startRecording();
|
|
59
|
+
recordingStarted = true;
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
if (!isRecordingUnsupported(error)) {
|
|
63
|
+
throw error;
|
|
64
|
+
}
|
|
65
|
+
await testInfo.attach('astur-native-video-skipped', {
|
|
66
|
+
body: error instanceof Error ? error.message : String(error),
|
|
67
|
+
contentType: 'text/plain'
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
try {
|
|
72
|
+
await use(device);
|
|
73
|
+
}
|
|
74
|
+
finally {
|
|
75
|
+
const failed = testInfo.status !== testInfo.expectedStatus;
|
|
76
|
+
const screenshotMode = asturConfig.artifacts?.screenshot ?? 'off';
|
|
77
|
+
if (shouldAttachScreenshot(screenshotMode, failed)) {
|
|
78
|
+
await attachNativeScreenshot(testInfo, device);
|
|
79
|
+
}
|
|
80
|
+
if (recordingStarted) {
|
|
81
|
+
await attachNativeVideo(testInfo, device, shouldAttachVideo(videoMode, failed));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
webview: async ({ device }, use) => {
|
|
86
|
+
const handles = [];
|
|
87
|
+
try {
|
|
88
|
+
await use(async (selector) => {
|
|
89
|
+
const handle = await connectWebView(device, selector);
|
|
90
|
+
handles.push(handle);
|
|
91
|
+
return handle;
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
finally {
|
|
95
|
+
await Promise.all(handles.map((handle) => handle.close().catch(() => undefined)));
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
export async function connectWebView(device, selector) {
|
|
100
|
+
if (device.deviceInfo.platform === 'android') {
|
|
101
|
+
return connectAndroidWebView(device, selector);
|
|
102
|
+
}
|
|
103
|
+
const endpoint = await device.webViewEndpoint(selector);
|
|
104
|
+
const browser = await chromium.connectOverCDP(endpoint.cdpUrl);
|
|
105
|
+
const browserContext = browser.contexts()[0] ?? await browser.newContext();
|
|
106
|
+
const page = await selectPage(browserContext.pages(), endpoint.context, selector)
|
|
107
|
+
?? await browserContext.waitForEvent('page', { timeout: selector?.timeout ?? device.capabilities.timeout });
|
|
108
|
+
await page.waitForLoadState('domcontentloaded', { timeout: 5_000 }).catch(() => undefined);
|
|
109
|
+
return {
|
|
110
|
+
context: endpoint.context,
|
|
111
|
+
page,
|
|
112
|
+
close: async () => {
|
|
113
|
+
await browser.close();
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
async function connectAndroidWebView(device, selector) {
|
|
118
|
+
const endpoint = await device.webViewEndpoint(selector);
|
|
119
|
+
const androidDevice = await findPlaywrightAndroidDevice(device);
|
|
120
|
+
androidDevice.setDefaultTimeout(selector?.timeout ?? device.capabilities.timeout);
|
|
121
|
+
const webView = await androidDevice.webView({
|
|
122
|
+
pkg: selector?.packageName ?? endpoint.context.packageName ?? device.capabilities.app?.packageName,
|
|
123
|
+
socketName: endpoint.context.socket
|
|
124
|
+
}, { timeout: selector?.timeout ?? device.capabilities.timeout });
|
|
125
|
+
const page = await webView.page();
|
|
126
|
+
await page.waitForLoadState('domcontentloaded', { timeout: 5_000 }).catch(() => undefined);
|
|
127
|
+
return {
|
|
128
|
+
context: {
|
|
129
|
+
...endpoint.context,
|
|
130
|
+
packageName: endpoint.context.packageName ?? webView.pkg()
|
|
131
|
+
},
|
|
132
|
+
page,
|
|
133
|
+
close: async () => {
|
|
134
|
+
await androidDevice.close();
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
async function findPlaywrightAndroidDevice(device) {
|
|
139
|
+
const devices = await _android.devices();
|
|
140
|
+
const selected = devices.find((candidate) => candidate.serial() === device.deviceInfo.id);
|
|
141
|
+
await Promise.all(devices
|
|
142
|
+
.filter((candidate) => candidate !== selected)
|
|
143
|
+
.map((candidate) => candidate.close().catch(() => undefined)));
|
|
144
|
+
if (!selected) {
|
|
145
|
+
throw new Error(`Playwright could not attach to Android device ${device.deviceInfo.id}.`);
|
|
146
|
+
}
|
|
147
|
+
return selected;
|
|
148
|
+
}
|
|
149
|
+
async function selectPage(pages, context, selector) {
|
|
150
|
+
for (const page of pages) {
|
|
151
|
+
if (selector?.url && matchesText(page.url(), selector.url)) {
|
|
152
|
+
return page;
|
|
153
|
+
}
|
|
154
|
+
if (context.url && page.url() === context.url) {
|
|
155
|
+
return page;
|
|
156
|
+
}
|
|
157
|
+
if (selector?.title && matchesText(await page.title().catch(() => ''), selector.title)) {
|
|
158
|
+
return page;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return pages[0];
|
|
162
|
+
}
|
|
163
|
+
function matchesText(actual, expected) {
|
|
164
|
+
return expected instanceof RegExp ? expected.test(actual) : actual.includes(expected);
|
|
165
|
+
}
|
|
166
|
+
export const expect = baseExpect.extend({
|
|
167
|
+
async toBeVisible(actual, options) {
|
|
168
|
+
if (isPlaywrightLocator(actual)) {
|
|
169
|
+
return runPlaywrightAssertion('Expected Playwright locator to be visible.', () => actual.waitFor({ state: 'visible', timeout: options?.timeout }));
|
|
170
|
+
}
|
|
171
|
+
if (!(actual instanceof MobileLocator)) {
|
|
172
|
+
return {
|
|
173
|
+
pass: false,
|
|
174
|
+
message: () => 'Expected a Playwright Locator or Astur MobileLocator.'
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
const pass = await actual.isVisible({ timeout: options?.timeout });
|
|
178
|
+
return {
|
|
179
|
+
pass,
|
|
180
|
+
message: () => pass
|
|
181
|
+
? `Expected ${actual.toString()} not to be visible.`
|
|
182
|
+
: `Expected ${actual.toString()} to be visible.`
|
|
183
|
+
};
|
|
184
|
+
},
|
|
185
|
+
async toBeHidden(actual, options) {
|
|
186
|
+
if (isPlaywrightLocator(actual)) {
|
|
187
|
+
return runPlaywrightAssertion('Expected Playwright locator to be hidden.', () => actual.waitFor({ state: 'hidden', timeout: options?.timeout }));
|
|
188
|
+
}
|
|
189
|
+
if (!(actual instanceof MobileLocator)) {
|
|
190
|
+
return unsupportedActual('toBeHidden');
|
|
191
|
+
}
|
|
192
|
+
return runMobileAssertion(actual, () => actual.waitForHidden(options), `Expected ${actual.toString()} to be hidden.`, `Expected ${actual.toString()} not to be hidden.`);
|
|
193
|
+
},
|
|
194
|
+
async toExist(actual, options) {
|
|
195
|
+
if (isPlaywrightLocator(actual)) {
|
|
196
|
+
return runPlaywrightAssertion('Expected Playwright locator to be attached.', () => actual.waitFor({ state: 'attached', timeout: options?.timeout }));
|
|
197
|
+
}
|
|
198
|
+
if (!(actual instanceof MobileLocator)) {
|
|
199
|
+
return unsupportedActual('toExist');
|
|
200
|
+
}
|
|
201
|
+
return runMobileSnapshotAssertion(actual, () => true, options, `Expected ${actual.toString()} to exist.`, `Expected ${actual.toString()} not to exist.`);
|
|
202
|
+
},
|
|
203
|
+
async toBeEnabled(actual, options) {
|
|
204
|
+
if (isPlaywrightLocator(actual)) {
|
|
205
|
+
return runPlaywrightPredicateAssertion(() => actual.isEnabled({ timeout: 1_000 }), options, 'Expected Playwright locator to be enabled.', 'Expected Playwright locator not to be enabled.');
|
|
206
|
+
}
|
|
207
|
+
if (!(actual instanceof MobileLocator)) {
|
|
208
|
+
return unsupportedActual('toBeEnabled');
|
|
209
|
+
}
|
|
210
|
+
return runMobileSnapshotAssertion(actual, (snapshot) => snapshot.enabled, options, `Expected ${actual.toString()} to be enabled.`, `Expected ${actual.toString()} not to be enabled.`);
|
|
211
|
+
},
|
|
212
|
+
async toBeDisabled(actual, options) {
|
|
213
|
+
if (isPlaywrightLocator(actual)) {
|
|
214
|
+
return runPlaywrightPredicateAssertion(() => actual.isDisabled({ timeout: 1_000 }), options, 'Expected Playwright locator to be disabled.', 'Expected Playwright locator not to be disabled.');
|
|
215
|
+
}
|
|
216
|
+
if (!(actual instanceof MobileLocator)) {
|
|
217
|
+
return unsupportedActual('toBeDisabled');
|
|
218
|
+
}
|
|
219
|
+
return runMobileSnapshotAssertion(actual, (snapshot) => !snapshot.enabled, options, `Expected ${actual.toString()} to be disabled.`, `Expected ${actual.toString()} not to be disabled.`);
|
|
220
|
+
},
|
|
221
|
+
async toBeSelected(actual, options) {
|
|
222
|
+
if (!(actual instanceof MobileLocator)) {
|
|
223
|
+
return unsupportedActual('toBeSelected');
|
|
224
|
+
}
|
|
225
|
+
return runMobileSnapshotAssertion(actual, (snapshot) => snapshot.selected === true, options, `Expected ${actual.toString()} to be selected.`, `Expected ${actual.toString()} not to be selected.`);
|
|
226
|
+
},
|
|
227
|
+
async toBeFocused(actual, options) {
|
|
228
|
+
if (isPlaywrightLocator(actual)) {
|
|
229
|
+
return runPlaywrightPredicateAssertion(() => actual.evaluate((element) => element === element.ownerDocument.activeElement, { timeout: 1_000 }), options, 'Expected Playwright locator to be focused.', 'Expected Playwright locator not to be focused.');
|
|
230
|
+
}
|
|
231
|
+
if (!(actual instanceof MobileLocator)) {
|
|
232
|
+
return unsupportedActual('toBeFocused');
|
|
233
|
+
}
|
|
234
|
+
return runMobileSnapshotAssertion(actual, (snapshot) => snapshot.focused === true, options, `Expected ${actual.toString()} to be focused.`, `Expected ${actual.toString()} not to be focused.`);
|
|
235
|
+
},
|
|
236
|
+
async toHaveText(actual, expected, options) {
|
|
237
|
+
if (isPlaywrightLocator(actual)) {
|
|
238
|
+
return runPlaywrightValueAssertion(actual, 'text', expected, { ...options, exact: options?.exact ?? true }, `Expected Playwright locator to have text ${formatExpected(expected)}.`, `Expected Playwright locator not to have text ${formatExpected(expected)}.`);
|
|
239
|
+
}
|
|
240
|
+
if (!(actual instanceof MobileLocator)) {
|
|
241
|
+
return unsupportedActual('toHaveText');
|
|
242
|
+
}
|
|
243
|
+
return runMobileValueAssertion(actual, 'text', expected, { ...options, exact: options?.exact ?? true }, `Expected ${actual.toString()} to have text ${formatExpected(expected)}.`, `Expected ${actual.toString()} not to have text ${formatExpected(expected)}.`);
|
|
244
|
+
},
|
|
245
|
+
async toContainText(actual, expected, options) {
|
|
246
|
+
if (isPlaywrightLocator(actual)) {
|
|
247
|
+
return runPlaywrightValueAssertion(actual, 'text', expected, { ...options, exact: false }, `Expected Playwright locator to contain text ${formatExpected(expected)}.`, `Expected Playwright locator not to contain text ${formatExpected(expected)}.`);
|
|
248
|
+
}
|
|
249
|
+
if (!(actual instanceof MobileLocator)) {
|
|
250
|
+
return unsupportedActual('toContainText');
|
|
251
|
+
}
|
|
252
|
+
return runMobileValueAssertion(actual, 'text', expected, { ...options, exact: false }, `Expected ${actual.toString()} to contain text ${formatExpected(expected)}.`, `Expected ${actual.toString()} not to contain text ${formatExpected(expected)}.`);
|
|
253
|
+
},
|
|
254
|
+
async toHaveValue(actual, expected, options) {
|
|
255
|
+
if (isPlaywrightLocator(actual)) {
|
|
256
|
+
return runPlaywrightValueAssertion(actual, 'value', expected, { ...options, exact: options?.exact ?? true }, `Expected Playwright locator to have value ${formatExpected(expected)}.`, `Expected Playwright locator not to have value ${formatExpected(expected)}.`);
|
|
257
|
+
}
|
|
258
|
+
if (!(actual instanceof MobileLocator)) {
|
|
259
|
+
return unsupportedActual('toHaveValue');
|
|
260
|
+
}
|
|
261
|
+
return runMobileValueAssertion(actual, 'value', expected, { ...options, exact: options?.exact ?? true }, `Expected ${actual.toString()} to have value ${formatExpected(expected)}.`, `Expected ${actual.toString()} not to have value ${formatExpected(expected)}.`);
|
|
262
|
+
},
|
|
263
|
+
async toHaveLabel(actual, expected, options) {
|
|
264
|
+
if (!(actual instanceof MobileLocator)) {
|
|
265
|
+
return unsupportedActual('toHaveLabel');
|
|
266
|
+
}
|
|
267
|
+
return runMobileValueAssertion(actual, 'label', expected, { ...options, exact: options?.exact ?? true }, `Expected ${actual.toString()} to have label ${formatExpected(expected)}.`, `Expected ${actual.toString()} not to have label ${formatExpected(expected)}.`);
|
|
268
|
+
},
|
|
269
|
+
async toHaveType(actual, expected, options) {
|
|
270
|
+
if (!(actual instanceof MobileLocator)) {
|
|
271
|
+
return unsupportedActual('toHaveType');
|
|
272
|
+
}
|
|
273
|
+
return runMobileValueAssertion(actual, 'type', expected, { ...options, exact: options?.exact ?? true }, `Expected ${actual.toString()} to have type ${formatExpected(expected)}.`, `Expected ${actual.toString()} not to have type ${formatExpected(expected)}.`);
|
|
274
|
+
},
|
|
275
|
+
async toHaveBounds(actual, expected, options) {
|
|
276
|
+
if (!(actual instanceof MobileLocator)) {
|
|
277
|
+
return unsupportedActual('toHaveBounds');
|
|
278
|
+
}
|
|
279
|
+
return runMobileSnapshotAssertion(actual, (snapshot) => matchesBounds(snapshot.bounds, expected), options, `Expected ${actual.toString()} to have bounds ${JSON.stringify(expected)}.`, `Expected ${actual.toString()} not to have bounds ${JSON.stringify(expected)}.`);
|
|
280
|
+
}
|
|
281
|
+
});
|
|
282
|
+
function isPlaywrightLocator(actual) {
|
|
283
|
+
return typeof actual === 'object'
|
|
284
|
+
&& actual !== null
|
|
285
|
+
&& 'waitFor' in actual
|
|
286
|
+
&& typeof actual.waitFor === 'function';
|
|
287
|
+
}
|
|
288
|
+
async function runPlaywrightAssertion(failureMessage, assertion, negatedMessage = failureMessage.replace(' to ', ' not to ')) {
|
|
289
|
+
try {
|
|
290
|
+
await assertion();
|
|
291
|
+
return {
|
|
292
|
+
pass: true,
|
|
293
|
+
message: () => negatedMessage
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
catch (error) {
|
|
297
|
+
return {
|
|
298
|
+
pass: false,
|
|
299
|
+
message: () => formatAssertionFailure(error, failureMessage)
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
async function runPlaywrightPredicateAssertion(predicate, options, failureMessage, negatedMessage) {
|
|
304
|
+
return runPlaywrightAssertion(failureMessage, () => waitFor(async () => await predicate(), {
|
|
305
|
+
timeout: options?.timeout,
|
|
306
|
+
interval: options?.interval,
|
|
307
|
+
message: failureMessage
|
|
308
|
+
}), negatedMessage);
|
|
309
|
+
}
|
|
310
|
+
async function runPlaywrightValueAssertion(locator, field, expected, options, failureMessage, negatedMessage) {
|
|
311
|
+
return runPlaywrightAssertion(failureMessage, () => waitFor(async () => {
|
|
312
|
+
const actual = field === 'value'
|
|
313
|
+
? await readPlaywrightValue(locator)
|
|
314
|
+
: await locator.textContent({ timeout: 1_000 });
|
|
315
|
+
return matchesExpectedText(actual ?? undefined, expected, options);
|
|
316
|
+
}, {
|
|
317
|
+
timeout: options?.timeout,
|
|
318
|
+
interval: options?.interval,
|
|
319
|
+
message: failureMessage
|
|
320
|
+
}), negatedMessage);
|
|
321
|
+
}
|
|
322
|
+
async function readPlaywrightValue(locator) {
|
|
323
|
+
return locator.inputValue({ timeout: 1_000 })
|
|
324
|
+
.catch(() => locator.getAttribute('value', { timeout: 1_000 }));
|
|
325
|
+
}
|
|
326
|
+
async function runMobileAssertion(_locator, assertion, failureMessage, negatedMessage) {
|
|
327
|
+
try {
|
|
328
|
+
await assertion();
|
|
329
|
+
return {
|
|
330
|
+
pass: true,
|
|
331
|
+
message: () => negatedMessage
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
catch (error) {
|
|
335
|
+
return {
|
|
336
|
+
pass: false,
|
|
337
|
+
message: () => formatAssertionFailure(error, failureMessage)
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
async function runMobileSnapshotAssertion(locator, predicate, options, failureMessage, negatedMessage) {
|
|
342
|
+
return runMobileAssertion(locator, () => locator.waitForSnapshot(predicate, options), failureMessage, negatedMessage);
|
|
343
|
+
}
|
|
344
|
+
async function runMobileValueAssertion(locator, field, expected, options, failureMessage, negatedMessage) {
|
|
345
|
+
return runMobileSnapshotAssertion(locator, (snapshot) => matchesExpectedText(snapshot[field], expected, options), options, failureMessage, negatedMessage);
|
|
346
|
+
}
|
|
347
|
+
function unsupportedActual(matcherName) {
|
|
348
|
+
return {
|
|
349
|
+
pass: false,
|
|
350
|
+
message: () => `Expected a Playwright Locator or Astur MobileLocator for ${matcherName}.`
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
function matchesExpectedText(actual, expected, options) {
|
|
354
|
+
if (actual === undefined) {
|
|
355
|
+
return false;
|
|
356
|
+
}
|
|
357
|
+
const normalizedActual = options?.ignoreCase ? actual.toLowerCase() : actual;
|
|
358
|
+
if (expected instanceof RegExp) {
|
|
359
|
+
expected.lastIndex = 0;
|
|
360
|
+
const pass = expected.test(actual);
|
|
361
|
+
expected.lastIndex = 0;
|
|
362
|
+
return pass;
|
|
363
|
+
}
|
|
364
|
+
const normalizedExpected = options?.ignoreCase ? expected.toLowerCase() : expected;
|
|
365
|
+
return options?.exact === false
|
|
366
|
+
? normalizedActual.includes(normalizedExpected)
|
|
367
|
+
: normalizedActual === normalizedExpected;
|
|
368
|
+
}
|
|
369
|
+
function matchesBounds(actual, expected) {
|
|
370
|
+
return Object.entries(expected).every(([key, value]) => actual[key] === value);
|
|
371
|
+
}
|
|
372
|
+
function formatExpected(expected) {
|
|
373
|
+
return expected instanceof RegExp ? expected.toString() : JSON.stringify(expected);
|
|
374
|
+
}
|
|
375
|
+
function formatAssertionFailure(error, fallback) {
|
|
376
|
+
return error instanceof Error ? error.message : fallback;
|
|
377
|
+
}
|
|
378
|
+
function isRecordingUnsupported(error) {
|
|
379
|
+
return Boolean(error
|
|
380
|
+
&& typeof error === 'object'
|
|
381
|
+
&& 'code' in error
|
|
382
|
+
&& (error.code === 'IOS_REAL_DEVICE_RECORDING_NOT_SUPPORTED'
|
|
383
|
+
|| error.code === 'RECORDING_NOT_SUPPORTED'));
|
|
384
|
+
}
|
|
385
|
+
function shouldAttachScreenshot(mode, failed) {
|
|
386
|
+
return mode === 'on' || (mode === 'only-on-failure' && failed);
|
|
387
|
+
}
|
|
388
|
+
function withDefaultArtifactsDir(astur, testInfo) {
|
|
389
|
+
if (astur.artifactsDir) {
|
|
390
|
+
return astur;
|
|
391
|
+
}
|
|
392
|
+
return {
|
|
393
|
+
...astur,
|
|
394
|
+
artifactsDir: testInfo.outputPath('astur')
|
|
395
|
+
};
|
|
396
|
+
}
|
|
397
|
+
function withDefaultWorkerArtifactsDir(astur, workerInfo) {
|
|
398
|
+
if (astur.artifactsDir) {
|
|
399
|
+
return astur;
|
|
400
|
+
}
|
|
401
|
+
return {
|
|
402
|
+
...astur,
|
|
403
|
+
artifactsDir: join(workerInfo.project.outputDir, `.astur-worker-${pathSafeName(workerInfo.project.name || 'default')}-${workerInfo.workerIndex}`)
|
|
404
|
+
};
|
|
405
|
+
}
|
|
406
|
+
function pathSafeName(value) {
|
|
407
|
+
return value.replace(/[^a-zA-Z0-9._-]+/g, '-');
|
|
408
|
+
}
|
|
409
|
+
async function acquireDeviceReservation(astur, asturRuntime, workerInfo) {
|
|
410
|
+
const candidates = await deviceReservationCandidates(astur, asturRuntime, workerInfo);
|
|
411
|
+
const blockedKeys = [];
|
|
412
|
+
for (const candidate of candidates) {
|
|
413
|
+
const release = await tryAcquireDeviceReservation(candidate, workerInfo);
|
|
414
|
+
if (release) {
|
|
415
|
+
return {
|
|
416
|
+
config: candidate,
|
|
417
|
+
release
|
|
418
|
+
};
|
|
419
|
+
}
|
|
420
|
+
blockedKeys.push(deviceReservationKey(candidate));
|
|
421
|
+
}
|
|
422
|
+
const keyList = blockedKeys.length > 0 ? blockedKeys.join(', ') : deviceReservationKey(astur);
|
|
423
|
+
throw new Error([
|
|
424
|
+
`Astur could not reserve an available mobile device for ${astur.platform}.`,
|
|
425
|
+
`Checked: ${keyList}.`,
|
|
426
|
+
'Native mobile devices can run only one active app automation session at a time.',
|
|
427
|
+
'Use one Playwright project per physical device, or leave device.id unset so Astur can choose a free matching device from the pool.',
|
|
428
|
+
`Current project: ${workerInfo.project.name || 'default'}, worker: ${workerInfo.workerIndex}.`
|
|
429
|
+
].join(' '));
|
|
430
|
+
}
|
|
431
|
+
async function tryAcquireDeviceReservation(astur, workerInfo) {
|
|
432
|
+
const key = deviceReservationKey(astur);
|
|
433
|
+
const root = join(tmpdir(), 'astur-device-locks');
|
|
434
|
+
const lockDir = join(root, pathSafeName(key));
|
|
435
|
+
const ownerPath = join(lockDir, 'owner.json');
|
|
436
|
+
await mkdir(root, { recursive: true });
|
|
437
|
+
try {
|
|
438
|
+
await mkdir(lockDir);
|
|
439
|
+
}
|
|
440
|
+
catch (error) {
|
|
441
|
+
if (!isAlreadyExistsError(error)) {
|
|
442
|
+
throw error;
|
|
443
|
+
}
|
|
444
|
+
const owner = await readReservationOwner(ownerPath);
|
|
445
|
+
if (owner?.pid && !isProcessAlive(owner.pid)) {
|
|
446
|
+
await rm(lockDir, { recursive: true, force: true });
|
|
447
|
+
await mkdir(lockDir);
|
|
448
|
+
}
|
|
449
|
+
else {
|
|
450
|
+
return undefined;
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
await writeFile(ownerPath, JSON.stringify({
|
|
454
|
+
key,
|
|
455
|
+
pid: process.pid,
|
|
456
|
+
projectName: workerInfo.project.name || 'default',
|
|
457
|
+
workerIndex: workerInfo.workerIndex,
|
|
458
|
+
createdAt: new Date().toISOString()
|
|
459
|
+
}, null, 2));
|
|
460
|
+
return async () => {
|
|
461
|
+
await rm(lockDir, { recursive: true, force: true });
|
|
462
|
+
};
|
|
463
|
+
}
|
|
464
|
+
async function deviceReservationCandidates(astur, asturRuntime, workerInfo) {
|
|
465
|
+
if (!usesLooseDeviceSelector(astur.device)) {
|
|
466
|
+
return [astur];
|
|
467
|
+
}
|
|
468
|
+
const devices = (await asturRuntime.listDevices(astur.platform))
|
|
469
|
+
.filter((device) => matchesDeviceSelector(device, astur.device))
|
|
470
|
+
.filter(isReservableDevice)
|
|
471
|
+
.sort(compareDeviceInfo);
|
|
472
|
+
if (devices.length === 0) {
|
|
473
|
+
return [astur];
|
|
474
|
+
}
|
|
475
|
+
const start = workerInfo.workerIndex % devices.length;
|
|
476
|
+
const ordered = [...devices.slice(start), ...devices.slice(0, start)];
|
|
477
|
+
return ordered.map((device) => ({
|
|
478
|
+
...astur,
|
|
479
|
+
device: {
|
|
480
|
+
...astur.device,
|
|
481
|
+
id: device.id,
|
|
482
|
+
kind: device.kind
|
|
483
|
+
}
|
|
484
|
+
}));
|
|
485
|
+
}
|
|
486
|
+
function usesLooseDeviceSelector(selector) {
|
|
487
|
+
return !selector?.id && !selector?.name && !selector?.avd && !selector?.cloud;
|
|
488
|
+
}
|
|
489
|
+
function matchesDeviceSelector(device, selector) {
|
|
490
|
+
if (selector?.kind && device.kind !== selector.kind) {
|
|
491
|
+
return false;
|
|
492
|
+
}
|
|
493
|
+
return true;
|
|
494
|
+
}
|
|
495
|
+
function isReservableDevice(device) {
|
|
496
|
+
return device.state === 'online' || device.state === 'booted';
|
|
497
|
+
}
|
|
498
|
+
function compareDeviceInfo(left, right) {
|
|
499
|
+
return `${left.platform}:${left.kind}:${left.name}:${left.id}`
|
|
500
|
+
.localeCompare(`${right.platform}:${right.kind}:${right.name}:${right.id}`);
|
|
501
|
+
}
|
|
502
|
+
function deviceReservationKey(astur) {
|
|
503
|
+
const device = astur.device ?? {};
|
|
504
|
+
const selector = device.id
|
|
505
|
+
? `id=${device.id}`
|
|
506
|
+
: device.avd
|
|
507
|
+
? `avd=${device.avd}`
|
|
508
|
+
: device.name
|
|
509
|
+
? `name=${String(device.name)}`
|
|
510
|
+
: device.kind
|
|
511
|
+
? `kind=${device.kind}`
|
|
512
|
+
: 'auto';
|
|
513
|
+
return `${astur.platform}:${selector}`;
|
|
514
|
+
}
|
|
515
|
+
async function readReservationOwner(path) {
|
|
516
|
+
try {
|
|
517
|
+
return JSON.parse(await readFile(path, 'utf8'));
|
|
518
|
+
}
|
|
519
|
+
catch {
|
|
520
|
+
return undefined;
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
function isAlreadyExistsError(error) {
|
|
524
|
+
return typeof error === 'object' && error !== null && 'code' in error && error.code === 'EEXIST';
|
|
525
|
+
}
|
|
526
|
+
function isProcessAlive(pid) {
|
|
527
|
+
try {
|
|
528
|
+
process.kill(pid, 0);
|
|
529
|
+
return true;
|
|
530
|
+
}
|
|
531
|
+
catch {
|
|
532
|
+
return false;
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
function shouldAttachVideo(mode, failed) {
|
|
536
|
+
return mode === 'on' || (mode === 'retain-on-failure' && failed);
|
|
537
|
+
}
|
|
538
|
+
async function attachNativeScreenshot(testInfo, device) {
|
|
539
|
+
try {
|
|
540
|
+
await testInfo.attach('astur-native-screenshot', {
|
|
541
|
+
body: await device.screenshot(),
|
|
542
|
+
contentType: 'image/png'
|
|
543
|
+
});
|
|
544
|
+
}
|
|
545
|
+
catch {
|
|
546
|
+
// Artifact capture must not hide the original test result.
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
async function attachNativeVideo(testInfo, device, attach) {
|
|
550
|
+
try {
|
|
551
|
+
const video = await device.stopRecording({ discard: !attach });
|
|
552
|
+
if (attach && video?.length) {
|
|
553
|
+
await testInfo.attach('astur-native-video', {
|
|
554
|
+
body: video,
|
|
555
|
+
contentType: 'video/mp4'
|
|
556
|
+
});
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
catch {
|
|
560
|
+
// Artifact capture must not hide the original test result.
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,IAAI,sBAAsB,EACtC,MAAM,IAAI,UAAU,EACpB,QAAQ,EACR,QAAQ,EAIR,IAAI,IAAI,IAAI,EAIb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAEL,aAAa,EACb,OAAO,EACP,YAAY,EAWb,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EACL,EAAE,EACF,QAAQ,EACR,WAAW,EACX,WAAW,EACX,aAAa,EACb,aAAa,EACd,MAAM,oBAAoB,CAAC;AAwD5B,MAAM,UAAU,oBAAoB;IAClC,OAAO,IAAI,YAAY,EAAE;SACtB,QAAQ,CAAC,mBAAmB,EAAE,CAAC;SAC/B,QAAQ,CAAC,eAAe,EAAE,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAA6B;IACxD,OAAO,sBAAsB,CAAC,MAA8B,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAyC;IACtE,KAAK,EAAE;QACL;YACE,QAAQ,EAAE,SAAS;YACnB,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;YAC5B,OAAO,EAAE,MAAM;SAChB;QACD,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE;KAClC;IAED,YAAY,EAAE;QACZ,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE;YAChB,MAAM,GAAG,CAAC,oBAAoB,EAAE,CAAC,CAAC;QACpC,CAAC;QACD,EAAE,KAAK,EAAE,QAAQ,EAAE;KACpB;IAED,kBAAkB,EAAE;QAClB,KAAK,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE;YACjD,MAAM,WAAW,GAAG,MAAM,wBAAwB,CAAC,KAAK,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;YACpF,IAAI,MAA+B,CAAC;YAEpC,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC,6BAA6B,CAAC,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;gBACxG,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC;YACpB,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC;oBACH,MAAM,MAAM,EAAE,KAAK,EAAE,CAAC;gBACxB,CAAC;wBAAS,CAAC;oBACT,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC;gBAC9B,CAAC;YACH,CAAC;QACH,CAAC;QACD,EAAE,KAAK,EAAE,QAAQ,EAAE;KACpB;IAED,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE;QAC7D,MAAM,MAAM,GAAG,kBAAkB,CAAC;QAClC,MAAM,WAAW,GAAG,uBAAuB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC7D,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,EAAE,KAAK,IAAI,KAAK,CAAC;QACxD,IAAI,gBAAgB,GAAG,KAAK,CAAC;QAE7B,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;YACxB,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,cAAc,EAAE,CAAC;gBAC9B,gBAAgB,GAAG,IAAI,CAAC;YAC1B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,EAAE,CAAC;oBACnC,MAAM,KAAK,CAAC;gBACd,CAAC;gBAED,MAAM,QAAQ,CAAC,MAAM,CAAC,4BAA4B,EAAE;oBAClD,IAAI,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;oBAC5D,WAAW,EAAE,YAAY;iBAC1B,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC;QACpB,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,cAAc,CAAC;YAC3D,MAAM,cAAc,GAAG,WAAW,CAAC,SAAS,EAAE,UAAU,IAAI,KAAK,CAAC;YAElE,IAAI,sBAAsB,CAAC,cAAc,EAAE,MAAM,CAAC,EAAE,CAAC;gBACnD,MAAM,sBAAsB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACjD,CAAC;YAED,IAAI,gBAAgB,EAAE,CAAC;gBACrB,MAAM,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,iBAAiB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;YAClF,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,EAAE;QACjC,MAAM,OAAO,GAAmB,EAAE,CAAC;QAEnC,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,KAAK,EAAE,QAA0B,EAAE,EAAE;gBAC7C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;gBACtD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACrB,OAAO,MAAM,CAAC;YAChB,CAAC,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACpF,CAAC;IACH,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAmB,EACnB,QAA0B;IAE1B,IAAI,MAAM,CAAC,UAAU,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC7C,OAAO,qBAAqB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;IACxD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/D,MAAM,cAAc,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;IAC3E,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,cAAc,CAAC,KAAK,EAAE,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC;WAC5E,MAAM,cAAc,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,IAAI,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC;IAE9G,MAAM,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAE3F,OAAO;QACL,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,IAAI;QACJ,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,MAAmB,EACnB,QAA0B;IAE1B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;IACxD,MAAM,aAAa,GAAG,MAAM,2BAA2B,CAAC,MAAM,CAAC,CAAC;IAChE,aAAa,CAAC,iBAAiB,CAAC,QAAQ,EAAE,OAAO,IAAI,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IAElF,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,OAAO,CACzC;QACE,GAAG,EAAE,QAAQ,EAAE,WAAW,IAAI,QAAQ,CAAC,OAAO,CAAC,WAAW,IAAI,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,WAAW;QAClG,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM;KACpC,EACD,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,IAAI,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,CAC9D,CAAC;IACF,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;IAClC,MAAM,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAE3F,OAAO;QACL,OAAO,EAAE;YACP,GAAG,QAAQ,CAAC,OAAO;YACnB,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE;SAC3D;QACD,IAAI;QACJ,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC;QAC9B,CAAC;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,2BAA2B,CAAC,MAAmB;IAC5D,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;IACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IAE1F,MAAM,OAAO,CAAC,GAAG,CACf,OAAO;SACJ,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,KAAK,QAAQ,CAAC;SAC7C,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAChE,CAAC;IAEF,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,iDAAiD,MAAM,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,CAAC;IAC5F,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,KAAa,EACb,OAA0B,EAC1B,QAA0B;IAE1B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,QAAQ,EAAE,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3D,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC;YAC9C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,QAAQ,EAAE,KAAK,IAAI,WAAW,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACvF,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,WAAW,CAAC,MAAc,EAAE,QAAyB;IAC5D,OAAO,QAAQ,YAAY,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACxF,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IACtC,KAAK,CAAC,WAAW,CAAC,MAAe,EAAE,OAA8B;QAC/D,IAAI,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;YAChC,OAAO,sBAAsB,CAC3B,4CAA4C,EAC5C,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CACtE,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,CAAC,MAAM,YAAY,aAAa,CAAC,EAAE,CAAC;YACvC,OAAO;gBACL,IAAI,EAAE,KAAK;gBACX,OAAO,EAAE,GAAG,EAAE,CAAC,uDAAuD;aACvE,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAEnE,OAAO;YACL,IAAI;YACJ,OAAO,EAAE,GAAG,EAAE,CACZ,IAAI;gBACF,CAAC,CAAC,YAAY,MAAM,CAAC,QAAQ,EAAE,qBAAqB;gBACpD,CAAC,CAAC,YAAY,MAAM,CAAC,QAAQ,EAAE,iBAAiB;SACrD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAe,EAAE,OAAqB;QACrD,IAAI,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;YAChC,OAAO,sBAAsB,CAC3B,2CAA2C,EAC3C,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CACrE,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,CAAC,MAAM,YAAY,aAAa,CAAC,EAAE,CAAC;YACvC,OAAO,iBAAiB,CAAC,YAAY,CAAC,CAAC;QACzC,CAAC;QAED,OAAO,kBAAkB,CACvB,MAAM,EACN,GAAG,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,EACnC,YAAY,MAAM,CAAC,QAAQ,EAAE,gBAAgB,EAC7C,YAAY,MAAM,CAAC,QAAQ,EAAE,oBAAoB,CAClD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAe,EAAE,OAAqB;QAClD,IAAI,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;YAChC,OAAO,sBAAsB,CAC3B,6CAA6C,EAC7C,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CACvE,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,CAAC,MAAM,YAAY,aAAa,CAAC,EAAE,CAAC;YACvC,OAAO,iBAAiB,CAAC,SAAS,CAAC,CAAC;QACtC,CAAC;QAED,OAAO,0BAA0B,CAC/B,MAAM,EACN,GAAG,EAAE,CAAC,IAAI,EACV,OAAO,EACP,YAAY,MAAM,CAAC,QAAQ,EAAE,YAAY,EACzC,YAAY,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAC9C,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAe,EAAE,OAAqB;QACtD,IAAI,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;YAChC,OAAO,+BAA+B,CACpC,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAC1C,OAAO,EACP,4CAA4C,EAC5C,gDAAgD,CACjD,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,CAAC,MAAM,YAAY,aAAa,CAAC,EAAE,CAAC;YACvC,OAAO,iBAAiB,CAAC,aAAa,CAAC,CAAC;QAC1C,CAAC;QAED,OAAO,0BAA0B,CAC/B,MAAM,EACN,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,EAC9B,OAAO,EACP,YAAY,MAAM,CAAC,QAAQ,EAAE,iBAAiB,EAC9C,YAAY,MAAM,CAAC,QAAQ,EAAE,qBAAqB,CACnD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAe,EAAE,OAAqB;QACvD,IAAI,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;YAChC,OAAO,+BAA+B,CACpC,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAC3C,OAAO,EACP,6CAA6C,EAC7C,iDAAiD,CAClD,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,CAAC,MAAM,YAAY,aAAa,CAAC,EAAE,CAAC;YACvC,OAAO,iBAAiB,CAAC,cAAc,CAAC,CAAC;QAC3C,CAAC;QAED,OAAO,0BAA0B,CAC/B,MAAM,EACN,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,EAC/B,OAAO,EACP,YAAY,MAAM,CAAC,QAAQ,EAAE,kBAAkB,EAC/C,YAAY,MAAM,CAAC,QAAQ,EAAE,sBAAsB,CACpD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAe,EAAE,OAAqB;QACvD,IAAI,CAAC,CAAC,MAAM,YAAY,aAAa,CAAC,EAAE,CAAC;YACvC,OAAO,iBAAiB,CAAC,cAAc,CAAC,CAAC;QAC3C,CAAC;QAED,OAAO,0BAA0B,CAC/B,MAAM,EACN,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,KAAK,IAAI,EACxC,OAAO,EACP,YAAY,MAAM,CAAC,QAAQ,EAAE,kBAAkB,EAC/C,YAAY,MAAM,CAAC,QAAQ,EAAE,sBAAsB,CACpD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAe,EAAE,OAAqB;QACtD,IAAI,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;YAChC,OAAO,+BAA+B,CACpC,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,OAAO,CAAC,aAAa,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EACvG,OAAO,EACP,4CAA4C,EAC5C,gDAAgD,CACjD,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,CAAC,MAAM,YAAY,aAAa,CAAC,EAAE,CAAC;YACvC,OAAO,iBAAiB,CAAC,aAAa,CAAC,CAAC;QAC1C,CAAC;QAED,OAAO,0BAA0B,CAC/B,MAAM,EACN,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,KAAK,IAAI,EACvC,OAAO,EACP,YAAY,MAAM,CAAC,QAAQ,EAAE,iBAAiB,EAC9C,YAAY,MAAM,CAAC,QAAQ,EAAE,qBAAqB,CACnD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU,CACd,MAAe,EACf,QAA2B,EAC3B,OAA+B;QAE/B,IAAI,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;YAChC,OAAO,2BAA2B,CAChC,MAAM,EACN,MAAM,EACN,QAAQ,EACR,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,IAAI,EAAE,EAC7C,4CAA4C,cAAc,CAAC,QAAQ,CAAC,GAAG,EACvE,gDAAgD,cAAc,CAAC,QAAQ,CAAC,GAAG,CAC5E,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,CAAC,MAAM,YAAY,aAAa,CAAC,EAAE,CAAC;YACvC,OAAO,iBAAiB,CAAC,YAAY,CAAC,CAAC;QACzC,CAAC;QAED,OAAO,uBAAuB,CAC5B,MAAM,EACN,MAAM,EACN,QAAQ,EACR,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,IAAI,EAAE,EAC7C,YAAY,MAAM,CAAC,QAAQ,EAAE,iBAAiB,cAAc,CAAC,QAAQ,CAAC,GAAG,EACzE,YAAY,MAAM,CAAC,QAAQ,EAAE,qBAAqB,cAAc,CAAC,QAAQ,CAAC,GAAG,CAC9E,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,MAAe,EACf,QAA2B,EAC3B,OAA+B;QAE/B,IAAI,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;YAChC,OAAO,2BAA2B,CAChC,MAAM,EACN,MAAM,EACN,QAAQ,EACR,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAC5B,+CAA+C,cAAc,CAAC,QAAQ,CAAC,GAAG,EAC1E,mDAAmD,cAAc,CAAC,QAAQ,CAAC,GAAG,CAC/E,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,CAAC,MAAM,YAAY,aAAa,CAAC,EAAE,CAAC;YACvC,OAAO,iBAAiB,CAAC,eAAe,CAAC,CAAC;QAC5C,CAAC;QAED,OAAO,uBAAuB,CAC5B,MAAM,EACN,MAAM,EACN,QAAQ,EACR,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAC5B,YAAY,MAAM,CAAC,QAAQ,EAAE,oBAAoB,cAAc,CAAC,QAAQ,CAAC,GAAG,EAC5E,YAAY,MAAM,CAAC,QAAQ,EAAE,wBAAwB,cAAc,CAAC,QAAQ,CAAC,GAAG,CACjF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW,CACf,MAAe,EACf,QAA2B,EAC3B,OAA+B;QAE/B,IAAI,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;YAChC,OAAO,2BAA2B,CAChC,MAAM,EACN,OAAO,EACP,QAAQ,EACR,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,IAAI,EAAE,EAC7C,6CAA6C,cAAc,CAAC,QAAQ,CAAC,GAAG,EACxE,iDAAiD,cAAc,CAAC,QAAQ,CAAC,GAAG,CAC7E,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,CAAC,MAAM,YAAY,aAAa,CAAC,EAAE,CAAC;YACvC,OAAO,iBAAiB,CAAC,aAAa,CAAC,CAAC;QAC1C,CAAC;QAED,OAAO,uBAAuB,CAC5B,MAAM,EACN,OAAO,EACP,QAAQ,EACR,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,IAAI,EAAE,EAC7C,YAAY,MAAM,CAAC,QAAQ,EAAE,kBAAkB,cAAc,CAAC,QAAQ,CAAC,GAAG,EAC1E,YAAY,MAAM,CAAC,QAAQ,EAAE,sBAAsB,cAAc,CAAC,QAAQ,CAAC,GAAG,CAC/E,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW,CACf,MAAe,EACf,QAA2B,EAC3B,OAA+B;QAE/B,IAAI,CAAC,CAAC,MAAM,YAAY,aAAa,CAAC,EAAE,CAAC;YACvC,OAAO,iBAAiB,CAAC,aAAa,CAAC,CAAC;QAC1C,CAAC;QAED,OAAO,uBAAuB,CAC5B,MAAM,EACN,OAAO,EACP,QAAQ,EACR,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,IAAI,EAAE,EAC7C,YAAY,MAAM,CAAC,QAAQ,EAAE,kBAAkB,cAAc,CAAC,QAAQ,CAAC,GAAG,EAC1E,YAAY,MAAM,CAAC,QAAQ,EAAE,sBAAsB,cAAc,CAAC,QAAQ,CAAC,GAAG,CAC/E,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU,CACd,MAAe,EACf,QAA2B,EAC3B,OAA+B;QAE/B,IAAI,CAAC,CAAC,MAAM,YAAY,aAAa,CAAC,EAAE,CAAC;YACvC,OAAO,iBAAiB,CAAC,YAAY,CAAC,CAAC;QACzC,CAAC;QAED,OAAO,uBAAuB,CAC5B,MAAM,EACN,MAAM,EACN,QAAQ,EACR,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,IAAI,EAAE,EAC7C,YAAY,MAAM,CAAC,QAAQ,EAAE,iBAAiB,cAAc,CAAC,QAAQ,CAAC,GAAG,EACzE,YAAY,MAAM,CAAC,QAAQ,EAAE,qBAAqB,cAAc,CAAC,QAAQ,CAAC,GAAG,CAC9E,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,MAAe,EACf,QAAyB,EACzB,OAAqB;QAErB,IAAI,CAAC,CAAC,MAAM,YAAY,aAAa,CAAC,EAAE,CAAC;YACvC,OAAO,iBAAiB,CAAC,cAAc,CAAC,CAAC;QAC3C,CAAC;QAED,OAAO,0BAA0B,CAC/B,MAAM,EACN,CAAC,QAAQ,EAAE,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,EACtD,OAAO,EACP,YAAY,MAAM,CAAC,QAAQ,EAAE,mBAAmB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,EAC3E,YAAY,MAAM,CAAC,QAAQ,EAAE,uBAAuB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAChF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC;AAEH,SAAS,mBAAmB,CAAC,MAAe;IAC1C,OAAO,OAAO,MAAM,KAAK,QAAQ;WAC5B,MAAM,KAAK,IAAI;WACf,SAAS,IAAI,MAAM;WACnB,OAAQ,MAAgC,CAAC,OAAO,KAAK,UAAU,CAAC;AACvE,CAAC;AAED,KAAK,UAAU,sBAAsB,CACnC,cAAsB,EACtB,SAAiC,EACjC,cAAc,GAAG,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC;IAE3D,IAAI,CAAC;QACH,MAAM,SAAS,EAAE,CAAC;QAClB,OAAO;YACL,IAAI,EAAE,IAAI;YACV,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc;SAC9B,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,IAAI,EAAE,KAAK;YACX,OAAO,EAAE,GAAG,EAAE,CAAC,sBAAsB,CAAC,KAAK,EAAE,cAAc,CAAC;SAC7D,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,+BAA+B,CAC5C,SAAiC,EACjC,OAAgC,EAChC,cAAsB,EACtB,cAAsB;IAEtB,OAAO,sBAAsB,CAC3B,cAAc,EACd,GAAG,EAAE,CAAC,OAAO,CACX,KAAK,IAAI,EAAE,CAAC,MAAM,SAAS,EAAE,EAC7B;QACE,OAAO,EAAE,OAAO,EAAE,OAAO;QACzB,QAAQ,EAAE,OAAO,EAAE,QAAQ;QAC3B,OAAO,EAAE,cAAc;KACxB,CACF,EACD,cAAc,CACf,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,2BAA2B,CACxC,OAAgB,EAChB,KAAuB,EACvB,QAA2B,EAC3B,OAA0C,EAC1C,cAAsB,EACtB,cAAsB;IAEtB,OAAO,sBAAsB,CAC3B,cAAc,EACd,GAAG,EAAE,CAAC,OAAO,CACX,KAAK,IAAI,EAAE;QACT,MAAM,MAAM,GAAG,KAAK,KAAK,OAAO;YAC9B,CAAC,CAAC,MAAM,mBAAmB,CAAC,OAAO,CAAC;YACpC,CAAC,CAAC,MAAM,OAAO,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAElD,OAAO,mBAAmB,CAAC,MAAM,IAAI,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACrE,CAAC,EACD;QACE,OAAO,EAAE,OAAO,EAAE,OAAO;QACzB,QAAQ,EAAE,OAAO,EAAE,QAAQ;QAC3B,OAAO,EAAE,cAAc;KACxB,CACF,EACD,cAAc,CACf,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,OAAgB;IACjD,OAAO,OAAO,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;SAC1C,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,QAAuB,EACvB,SAAiC,EACjC,cAAsB,EACtB,cAAsB;IAEtB,IAAI,CAAC;QACH,MAAM,SAAS,EAAE,CAAC;QAClB,OAAO;YACL,IAAI,EAAE,IAAI;YACV,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc;SAC9B,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,IAAI,EAAE,KAAK;YACX,OAAO,EAAE,GAAG,EAAE,CAAC,sBAAsB,CAAC,KAAK,EAAE,cAAc,CAAC;SAC7D,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,0BAA0B,CACvC,OAAsB,EACtB,SAAuD,EACvD,OAAgC,EAChC,cAAsB,EACtB,cAAsB;IAEtB,OAAO,kBAAkB,CACvB,OAAO,EACP,GAAG,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC,SAAS,EAAE,OAAO,CAAC,EACjD,cAAc,EACd,cAAc,CACf,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,uBAAuB,CACpC,OAAsB,EACtB,KAA0C,EAC1C,QAA2B,EAC3B,OAA0C,EAC1C,cAAsB,EACtB,cAAsB;IAEtB,OAAO,0BAA0B,CAC/B,OAAO,EACP,CAAC,QAAQ,EAAE,EAAE,CAAC,mBAAmB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,EACrE,OAAO,EACP,cAAc,EACd,cAAc,CACf,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,WAAmB;IAC5C,OAAO;QACL,IAAI,EAAE,KAAK;QACX,OAAO,EAAE,GAAG,EAAE,CAAC,4DAA4D,WAAW,GAAG;KAC1F,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAC1B,MAA0B,EAC1B,QAA2B,EAC3B,OAA0C;IAE1C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,gBAAgB,GAAG,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;IAE7E,IAAI,QAAQ,YAAY,MAAM,EAAE,CAAC;QAC/B,QAAQ,CAAC,SAAS,GAAG,CAAC,CAAC;QACvB,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnC,QAAQ,CAAC,SAAS,GAAG,CAAC,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,kBAAkB,GAAG,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;IACnF,OAAO,OAAO,EAAE,KAAK,KAAK,KAAK;QAC7B,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QAC/C,CAAC,CAAC,gBAAgB,KAAK,kBAAkB,CAAC;AAC9C,CAAC;AAED,SAAS,aAAa,CAAC,MAAc,EAAE,QAAyB;IAC9D,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,GAAmB,CAAC,KAAK,KAAK,CAAC,CAAC;AACjG,CAAC;AAED,SAAS,cAAc,CAAC,QAA2B;IACjD,OAAO,QAAQ,YAAY,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;AACrF,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAc,EAAE,QAAgB;IAC9D,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC3D,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAc;IAC5C,OAAO,OAAO,CACZ,KAAK;WACF,OAAO,KAAK,KAAK,QAAQ;WACzB,MAAM,IAAI,KAAK;WACf,CACA,KAA2B,CAAC,IAAI,KAAK,yCAAyC;eAC3E,KAA2B,CAAC,IAAI,KAAK,yBAAyB,CACnE,CACF,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAyD,EAAE,MAAe;IACxG,OAAO,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,iBAAiB,IAAI,MAAM,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAkB,EAAE,QAAkB;IACrE,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO;QACL,GAAG,KAAK;QACR,YAAY,EAAE,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC;KAC3C,CAAC;AACJ,CAAC;AAED,SAAS,6BAA6B,CAAC,KAAkB,EAAE,UAAsB;IAC/E,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO;QACL,GAAG,KAAK;QACR,YAAY,EAAE,IAAI,CAChB,UAAU,CAAC,OAAO,CAAC,SAAS,EAC5B,iBAAiB,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,IAAI,SAAS,CAAC,IAAI,UAAU,CAAC,WAAW,EAAE,CAChG;KACF,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,KAAK,CAAC,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;AACjD,CAAC;AAOD,KAAK,UAAU,wBAAwB,CACrC,KAAkB,EAClB,YAA0B,EAC1B,UAAsB;IAEtB,MAAM,UAAU,GAAG,MAAM,2BAA2B,CAAC,KAAK,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;IACtF,MAAM,WAAW,GAAa,EAAE,CAAC;IAEjC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,MAAM,2BAA2B,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACzE,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,OAAO;aACR,CAAC;QACJ,CAAC;QAED,WAAW,CAAC,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC9F,MAAM,IAAI,KAAK,CACb;QACE,0DAA0D,KAAK,CAAC,QAAQ,GAAG;QAC3E,YAAY,OAAO,GAAG;QACtB,iFAAiF;QACjF,oIAAoI;QACpI,oBAAoB,UAAU,CAAC,OAAO,CAAC,IAAI,IAAI,SAAS,aAAa,UAAU,CAAC,WAAW,GAAG;KAC/F,CAAC,IAAI,CAAC,GAAG,CAAC,CACZ,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,2BAA2B,CAAC,KAAkB,EAAE,UAAsB;IACnF,MAAM,GAAG,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,oBAAoB,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAE9C,MAAM,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEvC,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC;YACjC,MAAM,KAAK,CAAC;QACd,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,SAAS,CAAC,CAAC;QACpD,IAAI,KAAK,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7C,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACpD,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,MAAM,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC;QACxC,GAAG;QACH,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,WAAW,EAAE,UAAU,CAAC,OAAO,CAAC,IAAI,IAAI,SAAS;QACjD,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAEb,OAAO,KAAK,IAAI,EAAE;QAChB,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,2BAA2B,CACxC,KAAkB,EAClB,YAA0B,EAC1B,UAAsB;IAEtB,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3C,OAAO,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC;IAED,MAAM,OAAO,GAAG,CAAC,MAAM,YAAY,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;SAC7D,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,qBAAqB,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;SAC/D,MAAM,CAAC,kBAAkB,CAAC;SAC1B,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAE3B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IACtD,MAAM,OAAO,GAAG,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IAEtE,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC9B,GAAG,KAAK;QACR,MAAM,EAAE;YACN,GAAG,KAAK,CAAC,MAAM;YACf,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,IAAI,EAAE,MAAM,CAAC,IAAI;SAClB;KACF,CAAC,CAAC,CAAC;AACN,CAAC;AAED,SAAS,uBAAuB,CAAC,QAAoC;IACnE,OAAO,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC;AAChF,CAAC;AAED,SAAS,qBAAqB,CAAC,MAAkB,EAAE,QAAoC;IACrF,IAAI,QAAQ,EAAE,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;QACpD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAkB;IAC5C,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC;AAChE,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAgB,EAAE,KAAiB;IAC5D,OAAO,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,EAAE;SAC3D,aAAa,CAAC,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAkB;IAC9C,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;IAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,EAAE;QACxB,CAAC,CAAC,MAAM,MAAM,CAAC,EAAE,EAAE;QACnB,CAAC,CAAC,MAAM,CAAC,GAAG;YACV,CAAC,CAAC,OAAO,MAAM,CAAC,GAAG,EAAE;YACrB,CAAC,CAAC,MAAM,CAAC,IAAI;gBACX,CAAC,CAAC,QAAQ,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;gBAC/B,CAAC,CAAC,MAAM,CAAC,IAAI;oBACX,CAAC,CAAC,QAAQ,MAAM,CAAC,IAAI,EAAE;oBACvB,CAAC,CAAC,MAAM,CAAC;IAEjB,OAAO,GAAG,KAAK,CAAC,QAAQ,IAAI,QAAQ,EAAE,CAAC;AACzC,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,IAAY;IAK9C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAI7C,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;AACnG,CAAC;AAED,SAAS,cAAc,CAAC,GAAW;IACjC,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAoD,EAAE,MAAe;IAC9F,OAAO,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,mBAAmB,IAAI,MAAM,CAAC,CAAC;AACnE,CAAC;AAED,KAAK,UAAU,sBAAsB,CACnC,QAAkB,EAClB,MAAmB;IAEnB,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,MAAM,CAAC,yBAAyB,EAAE;YAC/C,IAAI,EAAE,MAAM,MAAM,CAAC,UAAU,EAAE;YAC/B,WAAW,EAAE,WAAW;SACzB,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,2DAA2D;IAC7D,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,QAAkB,EAClB,MAAmB,EACnB,MAAe;IAEf,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,EAAiC,CAAC,CAAC;QAC9F,IAAI,MAAM,IAAI,KAAK,EAAE,MAAM,EAAE,CAAC;YAC5B,MAAM,QAAQ,CAAC,MAAM,CAAC,oBAAoB,EAAE;gBAC1C,IAAI,EAAE,KAAK;gBACX,WAAW,EAAE,WAAW;aACzB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,2DAA2D;IAC7D,CAAC;AACH,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@astur-mobile/test",
|
|
3
|
+
"version": "0.1.0-beta.0",
|
|
4
|
+
"description": "Playwright Test integration for Astur.",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"author": "Amr Salem",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"main": "./dist/index.js",
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"default": "./dist/index.js"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"publishConfig": {
|
|
17
|
+
"access": "public"
|
|
18
|
+
},
|
|
19
|
+
"files": [
|
|
20
|
+
"dist"
|
|
21
|
+
],
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "tsc -b"
|
|
24
|
+
},
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"@astur-mobile/android": "0.1.0-beta.0",
|
|
27
|
+
"@astur-mobile/core": "0.1.0-beta.0",
|
|
28
|
+
"@astur-mobile/ios": "0.1.0-beta.0",
|
|
29
|
+
"@astur-mobile/protocol": "0.1.0-beta.0"
|
|
30
|
+
},
|
|
31
|
+
"peerDependencies": {
|
|
32
|
+
"@playwright/test": ">=1.50.0"
|
|
33
|
+
},
|
|
34
|
+
"devDependencies": {
|
|
35
|
+
"@playwright/test": "^1.60.0"
|
|
36
|
+
},
|
|
37
|
+
"repository": {
|
|
38
|
+
"type": "git",
|
|
39
|
+
"url": "git+https://github.com/Astur-mobile/Astur.git",
|
|
40
|
+
"directory": "packages/test"
|
|
41
|
+
},
|
|
42
|
+
"homepage": "https://astur-mobile.github.io/Astur/",
|
|
43
|
+
"bugs": {
|
|
44
|
+
"url": "https://github.com/Astur-mobile/Astur/issues"
|
|
45
|
+
}
|
|
46
|
+
}
|