@gtkx/testing 1.6.0 → 2.0.0-beta.10

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 (132) hide show
  1. package/README.md +47 -44
  2. package/dist/accessible-native.d.ts +1 -1
  3. package/dist/accessible-native.d.ts.map +1 -1
  4. package/dist/accessible-native.js +29 -8
  5. package/dist/accessible-native.js.map +1 -1
  6. package/dist/build-queries.d.ts +9 -9
  7. package/dist/build-queries.d.ts.map +1 -1
  8. package/dist/build-queries.js +2 -1
  9. package/dist/build-queries.js.map +1 -1
  10. package/dist/config.d.ts.map +1 -1
  11. package/dist/config.js +1 -3
  12. package/dist/config.js.map +1 -1
  13. package/dist/fire-event.d.ts +3 -3
  14. package/dist/fire-event.d.ts.map +1 -1
  15. package/dist/fire-event.js +14 -4
  16. package/dist/fire-event.js.map +1 -1
  17. package/dist/matchers.d.ts +52 -56
  18. package/dist/matchers.d.ts.map +1 -1
  19. package/dist/matchers.js +4 -16
  20. package/dist/matchers.js.map +1 -1
  21. package/dist/queries.d.ts +37 -133
  22. package/dist/queries.d.ts.map +1 -1
  23. package/dist/queries.js +48 -136
  24. package/dist/queries.js.map +1 -1
  25. package/dist/query-helpers.d.ts +2 -2
  26. package/dist/query-helpers.d.ts.map +1 -1
  27. package/dist/query-helpers.js +10 -3
  28. package/dist/query-helpers.js.map +1 -1
  29. package/dist/render.d.ts.map +1 -1
  30. package/dist/render.js +4 -0
  31. package/dist/render.js.map +1 -1
  32. package/dist/role-helpers.d.ts +1 -1
  33. package/dist/role-helpers.d.ts.map +1 -1
  34. package/dist/role-helpers.js +2 -1
  35. package/dist/role-helpers.js.map +1 -1
  36. package/dist/screenshot.d.ts +1 -1
  37. package/dist/screenshot.d.ts.map +1 -1
  38. package/dist/screenshot.js +26 -8
  39. package/dist/screenshot.js.map +1 -1
  40. package/dist/suggestions.d.ts +1 -1
  41. package/dist/suggestions.d.ts.map +1 -1
  42. package/dist/suggestions.js +3 -1
  43. package/dist/suggestions.js.map +1 -1
  44. package/dist/traversal.d.ts +4 -4
  45. package/dist/traversal.d.ts.map +1 -1
  46. package/dist/traversal.js +25 -7
  47. package/dist/traversal.js.map +1 -1
  48. package/dist/types.d.ts +10 -10
  49. package/dist/types.d.ts.map +1 -1
  50. package/dist/types.js.map +1 -1
  51. package/dist/user-event/adjustment.d.ts +2 -14
  52. package/dist/user-event/adjustment.d.ts.map +1 -1
  53. package/dist/user-event/adjustment.js +2 -14
  54. package/dist/user-event/adjustment.js.map +1 -1
  55. package/dist/user-event/click.d.ts +20 -45
  56. package/dist/user-event/click.d.ts.map +1 -1
  57. package/dist/user-event/click.js +31 -50
  58. package/dist/user-event/click.js.map +1 -1
  59. package/dist/user-event/controller.d.ts +5 -5
  60. package/dist/user-event/controller.d.ts.map +1 -1
  61. package/dist/user-event/controller.js +5 -2
  62. package/dist/user-event/controller.js.map +1 -1
  63. package/dist/user-event/gesture.d.ts +9 -43
  64. package/dist/user-event/gesture.d.ts.map +1 -1
  65. package/dist/user-event/gesture.js +9 -43
  66. package/dist/user-event/gesture.js.map +1 -1
  67. package/dist/user-event/index.d.ts +38 -107
  68. package/dist/user-event/index.d.ts.map +1 -1
  69. package/dist/user-event/index.js +29 -30
  70. package/dist/user-event/index.js.map +1 -1
  71. package/dist/user-event/keyboard.d.ts +1 -1
  72. package/dist/user-event/keyboard.d.ts.map +1 -1
  73. package/dist/user-event/keyboard.js +24 -3
  74. package/dist/user-event/keyboard.js.map +1 -1
  75. package/dist/user-event/list-row-click.d.ts +1 -1
  76. package/dist/user-event/list-row-click.d.ts.map +1 -1
  77. package/dist/user-event/list-row-click.js +2 -1
  78. package/dist/user-event/list-row-click.js.map +1 -1
  79. package/dist/user-event/pointer.d.ts.map +1 -1
  80. package/dist/user-event/pointer.js +9 -11
  81. package/dist/user-event/pointer.js.map +1 -1
  82. package/dist/user-event/selection.d.ts +4 -20
  83. package/dist/user-event/selection.d.ts.map +1 -1
  84. package/dist/user-event/selection.js +11 -23
  85. package/dist/user-event/selection.js.map +1 -1
  86. package/dist/user-event/text.d.ts +5 -34
  87. package/dist/user-event/text.d.ts.map +1 -1
  88. package/dist/user-event/text.js +5 -34
  89. package/dist/user-event/text.js.map +1 -1
  90. package/dist/wait-for.d.ts +2 -2
  91. package/dist/wait-for.d.ts.map +1 -1
  92. package/dist/wait-for.js +6 -4
  93. package/dist/wait-for.js.map +1 -1
  94. package/dist/widget-accessible-properties.d.ts +4 -3
  95. package/dist/widget-accessible-properties.d.ts.map +1 -1
  96. package/dist/widget-accessible-properties.js +38 -51
  97. package/dist/widget-accessible-properties.js.map +1 -1
  98. package/dist/widget-getters.d.ts +7 -9
  99. package/dist/widget-getters.d.ts.map +1 -1
  100. package/dist/widget-getters.js.map +1 -1
  101. package/dist/widget-target.d.ts +4 -0
  102. package/dist/widget-target.d.ts.map +1 -0
  103. package/dist/widget-target.js +9 -0
  104. package/dist/widget-target.js.map +1 -0
  105. package/package.json +17 -10
  106. package/src/accessible-native.ts +45 -9
  107. package/src/build-queries.ts +60 -30
  108. package/src/config.ts +1 -3
  109. package/src/fire-event.ts +32 -8
  110. package/src/matchers.ts +63 -85
  111. package/src/queries.ts +94 -156
  112. package/src/query-helpers.ts +17 -9
  113. package/src/render.tsx +7 -2
  114. package/src/role-helpers.ts +3 -1
  115. package/src/screenshot.ts +49 -8
  116. package/src/suggestions.ts +3 -1
  117. package/src/traversal.ts +35 -11
  118. package/src/types.ts +14 -10
  119. package/src/user-event/adjustment.ts +2 -14
  120. package/src/user-event/click.ts +40 -58
  121. package/src/user-event/controller.ts +8 -5
  122. package/src/user-event/gesture.ts +9 -43
  123. package/src/user-event/index.ts +149 -132
  124. package/src/user-event/keyboard.ts +33 -4
  125. package/src/user-event/list-row-click.ts +2 -2
  126. package/src/user-event/pointer.ts +11 -15
  127. package/src/user-event/selection.ts +15 -25
  128. package/src/user-event/text.ts +5 -34
  129. package/src/wait-for.ts +9 -6
  130. package/src/widget-accessible-properties.ts +61 -69
  131. package/src/widget-getters.ts +11 -13
  132. package/src/widget-target.ts +11 -0
@@ -4,15 +4,16 @@ import {
4
4
  readAccessibleBooleanProperty,
5
5
  readAccessibleFlag,
6
6
  readAccessibleInt,
7
+ readAccessibleNumber,
7
8
  readAccessibleRelation,
8
9
  readAccessibleState,
9
- readAccessibleNumber as readNativeNumber,
10
- readAccessibleString as readNativeString,
10
+ readAccessibleString,
11
11
  } from "./accessible-native.js";
12
12
  import { EDITABLE_ROLES, isEditable, readEditableText } from "./editable.js";
13
13
  import { isNameFromAuthor, isNameProhibited } from "./role-naming.js";
14
14
  import { children, descendants, relationCandidates } from "./traversal.js";
15
15
  import { callBooleanGetter, callStringGetter, getCallableMethod } from "./widget-getters.js";
16
+ import { requireWidget } from "./widget-target.js";
16
17
 
17
18
  type WidgetValueField = "now" | "min" | "max";
18
19
  type CheckedState = "checked" | "unchecked" | "mixed";
@@ -45,12 +46,6 @@ const VALUE_PROPERTIES: Record<WidgetValueField, Gtk.AccessibleProperty> = {
45
46
  max: Gtk.AccessibleProperty.VALUE_MAX,
46
47
  };
47
48
 
48
- const readAccessibleString = (widget: Gtk.Widget, property: Gtk.AccessibleProperty): string | null =>
49
- readNativeString(widget, property);
50
-
51
- const readAccessibleNumber = (widget: Gtk.Widget, property: Gtk.AccessibleProperty): number | null =>
52
- readNativeNumber(widget, property);
53
-
54
49
  const readAccessibleWidgets = (widget: Gtk.Widget, relation: Gtk.AccessibleRelation): Gtk.Widget[] | null => {
55
50
  const targets = readAccessibleRelation(widget, relation, relationCandidates(widget));
56
51
  const widgets = targets.filter((target): target is Gtk.Widget => target instanceof Gtk.Widget);
@@ -70,12 +65,12 @@ const getLabelText = (widget: Gtk.Widget): string | null => {
70
65
  };
71
66
 
72
67
  const stripMnemonic = (text: string): string => text.replaceAll(/_(.)/g, "$1");
73
- const isUnderlineUsed = (widget: Gtk.Widget): boolean => callBooleanGetter(widget, "getUseUnderline") ?? false;
68
+ const isUnderlineUsed = (widget: object): boolean => callBooleanGetter(widget, "getUseUnderline") ?? false;
74
69
 
75
- const readNamingText = (widget: Gtk.Widget, getter: string, value: string): string =>
70
+ const readNamingText = (widget: object, getter: string, value: string): string =>
76
71
  getter !== EDITABLE_TEXT_GETTER && isUnderlineUsed(widget) ? stripMnemonic(value) : value;
77
72
 
78
- const readFirstText = (widget: Gtk.Widget, getters: string[]): string | null => {
73
+ const readFirstText = (widget: object, getters: string[]): string | null => {
79
74
  for (const getter of getters) {
80
75
  const value = callStringGetter(widget, getter);
81
76
 
@@ -93,7 +88,7 @@ const readFirstText = (widget: Gtk.Widget, getters: string[]): string | null =>
93
88
  *
94
89
  * @param widget The widget to read text from.
95
90
  */
96
- const getWidgetText = (widget: Gtk.Widget): string | null => readFirstText(widget, DEFAULT_TEXT_GETTERS);
91
+ const getWidgetText = (widget: Gtk.Accessible): string | null => readFirstText(widget, DEFAULT_TEXT_GETTERS);
97
92
 
98
93
  const namingLabelText = (widget: Gtk.Widget): string | null => {
99
94
  const text = getLabelText(widget);
@@ -215,9 +210,7 @@ const getWidgetAccessibleName = (widget: Gtk.Widget): string | null => {
215
210
  return nameFromContent(widget) ?? callStringGetter(widget, "getTooltipText");
216
211
  };
217
212
 
218
- const getWidgetName = (widget: Gtk.Widget): string | null => {
219
- return widget.getName();
220
- };
213
+ const getWidgetName = (widget: Gtk.Widget): string | null => widget.getName();
221
214
 
222
215
  const nonEmptyText = (text: string | null): string | null => (text === null || text === "" ? null : text);
223
216
 
@@ -318,8 +311,6 @@ const readBoundedSelection = (widget: Gtk.Widget): string | null => {
318
311
  const getWidgetSelection = (widget: Gtk.Widget): string | null =>
319
312
  widget instanceof Gtk.TextView ? readTextViewSelection(widget) : readBoundedSelection(widget);
320
313
 
321
- const checkedFromActive = (isActive: boolean): CheckedState => (isActive ? "checked" : "unchecked");
322
-
323
314
  const isRadioToggle = (widget: Gtk.Widget): widget is Gtk.ToggleButton =>
324
315
  widget instanceof Gtk.ToggleButton && widget.getAccessibleRole() === Gtk.AccessibleRole.RADIO;
325
316
 
@@ -331,7 +322,11 @@ const getWidgetCheckedState = (widget: Gtk.Widget): CheckedState | null => {
331
322
  return state;
332
323
  }
333
324
 
334
- return isRadioToggle(widget) ? checkedFromActive(widget.getActive()) : null;
325
+ if (!isRadioToggle(widget)) {
326
+ return null;
327
+ }
328
+
329
+ return widget.getActive() ? "checked" : "unchecked";
335
330
  };
336
331
 
337
332
  const isWidgetChecked = (widget: Gtk.Widget): boolean | null => {
@@ -368,26 +363,20 @@ const getWidgetSelectedState = (widget: Gtk.Widget): boolean | null => {
368
363
  return null;
369
364
  };
370
365
 
371
- const getWidgetLevel = (widget: Gtk.Widget): number | null => {
372
- return readAccessibleInt(widget, Gtk.AccessibleProperty.LEVEL);
373
- };
374
-
375
- const getWidgetInvalidState = (widget: Gtk.Widget): Gtk.AccessibleInvalidState | null => {
376
- const value = readAccessibleState(widget, Gtk.AccessibleState.INVALID);
366
+ const getWidgetLevel = (widget: Gtk.Widget): number | null =>
367
+ readAccessibleInt(widget, Gtk.AccessibleProperty.LEVEL);
377
368
 
378
- return value ?? null;
379
- };
369
+ const getWidgetInvalidState = (widget: Gtk.Widget): Gtk.AccessibleInvalidState | null =>
370
+ readAccessibleState(widget, Gtk.AccessibleState.INVALID);
380
371
 
381
372
  const getWidgetErrorMessage = (widget: Gtk.Widget): Gtk.Widget[] | null =>
382
373
  readAccessibleWidgets(widget, Gtk.AccessibleRelation.ERROR_MESSAGE);
383
374
 
384
- const getWidgetBusyState = (widget: Gtk.Widget): boolean | null => {
385
- return readAccessibleBoolean(widget, Gtk.AccessibleState.BUSY);
386
- };
375
+ const getWidgetBusyState = (widget: Gtk.Widget): boolean | null =>
376
+ readAccessibleBoolean(widget, Gtk.AccessibleState.BUSY);
387
377
 
388
- const getWidgetDescription = (widget: Gtk.Widget): string | null => {
389
- return readAccessibleString(widget, Gtk.AccessibleProperty.DESCRIPTION);
390
- };
378
+ const getWidgetDescription = (widget: Gtk.Widget): string | null =>
379
+ readAccessibleString(widget, Gtk.AccessibleProperty.DESCRIPTION);
391
380
 
392
381
  const getWidgetValueNow = (widget: Gtk.Widget): number | null =>
393
382
  readAccessibleNumber(widget, Gtk.AccessibleProperty.VALUE_NOW);
@@ -398,23 +387,13 @@ const getWidgetValueText = (widget: Gtk.Widget): string | null =>
398
387
  const isWidgetValueMatch = (widget: Gtk.Widget, field: WidgetValueField, expected: number): boolean =>
399
388
  isAccessibleNumberMatch(widget, VALUE_PROPERTIES[field], expected);
400
389
 
401
- const getWidgetOwnLabel = (widget: Gtk.Widget): string | null => {
402
- return readAccessibleString(widget, Gtk.AccessibleProperty.LABEL);
403
- };
390
+ const getWidgetOwnLabel = (widget: Gtk.Widget): string | null =>
391
+ readAccessibleString(widget, Gtk.AccessibleProperty.LABEL);
404
392
 
405
- const collectAccessibleNames = (targets: Gtk.Widget[]): string[] => {
406
- const texts: string[] = [];
407
-
408
- for (const target of targets) {
409
- const text = getWidgetAccessibleName(target);
410
-
411
- if (text) {
412
- texts.push(text);
413
- }
414
- }
415
-
416
- return texts;
417
- };
393
+ const collectAccessibleNames = (targets: Gtk.Widget[]): string[] =>
394
+ targets
395
+ .map((target) => getWidgetAccessibleName(target))
396
+ .filter((text): text is string => text !== null && text !== "");
418
397
 
419
398
  const isSelfLabelling = (widget: Gtk.Widget, targets: Gtk.Widget[]): boolean => {
420
399
  const own = new Set(descendants(widget));
@@ -422,22 +401,22 @@ const isSelfLabelling = (widget: Gtk.Widget, targets: Gtk.Widget[]): boolean =>
422
401
  return targets.every((target) => own.has(target));
423
402
  };
424
403
 
425
- const getWidgetLabelledByText = (widget: Gtk.Widget): string | null => {
426
- const targets = readAccessibleWidgets(widget, Gtk.AccessibleRelation.LABELLED_BY);
427
-
428
- if (targets === null) {
429
- return null;
430
- }
431
-
404
+ const labelledByText = (targets: Gtk.Widget[]): string | null => {
432
405
  const texts = collectAccessibleNames(targets);
433
406
 
434
407
  return texts.length > 0 ? texts.join(" ") : null;
435
408
  };
436
409
 
410
+ const getWidgetLabelledByText = (widget: Gtk.Widget): string | null => {
411
+ const targets = readAccessibleWidgets(widget, Gtk.AccessibleRelation.LABELLED_BY);
412
+
413
+ return targets === null ? null : labelledByText(targets);
414
+ };
415
+
437
416
  const getWidgetExternalLabelText = (widget: Gtk.Widget): string | null => {
438
417
  const targets = readAccessibleWidgets(widget, Gtk.AccessibleRelation.LABELLED_BY);
439
418
 
440
- return targets === null || isSelfLabelling(widget, targets) ? null : getWidgetLabelledByText(widget);
419
+ return targets === null || isSelfLabelling(widget, targets) ? null : labelledByText(targets);
441
420
  };
442
421
 
443
422
  const isTooltipUsedAsName = (widget: Gtk.Widget): boolean =>
@@ -462,27 +441,40 @@ const getWidgetDescribedByText = (widget: Gtk.Widget): string | null => {
462
441
  return isTooltipUsedAsName(widget) ? null : callStringGetter(widget, "getTooltipText");
463
442
  };
464
443
 
444
+ const isHiddenWithin = (widget: Gtk.Widget, hiddenWidgets: Map<Gtk.Widget, boolean>): boolean => {
445
+ const cached = hiddenWidgets.get(widget);
446
+
447
+ if (cached !== undefined) {
448
+ return cached;
449
+ }
450
+
451
+ const parent = widget.getParent();
452
+
453
+ const isHidden =
454
+ readAccessibleBoolean(widget, Gtk.AccessibleState.HIDDEN) === true ||
455
+ (parent !== null && isHiddenWithin(parent, hiddenWidgets));
456
+
457
+ hiddenWidgets.set(widget, isHidden);
458
+
459
+ return isHidden;
460
+ };
461
+
462
+ const buildInaccessibilityCheck = (): ((target: Gtk.Accessible) => boolean) => {
463
+ const hiddenWidgets: Map<Gtk.Widget, boolean> = new Map();
464
+
465
+ return (target) => isHiddenWithin(requireWidget(target), hiddenWidgets);
466
+ };
467
+
465
468
  /**
466
469
  * Returns whether a widget is excluded from the accessibility tree, because it or one of its
467
470
  * ancestors is marked hidden.
468
471
  *
469
472
  * @param widget The widget to test.
470
473
  */
471
- const isInaccessible = (widget: Gtk.Widget): boolean => {
472
- let current: Gtk.Widget | null = widget;
473
-
474
- while (current) {
475
- if (readAccessibleBoolean(current, Gtk.AccessibleState.HIDDEN) === true) {
476
- return true;
477
- }
478
-
479
- current = current.getParent();
480
- }
481
-
482
- return false;
483
- };
474
+ const isInaccessible = (target: Gtk.Accessible): boolean => buildInaccessibilityCheck()(target);
484
475
 
485
476
  export {
477
+ buildInaccessibilityCheck,
486
478
  namingLabelText,
487
479
  getWidgetText,
488
480
  getWidgetTextContent,
@@ -1,28 +1,26 @@
1
- import type * as GObject from "@gtkx/gi/gobject";
2
- import type * as Gtk from "@gtkx/gi/gtk";
3
1
  import { getClassType, getInstanceType, TYPE_INVALID, typeName } from "@gtkx/runtime";
4
2
  import { resolveWrapperClass } from "@gtkx/runtime/internal";
5
3
  import { type AnyClass, walkClassChain } from "@gtkx/utils";
6
4
 
7
5
  const UNNAMED_TYPE_TAG = "Object";
8
6
 
9
- const getWidgetMethod = (widget: Gtk.Widget, name: string): unknown => Reflect.get(widget, name);
10
- const getWidgetTypeName = (widget: Gtk.Widget): string | null => typeName(getInstanceType(widget));
7
+ const getWidgetMethod = (widget: object, name: string): unknown => Reflect.get(widget, name);
8
+ const getWidgetTypeName = (widget: object): string | null => typeName(getInstanceType(widget));
11
9
  const isClass = (value: unknown): value is AnyClass => typeof value === "function";
12
10
 
13
11
  const nonEmpty = (value: unknown): string | undefined =>
14
12
  typeof value === "string" && value.length > 0 ? value : undefined;
15
13
 
16
- const getObjectClass = (object: GObject.Object): AnyClass | null => {
14
+ const getObjectClass = (object: object): AnyClass | null => {
17
15
  const cls: unknown = object.constructor;
18
16
 
19
17
  return isClass(cls) ? cls : null;
20
18
  };
21
19
 
22
- const getNearestClassName = (object: GObject.Object): string | undefined =>
20
+ const getNearestClassName = (object: object): string | undefined =>
23
21
  walkClassChain(getObjectClass(object), (ancestor) => nonEmpty(ancestor.name));
24
22
 
25
- const getUntypedClassName = (object: GObject.Object): string | undefined => {
23
+ const getUntypedClassName = (object: object): string | undefined => {
26
24
  const cls = getObjectClass(object);
27
25
 
28
26
  return cls !== null && getClassType(cls) === TYPE_INVALID ? nonEmpty(cls.name) : undefined;
@@ -34,7 +32,7 @@ const getExactWrapperName = (type: bigint): string | undefined => {
34
32
  return wrapper !== null && getClassType(wrapper) === type ? nonEmpty(wrapper.name) : undefined;
35
33
  };
36
34
 
37
- const getTypeTag = (object: GObject.Object): string => {
35
+ const getTypeTag = (object: object): string => {
38
36
  const type = getInstanceType(object);
39
37
 
40
38
  return (
@@ -46,15 +44,15 @@ const getTypeTag = (object: GObject.Object): string => {
46
44
  );
47
45
  };
48
46
 
49
- const isDefaultWidgetName = (widget: Gtk.Widget, name: string): boolean =>
47
+ const isDefaultWidgetName = (widget: object, name: string): boolean =>
50
48
  name.length === 0 || name === getWidgetTypeName(widget);
51
49
 
52
- const hasWidgetMethod = (widget: Gtk.Widget, name: string): boolean =>
50
+ const hasWidgetMethod = (widget: object, name: string): boolean =>
53
51
  typeof getWidgetMethod(widget, name) === "function";
54
52
 
55
53
  /* eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- callers name the signature */
56
54
  const getCallableMethod = <Args extends unknown[], Result>(
57
- widget: Gtk.Widget,
55
+ widget: object,
58
56
  name: string,
59
57
  ): ((...args: Args) => Result) | null => {
60
58
  const fn = getWidgetMethod(widget, name);
@@ -62,13 +60,13 @@ const getCallableMethod = <Args extends unknown[], Result>(
62
60
  return typeof fn === "function" ? (fn as (...args: Args) => Result).bind(widget) : null;
63
61
  };
64
62
 
65
- const callBooleanGetter = (widget: Gtk.Widget, method: string): boolean | null => {
63
+ const callBooleanGetter = (widget: object, method: string): boolean | null => {
66
64
  const value = getCallableMethod<[], unknown>(widget, method)?.();
67
65
 
68
66
  return typeof value === "boolean" ? value : null;
69
67
  };
70
68
 
71
- const callStringGetter = (widget: Gtk.Widget, method: string): string | null => {
69
+ const callStringGetter = (widget: object, method: string): string | null => {
72
70
  const value = getCallableMethod<[], unknown>(widget, method)?.();
73
71
 
74
72
  return typeof value === "string" ? value : null;
@@ -0,0 +1,11 @@
1
+ import * as Gtk from "@gtkx/gi/gtk";
2
+
3
+ const requireWidget = (target: object): Gtk.Widget => {
4
+ if (!(target instanceof Gtk.Widget)) {
5
+ throw new TypeError("Expected a Gtk.Widget");
6
+ }
7
+
8
+ return target;
9
+ };
10
+
11
+ export { requireWidget };