@gtkx/codegen 1.0.0 → 1.2.0

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 (347) hide show
  1. package/README.md +1 -1
  2. package/dist/analysis/descriptor-render.d.ts +12 -15
  3. package/dist/analysis/descriptor-render.d.ts.map +1 -1
  4. package/dist/analysis/descriptor-render.js +59 -38
  5. package/dist/analysis/descriptor-render.js.map +1 -1
  6. package/dist/analysis/descriptor.d.ts +25 -10
  7. package/dist/analysis/descriptor.d.ts.map +1 -1
  8. package/dist/analysis/descriptor.js +37 -9
  9. package/dist/analysis/descriptor.js.map +1 -1
  10. package/dist/analysis/inheritance.d.ts +4 -2
  11. package/dist/analysis/inheritance.d.ts.map +1 -1
  12. package/dist/analysis/inheritance.js +80 -38
  13. package/dist/analysis/inheritance.js.map +1 -1
  14. package/dist/analysis/interface-conflicts.d.ts +25 -0
  15. package/dist/analysis/interface-conflicts.d.ts.map +1 -0
  16. package/dist/analysis/interface-conflicts.js +139 -0
  17. package/dist/analysis/interface-conflicts.js.map +1 -0
  18. package/dist/analysis/param-capability.d.ts.map +1 -1
  19. package/dist/analysis/param-capability.js +3 -4
  20. package/dist/analysis/param-capability.js.map +1 -1
  21. package/dist/analysis/param-structure.js +2 -2
  22. package/dist/analysis/param-structure.js.map +1 -1
  23. package/dist/analysis/ts-type.d.ts +3 -2
  24. package/dist/analysis/ts-type.d.ts.map +1 -1
  25. package/dist/analysis/ts-type.js +26 -26
  26. package/dist/analysis/ts-type.js.map +1 -1
  27. package/dist/analysis/type-key.d.ts +5 -0
  28. package/dist/analysis/type-key.d.ts.map +1 -0
  29. package/dist/analysis/type-key.js +9 -0
  30. package/dist/analysis/type-key.js.map +1 -0
  31. package/dist/analysis/type-shape.d.ts +3 -2
  32. package/dist/analysis/type-shape.d.ts.map +1 -1
  33. package/dist/analysis/type-shape.js +2 -1
  34. package/dist/analysis/type-shape.js.map +1 -1
  35. package/dist/compile.d.ts +14 -6
  36. package/dist/compile.d.ts.map +1 -1
  37. package/dist/compile.js +125 -24
  38. package/dist/compile.js.map +1 -1
  39. package/dist/docs/api-reference.d.ts +2 -0
  40. package/dist/docs/api-reference.d.ts.map +1 -1
  41. package/dist/docs/api-reference.js +11 -10
  42. package/dist/docs/api-reference.js.map +1 -1
  43. package/dist/docs/element-page.d.ts.map +1 -1
  44. package/dist/docs/element-page.js +5 -3
  45. package/dist/docs/element-page.js.map +1 -1
  46. package/dist/docs/pipeline.d.ts +1 -0
  47. package/dist/docs/pipeline.d.ts.map +1 -1
  48. package/dist/docs/pipeline.js +93 -19
  49. package/dist/docs/pipeline.js.map +1 -1
  50. package/dist/docs/render.d.ts +2 -1
  51. package/dist/docs/render.d.ts.map +1 -1
  52. package/dist/docs/render.js +5 -4
  53. package/dist/docs/render.js.map +1 -1
  54. package/dist/docs/symbol-page.d.ts.map +1 -1
  55. package/dist/docs/symbol-page.js +10 -9
  56. package/dist/docs/symbol-page.js.map +1 -1
  57. package/dist/fingerprint.d.ts +20 -3
  58. package/dist/fingerprint.d.ts.map +1 -1
  59. package/dist/fingerprint.js +56 -37
  60. package/dist/fingerprint.js.map +1 -1
  61. package/dist/gi.d.ts +1 -0
  62. package/dist/gi.d.ts.map +1 -1
  63. package/dist/gi.js +8 -2
  64. package/dist/gi.js.map +1 -1
  65. package/dist/gir/ancestry.d.ts +7 -1
  66. package/dist/gir/ancestry.d.ts.map +1 -1
  67. package/dist/gir/ancestry.js +9 -1
  68. package/dist/gir/ancestry.js.map +1 -1
  69. package/dist/gir/annotations.d.ts +1 -2
  70. package/dist/gir/annotations.d.ts.map +1 -1
  71. package/dist/gir/annotations.js +1 -1
  72. package/dist/gir/annotations.js.map +1 -1
  73. package/dist/gir/cursor-overrides.d.ts +8 -0
  74. package/dist/gir/cursor-overrides.d.ts.map +1 -0
  75. package/dist/gir/cursor-overrides.js +6 -0
  76. package/dist/gir/cursor-overrides.js.map +1 -0
  77. package/dist/gir/emittable.d.ts +7 -0
  78. package/dist/gir/emittable.d.ts.map +1 -0
  79. package/dist/gir/emittable.js +3 -0
  80. package/dist/gir/emittable.js.map +1 -0
  81. package/dist/gir/function.d.ts.map +1 -1
  82. package/dist/gir/function.js +28 -2
  83. package/dist/gir/function.js.map +1 -1
  84. package/dist/gir/gir-path.d.ts +1 -1
  85. package/dist/gir/gir-path.js +1 -1
  86. package/dist/gir/gir-path.js.map +1 -1
  87. package/dist/gir/library.d.ts +5 -1
  88. package/dist/gir/library.d.ts.map +1 -1
  89. package/dist/gir/library.js +9 -2
  90. package/dist/gir/library.js.map +1 -1
  91. package/dist/gir/namespace.d.ts +5 -1
  92. package/dist/gir/namespace.d.ts.map +1 -1
  93. package/dist/gir/namespace.js +4 -2
  94. package/dist/gir/namespace.js.map +1 -1
  95. package/dist/gir/parameter.d.ts +13 -1
  96. package/dist/gir/parameter.d.ts.map +1 -1
  97. package/dist/gir/parameter.js +1 -0
  98. package/dist/gir/parameter.js.map +1 -1
  99. package/dist/gir/parse.d.ts.map +1 -1
  100. package/dist/gir/parse.js +6 -6
  101. package/dist/gir/parse.js.map +1 -1
  102. package/dist/gir/primitives.js +1 -1
  103. package/dist/gir/primitives.js.map +1 -1
  104. package/dist/guards.d.ts +16 -0
  105. package/dist/guards.d.ts.map +1 -0
  106. package/dist/guards.js +11 -0
  107. package/dist/guards.js.map +1 -0
  108. package/dist/internal.d.ts +2 -0
  109. package/dist/internal.d.ts.map +1 -1
  110. package/dist/internal.js +2 -0
  111. package/dist/internal.js.map +1 -1
  112. package/dist/json.d.ts +3 -0
  113. package/dist/json.d.ts.map +1 -0
  114. package/dist/json.js +11 -0
  115. package/dist/json.js.map +1 -0
  116. package/dist/khronos/args.d.ts.map +1 -1
  117. package/dist/khronos/args.js +8 -6
  118. package/dist/khronos/args.js.map +1 -1
  119. package/dist/khronos/modules.d.ts.map +1 -1
  120. package/dist/khronos/modules.js +22 -7
  121. package/dist/khronos/modules.js.map +1 -1
  122. package/dist/khronos/parse.d.ts.map +1 -1
  123. package/dist/khronos/parse.js +3 -4
  124. package/dist/khronos/parse.js.map +1 -1
  125. package/dist/khronos/pipeline.d.ts +1 -1
  126. package/dist/khronos/pipeline.d.ts.map +1 -1
  127. package/dist/khronos/pipeline.js.map +1 -1
  128. package/dist/khronos/plan.d.ts +1 -7
  129. package/dist/khronos/plan.d.ts.map +1 -1
  130. package/dist/khronos/plan.js +1 -1
  131. package/dist/khronos/plan.js.map +1 -1
  132. package/dist/khronos/render.d.ts.map +1 -1
  133. package/dist/khronos/render.js +8 -4
  134. package/dist/khronos/render.js.map +1 -1
  135. package/dist/runner.d.ts +7 -1
  136. package/dist/runner.d.ts.map +1 -1
  137. package/dist/runner.js +21 -3
  138. package/dist/runner.js.map +1 -1
  139. package/dist/staging.d.ts +5 -0
  140. package/dist/staging.d.ts.map +1 -0
  141. package/dist/staging.js +57 -0
  142. package/dist/staging.js.map +1 -0
  143. package/dist/store/compile-store.d.ts +0 -1
  144. package/dist/store/compile-store.d.ts.map +1 -1
  145. package/dist/store/compile-store.js +7 -32
  146. package/dist/store/compile-store.js.map +1 -1
  147. package/dist/store/gi/callables.d.ts +6 -3
  148. package/dist/store/gi/callables.d.ts.map +1 -1
  149. package/dist/store/gi/callables.js +40 -30
  150. package/dist/store/gi/callables.js.map +1 -1
  151. package/dist/store/gi/callback.d.ts.map +1 -1
  152. package/dist/store/gi/callback.js +9 -5
  153. package/dist/store/gi/callback.js.map +1 -1
  154. package/dist/store/gi/class.d.ts.map +1 -1
  155. package/dist/store/gi/class.js +104 -44
  156. package/dist/store/gi/class.js.map +1 -1
  157. package/dist/store/gi/companion.d.ts.map +1 -1
  158. package/dist/store/gi/companion.js +6 -6
  159. package/dist/store/gi/companion.js.map +1 -1
  160. package/dist/store/gi/constant.d.ts.map +1 -1
  161. package/dist/store/gi/constant.js +11 -3
  162. package/dist/store/gi/constant.js.map +1 -1
  163. package/dist/store/gi/constructor-props.js +1 -1
  164. package/dist/store/gi/constructor-props.js.map +1 -1
  165. package/dist/store/gi/enum.d.ts.map +1 -1
  166. package/dist/store/gi/enum.js +29 -12
  167. package/dist/store/gi/enum.js.map +1 -1
  168. package/dist/store/gi/function.d.ts +1 -3
  169. package/dist/store/gi/function.d.ts.map +1 -1
  170. package/dist/store/gi/function.js +24 -18
  171. package/dist/store/gi/function.js.map +1 -1
  172. package/dist/store/gi/gtype-binding.d.ts.map +1 -1
  173. package/dist/store/gi/gtype-binding.js +4 -1
  174. package/dist/store/gi/gtype-binding.js.map +1 -1
  175. package/dist/store/gi/interface.d.ts.map +1 -1
  176. package/dist/store/gi/interface.js +34 -19
  177. package/dist/store/gi/interface.js.map +1 -1
  178. package/dist/store/gi/method.d.ts +7 -6
  179. package/dist/store/gi/method.d.ts.map +1 -1
  180. package/dist/store/gi/method.js +13 -24
  181. package/dist/store/gi/method.js.map +1 -1
  182. package/dist/store/gi/param-marshal.d.ts +3 -2
  183. package/dist/store/gi/param-marshal.d.ts.map +1 -1
  184. package/dist/store/gi/param-marshal.js +50 -5
  185. package/dist/store/gi/param-marshal.js.map +1 -1
  186. package/dist/store/gi/pipeline.d.ts.map +1 -1
  187. package/dist/store/gi/pipeline.js +21 -10
  188. package/dist/store/gi/pipeline.js.map +1 -1
  189. package/dist/store/gi/properties.d.ts +2 -1
  190. package/dist/store/gi/properties.d.ts.map +1 -1
  191. package/dist/store/gi/properties.js +6 -3
  192. package/dist/store/gi/properties.js.map +1 -1
  193. package/dist/store/gi/property-accessor.d.ts +10 -8
  194. package/dist/store/gi/property-accessor.d.ts.map +1 -1
  195. package/dist/store/gi/property-accessor.js +49 -91
  196. package/dist/store/gi/property-accessor.js.map +1 -1
  197. package/dist/store/gi/record-constructor.d.ts +8 -1
  198. package/dist/store/gi/record-constructor.d.ts.map +1 -1
  199. package/dist/store/gi/record-constructor.js +34 -13
  200. package/dist/store/gi/record-constructor.js.map +1 -1
  201. package/dist/store/gi/record-field-accessor.d.ts.map +1 -1
  202. package/dist/store/gi/record-field-accessor.js +20 -4
  203. package/dist/store/gi/record-field-accessor.js.map +1 -1
  204. package/dist/store/gi/record-layout.d.ts +6 -1
  205. package/dist/store/gi/record-layout.d.ts.map +1 -1
  206. package/dist/store/gi/record-layout.js +8 -1
  207. package/dist/store/gi/record-layout.js.map +1 -1
  208. package/dist/store/gi/record.d.ts.map +1 -1
  209. package/dist/store/gi/record.js +19 -8
  210. package/dist/store/gi/record.js.map +1 -1
  211. package/dist/store/gi/registration.js +2 -2
  212. package/dist/store/gi/registration.js.map +1 -1
  213. package/dist/store/gi/return-wrap.js +1 -1
  214. package/dist/store/gi/return-wrap.js.map +1 -1
  215. package/dist/store/gi/signal.d.ts +2 -1
  216. package/dist/store/gi/signal.d.ts.map +1 -1
  217. package/dist/store/gi/signal.js +55 -28
  218. package/dist/store/gi/signal.js.map +1 -1
  219. package/dist/store/gi/value-marshalable.d.ts.map +1 -1
  220. package/dist/store/gi/value-marshalable.js +2 -1
  221. package/dist/store/gi/value-marshalable.js.map +1 -1
  222. package/dist/store/gi/vtable.d.ts +4 -1
  223. package/dist/store/gi/vtable.d.ts.map +1 -1
  224. package/dist/store/gi/vtable.js +60 -17
  225. package/dist/store/gi/vtable.js.map +1 -1
  226. package/dist/store/gi-store.d.ts +1 -0
  227. package/dist/store/gi-store.d.ts.map +1 -1
  228. package/dist/store/gi-store.js +15 -20
  229. package/dist/store/gi-store.js.map +1 -1
  230. package/dist/store/jsx/generated-elements.d.ts +2 -1
  231. package/dist/store/jsx/generated-elements.d.ts.map +1 -1
  232. package/dist/store/jsx/generated-elements.js +13 -7
  233. package/dist/store/jsx/generated-elements.js.map +1 -1
  234. package/dist/store/jsx/jsx.js +3 -3
  235. package/dist/store/jsx/jsx.js.map +1 -1
  236. package/dist/store/jsx/metadata.d.ts.map +1 -1
  237. package/dist/store/jsx/metadata.js +3 -1
  238. package/dist/store/jsx/metadata.js.map +1 -1
  239. package/dist/store/jsx-store.d.ts.map +1 -1
  240. package/dist/store/jsx-store.js +3 -4
  241. package/dist/store/jsx-store.js.map +1 -1
  242. package/dist/store/resolve-store.d.ts +14 -3
  243. package/dist/store/resolve-store.d.ts.map +1 -1
  244. package/dist/store/resolve-store.js +98 -15
  245. package/dist/store/resolve-store.js.map +1 -1
  246. package/dist/store/store-fs.d.ts +9 -7
  247. package/dist/store/store-fs.d.ts.map +1 -1
  248. package/dist/store/store-fs.js +54 -25
  249. package/dist/store/store-fs.js.map +1 -1
  250. package/dist/store/store-links.d.ts +3 -0
  251. package/dist/store/store-links.d.ts.map +1 -0
  252. package/dist/store/store-links.js +39 -0
  253. package/dist/store/store-links.js.map +1 -0
  254. package/dist/writer/comparison-context.d.ts +4 -0
  255. package/dist/writer/comparison-context.d.ts.map +1 -0
  256. package/dist/writer/comparison-context.js +13 -0
  257. package/dist/writer/comparison-context.js.map +1 -0
  258. package/dist/writer/context.d.ts +3 -3
  259. package/dist/writer/context.d.ts.map +1 -1
  260. package/dist/writer/context.js +11 -6
  261. package/dist/writer/context.js.map +1 -1
  262. package/dist/writer/module.d.ts +13 -5
  263. package/dist/writer/module.d.ts.map +1 -1
  264. package/dist/writer/module.js +68 -11
  265. package/dist/writer/module.js.map +1 -1
  266. package/dist/xml.d.ts +8 -1
  267. package/dist/xml.d.ts.map +1 -1
  268. package/dist/xml.js +70 -1
  269. package/dist/xml.js.map +1 -1
  270. package/overrides/gobject/object.ts.ejs +2 -0
  271. package/package.json +14 -3
  272. package/src/analysis/descriptor-render.ts +106 -52
  273. package/src/analysis/descriptor.ts +76 -15
  274. package/src/analysis/inheritance.ts +134 -44
  275. package/src/analysis/interface-conflicts.ts +235 -0
  276. package/src/analysis/param-capability.ts +3 -6
  277. package/src/analysis/param-structure.ts +2 -2
  278. package/src/analysis/ts-type.ts +43 -28
  279. package/src/analysis/type-key.ts +14 -0
  280. package/src/analysis/type-shape.ts +5 -2
  281. package/src/compile.ts +192 -27
  282. package/src/docs/api-reference.ts +13 -10
  283. package/src/docs/element-page.ts +5 -2
  284. package/src/docs/pipeline.ts +140 -24
  285. package/src/docs/render.ts +7 -3
  286. package/src/docs/symbol-page.ts +12 -11
  287. package/src/fingerprint.ts +95 -47
  288. package/src/gi.ts +10 -2
  289. package/src/gir/ancestry.ts +17 -1
  290. package/src/gir/annotations.ts +1 -1
  291. package/src/gir/cursor-overrides.ts +12 -0
  292. package/src/gir/emittable.ts +8 -0
  293. package/src/gir/function.ts +45 -9
  294. package/src/gir/gir-path.ts +1 -1
  295. package/src/gir/library.ts +10 -2
  296. package/src/gir/namespace.ts +8 -2
  297. package/src/gir/parameter.ts +15 -0
  298. package/src/gir/parse.ts +10 -7
  299. package/src/gir/primitives.ts +1 -1
  300. package/src/guards.ts +23 -0
  301. package/src/internal.ts +2 -0
  302. package/src/json.ts +11 -0
  303. package/src/khronos/args.ts +9 -6
  304. package/src/khronos/modules.ts +25 -9
  305. package/src/khronos/parse.ts +3 -4
  306. package/src/khronos/pipeline.ts +1 -1
  307. package/src/khronos/plan.ts +0 -1
  308. package/src/khronos/render.ts +8 -6
  309. package/src/runner.ts +26 -4
  310. package/src/staging.ts +67 -0
  311. package/src/store/compile-store.ts +7 -38
  312. package/src/store/gi/callables.ts +60 -33
  313. package/src/store/gi/callback.ts +9 -9
  314. package/src/store/gi/class.ts +140 -53
  315. package/src/store/gi/companion.ts +7 -6
  316. package/src/store/gi/constant.ts +13 -3
  317. package/src/store/gi/constructor-props.ts +1 -1
  318. package/src/store/gi/enum.ts +36 -26
  319. package/src/store/gi/function.ts +30 -24
  320. package/src/store/gi/gtype-binding.ts +7 -2
  321. package/src/store/gi/interface.ts +39 -20
  322. package/src/store/gi/method.ts +26 -32
  323. package/src/store/gi/param-marshal.ts +77 -6
  324. package/src/store/gi/pipeline.ts +25 -15
  325. package/src/store/gi/properties.ts +8 -4
  326. package/src/store/gi/property-accessor.ts +73 -161
  327. package/src/store/gi/record-constructor.ts +53 -21
  328. package/src/store/gi/record-field-accessor.ts +26 -4
  329. package/src/store/gi/record-layout.ts +11 -1
  330. package/src/store/gi/record.ts +20 -12
  331. package/src/store/gi/registration.ts +2 -2
  332. package/src/store/gi/return-wrap.ts +1 -1
  333. package/src/store/gi/signal.ts +66 -42
  334. package/src/store/gi/value-marshalable.ts +3 -1
  335. package/src/store/gi/vtable.ts +97 -20
  336. package/src/store/gi-store.ts +26 -31
  337. package/src/store/jsx/generated-elements.ts +17 -8
  338. package/src/store/jsx/jsx.ts +3 -3
  339. package/src/store/jsx/metadata.ts +4 -1
  340. package/src/store/jsx-store.ts +3 -4
  341. package/src/store/resolve-store.ts +133 -18
  342. package/src/store/store-fs.ts +82 -35
  343. package/src/store/store-links.ts +49 -0
  344. package/src/writer/comparison-context.ts +18 -0
  345. package/src/writer/context.ts +12 -6
  346. package/src/writer/module.ts +101 -14
  347. package/src/xml.ts +103 -1
@@ -1,12 +1,13 @@
1
1
  import { sortStrings } from "@gtkx/utils";
2
2
  import { createHash } from "node:crypto";
3
3
  import { existsSync, readdirSync, readFileSync } from "node:fs";
4
- import { createRequire } from "node:module";
5
4
  import { dirname, join, resolve } from "node:path";
6
5
  import { fileURLToPath } from "node:url";
7
- const require = createRequire(import.meta.url);
6
+ import packageManifest from "../package.json" with { type: "json" };
7
+ import { arrayGuard, hasFields, isNumber, isString, optionalGuard } from "./guards.js";
8
+ import { readJsonFile } from "./json.js";
8
9
  const FINGERPRINT_FILENAME = ".codegen-fingerprint.json";
9
- const CODEGEN_VERSION = require("../package.json").version;
10
+ const CODEGEN_VERSION = packageManifest.version;
10
11
  const OVERRIDES_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "..", "overrides");
11
12
  const sortAlpha = (values) => sortStrings(values).join(",");
12
13
  const overrideFiles = () => {
@@ -17,15 +18,17 @@ const overrideFiles = () => {
17
18
  .filter((entry) => entry.isFile())
18
19
  .map((entry) => join(entry.parentPath, entry.name));
19
20
  };
20
- const hashGi = (girFiles, libraries, girPath) => {
21
+ const hashGi = (inputs) => {
21
22
  const hash = createHash("sha256");
22
23
  hash.update(CODEGEN_VERSION);
23
24
  hash.update("\n");
24
- hash.update(sortAlpha(libraries));
25
+ hash.update(sortAlpha(inputs.libraries));
25
26
  hash.update("\n");
26
- hash.update(sortAlpha(girPath));
27
+ hash.update(sortAlpha(inputs.girPath));
27
28
  hash.update("\n");
28
- const hashedFiles = sortStrings([...girFiles, ...overrideFiles()]);
29
+ hash.update(String(inputs.isByteArrayTyped));
30
+ hash.update("\n");
31
+ const hashedFiles = sortStrings([...inputs.girFiles, ...overrideFiles()]);
29
32
  for (const file of hashedFiles) {
30
33
  hash.update("\n");
31
34
  hash.update(file);
@@ -34,35 +37,58 @@ const hashGi = (girFiles, libraries, girPath) => {
34
37
  }
35
38
  return hash.digest("hex");
36
39
  };
37
- const computeGiFingerprint = (girFiles, libraries, girPath) => ({
38
- value: hashGi(girFiles, libraries, girPath),
39
- girFiles,
40
- libraries,
41
- girPath,
40
+ const computeGiFingerprint = (inputs) => ({
41
+ value: hashGi(inputs),
42
+ girFiles: inputs.girFiles,
43
+ libraries: inputs.libraries,
44
+ girPath: inputs.girPath,
42
45
  });
43
- const isGiStoreFresh = (giStoreDir, libraries, girPath) => {
44
- const sentinelPath = join(giStoreDir, FINGERPRINT_FILENAME);
45
- if (!existsSync(sentinelPath)) {
46
- return false;
46
+ const readSentinel = (storeDir) => readJsonFile(join(storeDir, FINGERPRINT_FILENAME));
47
+ const isGiFingerprint = (value) => hasFields(value, {
48
+ value: isString,
49
+ girFiles: arrayGuard(isString),
50
+ libraries: arrayGuard(isString),
51
+ girPath: optionalGuard(arrayGuard(isString)),
52
+ });
53
+ const isDocsFingerprint = (value) => hasFields(value, { value: isString, gi: isGiFingerprint });
54
+ const isJsxFingerprint = (value) => hasFields(value, { value: isString, intrinsicElementCount: isNumber });
55
+ const recordedGiValue = (sentinel, inputs) => {
56
+ if (!hasMatchingRecordedInputs(sentinel, inputs)) {
57
+ return undefined;
47
58
  }
48
- let sentinel;
49
59
  try {
50
- sentinel = JSON.parse(readFileSync(sentinelPath, "utf8"));
60
+ return hashGi({ ...inputs, girFiles: sentinel.girFiles, libraries: sentinel.libraries });
51
61
  }
52
62
  catch {
53
- return false;
54
- }
55
- if (!hasMatchingRecordedInputs(sentinel, libraries, girPath)) {
56
- return false;
63
+ return undefined;
57
64
  }
58
- try {
59
- return hashGi(sentinel.girFiles, sentinel.libraries, girPath) === sentinel.value;
60
- }
61
- catch {
65
+ };
66
+ const isGiStoreFresh = (giStoreDir, inputs) => {
67
+ const sentinel = readSentinel(giStoreDir);
68
+ return isGiFingerprint(sentinel) && recordedGiValue(sentinel, inputs) === sentinel.value;
69
+ };
70
+ const hasMatchingRecordedInputs = (sentinel, inputs) => sortAlpha(sentinel.libraries) === sortAlpha(inputs.libraries) &&
71
+ sortAlpha(sentinel.girPath ?? []) === sortAlpha(inputs.girPath);
72
+ const hashDocs = (giValue, input) => createHash("sha256")
73
+ .update(JSON.stringify([
74
+ giValue,
75
+ input.basePath,
76
+ serializeModuleExports(input.props),
77
+ serializeOmittedProps(input.omittedProps),
78
+ ]))
79
+ .digest("hex");
80
+ const computeDocsFingerprint = (inputs, input) => {
81
+ const gi = computeGiFingerprint(inputs);
82
+ return { value: hashDocs(gi.value, input), gi };
83
+ };
84
+ const isDocsOutputFresh = (outDir, inputs, input) => {
85
+ const sentinel = readSentinel(outDir);
86
+ if (!isDocsFingerprint(sentinel)) {
62
87
  return false;
63
88
  }
89
+ const giValue = recordedGiValue(sentinel.gi, inputs);
90
+ return giValue !== undefined && hashDocs(giValue, input) === sentinel.value;
64
91
  };
65
- const hasMatchingRecordedInputs = (sentinel, libraries, girPath) => sortAlpha(sentinel.libraries) === sortAlpha(libraries) && sortAlpha(sentinel.girPath ?? []) === sortAlpha(girPath);
66
92
  const serializeModuleExports = (map) => sortStrings(Object.keys(map)).map((type) => [type, map[type]?.module ?? "", map[type]?.export ?? ""]);
67
93
  const serializeOmittedProps = (map) => sortStrings(Object.keys(map)).map((type) => [type, sortAlpha(map[type] ?? [])]);
68
94
  const hashJsx = (input) => createHash("sha256")
@@ -80,20 +106,13 @@ const computeJsxFingerprint = (input, intrinsicElementCount) => ({
80
106
  intrinsicElementCount,
81
107
  });
82
108
  const jsxStoreFreshness = (jsxStoreDir, input) => {
83
- const sentinelPath = join(jsxStoreDir, FINGERPRINT_FILENAME);
84
- if (!existsSync(sentinelPath)) {
85
- return { isFresh: false, intrinsicElementCount: 0 };
86
- }
87
- let sentinel;
88
- try {
89
- sentinel = JSON.parse(readFileSync(sentinelPath, "utf8"));
90
- }
91
- catch {
109
+ const sentinel = readSentinel(jsxStoreDir);
110
+ if (!isJsxFingerprint(sentinel)) {
92
111
  return { isFresh: false, intrinsicElementCount: 0 };
93
112
  }
94
113
  return sentinel.value === hashJsx(input)
95
114
  ? { isFresh: true, intrinsicElementCount: sentinel.intrinsicElementCount }
96
115
  : { isFresh: false, intrinsicElementCount: 0 };
97
116
  };
98
- export { FINGERPRINT_FILENAME, computeGiFingerprint, isGiStoreFresh, computeJsxFingerprint, jsxStoreFreshness, };
117
+ export { FINGERPRINT_FILENAME, computeGiFingerprint, computeDocsFingerprint, isGiStoreFresh, isDocsOutputFresh, computeJsxFingerprint, jsxStoreFreshness, };
99
118
  //# sourceMappingURL=fingerprint.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../src/fingerprint.ts"],"names":[],"mappings":"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","sourcesContent":["import { sortStrings } from \"@gtkx/utils\";\nimport { createHash } from \"node:crypto\";\nimport { type Dirent, existsSync, readdirSync, readFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\ntype GiFingerprint = {\n value: string;\n girFiles: string[];\n libraries: string[];\n girPath?: string[];\n};\n\ntype ModuleExport = { module: string; export: string };\n\ntype JsxFingerprintInput = {\n reactVersion: string;\n components: Record<string, ModuleExport>;\n lazyElements: string[];\n props: Record<string, ModuleExport>;\n omittedProps: Record<string, string[]>;\n};\n\ntype JsxFingerprint = {\n value: string;\n intrinsicElementCount: number;\n};\n\nconst require = createRequire(import.meta.url);\nconst FINGERPRINT_FILENAME = \".codegen-fingerprint.json\";\nconst CODEGEN_VERSION: string = (require(\"../package.json\") as { version: string }).version;\nconst OVERRIDES_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), \"..\", \"overrides\");\n\nconst sortAlpha = (values: string[]): string => sortStrings(values).join(\",\");\n\nconst overrideFiles = (): string[] => {\n if (!existsSync(OVERRIDES_ROOT)) {\n return [];\n }\n\n return readdirSync(OVERRIDES_ROOT, { recursive: true, withFileTypes: true })\n .filter((entry: Dirent) => entry.isFile())\n .map((entry: Dirent) => join(entry.parentPath, entry.name));\n};\n\nconst hashGi = (girFiles: string[], libraries: string[], girPath: string[]): string => {\n const hash = createHash(\"sha256\");\n hash.update(CODEGEN_VERSION);\n hash.update(\"\\n\");\n hash.update(sortAlpha(libraries));\n hash.update(\"\\n\");\n hash.update(sortAlpha(girPath));\n hash.update(\"\\n\");\n const hashedFiles = sortStrings([...girFiles, ...overrideFiles()]);\n\n for (const file of hashedFiles) {\n hash.update(\"\\n\");\n hash.update(file);\n hash.update(\"\\0\");\n hash.update(readFileSync(file));\n }\n\n return hash.digest(\"hex\");\n};\n\nconst computeGiFingerprint = (\n girFiles: string[],\n libraries: string[],\n girPath: string[],\n): GiFingerprint => ({\n value: hashGi(girFiles, libraries, girPath),\n girFiles,\n libraries,\n girPath,\n});\n\nconst isGiStoreFresh = (\n giStoreDir: string,\n libraries: string[],\n girPath: string[],\n): boolean => {\n const sentinelPath = join(giStoreDir, FINGERPRINT_FILENAME);\n\n if (!existsSync(sentinelPath)) {\n return false;\n }\n\n let sentinel: GiFingerprint;\n\n try {\n sentinel = JSON.parse(readFileSync(sentinelPath, \"utf8\")) as GiFingerprint;\n } catch {\n return false;\n }\n\n if (!hasMatchingRecordedInputs(sentinel, libraries, girPath)) {\n return false;\n }\n\n try {\n return hashGi(sentinel.girFiles, sentinel.libraries, girPath) === sentinel.value;\n } catch {\n return false;\n }\n};\n\nconst hasMatchingRecordedInputs = (sentinel: GiFingerprint, libraries: string[], girPath: string[]): boolean =>\n sortAlpha(sentinel.libraries) === sortAlpha(libraries) && sortAlpha(sentinel.girPath ?? []) === sortAlpha(girPath);\n\nconst serializeModuleExports = (map: Record<string, ModuleExport>): [string, string, string][] =>\n sortStrings(Object.keys(map)).map((type) => [type, map[type]?.module ?? \"\", map[type]?.export ?? \"\"]);\n\nconst serializeOmittedProps = (map: Record<string, string[]>): [string, string][] =>\n sortStrings(Object.keys(map)).map((type) => [type, sortAlpha(map[type] ?? [])]);\n\nconst hashJsx = (input: JsxFingerprintInput): string =>\n createHash(\"sha256\")\n .update(\n JSON.stringify([\n CODEGEN_VERSION,\n input.reactVersion,\n serializeModuleExports(input.components),\n sortStrings(input.lazyElements),\n serializeModuleExports(input.props),\n serializeOmittedProps(input.omittedProps),\n ]),\n )\n .digest(\"hex\");\n\nconst computeJsxFingerprint = (input: JsxFingerprintInput, intrinsicElementCount: number): JsxFingerprint => ({\n value: hashJsx(input),\n intrinsicElementCount,\n});\n\nconst jsxStoreFreshness = (\n jsxStoreDir: string,\n input: JsxFingerprintInput,\n): { isFresh: boolean; intrinsicElementCount: number } => {\n const sentinelPath = join(jsxStoreDir, FINGERPRINT_FILENAME);\n\n if (!existsSync(sentinelPath)) {\n return { isFresh: false, intrinsicElementCount: 0 };\n }\n\n let sentinel: JsxFingerprint;\n\n try {\n sentinel = JSON.parse(readFileSync(sentinelPath, \"utf8\")) as JsxFingerprint;\n } catch {\n return { isFresh: false, intrinsicElementCount: 0 };\n }\n\n return sentinel.value === hashJsx(input)\n ? { isFresh: true, intrinsicElementCount: sentinel.intrinsicElementCount }\n : { isFresh: false, intrinsicElementCount: 0 };\n};\n\nexport {\n FINGERPRINT_FILENAME,\n computeGiFingerprint,\n isGiStoreFresh,\n computeJsxFingerprint,\n jsxStoreFreshness,\n type GiFingerprint,\n type JsxFingerprintInput,\n};\n"]}
1
+ {"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../src/fingerprint.ts"],"names":[],"mappings":"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","sourcesContent":["import { sortStrings } from \"@gtkx/utils\";\nimport { createHash } from \"node:crypto\";\nimport { type Dirent, existsSync, readdirSync, readFileSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport packageManifest from \"../package.json\" with { type: \"json\" };\nimport { arrayGuard, hasFields, isNumber, isString, optionalGuard } from \"./guards.js\";\nimport { readJsonFile } from \"./json.js\";\n\ntype GiInputs = {\n girFiles: string[];\n libraries: string[];\n girPath: string[];\n isByteArrayTyped: boolean;\n};\n\ntype GiFingerprint = {\n value: string;\n girFiles: string[];\n libraries: string[];\n girPath?: string[];\n};\n\ntype ModuleExport = { module: string; export: string };\n\ntype DocsFingerprintInput = {\n basePath: string;\n props: Record<string, ModuleExport>;\n omittedProps: Record<string, string[]>;\n};\n\ntype DocsFingerprint = {\n value: string;\n gi: GiFingerprint;\n};\n\ntype JsxFingerprintInput = {\n reactVersion: string;\n components: Record<string, ModuleExport>;\n lazyElements: string[];\n props: Record<string, ModuleExport>;\n omittedProps: Record<string, string[]>;\n};\n\ntype JsxFingerprint = {\n value: string;\n intrinsicElementCount: number;\n};\n\nconst FINGERPRINT_FILENAME = \".codegen-fingerprint.json\";\nconst CODEGEN_VERSION: string = packageManifest.version;\nconst OVERRIDES_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), \"..\", \"overrides\");\n\nconst sortAlpha = (values: string[]): string => sortStrings(values).join(\",\");\n\nconst overrideFiles = (): string[] => {\n if (!existsSync(OVERRIDES_ROOT)) {\n return [];\n }\n\n return readdirSync(OVERRIDES_ROOT, { recursive: true, withFileTypes: true })\n .filter((entry: Dirent) => entry.isFile())\n .map((entry: Dirent) => join(entry.parentPath, entry.name));\n};\n\nconst hashGi = (inputs: GiInputs): string => {\n const hash = createHash(\"sha256\");\n hash.update(CODEGEN_VERSION);\n hash.update(\"\\n\");\n hash.update(sortAlpha(inputs.libraries));\n hash.update(\"\\n\");\n hash.update(sortAlpha(inputs.girPath));\n hash.update(\"\\n\");\n hash.update(String(inputs.isByteArrayTyped));\n hash.update(\"\\n\");\n const hashedFiles = sortStrings([...inputs.girFiles, ...overrideFiles()]);\n\n for (const file of hashedFiles) {\n hash.update(\"\\n\");\n hash.update(file);\n hash.update(\"\\0\");\n hash.update(readFileSync(file));\n }\n\n return hash.digest(\"hex\");\n};\n\nconst computeGiFingerprint = (inputs: GiInputs): GiFingerprint => ({\n value: hashGi(inputs),\n girFiles: inputs.girFiles,\n libraries: inputs.libraries,\n girPath: inputs.girPath,\n});\n\nconst readSentinel = (storeDir: string): unknown => readJsonFile(join(storeDir, FINGERPRINT_FILENAME));\n\nconst isGiFingerprint = (value: unknown): value is GiFingerprint =>\n hasFields<GiFingerprint>(value, {\n value: isString,\n girFiles: arrayGuard(isString),\n libraries: arrayGuard(isString),\n girPath: optionalGuard(arrayGuard(isString)),\n });\n\nconst isDocsFingerprint = (value: unknown): value is DocsFingerprint =>\n hasFields<DocsFingerprint>(value, { value: isString, gi: isGiFingerprint });\n\nconst isJsxFingerprint = (value: unknown): value is JsxFingerprint =>\n hasFields<JsxFingerprint>(value, { value: isString, intrinsicElementCount: isNumber });\n\nconst recordedGiValue = (sentinel: GiFingerprint, inputs: GiInputs): string | undefined => {\n if (!hasMatchingRecordedInputs(sentinel, inputs)) {\n return undefined;\n }\n\n try {\n return hashGi({ ...inputs, girFiles: sentinel.girFiles, libraries: sentinel.libraries });\n } catch {\n return undefined;\n }\n};\n\nconst isGiStoreFresh = (giStoreDir: string, inputs: GiInputs): boolean => {\n const sentinel = readSentinel(giStoreDir);\n\n return isGiFingerprint(sentinel) && recordedGiValue(sentinel, inputs) === sentinel.value;\n};\n\nconst hasMatchingRecordedInputs = (sentinel: GiFingerprint, inputs: GiInputs): boolean =>\n sortAlpha(sentinel.libraries) === sortAlpha(inputs.libraries) &&\n sortAlpha(sentinel.girPath ?? []) === sortAlpha(inputs.girPath);\n\nconst hashDocs = (giValue: string, input: DocsFingerprintInput): string =>\n createHash(\"sha256\")\n .update(\n JSON.stringify([\n giValue,\n input.basePath,\n serializeModuleExports(input.props),\n serializeOmittedProps(input.omittedProps),\n ]),\n )\n .digest(\"hex\");\n\nconst computeDocsFingerprint = (inputs: GiInputs, input: DocsFingerprintInput): DocsFingerprint => {\n const gi = computeGiFingerprint(inputs);\n\n return { value: hashDocs(gi.value, input), gi };\n};\n\nconst isDocsOutputFresh = (outDir: string, inputs: GiInputs, input: DocsFingerprintInput): boolean => {\n const sentinel = readSentinel(outDir);\n\n if (!isDocsFingerprint(sentinel)) {\n return false;\n }\n\n const giValue = recordedGiValue(sentinel.gi, inputs);\n\n return giValue !== undefined && hashDocs(giValue, input) === sentinel.value;\n};\n\nconst serializeModuleExports = (map: Record<string, ModuleExport>): [string, string, string][] =>\n sortStrings(Object.keys(map)).map((type) => [type, map[type]?.module ?? \"\", map[type]?.export ?? \"\"]);\n\nconst serializeOmittedProps = (map: Record<string, string[]>): [string, string][] =>\n sortStrings(Object.keys(map)).map((type) => [type, sortAlpha(map[type] ?? [])]);\n\nconst hashJsx = (input: JsxFingerprintInput): string =>\n createHash(\"sha256\")\n .update(\n JSON.stringify([\n CODEGEN_VERSION,\n input.reactVersion,\n serializeModuleExports(input.components),\n sortStrings(input.lazyElements),\n serializeModuleExports(input.props),\n serializeOmittedProps(input.omittedProps),\n ]),\n )\n .digest(\"hex\");\n\nconst computeJsxFingerprint = (input: JsxFingerprintInput, intrinsicElementCount: number): JsxFingerprint => ({\n value: hashJsx(input),\n intrinsicElementCount,\n});\n\nconst jsxStoreFreshness = (\n jsxStoreDir: string,\n input: JsxFingerprintInput,\n): { isFresh: boolean; intrinsicElementCount: number } => {\n const sentinel = readSentinel(jsxStoreDir);\n\n if (!isJsxFingerprint(sentinel)) {\n return { isFresh: false, intrinsicElementCount: 0 };\n }\n\n return sentinel.value === hashJsx(input)\n ? { isFresh: true, intrinsicElementCount: sentinel.intrinsicElementCount }\n : { isFresh: false, intrinsicElementCount: 0 };\n};\n\nexport {\n FINGERPRINT_FILENAME,\n computeGiFingerprint,\n computeDocsFingerprint,\n isGiStoreFresh,\n isDocsOutputFresh,\n computeJsxFingerprint,\n jsxStoreFreshness,\n type DocsFingerprintInput,\n type GiInputs,\n type GiFingerprint,\n type JsxFingerprintInput,\n};\n"]}
package/dist/gi.d.ts CHANGED
@@ -4,6 +4,7 @@ type GiCodegenOptions = {
4
4
  gi: StoreOptions;
5
5
  libraries: string[];
6
6
  girPath: string[];
7
+ isByteArrayTyped: boolean;
7
8
  };
8
9
  declare const runGiCodegen: (library: Library, options: GiCodegenOptions) => number;
9
10
  export { runGiCodegen };
package/dist/gi.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"gi.d.ts","sourceRoot":"","sources":["../src/gi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAMxD,KAAK,gBAAgB,GAAG;IACpB,EAAE,EAAE,YAAY,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;CACrB,CAAC;AAEF,QAAA,MAAM,YAAY,GAAI,SAAS,OAAO,EAAE,SAAS,gBAAgB,KAAG,MAYnE,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,CAAC"}
1
+ {"version":3,"file":"gi.d.ts","sourceRoot":"","sources":["../src/gi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAMxD,KAAK,gBAAgB,GAAG;IACpB,EAAE,EAAE,YAAY,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,gBAAgB,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF,QAAA,MAAM,YAAY,GAAI,SAAS,OAAO,EAAE,SAAS,gBAAgB,KAAG,MAmBnE,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,CAAC"}
package/dist/gi.js CHANGED
@@ -3,12 +3,18 @@ import { namespaceDirectory } from "./gir/namespace.js";
3
3
  import { writeGiStore } from "./store/gi-store.js";
4
4
  import { generateNamespaceModule } from "./store/gi/pipeline.js";
5
5
  const runGiCodegen = (library, options) => {
6
- const { gi, libraries, girPath } = options;
6
+ const { gi, libraries, girPath, isByteArrayTyped } = options;
7
7
  const namespaces = Array.from(library.namespaces.values(), (namespace) => ({
8
8
  directory: namespaceDirectory(namespace),
9
9
  rawSource: generateNamespaceModule(namespace, library),
10
+ girFile: namespace.girFile,
10
11
  }));
11
- const fingerprint = computeGiFingerprint(library.girFiles, [...libraries], [...girPath]);
12
+ const fingerprint = computeGiFingerprint({
13
+ girFiles: library.girFiles,
14
+ libraries: [...libraries],
15
+ girPath: [...girPath],
16
+ isByteArrayTyped,
17
+ });
12
18
  writeGiStore(gi, namespaces, fingerprint);
13
19
  return library.namespaces.size;
14
20
  };
package/dist/gi.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"gi.js","sourceRoot":"","sources":["../src/gi.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAyB,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAQjE,MAAM,YAAY,GAAG,CAAC,OAAgB,EAAE,OAAyB,EAAU,EAAE;IACzE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAE3C,MAAM,UAAU,GAAuB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC3F,SAAS,EAAE,kBAAkB,CAAC,SAAS,CAAC;QACxC,SAAS,EAAE,uBAAuB,CAAC,SAAS,EAAE,OAAO,CAAC;KACzD,CAAC,CAAC,CAAC;IAEJ,MAAM,WAAW,GAAG,oBAAoB,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IACzF,YAAY,CAAC,EAAE,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;IAE1C,OAAO,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;AACnC,CAAC,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,CAAC","sourcesContent":["import type { Library } from \"./gir/library.js\";\nimport type { StoreOptions } from \"./store/store-fs.js\";\nimport { computeGiFingerprint } from \"./fingerprint.js\";\nimport { namespaceDirectory } from \"./gir/namespace.js\";\nimport { type GiNamespaceInput, writeGiStore } from \"./store/gi-store.js\";\nimport { generateNamespaceModule } from \"./store/gi/pipeline.js\";\n\ntype GiCodegenOptions = {\n gi: StoreOptions;\n libraries: string[];\n girPath: string[];\n};\n\nconst runGiCodegen = (library: Library, options: GiCodegenOptions): number => {\n const { gi, libraries, girPath } = options;\n\n const namespaces: GiNamespaceInput[] = Array.from(library.namespaces.values(), (namespace) => ({\n directory: namespaceDirectory(namespace),\n rawSource: generateNamespaceModule(namespace, library),\n }));\n\n const fingerprint = computeGiFingerprint(library.girFiles, [...libraries], [...girPath]);\n writeGiStore(gi, namespaces, fingerprint);\n\n return library.namespaces.size;\n};\n\nexport { runGiCodegen };\n"]}
1
+ {"version":3,"file":"gi.js","sourceRoot":"","sources":["../src/gi.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAyB,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AASjE,MAAM,YAAY,GAAG,CAAC,OAAgB,EAAE,OAAyB,EAAU,EAAE;IACzE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC;IAE7D,MAAM,UAAU,GAAuB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC3F,SAAS,EAAE,kBAAkB,CAAC,SAAS,CAAC;QACxC,SAAS,EAAE,uBAAuB,CAAC,SAAS,EAAE,OAAO,CAAC;QACtD,OAAO,EAAE,SAAS,CAAC,OAAO;KAC7B,CAAC,CAAC,CAAC;IAEJ,MAAM,WAAW,GAAG,oBAAoB,CAAC;QACrC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,SAAS,EAAE,CAAC,GAAG,SAAS,CAAC;QACzB,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC;QACrB,gBAAgB;KACnB,CAAC,CAAC;IAEH,YAAY,CAAC,EAAE,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;IAE1C,OAAO,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;AACnC,CAAC,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,CAAC","sourcesContent":["import type { Library } from \"./gir/library.js\";\nimport type { StoreOptions } from \"./store/store-fs.js\";\nimport { computeGiFingerprint } from \"./fingerprint.js\";\nimport { namespaceDirectory } from \"./gir/namespace.js\";\nimport { type GiNamespaceInput, writeGiStore } from \"./store/gi-store.js\";\nimport { generateNamespaceModule } from \"./store/gi/pipeline.js\";\n\ntype GiCodegenOptions = {\n gi: StoreOptions;\n libraries: string[];\n girPath: string[];\n isByteArrayTyped: boolean;\n};\n\nconst runGiCodegen = (library: Library, options: GiCodegenOptions): number => {\n const { gi, libraries, girPath, isByteArrayTyped } = options;\n\n const namespaces: GiNamespaceInput[] = Array.from(library.namespaces.values(), (namespace) => ({\n directory: namespaceDirectory(namespace),\n rawSource: generateNamespaceModule(namespace, library),\n girFile: namespace.girFile,\n }));\n\n const fingerprint = computeGiFingerprint({\n girFiles: library.girFiles,\n libraries: [...libraries],\n girPath: [...girPath],\n isByteArrayTyped,\n });\n\n writeGiStore(gi, namespaces, fingerprint);\n\n return library.namespaces.size;\n};\n\nexport { runGiCodegen };\n"]}
@@ -4,7 +4,13 @@ type ResolvedAncestor = {
4
4
  klass: GirClass;
5
5
  namespaceName: string;
6
6
  };
7
+ type ParentRef = {
8
+ namespaceName: string | undefined;
9
+ typeName: string;
10
+ };
11
+ declare const getParentRef: (klass: GirClass) => ParentRef | undefined;
12
+ declare const resolveClassOrInterface: (library: Library, defaultNamespace: string, name: string) => ResolvedAncestor | undefined;
7
13
  declare const resolveInterfaces: (library: Library, defaultNamespace: string, names: string[]) => ResolvedAncestor[];
8
14
  declare function ancestorChain(library: Library, klass: GirClass, namespaceName: string): Generator<ResolvedAncestor>;
9
- export { resolveInterfaces, ancestorChain, type ResolvedAncestor };
15
+ export { resolveClassOrInterface, resolveInterfaces, ancestorChain, getParentRef, type ResolvedAncestor };
10
16
  //# sourceMappingURL=ancestry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ancestry.d.ts","sourceRoot":"","sources":["../../src/gir/ancestry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAG5C,KAAK,gBAAgB,GAAG;IACpB,KAAK,EAAE,QAAQ,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;CACzB,CAAC;AAuBF,QAAA,MAAM,iBAAiB,GAAI,SAAS,OAAO,EAAE,kBAAkB,MAAM,EAAE,OAAO,MAAM,EAAE,KAAG,gBAAgB,EAYxG,CAAC;AAEF,iBAAU,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAoB7G;AAED,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,KAAK,gBAAgB,EAAE,CAAC"}
1
+ {"version":3,"file":"ancestry.d.ts","sourceRoot":"","sources":["../../src/gir/ancestry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAI5C,KAAK,gBAAgB,GAAG;IACpB,KAAK,EAAE,QAAQ,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,KAAK,SAAS,GAAG;IACb,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,QAAQ,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,QAAA,MAAM,YAAY,GAAI,OAAO,QAAQ,KAAG,SAAS,GAAG,SAQnD,CAAC;AAOF,QAAA,MAAM,uBAAuB,GACzB,SAAS,OAAO,EAChB,kBAAkB,MAAM,EACxB,MAAM,MAAM,KACb,gBAAgB,GAAG,SAAqE,CAAC;AAY5F,QAAA,MAAM,iBAAiB,GAAI,SAAS,OAAO,EAAE,kBAAkB,MAAM,EAAE,OAAO,MAAM,EAAE,KAAG,gBAAgB,EAYxG,CAAC;AAEF,iBAAU,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAoB7G;AAED,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,aAAa,EAAE,YAAY,EAAE,KAAK,gBAAgB,EAAE,CAAC"}
@@ -1,3 +1,11 @@
1
+ import { splitOptionalNamespace } from "./type-ref.js";
2
+ const getParentRef = (klass) => {
3
+ if (klass.parent === undefined) {
4
+ return undefined;
5
+ }
6
+ const [namespaceName, typeName] = splitOptionalNamespace(klass.parent);
7
+ return { namespaceName, typeName };
8
+ };
1
9
  const getAncestor = (resolved) => resolved !== undefined && (resolved.kind === "class" || resolved.kind === "interface")
2
10
  ? { klass: resolved.value, namespaceName: resolved.namespace.name }
3
11
  : undefined;
@@ -32,5 +40,5 @@ function* ancestorChain(library, klass, namespaceName) {
32
40
  current = resolveClassOrInterface(library, current.namespaceName, current.klass.parent);
33
41
  }
34
42
  }
35
- export { resolveInterfaces, ancestorChain };
43
+ export { resolveClassOrInterface, resolveInterfaces, ancestorChain, getParentRef };
36
44
  //# sourceMappingURL=ancestry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ancestry.js","sourceRoot":"","sources":["../../src/gir/ancestry.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,GAAG,CAAC,QAA6B,EAAgC,EAAE,CAChF,QAAQ,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,OAAO,IAAI,QAAQ,CAAC,IAAI,KAAK,WAAW,CAAC;IAClF,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,aAAa,EAAE,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE;IACnE,CAAC,CAAC,SAAS,CAAC;AAEpB,MAAM,uBAAuB,GAAG,CAC5B,OAAgB,EAChB,gBAAwB,EACxB,IAAY,EACgB,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,WAAW,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC,CAAC;AAE5F,MAAM,gBAAgB,GAAG,CACrB,OAAgB,EAChB,gBAAwB,EACxB,IAAY,EACgB,EAAE;IAC9B,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;IAE7D,OAAO,QAAQ,EAAE,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9E,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,OAAgB,EAAE,gBAAwB,EAAE,KAAe,EAAsB,EAAE;IAC1G,MAAM,UAAU,GAAuB,EAAE,CAAC;IAE1C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,EAAE,IAAI,CAAC,CAAC;QAEhE,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACtB,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;IACL,CAAC;IAED,OAAO,UAAU,CAAC;AACtB,CAAC,CAAC;AAEF,QAAQ,CAAC,CAAC,aAAa,CAAC,OAAgB,EAAE,KAAe,EAAE,aAAqB;IAC5E,MAAM,OAAO,GAAgB,IAAI,GAAG,EAAE,CAAC;IACvC,IAAI,OAAO,GAAiC,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;IAErE,OAAO,OAAO,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAE7D,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACnB,OAAO;QACX,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjB,MAAM,OAAO,CAAC;QAEd,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACrC,OAAO;QACX,CAAC;QAED,OAAO,GAAG,uBAAuB,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5F,CAAC;AACL,CAAC;AAED,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAyB,CAAC","sourcesContent":["import type { GirClass } from \"./class.js\";\nimport type { Library } from \"./library.js\";\nimport type { GirType } from \"./type.js\";\n\ntype ResolvedAncestor = {\n klass: GirClass;\n namespaceName: string;\n};\n\nconst getAncestor = (resolved: GirType | undefined): ResolvedAncestor | undefined =>\n resolved !== undefined && (resolved.kind === \"class\" || resolved.kind === \"interface\")\n ? { klass: resolved.value, namespaceName: resolved.namespace.name }\n : undefined;\n\nconst resolveClassOrInterface = (\n library: Library,\n defaultNamespace: string,\n name: string,\n): ResolvedAncestor | undefined => getAncestor(library.resolveType(defaultNamespace, name));\n\nconst resolveInterface = (\n library: Library,\n defaultNamespace: string,\n name: string,\n): ResolvedAncestor | undefined => {\n const resolved = library.resolveType(defaultNamespace, name);\n\n return resolved?.kind === \"interface\" ? getAncestor(resolved) : undefined;\n};\n\nconst resolveInterfaces = (library: Library, defaultNamespace: string, names: string[]): ResolvedAncestor[] => {\n const interfaces: ResolvedAncestor[] = [];\n\n for (const name of names) {\n const iface = resolveInterface(library, defaultNamespace, name);\n\n if (iface !== undefined) {\n interfaces.push(iface);\n }\n }\n\n return interfaces;\n};\n\nfunction* ancestorChain(library: Library, klass: GirClass, namespaceName: string): Generator<ResolvedAncestor> {\n const visited: Set<string> = new Set();\n let current: ResolvedAncestor | undefined = { klass, namespaceName };\n\n while (current !== undefined) {\n const key = `${current.namespaceName}.${current.klass.name}`;\n\n if (visited.has(key)) {\n return;\n }\n\n visited.add(key);\n yield current;\n\n if (current.klass.parent === undefined) {\n return;\n }\n\n current = resolveClassOrInterface(library, current.namespaceName, current.klass.parent);\n }\n}\n\nexport { resolveInterfaces, ancestorChain, type ResolvedAncestor };\n"]}
1
+ {"version":3,"file":"ancestry.js","sourceRoot":"","sources":["../../src/gir/ancestry.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAYvD,MAAM,YAAY,GAAG,CAAC,KAAe,EAAyB,EAAE;IAC5D,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,MAAM,CAAC,aAAa,EAAE,QAAQ,CAAC,GAAG,sBAAsB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAEvE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC;AACvC,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,QAA6B,EAAgC,EAAE,CAChF,QAAQ,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,OAAO,IAAI,QAAQ,CAAC,IAAI,KAAK,WAAW,CAAC;IAClF,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,aAAa,EAAE,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE;IACnE,CAAC,CAAC,SAAS,CAAC;AAEpB,MAAM,uBAAuB,GAAG,CAC5B,OAAgB,EAChB,gBAAwB,EACxB,IAAY,EACgB,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,WAAW,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC,CAAC;AAE5F,MAAM,gBAAgB,GAAG,CACrB,OAAgB,EAChB,gBAAwB,EACxB,IAAY,EACgB,EAAE;IAC9B,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;IAE7D,OAAO,QAAQ,EAAE,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9E,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,OAAgB,EAAE,gBAAwB,EAAE,KAAe,EAAsB,EAAE;IAC1G,MAAM,UAAU,GAAuB,EAAE,CAAC;IAE1C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,EAAE,IAAI,CAAC,CAAC;QAEhE,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACtB,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;IACL,CAAC;IAED,OAAO,UAAU,CAAC;AACtB,CAAC,CAAC;AAEF,QAAQ,CAAC,CAAC,aAAa,CAAC,OAAgB,EAAE,KAAe,EAAE,aAAqB;IAC5E,MAAM,OAAO,GAAgB,IAAI,GAAG,EAAE,CAAC;IACvC,IAAI,OAAO,GAAiC,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;IAErE,OAAO,OAAO,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAE7D,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACnB,OAAO;QACX,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjB,MAAM,OAAO,CAAC;QAEd,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACrC,OAAO;QACX,CAAC;QAED,OAAO,GAAG,uBAAuB,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5F,CAAC;AACL,CAAC;AAED,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,aAAa,EAAE,YAAY,EAAyB,CAAC","sourcesContent":["import type { GirClass } from \"./class.js\";\nimport type { Library } from \"./library.js\";\nimport type { GirType } from \"./type.js\";\nimport { splitOptionalNamespace } from \"./type-ref.js\";\n\ntype ResolvedAncestor = {\n klass: GirClass;\n namespaceName: string;\n};\n\ntype ParentRef = {\n namespaceName: string | undefined;\n typeName: string;\n};\n\nconst getParentRef = (klass: GirClass): ParentRef | undefined => {\n if (klass.parent === undefined) {\n return undefined;\n }\n\n const [namespaceName, typeName] = splitOptionalNamespace(klass.parent);\n\n return { namespaceName, typeName };\n};\n\nconst getAncestor = (resolved: GirType | undefined): ResolvedAncestor | undefined =>\n resolved !== undefined && (resolved.kind === \"class\" || resolved.kind === \"interface\")\n ? { klass: resolved.value, namespaceName: resolved.namespace.name }\n : undefined;\n\nconst resolveClassOrInterface = (\n library: Library,\n defaultNamespace: string,\n name: string,\n): ResolvedAncestor | undefined => getAncestor(library.resolveType(defaultNamespace, name));\n\nconst resolveInterface = (\n library: Library,\n defaultNamespace: string,\n name: string,\n): ResolvedAncestor | undefined => {\n const resolved = library.resolveType(defaultNamespace, name);\n\n return resolved?.kind === \"interface\" ? getAncestor(resolved) : undefined;\n};\n\nconst resolveInterfaces = (library: Library, defaultNamespace: string, names: string[]): ResolvedAncestor[] => {\n const interfaces: ResolvedAncestor[] = [];\n\n for (const name of names) {\n const iface = resolveInterface(library, defaultNamespace, name);\n\n if (iface !== undefined) {\n interfaces.push(iface);\n }\n }\n\n return interfaces;\n};\n\nfunction* ancestorChain(library: Library, klass: GirClass, namespaceName: string): Generator<ResolvedAncestor> {\n const visited: Set<string> = new Set();\n let current: ResolvedAncestor | undefined = { klass, namespaceName };\n\n while (current !== undefined) {\n const key = `${current.namespaceName}.${current.klass.name}`;\n\n if (visited.has(key)) {\n return;\n }\n\n visited.add(key);\n yield current;\n\n if (current.klass.parent === undefined) {\n return;\n }\n\n current = resolveClassOrInterface(library, current.namespaceName, current.klass.parent);\n }\n}\n\nexport { resolveClassOrInterface, resolveInterfaces, ancestorChain, getParentRef, type ResolvedAncestor };\n"]}
@@ -15,8 +15,7 @@ type DocumentedNode = {
15
15
  doc: string | undefined;
16
16
  annotations: GirAnnotations;
17
17
  };
18
- declare const annotationsFromNode: (node: RawNode | undefined) => GirAnnotations;
19
18
  declare const documentedFromNode: (node: RawNode) => DocumentedNode;
20
19
  declare const hasAnnotations: (annotations: GirAnnotations) => boolean;
21
- export { annotationsFromNode, documentedFromNode, hasAnnotations, type GirAnnotations };
20
+ export { documentedFromNode, hasAnnotations, type GirAnnotations };
22
21
  //# sourceMappingURL=annotations.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"annotations.d.ts","sourceRoot":"","sources":["../../src/gir/annotations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwD,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAEhG,iFAAiF;AACjF,KAAK,cAAc,GAAG;IAClB,4EAA4E;IAC5E,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,+CAA+C;IAC/C,YAAY,EAAE,OAAO,CAAC;IACtB,qFAAqF;IACrF,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,gEAAgE;IAChE,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;CACtC,CAAC;AAEF,KAAK,cAAc,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,WAAW,EAAE,cAAc,CAAC;CAC/B,CAAC;AAEF,QAAA,MAAM,mBAAmB,GAAI,MAAM,OAAO,GAAG,SAAS,KAAG,cAKvD,CAAC;AAEH,QAAA,MAAM,kBAAkB,GAAI,MAAM,OAAO,KAAG,cAI1C,CAAC;AAEH,QAAA,MAAM,cAAc,GAAI,aAAa,cAAc,KAAG,OACsD,CAAC;AAE7G,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,CAAC"}
1
+ {"version":3,"file":"annotations.d.ts","sourceRoot":"","sources":["../../src/gir/annotations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwD,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAEhG,iFAAiF;AACjF,KAAK,cAAc,GAAG;IAClB,4EAA4E;IAC5E,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,+CAA+C;IAC/C,YAAY,EAAE,OAAO,CAAC;IACtB,qFAAqF;IACrF,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,gEAAgE;IAChE,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;CACtC,CAAC;AAEF,KAAK,cAAc,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,WAAW,EAAE,cAAc,CAAC;CAC/B,CAAC;AASF,QAAA,MAAM,kBAAkB,GAAI,MAAM,OAAO,KAAG,cAI1C,CAAC;AAEH,QAAA,MAAM,cAAc,GAAI,aAAa,cAAc,KAAG,OACsD,CAAC;AAE7G,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,CAAC"}
@@ -11,5 +11,5 @@ const documentedFromNode = (node) => ({
11
11
  annotations: annotationsFromNode(node),
12
12
  });
13
13
  const hasAnnotations = (annotations) => annotations.since !== undefined || annotations.isDeprecated || annotations.deprecatedSince !== undefined;
14
- export { annotationsFromNode, documentedFromNode, hasAnnotations };
14
+ export { documentedFromNode, hasAnnotations };
15
15
  //# sourceMappingURL=annotations.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"annotations.js","sourceRoot":"","sources":["../../src/gir/annotations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,UAAU,EAAE,QAAQ,EAAgB,MAAM,YAAY,CAAC;AAoBhG,MAAM,mBAAmB,GAAG,CAAC,IAAyB,EAAkB,EAAE,CAAC,CAAC;IACxE,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC;IAC5B,YAAY,EAAE,UAAU,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5C,eAAe,EAAE,IAAI,CAAC,IAAI,EAAE,oBAAoB,CAAC;IACjD,cAAc,EAAE,gBAAgB,CAAC,IAAI,CAAC;CACzC,CAAC,CAAC;AAEH,MAAM,kBAAkB,GAAG,CAAC,IAAa,EAAkB,EAAE,CAAC,CAAC;IAC3D,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC;IACjB,WAAW,EAAE,mBAAmB,CAAC,IAAI,CAAC;CACzC,CAAC,CAAC;AAEH,MAAM,cAAc,GAAG,CAAC,WAA2B,EAAW,EAAE,CAC5D,WAAW,CAAC,KAAK,KAAK,SAAS,IAAI,WAAW,CAAC,YAAY,IAAI,WAAW,CAAC,eAAe,KAAK,SAAS,CAAC;AAE7G,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,cAAc,EAAuB,CAAC","sourcesContent":["import { attr, getDoc, getDocDeprecated, isAttrTrue, nameAttr, type RawNode } from \"./parse.js\";\n\n/** Release and deprecation annotations GIR carries on a documentable element. */\ntype GirAnnotations = {\n /** Library release the symbol appeared in, from the `version` attribute. */\n since: string | undefined;\n /** Whether GIR marks the symbol deprecated. */\n isDeprecated: boolean;\n /** Release the symbol was deprecated in, from the `deprecated-version` attribute. */\n deprecatedSince: string | undefined;\n /** Prose from `<doc-deprecated>` naming what to use instead. */\n deprecationDoc: string | undefined;\n};\n\ntype DocumentedNode = {\n name: string;\n doc: string | undefined;\n annotations: GirAnnotations;\n};\n\nconst annotationsFromNode = (node: RawNode | undefined): GirAnnotations => ({\n since: attr(node, \"version\"),\n isDeprecated: isAttrTrue(node, \"deprecated\"),\n deprecatedSince: attr(node, \"deprecated-version\"),\n deprecationDoc: getDocDeprecated(node),\n});\n\nconst documentedFromNode = (node: RawNode): DocumentedNode => ({\n name: nameAttr(node),\n doc: getDoc(node),\n annotations: annotationsFromNode(node),\n});\n\nconst hasAnnotations = (annotations: GirAnnotations): boolean =>\n annotations.since !== undefined || annotations.isDeprecated || annotations.deprecatedSince !== undefined;\n\nexport { annotationsFromNode, documentedFromNode, hasAnnotations, type GirAnnotations };\n"]}
1
+ {"version":3,"file":"annotations.js","sourceRoot":"","sources":["../../src/gir/annotations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,UAAU,EAAE,QAAQ,EAAgB,MAAM,YAAY,CAAC;AAoBhG,MAAM,mBAAmB,GAAG,CAAC,IAAyB,EAAkB,EAAE,CAAC,CAAC;IACxE,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC;IAC5B,YAAY,EAAE,UAAU,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5C,eAAe,EAAE,IAAI,CAAC,IAAI,EAAE,oBAAoB,CAAC;IACjD,cAAc,EAAE,gBAAgB,CAAC,IAAI,CAAC;CACzC,CAAC,CAAC;AAEH,MAAM,kBAAkB,GAAG,CAAC,IAAa,EAAkB,EAAE,CAAC,CAAC;IAC3D,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC;IACjB,WAAW,EAAE,mBAAmB,CAAC,IAAI,CAAC;CACzC,CAAC,CAAC;AAEH,MAAM,cAAc,GAAG,CAAC,WAA2B,EAAW,EAAE,CAC5D,WAAW,CAAC,KAAK,KAAK,SAAS,IAAI,WAAW,CAAC,YAAY,IAAI,WAAW,CAAC,eAAe,KAAK,SAAS,CAAC;AAE7G,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAuB,CAAC","sourcesContent":["import { attr, getDoc, getDocDeprecated, isAttrTrue, nameAttr, type RawNode } from \"./parse.js\";\n\n/** Release and deprecation annotations GIR carries on a documentable element. */\ntype GirAnnotations = {\n /** Library release the symbol appeared in, from the `version` attribute. */\n since: string | undefined;\n /** Whether GIR marks the symbol deprecated. */\n isDeprecated: boolean;\n /** Release the symbol was deprecated in, from the `deprecated-version` attribute. */\n deprecatedSince: string | undefined;\n /** Prose from `<doc-deprecated>` naming what to use instead. */\n deprecationDoc: string | undefined;\n};\n\ntype DocumentedNode = {\n name: string;\n doc: string | undefined;\n annotations: GirAnnotations;\n};\n\nconst annotationsFromNode = (node: RawNode | undefined): GirAnnotations => ({\n since: attr(node, \"version\"),\n isDeprecated: isAttrTrue(node, \"deprecated\"),\n deprecatedSince: attr(node, \"deprecated-version\"),\n deprecationDoc: getDocDeprecated(node),\n});\n\nconst documentedFromNode = (node: RawNode): DocumentedNode => ({\n name: nameAttr(node),\n doc: getDoc(node),\n annotations: annotationsFromNode(node),\n});\n\nconst hasAnnotations = (annotations: GirAnnotations): boolean =>\n annotations.since !== undefined || annotations.isDeprecated || annotations.deprecatedSince !== undefined;\n\nexport { documentedFromNode, hasAnnotations, type GirAnnotations };\n"]}
@@ -0,0 +1,8 @@
1
+ type CursorParameterNames = {
2
+ cursor: string;
3
+ base: string;
4
+ length: string;
5
+ };
6
+ declare const PARAMETERS_MISSING_ARRAY_EXTENT: Map<string, CursorParameterNames[]>;
7
+ export { PARAMETERS_MISSING_ARRAY_EXTENT, type CursorParameterNames };
8
+ //# sourceMappingURL=cursor-overrides.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor-overrides.d.ts","sourceRoot":"","sources":["../../src/gir/cursor-overrides.ts"],"names":[],"mappings":"AAAA,KAAK,oBAAoB,GAAG;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,QAAA,MAAM,+BAA+B,EAAE,GAAG,CAAC,MAAM,EAAE,oBAAoB,EAAE,CAGvE,CAAC;AAEH,OAAO,EAAE,+BAA+B,EAAE,KAAK,oBAAoB,EAAE,CAAC"}
@@ -0,0 +1,6 @@
1
+ const PARAMETERS_MISSING_ARRAY_EXTENT = new Map([
2
+ ["g_utf8_validate", [{ cursor: "end", base: "str", length: "max_len" }]],
3
+ ["g_utf8_validate_len", [{ cursor: "end", base: "str", length: "max_len" }]],
4
+ ]);
5
+ export { PARAMETERS_MISSING_ARRAY_EXTENT };
6
+ //# sourceMappingURL=cursor-overrides.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor-overrides.js","sourceRoot":"","sources":["../../src/gir/cursor-overrides.ts"],"names":[],"mappings":"AAMA,MAAM,+BAA+B,GAAwC,IAAI,GAAG,CAAC;IACjF,CAAC,iBAAiB,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IACxE,CAAC,qBAAqB,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;CAC/E,CAAC,CAAC;AAEH,OAAO,EAAE,+BAA+B,EAA6B,CAAC","sourcesContent":["type CursorParameterNames = {\n cursor: string;\n base: string;\n length: string;\n};\n\nconst PARAMETERS_MISSING_ARRAY_EXTENT: Map<string, CursorParameterNames[]> = new Map([\n [\"g_utf8_validate\", [{ cursor: \"end\", base: \"str\", length: \"max_len\" }]],\n [\"g_utf8_validate_len\", [{ cursor: \"end\", base: \"str\", length: \"max_len\" }]],\n]);\n\nexport { PARAMETERS_MISSING_ARRAY_EXTENT, type CursorParameterNames };\n"]}
@@ -0,0 +1,7 @@
1
+ type NamedEntity = {
2
+ name: string;
3
+ introspectable?: boolean | undefined;
4
+ };
5
+ declare const isEmittableEntity: (entity: NamedEntity) => boolean;
6
+ export { isEmittableEntity };
7
+ //# sourceMappingURL=emittable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emittable.d.ts","sourceRoot":"","sources":["../../src/gir/emittable.ts"],"names":[],"mappings":"AAAA,KAAK,WAAW,GAAG;IACf,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACxC,CAAC;AAEF,QAAA,MAAM,iBAAiB,GAAI,QAAQ,WAAW,KAAG,OAAoE,CAAC;AAEtH,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ const isEmittableEntity = (entity) => entity.name.length > 0 && entity.introspectable !== false;
2
+ export { isEmittableEntity };
3
+ //# sourceMappingURL=emittable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emittable.js","sourceRoot":"","sources":["../../src/gir/emittable.ts"],"names":[],"mappings":"AAKA,MAAM,iBAAiB,GAAG,CAAC,MAAmB,EAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,cAAc,KAAK,KAAK,CAAC;AAEtH,OAAO,EAAE,iBAAiB,EAAE,CAAC","sourcesContent":["type NamedEntity = {\n name: string;\n introspectable?: boolean | undefined;\n};\n\nconst isEmittableEntity = (entity: NamedEntity): boolean => entity.name.length > 0 && entity.introspectable !== false;\n\nexport { isEmittableEntity };\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"function.d.ts","sourceRoot":"","sources":["../../src/gir/function.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,cAAc,EAAoC,MAAM,gBAAgB,CAAC;AAC1G,OAAO,EAAkB,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1D,wGAAwG;AACxG,KAAK,WAAW,GAAG;IACf,kGAAkG;IAClG,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,uEAAuE;IACvE,WAAW,EAAE,cAAc,CAAC;IAC5B,gDAAgD;IAChD,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,mFAAmF;IACnF,MAAM,EAAE,OAAO,CAAC;IAChB,6EAA6E;IAC7E,cAAc,EAAE,OAAO,CAAC;IACxB,iGAAiG;IACjG,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,2FAA2F;IAC3F,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,oGAAoG;IACpG,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,sGAAsG;IACtG,QAAQ,EAAE,YAAY,GAAG,SAAS,CAAC;IACnC,oEAAoE;IACpE,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,oEAAoE;IACpE,WAAW,EAAE,cAAc,CAAC;CAC/B,CAAC;AAoBF,QAAA,MAAM,gBAAgB,GAAI,MAAM,OAAO,EAAE,SAAS,YAAY,KAAG,WAYhE,CAAC;AAEF,OAAO,EAAE,gBAAgB,EAAE,KAAK,WAAW,EAAE,CAAC"}
1
+ {"version":3,"file":"function.d.ts","sourceRoot":"","sources":["../../src/gir/function.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGjD,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,cAAc,EAAoC,MAAM,gBAAgB,CAAC;AAC1G,OAAO,EAAkB,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1D,wGAAwG;AACxG,KAAK,WAAW,GAAG;IACf,kGAAkG;IAClG,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,uEAAuE;IACvE,WAAW,EAAE,cAAc,CAAC;IAC5B,gDAAgD;IAChD,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,mFAAmF;IACnF,MAAM,EAAE,OAAO,CAAC;IAChB,6EAA6E;IAC7E,cAAc,EAAE,OAAO,CAAC;IACxB,iGAAiG;IACjG,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,2FAA2F;IAC3F,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,oGAAoG;IACpG,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,sGAAsG;IACtG,QAAQ,EAAE,YAAY,GAAG,SAAS,CAAC;IACnC,oEAAoE;IACpE,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,oEAAoE;IACpE,WAAW,EAAE,cAAc,CAAC;CAC/B,CAAC;AAqDF,QAAA,MAAM,gBAAgB,GAAI,MAAM,OAAO,EAAE,SAAS,YAAY,KAAG,WAchE,CAAC;AAEF,OAAO,EAAE,gBAAgB,EAAE,KAAK,WAAW,EAAE,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { PARAMETERS_MISSING_ARRAY_EXTENT } from "./cursor-overrides.js";
1
2
  import { PARAMETERS_MISSING_NULLABLE_ANNOTATION } from "./nullable-overrides.js";
2
3
  import { parameterFromNode, parseCallable } from "./parameter.js";
3
4
  import { attr, getChild } from "./parse.js";
@@ -15,9 +16,34 @@ const relaxMissingNullable = (fn) => {
15
16
  }
16
17
  return fn;
17
18
  };
19
+ const parameterIndexFor = (parameters, name) => {
20
+ const index = parameters.findIndex((parameter) => parameter.name === name);
21
+ if (index === -1) {
22
+ throw new Error(`A cursor correction names a parameter the GIR does not declare: ${name}`);
23
+ }
24
+ return index;
25
+ };
26
+ const bindCursorParameters = (parameters, corrections) => {
27
+ for (const names of corrections) {
28
+ const parameter = parameters[parameterIndexFor(parameters, names.cursor)];
29
+ if (parameter !== undefined) {
30
+ parameter.cursor = {
31
+ baseIndex: parameterIndexFor(parameters, names.base),
32
+ lengthIndex: parameterIndexFor(parameters, names.length),
33
+ };
34
+ }
35
+ }
36
+ };
37
+ const bindMissingArrayExtent = (fn) => {
38
+ const corrections = fn.cIdentifier === undefined ? undefined : PARAMETERS_MISSING_ARRAY_EXTENT.get(fn.cIdentifier);
39
+ if (corrections !== undefined) {
40
+ bindCursorParameters(fn.parameters, corrections);
41
+ }
42
+ return fn;
43
+ };
18
44
  const functionFromNode = (node, context) => {
19
45
  const instanceNode = getChild(getChild(node, "parameters"), "instance-parameter");
20
- return relaxMissingNullable({
46
+ return bindMissingArrayExtent(relaxMissingNullable({
21
47
  ...parseCallable(node, context),
22
48
  name: attr(node, "shadows") ?? attr(node, "name") ?? "",
23
49
  cIdentifier: attr(node, "c:identifier"),
@@ -25,7 +51,7 @@ const functionFromNode = (node, context) => {
25
51
  shadowedBy: attr(node, "shadowed-by"),
26
52
  finishFunc: attr(node, "glib:finish-func"),
27
53
  instance: instanceNode === undefined ? undefined : parameterFromNode(instanceNode, context),
28
- });
54
+ }));
29
55
  };
30
56
  export { functionFromNode };
31
57
  //# sourceMappingURL=function.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"function.js","sourceRoot":"","sources":["../../src/gir/function.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sCAAsC,EAAE,MAAM,yBAAyB,CAAC;AACjF,OAAO,EAA0C,iBAAiB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC1G,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAgB,MAAM,YAAY,CAAC;AA8B1D,MAAM,eAAe,GAAG,CAAC,UAA0B,EAAE,KAAe,EAAQ,EAAE;IAC1E,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACjC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC;QAC9B,CAAC;IACL,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,EAAe,EAAe,EAAE;IAC1D,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,sCAAsC,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC;IAEpH,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACtB,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,EAAE,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,IAAa,EAAE,OAAqB,EAAe,EAAE;IAC3E,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE,oBAAoB,CAAC,CAAC;IAElF,OAAO,oBAAoB,CAAC;QACxB,GAAG,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC;QAC/B,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE;QACvD,WAAW,EAAE,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC;QACvC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC;QAC/B,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC;QACrC,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,kBAAkB,CAAC;QAC1C,QAAQ,EAAE,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,YAAY,EAAE,OAAO,CAAC;KAC9F,CAAC,CAAC;AACP,CAAC,CAAC;AAEF,OAAO,EAAE,gBAAgB,EAAoB,CAAC","sourcesContent":["import type { GirAnnotations } from \"./annotations.js\";\nimport type { ParseContext } from \"./type-id.js\";\nimport { PARAMETERS_MISSING_NULLABLE_ANNOTATION } from \"./nullable-overrides.js\";\nimport { type GirParameter, type GirReturnValue, parameterFromNode, parseCallable } from \"./parameter.js\";\nimport { attr, getChild, type RawNode } from \"./parse.js\";\n\n/** A callable declared by a GIR namespace, class, or record: a function, a method, or a constructor. */\ntype GirFunction = {\n /** Local name within its owner, taken from the `shadows` annotation when the callable has one. */\n name: string;\n /** Documentation text carried by the GIR node. */\n doc: string | undefined;\n /** Release and deprecation annotations GIR carries on the callable. */\n annotations: GirAnnotations;\n /** C symbol the callable is invoked through. */\n cIdentifier: string | undefined;\n /** Whether the C function takes a trailing `GError` out parameter and can fail. */\n throws: boolean;\n /** Whether the GIR marks the callable as introspectable, and so bindable. */\n introspectable: boolean;\n /** Qualified `Type.member` the GIR redirects the callable to, from its `moved-to` annotation. */\n movedTo: string | undefined;\n /** Name of the callable that shadows this one, from the GIR's `shadowed-by` annotation. */\n shadowedBy: string | undefined;\n /** Name of the callable that completes this asynchronous one, from the GIR's `glib:finish-func`. */\n finishFunc: string | undefined;\n /** The instance the callable is invoked on, absent for constructors and namespace-level functions. */\n instance: GirParameter | undefined;\n /** Parameters other than the instance one, in declaration order. */\n parameters: GirParameter[];\n /** What the callable returns, with its transfer and nullability. */\n returnValue: GirReturnValue;\n};\n\nconst relaxParameters = (parameters: GirParameter[], names: string[]): void => {\n for (const parameter of parameters) {\n if (names.includes(parameter.name)) {\n parameter.nullable = true;\n }\n }\n};\n\nconst relaxMissingNullable = (fn: GirFunction): GirFunction => {\n const names = fn.cIdentifier === undefined ? undefined : PARAMETERS_MISSING_NULLABLE_ANNOTATION.get(fn.cIdentifier);\n\n if (names !== undefined) {\n relaxParameters(fn.parameters, names);\n }\n\n return fn;\n};\n\nconst functionFromNode = (node: RawNode, context: ParseContext): GirFunction => {\n const instanceNode = getChild(getChild(node, \"parameters\"), \"instance-parameter\");\n\n return relaxMissingNullable({\n ...parseCallable(node, context),\n name: attr(node, \"shadows\") ?? attr(node, \"name\") ?? \"\",\n cIdentifier: attr(node, \"c:identifier\"),\n movedTo: attr(node, \"moved-to\"),\n shadowedBy: attr(node, \"shadowed-by\"),\n finishFunc: attr(node, \"glib:finish-func\"),\n instance: instanceNode === undefined ? undefined : parameterFromNode(instanceNode, context),\n });\n};\n\nexport { functionFromNode, type GirFunction };\n"]}
1
+ {"version":3,"file":"function.js","sourceRoot":"","sources":["../../src/gir/function.ts"],"names":[],"mappings":"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","sourcesContent":["import type { GirAnnotations } from \"./annotations.js\";\nimport type { ParseContext } from \"./type-id.js\";\nimport { type CursorParameterNames, PARAMETERS_MISSING_ARRAY_EXTENT } from \"./cursor-overrides.js\";\nimport { PARAMETERS_MISSING_NULLABLE_ANNOTATION } from \"./nullable-overrides.js\";\nimport { type GirParameter, type GirReturnValue, parameterFromNode, parseCallable } from \"./parameter.js\";\nimport { attr, getChild, type RawNode } from \"./parse.js\";\n\n/** A callable declared by a GIR namespace, class, or record: a function, a method, or a constructor. */\ntype GirFunction = {\n /** Local name within its owner, taken from the `shadows` annotation when the callable has one. */\n name: string;\n /** Documentation text carried by the GIR node. */\n doc: string | undefined;\n /** Release and deprecation annotations GIR carries on the callable. */\n annotations: GirAnnotations;\n /** C symbol the callable is invoked through. */\n cIdentifier: string | undefined;\n /** Whether the C function takes a trailing `GError` out parameter and can fail. */\n throws: boolean;\n /** Whether the GIR marks the callable as introspectable, and so bindable. */\n introspectable: boolean;\n /** Qualified `Type.member` the GIR redirects the callable to, from its `moved-to` annotation. */\n movedTo: string | undefined;\n /** Name of the callable that shadows this one, from the GIR's `shadowed-by` annotation. */\n shadowedBy: string | undefined;\n /** Name of the callable that completes this asynchronous one, from the GIR's `glib:finish-func`. */\n finishFunc: string | undefined;\n /** The instance the callable is invoked on, absent for constructors and namespace-level functions. */\n instance: GirParameter | undefined;\n /** Parameters other than the instance one, in declaration order. */\n parameters: GirParameter[];\n /** What the callable returns, with its transfer and nullability. */\n returnValue: GirReturnValue;\n};\n\nconst relaxParameters = (parameters: GirParameter[], names: string[]): void => {\n for (const parameter of parameters) {\n if (names.includes(parameter.name)) {\n parameter.nullable = true;\n }\n }\n};\n\nconst relaxMissingNullable = (fn: GirFunction): GirFunction => {\n const names = fn.cIdentifier === undefined ? undefined : PARAMETERS_MISSING_NULLABLE_ANNOTATION.get(fn.cIdentifier);\n\n if (names !== undefined) {\n relaxParameters(fn.parameters, names);\n }\n\n return fn;\n};\n\nconst parameterIndexFor = (parameters: GirParameter[], name: string): number => {\n const index = parameters.findIndex((parameter) => parameter.name === name);\n\n if (index === -1) {\n throw new Error(`A cursor correction names a parameter the GIR does not declare: ${name}`);\n }\n\n return index;\n};\n\nconst bindCursorParameters = (parameters: GirParameter[], corrections: CursorParameterNames[]): void => {\n for (const names of corrections) {\n const parameter = parameters[parameterIndexFor(parameters, names.cursor)];\n\n if (parameter !== undefined) {\n parameter.cursor = {\n baseIndex: parameterIndexFor(parameters, names.base),\n lengthIndex: parameterIndexFor(parameters, names.length),\n };\n }\n }\n};\n\nconst bindMissingArrayExtent = (fn: GirFunction): GirFunction => {\n const corrections = fn.cIdentifier === undefined ? undefined : PARAMETERS_MISSING_ARRAY_EXTENT.get(fn.cIdentifier);\n\n if (corrections !== undefined) {\n bindCursorParameters(fn.parameters, corrections);\n }\n\n return fn;\n};\n\nconst functionFromNode = (node: RawNode, context: ParseContext): GirFunction => {\n const instanceNode = getChild(getChild(node, \"parameters\"), \"instance-parameter\");\n\n return bindMissingArrayExtent(\n relaxMissingNullable({\n ...parseCallable(node, context),\n name: attr(node, \"shadows\") ?? attr(node, \"name\") ?? \"\",\n cIdentifier: attr(node, \"c:identifier\"),\n movedTo: attr(node, \"moved-to\"),\n shadowedBy: attr(node, \"shadowed-by\"),\n finishFunc: attr(node, \"glib:finish-func\"),\n instance: instanceNode === undefined ? undefined : parameterFromNode(instanceNode, context),\n }),\n );\n};\n\nexport { functionFromNode, type GirFunction };\n"]}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * The directories to search for `.gir` files, in precedence order: the config's own `girPath`, then
3
3
  * `GTKX_GIR_PATH`, then `/usr/share/gir-1.0`, then the girdir pkg-config reports for
4
- * gobject-introspection-1.0. Duplicates are dropped, and the last two are included only when they exist.
4
+ * gobject-introspection-1.0. Duplicates are dropped, and the system directories are included only when they exist.
5
5
  *
6
6
  * @throws If pkg-config is installed but fails while being queried.
7
7
  */
@@ -5,7 +5,7 @@ const SYSTEM_GIR_PATH = "/usr/share/gir-1.0";
5
5
  /**
6
6
  * The directories to search for `.gir` files, in precedence order: the config's own `girPath`, then
7
7
  * `GTKX_GIR_PATH`, then `/usr/share/gir-1.0`, then the girdir pkg-config reports for
8
- * gobject-introspection-1.0. Duplicates are dropped, and the last two are included only when they exist.
8
+ * gobject-introspection-1.0. Duplicates are dropped, and the system directories are included only when they exist.
9
9
  *
10
10
  * @throws If pkg-config is installed but fails while being queried.
11
11
  */
@@ -1 +1 @@
1
- {"version":3,"file":"gir-path.js","sourceRoot":"","sources":["../../src/gir/gir-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,MAAM,eAAe,GAAG,oBAAoB,CAAC;AAE7C;;;;;;GAMG;AACH,MAAM,cAAc,GAAG,CAAC,aAAmC,EAAY,EAAE;IACrE,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,aAAa,EAAE,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IAE1C,IAAI,OAAO,EAAE,CAAC;QACV,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IACxE,CAAC;IAED,IAAI,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAChC,CAAC;IAED,MAAM,aAAa,GAAG,oBAAoB,EAAE,CAAC;IAE7C,IAAI,aAAa,KAAK,SAAS,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC3D,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AAC/B,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,KAAc,EAAS,EAAE;IACnD,MAAM,OAAO,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAE9C,OAAO,IAAI,KAAK,CAAC,8DAA8D,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;AAC/G,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,GAAuB,EAAE;IAC9C,IAAI,CAAC;QACD,OAAO,iBAAiB,CAAC,YAAY,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,SAAS,CAAC;IACrB,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,GAAuB,EAAE;IAClD,MAAM,SAAS,GAAG,gBAAgB,EAAE,CAAC;IAErC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,IAAI,CAAC;QACD,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,EAAE,CAAC,mBAAmB,EAAE,2BAA2B,CAAC,EAAE;YACvF,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SACpC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAE9B,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IACpD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrD,OAAO;QACX,CAAC;QAED,MAAM,oBAAoB,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;AACL,CAAC,CAAC;AAEF,OAAO,EAAE,cAAc,EAAE,CAAC","sourcesContent":["import { formatChildProcessError, resolveExecutable } from \"@gtkx/utils\";\nimport { execFileSync } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\n\nconst SYSTEM_GIR_PATH = \"/usr/share/gir-1.0\";\n\n/**\n * The directories to search for `.gir` files, in precedence order: the config's own `girPath`, then\n * `GTKX_GIR_PATH`, then `/usr/share/gir-1.0`, then the girdir pkg-config reports for\n * gobject-introspection-1.0. Duplicates are dropped, and the last two are included only when they exist.\n *\n * @throws If pkg-config is installed but fails while being queried.\n */\nconst resolveGirPath = (configGirPath: string[] | undefined): string[] => {\n const paths: string[] = [];\n\n if (configGirPath) {\n paths.push(...configGirPath);\n }\n\n const envPath = process.env.GTKX_GIR_PATH;\n\n if (envPath) {\n paths.push(...envPath.split(\":\").filter((path) => path.length > 0));\n }\n\n if (existsSync(SYSTEM_GIR_PATH)) {\n paths.push(SYSTEM_GIR_PATH);\n }\n\n const pkgConfigPath = queryPkgConfigGirDir();\n\n if (pkgConfigPath !== undefined && existsSync(pkgConfigPath)) {\n paths.push(pkgConfigPath);\n }\n\n return [...new Set(paths)];\n};\n\nconst pkgConfigGirDirError = (error: unknown): Error => {\n const details = formatChildProcessError(error);\n const suffix = details ? `:\\n${details}` : \"\";\n\n return new Error(`pkg-config failed querying gobject-introspection-1.0 girdir${suffix}`, { cause: error });\n};\n\nconst resolvePkgConfig = (): string | undefined => {\n try {\n return resolveExecutable(\"pkg-config\");\n } catch {\n return undefined;\n }\n};\n\nconst queryPkgConfigGirDir = (): string | undefined => {\n const pkgConfig = resolvePkgConfig();\n\n if (pkgConfig === undefined) {\n return undefined;\n }\n\n try {\n const output = execFileSync(pkgConfig, [\"--variable=girdir\", \"gobject-introspection-1.0\"], {\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n const trimmed = output.trim();\n\n return trimmed.length > 0 ? trimmed : undefined;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return;\n }\n\n throw pkgConfigGirDirError(error);\n }\n};\n\nexport { resolveGirPath };\n"]}
1
+ {"version":3,"file":"gir-path.js","sourceRoot":"","sources":["../../src/gir/gir-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,MAAM,eAAe,GAAG,oBAAoB,CAAC;AAE7C;;;;;;GAMG;AACH,MAAM,cAAc,GAAG,CAAC,aAAmC,EAAY,EAAE;IACrE,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,aAAa,EAAE,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IAE1C,IAAI,OAAO,EAAE,CAAC;QACV,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IACxE,CAAC;IAED,IAAI,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAChC,CAAC;IAED,MAAM,aAAa,GAAG,oBAAoB,EAAE,CAAC;IAE7C,IAAI,aAAa,KAAK,SAAS,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC3D,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AAC/B,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,KAAc,EAAS,EAAE;IACnD,MAAM,OAAO,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAE9C,OAAO,IAAI,KAAK,CAAC,8DAA8D,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;AAC/G,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,GAAuB,EAAE;IAC9C,IAAI,CAAC;QACD,OAAO,iBAAiB,CAAC,YAAY,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,SAAS,CAAC;IACrB,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,GAAuB,EAAE;IAClD,MAAM,SAAS,GAAG,gBAAgB,EAAE,CAAC;IAErC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,IAAI,CAAC;QACD,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,EAAE,CAAC,mBAAmB,EAAE,2BAA2B,CAAC,EAAE;YACvF,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SACpC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAE9B,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IACpD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrD,OAAO;QACX,CAAC;QAED,MAAM,oBAAoB,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;AACL,CAAC,CAAC;AAEF,OAAO,EAAE,cAAc,EAAE,CAAC","sourcesContent":["import { formatChildProcessError, resolveExecutable } from \"@gtkx/utils\";\nimport { execFileSync } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\n\nconst SYSTEM_GIR_PATH = \"/usr/share/gir-1.0\";\n\n/**\n * The directories to search for `.gir` files, in precedence order: the config's own `girPath`, then\n * `GTKX_GIR_PATH`, then `/usr/share/gir-1.0`, then the girdir pkg-config reports for\n * gobject-introspection-1.0. Duplicates are dropped, and the system directories are included only when they exist.\n *\n * @throws If pkg-config is installed but fails while being queried.\n */\nconst resolveGirPath = (configGirPath: string[] | undefined): string[] => {\n const paths: string[] = [];\n\n if (configGirPath) {\n paths.push(...configGirPath);\n }\n\n const envPath = process.env.GTKX_GIR_PATH;\n\n if (envPath) {\n paths.push(...envPath.split(\":\").filter((path) => path.length > 0));\n }\n\n if (existsSync(SYSTEM_GIR_PATH)) {\n paths.push(SYSTEM_GIR_PATH);\n }\n\n const pkgConfigPath = queryPkgConfigGirDir();\n\n if (pkgConfigPath !== undefined && existsSync(pkgConfigPath)) {\n paths.push(pkgConfigPath);\n }\n\n return [...new Set(paths)];\n};\n\nconst pkgConfigGirDirError = (error: unknown): Error => {\n const details = formatChildProcessError(error);\n const suffix = details ? `:\\n${details}` : \"\";\n\n return new Error(`pkg-config failed querying gobject-introspection-1.0 girdir${suffix}`, { cause: error });\n};\n\nconst resolvePkgConfig = (): string | undefined => {\n try {\n return resolveExecutable(\"pkg-config\");\n } catch {\n return undefined;\n }\n};\n\nconst queryPkgConfigGirDir = (): string | undefined => {\n const pkgConfig = resolvePkgConfig();\n\n if (pkgConfig === undefined) {\n return undefined;\n }\n\n try {\n const output = execFileSync(pkgConfig, [\"--variable=girdir\", \"gobject-introspection-1.0\"], {\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n const trimmed = output.trim();\n\n return trimmed.length > 0 ? trimmed : undefined;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return;\n }\n\n throw pkgConfigGirDirError(error);\n }\n};\n\nexport { resolveGirPath };\n"]}
@@ -12,15 +12,17 @@ declare class Library {
12
12
  *
13
13
  * @param libraries GIR identifiers to load, such as `Gtk-4.0`.
14
14
  * @param girPath Directories searched, in order, for each `.gir` file.
15
+ * @param isByteArrayTyped Whether byte sequences render as `Uint8Array` rather than `number[]`.
15
16
  * @returns A library holding every namespace that was parsed.
16
17
  */
17
- static load(libraries: string[], girPath: string[]): Library;
18
+ static load(libraries: string[], girPath: string[], isByteArrayTyped?: boolean): Library;
18
19
  private namespacesByName;
19
20
  private namespaceById;
20
21
  private nsNameById;
21
22
  private nsIdByName;
22
23
  private typeTables;
23
24
  private girFilesValue;
25
+ private isByteArrayTypedValue;
24
26
  /** Creates a library with no namespaces loaded; {@link Library.load} builds a populated one. */
25
27
  constructor();
26
28
  private ensureNsId;
@@ -44,6 +46,8 @@ declare class Library {
44
46
  private discoverNamespaces;
45
47
  /** The loaded namespaces, keyed by their GIR name such as `Gtk`. */
46
48
  get namespaces(): Map<string, GirNamespace>;
49
+ /** Whether byte sequences render as `Uint8Array` rather than `number[]`. */
50
+ get isByteArrayTyped(): boolean;
47
51
  /** Paths of the `.gir` files that were read, in the order they were discovered. */
48
52
  get girFiles(): string[];
49
53
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"library.d.ts","sourceRoot":"","sources":["../../src/gir/library.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAqD,MAAM,EAAE,MAAM,cAAc,CAAC;AAC9F,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,EAEH,KAAK,YAAY,EAIpB,MAAM,gBAAgB,CAAC;AAkDxB;;;GAGG;AACH,cAAM,OAAO;IACT,OAAO,CAAC,MAAM,CAAC,KAAK;IAcpB;;;;;;OAMG;IACH,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO;IAO5D,OAAO,CAAC,gBAAgB,CAAwC;IAChE,OAAO,CAAC,aAAa,CAAoC;IACzD,OAAO,CAAC,UAAU,CAAgB;IAClC,OAAO,CAAC,UAAU,CAAkC;IACpD,OAAO,CAAC,UAAU,CAAmB;IACrC,OAAO,CAAC,aAAa,CAAgB;IAErC,gGAAgG;;IAOhG,OAAO,CAAC,UAAU;IAgBlB,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,mBAAmB;IAe3B,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,YAAY;IAkBpB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,kBAAkB;IAa1B,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,oBAAoB;IAgB5B,OAAO,CAAC,oBAAoB;IAgB5B,OAAO,CAAC,iBAAiB;IA2BzB,OAAO,CAAC,kBAAkB;IAoB1B,oEAAoE;IACpE,IAAW,UAAU,IAAI,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAEjD;IAED,mFAAmF;IACnF,IAAW,QAAQ,IAAI,MAAM,EAAE,CAE9B;IAED;;;;;OAKG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAIzC;;;;;OAKG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG;QAClB,6DAA6D;QAC7D,aAAa,EAAE,MAAM,CAAC;QACtB,kEAAkE;QAClE,QAAQ,EAAE,MAAM,CAAC;KACpB,GAAG,SAAS;IAWb;;;;;;;OAOG;IACH,WAAW,CAAC,oBAAoB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;CAsB/E;AAED,OAAO,EAAE,OAAO,EAAE,CAAC"}
1
+ {"version":3,"file":"library.d.ts","sourceRoot":"","sources":["../../src/gir/library.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAqD,MAAM,EAAE,MAAM,cAAc,CAAC;AAC9F,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,EAEH,KAAK,YAAY,EAIpB,MAAM,gBAAgB,CAAC;AAkDxB;;;GAGG;AACH,cAAM,OAAO;IACT,OAAO,CAAC,MAAM,CAAC,KAAK;IAcpB;;;;;;;OAOG;IACH,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,gBAAgB,UAAQ,GAAG,OAAO;IAQtF,OAAO,CAAC,gBAAgB,CAAwC;IAChE,OAAO,CAAC,aAAa,CAAoC;IACzD,OAAO,CAAC,UAAU,CAAgB;IAClC,OAAO,CAAC,UAAU,CAAkC;IACpD,OAAO,CAAC,UAAU,CAAmB;IACrC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,qBAAqB,CAAS;IAEtC,gGAAgG;;IAOhG,OAAO,CAAC,UAAU;IAgBlB,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,mBAAmB;IAe3B,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,YAAY;IAkBpB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,kBAAkB;IAa1B,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,oBAAoB;IAgB5B,OAAO,CAAC,oBAAoB;IAgB5B,OAAO,CAAC,iBAAiB;IA2BzB,OAAO,CAAC,kBAAkB;IAoB1B,oEAAoE;IACpE,IAAW,UAAU,IAAI,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAEjD;IAED,4EAA4E;IAC5E,IAAW,gBAAgB,IAAI,OAAO,CAErC;IAED,mFAAmF;IACnF,IAAW,QAAQ,IAAI,MAAM,EAAE,CAE9B;IAED;;;;;OAKG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAIzC;;;;;OAKG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG;QAClB,6DAA6D;QAC7D,aAAa,EAAE,MAAM,CAAC;QACtB,kEAAkE;QAClE,QAAQ,EAAE,MAAM,CAAC;KACpB,GAAG,SAAS;IAWb;;;;;;;OAOG;IACH,WAAW,CAAC,oBAAoB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;CAsB/E;AAED,OAAO,EAAE,OAAO,EAAE,CAAC"}