@gtkx/runtime 1.0.0-rc.1 → 1.0.0-rc.2

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.
Files changed (116) hide show
  1. package/dist/arg.d.ts +6 -5
  2. package/dist/arg.d.ts.map +1 -1
  3. package/dist/arg.js +5 -4
  4. package/dist/arg.js.map +1 -1
  5. package/dist/bind.d.ts +3 -2
  6. package/dist/bind.d.ts.map +1 -1
  7. package/dist/bind.js +5 -3
  8. package/dist/bind.js.map +1 -1
  9. package/dist/callback.d.ts +3 -3
  10. package/dist/callback.d.ts.map +1 -1
  11. package/dist/callback.js +51 -33
  12. package/dist/callback.js.map +1 -1
  13. package/dist/descriptors.d.ts +67 -64
  14. package/dist/descriptors.d.ts.map +1 -1
  15. package/dist/descriptors.js +92 -60
  16. package/dist/descriptors.js.map +1 -1
  17. package/dist/error.d.ts +5 -6
  18. package/dist/error.d.ts.map +1 -1
  19. package/dist/error.js +10 -6
  20. package/dist/error.js.map +1 -1
  21. package/dist/exit-hook.d.ts +2 -0
  22. package/dist/exit-hook.d.ts.map +1 -0
  23. package/dist/exit-hook.js +3 -0
  24. package/dist/exit-hook.js.map +1 -0
  25. package/dist/fn.d.ts +2 -2
  26. package/dist/fn.d.ts.map +1 -1
  27. package/dist/fn.js +26 -15
  28. package/dist/fn.js.map +1 -1
  29. package/dist/index.d.ts +3 -2
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +2 -1
  32. package/dist/index.js.map +1 -1
  33. package/dist/library.d.ts +6 -5
  34. package/dist/library.d.ts.map +1 -1
  35. package/dist/library.js +6 -5
  36. package/dist/library.js.map +1 -1
  37. package/dist/lifecycle.d.ts +10 -9
  38. package/dist/lifecycle.d.ts.map +1 -1
  39. package/dist/lifecycle.js +38 -23
  40. package/dist/lifecycle.js.map +1 -1
  41. package/dist/listeners.d.ts +8 -8
  42. package/dist/listeners.d.ts.map +1 -1
  43. package/dist/listeners.js +28 -15
  44. package/dist/listeners.js.map +1 -1
  45. package/dist/mixin.d.ts +5 -11
  46. package/dist/mixin.d.ts.map +1 -1
  47. package/dist/mixin.js +24 -14
  48. package/dist/mixin.js.map +1 -1
  49. package/dist/native-value.d.ts +3 -2
  50. package/dist/native-value.d.ts.map +1 -1
  51. package/dist/native-value.js +75 -42
  52. package/dist/native-value.js.map +1 -1
  53. package/dist/object.d.ts +4 -3
  54. package/dist/object.d.ts.map +1 -1
  55. package/dist/object.js +8 -5
  56. package/dist/object.js.map +1 -1
  57. package/dist/promisify.d.ts +9 -1
  58. package/dist/promisify.d.ts.map +1 -1
  59. package/dist/promisify.js +18 -15
  60. package/dist/promisify.js.map +1 -1
  61. package/dist/properties.d.ts +14 -0
  62. package/dist/properties.d.ts.map +1 -0
  63. package/dist/properties.js +79 -0
  64. package/dist/properties.js.map +1 -0
  65. package/dist/register-class.d.ts +10 -2
  66. package/dist/register-class.d.ts.map +1 -1
  67. package/dist/register-class.js +83 -29
  68. package/dist/register-class.js.map +1 -1
  69. package/dist/registry.d.ts +23 -21
  70. package/dist/registry.d.ts.map +1 -1
  71. package/dist/registry.js +54 -35
  72. package/dist/registry.js.map +1 -1
  73. package/dist/signal.d.ts +7 -6
  74. package/dist/signal.d.ts.map +1 -1
  75. package/dist/signal.js +19 -12
  76. package/dist/signal.js.map +1 -1
  77. package/dist/t.d.ts +2 -2
  78. package/dist/t.d.ts.map +1 -1
  79. package/dist/t.js +2 -1
  80. package/dist/t.js.map +1 -1
  81. package/dist/tuple.d.ts +3 -2
  82. package/dist/tuple.d.ts.map +1 -1
  83. package/dist/tuple.js +7 -4
  84. package/dist/tuple.js.map +1 -1
  85. package/dist/type.d.ts +48 -41
  86. package/dist/type.d.ts.map +1 -1
  87. package/dist/type.js +107 -87
  88. package/dist/type.js.map +1 -1
  89. package/dist/value.d.ts +19 -10
  90. package/dist/value.d.ts.map +1 -1
  91. package/dist/value.js +164 -99
  92. package/dist/value.js.map +1 -1
  93. package/package.json +4 -6
  94. package/src/arg.ts +7 -5
  95. package/src/bind.ts +13 -4
  96. package/src/callback.ts +97 -35
  97. package/src/descriptors.ts +227 -85
  98. package/src/error.ts +18 -9
  99. package/src/exit-hook.ts +3 -0
  100. package/src/fn.ts +53 -22
  101. package/src/index.ts +4 -2
  102. package/src/library.ts +7 -5
  103. package/src/lifecycle.ts +54 -26
  104. package/src/listeners.ts +46 -18
  105. package/src/mixin.ts +39 -14
  106. package/src/native-value.ts +103 -46
  107. package/src/object.ts +19 -7
  108. package/src/promisify.ts +42 -15
  109. package/src/properties.ts +115 -0
  110. package/src/register-class.ts +157 -30
  111. package/src/registry.ts +144 -54
  112. package/src/signal.ts +53 -13
  113. package/src/t.ts +3 -1
  114. package/src/tuple.ts +16 -4
  115. package/src/type.ts +183 -93
  116. package/src/value.ts +231 -108
@@ -1,10 +1,42 @@
1
1
  import { getWrapperClass, tryGetHandle, wrapHandle } from "./registry.js";
2
2
  import { resolveDescriptorType } from "./type.js";
3
- const collectionFromNative = (descriptor, value) => {
4
- if (value === null)
3
+ const MARSHALLED_KINDS = new Set([
4
+ "object",
5
+ "struct",
6
+ "boxed",
7
+ "fundamental",
8
+ "array",
9
+ "hashtable",
10
+ ]);
11
+ function isMarshalledDescriptor(descriptor) {
12
+ return MARSHALLED_KINDS.has(descriptor.kind);
13
+ }
14
+ function mapCollection(descriptor, value, convert) {
15
+ return value.map((item) => convert(descriptor.itemDescriptor, item));
16
+ }
17
+ function collectionFromNative(descriptor, value) {
18
+ return value === null ? null : mapCollection(descriptor, value, fromNative);
19
+ }
20
+ function boxedFromNative(descriptor, value) {
21
+ return value == null
22
+ ? null
23
+ : wrapHandle(value, getWrapperClass(resolveDescriptorType(descriptor)));
24
+ }
25
+ function fundamentalFromNative(descriptor, value) {
26
+ return value == null
27
+ ? null
28
+ : wrapHandle(value, descriptor.wrapperClass ?? getWrapperClass(resolveDescriptorType(descriptor)));
29
+ }
30
+ function hashTableFromNative(descriptor, value) {
31
+ if (value === null) {
5
32
  return null;
6
- return value.map((item) => fromNative(descriptor.itemDescriptor, item));
7
- };
33
+ }
34
+ const entries = value;
35
+ return new Map(entries.map(([key, val]) => [
36
+ fromNative(descriptor.keyDescriptor, key),
37
+ fromNative(descriptor.valueDescriptor, val),
38
+ ]));
39
+ }
8
40
  /**
9
41
  * Converts a raw value returned from native code into its JavaScript form,
10
42
  * wrapping object, struct, boxed, and fundamental handles and recursively
@@ -13,60 +45,61 @@ const collectionFromNative = (descriptor, value) => {
13
45
  * @param descriptor Describes the native type of the value.
14
46
  * @param value The raw native value to convert.
15
47
  */
16
- export function fromNative(descriptor, value) {
48
+ function fromNative(descriptor, value) {
49
+ if (!isMarshalledDescriptor(descriptor)) {
50
+ return value;
51
+ }
17
52
  switch (descriptor.kind) {
18
- case "object":
19
- return wrapHandle(value, undefined);
20
- case "struct":
53
+ case "object": {
54
+ return wrapHandle(value);
55
+ }
56
+ case "struct": {
21
57
  return wrapHandle(value, descriptor.wrapperClass);
22
- case "boxed":
23
- return value == null
24
- ? null
25
- : wrapHandle(value, getWrapperClass(resolveDescriptorType(descriptor)));
26
- case "fundamental":
27
- return value == null
28
- ? null
29
- : wrapHandle(value, descriptor.wrapperClass ??
30
- getWrapperClass(resolveDescriptorType(descriptor)));
31
- case "array":
58
+ }
59
+ case "boxed": {
60
+ return boxedFromNative(descriptor, value);
61
+ }
62
+ case "fundamental": {
63
+ return fundamentalFromNative(descriptor, value);
64
+ }
65
+ case "array": {
32
66
  return collectionFromNative(descriptor, value);
67
+ }
33
68
  case "hashtable": {
34
- if (value === null)
35
- return null;
36
- const entries = value;
37
- return new Map(entries.map(([key, val]) => [
38
- fromNative(descriptor.keyDescriptor, key),
39
- fromNative(descriptor.valueDescriptor, val),
40
- ]));
69
+ return hashTableFromNative(descriptor, value);
41
70
  }
42
- default:
43
- return value;
44
71
  }
45
72
  }
46
- const collectionToNative = (descriptor, value) => {
47
- if (value == null)
73
+ function collectionToNative(descriptor, value) {
74
+ return value == null ? null : mapCollection(descriptor, value, toNative);
75
+ }
76
+ function hashTableToNative(descriptor, value) {
77
+ if (value == null) {
48
78
  return null;
49
- return value.map((item) => toNative(descriptor.itemDescriptor, item));
50
- };
51
- export function toNative(descriptor, value) {
79
+ }
80
+ return [...value].map(([key, val]) => [
81
+ toNative(descriptor.keyDescriptor, key),
82
+ toNative(descriptor.valueDescriptor, val),
83
+ ]);
84
+ }
85
+ function toNative(descriptor, value) {
86
+ if (!isMarshalledDescriptor(descriptor)) {
87
+ return value;
88
+ }
52
89
  switch (descriptor.kind) {
53
90
  case "object":
54
91
  case "struct":
55
92
  case "boxed":
56
- case "fundamental":
93
+ case "fundamental": {
57
94
  return tryGetHandle(value) ?? null;
58
- case "array":
95
+ }
96
+ case "array": {
59
97
  return collectionToNative(descriptor, value);
98
+ }
60
99
  case "hashtable": {
61
- if (value == null)
62
- return null;
63
- return [...value].map(([key, val]) => [
64
- toNative(descriptor.keyDescriptor, key),
65
- toNative(descriptor.valueDescriptor, val),
66
- ]);
100
+ return hashTableToNative(descriptor, value);
67
101
  }
68
- default:
69
- return value;
70
102
  }
71
103
  }
104
+ export { fromNative, toNative };
72
105
  //# sourceMappingURL=native-value.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"native-value.js","sourceRoot":"","sources":["../src/native-value.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Descriptor, ExternalObject, Handle } from \"@gtkx/native\";\nimport type { ArrayDescriptor, FundamentalDescriptor, StructDescriptor } from \"./descriptors.js\";\nimport { getWrapperClass, tryGetHandle, wrapHandle } from \"./registry.js\";\nimport { resolveDescriptorType } from \"./type.js\";\n\nconst collectionFromNative = (descriptor: ArrayDescriptor, value: unknown): unknown => {\n if (value === null) return null;\n return (value as unknown[]).map((item) => fromNative(descriptor.itemDescriptor, item));\n};\n\n/**\n * Converts a raw value returned from native code into its JavaScript form,\n * wrapping object, struct, boxed, and fundamental handles and recursively\n * converting arrays and hash tables according to the descriptor.\n *\n * @param descriptor Describes the native type of the value.\n * @param value The raw native value to convert.\n */\nexport function fromNative(descriptor: Descriptor, value: unknown): unknown {\n switch (descriptor.kind) {\n case \"object\":\n return wrapHandle(value as ExternalObject<Handle> | null, undefined);\n case \"struct\":\n return wrapHandle(value as ExternalObject<Handle> | null, (descriptor as StructDescriptor).wrapperClass);\n case \"boxed\":\n return value == null\n ? null\n : wrapHandle(value as ExternalObject<Handle>, getWrapperClass(resolveDescriptorType(descriptor)));\n case \"fundamental\":\n return value == null\n ? null\n : wrapHandle(\n value as ExternalObject<Handle>,\n (descriptor as FundamentalDescriptor).wrapperClass ??\n getWrapperClass(resolveDescriptorType(descriptor)),\n );\n case \"array\":\n return collectionFromNative(descriptor, value);\n case \"hashtable\": {\n if (value === null) return null;\n const entries = value as [unknown, unknown][];\n return new Map(\n entries.map(([key, val]): [unknown, unknown] => [\n fromNative(descriptor.keyDescriptor, key),\n fromNative(descriptor.valueDescriptor, val),\n ]),\n );\n }\n default:\n return value;\n }\n}\n\nconst collectionToNative = (descriptor: ArrayDescriptor, value: unknown): unknown => {\n if (value == null) return null;\n return (value as unknown[]).map((item) => toNative(descriptor.itemDescriptor, item));\n};\n\nexport function toNative(descriptor: Descriptor, value: unknown): unknown {\n switch (descriptor.kind) {\n case \"object\":\n case \"struct\":\n case \"boxed\":\n case \"fundamental\":\n return tryGetHandle(value as object | null | undefined) ?? null;\n case \"array\":\n return collectionToNative(descriptor, value);\n case \"hashtable\": {\n if (value == null) return null;\n return [...(value as Map<unknown, unknown>)].map(([key, val]): [unknown, unknown] => [\n toNative(descriptor.keyDescriptor, key),\n toNative(descriptor.valueDescriptor, val),\n ]);\n }\n default:\n return value;\n }\n}\n"]}
1
+ {"version":3,"file":"native-value.js","sourceRoot":"","sources":["../src/native-value.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Descriptor, ExternalObject, Handle } from \"@gtkx/native\";\nimport type { ArrayDescriptor, FundamentalDescriptor, HashTableDescriptor, StructDescriptor } from \"./descriptors.js\";\nimport { getWrapperClass, tryGetHandle, wrapHandle } from \"./registry.js\";\nimport { resolveDescriptorType } from \"./type.js\";\n\ntype MarshalledKind = \"object\" | \"struct\" | \"boxed\" | \"fundamental\" | \"array\" | \"hashtable\";\ntype MarshalledDescriptor = Extract<Descriptor, { kind: MarshalledKind }>;\n\nconst MARSHALLED_KINDS: Set<Descriptor[\"kind\"]> = new Set<MarshalledKind>([\n \"object\",\n \"struct\",\n \"boxed\",\n \"fundamental\",\n \"array\",\n \"hashtable\",\n]);\n\nfunction isMarshalledDescriptor(descriptor: Descriptor): descriptor is MarshalledDescriptor {\n return MARSHALLED_KINDS.has(descriptor.kind);\n}\n\nfunction mapCollection(\n descriptor: ArrayDescriptor,\n value: unknown,\n convert: (itemDescriptor: Descriptor, item: unknown) => unknown,\n): unknown[] {\n return (value as unknown[]).map((item) => convert(descriptor.itemDescriptor, item));\n}\n\nfunction collectionFromNative(descriptor: ArrayDescriptor, value: unknown): unknown {\n return value === null ? null : mapCollection(descriptor, value, fromNative);\n}\n\nfunction boxedFromNative(descriptor: Descriptor, value: unknown): unknown {\n return value == null\n ? null\n : wrapHandle(value as ExternalObject<Handle>, getWrapperClass(resolveDescriptorType(descriptor)));\n}\n\nfunction fundamentalFromNative(descriptor: FundamentalDescriptor, value: unknown): unknown {\n return value == null\n ? null\n : wrapHandle(\n value as ExternalObject<Handle>,\n descriptor.wrapperClass ?? getWrapperClass(resolveDescriptorType(descriptor)),\n );\n}\n\nfunction hashTableFromNative(descriptor: HashTableDescriptor, value: unknown): unknown {\n if (value === null) {\n return null;\n }\n\n const entries = value as [unknown, unknown][];\n\n return new Map(\n entries.map(([key, val]): [unknown, unknown] => [\n fromNative(descriptor.keyDescriptor, key),\n fromNative(descriptor.valueDescriptor, val),\n ]),\n );\n}\n\n/**\n * Converts a raw value returned from native code into its JavaScript form,\n * wrapping object, struct, boxed, and fundamental handles and recursively\n * converting arrays and hash tables according to the descriptor.\n *\n * @param descriptor Describes the native type of the value.\n * @param value The raw native value to convert.\n */\nfunction fromNative(descriptor: Descriptor, value: unknown): unknown {\n if (!isMarshalledDescriptor(descriptor)) {\n return value;\n }\n\n switch (descriptor.kind) {\n case \"object\": {\n return wrapHandle(value as ExternalObject<Handle> | null);\n }\n case \"struct\": {\n return wrapHandle(value as ExternalObject<Handle> | null, (descriptor as StructDescriptor).wrapperClass);\n }\n case \"boxed\": {\n return boxedFromNative(descriptor, value);\n }\n case \"fundamental\": {\n return fundamentalFromNative(descriptor, value);\n }\n case \"array\": {\n return collectionFromNative(descriptor, value);\n }\n case \"hashtable\": {\n return hashTableFromNative(descriptor, value);\n }\n }\n}\n\nfunction collectionToNative(descriptor: ArrayDescriptor, value: unknown): unknown {\n return value == null ? null : mapCollection(descriptor, value, toNative);\n}\n\nfunction hashTableToNative(descriptor: HashTableDescriptor, value: unknown): unknown {\n if (value == null) {\n return null;\n }\n\n return [...(value as Map<unknown, unknown>)].map(([key, val]): [unknown, unknown] => [\n toNative(descriptor.keyDescriptor, key),\n toNative(descriptor.valueDescriptor, val),\n ]);\n}\n\nfunction toNative(descriptor: Descriptor, value: unknown): unknown {\n if (!isMarshalledDescriptor(descriptor)) {\n return value;\n }\n\n switch (descriptor.kind) {\n case \"object\":\n case \"struct\":\n case \"boxed\":\n case \"fundamental\": {\n return tryGetHandle(value as object | null | undefined) ?? null;\n }\n case \"array\": {\n return collectionToNative(descriptor, value);\n }\n case \"hashtable\": {\n return hashTableToNative(descriptor, value);\n }\n }\n}\n\nexport { fromNative, toNative };\n"]}
package/dist/object.d.ts CHANGED
@@ -8,7 +8,7 @@ import type { Descriptor, ExternalObject, Handle } from "@gtkx/native";
8
8
  * @param props Property names mapped to `[descriptor, value]` pairs.
9
9
  * @returns The handle of the newly created object.
10
10
  */
11
- export declare function newObjectWithProperties(gtype: bigint, props: Record<string, unknown>): ExternalObject<Handle>;
11
+ declare function newObjectWithProperties(gtype: bigint, props: Record<string, unknown>): ExternalObject<Handle>;
12
12
  /**
13
13
  * Reads a GObject property and converts it to its JavaScript value using the
14
14
  * descriptor.
@@ -17,7 +17,7 @@ export declare function newObjectWithProperties(gtype: bigint, props: Record<str
17
17
  * @param propertyName The property name.
18
18
  * @param descriptor Describes the property's type.
19
19
  */
20
- export declare function getObjectProperty(obj: object, propertyName: string, descriptor: Descriptor): unknown;
20
+ declare function getObjectProperty(obj: object, propertyName: string, descriptor: Descriptor): unknown;
21
21
  /**
22
22
  * Writes a JavaScript value to a GObject property, converting it to native form
23
23
  * using the descriptor.
@@ -27,5 +27,6 @@ export declare function getObjectProperty(obj: object, propertyName: string, des
27
27
  * @param descriptor Describes the property's type.
28
28
  * @param jsValue The value to set.
29
29
  */
30
- export declare function setObjectProperty(obj: object, propertyName: string, descriptor: Descriptor, jsValue: unknown): void;
30
+ declare function setObjectProperty(obj: object, propertyName: string, descriptor: Descriptor, jsValue: unknown): void;
31
+ export { newObjectWithProperties, getObjectProperty, setObjectProperty };
31
32
  //# sourceMappingURL=object.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../src/object.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAgCvE;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,CAc7G;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,OAAO,CAIpG;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAEnH"}
1
+ {"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../src/object.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAiCvE;;;;;;;;GAQG;AACH,iBAAS,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,CAsBtG;AAED;;;;;;;GAOG;AACH,iBAAS,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,OAAO,CAK7F;AAED;;;;;;;;GAQG;AACH,iBAAS,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAE5G;AAED,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,CAAC"}
package/dist/object.js CHANGED
@@ -20,16 +20,18 @@ const gObjectSetProperty = bind(LIB, "g_object_set_property", [objectT("borrowed
20
20
  * @param props Property names mapped to `[descriptor, value]` pairs.
21
21
  * @returns The handle of the newly created object.
22
22
  */
23
- export function newObjectWithProperties(gtype, props) {
23
+ function newObjectWithProperties(gtype, props) {
24
24
  const names = [];
25
25
  const values = [];
26
26
  for (const name in props) {
27
27
  const entry = props[name];
28
- if (!Array.isArray(entry))
28
+ if (!Array.isArray(entry)) {
29
29
  continue;
30
+ }
30
31
  const [descriptor, value] = entry;
31
- if (value === undefined)
32
+ if (value === undefined) {
32
33
  continue;
34
+ }
33
35
  names.push(name);
34
36
  values.push(toValue(descriptor, value));
35
37
  }
@@ -43,7 +45,7 @@ export function newObjectWithProperties(gtype, props) {
43
45
  * @param propertyName The property name.
44
46
  * @param descriptor Describes the property's type.
45
47
  */
46
- export function getObjectProperty(obj, propertyName, descriptor) {
48
+ function getObjectProperty(obj, propertyName, descriptor) {
47
49
  const value = newValueForDescriptor(descriptor);
48
50
  gObjectGetProperty(getHandle(obj), propertyName, value);
49
51
  return fromValue(value);
@@ -57,7 +59,8 @@ export function getObjectProperty(obj, propertyName, descriptor) {
57
59
  * @param descriptor Describes the property's type.
58
60
  * @param jsValue The value to set.
59
61
  */
60
- export function setObjectProperty(obj, propertyName, descriptor, jsValue) {
62
+ function setObjectProperty(obj, propertyName, descriptor, jsValue) {
61
63
  gObjectSetProperty(getHandle(obj), propertyName, toValue(descriptor, jsValue));
62
64
  }
65
+ export { newObjectWithProperties, getObjectProperty, setObjectProperty };
63
66
  //# sourceMappingURL=object.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"object.js","sourceRoot":"","sources":["../src/object.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC7F,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAEvE,MAAM,wBAAwB,GAAG,IAAI,CACjC,GAAG,EACH,8BAA8B,EAC9B;IACI,UAAU;IACV,OAAO;IACP,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC;IAC/C,WAAW,CAAC,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC;CAClD,EACD,OAAO,CAAC,MAAM,CAAC,CAClB,CAAC;AAEF,MAAM,kBAAkB,GAAG,IAAI,CAC3B,GAAG,EACH,uBAAuB,EACvB,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,EACnD,KAAK,CACR,CAAC;AACF,MAAM,kBAAkB,GAAG,IAAI,CAC3B,GAAG,EACH,uBAAuB,EACvB,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,EACnD,KAAK,CACR,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAAa,EAAE,KAA8B;IACjF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,MAAM,GAA6B,EAAE,CAAC;IAE5C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,SAAS;QACpC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,GAAG,KAAK,CAAC;QAClC,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAClC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,wBAAwB,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAA2B,CAAC;AAClG,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAW,EAAE,YAAoB,EAAE,UAAsB;IACvF,MAAM,KAAK,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAC;IAChD,kBAAkB,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;IACxD,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAW,EAAE,YAAoB,EAAE,UAAsB,EAAE,OAAgB;IACzG,kBAAkB,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;AACnF,CAAC","sourcesContent":["import type { Descriptor, ExternalObject, Handle } from \"@gtkx/native\";\nimport { bind } from \"./bind.js\";\nimport { biguint64T, objectT, sizedArrayT, stringT, uint32T, voidT } from \"./descriptors.js\";\nimport { LIB, VALUE_SIZE, VALUE_T } from \"./library.js\";\nimport { getHandle } from \"./registry.js\";\nimport { fromValue, newValueForDescriptor, toValue } from \"./value.js\";\n\nconst gObjectNewWithProperties = bind(\n LIB,\n \"g_object_new_with_properties\",\n [\n biguint64T,\n uint32T,\n sizedArrayT(stringT(\"borrowed\"), 1, \"borrowed\"),\n sizedArrayT(VALUE_T, 1, \"borrowed\", VALUE_SIZE),\n ],\n objectT(\"full\"),\n);\n\nconst gObjectGetProperty = bind(\n LIB,\n \"g_object_get_property\",\n [objectT(\"borrowed\"), stringT(\"borrowed\"), VALUE_T],\n voidT,\n);\nconst gObjectSetProperty = bind(\n LIB,\n \"g_object_set_property\",\n [objectT(\"borrowed\"), stringT(\"borrowed\"), VALUE_T],\n voidT,\n);\n\n/**\n * Constructs a new GObject of the given type, setting the supplied construct\n * properties. Entries whose value is `undefined` or not a `[descriptor, value]`\n * pair are skipped.\n *\n * @param gtype The GType of the object to construct.\n * @param props Property names mapped to `[descriptor, value]` pairs.\n * @returns The handle of the newly created object.\n */\nexport function newObjectWithProperties(gtype: bigint, props: Record<string, unknown>): ExternalObject<Handle> {\n const names: string[] = [];\n const values: ExternalObject<Handle>[] = [];\n\n for (const name in props) {\n const entry = props[name];\n if (!Array.isArray(entry)) continue;\n const [descriptor, value] = entry;\n if (value === undefined) continue;\n names.push(name);\n values.push(toValue(descriptor, value));\n }\n\n return gObjectNewWithProperties(gtype, names.length, names, values) as ExternalObject<Handle>;\n}\n\n/**\n * Reads a GObject property and converts it to its JavaScript value using the\n * descriptor.\n *\n * @param obj The object to read from.\n * @param propertyName The property name.\n * @param descriptor Describes the property's type.\n */\nexport function getObjectProperty(obj: object, propertyName: string, descriptor: Descriptor): unknown {\n const value = newValueForDescriptor(descriptor);\n gObjectGetProperty(getHandle(obj), propertyName, value);\n return fromValue(value);\n}\n\n/**\n * Writes a JavaScript value to a GObject property, converting it to native form\n * using the descriptor.\n *\n * @param obj The object to write to.\n * @param propertyName The property name.\n * @param descriptor Describes the property's type.\n * @param jsValue The value to set.\n */\nexport function setObjectProperty(obj: object, propertyName: string, descriptor: Descriptor, jsValue: unknown): void {\n gObjectSetProperty(getHandle(obj), propertyName, toValue(descriptor, jsValue));\n}\n"]}
1
+ {"version":3,"file":"object.js","sourceRoot":"","sources":["../src/object.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC7F,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAEvE,MAAM,wBAAwB,GAAG,IAAI,CACjC,GAAG,EACH,8BAA8B,EAC9B;IACI,UAAU;IACV,OAAO;IACP,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC;IAC/C,WAAW,CAAC,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC;CAClD,EACD,OAAO,CAAC,MAAM,CAAC,CAClB,CAAC;AAEF,MAAM,kBAAkB,GAAG,IAAI,CAC3B,GAAG,EACH,uBAAuB,EACvB,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,EACnD,KAAK,CACR,CAAC;AAEF,MAAM,kBAAkB,GAAG,IAAI,CAC3B,GAAG,EACH,uBAAuB,EACvB,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,EACnD,KAAK,CACR,CAAC;AAEF;;;;;;;;GAQG;AACH,SAAS,uBAAuB,CAAC,KAAa,EAAE,KAA8B;IAC1E,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,MAAM,GAA6B,EAAE,CAAC;IAE5C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,MAAM,KAAK,GAAY,KAAK,CAAC,IAAI,CAAC,CAAC;QAEnC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,SAAS;QACb,CAAC;QAED,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,GAAG,KAA8B,CAAC;QAE3D,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACtB,SAAS;QACb,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,wBAAwB,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAA2B,CAAC;AAClG,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,iBAAiB,CAAC,GAAW,EAAE,YAAoB,EAAE,UAAsB;IAChF,MAAM,KAAK,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAC;IAChD,kBAAkB,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;IAExD,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,iBAAiB,CAAC,GAAW,EAAE,YAAoB,EAAE,UAAsB,EAAE,OAAgB;IAClG,kBAAkB,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;AACnF,CAAC;AAED,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,CAAC","sourcesContent":["import type { Descriptor, ExternalObject, Handle } from \"@gtkx/native\";\nimport { bind } from \"./bind.js\";\nimport { biguint64T, objectT, sizedArrayT, stringT, uint32T, voidT } from \"./descriptors.js\";\nimport { LIB, VALUE_SIZE, VALUE_T } from \"./library.js\";\nimport { getHandle } from \"./registry.js\";\nimport { fromValue, newValueForDescriptor, toValue } from \"./value.js\";\n\nconst gObjectNewWithProperties = bind(\n LIB,\n \"g_object_new_with_properties\",\n [\n biguint64T,\n uint32T,\n sizedArrayT(stringT(\"borrowed\"), 1, \"borrowed\"),\n sizedArrayT(VALUE_T, 1, \"borrowed\", VALUE_SIZE),\n ],\n objectT(\"full\"),\n);\n\nconst gObjectGetProperty = bind(\n LIB,\n \"g_object_get_property\",\n [objectT(\"borrowed\"), stringT(\"borrowed\"), VALUE_T],\n voidT,\n);\n\nconst gObjectSetProperty = bind(\n LIB,\n \"g_object_set_property\",\n [objectT(\"borrowed\"), stringT(\"borrowed\"), VALUE_T],\n voidT,\n);\n\n/**\n * Constructs a new GObject of the given type, setting the supplied construct\n * properties. Entries whose value is `undefined` or not a `[descriptor, value]`\n * pair are skipped.\n *\n * @param gtype The GType of the object to construct.\n * @param props Property names mapped to `[descriptor, value]` pairs.\n * @returns The handle of the newly created object.\n */\nfunction newObjectWithProperties(gtype: bigint, props: Record<string, unknown>): ExternalObject<Handle> {\n const names: string[] = [];\n const values: ExternalObject<Handle>[] = [];\n\n for (const name in props) {\n const entry: unknown = props[name];\n\n if (!Array.isArray(entry)) {\n continue;\n }\n\n const [descriptor, value] = entry as [Descriptor, unknown];\n\n if (value === undefined) {\n continue;\n }\n\n names.push(name);\n values.push(toValue(descriptor, value));\n }\n\n return gObjectNewWithProperties(gtype, names.length, names, values) as ExternalObject<Handle>;\n}\n\n/**\n * Reads a GObject property and converts it to its JavaScript value using the\n * descriptor.\n *\n * @param obj The object to read from.\n * @param propertyName The property name.\n * @param descriptor Describes the property's type.\n */\nfunction getObjectProperty(obj: object, propertyName: string, descriptor: Descriptor): unknown {\n const value = newValueForDescriptor(descriptor);\n gObjectGetProperty(getHandle(obj), propertyName, value);\n\n return fromValue(value);\n}\n\n/**\n * Writes a JavaScript value to a GObject property, converting it to native form\n * using the descriptor.\n *\n * @param obj The object to write to.\n * @param propertyName The property name.\n * @param descriptor Describes the property's type.\n * @param jsValue The value to set.\n */\nfunction setObjectProperty(obj: object, propertyName: string, descriptor: Descriptor, jsValue: unknown): void {\n gObjectSetProperty(getHandle(obj), propertyName, toValue(descriptor, jsValue));\n}\n\nexport { newObjectWithProperties, getObjectProperty, setObjectProperty };\n"]}
@@ -1,3 +1,10 @@
1
+ /**
2
+ * Extracts the finished value from the async result a GIO-style operation completes with.
3
+ *
4
+ * @template R - The async result type passed to the completion callback.
5
+ * @template T - The finished value type.
6
+ */
7
+ type FinishResult<R extends object, T> = (result: R) => T;
1
8
  /**
2
9
  * Wraps a GIO-style asynchronous function that takes a completion callback into a
3
10
  * promise, invoking the finish function to extract the result. Outside production,
@@ -9,5 +16,6 @@
9
16
  * @param leading Arguments passed to `asyncFn` before the cancellable and callback.
10
17
  * @returns A promise resolving to the finished result, or rejecting if `finish` throws.
11
18
  */
12
- export declare const promisify: <R extends object, T>(asyncFn: (...args: unknown[]) => void, finish: (result: R) => T, cancellable: object | null | undefined, ...leading: unknown[]) => Promise<T>;
19
+ declare const promisify: <R extends object, T>(asyncFn: (...args: unknown[]) => void, finish: FinishResult<R, T>, cancellable: object | null | undefined, ...leading: unknown[]) => Promise<T>;
20
+ export { promisify, type FinishResult };
13
21
  //# sourceMappingURL=promisify.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"promisify.d.ts","sourceRoot":"","sources":["../src/promisify.ts"],"names":[],"mappings":"AAQA;;;;;;;;;;GAUG;AACH,eAAO,MAAM,SAAS,GAAI,CAAC,SAAS,MAAM,EAAE,CAAC,WAChC,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,UAC7B,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,eACX,MAAM,GAAG,IAAI,GAAG,SAAS,cAC1B,OAAO,EAAE,KACtB,OAAO,CAAC,CAAC,CAeN,CAAC"}
1
+ {"version":3,"file":"promisify.d.ts","sourceRoot":"","sources":["../src/promisify.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,KAAK,YAAY,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC;AAgC1D;;;;;;;;;;GAUG;AACH,QAAA,MAAM,SAAS,GAAI,CAAC,SAAS,MAAM,EAAE,CAAC,EAClC,SAAS,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,EACrC,QAAQ,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,EAC1B,aAAa,MAAM,GAAG,IAAI,GAAG,SAAS,EACtC,GAAG,SAAS,OAAO,EAAE,KACtB,OAAO,CAAC,CAAC,CAQN,CAAC;AAEP,OAAO,EAAE,SAAS,EAAE,KAAK,YAAY,EAAE,CAAC"}
package/dist/promisify.js CHANGED
@@ -1,11 +1,23 @@
1
1
  import { tryGetHandle } from "./registry.js";
2
2
  const attachCreationStack = (error, creationStack) => {
3
- if (creationStack === undefined || !(error instanceof Error))
3
+ if (creationStack === undefined || !(error instanceof Error)) {
4
4
  return;
5
- if (error.cause !== undefined || !Object.isExtensible(error))
5
+ }
6
+ if (error.cause !== undefined || !Object.isExtensible(error)) {
6
7
  return;
8
+ }
7
9
  error.cause = creationStack;
8
10
  };
11
+ const settle = (settlement, asyncResult) => {
12
+ const { finish, creationStack, resolve, reject } = settlement;
13
+ try {
14
+ resolve(finish(asyncResult));
15
+ }
16
+ catch (error) {
17
+ attachCreationStack(error, creationStack);
18
+ reject(error instanceof Error ? error : new Error(String(error)));
19
+ }
20
+ };
9
21
  /**
10
22
  * Wraps a GIO-style asynchronous function that takes a completion callback into a
11
23
  * promise, invoking the finish function to extract the result. Outside production,
@@ -17,20 +29,11 @@ const attachCreationStack = (error, creationStack) => {
17
29
  * @param leading Arguments passed to `asyncFn` before the cancellable and callback.
18
30
  * @returns A promise resolving to the finished result, or rejecting if `finish` throws.
19
31
  */
20
- export const promisify = (asyncFn, finish, cancellable, ...leading) => new Promise((resolve, reject) => {
21
- let creationStack;
22
- if (process.env.NODE_ENV !== "production") {
23
- creationStack = new Error("gtkx async operation started here");
24
- Error.captureStackTrace(creationStack, promisify);
25
- }
32
+ const promisify = (asyncFn, finish, cancellable, ...leading) => new Promise((resolve, reject) => {
33
+ const creationStack = process.env.NODE_ENV === "production" ? undefined : new Error("gtkx async operation started here");
26
34
  asyncFn(...leading, tryGetHandle(cancellable), (_source, asyncResult) => {
27
- try {
28
- resolve(finish(asyncResult));
29
- }
30
- catch (error) {
31
- attachCreationStack(error, creationStack);
32
- reject(error);
33
- }
35
+ settle({ finish, creationStack, resolve, reject }, asyncResult);
34
36
  });
35
37
  });
38
+ export { promisify };
36
39
  //# sourceMappingURL=promisify.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"promisify.js","sourceRoot":"","sources":["../src/promisify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,mBAAmB,GAAG,CAAC,KAAc,EAAE,aAAgC,EAAQ,EAAE;IACnF,IAAI,aAAa,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC;QAAE,OAAO;IACrE,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC;QAAE,OAAO;IACrE,KAAK,CAAC,KAAK,GAAG,aAAa,CAAC;AAChC,CAAC,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CACrB,OAAqC,EACrC,MAAwB,EACxB,WAAsC,EACtC,GAAG,OAAkB,EACX,EAAE,CACZ,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;IAC/B,IAAI,aAAgC,CAAC;IACrC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;QACxC,aAAa,GAAG,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAC/D,KAAK,CAAC,iBAAiB,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,CAAC,GAAG,OAAO,EAAE,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC,OAAsB,EAAE,WAAmB,EAAE,EAAE;QAC3F,IAAI,CAAC;YACD,OAAO,CAAC,MAAM,CAAC,WAAgB,CAAC,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,mBAAmB,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;YAC1C,MAAM,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC","sourcesContent":["import { tryGetHandle } from \"./registry.js\";\n\nconst attachCreationStack = (error: unknown, creationStack: Error | undefined): void => {\n if (creationStack === undefined || !(error instanceof Error)) return;\n if (error.cause !== undefined || !Object.isExtensible(error)) return;\n error.cause = creationStack;\n};\n\n/**\n * Wraps a GIO-style asynchronous function that takes a completion callback into a\n * promise, invoking the finish function to extract the result. Outside production,\n * the call site's stack is captured and attached as the rejection error's cause.\n *\n * @param asyncFn The async function, called with the leading arguments, the cancellable, and a completion callback.\n * @param finish Extracts the result from the async result passed to the completion callback.\n * @param cancellable A cancellable object, or null/undefined for none.\n * @param leading Arguments passed to `asyncFn` before the cancellable and callback.\n * @returns A promise resolving to the finished result, or rejecting if `finish` throws.\n */\nexport const promisify = <R extends object, T>(\n asyncFn: (...args: unknown[]) => void,\n finish: (result: R) => T,\n cancellable: object | null | undefined,\n ...leading: unknown[]\n): Promise<T> =>\n new Promise<T>((resolve, reject) => {\n let creationStack: Error | undefined;\n if (process.env.NODE_ENV !== \"production\") {\n creationStack = new Error(\"gtkx async operation started here\");\n Error.captureStackTrace(creationStack, promisify);\n }\n asyncFn(...leading, tryGetHandle(cancellable), (_source: object | null, asyncResult: object) => {\n try {\n resolve(finish(asyncResult as R));\n } catch (error) {\n attachCreationStack(error, creationStack);\n reject(error);\n }\n });\n });\n"]}
1
+ {"version":3,"file":"promisify.js","sourceRoot":"","sources":["../src/promisify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAiB7C,MAAM,mBAAmB,GAAG,CAAC,KAAc,EAAE,aAAgC,EAAQ,EAAE;IACnF,IAAI,aAAa,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,EAAE,CAAC;QAC3D,OAAO;IACX,CAAC;IAED,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3D,OAAO;IACX,CAAC;IAED,KAAK,CAAC,KAAK,GAAG,aAAa,CAAC;AAChC,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,CAAsB,UAA4B,EAAE,WAAmB,EAAQ,EAAE;IAC5F,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC;IAE9D,IAAI,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,WAAgB,CAAC,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,mBAAmB,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC;AACL,CAAC,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,SAAS,GAAG,CACd,OAAqC,EACrC,MAA0B,EAC1B,WAAsC,EACtC,GAAG,OAAkB,EACX,EAAE,CACZ,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;IAC/B,MAAM,aAAa,GACf,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IAEvG,OAAO,CAAC,GAAG,OAAO,EAAE,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC,OAAsB,EAAE,WAAmB,EAAE,EAAE;QAC3F,MAAM,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,WAAW,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEP,OAAO,EAAE,SAAS,EAAqB,CAAC","sourcesContent":["import { tryGetHandle } from \"./registry.js\";\n\n/**\n * Extracts the finished value from the async result a GIO-style operation completes with.\n *\n * @template R - The async result type passed to the completion callback.\n * @template T - The finished value type.\n */\ntype FinishResult<R extends object, T> = (result: R) => T;\n\ntype Settlement<R extends object, T> = {\n finish: FinishResult<R, T>;\n creationStack: Error | undefined;\n resolve: (value: T) => void;\n reject: (reason: Error) => void;\n};\n\nconst attachCreationStack = (error: unknown, creationStack: Error | undefined): void => {\n if (creationStack === undefined || !(error instanceof Error)) {\n return;\n }\n\n if (error.cause !== undefined || !Object.isExtensible(error)) {\n return;\n }\n\n error.cause = creationStack;\n};\n\nconst settle = <R extends object, T>(settlement: Settlement<R, T>, asyncResult: object): void => {\n const { finish, creationStack, resolve, reject } = settlement;\n\n try {\n resolve(finish(asyncResult as R));\n } catch (error) {\n attachCreationStack(error, creationStack);\n reject(error instanceof Error ? error : new Error(String(error)));\n }\n};\n\n/**\n * Wraps a GIO-style asynchronous function that takes a completion callback into a\n * promise, invoking the finish function to extract the result. Outside production,\n * the call site's stack is captured and attached as the rejection error's cause.\n *\n * @param asyncFn The async function, called with the leading arguments, the cancellable, and a completion callback.\n * @param finish Extracts the result from the async result passed to the completion callback.\n * @param cancellable A cancellable object, or null/undefined for none.\n * @param leading Arguments passed to `asyncFn` before the cancellable and callback.\n * @returns A promise resolving to the finished result, or rejecting if `finish` throws.\n */\nconst promisify = <R extends object, T>(\n asyncFn: (...args: unknown[]) => void,\n finish: FinishResult<R, T>,\n cancellable: object | null | undefined,\n ...leading: unknown[]\n): Promise<T> =>\n new Promise<T>((resolve, reject) => {\n const creationStack =\n process.env.NODE_ENV === \"production\" ? undefined : new Error(\"gtkx async operation started here\");\n\n asyncFn(...leading, tryGetHandle(cancellable), (_source: object | null, asyncResult: object) => {\n settle({ finish, creationStack, resolve, reject }, asyncResult);\n });\n });\n\nexport { promisify, type FinishResult };\n"]}
@@ -0,0 +1,14 @@
1
+ import type { RegisterClassProperty } from "@gtkx/native";
2
+ import type { AnyClass } from "@gtkx/utils";
3
+ type PropertyAccessor = {
4
+ name: string;
5
+ storage: symbol;
6
+ pspec: object;
7
+ };
8
+ type PropertySpec = object;
9
+ declare function makeGetProperty(accessors: PropertyAccessor[]): (this: object, propertyId: number, value: object) => void;
10
+ declare function makeSetProperty(accessors: PropertyAccessor[]): (this: object, propertyId: number, value: object) => void;
11
+ declare function buildAccessors(klass: AnyClass, properties: Record<string, PropertySpec>): PropertyAccessor[];
12
+ declare function toNativeProperties(properties: Record<string, PropertySpec>): RegisterClassProperty[];
13
+ export { buildAccessors, makeGetProperty, makeSetProperty, toNativeProperties, type PropertyAccessor, type PropertySpec, };
14
+ //# sourceMappingURL=properties.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"properties.d.ts","sourceRoot":"","sources":["../src/properties.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA0B,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAClF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAO5C,KAAK,gBAAgB,GAAG;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,KAAK,YAAY,GAAG,MAAM,CAAC;AA0D3B,iBAAS,eAAe,CAAC,SAAS,EAAE,gBAAgB,EAAE,IACtB,MAAM,MAAM,EAAE,YAAY,MAAM,EAAE,OAAO,MAAM,KAAG,IAAI,CAKrF;AAED,iBAAS,eAAe,CAAC,SAAS,EAAE,gBAAgB,EAAE,IACtB,MAAM,MAAM,EAAE,YAAY,MAAM,EAAE,OAAO,MAAM,KAAG,IAAI,CAKrF;AAED,iBAAS,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,gBAAgB,EAAE,CAUrG;AAED,iBAAS,kBAAkB,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,qBAAqB,EAAE,CAK7F;AAED,OAAO,EACH,cAAc,EACd,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,KAAK,gBAAgB,EACrB,KAAK,YAAY,GACpB,CAAC"}
@@ -0,0 +1,79 @@
1
+ import { camelCase } from "@gtkx/utils";
2
+ import { bind } from "./bind.js";
3
+ import { LIB, PARAM_T, VALUE_T } from "./library.js";
4
+ import { getHandle } from "./registry.js";
5
+ import { fromValue, intoValue } from "./value.js";
6
+ const FIRST_PROPERTY_ID = 1;
7
+ const paramSpecDefaultValue = bind(LIB, "g_param_spec_get_default_value", [PARAM_T], VALUE_T);
8
+ const underscoreCase = (name) => name.replaceAll("-", "_");
9
+ const accessorNames = (name) => [...new Set([name, underscoreCase(name), camelCase(name)])];
10
+ function readStored(instance, accessor) {
11
+ if (!Object.hasOwn(instance, accessor.storage)) {
12
+ const defaults = paramSpecDefaultValue(getHandle(accessor.pspec));
13
+ instance[accessor.storage] = fromValue(defaults);
14
+ }
15
+ return instance[accessor.storage];
16
+ }
17
+ function defineAccessor(prototype, accessor, alias) {
18
+ if (Object.getOwnPropertyDescriptor(prototype, alias) !== undefined) {
19
+ return;
20
+ }
21
+ Object.defineProperty(prototype, alias, {
22
+ configurable: true,
23
+ enumerable: true,
24
+ get() {
25
+ return readStored(this, accessor);
26
+ },
27
+ set(value) {
28
+ if (readStored(this, accessor) === value) {
29
+ return;
30
+ }
31
+ this[accessor.storage] = value;
32
+ this.notify?.(accessor.name);
33
+ },
34
+ });
35
+ }
36
+ function installAccessors(klass, accessor) {
37
+ const prototype = klass.prototype;
38
+ for (const alias of accessorNames(accessor.name)) {
39
+ defineAccessor(prototype, accessor, alias);
40
+ }
41
+ }
42
+ function resolveAccessor(accessors, propertyId) {
43
+ const accessor = accessors[propertyId - FIRST_PROPERTY_ID];
44
+ if (accessor === undefined) {
45
+ throw new RangeError(`registerClass: no property registered for id ${String(propertyId)}`);
46
+ }
47
+ return accessor;
48
+ }
49
+ function makeGetProperty(accessors) {
50
+ return function getProperty(propertyId, value) {
51
+ const accessor = resolveAccessor(accessors, propertyId);
52
+ const current = this[camelCase(accessor.name)];
53
+ intoValue(getHandle(value), current);
54
+ };
55
+ }
56
+ function makeSetProperty(accessors) {
57
+ return function setProperty(propertyId, value) {
58
+ const accessor = resolveAccessor(accessors, propertyId);
59
+ const jsValue = fromValue(getHandle(value));
60
+ this[camelCase(accessor.name)] = jsValue;
61
+ };
62
+ }
63
+ function buildAccessors(klass, properties) {
64
+ const accessors = [];
65
+ for (const [name, pspec] of Object.entries(properties)) {
66
+ const accessor = { name, storage: Symbol(`gtkx:property:${name}`), pspec };
67
+ installAccessors(klass, accessor);
68
+ accessors.push(accessor);
69
+ }
70
+ return accessors;
71
+ }
72
+ function toNativeProperties(properties) {
73
+ return Object.values(properties).map((pspec, index) => ({
74
+ id: index + FIRST_PROPERTY_ID,
75
+ pspec: getHandle(pspec),
76
+ }));
77
+ }
78
+ export { buildAccessors, makeGetProperty, makeSetProperty, toNativeProperties, };
79
+ //# sourceMappingURL=properties.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"properties.js","sourceRoot":"","sources":["../src/properties.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExternalObject, Handle, RegisterClassProperty } from \"@gtkx/native\";\nimport type { AnyClass } from \"@gtkx/utils\";\nimport { camelCase } from \"@gtkx/utils\";\nimport { bind } from \"./bind.js\";\nimport { LIB, PARAM_T, VALUE_T } from \"./library.js\";\nimport { getHandle } from \"./registry.js\";\nimport { fromValue, intoValue } from \"./value.js\";\n\ntype PropertyAccessor = {\n name: string;\n storage: symbol;\n pspec: object;\n};\n\ntype PropertySpec = object;\ntype NotifyingObject = { notify?: (propertyName: string) => void };\n\nconst FIRST_PROPERTY_ID = 1;\nconst paramSpecDefaultValue = bind(LIB, \"g_param_spec_get_default_value\", [PARAM_T], VALUE_T);\n\nconst underscoreCase = (name: string): string => name.replaceAll(\"-\", \"_\");\nconst accessorNames = (name: string): string[] => [...new Set([name, underscoreCase(name), camelCase(name)])];\n\nfunction readStored(instance: Record<symbol, unknown>, accessor: PropertyAccessor): unknown {\n if (!Object.hasOwn(instance, accessor.storage)) {\n const defaults = paramSpecDefaultValue(getHandle(accessor.pspec)) as ExternalObject<Handle>;\n instance[accessor.storage] = fromValue(defaults);\n }\n\n return instance[accessor.storage];\n}\n\nfunction defineAccessor(prototype: object, accessor: PropertyAccessor, alias: string): void {\n if (Object.getOwnPropertyDescriptor(prototype, alias) !== undefined) {\n return;\n }\n\n Object.defineProperty(prototype, alias, {\n configurable: true,\n enumerable: true,\n get(this: Record<symbol, unknown>) {\n return readStored(this, accessor);\n },\n set(this: Record<symbol, unknown>, value: unknown) {\n if (readStored(this, accessor) === value) {\n return;\n }\n\n this[accessor.storage] = value;\n (this as NotifyingObject).notify?.(accessor.name);\n },\n });\n}\n\nfunction installAccessors(klass: AnyClass, accessor: PropertyAccessor): void {\n const prototype = (klass as { prototype: object }).prototype;\n\n for (const alias of accessorNames(accessor.name)) {\n defineAccessor(prototype, accessor, alias);\n }\n}\n\nfunction resolveAccessor(accessors: PropertyAccessor[], propertyId: number): PropertyAccessor {\n const accessor = accessors[propertyId - FIRST_PROPERTY_ID];\n\n if (accessor === undefined) {\n throw new RangeError(`registerClass: no property registered for id ${String(propertyId)}`);\n }\n\n return accessor;\n}\n\nfunction makeGetProperty(accessors: PropertyAccessor[]) {\n return function getProperty(this: object, propertyId: number, value: object): void {\n const accessor = resolveAccessor(accessors, propertyId);\n const current = (this as Record<string, unknown>)[camelCase(accessor.name)];\n intoValue(getHandle(value), current);\n };\n}\n\nfunction makeSetProperty(accessors: PropertyAccessor[]) {\n return function setProperty(this: object, propertyId: number, value: object): void {\n const accessor = resolveAccessor(accessors, propertyId);\n const jsValue = fromValue(getHandle(value));\n (this as Record<string, unknown>)[camelCase(accessor.name)] = jsValue;\n };\n}\n\nfunction buildAccessors(klass: AnyClass, properties: Record<string, PropertySpec>): PropertyAccessor[] {\n const accessors: PropertyAccessor[] = [];\n\n for (const [name, pspec] of Object.entries(properties)) {\n const accessor: PropertyAccessor = { name, storage: Symbol(`gtkx:property:${name}`), pspec };\n installAccessors(klass, accessor);\n accessors.push(accessor);\n }\n\n return accessors;\n}\n\nfunction toNativeProperties(properties: Record<string, PropertySpec>): RegisterClassProperty[] {\n return Object.values(properties).map((pspec, index) => ({\n id: index + FIRST_PROPERTY_ID,\n pspec: getHandle(pspec),\n }));\n}\n\nexport {\n buildAccessors,\n makeGetProperty,\n makeSetProperty,\n toNativeProperties,\n type PropertyAccessor,\n type PropertySpec,\n};\n"]}
@@ -1,6 +1,14 @@
1
1
  import { type AnyClass } from "@gtkx/utils";
2
+ import { type PropertySpec } from "./properties.js";
2
3
  type RegisterClassOptions = {
3
4
  typeName?: string;
5
+ /**
6
+ * Properties to install on the new type, keyed by canonical property name. Each value is the
7
+ * `GObject.ParamSpec` describing it, for example `GObject.paramSpecString(...)`. Accessors are
8
+ * generated on the prototype for the dashed, underscored and camelCased spellings of the name
9
+ * unless the class already defines one, and writing through them emits `notify`.
10
+ */
11
+ properties?: Record<string, PropertySpec>;
4
12
  };
5
13
  /**
6
14
  * Registers a subclass of a wrapper class as a new GType, wiring up any class and
@@ -12,6 +20,6 @@ type RegisterClassOptions = {
12
20
  * @param options Registration options, such as an explicit type name.
13
21
  * @returns The same class, now registered.
14
22
  */
15
- export declare function registerClass<T extends AnyClass>(klass: T, options?: RegisterClassOptions): T;
16
- export {};
23
+ declare function registerClass<T extends AnyClass>(klass: T, options?: RegisterClassOptions): T;
24
+ export { registerClass };
17
25
  //# sourceMappingURL=register-class.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"register-class.d.ts","sourceRoot":"","sources":["../src/register-class.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,QAAQ,EAAkC,MAAM,aAAa,CAAC;AAW5E,KAAK,oBAAoB,GAAG;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAOlD;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,GAAE,oBAAyB,GAAG,CAAC,CAqBjG"}
1
+ {"version":3,"file":"register-class.d.ts","sourceRoot":"","sources":["../src/register-class.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,QAAQ,EAAkC,MAAM,aAAa,CAAC;AAE5E,OAAO,EAKH,KAAK,YAAY,EAEpB,MAAM,iBAAiB,CAAC;AAUzB,KAAK,oBAAoB,GAAG;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CAC7C,CAAC;AAWF;;;;;;;;;GASG;AACH,iBAAS,aAAa,CAAC,CAAC,SAAS,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,GAAE,oBAAyB,GAAG,CAAC,CAuB1F;AAkOD,OAAO,EAAE,aAAa,EAAE,CAAC"}