summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAylur <[email protected]>2024-11-18 14:53:06 +0000
committerAylur <[email protected]>2024-11-18 14:57:19 +0000
commitf5ed9aad2c8ab133b5c188aec70b0f704748015d (patch)
tree5ed4e1cc210c26e1abec5bb281ddeb587993879e
parent48692ff557f5f9e95744f939e3fcd1054badb585 (diff)
fix(gjs): add workaround for array props
-rw-r--r--docs/guide/typescript/faq.md9
-rw-r--r--lang/gjs/src/_app.ts1
-rw-r--r--lang/gjs/src/index.ts1
-rw-r--r--lang/gjs/src/overrides.ts69
-rw-r--r--lang/gjs/tsconfig.json1
5 files changed, 78 insertions, 3 deletions
diff --git a/docs/guide/typescript/faq.md b/docs/guide/typescript/faq.md
index a151099..444a0af 100644
--- a/docs/guide/typescript/faq.md
+++ b/docs/guide/typescript/faq.md
@@ -197,11 +197,14 @@ These happen when accessing list type properties. Gjs fails to correctly bind
import Notifd from "gi://AstalNotifd"
const notifd = Notifd.get_default()
-notifd.notifications // ❌ // [!code error]
-
-notifd.get_notifications() // ✅
+notifd.notifications // [!code --]
+notifd.get_notifications() // [!code ++]
```
+:::tip
+Open up an issue/PR to add a [workaround](https://github.com/Aylur/astal/blob/main/lang/gjs/src/overrides.ts).
+:::
+
## How to create regular floating windows
Use `Gtk.Window` with [Widget.astalify](/guide/typescript/widget#how-to-use-non-builtin-gtk-widgets).
diff --git a/lang/gjs/src/_app.ts b/lang/gjs/src/_app.ts
index 82e8bb5..60fb407 100644
--- a/lang/gjs/src/_app.ts
+++ b/lang/gjs/src/_app.ts
@@ -1,3 +1,4 @@
+import "./overrides"
import { setConsoleLogDomain } from "console"
import { exit, programArgs } from "system"
import IO from "gi://AstalIO"
diff --git a/lang/gjs/src/index.ts b/lang/gjs/src/index.ts
index cabc961..f4c5773 100644
--- a/lang/gjs/src/index.ts
+++ b/lang/gjs/src/index.ts
@@ -1,3 +1,4 @@
+import "./overrides"
export { default as AstalIO } from "gi://AstalIO?version=0.1"
export * from "./process.js"
export * from "./time.js"
diff --git a/lang/gjs/src/overrides.ts b/lang/gjs/src/overrides.ts
new file mode 100644
index 0000000..6643ba5
--- /dev/null
+++ b/lang/gjs/src/overrides.ts
@@ -0,0 +1,69 @@
+/**
+ * Workaround for "Can't convert non-null pointer to JS value "
+ */
+
+export { }
+
+const snakeify = (str: string) => str
+ .replace(/([a-z])([A-Z])/g, "$1_$2")
+ .replaceAll("-", "_")
+ .toLowerCase()
+
+async function suppress<T>(mod: Promise<{ default: T }>, patch: (m: T) => void) {
+ return mod.then(m => patch(m.default)).catch(() => void 0)
+}
+
+function patch<P extends object>(proto: P, prop: Extract<keyof P, string>) {
+ Object.defineProperty(proto, prop, {
+ get() { return this[`get_${snakeify(prop)}`]() },
+ })
+}
+
+await suppress(import("gi://AstalApps"), ({ Apps, Application }) => {
+ patch(Apps.prototype, "list")
+ patch(Application.prototype, "keywords")
+ patch(Application.prototype, "categories")
+})
+
+await suppress(import("gi://AstalBattery"), ({ UPower }) => {
+ patch(UPower.prototype, "devices")
+})
+
+await suppress(import("gi://AstalBluetooth"), ({ Adapter, Bluetooth, Device }) => {
+ patch(Adapter.prototype, "uuids")
+ patch(Bluetooth.prototype, "adapters")
+ patch(Bluetooth.prototype, "devices")
+ patch(Device.prototype, "uuids")
+})
+
+await suppress(import("gi://AstalHyprland"), ({ Hyprland, Monitor, Workspace }) => {
+ patch(Hyprland.prototype, "monitors")
+ patch(Hyprland.prototype, "workspaces")
+ patch(Hyprland.prototype, "clients")
+ patch(Monitor.prototype, "availableModes")
+ patch(Monitor.prototype, "available_modes")
+ patch(Workspace.prototype, "clients")
+})
+
+await suppress(import("gi://AstalMpris"), ({ Mpris, Player }) => {
+ patch(Mpris.prototype, "players")
+ patch(Player.prototype, "supported_uri_schemas")
+ patch(Player.prototype, "supportedUriSchemas")
+ patch(Player.prototype, "supported_mime_types")
+ patch(Player.prototype, "supportedMimeTypes")
+ patch(Player.prototype, "comments")
+})
+
+await suppress(import("gi://AstalNetwork"), ({ Wifi }) => {
+ patch(Wifi.prototype, "access_points")
+ patch(Wifi.prototype, "accessPoints")
+})
+
+await suppress(import("gi://AstalNotifd"), ({ Notifd, Notification }) => {
+ patch(Notifd.prototype, "notifications")
+ patch(Notification.prototype, "actions")
+})
+
+await suppress(import("gi://AstalPowerProfiles"), ({ PowerProfiles }) => {
+ patch(PowerProfiles.prototype, "actions")
+})
diff --git a/lang/gjs/tsconfig.json b/lang/gjs/tsconfig.json
index 4e57e37..7a3a8c8 100644
--- a/lang/gjs/tsconfig.json
+++ b/lang/gjs/tsconfig.json
@@ -1,6 +1,7 @@
{
"compilerOptions": {
"experimentalDecorators": true,
+ "module": "ES2022",
"target": "ES2023",
"outDir": "dist",
"strict": true,