@gtkx/testing 2.0.0-beta.1 → 2.0.0-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +43 -40
- package/dist/accessible-native.d.ts +1 -1
- package/dist/accessible-native.d.ts.map +1 -1
- package/dist/accessible-native.js +29 -8
- package/dist/accessible-native.js.map +1 -1
- package/dist/build-queries.d.ts +9 -9
- package/dist/build-queries.d.ts.map +1 -1
- package/dist/build-queries.js +2 -1
- package/dist/build-queries.js.map +1 -1
- package/dist/fire-event.d.ts +3 -3
- package/dist/fire-event.d.ts.map +1 -1
- package/dist/fire-event.js +14 -4
- package/dist/fire-event.js.map +1 -1
- package/dist/matchers.d.ts +52 -56
- package/dist/matchers.d.ts.map +1 -1
- package/dist/matchers.js +4 -16
- package/dist/matchers.js.map +1 -1
- package/dist/queries.d.ts +7 -7
- package/dist/queries.d.ts.map +1 -1
- package/dist/queries.js +18 -10
- package/dist/queries.js.map +1 -1
- package/dist/query-helpers.d.ts +2 -2
- package/dist/query-helpers.d.ts.map +1 -1
- package/dist/query-helpers.js +10 -3
- package/dist/query-helpers.js.map +1 -1
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +4 -0
- package/dist/render.js.map +1 -1
- package/dist/role-helpers.d.ts +1 -1
- package/dist/role-helpers.d.ts.map +1 -1
- package/dist/role-helpers.js +2 -1
- package/dist/role-helpers.js.map +1 -1
- package/dist/screenshot.d.ts +1 -1
- package/dist/screenshot.d.ts.map +1 -1
- package/dist/screenshot.js +25 -5
- package/dist/screenshot.js.map +1 -1
- package/dist/suggestions.d.ts +1 -1
- package/dist/suggestions.d.ts.map +1 -1
- package/dist/suggestions.js +3 -1
- package/dist/suggestions.js.map +1 -1
- package/dist/traversal.d.ts +4 -4
- package/dist/traversal.d.ts.map +1 -1
- package/dist/traversal.js +25 -7
- package/dist/traversal.js.map +1 -1
- package/dist/types.d.ts +10 -10
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/user-event/click.d.ts +17 -4
- package/dist/user-event/click.d.ts.map +1 -1
- package/dist/user-event/click.js +28 -9
- package/dist/user-event/click.js.map +1 -1
- package/dist/user-event/controller.d.ts +5 -5
- package/dist/user-event/controller.d.ts.map +1 -1
- package/dist/user-event/controller.js +5 -2
- package/dist/user-event/controller.js.map +1 -1
- package/dist/user-event/index.d.ts +22 -22
- package/dist/user-event/index.d.ts.map +1 -1
- package/dist/user-event/index.js +28 -25
- package/dist/user-event/index.js.map +1 -1
- package/dist/user-event/keyboard.d.ts.map +1 -1
- package/dist/user-event/keyboard.js +23 -2
- package/dist/user-event/keyboard.js.map +1 -1
- package/dist/user-event/list-row-click.d.ts +1 -1
- package/dist/user-event/list-row-click.d.ts.map +1 -1
- package/dist/user-event/list-row-click.js +2 -1
- package/dist/user-event/list-row-click.js.map +1 -1
- package/dist/user-event/pointer.d.ts.map +1 -1
- package/dist/user-event/pointer.js +9 -11
- package/dist/user-event/pointer.js.map +1 -1
- package/dist/user-event/selection.d.ts +2 -2
- package/dist/user-event/selection.d.ts.map +1 -1
- package/dist/user-event/selection.js +8 -2
- package/dist/user-event/selection.js.map +1 -1
- package/dist/wait-for.d.ts +2 -2
- package/dist/wait-for.d.ts.map +1 -1
- package/dist/wait-for.js +6 -4
- package/dist/wait-for.js.map +1 -1
- package/dist/widget-accessible-properties.d.ts +4 -3
- package/dist/widget-accessible-properties.d.ts.map +1 -1
- package/dist/widget-accessible-properties.js +24 -17
- package/dist/widget-accessible-properties.js.map +1 -1
- package/dist/widget-getters.d.ts +7 -9
- package/dist/widget-getters.d.ts.map +1 -1
- package/dist/widget-getters.js.map +1 -1
- package/dist/widget-target.d.ts +4 -0
- package/dist/widget-target.d.ts.map +1 -0
- package/dist/widget-target.js +9 -0
- package/dist/widget-target.js.map +1 -0
- package/package.json +13 -10
- package/src/accessible-native.ts +45 -9
- package/src/build-queries.ts +60 -30
- package/src/fire-event.ts +32 -8
- package/src/matchers.ts +63 -85
- package/src/queries.ts +64 -30
- package/src/query-helpers.ts +17 -9
- package/src/render.tsx +7 -2
- package/src/role-helpers.ts +3 -1
- package/src/screenshot.ts +48 -5
- package/src/suggestions.ts +3 -1
- package/src/traversal.ts +35 -11
- package/src/types.ts +14 -10
- package/src/user-event/click.ts +37 -17
- package/src/user-event/controller.ts +8 -5
- package/src/user-event/index.ts +133 -47
- package/src/user-event/keyboard.ts +32 -3
- package/src/user-event/list-row-click.ts +2 -2
- package/src/user-event/pointer.ts +11 -15
- package/src/user-event/selection.ts +12 -4
- package/src/wait-for.ts +9 -6
- package/src/widget-accessible-properties.ts +39 -25
- package/src/widget-getters.ts +11 -13
- package/src/widget-target.ts +11 -0
package/README.md
CHANGED
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
<h1 align="center">GTKX</h1>
|
|
6
6
|
|
|
7
7
|
<p align="center">
|
|
8
|
-
The React framework for Linux
|
|
9
|
-
Write native
|
|
10
|
-
Real
|
|
8
|
+
The React framework for Linux.<br />
|
|
9
|
+
Write native GNOME applications with React and TypeScript.
|
|
10
|
+
Real Adwaita and GTK4 widgets with standard web tooling.
|
|
11
11
|
</p>
|
|
12
12
|
|
|
13
13
|
<p align="center">
|
|
@@ -38,11 +38,12 @@
|
|
|
38
38
|
|
|
39
39
|
## Demo
|
|
40
40
|
|
|
41
|
-
|
|
41
|
+
This app starts with an Adwaita application shell, renders native GTK4 widgets inside it, and uses ordinary React hooks and events:
|
|
42
42
|
|
|
43
43
|
```tsx
|
|
44
44
|
import * as Gtk from "@gtkx/gi/gtk";
|
|
45
|
-
import {
|
|
45
|
+
import { AdwApplication, AdwApplicationWindow, AdwHeaderBar, AdwToolbarView } from "@gtkx/jsx/adw";
|
|
46
|
+
import { GtkBox, GtkButton, GtkLabel } from "@gtkx/jsx/gtk";
|
|
46
47
|
import { createRoot, quit } from "@gtkx/react";
|
|
47
48
|
import { useState } from "react";
|
|
48
49
|
|
|
@@ -50,38 +51,40 @@ const Counter = () => {
|
|
|
50
51
|
const [count, setCount] = useState(0);
|
|
51
52
|
|
|
52
53
|
return (
|
|
53
|
-
<
|
|
54
|
+
<AdwApplicationWindow
|
|
54
55
|
title="Hello GTKX"
|
|
55
56
|
defaultWidth={400}
|
|
56
57
|
defaultHeight={300}
|
|
57
58
|
onCloseRequest={quit}
|
|
58
59
|
>
|
|
59
|
-
<
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
60
|
+
<AdwToolbarView topBar={<AdwHeaderBar />}>
|
|
61
|
+
<GtkBox
|
|
62
|
+
orientation={Gtk.Orientation.VERTICAL}
|
|
63
|
+
spacing={20}
|
|
64
|
+
marginTop={40}
|
|
65
|
+
marginBottom={40}
|
|
66
|
+
marginStart={40}
|
|
67
|
+
marginEnd={40}
|
|
68
|
+
valign={Gtk.Align.CENTER}
|
|
69
|
+
halign={Gtk.Align.CENTER}
|
|
70
|
+
>
|
|
71
|
+
<GtkLabel cssClasses={["title-1"]}>Welcome to GTKX!</GtkLabel>
|
|
72
|
+
<GtkLabel cssClasses={["title-2"]}>{`Count: ${String(count)}`}</GtkLabel>
|
|
73
|
+
<GtkButton
|
|
74
|
+
label="Increment"
|
|
75
|
+
onClicked={() => setCount((c) => c + 1)}
|
|
76
|
+
cssClasses={["suggested-action", "pill"]}
|
|
77
|
+
/>
|
|
78
|
+
</GtkBox>
|
|
79
|
+
</AdwToolbarView>
|
|
80
|
+
</AdwApplicationWindow>
|
|
78
81
|
);
|
|
79
82
|
};
|
|
80
83
|
|
|
81
84
|
const App = () => (
|
|
82
|
-
<
|
|
85
|
+
<AdwApplication>
|
|
83
86
|
<Counter />
|
|
84
|
-
</
|
|
87
|
+
</AdwApplication>
|
|
85
88
|
);
|
|
86
89
|
|
|
87
90
|
createRoot().render(<App />);
|
|
@@ -91,9 +94,9 @@ This is the [`hello-world`](https://github.com/gtkx-org/gtkx/tree/main/examples/
|
|
|
91
94
|
|
|
92
95
|
## Why GTKX
|
|
93
96
|
|
|
94
|
-
###
|
|
97
|
+
### Adwaita-first application development
|
|
95
98
|
|
|
96
|
-
|
|
99
|
+
GTKX uses Adwaita as the foundation for applications, windows, navigation, dialogs, and adaptive layouts, with the complete GTK4 toolkit underneath. It adds a declarative React layer and an integrated TypeScript toolchain to the GNOME platform:
|
|
97
100
|
|
|
98
101
|
- a React reconciler that exposes every GObject as a JSX element,
|
|
99
102
|
- a CLI for scaffolding, development, and production builds,
|
|
@@ -102,17 +105,17 @@ GTK4 is mature, and GtkBuilder XML can lay out a static interface, but nothing r
|
|
|
102
105
|
- a Testing Library-style API for querying and driving your widgets in tests,
|
|
103
106
|
- and a Model Context Protocol (MCP) server that exposes your live app to AI agents.
|
|
104
107
|
|
|
105
|
-
###
|
|
108
|
+
### Native GNOME widgets, without a compatibility layer
|
|
106
109
|
|
|
107
|
-
React Native and similar frameworks hide the native toolkit so one API can run everywhere. GTKX
|
|
110
|
+
React Native and similar frameworks hide the native toolkit so one API can run everywhere. GTKX renders real Adwaita and GTK4 widgets and exposes any other GObject-Introspection library on your system. It is GNOME-native and Linux-only by design.
|
|
108
111
|
|
|
109
112
|
### Why Node.js, and why generated bindings
|
|
110
113
|
|
|
111
114
|
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
115
|
|
|
113
|
-
GTKX generates the TypeScript types and
|
|
116
|
+
GTKX generates the TypeScript types and native FFI calls from the same GObject-Introspection data, so the types cannot drift from the calls they back. `Adw-1` is the sole default GIR root; its GIR include pulls in `Gtk-4.0`, so codegen covers both complete API surfaces. Neither belongs in a GTKX 2 `libraries` list.
|
|
114
117
|
|
|
115
|
-
At runtime, the native Rust core calls straight into the system
|
|
118
|
+
At runtime, the native Rust core calls straight into the system Adwaita, GTK4, and GLib libraries through libffi, without loading libgirepository at all.
|
|
116
119
|
|
|
117
120
|
## Quick start
|
|
118
121
|
|
|
@@ -121,10 +124,10 @@ GTKX is Linux-only and needs Node.js 26.7 or later. See [Requirements](#requirem
|
|
|
121
124
|
Scaffold a new app with the `create-gtkx` initializer:
|
|
122
125
|
|
|
123
126
|
```sh
|
|
124
|
-
npm create gtkx
|
|
127
|
+
npm create gtkx@beta
|
|
125
128
|
```
|
|
126
129
|
|
|
127
|
-
The same command works with other package managers: `pnpm create gtkx` or `yarn create gtkx`.
|
|
130
|
+
The same command works with other package managers: `pnpm create gtkx@beta` or `yarn create gtkx@beta`.
|
|
128
131
|
|
|
129
132
|
Then run your new app:
|
|
130
133
|
|
|
@@ -145,7 +148,7 @@ The documentation at **[gtkx.dev](https://gtkx.dev)** includes a step-by-step tu
|
|
|
145
148
|
|
|
146
149
|
GTKX is Linux-only. You need:
|
|
147
150
|
|
|
148
|
-
- Linux with the
|
|
151
|
+
- Linux with the Adwaita (1.8 or later), GTK4 (4.20 or later), and GLib development libraries
|
|
149
152
|
- Node.js 26.7 or later
|
|
150
153
|
|
|
151
154
|
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.
|
|
@@ -154,10 +157,10 @@ The `@gtkx/native` addon ships prebuilt for x64 and arm64 glibc Linux; other tar
|
|
|
154
157
|
|
|
155
158
|
Explore the [example apps](https://github.com/gtkx-org/gtkx/tree/main/examples):
|
|
156
159
|
|
|
157
|
-
- [`hello-world`](https://github.com/gtkx-org/gtkx/tree/main/examples/hello-world): the counter above.
|
|
158
|
-
- [`gtk-demo`](https://github.com/gtkx-org/gtkx/tree/main/examples/gtk-demo):
|
|
159
|
-
- [`browser`](https://github.com/gtkx-org/gtkx/tree/main/examples/browser):
|
|
160
|
-
- [`animations`](https://github.com/gtkx-org/gtkx/tree/main/examples/animations):
|
|
160
|
+
- [`hello-world`](https://github.com/gtkx-org/gtkx/tree/main/examples/hello-world): the Adwaita counter above.
|
|
161
|
+
- [`gtk-demo`](https://github.com/gtkx-org/gtkx/tree/main/examples/gtk-demo): the official GTK4 widget showcase in an Adwaita application shell, covering lists, dialogs, gestures, CSS, and OpenGL.
|
|
162
|
+
- [`browser`](https://github.com/gtkx-org/gtkx/tree/main/examples/browser): an Adwaita browser built around `WebKitWebView`.
|
|
163
|
+
- [`animations`](https://github.com/gtkx-org/gtkx/tree/main/examples/animations): an Adwaita showcase for `@gtkx/animated`, with React Spring animations driven by the GTK frame clock.
|
|
161
164
|
- [`navigation`](https://github.com/gtkx-org/gtkx/tree/main/examples/navigation): a tour of `@gtkx/navigation`, React Navigation's stack, tab, and drawer navigators rendered with libadwaita.
|
|
162
165
|
- [`tutorial`](https://github.com/gtkx-org/gtkx/tree/main/examples/tutorial): the Tasks app the documentation builds.
|
|
163
166
|
|
|
@@ -2,7 +2,7 @@ import * as Gtk from "@gtkx/gi/gtk";
|
|
|
2
2
|
/** A value GTK holds for an accessible property: a string, a number, a token, or a boolean. */
|
|
3
3
|
type AccessibleAttributeValue = boolean | number | string;
|
|
4
4
|
declare const ACCESSIBLE_NUMBER_TOLERANCE = 0.001;
|
|
5
|
-
declare const readAccessibleRelation: (accessible: Gtk.Accessible, relation: Gtk.AccessibleRelation,
|
|
5
|
+
declare const readAccessibleRelation: (accessible: Gtk.Accessible, relation: Gtk.AccessibleRelation, tiers: Iterable<Gtk.Accessible>[]) => Gtk.Accessible[];
|
|
6
6
|
declare const readAccessibleState: (accessible: Gtk.Accessible, state: Gtk.AccessibleState) => number | null;
|
|
7
7
|
declare const readAccessibleFlag: (accessible: Gtk.Accessible, state: Gtk.AccessibleState) => boolean | null;
|
|
8
8
|
declare const readAccessibleString: (accessible: Gtk.Accessible, property: Gtk.AccessibleProperty) => string | null;
|
|
@@ -1 +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;
|
|
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;AAuL1C,QAAA,MAAM,sBAAsB,GACxB,YAAY,GAAG,CAAC,UAAU,EAC1B,UAAU,GAAG,CAAC,kBAAkB,EAChC,OAAO,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,KAClC,GAAG,CAAC,UAAU,EAiBhB,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"}
|
|
@@ -118,23 +118,44 @@ const findRelationSize = (accessible, relation, candidates) => {
|
|
|
118
118
|
}
|
|
119
119
|
return 0;
|
|
120
120
|
};
|
|
121
|
+
const unseen = function* (items, seen) {
|
|
122
|
+
for (const item of items) {
|
|
123
|
+
if (seen.has(item)) {
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
seen.add(item);
|
|
127
|
+
yield item;
|
|
128
|
+
}
|
|
129
|
+
};
|
|
121
130
|
const possibleTargets = (relation, candidates) => {
|
|
122
131
|
const reverse = REVERSE_RELATIONS[relation];
|
|
123
132
|
if (reverse === undefined) {
|
|
124
|
-
return candidates;
|
|
133
|
+
return [...candidates];
|
|
125
134
|
}
|
|
126
|
-
return candidates.filter((candidate) => Gtk.testAccessibleHasRelation(candidate, reverse));
|
|
135
|
+
return [...candidates].filter((candidate) => Gtk.testAccessibleHasRelation(candidate, reverse));
|
|
127
136
|
};
|
|
128
|
-
const
|
|
137
|
+
const scanRelationTier = (accessible, relation, candidates, scan) => {
|
|
138
|
+
const size = scan.size > 0 ? scan.size : findRelationSize(accessible, relation, candidates);
|
|
139
|
+
if (size === 0) {
|
|
140
|
+
return scan;
|
|
141
|
+
}
|
|
142
|
+
const found = candidates.filter((candidate) => isRelationExactly(accessible, relation, candidate, size));
|
|
143
|
+
return { size, targets: [...scan.targets, ...found] };
|
|
144
|
+
};
|
|
145
|
+
const isRelationComplete = (scan) => scan.size > 0 && scan.targets.length >= scan.size;
|
|
146
|
+
const readAccessibleRelation = (accessible, relation, tiers) => {
|
|
129
147
|
if (!Gtk.testAccessibleHasRelation(accessible, relation)) {
|
|
130
148
|
return [];
|
|
131
149
|
}
|
|
132
|
-
const
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
150
|
+
const seen = new Set();
|
|
151
|
+
let scan = { size: 0, targets: [] };
|
|
152
|
+
for (const tier of tiers) {
|
|
153
|
+
scan = scanRelationTier(accessible, relation, possibleTargets(relation, unseen(tier, seen)), scan);
|
|
154
|
+
if (isRelationComplete(scan)) {
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
136
157
|
}
|
|
137
|
-
return
|
|
158
|
+
return scan.targets;
|
|
138
159
|
};
|
|
139
160
|
const memberOfDomain = (check, handle, attribute, domain) => {
|
|
140
161
|
for (const candidate of domain) {
|
|
@@ -1 +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"]}
|
|
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\ntype RelationScan = { size: number; targets: Gtk.Accessible[] };\n\nconst unseen = function* <T>(items: Iterable<T>, seen: Set<T>): Generator<T> {\n for (const item of items) {\n if (seen.has(item)) {\n continue;\n }\n\n seen.add(item);\n yield item;\n }\n};\n\nconst possibleTargets = (relation: Gtk.AccessibleRelation, candidates: Iterable<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 scanRelationTier = (\n accessible: Gtk.Accessible,\n relation: Gtk.AccessibleRelation,\n candidates: Gtk.Accessible[],\n scan: RelationScan,\n): RelationScan => {\n const size = scan.size > 0 ? scan.size : findRelationSize(accessible, relation, candidates);\n\n if (size === 0) {\n return scan;\n }\n\n const found = candidates.filter((candidate) => isRelationExactly(accessible, relation, candidate, size));\n\n return { size, targets: [...scan.targets, ...found] };\n};\n\nconst isRelationComplete = (scan: RelationScan): boolean => scan.size > 0 && scan.targets.length >= scan.size;\n\nconst readAccessibleRelation = (\n accessible: Gtk.Accessible,\n relation: Gtk.AccessibleRelation,\n tiers: Iterable<Gtk.Accessible>[],\n): Gtk.Accessible[] => {\n if (!Gtk.testAccessibleHasRelation(accessible, relation)) {\n return [];\n }\n\n const seen: Set<Gtk.Accessible> = new Set();\n let scan: RelationScan = { size: 0, targets: [] };\n\n for (const tier of tiers) {\n scan = scanRelationTier(accessible, relation, possibleTargets(relation, unseen(tier, seen)), scan);\n\n if (isRelationComplete(scan)) {\n break;\n }\n }\n\n return scan.targets;\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
|
@@ -5,18 +5,18 @@ import type { Container } from "./traversal.js";
|
|
|
5
5
|
* family's own matcher arguments. Its name determines the family name, so `queryAllByTestId` builds
|
|
6
6
|
* a `TestId` family.
|
|
7
7
|
*/
|
|
8
|
-
type QueryAllBy<Args extends unknown[]> = (container: Container, ...args: Args) =>
|
|
8
|
+
type QueryAllBy<Args extends unknown[], Element extends Gtk.Accessible = Gtk.Accessible> = (container: Container, ...args: Args) => Element[];
|
|
9
9
|
/** Builds the error thrown when a single-match query finds more than one widget. */
|
|
10
|
-
type MultipleErrorBuilder<Args extends unknown[]> = (container: Container, matches:
|
|
10
|
+
type MultipleErrorBuilder<Args extends unknown[], Element extends Gtk.Accessible = Gtk.Accessible> = (container: Container, matches: Element[], ...args: Args) => Error;
|
|
11
11
|
/** Builds the error thrown when a query that requires a match finds none. */
|
|
12
12
|
type MissingErrorBuilder<Args extends unknown[]> = (container: Container, ...args: Args) => Error;
|
|
13
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) =>
|
|
16
|
-
getAllBy: QueryAllBy<Args>,
|
|
17
|
-
getBy: (container: Container, ...args: Args) =>
|
|
18
|
-
findAllBy: (container: Container, ...args: Args) => Promise<
|
|
19
|
-
findBy: (container: Container, ...args: Args) => Promise<
|
|
14
|
+
type BuiltQueries<Args extends unknown[], Element extends Gtk.Accessible = Gtk.Accessible> = [
|
|
15
|
+
queryBy: (container: Container, ...args: Args) => Element | null,
|
|
16
|
+
getAllBy: QueryAllBy<Args, Element>,
|
|
17
|
+
getBy: (container: Container, ...args: Args) => Element,
|
|
18
|
+
findAllBy: (container: Container, ...args: Args) => Promise<Element[]>,
|
|
19
|
+
findBy: (container: Container, ...args: Args) => Promise<Element>
|
|
20
20
|
];
|
|
21
21
|
/**
|
|
22
22
|
* Derives the `queryBy`, `getAllBy`, `getBy`, `findAllBy`, and `findBy` variants of a query family
|
|
@@ -28,6 +28,6 @@ type BuiltQueries<Args extends unknown[]> = [
|
|
|
28
28
|
* @param getMissingError Builds the error thrown when a required match is missing.
|
|
29
29
|
* @returns The variants, in the order `[queryBy, getAllBy, getBy, findAllBy, findBy]`.
|
|
30
30
|
*/
|
|
31
|
-
declare const buildQueries: <Args extends unknown[]>(queryAllBy: QueryAllBy<Args>, getMultipleError: MultipleErrorBuilder<Args>, getMissingError: MissingErrorBuilder<Args>) => BuiltQueries<Args>;
|
|
31
|
+
declare const buildQueries: <Args extends unknown[], Element extends Gtk.Accessible = Gtk.Accessible>(queryAllBy: QueryAllBy<Args, Element>, getMultipleError: MultipleErrorBuilder<Args, Element>, getMissingError: MissingErrorBuilder<Args>) => BuiltQueries<Args, Element>;
|
|
32
32
|
export { buildQueries, type BuiltQueries, type MissingErrorBuilder, type MultipleErrorBuilder, type QueryAllBy, };
|
|
33
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;AAQhD;;;;GAIG;AACH,KAAK,UAAU,CACX,IAAI,SAAS,OAAO,EAAE,EACtB,OAAO,SAAS,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,IAC/C,CACA,SAAS,EAAE,SAAS,EACpB,GAAG,IAAI,EAAE,IAAI,KACZ,OAAO,EAAE,CAAC;AAEf,oFAAoF;AACpF,KAAK,oBAAoB,CACrB,IAAI,SAAS,OAAO,EAAE,EACtB,OAAO,SAAS,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,IAC/C,CACA,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,OAAO,EAAE,EAClB,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,CACb,IAAI,SAAS,OAAO,EAAE,EACtB,OAAO,SAAS,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,IAC/C;IACA,OAAO,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,IAAI,KAAK,OAAO,GAAG,IAAI;IAChE,QAAQ,EAAE,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC;IACnC,KAAK,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,IAAI,KAAK,OAAO;IACvD,SAAS,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC;IACtE,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,OAAO,CAAC;CACpE,CAAC;AAmKF;;;;;;;;;GASG;AACH,QAAA,MAAM,YAAY,GACd,IAAI,SAAS,OAAO,EAAE,EACtB,OAAO,SAAS,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,EAE/C,YAAY,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,EACrC,kBAAkB,oBAAoB,CAAC,IAAI,EAAE,OAAO,CAAC,EACrD,iBAAiB,mBAAmB,CAAC,IAAI,CAAC,KAC3C,YAAY,CAAC,IAAI,EAAE,OAAO,CAwC5B,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,6 +2,7 @@ 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
|
+
import { requireWidget } from "./widget-target.js";
|
|
5
6
|
const getTrailingOptions = (args) => {
|
|
6
7
|
const last = args.at(-1);
|
|
7
8
|
if (last && typeof last === "object" && !(last instanceof RegExp)) {
|
|
@@ -16,7 +17,7 @@ const maybeThrowSuggestion = (options) => {
|
|
|
16
17
|
if (!(shouldSuggest ?? getConfig().throwSuggestions)) {
|
|
17
18
|
return;
|
|
18
19
|
}
|
|
19
|
-
const suggestion = getSuggestedQuery(match, variant);
|
|
20
|
+
const suggestion = getSuggestedQuery(requireWidget(match), variant);
|
|
20
21
|
if (suggestion && suggestion.queryName !== queryName) {
|
|
21
22
|
throw suggestionError(suggestion.toString(), container);
|
|
22
23
|
}
|
|
@@ -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 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 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
|
+
{"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\";\nimport { requireWidget } from \"./widget-target.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<\n Args extends unknown[],\n Element extends Gtk.Accessible = Gtk.Accessible,\n> = (\n container: Container,\n ...args: Args\n) => Element[];\n\n/** Builds the error thrown when a single-match query finds more than one widget. */\ntype MultipleErrorBuilder<\n Args extends unknown[],\n Element extends Gtk.Accessible = Gtk.Accessible,\n> = (\n container: Container,\n matches: Element[],\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<\n Args extends unknown[],\n Element extends Gtk.Accessible = Gtk.Accessible,\n> = [\n queryBy: (container: Container, ...args: Args) => Element | null,\n getAllBy: QueryAllBy<Args, Element>,\n getBy: (container: Container, ...args: Args) => Element,\n findAllBy: (container: Container, ...args: Args) => Promise<Element[]>,\n findBy: (container: Container, ...args: Args) => Promise<Element>,\n];\n\ntype FindQuery<Args extends unknown[]> = (container: Container, ...args: Args) => unknown;\ntype SingleQuery<Args extends unknown[], Element extends Gtk.Accessible> = (\n container: Container,\n ...args: Args\n) => Element | 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: object;\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(requireWidget(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[], Element extends Gtk.Accessible>(\n allQuery: QueryAllBy<Args, Element>,\n getMultipleError: MultipleErrorBuilder<Args, Element>,\n ): SingleQuery<Args, Element> =>\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[], Element extends Gtk.Accessible>(\n allQuery: QueryAllBy<Args, Element>,\n getMissingError: MissingErrorBuilder<Args>,\n ): QueryAllBy<Args, Element> =>\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[], Element extends Gtk.Accessible>(\n query: SingleQuery<Args, Element>,\n queryName: string,\n variant: Variant,\n ): SingleQuery<Args, Element> =>\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[], Element extends Gtk.Accessible>(\n query: QueryAllBy<Args, Element>,\n queryName: string,\n variant: Variant,\n ): QueryAllBy<Args, Element> =>\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[], Element extends Gtk.Accessible>(\n query: SingleQuery<Args, Element>,\n getMissingError: MissingErrorBuilder<Args>,\n ) =>\n (container: Container, ...args: Args): Element => {\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 variants, in the order `[queryBy, getAllBy, getBy, findAllBy, findBy]`.\n */\nconst buildQueries = <\n Args extends unknown[],\n Element extends Gtk.Accessible = Gtk.Accessible,\n>(\n queryAllBy: QueryAllBy<Args, Element>,\n getMultipleError: MultipleErrorBuilder<Args, Element>,\n getMissingError: MissingErrorBuilder<Args>,\n): BuiltQueries<Args, Element> => {\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) => Element = (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<Element[]> =>\n waitFor(\n () => runWithExpensiveErrorDiagnosticsDisabled(() => getAllByWithSuggestion(container, ...args)),\n findOptions(getAllByWithSuggestion, container, args),\n );\n\n const findBy = (container: Container, ...args: Args): Promise<Element> =>\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"]}
|
package/dist/fire-event.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ import * as GObject from "@gtkx/gi/gobject";
|
|
|
5
5
|
*/
|
|
6
6
|
type WidgetEvent = {
|
|
7
7
|
/** The GObject instance the signal is emitted on. */
|
|
8
|
-
target: GObject.Object
|
|
8
|
+
target: Pick<GObject.Object, "__type__">;
|
|
9
9
|
/** Name of the signal to emit. */
|
|
10
10
|
signalName: string;
|
|
11
11
|
/** Arguments passed to the signal handlers. */
|
|
@@ -20,7 +20,7 @@ type WidgetEvent = {
|
|
|
20
20
|
* @param args Arguments to pass to the signal handlers.
|
|
21
21
|
* @returns The recorded emission.
|
|
22
22
|
*/
|
|
23
|
-
declare const createEvent: (target: GObject.Object, signalName: string, ...args: unknown[]) => WidgetEvent;
|
|
23
|
+
declare const createEvent: (target: Pick<GObject.Object, "__type__">, signalName: string, ...args: unknown[]) => WidgetEvent;
|
|
24
24
|
/**
|
|
25
25
|
* Emits a recorded signal emission inside React's act environment, so any resulting state updates are
|
|
26
26
|
* flushed before the promise resolves.
|
|
@@ -36,6 +36,6 @@ declare function fireEvent(event: WidgetEvent): Promise<void>;
|
|
|
36
36
|
* @param signalName Name of the signal to emit.
|
|
37
37
|
* @param args Arguments passed to the signal handlers.
|
|
38
38
|
*/
|
|
39
|
-
declare function fireEvent(target: GObject.Object, signalName: string, ...args: unknown[]): Promise<void>;
|
|
39
|
+
declare function fireEvent(target: Pick<GObject.Object, "__type__">, signalName: string, ...args: unknown[]): Promise<void>;
|
|
40
40
|
export { createEvent, fireEvent, type WidgetEvent };
|
|
41
41
|
//# sourceMappingURL=fire-event.d.ts.map
|
package/dist/fire-event.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fire-event.d.ts","sourceRoot":"","sources":["../src/fire-event.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAG5C;;;GAGG;AACH,KAAK,WAAW,GAAG;IACf,qDAAqD;IACrD,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"fire-event.d.ts","sourceRoot":"","sources":["../src/fire-event.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAG5C;;;GAGG;AACH,KAAK,WAAW,GAAG;IACf,qDAAqD;IACrD,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACzC,kCAAkC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,IAAI,EAAE,OAAO,EAAE,CAAC;CACnB,CAAC;AAUF;;;;;;;;GAQG;AACH,QAAA,MAAM,WAAW,GACb,QAAQ,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,EACxC,YAAY,MAAM,EAClB,GAAG,MAAM,OAAO,EAAE,KACnB,WAID,CAAC;AAcH;;;;;GAKG;AACH,iBAAS,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AACtD;;;;;;;GAOG;AACH,iBAAS,SAAS,CACd,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,EACxC,UAAU,EAAE,MAAM,EAClB,GAAG,IAAI,EAAE,OAAO,EAAE,GACnB,OAAO,CAAC,IAAI,CAAC,CAAC;AAoBjB,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,WAAW,EAAE,CAAC"}
|
package/dist/fire-event.js
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import * as GObject from "@gtkx/gi/gobject";
|
|
2
2
|
import { runInAct } from "./act.js";
|
|
3
|
+
const requireObject = (target) => {
|
|
4
|
+
if (!(target instanceof GObject.Object)) {
|
|
5
|
+
throw new TypeError("Expected a GObject instance");
|
|
6
|
+
}
|
|
7
|
+
return target;
|
|
8
|
+
};
|
|
3
9
|
/**
|
|
4
10
|
* Records a signal emission without delivering it, so it can be inspected or held and passed to
|
|
5
11
|
* {@link fireEvent} later.
|
|
@@ -10,23 +16,27 @@ import { runInAct } from "./act.js";
|
|
|
10
16
|
* @returns The recorded emission.
|
|
11
17
|
*/
|
|
12
18
|
const createEvent = (target, signalName, ...args) => ({
|
|
13
|
-
target,
|
|
19
|
+
target: requireObject(target),
|
|
14
20
|
signalName,
|
|
15
21
|
args,
|
|
16
22
|
});
|
|
17
23
|
const dispatchEvent = async (event) => {
|
|
24
|
+
const target = requireObject(event.target);
|
|
18
25
|
await runInAct(() => {
|
|
19
|
-
|
|
26
|
+
Reflect.apply(GObject.signalEmit, undefined, [target, event.signalName, ...event.args]);
|
|
20
27
|
});
|
|
21
28
|
};
|
|
29
|
+
const isWidgetEvent = (value) => "target" in value && "signalName" in value && "args" in value &&
|
|
30
|
+
typeof value.signalName === "string" && Array.isArray(value.args);
|
|
22
31
|
function fireEvent(eventOrTarget, signalName, ...args) {
|
|
23
|
-
if (
|
|
32
|
+
if (signalName === undefined && isWidgetEvent(eventOrTarget)) {
|
|
24
33
|
return dispatchEvent(eventOrTarget);
|
|
25
34
|
}
|
|
26
35
|
if (signalName === undefined) {
|
|
27
36
|
throw new Error("Unable to fire an event: pass a signal name, or an event built by createEvent.");
|
|
28
37
|
}
|
|
29
|
-
|
|
38
|
+
const target = requireObject(eventOrTarget);
|
|
39
|
+
return dispatchEvent({ target, signalName, args });
|
|
30
40
|
}
|
|
31
41
|
export { createEvent, fireEvent };
|
|
32
42
|
//# sourceMappingURL=fire-event.js.map
|
package/dist/fire-event.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fire-event.js","sourceRoot":"","sources":["../src/fire-event.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAepC;;;;;;;;GAQG;AACH,MAAM,WAAW,GAAG,
|
|
1
|
+
{"version":3,"file":"fire-event.js","sourceRoot":"","sources":["../src/fire-event.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAepC,MAAM,aAAa,GAAG,CAAC,MAAc,EAAkB,EAAE;IACrD,IAAI,CAAC,CAAC,MAAM,YAAY,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,SAAS,CAAC,6BAA6B,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,WAAW,GAAG,CAChB,MAAwC,EACxC,UAAkB,EAClB,GAAG,IAAe,EACP,EAAE,CAAC,CAAC;IACf,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC;IAC7B,UAAU;IACV,IAAI;CACP,CAAC,CAAC;AAEH,MAAM,aAAa,GAAG,KAAK,EAAE,KAAkB,EAAiB,EAAE;IAC9D,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAE3C,MAAM,QAAQ,CAAC,GAAG,EAAE;QAChB,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,SAAS,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5F,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,KAAa,EAAwB,EAAE,CAC1D,QAAQ,IAAI,KAAK,IAAI,YAAY,IAAI,KAAK,IAAI,MAAM,IAAI,KAAK;IAC7D,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAuBtE,SAAS,SAAS,CACd,aAA6D,EAC7D,UAAmB,EACnB,GAAG,IAAe;IAElB,IAAI,UAAU,KAAK,SAAS,IAAI,aAAa,CAAC,aAAa,CAAC,EAAE,CAAC;QAC3D,OAAO,aAAa,CAAC,aAAa,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,gFAAgF,CAAC,CAAC;IACtG,CAAC;IAED,MAAM,MAAM,GAAG,aAAa,CAAC,aAAa,CAAC,CAAC;IAE5C,OAAO,aAAa,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,OAAO,EAAE,WAAW,EAAE,SAAS,EAAoB,CAAC","sourcesContent":["import * as GObject from \"@gtkx/gi/gobject\";\nimport { runInAct } from \"./act.js\";\n\n/**\n * A signal emission built but not yet delivered. GObject has no event object to construct, so this\n * records the target, signal, and arguments {@link fireEvent} will emit.\n */\ntype WidgetEvent = {\n /** The GObject instance the signal is emitted on. */\n target: Pick<GObject.Object, \"__type__\">;\n /** Name of the signal to emit. */\n signalName: string;\n /** Arguments passed to the signal handlers. */\n args: unknown[];\n};\n\nconst requireObject = (target: object): GObject.Object => {\n if (!(target instanceof GObject.Object)) {\n throw new TypeError(\"Expected a GObject instance\");\n }\n\n return target;\n};\n\n/**\n * Records a signal emission without delivering it, so it can be inspected or held and passed to\n * {@link fireEvent} later.\n *\n * @param target The GObject instance the signal would be emitted on.\n * @param signalName Name of the signal to emit.\n * @param args Arguments to pass to the signal handlers.\n * @returns The recorded emission.\n */\nconst createEvent = (\n target: Pick<GObject.Object, \"__type__\">,\n signalName: string,\n ...args: unknown[]\n): WidgetEvent => ({\n target: requireObject(target),\n signalName,\n args,\n});\n\nconst dispatchEvent = async (event: WidgetEvent): Promise<void> => {\n const target = requireObject(event.target);\n\n await runInAct(() => {\n Reflect.apply(GObject.signalEmit, undefined, [target, event.signalName, ...event.args]);\n });\n};\n\nconst isWidgetEvent = (value: object): value is WidgetEvent =>\n \"target\" in value && \"signalName\" in value && \"args\" in value &&\n typeof value.signalName === \"string\" && Array.isArray(value.args);\n\n/**\n * Emits a recorded signal emission inside React's act environment, so any resulting state updates are\n * flushed before the promise resolves.\n *\n * @param event An emission built by {@link createEvent}.\n */\nfunction fireEvent(event: WidgetEvent): Promise<void>;\n/**\n * Emits a GObject signal on a widget or object inside React's act environment, so any resulting state\n * updates are flushed before the promise resolves.\n *\n * @param target The GObject instance to emit the signal on.\n * @param signalName Name of the signal to emit.\n * @param args Arguments passed to the signal handlers.\n */\nfunction fireEvent(\n target: Pick<GObject.Object, \"__type__\">,\n signalName: string,\n ...args: unknown[]\n): Promise<void>;\n\nfunction fireEvent(\n eventOrTarget: WidgetEvent | Pick<GObject.Object, \"__type__\">,\n signalName?: string,\n ...args: unknown[]\n): Promise<void> {\n if (signalName === undefined && isWidgetEvent(eventOrTarget)) {\n return dispatchEvent(eventOrTarget);\n }\n\n if (signalName === undefined) {\n throw new Error(\"Unable to fire an event: pass a signal name, or an event built by createEvent.\");\n }\n\n const target = requireObject(eventOrTarget);\n\n return dispatchEvent({ target, signalName, args });\n}\n\nexport { createEvent, fireEvent, type WidgetEvent };\n"]}
|