@mobilewright/core 0.0.1

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.
@@ -0,0 +1,244 @@
1
+ import { test, expect } from '@playwright/test';
2
+ import { queryAll } from './query-engine.js';
3
+ function node(overrides) {
4
+ return {
5
+ isVisible: true,
6
+ isEnabled: true,
7
+ bounds: { x: 0, y: 0, width: 100, height: 44 },
8
+ children: [],
9
+ ...overrides,
10
+ };
11
+ }
12
+ const sampleTree = [
13
+ node({
14
+ type: 'Application',
15
+ children: [
16
+ node({
17
+ type: 'Window',
18
+ children: [
19
+ node({
20
+ type: 'NavigationBar',
21
+ label: 'Login',
22
+ children: [
23
+ node({ type: 'StaticText', label: 'Login', text: 'Login' }),
24
+ ],
25
+ }),
26
+ node({
27
+ type: 'TextField',
28
+ label: 'Email',
29
+ identifier: 'emailField',
30
+ placeholder: 'Enter email',
31
+ bounds: { x: 20, y: 120, width: 350, height: 44 },
32
+ }),
33
+ node({
34
+ type: 'SecureTextField',
35
+ label: 'Password',
36
+ identifier: 'passwordField',
37
+ bounds: { x: 20, y: 180, width: 350, height: 44 },
38
+ }),
39
+ node({
40
+ type: 'Button',
41
+ label: 'Sign In',
42
+ identifier: 'loginButton',
43
+ bounds: { x: 20, y: 250, width: 350, height: 50 },
44
+ }),
45
+ node({
46
+ type: 'Button',
47
+ label: 'Forgot Password?',
48
+ identifier: 'forgotPassword',
49
+ isVisible: false,
50
+ bounds: { x: 20, y: 320, width: 350, height: 30 },
51
+ }),
52
+ node({
53
+ type: 'Switch',
54
+ label: 'Remember Me',
55
+ identifier: 'rememberMe',
56
+ value: '0',
57
+ bounds: { x: 20, y: 370, width: 51, height: 31 },
58
+ }),
59
+ ],
60
+ }),
61
+ ],
62
+ }),
63
+ ];
64
+ test.describe('queryAll', () => {
65
+ test('finds by label (exact)', () => {
66
+ const results = queryAll(sampleTree, { kind: 'label', value: 'Sign In' });
67
+ expect(results).toHaveLength(1);
68
+ expect(results[0].identifier).toBe('loginButton');
69
+ });
70
+ test('finds by label (substring, exact=false)', () => {
71
+ const results = queryAll(sampleTree, {
72
+ kind: 'label',
73
+ value: 'sign in',
74
+ exact: false,
75
+ });
76
+ expect(results).toHaveLength(1);
77
+ expect(results[0].identifier).toBe('loginButton');
78
+ });
79
+ test('finds by testId', () => {
80
+ const results = queryAll(sampleTree, {
81
+ kind: 'testId',
82
+ value: 'emailField',
83
+ });
84
+ expect(results).toHaveLength(1);
85
+ expect(results[0].label).toBe('Email');
86
+ });
87
+ test('finds by text (exact string)', () => {
88
+ const results = queryAll(sampleTree, {
89
+ kind: 'text',
90
+ value: 'Login',
91
+ });
92
+ // StaticText has text='Login', NavigationBar has label='Login'
93
+ expect(results.length).toBeGreaterThanOrEqual(1);
94
+ expect(results[0].type).toBe('NavigationBar');
95
+ });
96
+ test('finds by text (regex)', () => {
97
+ const results = queryAll(sampleTree, {
98
+ kind: 'text',
99
+ value: /forgot/i,
100
+ });
101
+ expect(results).toHaveLength(1);
102
+ expect(results[0].identifier).toBe('forgotPassword');
103
+ });
104
+ test('finds by type', () => {
105
+ const results = queryAll(sampleTree, {
106
+ kind: 'type',
107
+ value: 'Button',
108
+ });
109
+ expect(results).toHaveLength(2);
110
+ });
111
+ test('type matching is case-insensitive', () => {
112
+ const results = queryAll(sampleTree, {
113
+ kind: 'type',
114
+ value: 'button',
115
+ });
116
+ expect(results).toHaveLength(2);
117
+ });
118
+ test('finds by role (button)', () => {
119
+ const results = queryAll(sampleTree, {
120
+ kind: 'role',
121
+ value: 'button',
122
+ });
123
+ expect(results).toHaveLength(2);
124
+ });
125
+ test('finds by role with name filter', () => {
126
+ const results = queryAll(sampleTree, {
127
+ kind: 'role',
128
+ value: 'button',
129
+ name: 'Sign In',
130
+ });
131
+ expect(results).toHaveLength(1);
132
+ expect(results[0].identifier).toBe('loginButton');
133
+ });
134
+ test('finds by role with regex name filter', () => {
135
+ const results = queryAll(sampleTree, {
136
+ kind: 'role',
137
+ value: 'button',
138
+ name: /forgot/i,
139
+ });
140
+ expect(results).toHaveLength(1);
141
+ expect(results[0].identifier).toBe('forgotPassword');
142
+ });
143
+ test('supports chained queries', () => {
144
+ const strategy = {
145
+ kind: 'chain',
146
+ parent: { kind: 'type', value: 'NavigationBar' },
147
+ child: { kind: 'type', value: 'StaticText' },
148
+ };
149
+ const results = queryAll(sampleTree, strategy);
150
+ expect(results).toHaveLength(1);
151
+ expect(results[0].text).toBe('Login');
152
+ });
153
+ test('returns empty array when nothing matches', () => {
154
+ const results = queryAll(sampleTree, {
155
+ kind: 'testId',
156
+ value: 'nonExistent',
157
+ });
158
+ expect(results).toHaveLength(0);
159
+ });
160
+ test('returns results in document order', () => {
161
+ const results = queryAll(sampleTree, { kind: 'type', value: 'Button' });
162
+ expect(results[0].label).toBe('Sign In');
163
+ expect(results[1].label).toBe('Forgot Password?');
164
+ });
165
+ });
166
+ test.describe('queryAll with flat hierarchy (bounds-based chains)', () => {
167
+ // Simulates mobilecli's flat element list — no children, all at root level
168
+ const flatList = [
169
+ node({
170
+ type: 'Cell',
171
+ label: 'Row 1',
172
+ bounds: { x: 0, y: 0, width: 400, height: 100 },
173
+ }),
174
+ node({
175
+ type: 'StaticText',
176
+ label: 'Title 1',
177
+ text: 'Title 1',
178
+ bounds: { x: 10, y: 10, width: 200, height: 30 },
179
+ }),
180
+ node({
181
+ type: 'Button',
182
+ label: 'Delete',
183
+ identifier: 'delete1',
184
+ bounds: { x: 300, y: 10, width: 80, height: 30 },
185
+ }),
186
+ node({
187
+ type: 'Cell',
188
+ label: 'Row 2',
189
+ bounds: { x: 0, y: 100, width: 400, height: 100 },
190
+ }),
191
+ node({
192
+ type: 'StaticText',
193
+ label: 'Title 2',
194
+ text: 'Title 2',
195
+ bounds: { x: 10, y: 110, width: 200, height: 30 },
196
+ }),
197
+ node({
198
+ type: 'Button',
199
+ label: 'Delete',
200
+ identifier: 'delete2',
201
+ bounds: { x: 300, y: 110, width: 80, height: 30 },
202
+ }),
203
+ ];
204
+ test('chain finds elements within parent bounds', () => {
205
+ const strategy = {
206
+ kind: 'chain',
207
+ parent: { kind: 'label', value: 'Row 1' },
208
+ child: { kind: 'role', value: 'button' },
209
+ };
210
+ const results = queryAll(flatList, strategy);
211
+ expect(results).toHaveLength(1);
212
+ expect(results[0].identifier).toBe('delete1');
213
+ });
214
+ test('chain finds text within specific row', () => {
215
+ const strategy = {
216
+ kind: 'chain',
217
+ parent: { kind: 'label', value: 'Row 2' },
218
+ child: { kind: 'type', value: 'StaticText' },
219
+ };
220
+ const results = queryAll(flatList, strategy);
221
+ expect(results).toHaveLength(1);
222
+ expect(results[0].text).toBe('Title 2');
223
+ });
224
+ test('chain returns empty when no children in parent bounds', () => {
225
+ const strategy = {
226
+ kind: 'chain',
227
+ parent: { kind: 'label', value: 'Row 1' },
228
+ child: { kind: 'type', value: 'Image' },
229
+ };
230
+ const results = queryAll(flatList, strategy);
231
+ expect(results).toHaveLength(0);
232
+ });
233
+ test('does not match parent itself as a child result', () => {
234
+ const strategy = {
235
+ kind: 'chain',
236
+ parent: { kind: 'label', value: 'Row 1' },
237
+ child: { kind: 'type', value: 'Cell' },
238
+ };
239
+ const results = queryAll(flatList, strategy);
240
+ // Row 2 is NOT within Row 1's bounds, and Row 1 should not match itself
241
+ expect(results).toHaveLength(0);
242
+ });
243
+ });
244
+ //# sourceMappingURL=query-engine.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-engine.test.js","sourceRoot":"","sources":["../src/query-engine.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { HardwareButton, MobilewrightDriver, ScreenshotOptions, SwipeDirection, SwipeOptions } from '@mobilewright/protocol';
2
+ import { Locator, type LocatorOptions } from './locator.js';
3
+ export declare class Screen {
4
+ private readonly driver;
5
+ private readonly root;
6
+ constructor(driver: MobilewrightDriver, locatorDefaults?: LocatorOptions);
7
+ getByLabel(label: string, opts?: {
8
+ exact?: boolean;
9
+ }): Locator;
10
+ getByTestId(testId: string): Locator;
11
+ getByText(text: string | RegExp, opts?: {
12
+ exact?: boolean;
13
+ }): Locator;
14
+ getByType(type: string): Locator;
15
+ getByRole(role: string, opts?: {
16
+ name?: string | RegExp;
17
+ }): Locator;
18
+ screenshot(opts?: ScreenshotOptions): Promise<Buffer>;
19
+ swipe(direction: SwipeDirection, opts?: SwipeOptions): Promise<void>;
20
+ pressButton(button: HardwareButton): Promise<void>;
21
+ tap(x: number, y: number): Promise<void>;
22
+ }
23
+ //# sourceMappingURL=screen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen.d.ts","sourceRoot":"","sources":["../src/screen.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,YAAY,EACb,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAE5D,qBAAa,MAAM;IAIf,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHzB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAU;gBAGZ,MAAM,EAAE,kBAAkB,EAC3C,eAAe,GAAE,cAAmB;IAOtC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO;IAI9D,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAIpC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO;IAIrE,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIhC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,GAAG,OAAO;IAM7D,UAAU,CAAC,IAAI,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;IAIrD,KAAK,CACT,SAAS,EAAE,cAAc,EACzB,IAAI,CAAC,EAAE,YAAY,GAClB,OAAO,CAAC,IAAI,CAAC;IAIV,WAAW,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlD,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAG/C"}
package/dist/screen.js ADDED
@@ -0,0 +1,37 @@
1
+ import { Locator } from './locator.js';
2
+ export class Screen {
3
+ constructor(driver, locatorDefaults = {}) {
4
+ this.driver = driver;
5
+ this.root = Locator.root(driver, locatorDefaults);
6
+ }
7
+ // ─── Locator factories (delegated to root locator) ─────────
8
+ getByLabel(label, opts) {
9
+ return this.root.getByLabel(label, opts);
10
+ }
11
+ getByTestId(testId) {
12
+ return this.root.getByTestId(testId);
13
+ }
14
+ getByText(text, opts) {
15
+ return this.root.getByText(text, opts);
16
+ }
17
+ getByType(type) {
18
+ return this.root.getByType(type);
19
+ }
20
+ getByRole(role, opts) {
21
+ return this.root.getByRole(role, opts);
22
+ }
23
+ // ─── Direct screen actions ──────────────────────────────────
24
+ async screenshot(opts) {
25
+ return this.driver.screenshot(opts);
26
+ }
27
+ async swipe(direction, opts) {
28
+ return this.driver.swipe(direction, opts);
29
+ }
30
+ async pressButton(button) {
31
+ return this.driver.pressButton(button);
32
+ }
33
+ async tap(x, y) {
34
+ return this.driver.tap(x, y);
35
+ }
36
+ }
37
+ //# sourceMappingURL=screen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen.js","sourceRoot":"","sources":["../src/screen.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,OAAO,EAAuB,MAAM,cAAc,CAAC;AAE5D,MAAM,OAAO,MAAM;IAGjB,YACmB,MAA0B,EAC3C,kBAAkC,EAAE;QADnB,WAAM,GAAN,MAAM,CAAoB;QAG3C,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACpD,CAAC;IAED,8DAA8D;IAE9D,UAAU,CAAC,KAAa,EAAE,IAA0B;QAClD,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED,WAAW,CAAC,MAAc;QACxB,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,SAAS,CAAC,IAAqB,EAAE,IAA0B;QACzD,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,SAAS,CAAC,IAAY;QACpB,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,SAAS,CAAC,IAAY,EAAE,IAAiC;QACvD,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,+DAA+D;IAE/D,KAAK,CAAC,UAAU,CAAC,IAAwB;QACvC,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,KAAK,CACT,SAAyB,EACzB,IAAmB;QAEnB,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAsB;QACtC,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,CAAS,EAAE,CAAS;QAC5B,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/B,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export declare function sleep(ms: number): Promise<void>;
2
+ //# sourceMappingURL=sleep.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sleep.d.ts","sourceRoot":"","sources":["../src/sleep.ts"],"names":[],"mappings":"AAAA,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C"}
package/dist/sleep.js ADDED
@@ -0,0 +1,4 @@
1
+ export function sleep(ms) {
2
+ return new Promise((resolve) => setTimeout(resolve, ms));
3
+ }
4
+ //# sourceMappingURL=sleep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sleep.js","sourceRoot":"","sources":["../src/sleep.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,KAAK,CAAC,EAAU;IAC9B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC"}
package/package.json ADDED
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "@mobilewright/core",
3
+ "version": "0.0.1",
4
+ "description": "Core API for Mobilewright mobile automation",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "default": "./dist/index.js"
12
+ }
13
+ },
14
+ "scripts": {
15
+ "build": "tsc -b",
16
+ "prepublishOnly": "tsc -b"
17
+ },
18
+ "files": [
19
+ "dist"
20
+ ],
21
+ "dependencies": {
22
+ "@mobilewright/protocol": "^0.0.1",
23
+ "sharp": "^0.34.5"
24
+ }
25
+ }