@gtkx/testing 1.0.0-rc.4 → 1.0.0
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 +5 -5
- package/dist/accessible-native.d.ts +16 -0
- package/dist/accessible-native.d.ts.map +1 -0
- package/dist/accessible-native.js +206 -0
- package/dist/accessible-native.js.map +1 -0
- package/dist/build-queries.d.ts +27 -10
- package/dist/build-queries.d.ts.map +1 -1
- package/dist/build-queries.js +22 -24
- package/dist/build-queries.js.map +1 -1
- package/dist/cleanup-registry.d.ts +1 -1
- package/dist/cleanup-registry.d.ts.map +1 -1
- package/dist/cleanup-registry.js.map +1 -1
- package/dist/errors.d.ts +10 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +10 -1
- package/dist/errors.js.map +1 -1
- package/dist/fire-event.d.ts +35 -6
- package/dist/fire-event.d.ts.map +1 -1
- package/dist/fire-event.js +23 -7
- package/dist/fire-event.js.map +1 -1
- package/dist/frame-sync.d.ts +2 -1
- package/dist/frame-sync.d.ts.map +1 -1
- package/dist/frame-sync.js +15 -5
- package/dist/frame-sync.js.map +1 -1
- package/dist/harness-window.d.ts +4 -0
- package/dist/harness-window.d.ts.map +1 -0
- package/dist/harness-window.js +6 -0
- package/dist/harness-window.js.map +1 -0
- package/dist/index.d.ts +14 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -5
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +4 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +4 -0
- package/dist/internal.js.map +1 -0
- package/dist/matchers.d.ts +88 -46
- package/dist/matchers.d.ts.map +1 -1
- package/dist/matchers.js +156 -18
- package/dist/matchers.js.map +1 -1
- package/dist/pretty-format.d.ts +2 -0
- package/dist/pretty-format.d.ts.map +1 -0
- package/dist/pretty-format.js +2 -0
- package/dist/pretty-format.js.map +1 -0
- package/dist/pretty-widget.d.ts +5 -2
- package/dist/pretty-widget.d.ts.map +1 -1
- package/dist/pretty-widget.js +73 -56
- package/dist/pretty-widget.js.map +1 -1
- package/dist/production.d.ts +8 -0
- package/dist/production.d.ts.map +1 -0
- package/dist/production.js +34 -0
- package/dist/production.js.map +1 -0
- package/dist/queries.d.ts +98 -56
- package/dist/queries.d.ts.map +1 -1
- package/dist/queries.js +123 -83
- package/dist/queries.js.map +1 -1
- package/dist/query-helpers.d.ts +44 -0
- package/dist/query-helpers.d.ts.map +1 -0
- package/dist/query-helpers.js +57 -0
- package/dist/query-helpers.js.map +1 -0
- package/dist/render-children.d.ts +9 -0
- package/dist/render-children.d.ts.map +1 -0
- package/dist/render-children.js +11 -0
- package/dist/render-children.js.map +1 -0
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +11 -9
- package/dist/render.js.map +1 -1
- package/dist/role-helpers.d.ts +12 -3
- package/dist/role-helpers.d.ts.map +1 -1
- package/dist/role-helpers.js +13 -4
- package/dist/role-helpers.js.map +1 -1
- package/dist/role-naming.d.ts +5 -0
- package/dist/role-naming.d.ts.map +1 -0
- package/dist/role-naming.js +96 -0
- package/dist/role-naming.js.map +1 -0
- package/dist/screenshot.d.ts +12 -20
- package/dist/screenshot.d.ts.map +1 -1
- package/dist/screenshot.js +183 -91
- package/dist/screenshot.js.map +1 -1
- package/dist/traversal.d.ts +4 -1
- package/dist/traversal.d.ts.map +1 -1
- package/dist/traversal.js +25 -6
- package/dist/traversal.js.map +1 -1
- package/dist/types.d.ts +26 -14
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/user-event/adjustment.d.ts +3 -0
- package/dist/user-event/adjustment.d.ts.map +1 -1
- package/dist/user-event/adjustment.js +23 -2
- package/dist/user-event/adjustment.js.map +1 -1
- package/dist/user-event/click.d.ts +43 -8
- package/dist/user-event/click.d.ts.map +1 -1
- package/dist/user-event/click.js +175 -44
- package/dist/user-event/click.js.map +1 -1
- package/dist/user-event/column-header-click.d.ts +4 -0
- package/dist/user-event/column-header-click.d.ts.map +1 -0
- package/dist/user-event/column-header-click.js +65 -0
- package/dist/user-event/column-header-click.js.map +1 -0
- package/dist/user-event/event-wrapper.d.ts.map +1 -1
- package/dist/user-event/event-wrapper.js +2 -1
- package/dist/user-event/event-wrapper.js.map +1 -1
- package/dist/user-event/index.d.ts +51 -10
- package/dist/user-event/index.d.ts.map +1 -1
- package/dist/user-event/index.js +43 -26
- package/dist/user-event/index.js.map +1 -1
- package/dist/user-event/indexed-children.d.ts +10 -0
- package/dist/user-event/indexed-children.d.ts.map +1 -0
- package/dist/user-event/indexed-children.js +50 -0
- package/dist/user-event/indexed-children.js.map +1 -0
- package/dist/user-event/keyboard.d.ts.map +1 -1
- package/dist/user-event/keyboard.js +33 -4
- package/dist/user-event/keyboard.js.map +1 -1
- package/dist/user-event/list-row-click.d.ts +4 -0
- package/dist/user-event/list-row-click.d.ts.map +1 -0
- package/dist/user-event/list-row-click.js +39 -0
- package/dist/user-event/list-row-click.js.map +1 -0
- package/dist/user-event/native-click.d.ts +6 -0
- package/dist/user-event/native-click.d.ts.map +1 -0
- package/dist/user-event/native-click.js +32 -0
- package/dist/user-event/native-click.js.map +1 -0
- package/dist/user-event/pointer.d.ts +1 -1
- package/dist/user-event/pointer.d.ts.map +1 -1
- package/dist/user-event/pointer.js +33 -9
- package/dist/user-event/pointer.js.map +1 -1
- package/dist/user-event/selection.d.ts +11 -8
- package/dist/user-event/selection.d.ts.map +1 -1
- package/dist/user-event/selection.js +49 -38
- package/dist/user-event/selection.js.map +1 -1
- package/dist/user-event/text.d.ts +6 -2
- package/dist/user-event/text.d.ts.map +1 -1
- package/dist/user-event/text.js +68 -18
- package/dist/user-event/text.js.map +1 -1
- package/dist/widget-accessible-properties.d.ts +14 -26
- package/dist/widget-accessible-properties.d.ts.map +1 -1
- package/dist/widget-accessible-properties.js +135 -190
- package/dist/widget-accessible-properties.js.map +1 -1
- package/dist/widget-getters.d.ts +8 -0
- package/dist/widget-getters.d.ts.map +1 -0
- package/dist/widget-getters.js +19 -0
- package/dist/widget-getters.js.map +1 -0
- package/dist/within.d.ts +3 -2
- package/dist/within.d.ts.map +1 -1
- package/dist/within.js +3 -2
- package/dist/within.js.map +1 -1
- package/package.json +12 -7
- package/src/accessible-native.ts +333 -0
- package/src/build-queries.ts +47 -41
- package/src/cleanup-registry.ts +1 -1
- package/src/errors.ts +12 -1
- package/src/fire-event.ts +61 -8
- package/src/frame-sync.ts +21 -5
- package/src/harness-window.ts +9 -0
- package/src/index.ts +18 -11
- package/src/internal.ts +11 -0
- package/src/matchers.ts +428 -70
- package/src/pretty-format.ts +1 -0
- package/src/pretty-widget.ts +97 -70
- package/src/production.ts +52 -0
- package/src/queries.ts +127 -89
- package/src/query-helpers.ts +97 -0
- package/src/render-children.ts +25 -0
- package/src/render.tsx +16 -11
- package/src/role-helpers.ts +14 -4
- package/src/role-naming.ts +99 -0
- package/src/screenshot.ts +272 -103
- package/src/traversal.ts +44 -6
- package/src/types.ts +28 -16
- package/src/user-event/adjustment.ts +29 -2
- package/src/user-event/click.ts +247 -52
- package/src/user-event/column-header-click.ts +90 -0
- package/src/user-event/event-wrapper.ts +3 -1
- package/src/user-event/index.ts +100 -37
- package/src/user-event/indexed-children.ts +75 -0
- package/src/user-event/keyboard.ts +52 -4
- package/src/user-event/list-row-click.ts +57 -0
- package/src/user-event/native-click.ts +46 -0
- package/src/user-event/pointer.ts +48 -9
- package/src/user-event/selection.ts +67 -41
- package/src/user-event/text.ts +92 -21
- package/src/widget-accessible-properties.ts +183 -230
- package/src/widget-getters.ts +32 -0
- package/src/within.ts +3 -2
package/README.md
CHANGED
|
@@ -108,7 +108,7 @@ React Native and similar frameworks hide the native toolkit so one API can run e
|
|
|
108
108
|
|
|
109
109
|
### Why Node.js, and why generated bindings
|
|
110
110
|
|
|
111
|
-
GTKX runs on Node.js, which puts native modules, the npm ecosystem, and the tooling built for Node.js APIs within reach. GJS is GNOME's own runtime, built on SpiderMonkey rather than V8; node-gtk runs on Node.js but is lightly maintained, on the older nan/V8 ABI rather than N-API, and still centered on GTK3. The [Why GTKX guide](https://gtkx.dev/guide/why-gtkx) covers
|
|
111
|
+
GTKX runs on Node.js, which puts native modules, the npm ecosystem, and the tooling built for Node.js APIs within reach. GJS is GNOME's own runtime, built on SpiderMonkey rather than V8; node-gtk runs on Node.js but is lightly maintained, on the older nan/V8 ABI rather than N-API, and still centered on GTK3. The [Why GTKX guide](https://gtkx.dev/guide/why-gtkx) covers what running on Node.js means day to day.
|
|
112
112
|
|
|
113
113
|
GTKX generates the TypeScript types and the native FFI calls from the same GObject-Introspection data, so the types cannot drift from the calls they back. Codegen covers the whole GTK4 and Adwaita surface.
|
|
114
114
|
|
|
@@ -121,10 +121,10 @@ GTKX is Linux-only and needs Node.js 24 or later. See [Requirements](#requiremen
|
|
|
121
121
|
Scaffold a new app with the `create-gtkx` initializer:
|
|
122
122
|
|
|
123
123
|
```sh
|
|
124
|
-
npm create gtkx
|
|
124
|
+
npm create gtkx
|
|
125
125
|
```
|
|
126
126
|
|
|
127
|
-
The same command works with other package managers: `pnpm create gtkx
|
|
127
|
+
The same command works with other package managers: `pnpm create gtkx` or `yarn create gtkx`.
|
|
128
128
|
|
|
129
129
|
Then run your new app:
|
|
130
130
|
|
|
@@ -145,7 +145,7 @@ The documentation at **[gtkx.dev](https://gtkx.dev)** includes a step-by-step tu
|
|
|
145
145
|
|
|
146
146
|
GTKX is Linux-only. You need:
|
|
147
147
|
|
|
148
|
-
- Linux with the GTK4 (4.20 or later), Adwaita (1.8 or later)
|
|
148
|
+
- Linux with the GTK4 (4.20 or later) and GLib development libraries, plus Adwaita (1.8 or later) once your project binds `Adw-1`
|
|
149
149
|
- Node.js 24 or later
|
|
150
150
|
|
|
151
151
|
The `@gtkx/native` addon ships prebuilt for x64 and arm64 glibc Linux; other targets need to build it from the GTKX repository, which requires a Rust toolchain.
|
|
@@ -161,7 +161,7 @@ Explore the [example apps](https://github.com/gtkx-org/gtkx/tree/main/examples):
|
|
|
161
161
|
|
|
162
162
|
## Status
|
|
163
163
|
|
|
164
|
-
GTKX 1.0 is
|
|
164
|
+
GTKX 1.0 is released.
|
|
165
165
|
|
|
166
166
|
## Contributing
|
|
167
167
|
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as Gtk from "@gtkx/gi/gtk";
|
|
2
|
+
/** A value GTK holds for an accessible property: a string, a number, a token, or a boolean. */
|
|
3
|
+
type AccessibleAttributeValue = boolean | number | string;
|
|
4
|
+
declare const ACCESSIBLE_NUMBER_TOLERANCE = 0.001;
|
|
5
|
+
declare const readAccessibleRelation: (accessible: Gtk.Accessible, relation: Gtk.AccessibleRelation, pool: Gtk.Accessible[]) => Gtk.Accessible[];
|
|
6
|
+
declare const readAccessibleState: (accessible: Gtk.Accessible, state: Gtk.AccessibleState) => number | null;
|
|
7
|
+
declare const readAccessibleFlag: (accessible: Gtk.Accessible, state: Gtk.AccessibleState) => boolean | null;
|
|
8
|
+
declare const readAccessibleString: (accessible: Gtk.Accessible, property: Gtk.AccessibleProperty) => string | null;
|
|
9
|
+
declare const readAccessibleBooleanProperty: (accessible: Gtk.Accessible, property: Gtk.AccessibleProperty) => boolean | null;
|
|
10
|
+
declare const readAccessibleInt: (accessible: Gtk.Accessible, property: Gtk.AccessibleProperty) => number | null;
|
|
11
|
+
declare const readAccessibleNumber: (accessible: Gtk.Accessible, property: Gtk.AccessibleProperty) => number | null;
|
|
12
|
+
declare const isAccessibleNumberProperty: (property: Gtk.AccessibleProperty) => boolean;
|
|
13
|
+
declare const isAccessibleNumberMatch: (accessible: Gtk.Accessible, property: Gtk.AccessibleProperty, expected: number) => boolean;
|
|
14
|
+
declare const readAccessibleProperty: (accessible: Gtk.Accessible, property: Gtk.AccessibleProperty) => AccessibleAttributeValue | null;
|
|
15
|
+
export { ACCESSIBLE_NUMBER_TOLERANCE, isAccessibleNumberMatch, isAccessibleNumberProperty, readAccessibleBooleanProperty, readAccessibleFlag, readAccessibleInt, readAccessibleNumber, readAccessibleProperty, readAccessibleRelation, readAccessibleState, readAccessibleString, type AccessibleAttributeValue, };
|
|
16
|
+
//# sourceMappingURL=accessible-native.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accessible-native.d.ts","sourceRoot":"","sources":["../src/accessible-native.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AAOpC,+FAA+F;AAC/F,KAAK,wBAAwB,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAqB1D,QAAA,MAAM,2BAA2B,QAAQ,CAAC;AAuJ1C,QAAA,MAAM,sBAAsB,GACxB,YAAY,GAAG,CAAC,UAAU,EAC1B,UAAU,GAAG,CAAC,kBAAkB,EAChC,MAAM,GAAG,CAAC,UAAU,EAAE,KACvB,GAAG,CAAC,UAAU,EAahB,CAAC;AAYF,QAAA,MAAM,mBAAmB,GAAI,YAAY,GAAG,CAAC,UAAU,EAAE,OAAO,GAAG,CAAC,eAAe,KAAG,MAAM,GAAG,IAU9F,CAAC;AAEF,QAAA,MAAM,kBAAkB,GAAI,YAAY,GAAG,CAAC,UAAU,EAAE,OAAO,GAAG,CAAC,eAAe,KAAG,OAAO,GAAG,IAI9F,CAAC;AAEF,QAAA,MAAM,oBAAoB,GAAI,YAAY,GAAG,CAAC,UAAU,EAAE,UAAU,GAAG,CAAC,kBAAkB,KAAG,MAAM,GAAG,IAMrG,CAAC;AAcF,QAAA,MAAM,6BAA6B,GAC/B,YAAY,GAAG,CAAC,UAAU,EAC1B,UAAU,GAAG,CAAC,kBAAkB,KACjC,OAAO,GAAG,IAIZ,CAAC;AAiBF,QAAA,MAAM,iBAAiB,GAAI,YAAY,GAAG,CAAC,UAAU,EAAE,UAAU,GAAG,CAAC,kBAAkB,KAAG,MAAM,GAAG,IACtB,CAAC;AAE9E,QAAA,MAAM,oBAAoB,GAAI,YAAY,GAAG,CAAC,UAAU,EAAE,UAAU,GAAG,CAAC,kBAAkB,KAAG,MAAM,GAAG,IACnB,CAAC;AAEpF,QAAA,MAAM,0BAA0B,GAAI,UAAU,GAAG,CAAC,kBAAkB,KAAG,OAA0C,CAAC;AAElH,QAAA,MAAM,uBAAuB,GACzB,YAAY,GAAG,CAAC,UAAU,EAC1B,UAAU,GAAG,CAAC,kBAAkB,EAChC,UAAU,MAAM,KACjB,OAEwE,CAAC;AA6B5E,QAAA,MAAM,sBAAsB,GACxB,YAAY,GAAG,CAAC,UAAU,EAC1B,UAAU,GAAG,CAAC,kBAAkB,KACjC,wBAAwB,GAAG,IAAyD,CAAC;AAExF,OAAO,EACH,2BAA2B,EAC3B,uBAAuB,EACvB,0BAA0B,EAC1B,6BAA6B,EAC7B,kBAAkB,EAClB,iBAAiB,EACjB,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,EACpB,KAAK,wBAAwB,GAChC,CAAC"}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import * as Gtk from "@gtkx/gi/gtk";
|
|
2
|
+
import { getHandle, t } from "@gtkx/runtime";
|
|
3
|
+
const LIB = "libgtk-4.so.1";
|
|
4
|
+
const MAX_RELATION_TARGETS = 8;
|
|
5
|
+
const relationBindings = new Map();
|
|
6
|
+
const REVERSE_RELATIONS = {
|
|
7
|
+
[Gtk.AccessibleRelation.LABELLED_BY]: Gtk.AccessibleRelation.LABEL_FOR,
|
|
8
|
+
[Gtk.AccessibleRelation.DESCRIBED_BY]: Gtk.AccessibleRelation.DESCRIPTION_FOR,
|
|
9
|
+
[Gtk.AccessibleRelation.ERROR_MESSAGE]: Gtk.AccessibleRelation.ERROR_MESSAGE_FOR,
|
|
10
|
+
[Gtk.AccessibleRelation.CONTROLS]: Gtk.AccessibleRelation.CONTROLLED_BY,
|
|
11
|
+
[Gtk.AccessibleRelation.DETAILS]: Gtk.AccessibleRelation.DETAILS_FOR,
|
|
12
|
+
[Gtk.AccessibleRelation.FLOW_TO]: Gtk.AccessibleRelation.FLOW_FROM,
|
|
13
|
+
};
|
|
14
|
+
const UNDEFINED_VALUE = -1;
|
|
15
|
+
const INT_SENTINEL = -2_147_483_648;
|
|
16
|
+
const NUMBER_SENTINEL = -Number.MAX_VALUE;
|
|
17
|
+
const ACCESSIBLE_NUMBER_TOLERANCE = 0.001;
|
|
18
|
+
const BOOLEAN_DOMAIN = [0, 1];
|
|
19
|
+
const OPTIONAL_BOOLEAN_DOMAIN = [0, 1, UNDEFINED_VALUE];
|
|
20
|
+
const TRISTATE_DOMAIN = [Gtk.AccessibleTristate.FALSE, Gtk.AccessibleTristate.TRUE, Gtk.AccessibleTristate.MIXED];
|
|
21
|
+
const INVALID_DOMAIN = [
|
|
22
|
+
Gtk.AccessibleInvalidState.FALSE,
|
|
23
|
+
Gtk.AccessibleInvalidState.TRUE,
|
|
24
|
+
Gtk.AccessibleInvalidState.GRAMMAR,
|
|
25
|
+
Gtk.AccessibleInvalidState.SPELLING,
|
|
26
|
+
];
|
|
27
|
+
const STATE_DOMAINS = {
|
|
28
|
+
[Gtk.AccessibleState.BUSY]: BOOLEAN_DOMAIN,
|
|
29
|
+
[Gtk.AccessibleState.CHECKED]: TRISTATE_DOMAIN,
|
|
30
|
+
[Gtk.AccessibleState.DISABLED]: BOOLEAN_DOMAIN,
|
|
31
|
+
[Gtk.AccessibleState.EXPANDED]: OPTIONAL_BOOLEAN_DOMAIN,
|
|
32
|
+
[Gtk.AccessibleState.HIDDEN]: BOOLEAN_DOMAIN,
|
|
33
|
+
[Gtk.AccessibleState.INVALID]: INVALID_DOMAIN,
|
|
34
|
+
[Gtk.AccessibleState.PRESSED]: TRISTATE_DOMAIN,
|
|
35
|
+
[Gtk.AccessibleState.SELECTED]: OPTIONAL_BOOLEAN_DOMAIN,
|
|
36
|
+
[Gtk.AccessibleState.VISITED]: OPTIONAL_BOOLEAN_DOMAIN,
|
|
37
|
+
};
|
|
38
|
+
const AUTOCOMPLETE_DOMAIN = [
|
|
39
|
+
Gtk.AccessibleAutocomplete.NONE,
|
|
40
|
+
Gtk.AccessibleAutocomplete.INLINE,
|
|
41
|
+
Gtk.AccessibleAutocomplete.LIST,
|
|
42
|
+
Gtk.AccessibleAutocomplete.BOTH,
|
|
43
|
+
];
|
|
44
|
+
const ORIENTATION_DOMAIN = [Gtk.Orientation.HORIZONTAL, Gtk.Orientation.VERTICAL];
|
|
45
|
+
const SORT_DOMAIN = [
|
|
46
|
+
Gtk.AccessibleSort.NONE,
|
|
47
|
+
Gtk.AccessibleSort.ASCENDING,
|
|
48
|
+
Gtk.AccessibleSort.DESCENDING,
|
|
49
|
+
Gtk.AccessibleSort.OTHER,
|
|
50
|
+
];
|
|
51
|
+
const TOKEN_DOMAINS = {
|
|
52
|
+
[Gtk.AccessibleProperty.AUTOCOMPLETE]: AUTOCOMPLETE_DOMAIN,
|
|
53
|
+
[Gtk.AccessibleProperty.ORIENTATION]: ORIENTATION_DOMAIN,
|
|
54
|
+
[Gtk.AccessibleProperty.SORT]: SORT_DOMAIN,
|
|
55
|
+
};
|
|
56
|
+
const STRING_PROPERTIES = new Set([
|
|
57
|
+
Gtk.AccessibleProperty.DESCRIPTION,
|
|
58
|
+
Gtk.AccessibleProperty.HELP_TEXT,
|
|
59
|
+
Gtk.AccessibleProperty.KEY_SHORTCUTS,
|
|
60
|
+
Gtk.AccessibleProperty.LABEL,
|
|
61
|
+
Gtk.AccessibleProperty.PLACEHOLDER,
|
|
62
|
+
Gtk.AccessibleProperty.ROLE_DESCRIPTION,
|
|
63
|
+
Gtk.AccessibleProperty.VALUE_TEXT,
|
|
64
|
+
]);
|
|
65
|
+
const BOOLEAN_PROPERTIES = new Set([
|
|
66
|
+
Gtk.AccessibleProperty.HAS_POPUP,
|
|
67
|
+
Gtk.AccessibleProperty.MODAL,
|
|
68
|
+
Gtk.AccessibleProperty.MULTI_LINE,
|
|
69
|
+
Gtk.AccessibleProperty.MULTI_SELECTABLE,
|
|
70
|
+
Gtk.AccessibleProperty.READ_ONLY,
|
|
71
|
+
Gtk.AccessibleProperty.REQUIRED,
|
|
72
|
+
]);
|
|
73
|
+
const NUMBER_PROPERTIES = new Set([
|
|
74
|
+
Gtk.AccessibleProperty.VALUE_MAX,
|
|
75
|
+
Gtk.AccessibleProperty.VALUE_MIN,
|
|
76
|
+
Gtk.AccessibleProperty.VALUE_NOW,
|
|
77
|
+
]);
|
|
78
|
+
const OBJECT_ARG = { type: t.object("borrowed") };
|
|
79
|
+
const INT_ARG = { type: t.int32 };
|
|
80
|
+
const DOUBLE_ARG = { type: t.float64 };
|
|
81
|
+
const STRING_ARG = { type: t.string("borrowed") };
|
|
82
|
+
const CHECK_PROPERTY = "gtk_test_accessible_check_property";
|
|
83
|
+
const checkStateInt = buildAccessibleCheck("gtk_test_accessible_check_state", [INT_ARG]);
|
|
84
|
+
const checkPropertyInt = buildAccessibleCheck(CHECK_PROPERTY, [INT_ARG]);
|
|
85
|
+
const checkPropertyDouble = buildAccessibleCheck(CHECK_PROPERTY, [DOUBLE_ARG]);
|
|
86
|
+
const checkPropertyString = buildAccessibleCheck(CHECK_PROPERTY, [STRING_ARG]);
|
|
87
|
+
function buildAccessibleCheck(symbol, varargs) {
|
|
88
|
+
return t.fn(LIB, symbol, {
|
|
89
|
+
args: [OBJECT_ARG, INT_ARG, ...varargs],
|
|
90
|
+
returns: t.string("full"),
|
|
91
|
+
fixedArgCount: 2,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
const buildRelationBinding = (targetCount) => {
|
|
95
|
+
const targets = Array.from({ length: targetCount + 1 }, () => OBJECT_ARG);
|
|
96
|
+
return buildAccessibleCheck("gtk_test_accessible_check_relation", targets);
|
|
97
|
+
};
|
|
98
|
+
const relationBindingFor = (targetCount) => {
|
|
99
|
+
const cached = relationBindings.get(targetCount);
|
|
100
|
+
if (cached !== undefined) {
|
|
101
|
+
return cached;
|
|
102
|
+
}
|
|
103
|
+
const built = buildRelationBinding(targetCount);
|
|
104
|
+
relationBindings.set(targetCount, built);
|
|
105
|
+
return built;
|
|
106
|
+
};
|
|
107
|
+
const isRelationExactly = (accessible, relation, candidate, targetCount) => {
|
|
108
|
+
const call = relationBindingFor(targetCount);
|
|
109
|
+
const repeated = Array.from({ length: targetCount }, () => getHandle(candidate));
|
|
110
|
+
return call(getHandle(accessible), relation, ...repeated, null) === null;
|
|
111
|
+
};
|
|
112
|
+
const hasRelationSize = (accessible, relation, candidates, size) => candidates.some((candidate) => isRelationExactly(accessible, relation, candidate, size));
|
|
113
|
+
const findRelationSize = (accessible, relation, candidates) => {
|
|
114
|
+
for (let size = 1; size <= MAX_RELATION_TARGETS; size += 1) {
|
|
115
|
+
if (hasRelationSize(accessible, relation, candidates, size)) {
|
|
116
|
+
return size;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return 0;
|
|
120
|
+
};
|
|
121
|
+
const possibleTargets = (relation, candidates) => {
|
|
122
|
+
const reverse = REVERSE_RELATIONS[relation];
|
|
123
|
+
if (reverse === undefined) {
|
|
124
|
+
return candidates;
|
|
125
|
+
}
|
|
126
|
+
return candidates.filter((candidate) => Gtk.testAccessibleHasRelation(candidate, reverse));
|
|
127
|
+
};
|
|
128
|
+
const readAccessibleRelation = (accessible, relation, pool) => {
|
|
129
|
+
if (!Gtk.testAccessibleHasRelation(accessible, relation)) {
|
|
130
|
+
return [];
|
|
131
|
+
}
|
|
132
|
+
const candidates = possibleTargets(relation, pool);
|
|
133
|
+
const size = findRelationSize(accessible, relation, candidates);
|
|
134
|
+
if (size === 0) {
|
|
135
|
+
return [];
|
|
136
|
+
}
|
|
137
|
+
return candidates.filter((candidate) => isRelationExactly(accessible, relation, candidate, size));
|
|
138
|
+
};
|
|
139
|
+
const memberOfDomain = (check, handle, attribute, domain) => {
|
|
140
|
+
for (const candidate of domain) {
|
|
141
|
+
if (check(handle, attribute, candidate) === null) {
|
|
142
|
+
return candidate;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return null;
|
|
146
|
+
};
|
|
147
|
+
const readAccessibleState = (accessible, state) => {
|
|
148
|
+
const domain = STATE_DOMAINS[state];
|
|
149
|
+
if (domain === undefined || !Gtk.testAccessibleHasState(accessible, state)) {
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
const member = memberOfDomain(checkStateInt, getHandle(accessible), state, domain);
|
|
153
|
+
return member === UNDEFINED_VALUE ? null : member;
|
|
154
|
+
};
|
|
155
|
+
const readAccessibleFlag = (accessible, state) => {
|
|
156
|
+
const value = readAccessibleState(accessible, state);
|
|
157
|
+
return value === null ? null : value === 1;
|
|
158
|
+
};
|
|
159
|
+
const readAccessibleString = (accessible, property) => {
|
|
160
|
+
if (!Gtk.testAccessibleHasProperty(accessible, property)) {
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
return checkPropertyString(getHandle(accessible), property, null);
|
|
164
|
+
};
|
|
165
|
+
const readAccessibleToken = (accessible, property, domain) => {
|
|
166
|
+
if (!Gtk.testAccessibleHasProperty(accessible, property)) {
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
return memberOfDomain(checkPropertyInt, getHandle(accessible), property, domain);
|
|
170
|
+
};
|
|
171
|
+
const readAccessibleBooleanProperty = (accessible, property) => {
|
|
172
|
+
const member = readAccessibleToken(accessible, property, BOOLEAN_DOMAIN);
|
|
173
|
+
return member === null ? null : member === 1;
|
|
174
|
+
};
|
|
175
|
+
const readAgainstSentinel = (check, sentinel, accessible, property) => {
|
|
176
|
+
if (!Gtk.testAccessibleHasProperty(accessible, property)) {
|
|
177
|
+
return null;
|
|
178
|
+
}
|
|
179
|
+
const reported = check(getHandle(accessible), property, sentinel);
|
|
180
|
+
return reported === null ? sentinel : Number(reported);
|
|
181
|
+
};
|
|
182
|
+
const readAccessibleInt = (accessible, property) => readAgainstSentinel(checkPropertyInt, INT_SENTINEL, accessible, property);
|
|
183
|
+
const readAccessibleNumber = (accessible, property) => readAgainstSentinel(checkPropertyDouble, NUMBER_SENTINEL, accessible, property);
|
|
184
|
+
const isAccessibleNumberProperty = (property) => NUMBER_PROPERTIES.has(property);
|
|
185
|
+
const isAccessibleNumberMatch = (accessible, property, expected) => Gtk.testAccessibleHasProperty(accessible, property) &&
|
|
186
|
+
checkPropertyDouble(getHandle(accessible), property, expected) === null;
|
|
187
|
+
const tokenReaderFor = (domain) => (accessible, property) => readAccessibleToken(accessible, property, domain);
|
|
188
|
+
const propertyReaderFor = (property) => {
|
|
189
|
+
const domain = TOKEN_DOMAINS[property];
|
|
190
|
+
if (domain !== undefined) {
|
|
191
|
+
return tokenReaderFor(domain);
|
|
192
|
+
}
|
|
193
|
+
if (STRING_PROPERTIES.has(property)) {
|
|
194
|
+
return readAccessibleString;
|
|
195
|
+
}
|
|
196
|
+
if (BOOLEAN_PROPERTIES.has(property)) {
|
|
197
|
+
return readAccessibleBooleanProperty;
|
|
198
|
+
}
|
|
199
|
+
if (NUMBER_PROPERTIES.has(property)) {
|
|
200
|
+
return readAccessibleNumber;
|
|
201
|
+
}
|
|
202
|
+
return readAccessibleInt;
|
|
203
|
+
};
|
|
204
|
+
const readAccessibleProperty = (accessible, property) => propertyReaderFor(property)(accessible, property);
|
|
205
|
+
export { ACCESSIBLE_NUMBER_TOLERANCE, isAccessibleNumberMatch, isAccessibleNumberProperty, readAccessibleBooleanProperty, readAccessibleFlag, readAccessibleInt, readAccessibleNumber, readAccessibleProperty, readAccessibleRelation, readAccessibleState, readAccessibleString, };
|
|
206
|
+
//# sourceMappingURL=accessible-native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accessible-native.js","sourceRoot":"","sources":["../src/accessible-native.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Gtk from \"@gtkx/gi/gtk\";\nimport { getHandle, t } from \"@gtkx/runtime\";\n\ntype CheckInt = (handle: unknown, attribute: number, expected: number) => string | null;\ntype CheckString = (handle: unknown, attribute: number, expected: string | null) => string | null;\ntype CheckDouble = (handle: unknown, attribute: number, expected: number) => string | null;\ntype CheckRelation = (...args: unknown[]) => string | null;\n/** A value GTK holds for an accessible property: a string, a number, a token, or a boolean. */\ntype AccessibleAttributeValue = boolean | number | string;\ntype PropertyReader = (accessible: Gtk.Accessible, property: Gtk.AccessibleProperty) => AccessibleAttributeValue | null;\ntype NativeCall = (...inputs: unknown[]) => unknown;\ntype CheckArg = typeof DOUBLE_ARG | typeof INT_ARG | typeof OBJECT_ARG | typeof STRING_ARG;\n\nconst LIB = \"libgtk-4.so.1\";\nconst MAX_RELATION_TARGETS = 8;\nconst relationBindings: Map<number, CheckRelation> = new Map();\n\nconst REVERSE_RELATIONS: Partial<Record<Gtk.AccessibleRelation, Gtk.AccessibleRelation>> = {\n [Gtk.AccessibleRelation.LABELLED_BY]: Gtk.AccessibleRelation.LABEL_FOR,\n [Gtk.AccessibleRelation.DESCRIBED_BY]: Gtk.AccessibleRelation.DESCRIPTION_FOR,\n [Gtk.AccessibleRelation.ERROR_MESSAGE]: Gtk.AccessibleRelation.ERROR_MESSAGE_FOR,\n [Gtk.AccessibleRelation.CONTROLS]: Gtk.AccessibleRelation.CONTROLLED_BY,\n [Gtk.AccessibleRelation.DETAILS]: Gtk.AccessibleRelation.DETAILS_FOR,\n [Gtk.AccessibleRelation.FLOW_TO]: Gtk.AccessibleRelation.FLOW_FROM,\n};\n\nconst UNDEFINED_VALUE = -1;\nconst INT_SENTINEL = -2_147_483_648;\nconst NUMBER_SENTINEL = -Number.MAX_VALUE;\nconst ACCESSIBLE_NUMBER_TOLERANCE = 0.001;\nconst BOOLEAN_DOMAIN = [0, 1];\nconst OPTIONAL_BOOLEAN_DOMAIN = [0, 1, UNDEFINED_VALUE];\nconst TRISTATE_DOMAIN = [Gtk.AccessibleTristate.FALSE, Gtk.AccessibleTristate.TRUE, Gtk.AccessibleTristate.MIXED];\n\nconst INVALID_DOMAIN = [\n Gtk.AccessibleInvalidState.FALSE,\n Gtk.AccessibleInvalidState.TRUE,\n Gtk.AccessibleInvalidState.GRAMMAR,\n Gtk.AccessibleInvalidState.SPELLING,\n];\n\nconst STATE_DOMAINS: Partial<Record<Gtk.AccessibleState, number[]>> = {\n [Gtk.AccessibleState.BUSY]: BOOLEAN_DOMAIN,\n [Gtk.AccessibleState.CHECKED]: TRISTATE_DOMAIN,\n [Gtk.AccessibleState.DISABLED]: BOOLEAN_DOMAIN,\n [Gtk.AccessibleState.EXPANDED]: OPTIONAL_BOOLEAN_DOMAIN,\n [Gtk.AccessibleState.HIDDEN]: BOOLEAN_DOMAIN,\n [Gtk.AccessibleState.INVALID]: INVALID_DOMAIN,\n [Gtk.AccessibleState.PRESSED]: TRISTATE_DOMAIN,\n [Gtk.AccessibleState.SELECTED]: OPTIONAL_BOOLEAN_DOMAIN,\n [Gtk.AccessibleState.VISITED]: OPTIONAL_BOOLEAN_DOMAIN,\n};\n\nconst AUTOCOMPLETE_DOMAIN = [\n Gtk.AccessibleAutocomplete.NONE,\n Gtk.AccessibleAutocomplete.INLINE,\n Gtk.AccessibleAutocomplete.LIST,\n Gtk.AccessibleAutocomplete.BOTH,\n];\n\nconst ORIENTATION_DOMAIN = [Gtk.Orientation.HORIZONTAL, Gtk.Orientation.VERTICAL];\n\nconst SORT_DOMAIN = [\n Gtk.AccessibleSort.NONE,\n Gtk.AccessibleSort.ASCENDING,\n Gtk.AccessibleSort.DESCENDING,\n Gtk.AccessibleSort.OTHER,\n];\n\nconst TOKEN_DOMAINS: Partial<Record<Gtk.AccessibleProperty, number[]>> = {\n [Gtk.AccessibleProperty.AUTOCOMPLETE]: AUTOCOMPLETE_DOMAIN,\n [Gtk.AccessibleProperty.ORIENTATION]: ORIENTATION_DOMAIN,\n [Gtk.AccessibleProperty.SORT]: SORT_DOMAIN,\n};\n\nconst STRING_PROPERTIES: Set<Gtk.AccessibleProperty> = new Set<Gtk.AccessibleProperty>([\n Gtk.AccessibleProperty.DESCRIPTION,\n Gtk.AccessibleProperty.HELP_TEXT,\n Gtk.AccessibleProperty.KEY_SHORTCUTS,\n Gtk.AccessibleProperty.LABEL,\n Gtk.AccessibleProperty.PLACEHOLDER,\n Gtk.AccessibleProperty.ROLE_DESCRIPTION,\n Gtk.AccessibleProperty.VALUE_TEXT,\n]);\n\nconst BOOLEAN_PROPERTIES: Set<Gtk.AccessibleProperty> = new Set<Gtk.AccessibleProperty>([\n Gtk.AccessibleProperty.HAS_POPUP,\n Gtk.AccessibleProperty.MODAL,\n Gtk.AccessibleProperty.MULTI_LINE,\n Gtk.AccessibleProperty.MULTI_SELECTABLE,\n Gtk.AccessibleProperty.READ_ONLY,\n Gtk.AccessibleProperty.REQUIRED,\n]);\n\nconst NUMBER_PROPERTIES: Set<Gtk.AccessibleProperty> = new Set<Gtk.AccessibleProperty>([\n Gtk.AccessibleProperty.VALUE_MAX,\n Gtk.AccessibleProperty.VALUE_MIN,\n Gtk.AccessibleProperty.VALUE_NOW,\n]);\n\nconst OBJECT_ARG = { type: t.object(\"borrowed\") };\nconst INT_ARG = { type: t.int32 };\nconst DOUBLE_ARG = { type: t.float64 };\nconst STRING_ARG = { type: t.string(\"borrowed\") };\nconst CHECK_PROPERTY = \"gtk_test_accessible_check_property\";\nconst checkStateInt = buildAccessibleCheck(\"gtk_test_accessible_check_state\", [INT_ARG]) as CheckInt;\nconst checkPropertyInt = buildAccessibleCheck(CHECK_PROPERTY, [INT_ARG]) as CheckInt;\nconst checkPropertyDouble = buildAccessibleCheck(CHECK_PROPERTY, [DOUBLE_ARG]) as CheckDouble;\nconst checkPropertyString = buildAccessibleCheck(CHECK_PROPERTY, [STRING_ARG]) as CheckString;\n\nfunction buildAccessibleCheck(symbol: string, varargs: CheckArg[]): NativeCall {\n return t.fn(LIB, symbol, {\n args: [OBJECT_ARG, INT_ARG, ...varargs],\n returns: t.string(\"full\"),\n fixedArgCount: 2,\n });\n}\n\nconst buildRelationBinding = (targetCount: number): CheckRelation => {\n const targets = Array.from({ length: targetCount + 1 }, () => OBJECT_ARG);\n\n return buildAccessibleCheck(\"gtk_test_accessible_check_relation\", targets) as CheckRelation;\n};\n\nconst relationBindingFor = (targetCount: number): CheckRelation => {\n const cached = relationBindings.get(targetCount);\n\n if (cached !== undefined) {\n return cached;\n }\n\n const built = buildRelationBinding(targetCount);\n relationBindings.set(targetCount, built);\n\n return built;\n};\n\nconst isRelationExactly = (\n accessible: Gtk.Accessible,\n relation: Gtk.AccessibleRelation,\n candidate: Gtk.Accessible,\n targetCount: number,\n): boolean => {\n const call = relationBindingFor(targetCount);\n const repeated = Array.from({ length: targetCount }, () => getHandle(candidate));\n\n return call(getHandle(accessible), relation, ...repeated, null) === null;\n};\n\nconst hasRelationSize = (\n accessible: Gtk.Accessible,\n relation: Gtk.AccessibleRelation,\n candidates: Gtk.Accessible[],\n size: number,\n): boolean => candidates.some((candidate) => isRelationExactly(accessible, relation, candidate, size));\n\nconst findRelationSize = (\n accessible: Gtk.Accessible,\n relation: Gtk.AccessibleRelation,\n candidates: Gtk.Accessible[],\n): number => {\n for (let size = 1; size <= MAX_RELATION_TARGETS; size += 1) {\n if (hasRelationSize(accessible, relation, candidates, size)) {\n return size;\n }\n }\n\n return 0;\n};\n\nconst possibleTargets = (relation: Gtk.AccessibleRelation, candidates: Gtk.Accessible[]): Gtk.Accessible[] => {\n const reverse = REVERSE_RELATIONS[relation];\n\n if (reverse === undefined) {\n return candidates;\n }\n\n return candidates.filter((candidate) => Gtk.testAccessibleHasRelation(candidate, reverse));\n};\n\nconst readAccessibleRelation = (\n accessible: Gtk.Accessible,\n relation: Gtk.AccessibleRelation,\n pool: Gtk.Accessible[],\n): Gtk.Accessible[] => {\n if (!Gtk.testAccessibleHasRelation(accessible, relation)) {\n return [];\n }\n\n const candidates = possibleTargets(relation, pool);\n const size = findRelationSize(accessible, relation, candidates);\n\n if (size === 0) {\n return [];\n }\n\n return candidates.filter((candidate) => isRelationExactly(accessible, relation, candidate, size));\n};\n\nconst memberOfDomain = (check: CheckInt, handle: unknown, attribute: number, domain: number[]): number | null => {\n for (const candidate of domain) {\n if (check(handle, attribute, candidate) === null) {\n return candidate;\n }\n }\n\n return null;\n};\n\nconst readAccessibleState = (accessible: Gtk.Accessible, state: Gtk.AccessibleState): number | null => {\n const domain = STATE_DOMAINS[state];\n\n if (domain === undefined || !Gtk.testAccessibleHasState(accessible, state)) {\n return null;\n }\n\n const member = memberOfDomain(checkStateInt, getHandle(accessible), state, domain);\n\n return member === UNDEFINED_VALUE ? null : member;\n};\n\nconst readAccessibleFlag = (accessible: Gtk.Accessible, state: Gtk.AccessibleState): boolean | null => {\n const value = readAccessibleState(accessible, state);\n\n return value === null ? null : value === 1;\n};\n\nconst readAccessibleString = (accessible: Gtk.Accessible, property: Gtk.AccessibleProperty): string | null => {\n if (!Gtk.testAccessibleHasProperty(accessible, property)) {\n return null;\n }\n\n return checkPropertyString(getHandle(accessible), property, null);\n};\n\nconst readAccessibleToken = (\n accessible: Gtk.Accessible,\n property: Gtk.AccessibleProperty,\n domain: number[],\n): number | null => {\n if (!Gtk.testAccessibleHasProperty(accessible, property)) {\n return null;\n }\n\n return memberOfDomain(checkPropertyInt, getHandle(accessible), property, domain);\n};\n\nconst readAccessibleBooleanProperty = (\n accessible: Gtk.Accessible,\n property: Gtk.AccessibleProperty,\n): boolean | null => {\n const member = readAccessibleToken(accessible, property, BOOLEAN_DOMAIN);\n\n return member === null ? null : member === 1;\n};\n\nconst readAgainstSentinel = (\n check: CheckDouble,\n sentinel: number,\n accessible: Gtk.Accessible,\n property: Gtk.AccessibleProperty,\n): number | null => {\n if (!Gtk.testAccessibleHasProperty(accessible, property)) {\n return null;\n }\n\n const reported = check(getHandle(accessible), property, sentinel);\n\n return reported === null ? sentinel : Number(reported);\n};\n\nconst readAccessibleInt = (accessible: Gtk.Accessible, property: Gtk.AccessibleProperty): number | null =>\n readAgainstSentinel(checkPropertyInt, INT_SENTINEL, accessible, property);\n\nconst readAccessibleNumber = (accessible: Gtk.Accessible, property: Gtk.AccessibleProperty): number | null =>\n readAgainstSentinel(checkPropertyDouble, NUMBER_SENTINEL, accessible, property);\n\nconst isAccessibleNumberProperty = (property: Gtk.AccessibleProperty): boolean => NUMBER_PROPERTIES.has(property);\n\nconst isAccessibleNumberMatch = (\n accessible: Gtk.Accessible,\n property: Gtk.AccessibleProperty,\n expected: number,\n): boolean =>\n Gtk.testAccessibleHasProperty(accessible, property) &&\n checkPropertyDouble(getHandle(accessible), property, expected) === null;\n\nconst tokenReaderFor =\n (domain: number[]): PropertyReader =>\n (accessible, property) =>\n readAccessibleToken(accessible, property, domain);\n\nconst propertyReaderFor = (property: Gtk.AccessibleProperty): PropertyReader => {\n const domain = TOKEN_DOMAINS[property];\n\n if (domain !== undefined) {\n return tokenReaderFor(domain);\n }\n\n if (STRING_PROPERTIES.has(property)) {\n return readAccessibleString;\n }\n\n if (BOOLEAN_PROPERTIES.has(property)) {\n return readAccessibleBooleanProperty;\n }\n\n if (NUMBER_PROPERTIES.has(property)) {\n return readAccessibleNumber;\n }\n\n return readAccessibleInt;\n};\n\nconst readAccessibleProperty = (\n accessible: Gtk.Accessible,\n property: Gtk.AccessibleProperty,\n): AccessibleAttributeValue | null => propertyReaderFor(property)(accessible, property);\n\nexport {\n ACCESSIBLE_NUMBER_TOLERANCE,\n isAccessibleNumberMatch,\n isAccessibleNumberProperty,\n readAccessibleBooleanProperty,\n readAccessibleFlag,\n readAccessibleInt,\n readAccessibleNumber,\n readAccessibleProperty,\n readAccessibleRelation,\n readAccessibleState,\n readAccessibleString,\n type AccessibleAttributeValue,\n};\n"]}
|
package/dist/build-queries.d.ts
CHANGED
|
@@ -1,16 +1,33 @@
|
|
|
1
1
|
import type * as Gtk from "@gtkx/gi/gtk";
|
|
2
2
|
import type { Container } from "./traversal.js";
|
|
3
|
-
|
|
3
|
+
/**
|
|
4
|
+
* The `queryAllBy` function a query family is built from, taking the scope to search followed by the
|
|
5
|
+
* family's own matcher arguments. Its name determines the family name, so `queryAllByTestId` builds
|
|
6
|
+
* a `TestId` family.
|
|
7
|
+
*/
|
|
4
8
|
type QueryAllBy<Args extends unknown[]> = (container: Container, ...args: Args) => Gtk.Widget[];
|
|
9
|
+
/** Builds the error thrown when a single-match query finds more than one widget. */
|
|
5
10
|
type MultipleErrorBuilder<Args extends unknown[]> = (container: Container, matches: Gtk.Widget[], ...args: Args) => Error;
|
|
11
|
+
/** Builds the error thrown when a query that requires a match finds none. */
|
|
6
12
|
type MissingErrorBuilder<Args extends unknown[]> = (container: Container, ...args: Args) => Error;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
/** The variants derived from one `queryAllBy` function, in the order DOM Testing Library returns them. */
|
|
14
|
+
type BuiltQueries<Args extends unknown[]> = [
|
|
15
|
+
queryBy: (container: Container, ...args: Args) => Gtk.Widget | null,
|
|
16
|
+
getAllBy: QueryAllBy<Args>,
|
|
17
|
+
getBy: (container: Container, ...args: Args) => Gtk.Widget,
|
|
18
|
+
findAllBy: (container: Container, ...args: Args) => Promise<Gtk.Widget[]>,
|
|
19
|
+
findBy: (container: Container, ...args: Args) => Promise<Gtk.Widget>
|
|
20
|
+
];
|
|
21
|
+
/**
|
|
22
|
+
* Derives the `queryBy`, `getAllBy`, `getBy`, `findAllBy`, and `findBy` variants of a query family
|
|
23
|
+
* from the family's `queryAllBy` function, mirroring DOM Testing Library's `buildQueries`. The family
|
|
24
|
+
* name used when suggesting a better query comes from `queryAllBy.name`.
|
|
25
|
+
*
|
|
26
|
+
* @param queryAllBy Finds every widget the family matches.
|
|
27
|
+
* @param getMultipleError Builds the error thrown when a single-match variant finds more than one widget.
|
|
28
|
+
* @param getMissingError Builds the error thrown when a required match is missing.
|
|
29
|
+
* @returns The five variants, in the order `[queryBy, getAllBy, getBy, findAllBy, findBy]`.
|
|
30
|
+
*/
|
|
31
|
+
declare const buildQueries: <Args extends unknown[]>(queryAllBy: QueryAllBy<Args>, getMultipleError: MultipleErrorBuilder<Args>, getMissingError: MissingErrorBuilder<Args>) => BuiltQueries<Args>;
|
|
32
|
+
export { buildQueries, type BuiltQueries, type MissingErrorBuilder, type MultipleErrorBuilder, type QueryAllBy, };
|
|
16
33
|
//# sourceMappingURL=build-queries.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-queries.d.ts","sourceRoot":"","sources":["../src/build-queries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"build-queries.d.ts","sourceRoot":"","sources":["../src/build-queries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAOhD;;;;GAIG;AACH,KAAK,UAAU,CAAC,IAAI,SAAS,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,IAAI,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC;AAEhG,oFAAoF;AACpF,KAAK,oBAAoB,CAAC,IAAI,SAAS,OAAO,EAAE,IAAI,CAChD,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,EACrB,GAAG,IAAI,EAAE,IAAI,KACZ,KAAK,CAAC;AAEX,6EAA6E;AAC7E,KAAK,mBAAmB,CAAC,IAAI,SAAS,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,IAAI,KAAK,KAAK,CAAC;AAElG,0GAA0G;AAC1G,KAAK,YAAY,CAAC,IAAI,SAAS,OAAO,EAAE,IAAI;IACxC,OAAO,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,IAAI,KAAK,GAAG,CAAC,MAAM,GAAG,IAAI;IACnE,QAAQ,EAAE,UAAU,CAAC,IAAI,CAAC;IAC1B,KAAK,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,IAAI,KAAK,GAAG,CAAC,MAAM;IAC1D,SAAS,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;IACzE,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;CACvE,CAAC;AAqJF;;;;;;;;;GASG;AACH,QAAA,MAAM,YAAY,GAAI,IAAI,SAAS,OAAO,EAAE,EACxC,YAAY,UAAU,CAAC,IAAI,CAAC,EAC5B,kBAAkB,oBAAoB,CAAC,IAAI,CAAC,EAC5C,iBAAiB,mBAAmB,CAAC,IAAI,CAAC,KAC3C,YAAY,CAAC,IAAI,CAwCnB,CAAC;AAEF,OAAO,EACH,YAAY,EACZ,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,UAAU,GAClB,CAAC"}
|
package/dist/build-queries.js
CHANGED
|
@@ -2,21 +2,15 @@ import { getConfig } from "./config.js";
|
|
|
2
2
|
import { runWithExpensiveErrorDiagnosticsDisabled, suggestionError } from "./errors.js";
|
|
3
3
|
import { getSuggestedQuery } from "./suggestions.js";
|
|
4
4
|
import { waitFor } from "./wait-for.js";
|
|
5
|
-
const
|
|
5
|
+
const getTrailingOptions = (args) => {
|
|
6
6
|
const last = args.at(-1);
|
|
7
7
|
if (last && typeof last === "object" && !(last instanceof RegExp)) {
|
|
8
|
-
|
|
9
|
-
return { timeout, interval, onTimeout };
|
|
10
|
-
}
|
|
11
|
-
return {};
|
|
12
|
-
};
|
|
13
|
-
const extractShouldSuggest = (args) => {
|
|
14
|
-
const last = args.at(-1);
|
|
15
|
-
if (last && typeof last === "object" && !(last instanceof RegExp)) {
|
|
16
|
-
return last.suggest;
|
|
8
|
+
return last;
|
|
17
9
|
}
|
|
18
10
|
return undefined;
|
|
19
11
|
};
|
|
12
|
+
const extractShouldSuggest = (args) => getTrailingOptions(args)?.suggest;
|
|
13
|
+
const getQueryFamily = (queryAllBy) => queryAllBy.name.replace(/^queryAllBy/, "");
|
|
20
14
|
const maybeThrowSuggestion = (options) => {
|
|
21
15
|
const { container, match, queryName, variant, shouldSuggest } = options;
|
|
22
16
|
if (!(shouldSuggest ?? getConfig().throwSuggestions)) {
|
|
@@ -39,13 +33,12 @@ const reRunForDiagnostics = (query, container, args, fallback) => {
|
|
|
39
33
|
return fallback;
|
|
40
34
|
};
|
|
41
35
|
const findOptions = (query, container, args) => {
|
|
42
|
-
const
|
|
43
|
-
const onTimeout = userOptions.onTimeout ?? ((fallback) => reRunForDiagnostics(query, container, args, fallback));
|
|
36
|
+
const { timeout, interval, onTimeout } = getTrailingOptions(args) ?? {};
|
|
44
37
|
return {
|
|
45
38
|
stackTraceError: new Error("STACK_TRACE_MESSAGE"),
|
|
46
|
-
onTimeout,
|
|
47
|
-
timeout
|
|
48
|
-
interval
|
|
39
|
+
onTimeout: onTimeout ?? ((fallback) => reRunForDiagnostics(query, container, args, fallback)),
|
|
40
|
+
timeout,
|
|
41
|
+
interval,
|
|
49
42
|
};
|
|
50
43
|
};
|
|
51
44
|
const singleFrom = (allQuery, getMultipleError) => (container, ...args) => {
|
|
@@ -96,7 +89,18 @@ const requireSingle = (query, getMissingError) => (container, ...args) => {
|
|
|
96
89
|
}
|
|
97
90
|
return match;
|
|
98
91
|
};
|
|
99
|
-
|
|
92
|
+
/**
|
|
93
|
+
* Derives the `queryBy`, `getAllBy`, `getBy`, `findAllBy`, and `findBy` variants of a query family
|
|
94
|
+
* from the family's `queryAllBy` function, mirroring DOM Testing Library's `buildQueries`. The family
|
|
95
|
+
* name used when suggesting a better query comes from `queryAllBy.name`.
|
|
96
|
+
*
|
|
97
|
+
* @param queryAllBy Finds every widget the family matches.
|
|
98
|
+
* @param getMultipleError Builds the error thrown when a single-match variant finds more than one widget.
|
|
99
|
+
* @param getMissingError Builds the error thrown when a required match is missing.
|
|
100
|
+
* @returns The five variants, in the order `[queryBy, getAllBy, getBy, findAllBy, findBy]`.
|
|
101
|
+
*/
|
|
102
|
+
const buildQueries = (queryAllBy, getMultipleError, getMissingError) => {
|
|
103
|
+
const queryName = getQueryFamily(queryAllBy);
|
|
100
104
|
const getAllBy = allOrThrow(queryAllBy, getMissingError);
|
|
101
105
|
const getBy = requireSingle(singleFrom(getAllBy, getMultipleError), getMissingError);
|
|
102
106
|
const queryByWithSuggestion = wrapSingleWithSuggestion(singleFrom(queryAllBy, getMultipleError), queryName, "query");
|
|
@@ -114,13 +118,7 @@ const buildQueries = (queryName, queryAllBy, getMultipleError, getMissingError)
|
|
|
114
118
|
};
|
|
115
119
|
const findAllBy = (container, ...args) => waitFor(() => runWithExpensiveErrorDiagnosticsDisabled(() => getAllByWithSuggestion(container, ...args)), findOptions(getAllByWithSuggestion, container, args));
|
|
116
120
|
const findBy = (container, ...args) => waitFor(() => runWithExpensiveErrorDiagnosticsDisabled(() => getByWithSuggestion(container, ...args)), findOptions(getByWithSuggestion, container, args));
|
|
117
|
-
return
|
|
118
|
-
queryBy: queryByWithSuggestion,
|
|
119
|
-
getAllBy: getAllByWithSuggestion,
|
|
120
|
-
getBy: getByWithSuggestion,
|
|
121
|
-
findAllBy,
|
|
122
|
-
findBy,
|
|
123
|
-
};
|
|
121
|
+
return [queryByWithSuggestion, getAllByWithSuggestion, getByWithSuggestion, findAllBy, findBy];
|
|
124
122
|
};
|
|
125
|
-
export { buildQueries };
|
|
123
|
+
export { buildQueries, };
|
|
126
124
|
//# sourceMappingURL=build-queries.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-queries.js","sourceRoot":"","sources":["../src/build-queries.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,wCAAwC,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACxF,OAAO,EAAE,iBAAiB,EAA6B,MAAM,kBAAkB,CAAC;AAChF,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAuBxC,MAAM,qBAAqB,GAAG,CAAC,IAAe,EAAkB,EAAE;IAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEzB,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,YAAY,MAAM,CAAC,EAAE,CAAC;QAChE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,IAAsB,CAAC;QAEhE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAC5C,CAAC;IAED,OAAO,EAAE,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,IAAe,EAAuB,EAAE;IAClE,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEzB,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,YAAY,MAAM,CAAC,EAAE,CAAC;QAChE,OAAQ,IAAuB,CAAC,OAAO,CAAC;IAC5C,CAAC;IAED,OAAO,SAAS,CAAC;AACrB,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,OAM7B,EAAQ,EAAE;IACP,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;IAExE,IAAI,CAAC,CAAC,aAAa,IAAI,SAAS,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACnD,OAAO;IACX,CAAC;IAED,MAAM,UAAU,GAAG,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAErD,IAAI,UAAU,IAAI,UAAU,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACnD,MAAM,eAAe,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,SAAS,CAAC,CAAC;IAC5D,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CACxB,KAAsB,EACtB,SAAoB,EACpB,IAAU,EACV,QAAe,EACV,EAAE;IACP,IAAI,CAAC;QACD,KAAK,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YACzB,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IAED,OAAO,QAAQ,CAAC;AACpB,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAChB,KAAsB,EACtB,SAAoB,EACpB,IAAU,EACI,EAAE;IAChB,MAAM,WAAW,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAEhD,MAAM,SAAS,GACX,WAAW,CAAC,SAAS,IAAI,CAAC,CAAC,QAAe,EAAE,EAAE,CAAC,mBAAmB,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IAE1G,OAAO;QACH,eAAe,EAAE,IAAI,KAAK,CAAC,qBAAqB,CAAC;QACjD,SAAS;QACT,OAAO,EAAE,WAAW,CAAC,OAAO;QAC5B,QAAQ,EAAE,WAAW,CAAC,QAAQ;KACjC,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,UAAU,GACZ,CACI,QAA0B,EAC1B,gBAA4C,EAC3B,EAAE,CACnB,CAAC,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE;IACnB,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC;IAE7C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,gBAAgB,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAC9B,CAAC,CAAC;AAEV,MAAM,UAAU,GACZ,CACI,QAA0B,EAC1B,eAA0C,EAC1B,EAAE,CAClB,CAAC,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE;IACnB,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC;IAE7C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,eAAe,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,OAAO,CAAC;AACnB,CAAC,CAAC;AAEV,MAAM,wBAAwB,GAC1B,CAAyB,KAAwB,EAAE,SAAiB,EAAE,OAAgB,EAAqB,EAAE,CACzG,CAAC,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE;IACnB,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC;IAExC,IAAI,KAAK,EAAE,CAAC;QACR,oBAAoB,CAAC;YACjB,SAAS;YACT,KAAK;YACL,SAAS;YACT,OAAO;YACP,aAAa,EAAE,oBAAoB,CAAC,IAAI,CAAC;SAC5C,CAAC,CAAC;IACP,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC,CAAC;AAEV,MAAM,qBAAqB,GACvB,CAAyB,KAAuB,EAAE,SAAiB,EAAE,OAAgB,EAAoB,EAAE,CACvG,CAAC,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE;IACnB,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC;IAC1C,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC;IAExB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACtB,oBAAoB,CAAC;YACjB,SAAS;YACT,KAAK,EAAE,KAAK;YACZ,SAAS;YACT,OAAO;YACP,aAAa,EAAE,oBAAoB,CAAC,IAAI,CAAC;SAC5C,CAAC,CAAC;IACP,CAAC;IAED,OAAO,OAAO,CAAC;AACnB,CAAC,CAAC;AAEV,MAAM,aAAa,GACf,CAAyB,KAAwB,EAAE,eAA0C,EAAE,EAAE,CAC7F,CAAC,SAAoB,EAAE,GAAG,IAAU,EAAc,EAAE;IAChD,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC;IAExC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACjB,MAAM,eAAe,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC,CAAC;AAEV,MAAM,YAAY,GAAG,CACjB,SAAiB,EACjB,UAA4B,EAC5B,gBAA4C,EAC5C,eAA0C,EACxB,EAAE;IACpB,MAAM,QAAQ,GAAG,UAAU,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;IACzD,MAAM,KAAK,GAAG,aAAa,CAAC,UAAU,CAAC,QAAQ,EAAE,gBAAgB,CAAC,EAAE,eAAe,CAAC,CAAC;IAErF,MAAM,qBAAqB,GAAG,wBAAwB,CAClD,UAAU,CAAC,UAAU,EAAE,gBAAgB,CAAC,EACxC,SAAS,EACT,OAAO,CACV,CAAC;IAEF,MAAM,sBAAsB,GAAG,qBAAqB,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAEpF,MAAM,mBAAmB,GAAwD,CAAC,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE;QACpG,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC;QAExC,oBAAoB,CAAC;YACjB,SAAS;YACT,KAAK;YACL,SAAS;YACT,OAAO,EAAE,KAAK;YACd,aAAa,EAAE,oBAAoB,CAAC,IAAI,CAAC;SAC5C,CAAC,CAAC;QAEH,OAAO,KAAK,CAAC;IACjB,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,CAAC,SAAoB,EAAE,GAAG,IAAU,EAAyB,EAAE,CAC7E,OAAO,CACH,GAAG,EAAE,CAAC,wCAAwC,CAAC,GAAG,EAAE,CAAC,sBAAsB,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC,EAChG,WAAW,CAAC,sBAAsB,EAAE,SAAS,EAAE,IAAI,CAAC,CACvD,CAAC;IAEN,MAAM,MAAM,GAAG,CAAC,SAAoB,EAAE,GAAG,IAAU,EAAuB,EAAE,CACxE,OAAO,CACH,GAAG,EAAE,CAAC,wCAAwC,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC,EAC7F,WAAW,CAAC,mBAAmB,EAAE,SAAS,EAAE,IAAI,CAAC,CACpD,CAAC;IAEN,OAAO;QACH,OAAO,EAAE,qBAAqB;QAC9B,QAAQ,EAAE,sBAAsB;QAChC,KAAK,EAAE,mBAAmB;QAC1B,SAAS;QACT,MAAM;KACT,CAAC;AACN,CAAC,CAAC;AAEF,OAAO,EAAE,YAAY,EAAsC,CAAC","sourcesContent":["import type * as Gtk from \"@gtkx/gi/gtk\";\nimport type { Container } from \"./traversal.js\";\nimport type { MatcherOptions, WaitForOptions } from \"./types.js\";\nimport { getConfig } from \"./config.js\";\nimport { runWithExpensiveErrorDiagnosticsDisabled, suggestionError } from \"./errors.js\";\nimport { getSuggestedQuery, type Method, type Variant } from \"./suggestions.js\";\nimport { waitFor } from \"./wait-for.js\";\n\ntype QueryAllBy<Args extends unknown[]> = (container: Container, ...args: Args) => Gtk.Widget[];\n\ntype MultipleErrorBuilder<Args extends unknown[]> = (\n container: Container,\n matches: Gtk.Widget[],\n ...args: Args\n) => Error;\n\ntype MissingErrorBuilder<Args extends unknown[]> = (container: Container, ...args: Args) => Error;\n\ntype BuiltQueries<Args extends unknown[]> = {\n queryBy: (container: Container, ...args: Args) => Gtk.Widget | null;\n getAllBy: QueryAllBy<Args>;\n getBy: (container: Container, ...args: Args) => Gtk.Widget;\n findAllBy: (container: Container, ...args: Args) => Promise<Gtk.Widget[]>;\n findBy: (container: Container, ...args: Args) => Promise<Gtk.Widget>;\n};\n\ntype FindQuery<Args extends unknown[]> = (container: Container, ...args: Args) => unknown;\ntype SingleQuery<Args extends unknown[]> = (container: Container, ...args: Args) => Gtk.Widget | null;\n\nconst extractWaitForOptions = (args: unknown[]): WaitForOptions => {\n const last = args.at(-1);\n\n if (last && typeof last === \"object\" && !(last instanceof RegExp)) {\n const { timeout, interval, onTimeout } = last as WaitForOptions;\n\n return { timeout, interval, onTimeout };\n }\n\n return {};\n};\n\nconst extractShouldSuggest = (args: unknown[]): boolean | undefined => {\n const last = args.at(-1);\n\n if (last && typeof last === \"object\" && !(last instanceof RegExp)) {\n return (last as MatcherOptions).suggest;\n }\n\n return undefined;\n};\n\nconst maybeThrowSuggestion = (options: {\n container: Container;\n match: Gtk.Widget;\n queryName: Method;\n variant: Variant;\n shouldSuggest: boolean | undefined;\n}): void => {\n const { container, match, queryName, variant, shouldSuggest } = options;\n\n if (!(shouldSuggest ?? getConfig().throwSuggestions)) {\n return;\n }\n\n const suggestion = getSuggestedQuery(match, variant);\n\n if (suggestion && suggestion.queryName !== queryName) {\n throw suggestionError(suggestion.toString(), container);\n }\n};\n\nconst reRunForDiagnostics = <Args extends unknown[]>(\n query: FindQuery<Args>,\n container: Container,\n args: Args,\n fallback: Error,\n): Error => {\n try {\n query(container, ...args);\n } catch (error) {\n if (error instanceof Error) {\n return error;\n }\n }\n\n return fallback;\n};\n\nconst findOptions = <Args extends unknown[]>(\n query: FindQuery<Args>,\n container: Container,\n args: Args,\n): WaitForOptions => {\n const userOptions = extractWaitForOptions(args);\n\n const onTimeout =\n userOptions.onTimeout ?? ((fallback: Error) => reRunForDiagnostics(query, container, args, fallback));\n\n return {\n stackTraceError: new Error(\"STACK_TRACE_MESSAGE\"),\n onTimeout,\n timeout: userOptions.timeout,\n interval: userOptions.interval,\n };\n};\n\nconst singleFrom =\n <Args extends unknown[]>(\n allQuery: QueryAllBy<Args>,\n getMultipleError: MultipleErrorBuilder<Args>,\n ): SingleQuery<Args> =>\n (container, ...args) => {\n const matches = allQuery(container, ...args);\n\n if (matches.length > 1) {\n throw getMultipleError(container, matches, ...args);\n }\n\n return matches[0] ?? null;\n };\n\nconst allOrThrow =\n <Args extends unknown[]>(\n allQuery: QueryAllBy<Args>,\n getMissingError: MissingErrorBuilder<Args>,\n ): QueryAllBy<Args> =>\n (container, ...args) => {\n const matches = allQuery(container, ...args);\n\n if (matches.length === 0) {\n throw getMissingError(container, ...args);\n }\n\n return matches;\n };\n\nconst wrapSingleWithSuggestion =\n <Args extends unknown[]>(query: SingleQuery<Args>, queryName: Method, variant: Variant): SingleQuery<Args> =>\n (container, ...args) => {\n const match = query(container, ...args);\n\n if (match) {\n maybeThrowSuggestion({\n container,\n match,\n queryName,\n variant,\n shouldSuggest: extractShouldSuggest(args),\n });\n }\n\n return match;\n };\n\nconst wrapAllWithSuggestion =\n <Args extends unknown[]>(query: QueryAllBy<Args>, queryName: Method, variant: Variant): QueryAllBy<Args> =>\n (container, ...args) => {\n const matches = query(container, ...args);\n const [first] = matches;\n\n if (first !== undefined) {\n maybeThrowSuggestion({\n container,\n match: first,\n queryName,\n variant,\n shouldSuggest: extractShouldSuggest(args),\n });\n }\n\n return matches;\n };\n\nconst requireSingle =\n <Args extends unknown[]>(query: SingleQuery<Args>, getMissingError: MissingErrorBuilder<Args>) =>\n (container: Container, ...args: Args): Gtk.Widget => {\n const match = query(container, ...args);\n\n if (match === null) {\n throw getMissingError(container, ...args);\n }\n\n return match;\n };\n\nconst buildQueries = <Args extends unknown[]>(\n queryName: Method,\n queryAllBy: QueryAllBy<Args>,\n getMultipleError: MultipleErrorBuilder<Args>,\n getMissingError: MissingErrorBuilder<Args>,\n): BuiltQueries<Args> => {\n const getAllBy = allOrThrow(queryAllBy, getMissingError);\n const getBy = requireSingle(singleFrom(getAllBy, getMultipleError), getMissingError);\n\n const queryByWithSuggestion = wrapSingleWithSuggestion(\n singleFrom(queryAllBy, getMultipleError),\n queryName,\n \"query\",\n );\n\n const getAllByWithSuggestion = wrapAllWithSuggestion(getAllBy, queryName, \"getAll\");\n\n const getByWithSuggestion: (container: Container, ...args: Args) => Gtk.Widget = (container, ...args) => {\n const match = getBy(container, ...args);\n\n maybeThrowSuggestion({\n container,\n match,\n queryName,\n variant: \"get\",\n shouldSuggest: extractShouldSuggest(args),\n });\n\n return match;\n };\n\n const findAllBy = (container: Container, ...args: Args): Promise<Gtk.Widget[]> =>\n waitFor(\n () => runWithExpensiveErrorDiagnosticsDisabled(() => getAllByWithSuggestion(container, ...args)),\n findOptions(getAllByWithSuggestion, container, args),\n );\n\n const findBy = (container: Container, ...args: Args): Promise<Gtk.Widget> =>\n waitFor(\n () => runWithExpensiveErrorDiagnosticsDisabled(() => getByWithSuggestion(container, ...args)),\n findOptions(getByWithSuggestion, container, args),\n );\n\n return {\n queryBy: queryByWithSuggestion,\n getAllBy: getAllByWithSuggestion,\n getBy: getByWithSuggestion,\n findAllBy,\n findBy,\n };\n};\n\nexport { buildQueries, type QueryAllBy, type BuiltQueries };\n"]}
|
|
1
|
+
{"version":3,"file":"build-queries.js","sourceRoot":"","sources":["../src/build-queries.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as Gtk from \"@gtkx/gi/gtk\";\nimport type { Container } from \"./traversal.js\";\nimport type { MatcherOptions, WaitForOptions } from \"./types.js\";\nimport { getConfig } from \"./config.js\";\nimport { runWithExpensiveErrorDiagnosticsDisabled, suggestionError } from \"./errors.js\";\nimport { getSuggestedQuery, type Variant } from \"./suggestions.js\";\nimport { waitFor } from \"./wait-for.js\";\n\n/**\n * The `queryAllBy` function a query family is built from, taking the scope to search followed by the\n * family's own matcher arguments. Its name determines the family name, so `queryAllByTestId` builds\n * a `TestId` family.\n */\ntype QueryAllBy<Args extends unknown[]> = (container: Container, ...args: Args) => Gtk.Widget[];\n\n/** Builds the error thrown when a single-match query finds more than one widget. */\ntype MultipleErrorBuilder<Args extends unknown[]> = (\n container: Container,\n matches: Gtk.Widget[],\n ...args: Args\n) => Error;\n\n/** Builds the error thrown when a query that requires a match finds none. */\ntype MissingErrorBuilder<Args extends unknown[]> = (container: Container, ...args: Args) => Error;\n\n/** The variants derived from one `queryAllBy` function, in the order DOM Testing Library returns them. */\ntype BuiltQueries<Args extends unknown[]> = [\n queryBy: (container: Container, ...args: Args) => Gtk.Widget | null,\n getAllBy: QueryAllBy<Args>,\n getBy: (container: Container, ...args: Args) => Gtk.Widget,\n findAllBy: (container: Container, ...args: Args) => Promise<Gtk.Widget[]>,\n findBy: (container: Container, ...args: Args) => Promise<Gtk.Widget>,\n];\n\ntype FindQuery<Args extends unknown[]> = (container: Container, ...args: Args) => unknown;\ntype SingleQuery<Args extends unknown[]> = (container: Container, ...args: Args) => Gtk.Widget | null;\n\nconst getTrailingOptions = (args: unknown[]): MatcherOptions | undefined => {\n const last = args.at(-1);\n\n if (last && typeof last === \"object\" && !(last instanceof RegExp)) {\n return last;\n }\n\n return undefined;\n};\n\nconst extractShouldSuggest = (args: unknown[]): boolean | undefined => getTrailingOptions(args)?.suggest;\nconst getQueryFamily = (queryAllBy: { name: string }): string => queryAllBy.name.replace(/^queryAllBy/, \"\");\n\nconst maybeThrowSuggestion = (options: {\n container: Container;\n match: Gtk.Widget;\n queryName: string;\n variant: Variant;\n shouldSuggest: boolean | undefined;\n}): void => {\n const { container, match, queryName, variant, shouldSuggest } = options;\n\n if (!(shouldSuggest ?? getConfig().throwSuggestions)) {\n return;\n }\n\n const suggestion = getSuggestedQuery(match, variant);\n\n if (suggestion && suggestion.queryName !== queryName) {\n throw suggestionError(suggestion.toString(), container);\n }\n};\n\nconst reRunForDiagnostics = <Args extends unknown[]>(\n query: FindQuery<Args>,\n container: Container,\n args: Args,\n fallback: Error,\n): Error => {\n try {\n query(container, ...args);\n } catch (error) {\n if (error instanceof Error) {\n return error;\n }\n }\n\n return fallback;\n};\n\nconst findOptions = <Args extends unknown[]>(\n query: FindQuery<Args>,\n container: Container,\n args: Args,\n): WaitForOptions => {\n const { timeout, interval, onTimeout } = getTrailingOptions(args) ?? {};\n\n return {\n stackTraceError: new Error(\"STACK_TRACE_MESSAGE\"),\n onTimeout: onTimeout ?? ((fallback: Error) => reRunForDiagnostics(query, container, args, fallback)),\n timeout,\n interval,\n };\n};\n\nconst singleFrom =\n <Args extends unknown[]>(\n allQuery: QueryAllBy<Args>,\n getMultipleError: MultipleErrorBuilder<Args>,\n ): SingleQuery<Args> =>\n (container, ...args) => {\n const matches = allQuery(container, ...args);\n\n if (matches.length > 1) {\n throw getMultipleError(container, matches, ...args);\n }\n\n return matches[0] ?? null;\n };\n\nconst allOrThrow =\n <Args extends unknown[]>(\n allQuery: QueryAllBy<Args>,\n getMissingError: MissingErrorBuilder<Args>,\n ): QueryAllBy<Args> =>\n (container, ...args) => {\n const matches = allQuery(container, ...args);\n\n if (matches.length === 0) {\n throw getMissingError(container, ...args);\n }\n\n return matches;\n };\n\nconst wrapSingleWithSuggestion =\n <Args extends unknown[]>(query: SingleQuery<Args>, queryName: string, variant: Variant): SingleQuery<Args> =>\n (container, ...args) => {\n const match = query(container, ...args);\n\n if (match) {\n maybeThrowSuggestion({\n container,\n match,\n queryName,\n variant,\n shouldSuggest: extractShouldSuggest(args),\n });\n }\n\n return match;\n };\n\nconst wrapAllWithSuggestion =\n <Args extends unknown[]>(query: QueryAllBy<Args>, queryName: string, variant: Variant): QueryAllBy<Args> =>\n (container, ...args) => {\n const matches = query(container, ...args);\n const [first] = matches;\n\n if (first !== undefined) {\n maybeThrowSuggestion({\n container,\n match: first,\n queryName,\n variant,\n shouldSuggest: extractShouldSuggest(args),\n });\n }\n\n return matches;\n };\n\nconst requireSingle =\n <Args extends unknown[]>(query: SingleQuery<Args>, getMissingError: MissingErrorBuilder<Args>) =>\n (container: Container, ...args: Args): Gtk.Widget => {\n const match = query(container, ...args);\n\n if (match === null) {\n throw getMissingError(container, ...args);\n }\n\n return match;\n };\n\n/**\n * Derives the `queryBy`, `getAllBy`, `getBy`, `findAllBy`, and `findBy` variants of a query family\n * from the family's `queryAllBy` function, mirroring DOM Testing Library's `buildQueries`. The family\n * name used when suggesting a better query comes from `queryAllBy.name`.\n *\n * @param queryAllBy Finds every widget the family matches.\n * @param getMultipleError Builds the error thrown when a single-match variant finds more than one widget.\n * @param getMissingError Builds the error thrown when a required match is missing.\n * @returns The five variants, in the order `[queryBy, getAllBy, getBy, findAllBy, findBy]`.\n */\nconst buildQueries = <Args extends unknown[]>(\n queryAllBy: QueryAllBy<Args>,\n getMultipleError: MultipleErrorBuilder<Args>,\n getMissingError: MissingErrorBuilder<Args>,\n): BuiltQueries<Args> => {\n const queryName = getQueryFamily(queryAllBy);\n const getAllBy = allOrThrow(queryAllBy, getMissingError);\n const getBy = requireSingle(singleFrom(getAllBy, getMultipleError), getMissingError);\n\n const queryByWithSuggestion = wrapSingleWithSuggestion(\n singleFrom(queryAllBy, getMultipleError),\n queryName,\n \"query\",\n );\n\n const getAllByWithSuggestion = wrapAllWithSuggestion(getAllBy, queryName, \"getAll\");\n\n const getByWithSuggestion: (container: Container, ...args: Args) => Gtk.Widget = (container, ...args) => {\n const match = getBy(container, ...args);\n\n maybeThrowSuggestion({\n container,\n match,\n queryName,\n variant: \"get\",\n shouldSuggest: extractShouldSuggest(args),\n });\n\n return match;\n };\n\n const findAllBy = (container: Container, ...args: Args): Promise<Gtk.Widget[]> =>\n waitFor(\n () => runWithExpensiveErrorDiagnosticsDisabled(() => getAllByWithSuggestion(container, ...args)),\n findOptions(getAllByWithSuggestion, container, args),\n );\n\n const findBy = (container: Container, ...args: Args): Promise<Gtk.Widget> =>\n waitFor(\n () => runWithExpensiveErrorDiagnosticsDisabled(() => getByWithSuggestion(container, ...args)),\n findOptions(getByWithSuggestion, container, args),\n );\n\n return [queryByWithSuggestion, getAllByWithSuggestion, getByWithSuggestion, findAllBy, findBy];\n};\n\nexport {\n buildQueries,\n type BuiltQueries,\n type MissingErrorBuilder,\n type MultipleErrorBuilder,\n type QueryAllBy,\n};\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
type CleanupFunction = () => void | Promise<void>;
|
|
2
2
|
declare const addToCleanupQueue: (fn: CleanupFunction) => void;
|
|
3
3
|
declare const runCleanup: () => Promise<void>;
|
|
4
|
-
export { addToCleanupQueue, runCleanup
|
|
4
|
+
export { addToCleanupQueue, runCleanup };
|
|
5
5
|
//# sourceMappingURL=cleanup-registry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cleanup-registry.d.ts","sourceRoot":"","sources":["../src/cleanup-registry.ts"],"names":[],"mappings":"AAAA,KAAK,eAAe,GAAG,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAIlD,QAAA,MAAM,iBAAiB,GAAI,IAAI,eAAe,KAAG,IAEhD,CAAC;AAEF,QAAA,MAAM,UAAU,QAAa,OAAO,CAAC,IAAI,CAgBxC,CAAC;AAEF,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"cleanup-registry.d.ts","sourceRoot":"","sources":["../src/cleanup-registry.ts"],"names":[],"mappings":"AAAA,KAAK,eAAe,GAAG,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAIlD,QAAA,MAAM,iBAAiB,GAAI,IAAI,eAAe,KAAG,IAEhD,CAAC;AAEF,QAAA,MAAM,UAAU,QAAa,OAAO,CAAC,IAAI,CAgBxC,CAAC;AAEF,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cleanup-registry.js","sourceRoot":"","sources":["../src/cleanup-registry.ts"],"names":[],"mappings":"AAEA,MAAM,YAAY,GAAyB,IAAI,GAAG,EAAE,CAAC;AAErD,MAAM,iBAAiB,GAAG,CAAC,EAAmB,EAAQ,EAAE;IACpD,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACzB,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,KAAK,IAAmB,EAAE;IACzC,MAAM,QAAQ,GAAc,EAAE,CAAC;IAE/B,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;QAC5B,IAAI,CAAC;YACD,MAAM,EAAE,EAAE,CAAC;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;IACL,CAAC;IAED,YAAY,CAAC,KAAK,EAAE,CAAC;IAErB,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,cAAc,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;IACzD,CAAC;AACL,CAAC,CAAC;AAEF,OAAO,EAAE,iBAAiB,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"cleanup-registry.js","sourceRoot":"","sources":["../src/cleanup-registry.ts"],"names":[],"mappings":"AAEA,MAAM,YAAY,GAAyB,IAAI,GAAG,EAAE,CAAC;AAErD,MAAM,iBAAiB,GAAG,CAAC,EAAmB,EAAQ,EAAE;IACpD,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACzB,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,KAAK,IAAmB,EAAE;IACzC,MAAM,QAAQ,GAAc,EAAE,CAAC;IAE/B,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;QAC5B,IAAI,CAAC;YACD,MAAM,EAAE,EAAE,CAAC;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;IACL,CAAC;IAED,YAAY,CAAC,KAAK,EAAE,CAAC;IAErB,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,cAAc,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;IACzD,CAAC;AACL,CAAC,CAAC;AAEF,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,CAAC","sourcesContent":["type CleanupFunction = () => void | Promise<void>;\n\nconst cleanupQueue: Set<CleanupFunction> = new Set();\n\nconst addToCleanupQueue = (fn: CleanupFunction): void => {\n cleanupQueue.add(fn);\n};\n\nconst runCleanup = async (): Promise<void> => {\n const failures: unknown[] = [];\n\n for (const fn of cleanupQueue) {\n try {\n await fn();\n } catch (error) {\n failures.push(error);\n }\n }\n\n cleanupQueue.clear();\n\n if (failures.length > 0) {\n throw new AggregateError(failures, \"Cleanup failed\");\n }\n};\n\nexport { addToCleanupQueue, runCleanup };\n"]}
|
package/dist/errors.d.ts
CHANGED
|
@@ -22,9 +22,18 @@ type QueryDescriptor = {
|
|
|
22
22
|
value: Matcher;
|
|
23
23
|
};
|
|
24
24
|
declare const runWithExpensiveErrorDiagnosticsDisabled: <T>(callback: () => T) => T;
|
|
25
|
+
/**
|
|
26
|
+
* Builds the error a failing query throws, appending the container's widget tree to the message the
|
|
27
|
+
* way the built-in queries do.
|
|
28
|
+
*
|
|
29
|
+
* @param message The failure message.
|
|
30
|
+
* @param container The scope whose widget tree is appended; omitted, only the message is used.
|
|
31
|
+
* @returns The error produced by the configured `getElementError`.
|
|
32
|
+
*/
|
|
33
|
+
declare const getElementError: (message: string, container?: Container) => Error;
|
|
25
34
|
declare const notFoundError: (container: Container, descriptor: QueryDescriptor) => Error;
|
|
26
35
|
declare const multipleFoundError: (container: Container, descriptor: QueryDescriptor, matches: Gtk.Widget[]) => Error;
|
|
27
36
|
declare const suggestionError: (suggestion: string, container: Container) => Error;
|
|
28
37
|
declare const timeoutError: (timeout: number, lastError: Error | null) => Error;
|
|
29
|
-
export { runWithExpensiveErrorDiagnosticsDisabled, notFoundError, multipleFoundError, suggestionError, timeoutError,
|
|
38
|
+
export { runWithExpensiveErrorDiagnosticsDisabled, getElementError, notFoundError, multipleFoundError, suggestionError, timeoutError, };
|
|
30
39
|
//# sourceMappingURL=errors.d.ts.map
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAe,OAAO,EAAE,MAAM,YAAY,CAAC;AAKtE,KAAK,eAAe,GACd;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,GAAG,CAAC,cAAc,CAAC;IAAC,OAAO,CAAC,EAAE,aAAa,GAAG,SAAS,CAAA;CAAE,GACtF;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GACpC;IAAE,SAAS,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GACzC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GACpC;IAAE,SAAS,EAAE,iBAAiB,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAC/C;IAAE,SAAS,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC;AAkGlD,QAAA,MAAM,wCAAwC,GAAI,CAAC,EAAE,UAAU,MAAM,CAAC,KAAG,CASxE,CAAC;AAYF,QAAA,MAAM,aAAa,GAAI,WAAW,SAAS,EAAE,YAAY,eAAe,KAAG,KAS1E,CAAC;AAWF,QAAA,MAAM,kBAAkB,GAAI,WAAW,SAAS,EAAE,YAAY,eAAe,EAAE,SAAS,GAAG,CAAC,MAAM,EAAE,KAAG,KAetG,CAAC;AAEF,QAAA,MAAM,eAAe,GAAI,YAAY,MAAM,EAAE,WAAW,SAAS,KAAG,KAKnE,CAAC;AAEF,QAAA,MAAM,YAAY,GAAI,SAAS,MAAM,EAAE,WAAW,KAAK,GAAG,IAAI,KAAG,KAKhE,CAAC;AAEF,OAAO,EACH,wCAAwC,EACxC,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,YAAY,
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAe,OAAO,EAAE,MAAM,YAAY,CAAC;AAKtE,KAAK,eAAe,GACd;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,GAAG,CAAC,cAAc,CAAC;IAAC,OAAO,CAAC,EAAE,aAAa,GAAG,SAAS,CAAA;CAAE,GACtF;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GACpC;IAAE,SAAS,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GACzC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GACpC;IAAE,SAAS,EAAE,iBAAiB,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAC/C;IAAE,SAAS,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC;AAkGlD,QAAA,MAAM,wCAAwC,GAAI,CAAC,EAAE,UAAU,MAAM,CAAC,KAAG,CASxE,CAAC;AAYF;;;;;;;GAOG;AACH,QAAA,MAAM,eAAe,GAAI,SAAS,MAAM,EAAE,YAAY,SAAS,KAAG,KAC0C,CAAC;AAE7G,QAAA,MAAM,aAAa,GAAI,WAAW,SAAS,EAAE,YAAY,eAAe,KAAG,KAS1E,CAAC;AAWF,QAAA,MAAM,kBAAkB,GAAI,WAAW,SAAS,EAAE,YAAY,eAAe,EAAE,SAAS,GAAG,CAAC,MAAM,EAAE,KAAG,KAetG,CAAC;AAEF,QAAA,MAAM,eAAe,GAAI,YAAY,MAAM,EAAE,WAAW,SAAS,KAAG,KAKnE,CAAC;AAEF,QAAA,MAAM,YAAY,GAAI,SAAS,MAAM,EAAE,WAAW,KAAK,GAAG,IAAI,KAAG,KAKhE,CAAC;AAEF,OAAO,EACH,wCAAwC,EACxC,eAAe,EACf,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,YAAY,GACf,CAAC"}
|
package/dist/errors.js
CHANGED
|
@@ -95,6 +95,15 @@ const buildElementError = (container, headLines) => {
|
|
|
95
95
|
: [...headLines, "", prettyWidget(container, { shouldHighlight: false })];
|
|
96
96
|
return config.getElementError(lines.join("\n"), container);
|
|
97
97
|
};
|
|
98
|
+
/**
|
|
99
|
+
* Builds the error a failing query throws, appending the container's widget tree to the message the
|
|
100
|
+
* way the built-in queries do.
|
|
101
|
+
*
|
|
102
|
+
* @param message The failure message.
|
|
103
|
+
* @param container The scope whose widget tree is appended; omitted, only the message is used.
|
|
104
|
+
* @returns The error produced by the configured `getElementError`.
|
|
105
|
+
*/
|
|
106
|
+
const getElementError = (message, container) => container === undefined ? getConfig().getElementError(message) : buildElementError(container, [message]);
|
|
98
107
|
const notFoundError = (container, descriptor) => {
|
|
99
108
|
const description = formatQueryDescription(descriptor);
|
|
100
109
|
const headLines = [`Unable to find an element with ${description}`];
|
|
@@ -131,5 +140,5 @@ const timeoutError = (timeout, lastError) => {
|
|
|
131
140
|
const message = lastError ? `${baseMessage}.\n\n${lastError.message}` : baseMessage;
|
|
132
141
|
return getConfig().getElementError(message);
|
|
133
142
|
};
|
|
134
|
-
export { runWithExpensiveErrorDiagnosticsDisabled, notFoundError, multipleFoundError, suggestionError, timeoutError, };
|
|
143
|
+
export { runWithExpensiveErrorDiagnosticsDisabled, getElementError, notFoundError, multipleFoundError, suggestionError, timeoutError, };
|
|
135
144
|
//# sourceMappingURL=errors.js.map
|