@goliapkg/smix 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/README.md +193 -0
  2. package/dist/A11yNode.d.ts +36 -0
  3. package/dist/A11yNode.d.ts.map +1 -0
  4. package/dist/A11yNode.js +30 -0
  5. package/dist/A11yNode.js.map +1 -0
  6. package/dist/App.d.ts +57 -0
  7. package/dist/App.d.ts.map +1 -0
  8. package/dist/App.js +123 -0
  9. package/dist/App.js.map +1 -0
  10. package/dist/ExpectationFailure.d.ts +30 -0
  11. package/dist/ExpectationFailure.d.ts.map +1 -0
  12. package/dist/ExpectationFailure.js +47 -0
  13. package/dist/ExpectationFailure.js.map +1 -0
  14. package/dist/HttpRunner.d.ts +61 -0
  15. package/dist/HttpRunner.d.ts.map +1 -0
  16. package/dist/HttpRunner.js +148 -0
  17. package/dist/HttpRunner.js.map +1 -0
  18. package/dist/Locator.d.ts +60 -0
  19. package/dist/Locator.d.ts.map +1 -0
  20. package/dist/Locator.js +177 -0
  21. package/dist/Locator.js.map +1 -0
  22. package/dist/Pattern.d.ts +21 -0
  23. package/dist/Pattern.d.ts.map +1 -0
  24. package/dist/Pattern.js +44 -0
  25. package/dist/Pattern.js.map +1 -0
  26. package/dist/Selector.d.ts +96 -0
  27. package/dist/Selector.d.ts.map +1 -0
  28. package/dist/Selector.js +276 -0
  29. package/dist/Selector.js.map +1 -0
  30. package/dist/SelectorResolver.d.ts +41 -0
  31. package/dist/SelectorResolver.d.ts.map +1 -0
  32. package/dist/SelectorResolver.js +55 -0
  33. package/dist/SelectorResolver.js.map +1 -0
  34. package/dist/SimRuntime.d.ts +81 -0
  35. package/dist/SimRuntime.d.ts.map +1 -0
  36. package/dist/SimRuntime.js +91 -0
  37. package/dist/SimRuntime.js.map +1 -0
  38. package/dist/Smix.d.ts +22 -0
  39. package/dist/Smix.d.ts.map +1 -0
  40. package/dist/Smix.js +35 -0
  41. package/dist/Smix.js.map +1 -0
  42. package/dist/index.d.ts +11 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +16 -0
  45. package/dist/index.js.map +1 -0
  46. package/package.json +44 -0
  47. package/src/A11yNode.ts +62 -0
  48. package/src/App.ts +153 -0
  49. package/src/ExpectationFailure.ts +67 -0
  50. package/src/HttpRunner.ts +185 -0
  51. package/src/Locator.ts +190 -0
  52. package/src/Pattern.ts +51 -0
  53. package/src/Selector.ts +296 -0
  54. package/src/SelectorResolver.ts +76 -0
  55. package/src/SimRuntime.ts +145 -0
  56. package/src/Smix.ts +49 -0
  57. package/src/__tests__/AppFullApi.test.ts +168 -0
  58. package/src/__tests__/AppTapMock.test.ts +122 -0
  59. package/src/__tests__/HttpRunner.test.ts +121 -0
  60. package/src/__tests__/Locator.test.ts +128 -0
  61. package/src/__tests__/LocatorToHave.test.ts +118 -0
  62. package/src/__tests__/MvpApiShape.test.ts +117 -0
  63. package/src/__tests__/SelectorFullSchema.test.ts +161 -0
  64. package/src/index.ts +76 -0
@@ -0,0 +1,276 @@
1
+ // v7.5 c1 — Selector full 7-case + Modifiers flatten + Pattern + fluent.
2
+ //
3
+ // Mirror Swift v7.2 c3 + Kotlin v7.4 c4 + Rust smix-selector
4
+ // `#[serde(untagged)] enum Selector` with full `Modifiers` flatten on
5
+ // Text/Id/Label/Role/LocalizedText bases. Focused has no modifiers.
6
+ // Anchor uses AnchorBox + IndexModifiers.
7
+ //
8
+ // Class-based API (mirrors Kotlin sealed interface 1:1):
9
+ // sel.id('btn-login')
10
+ // .below(sel.text(literal('Sign In')))
11
+ // .nth(0)
12
+ //
13
+ // Each fluent method returns a NEW Selector (immutable copy semantics).
14
+ import { patternFromJson, patternToJson } from './Pattern.js';
15
+ /**
16
+ * A11y selector — identifies a node in the tree.
17
+ *
18
+ * Wire JSON shape matches Rust smix-selector `#[serde(untagged)]`:
19
+ * discriminator is which key is present. Modifiers are flattened
20
+ * into the same JSON body. Implemented via [selectorToJson].
21
+ */
22
+ export class Selector {
23
+ data;
24
+ constructor(data) {
25
+ this.data = data;
26
+ }
27
+ // ---- Constructors -----------------------------------------------------
28
+ static id(value) {
29
+ return new Selector({ kind: 'id', id: value, modifiers: {} });
30
+ }
31
+ static text(p) {
32
+ return new Selector({ kind: 'text', text: p, modifiers: {} });
33
+ }
34
+ static label(value) {
35
+ return new Selector({ kind: 'label', label: value, modifiers: {} });
36
+ }
37
+ static role(value, name) {
38
+ return new Selector({
39
+ kind: 'role',
40
+ role: value,
41
+ ...(name !== undefined ? { name } : {}),
42
+ modifiers: {},
43
+ });
44
+ }
45
+ static focused() {
46
+ return new Selector({ kind: 'focused' });
47
+ }
48
+ static anchor(box, index = {}) {
49
+ return new Selector({ kind: 'anchor', box, index });
50
+ }
51
+ static localizedText(map) {
52
+ return new Selector({ kind: 'localizedText', map, modifiers: {} });
53
+ }
54
+ // ---- Fluent chaining --------------------------------------------------
55
+ below(anchor) { return this.withMods(m => ({ ...m, below: anchor })); }
56
+ above(anchor) { return this.withMods(m => ({ ...m, above: anchor })); }
57
+ leftOf(anchor) { return this.withMods(m => ({ ...m, leftOf: anchor })); }
58
+ rightOf(anchor) { return this.withMods(m => ({ ...m, rightOf: anchor })); }
59
+ near(anchor) { return this.withMods(m => ({ ...m, near: anchor })); }
60
+ inside(anchor) { return this.withMods(m => ({ ...m, inside: anchor })); }
61
+ ancestor(anchor) { return this.withMods(m => ({ ...m, ancestor: anchor })); }
62
+ nth(i) { return this.withMods(m => ({ ...m, nth: i })); }
63
+ first() { return this.withMods(m => ({ ...m, first: true })); }
64
+ last() { return this.withMods(m => ({ ...m, last: true })); }
65
+ withMods(mutate) {
66
+ const d = this.data;
67
+ switch (d.kind) {
68
+ case 'id':
69
+ return new Selector({ ...d, modifiers: mutate(d.modifiers) });
70
+ case 'text':
71
+ return new Selector({ ...d, modifiers: mutate(d.modifiers) });
72
+ case 'label':
73
+ return new Selector({ ...d, modifiers: mutate(d.modifiers) });
74
+ case 'role':
75
+ return new Selector({ ...d, modifiers: mutate(d.modifiers) });
76
+ case 'localizedText':
77
+ return new Selector({ ...d, modifiers: mutate(d.modifiers) });
78
+ case 'focused':
79
+ return this; // no modifiers — no-op
80
+ case 'anchor': {
81
+ const proxy = mutate({});
82
+ const newIdx = {
83
+ ...(proxy.nth !== undefined ? { nth: proxy.nth } : d.index.nth !== undefined ? { nth: d.index.nth } : {}),
84
+ ...(proxy.first !== undefined ? { first: proxy.first } : d.index.first !== undefined ? { first: d.index.first } : {}),
85
+ ...(proxy.last !== undefined ? { last: proxy.last } : d.index.last !== undefined ? { last: d.index.last } : {}),
86
+ };
87
+ return new Selector({ ...d, index: newIdx });
88
+ }
89
+ }
90
+ }
91
+ }
92
+ // ---- JSON encoding (Rust-compatible untagged + flatten) -----------------
93
+ function addModifiers(out, m) {
94
+ if (m.near !== undefined)
95
+ out.near = selectorToJsonValue(m.near);
96
+ if (m.below !== undefined)
97
+ out.below = selectorToJsonValue(m.below);
98
+ if (m.above !== undefined)
99
+ out.above = selectorToJsonValue(m.above);
100
+ if (m.leftOf !== undefined)
101
+ out.leftOf = selectorToJsonValue(m.leftOf);
102
+ if (m.rightOf !== undefined)
103
+ out.rightOf = selectorToJsonValue(m.rightOf);
104
+ if (m.inside !== undefined)
105
+ out.inside = selectorToJsonValue(m.inside);
106
+ if (m.ancestor !== undefined)
107
+ out.ancestor = selectorToJsonValue(m.ancestor);
108
+ if (m.nth !== undefined)
109
+ out.nth = m.nth;
110
+ if (m.first !== undefined)
111
+ out.first = m.first;
112
+ if (m.last !== undefined)
113
+ out.last = m.last;
114
+ }
115
+ function addAnchorBox(out, b) {
116
+ if (b.near !== undefined)
117
+ out.near = selectorToJsonValue(b.near);
118
+ if (b.below !== undefined)
119
+ out.below = selectorToJsonValue(b.below);
120
+ if (b.above !== undefined)
121
+ out.above = selectorToJsonValue(b.above);
122
+ if (b.leftOf !== undefined)
123
+ out.leftOf = selectorToJsonValue(b.leftOf);
124
+ if (b.rightOf !== undefined)
125
+ out.rightOf = selectorToJsonValue(b.rightOf);
126
+ if (b.inside !== undefined)
127
+ out.inside = selectorToJsonValue(b.inside);
128
+ if (b.ancestor !== undefined)
129
+ out.ancestor = selectorToJsonValue(b.ancestor);
130
+ }
131
+ function addIndex(out, i) {
132
+ if (i.nth !== undefined)
133
+ out.nth = i.nth;
134
+ if (i.first !== undefined)
135
+ out.first = i.first;
136
+ if (i.last !== undefined)
137
+ out.last = i.last;
138
+ }
139
+ /** Encode a Selector to its Rust-compatible untagged JSON value. */
140
+ export function selectorToJsonValue(s) {
141
+ const out = {};
142
+ const d = s.data;
143
+ switch (d.kind) {
144
+ case 'id':
145
+ out.id = d.id;
146
+ addModifiers(out, d.modifiers);
147
+ break;
148
+ case 'text':
149
+ out.text = patternToJson(d.text);
150
+ addModifiers(out, d.modifiers);
151
+ break;
152
+ case 'label':
153
+ out.label = d.label;
154
+ addModifiers(out, d.modifiers);
155
+ break;
156
+ case 'role':
157
+ out.role = d.role;
158
+ if (d.name !== undefined)
159
+ out.name = patternToJson(d.name);
160
+ addModifiers(out, d.modifiers);
161
+ break;
162
+ case 'focused':
163
+ out.focused = true;
164
+ break;
165
+ case 'anchor': {
166
+ const box = {};
167
+ addAnchorBox(box, d.box);
168
+ out.anchor = box;
169
+ addIndex(out, d.index);
170
+ break;
171
+ }
172
+ case 'localizedText':
173
+ out.localizedText = d.map;
174
+ addModifiers(out, d.modifiers);
175
+ break;
176
+ }
177
+ return out;
178
+ }
179
+ /** Encode a Selector to its Rust-compatible untagged JSON string. */
180
+ export function encodeSelectorJson(s) {
181
+ return JSON.stringify(selectorToJsonValue(s));
182
+ }
183
+ /** Decode a Rust-compatible untagged JSON value into a Selector. */
184
+ export function selectorFromJsonValue(value) {
185
+ if (typeof value !== 'object' || value === null) {
186
+ throw new Error(`Selector must be a JSON object, got: ${JSON.stringify(value)}`);
187
+ }
188
+ const obj = value;
189
+ // Focused: explicit boolean field, highest-priority discriminator.
190
+ if (obj.focused === true)
191
+ return Selector.focused();
192
+ // Anchor: nested box discriminator.
193
+ if (obj.anchor !== undefined && typeof obj.anchor === 'object' && obj.anchor !== null) {
194
+ const box = decodeAnchorBox(obj.anchor);
195
+ return Selector.anchor(box, decodeIndex(obj));
196
+ }
197
+ if (typeof obj.id === 'string') {
198
+ return new Selector({ kind: 'id', id: obj.id, modifiers: decodeModifiers(obj) });
199
+ }
200
+ if (obj.text !== undefined) {
201
+ return new Selector({ kind: 'text', text: patternFromJson(obj.text), modifiers: decodeModifiers(obj) });
202
+ }
203
+ if (typeof obj.label === 'string') {
204
+ return new Selector({ kind: 'label', label: obj.label, modifiers: decodeModifiers(obj) });
205
+ }
206
+ if (typeof obj.role === 'string') {
207
+ const name = obj.name !== undefined ? patternFromJson(obj.name) : undefined;
208
+ return new Selector({
209
+ kind: 'role',
210
+ role: obj.role,
211
+ ...(name !== undefined ? { name } : {}),
212
+ modifiers: decodeModifiers(obj),
213
+ });
214
+ }
215
+ if (obj.localizedText !== undefined && typeof obj.localizedText === 'object' && obj.localizedText !== null) {
216
+ return new Selector({
217
+ kind: 'localizedText',
218
+ map: obj.localizedText,
219
+ modifiers: decodeModifiers(obj),
220
+ });
221
+ }
222
+ throw new Error(`Selector JSON missing recognized discriminator: ${JSON.stringify(obj)}`);
223
+ }
224
+ function decodeModifiers(obj) {
225
+ const m = {};
226
+ if (obj.near !== undefined)
227
+ m.near = selectorFromJsonValue(obj.near);
228
+ if (obj.below !== undefined)
229
+ m.below = selectorFromJsonValue(obj.below);
230
+ if (obj.above !== undefined)
231
+ m.above = selectorFromJsonValue(obj.above);
232
+ if (obj.leftOf !== undefined)
233
+ m.leftOf = selectorFromJsonValue(obj.leftOf);
234
+ if (obj.rightOf !== undefined)
235
+ m.rightOf = selectorFromJsonValue(obj.rightOf);
236
+ if (obj.inside !== undefined)
237
+ m.inside = selectorFromJsonValue(obj.inside);
238
+ if (obj.ancestor !== undefined)
239
+ m.ancestor = selectorFromJsonValue(obj.ancestor);
240
+ if (typeof obj.nth === 'number')
241
+ m.nth = obj.nth;
242
+ if (typeof obj.first === 'boolean')
243
+ m.first = obj.first;
244
+ if (typeof obj.last === 'boolean')
245
+ m.last = obj.last;
246
+ return m;
247
+ }
248
+ function decodeAnchorBox(obj) {
249
+ const b = {};
250
+ if (obj.near !== undefined)
251
+ b.near = selectorFromJsonValue(obj.near);
252
+ if (obj.below !== undefined)
253
+ b.below = selectorFromJsonValue(obj.below);
254
+ if (obj.above !== undefined)
255
+ b.above = selectorFromJsonValue(obj.above);
256
+ if (obj.leftOf !== undefined)
257
+ b.leftOf = selectorFromJsonValue(obj.leftOf);
258
+ if (obj.rightOf !== undefined)
259
+ b.rightOf = selectorFromJsonValue(obj.rightOf);
260
+ if (obj.inside !== undefined)
261
+ b.inside = selectorFromJsonValue(obj.inside);
262
+ if (obj.ancestor !== undefined)
263
+ b.ancestor = selectorFromJsonValue(obj.ancestor);
264
+ return b;
265
+ }
266
+ function decodeIndex(obj) {
267
+ const i = {};
268
+ if (typeof obj.nth === 'number')
269
+ i.nth = obj.nth;
270
+ if (typeof obj.first === 'boolean')
271
+ i.first = obj.first;
272
+ if (typeof obj.last === 'boolean')
273
+ i.last = obj.last;
274
+ return i;
275
+ }
276
+ //# sourceMappingURL=Selector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Selector.js","sourceRoot":"","sources":["../src/Selector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ export type SelectorResolver = (treeJson: string, selectorJson: string) => Promise<readonly string[]>;
2
+ /**
3
+ * v7.6 c1 — labels resolver wrapping Rust `resolve_selector_labels`
4
+ * (each match's `.label`; empty string when None). Used by
5
+ * Locator.toHaveCount + Locator.toHaveLabel.
6
+ */
7
+ export type LabelsResolver = (treeJson: string, selectorJson: string) => Promise<readonly string[]>;
8
+ /**
9
+ * Mock resolver for vitest unit tests. Pre-registered selectorJson →
10
+ * id list mappings; falls back to empty list for unknown selectors.
11
+ * Mirrors Kotlin MockSelectorResolver from v7.4 c2.
12
+ */
13
+ export declare class MockSelectorResolver {
14
+ readonly returnMap: Map<string, readonly string[]>;
15
+ throwOnNext: Error | null;
16
+ readonly calls: {
17
+ treeJson: string;
18
+ selectorJson: string;
19
+ }[];
20
+ resolve: SelectorResolver;
21
+ /** Register a single-hit response for the given selector JSON key. */
22
+ registerHit(selectorJson: string, id: string): void;
23
+ /** Register a multi-hit response. */
24
+ registerHits(selectorJson: string, ids: readonly string[]): void;
25
+ }
26
+ /**
27
+ * v7.6 c1 — Mock labels resolver for vitest tests. Pre-registered
28
+ * selectorJson → label list mappings. Mirrors Kotlin MockLabelsResolver.
29
+ */
30
+ export declare class MockLabelsResolver {
31
+ readonly returnMap: Map<string, readonly string[]>;
32
+ throwOnNext: Error | null;
33
+ readonly calls: {
34
+ treeJson: string;
35
+ selectorJson: string;
36
+ }[];
37
+ resolve: LabelsResolver;
38
+ /** Register the matched-labels list for a selector. */
39
+ registerLabels(selectorJson: string, labels: readonly string[]): void;
40
+ }
41
+ //# sourceMappingURL=SelectorResolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectorResolver.d.ts","sourceRoot":"","sources":["../src/SelectorResolver.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,gBAAgB,GAAG,CAC7B,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,KACjB,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAA;AAE/B;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,CAC3B,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,KACjB,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAA;AAE/B;;;;GAIG;AACH,qBAAa,oBAAoB;IAC/B,QAAQ,CAAC,SAAS,iCAAuC;IACzD,WAAW,EAAE,KAAK,GAAG,IAAI,CAAO;IAChC,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,EAAE,CAAK;IAEjE,OAAO,EAAE,gBAAgB,CAQxB;IAED,sEAAsE;IACtE,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI;IAInD,qCAAqC;IACrC,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI;CAGjE;AAED;;;GAGG;AACH,qBAAa,kBAAkB;IAC7B,QAAQ,CAAC,SAAS,iCAAuC;IACzD,WAAW,EAAE,KAAK,GAAG,IAAI,CAAO;IAChC,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,EAAE,CAAK;IAEjE,OAAO,EAAE,cAAc,CAQtB;IAED,uDAAuD;IACvD,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI;CAGtE"}
@@ -0,0 +1,55 @@
1
+ // v7.5 c1 — SelectorResolver injection boundary.
2
+ //
3
+ // Mirror Kotlin v7.4 c2 R-Kotlin-A: real impl wraps Rust FFI core
4
+ // (in TS via HTTP runner or future ffi-napi binding); mock impl for
5
+ // vitest. Lambda-style fn interface keeps the abstraction minimal.
6
+ /**
7
+ * Mock resolver for vitest unit tests. Pre-registered selectorJson →
8
+ * id list mappings; falls back to empty list for unknown selectors.
9
+ * Mirrors Kotlin MockSelectorResolver from v7.4 c2.
10
+ */
11
+ export class MockSelectorResolver {
12
+ returnMap = new Map();
13
+ throwOnNext = null;
14
+ calls = [];
15
+ resolve = async (treeJson, selectorJson) => {
16
+ this.calls.push({ treeJson, selectorJson });
17
+ const t = this.throwOnNext;
18
+ if (t !== null) {
19
+ this.throwOnNext = null;
20
+ throw t;
21
+ }
22
+ return this.returnMap.get(selectorJson) ?? [];
23
+ };
24
+ /** Register a single-hit response for the given selector JSON key. */
25
+ registerHit(selectorJson, id) {
26
+ this.returnMap.set(selectorJson, [id]);
27
+ }
28
+ /** Register a multi-hit response. */
29
+ registerHits(selectorJson, ids) {
30
+ this.returnMap.set(selectorJson, ids);
31
+ }
32
+ }
33
+ /**
34
+ * v7.6 c1 — Mock labels resolver for vitest tests. Pre-registered
35
+ * selectorJson → label list mappings. Mirrors Kotlin MockLabelsResolver.
36
+ */
37
+ export class MockLabelsResolver {
38
+ returnMap = new Map();
39
+ throwOnNext = null;
40
+ calls = [];
41
+ resolve = async (treeJson, selectorJson) => {
42
+ this.calls.push({ treeJson, selectorJson });
43
+ const t = this.throwOnNext;
44
+ if (t !== null) {
45
+ this.throwOnNext = null;
46
+ throw t;
47
+ }
48
+ return this.returnMap.get(selectorJson) ?? [];
49
+ };
50
+ /** Register the matched-labels list for a selector. */
51
+ registerLabels(selectorJson, labels) {
52
+ this.returnMap.set(selectorJson, labels);
53
+ }
54
+ }
55
+ //# sourceMappingURL=SelectorResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectorResolver.js","sourceRoot":"","sources":["../src/SelectorResolver.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,EAAE;AACF,kEAAkE;AAClE,oEAAoE;AACpE,mEAAmE;AAiBnE;;;;GAIG;AACH,MAAM,OAAO,oBAAoB;IACtB,SAAS,GAAG,IAAI,GAAG,EAA6B,CAAA;IACzD,WAAW,GAAiB,IAAI,CAAA;IACvB,KAAK,GAAiD,EAAE,CAAA;IAEjE,OAAO,GAAqB,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE;QAC3D,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAA;QAC3C,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAA;QAC1B,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACf,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;YACvB,MAAM,CAAC,CAAA;QACT,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,CAAA;IAC/C,CAAC,CAAA;IAED,sEAAsE;IACtE,WAAW,CAAC,YAAoB,EAAE,EAAU;QAC1C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACxC,CAAC;IAED,qCAAqC;IACrC,YAAY,CAAC,YAAoB,EAAE,GAAsB;QACvD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,CAAA;IACvC,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,kBAAkB;IACpB,SAAS,GAAG,IAAI,GAAG,EAA6B,CAAA;IACzD,WAAW,GAAiB,IAAI,CAAA;IACvB,KAAK,GAAiD,EAAE,CAAA;IAEjE,OAAO,GAAmB,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE;QACzD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAA;QAC3C,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAA;QAC1B,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACf,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;YACvB,MAAM,CAAC,CAAA;QACT,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,CAAA;IAC/C,CAAC,CAAA;IAED,uDAAuD;IACvD,cAAc,CAAC,YAAoB,EAAE,MAAyB;QAC5D,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CAAA;IAC1C,CAAC;CACF"}
@@ -0,0 +1,81 @@
1
+ import type { A11yNode } from './A11yNode.js';
2
+ export type KeyName = 'return' | 'delete' | 'space' | 'tab' | 'escape' | 'enter';
3
+ export type SwipeDirection = 'up' | 'down' | 'left' | 'right';
4
+ /** Low-level emulator runtime — captures + injects events. */
5
+ export interface SmixSimRuntime {
6
+ launch(bundleId: string): Promise<void>;
7
+ terminate(bundleId: string): Promise<void>;
8
+ snapshotTree(): Promise<A11yNode>;
9
+ synthesizeTap(x: number, y: number): Promise<void>;
10
+ sendString(text: string): Promise<void>;
11
+ pressKey(key: KeyName): Promise<void>;
12
+ swipe(direction: SwipeDirection): Promise<void>;
13
+ screenshot(): Promise<Uint8Array>;
14
+ systemPopups(): Promise<A11yNode[]>;
15
+ openUrl(url: string): Promise<void>;
16
+ launchFresh(opts: {
17
+ bundleId: string;
18
+ clearState: boolean;
19
+ clearKeychain: boolean;
20
+ appPath?: string | undefined;
21
+ }): Promise<void>;
22
+ launchFromPath(appPath: string): Promise<void>;
23
+ synthesizeTapAtNormalized(nx: number, ny: number): Promise<void>;
24
+ }
25
+ export interface LaunchFreshCall {
26
+ bundleId: string;
27
+ clearState: boolean;
28
+ clearKeychain: boolean;
29
+ appPath: string | undefined;
30
+ }
31
+ /**
32
+ * In-memory mock runtime — used by vitest unit tests for deterministic
33
+ * wire verification without booting an emulator.
34
+ */
35
+ export declare class MockSimRuntime implements SmixSimRuntime {
36
+ snapshotResult: A11yNode;
37
+ readonly tapCalls: {
38
+ x: number;
39
+ y: number;
40
+ }[];
41
+ readonly launchCalls: string[];
42
+ readonly terminateCalls: string[];
43
+ readonly sendStringCalls: string[];
44
+ readonly pressKeyCalls: KeyName[];
45
+ readonly swipeCalls: SwipeDirection[];
46
+ screenshotCalls: number;
47
+ screenshotResult: Uint8Array;
48
+ systemPopupsResult: A11yNode[];
49
+ readonly openUrlCalls: string[];
50
+ readonly launchFreshCalls: LaunchFreshCall[];
51
+ readonly launchFromPathCalls: string[];
52
+ readonly tapAtNormalizedCalls: {
53
+ nx: number;
54
+ ny: number;
55
+ }[];
56
+ /** Hook invoked just before [snapshotTree] returns. Mirrors Swift/Kotlin. */
57
+ afterSnapshot: ((callIndex: number) => void) | null;
58
+ private snapshotCallCount;
59
+ constructor(opts?: {
60
+ snapshotResult?: A11yNode;
61
+ });
62
+ launch(bundleId: string): Promise<void>;
63
+ terminate(bundleId: string): Promise<void>;
64
+ snapshotTree(): Promise<A11yNode>;
65
+ synthesizeTap(x: number, y: number): Promise<void>;
66
+ sendString(text: string): Promise<void>;
67
+ pressKey(key: KeyName): Promise<void>;
68
+ swipe(direction: SwipeDirection): Promise<void>;
69
+ screenshot(): Promise<Uint8Array>;
70
+ systemPopups(): Promise<A11yNode[]>;
71
+ openUrl(url: string): Promise<void>;
72
+ launchFresh(opts: {
73
+ bundleId: string;
74
+ clearState: boolean;
75
+ clearKeychain: boolean;
76
+ appPath?: string | undefined;
77
+ }): Promise<void>;
78
+ launchFromPath(appPath: string): Promise<void>;
79
+ synthesizeTapAtNormalized(nx: number, ny: number): Promise<void>;
80
+ }
81
+ //# sourceMappingURL=SimRuntime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SimRuntime.d.ts","sourceRoot":"","sources":["../src/SimRuntime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ // v7.5 c1 — SmixSimRuntime interface + MockSimRuntime impl.
2
+ //
3
+ // Mirror Swift v7.2 + Kotlin v7.4 SimRuntime architecture. TS SDK
4
+ // is HTTP-runner-friendly (per R-7.5-B decision):
5
+ // - HttpSimRuntime (real, lives in src/HttpRunner.ts, v7.5 c3):
6
+ // wraps smix-runner HTTP server via fetch (cross-platform iOS+Android).
7
+ // - MockSimRuntime (here): in-memory tree + event log for unit tests.
8
+ //
9
+ // Per iron rule §9 #13: this module ships only to test targets.
10
+ const EMPTY_DEFAULT = {
11
+ rawType: 'other',
12
+ bounds: { x: 0, y: 0, w: 393, h: 852 },
13
+ enabled: true,
14
+ visible: true,
15
+ children: [],
16
+ };
17
+ /**
18
+ * In-memory mock runtime — used by vitest unit tests for deterministic
19
+ * wire verification without booting an emulator.
20
+ */
21
+ export class MockSimRuntime {
22
+ snapshotResult = EMPTY_DEFAULT;
23
+ tapCalls = [];
24
+ launchCalls = [];
25
+ terminateCalls = [];
26
+ sendStringCalls = [];
27
+ pressKeyCalls = [];
28
+ swipeCalls = [];
29
+ screenshotCalls = 0;
30
+ screenshotResult = new Uint8Array(0);
31
+ systemPopupsResult = [];
32
+ openUrlCalls = [];
33
+ launchFreshCalls = [];
34
+ launchFromPathCalls = [];
35
+ tapAtNormalizedCalls = [];
36
+ /** Hook invoked just before [snapshotTree] returns. Mirrors Swift/Kotlin. */
37
+ afterSnapshot = null;
38
+ snapshotCallCount = 0;
39
+ constructor(opts = {}) {
40
+ if (opts.snapshotResult !== undefined)
41
+ this.snapshotResult = opts.snapshotResult;
42
+ }
43
+ async launch(bundleId) {
44
+ this.launchCalls.push(bundleId);
45
+ }
46
+ async terminate(bundleId) {
47
+ this.terminateCalls.push(bundleId);
48
+ }
49
+ async snapshotTree() {
50
+ const idx = this.snapshotCallCount++;
51
+ this.afterSnapshot?.(idx);
52
+ return this.snapshotResult;
53
+ }
54
+ async synthesizeTap(x, y) {
55
+ this.tapCalls.push({ x, y });
56
+ }
57
+ async sendString(text) {
58
+ this.sendStringCalls.push(text);
59
+ }
60
+ async pressKey(key) {
61
+ this.pressKeyCalls.push(key);
62
+ }
63
+ async swipe(direction) {
64
+ this.swipeCalls.push(direction);
65
+ }
66
+ async screenshot() {
67
+ this.screenshotCalls++;
68
+ return this.screenshotResult;
69
+ }
70
+ async systemPopups() {
71
+ return this.systemPopupsResult;
72
+ }
73
+ async openUrl(url) {
74
+ this.openUrlCalls.push(url);
75
+ }
76
+ async launchFresh(opts) {
77
+ this.launchFreshCalls.push({
78
+ bundleId: opts.bundleId,
79
+ clearState: opts.clearState,
80
+ clearKeychain: opts.clearKeychain,
81
+ appPath: opts.appPath,
82
+ });
83
+ }
84
+ async launchFromPath(appPath) {
85
+ this.launchFromPathCalls.push(appPath);
86
+ }
87
+ async synthesizeTapAtNormalized(nx, ny) {
88
+ this.tapAtNormalizedCalls.push({ nx, ny });
89
+ }
90
+ }
91
+ //# sourceMappingURL=SimRuntime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SimRuntime.js","sourceRoot":"","sources":["../src/SimRuntime.ts"],"names":[],"mappings":"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"}
package/dist/Smix.d.ts ADDED
@@ -0,0 +1,22 @@
1
+ import { App } from './App.js';
2
+ import { SmixNotImplementedError } from './Locator.js';
3
+ import type { LabelsResolver, SelectorResolver } from './SelectorResolver.js';
4
+ import type { SmixSimRuntime } from './SimRuntime.js';
5
+ export type AppTarget = {
6
+ kind: 'bundleId';
7
+ value: string;
8
+ } | {
9
+ kind: 'appPath';
10
+ path: string;
11
+ };
12
+ export declare const bundleId: (value: string) => AppTarget;
13
+ export declare const appPath: (path: string) => AppTarget;
14
+ /**
15
+ * Top-level entry. Launches the target app via [runtime] and returns
16
+ * an [App] handle wired with the given [resolver] for selector queries.
17
+ */
18
+ export declare const Smix: {
19
+ readonly launchApp: (target: AppTarget, runtime: SmixSimRuntime, resolver: SelectorResolver, labelsResolver?: LabelsResolver) => Promise<App>;
20
+ };
21
+ export { SmixNotImplementedError };
22
+ //# sourceMappingURL=Smix.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Smix.d.ts","sourceRoot":"","sources":["../src/Smix.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAC9B,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAC7E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAErD,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAErC,eAAO,MAAM,QAAQ,GAAI,OAAO,MAAM,KAAG,SAA0C,CAAA;AACnF,eAAO,MAAM,OAAO,GAAI,MAAM,MAAM,KAAG,SAAwC,CAAA;AAE/E;;;GAGG;AACH,eAAO,MAAM,IAAI;iCAEL,SAAS,WACR,cAAc,YACb,gBAAgB,mBACT,cAAc,KAC9B,OAAO,CAAC,GAAG,CAAC;CAgBP,CAAA;AAEV,OAAO,EAAE,uBAAuB,EAAE,CAAA"}
package/dist/Smix.js ADDED
@@ -0,0 +1,35 @@
1
+ // v7.5 c1 — Smix top-level entry. Mirror Kotlin / Swift Smix.launchApp.
2
+ //
3
+ // Per R-7.5-B HTTP-runtime decision, the default SelectorResolver for
4
+ // production points at the smix-runner HTTP server (lands v7.5 c3 in
5
+ // src/HttpRunner.ts). For c1 MVP, callers must pass an explicit
6
+ // SelectorResolver (e.g. MockSelectorResolver in tests; HttpSelectorResolver
7
+ // in c3 production).
8
+ import { App } from './App.js';
9
+ import { SmixNotImplementedError } from './Locator.js';
10
+ export const bundleId = (value) => ({ kind: 'bundleId', value });
11
+ export const appPath = (path) => ({ kind: 'appPath', path });
12
+ /**
13
+ * Top-level entry. Launches the target app via [runtime] and returns
14
+ * an [App] handle wired with the given [resolver] for selector queries.
15
+ */
16
+ export const Smix = {
17
+ async launchApp(target, runtime, resolver, labelsResolver) {
18
+ switch (target.kind) {
19
+ case 'bundleId': {
20
+ await runtime.launch(target.value);
21
+ return labelsResolver !== undefined
22
+ ? new App(target.value, runtime, resolver, labelsResolver)
23
+ : new App(target.value, runtime, resolver);
24
+ }
25
+ case 'appPath': {
26
+ await runtime.launchFromPath(target.path);
27
+ return labelsResolver !== undefined
28
+ ? new App(target.path, runtime, resolver, labelsResolver)
29
+ : new App(target.path, runtime, resolver);
30
+ }
31
+ }
32
+ },
33
+ };
34
+ export { SmixNotImplementedError };
35
+ //# sourceMappingURL=Smix.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Smix.js","sourceRoot":"","sources":["../src/Smix.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,EAAE;AACF,sEAAsE;AACtE,qEAAqE;AACrE,gEAAgE;AAChE,6EAA6E;AAC7E,qBAAqB;AAErB,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAC9B,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AAQtD,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAa,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAA;AACnF,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,IAAY,EAAa,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;AAE/E;;;GAGG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,KAAK,CAAC,SAAS,CACb,MAAiB,EACjB,OAAuB,EACvB,QAA0B,EAC1B,cAA+B;QAE/B,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;gBAClC,OAAO,cAAc,KAAK,SAAS;oBACjC,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,CAAC;oBAC1D,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;YAC9C,CAAC;YACD,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,MAAM,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;gBACzC,OAAO,cAAc,KAAK,SAAS;oBACjC,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,CAAC;oBACzD,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;YAC7C,CAAC;QACH,CAAC;IACH,CAAC;CACO,CAAA;AAEV,OAAO,EAAE,uBAAuB,EAAE,CAAA"}