@gtkx/testing 1.0.0-rc.1 → 1.0.0-rc.2

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 (182) hide show
  1. package/dist/act.d.ts +6 -6
  2. package/dist/act.d.ts.map +1 -1
  3. package/dist/act.js +34 -26
  4. package/dist/act.js.map +1 -1
  5. package/dist/bound-queries.d.ts +4 -3
  6. package/dist/bound-queries.d.ts.map +1 -1
  7. package/dist/bound-queries.js.map +1 -1
  8. package/dist/build-queries.d.ts +5 -5
  9. package/dist/build-queries.d.ts.map +1 -1
  10. package/dist/build-queries.js +21 -9
  11. package/dist/build-queries.js.map +1 -1
  12. package/dist/cleanup-registry.d.ts +4 -3
  13. package/dist/cleanup-registry.d.ts.map +1 -1
  14. package/dist/cleanup-registry.js +13 -3
  15. package/dist/cleanup-registry.js.map +1 -1
  16. package/dist/config.d.ts +5 -4
  17. package/dist/config.d.ts.map +1 -1
  18. package/dist/config.js +11 -9
  19. package/dist/config.js.map +1 -1
  20. package/dist/editable.d.ts +6 -5
  21. package/dist/editable.d.ts.map +1 -1
  22. package/dist/editable.js +7 -5
  23. package/dist/editable.js.map +1 -1
  24. package/dist/errors.d.ts +7 -6
  25. package/dist/errors.d.ts.map +1 -1
  26. package/dist/errors.js +64 -48
  27. package/dist/errors.js.map +1 -1
  28. package/dist/fire-event.d.ts +2 -1
  29. package/dist/fire-event.d.ts.map +1 -1
  30. package/dist/fire-event.js +2 -1
  31. package/dist/fire-event.js.map +1 -1
  32. package/dist/frame-sync.d.ts +2 -1
  33. package/dist/frame-sync.d.ts.map +1 -1
  34. package/dist/frame-sync.js +28 -21
  35. package/dist/frame-sync.js.map +1 -1
  36. package/dist/index.d.ts +2 -2
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +1 -1
  39. package/dist/index.js.map +1 -1
  40. package/dist/matchers.d.ts +38 -34
  41. package/dist/matchers.d.ts.map +1 -1
  42. package/dist/matchers.js +72 -58
  43. package/dist/matchers.js.map +1 -1
  44. package/dist/pretty-widget.d.ts +6 -4
  45. package/dist/pretty-widget.d.ts.map +1 -1
  46. package/dist/pretty-widget.js +64 -24
  47. package/dist/pretty-widget.js.map +1 -1
  48. package/dist/queries.d.ts +143 -86
  49. package/dist/queries.d.ts.map +1 -1
  50. package/dist/queries.js +231 -147
  51. package/dist/queries.js.map +1 -1
  52. package/dist/register-test-hooks.js +2 -1
  53. package/dist/register-test-hooks.js.map +1 -1
  54. package/dist/render-hook.d.ts +3 -2
  55. package/dist/render-hook.d.ts.map +1 -1
  56. package/dist/render-hook.js +2 -1
  57. package/dist/render-hook.js.map +1 -1
  58. package/dist/render.d.ts +3 -2
  59. package/dist/render.d.ts.map +1 -1
  60. package/dist/render.js +24 -18
  61. package/dist/render.js.map +1 -1
  62. package/dist/role-helpers.d.ts +6 -5
  63. package/dist/role-helpers.d.ts.map +1 -1
  64. package/dist/role-helpers.js +16 -12
  65. package/dist/role-helpers.js.map +1 -1
  66. package/dist/screen.d.ts +4 -3
  67. package/dist/screen.d.ts.map +1 -1
  68. package/dist/screen.js +13 -11
  69. package/dist/screen.js.map +1 -1
  70. package/dist/screenshot.d.ts +4 -3
  71. package/dist/screenshot.d.ts.map +1 -1
  72. package/dist/screenshot.js +43 -36
  73. package/dist/screenshot.js.map +1 -1
  74. package/dist/suggestions.d.ts +11 -6
  75. package/dist/suggestions.d.ts.map +1 -1
  76. package/dist/suggestions.js +10 -5
  77. package/dist/suggestions.js.map +1 -1
  78. package/dist/traversal.d.ts +7 -7
  79. package/dist/traversal.d.ts.map +1 -1
  80. package/dist/traversal.js +17 -11
  81. package/dist/traversal.js.map +1 -1
  82. package/dist/types.d.ts +39 -24
  83. package/dist/types.d.ts.map +1 -1
  84. package/dist/types.js.map +1 -1
  85. package/dist/user-event/adjustment.d.ts +5 -3
  86. package/dist/user-event/adjustment.d.ts.map +1 -1
  87. package/dist/user-event/adjustment.js +6 -4
  88. package/dist/user-event/adjustment.js.map +1 -1
  89. package/dist/user-event/click.d.ts +6 -5
  90. package/dist/user-event/click.d.ts.map +1 -1
  91. package/dist/user-event/click.js +29 -21
  92. package/dist/user-event/click.js.map +1 -1
  93. package/dist/user-event/controller.d.ts +6 -5
  94. package/dist/user-event/controller.d.ts.map +1 -1
  95. package/dist/user-event/controller.js +9 -6
  96. package/dist/user-event/controller.js.map +1 -1
  97. package/dist/user-event/dispatch.d.ts +3 -3
  98. package/dist/user-event/dispatch.d.ts.map +1 -1
  99. package/dist/user-event/dispatch.js +3 -2
  100. package/dist/user-event/dispatch.js.map +1 -1
  101. package/dist/user-event/event-wrapper.d.ts +2 -1
  102. package/dist/user-event/event-wrapper.d.ts.map +1 -1
  103. package/dist/user-event/event-wrapper.js +27 -16
  104. package/dist/user-event/event-wrapper.js.map +1 -1
  105. package/dist/user-event/gesture.d.ts +18 -14
  106. package/dist/user-event/gesture.d.ts.map +1 -1
  107. package/dist/user-event/gesture.js +70 -37
  108. package/dist/user-event/gesture.js.map +1 -1
  109. package/dist/user-event/index.d.ts +17 -10
  110. package/dist/user-event/index.d.ts.map +1 -1
  111. package/dist/user-event/index.js +7 -3
  112. package/dist/user-event/index.js.map +1 -1
  113. package/dist/user-event/keyboard.d.ts +4 -3
  114. package/dist/user-event/keyboard.d.ts.map +1 -1
  115. package/dist/user-event/keyboard.js +89 -58
  116. package/dist/user-event/keyboard.js.map +1 -1
  117. package/dist/user-event/pointer.d.ts +7 -3
  118. package/dist/user-event/pointer.d.ts.map +1 -1
  119. package/dist/user-event/pointer.js +4 -1
  120. package/dist/user-event/pointer.js.map +1 -1
  121. package/dist/user-event/selection.d.ts +3 -2
  122. package/dist/user-event/selection.d.ts.map +1 -1
  123. package/dist/user-event/selection.js +26 -27
  124. package/dist/user-event/selection.js.map +1 -1
  125. package/dist/user-event/state.d.ts +3 -2
  126. package/dist/user-event/state.d.ts.map +1 -1
  127. package/dist/user-event/state.js +2 -1
  128. package/dist/user-event/state.js.map +1 -1
  129. package/dist/user-event/text.d.ts +8 -7
  130. package/dist/user-event/text.d.ts.map +1 -1
  131. package/dist/user-event/text.js +39 -33
  132. package/dist/user-event/text.js.map +1 -1
  133. package/dist/wait-for.d.ts +5 -5
  134. package/dist/wait-for.d.ts.map +1 -1
  135. package/dist/wait-for.js +45 -30
  136. package/dist/wait-for.js.map +1 -1
  137. package/dist/widget-accessible-properties.d.ts +26 -25
  138. package/dist/widget-accessible-properties.d.ts.map +1 -1
  139. package/dist/widget-accessible-properties.js +106 -61
  140. package/dist/widget-accessible-properties.js.map +1 -1
  141. package/dist/within.d.ts +2 -1
  142. package/dist/within.d.ts.map +1 -1
  143. package/dist/within.js +2 -1
  144. package/dist/within.js.map +1 -1
  145. package/package.json +11 -9
  146. package/src/act.ts +44 -35
  147. package/src/bound-queries.ts +5 -4
  148. package/src/build-queries.ts +84 -43
  149. package/src/cleanup-registry.ts +18 -5
  150. package/src/config.ts +16 -12
  151. package/src/editable.ts +13 -6
  152. package/src/errors.ts +106 -45
  153. package/src/fire-event.ts +3 -1
  154. package/src/frame-sync.ts +38 -21
  155. package/src/index.ts +2 -1
  156. package/src/matchers.ts +158 -107
  157. package/src/pretty-widget.ts +114 -42
  158. package/src/queries.ts +422 -233
  159. package/src/register-test-hooks.ts +4 -1
  160. package/src/render-hook.tsx +10 -4
  161. package/src/render.tsx +58 -33
  162. package/src/role-helpers.ts +29 -16
  163. package/src/screen.ts +17 -12
  164. package/src/screenshot.ts +61 -38
  165. package/src/suggestions.ts +29 -10
  166. package/src/traversal.ts +35 -15
  167. package/src/types.ts +65 -32
  168. package/src/user-event/adjustment.ts +23 -10
  169. package/src/user-event/click.ts +49 -20
  170. package/src/user-event/controller.ts +21 -7
  171. package/src/user-event/dispatch.ts +4 -2
  172. package/src/user-event/event-wrapper.ts +42 -16
  173. package/src/user-event/gesture.ts +135 -50
  174. package/src/user-event/index.ts +19 -12
  175. package/src/user-event/keyboard.ts +147 -61
  176. package/src/user-event/pointer.ts +20 -8
  177. package/src/user-event/selection.ts +69 -32
  178. package/src/user-event/state.ts +4 -2
  179. package/src/user-event/text.ts +73 -38
  180. package/src/wait-for.ts +77 -36
  181. package/src/widget-accessible-properties.ts +218 -74
  182. package/src/within.ts +7 -4
@@ -3,106 +3,175 @@ import { getAccessibleMetadata } from "@gtkx/react/internal";
3
3
  import { EDITABLE_ROLES, isEditable, readEditableText } from "./editable.js";
4
4
  import { descendants } from "./traversal.js";
5
5
 
6
+ type WidgetValue = {
7
+ now: number | null;
8
+ min: number | null;
9
+ max: number | null;
10
+ text: string | null;
11
+ };
12
+
13
+ type ValueTriplet = { now: number | null; min: number | null; max: number | null };
14
+
15
+ const DEFAULT_TEXT_GETTERS = ["getLabel", "getText", "getTitle"] as const;
16
+
6
17
  const callStringGetter = (widget: Gtk.Widget, method: string): string | null => {
7
18
  const fn: unknown = Reflect.get(widget, method);
8
- if (typeof fn !== "function") return null;
19
+
20
+ if (typeof fn !== "function") {
21
+ return null;
22
+ }
23
+
9
24
  const value = (fn as () => string | null).call(widget);
25
+
10
26
  return value ?? null;
11
27
  };
12
28
 
13
29
  const readAccessibleString = (widget: Gtk.Widget, key: string): string | null => {
14
- const value = getAccessibleMetadata<string>(widget, key);
30
+ const value = getAccessibleMetadata(widget, key);
31
+
15
32
  return typeof value === "string" ? value : null;
16
33
  };
17
34
 
18
35
  const readAccessibleNumber = (widget: Gtk.Widget, key: string): number | null => {
19
- const value = getAccessibleMetadata<number>(widget, key);
36
+ const value = getAccessibleMetadata(widget, key);
37
+
20
38
  return typeof value === "number" ? value : null;
21
39
  };
22
40
 
41
+ const readAccessibleWidgets = (widget: Gtk.Widget, key: string): Gtk.Widget[] | null => {
42
+ const value = getAccessibleMetadata(widget, key);
43
+
44
+ if (!Array.isArray(value)) {
45
+ return null;
46
+ }
47
+
48
+ const widgets = value.filter((item): item is Gtk.Widget => item instanceof Gtk.Widget);
49
+
50
+ return widgets.length > 0 ? widgets : null;
51
+ };
52
+
23
53
  const readAccessibleBoolean = (widget: Gtk.Widget, key: string): boolean | null => {
24
- const value = getAccessibleMetadata<boolean>(widget, key);
54
+ const value = getAccessibleMetadata(widget, key);
55
+
25
56
  return typeof value === "boolean" ? value : null;
26
57
  };
27
58
 
28
59
  const getLabelText = (widget: Gtk.Widget): string | null => {
29
- if (widget instanceof Gtk.Label) return widget.getLabel();
30
- if (widget instanceof Gtk.Inscription) return widget.getText() ?? null;
60
+ if (widget instanceof Gtk.Label) {
61
+ return widget.getLabel();
62
+ }
63
+
64
+ if (widget instanceof Gtk.Inscription) {
65
+ return widget.getText() ?? null;
66
+ }
67
+
31
68
  return null;
32
69
  };
33
70
 
34
- const DEFAULT_TEXT_GETTERS = ["getLabel", "getText", "getTitle"] as const;
35
-
36
71
  /**
37
72
  * Returns a widget's own text by trying its label, text, and title getters in
38
73
  * order, or null when none produce a value.
39
74
  *
40
75
  * @param widget The widget to read text from.
41
76
  */
42
- export const getWidgetNodeText = (widget: Gtk.Widget): string | null => {
77
+ const getWidgetNodeText = (widget: Gtk.Widget): string | null => {
43
78
  for (const getter of DEFAULT_TEXT_GETTERS) {
44
79
  const value = callStringGetter(widget, getter);
45
- if (value) return value;
80
+
81
+ if (value) {
82
+ return value;
83
+ }
46
84
  }
85
+
47
86
  return null;
48
87
  };
49
88
 
50
- const stripMnemonic = (text: string): string => text.replace(/_(.)/g, "$1");
89
+ const stripMnemonic = (text: string): string => text.replaceAll(/_(.)/g, "$1");
51
90
 
52
91
  const namingLabelText = (widget: Gtk.Widget): string | null => {
53
92
  const text = getLabelText(widget);
54
- if (text === null) return null;
93
+
94
+ if (text === null) {
95
+ return null;
96
+ }
97
+
55
98
  return widget instanceof Gtk.Label && widget.getUseUnderline() ? stripMnemonic(text) : text;
56
99
  };
57
100
 
58
- const isNamingLabelRole = (role: Gtk.AccessibleRole, includePresentation: boolean): boolean =>
59
- role === Gtk.AccessibleRole.LABEL || (includePresentation && role === Gtk.AccessibleRole.PRESENTATION);
101
+ const isNamingLabelRole = (role: Gtk.AccessibleRole, shouldIncludePresentation: boolean): boolean =>
102
+ role === Gtk.AccessibleRole.LABEL ||
103
+ (shouldIncludePresentation && role === Gtk.AccessibleRole.PRESENTATION);
60
104
 
61
105
  const collectLabels = (widget: Gtk.Widget): string[] => {
62
- const includePresentation = widget.getAccessibleRole() === Gtk.AccessibleRole.MENU_ITEM;
106
+ const isIncludePresentation = widget.getAccessibleRole() === Gtk.AccessibleRole.MENU_ITEM;
63
107
  const labels: string[] = [];
108
+
64
109
  for (const descendant of descendants(widget)) {
65
- if (!isNamingLabelRole(descendant.getAccessibleRole(), includePresentation)) continue;
110
+ if (!isNamingLabelRole(descendant.getAccessibleRole(), isIncludePresentation)) {
111
+ continue;
112
+ }
113
+
66
114
  const labelText = namingLabelText(descendant);
67
- if (labelText) labels.push(labelText);
115
+
116
+ if (labelText) {
117
+ labels.push(labelText);
118
+ }
68
119
  }
120
+
69
121
  return labels;
70
122
  };
71
123
 
72
- export const getWidgetLabelText = (widget: Gtk.Widget): string | null => {
73
- if (widget.getAccessibleRole() !== Gtk.AccessibleRole.LABEL) return null;
124
+ const getWidgetLabelText = (widget: Gtk.Widget): string | null => {
125
+ if (widget.getAccessibleRole() !== Gtk.AccessibleRole.LABEL) {
126
+ return null;
127
+ }
128
+
74
129
  return getLabelText(widget);
75
130
  };
76
131
 
77
- export const getWidgetAccessibleName = (widget: Gtk.Widget): string | null => {
132
+ const tabPanelTitle = (widget: Gtk.Widget): string | null => {
133
+ const parent = widget.getParent();
134
+
135
+ if (parent instanceof Gtk.Stack) {
136
+ return parent.getPage(widget).getTitle() ?? null;
137
+ }
138
+
139
+ return null;
140
+ };
141
+
142
+ const getWidgetAccessibleName = (widget: Gtk.Widget): string | null => {
78
143
  const role = widget.getAccessibleRole();
79
144
 
80
145
  if (role === Gtk.AccessibleRole.TAB_PANEL) {
81
- const parent = widget.getParent();
82
- if (parent instanceof Gtk.Stack) {
83
- const page = parent.getPage(widget);
84
- return page.getTitle() ?? null;
85
- }
86
- return null;
146
+ return tabPanelTitle(widget);
87
147
  }
88
148
 
89
- const accessibleLabel = getAccessibleMetadata<string>(widget, "accessibleLabel");
90
- if (accessibleLabel) return accessibleLabel;
149
+ const accessibleLabel = readAccessibleString(widget, "accessibleLabel");
150
+
151
+ if (accessibleLabel) {
152
+ return accessibleLabel;
153
+ }
91
154
 
92
155
  const ownText = getWidgetNodeText(widget);
93
- if (ownText) return ownText;
156
+
157
+ if (ownText) {
158
+ return ownText;
159
+ }
94
160
 
95
161
  const childLabels = collectLabels(widget);
96
- if (childLabels.length > 0) return childLabels.join(" ");
162
+
163
+ if (childLabels.length > 0) {
164
+ return childLabels.join(" ");
165
+ }
97
166
 
98
167
  return callStringGetter(widget, "getTooltipText");
99
168
  };
100
169
 
101
- export const getWidgetName = (widget: Gtk.Widget): string | null => {
170
+ const getWidgetName = (widget: Gtk.Widget): string | null => {
102
171
  return widget.getName();
103
172
  };
104
173
 
105
- export const getWidgetPlaceholderText = (widget: Gtk.Widget): string | null => {
174
+ const getWidgetPlaceholderText = (widget: Gtk.Widget): string | null => {
106
175
  if (!EDITABLE_ROLES.has(widget.getAccessibleRole()) || !(widget instanceof Gtk.Editable)) {
107
176
  return null;
108
177
  }
@@ -110,7 +179,7 @@ export const getWidgetPlaceholderText = (widget: Gtk.Widget): string | null => {
110
179
  return callStringGetter(widget, "getPlaceholderText");
111
180
  };
112
181
 
113
- export const getWidgetDisplayValue = (widget: Gtk.Widget): string | null => {
182
+ const getWidgetDisplayValue = (widget: Gtk.Widget): string | null => {
114
183
  if (EDITABLE_ROLES.has(widget.getAccessibleRole()) && isEditable(widget)) {
115
184
  return readEditableText(widget);
116
185
  }
@@ -118,21 +187,31 @@ export const getWidgetDisplayValue = (widget: Gtk.Widget): string | null => {
118
187
  return null;
119
188
  };
120
189
 
121
- export const getWidgetCheckedState = (widget: Gtk.Widget): boolean | null => {
122
- if (widget instanceof Gtk.CheckButton) return widget.getActive();
123
- if (widget instanceof Gtk.Switch) return widget.getActive();
190
+ const getWidgetCheckedState = (widget: Gtk.Widget): boolean | null => {
191
+ if (widget instanceof Gtk.CheckButton) {
192
+ return widget.getActive();
193
+ }
194
+
195
+ if (widget instanceof Gtk.Switch) {
196
+ return widget.getActive();
197
+ }
198
+
124
199
  if (widget instanceof Gtk.ToggleButton && widget.getAccessibleRole() === Gtk.AccessibleRole.RADIO) {
125
200
  return widget.getActive();
126
201
  }
202
+
127
203
  return null;
128
204
  };
129
205
 
130
- export const getWidgetPressedState = (widget: Gtk.Widget): boolean | null => {
131
- if (widget instanceof Gtk.ToggleButton) return widget.getActive();
206
+ const getWidgetPressedState = (widget: Gtk.Widget): boolean | null => {
207
+ if (widget instanceof Gtk.ToggleButton) {
208
+ return widget.getActive();
209
+ }
210
+
132
211
  return null;
133
212
  };
134
213
 
135
- export const getWidgetExpandedState = (widget: Gtk.Widget): boolean | null => {
214
+ const getWidgetExpandedState = (widget: Gtk.Widget): boolean | null => {
136
215
  if (widget instanceof Gtk.Expander) {
137
216
  return widget.getExpanded();
138
217
  }
@@ -144,7 +223,7 @@ export const getWidgetExpandedState = (widget: Gtk.Widget): boolean | null => {
144
223
  return null;
145
224
  };
146
225
 
147
- export const getWidgetSelectedState = (widget: Gtk.Widget): boolean | null => {
226
+ const getWidgetSelectedState = (widget: Gtk.Widget): boolean | null => {
148
227
  if (widget instanceof Gtk.ListBoxRow) {
149
228
  return widget.isSelected();
150
229
  }
@@ -156,58 +235,79 @@ export const getWidgetSelectedState = (widget: Gtk.Widget): boolean | null => {
156
235
  return null;
157
236
  };
158
237
 
159
- export const getWidgetLevel = (widget: Gtk.Widget): number | null => {
238
+ const getWidgetLevel = (widget: Gtk.Widget): number | null => {
160
239
  return readAccessibleNumber(widget, "accessibleLevel");
161
240
  };
162
241
 
163
- export const getWidgetInvalidState = (widget: Gtk.Widget): Gtk.AccessibleInvalidState | null => {
164
- return getAccessibleMetadata<Gtk.AccessibleInvalidState>(widget, "accessibleInvalid");
165
- };
242
+ const getWidgetInvalidState = (widget: Gtk.Widget): Gtk.AccessibleInvalidState | null => {
243
+ const value = readAccessibleNumber(widget, "accessibleInvalid");
166
244
 
167
- export const getWidgetErrorMessage = (widget: Gtk.Widget): Gtk.Widget[] | null => {
168
- const targets = getAccessibleMetadata<Gtk.Widget[]>(widget, "accessibleErrorMessage");
169
- return Array.isArray(targets) && targets.length > 0 ? targets : null;
245
+ return value ?? null;
170
246
  };
171
247
 
172
- export const getWidgetBusyState = (widget: Gtk.Widget): boolean | null => {
248
+ const getWidgetErrorMessage = (widget: Gtk.Widget): Gtk.Widget[] | null =>
249
+ readAccessibleWidgets(widget, "accessibleErrorMessage");
250
+
251
+ const getWidgetBusyState = (widget: Gtk.Widget): boolean | null => {
173
252
  return readAccessibleBoolean(widget, "accessibleBusy");
174
253
  };
175
254
 
176
- export const getWidgetDescription = (widget: Gtk.Widget): string | null => {
255
+ const getWidgetDescription = (widget: Gtk.Widget): string | null => {
177
256
  return readAccessibleString(widget, "accessibleDescription");
178
257
  };
179
258
 
180
- export type WidgetValue = {
181
- now: number | null;
182
- min: number | null;
183
- max: number | null;
184
- text: string | null;
185
- };
186
-
187
- type ValueTriplet = { now: number | null; min: number | null; max: number | null };
188
-
189
259
  const adjustmentValue = (adjustment: Gtk.Adjustment): ValueTriplet => ({
190
260
  now: adjustment.getValue(),
191
261
  min: adjustment.getLower(),
192
262
  max: adjustment.getUpper(),
193
263
  });
194
264
 
265
+ const adjustmentWidgetValue = (widget: Gtk.Widget): ValueTriplet | null => {
266
+ if (widget instanceof Gtk.Range) {
267
+ return adjustmentValue(widget.getAdjustment());
268
+ }
269
+
270
+ if (widget instanceof Gtk.Scrollbar) {
271
+ return adjustmentValue(widget.getAdjustment());
272
+ }
273
+
274
+ if (widget instanceof Gtk.SpinButton) {
275
+ return adjustmentValue(widget.getAdjustment());
276
+ }
277
+
278
+ if (widget instanceof Gtk.ScaleButton) {
279
+ return adjustmentValue(widget.getAdjustment());
280
+ }
281
+
282
+ return null;
283
+ };
284
+
195
285
  const getWidgetLiveValue = (widget: Gtk.Widget): ValueTriplet | null => {
196
- if (widget instanceof Gtk.Range) return adjustmentValue(widget.getAdjustment());
197
- if (widget instanceof Gtk.Scrollbar) return adjustmentValue(widget.getAdjustment());
198
- if (widget instanceof Gtk.SpinButton) return adjustmentValue(widget.getAdjustment());
199
- if (widget instanceof Gtk.ScaleButton) return adjustmentValue(widget.getAdjustment());
286
+ const adjustmentBased = adjustmentWidgetValue(widget);
287
+
288
+ if (adjustmentBased) {
289
+ return adjustmentBased;
290
+ }
291
+
200
292
  if (widget instanceof Gtk.LevelBar) {
201
293
  return { now: widget.getValue(), min: widget.getMinValue(), max: widget.getMaxValue() };
202
294
  }
203
- if (widget instanceof Gtk.ProgressBar) return { now: widget.getFraction(), min: 0, max: 1 };
295
+
296
+ if (widget instanceof Gtk.ProgressBar) {
297
+ return { now: widget.getFraction(), min: 0, max: 1 };
298
+ }
299
+
204
300
  return null;
205
301
  };
206
302
 
207
- export const getWidgetValue = (widget: Gtk.Widget): WidgetValue => {
303
+ const getWidgetValue = (widget: Gtk.Widget): WidgetValue => {
208
304
  const text = readAccessibleString(widget, "accessibleValueText");
209
305
  const live = getWidgetLiveValue(widget);
210
- if (live) return { ...live, text };
306
+
307
+ if (live) {
308
+ return { ...live, text };
309
+ }
310
+
211
311
  return {
212
312
  now: readAccessibleNumber(widget, "accessibleValueNow"),
213
313
  min: readAccessibleNumber(widget, "accessibleValueMin"),
@@ -216,29 +316,73 @@ export const getWidgetValue = (widget: Gtk.Widget): WidgetValue => {
216
316
  };
217
317
  };
218
318
 
219
- export const getWidgetOwnLabel = (widget: Gtk.Widget): string | null => {
319
+ const getWidgetOwnLabel = (widget: Gtk.Widget): string | null => {
220
320
  return readAccessibleString(widget, "accessibleLabel");
221
321
  };
222
322
 
223
- export const getWidgetLabelledByText = (widget: Gtk.Widget): string | null => {
224
- const targets = getAccessibleMetadata<Gtk.Widget[]>(widget, "accessibleLabelledBy");
225
- if (!Array.isArray(targets) || targets.length === 0) return null;
226
-
323
+ const collectAccessibleNames = (targets: Gtk.Widget[]): string[] => {
227
324
  const texts: string[] = [];
325
+
228
326
  for (const target of targets) {
229
327
  const text = getWidgetAccessibleName(target);
230
- if (text !== null) texts.push(text);
328
+
329
+ if (text !== null) {
330
+ texts.push(text);
331
+ }
231
332
  }
232
333
 
334
+ return texts;
335
+ };
336
+
337
+ const getWidgetLabelledByText = (widget: Gtk.Widget): string | null => {
338
+ const targets = readAccessibleWidgets(widget, "accessibleLabelledBy");
339
+
340
+ if (targets === null) {
341
+ return null;
342
+ }
343
+
344
+ const texts = collectAccessibleNames(targets);
345
+
233
346
  return texts.length > 0 ? texts.join(" ") : null;
234
347
  };
235
348
 
236
- export const isInaccessible = (widget: Gtk.Widget): boolean => {
349
+ const isInaccessible = (widget: Gtk.Widget): boolean => {
237
350
  let current: Gtk.Widget | null = widget;
351
+
238
352
  while (current) {
239
- if (!current.getVisible()) return true;
240
- if (readAccessibleBoolean(current, "accessibleHidden") === true) return true;
353
+ if (!current.getVisible()) {
354
+ return true;
355
+ }
356
+
357
+ if (readAccessibleBoolean(current, "accessibleHidden") === true) {
358
+ return true;
359
+ }
360
+
241
361
  current = current.getParent();
242
362
  }
363
+
243
364
  return false;
244
365
  };
366
+
367
+ export {
368
+ getWidgetNodeText,
369
+ getWidgetLabelText,
370
+ getWidgetAccessibleName,
371
+ getWidgetName,
372
+ getWidgetPlaceholderText,
373
+ getWidgetDisplayValue,
374
+ getWidgetCheckedState,
375
+ getWidgetPressedState,
376
+ getWidgetExpandedState,
377
+ getWidgetSelectedState,
378
+ getWidgetLevel,
379
+ getWidgetInvalidState,
380
+ getWidgetErrorMessage,
381
+ getWidgetBusyState,
382
+ getWidgetDescription,
383
+ getWidgetValue,
384
+ getWidgetOwnLabel,
385
+ getWidgetLabelledByText,
386
+ isInaccessible,
387
+ type WidgetValue,
388
+ };
package/src/within.ts CHANGED
@@ -1,15 +1,16 @@
1
1
  import type { BoundQueries } from "./bound-queries.js";
2
- import { builtinQueries } from "./queries.js";
3
2
  import type { Container } from "./traversal.js";
4
3
  import type { BoundCustomQueries, QueryMap } from "./types.js";
4
+ import { builtinQueries } from "./queries.js";
5
5
 
6
6
  const bindQuery =
7
7
  <Args extends unknown[], Result>(query: (container: Container, ...args: Args) => Result, container: Container) =>
8
- (...args: Args): Result =>
9
- query(container, ...args);
8
+ (...args: Args): Result =>
9
+ query(container, ...args);
10
10
 
11
11
  const bindCustomQueries = <Q extends QueryMap>(customQueries: Q, container: Container): BoundCustomQueries<Q> => {
12
12
  const entries = Object.entries(customQueries).map(([key, query]) => [key, bindQuery(query, container)] as const);
13
+
13
14
  return Object.fromEntries(entries) as BoundCustomQueries<Q>;
14
15
  };
15
16
 
@@ -21,10 +22,12 @@ const bindCustomQueries = <Q extends QueryMap>(customQueries: Q, container: Cont
21
22
  * @param queries Optional custom queries to bind alongside the built-in ones.
22
23
  * @returns The queries bound to the container.
23
24
  */
24
- export const within = <Q extends QueryMap = Record<never, never>>(
25
+ const within = <Q extends QueryMap = Record<never, never>>(
25
26
  container: Container,
26
27
  queries?: Q,
27
28
  ): BoundQueries & BoundCustomQueries<Q> => ({
28
29
  ...bindCustomQueries(builtinQueries, container),
29
30
  ...(queries ? bindCustomQueries(queries, container) : ({} as BoundCustomQueries<Q>)),
30
31
  });
32
+
33
+ export { within };