@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
@@ -42,60 +42,65 @@ const setEditableText = (widget, text) => {
42
42
  }
43
43
  widget.setText(text);
44
44
  };
45
+ const applyTextViewSelection = (widget, start, end) => {
46
+ const buffer = widget.getBuffer();
47
+ buffer.selectRange(buffer.getIterAtOffset(start), buffer.getIterAtOffset(end));
48
+ if (end !== start) {
49
+ deleteSelection(widget);
50
+ }
51
+ };
52
+ const applyEditableSelection = (widget, start, end) => {
53
+ widget.selectRegion(start, end);
54
+ if (end !== start) {
55
+ widget.deleteSelection();
56
+ }
57
+ widget.setPosition(start);
58
+ };
45
59
  const applyInitialSelection = (widget, options) => {
46
- if (options.initialSelectionStart === undefined)
60
+ if (options.initialSelectionStart === undefined) {
47
61
  return;
62
+ }
48
63
  const start = options.initialSelectionStart;
49
64
  const end = options.initialSelectionEnd ?? start;
50
65
  if (widget instanceof Gtk.TextView) {
51
- const buffer = widget.getBuffer();
52
- buffer.selectRange(buffer.getIterAtOffset(start), buffer.getIterAtOffset(end));
53
- if (end !== start)
54
- deleteSelection(widget);
66
+ applyTextViewSelection(widget, start, end);
55
67
  return;
56
68
  }
57
- widget.selectRegion(start, end);
58
- if (end !== start)
59
- widget.deleteSelection();
60
- widget.setPosition(start);
69
+ applyEditableSelection(widget, start, end);
61
70
  };
62
71
  const writeClipboardText = (widget, text) => {
63
- const value = GObject.buildValue(GObject.TYPE_STRING, (v) => v.setString(text));
72
+ const value = GObject.buildValue(GObject.TYPE_STRING, (v) => {
73
+ v.setString(text);
74
+ });
64
75
  widget.getClipboard().set(value);
65
76
  };
66
- export const resetClipboard = () => {
77
+ const resetClipboard = () => {
67
78
  Gdk.Display.getDefault()?.getClipboard().setContent(null);
68
79
  };
69
- export const type = (widget, text, options) => wrapEvent(widget, () => {
80
+ const runEditableEvent = (widget, failure, action) => wrapEvent(widget, () => {
70
81
  if (!isEditable(widget)) {
71
- throw new Error(`Cannot type into element: ${EDITABLE_REQUIRED}`);
82
+ throw new Error(`${failure}: ${EDITABLE_REQUIRED}`);
72
83
  }
84
+ action(widget);
85
+ });
86
+ const type = (widget, text, options) => runEditableEvent(widget, "Cannot type into element", (editable) => {
73
87
  if (!options?.skipClick) {
74
- widget.grabFocus();
88
+ editable.grabFocus();
75
89
  }
76
- applyInitialSelection(widget, options ?? {});
77
- insertEditableText(widget, text);
90
+ applyInitialSelection(editable, options ?? {});
91
+ insertEditableText(editable, text);
78
92
  });
79
- export const clear = (widget) => wrapEvent(widget, () => {
80
- if (!isEditable(widget)) {
81
- throw new Error(`Cannot clear element: ${EDITABLE_REQUIRED}`);
82
- }
83
- setEditableText(widget, "");
93
+ const clear = (widget) => runEditableEvent(widget, "Cannot clear element", (editable) => {
94
+ setEditableText(editable, "");
84
95
  });
85
- export const copy = (widget) => wrapEvent(widget, () => {
86
- if (!isEditable(widget)) {
87
- throw new Error(`Cannot copy: ${EDITABLE_REQUIRED}`);
88
- }
89
- writeClipboardText(widget, readSelection(widget));
96
+ const copy = (widget) => runEditableEvent(widget, "Cannot copy", (editable) => {
97
+ writeClipboardText(editable, readSelection(editable));
90
98
  });
91
- export const cut = (widget) => wrapEvent(widget, () => {
92
- if (!isEditable(widget)) {
93
- throw new Error(`Cannot cut: ${EDITABLE_REQUIRED}`);
94
- }
95
- writeClipboardText(widget, readSelection(widget));
96
- deleteSelection(widget);
99
+ const cut = (widget) => runEditableEvent(widget, "Cannot cut", (editable) => {
100
+ writeClipboardText(editable, readSelection(editable));
101
+ deleteSelection(editable);
97
102
  });
98
- export const paste = async (widget, text) => {
103
+ const paste = async (widget, text) => {
99
104
  if (!isEditable(widget)) {
100
105
  throw new Error(`Cannot paste: ${EDITABLE_REQUIRED}`);
101
106
  }
@@ -104,4 +109,5 @@ export const paste = async (widget, text) => {
104
109
  insertEditableText(widget, content);
105
110
  });
106
111
  };
112
+ export { resetClipboard, type, clear, copy, cut, paste };
107
113
  //# sourceMappingURL=text.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/user-event/text.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Gdk from \"@gtkx/gi/gdk\";\nimport * as GObject from \"@gtkx/gi/gobject\";\nimport * as Gtk from \"@gtkx/gi/gtk\";\nimport { EDITABLE_ROLES, type EditableTarget, getEditableDelegate, isEditable } from \"../editable.js\";\nimport { formatRoleList } from \"../role-helpers.js\";\nimport { wrapEvent } from \"./event-wrapper.js\";\n\n/** Options for {@link type}. */\nexport type TypeOptions = {\n /** Do not focus the widget before typing. */\n skipClick?: boolean | undefined;\n /** Select from this offset before typing, replacing the selected range with the typed text. */\n initialSelectionStart?: number | undefined;\n /** End offset of the initial selection (defaults to the start offset). */\n initialSelectionEnd?: number | undefined;\n};\n\nconst EDITABLE_REQUIRED = `expected editable widget (${formatRoleList(EDITABLE_ROLES)})`;\n\nconst insertEditableText = (widget: EditableTarget, text: string): void => {\n if (widget instanceof Gtk.TextView) {\n widget.emit(\"insert-at-cursor\", text);\n return;\n }\n const target = getEditableDelegate(widget) ?? widget;\n if (target instanceof Gtk.Text) {\n target.emit(\"insert-at-cursor\", text);\n return;\n }\n\n const position = widget.getPosition();\n const newPosition = widget.insertText(text, text.length, position);\n widget.setPosition(newPosition);\n};\n\nconst readSelection = (widget: EditableTarget): string => {\n if (widget instanceof Gtk.TextView) {\n const buffer = widget.getBuffer();\n const [hasSelection, start, end] = buffer.getSelectionBounds();\n return hasSelection ? buffer.getText(start, end, true) : \"\";\n }\n const [hasSelection, start, end] = widget.getSelectionBounds();\n return hasSelection ? widget.getChars(start, end) : \"\";\n};\n\nconst deleteSelection = (widget: EditableTarget): void => {\n if (widget instanceof Gtk.TextView) {\n widget.getBuffer().deleteSelection(false, true);\n return;\n }\n widget.deleteSelection();\n};\n\nconst setEditableText = (widget: EditableTarget, text: string): void => {\n if (widget instanceof Gtk.TextView) {\n widget.getBuffer().setText(text, text.length);\n return;\n }\n widget.setText(text);\n};\n\nconst applyInitialSelection = (widget: EditableTarget, options: TypeOptions): void => {\n if (options.initialSelectionStart === undefined) return;\n const start = options.initialSelectionStart;\n const end = options.initialSelectionEnd ?? start;\n if (widget instanceof Gtk.TextView) {\n const buffer = widget.getBuffer();\n buffer.selectRange(buffer.getIterAtOffset(start), buffer.getIterAtOffset(end));\n if (end !== start) deleteSelection(widget);\n return;\n }\n widget.selectRegion(start, end);\n if (end !== start) widget.deleteSelection();\n widget.setPosition(start);\n};\n\nconst writeClipboardText = (widget: Gtk.Widget, text: string): void => {\n const value = GObject.buildValue(GObject.TYPE_STRING, (v) => v.setString(text));\n widget.getClipboard().set(value);\n};\n\nexport const resetClipboard = (): void => {\n Gdk.Display.getDefault()?.getClipboard().setContent(null);\n};\n\nexport const type = (widget: Gtk.Widget, text: string, options?: TypeOptions): Promise<void> =>\n wrapEvent(widget, () => {\n if (!isEditable(widget)) {\n throw new Error(`Cannot type into element: ${EDITABLE_REQUIRED}`);\n }\n\n if (!options?.skipClick) {\n widget.grabFocus();\n }\n\n applyInitialSelection(widget, options ?? {});\n insertEditableText(widget, text);\n });\n\nexport const clear = (widget: Gtk.Widget): Promise<void> =>\n wrapEvent(widget, () => {\n if (!isEditable(widget)) {\n throw new Error(`Cannot clear element: ${EDITABLE_REQUIRED}`);\n }\n\n setEditableText(widget, \"\");\n });\n\nexport const copy = (widget: Gtk.Widget): Promise<void> =>\n wrapEvent(widget, () => {\n if (!isEditable(widget)) {\n throw new Error(`Cannot copy: ${EDITABLE_REQUIRED}`);\n }\n\n writeClipboardText(widget, readSelection(widget));\n });\n\nexport const cut = (widget: Gtk.Widget): Promise<void> =>\n wrapEvent(widget, () => {\n if (!isEditable(widget)) {\n throw new Error(`Cannot cut: ${EDITABLE_REQUIRED}`);\n }\n\n writeClipboardText(widget, readSelection(widget));\n deleteSelection(widget);\n });\n\nexport const paste = async (widget: Gtk.Widget, text?: string): Promise<void> => {\n if (!isEditable(widget)) {\n throw new Error(`Cannot paste: ${EDITABLE_REQUIRED}`);\n }\n\n const content = text ?? (await widget.getClipboard().readTextAsync(null)) ?? \"\";\n await wrapEvent(widget, () => {\n insertEditableText(widget, content);\n });\n};\n"]}
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/user-event/text.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Gdk from \"@gtkx/gi/gdk\";\nimport * as GObject from \"@gtkx/gi/gobject\";\nimport * as Gtk from \"@gtkx/gi/gtk\";\nimport { EDITABLE_ROLES, type EditableTarget, getEditableDelegate, isEditable } from \"../editable.js\";\nimport { formatRoleList } from \"../role-helpers.js\";\nimport { wrapEvent } from \"./event-wrapper.js\";\n\n/** Options for {@link type}. */\ntype TypeOptions = {\n /** Do not focus the widget before typing. */\n skipClick?: boolean | undefined;\n /** Select from this offset before typing, replacing the selected range with the typed text. */\n initialSelectionStart?: number | undefined;\n /** End offset of the initial selection (defaults to the start offset). */\n initialSelectionEnd?: number | undefined;\n};\n\nconst EDITABLE_REQUIRED = `expected editable widget (${formatRoleList(EDITABLE_ROLES)})`;\n\nconst insertEditableText = (widget: EditableTarget, text: string): void => {\n if (widget instanceof Gtk.TextView) {\n widget.emit(\"insert-at-cursor\", text);\n\n return;\n }\n\n const target = getEditableDelegate(widget) ?? widget;\n\n if (target instanceof Gtk.Text) {\n target.emit(\"insert-at-cursor\", text);\n\n return;\n }\n\n const position = widget.getPosition();\n const newPosition = widget.insertText(text, text.length, position);\n widget.setPosition(newPosition);\n};\n\nconst readSelection = (widget: EditableTarget): string => {\n if (widget instanceof Gtk.TextView) {\n const buffer = widget.getBuffer();\n const [hasSelection, start, end] = buffer.getSelectionBounds();\n\n return hasSelection ? buffer.getText(start, end, true) : \"\";\n }\n\n const [hasSelection, start, end] = widget.getSelectionBounds();\n\n return hasSelection ? widget.getChars(start, end) : \"\";\n};\n\nconst deleteSelection = (widget: EditableTarget): void => {\n if (widget instanceof Gtk.TextView) {\n widget.getBuffer().deleteSelection(false, true);\n\n return;\n }\n\n widget.deleteSelection();\n};\n\nconst setEditableText = (widget: EditableTarget, text: string): void => {\n if (widget instanceof Gtk.TextView) {\n widget.getBuffer().setText(text, text.length);\n\n return;\n }\n\n widget.setText(text);\n};\n\nconst applyTextViewSelection = (widget: Gtk.TextView, start: number, end: number): void => {\n const buffer = widget.getBuffer();\n buffer.selectRange(buffer.getIterAtOffset(start), buffer.getIterAtOffset(end));\n\n if (end !== start) {\n deleteSelection(widget);\n }\n};\n\nconst applyEditableSelection = (widget: Gtk.Editable, start: number, end: number): void => {\n widget.selectRegion(start, end);\n\n if (end !== start) {\n widget.deleteSelection();\n }\n\n widget.setPosition(start);\n};\n\nconst applyInitialSelection = (widget: EditableTarget, options: TypeOptions): void => {\n if (options.initialSelectionStart === undefined) {\n return;\n }\n\n const start = options.initialSelectionStart;\n const end = options.initialSelectionEnd ?? start;\n\n if (widget instanceof Gtk.TextView) {\n applyTextViewSelection(widget, start, end);\n\n return;\n }\n\n applyEditableSelection(widget, start, end);\n};\n\nconst writeClipboardText = (widget: Gtk.Widget, text: string): void => {\n const value = GObject.buildValue(GObject.TYPE_STRING, (v) => {\n v.setString(text);\n });\n\n widget.getClipboard().set(value);\n};\n\nconst resetClipboard = (): void => {\n Gdk.Display.getDefault()?.getClipboard().setContent(null);\n};\n\nconst runEditableEvent = (\n widget: Gtk.Widget,\n failure: string,\n action: (editable: EditableTarget) => void,\n): Promise<void> =>\n wrapEvent(widget, () => {\n if (!isEditable(widget)) {\n throw new Error(`${failure}: ${EDITABLE_REQUIRED}`);\n }\n\n action(widget);\n });\n\nconst type = (widget: Gtk.Widget, text: string, options?: TypeOptions): Promise<void> =>\n runEditableEvent(widget, \"Cannot type into element\", (editable) => {\n if (!options?.skipClick) {\n editable.grabFocus();\n }\n\n applyInitialSelection(editable, options ?? {});\n insertEditableText(editable, text);\n });\n\nconst clear = (widget: Gtk.Widget): Promise<void> =>\n runEditableEvent(widget, \"Cannot clear element\", (editable) => {\n setEditableText(editable, \"\");\n });\n\nconst copy = (widget: Gtk.Widget): Promise<void> =>\n runEditableEvent(widget, \"Cannot copy\", (editable) => {\n writeClipboardText(editable, readSelection(editable));\n });\n\nconst cut = (widget: Gtk.Widget): Promise<void> =>\n runEditableEvent(widget, \"Cannot cut\", (editable) => {\n writeClipboardText(editable, readSelection(editable));\n deleteSelection(editable);\n });\n\nconst paste = async (widget: Gtk.Widget, text?: string): Promise<void> => {\n if (!isEditable(widget)) {\n throw new Error(`Cannot paste: ${EDITABLE_REQUIRED}`);\n }\n\n const content = text ?? (await widget.getClipboard().readTextAsync(null)) ?? \"\";\n\n await wrapEvent(widget, () => {\n insertEditableText(widget, content);\n });\n};\n\nexport { resetClipboard, type, clear, copy, cut, paste, type TypeOptions };\n"]}
@@ -1,5 +1,7 @@
1
1
  import type * as Gtk from "@gtkx/gi/gtk";
2
2
  import type { WaitForOptions } from "./types.js";
3
+ type RemovalTarget = Gtk.Widget | Gtk.Widget[] | null;
4
+ type ElementOrCallback = Gtk.Widget | Gtk.Widget[] | (() => RemovalTarget);
3
5
  /**
4
6
  * Repeatedly invokes a callback until it succeeds without throwing or the
5
7
  * timeout elapses, retrying on each rejection at a fixed interval.
@@ -8,9 +10,7 @@ import type { WaitForOptions } from "./types.js";
8
10
  * @param options Optional timeout, interval, and timeout error customization.
9
11
  * @returns The callback's result once it succeeds.
10
12
  */
11
- export declare const waitFor: <T>(callback: () => T | Promise<T>, options?: WaitForOptions) => Promise<T>;
12
- type RemovalTarget = Gtk.Widget | Gtk.Widget[] | null;
13
- type ElementOrCallback = Gtk.Widget | Gtk.Widget[] | (() => RemovalTarget);
13
+ declare const waitFor: <T>(callback: () => T | Promise<T>, options?: WaitForOptions) => Promise<T>;
14
14
  /**
15
15
  * Waits until the given widget or widgets are detached from the tree. Rejects
16
16
  * immediately if the target is already absent when called.
@@ -19,6 +19,6 @@ type ElementOrCallback = Gtk.Widget | Gtk.Widget[] | (() => RemovalTarget);
19
19
  * returning them to observe for removal.
20
20
  * @param options Optional timeout and interval settings.
21
21
  */
22
- export declare const waitForElementToBeRemoved: (elementOrCallback: ElementOrCallback, options?: WaitForOptions) => Promise<void>;
23
- export {};
22
+ declare const waitForElementToBeRemoved: (elementOrCallback: ElementOrCallback, options?: WaitForOptions) => Promise<void>;
23
+ export { waitFor, waitForElementToBeRemoved };
24
24
  //# sourceMappingURL=wait-for.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"wait-for.d.ts","sourceRoot":"","sources":["../src/wait-for.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,cAAc,CAAC;AAIzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAYjD;;;;;;;GAOG;AACH,eAAO,MAAM,OAAO,GAAI,CAAC,YAAY,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,YAAY,cAAc,KAAG,OAAO,CAAC,CAAC,CA+B9F,CAAC;AAEF,KAAK,aAAa,GAAG,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;AAEtD,KAAK,iBAAiB,GAAG,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,aAAa,CAAC,CAAC;AA4B3E;;;;;;;GAOG;AACH,eAAO,MAAM,yBAAyB,sBACf,iBAAiB,YAC1B,cAAc,KACzB,OAAO,CAAC,IAAI,CAed,CAAC"}
1
+ {"version":3,"file":"wait-for.d.ts","sourceRoot":"","sources":["../src/wait-for.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAMjD,KAAK,aAAa,GAAG,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;AACtD,KAAK,iBAAiB,GAAG,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,aAAa,CAAC,CAAC;AA6D3E;;;;;;;GAOG;AACH,QAAA,MAAM,OAAO,GAAI,CAAC,EAAE,UAAU,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,UAAU,cAAc,KAAG,OAAO,CAAC,CAAC,CAoBvF,CAAC;AAyBF;;;;;;;GAOG;AACH,QAAA,MAAM,yBAAyB,GAC3B,mBAAmB,iBAAiB,EACpC,UAAU,cAAc,KACzB,OAAO,CAAC,IAAI,CAmBd,CAAC;AAEF,OAAO,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC"}
package/dist/wait-for.js CHANGED
@@ -2,11 +2,41 @@ import { runWithActEnvironment } from "./act.js";
2
2
  import { getConfig } from "./config.js";
3
3
  import { timeoutError } from "./errors.js";
4
4
  const DEFAULT_INTERVAL = 50;
5
+ const ELEMENT_NOT_REMOVED = new Error("Element not yet removed");
5
6
  const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
6
7
  const copyStackTrace = (target, source) => {
7
- if (source.stack) {
8
- target.stack = source.stack.replace(source.message, target.message);
8
+ const { stack } = source;
9
+ if (stack === undefined) {
10
+ return;
11
+ }
12
+ const index = stack.indexOf(source.message);
13
+ if (index === -1) {
14
+ target.stack = stack;
15
+ return;
16
+ }
17
+ target.stack = stack.slice(0, index) + target.message + stack.slice(index + source.message.length);
18
+ };
19
+ const pollUntilSuccess = async (callback, timeout, interval) => {
20
+ const startTime = Date.now();
21
+ let lastError = null;
22
+ while (Date.now() - startTime < timeout) {
23
+ try {
24
+ const result = await callback();
25
+ await delay(0);
26
+ return { status: "resolved", value: result };
27
+ }
28
+ catch (error) {
29
+ lastError = error;
30
+ await delay(interval);
31
+ }
9
32
  }
33
+ return { status: "timedout", lastError };
34
+ };
35
+ const buildTimeoutError = (timeout, lastError, stackTraceError, onTimeout) => {
36
+ const error = timeoutError(timeout, lastError);
37
+ const finalError = onTimeout ? onTimeout(error) : error;
38
+ copyStackTrace(finalError, stackTraceError);
39
+ return finalError;
10
40
  };
11
41
  /**
12
42
  * Repeatedly invokes a callback until it succeeds without throwing or the
@@ -16,7 +46,7 @@ const copyStackTrace = (target, source) => {
16
46
  * @param options Optional timeout, interval, and timeout error customization.
17
47
  * @returns The callback's result once it succeeds.
18
48
  */
19
- export const waitFor = (callback, options) => {
49
+ const waitFor = (callback, options) => {
20
50
  if (typeof callback !== "function") {
21
51
  throw new TypeError("Received `callback` arg must be a function");
22
52
  }
@@ -24,34 +54,18 @@ export const waitFor = (callback, options) => {
24
54
  return Promise.resolve(runWithActEnvironment(false, async () => {
25
55
  const config = getConfig();
26
56
  const { timeout = config.asyncUtilTimeout, interval = DEFAULT_INTERVAL, onTimeout } = options ?? {};
27
- const startTime = Date.now();
28
- let lastError = null;
29
- while (Date.now() - startTime < timeout) {
30
- try {
31
- const result = await callback();
32
- await delay(0);
33
- return result;
34
- }
35
- catch (error) {
36
- lastError = error;
37
- await delay(interval);
38
- }
57
+ const result = await pollUntilSuccess(callback, timeout, interval);
58
+ if (result.status === "resolved") {
59
+ return result.value;
39
60
  }
40
- const error = timeoutError(timeout, lastError);
41
- const finalError = onTimeout ? onTimeout(error) : error;
42
- copyStackTrace(finalError, stackTraceError);
43
- throw finalError;
61
+ throw buildTimeoutError(timeout, result.lastError, stackTraceError, onTimeout);
44
62
  }));
45
63
  };
46
- const getTarget = (elementOrCallback) => {
47
- if (typeof elementOrCallback === "function") {
48
- return elementOrCallback();
49
- }
50
- return elementOrCallback;
51
- };
64
+ const getTarget = (elementOrCallback) => typeof elementOrCallback === "function" ? elementOrCallback() : elementOrCallback;
52
65
  const isWidgetRemoved = (widget) => {
53
- if (widget === null)
66
+ if (widget === null) {
54
67
  return true;
68
+ }
55
69
  try {
56
70
  return widget.getRoot() === null;
57
71
  }
@@ -61,11 +75,10 @@ const isWidgetRemoved = (widget) => {
61
75
  };
62
76
  const isTargetRemoved = (target) => {
63
77
  if (Array.isArray(target)) {
64
- return target.length === 0 || target.every(isWidgetRemoved);
78
+ return target.every((widget) => isWidgetRemoved(widget));
65
79
  }
66
80
  return isWidgetRemoved(target);
67
81
  };
68
- const ELEMENT_NOT_REMOVED = new Error("Element not yet removed");
69
82
  /**
70
83
  * Waits until the given widget or widgets are detached from the tree. Rejects
71
84
  * immediately if the target is already absent when called.
@@ -74,14 +87,16 @@ const ELEMENT_NOT_REMOVED = new Error("Element not yet removed");
74
87
  * returning them to observe for removal.
75
88
  * @param options Optional timeout and interval settings.
76
89
  */
77
- export const waitForElementToBeRemoved = (elementOrCallback, options) => {
90
+ const waitForElementToBeRemoved = (elementOrCallback, options) => {
78
91
  const stackTraceError = new Error("STACK_TRACE_MESSAGE");
79
92
  if (isTargetRemoved(getTarget(elementOrCallback))) {
80
93
  return Promise.reject(new Error("Element already removed: waitForElementToBeRemoved requires the element to be present initially"));
81
94
  }
82
95
  return waitFor(() => {
83
- if (!isTargetRemoved(getTarget(elementOrCallback)))
96
+ if (!isTargetRemoved(getTarget(elementOrCallback))) {
84
97
  throw ELEMENT_NOT_REMOVED;
98
+ }
85
99
  }, { ...options, stackTraceError });
86
100
  };
101
+ export { waitFor, waitForElementToBeRemoved };
87
102
  //# sourceMappingURL=wait-for.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"wait-for.js","sourceRoot":"","sources":["../src/wait-for.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as Gtk from \"@gtkx/gi/gtk\";\nimport { runWithActEnvironment } from \"./act.js\";\nimport { getConfig } from \"./config.js\";\nimport { timeoutError } from \"./errors.js\";\nimport type { WaitForOptions } from \"./types.js\";\n\nconst DEFAULT_INTERVAL = 50;\n\nconst delay = (ms: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, ms));\n\nconst copyStackTrace = (target: Error, source: Error): void => {\n if (source.stack) {\n target.stack = source.stack.replace(source.message, target.message);\n }\n};\n\n/**\n * Repeatedly invokes a callback until it succeeds without throwing or the\n * timeout elapses, retrying on each rejection at a fixed interval.\n *\n * @param callback The assertion or query to retry; its resolved value is returned.\n * @param options Optional timeout, interval, and timeout error customization.\n * @returns The callback's result once it succeeds.\n */\nexport const waitFor = <T>(callback: () => T | Promise<T>, options?: WaitForOptions): Promise<T> => {\n if (typeof callback !== \"function\") {\n throw new TypeError(\"Received `callback` arg must be a function\");\n }\n\n const stackTraceError = options?.stackTraceError ?? new Error(\"STACK_TRACE_MESSAGE\");\n\n return Promise.resolve(\n runWithActEnvironment(false, async () => {\n const config = getConfig();\n const { timeout = config.asyncUtilTimeout, interval = DEFAULT_INTERVAL, onTimeout } = options ?? {};\n const startTime = Date.now();\n let lastError: Error | null = null;\n\n while (Date.now() - startTime < timeout) {\n try {\n const result = await callback();\n await delay(0);\n return result;\n } catch (error) {\n lastError = error as Error;\n await delay(interval);\n }\n }\n\n const error = timeoutError(timeout, lastError);\n const finalError = onTimeout ? onTimeout(error) : error;\n copyStackTrace(finalError, stackTraceError);\n throw finalError;\n }),\n );\n};\n\ntype RemovalTarget = Gtk.Widget | Gtk.Widget[] | null;\n\ntype ElementOrCallback = Gtk.Widget | Gtk.Widget[] | (() => RemovalTarget);\n\nconst getTarget = (elementOrCallback: ElementOrCallback): RemovalTarget => {\n if (typeof elementOrCallback === \"function\") {\n return elementOrCallback();\n }\n return elementOrCallback;\n};\n\nconst isWidgetRemoved = (widget: Gtk.Widget | null): boolean => {\n if (widget === null) return true;\n\n try {\n return widget.getRoot() === null;\n } catch {\n return true;\n }\n};\n\nconst isTargetRemoved = (target: RemovalTarget): boolean => {\n if (Array.isArray(target)) {\n return target.length === 0 || target.every(isWidgetRemoved);\n }\n return isWidgetRemoved(target);\n};\n\nconst ELEMENT_NOT_REMOVED = new Error(\"Element not yet removed\");\n\n/**\n * Waits until the given widget or widgets are detached from the tree. Rejects\n * immediately if the target is already absent when called.\n *\n * @param elementOrCallback The widget, array of widgets, or a function\n * returning them to observe for removal.\n * @param options Optional timeout and interval settings.\n */\nexport const waitForElementToBeRemoved = (\n elementOrCallback: ElementOrCallback,\n options?: WaitForOptions,\n): Promise<void> => {\n const stackTraceError = new Error(\"STACK_TRACE_MESSAGE\");\n if (isTargetRemoved(getTarget(elementOrCallback))) {\n return Promise.reject(\n new Error(\n \"Element already removed: waitForElementToBeRemoved requires the element to be present initially\",\n ),\n );\n }\n return waitFor(\n () => {\n if (!isTargetRemoved(getTarget(elementOrCallback))) throw ELEMENT_NOT_REMOVED;\n },\n { ...options, stackTraceError },\n );\n};\n"]}
1
+ {"version":3,"file":"wait-for.js","sourceRoot":"","sources":["../src/wait-for.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as Gtk from \"@gtkx/gi/gtk\";\nimport type { WaitForOptions } from \"./types.js\";\nimport { runWithActEnvironment } from \"./act.js\";\nimport { getConfig } from \"./config.js\";\nimport { timeoutError } from \"./errors.js\";\n\ntype PollResult<T> = { status: \"resolved\"; value: T } | { status: \"timedout\"; lastError: Error | null };\ntype RemovalTarget = Gtk.Widget | Gtk.Widget[] | null;\ntype ElementOrCallback = Gtk.Widget | Gtk.Widget[] | (() => RemovalTarget);\n\nconst DEFAULT_INTERVAL = 50;\nconst ELEMENT_NOT_REMOVED = new Error(\"Element not yet removed\");\n\nconst delay = (ms: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, ms));\n\nconst copyStackTrace = (target: Error, source: Error): void => {\n const { stack } = source;\n\n if (stack === undefined) {\n return;\n }\n\n const index = stack.indexOf(source.message);\n\n if (index === -1) {\n target.stack = stack;\n\n return;\n }\n\n target.stack = stack.slice(0, index) + target.message + stack.slice(index + source.message.length);\n};\n\nconst pollUntilSuccess = async <T>(\n callback: () => T | Promise<T>,\n timeout: number,\n interval: number,\n): Promise<PollResult<T>> => {\n const startTime = Date.now();\n let lastError: Error | null = null;\n\n while (Date.now() - startTime < timeout) {\n try {\n const result = await callback();\n await delay(0);\n\n return { status: \"resolved\", value: result };\n } catch (error) {\n lastError = error as Error;\n await delay(interval);\n }\n }\n\n return { status: \"timedout\", lastError };\n};\n\nconst buildTimeoutError = (\n timeout: number,\n lastError: Error | null,\n stackTraceError: Error,\n onTimeout: ((error: Error) => Error) | undefined,\n): Error => {\n const error = timeoutError(timeout, lastError);\n const finalError = onTimeout ? onTimeout(error) : error;\n copyStackTrace(finalError, stackTraceError);\n\n return finalError;\n};\n\n/**\n * Repeatedly invokes a callback until it succeeds without throwing or the\n * timeout elapses, retrying on each rejection at a fixed interval.\n *\n * @param callback The assertion or query to retry; its resolved value is returned.\n * @param options Optional timeout, interval, and timeout error customization.\n * @returns The callback's result once it succeeds.\n */\nconst waitFor = <T>(callback: () => T | Promise<T>, options?: WaitForOptions): Promise<T> => {\n if (typeof callback !== \"function\") {\n throw new TypeError(\"Received `callback` arg must be a function\");\n }\n\n const stackTraceError = options?.stackTraceError ?? new Error(\"STACK_TRACE_MESSAGE\");\n\n return Promise.resolve(\n runWithActEnvironment(false, async () => {\n const config = getConfig();\n const { timeout = config.asyncUtilTimeout, interval = DEFAULT_INTERVAL, onTimeout } = options ?? {};\n const result = await pollUntilSuccess(callback, timeout, interval);\n\n if (result.status === \"resolved\") {\n return result.value;\n }\n\n throw buildTimeoutError(timeout, result.lastError, stackTraceError, onTimeout);\n }),\n );\n};\n\nconst getTarget = (elementOrCallback: ElementOrCallback): RemovalTarget =>\n typeof elementOrCallback === \"function\" ? elementOrCallback() : elementOrCallback;\n\nconst isWidgetRemoved = (widget: Gtk.Widget | null): boolean => {\n if (widget === null) {\n return true;\n }\n\n try {\n return widget.getRoot() === null;\n } catch {\n return true;\n }\n};\n\nconst isTargetRemoved = (target: RemovalTarget): boolean => {\n if (Array.isArray(target)) {\n return target.every((widget) => isWidgetRemoved(widget));\n }\n\n return isWidgetRemoved(target);\n};\n\n/**\n * Waits until the given widget or widgets are detached from the tree. Rejects\n * immediately if the target is already absent when called.\n *\n * @param elementOrCallback The widget, array of widgets, or a function\n * returning them to observe for removal.\n * @param options Optional timeout and interval settings.\n */\nconst waitForElementToBeRemoved = (\n elementOrCallback: ElementOrCallback,\n options?: WaitForOptions,\n): Promise<void> => {\n const stackTraceError = new Error(\"STACK_TRACE_MESSAGE\");\n\n if (isTargetRemoved(getTarget(elementOrCallback))) {\n return Promise.reject(\n new Error(\n \"Element already removed: waitForElementToBeRemoved requires the element to be present initially\",\n ),\n );\n }\n\n return waitFor(\n () => {\n if (!isTargetRemoved(getTarget(elementOrCallback))) {\n throw ELEMENT_NOT_REMOVED;\n }\n },\n { ...options, stackTraceError },\n );\n};\n\nexport { waitFor, waitForElementToBeRemoved };\n"]}
@@ -1,33 +1,34 @@
1
1
  import * as Gtk from "@gtkx/gi/gtk";
2
+ type WidgetValue = {
3
+ now: number | null;
4
+ min: number | null;
5
+ max: number | null;
6
+ text: string | null;
7
+ };
2
8
  /**
3
9
  * Returns a widget's own text by trying its label, text, and title getters in
4
10
  * order, or null when none produce a value.
5
11
  *
6
12
  * @param widget The widget to read text from.
7
13
  */
8
- export declare const getWidgetNodeText: (widget: Gtk.Widget) => string | null;
9
- export declare const getWidgetLabelText: (widget: Gtk.Widget) => string | null;
10
- export declare const getWidgetAccessibleName: (widget: Gtk.Widget) => string | null;
11
- export declare const getWidgetName: (widget: Gtk.Widget) => string | null;
12
- export declare const getWidgetPlaceholderText: (widget: Gtk.Widget) => string | null;
13
- export declare const getWidgetDisplayValue: (widget: Gtk.Widget) => string | null;
14
- export declare const getWidgetCheckedState: (widget: Gtk.Widget) => boolean | null;
15
- export declare const getWidgetPressedState: (widget: Gtk.Widget) => boolean | null;
16
- export declare const getWidgetExpandedState: (widget: Gtk.Widget) => boolean | null;
17
- export declare const getWidgetSelectedState: (widget: Gtk.Widget) => boolean | null;
18
- export declare const getWidgetLevel: (widget: Gtk.Widget) => number | null;
19
- export declare const getWidgetInvalidState: (widget: Gtk.Widget) => Gtk.AccessibleInvalidState | null;
20
- export declare const getWidgetErrorMessage: (widget: Gtk.Widget) => Gtk.Widget[] | null;
21
- export declare const getWidgetBusyState: (widget: Gtk.Widget) => boolean | null;
22
- export declare const getWidgetDescription: (widget: Gtk.Widget) => string | null;
23
- export type WidgetValue = {
24
- now: number | null;
25
- min: number | null;
26
- max: number | null;
27
- text: string | null;
28
- };
29
- export declare const getWidgetValue: (widget: Gtk.Widget) => WidgetValue;
30
- export declare const getWidgetOwnLabel: (widget: Gtk.Widget) => string | null;
31
- export declare const getWidgetLabelledByText: (widget: Gtk.Widget) => string | null;
32
- export declare const isInaccessible: (widget: Gtk.Widget) => boolean;
14
+ declare const getWidgetNodeText: (widget: Gtk.Widget) => string | null;
15
+ declare const getWidgetLabelText: (widget: Gtk.Widget) => string | null;
16
+ declare const getWidgetAccessibleName: (widget: Gtk.Widget) => string | null;
17
+ declare const getWidgetName: (widget: Gtk.Widget) => string | null;
18
+ declare const getWidgetPlaceholderText: (widget: Gtk.Widget) => string | null;
19
+ declare const getWidgetDisplayValue: (widget: Gtk.Widget) => string | null;
20
+ declare const getWidgetCheckedState: (widget: Gtk.Widget) => boolean | null;
21
+ declare const getWidgetPressedState: (widget: Gtk.Widget) => boolean | null;
22
+ declare const getWidgetExpandedState: (widget: Gtk.Widget) => boolean | null;
23
+ declare const getWidgetSelectedState: (widget: Gtk.Widget) => boolean | null;
24
+ declare const getWidgetLevel: (widget: Gtk.Widget) => number | null;
25
+ declare const getWidgetInvalidState: (widget: Gtk.Widget) => Gtk.AccessibleInvalidState | null;
26
+ declare const getWidgetErrorMessage: (widget: Gtk.Widget) => Gtk.Widget[] | null;
27
+ declare const getWidgetBusyState: (widget: Gtk.Widget) => boolean | null;
28
+ declare const getWidgetDescription: (widget: Gtk.Widget) => string | null;
29
+ declare const getWidgetValue: (widget: Gtk.Widget) => WidgetValue;
30
+ declare const getWidgetOwnLabel: (widget: Gtk.Widget) => string | null;
31
+ declare const getWidgetLabelledByText: (widget: Gtk.Widget) => string | null;
32
+ declare const isInaccessible: (widget: Gtk.Widget) => boolean;
33
+ export { getWidgetNodeText, getWidgetLabelText, getWidgetAccessibleName, getWidgetName, getWidgetPlaceholderText, getWidgetDisplayValue, getWidgetCheckedState, getWidgetPressedState, getWidgetExpandedState, getWidgetSelectedState, getWidgetLevel, getWidgetInvalidState, getWidgetErrorMessage, getWidgetBusyState, getWidgetDescription, getWidgetValue, getWidgetOwnLabel, getWidgetLabelledByText, isInaccessible, type WidgetValue, };
33
34
  //# sourceMappingURL=widget-accessible-properties.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"widget-accessible-properties.d.ts","sourceRoot":"","sources":["../src/widget-accessible-properties.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AAmCpC;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,WAAY,GAAG,CAAC,MAAM,KAAG,MAAM,GAAG,IAM/D,CAAC;AAwBF,eAAO,MAAM,kBAAkB,WAAY,GAAG,CAAC,MAAM,KAAG,MAAM,GAAG,IAGhE,CAAC;AAEF,eAAO,MAAM,uBAAuB,WAAY,GAAG,CAAC,MAAM,KAAG,MAAM,GAAG,IAsBrE,CAAC;AAEF,eAAO,MAAM,aAAa,WAAY,GAAG,CAAC,MAAM,KAAG,MAAM,GAAG,IAE3D,CAAC;AAEF,eAAO,MAAM,wBAAwB,WAAY,GAAG,CAAC,MAAM,KAAG,MAAM,GAAG,IAMtE,CAAC;AAEF,eAAO,MAAM,qBAAqB,WAAY,GAAG,CAAC,MAAM,KAAG,MAAM,GAAG,IAMnE,CAAC;AAEF,eAAO,MAAM,qBAAqB,WAAY,GAAG,CAAC,MAAM,KAAG,OAAO,GAAG,IAOpE,CAAC;AAEF,eAAO,MAAM,qBAAqB,WAAY,GAAG,CAAC,MAAM,KAAG,OAAO,GAAG,IAGpE,CAAC;AAEF,eAAO,MAAM,sBAAsB,WAAY,GAAG,CAAC,MAAM,KAAG,OAAO,GAAG,IAUrE,CAAC;AAEF,eAAO,MAAM,sBAAsB,WAAY,GAAG,CAAC,MAAM,KAAG,OAAO,GAAG,IAUrE,CAAC;AAEF,eAAO,MAAM,cAAc,WAAY,GAAG,CAAC,MAAM,KAAG,MAAM,GAAG,IAE5D,CAAC;AAEF,eAAO,MAAM,qBAAqB,WAAY,GAAG,CAAC,MAAM,KAAG,GAAG,CAAC,sBAAsB,GAAG,IAEvF,CAAC;AAEF,eAAO,MAAM,qBAAqB,WAAY,GAAG,CAAC,MAAM,KAAG,GAAG,CAAC,MAAM,EAAE,GAAG,IAGzE,CAAC;AAEF,eAAO,MAAM,kBAAkB,WAAY,GAAG,CAAC,MAAM,KAAG,OAAO,GAAG,IAEjE,CAAC;AAEF,eAAO,MAAM,oBAAoB,WAAY,GAAG,CAAC,MAAM,KAAG,MAAM,GAAG,IAElE,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACtB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB,CAAC;AAsBF,eAAO,MAAM,cAAc,WAAY,GAAG,CAAC,MAAM,KAAG,WAUnD,CAAC;AAEF,eAAO,MAAM,iBAAiB,WAAY,GAAG,CAAC,MAAM,KAAG,MAAM,GAAG,IAE/D,CAAC;AAEF,eAAO,MAAM,uBAAuB,WAAY,GAAG,CAAC,MAAM,KAAG,MAAM,GAAG,IAWrE,CAAC;AAEF,eAAO,MAAM,cAAc,WAAY,GAAG,CAAC,MAAM,KAAG,OAQnD,CAAC"}
1
+ {"version":3,"file":"widget-accessible-properties.d.ts","sourceRoot":"","sources":["../src/widget-accessible-properties.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AAKpC,KAAK,WAAW,GAAG;IACf,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB,CAAC;AA4DF;;;;;GAKG;AACH,QAAA,MAAM,iBAAiB,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,MAAM,GAAG,IAUxD,CAAC;AAqCF,QAAA,MAAM,kBAAkB,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,MAAM,GAAG,IAMzD,CAAC;AAYF,QAAA,MAAM,uBAAuB,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,MAAM,GAAG,IA0B9D,CAAC;AAEF,QAAA,MAAM,aAAa,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,MAAM,GAAG,IAEpD,CAAC;AAEF,QAAA,MAAM,wBAAwB,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,MAAM,GAAG,IAM/D,CAAC;AAEF,QAAA,MAAM,qBAAqB,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,MAAM,GAAG,IAM5D,CAAC;AAEF,QAAA,MAAM,qBAAqB,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,OAAO,GAAG,IAc7D,CAAC;AAEF,QAAA,MAAM,qBAAqB,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,OAAO,GAAG,IAM7D,CAAC;AAEF,QAAA,MAAM,sBAAsB,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,OAAO,GAAG,IAU9D,CAAC;AAEF,QAAA,MAAM,sBAAsB,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,OAAO,GAAG,IAU9D,CAAC;AAEF,QAAA,MAAM,cAAc,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,MAAM,GAAG,IAErD,CAAC;AAEF,QAAA,MAAM,qBAAqB,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,GAAG,CAAC,sBAAsB,GAAG,IAIhF,CAAC;AAEF,QAAA,MAAM,qBAAqB,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,GAAG,CAAC,MAAM,EAAE,GAAG,IACR,CAAC;AAE5D,QAAA,MAAM,kBAAkB,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,OAAO,GAAG,IAE1D,CAAC;AAEF,QAAA,MAAM,oBAAoB,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,MAAM,GAAG,IAE3D,CAAC;AA8CF,QAAA,MAAM,cAAc,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,WAc5C,CAAC;AAEF,QAAA,MAAM,iBAAiB,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,MAAM,GAAG,IAExD,CAAC;AAgBF,QAAA,MAAM,uBAAuB,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,MAAM,GAAG,IAU9D,CAAC;AAEF,QAAA,MAAM,cAAc,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,OAgB5C,CAAC;AAEF,OAAO,EACH,iBAAiB,EACjB,kBAAkB,EAClB,uBAAuB,EACvB,aAAa,EACb,wBAAwB,EACxB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,sBAAsB,EACtB,cAAc,EACd,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,EAClB,oBAAoB,EACpB,cAAc,EACd,iBAAiB,EACjB,uBAAuB,EACvB,cAAc,EACd,KAAK,WAAW,GACnB,CAAC"}