@gtkx/testing 1.0.0-rc.3 → 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 +8 -9
- 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/act.d.ts +2 -0
- package/dist/act.d.ts.map +1 -1
- package/dist/act.js.map +1 -1
- package/dist/build-queries.d.ts +27 -10
- package/dist/build-queries.d.ts.map +1 -1
- package/dist/build-queries.js +39 -30
- 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/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +3 -3
- package/dist/config.js.map +1 -1
- package/dist/errors.d.ts +10 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +12 -3
- 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 +125 -39
- 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 +7 -3
- package/dist/pretty-widget.d.ts.map +1 -1
- package/dist/pretty-widget.js +74 -57
- 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 +99 -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 +13 -11
- 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/suggestions.d.ts +3 -0
- package/dist/suggestions.d.ts.map +1 -1
- package/dist/suggestions.js.map +1 -1
- package/dist/traversal.d.ts +9 -1
- package/dist/traversal.d.ts.map +1 -1
- package/dist/traversal.js +26 -6
- package/dist/traversal.js.map +1 -1
- package/dist/types.d.ts +67 -17
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/user-event/adjustment.d.ts +16 -0
- package/dist/user-event/adjustment.d.ts.map +1 -1
- package/dist/user-event/adjustment.js +34 -2
- package/dist/user-event/adjustment.js.map +1 -1
- package/dist/user-event/click.d.ts +45 -3
- package/dist/user-event/click.d.ts.map +1 -1
- package/dist/user-event/click.js +177 -39
- 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/controller.d.ts +29 -0
- package/dist/user-event/controller.d.ts.map +1 -1
- package/dist/user-event/controller.js +28 -0
- package/dist/user-event/controller.js.map +1 -1
- 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/gesture.d.ts +51 -0
- package/dist/user-event/gesture.d.ts.map +1 -1
- package/dist/user-event/gesture.js +47 -4
- package/dist/user-event/gesture.js.map +1 -1
- package/dist/user-event/index.d.ts +70 -2
- 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 +4 -2
- package/dist/user-event/keyboard.d.ts.map +1 -1
- package/dist/user-event/keyboard.js +46 -16
- 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 +37 -13
- package/dist/user-event/pointer.js.map +1 -1
- package/dist/user-event/selection.d.ts +18 -0
- package/dist/user-event/selection.d.ts.map +1 -1
- package/dist/user-event/selection.js +56 -30
- package/dist/user-event/selection.js.map +1 -1
- package/dist/user-event/state.d.ts +1 -1
- package/dist/user-event/state.d.ts.map +1 -1
- package/dist/user-event/state.js +1 -1
- package/dist/user-event/state.js.map +1 -1
- package/dist/user-event/text.d.ts +34 -3
- package/dist/user-event/text.d.ts.map +1 -1
- package/dist/user-event/text.js +94 -17
- package/dist/user-event/text.js.map +1 -1
- package/dist/wait-for.d.ts +2 -0
- package/dist/wait-for.d.ts.map +1 -1
- package/dist/wait-for.js.map +1 -1
- package/dist/widget-accessible-properties.d.ts +14 -10
- package/dist/widget-accessible-properties.d.ts.map +1 -1
- package/dist/widget-accessible-properties.js +135 -173
- 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 +13 -8
- package/src/accessible-native.ts +333 -0
- package/src/act.ts +2 -0
- package/src/build-queries.ts +66 -48
- package/src/cleanup-registry.ts +1 -1
- package/src/config.ts +4 -3
- package/src/errors.ts +14 -3
- 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 +466 -64
- package/src/pretty-format.ts +1 -0
- package/src/pretty-widget.ts +100 -72
- package/src/production.ts +52 -0
- package/src/queries.ts +128 -89
- package/src/query-helpers.ts +97 -0
- package/src/render-children.ts +25 -0
- package/src/render.tsx +18 -13
- package/src/role-helpers.ts +14 -4
- package/src/role-naming.ts +99 -0
- package/src/screenshot.ts +272 -103
- package/src/suggestions.ts +3 -0
- package/src/traversal.ts +49 -6
- package/src/types.ts +69 -19
- package/src/user-event/adjustment.ts +42 -2
- package/src/user-event/click.ts +248 -46
- package/src/user-event/column-header-click.ts +90 -0
- package/src/user-event/controller.ts +29 -0
- package/src/user-event/event-wrapper.ts +3 -1
- package/src/user-event/gesture.ts +57 -6
- package/src/user-event/index.ts +119 -29
- package/src/user-event/indexed-children.ts +75 -0
- package/src/user-event/keyboard.ts +70 -20
- 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 +52 -13
- package/src/user-event/selection.ts +74 -33
- package/src/user-event/state.ts +2 -2
- package/src/user-event/text.ts +121 -23
- package/src/wait-for.ts +2 -0
- package/src/widget-accessible-properties.ts +183 -214
- package/src/widget-getters.ts +32 -0
- package/src/within.ts +3 -2
package/README.md
CHANGED
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
|
|
7
7
|
<p align="center">
|
|
8
8
|
The React framework for Linux.<br />
|
|
9
|
-
|
|
9
|
+
Write native Linux applications with React and TypeScript.
|
|
10
|
+
Built on the GNOME stack and standard web tooling.
|
|
10
11
|
</p>
|
|
11
12
|
|
|
12
13
|
<p align="center">
|
|
@@ -20,15 +21,13 @@
|
|
|
20
21
|
|
|
21
22
|
<p align="center">
|
|
22
23
|
<a href="https://gtkx.dev">Homepage</a> ·
|
|
23
|
-
<a href="https://gtkx.dev/guide/
|
|
24
|
+
<a href="https://gtkx.dev/guide/getting-started">Documentation</a> ·
|
|
24
25
|
<a href="https://github.com/gtkx-org/gtkx/tree/main/examples">Examples</a> ·
|
|
25
26
|
<a href="https://github.com/gtkx-org/gtkx/blob/main/CONTRIBUTING.md">Contributing</a>
|
|
26
27
|
</p>
|
|
27
28
|
|
|
28
29
|
---
|
|
29
30
|
|
|
30
|
-
GTKX generates fully typed bindings for the entire GTK4 and Adwaita surface directly from GObject-Introspection. On top of those bindings you get the React programming model: components and hooks driving GObject instances, with Fast Refresh while you develop.
|
|
31
|
-
|
|
32
31
|
<p align="center">
|
|
33
32
|
<img src="https://raw.githubusercontent.com/gtkx-org/gtkx/main/examples/tutorial/assets/screenshot.png" alt="The Tasks app: an Adwaita window with a sidebar of smart views and colored lists on the left, and a boxed task list on the right." />
|
|
34
33
|
</p>
|
|
@@ -109,7 +108,7 @@ React Native and similar frameworks hide the native toolkit so one API can run e
|
|
|
109
108
|
|
|
110
109
|
### Why Node.js, and why generated bindings
|
|
111
110
|
|
|
112
|
-
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 [
|
|
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.
|
|
113
112
|
|
|
114
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.
|
|
115
114
|
|
|
@@ -122,10 +121,10 @@ GTKX is Linux-only and needs Node.js 24 or later. See [Requirements](#requiremen
|
|
|
122
121
|
Scaffold a new app with the `create-gtkx` initializer:
|
|
123
122
|
|
|
124
123
|
```sh
|
|
125
|
-
npm create gtkx
|
|
124
|
+
npm create gtkx
|
|
126
125
|
```
|
|
127
126
|
|
|
128
|
-
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`.
|
|
129
128
|
|
|
130
129
|
Then run your new app:
|
|
131
130
|
|
|
@@ -146,7 +145,7 @@ The documentation at **[gtkx.dev](https://gtkx.dev)** includes a step-by-step tu
|
|
|
146
145
|
|
|
147
146
|
GTKX is Linux-only. You need:
|
|
148
147
|
|
|
149
|
-
- 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`
|
|
150
149
|
- Node.js 24 or later
|
|
151
150
|
|
|
152
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.
|
|
@@ -162,7 +161,7 @@ Explore the [example apps](https://github.com/gtkx-org/gtkx/tree/main/examples):
|
|
|
162
161
|
|
|
163
162
|
## Status
|
|
164
163
|
|
|
165
|
-
GTKX 1.0 is
|
|
164
|
+
GTKX 1.0 is released.
|
|
166
165
|
|
|
167
166
|
## Contributing
|
|
168
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/act.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
declare global {
|
|
2
2
|
var IS_REACT_ACT_ENVIRONMENT: boolean | undefined;
|
|
3
3
|
}
|
|
4
|
+
/** Work run inside the act environment, either synchronous or asynchronous. */
|
|
4
5
|
type ActCallback<T> = () => T | PromiseLike<T>;
|
|
6
|
+
/** Runs a callback inside React's act environment and settles with its result once updates flush. */
|
|
5
7
|
type ActImplementation = <T>(callback: ActCallback<T>) => PromiseLike<T>;
|
|
6
8
|
/**
|
|
7
9
|
* Runs a callback inside React's act environment, flushing pending state
|
package/dist/act.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"act.d.ts","sourceRoot":"","sources":["../src/act.ts"],"names":[],"mappings":"AAEA,OAAO,CAAC,MAAM,CAAC;IACX,IAAI,wBAAwB,EAAE,OAAO,GAAG,SAAS,CAAC;CACrD;AAED,KAAK,WAAW,CAAC,CAAC,IAAI,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;AAC/C,KAAK,iBAAiB,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC;AAGzE;;;;;;GAMG;AACH,QAAA,MAAM,GAAG,EAAE,iBAA+D,CAAC;AAU3E,QAAA,MAAM,wBAAwB,QAAO,OAAO,GAAG,SAAqD,CAAC;AAErG,QAAA,MAAM,wBAAwB,GAAI,OAAO,OAAO,GAAG,SAAS,KAAG,IAE9D,CAAC;AAaF,QAAA,MAAM,qBAAqB,GAAI,CAAC,EAAE,UAAU,OAAO,EAAE,IAAI,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,KAAG,OAAO,CAAC,CAAC,CAkB5F,CAAC;AAUF,QAAA,MAAM,QAAQ,GAAU,UAAU,MAAM,OAAO,KAAG,OAAO,CAAC,IAAI,CAE7D,CAAC;AAEF,OAAO,EAAE,GAAG,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,QAAQ,EAAE,CAAC"}
|
|
1
|
+
{"version":3,"file":"act.d.ts","sourceRoot":"","sources":["../src/act.ts"],"names":[],"mappings":"AAEA,OAAO,CAAC,MAAM,CAAC;IACX,IAAI,wBAAwB,EAAE,OAAO,GAAG,SAAS,CAAC;CACrD;AAED,+EAA+E;AAC/E,KAAK,WAAW,CAAC,CAAC,IAAI,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;AAC/C,qGAAqG;AACrG,KAAK,iBAAiB,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC;AAGzE;;;;;;GAMG;AACH,QAAA,MAAM,GAAG,EAAE,iBAA+D,CAAC;AAU3E,QAAA,MAAM,wBAAwB,QAAO,OAAO,GAAG,SAAqD,CAAC;AAErG,QAAA,MAAM,wBAAwB,GAAI,OAAO,OAAO,GAAG,SAAS,KAAG,IAE9D,CAAC;AAaF,QAAA,MAAM,qBAAqB,GAAI,CAAC,EAAE,UAAU,OAAO,EAAE,IAAI,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,KAAG,OAAO,CAAC,CAAC,CAkB5F,CAAC;AAUF,QAAA,MAAM,QAAQ,GAAU,UAAU,MAAM,OAAO,KAAG,OAAO,CAAC,IAAI,CAE7D,CAAC;AAEF,OAAO,EAAE,GAAG,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,QAAQ,EAAE,CAAC"}
|
package/dist/act.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"act.js","sourceRoot":"","sources":["../src/act.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,IAAI,QAAQ,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"act.js","sourceRoot":"","sources":["../src/act.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,IAAI,QAAQ,EAAE,MAAM,OAAO,CAAC;AAWxC,MAAM,iBAAiB,GAAsB,QAAQ,CAAC;AACtD;;;;;;GAMG;AACH,MAAM,GAAG,GAAsB,wBAAwB,CAAC,iBAAiB,CAAC,CAAC;AAE3E,MAAM,aAAa,GAAG,GAAsB,EAAE;IAC1C,IAAI,OAAO,UAAU,KAAK,WAAW,EAAE,CAAC;QACpC,OAAO,UAAU,CAAC;IACtB,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;AACtD,CAAC,CAAC;AAEF,MAAM,wBAAwB,GAAG,GAAwB,EAAE,CAAC,aAAa,EAAE,CAAC,wBAAwB,CAAC;AAErG,MAAM,wBAAwB,GAAG,CAAC,KAA0B,EAAQ,EAAE;IAClE,aAAa,EAAE,CAAC,wBAAwB,GAAG,KAAK,CAAC;AACrD,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAI,KAAc,EAA2B,EAAE,CAC9D,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAQ,KAAwB,CAAC,IAAI,KAAK,UAAU,CAAC;AAExG,MAAM,YAAY,GAAG,KAAK,EAAK,MAAsB,EAAE,QAA6B,EAAc,EAAE;IAChG,IAAI,CAAC;QACD,OAAO,MAAM,MAAM,CAAC;IACxB,CAAC;YAAS,CAAC;QACP,wBAAwB,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAAI,QAAiB,EAAE,EAA4B,EAAc,EAAE;IAC7F,MAAM,sBAAsB,GAAG,wBAAwB,EAAE,CAAC;IAC1D,wBAAwB,CAAC,QAAQ,CAAC,CAAC;IAEnC,IAAI,CAAC;QACD,MAAM,MAAM,GAAuB,EAAE,EAAE,CAAC;QAExC,IAAI,UAAU,CAAI,MAAM,CAAC,EAAE,CAAC;YACxB,OAAO,YAAY,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;QACxD,CAAC;QAED,wBAAwB,CAAC,sBAAsB,CAAC,CAAC;QAEjD,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,wBAAwB,CAAC,sBAAsB,CAAC,CAAC;QACjD,MAAM,KAAK,CAAC;IAChB,CAAC;AACL,CAAC,CAAC;AAEF,SAAS,wBAAwB,CAAC,iBAAoC;IAClE,OAAO,CAAI,QAAwB,EAAkB,EAAE;QACnD,MAAM,OAAO,GAAG,qBAAqB,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAEvF,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,QAAQ,GAAG,KAAK,EAAE,QAAuB,EAAiB,EAAE;IAC9D,MAAM,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;AAChC,CAAC,CAAC;AAEF,OAAO,EAAE,GAAG,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,QAAQ,EAAE,CAAC","sourcesContent":["import { act as reactAct } from \"react\";\n\ndeclare global {\n var IS_REACT_ACT_ENVIRONMENT: boolean | undefined;\n}\n\n/** Work run inside the act environment, either synchronous or asynchronous. */\ntype ActCallback<T> = () => T | PromiseLike<T>;\n/** Runs a callback inside React's act environment and settles with its result once updates flush. */\ntype ActImplementation = <T>(callback: ActCallback<T>) => PromiseLike<T>;\n\nconst actImplementation: ActImplementation = reactAct;\n/**\n * Runs a callback inside React's act environment, flushing pending state\n * updates and effects, and resolves once the work has settled.\n *\n * @param callback Work to run within the act environment.\n * @returns A promise that resolves with the callback's result after updates flush.\n */\nconst act: ActImplementation = withGlobalActEnvironment(actImplementation);\n\nconst getGlobalThis = (): typeof globalThis => {\n if (typeof globalThis !== \"undefined\") {\n return globalThis;\n }\n\n throw new Error(\"unable to locate global object\");\n};\n\nconst getIsReactActEnvironment = (): boolean | undefined => getGlobalThis().IS_REACT_ACT_ENVIRONMENT;\n\nconst setIsReactActEnvironment = (value: boolean | undefined): void => {\n getGlobalThis().IS_REACT_ACT_ENVIRONMENT = value;\n};\n\nconst isThenable = <T>(value: unknown): value is PromiseLike<T> =>\n value !== null && typeof value === \"object\" && typeof (value as PromiseLike<T>).then === \"function\";\n\nconst restoreAfter = async <T>(result: PromiseLike<T>, previous: boolean | undefined): Promise<T> => {\n try {\n return await result;\n } finally {\n setIsReactActEnvironment(previous);\n }\n};\n\nconst runWithActEnvironment = <T>(isForced: boolean, fn: () => T | PromiseLike<T>): Promise<T> => {\n const previousActEnvironment = getIsReactActEnvironment();\n setIsReactActEnvironment(isForced);\n\n try {\n const result: T | PromiseLike<T> = fn();\n\n if (isThenable<T>(result)) {\n return restoreAfter(result, previousActEnvironment);\n }\n\n setIsReactActEnvironment(previousActEnvironment);\n\n return Promise.resolve(result);\n } catch (error) {\n setIsReactActEnvironment(previousActEnvironment);\n throw error;\n }\n};\n\nfunction withGlobalActEnvironment(actImplementation: ActImplementation): ActImplementation {\n return <T>(callback: ActCallback<T>): PromiseLike<T> => {\n const settled = runWithActEnvironment(true, () => actImplementation(() => callback()));\n\n return Promise.resolve(settled);\n };\n}\n\nconst runInAct = async (callback: () => unknown): Promise<void> => {\n await act(() => callback());\n};\n\nexport { act, getIsReactActEnvironment, setIsReactActEnvironment, runWithActEnvironment, runInAct };\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,25 +2,18 @@ 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 extractSuggestOption = (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
|
-
const { container, match, queryName, variant,
|
|
22
|
-
|
|
23
|
-
if (!shouldSuggest) {
|
|
15
|
+
const { container, match, queryName, variant, shouldSuggest } = options;
|
|
16
|
+
if (!(shouldSuggest ?? getConfig().throwSuggestions)) {
|
|
24
17
|
return;
|
|
25
18
|
}
|
|
26
19
|
const suggestion = getSuggestedQuery(match, variant);
|
|
@@ -40,13 +33,12 @@ const reRunForDiagnostics = (query, container, args, fallback) => {
|
|
|
40
33
|
return fallback;
|
|
41
34
|
};
|
|
42
35
|
const findOptions = (query, container, args) => {
|
|
43
|
-
const
|
|
44
|
-
const onTimeout = userOptions.onTimeout ?? ((fallback) => reRunForDiagnostics(query, container, args, fallback));
|
|
36
|
+
const { timeout, interval, onTimeout } = getTrailingOptions(args) ?? {};
|
|
45
37
|
return {
|
|
46
38
|
stackTraceError: new Error("STACK_TRACE_MESSAGE"),
|
|
47
|
-
onTimeout,
|
|
48
|
-
timeout
|
|
49
|
-
interval
|
|
39
|
+
onTimeout: onTimeout ?? ((fallback) => reRunForDiagnostics(query, container, args, fallback)),
|
|
40
|
+
timeout,
|
|
41
|
+
interval,
|
|
50
42
|
};
|
|
51
43
|
};
|
|
52
44
|
const singleFrom = (allQuery, getMultipleError) => (container, ...args) => {
|
|
@@ -66,7 +58,13 @@ const allOrThrow = (allQuery, getMissingError) => (container, ...args) => {
|
|
|
66
58
|
const wrapSingleWithSuggestion = (query, queryName, variant) => (container, ...args) => {
|
|
67
59
|
const match = query(container, ...args);
|
|
68
60
|
if (match) {
|
|
69
|
-
maybeThrowSuggestion({
|
|
61
|
+
maybeThrowSuggestion({
|
|
62
|
+
container,
|
|
63
|
+
match,
|
|
64
|
+
queryName,
|
|
65
|
+
variant,
|
|
66
|
+
shouldSuggest: extractShouldSuggest(args),
|
|
67
|
+
});
|
|
70
68
|
}
|
|
71
69
|
return match;
|
|
72
70
|
};
|
|
@@ -79,7 +77,7 @@ const wrapAllWithSuggestion = (query, queryName, variant) => (container, ...args
|
|
|
79
77
|
match: first,
|
|
80
78
|
queryName,
|
|
81
79
|
variant,
|
|
82
|
-
|
|
80
|
+
shouldSuggest: extractShouldSuggest(args),
|
|
83
81
|
});
|
|
84
82
|
}
|
|
85
83
|
return matches;
|
|
@@ -91,25 +89,36 @@ const requireSingle = (query, getMissingError) => (container, ...args) => {
|
|
|
91
89
|
}
|
|
92
90
|
return match;
|
|
93
91
|
};
|
|
94
|
-
|
|
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);
|
|
95
104
|
const getAllBy = allOrThrow(queryAllBy, getMissingError);
|
|
96
105
|
const getBy = requireSingle(singleFrom(getAllBy, getMultipleError), getMissingError);
|
|
97
106
|
const queryByWithSuggestion = wrapSingleWithSuggestion(singleFrom(queryAllBy, getMultipleError), queryName, "query");
|
|
98
107
|
const getAllByWithSuggestion = wrapAllWithSuggestion(getAllBy, queryName, "getAll");
|
|
99
108
|
const getByWithSuggestion = (container, ...args) => {
|
|
100
109
|
const match = getBy(container, ...args);
|
|
101
|
-
maybeThrowSuggestion({
|
|
110
|
+
maybeThrowSuggestion({
|
|
111
|
+
container,
|
|
112
|
+
match,
|
|
113
|
+
queryName,
|
|
114
|
+
variant: "get",
|
|
115
|
+
shouldSuggest: extractShouldSuggest(args),
|
|
116
|
+
});
|
|
102
117
|
return match;
|
|
103
118
|
};
|
|
104
119
|
const findAllBy = (container, ...args) => waitFor(() => runWithExpensiveErrorDiagnosticsDisabled(() => getAllByWithSuggestion(container, ...args)), findOptions(getAllByWithSuggestion, container, args));
|
|
105
120
|
const findBy = (container, ...args) => waitFor(() => runWithExpensiveErrorDiagnosticsDisabled(() => getByWithSuggestion(container, ...args)), findOptions(getByWithSuggestion, container, args));
|
|
106
|
-
return
|
|
107
|
-
queryBy: queryByWithSuggestion,
|
|
108
|
-
getAllBy: getAllByWithSuggestion,
|
|
109
|
-
getBy: getByWithSuggestion,
|
|
110
|
-
findAllBy,
|
|
111
|
-
findBy,
|
|
112
|
-
};
|
|
121
|
+
return [queryByWithSuggestion, getAllByWithSuggestion, getByWithSuggestion, findAllBy, findBy];
|
|
113
122
|
};
|
|
114
|
-
export { buildQueries };
|
|
123
|
+
export { buildQueries, };
|
|
115
124
|
//# sourceMappingURL=build-queries.js.map
|
|
@@ -1 +1 @@
|
|
|
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 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 extractSuggestOption = (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 suggest: boolean | undefined;\n}): void => {\n const { container, match, queryName, variant, suggest } = options;\n const shouldSuggest = suggest ?? getConfig().throwSuggestions;\n\n if (!shouldSuggest) {\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({ container, match, queryName, variant, suggest: extractSuggestOption(args) });\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 suggest: extractSuggestOption(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 maybeThrowSuggestion({ container, match, queryName, variant: \"get\", suggest: extractSuggestOption(args) });\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"]}
|