@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.
- package/README.md +47 -44
- package/dist/accessible-native.d.ts +1 -1
- package/dist/accessible-native.d.ts.map +1 -1
- package/dist/accessible-native.js +29 -8
- package/dist/accessible-native.js.map +1 -1
- package/dist/build-queries.d.ts +9 -9
- package/dist/build-queries.d.ts.map +1 -1
- package/dist/build-queries.js +2 -1
- package/dist/build-queries.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -3
- package/dist/config.js.map +1 -1
- package/dist/fire-event.d.ts +3 -3
- package/dist/fire-event.d.ts.map +1 -1
- package/dist/fire-event.js +14 -4
- package/dist/fire-event.js.map +1 -1
- package/dist/matchers.d.ts +52 -56
- package/dist/matchers.d.ts.map +1 -1
- package/dist/matchers.js +4 -16
- package/dist/matchers.js.map +1 -1
- package/dist/queries.d.ts +37 -133
- package/dist/queries.d.ts.map +1 -1
- package/dist/queries.js +48 -136
- package/dist/queries.js.map +1 -1
- package/dist/query-helpers.d.ts +2 -2
- package/dist/query-helpers.d.ts.map +1 -1
- package/dist/query-helpers.js +10 -3
- package/dist/query-helpers.js.map +1 -1
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +4 -0
- package/dist/render.js.map +1 -1
- package/dist/role-helpers.d.ts +1 -1
- package/dist/role-helpers.d.ts.map +1 -1
- package/dist/role-helpers.js +2 -1
- package/dist/role-helpers.js.map +1 -1
- package/dist/screenshot.d.ts +1 -1
- package/dist/screenshot.d.ts.map +1 -1
- package/dist/screenshot.js +26 -8
- package/dist/screenshot.js.map +1 -1
- package/dist/suggestions.d.ts +1 -1
- package/dist/suggestions.d.ts.map +1 -1
- package/dist/suggestions.js +3 -1
- package/dist/suggestions.js.map +1 -1
- package/dist/traversal.d.ts +4 -4
- package/dist/traversal.d.ts.map +1 -1
- package/dist/traversal.js +25 -7
- package/dist/traversal.js.map +1 -1
- package/dist/types.d.ts +10 -10
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/user-event/adjustment.d.ts +2 -14
- package/dist/user-event/adjustment.d.ts.map +1 -1
- package/dist/user-event/adjustment.js +2 -14
- package/dist/user-event/adjustment.js.map +1 -1
- package/dist/user-event/click.d.ts +20 -45
- package/dist/user-event/click.d.ts.map +1 -1
- package/dist/user-event/click.js +31 -50
- package/dist/user-event/click.js.map +1 -1
- package/dist/user-event/controller.d.ts +5 -5
- package/dist/user-event/controller.d.ts.map +1 -1
- package/dist/user-event/controller.js +5 -2
- package/dist/user-event/controller.js.map +1 -1
- package/dist/user-event/gesture.d.ts +9 -43
- package/dist/user-event/gesture.d.ts.map +1 -1
- package/dist/user-event/gesture.js +9 -43
- package/dist/user-event/gesture.js.map +1 -1
- package/dist/user-event/index.d.ts +38 -107
- package/dist/user-event/index.d.ts.map +1 -1
- package/dist/user-event/index.js +29 -30
- package/dist/user-event/index.js.map +1 -1
- package/dist/user-event/keyboard.d.ts +1 -1
- package/dist/user-event/keyboard.d.ts.map +1 -1
- package/dist/user-event/keyboard.js +24 -3
- package/dist/user-event/keyboard.js.map +1 -1
- package/dist/user-event/list-row-click.d.ts +1 -1
- package/dist/user-event/list-row-click.d.ts.map +1 -1
- package/dist/user-event/list-row-click.js +2 -1
- package/dist/user-event/list-row-click.js.map +1 -1
- package/dist/user-event/pointer.d.ts.map +1 -1
- package/dist/user-event/pointer.js +9 -11
- package/dist/user-event/pointer.js.map +1 -1
- package/dist/user-event/selection.d.ts +4 -20
- package/dist/user-event/selection.d.ts.map +1 -1
- package/dist/user-event/selection.js +11 -23
- package/dist/user-event/selection.js.map +1 -1
- package/dist/user-event/text.d.ts +5 -34
- package/dist/user-event/text.d.ts.map +1 -1
- package/dist/user-event/text.js +5 -34
- package/dist/user-event/text.js.map +1 -1
- package/dist/wait-for.d.ts +2 -2
- package/dist/wait-for.d.ts.map +1 -1
- package/dist/wait-for.js +6 -4
- package/dist/wait-for.js.map +1 -1
- package/dist/widget-accessible-properties.d.ts +4 -3
- package/dist/widget-accessible-properties.d.ts.map +1 -1
- package/dist/widget-accessible-properties.js +38 -51
- package/dist/widget-accessible-properties.js.map +1 -1
- package/dist/widget-getters.d.ts +7 -9
- package/dist/widget-getters.d.ts.map +1 -1
- package/dist/widget-getters.js.map +1 -1
- package/dist/widget-target.d.ts +4 -0
- package/dist/widget-target.d.ts.map +1 -0
- package/dist/widget-target.js +9 -0
- package/dist/widget-target.js.map +1 -0
- package/package.json +17 -10
- package/src/accessible-native.ts +45 -9
- package/src/build-queries.ts +60 -30
- package/src/config.ts +1 -3
- package/src/fire-event.ts +32 -8
- package/src/matchers.ts +63 -85
- package/src/queries.ts +94 -156
- package/src/query-helpers.ts +17 -9
- package/src/render.tsx +7 -2
- package/src/role-helpers.ts +3 -1
- package/src/screenshot.ts +49 -8
- package/src/suggestions.ts +3 -1
- package/src/traversal.ts +35 -11
- package/src/types.ts +14 -10
- package/src/user-event/adjustment.ts +2 -14
- package/src/user-event/click.ts +40 -58
- package/src/user-event/controller.ts +8 -5
- package/src/user-event/gesture.ts +9 -43
- package/src/user-event/index.ts +149 -132
- package/src/user-event/keyboard.ts +33 -4
- package/src/user-event/list-row-click.ts +2 -2
- package/src/user-event/pointer.ts +11 -15
- package/src/user-event/selection.ts +15 -25
- package/src/user-event/text.ts +5 -34
- package/src/wait-for.ts +9 -6
- package/src/widget-accessible-properties.ts +61 -69
- package/src/widget-getters.ts +11 -13
- 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
|
-
|
|
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:
|
|
68
|
+
const isUnderlineUsed = (widget: object): boolean => callBooleanGetter(widget, "getUseUnderline") ?? false;
|
|
74
69
|
|
|
75
|
-
const readNamingText = (widget:
|
|
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:
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
407
|
-
|
|
408
|
-
|
|
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
|
|
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 :
|
|
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 = (
|
|
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,
|
package/src/widget-getters.ts
CHANGED
|
@@ -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:
|
|
10
|
-
const getWidgetTypeName = (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:
|
|
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:
|
|
20
|
+
const getNearestClassName = (object: object): string | undefined =>
|
|
23
21
|
walkClassChain(getObjectClass(object), (ancestor) => nonEmpty(ancestor.name));
|
|
24
22
|
|
|
25
|
-
const getUntypedClassName = (object:
|
|
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:
|
|
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:
|
|
47
|
+
const isDefaultWidgetName = (widget: object, name: string): boolean =>
|
|
50
48
|
name.length === 0 || name === getWidgetTypeName(widget);
|
|
51
49
|
|
|
52
|
-
const hasWidgetMethod = (widget:
|
|
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:
|
|
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:
|
|
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:
|
|
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;
|