diff options
author | Aylur <[email protected]> | 2024-11-18 14:53:06 +0000 |
---|---|---|
committer | Aylur <[email protected]> | 2024-11-18 14:57:19 +0000 |
commit | f5ed9aad2c8ab133b5c188aec70b0f704748015d (patch) | |
tree | 5ed4e1cc210c26e1abec5bb281ddeb587993879e | |
parent | 48692ff557f5f9e95744f939e3fcd1054badb585 (diff) |
fix(gjs): add workaround for array props
-rw-r--r-- | docs/guide/typescript/faq.md | 9 | ||||
-rw-r--r-- | lang/gjs/src/_app.ts | 1 | ||||
-rw-r--r-- | lang/gjs/src/index.ts | 1 | ||||
-rw-r--r-- | lang/gjs/src/overrides.ts | 69 | ||||
-rw-r--r-- | lang/gjs/tsconfig.json | 1 |
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, |