@gtkx/gir 0.10.2 → 0.10.4

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/dist/types.d.ts CHANGED
@@ -281,7 +281,7 @@ export declare const registerEnumsFromNamespace: (typeMapper: TypeMapper, namesp
281
281
  /**
282
282
  * The kind of a registered type.
283
283
  */
284
- export type TypeKind = "class" | "interface" | "enum" | "record" | "callback";
284
+ export type TypeKind = "class" | "interface" | "enum" | "flags" | "record" | "callback";
285
285
  /**
286
286
  * A type registered in the type registry.
287
287
  *
@@ -349,6 +349,13 @@ export declare class TypeRegistry {
349
349
  * @param name - The enum name
350
350
  */
351
351
  registerEnum(namespace: string, name: string): void;
352
+ /**
353
+ * Registers a flags (bitfield) type.
354
+ *
355
+ * @param namespace - The GIR namespace
356
+ * @param name - The flags name
357
+ */
358
+ registerFlags(namespace: string, name: string): void;
352
359
  /**
353
360
  * Registers a record (boxed) type.
354
361
  *
@@ -450,6 +457,8 @@ export type MappedType = {
450
457
  export declare class TypeMapper {
451
458
  private enumNames;
452
459
  private enumTransforms;
460
+ private flagsNames;
461
+ private flagsTransforms;
453
462
  private recordNames;
454
463
  private recordTransforms;
455
464
  private recordGlibTypes;
@@ -468,6 +477,13 @@ export declare class TypeMapper {
468
477
  * @param transformedName - Optional transformed TypeScript name
469
478
  */
470
479
  registerEnum(originalName: string, transformedName?: string): void;
480
+ /**
481
+ * Registers a flags (bitfield) type for type mapping.
482
+ *
483
+ * @param originalName - The GIR flags name
484
+ * @param transformedName - Optional transformed TypeScript name
485
+ */
486
+ registerFlags(originalName: string, transformedName?: string): void;
471
487
  /**
472
488
  * Registers a record for type mapping.
473
489
  *
@@ -499,9 +515,10 @@ export declare class TypeMapper {
499
515
  *
500
516
  * @param girType - The GIR type to map
501
517
  * @param isReturn - Whether this is a return type (affects ownership)
518
+ * @param parentTransferOwnership - Transfer ownership from parent (used for array elements)
502
519
  * @returns The mapped type with TypeScript and FFI descriptors
503
520
  */
504
- mapType(girType: GirType, isReturn?: boolean): MappedType;
521
+ mapType(girType: GirType, isReturn?: boolean, parentTransferOwnership?: string): MappedType;
505
522
  isCallback(typeName: string): boolean;
506
523
  /**
507
524
  * Maps a function parameter to TypeScript and FFI representations.
package/dist/types.js CHANGED
@@ -33,7 +33,7 @@ export const registerEnumsFromNamespace = (typeMapper, namespace) => {
33
33
  typeMapper.registerEnum(enumeration.name, toPascalCase(enumeration.name));
34
34
  }
35
35
  for (const bitfield of namespace.bitfields) {
36
- typeMapper.registerEnum(bitfield.name, toPascalCase(bitfield.name));
36
+ typeMapper.registerFlags(bitfield.name, toPascalCase(bitfield.name));
37
37
  }
38
38
  };
39
39
  /**
@@ -95,6 +95,21 @@ export class TypeRegistry {
95
95
  transformedName,
96
96
  });
97
97
  }
98
+ /**
99
+ * Registers a flags (bitfield) type.
100
+ *
101
+ * @param namespace - The GIR namespace
102
+ * @param name - The flags name
103
+ */
104
+ registerFlags(namespace, name) {
105
+ const transformedName = toPascalCase(name);
106
+ this.types.set(`${namespace}.${name}`, {
107
+ kind: "flags",
108
+ name,
109
+ namespace,
110
+ transformedName,
111
+ });
112
+ }
98
113
  /**
99
114
  * Registers a record (boxed) type.
100
115
  *
@@ -197,7 +212,7 @@ export class TypeRegistry {
197
212
  registry.registerEnum(ns.name, enumeration.name);
198
213
  }
199
214
  for (const bitfield of ns.bitfields) {
200
- registry.registerEnum(ns.name, bitfield.name);
215
+ registry.registerFlags(ns.name, bitfield.name);
201
216
  }
202
217
  for (const record of ns.records) {
203
218
  if (record.disguised)
@@ -425,6 +440,8 @@ const BASIC_TYPE_MAP = new Map([
425
440
  export class TypeMapper {
426
441
  enumNames = new Set();
427
442
  enumTransforms = new Map();
443
+ flagsNames = new Set();
444
+ flagsTransforms = new Map();
428
445
  recordNames = new Set();
429
446
  recordTransforms = new Map();
430
447
  recordGlibTypes = new Map();
@@ -448,6 +465,18 @@ export class TypeMapper {
448
465
  this.enumTransforms.set(originalName, transformedName);
449
466
  }
450
467
  }
468
+ /**
469
+ * Registers a flags (bitfield) type for type mapping.
470
+ *
471
+ * @param originalName - The GIR flags name
472
+ * @param transformedName - Optional transformed TypeScript name
473
+ */
474
+ registerFlags(originalName, transformedName) {
475
+ this.flagsNames.add(originalName);
476
+ if (transformedName) {
477
+ this.flagsTransforms.set(originalName, transformedName);
478
+ }
479
+ }
451
480
  /**
452
481
  * Registers a record for type mapping.
453
482
  *
@@ -512,9 +541,10 @@ export class TypeMapper {
512
541
  *
513
542
  * @param girType - The GIR type to map
514
543
  * @param isReturn - Whether this is a return type (affects ownership)
544
+ * @param parentTransferOwnership - Transfer ownership from parent (used for array elements)
515
545
  * @returns The mapped type with TypeScript and FFI descriptors
516
546
  */
517
- mapType(girType, isReturn = false) {
547
+ mapType(girType, isReturn = false, parentTransferOwnership) {
518
548
  if (girType.isArray || girType.name === "array") {
519
549
  const listType = girType.cType?.includes("GSList")
520
550
  ? "gslist"
@@ -522,7 +552,8 @@ export class TypeMapper {
522
552
  ? "glist"
523
553
  : undefined;
524
554
  if (girType.elementType) {
525
- const elementType = this.mapType(girType.elementType);
555
+ const elementTransferOwnership = girType.transferOwnership ?? parentTransferOwnership;
556
+ const elementType = this.mapType(girType.elementType, isReturn, elementTransferOwnership);
526
557
  return {
527
558
  ts: `${elementType.ts}[]`,
528
559
  ffi: listType
@@ -538,7 +569,8 @@ export class TypeMapper {
538
569
  };
539
570
  }
540
571
  if (STRING_TYPES.has(girType.name)) {
541
- const borrowed = girType.transferOwnership === "none";
572
+ const effectiveTransferOwnership = girType.transferOwnership ?? parentTransferOwnership;
573
+ const borrowed = effectiveTransferOwnership === "none";
542
574
  return {
543
575
  ts: "string",
544
576
  ffi: { type: "string", borrowed },
@@ -576,7 +608,7 @@ export class TypeMapper {
576
608
  }
577
609
  this.onSameNamespaceClassUsed?.(registered.transformedName, registered.name);
578
610
  }
579
- else if (registered.kind === "enum") {
611
+ else if (registered.kind === "enum" || registered.kind === "flags") {
580
612
  this.onEnumUsed?.(registered.transformedName);
581
613
  }
582
614
  else if (registered.kind === "record") {
@@ -589,6 +621,13 @@ export class TypeMapper {
589
621
  externalType,
590
622
  };
591
623
  }
624
+ if (registered.kind === "flags") {
625
+ return {
626
+ ts: qualifiedName,
627
+ ffi: { type: "int", size: 32, unsigned: true },
628
+ externalType,
629
+ };
630
+ }
592
631
  if (registered.kind === "record") {
593
632
  if (registered.name === "Variant" && registered.namespace === "GLib") {
594
633
  return {
@@ -651,6 +690,14 @@ export class TypeMapper {
651
690
  ffi: { type: "int", size: 32, unsigned: false },
652
691
  };
653
692
  }
693
+ if (this.flagsNames.has(girType.name)) {
694
+ const transformedName = this.flagsTransforms.get(girType.name) ?? girType.name;
695
+ this.onEnumUsed?.(transformedName);
696
+ return {
697
+ ts: transformedName,
698
+ ffi: { type: "int", size: 32, unsigned: true },
699
+ };
700
+ }
654
701
  if (this.recordNames.has(girType.name)) {
655
702
  const transformedName = this.recordTransforms.get(girType.name) ?? girType.name;
656
703
  const glibTypeName = this.recordGlibTypes.get(girType.name) ?? transformedName;
@@ -671,6 +718,14 @@ export class TypeMapper {
671
718
  ffi: { type: "int", size: 32, unsigned: false },
672
719
  };
673
720
  }
721
+ if (this.flagsNames.has(typeName)) {
722
+ const transformedName = this.flagsTransforms.get(typeName) ?? typeName;
723
+ this.onEnumUsed?.(transformedName);
724
+ return {
725
+ ts: transformedName,
726
+ ffi: { type: "int", size: 32, unsigned: true },
727
+ };
728
+ }
674
729
  if (this.recordNames.has(typeName)) {
675
730
  const transformedName = this.recordTransforms.get(typeName) ?? typeName;
676
731
  const glibTypeName = this.recordGlibTypes.get(typeName) ?? transformedName;
@@ -705,6 +760,13 @@ export class TypeMapper {
705
760
  externalType: isExternal ? externalType : undefined,
706
761
  };
707
762
  }
763
+ if (registered.kind === "flags") {
764
+ return {
765
+ ts: qualifiedName,
766
+ ffi: { type: "int", size: 32, unsigned: true },
767
+ externalType: isExternal ? externalType : undefined,
768
+ };
769
+ }
708
770
  if (registered.kind === "record") {
709
771
  if (registered.name === "Variant" && registered.namespace === "GLib") {
710
772
  return {
@@ -794,6 +856,13 @@ export class TypeMapper {
794
856
  externalType,
795
857
  };
796
858
  }
859
+ if (registered.kind === "flags") {
860
+ return {
861
+ ts: qualifiedName,
862
+ ffi: { type: "int", size: 32, unsigned: true },
863
+ externalType,
864
+ };
865
+ }
797
866
  if (registered.kind === "record") {
798
867
  if (registered.isPlainStruct) {
799
868
  return {
@@ -991,7 +1060,7 @@ export class TypeMapper {
991
1060
  ffi: { type: "callback" },
992
1061
  };
993
1062
  }
994
- const mapped = this.mapType(param.type);
1063
+ const mapped = this.mapType(param.type, false, param.transferOwnership);
995
1064
  const isObjectType = mapped.ffi.type === "gobject" || mapped.ffi.type === "boxed";
996
1065
  const isTransferFull = param.transferOwnership === "full";
997
1066
  const isTransferNone = param.transferOwnership === "none" || param.transferOwnership === undefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gtkx/gir",
3
- "version": "0.10.2",
3
+ "version": "0.10.4",
4
4
  "description": "GObject Introspection file parser for GTKX",
5
5
  "keywords": [
6
6
  "gtk",