@gtkx/codegen 0.21.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 (340) hide show
  1. package/LICENSE +373 -0
  2. package/dist/dsl/context.d.ts +104 -0
  3. package/dist/dsl/context.d.ts.map +1 -0
  4. package/dist/dsl/context.js +140 -0
  5. package/dist/dsl/context.js.map +1 -0
  6. package/dist/dsl/emit.d.ts +28 -0
  7. package/dist/dsl/emit.d.ts.map +1 -0
  8. package/dist/dsl/emit.js +41 -0
  9. package/dist/dsl/emit.js.map +1 -0
  10. package/dist/dsl/identifier.d.ts +28 -0
  11. package/dist/dsl/identifier.d.ts.map +1 -0
  12. package/dist/dsl/identifier.js +45 -0
  13. package/dist/dsl/identifier.js.map +1 -0
  14. package/dist/dsl/imports.d.ts +58 -0
  15. package/dist/dsl/imports.d.ts.map +1 -0
  16. package/dist/dsl/imports.js +107 -0
  17. package/dist/dsl/imports.js.map +1 -0
  18. package/dist/dsl/module.d.ts +53 -0
  19. package/dist/dsl/module.d.ts.map +1 -0
  20. package/dist/dsl/module.js +76 -0
  21. package/dist/dsl/module.js.map +1 -0
  22. package/dist/ffi/pipeline.d.ts +19 -0
  23. package/dist/ffi/pipeline.d.ts.map +1 -0
  24. package/dist/ffi/pipeline.js +107 -0
  25. package/dist/ffi/pipeline.js.map +1 -0
  26. package/dist/fingerprint.d.ts +30 -0
  27. package/dist/fingerprint.d.ts.map +1 -0
  28. package/dist/fingerprint.js +33 -0
  29. package/dist/fingerprint.js.map +1 -0
  30. package/dist/gi-store.d.ts +34 -0
  31. package/dist/gi-store.d.ts.map +1 -0
  32. package/dist/gi-store.js +154 -0
  33. package/dist/gi-store.js.map +1 -0
  34. package/dist/gir/boxed.d.ts +66 -0
  35. package/dist/gir/boxed.d.ts.map +1 -0
  36. package/dist/gir/boxed.js +49 -0
  37. package/dist/gir/boxed.js.map +1 -0
  38. package/dist/gir/callback.d.ts +15 -0
  39. package/dist/gir/callback.d.ts.map +1 -0
  40. package/dist/gir/callback.js +17 -0
  41. package/dist/gir/callback.js.map +1 -0
  42. package/dist/gir/class.d.ts +49 -0
  43. package/dist/gir/class.d.ts.map +1 -0
  44. package/dist/gir/class.js +42 -0
  45. package/dist/gir/class.js.map +1 -0
  46. package/dist/gir/enum.d.ts +39 -0
  47. package/dist/gir/enum.d.ts.map +1 -0
  48. package/dist/gir/enum.js +24 -0
  49. package/dist/gir/enum.js.map +1 -0
  50. package/dist/gir/field.d.ts +27 -0
  51. package/dist/gir/field.d.ts.map +1 -0
  52. package/dist/gir/field.js +19 -0
  53. package/dist/gir/field.js.map +1 -0
  54. package/dist/gir/function.d.ts +47 -0
  55. package/dist/gir/function.d.ts.map +1 -0
  56. package/dist/gir/function.js +28 -0
  57. package/dist/gir/function.js.map +1 -0
  58. package/dist/gir/namespace.d.ts +65 -0
  59. package/dist/gir/namespace.d.ts.map +1 -0
  60. package/dist/gir/namespace.js +60 -0
  61. package/dist/gir/namespace.js.map +1 -0
  62. package/dist/gir/parameter.d.ts +82 -0
  63. package/dist/gir/parameter.d.ts.map +1 -0
  64. package/dist/gir/parameter.js +66 -0
  65. package/dist/gir/parameter.js.map +1 -0
  66. package/dist/gir/parse.d.ts +78 -0
  67. package/dist/gir/parse.d.ts.map +1 -0
  68. package/dist/gir/parse.js +155 -0
  69. package/dist/gir/parse.js.map +1 -0
  70. package/dist/gir/primitives.d.ts +36 -0
  71. package/dist/gir/primitives.d.ts.map +1 -0
  72. package/dist/gir/primitives.js +109 -0
  73. package/dist/gir/primitives.js.map +1 -0
  74. package/dist/gir/property.d.ts +29 -0
  75. package/dist/gir/property.d.ts.map +1 -0
  76. package/dist/gir/property.js +16 -0
  77. package/dist/gir/property.js.map +1 -0
  78. package/dist/gir/qualified-name.d.ts +37 -0
  79. package/dist/gir/qualified-name.d.ts.map +1 -0
  80. package/dist/gir/qualified-name.js +39 -0
  81. package/dist/gir/qualified-name.js.map +1 -0
  82. package/dist/gir/qualify.d.ts +32 -0
  83. package/dist/gir/qualify.d.ts.map +1 -0
  84. package/dist/gir/qualify.js +60 -0
  85. package/dist/gir/qualify.js.map +1 -0
  86. package/dist/gir/repository.d.ts +82 -0
  87. package/dist/gir/repository.d.ts.map +1 -0
  88. package/dist/gir/repository.js +122 -0
  89. package/dist/gir/repository.js.map +1 -0
  90. package/dist/gir/signal.d.ts +22 -0
  91. package/dist/gir/signal.d.ts.map +1 -0
  92. package/dist/gir/signal.js +20 -0
  93. package/dist/gir/signal.js.map +1 -0
  94. package/dist/gir/size.d.ts +67 -0
  95. package/dist/gir/size.d.ts.map +1 -0
  96. package/dist/gir/size.js +87 -0
  97. package/dist/gir/size.js.map +1 -0
  98. package/dist/gir/type-ref.d.ts +79 -0
  99. package/dist/gir/type-ref.d.ts.map +1 -0
  100. package/dist/gir/type-ref.js +101 -0
  101. package/dist/gir/type-ref.js.map +1 -0
  102. package/dist/index.d.ts +12 -0
  103. package/dist/index.d.ts.map +1 -0
  104. package/dist/index.js +12 -0
  105. package/dist/index.js.map +1 -0
  106. package/dist/jsx-store.d.ts +22 -0
  107. package/dist/jsx-store.d.ts.map +1 -0
  108. package/dist/jsx-store.js +40 -0
  109. package/dist/jsx-store.js.map +1 -0
  110. package/dist/react/compounds-meta.d.ts +18 -0
  111. package/dist/react/compounds-meta.d.ts.map +1 -0
  112. package/dist/react/compounds-meta.js +93 -0
  113. package/dist/react/compounds-meta.js.map +1 -0
  114. package/dist/react/compounds.d.ts +27 -0
  115. package/dist/react/compounds.d.ts.map +1 -0
  116. package/dist/react/compounds.js +164 -0
  117. package/dist/react/compounds.js.map +1 -0
  118. package/dist/react/internal.d.ts +14 -0
  119. package/dist/react/internal.d.ts.map +1 -0
  120. package/dist/react/internal.js +79 -0
  121. package/dist/react/internal.js.map +1 -0
  122. package/dist/react/jsx.d.ts +22 -0
  123. package/dist/react/jsx.d.ts.map +1 -0
  124. package/dist/react/jsx.js +134 -0
  125. package/dist/react/jsx.js.map +1 -0
  126. package/dist/react/pipeline.d.ts +13 -0
  127. package/dist/react/pipeline.d.ts.map +1 -0
  128. package/dist/react/pipeline.js +25 -0
  129. package/dist/react/pipeline.js.map +1 -0
  130. package/dist/react/props.d.ts +38 -0
  131. package/dist/react/props.d.ts.map +1 -0
  132. package/dist/react/props.js +231 -0
  133. package/dist/react/props.js.map +1 -0
  134. package/dist/react/slot-props.d.ts +10 -0
  135. package/dist/react/slot-props.d.ts.map +1 -0
  136. package/dist/react/slot-props.js +56 -0
  137. package/dist/react/slot-props.js.map +1 -0
  138. package/dist/react/widgets.d.ts +83 -0
  139. package/dist/react/widgets.d.ts.map +1 -0
  140. package/dist/react/widgets.js +152 -0
  141. package/dist/react/widgets.js.map +1 -0
  142. package/dist/runner.d.ts +55 -0
  143. package/dist/runner.d.ts.map +1 -0
  144. package/dist/runner.js +60 -0
  145. package/dist/runner.js.map +1 -0
  146. package/dist/store-fs.d.ts +109 -0
  147. package/dist/store-fs.d.ts.map +1 -0
  148. package/dist/store-fs.js +98 -0
  149. package/dist/store-fs.js.map +1 -0
  150. package/dist/transpile.d.ts +32 -0
  151. package/dist/transpile.d.ts.map +1 -0
  152. package/dist/transpile.js +63 -0
  153. package/dist/transpile.js.map +1 -0
  154. package/dist/typecheck-store.d.ts +41 -0
  155. package/dist/typecheck-store.d.ts.map +1 -0
  156. package/dist/typecheck-store.js +102 -0
  157. package/dist/typecheck-store.js.map +1 -0
  158. package/dist/writers/alias.d.ts +13 -0
  159. package/dist/writers/alias.d.ts.map +1 -0
  160. package/dist/writers/alias.js +17 -0
  161. package/dist/writers/alias.js.map +1 -0
  162. package/dist/writers/async.d.ts +22 -0
  163. package/dist/writers/async.d.ts.map +1 -0
  164. package/dist/writers/async.js +48 -0
  165. package/dist/writers/async.js.map +1 -0
  166. package/dist/writers/boxed-constructor.d.ts +26 -0
  167. package/dist/writers/boxed-constructor.d.ts.map +1 -0
  168. package/dist/writers/boxed-constructor.js +85 -0
  169. package/dist/writers/boxed-constructor.js.map +1 -0
  170. package/dist/writers/boxed-field-accessor.d.ts +18 -0
  171. package/dist/writers/boxed-field-accessor.d.ts.map +1 -0
  172. package/dist/writers/boxed-field-accessor.js +260 -0
  173. package/dist/writers/boxed-field-accessor.js.map +1 -0
  174. package/dist/writers/boxed-layout.d.ts +27 -0
  175. package/dist/writers/boxed-layout.d.ts.map +1 -0
  176. package/dist/writers/boxed-layout.js +128 -0
  177. package/dist/writers/boxed-layout.js.map +1 -0
  178. package/dist/writers/boxed.d.ts +20 -0
  179. package/dist/writers/boxed.d.ts.map +1 -0
  180. package/dist/writers/boxed.js +71 -0
  181. package/dist/writers/boxed.js.map +1 -0
  182. package/dist/writers/callables.d.ts +124 -0
  183. package/dist/writers/callables.d.ts.map +1 -0
  184. package/dist/writers/callables.js +283 -0
  185. package/dist/writers/callables.js.map +1 -0
  186. package/dist/writers/callback.d.ts +16 -0
  187. package/dist/writers/callback.d.ts.map +1 -0
  188. package/dist/writers/callback.js +38 -0
  189. package/dist/writers/callback.js.map +1 -0
  190. package/dist/writers/class-struct-record.d.ts +31 -0
  191. package/dist/writers/class-struct-record.d.ts.map +1 -0
  192. package/dist/writers/class-struct-record.js +67 -0
  193. package/dist/writers/class-struct-record.js.map +1 -0
  194. package/dist/writers/class-struct.d.ts +22 -0
  195. package/dist/writers/class-struct.d.ts.map +1 -0
  196. package/dist/writers/class-struct.js +85 -0
  197. package/dist/writers/class-struct.js.map +1 -0
  198. package/dist/writers/class.d.ts +16 -0
  199. package/dist/writers/class.d.ts.map +1 -0
  200. package/dist/writers/class.js +307 -0
  201. package/dist/writers/class.js.map +1 -0
  202. package/dist/writers/constant.d.ts +15 -0
  203. package/dist/writers/constant.d.ts.map +1 -0
  204. package/dist/writers/constant.js +23 -0
  205. package/dist/writers/constant.js.map +1 -0
  206. package/dist/writers/constants.d.ts +15 -0
  207. package/dist/writers/constants.d.ts.map +1 -0
  208. package/dist/writers/constants.js +23 -0
  209. package/dist/writers/constants.js.map +1 -0
  210. package/dist/writers/constructor-props.d.ts +32 -0
  211. package/dist/writers/constructor-props.d.ts.map +1 -0
  212. package/dist/writers/constructor-props.js +110 -0
  213. package/dist/writers/constructor-props.js.map +1 -0
  214. package/dist/writers/enum.d.ts +21 -0
  215. package/dist/writers/enum.d.ts.map +1 -0
  216. package/dist/writers/enum.js +48 -0
  217. package/dist/writers/enum.js.map +1 -0
  218. package/dist/writers/function.d.ts +40 -0
  219. package/dist/writers/function.d.ts.map +1 -0
  220. package/dist/writers/function.js +127 -0
  221. package/dist/writers/function.js.map +1 -0
  222. package/dist/writers/gtype-binding.d.ts +19 -0
  223. package/dist/writers/gtype-binding.d.ts.map +1 -0
  224. package/dist/writers/gtype-binding.js +40 -0
  225. package/dist/writers/gtype-binding.js.map +1 -0
  226. package/dist/writers/inheritance.d.ts +48 -0
  227. package/dist/writers/inheritance.d.ts.map +1 -0
  228. package/dist/writers/inheritance.js +90 -0
  229. package/dist/writers/inheritance.js.map +1 -0
  230. package/dist/writers/interface.d.ts +16 -0
  231. package/dist/writers/interface.d.ts.map +1 -0
  232. package/dist/writers/interface.js +155 -0
  233. package/dist/writers/interface.js.map +1 -0
  234. package/dist/writers/method.d.ts +150 -0
  235. package/dist/writers/method.d.ts.map +1 -0
  236. package/dist/writers/method.js +510 -0
  237. package/dist/writers/method.js.map +1 -0
  238. package/dist/writers/param-classify.d.ts +93 -0
  239. package/dist/writers/param-classify.d.ts.map +1 -0
  240. package/dist/writers/param-classify.js +163 -0
  241. package/dist/writers/param-classify.js.map +1 -0
  242. package/dist/writers/property-accessor.d.ts +19 -0
  243. package/dist/writers/property-accessor.d.ts.map +1 -0
  244. package/dist/writers/property-accessor.js +117 -0
  245. package/dist/writers/property-accessor.js.map +1 -0
  246. package/dist/writers/registration.d.ts +27 -0
  247. package/dist/writers/registration.d.ts.map +1 -0
  248. package/dist/writers/registration.js +30 -0
  249. package/dist/writers/registration.js.map +1 -0
  250. package/dist/writers/return-wrap.d.ts +39 -0
  251. package/dist/writers/return-wrap.d.ts.map +1 -0
  252. package/dist/writers/return-wrap.js +152 -0
  253. package/dist/writers/return-wrap.js.map +1 -0
  254. package/dist/writers/runtime-override.d.ts +18 -0
  255. package/dist/writers/runtime-override.d.ts.map +1 -0
  256. package/dist/writers/runtime-override.js +44 -0
  257. package/dist/writers/runtime-override.js.map +1 -0
  258. package/dist/writers/signal.d.ts +21 -0
  259. package/dist/writers/signal.d.ts.map +1 -0
  260. package/dist/writers/signal.js +260 -0
  261. package/dist/writers/signal.js.map +1 -0
  262. package/dist/writers/ts-type.d.ts +50 -0
  263. package/dist/writers/ts-type.d.ts.map +1 -0
  264. package/dist/writers/ts-type.js +75 -0
  265. package/dist/writers/ts-type.js.map +1 -0
  266. package/dist/writers/types-ts.d.ts +27 -0
  267. package/dist/writers/types-ts.d.ts.map +1 -0
  268. package/dist/writers/types-ts.js +97 -0
  269. package/dist/writers/types-ts.js.map +1 -0
  270. package/dist/writers/value.d.ts +89 -0
  271. package/dist/writers/value.d.ts.map +1 -0
  272. package/dist/writers/value.js +402 -0
  273. package/dist/writers/value.js.map +1 -0
  274. package/package.json +55 -0
  275. package/src/dsl/context.ts +146 -0
  276. package/src/dsl/emit.ts +42 -0
  277. package/src/dsl/identifier.ts +52 -0
  278. package/src/dsl/imports.ts +109 -0
  279. package/src/dsl/module.ts +75 -0
  280. package/src/ffi/pipeline.ts +113 -0
  281. package/src/fingerprint.ts +50 -0
  282. package/src/gi-store.ts +199 -0
  283. package/src/gir/boxed.ts +94 -0
  284. package/src/gir/callback.ts +26 -0
  285. package/src/gir/class.ts +79 -0
  286. package/src/gir/enum.ts +55 -0
  287. package/src/gir/field.ts +40 -0
  288. package/src/gir/function.ts +67 -0
  289. package/src/gir/namespace.ts +118 -0
  290. package/src/gir/parameter.ts +120 -0
  291. package/src/gir/parse.ts +171 -0
  292. package/src/gir/primitives.ts +137 -0
  293. package/src/gir/property.ts +39 -0
  294. package/src/gir/qualified-name.ts +55 -0
  295. package/src/gir/qualify.ts +64 -0
  296. package/src/gir/repository.ts +149 -0
  297. package/src/gir/signal.ts +36 -0
  298. package/src/gir/size.ts +129 -0
  299. package/src/gir/type-ref.ts +180 -0
  300. package/src/index.ts +16 -0
  301. package/src/jsx-store.ts +53 -0
  302. package/src/react/compounds-meta.ts +99 -0
  303. package/src/react/compounds.ts +204 -0
  304. package/src/react/internal.ts +91 -0
  305. package/src/react/jsx.ts +155 -0
  306. package/src/react/pipeline.ts +29 -0
  307. package/src/react/props.ts +307 -0
  308. package/src/react/slot-props.ts +57 -0
  309. package/src/react/widgets.ts +185 -0
  310. package/src/runner.ts +89 -0
  311. package/src/store-fs.ts +157 -0
  312. package/src/transpile.ts +80 -0
  313. package/src/typecheck-store.ts +136 -0
  314. package/src/writers/alias.ts +19 -0
  315. package/src/writers/async.ts +44 -0
  316. package/src/writers/boxed-constructor.ts +105 -0
  317. package/src/writers/boxed-field-accessor.ts +306 -0
  318. package/src/writers/boxed-layout.ts +166 -0
  319. package/src/writers/boxed.ts +77 -0
  320. package/src/writers/callables.ts +339 -0
  321. package/src/writers/callback.ts +40 -0
  322. package/src/writers/class-struct-record.ts +75 -0
  323. package/src/writers/class-struct.ts +96 -0
  324. package/src/writers/class.ts +384 -0
  325. package/src/writers/constant.ts +29 -0
  326. package/src/writers/constructor-props.ts +130 -0
  327. package/src/writers/enum.ts +53 -0
  328. package/src/writers/function.ts +136 -0
  329. package/src/writers/gtype-binding.ts +48 -0
  330. package/src/writers/inheritance.ts +104 -0
  331. package/src/writers/interface.ts +168 -0
  332. package/src/writers/method.ts +678 -0
  333. package/src/writers/param-classify.ts +178 -0
  334. package/src/writers/property-accessor.ts +139 -0
  335. package/src/writers/registration.ts +42 -0
  336. package/src/writers/return-wrap.ts +180 -0
  337. package/src/writers/runtime-override.ts +59 -0
  338. package/src/writers/signal.ts +318 -0
  339. package/src/writers/ts-type.ts +115 -0
  340. package/src/writers/value.ts +485 -0
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Tiny string-builder helpers used by the writers to assemble TypeScript
3
+ * source. The DSL deliberately stops short of modelling expressions or
4
+ * statements — writers compose strings directly using these primitives.
5
+ */
6
+ /**
7
+ * Indents each line of `block` by `level` four-space units.
8
+ *
9
+ * Lines that are empty stay empty (no trailing whitespace).
10
+ *
11
+ * @param block - The multi-line source fragment
12
+ * @param level - Number of indentation steps to apply
13
+ */
14
+ export const indent = (block, level) => {
15
+ if (level <= 0)
16
+ return block;
17
+ const prefix = " ".repeat(level);
18
+ return block
19
+ .split("\n")
20
+ .map((line) => (line.length === 0 ? line : `${prefix}${line}`))
21
+ .join("\n");
22
+ };
23
+ /**
24
+ * Joins `parts` with commas, dropping `undefined` entries.
25
+ */
26
+ export const joinArgs = (parts) => parts.filter((part) => part !== undefined).join(", ");
27
+ /**
28
+ * Renders an array literal multi-line, indenting each element four spaces
29
+ * and adding a trailing comma.
30
+ *
31
+ * Empty input renders as `[]`.
32
+ *
33
+ * @param elements - Already-rendered element expressions
34
+ */
35
+ export const arrayLiteral = (elements) => {
36
+ if (elements.length === 0)
37
+ return "[]";
38
+ const lines = elements.map((element) => ` ${element},`);
39
+ return `[\n${lines.join("\n")}\n]`;
40
+ };
41
+ //# sourceMappingURL=emit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit.js","sourceRoot":"","sources":["../../src/dsl/emit.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,KAAa,EAAU,EAAE;IAC3D,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACpC,OAAO,KAAK;SACP,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,IAAI,EAAE,CAAC,CAAC;SAC9D,IAAI,CAAC,IAAI,CAAC,CAAC;AACpB,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAwC,EAAU,EAAE,CACzE,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAE1E;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,QAA2B,EAAU,EAAE;IAChE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACvC,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,OAAO,GAAG,CAAC,CAAC;IAC3D,OAAO,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;AACvC,CAAC,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Derives the public camelCase export name for a namespace-level callable.
3
+ *
4
+ * The GIR `name` attribute is camelCased (`quark_from_string` →
5
+ * `quarkFromString`); for a shadowing function it is the shadowed short name,
6
+ * so `g_idle_add_full` (which shadows `idle_add`) exports as `idleAdd`. When the
7
+ * `name` is empty the C identifier is used instead, with the namespace's
8
+ * `c:symbol-prefixes` value stripped (e.g. `g_` from `g_quark_from_string`).
9
+ * The result is escaped so it never collides with a reserved word.
10
+ *
11
+ * @param cIdentifier - The C symbol identifier from GIR
12
+ * @param girName - The GIR `name` attribute (shadow-resolved)
13
+ * @param symbolPrefixes - The namespace's `c:symbol-prefixes` values
14
+ */
15
+ export declare const namespaceFunctionExportName: (cIdentifier: string, girName: string, symbolPrefixes: readonly string[]) => string;
16
+ /**
17
+ * Derives the exported identifier for a GIR `<alias>`.
18
+ *
19
+ * Aliases are surfaced under their GIR `name` (e.g. `Quark`, `Pid`,
20
+ * `Allocation`), matching the `@girs` convention. GObject's `Type` alias is the
21
+ * one exception: it is published as `GType` so it lines up with the GObject
22
+ * runtime's `GType` type and the references that resolve through it.
23
+ *
24
+ * @param namespaceName - The namespace the alias is declared in
25
+ * @param aliasName - The alias's GIR `name`
26
+ */
27
+ export declare const aliasExportName: (namespaceName: string, aliasName: string) => string;
28
+ //# sourceMappingURL=identifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identifier.d.ts","sourceRoot":"","sources":["../../src/dsl/identifier.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,2BAA2B,GACpC,aAAa,MAAM,EACnB,SAAS,MAAM,EACf,gBAAgB,SAAS,MAAM,EAAE,KAClC,MAMF,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,eAAe,GAAI,eAAe,MAAM,EAAE,WAAW,MAAM,KAAG,MACE,CAAC"}
@@ -0,0 +1,45 @@
1
+ import { toCamelCase, toIdentifier } from "@gtkx/utils";
2
+ /**
3
+ * Derives the public camelCase export name for a namespace-level callable.
4
+ *
5
+ * The GIR `name` attribute is camelCased (`quark_from_string` →
6
+ * `quarkFromString`); for a shadowing function it is the shadowed short name,
7
+ * so `g_idle_add_full` (which shadows `idle_add`) exports as `idleAdd`. When the
8
+ * `name` is empty the C identifier is used instead, with the namespace's
9
+ * `c:symbol-prefixes` value stripped (e.g. `g_` from `g_quark_from_string`).
10
+ * The result is escaped so it never collides with a reserved word.
11
+ *
12
+ * @param cIdentifier - The C symbol identifier from GIR
13
+ * @param girName - The GIR `name` attribute (shadow-resolved)
14
+ * @param symbolPrefixes - The namespace's `c:symbol-prefixes` values
15
+ */
16
+ export const namespaceFunctionExportName = (cIdentifier, girName, symbolPrefixes) => {
17
+ if (girName.length > 0) {
18
+ return toIdentifier(toCamelCase(girName));
19
+ }
20
+ const stripped = stripLongestPrefix(cIdentifier, symbolPrefixes);
21
+ return toIdentifier(toCamelCase(stripped));
22
+ };
23
+ /**
24
+ * Derives the exported identifier for a GIR `<alias>`.
25
+ *
26
+ * Aliases are surfaced under their GIR `name` (e.g. `Quark`, `Pid`,
27
+ * `Allocation`), matching the `@girs` convention. GObject's `Type` alias is the
28
+ * one exception: it is published as `GType` so it lines up with the GObject
29
+ * runtime's `GType` type and the references that resolve through it.
30
+ *
31
+ * @param namespaceName - The namespace the alias is declared in
32
+ * @param aliasName - The alias's GIR `name`
33
+ */
34
+ export const aliasExportName = (namespaceName, aliasName) => namespaceName === "GObject" && aliasName === "Type" ? "GType" : aliasName;
35
+ const stripLongestPrefix = (input, prefixes) => {
36
+ let best = "";
37
+ for (const prefix of prefixes) {
38
+ const candidate = `${prefix}_`;
39
+ if (input.startsWith(candidate) && candidate.length > best.length) {
40
+ best = candidate;
41
+ }
42
+ }
43
+ return best.length === 0 ? input : input.slice(best.length);
44
+ };
45
+ //# sourceMappingURL=identifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identifier.js","sourceRoot":"","sources":["../../src/dsl/identifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAExD;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CACvC,WAAmB,EACnB,OAAe,EACf,cAAiC,EAC3B,EAAE;IACR,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9C,CAAC;IACD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IACjE,OAAO,YAAY,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC/C,CAAC,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,aAAqB,EAAE,SAAiB,EAAU,EAAE,CAChF,aAAa,KAAK,SAAS,IAAI,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AAE9E,MAAM,kBAAkB,GAAG,CAAC,KAAa,EAAE,QAA2B,EAAU,EAAE;IAC9E,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,GAAG,MAAM,GAAG,CAAC;QAC/B,IAAI,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAChE,IAAI,GAAG,SAAS,CAAC;QACrB,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAChE,CAAC,CAAC"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Tracks imports for a single generated module.
3
+ *
4
+ * The DSL is intentionally tiny: it covers what is awkward to do with
5
+ * string concatenation (deduplicating named imports, sorting them, mixing
6
+ * side-effect and named imports from the same specifier) and leaves
7
+ * everything else to raw TS strings the writers compose themselves.
8
+ */
9
+ export declare class ImportsBuilder {
10
+ private readonly named;
11
+ private readonly defaultNames;
12
+ private readonly namespaces;
13
+ private readonly sideEffects;
14
+ /**
15
+ * Records a named import: `import { foo, bar } from "lib"`.
16
+ *
17
+ * Repeated calls deduplicate; the final emit alphabetises within the
18
+ * braces. A name is emitted with the inline `type` modifier only when
19
+ * every recording of it is type-only — a single value import of the same
20
+ * name keeps it a value import.
21
+ *
22
+ * @param specifier - The module specifier (e.g. `"@gtkx/ffi"`)
23
+ * @param name - The identifier to import
24
+ * @param isType - Whether this recording is type-only (`import { type X }`)
25
+ */
26
+ addNamed(specifier: string, name: string, isType?: boolean): void;
27
+ /**
28
+ * Records a namespace import: `import * as Alias from "lib"`.
29
+ *
30
+ * The first call wins if a different alias is reused for the same
31
+ * specifier.
32
+ *
33
+ * @param specifier - The module specifier
34
+ * @param alias - The local alias bound by the import
35
+ */
36
+ addNamespace(specifier: string, alias: string): void;
37
+ /**
38
+ * Records a default import: `import Alias from "lib"`. Subsequent calls
39
+ * with a different alias are ignored.
40
+ *
41
+ * @param specifier - The module specifier
42
+ * @param alias - The local name bound to the default export
43
+ */
44
+ addDefault(specifier: string, alias: string): void;
45
+ /**
46
+ * Records a side-effect-only import: `import "lib"`.
47
+ *
48
+ * @param specifier - The module specifier
49
+ */
50
+ addSideEffect(specifier: string): void;
51
+ /**
52
+ * Renders all imports as a single string ending with a trailing
53
+ * newline. Side-effect imports come first (in insertion order),
54
+ * followed by named/namespace/default imports sorted by specifier.
55
+ */
56
+ toSource(): string;
57
+ }
58
+ //# sourceMappingURL=imports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imports.d.ts","sourceRoot":"","sources":["../../src/dsl/imports.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,qBAAa,cAAc;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA2C;IACjE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA6B;IAC1D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA6B;IACxD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IAEjD;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,UAAQ,GAAG,IAAI;IAS/D;;;;;;;;OAQG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAMpD;;;;;;OAMG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAMlD;;;;OAIG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAItC;;;;OAIG;IACH,QAAQ,IAAI,MAAM;CA6BrB"}
@@ -0,0 +1,107 @@
1
+ import { quote } from "@gtkx/utils";
2
+ /**
3
+ * Tracks imports for a single generated module.
4
+ *
5
+ * The DSL is intentionally tiny: it covers what is awkward to do with
6
+ * string concatenation (deduplicating named imports, sorting them, mixing
7
+ * side-effect and named imports from the same specifier) and leaves
8
+ * everything else to raw TS strings the writers compose themselves.
9
+ */
10
+ export class ImportsBuilder {
11
+ named = new Map();
12
+ defaultNames = new Map();
13
+ namespaces = new Map();
14
+ sideEffects = new Set();
15
+ /**
16
+ * Records a named import: `import { foo, bar } from "lib"`.
17
+ *
18
+ * Repeated calls deduplicate; the final emit alphabetises within the
19
+ * braces. A name is emitted with the inline `type` modifier only when
20
+ * every recording of it is type-only — a single value import of the same
21
+ * name keeps it a value import.
22
+ *
23
+ * @param specifier - The module specifier (e.g. `"@gtkx/ffi"`)
24
+ * @param name - The identifier to import
25
+ * @param isType - Whether this recording is type-only (`import { type X }`)
26
+ */
27
+ addNamed(specifier, name, isType = false) {
28
+ let bucket = this.named.get(specifier);
29
+ if (bucket === undefined) {
30
+ bucket = new Map();
31
+ this.named.set(specifier, bucket);
32
+ }
33
+ bucket.set(name, (bucket.get(name) ?? true) && isType);
34
+ }
35
+ /**
36
+ * Records a namespace import: `import * as Alias from "lib"`.
37
+ *
38
+ * The first call wins if a different alias is reused for the same
39
+ * specifier.
40
+ *
41
+ * @param specifier - The module specifier
42
+ * @param alias - The local alias bound by the import
43
+ */
44
+ addNamespace(specifier, alias) {
45
+ if (!this.namespaces.has(specifier)) {
46
+ this.namespaces.set(specifier, alias);
47
+ }
48
+ }
49
+ /**
50
+ * Records a default import: `import Alias from "lib"`. Subsequent calls
51
+ * with a different alias are ignored.
52
+ *
53
+ * @param specifier - The module specifier
54
+ * @param alias - The local name bound to the default export
55
+ */
56
+ addDefault(specifier, alias) {
57
+ if (!this.defaultNames.has(specifier)) {
58
+ this.defaultNames.set(specifier, alias);
59
+ }
60
+ }
61
+ /**
62
+ * Records a side-effect-only import: `import "lib"`.
63
+ *
64
+ * @param specifier - The module specifier
65
+ */
66
+ addSideEffect(specifier) {
67
+ this.sideEffects.add(specifier);
68
+ }
69
+ /**
70
+ * Renders all imports as a single string ending with a trailing
71
+ * newline. Side-effect imports come first (in insertion order),
72
+ * followed by named/namespace/default imports sorted by specifier.
73
+ */
74
+ toSource() {
75
+ const lines = [];
76
+ for (const specifier of this.sideEffects) {
77
+ lines.push(`import ${quote(specifier)};`);
78
+ }
79
+ const specifiers = new Set([
80
+ ...this.named.keys(),
81
+ ...this.namespaces.keys(),
82
+ ...this.defaultNames.keys(),
83
+ ]);
84
+ const sortedSpecifiers = [...specifiers].sort((a, b) => a.localeCompare(b));
85
+ for (const specifier of sortedSpecifiers) {
86
+ const defaultAlias = this.defaultNames.get(specifier);
87
+ const namespaceAlias = this.namespaces.get(specifier);
88
+ const namedNames = this.named.get(specifier);
89
+ const parts = [];
90
+ if (defaultAlias !== undefined)
91
+ parts.push(defaultAlias);
92
+ if (namespaceAlias !== undefined)
93
+ parts.push(`* as ${namespaceAlias}`);
94
+ if (namedNames !== undefined && namedNames.size > 0) {
95
+ const sortedNames = [...namedNames.entries()]
96
+ .sort(([a], [b]) => a.localeCompare(b))
97
+ .map(([name, isType]) => (isType ? `type ${name}` : name));
98
+ parts.push(`{ ${sortedNames.join(", ")} }`);
99
+ }
100
+ if (parts.length === 0)
101
+ continue;
102
+ lines.push(`import ${parts.join(", ")} from ${quote(specifier)};`);
103
+ }
104
+ return lines.length === 0 ? "" : `${lines.join("\n")}\n`;
105
+ }
106
+ }
107
+ //# sourceMappingURL=imports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imports.js","sourceRoot":"","sources":["../../src/dsl/imports.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC;;;;;;;GAOG;AACH,MAAM,OAAO,cAAc;IACN,KAAK,GAAG,IAAI,GAAG,EAAgC,CAAC;IAChD,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;IACvC,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IAEjD;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,SAAiB,EAAE,IAAY,EAAE,MAAM,GAAG,KAAK;QACpD,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;YACnB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACtC,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC;IAC3D,CAAC;IAED;;;;;;;;OAQG;IACH,YAAY,CAAC,SAAiB,EAAE,KAAa;QACzC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC1C,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACH,UAAU,CAAC,SAAiB,EAAE,KAAa;QACvC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC5C,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,aAAa,CAAC,SAAiB;QAC3B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC;IAED;;;;OAIG;IACH,QAAQ;QACJ,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC9C,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAS;YAC/B,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;YACpB,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;YACzB,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;SAC9B,CAAC,CAAC;QACH,MAAM,gBAAgB,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5E,KAAK,MAAM,SAAS,IAAI,gBAAgB,EAAE,CAAC;YACvC,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACtD,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACtD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,IAAI,YAAY,KAAK,SAAS;gBAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACzD,IAAI,cAAc,KAAK,SAAS;gBAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,cAAc,EAAE,CAAC,CAAC;YACvE,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBAClD,MAAM,WAAW,GAAG,CAAC,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC;qBACxC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;qBACtC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC/D,KAAK,CAAC,IAAI,CAAC,KAAK,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChD,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YACjC,KAAK,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACvE,CAAC;QACD,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IAC7D,CAAC;CACJ"}
@@ -0,0 +1,53 @@
1
+ import { ImportsBuilder } from "./imports.js";
2
+ /**
3
+ * Accumulator for one generated TypeScript module's source.
4
+ *
5
+ * Writers append code in three logical phases:
6
+ *
7
+ * 1. *Bindings* — the `const fn_name = t.fn(...)` block at the top.
8
+ * 2. *Declarations* — the class bodies, free function exports, enums,
9
+ * constants.
10
+ * 3. *Registrations* — the trailing `registerNativeClass(...)` block.
11
+ *
12
+ * Keeping the three buckets independent removes ordering constraints
13
+ * between writers and lets {@link emit} stitch a final source string with
14
+ * the same shape every generated file uses today.
15
+ */
16
+ export declare class ModuleBuilder {
17
+ /** Imports manifest the writers feed into. */
18
+ readonly imports: ImportsBuilder;
19
+ private readonly bindings;
20
+ private readonly bindingNames;
21
+ private readonly declarations;
22
+ private readonly registrations;
23
+ /**
24
+ * Appends a top-level FFI binding (`const foo = t.fn(...)`).
25
+ *
26
+ * Duplicates are dropped when a `name` is supplied that matches a
27
+ * previously appended binding; this is the common case for GIR
28
+ * callables that appear both as a namespace function and as a
29
+ * constructor or static on a class.
30
+ *
31
+ * @param code - The source fragment, without a trailing newline
32
+ * @param name - Optional binding identifier used for deduplication
33
+ */
34
+ appendBinding(code: string, name?: string): void;
35
+ /**
36
+ * Appends a declaration (class, function, enum, constant).
37
+ *
38
+ * @param code - The source fragment, without a trailing newline
39
+ */
40
+ appendDeclaration(code: string): void;
41
+ /**
42
+ * Appends a trailing registration statement (`registerNativeClass(…)`).
43
+ *
44
+ * @param code - The source fragment, without a trailing newline
45
+ */
46
+ appendRegistration(code: string): void;
47
+ /**
48
+ * Renders the full TypeScript source: imports, bindings, declarations,
49
+ * registrations — separated by a single blank line.
50
+ */
51
+ toSource(): string;
52
+ }
53
+ //# sourceMappingURL=module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../src/dsl/module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C;;;;;;;;;;;;;GAaG;AACH,qBAAa,aAAa;IACtB,8CAA8C;IAC9C,SAAgB,OAAO,iBAAwB;IAC/C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IACzC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgB;IAC7C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAE9C;;;;;;;;;;OAUG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAQhD;;;;OAIG;IACH,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIrC;;;;OAIG;IACH,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAItC;;;OAGG;IACH,QAAQ,IAAI,MAAM;CASrB"}
@@ -0,0 +1,76 @@
1
+ import { ImportsBuilder } from "./imports.js";
2
+ /**
3
+ * Accumulator for one generated TypeScript module's source.
4
+ *
5
+ * Writers append code in three logical phases:
6
+ *
7
+ * 1. *Bindings* — the `const fn_name = t.fn(...)` block at the top.
8
+ * 2. *Declarations* — the class bodies, free function exports, enums,
9
+ * constants.
10
+ * 3. *Registrations* — the trailing `registerNativeClass(...)` block.
11
+ *
12
+ * Keeping the three buckets independent removes ordering constraints
13
+ * between writers and lets {@link emit} stitch a final source string with
14
+ * the same shape every generated file uses today.
15
+ */
16
+ export class ModuleBuilder {
17
+ /** Imports manifest the writers feed into. */
18
+ imports = new ImportsBuilder();
19
+ bindings = [];
20
+ bindingNames = new Set();
21
+ declarations = [];
22
+ registrations = [];
23
+ /**
24
+ * Appends a top-level FFI binding (`const foo = t.fn(...)`).
25
+ *
26
+ * Duplicates are dropped when a `name` is supplied that matches a
27
+ * previously appended binding; this is the common case for GIR
28
+ * callables that appear both as a namespace function and as a
29
+ * constructor or static on a class.
30
+ *
31
+ * @param code - The source fragment, without a trailing newline
32
+ * @param name - Optional binding identifier used for deduplication
33
+ */
34
+ appendBinding(code, name) {
35
+ if (name !== undefined) {
36
+ if (this.bindingNames.has(name))
37
+ return;
38
+ this.bindingNames.add(name);
39
+ }
40
+ this.bindings.push(code);
41
+ }
42
+ /**
43
+ * Appends a declaration (class, function, enum, constant).
44
+ *
45
+ * @param code - The source fragment, without a trailing newline
46
+ */
47
+ appendDeclaration(code) {
48
+ this.declarations.push(code);
49
+ }
50
+ /**
51
+ * Appends a trailing registration statement (`registerNativeClass(…)`).
52
+ *
53
+ * @param code - The source fragment, without a trailing newline
54
+ */
55
+ appendRegistration(code) {
56
+ this.registrations.push(code);
57
+ }
58
+ /**
59
+ * Renders the full TypeScript source: imports, bindings, declarations,
60
+ * registrations — separated by a single blank line.
61
+ */
62
+ toSource() {
63
+ const sections = [];
64
+ const importsBlock = this.imports.toSource();
65
+ if (importsBlock.length > 0)
66
+ sections.push(importsBlock.trimEnd());
67
+ if (this.bindings.length > 0)
68
+ sections.push(this.bindings.join("\n\n"));
69
+ if (this.declarations.length > 0)
70
+ sections.push(this.declarations.join("\n\n"));
71
+ if (this.registrations.length > 0)
72
+ sections.push(this.registrations.join("\n\n"));
73
+ return `${sections.join("\n\n")}\n`;
74
+ }
75
+ }
76
+ //# sourceMappingURL=module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module.js","sourceRoot":"","sources":["../../src/dsl/module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,aAAa;IACtB,8CAA8C;IAC9B,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC;IAC9B,QAAQ,GAAa,EAAE,CAAC;IACxB,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,YAAY,GAAa,EAAE,CAAC;IAC5B,aAAa,GAAa,EAAE,CAAC;IAE9C;;;;;;;;;;OAUG;IACH,aAAa,CAAC,IAAY,EAAE,IAAa;QACrC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACrB,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,OAAO;YACxC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED;;;;OAIG;IACH,iBAAiB,CAAC,IAAY;QAC1B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED;;;;OAIG;IACH,kBAAkB,CAAC,IAAY;QAC3B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED;;;OAGG;IACH,QAAQ;QACJ,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC7C,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC;QACnE,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACxE,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAChF,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAClF,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IACxC,CAAC;CACJ"}
@@ -0,0 +1,19 @@
1
+ import type { GirNamespace } from "../gir/namespace.js";
2
+ import type { GirRepository } from "../gir/repository.js";
3
+ /**
4
+ * Generates the TypeScript source for one FFI namespace module.
5
+ *
6
+ * Walks the namespace's declared enums, boxeds, classes, interfaces,
7
+ * callbacks, functions, constants, and aliases, dispatching to the
8
+ * per-construct writers in `writers/`: bindings first, declarations second,
9
+ * registrations trailing.
10
+ *
11
+ * @param namespace - The namespace to emit
12
+ * @param repository - The full repository (for cross-namespace lookups)
13
+ * @returns The relative output path and the TypeScript source string
14
+ */
15
+ export declare const generateNamespaceModule: (namespace: GirNamespace, repository: GirRepository) => {
16
+ readonly path: string;
17
+ readonly source: string;
18
+ };
19
+ //# sourceMappingURL=pipeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/ffi/pipeline.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAU1D;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,uBAAuB,GAChC,WAAW,YAAY,EACvB,YAAY,aAAa,KAC1B;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAmClD,CAAC"}
@@ -0,0 +1,107 @@
1
+ import { ModuleContext } from "../dsl/context.js";
2
+ import { emitAlias } from "../writers/alias.js";
3
+ import { emitBoxed } from "../writers/boxed.js";
4
+ import { emitCallback } from "../writers/callback.js";
5
+ import { emitClass } from "../writers/class.js";
6
+ import { emitConstant } from "../writers/constant.js";
7
+ import { emitEnum } from "../writers/enum.js";
8
+ import { emitNamespaceBootstrap, emitNamespaceFunction } from "../writers/function.js";
9
+ import { emitInterface } from "../writers/interface.js";
10
+ /**
11
+ * Generates the TypeScript source for one FFI namespace module.
12
+ *
13
+ * Walks the namespace's declared enums, boxeds, classes, interfaces,
14
+ * callbacks, functions, constants, and aliases, dispatching to the
15
+ * per-construct writers in `writers/`: bindings first, declarations second,
16
+ * registrations trailing.
17
+ *
18
+ * @param namespace - The namespace to emit
19
+ * @param repository - The full repository (for cross-namespace lookups)
20
+ * @returns The relative output path and the TypeScript source string
21
+ */
22
+ export const generateNamespaceModule = (namespace, repository) => {
23
+ const context = new ModuleContext(namespace, repository);
24
+ context.addGObjectBootstrapImports();
25
+ for (const enumeration of namespace.enums) {
26
+ emitEnum(context, enumeration);
27
+ }
28
+ for (const boxed of namespace.boxeds) {
29
+ emitBoxed(context, boxed);
30
+ }
31
+ for (const klass of topologicalClassOrder(namespace.classes, namespace.name)) {
32
+ emitClass(context, klass);
33
+ }
34
+ for (const iface of namespace.interfaces) {
35
+ emitInterface(context, iface);
36
+ }
37
+ for (const callback of namespace.callbacks) {
38
+ emitCallback(context, callback);
39
+ }
40
+ for (const fn of namespace.functions) {
41
+ emitNamespaceFunction(context, fn);
42
+ }
43
+ emitNamespaceBootstrap(context, namespace);
44
+ for (const constant of namespace.constants) {
45
+ emitConstant(context, constant);
46
+ }
47
+ for (const alias of namespace.aliases) {
48
+ emitAlias(context, alias);
49
+ }
50
+ const directory = namespace.name.toLowerCase();
51
+ return {
52
+ path: `${directory}/${directory}.ts`,
53
+ source: context.module.toSource(),
54
+ };
55
+ };
56
+ /**
57
+ * Returns the namespace's classes ordered so each class is preceded by every
58
+ * same-namespace ancestor it extends.
59
+ *
60
+ * Generated JS classes use `extends`, which is a runtime reference: a child
61
+ * class declaration that names its parent before the parent's class body runs
62
+ * hits a temporal dead-zone error. GIR file order is source order, which does
63
+ * not match the inheritance order for namespaces where a leaf type (e.g.
64
+ * `GObject.Binding`) is declared earlier in the file than its base (e.g.
65
+ * `GObject.Object`). The codegen sorts by inheritance instead.
66
+ *
67
+ * Cross-namespace parents are imported by the writer and do not participate in
68
+ * the sort.
69
+ *
70
+ * @param classes - The classes to order
71
+ * @param namespaceName - The namespace these classes live in
72
+ */
73
+ const topologicalClassOrder = (classes, namespaceName) => {
74
+ const byLocalName = new Map();
75
+ for (const klass of classes)
76
+ byLocalName.set(klass.name, klass);
77
+ const result = [];
78
+ const placed = new Set();
79
+ const visiting = new Set();
80
+ const visit = (klass) => {
81
+ if (placed.has(klass))
82
+ return;
83
+ if (visiting.has(klass))
84
+ return;
85
+ visiting.add(klass);
86
+ const parent = sameNamespaceParent(klass, namespaceName, byLocalName);
87
+ if (parent !== undefined)
88
+ visit(parent);
89
+ visiting.delete(klass);
90
+ placed.add(klass);
91
+ result.push(klass);
92
+ };
93
+ for (const klass of classes)
94
+ visit(klass);
95
+ return result;
96
+ };
97
+ const sameNamespaceParent = (klass, namespaceName, byLocalName) => {
98
+ if (klass.parent === undefined)
99
+ return undefined;
100
+ const dot = klass.parent.indexOf(".");
101
+ if (dot === -1)
102
+ return byLocalName.get(klass.parent);
103
+ if (klass.parent.slice(0, dot) !== namespaceName)
104
+ return undefined;
105
+ return byLocalName.get(klass.parent.slice(dot + 1));
106
+ };
107
+ //# sourceMappingURL=pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/ffi/pipeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /** Filename of the staleness sentinel written into the `@gtkx/gi` store root. */
2
+ export declare const FINGERPRINT_FILENAME = ".codegen-fingerprint.json";
3
+ /**
4
+ * The `@gtkx/codegen` package version, mixed into the store fingerprint so a
5
+ * codegen upgrade invalidates a previously-generated store.
6
+ */
7
+ export declare const CODEGEN_VERSION: string;
8
+ /**
9
+ * The staleness sentinel written into the generated `@gtkx/gi` store: the
10
+ * fingerprint value plus the inputs that produced it, so a consumer can
11
+ * recompute and compare without reloading the GIR repository.
12
+ */
13
+ export type CodegenFingerprint = {
14
+ /** The fingerprint hash of {@link CODEGEN_VERSION}, libraries, and GIR contents. */
15
+ readonly value: string;
16
+ /** Absolute paths of every loaded `.gir` file, in load order. */
17
+ readonly girFiles: readonly string[];
18
+ /** The resolved `Name-Version` library identifiers the store was built for. */
19
+ readonly libraries: readonly string[];
20
+ };
21
+ /**
22
+ * Computes a content fingerprint over the codegen version, the resolved library
23
+ * set, and the contents of every loaded GIR file. A change to any of these
24
+ * means the generated bindings are stale and must be regenerated.
25
+ *
26
+ * @param girFiles - Absolute paths of the loaded `.gir` files
27
+ * @param libraries - The resolved `Name-Version` library identifiers
28
+ */
29
+ export declare const computeFingerprint: (girFiles: readonly string[], libraries: readonly string[]) => string;
30
+ //# sourceMappingURL=fingerprint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprint.d.ts","sourceRoot":"","sources":["../src/fingerprint.ts"],"names":[],"mappings":"AAMA,iFAAiF;AACjF,eAAO,MAAM,oBAAoB,8BAA8B,CAAC;AAEhE;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,MAAoE,CAAC;AAEnG;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC7B,oFAAoF;IACpF,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,iEAAiE;IACjE,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,+EAA+E;IAC/E,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;CACzC,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,GAAI,UAAU,SAAS,MAAM,EAAE,EAAE,WAAW,SAAS,MAAM,EAAE,KAAG,MAY9F,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { createHash } from "node:crypto";
2
+ import { readFileSync } from "node:fs";
3
+ import { createRequire } from "node:module";
4
+ const require = createRequire(import.meta.url);
5
+ /** Filename of the staleness sentinel written into the `@gtkx/gi` store root. */
6
+ export const FINGERPRINT_FILENAME = ".codegen-fingerprint.json";
7
+ /**
8
+ * The `@gtkx/codegen` package version, mixed into the store fingerprint so a
9
+ * codegen upgrade invalidates a previously-generated store.
10
+ */
11
+ export const CODEGEN_VERSION = require("../package.json").version;
12
+ /**
13
+ * Computes a content fingerprint over the codegen version, the resolved library
14
+ * set, and the contents of every loaded GIR file. A change to any of these
15
+ * means the generated bindings are stale and must be regenerated.
16
+ *
17
+ * @param girFiles - Absolute paths of the loaded `.gir` files
18
+ * @param libraries - The resolved `Name-Version` library identifiers
19
+ */
20
+ export const computeFingerprint = (girFiles, libraries) => {
21
+ const hash = createHash("sha256");
22
+ hash.update(CODEGEN_VERSION);
23
+ hash.update("\n");
24
+ hash.update([...libraries].sort((a, b) => a.localeCompare(b)).join(","));
25
+ for (const file of [...girFiles].sort((a, b) => a.localeCompare(b))) {
26
+ hash.update("\n");
27
+ hash.update(file);
28
+ hash.update("\0");
29
+ hash.update(readFileSync(file));
30
+ }
31
+ return hash.digest("hex");
32
+ };
33
+ //# sourceMappingURL=fingerprint.js.map