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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (521) hide show
  1. package/dist/analysis/descriptor-render.d.ts +18 -11
  2. package/dist/analysis/descriptor-render.d.ts.map +1 -1
  3. package/dist/analysis/descriptor-render.js +275 -152
  4. package/dist/analysis/descriptor-render.js.map +1 -1
  5. package/dist/analysis/descriptor.d.ts +37 -34
  6. package/dist/analysis/descriptor.d.ts.map +1 -1
  7. package/dist/analysis/descriptor.js +34 -30
  8. package/dist/analysis/descriptor.js.map +1 -1
  9. package/dist/analysis/inheritance.d.ts +16 -16
  10. package/dist/analysis/inheritance.d.ts.map +1 -1
  11. package/dist/analysis/inheritance.js +139 -84
  12. package/dist/analysis/inheritance.js.map +1 -1
  13. package/dist/analysis/param-structure.d.ts +14 -13
  14. package/dist/analysis/param-structure.d.ts.map +1 -1
  15. package/dist/analysis/param-structure.js +104 -53
  16. package/dist/analysis/param-structure.js.map +1 -1
  17. package/dist/analysis/ts-type.d.ts +6 -5
  18. package/dist/analysis/ts-type.d.ts.map +1 -1
  19. package/dist/analysis/ts-type.js +69 -23
  20. package/dist/analysis/ts-type.js.map +1 -1
  21. package/dist/compile.d.ts +5 -5
  22. package/dist/compile.d.ts.map +1 -1
  23. package/dist/compile.js +70 -63
  24. package/dist/compile.js.map +1 -1
  25. package/dist/docs/api-reference.d.ts +12 -11
  26. package/dist/docs/api-reference.d.ts.map +1 -1
  27. package/dist/docs/api-reference.js +194 -121
  28. package/dist/docs/api-reference.js.map +1 -1
  29. package/dist/docs/element-page.d.ts +6 -9
  30. package/dist/docs/element-page.d.ts.map +1 -1
  31. package/dist/docs/element-page.js +68 -133
  32. package/dist/docs/element-page.js.map +1 -1
  33. package/dist/docs/pipeline.d.ts +8 -7
  34. package/dist/docs/pipeline.d.ts.map +1 -1
  35. package/dist/docs/pipeline.js +79 -53
  36. package/dist/docs/pipeline.js.map +1 -1
  37. package/dist/docs/render.d.ts +21 -19
  38. package/dist/docs/render.d.ts.map +1 -1
  39. package/dist/docs/render.js +80 -71
  40. package/dist/docs/render.js.map +1 -1
  41. package/dist/docs/symbol-page.d.ts +6 -6
  42. package/dist/docs/symbol-page.d.ts.map +1 -1
  43. package/dist/docs/symbol-page.js +126 -84
  44. package/dist/docs/symbol-page.js.map +1 -1
  45. package/dist/fingerprint.d.ts +28 -5
  46. package/dist/fingerprint.d.ts.map +1 -1
  47. package/dist/fingerprint.js +66 -13
  48. package/dist/fingerprint.js.map +1 -1
  49. package/dist/gi.d.ts +13 -0
  50. package/dist/gi.d.ts.map +1 -0
  51. package/dist/gi.js +21 -0
  52. package/dist/gi.js.map +1 -0
  53. package/dist/gir/ancestry.d.ts +4 -3
  54. package/dist/gir/ancestry.d.ts.map +1 -1
  55. package/dist/gir/ancestry.js +12 -15
  56. package/dist/gir/ancestry.js.map +1 -1
  57. package/dist/gir/callback.d.ts +6 -11
  58. package/dist/gir/callback.d.ts.map +1 -1
  59. package/dist/gir/callback.js +6 -7
  60. package/dist/gir/callback.js.map +1 -1
  61. package/dist/gir/class.d.ts +7 -5
  62. package/dist/gir/class.d.ts.map +1 -1
  63. package/dist/gir/class.js +14 -12
  64. package/dist/gir/class.js.map +1 -1
  65. package/dist/gir/enum.d.ts +3 -3
  66. package/dist/gir/enum.d.ts.map +1 -1
  67. package/dist/gir/enum.js +7 -6
  68. package/dist/gir/enum.js.map +1 -1
  69. package/dist/gir/field.d.ts +8 -3
  70. package/dist/gir/field.d.ts.map +1 -1
  71. package/dist/gir/field.js +30 -7
  72. package/dist/gir/field.js.map +1 -1
  73. package/dist/gir/function.d.ts +6 -3
  74. package/dist/gir/function.d.ts.map +1 -1
  75. package/dist/gir/function.js +23 -7
  76. package/dist/gir/function.js.map +1 -1
  77. package/dist/gir/gir-path.d.ts +2 -1
  78. package/dist/gir/gir-path.d.ts.map +1 -1
  79. package/dist/gir/gir-path.js +26 -10
  80. package/dist/gir/gir-path.js.map +1 -1
  81. package/dist/gir/libraries.d.ts +3 -2
  82. package/dist/gir/libraries.d.ts.map +1 -1
  83. package/dist/gir/libraries.js +39 -27
  84. package/dist/gir/libraries.js.map +1 -1
  85. package/dist/gir/library.d.ts +17 -11
  86. package/dist/gir/library.d.ts.map +1 -1
  87. package/dist/gir/library.js +116 -92
  88. package/dist/gir/library.js.map +1 -1
  89. package/dist/gir/namespace.d.ts +10 -10
  90. package/dist/gir/namespace.d.ts.map +1 -1
  91. package/dist/gir/namespace.js +21 -20
  92. package/dist/gir/namespace.js.map +1 -1
  93. package/dist/gir/nullable-overrides.d.ts +3 -0
  94. package/dist/gir/nullable-overrides.d.ts.map +1 -0
  95. package/dist/gir/nullable-overrides.js +5 -0
  96. package/dist/gir/nullable-overrides.js.map +1 -0
  97. package/dist/gir/parameter.d.ts +14 -12
  98. package/dist/gir/parameter.d.ts.map +1 -1
  99. package/dist/gir/parameter.js +27 -18
  100. package/dist/gir/parameter.js.map +1 -1
  101. package/dist/gir/parse.d.ts +12 -13
  102. package/dist/gir/parse.d.ts.map +1 -1
  103. package/dist/gir/parse.js +50 -40
  104. package/dist/gir/parse.js.map +1 -1
  105. package/dist/gir/primitives.d.ts +5 -4
  106. package/dist/gir/primitives.d.ts.map +1 -1
  107. package/dist/gir/primitives.js +4 -3
  108. package/dist/gir/primitives.js.map +1 -1
  109. package/dist/gir/property.d.ts +5 -4
  110. package/dist/gir/property.d.ts.map +1 -1
  111. package/dist/gir/property.js +10 -9
  112. package/dist/gir/property.js.map +1 -1
  113. package/dist/gir/record.d.ts +5 -4
  114. package/dist/gir/record.d.ts.map +1 -1
  115. package/dist/gir/record.js +13 -12
  116. package/dist/gir/record.js.map +1 -1
  117. package/dist/gir/size.d.ts +6 -5
  118. package/dist/gir/size.d.ts.map +1 -1
  119. package/dist/gir/size.js +49 -47
  120. package/dist/gir/size.js.map +1 -1
  121. package/dist/gir/type-id.d.ts +17 -15
  122. package/dist/gir/type-id.d.ts.map +1 -1
  123. package/dist/gir/type-id.js +5 -1
  124. package/dist/gir/type-id.js.map +1 -1
  125. package/dist/gir/type-ref.d.ts +3 -2
  126. package/dist/gir/type-ref.d.ts.map +1 -1
  127. package/dist/gir/type-ref.js +36 -25
  128. package/dist/gir/type-ref.js.map +1 -1
  129. package/dist/gir/type.d.ts +3 -2
  130. package/dist/gir/type.d.ts.map +1 -1
  131. package/dist/gir/type.js.map +1 -1
  132. package/dist/index.d.ts +2 -0
  133. package/dist/index.d.ts.map +1 -1
  134. package/dist/index.js +1 -0
  135. package/dist/index.js.map +1 -1
  136. package/dist/jsx.d.ts +26 -0
  137. package/dist/jsx.d.ts.map +1 -0
  138. package/dist/jsx.js +40 -0
  139. package/dist/jsx.js.map +1 -0
  140. package/dist/khronos/args.d.ts +7 -7
  141. package/dist/khronos/args.d.ts.map +1 -1
  142. package/dist/khronos/args.js +88 -67
  143. package/dist/khronos/args.js.map +1 -1
  144. package/dist/khronos/jsdoc.d.ts +4 -4
  145. package/dist/khronos/jsdoc.d.ts.map +1 -1
  146. package/dist/khronos/jsdoc.js +29 -16
  147. package/dist/khronos/jsdoc.js.map +1 -1
  148. package/dist/khronos/model.d.ts +8 -7
  149. package/dist/khronos/model.d.ts.map +1 -1
  150. package/dist/khronos/model.js +94 -59
  151. package/dist/khronos/model.js.map +1 -1
  152. package/dist/khronos/modules.d.ts +4 -3
  153. package/dist/khronos/modules.d.ts.map +1 -1
  154. package/dist/khronos/modules.js +40 -25
  155. package/dist/khronos/modules.js.map +1 -1
  156. package/dist/khronos/param-pair.d.ts +11 -0
  157. package/dist/khronos/param-pair.d.ts.map +1 -0
  158. package/dist/khronos/param-pair.js +6 -0
  159. package/dist/khronos/param-pair.js.map +1 -0
  160. package/dist/khronos/parse.d.ts +7 -8
  161. package/dist/khronos/parse.d.ts.map +1 -1
  162. package/dist/khronos/parse.js +17 -16
  163. package/dist/khronos/parse.js.map +1 -1
  164. package/dist/khronos/pipeline.d.ts +4 -4
  165. package/dist/khronos/pipeline.d.ts.map +1 -1
  166. package/dist/khronos/pipeline.js +97 -56
  167. package/dist/khronos/pipeline.js.map +1 -1
  168. package/dist/khronos/plan.d.ts +11 -10
  169. package/dist/khronos/plan.d.ts.map +1 -1
  170. package/dist/khronos/plan.js +109 -45
  171. package/dist/khronos/plan.js.map +1 -1
  172. package/dist/khronos/render.d.ts +5 -4
  173. package/dist/khronos/render.d.ts.map +1 -1
  174. package/dist/khronos/render.js +106 -59
  175. package/dist/khronos/render.js.map +1 -1
  176. package/dist/khronos/select.d.ts +4 -4
  177. package/dist/khronos/select.d.ts.map +1 -1
  178. package/dist/khronos/select.js +30 -19
  179. package/dist/khronos/select.js.map +1 -1
  180. package/dist/react/element-config.d.ts +17 -0
  181. package/dist/react/element-config.d.ts.map +1 -0
  182. package/dist/react/element-config.js +61 -0
  183. package/dist/react/element-config.js.map +1 -0
  184. package/dist/runner.d.ts +17 -10
  185. package/dist/runner.d.ts.map +1 -1
  186. package/dist/runner.js +45 -43
  187. package/dist/runner.js.map +1 -1
  188. package/dist/store/compile-store.d.ts +5 -3
  189. package/dist/store/compile-store.d.ts.map +1 -1
  190. package/dist/store/compile-store.js +24 -22
  191. package/dist/store/compile-store.js.map +1 -1
  192. package/dist/store/gi/async.d.ts +2 -1
  193. package/dist/store/gi/async.d.ts.map +1 -1
  194. package/dist/store/gi/async.js +28 -24
  195. package/dist/store/gi/async.js.map +1 -1
  196. package/dist/store/gi/callables.d.ts +26 -20
  197. package/dist/store/gi/callables.d.ts.map +1 -1
  198. package/dist/store/gi/callables.js +162 -100
  199. package/dist/store/gi/callables.js.map +1 -1
  200. package/dist/store/gi/callback.d.ts +3 -2
  201. package/dist/store/gi/callback.d.ts.map +1 -1
  202. package/dist/store/gi/callback.js +6 -3
  203. package/dist/store/gi/callback.js.map +1 -1
  204. package/dist/store/gi/class-struct-record.d.ts +4 -3
  205. package/dist/store/gi/class-struct-record.d.ts.map +1 -1
  206. package/dist/store/gi/class-struct-record.js +33 -15
  207. package/dist/store/gi/class-struct-record.js.map +1 -1
  208. package/dist/store/gi/class.d.ts +2 -1
  209. package/dist/store/gi/class.d.ts.map +1 -1
  210. package/dist/store/gi/class.js +86 -47
  211. package/dist/store/gi/class.js.map +1 -1
  212. package/dist/store/gi/companion.d.ts +2 -1
  213. package/dist/store/gi/companion.d.ts.map +1 -1
  214. package/dist/store/gi/companion.js +8 -5
  215. package/dist/store/gi/companion.js.map +1 -1
  216. package/dist/store/gi/constant.d.ts +3 -2
  217. package/dist/store/gi/constant.d.ts.map +1 -1
  218. package/dist/store/gi/constant.js +25 -8
  219. package/dist/store/gi/constant.js.map +1 -1
  220. package/dist/store/gi/constructor-props.d.ts +3 -2
  221. package/dist/store/gi/constructor-props.d.ts.map +1 -1
  222. package/dist/store/gi/constructor-props.js +17 -10
  223. package/dist/store/gi/constructor-props.js.map +1 -1
  224. package/dist/store/gi/enum.d.ts +3 -2
  225. package/dist/store/gi/enum.d.ts.map +1 -1
  226. package/dist/store/gi/enum.js +14 -11
  227. package/dist/store/gi/enum.js.map +1 -1
  228. package/dist/store/gi/function.d.ts +5 -4
  229. package/dist/store/gi/function.d.ts.map +1 -1
  230. package/dist/store/gi/function.js +50 -23
  231. package/dist/store/gi/function.js.map +1 -1
  232. package/dist/store/gi/gtype-binding.d.ts +4 -4
  233. package/dist/store/gi/gtype-binding.d.ts.map +1 -1
  234. package/dist/store/gi/gtype-binding.js +15 -11
  235. package/dist/store/gi/gtype-binding.js.map +1 -1
  236. package/dist/store/gi/interface.d.ts +2 -1
  237. package/dist/store/gi/interface.d.ts.map +1 -1
  238. package/dist/store/gi/interface.js +36 -18
  239. package/dist/store/gi/interface.js.map +1 -1
  240. package/dist/store/gi/item-comparators.d.ts +3 -2
  241. package/dist/store/gi/item-comparators.d.ts.map +1 -1
  242. package/dist/store/gi/item-comparators.js +33 -21
  243. package/dist/store/gi/item-comparators.js.map +1 -1
  244. package/dist/store/gi/method.d.ts +13 -13
  245. package/dist/store/gi/method.d.ts.map +1 -1
  246. package/dist/store/gi/method.js +187 -130
  247. package/dist/store/gi/method.js.map +1 -1
  248. package/dist/store/gi/param-marshal.d.ts +7 -6
  249. package/dist/store/gi/param-marshal.d.ts.map +1 -1
  250. package/dist/store/gi/param-marshal.js +26 -13
  251. package/dist/store/gi/param-marshal.js.map +1 -1
  252. package/dist/store/gi/pipeline.d.ts +2 -1
  253. package/dist/store/gi/pipeline.d.ts.map +1 -1
  254. package/dist/store/gi/pipeline.js +38 -23
  255. package/dist/store/gi/pipeline.js.map +1 -1
  256. package/dist/store/gi/properties.d.ts +2 -1
  257. package/dist/store/gi/properties.d.ts.map +1 -1
  258. package/dist/store/gi/properties.js +6 -4
  259. package/dist/store/gi/properties.js.map +1 -1
  260. package/dist/store/gi/property-accessor.d.ts +11 -10
  261. package/dist/store/gi/property-accessor.d.ts.map +1 -1
  262. package/dist/store/gi/property-accessor.js +86 -60
  263. package/dist/store/gi/property-accessor.js.map +1 -1
  264. package/dist/store/gi/record-constructor.d.ts +3 -2
  265. package/dist/store/gi/record-constructor.d.ts.map +1 -1
  266. package/dist/store/gi/record-constructor.js +36 -25
  267. package/dist/store/gi/record-constructor.js.map +1 -1
  268. package/dist/store/gi/record-field-accessor.d.ts +8 -8
  269. package/dist/store/gi/record-field-accessor.d.ts.map +1 -1
  270. package/dist/store/gi/record-field-accessor.js +171 -99
  271. package/dist/store/gi/record-field-accessor.js.map +1 -1
  272. package/dist/store/gi/record-layout.d.ts +6 -5
  273. package/dist/store/gi/record-layout.d.ts.map +1 -1
  274. package/dist/store/gi/record-layout.js +75 -39
  275. package/dist/store/gi/record-layout.js.map +1 -1
  276. package/dist/store/gi/record.d.ts +2 -1
  277. package/dist/store/gi/record.d.ts.map +1 -1
  278. package/dist/store/gi/record.js +19 -13
  279. package/dist/store/gi/record.js.map +1 -1
  280. package/dist/store/gi/registration.d.ts +3 -3
  281. package/dist/store/gi/registration.d.ts.map +1 -1
  282. package/dist/store/gi/registration.js +3 -2
  283. package/dist/store/gi/registration.js.map +1 -1
  284. package/dist/store/gi/return-wrap.d.ts +2 -2
  285. package/dist/store/gi/return-wrap.d.ts.map +1 -1
  286. package/dist/store/gi/return-wrap.js +43 -22
  287. package/dist/store/gi/return-wrap.js.map +1 -1
  288. package/dist/store/gi/runtime-override.d.ts +2 -1
  289. package/dist/store/gi/runtime-override.d.ts.map +1 -1
  290. package/dist/store/gi/runtime-override.js +6 -3
  291. package/dist/store/gi/runtime-override.js.map +1 -1
  292. package/dist/store/gi/signal.d.ts +3 -2
  293. package/dist/store/gi/signal.d.ts.map +1 -1
  294. package/dist/store/gi/signal.js +113 -66
  295. package/dist/store/gi/signal.js.map +1 -1
  296. package/dist/store/gi/vtable.d.ts +2 -1
  297. package/dist/store/gi/vtable.d.ts.map +1 -1
  298. package/dist/store/gi/vtable.js +60 -30
  299. package/dist/store/gi/vtable.js.map +1 -1
  300. package/dist/store/gi-store.d.ts +5 -4
  301. package/dist/store/gi-store.d.ts.map +1 -1
  302. package/dist/store/gi-store.js +4 -2
  303. package/dist/store/gi-store.js.map +1 -1
  304. package/dist/store/jsx/element-components.d.ts +23 -0
  305. package/dist/store/jsx/element-components.d.ts.map +1 -0
  306. package/dist/store/jsx/element-components.js +86 -0
  307. package/dist/store/jsx/element-components.js.map +1 -0
  308. package/dist/store/jsx/element-prop-imports.d.ts +17 -0
  309. package/dist/store/jsx/element-prop-imports.d.ts.map +1 -0
  310. package/dist/store/jsx/element-prop-imports.js +15 -0
  311. package/dist/store/jsx/element-prop-imports.js.map +1 -0
  312. package/dist/store/jsx/element-prop-types.d.ts +10 -0
  313. package/dist/store/jsx/element-prop-types.d.ts.map +1 -0
  314. package/dist/store/jsx/element-prop-types.js +41 -0
  315. package/dist/store/jsx/element-prop-types.js.map +1 -0
  316. package/dist/store/jsx/gir-index.d.ts +16 -0
  317. package/dist/store/jsx/gir-index.d.ts.map +1 -0
  318. package/dist/store/jsx/gir-index.js +33 -0
  319. package/dist/store/jsx/gir-index.js.map +1 -0
  320. package/dist/store/jsx/intrinsic-elements.d.ts +27 -0
  321. package/dist/store/jsx/intrinsic-elements.d.ts.map +1 -0
  322. package/dist/store/jsx/intrinsic-elements.js +128 -0
  323. package/dist/store/jsx/intrinsic-elements.js.map +1 -0
  324. package/dist/store/{react → jsx}/jsx.d.ts +2 -4
  325. package/dist/store/jsx/jsx.d.ts.map +1 -0
  326. package/dist/store/{react → jsx}/jsx.js +110 -71
  327. package/dist/store/jsx/jsx.js.map +1 -0
  328. package/dist/store/jsx/metadata.d.ts +4 -0
  329. package/dist/store/jsx/metadata.d.ts.map +1 -0
  330. package/dist/store/{react → jsx}/metadata.js +148 -69
  331. package/dist/store/jsx/metadata.js.map +1 -0
  332. package/dist/store/jsx/pipeline.d.ts +21 -0
  333. package/dist/store/jsx/pipeline.d.ts.map +1 -0
  334. package/dist/store/{react → jsx}/pipeline.js +36 -15
  335. package/dist/store/jsx/pipeline.js.map +1 -0
  336. package/dist/store/{react → jsx}/props.d.ts +9 -12
  337. package/dist/store/jsx/props.d.ts.map +1 -0
  338. package/dist/store/jsx/props.js +158 -0
  339. package/dist/store/jsx/props.js.map +1 -0
  340. package/dist/store/jsx-store.d.ts +5 -3
  341. package/dist/store/jsx-store.d.ts.map +1 -1
  342. package/dist/store/jsx-store.js +4 -1
  343. package/dist/store/jsx-store.js.map +1 -1
  344. package/dist/store/store-fs.d.ts +14 -12
  345. package/dist/store/store-fs.d.ts.map +1 -1
  346. package/dist/store/store-fs.js +9 -7
  347. package/dist/store/store-fs.js.map +1 -1
  348. package/dist/writer/context.d.ts +2 -1
  349. package/dist/writer/context.d.ts.map +1 -1
  350. package/dist/writer/context.js +12 -6
  351. package/dist/writer/context.js.map +1 -1
  352. package/dist/writer/doc.d.ts +2 -1
  353. package/dist/writer/doc.d.ts.map +1 -1
  354. package/dist/writer/doc.js +13 -7
  355. package/dist/writer/doc.js.map +1 -1
  356. package/dist/writer/emit.d.ts +8 -7
  357. package/dist/writer/emit.d.ts.map +1 -1
  358. package/dist/writer/emit.js +13 -10
  359. package/dist/writer/emit.js.map +1 -1
  360. package/dist/writer/gtk-doc.d.ts +2 -1
  361. package/dist/writer/gtk-doc.d.ts.map +1 -1
  362. package/dist/writer/gtk-doc.js +29 -18
  363. package/dist/writer/gtk-doc.js.map +1 -1
  364. package/dist/writer/imports.d.ts +4 -2
  365. package/dist/writer/imports.d.ts.map +1 -1
  366. package/dist/writer/imports.js +35 -24
  367. package/dist/writer/imports.js.map +1 -1
  368. package/dist/writer/module.d.ts +3 -2
  369. package/dist/writer/module.d.ts.map +1 -1
  370. package/dist/writer/module.js +16 -9
  371. package/dist/writer/module.js.map +1 -1
  372. package/dist/xml.d.ts +4 -0
  373. package/dist/xml.d.ts.map +1 -0
  374. package/dist/xml.js +10 -0
  375. package/dist/xml.js.map +1 -0
  376. package/overrides/cairo/context.ts.ejs +7 -7
  377. package/overrides/cairo/matrix.ts.ejs +2 -2
  378. package/overrides/cairo/recording-surface.ts.ejs +2 -2
  379. package/overrides/cairo/region.ts.ejs +1 -1
  380. package/overrides/cairo/scaled-font.ts.ejs +3 -3
  381. package/package.json +15 -9
  382. package/src/analysis/descriptor-render.ts +484 -168
  383. package/src/analysis/descriptor.ts +162 -125
  384. package/src/analysis/inheritance.ts +286 -98
  385. package/src/analysis/param-structure.ts +188 -57
  386. package/src/analysis/ts-type.ts +112 -26
  387. package/src/compile.ts +103 -76
  388. package/src/docs/api-reference.ts +340 -144
  389. package/src/docs/element-page.ts +137 -146
  390. package/src/docs/pipeline.ts +132 -73
  391. package/src/docs/render.ts +151 -87
  392. package/src/docs/symbol-page.ts +268 -123
  393. package/src/fingerprint.ts +127 -29
  394. package/src/gi.ts +26 -0
  395. package/src/gir/ancestry.ts +26 -14
  396. package/src/gir/callback.ts +10 -15
  397. package/src/gir/class.ts +20 -16
  398. package/src/gir/enum.ts +9 -7
  399. package/src/gir/field.ts +37 -8
  400. package/src/gir/function.ts +33 -9
  401. package/src/gir/gir-path.ts +36 -12
  402. package/src/gir/libraries.ts +56 -31
  403. package/src/gir/library.ts +200 -97
  404. package/src/gir/namespace.ts +42 -26
  405. package/src/gir/nullable-overrides.ts +5 -0
  406. package/src/gir/parameter.ts +80 -42
  407. package/src/gir/parse.ts +102 -47
  408. package/src/gir/primitives.ts +25 -23
  409. package/src/gir/property.ts +13 -11
  410. package/src/gir/record.ts +16 -14
  411. package/src/gir/size.ts +91 -58
  412. package/src/gir/type-id.ts +33 -18
  413. package/src/gir/type-ref.ts +62 -26
  414. package/src/gir/type.ts +10 -8
  415. package/src/index.ts +7 -0
  416. package/src/jsx.ts +70 -0
  417. package/src/khronos/args.ts +158 -89
  418. package/src/khronos/jsdoc.ts +67 -29
  419. package/src/khronos/model.ts +154 -53
  420. package/src/khronos/modules.ts +67 -27
  421. package/src/khronos/param-pair.ts +14 -0
  422. package/src/khronos/parse.ts +37 -17
  423. package/src/khronos/pipeline.ts +193 -90
  424. package/src/khronos/plan.ts +235 -86
  425. package/src/khronos/render.ts +208 -71
  426. package/src/khronos/select.ts +48 -18
  427. package/src/react/element-config.ts +91 -0
  428. package/src/runner.ts +93 -57
  429. package/src/store/compile-store.ts +32 -26
  430. package/src/store/gi/async.ts +48 -21
  431. package/src/store/gi/callables.ts +345 -136
  432. package/src/store/gi/callback.ts +13 -4
  433. package/src/store/gi/class-struct-record.ts +49 -17
  434. package/src/store/gi/class.ts +186 -64
  435. package/src/store/gi/companion.ts +15 -6
  436. package/src/store/gi/constant.ts +42 -8
  437. package/src/store/gi/constructor-props.ts +42 -16
  438. package/src/store/gi/enum.ts +28 -13
  439. package/src/store/gi/function.ts +90 -24
  440. package/src/store/gi/gtype-binding.ts +31 -18
  441. package/src/store/gi/interface.ts +101 -36
  442. package/src/store/gi/item-comparators.ts +74 -26
  443. package/src/store/gi/method.ts +376 -159
  444. package/src/store/gi/param-marshal.ts +38 -15
  445. package/src/store/gi/pipeline.ts +72 -22
  446. package/src/store/gi/properties.ts +16 -5
  447. package/src/store/gi/property-accessor.ts +192 -84
  448. package/src/store/gi/record-constructor.ts +62 -30
  449. package/src/store/gi/record-field-accessor.ts +380 -167
  450. package/src/store/gi/record-layout.ts +130 -43
  451. package/src/store/gi/record.ts +37 -14
  452. package/src/store/gi/registration.ts +15 -9
  453. package/src/store/gi/return-wrap.ts +71 -23
  454. package/src/store/gi/runtime-override.ts +13 -3
  455. package/src/store/gi/signal.ts +244 -104
  456. package/src/store/gi/vtable.ts +117 -41
  457. package/src/store/gi-store.ts +26 -13
  458. package/src/store/jsx/element-components.ts +152 -0
  459. package/src/store/jsx/element-prop-imports.ts +24 -0
  460. package/src/store/jsx/element-prop-types.ts +59 -0
  461. package/src/store/jsx/gir-index.ts +62 -0
  462. package/src/store/jsx/intrinsic-elements.ts +262 -0
  463. package/src/store/{react → jsx}/jsx.ts +213 -99
  464. package/src/store/jsx/metadata.ts +385 -0
  465. package/src/store/jsx/pipeline.ts +145 -0
  466. package/src/store/jsx/props.ts +274 -0
  467. package/src/store/jsx-store.ts +15 -3
  468. package/src/store/store-fs.ts +36 -20
  469. package/src/writer/context.ts +25 -6
  470. package/src/writer/doc.ts +19 -5
  471. package/src/writer/emit.ts +20 -11
  472. package/src/writer/gtk-doc.ts +48 -21
  473. package/src/writer/imports.ts +63 -28
  474. package/src/writer/module.ts +35 -11
  475. package/src/xml.ts +12 -0
  476. package/dist/store/react/built-ins.d.ts +0 -9
  477. package/dist/store/react/built-ins.d.ts.map +0 -1
  478. package/dist/store/react/built-ins.js +0 -226
  479. package/dist/store/react/built-ins.js.map +0 -1
  480. package/dist/store/react/element-components.d.ts +0 -15
  481. package/dist/store/react/element-components.d.ts.map +0 -1
  482. package/dist/store/react/element-components.js +0 -92
  483. package/dist/store/react/element-components.js.map +0 -1
  484. package/dist/store/react/element-prop-types.d.ts +0 -19
  485. package/dist/store/react/element-prop-types.d.ts.map +0 -1
  486. package/dist/store/react/element-prop-types.js +0 -244
  487. package/dist/store/react/element-prop-types.js.map +0 -1
  488. package/dist/store/react/element-props.d.ts +0 -4
  489. package/dist/store/react/element-props.d.ts.map +0 -1
  490. package/dist/store/react/element-props.js +0 -178
  491. package/dist/store/react/element-props.js.map +0 -1
  492. package/dist/store/react/gir-index.d.ts +0 -25
  493. package/dist/store/react/gir-index.d.ts.map +0 -1
  494. package/dist/store/react/gir-index.js +0 -55
  495. package/dist/store/react/gir-index.js.map +0 -1
  496. package/dist/store/react/intrinsic-elements.d.ts +0 -26
  497. package/dist/store/react/intrinsic-elements.d.ts.map +0 -1
  498. package/dist/store/react/intrinsic-elements.js +0 -107
  499. package/dist/store/react/intrinsic-elements.js.map +0 -1
  500. package/dist/store/react/jsx.d.ts.map +0 -1
  501. package/dist/store/react/jsx.js.map +0 -1
  502. package/dist/store/react/metadata.d.ts +0 -4
  503. package/dist/store/react/metadata.d.ts.map +0 -1
  504. package/dist/store/react/metadata.js.map +0 -1
  505. package/dist/store/react/pipeline.d.ts +0 -14
  506. package/dist/store/react/pipeline.d.ts.map +0 -1
  507. package/dist/store/react/pipeline.js.map +0 -1
  508. package/dist/store/react/props.d.ts.map +0 -1
  509. package/dist/store/react/props.js +0 -133
  510. package/dist/store/react/props.js.map +0 -1
  511. package/overrides/gtk/constants.ts.ejs +0 -3
  512. package/overrides/gtk/index.ts.ejs +0 -2
  513. package/src/store/react/built-ins.ts +0 -260
  514. package/src/store/react/element-components.ts +0 -138
  515. package/src/store/react/element-prop-types.ts +0 -280
  516. package/src/store/react/element-props.ts +0 -204
  517. package/src/store/react/gir-index.ts +0 -85
  518. package/src/store/react/intrinsic-elements.ts +0 -161
  519. package/src/store/react/metadata.ts +0 -197
  520. package/src/store/react/pipeline.ts +0 -90
  521. package/src/store/react/props.ts +0 -197
@@ -1,99 +1,175 @@
1
- import { sourceStringLiteral, toCamelIdentifier, toPascalCase } from "@gtkx/utils";
1
+ import { pascalCase, sourceStringLiteral, toCamelIdentifier } from "@gtkx/utils";
2
+ import type { GirCallback } from "../../gir/callback.js";
3
+ import type { GirClass } from "../../gir/class.js";
4
+ import type { GirField } from "../../gir/field.js";
5
+ import type { GirParameter } from "../../gir/parameter.js";
6
+ import type { ModuleContext } from "../../writer/context.js";
2
7
  import {
3
8
  isInlineCallbackRef,
4
9
  isScalarRef,
5
10
  renderDescriptor,
6
11
  renderParamDescriptor,
7
12
  } from "../../analysis/descriptor-render.js";
8
- import type { GirCallback } from "../../gir/callback.js";
9
- import type { GirClass } from "../../gir/class.js";
10
- import type { GirField } from "../../gir/field.js";
11
- import type { ModuleContext } from "../../writer/context.js";
12
13
  import { renderBraced } from "../../writer/emit.js";
13
14
  import { computeRecordFieldSlots } from "./record-layout.js";
14
15
 
15
16
  type VtableKind = "class" | "interface";
16
17
 
17
- export const renderVfuncMetadata = (context: ModuleContext, klass: GirClass): string | undefined => {
18
- if (klass.glibTypeStruct === undefined) return undefined;
19
- const structName = toPascalCase(klass.glibTypeStruct);
18
+ type RenderVtableSlotDescriptorOptions = {
19
+ key: string;
20
+ structName: string;
21
+ kind: VtableKind;
22
+ field: GirField;
23
+ callback: GirCallback;
24
+ byteOffset: number;
25
+ vtableSize: number;
26
+ };
27
+
28
+ const renderVfuncMetadata = (context: ModuleContext, klass: GirClass): string | undefined => {
29
+ if (klass.glibTypeStruct === undefined) {
30
+ return undefined;
31
+ }
32
+
33
+ const structName = pascalCase(klass.glibTypeStruct);
20
34
  const kind: VtableKind = klass.isInterface ? "interface" : "class";
21
35
  const entries = vtableEntries(context, structName, kind, klass.glibTypeStruct);
22
- if (entries.length === 0) return undefined;
36
+
37
+ if (entries.length === 0) {
38
+ return undefined;
39
+ }
40
+
23
41
  return renderBraced(entries.join("\n"));
24
42
  };
25
43
 
44
+ const vtableCallbackType = (context: ModuleContext, field: GirField): GirCallback | undefined => {
45
+ if (field.type === undefined) {
46
+ return undefined;
47
+ }
48
+
49
+ const type = context.library.typeFor(field.type);
50
+
51
+ if (type?.kind !== "callback" || context.library.nameFor(field.type) !== undefined) {
52
+ return undefined;
53
+ }
54
+
55
+ return type.value;
56
+ };
57
+
58
+ const vtableSlotEntry = (
59
+ context: ModuleContext,
60
+ field: GirField,
61
+ claimedNames: Set<string>,
62
+ ): { key: string; callback: GirCallback } | undefined => {
63
+ const callback = vtableCallbackType(context, field);
64
+
65
+ if (callback === undefined) {
66
+ return undefined;
67
+ }
68
+
69
+ const key = toCamelIdentifier(field.name);
70
+
71
+ if (key === "constructor" || claimedNames.has(key)) {
72
+ return undefined;
73
+ }
74
+
75
+ if (!isVtableSlotEligible(context, callback)) {
76
+ return undefined;
77
+ }
78
+
79
+ return { key, callback };
80
+ };
81
+
26
82
  const vtableEntries = (context: ModuleContext, structName: string, kind: VtableKind, typeStruct: string): string[] => {
27
83
  const resolved = context.library.resolveType(context.namespace.name, typeStruct);
28
- if (resolved === undefined || resolved.kind !== "record") return [];
29
- const { slots } = computeRecordFieldSlots(context, resolved.value.fields, resolved.value.isUnion);
84
+
85
+ if (resolved?.kind !== "record") {
86
+ return [];
87
+ }
88
+
89
+ const { slots, size } = computeRecordFieldSlots(context, resolved.value.fields, resolved.value.isUnion);
30
90
  const entries: string[] = [];
31
- const claimedNames = new Set<string>();
91
+ const claimedNames: Set<string> = new Set();
92
+
32
93
  for (const { field, slot } of slots) {
33
- if (field.type === undefined) continue;
34
- const type = context.library.typeOf(field.type);
35
- if (type?.kind !== "callback" || context.library.nameOf(field.type) !== undefined) continue;
36
- const key = toCamelIdentifier(field.name);
37
- if (key === "constructor" || claimedNames.has(key)) continue;
38
- const callback = type.value;
39
- if (!isVtableSlotEligible(context, callback)) continue;
40
- claimedNames.add(key);
94
+ const entry = vtableSlotEntry(context, field, claimedNames);
95
+
96
+ if (entry === undefined) {
97
+ continue;
98
+ }
99
+
100
+ claimedNames.add(entry.key);
101
+
41
102
  entries.push(
42
103
  renderVtableSlotDescriptor(context, {
43
- key,
104
+ key: entry.key,
44
105
  structName,
45
106
  kind,
46
107
  field,
47
- callback,
108
+ callback: entry.callback,
48
109
  byteOffset: slot.byteOffset,
110
+ vtableSize: size,
49
111
  }),
50
112
  );
51
113
  }
114
+
52
115
  return entries;
53
116
  };
54
117
 
118
+ const isUnsupportedOutParam = (context: ModuleContext, param: GirParameter): boolean =>
119
+ (param.direction === "out" || param.direction === "inout") &&
120
+ !param.callerAllocates &&
121
+ !isScalarRef(context.library, param.type);
122
+
123
+ const isEligibleVtableParam = (context: ModuleContext, param: GirParameter): boolean => {
124
+ if (param.isVarargs) {
125
+ return false;
126
+ }
127
+
128
+ if (isUnsupportedOutParam(context, param)) {
129
+ return false;
130
+ }
131
+
132
+ return !isInlineCallbackRef(context.library, param.type);
133
+ };
134
+
55
135
  const isVtableSlotEligible = (context: ModuleContext, callback: GirCallback): boolean => {
56
- if (!callback.introspectable) return false;
136
+ if (!callback.introspectable) {
137
+ return false;
138
+ }
139
+
57
140
  for (const param of callback.parameters) {
58
- if (param.isVarargs) return false;
59
- if (
60
- (param.direction === "out" || param.direction === "inout") &&
61
- !param.callerAllocates &&
62
- !isScalarRef(context.library, param.type)
63
- ) {
141
+ if (!isEligibleVtableParam(context, param)) {
64
142
  return false;
65
143
  }
66
- if (isInlineCallbackRef(context.library, param.type)) return false;
67
144
  }
68
- return !isInlineCallbackRef(context.library, callback.returnValue.type);
69
- };
70
145
 
71
- type RenderVtableSlotDescriptorOptions = {
72
- key: string;
73
- structName: string;
74
- kind: VtableKind;
75
- field: GirField;
76
- callback: GirCallback;
77
- byteOffset: number;
146
+ return !isInlineCallbackRef(context.library, callback.returnValue.type);
78
147
  };
79
148
 
80
149
  const renderVtableSlotDescriptor = (context: ModuleContext, options: RenderVtableSlotDescriptorOptions): string => {
81
- const { key, structName, kind, field, callback, byteOffset } = options;
150
+ const { key, structName, kind, field, callback, byteOffset, vtableSize } = options;
151
+
82
152
  const argDescriptors = callback.parameters
83
153
  .map((param) => renderParamDescriptor(context, param, param.type))
84
154
  .join(", ");
155
+
85
156
  const returnDescriptor = renderDescriptor(
86
157
  context,
87
158
  callback.returnValue.type,
88
159
  callback.returnValue.transferOwnership,
89
160
  );
161
+
90
162
  const lines = [
91
163
  `kind: ${sourceStringLiteral(kind)} as const,`,
92
164
  `className: ${sourceStringLiteral(structName)},`,
93
165
  `vfuncName: ${sourceStringLiteral(field.name)},`,
94
- `byteOffset: ${byteOffset},`,
166
+ `byteOffset: ${String(byteOffset)},`,
167
+ `vtableSize: ${String(vtableSize)},`,
95
168
  `argDescriptors: [${argDescriptors}],`,
96
169
  `returnDescriptor: ${returnDescriptor},`,
97
170
  ];
171
+
98
172
  return `${key}: ${renderBraced(lines.join("\n"))},`;
99
173
  };
174
+
175
+ export { renderVfuncMetadata };
@@ -1,35 +1,41 @@
1
1
  import { existsSync, readdirSync, readFileSync } from "node:fs";
2
2
  import { dirname, join, resolve } from "node:path";
3
3
  import { fileURLToPath } from "node:url";
4
- import { type CodegenFingerprint, FINGERPRINT_FILENAME } from "../fingerprint.js";
4
+ import { FINGERPRINT_FILENAME, type GiFingerprint } from "../fingerprint.js";
5
5
  import { buildManifest, type StoreOptions, subpathExport, writeStore } from "./store-fs.js";
6
6
 
7
- const OVERRIDES_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "..", "..", "overrides");
8
-
9
- export type GiStoreOptions = StoreOptions;
7
+ type GiStoreOptions = StoreOptions;
10
8
 
11
- export type GiNamespaceInput = {
9
+ type GiNamespaceInput = {
12
10
  directory: string;
13
11
  rawSource: string;
14
12
  };
15
13
 
14
+ type CollectedFile = {
15
+ fileName: string;
16
+ source: string;
17
+ };
18
+
19
+ const OVERRIDES_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "..", "..", "overrides");
20
+
16
21
  const overrideFiles = (directory: string): string[] => {
17
22
  const dir = join(OVERRIDES_ROOT, directory);
18
- if (!existsSync(dir)) return [];
23
+
24
+ if (!existsSync(dir)) {
25
+ return [];
26
+ }
27
+
19
28
  return readdirSync(dir).filter((name) => name.endsWith(".ejs") && name !== "index.ts.ejs");
20
29
  };
21
30
 
22
31
  const barrelSource = (directory: string): string => {
23
32
  const overrideIndex = join(OVERRIDES_ROOT, directory, "index.ts.ejs");
33
+
24
34
  if (!existsSync(overrideIndex)) {
25
35
  return `export * from "./${directory}.js";\n`;
26
36
  }
27
- return readFileSync(overrideIndex, "utf8");
28
- };
29
37
 
30
- type CollectedFile = {
31
- fileName: string;
32
- source: string;
38
+ return readFileSync(overrideIndex, "utf8");
33
39
  };
34
40
 
35
41
  const collectStoreSources = (
@@ -37,30 +43,35 @@ const collectStoreSources = (
37
43
  ): { collected: CollectedFile[]; exportsMap: Record<string, unknown> } => {
38
44
  const exportsMap: Record<string, unknown> = {};
39
45
  const collected: CollectedFile[] = [];
46
+
40
47
  for (const { directory, rawSource } of namespaces) {
41
48
  collected.push({
42
49
  fileName: `${directory}/${directory}.ts`,
43
50
  source: rawSource,
44
51
  });
52
+
45
53
  for (const file of overrideFiles(directory)) {
46
54
  collected.push({
47
55
  fileName: `${directory}/overrides/${file.replace(/\.ejs$/, "")}`,
48
56
  source: readFileSync(join(OVERRIDES_ROOT, directory, file), "utf8"),
49
57
  });
50
58
  }
59
+
51
60
  collected.push({
52
61
  fileName: `${directory}/index.ts`,
53
62
  source: barrelSource(directory),
54
63
  });
64
+
55
65
  exportsMap[`./${directory}`] = subpathExport(`${directory}/index`);
56
66
  }
67
+
57
68
  return { collected, exportsMap };
58
69
  };
59
70
 
60
- export const writeGiStore = (
71
+ const writeGiStore = (
61
72
  options: GiStoreOptions,
62
73
  namespaces: GiNamespaceInput[],
63
- fingerprint: CodegenFingerprint,
74
+ fingerprint: GiFingerprint,
64
75
  ): void => {
65
76
  const { collected, exportsMap } = collectStoreSources(namespaces);
66
77
 
@@ -77,3 +88,5 @@ export const writeGiStore = (
77
88
  rawFiles: [{ relativePath: FINGERPRINT_FILENAME, content: `${JSON.stringify(fingerprint, null, 2)}\n` }],
78
89
  });
79
90
  };
91
+
92
+ export { writeGiStore, type GiStoreOptions, type GiNamespaceInput };
@@ -0,0 +1,152 @@
1
+ import { sourceStringLiteral } from "@gtkx/utils";
2
+ import type { Library } from "../../gir/library.js";
3
+ import type { GirNamespace } from "../../gir/namespace.js";
4
+ import type { ImportsBuilder } from "../../writer/imports.js";
5
+ import type { LazyElementSpec } from "./element-prop-types.js";
6
+ import { renderJsDoc } from "../../writer/doc.js";
7
+ import { ancestorGlibNames, type GlibNamedClass } from "./intrinsic-elements.js";
8
+
9
+ /** A component that wraps a generated element, keyed by GLib type name (built-in or user-provided). */
10
+ type ElementComponent = { module: string; export: string };
11
+ /** Component wrappers keyed by GLib type name; the framework's built-ins merged with the project's own. */
12
+ type ElementComponentOverrides = Record<string, ElementComponent>;
13
+
14
+ type ExportCollector = {
15
+ imports: ImportsBuilder;
16
+ exportedNames: Set<string>;
17
+ exportLines: string[];
18
+ };
19
+
20
+ type CandidateExportOptions = {
21
+ targetNamespace: GirNamespace;
22
+ library: Library;
23
+ virtualNames: Set<string>;
24
+ intrinsicElements: GlibNamedClass[];
25
+ components: Record<string, ElementComponent>;
26
+ };
27
+
28
+ const generateElementComponentsSection = (
29
+ targetNamespace: GirNamespace,
30
+ library: Library,
31
+ options: {
32
+ imports: ImportsBuilder;
33
+ lazyElements: LazyElementSpec[];
34
+ intrinsicElements: GlibNamedClass[];
35
+ components: ElementComponentOverrides;
36
+ },
37
+ ): { source: string; exportedNames: Set<string> } => {
38
+ const collector: ExportCollector = { imports: options.imports, exportedNames: new Set(), exportLines: [] };
39
+ const lazyElements = options.lazyElements;
40
+ const virtualNames = new Set(lazyElements.map((entry) => entry.element));
41
+
42
+ collectCandidateExports(collector, {
43
+ targetNamespace,
44
+ library,
45
+ virtualNames,
46
+ intrinsicElements: options.intrinsicElements,
47
+ components: options.components,
48
+ });
49
+
50
+ collectLazyElementExports(collector, lazyElements);
51
+ const source = collector.exportLines.join("\n\n");
52
+
53
+ return { source, exportedNames: collector.exportedNames };
54
+ };
55
+
56
+ const appendCandidateExport = (
57
+ collector: ExportCollector,
58
+ candidate: GlibNamedClass,
59
+ options: CandidateExportOptions,
60
+ ): void => {
61
+ const { targetNamespace, library, virtualNames, components } = options;
62
+
63
+ if (candidate.namespace.name !== targetNamespace.name) {
64
+ return;
65
+ }
66
+
67
+ if (virtualNames.has(candidate.glibName)) {
68
+ return;
69
+ }
70
+
71
+ const line = renderCandidateExport(candidate, library, collector.imports, components);
72
+ collector.exportLines.push(line);
73
+ collector.exportedNames.add(candidate.glibName);
74
+ };
75
+
76
+ // An abstract GType cannot be instantiated: `g_object_new` on one is a fatal GObject error rather
77
+ // than a NULL return. Its props interface and metadata still have to be emitted, since every
78
+ // concrete subclass extends them, so only the constructible component export is withheld.
79
+ const collectCandidateExports = (collector: ExportCollector, options: CandidateExportOptions): void => {
80
+ for (const candidate of options.intrinsicElements) {
81
+ if (candidate.klass.isAbstract) {
82
+ continue;
83
+ }
84
+
85
+ appendCandidateExport(collector, candidate, options);
86
+ }
87
+ };
88
+
89
+ const collectLazyElementExports = (collector: ExportCollector, lazyElements: LazyElementSpec[]): void => {
90
+ for (const spec of lazyElements) {
91
+ collector.imports.addNamed("@gtkx/react/internal", "createElementComponent", false);
92
+ collector.imports.addNamed("react", "ReactNode", true);
93
+ collector.exportLines.push(renderLazyElementExport(spec));
94
+ collector.exportedNames.add(spec.element);
95
+ }
96
+ };
97
+
98
+ const renderLazyElementExport = (spec: LazyElementSpec): string => {
99
+ const factory = `createElementComponent(${sourceStringLiteral(spec.element)})`;
100
+ const component = `export const ${spec.element}: (props: ${spec.typeName}) => ReactNode = ${factory};`;
101
+
102
+ return `${spec.typeSource}\n\n${component}`;
103
+ };
104
+
105
+ const renderCandidateExport = (
106
+ candidate: GlibNamedClass,
107
+ library: Library,
108
+ imports: ImportsBuilder,
109
+ components: Record<string, ElementComponent>,
110
+ ): string => {
111
+ const { glibName, klass, namespace } = candidate;
112
+ const ancestry = ancestorGlibNames(klass, namespace, library);
113
+ const component = resolveElementComponent(ancestry, components);
114
+ imports.addNamed("@gtkx/react/internal", "createElementComponent", false);
115
+ imports.addNamed("react", "ReactNode", true);
116
+
117
+ if (component !== undefined) {
118
+ imports.addNamed(component.module, component.export, false);
119
+ }
120
+
121
+ return `${renderJsDoc(klass.doc)}${renderElementComponentExport(glibName, component)}`;
122
+ };
123
+
124
+ /** The component for the nearest ancestry match, most-derived first; user overrides win on their exact type. */
125
+ const resolveElementComponent = (
126
+ ancestry: string[],
127
+ components: Record<string, ElementComponent>,
128
+ ): ElementComponent | undefined => {
129
+ for (const name of ancestry) {
130
+ const found = components[name];
131
+
132
+ if (found !== undefined) {
133
+ return found;
134
+ }
135
+ }
136
+
137
+ return undefined;
138
+ };
139
+
140
+ const renderElementComponentExport = (glibName: string, component: ElementComponent | undefined): string => {
141
+ const propsType = `${glibName}Props`;
142
+ const annotation = `(props: ${propsType}) => ReactNode`;
143
+ const factoryCall = `createElementComponent(${sourceStringLiteral(glibName)})`;
144
+
145
+ if (component === undefined) {
146
+ return `export const ${glibName}: ${annotation} = ${factoryCall};`;
147
+ }
148
+
149
+ return `export const ${glibName}: ${annotation} = ${component.export}(${factoryCall});`;
150
+ };
151
+
152
+ export { generateElementComponentsSection, type ElementComponent, type ElementComponentOverrides };
@@ -0,0 +1,24 @@
1
+ /** Props interface a generated element's props extend, declared by hand in `@gtkx/react`. */
2
+ type ElementPropTypeRef = { type: string; module: string; export: string };
3
+ /** Base props interface each element extends, keyed by GLib type name (the module exports it). */
4
+ type ElementProps = Record<string, { module: string; export: string }>;
5
+
6
+ const elementProps: Map<string, { module: string; export: string }> = new Map();
7
+
8
+ /** Installs the base props each element extends (GLib type name → `{ module, export }`); set once per run. */
9
+ const setElementProps = (props: ElementProps): void => {
10
+ elementProps.clear();
11
+
12
+ for (const [glibName, ref] of Object.entries(props)) {
13
+ elementProps.set(glibName, ref);
14
+ }
15
+ };
16
+
17
+ /** The base props interface an element extends, when its element config declares one. */
18
+ const elementPropTypeFor = (glibName: string): ElementPropTypeRef | undefined => {
19
+ const ref = elementProps.get(glibName);
20
+
21
+ return ref === undefined ? undefined : { type: glibName, module: ref.module, export: ref.export };
22
+ };
23
+
24
+ export { setElementProps, elementPropTypeFor, type ElementPropTypeRef, type ElementProps };
@@ -0,0 +1,59 @@
1
+ import { toCamelIdentifier } from "@gtkx/utils";
2
+ import type { GirClass } from "../../gir/class.js";
3
+ import { getChain, type GirIndex, type GirTypeEntry } from "./gir-index.js";
4
+ import { getGlibName } from "./intrinsic-elements.js";
5
+
6
+ type LazyElementSpec = {
7
+ element: string;
8
+ typeName: string;
9
+ typeSource: string;
10
+ };
11
+
12
+ const appendConstructOnlyNames = (klass: GirClass, names: string[]): void => {
13
+ for (const property of klass.properties) {
14
+ if (property.constructOnly) {
15
+ names.push(toCamelIdentifier(property.name));
16
+ }
17
+ }
18
+ };
19
+
20
+ const constructOnlyNames = (context: GirIndex, entry: GirTypeEntry): string[] => {
21
+ const names: string[] = [];
22
+
23
+ for (const klass of getChain(context, entry)) {
24
+ appendConstructOnlyNames(klass, names);
25
+ }
26
+
27
+ return names;
28
+ };
29
+
30
+ const createLazyElementSpec = (context: GirIndex, element: string, entry: GirTypeEntry): LazyElementSpec => {
31
+ const typeName = `${element}ElementProps`;
32
+ const baseName = getGlibName(entry.klass) ?? element;
33
+ const omitted = constructOnlyNames(context, entry);
34
+ const omitUnion = omitted.map((name) => JSON.stringify(name)).join(" | ");
35
+ const base = omitted.length === 0 ? `${baseName}Props` : `Omit<${baseName}Props, ${omitUnion}>`;
36
+
37
+ return { element, typeName, typeSource: `export type ${typeName} = ${base} & { children?: ReactNode };` };
38
+ };
39
+
40
+ /** Lazy element prop types to emit, grouped by the namespace declaring each element. */
41
+ const lazyElementSpecs = (context: GirIndex, lazyElements: string[]): Map<string, LazyElementSpec[]> => {
42
+ const specs: Map<string, LazyElementSpec[]> = new Map();
43
+
44
+ for (const element of lazyElements) {
45
+ const entry = context.index.get(element);
46
+
47
+ if (entry === undefined) {
48
+ continue;
49
+ }
50
+
51
+ const list = specs.get(entry.namespace.name) ?? [];
52
+ list.push(createLazyElementSpec(context, element, entry));
53
+ specs.set(entry.namespace.name, list);
54
+ }
55
+
56
+ return specs;
57
+ };
58
+
59
+ export { lazyElementSpecs, type LazyElementSpec };
@@ -0,0 +1,62 @@
1
+ import type { GirClass } from "../../gir/class.js";
2
+ import type { Library } from "../../gir/library.js";
3
+ import type { GirNamespace } from "../../gir/namespace.js";
4
+ import { ancestorChain } from "../../gir/ancestry.js";
5
+ import { getGlibName, implementedInterfaces } from "./intrinsic-elements.js";
6
+
7
+ type GirTypeEntry = {
8
+ klass: GirClass;
9
+ namespace: GirNamespace;
10
+ isInterface: boolean;
11
+ };
12
+
13
+ type GirIndex = {
14
+ library: Library;
15
+ index: Map<string, GirTypeEntry>;
16
+ };
17
+
18
+ const indexClasses = (
19
+ index: Map<string, GirTypeEntry>,
20
+ classes: Iterable<GirClass>,
21
+ namespace: GirNamespace,
22
+ isInterface: boolean,
23
+ ): void => {
24
+ for (const klass of classes) {
25
+ const glibName = getGlibName(klass);
26
+
27
+ if (glibName !== undefined && !index.has(glibName)) {
28
+ index.set(glibName, { klass, namespace, isInterface });
29
+ }
30
+ }
31
+ };
32
+
33
+ const buildGirIndex = (library: Library): GirIndex => {
34
+ const index: Map<string, GirTypeEntry> = new Map();
35
+
36
+ for (const namespace of library.namespaces.values()) {
37
+ indexClasses(index, namespace.classes, namespace, false);
38
+ indexClasses(index, namespace.interfaces, namespace, true);
39
+ }
40
+
41
+ return { library, index };
42
+ };
43
+
44
+ const getChain = (context: GirIndex, entry: GirTypeEntry): GirClass[] => {
45
+ if (entry.isInterface) {
46
+ return [entry.klass];
47
+ }
48
+
49
+ const chain: GirClass[] = [];
50
+
51
+ for (const { klass } of ancestorChain(context.library, entry.klass, entry.namespace.name)) {
52
+ chain.push(klass);
53
+ }
54
+
55
+ for (const iface of implementedInterfaces(entry.klass, entry.namespace, context.library)) {
56
+ chain.push(iface.klass);
57
+ }
58
+
59
+ return chain;
60
+ };
61
+
62
+ export { buildGirIndex, getChain, type GirTypeEntry, type GirIndex };