@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
@@ -2,10 +2,12 @@ import * as Gtk from "@gtkx/gi/gtk";
2
2
  import { getAccessibleMetadata } from "@gtkx/react/internal";
3
3
  import { EDITABLE_ROLES, isEditable, readEditableText } from "./editable.js";
4
4
  import { descendants } from "./traversal.js";
5
+ const DEFAULT_TEXT_GETTERS = ["getLabel", "getText", "getTitle"];
5
6
  const callStringGetter = (widget, method) => {
6
7
  const fn = Reflect.get(widget, method);
7
- if (typeof fn !== "function")
8
+ if (typeof fn !== "function") {
8
9
  return null;
10
+ }
9
11
  const value = fn.call(widget);
10
12
  return value ?? null;
11
13
  };
@@ -17,109 +19,132 @@ const readAccessibleNumber = (widget, key) => {
17
19
  const value = getAccessibleMetadata(widget, key);
18
20
  return typeof value === "number" ? value : null;
19
21
  };
22
+ const readAccessibleWidgets = (widget, key) => {
23
+ const value = getAccessibleMetadata(widget, key);
24
+ if (!Array.isArray(value)) {
25
+ return null;
26
+ }
27
+ const widgets = value.filter((item) => item instanceof Gtk.Widget);
28
+ return widgets.length > 0 ? widgets : null;
29
+ };
20
30
  const readAccessibleBoolean = (widget, key) => {
21
31
  const value = getAccessibleMetadata(widget, key);
22
32
  return typeof value === "boolean" ? value : null;
23
33
  };
24
34
  const getLabelText = (widget) => {
25
- if (widget instanceof Gtk.Label)
35
+ if (widget instanceof Gtk.Label) {
26
36
  return widget.getLabel();
27
- if (widget instanceof Gtk.Inscription)
37
+ }
38
+ if (widget instanceof Gtk.Inscription) {
28
39
  return widget.getText() ?? null;
40
+ }
29
41
  return null;
30
42
  };
31
- const DEFAULT_TEXT_GETTERS = ["getLabel", "getText", "getTitle"];
32
43
  /**
33
44
  * Returns a widget's own text by trying its label, text, and title getters in
34
45
  * order, or null when none produce a value.
35
46
  *
36
47
  * @param widget The widget to read text from.
37
48
  */
38
- export const getWidgetNodeText = (widget) => {
49
+ const getWidgetNodeText = (widget) => {
39
50
  for (const getter of DEFAULT_TEXT_GETTERS) {
40
51
  const value = callStringGetter(widget, getter);
41
- if (value)
52
+ if (value) {
42
53
  return value;
54
+ }
43
55
  }
44
56
  return null;
45
57
  };
46
- const stripMnemonic = (text) => text.replace(/_(.)/g, "$1");
58
+ const stripMnemonic = (text) => text.replaceAll(/_(.)/g, "$1");
47
59
  const namingLabelText = (widget) => {
48
60
  const text = getLabelText(widget);
49
- if (text === null)
61
+ if (text === null) {
50
62
  return null;
63
+ }
51
64
  return widget instanceof Gtk.Label && widget.getUseUnderline() ? stripMnemonic(text) : text;
52
65
  };
53
- const isNamingLabelRole = (role, includePresentation) => role === Gtk.AccessibleRole.LABEL || (includePresentation && role === Gtk.AccessibleRole.PRESENTATION);
66
+ const isNamingLabelRole = (role, shouldIncludePresentation) => role === Gtk.AccessibleRole.LABEL ||
67
+ (shouldIncludePresentation && role === Gtk.AccessibleRole.PRESENTATION);
54
68
  const collectLabels = (widget) => {
55
- const includePresentation = widget.getAccessibleRole() === Gtk.AccessibleRole.MENU_ITEM;
69
+ const isIncludePresentation = widget.getAccessibleRole() === Gtk.AccessibleRole.MENU_ITEM;
56
70
  const labels = [];
57
71
  for (const descendant of descendants(widget)) {
58
- if (!isNamingLabelRole(descendant.getAccessibleRole(), includePresentation))
72
+ if (!isNamingLabelRole(descendant.getAccessibleRole(), isIncludePresentation)) {
59
73
  continue;
74
+ }
60
75
  const labelText = namingLabelText(descendant);
61
- if (labelText)
76
+ if (labelText) {
62
77
  labels.push(labelText);
78
+ }
63
79
  }
64
80
  return labels;
65
81
  };
66
- export const getWidgetLabelText = (widget) => {
67
- if (widget.getAccessibleRole() !== Gtk.AccessibleRole.LABEL)
82
+ const getWidgetLabelText = (widget) => {
83
+ if (widget.getAccessibleRole() !== Gtk.AccessibleRole.LABEL) {
68
84
  return null;
85
+ }
69
86
  return getLabelText(widget);
70
87
  };
71
- export const getWidgetAccessibleName = (widget) => {
88
+ const tabPanelTitle = (widget) => {
89
+ const parent = widget.getParent();
90
+ if (parent instanceof Gtk.Stack) {
91
+ return parent.getPage(widget).getTitle() ?? null;
92
+ }
93
+ return null;
94
+ };
95
+ const getWidgetAccessibleName = (widget) => {
72
96
  const role = widget.getAccessibleRole();
73
97
  if (role === Gtk.AccessibleRole.TAB_PANEL) {
74
- const parent = widget.getParent();
75
- if (parent instanceof Gtk.Stack) {
76
- const page = parent.getPage(widget);
77
- return page.getTitle() ?? null;
78
- }
79
- return null;
98
+ return tabPanelTitle(widget);
80
99
  }
81
- const accessibleLabel = getAccessibleMetadata(widget, "accessibleLabel");
82
- if (accessibleLabel)
100
+ const accessibleLabel = readAccessibleString(widget, "accessibleLabel");
101
+ if (accessibleLabel) {
83
102
  return accessibleLabel;
103
+ }
84
104
  const ownText = getWidgetNodeText(widget);
85
- if (ownText)
105
+ if (ownText) {
86
106
  return ownText;
107
+ }
87
108
  const childLabels = collectLabels(widget);
88
- if (childLabels.length > 0)
109
+ if (childLabels.length > 0) {
89
110
  return childLabels.join(" ");
111
+ }
90
112
  return callStringGetter(widget, "getTooltipText");
91
113
  };
92
- export const getWidgetName = (widget) => {
114
+ const getWidgetName = (widget) => {
93
115
  return widget.getName();
94
116
  };
95
- export const getWidgetPlaceholderText = (widget) => {
117
+ const getWidgetPlaceholderText = (widget) => {
96
118
  if (!EDITABLE_ROLES.has(widget.getAccessibleRole()) || !(widget instanceof Gtk.Editable)) {
97
119
  return null;
98
120
  }
99
121
  return callStringGetter(widget, "getPlaceholderText");
100
122
  };
101
- export const getWidgetDisplayValue = (widget) => {
123
+ const getWidgetDisplayValue = (widget) => {
102
124
  if (EDITABLE_ROLES.has(widget.getAccessibleRole()) && isEditable(widget)) {
103
125
  return readEditableText(widget);
104
126
  }
105
127
  return null;
106
128
  };
107
- export const getWidgetCheckedState = (widget) => {
108
- if (widget instanceof Gtk.CheckButton)
129
+ const getWidgetCheckedState = (widget) => {
130
+ if (widget instanceof Gtk.CheckButton) {
109
131
  return widget.getActive();
110
- if (widget instanceof Gtk.Switch)
132
+ }
133
+ if (widget instanceof Gtk.Switch) {
111
134
  return widget.getActive();
135
+ }
112
136
  if (widget instanceof Gtk.ToggleButton && widget.getAccessibleRole() === Gtk.AccessibleRole.RADIO) {
113
137
  return widget.getActive();
114
138
  }
115
139
  return null;
116
140
  };
117
- export const getWidgetPressedState = (widget) => {
118
- if (widget instanceof Gtk.ToggleButton)
141
+ const getWidgetPressedState = (widget) => {
142
+ if (widget instanceof Gtk.ToggleButton) {
119
143
  return widget.getActive();
144
+ }
120
145
  return null;
121
146
  };
122
- export const getWidgetExpandedState = (widget) => {
147
+ const getWidgetExpandedState = (widget) => {
123
148
  if (widget instanceof Gtk.Expander) {
124
149
  return widget.getExpanded();
125
150
  }
@@ -128,7 +153,7 @@ export const getWidgetExpandedState = (widget) => {
128
153
  }
129
154
  return null;
130
155
  };
131
- export const getWidgetSelectedState = (widget) => {
156
+ const getWidgetSelectedState = (widget) => {
132
157
  if (widget instanceof Gtk.ListBoxRow) {
133
158
  return widget.isSelected();
134
159
  }
@@ -137,20 +162,18 @@ export const getWidgetSelectedState = (widget) => {
137
162
  }
138
163
  return null;
139
164
  };
140
- export const getWidgetLevel = (widget) => {
165
+ const getWidgetLevel = (widget) => {
141
166
  return readAccessibleNumber(widget, "accessibleLevel");
142
167
  };
143
- export const getWidgetInvalidState = (widget) => {
144
- return getAccessibleMetadata(widget, "accessibleInvalid");
145
- };
146
- export const getWidgetErrorMessage = (widget) => {
147
- const targets = getAccessibleMetadata(widget, "accessibleErrorMessage");
148
- return Array.isArray(targets) && targets.length > 0 ? targets : null;
168
+ const getWidgetInvalidState = (widget) => {
169
+ const value = readAccessibleNumber(widget, "accessibleInvalid");
170
+ return value ?? null;
149
171
  };
150
- export const getWidgetBusyState = (widget) => {
172
+ const getWidgetErrorMessage = (widget) => readAccessibleWidgets(widget, "accessibleErrorMessage");
173
+ const getWidgetBusyState = (widget) => {
151
174
  return readAccessibleBoolean(widget, "accessibleBusy");
152
175
  };
153
- export const getWidgetDescription = (widget) => {
176
+ const getWidgetDescription = (widget) => {
154
177
  return readAccessibleString(widget, "accessibleDescription");
155
178
  };
156
179
  const adjustmentValue = (adjustment) => ({
@@ -158,27 +181,40 @@ const adjustmentValue = (adjustment) => ({
158
181
  min: adjustment.getLower(),
159
182
  max: adjustment.getUpper(),
160
183
  });
161
- const getWidgetLiveValue = (widget) => {
162
- if (widget instanceof Gtk.Range)
184
+ const adjustmentWidgetValue = (widget) => {
185
+ if (widget instanceof Gtk.Range) {
163
186
  return adjustmentValue(widget.getAdjustment());
164
- if (widget instanceof Gtk.Scrollbar)
187
+ }
188
+ if (widget instanceof Gtk.Scrollbar) {
165
189
  return adjustmentValue(widget.getAdjustment());
166
- if (widget instanceof Gtk.SpinButton)
190
+ }
191
+ if (widget instanceof Gtk.SpinButton) {
167
192
  return adjustmentValue(widget.getAdjustment());
168
- if (widget instanceof Gtk.ScaleButton)
193
+ }
194
+ if (widget instanceof Gtk.ScaleButton) {
169
195
  return adjustmentValue(widget.getAdjustment());
196
+ }
197
+ return null;
198
+ };
199
+ const getWidgetLiveValue = (widget) => {
200
+ const adjustmentBased = adjustmentWidgetValue(widget);
201
+ if (adjustmentBased) {
202
+ return adjustmentBased;
203
+ }
170
204
  if (widget instanceof Gtk.LevelBar) {
171
205
  return { now: widget.getValue(), min: widget.getMinValue(), max: widget.getMaxValue() };
172
206
  }
173
- if (widget instanceof Gtk.ProgressBar)
207
+ if (widget instanceof Gtk.ProgressBar) {
174
208
  return { now: widget.getFraction(), min: 0, max: 1 };
209
+ }
175
210
  return null;
176
211
  };
177
- export const getWidgetValue = (widget) => {
212
+ const getWidgetValue = (widget) => {
178
213
  const text = readAccessibleString(widget, "accessibleValueText");
179
214
  const live = getWidgetLiveValue(widget);
180
- if (live)
215
+ if (live) {
181
216
  return { ...live, text };
217
+ }
182
218
  return {
183
219
  now: readAccessibleNumber(widget, "accessibleValueNow"),
184
220
  min: readAccessibleNumber(widget, "accessibleValueMin"),
@@ -186,30 +222,39 @@ export const getWidgetValue = (widget) => {
186
222
  text,
187
223
  };
188
224
  };
189
- export const getWidgetOwnLabel = (widget) => {
225
+ const getWidgetOwnLabel = (widget) => {
190
226
  return readAccessibleString(widget, "accessibleLabel");
191
227
  };
192
- export const getWidgetLabelledByText = (widget) => {
193
- const targets = getAccessibleMetadata(widget, "accessibleLabelledBy");
194
- if (!Array.isArray(targets) || targets.length === 0)
195
- return null;
228
+ const collectAccessibleNames = (targets) => {
196
229
  const texts = [];
197
230
  for (const target of targets) {
198
231
  const text = getWidgetAccessibleName(target);
199
- if (text !== null)
232
+ if (text !== null) {
200
233
  texts.push(text);
234
+ }
201
235
  }
236
+ return texts;
237
+ };
238
+ const getWidgetLabelledByText = (widget) => {
239
+ const targets = readAccessibleWidgets(widget, "accessibleLabelledBy");
240
+ if (targets === null) {
241
+ return null;
242
+ }
243
+ const texts = collectAccessibleNames(targets);
202
244
  return texts.length > 0 ? texts.join(" ") : null;
203
245
  };
204
- export const isInaccessible = (widget) => {
246
+ const isInaccessible = (widget) => {
205
247
  let current = widget;
206
248
  while (current) {
207
- if (!current.getVisible())
249
+ if (!current.getVisible()) {
208
250
  return true;
209
- if (readAccessibleBoolean(current, "accessibleHidden") === true)
251
+ }
252
+ if (readAccessibleBoolean(current, "accessibleHidden") === true) {
210
253
  return true;
254
+ }
211
255
  current = current.getParent();
212
256
  }
213
257
  return false;
214
258
  };
259
+ export { getWidgetNodeText, getWidgetLabelText, getWidgetAccessibleName, getWidgetName, getWidgetPlaceholderText, getWidgetDisplayValue, getWidgetCheckedState, getWidgetPressedState, getWidgetExpandedState, getWidgetSelectedState, getWidgetLevel, getWidgetInvalidState, getWidgetErrorMessage, getWidgetBusyState, getWidgetDescription, getWidgetValue, getWidgetOwnLabel, getWidgetLabelledByText, isInaccessible, };
215
260
  //# sourceMappingURL=widget-accessible-properties.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"widget-accessible-properties.js","sourceRoot":"","sources":["../src/widget-accessible-properties.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Gtk from \"@gtkx/gi/gtk\";\nimport { getAccessibleMetadata } from \"@gtkx/react/internal\";\nimport { EDITABLE_ROLES, isEditable, readEditableText } from \"./editable.js\";\nimport { descendants } from \"./traversal.js\";\n\nconst callStringGetter = (widget: Gtk.Widget, method: string): string | null => {\n const fn: unknown = Reflect.get(widget, method);\n if (typeof fn !== \"function\") return null;\n const value = (fn as () => string | null).call(widget);\n return value ?? null;\n};\n\nconst readAccessibleString = (widget: Gtk.Widget, key: string): string | null => {\n const value = getAccessibleMetadata<string>(widget, key);\n return typeof value === \"string\" ? value : null;\n};\n\nconst readAccessibleNumber = (widget: Gtk.Widget, key: string): number | null => {\n const value = getAccessibleMetadata<number>(widget, key);\n return typeof value === \"number\" ? value : null;\n};\n\nconst readAccessibleBoolean = (widget: Gtk.Widget, key: string): boolean | null => {\n const value = getAccessibleMetadata<boolean>(widget, key);\n return typeof value === \"boolean\" ? value : null;\n};\n\nconst getLabelText = (widget: Gtk.Widget): string | null => {\n if (widget instanceof Gtk.Label) return widget.getLabel();\n if (widget instanceof Gtk.Inscription) return widget.getText() ?? null;\n return null;\n};\n\nconst DEFAULT_TEXT_GETTERS = [\"getLabel\", \"getText\", \"getTitle\"] as const;\n\n/**\n * Returns a widget's own text by trying its label, text, and title getters in\n * order, or null when none produce a value.\n *\n * @param widget The widget to read text from.\n */\nexport const getWidgetNodeText = (widget: Gtk.Widget): string | null => {\n for (const getter of DEFAULT_TEXT_GETTERS) {\n const value = callStringGetter(widget, getter);\n if (value) return value;\n }\n return null;\n};\n\nconst stripMnemonic = (text: string): string => text.replace(/_(.)/g, \"$1\");\n\nconst namingLabelText = (widget: Gtk.Widget): string | null => {\n const text = getLabelText(widget);\n if (text === null) return null;\n return widget instanceof Gtk.Label && widget.getUseUnderline() ? stripMnemonic(text) : text;\n};\n\nconst isNamingLabelRole = (role: Gtk.AccessibleRole, includePresentation: boolean): boolean =>\n role === Gtk.AccessibleRole.LABEL || (includePresentation && role === Gtk.AccessibleRole.PRESENTATION);\n\nconst collectLabels = (widget: Gtk.Widget): string[] => {\n const includePresentation = widget.getAccessibleRole() === Gtk.AccessibleRole.MENU_ITEM;\n const labels: string[] = [];\n for (const descendant of descendants(widget)) {\n if (!isNamingLabelRole(descendant.getAccessibleRole(), includePresentation)) continue;\n const labelText = namingLabelText(descendant);\n if (labelText) labels.push(labelText);\n }\n return labels;\n};\n\nexport const getWidgetLabelText = (widget: Gtk.Widget): string | null => {\n if (widget.getAccessibleRole() !== Gtk.AccessibleRole.LABEL) return null;\n return getLabelText(widget);\n};\n\nexport const getWidgetAccessibleName = (widget: Gtk.Widget): string | null => {\n const role = widget.getAccessibleRole();\n\n if (role === Gtk.AccessibleRole.TAB_PANEL) {\n const parent = widget.getParent();\n if (parent instanceof Gtk.Stack) {\n const page = parent.getPage(widget);\n return page.getTitle() ?? null;\n }\n return null;\n }\n\n const accessibleLabel = getAccessibleMetadata<string>(widget, \"accessibleLabel\");\n if (accessibleLabel) return accessibleLabel;\n\n const ownText = getWidgetNodeText(widget);\n if (ownText) return ownText;\n\n const childLabels = collectLabels(widget);\n if (childLabels.length > 0) return childLabels.join(\" \");\n\n return callStringGetter(widget, \"getTooltipText\");\n};\n\nexport const getWidgetName = (widget: Gtk.Widget): string | null => {\n return widget.getName();\n};\n\nexport const getWidgetPlaceholderText = (widget: Gtk.Widget): string | null => {\n if (!EDITABLE_ROLES.has(widget.getAccessibleRole()) || !(widget instanceof Gtk.Editable)) {\n return null;\n }\n\n return callStringGetter(widget, \"getPlaceholderText\");\n};\n\nexport const getWidgetDisplayValue = (widget: Gtk.Widget): string | null => {\n if (EDITABLE_ROLES.has(widget.getAccessibleRole()) && isEditable(widget)) {\n return readEditableText(widget);\n }\n\n return null;\n};\n\nexport const getWidgetCheckedState = (widget: Gtk.Widget): boolean | null => {\n if (widget instanceof Gtk.CheckButton) return widget.getActive();\n if (widget instanceof Gtk.Switch) return widget.getActive();\n if (widget instanceof Gtk.ToggleButton && widget.getAccessibleRole() === Gtk.AccessibleRole.RADIO) {\n return widget.getActive();\n }\n return null;\n};\n\nexport const getWidgetPressedState = (widget: Gtk.Widget): boolean | null => {\n if (widget instanceof Gtk.ToggleButton) return widget.getActive();\n return null;\n};\n\nexport const getWidgetExpandedState = (widget: Gtk.Widget): boolean | null => {\n if (widget instanceof Gtk.Expander) {\n return widget.getExpanded();\n }\n\n if (widget instanceof Gtk.TreeExpander) {\n return widget.getListRow()?.getExpanded() ?? null;\n }\n\n return null;\n};\n\nexport const getWidgetSelectedState = (widget: Gtk.Widget): boolean | null => {\n if (widget instanceof Gtk.ListBoxRow) {\n return widget.isSelected();\n }\n\n if (widget.getAccessibleRole() === Gtk.AccessibleRole.ROW) {\n return (widget.getStateFlags() & Gtk.StateFlags.SELECTED) !== 0;\n }\n\n return null;\n};\n\nexport const getWidgetLevel = (widget: Gtk.Widget): number | null => {\n return readAccessibleNumber(widget, \"accessibleLevel\");\n};\n\nexport const getWidgetInvalidState = (widget: Gtk.Widget): Gtk.AccessibleInvalidState | null => {\n return getAccessibleMetadata<Gtk.AccessibleInvalidState>(widget, \"accessibleInvalid\");\n};\n\nexport const getWidgetErrorMessage = (widget: Gtk.Widget): Gtk.Widget[] | null => {\n const targets = getAccessibleMetadata<Gtk.Widget[]>(widget, \"accessibleErrorMessage\");\n return Array.isArray(targets) && targets.length > 0 ? targets : null;\n};\n\nexport const getWidgetBusyState = (widget: Gtk.Widget): boolean | null => {\n return readAccessibleBoolean(widget, \"accessibleBusy\");\n};\n\nexport const getWidgetDescription = (widget: Gtk.Widget): string | null => {\n return readAccessibleString(widget, \"accessibleDescription\");\n};\n\nexport type WidgetValue = {\n now: number | null;\n min: number | null;\n max: number | null;\n text: string | null;\n};\n\ntype ValueTriplet = { now: number | null; min: number | null; max: number | null };\n\nconst adjustmentValue = (adjustment: Gtk.Adjustment): ValueTriplet => ({\n now: adjustment.getValue(),\n min: adjustment.getLower(),\n max: adjustment.getUpper(),\n});\n\nconst getWidgetLiveValue = (widget: Gtk.Widget): ValueTriplet | null => {\n if (widget instanceof Gtk.Range) return adjustmentValue(widget.getAdjustment());\n if (widget instanceof Gtk.Scrollbar) return adjustmentValue(widget.getAdjustment());\n if (widget instanceof Gtk.SpinButton) return adjustmentValue(widget.getAdjustment());\n if (widget instanceof Gtk.ScaleButton) return adjustmentValue(widget.getAdjustment());\n if (widget instanceof Gtk.LevelBar) {\n return { now: widget.getValue(), min: widget.getMinValue(), max: widget.getMaxValue() };\n }\n if (widget instanceof Gtk.ProgressBar) return { now: widget.getFraction(), min: 0, max: 1 };\n return null;\n};\n\nexport const getWidgetValue = (widget: Gtk.Widget): WidgetValue => {\n const text = readAccessibleString(widget, \"accessibleValueText\");\n const live = getWidgetLiveValue(widget);\n if (live) return { ...live, text };\n return {\n now: readAccessibleNumber(widget, \"accessibleValueNow\"),\n min: readAccessibleNumber(widget, \"accessibleValueMin\"),\n max: readAccessibleNumber(widget, \"accessibleValueMax\"),\n text,\n };\n};\n\nexport const getWidgetOwnLabel = (widget: Gtk.Widget): string | null => {\n return readAccessibleString(widget, \"accessibleLabel\");\n};\n\nexport const getWidgetLabelledByText = (widget: Gtk.Widget): string | null => {\n const targets = getAccessibleMetadata<Gtk.Widget[]>(widget, \"accessibleLabelledBy\");\n if (!Array.isArray(targets) || targets.length === 0) return null;\n\n const texts: string[] = [];\n for (const target of targets) {\n const text = getWidgetAccessibleName(target);\n if (text !== null) texts.push(text);\n }\n\n return texts.length > 0 ? texts.join(\" \") : null;\n};\n\nexport const isInaccessible = (widget: Gtk.Widget): boolean => {\n let current: Gtk.Widget | null = widget;\n while (current) {\n if (!current.getVisible()) return true;\n if (readAccessibleBoolean(current, \"accessibleHidden\") === true) return true;\n current = current.getParent();\n }\n return false;\n};\n"]}
1
+ {"version":3,"file":"widget-accessible-properties.js","sourceRoot":"","sources":["../src/widget-accessible-properties.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Gtk from \"@gtkx/gi/gtk\";\nimport { getAccessibleMetadata } from \"@gtkx/react/internal\";\nimport { EDITABLE_ROLES, isEditable, readEditableText } from \"./editable.js\";\nimport { descendants } from \"./traversal.js\";\n\ntype WidgetValue = {\n now: number | null;\n min: number | null;\n max: number | null;\n text: string | null;\n};\n\ntype ValueTriplet = { now: number | null; min: number | null; max: number | null };\n\nconst DEFAULT_TEXT_GETTERS = [\"getLabel\", \"getText\", \"getTitle\"] as const;\n\nconst callStringGetter = (widget: Gtk.Widget, method: string): string | null => {\n const fn: unknown = Reflect.get(widget, method);\n\n if (typeof fn !== \"function\") {\n return null;\n }\n\n const value = (fn as () => string | null).call(widget);\n\n return value ?? null;\n};\n\nconst readAccessibleString = (widget: Gtk.Widget, key: string): string | null => {\n const value = getAccessibleMetadata(widget, key);\n\n return typeof value === \"string\" ? value : null;\n};\n\nconst readAccessibleNumber = (widget: Gtk.Widget, key: string): number | null => {\n const value = getAccessibleMetadata(widget, key);\n\n return typeof value === \"number\" ? value : null;\n};\n\nconst readAccessibleWidgets = (widget: Gtk.Widget, key: string): Gtk.Widget[] | null => {\n const value = getAccessibleMetadata(widget, key);\n\n if (!Array.isArray(value)) {\n return null;\n }\n\n const widgets = value.filter((item): item is Gtk.Widget => item instanceof Gtk.Widget);\n\n return widgets.length > 0 ? widgets : null;\n};\n\nconst readAccessibleBoolean = (widget: Gtk.Widget, key: string): boolean | null => {\n const value = getAccessibleMetadata(widget, key);\n\n return typeof value === \"boolean\" ? value : null;\n};\n\nconst getLabelText = (widget: Gtk.Widget): string | null => {\n if (widget instanceof Gtk.Label) {\n return widget.getLabel();\n }\n\n if (widget instanceof Gtk.Inscription) {\n return widget.getText() ?? null;\n }\n\n return null;\n};\n\n/**\n * Returns a widget's own text by trying its label, text, and title getters in\n * order, or null when none produce a value.\n *\n * @param widget The widget to read text from.\n */\nconst getWidgetNodeText = (widget: Gtk.Widget): string | null => {\n for (const getter of DEFAULT_TEXT_GETTERS) {\n const value = callStringGetter(widget, getter);\n\n if (value) {\n return value;\n }\n }\n\n return null;\n};\n\nconst stripMnemonic = (text: string): string => text.replaceAll(/_(.)/g, \"$1\");\n\nconst namingLabelText = (widget: Gtk.Widget): string | null => {\n const text = getLabelText(widget);\n\n if (text === null) {\n return null;\n }\n\n return widget instanceof Gtk.Label && widget.getUseUnderline() ? stripMnemonic(text) : text;\n};\n\nconst isNamingLabelRole = (role: Gtk.AccessibleRole, shouldIncludePresentation: boolean): boolean =>\n role === Gtk.AccessibleRole.LABEL ||\n (shouldIncludePresentation && role === Gtk.AccessibleRole.PRESENTATION);\n\nconst collectLabels = (widget: Gtk.Widget): string[] => {\n const isIncludePresentation = widget.getAccessibleRole() === Gtk.AccessibleRole.MENU_ITEM;\n const labels: string[] = [];\n\n for (const descendant of descendants(widget)) {\n if (!isNamingLabelRole(descendant.getAccessibleRole(), isIncludePresentation)) {\n continue;\n }\n\n const labelText = namingLabelText(descendant);\n\n if (labelText) {\n labels.push(labelText);\n }\n }\n\n return labels;\n};\n\nconst getWidgetLabelText = (widget: Gtk.Widget): string | null => {\n if (widget.getAccessibleRole() !== Gtk.AccessibleRole.LABEL) {\n return null;\n }\n\n return getLabelText(widget);\n};\n\nconst tabPanelTitle = (widget: Gtk.Widget): string | null => {\n const parent = widget.getParent();\n\n if (parent instanceof Gtk.Stack) {\n return parent.getPage(widget).getTitle() ?? null;\n }\n\n return null;\n};\n\nconst getWidgetAccessibleName = (widget: Gtk.Widget): string | null => {\n const role = widget.getAccessibleRole();\n\n if (role === Gtk.AccessibleRole.TAB_PANEL) {\n return tabPanelTitle(widget);\n }\n\n const accessibleLabel = readAccessibleString(widget, \"accessibleLabel\");\n\n if (accessibleLabel) {\n return accessibleLabel;\n }\n\n const ownText = getWidgetNodeText(widget);\n\n if (ownText) {\n return ownText;\n }\n\n const childLabels = collectLabels(widget);\n\n if (childLabels.length > 0) {\n return childLabels.join(\" \");\n }\n\n return callStringGetter(widget, \"getTooltipText\");\n};\n\nconst getWidgetName = (widget: Gtk.Widget): string | null => {\n return widget.getName();\n};\n\nconst getWidgetPlaceholderText = (widget: Gtk.Widget): string | null => {\n if (!EDITABLE_ROLES.has(widget.getAccessibleRole()) || !(widget instanceof Gtk.Editable)) {\n return null;\n }\n\n return callStringGetter(widget, \"getPlaceholderText\");\n};\n\nconst getWidgetDisplayValue = (widget: Gtk.Widget): string | null => {\n if (EDITABLE_ROLES.has(widget.getAccessibleRole()) && isEditable(widget)) {\n return readEditableText(widget);\n }\n\n return null;\n};\n\nconst getWidgetCheckedState = (widget: Gtk.Widget): boolean | null => {\n if (widget instanceof Gtk.CheckButton) {\n return widget.getActive();\n }\n\n if (widget instanceof Gtk.Switch) {\n return widget.getActive();\n }\n\n if (widget instanceof Gtk.ToggleButton && widget.getAccessibleRole() === Gtk.AccessibleRole.RADIO) {\n return widget.getActive();\n }\n\n return null;\n};\n\nconst getWidgetPressedState = (widget: Gtk.Widget): boolean | null => {\n if (widget instanceof Gtk.ToggleButton) {\n return widget.getActive();\n }\n\n return null;\n};\n\nconst getWidgetExpandedState = (widget: Gtk.Widget): boolean | null => {\n if (widget instanceof Gtk.Expander) {\n return widget.getExpanded();\n }\n\n if (widget instanceof Gtk.TreeExpander) {\n return widget.getListRow()?.getExpanded() ?? null;\n }\n\n return null;\n};\n\nconst getWidgetSelectedState = (widget: Gtk.Widget): boolean | null => {\n if (widget instanceof Gtk.ListBoxRow) {\n return widget.isSelected();\n }\n\n if (widget.getAccessibleRole() === Gtk.AccessibleRole.ROW) {\n return (widget.getStateFlags() & Gtk.StateFlags.SELECTED) !== 0;\n }\n\n return null;\n};\n\nconst getWidgetLevel = (widget: Gtk.Widget): number | null => {\n return readAccessibleNumber(widget, \"accessibleLevel\");\n};\n\nconst getWidgetInvalidState = (widget: Gtk.Widget): Gtk.AccessibleInvalidState | null => {\n const value = readAccessibleNumber(widget, \"accessibleInvalid\");\n\n return value ?? null;\n};\n\nconst getWidgetErrorMessage = (widget: Gtk.Widget): Gtk.Widget[] | null =>\n readAccessibleWidgets(widget, \"accessibleErrorMessage\");\n\nconst getWidgetBusyState = (widget: Gtk.Widget): boolean | null => {\n return readAccessibleBoolean(widget, \"accessibleBusy\");\n};\n\nconst getWidgetDescription = (widget: Gtk.Widget): string | null => {\n return readAccessibleString(widget, \"accessibleDescription\");\n};\n\nconst adjustmentValue = (adjustment: Gtk.Adjustment): ValueTriplet => ({\n now: adjustment.getValue(),\n min: adjustment.getLower(),\n max: adjustment.getUpper(),\n});\n\nconst adjustmentWidgetValue = (widget: Gtk.Widget): ValueTriplet | null => {\n if (widget instanceof Gtk.Range) {\n return adjustmentValue(widget.getAdjustment());\n }\n\n if (widget instanceof Gtk.Scrollbar) {\n return adjustmentValue(widget.getAdjustment());\n }\n\n if (widget instanceof Gtk.SpinButton) {\n return adjustmentValue(widget.getAdjustment());\n }\n\n if (widget instanceof Gtk.ScaleButton) {\n return adjustmentValue(widget.getAdjustment());\n }\n\n return null;\n};\n\nconst getWidgetLiveValue = (widget: Gtk.Widget): ValueTriplet | null => {\n const adjustmentBased = adjustmentWidgetValue(widget);\n\n if (adjustmentBased) {\n return adjustmentBased;\n }\n\n if (widget instanceof Gtk.LevelBar) {\n return { now: widget.getValue(), min: widget.getMinValue(), max: widget.getMaxValue() };\n }\n\n if (widget instanceof Gtk.ProgressBar) {\n return { now: widget.getFraction(), min: 0, max: 1 };\n }\n\n return null;\n};\n\nconst getWidgetValue = (widget: Gtk.Widget): WidgetValue => {\n const text = readAccessibleString(widget, \"accessibleValueText\");\n const live = getWidgetLiveValue(widget);\n\n if (live) {\n return { ...live, text };\n }\n\n return {\n now: readAccessibleNumber(widget, \"accessibleValueNow\"),\n min: readAccessibleNumber(widget, \"accessibleValueMin\"),\n max: readAccessibleNumber(widget, \"accessibleValueMax\"),\n text,\n };\n};\n\nconst getWidgetOwnLabel = (widget: Gtk.Widget): string | null => {\n return readAccessibleString(widget, \"accessibleLabel\");\n};\n\nconst collectAccessibleNames = (targets: Gtk.Widget[]): string[] => {\n const texts: string[] = [];\n\n for (const target of targets) {\n const text = getWidgetAccessibleName(target);\n\n if (text !== null) {\n texts.push(text);\n }\n }\n\n return texts;\n};\n\nconst getWidgetLabelledByText = (widget: Gtk.Widget): string | null => {\n const targets = readAccessibleWidgets(widget, \"accessibleLabelledBy\");\n\n if (targets === null) {\n return null;\n }\n\n const texts = collectAccessibleNames(targets);\n\n return texts.length > 0 ? texts.join(\" \") : null;\n};\n\nconst isInaccessible = (widget: Gtk.Widget): boolean => {\n let current: Gtk.Widget | null = widget;\n\n while (current) {\n if (!current.getVisible()) {\n return true;\n }\n\n if (readAccessibleBoolean(current, \"accessibleHidden\") === true) {\n return true;\n }\n\n current = current.getParent();\n }\n\n return false;\n};\n\nexport {\n getWidgetNodeText,\n getWidgetLabelText,\n getWidgetAccessibleName,\n getWidgetName,\n getWidgetPlaceholderText,\n getWidgetDisplayValue,\n getWidgetCheckedState,\n getWidgetPressedState,\n getWidgetExpandedState,\n getWidgetSelectedState,\n getWidgetLevel,\n getWidgetInvalidState,\n getWidgetErrorMessage,\n getWidgetBusyState,\n getWidgetDescription,\n getWidgetValue,\n getWidgetOwnLabel,\n getWidgetLabelledByText,\n isInaccessible,\n type WidgetValue,\n};\n"]}
package/dist/within.d.ts CHANGED
@@ -9,5 +9,6 @@ import type { BoundCustomQueries, QueryMap } from "./types.js";
9
9
  * @param queries Optional custom queries to bind alongside the built-in ones.
10
10
  * @returns The queries bound to the container.
11
11
  */
12
- export declare const within: <Q extends QueryMap = Record<never, never>>(container: Container, queries?: Q) => BoundQueries & BoundCustomQueries<Q>;
12
+ declare const within: <Q extends QueryMap = Record<never, never>>(container: Container, queries?: Q) => BoundQueries & BoundCustomQueries<Q>;
13
+ export { within };
13
14
  //# sourceMappingURL=within.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"within.d.ts","sourceRoot":"","sources":["../src/within.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAY/D;;;;;;;GAOG;AACH,eAAO,MAAM,MAAM,GAAI,CAAC,SAAS,QAAQ,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,aACjD,SAAS,YACV,CAAC,KACZ,YAAY,GAAG,kBAAkB,CAAC,CAAC,CAGpC,CAAC"}
1
+ {"version":3,"file":"within.d.ts","sourceRoot":"","sources":["../src/within.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAc/D;;;;;;;GAOG;AACH,QAAA,MAAM,MAAM,GAAI,CAAC,SAAS,QAAQ,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,EACrD,WAAW,SAAS,EACpB,UAAU,CAAC,KACZ,YAAY,GAAG,kBAAkB,CAAC,CAAC,CAGpC,CAAC;AAEH,OAAO,EAAE,MAAM,EAAE,CAAC"}
package/dist/within.js CHANGED
@@ -12,8 +12,9 @@ const bindCustomQueries = (customQueries, container) => {
12
12
  * @param queries Optional custom queries to bind alongside the built-in ones.
13
13
  * @returns The queries bound to the container.
14
14
  */
15
- export const within = (container, queries) => ({
15
+ const within = (container, queries) => ({
16
16
  ...bindCustomQueries(builtinQueries, container),
17
17
  ...(queries ? bindCustomQueries(queries, container) : {}),
18
18
  });
19
+ export { within };
19
20
  //# sourceMappingURL=within.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"within.js","sourceRoot":"","sources":["../src/within.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAI9C,MAAM,SAAS,GACX,CAAiC,KAAsD,EAAE,SAAoB,EAAE,EAAE,CACjH,CAAC,GAAG,IAAU,EAAU,EAAE,CACtB,KAAK,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC;AAElC,MAAM,iBAAiB,GAAG,CAAqB,aAAgB,EAAE,SAAoB,EAAyB,EAAE;IAC5G,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,CAAU,CAAC,CAAC;IACjH,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAA0B,CAAC;AAChE,CAAC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CAClB,SAAoB,EACpB,OAAW,EACyB,EAAE,CAAC,CAAC;IACxC,GAAG,iBAAiB,CAAC,cAAc,EAAE,SAAS,CAAC;IAC/C,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,CAAE,EAA4B,CAAC;CACvF,CAAC,CAAC","sourcesContent":["import type { BoundQueries } from \"./bound-queries.js\";\nimport { builtinQueries } from \"./queries.js\";\nimport type { Container } from \"./traversal.js\";\nimport type { BoundCustomQueries, QueryMap } from \"./types.js\";\n\nconst bindQuery =\n <Args extends unknown[], Result>(query: (container: Container, ...args: Args) => Result, container: Container) =>\n (...args: Args): Result =>\n query(container, ...args);\n\nconst bindCustomQueries = <Q extends QueryMap>(customQueries: Q, container: Container): BoundCustomQueries<Q> => {\n const entries = Object.entries(customQueries).map(([key, query]) => [key, bindQuery(query, container)] as const);\n return Object.fromEntries(entries) as BoundCustomQueries<Q>;\n};\n\n/**\n * Binds the built-in queries, and any custom queries, to a specific container\n * so they search only within that scope.\n *\n * @param container The scope the returned queries operate on.\n * @param queries Optional custom queries to bind alongside the built-in ones.\n * @returns The queries bound to the container.\n */\nexport const within = <Q extends QueryMap = Record<never, never>>(\n container: Container,\n queries?: Q,\n): BoundQueries & BoundCustomQueries<Q> => ({\n ...bindCustomQueries(builtinQueries, container),\n ...(queries ? bindCustomQueries(queries, container) : ({} as BoundCustomQueries<Q>)),\n});\n"]}
1
+ {"version":3,"file":"within.js","sourceRoot":"","sources":["../src/within.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,SAAS,GACX,CAAiC,KAAsD,EAAE,SAAoB,EAAE,EAAE,CAC7G,CAAC,GAAG,IAAU,EAAU,EAAE,CACtB,KAAK,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC;AAEtC,MAAM,iBAAiB,GAAG,CAAqB,aAAgB,EAAE,SAAoB,EAAyB,EAAE;IAC5G,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,CAAU,CAAC,CAAC;IAEjH,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAA0B,CAAC;AAChE,CAAC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,MAAM,GAAG,CACX,SAAoB,EACpB,OAAW,EACyB,EAAE,CAAC,CAAC;IACxC,GAAG,iBAAiB,CAAC,cAAc,EAAE,SAAS,CAAC;IAC/C,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,CAAE,EAA4B,CAAC;CACvF,CAAC,CAAC;AAEH,OAAO,EAAE,MAAM,EAAE,CAAC","sourcesContent":["import type { BoundQueries } from \"./bound-queries.js\";\nimport type { Container } from \"./traversal.js\";\nimport type { BoundCustomQueries, QueryMap } from \"./types.js\";\nimport { builtinQueries } from \"./queries.js\";\n\nconst bindQuery =\n <Args extends unknown[], Result>(query: (container: Container, ...args: Args) => Result, container: Container) =>\n (...args: Args): Result =>\n query(container, ...args);\n\nconst bindCustomQueries = <Q extends QueryMap>(customQueries: Q, container: Container): BoundCustomQueries<Q> => {\n const entries = Object.entries(customQueries).map(([key, query]) => [key, bindQuery(query, container)] as const);\n\n return Object.fromEntries(entries) as BoundCustomQueries<Q>;\n};\n\n/**\n * Binds the built-in queries, and any custom queries, to a specific container\n * so they search only within that scope.\n *\n * @param container The scope the returned queries operate on.\n * @param queries Optional custom queries to bind alongside the built-in ones.\n * @returns The queries bound to the container.\n */\nconst within = <Q extends QueryMap = Record<never, never>>(\n container: Container,\n queries?: Q,\n): BoundQueries & BoundCustomQueries<Q> => ({\n ...bindCustomQueries(builtinQueries, container),\n ...(queries ? bindCustomQueries(queries, container) : ({} as BoundCustomQueries<Q>)),\n});\n\nexport { within };\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gtkx/testing",
3
- "version": "1.0.0-rc.1",
3
+ "version": "1.0.0-rc.2",
4
4
  "description": "Testing Library-style queries, user events, and screenshots for GTK4 widget trees rendered by GTKX",
5
5
  "keywords": [
6
6
  "gtkx",
@@ -44,20 +44,22 @@
44
44
  "node": ">=24"
45
45
  },
46
46
  "dependencies": {
47
- "@gtkx/runtime": "1.0.0-rc.1",
48
- "@gtkx/utils": "1.0.0-rc.1",
49
- "@gtkx/react": "1.0.0-rc.1"
47
+ "@gtkx/react": "1.0.0-rc.2",
48
+ "@gtkx/runtime": "1.0.0-rc.2",
49
+ "@gtkx/utils": "1.0.0-rc.2"
50
+ },
51
+ "peerDependencies": {
52
+ "@types/react": "^19.2",
53
+ "react": "^19.2"
50
54
  },
51
55
  "devDependencies": {
56
+ "@types/react": "^19.2.17",
52
57
  "@vitest/expect": "^4.1.10",
53
58
  "vitest": "^4.1.10",
54
- "@gtkx/config": "1.0.0-rc.1",
55
- "@gtkx/components": "1.0.0-rc.1",
56
- "@gtkx/vitest": "1.0.0-rc.1"
59
+ "@gtkx/vitest": "1.0.0-rc.2",
60
+ "@gtkx/config": "1.0.0-rc.2"
57
61
  },
58
62
  "scripts": {
59
- "build": "tsc -b tsconfig.lib.json",
60
- "typecheck": "tsc -b --emitDeclarationOnly",
61
63
  "release": "tsx ../../scripts/release-package.ts"
62
64
  }
63
65
  }
package/src/act.ts CHANGED
@@ -4,65 +4,74 @@ declare global {
4
4
  var IS_REACT_ACT_ENVIRONMENT: boolean | undefined;
5
5
  }
6
6
 
7
+ type ActCallback<T> = () => T | PromiseLike<T>;
8
+ type ActImplementation = <T>(callback: ActCallback<T>) => PromiseLike<T>;
9
+
10
+ const actImplementation: ActImplementation = reactAct;
11
+ /**
12
+ * Runs a callback inside React's act environment, flushing pending state
13
+ * updates and effects, and resolves once the work has settled.
14
+ *
15
+ * @param callback Work to run within the act environment.
16
+ * @returns A promise that resolves with the callback's result after updates flush.
17
+ */
18
+ const act: ActImplementation = withGlobalActEnvironment(actImplementation);
19
+
7
20
  const getGlobalThis = (): typeof globalThis => {
8
- if (typeof globalThis !== "undefined") return globalThis;
21
+ if (typeof globalThis !== "undefined") {
22
+ return globalThis;
23
+ }
24
+
9
25
  throw new Error("unable to locate global object");
10
26
  };
11
27
 
12
- export const getIsReactActEnvironment = (): boolean | undefined => getGlobalThis().IS_REACT_ACT_ENVIRONMENT;
28
+ const getIsReactActEnvironment = (): boolean | undefined => getGlobalThis().IS_REACT_ACT_ENVIRONMENT;
13
29
 
14
- export const setIsReactActEnvironment = (value: boolean | undefined): void => {
30
+ const setIsReactActEnvironment = (value: boolean | undefined): void => {
15
31
  getGlobalThis().IS_REACT_ACT_ENVIRONMENT = value;
16
32
  };
17
33
 
18
- type ActCallback<T> = () => T | PromiseLike<T>;
19
- type ActImplementation = <T>(callback: ActCallback<T>) => PromiseLike<T>;
20
-
21
34
  const isThenable = <T>(value: unknown): value is PromiseLike<T> =>
22
35
  value !== null && typeof value === "object" && typeof (value as PromiseLike<T>).then === "function";
23
36
 
24
- export const runWithActEnvironment = <T>(forced: boolean, fn: () => T | PromiseLike<T>): T | PromiseLike<T> => {
37
+ const restoreAfter = async <T>(result: PromiseLike<T>, previous: boolean | undefined): Promise<T> => {
38
+ try {
39
+ return await result;
40
+ } finally {
41
+ setIsReactActEnvironment(previous);
42
+ }
43
+ };
44
+
45
+ const runWithActEnvironment = <T>(isForced: boolean, fn: () => T | PromiseLike<T>): Promise<T> => {
25
46
  const previousActEnvironment = getIsReactActEnvironment();
26
- setIsReactActEnvironment(forced);
47
+ setIsReactActEnvironment(isForced);
48
+
27
49
  try {
28
- const result = fn();
50
+ const result: T | PromiseLike<T> = fn();
51
+
29
52
  if (isThenable<T>(result)) {
30
- return Promise.resolve(result).then(
31
- (value) => {
32
- setIsReactActEnvironment(previousActEnvironment);
33
- return value;
34
- },
35
- (error) => {
36
- setIsReactActEnvironment(previousActEnvironment);
37
- throw error;
38
- },
39
- );
53
+ return restoreAfter(result, previousActEnvironment);
40
54
  }
55
+
41
56
  setIsReactActEnvironment(previousActEnvironment);
42
- return result;
57
+
58
+ return Promise.resolve(result);
43
59
  } catch (error) {
44
60
  setIsReactActEnvironment(previousActEnvironment);
45
61
  throw error;
46
62
  }
47
63
  };
48
64
 
49
- const withGlobalActEnvironment =
50
- (actImplementation: ActImplementation) =>
51
- <T>(callback: ActCallback<T>): PromiseLike<T> => {
65
+ function withGlobalActEnvironment(actImplementation: ActImplementation): ActImplementation {
66
+ return <T>(callback: ActCallback<T>): PromiseLike<T> => {
52
67
  const settled = runWithActEnvironment(true, () => actImplementation(() => callback()));
68
+
53
69
  return Promise.resolve(settled);
54
70
  };
71
+ }
55
72
 
56
- const actImplementation: ActImplementation = reactAct as ActImplementation;
57
-
58
- /**
59
- * Runs a callback inside React's act environment, flushing pending state
60
- * updates and effects, and resolves once the work has settled.
61
- *
62
- * @param callback Work to run within the act environment.
63
- * @returns A promise that resolves with the callback's result after updates flush.
64
- */
65
- export const act: ActImplementation = withGlobalActEnvironment(actImplementation);
73
+ const runInAct = async (callback: () => unknown): Promise<void> => {
74
+ await act(() => callback());
75
+ };
66
76
 
67
- export const runInAct = (callback: () => unknown): Promise<void> =>
68
- Promise.resolve(act(() => callback())).then(() => undefined);
77
+ export { act, getIsReactActEnvironment, setIsReactActEnvironment, runWithActEnvironment, runInAct };
@@ -8,13 +8,12 @@ import type { BoundCustomQueries, DebugUtilities, QueryMap } from "./types.js";
8
8
  * The set of built-in queries (getBy, findBy, queryBy, and their All variants)
9
9
  * bound to a specific container.
10
10
  */
11
- export type BoundQueries = BoundCustomQueries<typeof builtinQueries>;
12
-
11
+ type BoundQueries = BoundCustomQueries<typeof builtinQueries>;
13
12
  /**
14
13
  * The global screen object's shape: built-in queries scoped to the current
15
14
  * toplevels, plus debug utilities.
16
15
  */
17
- export type Screen = BoundQueries & DebugUtilities;
16
+ type Screen = BoundQueries & DebugUtilities;
18
17
 
19
18
  /**
20
19
  * The result of a render call: queries scoped to the rendered tree, debug
@@ -22,7 +21,7 @@ export type Screen = BoundQueries & DebugUtilities;
22
21
  *
23
22
  * @typeParam Q Custom queries provided at render time, merged with the built-in ones.
24
23
  */
25
- export type RenderResult<Q extends QueryMap = Record<never, never>> = BoundQueries &
24
+ type RenderResult<Q extends QueryMap = Record<never, never>> = BoundQueries &
26
25
  BoundCustomQueries<Q> &
27
26
  DebugUtilities & {
28
27
  /** The top-level widget the element was rendered into. */
@@ -34,3 +33,5 @@ export type RenderResult<Q extends QueryMap = Record<never, never>> = BoundQueri
34
33
  /** Re-renders the tree with a new element, reusing the same root. */
35
34
  rerender: (element: ReactNode) => Promise<void>;
36
35
  };
36
+
37
+ export { type BoundQueries, type Screen, type RenderResult };