@gtkx/runtime 1.1.0 → 1.2.1

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.
@@ -3,12 +3,13 @@ import { type AnyClass } from "@gtkx/utils";
3
3
  import type { Mixin } from "./mixin.js";
4
4
  import { type TypedClass } from "./type.js";
5
5
  /**
6
- * Static side of class `C` with its construct signature preserved but the member
7
- * named `K` (default `"new"`) removed. The signature is kept abstract so an abstract
8
- * `C` survives it: a subclass extends the result, and only the subclass's own
9
- * declaration decides whether `new` reaches it.
6
+ * Static side of class `C` with its construct signature preserved but the members named `K`
7
+ * removed. A generated class lists every static it declares itself, so a static it narrows never
8
+ * has to stay assignable to the one it shadows. The signature is kept abstract so an abstract `C`
9
+ * survives it: a subclass extends the result, and only the subclass's own declarations decide
10
+ * which statics reach it.
10
11
  */
11
- type StaticBase<C, K extends PropertyKey = "new"> = Omit<C, K> & (C extends abstract new (...args: infer A) => infer R ? abstract new (...args: A) => R : never);
12
+ type StaticBase<C, K extends PropertyKey> = Omit<C, K> & (C extends abstract new (...args: infer A) => infer R ? abstract new (...args: A) => R : never);
12
13
  /** One overridable vtable slot: where it sits in the vtable struct and how it is marshalled. */
13
14
  type VfuncDescriptor = {
14
15
  /** GIR name of the type struct holding the slot, without its namespace, such as `WidgetClass`. */
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,KAAK,cAAc,EAGnB,KAAK,MAAM,EACX,KAAK,kBAAkB,IAAI,wBAAwB,EAEtD,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,KAAK,QAAQ,EAAkB,MAAM,aAAa,CAAC;AAC5D,OAAO,KAAK,EAAE,KAAK,EAAiB,MAAM,YAAY,CAAC;AACvD,OAAO,EAAgB,KAAK,UAAU,EAAiD,MAAM,WAAW,CAAC;AAEzG;;;;;;GAMG;AACH,KAAK,UAAU,CAAC,CAAC,EAAE,CAAC,SAAS,WAAW,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAClD,CAAC,CAAC,SAAS,QAAQ,MAAM,GAAG,IAAI,EAAE,MAAM,CAAC,KAAK,MAAM,CAAC,GAAG,QAAQ,MAAM,GAAG,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;AAEpG,gGAAgG;AAChG,KAAK,eAAe,GAAG;IACnB,kGAAkG;IAClG,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,UAAU,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kFAAkF;IAClF,cAAc,EAAE,wBAAwB,CAAC,gBAAgB,CAAC,CAAC;IAC3D,iDAAiD;IACjD,gBAAgB,EAAE,wBAAwB,CAAC,kBAAkB,CAAC,CAAC;IAC/D;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF;;;GAGG;AACH,KAAK,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;AAGrD;;;;GAIG;AACH,KAAK,iBAAiB,GAAG;IACrB,qFAAqF;IACrF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qFAAqF;IACrF,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;;;GAKG;AACH,KAAK,eAAe,GAAG;IACnB,8FAA8F;IAC9F,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;CAClD,CAAC;AAeF;;;;GAIG;AACH,iBAAS,YAAY,CAAC,GAAG,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAQvD;AAED;;;;;GAKG;AACH,iBAAS,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAIjD;AAED,iBAAS,iBAAiB,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAO5D;AAED;;;;;;;GAOG;AACH,iBAAS,oBAAoB,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,IAAI,CAUvF;AAED,iBAAS,gBAAgB,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI,CAE7C;AAUD,iBAAS,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAQpD;AAED;;;;;;;;GAQG;AACH,iBAAS,iBAAiB,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,eAAe,GAAG,IAAI,CAWpG;AAED;;;;;;;;GAQG;AACH,iBAAS,UAAU,CAAC,MAAM,EAAE,IAAI,GAAG,SAAS,EAAE,GAAG,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;AACpE,iBAAS,UAAU,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAE3F,iBAAS,UAAU,CAAC,CAAC,SAAS,MAAM,EAChC,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,SAAS,EACjD,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,GACjB,CAAC,GAAG,IAAI,CAAC;AAEZ,iBAAS,UAAU,CAAC,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;AAChF,iBAAS,UAAU,CAAC,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,SAAS,EAAE,GAAG,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,IAAI,CAAC;AAiB1G;;;GAGG;AACH,iBAAS,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAQ/C;AAED,iBAAS,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAc1D;AAED,iBAAS,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAE1D;AA8DD,iBAAS,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAEjD;AAED,iBAAS,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAE3D;AAuCD,iBAAS,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,sFAAsF;AACtF,iBAAS,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,CAQ3D;AAED,0DAA0D;AAC1D,iBAAS,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,GAAG,IAAI,CAEzE;AAMD,iBAAS,eAAe,CAAC,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAG/E;AAMD,iBAAS,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAEhE;AAED,iBAAS,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAE1E;AAED,iBAAS,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAAG,SAAS,CAE3F;AAED,OAAO,EACH,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,UAAU,EACV,eAAe,EACf,mBAAmB,EACnB,SAAS,EACT,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EACjB,sBAAsB,EACtB,yBAAyB,EACzB,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,UAAU,EACV,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,KAAK,eAAe,GACvB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type ExternalObject,\n getType,\n getWrapper,\n type Handle,\n type RegisterClassVfunc as NativeRegisterClassVfunc,\n setWrapper,\n} from \"@gtkx/native\";\nimport { type AnyClass, walkClassChain } from \"@gtkx/utils\";\nimport type { Mixin, MixinReceiver } from \"./mixin.js\";\nimport { TYPE_INVALID, type TypedClass, typeInterfaces, typeIsA, typeName, typeParent } from \"./type.js\";\n\n/**\n * Static side of class `C` with its construct signature preserved but the member\n * named `K` (default `\"new\"`) removed. The signature is kept abstract so an abstract\n * `C` survives it: a subclass extends the result, and only the subclass's own\n * declaration decides whether `new` reaches it.\n */\ntype StaticBase<C, K extends PropertyKey = \"new\"> = Omit<C, K> &\n (C extends abstract new (...args: infer A) => infer R ? abstract new (...args: A) => R : never);\n\n/** One overridable vtable slot: where it sits in the vtable struct and how it is marshalled. */\ntype VfuncDescriptor = {\n /** GIR name of the type struct holding the slot, without its namespace, such as `WidgetClass`. */\n className: string;\n /** Name of the slot's field in that struct. */\n vfuncName: string;\n /** Byte offset of the slot within the struct. */\n byteOffset: number;\n /**\n * Byte size of an interface's vtable struct, used to bounds-check `VfuncDescriptor.byteOffset`.\n * A class struct is bounds-checked against the size `g_type_query` reports for it, so a slot in\n * one carries no size of its own.\n */\n vtableSize?: number;\n /** Descriptor for each argument the slot receives, starting with the instance. */\n argDescriptors: NativeRegisterClassVfunc[\"argDescriptors\"];\n /** Descriptor for the value the slot returns. */\n returnDescriptor: NativeRegisterClassVfunc[\"returnDescriptor\"];\n /**\n * GIR marks the slot's return value as one the bindings do not surface, so a call through the\n * slot drops it and an implementation of the slot reports success in its place, while\n * `VfuncDescriptor.returnDescriptor` keeps the C type the slot is called against either way.\n */\n isReturnSkipped?: boolean;\n /**\n * The slot takes a trailing `GError**` that `VfuncDescriptor.argDescriptors` leaves out, the\n * way GIR leaves it out of a callable's parameters. A call through the slot has to append it\n * or it passes one argument fewer than the implementation reads.\n */\n canThrow?: boolean;\n};\n\n/**\n * The vtable slots a wrapper class or interface exposes, keyed by the JavaScript method name that\n * overrides each one.\n */\ntype VfuncRegistry = Record<string, VfuncDescriptor>;\ntype WrapperBinding = (handle: ExternalObject<Handle>, instance: object) => void;\n\n/**\n * How one property an interface declares reaches the vtable, given as the interface's own accessor\n * members. A direction introspection does not route through a vtable slot is left out, and the\n * property owns that direction's state itself.\n */\ntype InterfaceProperty = {\n /** Member reading the slot the property's value comes from, such as `getEnabled`. */\n getter?: string;\n /** Member writing the slot the property's value goes to, such as `setActionName`. */\n setter?: string;\n};\n\n/**\n * What an interface's vtable struct looks like, for the classes that adopt the interface.\n * `g_type_query` reports no size for an interface, so each slot's generated metadata carries the\n * struct's byte size to bounds-check the slot's offset; an interface introspection describes no\n * vtable for simply contributes no slots.\n */\ntype InterfaceLayout = {\n /** The slots the struct declares, keyed by the JavaScript method name that fills each one. */\n vfuncs?: VfuncRegistry;\n /**\n * The properties a vtable slot backs, keyed by canonical property name, so a class adopting the\n * interface answers `g_object_get` and `g_object_set` with what the slot holds.\n */\n properties?: Record<string, InterfaceProperty>;\n};\n\nconst classRegistry: Map<bigint, AnyClass> = new Map();\nconst interfaceMixinRegistry: Map<bigint, Mixin> = new Map();\nconst composedClassRegistry: Map<bigint, AnyClass> = new Map();\nconst handleMap: WeakMap<object, ExternalObject<Handle>> = new WeakMap();\nconst vfuncRegistry: WeakMap<object, VfuncRegistry> = new WeakMap();\nconst interfaceLayoutRegistry: Map<bigint, InterfaceLayout> = new Map();\nconst wrapperClasses: WeakSet<AnyClass> = new WeakSet();\nconst derivedClasses: WeakSet<AnyClass> = new WeakSet();\n\nfunction setClassType(cls: AnyClass, type: bigint): void {\n (cls.prototype as { [K in keyof TypedClass]: TypedClass[K] }).__type__ = type;\n}\n\n/**\n * Returns the GType a class was registered under, or the invalid type when it carries none. The tag is\n * read off the class's own prototype, so a subclass that never went through `registerClass` reports the\n * invalid type rather than inheriting the one its parent was registered with.\n */\nfunction getClassType(cls: AnyClass | undefined): bigint {\n const proto: object | undefined = cls?.prototype;\n\n if (proto === undefined || !Object.hasOwn(proto, \"__type__\")) {\n return TYPE_INVALID;\n }\n\n return (proto as TypedClass).__type__;\n}\n\n/**\n * Returns the GType the given instance's handle carries, or the invalid type when it has no handle.\n * This is the object's own type rather than the type of the class it was wrapped as, and the two differ\n * for an object GTK created itself, such as the row widget inside a `Gtk.ListView`, which GTKX wraps as\n * the nearest registered ancestor.\n */\nfunction getInstanceType(instance: object): bigint {\n const handle = handleMap.get(instance);\n\n return handle === undefined ? TYPE_INVALID : getType(handle);\n}\n\nfunction registerClassType(cls: AnyClass, type: bigint): void {\n if (type === TYPE_INVALID) {\n return;\n }\n\n classRegistry.set(type, cls);\n setClassType(cls, type);\n}\n\n/**\n * Registers a wrapper class as the JS representation of a GType, optionally\n * installing a registry of virtual functions.\n * @param cls Wrapper class to associate with the type.\n * @param type GType the class wraps.\n * @param vfuncs Vtable slots the class exposes, so `registerClass` can bind the ones a subclass\n * overrides.\n */\nfunction registerWrapperClass(cls: AnyClass, type: bigint, vfuncs?: VfuncRegistry): void {\n registerClassType(cls, type);\n\n if (type !== TYPE_INVALID) {\n wrapperClasses.add(cls);\n }\n\n if (vfuncs) {\n registerVfuncRegistry(cls, vfuncs);\n }\n}\n\nfunction markDerivedClass(cls: AnyClass): void {\n derivedClasses.add(cls);\n}\n\nfunction resolveAncestorType(ancestor: AnyClass): bigint | undefined {\n if (derivedClasses.has(ancestor) || !wrapperClasses.has(ancestor)) {\n return undefined;\n }\n\n return getClassType(ancestor);\n}\n\nfunction resolveWrapperType(instance: object): bigint {\n const cls = instance.constructor as AnyClass | undefined;\n\n if (cls === undefined) {\n return TYPE_INVALID;\n }\n\n return walkClassChain(cls, (ancestor) => resolveAncestorType(ancestor)) ?? TYPE_INVALID;\n}\n\n/**\n * Registers a GInterface, associating its GType with a mixin used to compose the\n * interface onto wrapper classes and, when introspection describes its vtable, that layout.\n * @param cls Class carrying the interface's GType tag.\n * @param type GType of the interface.\n * @param mixin Mixin that applies the interface to a wrapper class.\n * @param layout The interface's vtable struct, so `registerClass` can bind the slots an\n * implementing class overrides and take over the ones it leaves alone.\n */\nfunction registerInterface(cls: AnyClass, type: bigint, mixin: Mixin, layout?: InterfaceLayout): void {\n if (type === TYPE_INVALID) {\n return;\n }\n\n setClassType(cls, type);\n interfaceMixinRegistry.set(type, mixin);\n\n if (layout) {\n interfaceLayoutRegistry.set(type, layout);\n }\n}\n\n/**\n * Wraps a native handle in a JS wrapper instance. With no class, resolves and\n * reuses the wrapper for the handle's runtime GType (composing interface mixins),\n * and hands back an instance that already carries a handle unchanged; with an\n * explicit class, creates a bare instance backed by the handle. Returns null for\n * a null or undefined handle.\n * @param handle Native handle to wrap.\n * @param cls Wrapper class to instantiate, or omitted to resolve it from the runtime type.\n */\nfunction wrapHandle(handle: null | undefined, cls?: AnyClass): null;\nfunction wrapHandle<T extends object>(handle: ExternalObject<Handle>, cls: AnyClass<T>): T;\n\nfunction wrapHandle<T extends object>(\n handle: ExternalObject<Handle> | null | undefined,\n cls: AnyClass<T>,\n): T | null;\n\nfunction wrapHandle(handle: ExternalObject<Handle>, cls?: AnyClass): TypedClass;\nfunction wrapHandle(handle: ExternalObject<Handle> | null | undefined, cls?: AnyClass): TypedClass | null;\n\nfunction wrapHandle(handle: ExternalObject<Handle> | null | undefined, cls?: AnyClass): object | null {\n if (handle === null || handle === undefined) {\n return null;\n }\n\n if (cls === undefined) {\n return getOrCreateWrapper(handle);\n }\n\n const instance: object = Object.create(cls.prototype) as object;\n setHandle(instance, handle);\n\n return instance;\n}\n\n/**\n * Returns the wrapper class registered for a GType, walking up to ancestor types,\n * and throws if none is registered.\n */\nfunction getWrapperClass(type: bigint): AnyClass {\n const cls = resolveWrapperClass(type);\n\n if (!cls) {\n throw new Error(`No registered wrapper class for type '${typeName(type) ?? String(type)}'`);\n }\n\n return cls;\n}\n\nfunction resolveWrapperClass(type: bigint): AnyClass | null {\n let currentType = type;\n\n while (currentType !== TYPE_INVALID) {\n const cls = classRegistry.get(currentType);\n\n if (cls) {\n return cls;\n }\n\n currentType = typeParent(currentType);\n }\n\n return null;\n}\n\nfunction getInterfaceMixin(type: bigint): Mixin | undefined {\n return interfaceMixinRegistry.get(type);\n}\n\nfunction applyInterfaceMixin(cls: AnyClass, type: bigint, baseType: bigint, applied: Set<bigint>): AnyClass {\n if (applied.has(type) || typeIsA(baseType, type)) {\n return cls;\n }\n\n const mixin = getInterfaceMixin(type);\n\n if (mixin === undefined) {\n return cls;\n }\n\n applied.add(type);\n\n return mixin(cls as AnyClass<MixinReceiver>);\n}\n\nfunction createComposedClass(base: AnyClass, runtimeType: bigint): AnyClass {\n const baseType = getClassType(base);\n const applied: Set<bigint> = new Set();\n let cls: AnyClass = base;\n\n for (const type of typeInterfaces(runtimeType)) {\n cls = applyInterfaceMixin(cls, type, baseType, applied);\n }\n\n return applied.size === 0 ? base : cls;\n}\n\nfunction resolveComposedClass(runtimeType: bigint): AnyClass | null {\n const exact = classRegistry.get(runtimeType);\n\n if (exact) {\n return exact;\n }\n\n const cached = composedClassRegistry.get(runtimeType);\n\n if (cached) {\n return cached;\n }\n\n const base = resolveWrapperClass(runtimeType);\n\n if (base === null) {\n return null;\n }\n\n const composed = createComposedClass(base, runtimeType);\n\n if (composed === base) {\n return base;\n }\n\n setClassType(composed, runtimeType);\n wrapperClasses.add(composed);\n composedClassRegistry.set(runtimeType, composed);\n\n return composed;\n}\n\nfunction wrapObject(value: unknown): object | null {\n return value == null ? null : getOrCreateWrapper(value as ExternalObject<Handle>);\n}\n\nfunction wrapCallScopedObject(value: unknown): object | null {\n return value == null ? null : wrapperFor(value as ExternalObject<Handle>, bindCallScopedWrapper);\n}\n\nfunction existingWrapperFor(handle: ExternalObject<Handle>): object | null {\n return handleMap.has(handle) ? handle : getWrapper(handle);\n}\n\nfunction createWrapper(handle: ExternalObject<Handle>): object {\n const runtimeType: bigint = getType(handle);\n\n if (runtimeType === TYPE_INVALID) {\n throw new Error(\"Cannot resolve runtime GLib type from handle\");\n }\n\n const cls = resolveComposedClass(runtimeType);\n\n if (!cls) {\n throw new Error(`Expected registered GLib type, got type ${String(runtimeType)}`);\n }\n\n return Object.create(cls.prototype) as object;\n}\n\nfunction wrapperFor(handle: ExternalObject<Handle>, bind: WrapperBinding): object {\n const existing = existingWrapperFor(handle);\n\n if (existing) {\n return existing;\n }\n\n const instance = createWrapper(handle);\n bind(handle, instance);\n\n return instance;\n}\n\nfunction getOrCreateWrapper(handle: ExternalObject<Handle>): object {\n return wrapperFor(handle, registerWrapper);\n}\n\nfunction instanceClassName(instance: object): string {\n return (instance as { constructor?: { name?: string } }).constructor?.name ?? \"object\";\n}\n\n/** Returns the native handle bound to a wrapper instance, throwing if none is set. */\nfunction getHandle(instance: object): ExternalObject<Handle> {\n const handle = handleMap.get(instance);\n\n if (handle === undefined) {\n throw new Error(`No native handle associated with ${instanceClassName(instance)}`);\n }\n\n return handle;\n}\n\n/** Associates a native handle with a wrapper instance. */\nfunction setHandle(instance: object, handle: ExternalObject<Handle>): void {\n handleMap.set(instance, handle);\n}\n\nfunction bindCallScopedWrapper(handle: ExternalObject<Handle>, instance: object): void {\n setHandle(instance, handle);\n}\n\nfunction registerWrapper(handle: ExternalObject<Handle>, instance: object): void {\n setHandle(instance, handle);\n setWrapper(handle, instance);\n}\n\nfunction registerVfuncRegistry(cls: object, registry: VfuncRegistry): void {\n vfuncRegistry.set(cls, registry);\n}\n\nfunction getVfuncRegistry(cls: object): VfuncRegistry | undefined {\n return vfuncRegistry.get(cls);\n}\n\nfunction getInterfaceVfuncRegistry(type: bigint): VfuncRegistry | undefined {\n return interfaceLayoutRegistry.get(type)?.vfuncs;\n}\n\nfunction getInterfaceProperties(type: bigint): Record<string, InterfaceProperty> | undefined {\n return interfaceLayoutRegistry.get(type)?.properties;\n}\n\nexport {\n getClassType,\n getInstanceType,\n markDerivedClass,\n registerClassType,\n registerWrapperClass,\n registerInterface,\n wrapHandle,\n getWrapperClass,\n resolveWrapperClass,\n getHandle,\n setHandle,\n getVfuncRegistry,\n getInterfaceMixin,\n getInterfaceProperties,\n getInterfaceVfuncRegistry,\n instanceClassName,\n registerWrapper,\n resolveWrapperType,\n wrapCallScopedObject,\n wrapObject,\n type InterfaceProperty,\n type StaticBase,\n type VfuncDescriptor,\n};\n"]}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type ExternalObject,\n getType,\n getWrapper,\n type Handle,\n type RegisterClassVfunc as NativeRegisterClassVfunc,\n setWrapper,\n} from \"@gtkx/native\";\nimport { type AnyClass, walkClassChain } from \"@gtkx/utils\";\nimport type { Mixin, MixinReceiver } from \"./mixin.js\";\nimport { TYPE_INVALID, type TypedClass, typeInterfaces, typeIsA, typeName, typeParent } from \"./type.js\";\n\n/**\n * Static side of class `C` with its construct signature preserved but the members named `K`\n * removed. A generated class lists every static it declares itself, so a static it narrows never\n * has to stay assignable to the one it shadows. The signature is kept abstract so an abstract `C`\n * survives it: a subclass extends the result, and only the subclass's own declarations decide\n * which statics reach it.\n */\ntype StaticBase<C, K extends PropertyKey> = Omit<C, K> &\n (C extends abstract new (...args: infer A) => infer R ? abstract new (...args: A) => R : never);\n\n/** One overridable vtable slot: where it sits in the vtable struct and how it is marshalled. */\ntype VfuncDescriptor = {\n /** GIR name of the type struct holding the slot, without its namespace, such as `WidgetClass`. */\n className: string;\n /** Name of the slot's field in that struct. */\n vfuncName: string;\n /** Byte offset of the slot within the struct. */\n byteOffset: number;\n /**\n * Byte size of an interface's vtable struct, used to bounds-check `VfuncDescriptor.byteOffset`.\n * A class struct is bounds-checked against the size `g_type_query` reports for it, so a slot in\n * one carries no size of its own.\n */\n vtableSize?: number;\n /** Descriptor for each argument the slot receives, starting with the instance. */\n argDescriptors: NativeRegisterClassVfunc[\"argDescriptors\"];\n /** Descriptor for the value the slot returns. */\n returnDescriptor: NativeRegisterClassVfunc[\"returnDescriptor\"];\n /**\n * GIR marks the slot's return value as one the bindings do not surface, so a call through the\n * slot drops it and an implementation of the slot reports success in its place, while\n * `VfuncDescriptor.returnDescriptor` keeps the C type the slot is called against either way.\n */\n isReturnSkipped?: boolean;\n /**\n * The slot takes a trailing `GError**` that `VfuncDescriptor.argDescriptors` leaves out, the\n * way GIR leaves it out of a callable's parameters. A call through the slot has to append it\n * or it passes one argument fewer than the implementation reads.\n */\n canThrow?: boolean;\n};\n\n/**\n * The vtable slots a wrapper class or interface exposes, keyed by the JavaScript method name that\n * overrides each one.\n */\ntype VfuncRegistry = Record<string, VfuncDescriptor>;\ntype WrapperBinding = (handle: ExternalObject<Handle>, instance: object) => void;\n\n/**\n * How one property an interface declares reaches the vtable, given as the interface's own accessor\n * members. A direction introspection does not route through a vtable slot is left out, and the\n * property owns that direction's state itself.\n */\ntype InterfaceProperty = {\n /** Member reading the slot the property's value comes from, such as `getEnabled`. */\n getter?: string;\n /** Member writing the slot the property's value goes to, such as `setActionName`. */\n setter?: string;\n};\n\n/**\n * What an interface's vtable struct looks like, for the classes that adopt the interface.\n * `g_type_query` reports no size for an interface, so each slot's generated metadata carries the\n * struct's byte size to bounds-check the slot's offset; an interface introspection describes no\n * vtable for simply contributes no slots.\n */\ntype InterfaceLayout = {\n /** The slots the struct declares, keyed by the JavaScript method name that fills each one. */\n vfuncs?: VfuncRegistry;\n /**\n * The properties a vtable slot backs, keyed by canonical property name, so a class adopting the\n * interface answers `g_object_get` and `g_object_set` with what the slot holds.\n */\n properties?: Record<string, InterfaceProperty>;\n};\n\nconst classRegistry: Map<bigint, AnyClass> = new Map();\nconst interfaceMixinRegistry: Map<bigint, Mixin> = new Map();\nconst composedClassRegistry: Map<bigint, AnyClass> = new Map();\nconst handleMap: WeakMap<object, ExternalObject<Handle>> = new WeakMap();\nconst vfuncRegistry: WeakMap<object, VfuncRegistry> = new WeakMap();\nconst interfaceLayoutRegistry: Map<bigint, InterfaceLayout> = new Map();\nconst wrapperClasses: WeakSet<AnyClass> = new WeakSet();\nconst derivedClasses: WeakSet<AnyClass> = new WeakSet();\n\nfunction setClassType(cls: AnyClass, type: bigint): void {\n (cls.prototype as { [K in keyof TypedClass]: TypedClass[K] }).__type__ = type;\n}\n\n/**\n * Returns the GType a class was registered under, or the invalid type when it carries none. The tag is\n * read off the class's own prototype, so a subclass that never went through `registerClass` reports the\n * invalid type rather than inheriting the one its parent was registered with.\n */\nfunction getClassType(cls: AnyClass | undefined): bigint {\n const proto: object | undefined = cls?.prototype;\n\n if (proto === undefined || !Object.hasOwn(proto, \"__type__\")) {\n return TYPE_INVALID;\n }\n\n return (proto as TypedClass).__type__;\n}\n\n/**\n * Returns the GType the given instance's handle carries, or the invalid type when it has no handle.\n * This is the object's own type rather than the type of the class it was wrapped as, and the two differ\n * for an object GTK created itself, such as the row widget inside a `Gtk.ListView`, which GTKX wraps as\n * the nearest registered ancestor.\n */\nfunction getInstanceType(instance: object): bigint {\n const handle = handleMap.get(instance);\n\n return handle === undefined ? TYPE_INVALID : getType(handle);\n}\n\nfunction registerClassType(cls: AnyClass, type: bigint): void {\n if (type === TYPE_INVALID) {\n return;\n }\n\n classRegistry.set(type, cls);\n setClassType(cls, type);\n}\n\n/**\n * Registers a wrapper class as the JS representation of a GType, optionally\n * installing a registry of virtual functions.\n * @param cls Wrapper class to associate with the type.\n * @param type GType the class wraps.\n * @param vfuncs Vtable slots the class exposes, so `registerClass` can bind the ones a subclass\n * overrides.\n */\nfunction registerWrapperClass(cls: AnyClass, type: bigint, vfuncs?: VfuncRegistry): void {\n registerClassType(cls, type);\n\n if (type !== TYPE_INVALID) {\n wrapperClasses.add(cls);\n }\n\n if (vfuncs) {\n registerVfuncRegistry(cls, vfuncs);\n }\n}\n\nfunction markDerivedClass(cls: AnyClass): void {\n derivedClasses.add(cls);\n}\n\nfunction resolveAncestorType(ancestor: AnyClass): bigint | undefined {\n if (derivedClasses.has(ancestor) || !wrapperClasses.has(ancestor)) {\n return undefined;\n }\n\n return getClassType(ancestor);\n}\n\nfunction resolveWrapperType(instance: object): bigint {\n const cls = instance.constructor as AnyClass | undefined;\n\n if (cls === undefined) {\n return TYPE_INVALID;\n }\n\n return walkClassChain(cls, (ancestor) => resolveAncestorType(ancestor)) ?? TYPE_INVALID;\n}\n\n/**\n * Registers a GInterface, associating its GType with a mixin used to compose the\n * interface onto wrapper classes and, when introspection describes its vtable, that layout.\n * @param cls Class carrying the interface's GType tag.\n * @param type GType of the interface.\n * @param mixin Mixin that applies the interface to a wrapper class.\n * @param layout The interface's vtable struct, so `registerClass` can bind the slots an\n * implementing class overrides and take over the ones it leaves alone.\n */\nfunction registerInterface(cls: AnyClass, type: bigint, mixin: Mixin, layout?: InterfaceLayout): void {\n if (type === TYPE_INVALID) {\n return;\n }\n\n setClassType(cls, type);\n interfaceMixinRegistry.set(type, mixin);\n\n if (layout) {\n interfaceLayoutRegistry.set(type, layout);\n }\n}\n\n/**\n * Wraps a native handle in a JS wrapper instance. With no class, resolves and\n * reuses the wrapper for the handle's runtime GType (composing interface mixins),\n * and hands back an instance that already carries a handle unchanged; with an\n * explicit class, creates a bare instance backed by the handle. Returns null for\n * a null or undefined handle.\n * @param handle Native handle to wrap.\n * @param cls Wrapper class to instantiate, or omitted to resolve it from the runtime type.\n */\nfunction wrapHandle(handle: null | undefined, cls?: AnyClass): null;\nfunction wrapHandle<T extends object>(handle: ExternalObject<Handle>, cls: AnyClass<T>): T;\n\nfunction wrapHandle<T extends object>(\n handle: ExternalObject<Handle> | null | undefined,\n cls: AnyClass<T>,\n): T | null;\n\nfunction wrapHandle(handle: ExternalObject<Handle>, cls?: AnyClass): TypedClass;\nfunction wrapHandle(handle: ExternalObject<Handle> | null | undefined, cls?: AnyClass): TypedClass | null;\n\nfunction wrapHandle(handle: ExternalObject<Handle> | null | undefined, cls?: AnyClass): object | null {\n if (handle === null || handle === undefined) {\n return null;\n }\n\n if (cls === undefined) {\n return getOrCreateWrapper(handle);\n }\n\n const instance: object = Object.create(cls.prototype) as object;\n setHandle(instance, handle);\n\n return instance;\n}\n\n/**\n * Returns the wrapper class registered for a GType, walking up to ancestor types,\n * and throws if none is registered.\n */\nfunction getWrapperClass(type: bigint): AnyClass {\n const cls = resolveWrapperClass(type);\n\n if (!cls) {\n throw new Error(`No registered wrapper class for type '${typeName(type) ?? String(type)}'`);\n }\n\n return cls;\n}\n\nfunction resolveWrapperClass(type: bigint): AnyClass | null {\n let currentType = type;\n\n while (currentType !== TYPE_INVALID) {\n const cls = classRegistry.get(currentType);\n\n if (cls) {\n return cls;\n }\n\n currentType = typeParent(currentType);\n }\n\n return null;\n}\n\nfunction getInterfaceMixin(type: bigint): Mixin | undefined {\n return interfaceMixinRegistry.get(type);\n}\n\nfunction applyInterfaceMixin(cls: AnyClass, type: bigint, baseType: bigint, applied: Set<bigint>): AnyClass {\n if (applied.has(type) || typeIsA(baseType, type)) {\n return cls;\n }\n\n const mixin = getInterfaceMixin(type);\n\n if (mixin === undefined) {\n return cls;\n }\n\n applied.add(type);\n\n return mixin(cls as AnyClass<MixinReceiver>);\n}\n\nfunction createComposedClass(base: AnyClass, runtimeType: bigint): AnyClass {\n const baseType = getClassType(base);\n const applied: Set<bigint> = new Set();\n let cls: AnyClass = base;\n\n for (const type of typeInterfaces(runtimeType)) {\n cls = applyInterfaceMixin(cls, type, baseType, applied);\n }\n\n return applied.size === 0 ? base : cls;\n}\n\nfunction resolveComposedClass(runtimeType: bigint): AnyClass | null {\n const exact = classRegistry.get(runtimeType);\n\n if (exact) {\n return exact;\n }\n\n const cached = composedClassRegistry.get(runtimeType);\n\n if (cached) {\n return cached;\n }\n\n const base = resolveWrapperClass(runtimeType);\n\n if (base === null) {\n return null;\n }\n\n const composed = createComposedClass(base, runtimeType);\n\n if (composed === base) {\n return base;\n }\n\n setClassType(composed, runtimeType);\n wrapperClasses.add(composed);\n composedClassRegistry.set(runtimeType, composed);\n\n return composed;\n}\n\nfunction wrapObject(value: unknown): object | null {\n return value == null ? null : getOrCreateWrapper(value as ExternalObject<Handle>);\n}\n\nfunction wrapCallScopedObject(value: unknown): object | null {\n return value == null ? null : wrapperFor(value as ExternalObject<Handle>, bindCallScopedWrapper);\n}\n\nfunction existingWrapperFor(handle: ExternalObject<Handle>): object | null {\n return handleMap.has(handle) ? handle : getWrapper(handle);\n}\n\nfunction createWrapper(handle: ExternalObject<Handle>): object {\n const runtimeType: bigint = getType(handle);\n\n if (runtimeType === TYPE_INVALID) {\n throw new Error(\"Cannot resolve runtime GLib type from handle\");\n }\n\n const cls = resolveComposedClass(runtimeType);\n\n if (!cls) {\n throw new Error(`Expected registered GLib type, got type ${String(runtimeType)}`);\n }\n\n return Object.create(cls.prototype) as object;\n}\n\nfunction wrapperFor(handle: ExternalObject<Handle>, bind: WrapperBinding): object {\n const existing = existingWrapperFor(handle);\n\n if (existing) {\n return existing;\n }\n\n const instance = createWrapper(handle);\n bind(handle, instance);\n\n return instance;\n}\n\nfunction getOrCreateWrapper(handle: ExternalObject<Handle>): object {\n return wrapperFor(handle, registerWrapper);\n}\n\nfunction instanceClassName(instance: object): string {\n return (instance as { constructor?: { name?: string } }).constructor?.name ?? \"object\";\n}\n\n/** Returns the native handle bound to a wrapper instance, throwing if none is set. */\nfunction getHandle(instance: object): ExternalObject<Handle> {\n const handle = handleMap.get(instance);\n\n if (handle === undefined) {\n throw new Error(`No native handle associated with ${instanceClassName(instance)}`);\n }\n\n return handle;\n}\n\n/** Associates a native handle with a wrapper instance. */\nfunction setHandle(instance: object, handle: ExternalObject<Handle>): void {\n handleMap.set(instance, handle);\n}\n\nfunction bindCallScopedWrapper(handle: ExternalObject<Handle>, instance: object): void {\n setHandle(instance, handle);\n}\n\nfunction registerWrapper(handle: ExternalObject<Handle>, instance: object): void {\n setHandle(instance, handle);\n setWrapper(handle, instance);\n}\n\nfunction registerVfuncRegistry(cls: object, registry: VfuncRegistry): void {\n vfuncRegistry.set(cls, registry);\n}\n\nfunction getVfuncRegistry(cls: object): VfuncRegistry | undefined {\n return vfuncRegistry.get(cls);\n}\n\nfunction getInterfaceVfuncRegistry(type: bigint): VfuncRegistry | undefined {\n return interfaceLayoutRegistry.get(type)?.vfuncs;\n}\n\nfunction getInterfaceProperties(type: bigint): Record<string, InterfaceProperty> | undefined {\n return interfaceLayoutRegistry.get(type)?.properties;\n}\n\nexport {\n getClassType,\n getInstanceType,\n markDerivedClass,\n registerClassType,\n registerWrapperClass,\n registerInterface,\n wrapHandle,\n getWrapperClass,\n resolveWrapperClass,\n getHandle,\n setHandle,\n getVfuncRegistry,\n getInterfaceMixin,\n getInterfaceProperties,\n getInterfaceVfuncRegistry,\n instanceClassName,\n registerWrapper,\n resolveWrapperType,\n wrapCallScopedObject,\n wrapObject,\n type InterfaceProperty,\n type StaticBase,\n type VfuncDescriptor,\n};\n"]}
package/dist/t.d.ts CHANGED
@@ -68,7 +68,7 @@ type T = {
68
68
  slist: typeof helpers.slistT;
69
69
  /** Builds a descriptor for a `GPtrArray` of items. */
70
70
  ptrArray: typeof helpers.ptrArrayT;
71
- /** Builds a descriptor for a `GArray` of items, optionally with an explicit element size. */
71
+ /** Builds a descriptor for a `GArray` of items. */
72
72
  gArray: typeof helpers.gArrayT;
73
73
  /** Builds a descriptor for a `GByteArray`. */
74
74
  byteArray: typeof helpers.byteArrayT;
package/dist/t.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"t.d.ts","sourceRoot":"","sources":["../src/t.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"t.d.ts","sourceRoot":"","sources":["../src/t.ts"],"names":[],"mappings":"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"}
package/dist/t.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"t.js","sourceRoot":"","sources":["../src/t.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAwF7B;;;;GAIG;AACH,MAAM,CAAC,GAAM;IACT,IAAI;IACJ,IAAI,EAAE,OAAO,CAAC,KAAK;IACnB,KAAK,EAAE,OAAO,CAAC,MAAM;IACrB,KAAK,EAAE,OAAO,CAAC,MAAM;IACrB,MAAM,EAAE,OAAO,CAAC,OAAO;IACvB,KAAK,EAAE,OAAO,CAAC,MAAM;IACrB,MAAM,EAAE,OAAO,CAAC,OAAO;IACvB,KAAK,EAAE,OAAO,CAAC,MAAM;IACrB,MAAM,EAAE,OAAO,CAAC,OAAO;IACvB,QAAQ,EAAE,OAAO,CAAC,SAAS;IAC3B,SAAS,EAAE,OAAO,CAAC,UAAU;IAC7B,KAAK,EAAE,OAAO,CAAC,MAAM;IACrB,OAAO,EAAE,OAAO,CAAC,QAAQ;IACzB,OAAO,EAAE,OAAO,CAAC,QAAQ;IACzB,OAAO,EAAE,OAAO,CAAC,QAAQ;IACzB,IAAI,EAAE,OAAO,CAAC,KAAK;IACnB,OAAO,EAAE,OAAO,CAAC,QAAQ;IACzB,MAAM,EAAE,OAAO,CAAC,OAAO;IACvB,MAAM,EAAE,OAAO,CAAC,OAAO;IACvB,MAAM,EAAE,OAAO,CAAC,OAAO;IACvB,KAAK,EAAE,OAAO,CAAC,MAAM;IACrB,MAAM,EAAE,OAAO,CAAC,OAAO;IACvB,WAAW,EAAE,OAAO,CAAC,YAAY;IACjC,GAAG,EAAE,OAAO,CAAC,IAAI;IACjB,SAAS,EAAE,OAAO,CAAC,UAAU;IAC7B,IAAI,EAAE,OAAO,CAAC,KAAK;IACnB,KAAK,EAAE,OAAO,CAAC,MAAM;IACrB,KAAK,EAAE,OAAO,CAAC,MAAM;IACrB,IAAI,EAAE,OAAO,CAAC,KAAK;IACnB,KAAK,EAAE,OAAO,CAAC,MAAM;IACrB,QAAQ,EAAE,OAAO,CAAC,SAAS;IAC3B,MAAM,EAAE,OAAO,CAAC,OAAO;IACvB,SAAS,EAAE,OAAO,CAAC,UAAU;IAC7B,UAAU,EAAE,OAAO,CAAC,WAAW;IAC/B,UAAU,EAAE,OAAO,CAAC,WAAW;IAC/B,WAAW,EAAE,OAAO,CAAC,YAAY;IACjC,QAAQ,EAAE,OAAO,CAAC,SAAS;IAC3B,EAAE;CACL,CAAC;AAEF,OAAO,EAAE,CAAC,EAAE,CAAC","sourcesContent":["import { bind } from \"./bind.js\";\nimport * as helpers from \"./descriptors.js\";\nimport { fn } from \"./fn.js\";\n\n/** The descriptor factories and function binders exposed as {@link t}. */\ntype T = {\n /** Binds a symbol in a shared library to a callable that marshals its arguments and return value. */\n bind: typeof bind;\n /** Descriptor for a `gint8`, marshalled as a number. */\n int8: typeof helpers.int8T;\n /** Descriptor for a `guint8`, marshalled as a number. */\n uint8: typeof helpers.uint8T;\n /** Descriptor for a `gint16`, marshalled as a number. */\n int16: typeof helpers.int16T;\n /** Descriptor for a `guint16`, marshalled as a number. */\n uint16: typeof helpers.uint16T;\n /** Descriptor for a `gint32`, marshalled as a number. */\n int32: typeof helpers.int32T;\n /** Descriptor for a `guint32`, marshalled as a number. */\n uint32: typeof helpers.uint32T;\n /** Descriptor for a `gint64`, marshalled as a number and rejected outside the 2^53 safe range. */\n int64: typeof helpers.int64T;\n /** Descriptor for a `guint64`, marshalled as a number and rejected outside the 2^53 safe range. */\n uint64: typeof helpers.uint64T;\n /** Descriptor for a `gint64`, marshalled as a bigint so the full 64-bit range survives. */\n bigint64: typeof helpers.bigint64T;\n /** Descriptor for a `guint64`, marshalled as a bigint so the full 64-bit range survives. */\n biguint64: typeof helpers.biguint64T;\n /** Descriptor for a `GType`, marshalled as a bigint and recognized as a GType by GValue conversion. */\n gtype: typeof helpers.gtypeT;\n /** Descriptor for a `gfloat`. */\n float32: typeof helpers.float32T;\n /** Descriptor for a `gdouble`. */\n float64: typeof helpers.float64T;\n /** Descriptor for a `gboolean`, marshalled as a JavaScript boolean. */\n boolean: typeof helpers.booleanT;\n /** Descriptor for the absence of a value, used as the return descriptor of a `void` function. */\n void: typeof helpers.voidT;\n /** Descriptor for a `gunichar`, marshalled as a single-character string or a codepoint number. */\n unichar: typeof helpers.unicharT;\n /** Descriptor for an opaque `gpointer` argument, taken from a typed array's memory or a numeric address. */\n buffer: typeof helpers.bufferT;\n /**\n * Builds a descriptor for a C string, whose optional length sizes the caller-allocated buffer\n * used when the string is passed by reference.\n */\n string: typeof helpers.stringT;\n /** Builds a descriptor for a `GObject`, wrapped in the class registered for its runtime GType. */\n object: typeof helpers.objectT;\n /** Builds a descriptor for a `GBoxed` value of the named type. */\n boxed: typeof helpers.boxedT;\n /** Builds a descriptor for a plain C struct. */\n struct: typeof helpers.structT;\n /** Builds a descriptor for a fundamental type whose lifetime is managed by named ref and unref functions. */\n fundamental: typeof helpers.fundamentalT;\n /** Wraps a descriptor in a pointer to it, for an output or inout argument. */\n ref: typeof helpers.refT;\n /** Builds a descriptor for a `GHashTable`, marshalled as an array of key/value pairs. */\n hashTable: typeof helpers.hashTableT;\n /** Builds a descriptor for an enumeration, resolving its GType from the named `get_type` function. */\n enum: typeof helpers.enumT;\n /** Builds a descriptor for a flags type, resolving its GType from the named `get_type` function. */\n flags: typeof helpers.flagsT;\n /** Builds a descriptor for an array of items in one of the supported container layouts. */\n array: typeof helpers.arrayT;\n /** Builds a descriptor for a `GList` of items. */\n list: typeof helpers.listT;\n /** Builds a descriptor for a `GSList` of items. */\n slist: typeof helpers.slistT;\n /** Builds a descriptor for a `GPtrArray` of items. */\n ptrArray: typeof helpers.ptrArrayT;\n /** Builds a descriptor for a `GArray` of items, optionally with an explicit element size. */\n gArray: typeof helpers.gArrayT;\n /** Builds a descriptor for a `GByteArray`. */\n byteArray: typeof helpers.byteArrayT;\n /** Builds a descriptor for a C array whose length is carried by another argument. */\n sizedArray: typeof helpers.sizedArrayT;\n /** Builds a descriptor for a C array of a fixed length. */\n fixedArray: typeof helpers.fixedArrayT;\n /** Builds a descriptor for an out pointer into the buffer another argument supplied. */\n cursorArray: typeof helpers.cursorArrayT;\n /** Builds a descriptor for a function pointer, marshalling a JavaScript function into a native closure. */\n callback: typeof helpers.callbackT;\n /**\n * Binds a native function, wiring up argument directions, `GError` checking, and packing output\n * arguments into the result.\n */\n fn: typeof fn;\n};\n\n/**\n * Type descriptor builder: a collection of factory helpers that describe C types for\n * FFI marshalling, plus `bind` to bind a native function and `fn` to describe a\n * function signature.\n */\nconst t: T = {\n bind,\n int8: helpers.int8T,\n uint8: helpers.uint8T,\n int16: helpers.int16T,\n uint16: helpers.uint16T,\n int32: helpers.int32T,\n uint32: helpers.uint32T,\n int64: helpers.int64T,\n uint64: helpers.uint64T,\n bigint64: helpers.bigint64T,\n biguint64: helpers.biguint64T,\n gtype: helpers.gtypeT,\n float32: helpers.float32T,\n float64: helpers.float64T,\n boolean: helpers.booleanT,\n void: helpers.voidT,\n unichar: helpers.unicharT,\n buffer: helpers.bufferT,\n string: helpers.stringT,\n object: helpers.objectT,\n boxed: helpers.boxedT,\n struct: helpers.structT,\n fundamental: helpers.fundamentalT,\n ref: helpers.refT,\n hashTable: helpers.hashTableT,\n enum: helpers.enumT,\n flags: helpers.flagsT,\n array: helpers.arrayT,\n list: helpers.listT,\n slist: helpers.slistT,\n ptrArray: helpers.ptrArrayT,\n gArray: helpers.gArrayT,\n byteArray: helpers.byteArrayT,\n sizedArray: helpers.sizedArrayT,\n fixedArray: helpers.fixedArrayT,\n cursorArray: helpers.cursorArrayT,\n callback: helpers.callbackT,\n fn,\n};\n\nexport { t };\n"]}
1
+ {"version":3,"file":"t.js","sourceRoot":"","sources":["../src/t.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAwF7B;;;;GAIG;AACH,MAAM,CAAC,GAAM;IACT,IAAI;IACJ,IAAI,EAAE,OAAO,CAAC,KAAK;IACnB,KAAK,EAAE,OAAO,CAAC,MAAM;IACrB,KAAK,EAAE,OAAO,CAAC,MAAM;IACrB,MAAM,EAAE,OAAO,CAAC,OAAO;IACvB,KAAK,EAAE,OAAO,CAAC,MAAM;IACrB,MAAM,EAAE,OAAO,CAAC,OAAO;IACvB,KAAK,EAAE,OAAO,CAAC,MAAM;IACrB,MAAM,EAAE,OAAO,CAAC,OAAO;IACvB,QAAQ,EAAE,OAAO,CAAC,SAAS;IAC3B,SAAS,EAAE,OAAO,CAAC,UAAU;IAC7B,KAAK,EAAE,OAAO,CAAC,MAAM;IACrB,OAAO,EAAE,OAAO,CAAC,QAAQ;IACzB,OAAO,EAAE,OAAO,CAAC,QAAQ;IACzB,OAAO,EAAE,OAAO,CAAC,QAAQ;IACzB,IAAI,EAAE,OAAO,CAAC,KAAK;IACnB,OAAO,EAAE,OAAO,CAAC,QAAQ;IACzB,MAAM,EAAE,OAAO,CAAC,OAAO;IACvB,MAAM,EAAE,OAAO,CAAC,OAAO;IACvB,MAAM,EAAE,OAAO,CAAC,OAAO;IACvB,KAAK,EAAE,OAAO,CAAC,MAAM;IACrB,MAAM,EAAE,OAAO,CAAC,OAAO;IACvB,WAAW,EAAE,OAAO,CAAC,YAAY;IACjC,GAAG,EAAE,OAAO,CAAC,IAAI;IACjB,SAAS,EAAE,OAAO,CAAC,UAAU;IAC7B,IAAI,EAAE,OAAO,CAAC,KAAK;IACnB,KAAK,EAAE,OAAO,CAAC,MAAM;IACrB,KAAK,EAAE,OAAO,CAAC,MAAM;IACrB,IAAI,EAAE,OAAO,CAAC,KAAK;IACnB,KAAK,EAAE,OAAO,CAAC,MAAM;IACrB,QAAQ,EAAE,OAAO,CAAC,SAAS;IAC3B,MAAM,EAAE,OAAO,CAAC,OAAO;IACvB,SAAS,EAAE,OAAO,CAAC,UAAU;IAC7B,UAAU,EAAE,OAAO,CAAC,WAAW;IAC/B,UAAU,EAAE,OAAO,CAAC,WAAW;IAC/B,WAAW,EAAE,OAAO,CAAC,YAAY;IACjC,QAAQ,EAAE,OAAO,CAAC,SAAS;IAC3B,EAAE;CACL,CAAC;AAEF,OAAO,EAAE,CAAC,EAAE,CAAC","sourcesContent":["import { bind } from \"./bind.js\";\nimport * as helpers from \"./descriptors.js\";\nimport { fn } from \"./fn.js\";\n\n/** The descriptor factories and function binders exposed as {@link t}. */\ntype T = {\n /** Binds a symbol in a shared library to a callable that marshals its arguments and return value. */\n bind: typeof bind;\n /** Descriptor for a `gint8`, marshalled as a number. */\n int8: typeof helpers.int8T;\n /** Descriptor for a `guint8`, marshalled as a number. */\n uint8: typeof helpers.uint8T;\n /** Descriptor for a `gint16`, marshalled as a number. */\n int16: typeof helpers.int16T;\n /** Descriptor for a `guint16`, marshalled as a number. */\n uint16: typeof helpers.uint16T;\n /** Descriptor for a `gint32`, marshalled as a number. */\n int32: typeof helpers.int32T;\n /** Descriptor for a `guint32`, marshalled as a number. */\n uint32: typeof helpers.uint32T;\n /** Descriptor for a `gint64`, marshalled as a number and rejected outside the 2^53 safe range. */\n int64: typeof helpers.int64T;\n /** Descriptor for a `guint64`, marshalled as a number and rejected outside the 2^53 safe range. */\n uint64: typeof helpers.uint64T;\n /** Descriptor for a `gint64`, marshalled as a bigint so the full 64-bit range survives. */\n bigint64: typeof helpers.bigint64T;\n /** Descriptor for a `guint64`, marshalled as a bigint so the full 64-bit range survives. */\n biguint64: typeof helpers.biguint64T;\n /** Descriptor for a `GType`, marshalled as a bigint and recognized as a GType by GValue conversion. */\n gtype: typeof helpers.gtypeT;\n /** Descriptor for a `gfloat`. */\n float32: typeof helpers.float32T;\n /** Descriptor for a `gdouble`. */\n float64: typeof helpers.float64T;\n /** Descriptor for a `gboolean`, marshalled as a JavaScript boolean. */\n boolean: typeof helpers.booleanT;\n /** Descriptor for the absence of a value, used as the return descriptor of a `void` function. */\n void: typeof helpers.voidT;\n /** Descriptor for a `gunichar`, marshalled as a single-character string or a codepoint number. */\n unichar: typeof helpers.unicharT;\n /** Descriptor for an opaque `gpointer` argument, taken from a typed array's memory or a numeric address. */\n buffer: typeof helpers.bufferT;\n /**\n * Builds a descriptor for a C string, whose optional length sizes the caller-allocated buffer\n * used when the string is passed by reference.\n */\n string: typeof helpers.stringT;\n /** Builds a descriptor for a `GObject`, wrapped in the class registered for its runtime GType. */\n object: typeof helpers.objectT;\n /** Builds a descriptor for a `GBoxed` value of the named type. */\n boxed: typeof helpers.boxedT;\n /** Builds a descriptor for a plain C struct. */\n struct: typeof helpers.structT;\n /** Builds a descriptor for a fundamental type whose lifetime is managed by named ref and unref functions. */\n fundamental: typeof helpers.fundamentalT;\n /** Wraps a descriptor in a pointer to it, for an output or inout argument. */\n ref: typeof helpers.refT;\n /** Builds a descriptor for a `GHashTable`, marshalled as an array of key/value pairs. */\n hashTable: typeof helpers.hashTableT;\n /** Builds a descriptor for an enumeration, resolving its GType from the named `get_type` function. */\n enum: typeof helpers.enumT;\n /** Builds a descriptor for a flags type, resolving its GType from the named `get_type` function. */\n flags: typeof helpers.flagsT;\n /** Builds a descriptor for an array of items in one of the supported container layouts. */\n array: typeof helpers.arrayT;\n /** Builds a descriptor for a `GList` of items. */\n list: typeof helpers.listT;\n /** Builds a descriptor for a `GSList` of items. */\n slist: typeof helpers.slistT;\n /** Builds a descriptor for a `GPtrArray` of items. */\n ptrArray: typeof helpers.ptrArrayT;\n /** Builds a descriptor for a `GArray` of items. */\n gArray: typeof helpers.gArrayT;\n /** Builds a descriptor for a `GByteArray`. */\n byteArray: typeof helpers.byteArrayT;\n /** Builds a descriptor for a C array whose length is carried by another argument. */\n sizedArray: typeof helpers.sizedArrayT;\n /** Builds a descriptor for a C array of a fixed length. */\n fixedArray: typeof helpers.fixedArrayT;\n /** Builds a descriptor for an out pointer into the buffer another argument supplied. */\n cursorArray: typeof helpers.cursorArrayT;\n /** Builds a descriptor for a function pointer, marshalling a JavaScript function into a native closure. */\n callback: typeof helpers.callbackT;\n /**\n * Binds a native function, wiring up argument directions, `GError` checking, and packing output\n * arguments into the result.\n */\n fn: typeof fn;\n};\n\n/**\n * Type descriptor builder: a collection of factory helpers that describe C types for\n * FFI marshalling, plus `bind` to bind a native function and `fn` to describe a\n * function signature.\n */\nconst t: T = {\n bind,\n int8: helpers.int8T,\n uint8: helpers.uint8T,\n int16: helpers.int16T,\n uint16: helpers.uint16T,\n int32: helpers.int32T,\n uint32: helpers.uint32T,\n int64: helpers.int64T,\n uint64: helpers.uint64T,\n bigint64: helpers.bigint64T,\n biguint64: helpers.biguint64T,\n gtype: helpers.gtypeT,\n float32: helpers.float32T,\n float64: helpers.float64T,\n boolean: helpers.booleanT,\n void: helpers.voidT,\n unichar: helpers.unicharT,\n buffer: helpers.bufferT,\n string: helpers.stringT,\n object: helpers.objectT,\n boxed: helpers.boxedT,\n struct: helpers.structT,\n fundamental: helpers.fundamentalT,\n ref: helpers.refT,\n hashTable: helpers.hashTableT,\n enum: helpers.enumT,\n flags: helpers.flagsT,\n array: helpers.arrayT,\n list: helpers.listT,\n slist: helpers.slistT,\n ptrArray: helpers.ptrArrayT,\n gArray: helpers.gArrayT,\n byteArray: helpers.byteArrayT,\n sizedArray: helpers.sizedArrayT,\n fixedArray: helpers.fixedArrayT,\n cursorArray: helpers.cursorArrayT,\n callback: helpers.callbackT,\n fn,\n};\n\nexport { t };\n"]}
@@ -0,0 +1,85 @@
1
+ import * as GLib from "@gtkx/gi/glib";
2
+ /** JavaScript type every GVariant basic type code unpacks to. */
3
+ type BasicValueMap = {
4
+ /** Boolean, held as a single byte reading 0 or 1. */
5
+ b: boolean;
6
+ /** Unsigned byte. */
7
+ y: number;
8
+ /** Signed 16-bit integer. */
9
+ n: number;
10
+ /** Unsigned 16-bit integer. */
11
+ q: number;
12
+ /** Signed 32-bit integer. */
13
+ i: number;
14
+ /** Unsigned 32-bit integer. */
15
+ u: number;
16
+ /** Index into the file descriptor list a message carries. */
17
+ h: number;
18
+ /** Double precision floating point number. */
19
+ d: number;
20
+ /** Signed 64-bit integer. */
21
+ x: bigint;
22
+ /** Unsigned 64-bit integer. */
23
+ t: bigint;
24
+ /** UTF-8 string, under no further constraint on what it holds. */
25
+ s: string;
26
+ /** D-Bus object path. */
27
+ o: string;
28
+ /** GVariant type signature. */
29
+ g: string;
30
+ /** Boxed variant holding a value of any type. */
31
+ v: GLib.Variant;
32
+ };
33
+ /** Single-character code of one of the GVariant basic types in {@link BasicValueMap}. */
34
+ type BasicCode = keyof BasicValueMap;
35
+ /** Parses the element type of an array, yielding the array type it produces and the rest of the string. */
36
+ type ParseArray<S extends string> = Parse<S> extends [infer V, infer R extends string] ? [V[], R] : never;
37
+ /** Parses the element type of a maybe, yielding the nullable type it produces and the rest of the string. */
38
+ type ParseMaybe<S extends string> = Parse<S> extends [infer V, infer R extends string] ? [V | null, R] : never;
39
+ /** Collects tuple member types into `Acc` up to the closing parenthesis, yielding them and the rest of the string. */
40
+ type ParseTuple<S extends string, Acc extends unknown[]> = S extends `)${infer Rest}` ? [Acc, Rest] : [Parse<S>] extends [never] ? never : Parse<S> extends [infer V, infer R extends string] ? ParseTuple<R, [...Acc, V]> : never;
41
+ /** Types a dictionary entry key can hold. */
42
+ type DictKey = string | number | bigint | boolean;
43
+ /** Parses the key and value types of a dictionary entry, yielding them and the rest of the string after its brace. */
44
+ type ParsePair<S extends string> = Parse<S> extends [infer K, infer R1 extends string] ? Parse<R1> extends [infer V, infer R2 extends string] ? R2 extends `}${infer R3}` ? [K] extends [DictKey] ? [K, V, R3] : never : never : never : never;
45
+ /**
46
+ * Parses a dictionary entry into the collection an array of those entries unpacks to, a record for string keys and a
47
+ * `Map` otherwise, plus the rest of the string.
48
+ */
49
+ type ParseDict<S extends string> = ParsePair<S> extends [infer K, infer V, infer R extends string] ? [[K] extends [string] ? Record<string, V> : Map<K, V>, R] : never;
50
+ /** Parses a standalone dictionary entry into a key and value pair, yielding it and the rest of the string. */
51
+ type ParseEntry<S extends string> = ParsePair<S> extends [infer K, infer V, infer R extends string] ? [[K, V], R] : never;
52
+ /** Parses what follows an `a` as a dictionary when it opens an entry, and as a plain array otherwise. */
53
+ type ParseArrayOrDict<S extends string> = S extends `{${infer Rest}` ? ParseDict<Rest> : ParseArray<S>;
54
+ /**
55
+ * Parses the type at the head of `S`, yielding the JavaScript type it unpacks to and the rest of the string, or
56
+ * `never` when the string is malformed.
57
+ */
58
+ type Parse<S extends string> = S extends `a${infer Rest}` ? ParseArrayOrDict<Rest> : S extends `m${infer Rest}` ? ParseMaybe<Rest> : S extends `(${infer Rest}` ? ParseTuple<Rest, []> : S extends `{${infer Rest}` ? ParseEntry<Rest> : S extends `${infer C}${infer Rest}` ? C extends BasicCode ? [BasicValueMap[C], Rest] : never : never;
59
+ /** JavaScript type a variant of type string `S` unpacks to, or `unknown` when `S` is not one complete type. */
60
+ type VariantValue<S extends string> = [Parse<S>] extends [never] ? unknown : Parse<S> extends [infer V, ""] ? V : unknown;
61
+ /**
62
+ * Packs a JavaScript value into the `GLib.Variant` a GVariant type string describes, building the
63
+ * nested arrays, dictionaries, tuples and maybes the type calls for. A type string given as a
64
+ * literal also types `value`, so `"as"` takes an array of strings, `"a{sv}"` a record of variants,
65
+ * `"(si)"` a string and a number pair, and a 64-bit type a `bigint`.
66
+ * @param typeString GVariant type of the variant to build, such as `"a{sv}"`.
67
+ * @param value Value to pack, shaped the way `typeString` describes.
68
+ * @returns The packed variant.
69
+ * @throws {Error} When the type string is not one complete GVariant type, or when a value packed as
70
+ * an object path or a type signature is not a valid one.
71
+ */
72
+ declare const toVariant: <S extends string>(typeString: S, value: VariantValue<S>) => GLib.Variant;
73
+ /**
74
+ * Unpacks a `GLib.Variant` into the JavaScript value a GVariant type string describes, the inverse
75
+ * of {@link toVariant}. A dictionary keyed by strings unpacks to a record and one keyed by anything
76
+ * else to a `Map`, an array to an array, a tuple to an array of its members, a maybe to its value or
77
+ * `null`, and a nested variant to the `GLib.Variant` itself.
78
+ * @param typeString GVariant type the variant holds, such as `"a{sv}"`.
79
+ * @param variant Variant to read, which has to hold that type.
80
+ * @returns The unpacked value, typed from `typeString` when it is given as a literal.
81
+ * @throws {Error} When the type string is not one complete GVariant type.
82
+ */
83
+ declare const fromVariant: <S extends string>(typeString: S, variant: GLib.Variant) => VariantValue<S>;
84
+ export { fromVariant, toVariant, type VariantValue };
85
+ //# sourceMappingURL=variant.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variant.d.ts","sourceRoot":"","sources":["../src/variant.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,220 @@
1
+ import * as GLib from "@gtkx/gi/glib";
2
+ const BASIC_CODES = "bynqiuxthdsogv";
3
+ const STRING_KEY_CODES = new Set(["s", "o", "g"]);
4
+ const CONTAINER_PARSERS = {
5
+ a: parseArrayNode,
6
+ m: parseMaybeNode,
7
+ "(": parseTupleNode,
8
+ "{": parseEntryNode,
9
+ };
10
+ const parsedTypes = new Map();
11
+ const unpackBasic = {
12
+ b: (variant) => variant.getBoolean(),
13
+ y: (variant) => variant.getByte(),
14
+ n: (variant) => variant.getInt16(),
15
+ q: (variant) => variant.getUint16(),
16
+ i: (variant) => variant.getInt32(),
17
+ u: (variant) => variant.getUint32(),
18
+ h: (variant) => variant.getHandle(),
19
+ d: (variant) => variant.getDouble(),
20
+ x: (variant) => variant.getInt64(),
21
+ t: (variant) => variant.getUint64(),
22
+ s: (variant) => variant.getString()[0],
23
+ o: (variant) => variant.getString()[0],
24
+ g: (variant) => variant.getString()[0],
25
+ v: (variant) => variant.getVariant(),
26
+ };
27
+ const packBasic = {
28
+ b: (value) => GLib.Variant.newBoolean(value),
29
+ y: (value) => GLib.Variant.newByte(value),
30
+ n: (value) => GLib.Variant.newInt16(value),
31
+ q: (value) => GLib.Variant.newUint16(value),
32
+ i: (value) => GLib.Variant.newInt32(value),
33
+ u: (value) => GLib.Variant.newUint32(value),
34
+ h: (value) => GLib.Variant.newHandle(value),
35
+ d: (value) => GLib.Variant.newDouble(value),
36
+ x: (value) => GLib.Variant.newInt64(value),
37
+ t: (value) => GLib.Variant.newUint64(value),
38
+ s: (value) => GLib.Variant.newString(value),
39
+ o: packObjectPath,
40
+ g: packSignature,
41
+ v: (value) => GLib.Variant.newVariant(value),
42
+ };
43
+ const isBasicCode = (code) => BASIC_CODES.includes(code);
44
+ const isStringKeyed = (key) => key.kind === "basic" && STRING_KEY_CODES.has(key.code);
45
+ const invalidType = (source) => new Error(`Invalid GVariant type string "${source}"`);
46
+ const parsePair = (source, start) => {
47
+ const [key, keyEnd] = parseNode(source, start);
48
+ if (key.kind !== "basic" || key.code === "v") {
49
+ throw invalidType(source);
50
+ }
51
+ const [value, valueEnd] = parseNode(source, keyEnd);
52
+ if (source[valueEnd] !== "}") {
53
+ throw invalidType(source);
54
+ }
55
+ return [key, value, valueEnd + 1];
56
+ };
57
+ function parseArrayNode(source, start) {
58
+ if (source[start] === "{") {
59
+ const [key, value, end] = parsePair(source, start + 1);
60
+ return [{ kind: "dict", entryTypeString: source.slice(start, end), key, value }, end];
61
+ }
62
+ const [element, end] = parseNode(source, start);
63
+ return [{ kind: "array", elementTypeString: source.slice(start, end), element }, end];
64
+ }
65
+ function parseMaybeNode(source, start) {
66
+ const [element, end] = parseNode(source, start);
67
+ return [{ kind: "maybe", elementTypeString: source.slice(start, end), element }, end];
68
+ }
69
+ function parseTupleNode(source, start) {
70
+ const items = [];
71
+ let position = start;
72
+ while (source[position] !== ")") {
73
+ if (position >= source.length) {
74
+ throw invalidType(source);
75
+ }
76
+ const [item, end] = parseNode(source, position);
77
+ items.push(item);
78
+ position = end;
79
+ }
80
+ return [{ kind: "tuple", items }, position + 1];
81
+ }
82
+ function parseEntryNode(source, start) {
83
+ const [key, value, end] = parsePair(source, start);
84
+ return [{ kind: "entry", key, value }, end];
85
+ }
86
+ const parseNode = (source, start) => {
87
+ const code = source[start];
88
+ if (code === undefined) {
89
+ throw invalidType(source);
90
+ }
91
+ const container = CONTAINER_PARSERS[code];
92
+ if (container !== undefined) {
93
+ return container(source, start + 1);
94
+ }
95
+ if (isBasicCode(code)) {
96
+ return [{ kind: "basic", code }, start + 1];
97
+ }
98
+ throw invalidType(source);
99
+ };
100
+ const parseVariantType = (typeString) => {
101
+ const cached = parsedTypes.get(typeString);
102
+ if (cached !== undefined) {
103
+ return cached;
104
+ }
105
+ const [node, end] = parseNode(typeString, 0);
106
+ if (end !== typeString.length) {
107
+ throw invalidType(typeString);
108
+ }
109
+ parsedTypes.set(typeString, node);
110
+ return node;
111
+ };
112
+ const unpackChildren = (variant, unpackChild) => {
113
+ const children = [];
114
+ const count = variant.nChildren();
115
+ for (let index = 0; index < count; index += 1) {
116
+ children.push(unpackChild(variant.getChildValue(index)));
117
+ }
118
+ return children;
119
+ };
120
+ const unpackPair = (key, value, entry) => [
121
+ unpackNode(key, entry.getChildValue(0)),
122
+ unpackNode(value, entry.getChildValue(1)),
123
+ ];
124
+ const unpackDict = (node, variant) => {
125
+ const entries = unpackChildren(variant, (entry) => unpackPair(node.key, node.value, entry));
126
+ if (!isStringKeyed(node.key)) {
127
+ return new Map(entries);
128
+ }
129
+ const stringEntries = entries.map(([key, value]) => [key, value]);
130
+ return Object.fromEntries(stringEntries);
131
+ };
132
+ const unpackMaybe = (element, variant) => {
133
+ const child = variant.getMaybe();
134
+ return child === null ? null : unpackNode(element, child);
135
+ };
136
+ const unpackNode = (node, variant) => {
137
+ switch (node.kind) {
138
+ case "basic": {
139
+ return unpackBasic[node.code](variant);
140
+ }
141
+ case "array": {
142
+ return unpackChildren(variant, (child) => unpackNode(node.element, child));
143
+ }
144
+ case "dict": {
145
+ return unpackDict(node, variant);
146
+ }
147
+ case "entry": {
148
+ return unpackPair(node.key, node.value, variant);
149
+ }
150
+ case "tuple": {
151
+ return node.items.map((item, index) => unpackNode(item, variant.getChildValue(index)));
152
+ }
153
+ case "maybe": {
154
+ return unpackMaybe(node.element, variant);
155
+ }
156
+ }
157
+ };
158
+ const packValidatedString = (value, isValid, description, construct) => {
159
+ if (typeof value !== "string" || !isValid(value)) {
160
+ throw new Error(`"${String(value)}" is not a valid GVariant ${description}`);
161
+ }
162
+ return construct(value);
163
+ };
164
+ function packObjectPath(value) {
165
+ return packValidatedString(value, (path) => GLib.Variant.isObjectPath(path), "object path", (path) => GLib.Variant.newObjectPath(path));
166
+ }
167
+ function packSignature(value) {
168
+ return packValidatedString(value, (signature) => GLib.Variant.isSignature(signature), "type signature", (signature) => GLib.Variant.newSignature(signature));
169
+ }
170
+ const packEntry = (key, value, pair) => GLib.Variant.newDictEntry(packNode(key, pair[0]), packNode(value, pair[1]));
171
+ const dictEntries = (value) => value instanceof Map ? [...value] : Object.entries(value);
172
+ const packDict = (node, value) => GLib.Variant.newArray(GLib.VariantType.new(node.entryTypeString), dictEntries(value).map((pair) => packEntry(node.key, node.value, pair)));
173
+ const packMaybe = (node, value) => GLib.Variant.newMaybe(GLib.VariantType.new(node.elementTypeString), value === null ? null : packNode(node.element, value));
174
+ const packNode = (node, value) => {
175
+ switch (node.kind) {
176
+ case "basic": {
177
+ return packBasic[node.code](value);
178
+ }
179
+ case "array": {
180
+ return GLib.Variant.newArray(GLib.VariantType.new(node.elementTypeString), value.map((item) => packNode(node.element, item)));
181
+ }
182
+ case "dict": {
183
+ return packDict(node, value);
184
+ }
185
+ case "entry": {
186
+ return packEntry(node.key, node.value, value);
187
+ }
188
+ case "tuple": {
189
+ return GLib.Variant.newTuple(node.items.map((item, index) => packNode(item, value[index])));
190
+ }
191
+ case "maybe": {
192
+ return packMaybe(node, value);
193
+ }
194
+ }
195
+ };
196
+ /**
197
+ * Packs a JavaScript value into the `GLib.Variant` a GVariant type string describes, building the
198
+ * nested arrays, dictionaries, tuples and maybes the type calls for. A type string given as a
199
+ * literal also types `value`, so `"as"` takes an array of strings, `"a{sv}"` a record of variants,
200
+ * `"(si)"` a string and a number pair, and a 64-bit type a `bigint`.
201
+ * @param typeString GVariant type of the variant to build, such as `"a{sv}"`.
202
+ * @param value Value to pack, shaped the way `typeString` describes.
203
+ * @returns The packed variant.
204
+ * @throws {Error} When the type string is not one complete GVariant type, or when a value packed as
205
+ * an object path or a type signature is not a valid one.
206
+ */
207
+ const toVariant = (typeString, value) => packNode(parseVariantType(typeString), value);
208
+ /**
209
+ * Unpacks a `GLib.Variant` into the JavaScript value a GVariant type string describes, the inverse
210
+ * of {@link toVariant}. A dictionary keyed by strings unpacks to a record and one keyed by anything
211
+ * else to a `Map`, an array to an array, a tuple to an array of its members, a maybe to its value or
212
+ * `null`, and a nested variant to the `GLib.Variant` itself.
213
+ * @param typeString GVariant type the variant holds, such as `"a{sv}"`.
214
+ * @param variant Variant to read, which has to hold that type.
215
+ * @returns The unpacked value, typed from `typeString` when it is given as a literal.
216
+ * @throws {Error} When the type string is not one complete GVariant type.
217
+ */
218
+ const fromVariant = (typeString, variant) => unpackNode(parseVariantType(typeString), variant);
219
+ export { fromVariant, toVariant };
220
+ //# sourceMappingURL=variant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variant.js","sourceRoot":"","sources":["../src/variant.ts"],"names":[],"mappings":"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","sourcesContent":["import * as GLib from \"@gtkx/gi/glib\";\n\n/** JavaScript type every GVariant basic type code unpacks to. */\ntype BasicValueMap = {\n /** Boolean, held as a single byte reading 0 or 1. */\n b: boolean;\n /** Unsigned byte. */\n y: number;\n /** Signed 16-bit integer. */\n n: number;\n /** Unsigned 16-bit integer. */\n q: number;\n /** Signed 32-bit integer. */\n i: number;\n /** Unsigned 32-bit integer. */\n u: number;\n /** Index into the file descriptor list a message carries. */\n h: number;\n /** Double precision floating point number. */\n d: number;\n /** Signed 64-bit integer. */\n x: bigint;\n /** Unsigned 64-bit integer. */\n t: bigint;\n /** UTF-8 string, under no further constraint on what it holds. */\n s: string;\n /** D-Bus object path. */\n o: string;\n /** GVariant type signature. */\n g: string;\n /** Boxed variant holding a value of any type. */\n v: GLib.Variant;\n};\n\n/** Single-character code of one of the GVariant basic types in {@link BasicValueMap}. */\ntype BasicCode = keyof BasicValueMap;\n/** Parses the element type of an array, yielding the array type it produces and the rest of the string. */\ntype ParseArray<S extends string> = Parse<S> extends [infer V, infer R extends string] ? [V[], R] : never;\n/** Parses the element type of a maybe, yielding the nullable type it produces and the rest of the string. */\ntype ParseMaybe<S extends string> = Parse<S> extends [infer V, infer R extends string] ? [V | null, R] : never;\n\n/** Collects tuple member types into `Acc` up to the closing parenthesis, yielding them and the rest of the string. */\ntype ParseTuple<S extends string, Acc extends unknown[]> = S extends `)${infer Rest}`\n ? [Acc, Rest]\n : [Parse<S>] extends [never]\n ? never\n : Parse<S> extends [infer V, infer R extends string]\n ? ParseTuple<R, [...Acc, V]>\n : never;\n\n/** Types a dictionary entry key can hold. */\ntype DictKey = string | number | bigint | boolean;\n\n/** Parses the key and value types of a dictionary entry, yielding them and the rest of the string after its brace. */\ntype ParsePair<S extends string> =\n Parse<S> extends [infer K, infer R1 extends string]\n ? Parse<R1> extends [infer V, infer R2 extends string]\n ? R2 extends `}${infer R3}`\n ? [K] extends [DictKey]\n ? [K, V, R3]\n : never\n : never\n : never\n : never;\n\n/**\n * Parses a dictionary entry into the collection an array of those entries unpacks to, a record for string keys and a\n * `Map` otherwise, plus the rest of the string.\n */\ntype ParseDict<S extends string> =\n ParsePair<S> extends [infer K, infer V, infer R extends string]\n ? [[K] extends [string] ? Record<string, V> : Map<K, V>, R]\n : never;\n\n/** Parses a standalone dictionary entry into a key and value pair, yielding it and the rest of the string. */\ntype ParseEntry<S extends string> =\n ParsePair<S> extends [infer K, infer V, infer R extends string] ? [[K, V], R] : never;\n\n/** Parses what follows an `a` as a dictionary when it opens an entry, and as a plain array otherwise. */\ntype ParseArrayOrDict<S extends string> = S extends `{${infer Rest}` ? ParseDict<Rest> : ParseArray<S>;\n\n/**\n * Parses the type at the head of `S`, yielding the JavaScript type it unpacks to and the rest of the string, or\n * `never` when the string is malformed.\n */\ntype Parse<S extends string> = S extends `a${infer Rest}`\n ? ParseArrayOrDict<Rest>\n : S extends `m${infer Rest}`\n ? ParseMaybe<Rest>\n : S extends `(${infer Rest}`\n ? ParseTuple<Rest, []>\n : S extends `{${infer Rest}`\n ? ParseEntry<Rest>\n : S extends `${infer C}${infer Rest}`\n ? C extends BasicCode\n ? [BasicValueMap[C], Rest]\n : never\n : never;\n\n/** JavaScript type a variant of type string `S` unpacks to, or `unknown` when `S` is not one complete type. */\ntype VariantValue<S extends string> = [Parse<S>] extends [never]\n ? unknown\n : Parse<S> extends [infer V, \"\"]\n ? V\n : unknown;\n\ntype VariantTypeNode =\n | { kind: \"basic\"; code: BasicCode } |\n { kind: \"array\"; elementTypeString: string; element: VariantTypeNode } |\n { kind: \"dict\"; entryTypeString: string; key: VariantTypeNode; value: VariantTypeNode } |\n { kind: \"entry\"; key: VariantTypeNode; value: VariantTypeNode } |\n { kind: \"tuple\"; items: VariantTypeNode[] } |\n { kind: \"maybe\"; elementTypeString: string; element: VariantTypeNode };\n\nconst BASIC_CODES = \"bynqiuxthdsogv\";\nconst STRING_KEY_CODES: Set<string> = new Set([\"s\", \"o\", \"g\"]);\n\nconst CONTAINER_PARSERS: Record<string, (source: string, start: number) => [VariantTypeNode, number]> = {\n a: parseArrayNode,\n m: parseMaybeNode,\n \"(\": parseTupleNode,\n \"{\": parseEntryNode,\n};\n\nconst parsedTypes: Map<string, VariantTypeNode> = new Map();\n\nconst unpackBasic: Record<BasicCode, (variant: GLib.Variant) => unknown> = {\n b: (variant) => variant.getBoolean(),\n y: (variant) => variant.getByte(),\n n: (variant) => variant.getInt16(),\n q: (variant) => variant.getUint16(),\n i: (variant) => variant.getInt32(),\n u: (variant) => variant.getUint32(),\n h: (variant) => variant.getHandle(),\n d: (variant) => variant.getDouble(),\n x: (variant) => variant.getInt64(),\n t: (variant) => variant.getUint64(),\n s: (variant) => variant.getString()[0],\n o: (variant) => variant.getString()[0],\n g: (variant) => variant.getString()[0],\n v: (variant) => variant.getVariant(),\n};\n\nconst packBasic: Record<BasicCode, (value: unknown) => GLib.Variant> = {\n b: (value) => GLib.Variant.newBoolean(value as boolean),\n y: (value) => GLib.Variant.newByte(value as number),\n n: (value) => GLib.Variant.newInt16(value as number),\n q: (value) => GLib.Variant.newUint16(value as number),\n i: (value) => GLib.Variant.newInt32(value as number),\n u: (value) => GLib.Variant.newUint32(value as number),\n h: (value) => GLib.Variant.newHandle(value as number),\n d: (value) => GLib.Variant.newDouble(value as number),\n x: (value) => GLib.Variant.newInt64(value as bigint),\n t: (value) => GLib.Variant.newUint64(value as bigint),\n s: (value) => GLib.Variant.newString(value as string),\n o: packObjectPath,\n g: packSignature,\n v: (value) => GLib.Variant.newVariant(value as GLib.Variant),\n};\n\nconst isBasicCode = (code: string): code is BasicCode => BASIC_CODES.includes(code);\nconst isStringKeyed = (key: VariantTypeNode): boolean => key.kind === \"basic\" && STRING_KEY_CODES.has(key.code);\nconst invalidType = (source: string): Error => new Error(`Invalid GVariant type string \"${source}\"`);\n\nconst parsePair = (source: string, start: number): [VariantTypeNode, VariantTypeNode, number] => {\n const [key, keyEnd] = parseNode(source, start);\n\n if (key.kind !== \"basic\" || key.code === \"v\") {\n throw invalidType(source);\n }\n\n const [value, valueEnd] = parseNode(source, keyEnd);\n\n if (source[valueEnd] !== \"}\") {\n throw invalidType(source);\n }\n\n return [key, value, valueEnd + 1];\n};\n\nfunction parseArrayNode(source: string, start: number): [VariantTypeNode, number] {\n if (source[start] === \"{\") {\n const [key, value, end] = parsePair(source, start + 1);\n\n return [{ kind: \"dict\", entryTypeString: source.slice(start, end), key, value }, end];\n }\n\n const [element, end] = parseNode(source, start);\n\n return [{ kind: \"array\", elementTypeString: source.slice(start, end), element }, end];\n}\n\nfunction parseMaybeNode(source: string, start: number): [VariantTypeNode, number] {\n const [element, end] = parseNode(source, start);\n\n return [{ kind: \"maybe\", elementTypeString: source.slice(start, end), element }, end];\n}\n\nfunction parseTupleNode(source: string, start: number): [VariantTypeNode, number] {\n const items: VariantTypeNode[] = [];\n let position = start;\n\n while (source[position] !== \")\") {\n if (position >= source.length) {\n throw invalidType(source);\n }\n\n const [item, end] = parseNode(source, position);\n items.push(item);\n position = end;\n }\n\n return [{ kind: \"tuple\", items }, position + 1];\n}\n\nfunction parseEntryNode(source: string, start: number): [VariantTypeNode, number] {\n const [key, value, end] = parsePair(source, start);\n\n return [{ kind: \"entry\", key, value }, end];\n}\n\nconst parseNode = (source: string, start: number): [VariantTypeNode, number] => {\n const code = source[start];\n\n if (code === undefined) {\n throw invalidType(source);\n }\n\n const container = CONTAINER_PARSERS[code];\n\n if (container !== undefined) {\n return container(source, start + 1);\n }\n\n if (isBasicCode(code)) {\n return [{ kind: \"basic\", code }, start + 1];\n }\n\n throw invalidType(source);\n};\n\nconst parseVariantType = (typeString: string): VariantTypeNode => {\n const cached = parsedTypes.get(typeString);\n\n if (cached !== undefined) {\n return cached;\n }\n\n const [node, end] = parseNode(typeString, 0);\n\n if (end !== typeString.length) {\n throw invalidType(typeString);\n }\n\n parsedTypes.set(typeString, node);\n\n return node;\n};\n\nconst unpackChildren = (variant: GLib.Variant, unpackChild: (child: GLib.Variant) => unknown): unknown[] => {\n const children: unknown[] = [];\n const count = variant.nChildren();\n\n for (let index = 0; index < count; index += 1) {\n children.push(unpackChild(variant.getChildValue(index)));\n }\n\n return children;\n};\n\nconst unpackPair = (key: VariantTypeNode, value: VariantTypeNode, entry: GLib.Variant): [unknown, unknown] => [\n unpackNode(key, entry.getChildValue(0)),\n unpackNode(value, entry.getChildValue(1)),\n];\n\nconst unpackDict = (\n node: { key: VariantTypeNode; value: VariantTypeNode },\n variant: GLib.Variant,\n): Record<string, unknown> | Map<unknown, unknown> => {\n const entries = unpackChildren(variant, (entry) => unpackPair(node.key, node.value, entry)) as [unknown, unknown][];\n\n if (!isStringKeyed(node.key)) {\n return new Map(entries);\n }\n\n const stringEntries: [string, unknown][] = entries.map(([key, value]) => [key as string, value]);\n\n return Object.fromEntries(stringEntries);\n};\n\nconst unpackMaybe = (element: VariantTypeNode, variant: GLib.Variant): unknown => {\n const child = variant.getMaybe();\n\n return child === null ? null : unpackNode(element, child);\n};\n\nconst unpackNode = (node: VariantTypeNode, variant: GLib.Variant): unknown => {\n switch (node.kind) {\n case \"basic\": {\n return unpackBasic[node.code](variant);\n }\n case \"array\": {\n return unpackChildren(variant, (child) => unpackNode(node.element, child));\n }\n case \"dict\": {\n return unpackDict(node, variant);\n }\n case \"entry\": {\n return unpackPair(node.key, node.value, variant);\n }\n case \"tuple\": {\n return node.items.map((item, index) => unpackNode(item, variant.getChildValue(index)));\n }\n case \"maybe\": {\n return unpackMaybe(node.element, variant);\n }\n }\n};\n\nconst packValidatedString = (\n value: unknown,\n isValid: (value: string) => boolean,\n description: string,\n construct: (value: string) => GLib.Variant,\n): GLib.Variant => {\n if (typeof value !== \"string\" || !isValid(value)) {\n throw new Error(`\"${String(value)}\" is not a valid GVariant ${description}`);\n }\n\n return construct(value);\n};\n\nfunction packObjectPath(value: unknown): GLib.Variant {\n return packValidatedString(\n value,\n (path) => GLib.Variant.isObjectPath(path),\n \"object path\",\n (path) => GLib.Variant.newObjectPath(path),\n );\n}\n\nfunction packSignature(value: unknown): GLib.Variant {\n return packValidatedString(\n value,\n (signature) => GLib.Variant.isSignature(signature),\n \"type signature\",\n (signature) => GLib.Variant.newSignature(signature),\n );\n}\n\nconst packEntry = (key: VariantTypeNode, value: VariantTypeNode, pair: [unknown, unknown]): GLib.Variant =>\n GLib.Variant.newDictEntry(packNode(key, pair[0]), packNode(value, pair[1]));\n\nconst dictEntries = (value: unknown): [unknown, unknown][] =>\n value instanceof Map ? [...value] : Object.entries(value as Record<string, unknown>);\n\nconst packDict = (\n node: { entryTypeString: string; key: VariantTypeNode; value: VariantTypeNode },\n value: unknown,\n): GLib.Variant =>\n GLib.Variant.newArray(\n GLib.VariantType.new(node.entryTypeString),\n dictEntries(value).map((pair) => packEntry(node.key, node.value, pair)),\n );\n\nconst packMaybe = (node: { elementTypeString: string; element: VariantTypeNode }, value: unknown): GLib.Variant =>\n GLib.Variant.newMaybe(\n GLib.VariantType.new(node.elementTypeString),\n value === null ? null : packNode(node.element, value),\n );\n\nconst packNode = (node: VariantTypeNode, value: unknown): GLib.Variant => {\n switch (node.kind) {\n case \"basic\": {\n return packBasic[node.code](value);\n }\n case \"array\": {\n return GLib.Variant.newArray(\n GLib.VariantType.new(node.elementTypeString),\n (value as unknown[]).map((item) => packNode(node.element, item)),\n );\n }\n case \"dict\": {\n return packDict(node, value);\n }\n case \"entry\": {\n return packEntry(node.key, node.value, value as [unknown, unknown]);\n }\n case \"tuple\": {\n return GLib.Variant.newTuple(\n node.items.map((item, index) => packNode(item, (value as unknown[])[index])),\n );\n }\n case \"maybe\": {\n return packMaybe(node, value);\n }\n }\n};\n\n/**\n * Packs a JavaScript value into the `GLib.Variant` a GVariant type string describes, building the\n * nested arrays, dictionaries, tuples and maybes the type calls for. A type string given as a\n * literal also types `value`, so `\"as\"` takes an array of strings, `\"a{sv}\"` a record of variants,\n * `\"(si)\"` a string and a number pair, and a 64-bit type a `bigint`.\n * @param typeString GVariant type of the variant to build, such as `\"a{sv}\"`.\n * @param value Value to pack, shaped the way `typeString` describes.\n * @returns The packed variant.\n * @throws {Error} When the type string is not one complete GVariant type, or when a value packed as\n * an object path or a type signature is not a valid one.\n */\nconst toVariant = <S extends string>(typeString: S, value: VariantValue<S>): GLib.Variant =>\n packNode(parseVariantType(typeString), value);\n\n/**\n * Unpacks a `GLib.Variant` into the JavaScript value a GVariant type string describes, the inverse\n * of {@link toVariant}. A dictionary keyed by strings unpacks to a record and one keyed by anything\n * else to a `Map`, an array to an array, a tuple to an array of its members, a maybe to its value or\n * `null`, and a nested variant to the `GLib.Variant` itself.\n * @param typeString GVariant type the variant holds, such as `\"a{sv}\"`.\n * @param variant Variant to read, which has to hold that type.\n * @returns The unpacked value, typed from `typeString` when it is given as a literal.\n * @throws {Error} When the type string is not one complete GVariant type.\n */\nconst fromVariant = <S extends string>(typeString: S, variant: GLib.Variant): VariantValue<S> =>\n unpackNode(parseVariantType(typeString), variant) as VariantValue<S>;\n\nexport { fromVariant, toVariant, type VariantValue };\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gtkx/runtime",
3
- "version": "1.1.0",
3
+ "version": "1.2.1",
4
4
  "description": "FFI runtime the generated GTKX bindings call into: type descriptors, GValue marshalling, signals, GObject lifecycle",
5
5
  "keywords": [
6
6
  "gtkx",
@@ -55,11 +55,11 @@
55
55
  "node": ">=24"
56
56
  },
57
57
  "dependencies": {
58
- "@gtkx/native": "1.1.0",
59
- "@gtkx/utils": "1.1.0"
58
+ "@gtkx/utils": "1.2.1",
59
+ "@gtkx/native": "1.2.1"
60
60
  },
61
61
  "devDependencies": {
62
- "@gtkx/vitest": "1.1.0"
62
+ "@gtkx/vitest": "1.2.1"
63
63
  },
64
64
  "scripts": {
65
65
  "release": "tsx ../../scripts/release-package.ts"