@gtkx/runtime 0.0.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 (123) hide show
  1. package/LICENSE +373 -0
  2. package/README.md +171 -3
  3. package/dist/arg.d.ts +13 -0
  4. package/dist/arg.d.ts.map +1 -0
  5. package/dist/arg.js +6 -0
  6. package/dist/arg.js.map +1 -0
  7. package/dist/bind.d.ts +5 -0
  8. package/dist/bind.d.ts.map +1 -0
  9. package/dist/bind.js +19 -0
  10. package/dist/bind.js.map +1 -0
  11. package/dist/callback.d.ts +13 -0
  12. package/dist/callback.d.ts.map +1 -0
  13. package/dist/callback.js +86 -0
  14. package/dist/callback.js.map +1 -0
  15. package/dist/descriptors.d.ts +158 -0
  16. package/dist/descriptors.d.ts.map +1 -0
  17. package/dist/descriptors.js +135 -0
  18. package/dist/descriptors.js.map +1 -0
  19. package/dist/error.d.ts +24 -0
  20. package/dist/error.d.ts.map +1 -0
  21. package/dist/error.js +33 -0
  22. package/dist/error.js.map +1 -0
  23. package/dist/exit-hook.d.ts +2 -0
  24. package/dist/exit-hook.d.ts.map +1 -0
  25. package/dist/exit-hook.js +3 -0
  26. package/dist/exit-hook.js.map +1 -0
  27. package/dist/fn.d.ts +10 -0
  28. package/dist/fn.d.ts.map +1 -0
  29. package/dist/fn.js +90 -0
  30. package/dist/fn.js.map +1 -0
  31. package/dist/index.d.ts +16 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +16 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/internal.d.ts +5 -0
  36. package/dist/internal.d.ts.map +1 -0
  37. package/dist/internal.js +5 -0
  38. package/dist/internal.js.map +1 -0
  39. package/dist/library.d.ts +8 -0
  40. package/dist/library.d.ts.map +1 -0
  41. package/dist/library.js +14 -0
  42. package/dist/library.js.map +1 -0
  43. package/dist/lifecycle.d.ts +42 -0
  44. package/dist/lifecycle.d.ts.map +1 -0
  45. package/dist/lifecycle.js +70 -0
  46. package/dist/lifecycle.js.map +1 -0
  47. package/dist/listeners.d.ts +36 -0
  48. package/dist/listeners.d.ts.map +1 -0
  49. package/dist/listeners.js +85 -0
  50. package/dist/listeners.js.map +1 -0
  51. package/dist/mixin.d.ts +13 -0
  52. package/dist/mixin.d.ts.map +1 -0
  53. package/dist/mixin.js +49 -0
  54. package/dist/mixin.js.map +1 -0
  55. package/dist/native-value.d.ts +13 -0
  56. package/dist/native-value.d.ts.map +1 -0
  57. package/dist/native-value.js +105 -0
  58. package/dist/native-value.js.map +1 -0
  59. package/dist/object.d.ts +32 -0
  60. package/dist/object.d.ts.map +1 -0
  61. package/dist/object.js +66 -0
  62. package/dist/object.js.map +1 -0
  63. package/dist/promisify.d.ts +21 -0
  64. package/dist/promisify.d.ts.map +1 -0
  65. package/dist/promisify.js +39 -0
  66. package/dist/promisify.js.map +1 -0
  67. package/dist/properties.d.ts +14 -0
  68. package/dist/properties.d.ts.map +1 -0
  69. package/dist/properties.js +79 -0
  70. package/dist/properties.js.map +1 -0
  71. package/dist/register-class.d.ts +25 -0
  72. package/dist/register-class.d.ts.map +1 -0
  73. package/dist/register-class.js +178 -0
  74. package/dist/register-class.js.map +1 -0
  75. package/dist/registry.d.ts +69 -0
  76. package/dist/registry.d.ts.map +1 -0
  77. package/dist/registry.js +186 -0
  78. package/dist/registry.js.map +1 -0
  79. package/dist/signal.d.ts +35 -0
  80. package/dist/signal.d.ts.map +1 -0
  81. package/dist/signal.js +95 -0
  82. package/dist/signal.js.map +1 -0
  83. package/dist/t.d.ts +50 -0
  84. package/dist/t.d.ts.map +1 -0
  85. package/dist/t.js +49 -0
  86. package/dist/t.js.map +1 -0
  87. package/dist/tuple.d.ts +7 -0
  88. package/dist/tuple.d.ts.map +1 -0
  89. package/dist/tuple.js +26 -0
  90. package/dist/tuple.js.map +1 -0
  91. package/dist/type.d.ts +88 -0
  92. package/dist/type.d.ts.map +1 -0
  93. package/dist/type.js +194 -0
  94. package/dist/type.js.map +1 -0
  95. package/dist/value.d.ts +29 -0
  96. package/dist/value.d.ts.map +1 -0
  97. package/dist/value.js +292 -0
  98. package/dist/value.js.map +1 -0
  99. package/package.json +54 -13
  100. package/src/arg.ts +15 -0
  101. package/src/bind.ts +31 -0
  102. package/src/callback.ts +149 -0
  103. package/src/descriptors.ts +350 -0
  104. package/src/error.ts +58 -0
  105. package/src/exit-hook.ts +3 -0
  106. package/src/fn.ts +139 -0
  107. package/src/index.ts +59 -0
  108. package/src/internal.ts +12 -0
  109. package/src/library.ts +17 -0
  110. package/src/lifecycle.ts +101 -0
  111. package/src/listeners.ts +112 -0
  112. package/src/mixin.ts +73 -0
  113. package/src/native-value.ts +135 -0
  114. package/src/object.ts +95 -0
  115. package/src/promisify.ts +67 -0
  116. package/src/properties.ts +115 -0
  117. package/src/register-class.ts +305 -0
  118. package/src/registry.ts +311 -0
  119. package/src/signal.ts +192 -0
  120. package/src/t.ts +90 -0
  121. package/src/tuple.ts +37 -0
  122. package/src/type.ts +290 -0
  123. package/src/value.ts +430 -0
package/dist/fn.js ADDED
@@ -0,0 +1,90 @@
1
+ import { isCallerAllocatedArg, isInoutArg, isOutputArg, isRefArg } from "./arg.js";
2
+ import { bind } from "./bind.js";
3
+ import { wrapCallbackValue } from "./callback.js";
4
+ import { boxedT, refT } from "./descriptors.js";
5
+ import { checkError } from "./error.js";
6
+ import { LIB } from "./library.js";
7
+ import { fromNative } from "./native-value.js";
8
+ import { getHandle } from "./registry.js";
9
+ import { packTupleResult } from "./tuple.js";
10
+ const buildNativeArgTypes = (args, canThrow) => {
11
+ const nativeArgTypes = args.map((argSpec) => argSpec.direction !== undefined && argSpec.callerAllocated !== true ? refT(argSpec.type) : argSpec.type);
12
+ if (canThrow) {
13
+ nativeArgTypes.push(refT(boxedT("GError", { ownership: "full", sharedLibrary: LIB, getTypeFnName: "g_error_get_type" })));
14
+ }
15
+ return nativeArgTypes;
16
+ };
17
+ const buildArgSpecs = (args) => {
18
+ let inputCursor = 0;
19
+ return args.map((arg) => {
20
+ const isRef = isRefArg(arg);
21
+ const isConsumesInput = !isRef || isInoutArg(arg);
22
+ const isOutParam = isOutputArg(arg) && arg.consumed !== true;
23
+ return {
24
+ arg,
25
+ isRef,
26
+ isCallerAllocated: isCallerAllocatedArg(arg),
27
+ consumesInput: isConsumesInput,
28
+ inputIndex: isConsumesInput ? inputCursor++ : -1,
29
+ isOutParam,
30
+ };
31
+ });
32
+ };
33
+ const resolveCallerAllocated = (inputs, inputIndex) => {
34
+ const wrapper = inputs[inputIndex];
35
+ return wrapper == null ? wrapper : getHandle(wrapper);
36
+ };
37
+ const buildRefValue = (isInputConsumed, inputs, inputIndex) => ({
38
+ value: isInputConsumed ? inputs[inputIndex] : null,
39
+ });
40
+ const buildNativeValue = (spec, inputs) => {
41
+ const { arg, isRef, isCallerAllocated, consumesInput, inputIndex } = spec;
42
+ if (isCallerAllocated) {
43
+ return resolveCallerAllocated(inputs, inputIndex);
44
+ }
45
+ if (isRef) {
46
+ return buildRefValue(consumesInput, inputs, inputIndex);
47
+ }
48
+ if (arg.type.kind === "callback") {
49
+ return wrapCallbackValue(arg.type, inputs[inputIndex]);
50
+ }
51
+ return inputs[inputIndex];
52
+ };
53
+ const buildNativeValues = (plans, inputs) => plans.map((plan) => buildNativeValue(plan, inputs));
54
+ const readOutParams = (plans, inputs, nativeValues) => {
55
+ const outParams = [];
56
+ for (const [index, { arg, isCallerAllocated, inputIndex, isOutParam }] of plans.entries()) {
57
+ if (!isOutParam) {
58
+ continue;
59
+ }
60
+ outParams.push(isCallerAllocated ? inputs[inputIndex] : fromNative(arg.type, nativeValues[index].value));
61
+ }
62
+ return outParams;
63
+ };
64
+ function fn(sharedLibrary, symbol, spec) {
65
+ const { args, returns: returnDescriptor, throws = false } = spec;
66
+ const nativeArgTypes = buildNativeArgTypes(args, throws);
67
+ const nativeFn = bind(sharedLibrary, symbol, nativeArgTypes, returnDescriptor);
68
+ const hasPrimary = returnDescriptor.kind !== "void";
69
+ const plans = buildArgSpecs(args);
70
+ const shape = (inputs, nativeValues, nativeResult) => {
71
+ const primary = hasPrimary ? fromNative(returnDescriptor, nativeResult) : undefined;
72
+ return packTupleResult(readOutParams(plans, inputs, nativeValues), primary, hasPrimary);
73
+ };
74
+ if (throws) {
75
+ return (...inputs) => {
76
+ const nativeValues = buildNativeValues(plans, inputs);
77
+ const errorRef = { value: null };
78
+ nativeValues.push(errorRef);
79
+ const nativeResult = nativeFn(...nativeValues);
80
+ checkError(errorRef);
81
+ return shape(inputs, nativeValues, nativeResult);
82
+ };
83
+ }
84
+ return (...inputs) => {
85
+ const nativeValues = buildNativeValues(plans, inputs);
86
+ return shape(inputs, nativeValues, nativeFn(...nativeValues));
87
+ };
88
+ }
89
+ export { fn };
90
+ //# sourceMappingURL=fn.js.map
package/dist/fn.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fn.js","sourceRoot":"","sources":["../src/fn.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Descriptor, Ref } from \"@gtkx/native\";\nimport { type Arg, isCallerAllocatedArg, isInoutArg, isOutputArg, isRefArg } from \"./arg.js\";\nimport { bind } from \"./bind.js\";\nimport { wrapCallbackValue } from \"./callback.js\";\nimport { boxedT, refT } from \"./descriptors.js\";\nimport { checkError } from \"./error.js\";\nimport { LIB } from \"./library.js\";\nimport { fromNative } from \"./native-value.js\";\nimport { getHandle } from \"./registry.js\";\nimport { packTupleResult } from \"./tuple.js\";\n\ntype FnSpec = {\n args: Arg[];\n returns: Descriptor;\n throws?: boolean;\n};\n\ntype ArgSpec = {\n arg: Arg;\n isRef: boolean;\n isCallerAllocated: boolean;\n consumesInput: boolean;\n inputIndex: number;\n isOutParam: boolean;\n};\n\nconst buildNativeArgTypes = (args: Arg[], canThrow: boolean): Descriptor[] => {\n const nativeArgTypes = args.map((argSpec) =>\n argSpec.direction !== undefined && argSpec.callerAllocated !== true ? refT(argSpec.type) : argSpec.type,\n );\n\n if (canThrow) {\n nativeArgTypes.push(\n refT(boxedT(\"GError\", { ownership: \"full\", sharedLibrary: LIB, getTypeFnName: \"g_error_get_type\" })),\n );\n }\n\n return nativeArgTypes;\n};\n\nconst buildArgSpecs = (args: Arg[]): ArgSpec[] => {\n let inputCursor = 0;\n\n return args.map((arg) => {\n const isRef = isRefArg(arg);\n const isConsumesInput = !isRef || isInoutArg(arg);\n const isOutParam = isOutputArg(arg) && arg.consumed !== true;\n\n return {\n arg,\n isRef,\n isCallerAllocated: isCallerAllocatedArg(arg),\n consumesInput: isConsumesInput,\n inputIndex: isConsumesInput ? inputCursor++ : -1,\n isOutParam,\n };\n });\n};\n\nconst resolveCallerAllocated = (inputs: unknown[], inputIndex: number): unknown => {\n const wrapper = inputs[inputIndex];\n\n return wrapper == null ? wrapper : getHandle(wrapper);\n};\n\nconst buildRefValue = (isInputConsumed: boolean, inputs: unknown[], inputIndex: number): Ref => ({\n value: isInputConsumed ? inputs[inputIndex] : null,\n});\n\nconst buildNativeValue = (spec: ArgSpec, inputs: unknown[]): unknown => {\n const { arg, isRef, isCallerAllocated, consumesInput, inputIndex } = spec;\n\n if (isCallerAllocated) {\n return resolveCallerAllocated(inputs, inputIndex);\n }\n\n if (isRef) {\n return buildRefValue(consumesInput, inputs, inputIndex);\n }\n\n if (arg.type.kind === \"callback\") {\n return wrapCallbackValue(arg.type, inputs[inputIndex]);\n }\n\n return inputs[inputIndex];\n};\n\nconst buildNativeValues = (plans: ArgSpec[], inputs: unknown[]): unknown[] =>\n plans.map((plan) => buildNativeValue(plan, inputs));\n\nconst readOutParams = (plans: ArgSpec[], inputs: unknown[], nativeValues: unknown[]): unknown[] => {\n const outParams: unknown[] = [];\n\n for (const [index, { arg, isCallerAllocated, inputIndex, isOutParam }] of plans.entries()) {\n if (!isOutParam) {\n continue;\n }\n\n outParams.push(\n isCallerAllocated ? inputs[inputIndex] : fromNative(arg.type, (nativeValues[index] as Ref).value),\n );\n }\n\n return outParams;\n};\n\nfunction fn(sharedLibrary: string, symbol: string, spec: FnSpec): (...inputs: unknown[]) => unknown {\n const { args, returns: returnDescriptor, throws = false } = spec;\n const nativeArgTypes = buildNativeArgTypes(args, throws);\n const nativeFn = bind(sharedLibrary, symbol, nativeArgTypes, returnDescriptor);\n const hasPrimary = returnDescriptor.kind !== \"void\";\n const plans = buildArgSpecs(args);\n\n const shape = (inputs: unknown[], nativeValues: unknown[], nativeResult: unknown): unknown => {\n const primary = hasPrimary ? fromNative(returnDescriptor, nativeResult) : undefined;\n\n return packTupleResult(readOutParams(plans, inputs, nativeValues), primary, hasPrimary);\n };\n\n if (throws) {\n return (...inputs) => {\n const nativeValues = buildNativeValues(plans, inputs);\n const errorRef: Ref = { value: null };\n nativeValues.push(errorRef);\n const nativeResult = nativeFn(...nativeValues);\n checkError(errorRef);\n\n return shape(inputs, nativeValues, nativeResult);\n };\n }\n\n return (...inputs) => {\n const nativeValues = buildNativeValues(plans, inputs);\n\n return shape(inputs, nativeValues, nativeFn(...nativeValues));\n };\n}\n\nexport { fn };\n"]}
@@ -0,0 +1,16 @@
1
+ import "./exit-hook.js";
2
+ export { createErrorDomain, type ErrorDomain } from "./error.js";
3
+ export { type ApplicationLike, onExit, quit, quitApplication, runApplication } from "./lifecycle.js";
4
+ export { offSignal, onceSignal, onSignal } from "./listeners.js";
5
+ export { installMixins, type Mixin } from "./mixin.js";
6
+ export { fromNative } from "./native-value.js";
7
+ export { getObjectProperty, newObjectWithProperties, setObjectProperty } from "./object.js";
8
+ export { type FinishResult, promisify } from "./promisify.js";
9
+ export { registerClass } from "./register-class.js";
10
+ export { getHandle, getInstanceType, getWrapperClass, registerInterface, registerWrapperClass, type StaticBase, setHandle, tryGetHandle, wrapHandle, } from "./registry.js";
11
+ export { connectSignal, emitSignal, getSignalBaseName, type SignalHandler } from "./signal.js";
12
+ export { t } from "./t.js";
13
+ export { resolveType, TYPE_BOOLEAN, TYPE_BOXED, TYPE_CHAR, TYPE_DOUBLE, TYPE_ENUM, TYPE_FLAGS, TYPE_FLOAT, TYPE_GTYPE, TYPE_INT, TYPE_INT64, TYPE_INTERFACE, TYPE_INVALID, TYPE_LONG, TYPE_NONE, TYPE_OBJECT, TYPE_PARAM, TYPE_POINTER, TYPE_STRING, TYPE_UCHAR, TYPE_UINT, TYPE_UINT64, TYPE_ULONG, TYPE_UNICHAR, TYPE_VARIANT, type TypedClass, typeFromName, typeInterfaces, typeIsA, typeName, typeParent, valueIsA, } from "./type.js";
14
+ export { getBoxedValue, setBoxedValue } from "./value.js";
15
+ export { alloc, type ExternalObject, type Handle, read, setWrapper, write } from "@gtkx/native";
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,gBAAgB,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrG,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC5F,OAAO,EAAE,KAAK,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EACH,SAAS,EACT,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACpB,KAAK,UAAU,EACf,SAAS,EACT,YAAY,EACZ,UAAU,GACb,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,iBAAiB,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAC/F,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAC3B,OAAO,EACH,WAAW,EACX,YAAY,EACZ,UAAU,EACV,SAAS,EACT,WAAW,EACX,SAAS,EACT,UAAU,EACV,UAAU,EACV,UAAU,EACV,QAAQ,EACR,UAAU,EACV,cAAc,EACd,YAAY,EACZ,SAAS,EACT,SAAS,EACT,WAAW,EACX,UAAU,EACV,YAAY,EACZ,WAAW,EACX,UAAU,EACV,SAAS,EACT,WAAW,EACX,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,KAAK,UAAU,EACf,YAAY,EACZ,cAAc,EACd,OAAO,EACP,QAAQ,EACR,UAAU,EACV,QAAQ,GACX,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,KAAK,EAAE,KAAK,cAAc,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,16 @@
1
+ import "./exit-hook.js";
2
+ export { createErrorDomain } from "./error.js";
3
+ export { onExit, quit, quitApplication, runApplication } from "./lifecycle.js";
4
+ export { offSignal, onceSignal, onSignal } from "./listeners.js";
5
+ export { installMixins } from "./mixin.js";
6
+ export { fromNative } from "./native-value.js";
7
+ export { getObjectProperty, newObjectWithProperties, setObjectProperty } from "./object.js";
8
+ export { promisify } from "./promisify.js";
9
+ export { registerClass } from "./register-class.js";
10
+ export { getHandle, getInstanceType, getWrapperClass, registerInterface, registerWrapperClass, setHandle, tryGetHandle, wrapHandle, } from "./registry.js";
11
+ export { connectSignal, emitSignal, getSignalBaseName } from "./signal.js";
12
+ export { t } from "./t.js";
13
+ export { resolveType, TYPE_BOOLEAN, TYPE_BOXED, TYPE_CHAR, TYPE_DOUBLE, TYPE_ENUM, TYPE_FLAGS, TYPE_FLOAT, TYPE_GTYPE, TYPE_INT, TYPE_INT64, TYPE_INTERFACE, TYPE_INVALID, TYPE_LONG, TYPE_NONE, TYPE_OBJECT, TYPE_PARAM, TYPE_POINTER, TYPE_STRING, TYPE_UCHAR, TYPE_UINT, TYPE_UINT64, TYPE_ULONG, TYPE_UNICHAR, TYPE_VARIANT, typeFromName, typeInterfaces, typeIsA, typeName, typeParent, valueIsA, } from "./type.js";
14
+ export { getBoxedValue, setBoxedValue } from "./value.js";
15
+ export { alloc, read, setWrapper, write } from "@gtkx/native";
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,gBAAgB,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAoB,MAAM,YAAY,CAAC;AACjE,OAAO,EAAwB,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrG,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAc,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC5F,OAAO,EAAqB,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EACH,SAAS,EACT,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EAEpB,SAAS,EACT,YAAY,EACZ,UAAU,GACb,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,iBAAiB,EAAsB,MAAM,aAAa,CAAC;AAC/F,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAC3B,OAAO,EACH,WAAW,EACX,YAAY,EACZ,UAAU,EACV,SAAS,EACT,WAAW,EACX,SAAS,EACT,UAAU,EACV,UAAU,EACV,UAAU,EACV,QAAQ,EACR,UAAU,EACV,cAAc,EACd,YAAY,EACZ,SAAS,EACT,SAAS,EACT,WAAW,EACX,UAAU,EACV,YAAY,EACZ,WAAW,EACX,UAAU,EACV,SAAS,EACT,WAAW,EACX,UAAU,EACV,YAAY,EACZ,YAAY,EAEZ,YAAY,EACZ,cAAc,EACd,OAAO,EACP,QAAQ,EACR,UAAU,EACV,QAAQ,GACX,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,KAAK,EAAoC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC","sourcesContent":["import \"./exit-hook.js\";\n\nexport { createErrorDomain, type ErrorDomain } from \"./error.js\";\nexport { type ApplicationLike, onExit, quit, quitApplication, runApplication } from \"./lifecycle.js\";\nexport { offSignal, onceSignal, onSignal } from \"./listeners.js\";\nexport { installMixins, type Mixin } from \"./mixin.js\";\nexport { fromNative } from \"./native-value.js\";\nexport { getObjectProperty, newObjectWithProperties, setObjectProperty } from \"./object.js\";\nexport { type FinishResult, promisify } from \"./promisify.js\";\nexport { registerClass } from \"./register-class.js\";\nexport {\n getHandle,\n getInstanceType,\n getWrapperClass,\n registerInterface,\n registerWrapperClass,\n type StaticBase,\n setHandle,\n tryGetHandle,\n wrapHandle,\n} from \"./registry.js\";\nexport { connectSignal, emitSignal, getSignalBaseName, type SignalHandler } from \"./signal.js\";\nexport { t } from \"./t.js\";\nexport {\n resolveType,\n TYPE_BOOLEAN,\n TYPE_BOXED,\n TYPE_CHAR,\n TYPE_DOUBLE,\n TYPE_ENUM,\n TYPE_FLAGS,\n TYPE_FLOAT,\n TYPE_GTYPE,\n TYPE_INT,\n TYPE_INT64,\n TYPE_INTERFACE,\n TYPE_INVALID,\n TYPE_LONG,\n TYPE_NONE,\n TYPE_OBJECT,\n TYPE_PARAM,\n TYPE_POINTER,\n TYPE_STRING,\n TYPE_UCHAR,\n TYPE_UINT,\n TYPE_UINT64,\n TYPE_ULONG,\n TYPE_UNICHAR,\n TYPE_VARIANT,\n type TypedClass,\n typeFromName,\n typeInterfaces,\n typeIsA,\n typeName,\n typeParent,\n valueIsA,\n} from \"./type.js\";\nexport { getBoxedValue, setBoxedValue } from \"./value.js\";\nexport { alloc, type ExternalObject, type Handle, read, setWrapper, write } from \"@gtkx/native\";\n"]}
@@ -0,0 +1,5 @@
1
+ export { checkError, createErrorDomain } from "./error.js";
2
+ export { registerClassType, resolveWrapperClass, wrapHandle } from "./registry.js";
3
+ export { resolveType } from "./type.js";
4
+ export { fromValue, getBoxedValue, getValueType, inoutValueForBoxedDescriptor, newValueForDescriptor, outValueForBoxedDescriptor, toValue, } from "./value.js";
5
+ //# sourceMappingURL=internal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EACH,SAAS,EACT,aAAa,EACb,YAAY,EACZ,4BAA4B,EAC5B,qBAAqB,EACrB,0BAA0B,EAC1B,OAAO,GACV,MAAM,YAAY,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { checkError, createErrorDomain } from "./error.js";
2
+ export { registerClassType, resolveWrapperClass, wrapHandle } from "./registry.js";
3
+ export { resolveType } from "./type.js";
4
+ export { fromValue, getBoxedValue, getValueType, inoutValueForBoxedDescriptor, newValueForDescriptor, outValueForBoxedDescriptor, toValue, } from "./value.js";
5
+ //# sourceMappingURL=internal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal.js","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EACH,SAAS,EACT,aAAa,EACb,YAAY,EACZ,4BAA4B,EAC5B,qBAAqB,EACrB,0BAA0B,EAC1B,OAAO,GACV,MAAM,YAAY,CAAC","sourcesContent":["export { checkError, createErrorDomain } from \"./error.js\";\nexport { registerClassType, resolveWrapperClass, wrapHandle } from \"./registry.js\";\nexport { resolveType } from \"./type.js\";\nexport {\n fromValue,\n getBoxedValue,\n getValueType,\n inoutValueForBoxedDescriptor,\n newValueForDescriptor,\n outValueForBoxedDescriptor,\n toValue,\n} from \"./value.js\";\n"]}
@@ -0,0 +1,8 @@
1
+ import { type BoxedDescriptor, type FundamentalDescriptor } from "./descriptors.js";
2
+ declare const LIB = "libgobject-2.0.so.0,libglib-2.0.so.0";
3
+ declare const VALUE_SIZE = 24;
4
+ declare const VALUE_T: BoxedDescriptor;
5
+ declare const PARAM_T: FundamentalDescriptor;
6
+ declare const VARIANT_T: FundamentalDescriptor;
7
+ export { LIB, VALUE_SIZE, VALUE_T, PARAM_T, VARIANT_T };
8
+ //# sourceMappingURL=library.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"library.d.ts","sourceRoot":"","sources":["../src/library.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAU,KAAK,qBAAqB,EAAgB,MAAM,kBAAkB,CAAC;AAE1G,QAAA,MAAM,GAAG,yCAAyC,CAAC;AACnD,QAAA,MAAM,UAAU,KAAK,CAAC;AACtB,QAAA,MAAM,OAAO,EAAE,eAA6F,CAAC;AAE7G,QAAA,MAAM,OAAO,EAAE,qBAGb,CAAC;AAEH,QAAA,MAAM,SAAS,EAAE,qBAGf,CAAC;AAEH,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { boxedT, fundamentalT } from "./descriptors.js";
2
+ const LIB = "libgobject-2.0.so.0,libglib-2.0.so.0";
3
+ const VALUE_SIZE = 24;
4
+ const VALUE_T = boxedT("GValue", { sharedLibrary: LIB, getTypeFnName: "g_value_get_type" });
5
+ const PARAM_T = fundamentalT(LIB, "g_param_spec_ref", "g_param_spec_unref", {
6
+ ownership: "borrowed",
7
+ typeName: "GParam",
8
+ });
9
+ const VARIANT_T = fundamentalT(LIB, "g_variant_ref", "g_variant_unref", {
10
+ ownership: "borrowed",
11
+ typeName: "GVariant",
12
+ });
13
+ export { LIB, VALUE_SIZE, VALUE_T, PARAM_T, VARIANT_T };
14
+ //# sourceMappingURL=library.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"library.js","sourceRoot":"","sources":["../src/library.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,MAAM,EAA8B,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAE1G,MAAM,GAAG,GAAG,sCAAsC,CAAC;AACnD,MAAM,UAAU,GAAG,EAAE,CAAC;AACtB,MAAM,OAAO,GAAoB,MAAM,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,GAAG,EAAE,aAAa,EAAE,kBAAkB,EAAE,CAAC,CAAC;AAE7G,MAAM,OAAO,GAA0B,YAAY,CAAC,GAAG,EAAE,kBAAkB,EAAE,oBAAoB,EAAE;IAC/F,SAAS,EAAE,UAAU;IACrB,QAAQ,EAAE,QAAQ;CACrB,CAAC,CAAC;AAEH,MAAM,SAAS,GAA0B,YAAY,CAAC,GAAG,EAAE,eAAe,EAAE,iBAAiB,EAAE;IAC3F,SAAS,EAAE,UAAU;IACrB,QAAQ,EAAE,UAAU;CACvB,CAAC,CAAC;AAEH,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC","sourcesContent":["import { type BoxedDescriptor, boxedT, type FundamentalDescriptor, fundamentalT } from \"./descriptors.js\";\n\nconst LIB = \"libgobject-2.0.so.0,libglib-2.0.so.0\";\nconst VALUE_SIZE = 24;\nconst VALUE_T: BoxedDescriptor = boxedT(\"GValue\", { sharedLibrary: LIB, getTypeFnName: \"g_value_get_type\" });\n\nconst PARAM_T: FundamentalDescriptor = fundamentalT(LIB, \"g_param_spec_ref\", \"g_param_spec_unref\", {\n ownership: \"borrowed\",\n typeName: \"GParam\",\n});\n\nconst VARIANT_T: FundamentalDescriptor = fundamentalT(LIB, \"g_variant_ref\", \"g_variant_unref\", {\n ownership: \"borrowed\",\n typeName: \"GVariant\",\n});\n\nexport { LIB, VALUE_SIZE, VALUE_T, PARAM_T, VARIANT_T };\n"]}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Minimal structural interface of a GTK4/GIO application needed to register, run,
3
+ * and shut it down, plus the signals its lifecycle helpers connect to.
4
+ */
5
+ type ApplicationLike = {
6
+ getIsRegistered(): boolean;
7
+ register(cancellable: null): boolean;
8
+ activate(): void;
9
+ quit(): void;
10
+ run(argv: string[]): number;
11
+ getWindows?(): object[];
12
+ removeWindow?(window: object): void;
13
+ on(signal: "activate" | "shutdown", handler: () => void): unknown;
14
+ };
15
+ /**
16
+ * Runs every registered exit callback and shuts down the native runtime. Safe to
17
+ * call more than once; only the first call takes effect.
18
+ */
19
+ declare const quit: () => void;
20
+ /**
21
+ * Registers a callback to run once when the process quits, before the native
22
+ * runtime is torn down.
23
+ *
24
+ * @param callback Invoked during shutdown.
25
+ */
26
+ declare const onExit: (callback: () => void) => void;
27
+ /**
28
+ * Registers the application if needed and activates it, keeping the runtime alive
29
+ * while it is active and releasing it on shutdown.
30
+ *
31
+ * @param application The application to register and activate.
32
+ */
33
+ declare const runApplication: (application: ApplicationLike) => void;
34
+ /**
35
+ * Closes all of the application's windows and drives its main loop until it quits,
36
+ * so pending shutdown work can complete before the process exits.
37
+ *
38
+ * @param application The application to shut down.
39
+ */
40
+ declare const quitApplication: (application: ApplicationLike) => void;
41
+ export { onExit, quit, runApplication, quitApplication, type ApplicationLike };
42
+ //# sourceMappingURL=lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,KAAK,eAAe,GAAG;IACnB,eAAe,IAAI,OAAO,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,IAAI,GAAG,OAAO,CAAC;IACrC,QAAQ,IAAI,IAAI,CAAC;IACjB,IAAI,IAAI,IAAI,CAAC;IACb,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAC5B,UAAU,CAAC,IAAI,MAAM,EAAE,CAAC;IACxB,YAAY,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,EAAE,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,EAAE,OAAO,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC;CACrE,CAAC;AAGF;;;GAGG;AACH,QAAA,MAAM,IAAI,EAAE,MAAM,IAAmB,CAAC;AAoBtC;;;;;GAKG;AACH,QAAA,MAAM,MAAM,GAAI,UAAU,MAAM,IAAI,KAAG,IAEtC,CAAC;AAEF;;;;;GAKG;AACH,QAAA,MAAM,cAAc,GAAI,aAAa,eAAe,KAAG,IActD,CAAC;AAEF;;;;;GAKG;AACH,QAAA,MAAM,eAAe,GAAI,aAAa,eAAe,KAAG,IAiBvD,CAAC;AAEF,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,eAAe,EAAE,KAAK,eAAe,EAAE,CAAC"}
@@ -0,0 +1,70 @@
1
+ import { keepAlive, quit as nativeQuit } from "@gtkx/native";
2
+ import { blockMatchedSignalHandlers } from "./signal.js";
3
+ const shutdownCallbacks = [];
4
+ /**
5
+ * Runs every registered exit callback and shuts down the native runtime. Safe to
6
+ * call more than once; only the first call takes effect.
7
+ */
8
+ const quit = createQuit();
9
+ function createQuit() {
10
+ let hasQuit = false;
11
+ return () => {
12
+ if (hasQuit) {
13
+ return;
14
+ }
15
+ hasQuit = true;
16
+ for (const callback of shutdownCallbacks) {
17
+ callback();
18
+ }
19
+ nativeQuit();
20
+ };
21
+ }
22
+ /**
23
+ * Registers a callback to run once when the process quits, before the native
24
+ * runtime is torn down.
25
+ *
26
+ * @param callback Invoked during shutdown.
27
+ */
28
+ const onExit = (callback) => {
29
+ shutdownCallbacks.push(callback);
30
+ };
31
+ /**
32
+ * Registers the application if needed and activates it, keeping the runtime alive
33
+ * while it is active and releasing it on shutdown.
34
+ *
35
+ * @param application The application to register and activate.
36
+ */
37
+ const runApplication = (application) => {
38
+ application.on("activate", () => {
39
+ keepAlive(true);
40
+ });
41
+ application.on("shutdown", () => {
42
+ keepAlive(false);
43
+ });
44
+ if (!application.getIsRegistered()) {
45
+ application.register(null);
46
+ }
47
+ application.activate();
48
+ };
49
+ /**
50
+ * Closes all of the application's windows and drives its main loop until it quits,
51
+ * so pending shutdown work can complete before the process exits.
52
+ *
53
+ * @param application The application to shut down.
54
+ */
55
+ const quitApplication = (application) => {
56
+ if (!application.getIsRegistered()) {
57
+ return;
58
+ }
59
+ const windows = application.getWindows?.() ?? [];
60
+ for (const window of windows) {
61
+ application.removeWindow?.(window);
62
+ }
63
+ application.on("shutdown", () => {
64
+ application.quit();
65
+ });
66
+ blockMatchedSignalHandlers(application, "activate");
67
+ application.run([]);
68
+ };
69
+ export { onExit, quit, runApplication, quitApplication };
70
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAiBzD,MAAM,iBAAiB,GAAmB,EAAE,CAAC;AAC7C;;;GAGG;AACH,MAAM,IAAI,GAAe,UAAU,EAAE,CAAC;AAEtC,SAAS,UAAU;IACf,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,OAAO,GAAG,EAAE;QACR,IAAI,OAAO,EAAE,CAAC;YACV,OAAO;QACX,CAAC;QAED,OAAO,GAAG,IAAI,CAAC;QAEf,KAAK,MAAM,QAAQ,IAAI,iBAAiB,EAAE,CAAC;YACvC,QAAQ,EAAE,CAAC;QACf,CAAC;QAED,UAAU,EAAE,CAAC;IACjB,CAAC,CAAC;AACN,CAAC;AAED;;;;;GAKG;AACH,MAAM,MAAM,GAAG,CAAC,QAAoB,EAAQ,EAAE;IAC1C,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACrC,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,cAAc,GAAG,CAAC,WAA4B,EAAQ,EAAE;IAC1D,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,GAAG,EAAE;QAC5B,SAAS,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,GAAG,EAAE;QAC5B,SAAS,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,EAAE,CAAC;QACjC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,WAAW,CAAC,QAAQ,EAAE,CAAC;AAC3B,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,eAAe,GAAG,CAAC,WAA4B,EAAQ,EAAE;IAC3D,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,EAAE,CAAC;QACjC,OAAO;IACX,CAAC;IAED,MAAM,OAAO,GAAG,WAAW,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC;IAEjD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC3B,WAAW,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,GAAG,EAAE;QAC5B,WAAW,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,0BAA0B,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IACpD,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC,CAAC;AAEF,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,eAAe,EAAwB,CAAC","sourcesContent":["import { keepAlive, quit as nativeQuit } from \"@gtkx/native\";\nimport { blockMatchedSignalHandlers } from \"./signal.js\";\n\n/**\n * Minimal structural interface of a GTK4/GIO application needed to register, run,\n * and shut it down, plus the signals its lifecycle helpers connect to.\n */\ntype ApplicationLike = {\n getIsRegistered(): boolean;\n register(cancellable: null): boolean;\n activate(): void;\n quit(): void;\n run(argv: string[]): number;\n getWindows?(): object[];\n removeWindow?(window: object): void;\n on(signal: \"activate\" | \"shutdown\", handler: () => void): unknown;\n};\n\nconst shutdownCallbacks: (() => void)[] = [];\n/**\n * Runs every registered exit callback and shuts down the native runtime. Safe to\n * call more than once; only the first call takes effect.\n */\nconst quit: () => void = createQuit();\n\nfunction createQuit(): () => void {\n let hasQuit = false;\n\n return () => {\n if (hasQuit) {\n return;\n }\n\n hasQuit = true;\n\n for (const callback of shutdownCallbacks) {\n callback();\n }\n\n nativeQuit();\n };\n}\n\n/**\n * Registers a callback to run once when the process quits, before the native\n * runtime is torn down.\n *\n * @param callback Invoked during shutdown.\n */\nconst onExit = (callback: () => void): void => {\n shutdownCallbacks.push(callback);\n};\n\n/**\n * Registers the application if needed and activates it, keeping the runtime alive\n * while it is active and releasing it on shutdown.\n *\n * @param application The application to register and activate.\n */\nconst runApplication = (application: ApplicationLike): void => {\n application.on(\"activate\", () => {\n keepAlive(true);\n });\n\n application.on(\"shutdown\", () => {\n keepAlive(false);\n });\n\n if (!application.getIsRegistered()) {\n application.register(null);\n }\n\n application.activate();\n};\n\n/**\n * Closes all of the application's windows and drives its main loop until it quits,\n * so pending shutdown work can complete before the process exits.\n *\n * @param application The application to shut down.\n */\nconst quitApplication = (application: ApplicationLike): void => {\n if (!application.getIsRegistered()) {\n return;\n }\n\n const windows = application.getWindows?.() ?? [];\n\n for (const window of windows) {\n application.removeWindow?.(window);\n }\n\n application.on(\"shutdown\", () => {\n application.quit();\n });\n\n blockMatchedSignalHandlers(application, \"activate\");\n application.run([]);\n};\n\nexport { onExit, quit, runApplication, quitApplication, type ApplicationLike };\n"]}
@@ -0,0 +1,36 @@
1
+ import { type SignalHandler } from "./signal.js";
2
+ type SignalConnectable = {
3
+ connect(signal: string, handler: SignalHandler, isAfter?: boolean): number;
4
+ disconnect(handlerId: number): void;
5
+ };
6
+ /**
7
+ * Connects a handler to a signal and tracks it so it can later be removed with
8
+ * {@link offSignal}.
9
+ *
10
+ * @param instance The object emitting the signal.
11
+ * @param signal The signal name to connect to.
12
+ * @param handler The callback invoked on each emission.
13
+ * @param isAfter When true, run the handler after the default handler.
14
+ */
15
+ declare function onSignal(instance: SignalConnectable, signal: string, handler: SignalHandler, isAfter?: boolean): void;
16
+ /**
17
+ * Connects a handler that runs at most once, disconnecting itself after the first
18
+ * emission.
19
+ *
20
+ * @param instance The object emitting the signal.
21
+ * @param signal The signal name to connect to.
22
+ * @param handler The callback invoked on the first emission.
23
+ * @param isAfter When true, run the handler after the default handler.
24
+ */
25
+ declare function onceSignal(instance: SignalConnectable, signal: string, handler: SignalHandler, isAfter?: boolean): void;
26
+ /**
27
+ * Disconnects a handler previously connected with {@link onSignal} or
28
+ * {@link onceSignal}. Does nothing if the handler is not currently connected.
29
+ *
30
+ * @param instance The object the handler was connected to.
31
+ * @param signal The signal name the handler was connected to.
32
+ * @param handler The handler to disconnect.
33
+ */
34
+ declare function offSignal(instance: SignalConnectable, signal: string, handler: SignalHandler): void;
35
+ export { onSignal, onceSignal, offSignal };
36
+ //# sourceMappingURL=listeners.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listeners.d.ts","sourceRoot":"","sources":["../src/listeners.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAE3E,KAAK,iBAAiB,GAAG;IACrB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC3E,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CACvC,CAAC;AA4CF;;;;;;;;GAQG;AACH,iBAAS,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAG9G;AAED;;;;;;;;GAQG;AACH,iBAAS,UAAU,CAAC,QAAQ,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAahH;AAED;;;;;;;GAOG;AACH,iBAAS,SAAS,CAAC,QAAQ,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAc5F;AAED,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC"}
@@ -0,0 +1,85 @@
1
+ import { isSignalHandlerConnected } from "./signal.js";
2
+ const listenerTable = new WeakMap();
3
+ const findListenerHandlerId = (instance, signal, handler) => listenerTable.get(instance)?.get(signal)?.get(handler);
4
+ const trackListener = (instance, signal, handler, handlerId) => {
5
+ let bySignal = listenerTable.get(instance);
6
+ if (!bySignal) {
7
+ bySignal = new Map();
8
+ listenerTable.set(instance, bySignal);
9
+ }
10
+ let byHandler = bySignal.get(signal);
11
+ if (!byHandler) {
12
+ byHandler = new Map();
13
+ bySignal.set(signal, byHandler);
14
+ }
15
+ byHandler.set(handler, handlerId);
16
+ };
17
+ const untrackHandlerId = (instance, signal, handlerId) => {
18
+ const bySignal = listenerTable.get(instance);
19
+ const byHandler = bySignal?.get(signal);
20
+ if (byHandler === undefined) {
21
+ return;
22
+ }
23
+ for (const [handler, id] of byHandler) {
24
+ if (id === handlerId) {
25
+ byHandler.delete(handler);
26
+ }
27
+ }
28
+ if (byHandler.size === 0) {
29
+ bySignal?.delete(signal);
30
+ }
31
+ };
32
+ /**
33
+ * Connects a handler to a signal and tracks it so it can later be removed with
34
+ * {@link offSignal}.
35
+ *
36
+ * @param instance The object emitting the signal.
37
+ * @param signal The signal name to connect to.
38
+ * @param handler The callback invoked on each emission.
39
+ * @param isAfter When true, run the handler after the default handler.
40
+ */
41
+ function onSignal(instance, signal, handler, isAfter) {
42
+ const handlerId = instance.connect(signal, handler, isAfter);
43
+ trackListener(instance, signal, handler, handlerId);
44
+ }
45
+ /**
46
+ * Connects a handler that runs at most once, disconnecting itself after the first
47
+ * emission.
48
+ *
49
+ * @param instance The object emitting the signal.
50
+ * @param signal The signal name to connect to.
51
+ * @param handler The callback invoked on the first emission.
52
+ * @param isAfter When true, run the handler after the default handler.
53
+ */
54
+ function onceSignal(instance, signal, handler, isAfter) {
55
+ let handlerId = 0;
56
+ const wrapped = (...args) => {
57
+ untrackHandlerId(instance, signal, handlerId);
58
+ instance.disconnect(handlerId);
59
+ return handler(...args);
60
+ };
61
+ handlerId = instance.connect(signal, wrapped, isAfter);
62
+ trackListener(instance, signal, wrapped, handlerId);
63
+ trackListener(instance, signal, handler, handlerId);
64
+ }
65
+ /**
66
+ * Disconnects a handler previously connected with {@link onSignal} or
67
+ * {@link onceSignal}. Does nothing if the handler is not currently connected.
68
+ *
69
+ * @param instance The object the handler was connected to.
70
+ * @param signal The signal name the handler was connected to.
71
+ * @param handler The handler to disconnect.
72
+ */
73
+ function offSignal(instance, signal, handler) {
74
+ const handlerId = findListenerHandlerId(instance, signal, handler);
75
+ if (handlerId === undefined) {
76
+ return;
77
+ }
78
+ untrackHandlerId(instance, signal, handlerId);
79
+ if (!isSignalHandlerConnected(instance, handlerId)) {
80
+ return;
81
+ }
82
+ instance.disconnect(handlerId);
83
+ }
84
+ export { onSignal, onceSignal, offSignal };
85
+ //# sourceMappingURL=listeners.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listeners.js","sourceRoot":"","sources":["../src/listeners.ts"],"names":[],"mappings":"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","sourcesContent":["import { isSignalHandlerConnected, type SignalHandler } from \"./signal.js\";\n\ntype SignalConnectable = {\n connect(signal: string, handler: SignalHandler, isAfter?: boolean): number;\n disconnect(handlerId: number): void;\n};\n\nconst listenerTable: WeakMap<object, Map<string, Map<SignalHandler, number>>> = new WeakMap();\n\nconst findListenerHandlerId = (instance: object, signal: string, handler: SignalHandler): number | undefined =>\n listenerTable.get(instance)?.get(signal)?.get(handler);\n\nconst trackListener = (instance: object, signal: string, handler: SignalHandler, handlerId: number): void => {\n let bySignal = listenerTable.get(instance);\n\n if (!bySignal) {\n bySignal = new Map();\n listenerTable.set(instance, bySignal);\n }\n\n let byHandler = bySignal.get(signal);\n\n if (!byHandler) {\n byHandler = new Map();\n bySignal.set(signal, byHandler);\n }\n\n byHandler.set(handler, handlerId);\n};\n\nconst untrackHandlerId = (instance: object, signal: string, handlerId: number): void => {\n const bySignal = listenerTable.get(instance);\n const byHandler = bySignal?.get(signal);\n\n if (byHandler === undefined) {\n return;\n }\n\n for (const [handler, id] of byHandler) {\n if (id === handlerId) {\n byHandler.delete(handler);\n }\n }\n\n if (byHandler.size === 0) {\n bySignal?.delete(signal);\n }\n};\n\n/**\n * Connects a handler to a signal and tracks it so it can later be removed with\n * {@link offSignal}.\n *\n * @param instance The object emitting the signal.\n * @param signal The signal name to connect to.\n * @param handler The callback invoked on each emission.\n * @param isAfter When true, run the handler after the default handler.\n */\nfunction onSignal(instance: SignalConnectable, signal: string, handler: SignalHandler, isAfter?: boolean): void {\n const handlerId = instance.connect(signal, handler, isAfter);\n trackListener(instance, signal, handler, handlerId);\n}\n\n/**\n * Connects a handler that runs at most once, disconnecting itself after the first\n * emission.\n *\n * @param instance The object emitting the signal.\n * @param signal The signal name to connect to.\n * @param handler The callback invoked on the first emission.\n * @param isAfter When true, run the handler after the default handler.\n */\nfunction onceSignal(instance: SignalConnectable, signal: string, handler: SignalHandler, isAfter?: boolean): void {\n let handlerId = 0;\n\n const wrapped: SignalHandler = (...args) => {\n untrackHandlerId(instance, signal, handlerId);\n instance.disconnect(handlerId);\n\n return handler(...args);\n };\n\n handlerId = instance.connect(signal, wrapped, isAfter);\n trackListener(instance, signal, wrapped, handlerId);\n trackListener(instance, signal, handler, handlerId);\n}\n\n/**\n * Disconnects a handler previously connected with {@link onSignal} or\n * {@link onceSignal}. Does nothing if the handler is not currently connected.\n *\n * @param instance The object the handler was connected to.\n * @param signal The signal name the handler was connected to.\n * @param handler The handler to disconnect.\n */\nfunction offSignal(instance: SignalConnectable, signal: string, handler: SignalHandler): void {\n const handlerId = findListenerHandlerId(instance, signal, handler);\n\n if (handlerId === undefined) {\n return;\n }\n\n untrackHandlerId(instance, signal, handlerId);\n\n if (!isSignalHandlerConnected(instance, handlerId)) {\n return;\n }\n\n instance.disconnect(handlerId);\n}\n\nexport { onSignal, onceSignal, offSignal };\n"]}
@@ -0,0 +1,13 @@
1
+ import type { AnyClass } from "@gtkx/utils";
2
+ type MixinReceiver = {
3
+ connect(signal: string, handler: (...args: unknown[]) => unknown, isAfter?: boolean): number;
4
+ emit(signal: string, ...args: unknown[]): unknown;
5
+ };
6
+ /**
7
+ * A factory that, given a base class, returns a subclass adding extra members to
8
+ * be merged onto a target prototype.
9
+ */
10
+ type Mixin = (base: AnyClass<MixinReceiver>) => AnyClass;
11
+ declare function installMixins(target: AnyClass, mixins: Mixin[]): void;
12
+ export { installMixins, type MixinReceiver, type Mixin };
13
+ //# sourceMappingURL=mixin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mixin.d.ts","sourceRoot":"","sources":["../src/mixin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,KAAK,aAAa,GAAG;IACjB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC7F,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;CACrD,CAAC;AAEF;;;GAGG;AACH,KAAK,KAAK,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,aAAa,CAAC,KAAK,QAAQ,CAAC;AA6CzD,iBAAS,aAAa,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAc9D;AAED,OAAO,EAAE,aAAa,EAAE,KAAK,aAAa,EAAE,KAAK,KAAK,EAAE,CAAC"}
package/dist/mixin.js ADDED
@@ -0,0 +1,49 @@
1
+ function isDefinedInClassChain(prototype, key) {
2
+ let current = prototype;
3
+ while (current !== null && current !== Object.prototype) {
4
+ if (Object.hasOwn(current, key)) {
5
+ return true;
6
+ }
7
+ current = Reflect.getPrototypeOf(current);
8
+ }
9
+ return false;
10
+ }
11
+ function copyLayerMember(target, layer, key) {
12
+ if (key === "constructor") {
13
+ return;
14
+ }
15
+ if (isDefinedInClassChain(target.prototype, key)) {
16
+ return;
17
+ }
18
+ const descriptor = Object.getOwnPropertyDescriptor(layer, key);
19
+ if (descriptor !== undefined) {
20
+ Object.defineProperty(target.prototype, key, descriptor);
21
+ }
22
+ }
23
+ /**
24
+ * Copies each mixin's prototype members onto the target class prototype, skipping
25
+ * any member already defined anywhere in the target's class chain.
26
+ *
27
+ * @param target The class whose prototype receives the mixin members.
28
+ * @param mixins The mixins to apply, in order.
29
+ */
30
+ function copyLayerMembers(target, layer) {
31
+ for (const key of Object.getOwnPropertyNames(layer)) {
32
+ copyLayerMember(target, layer, key);
33
+ }
34
+ }
35
+ function installMixins(target, mixins) {
36
+ const empty = class {
37
+ connect() {
38
+ return 0;
39
+ }
40
+ emit() {
41
+ return undefined;
42
+ }
43
+ };
44
+ for (const mixin of mixins) {
45
+ copyLayerMembers(target, mixin(empty).prototype);
46
+ }
47
+ }
48
+ export { installMixins };
49
+ //# sourceMappingURL=mixin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mixin.js","sourceRoot":"","sources":["../src/mixin.ts"],"names":[],"mappings":"AAaA,SAAS,qBAAqB,CAAC,SAAiB,EAAE,GAAW;IACzD,IAAI,OAAO,GAAkB,SAAS,CAAC;IAEvC,OAAO,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,MAAM,CAAC,SAAS,EAAE,CAAC;QACtD,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAS,eAAe,CAAC,MAAgB,EAAE,KAAa,EAAE,GAAW;IACjE,IAAI,GAAG,KAAK,aAAa,EAAE,CAAC;QACxB,OAAO;IACX,CAAC;IAED,IAAI,qBAAqB,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,CAAC;QAC/C,OAAO;IACX,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAE/D,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;IAC7D,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,SAAS,gBAAgB,CAAC,MAAgB,EAAE,KAAa;IACrD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;QAClD,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IACxC,CAAC;AACL,CAAC;AAED,SAAS,aAAa,CAAC,MAAgB,EAAE,MAAe;IACpD,MAAM,KAAK,GAA4B;QACnC,OAAO;YACH,OAAO,CAAC,CAAC;QACb,CAAC;QAED,IAAI;YACA,OAAO,SAAS,CAAC;QACrB,CAAC;KACJ,CAAC;IAEF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACzB,gBAAgB,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC;IACrD,CAAC;AACL,CAAC;AAED,OAAO,EAAE,aAAa,EAAkC,CAAC","sourcesContent":["import type { AnyClass } from \"@gtkx/utils\";\n\ntype MixinReceiver = {\n connect(signal: string, handler: (...args: unknown[]) => unknown, isAfter?: boolean): number;\n emit(signal: string, ...args: unknown[]): unknown;\n};\n\n/**\n * A factory that, given a base class, returns a subclass adding extra members to\n * be merged onto a target prototype.\n */\ntype Mixin = (base: AnyClass<MixinReceiver>) => AnyClass;\n\nfunction isDefinedInClassChain(prototype: object, key: string): boolean {\n let current: object | null = prototype;\n\n while (current !== null && current !== Object.prototype) {\n if (Object.hasOwn(current, key)) {\n return true;\n }\n\n current = Reflect.getPrototypeOf(current);\n }\n\n return false;\n}\n\nfunction copyLayerMember(target: AnyClass, layer: object, key: string): void {\n if (key === \"constructor\") {\n return;\n }\n\n if (isDefinedInClassChain(target.prototype, key)) {\n return;\n }\n\n const descriptor = Object.getOwnPropertyDescriptor(layer, key);\n\n if (descriptor !== undefined) {\n Object.defineProperty(target.prototype, key, descriptor);\n }\n}\n\n/**\n * Copies each mixin's prototype members onto the target class prototype, skipping\n * any member already defined anywhere in the target's class chain.\n *\n * @param target The class whose prototype receives the mixin members.\n * @param mixins The mixins to apply, in order.\n */\nfunction copyLayerMembers(target: AnyClass, layer: object): void {\n for (const key of Object.getOwnPropertyNames(layer)) {\n copyLayerMember(target, layer, key);\n }\n}\n\nfunction installMixins(target: AnyClass, mixins: Mixin[]): void {\n const empty: AnyClass<MixinReceiver> = class {\n connect(): number {\n return 0;\n }\n\n emit(): unknown {\n return undefined;\n }\n };\n\n for (const mixin of mixins) {\n copyLayerMembers(target, mixin(empty).prototype);\n }\n}\n\nexport { installMixins, type MixinReceiver, type Mixin };\n"]}
@@ -0,0 +1,13 @@
1
+ import type { Descriptor } from "@gtkx/native";
2
+ /**
3
+ * Converts a raw value returned from native code into its JavaScript form,
4
+ * wrapping object, struct, boxed, and fundamental handles and recursively
5
+ * converting arrays and hash tables according to the descriptor.
6
+ *
7
+ * @param descriptor Describes the native type of the value.
8
+ * @param value The raw native value to convert.
9
+ */
10
+ declare function fromNative(descriptor: Descriptor, value: unknown): unknown;
11
+ declare function toNative(descriptor: Descriptor, value: unknown): unknown;
12
+ export { fromNative, toNative };
13
+ //# sourceMappingURL=native-value.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-value.d.ts","sourceRoot":"","sources":["../src/native-value.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAA0B,MAAM,cAAc,CAAC;AA+DvE;;;;;;;GAOG;AACH,iBAAS,UAAU,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAyBnE;AAiBD,iBAAS,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAmBjE;AAED,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC"}