@gtkx/codegen 1.0.0-rc.3 → 1.0.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 (486) hide show
  1. package/README.md +8 -9
  2. package/dist/analysis/descriptor-render.d.ts +9 -4
  3. package/dist/analysis/descriptor-render.d.ts.map +1 -1
  4. package/dist/analysis/descriptor-render.js +51 -61
  5. package/dist/analysis/descriptor-render.js.map +1 -1
  6. package/dist/analysis/descriptor.d.ts +7 -7
  7. package/dist/analysis/descriptor.d.ts.map +1 -1
  8. package/dist/analysis/descriptor.js +7 -7
  9. package/dist/analysis/descriptor.js.map +1 -1
  10. package/dist/analysis/inheritance.d.ts +1 -2
  11. package/dist/analysis/inheritance.d.ts.map +1 -1
  12. package/dist/analysis/inheritance.js +25 -22
  13. package/dist/analysis/inheritance.js.map +1 -1
  14. package/dist/analysis/nul-terminated-bytes.d.ts +5 -0
  15. package/dist/analysis/nul-terminated-bytes.d.ts.map +1 -0
  16. package/dist/analysis/nul-terminated-bytes.js +18 -0
  17. package/dist/analysis/nul-terminated-bytes.js.map +1 -0
  18. package/dist/analysis/param-capability.d.ts +5 -0
  19. package/dist/analysis/param-capability.d.ts.map +1 -0
  20. package/dist/analysis/param-capability.js +130 -0
  21. package/dist/analysis/param-capability.js.map +1 -0
  22. package/dist/analysis/param-structure.d.ts +13 -6
  23. package/dist/analysis/param-structure.d.ts.map +1 -1
  24. package/dist/analysis/param-structure.js +44 -20
  25. package/dist/analysis/param-structure.js.map +1 -1
  26. package/dist/analysis/ts-type.d.ts +1 -1
  27. package/dist/analysis/ts-type.d.ts.map +1 -1
  28. package/dist/analysis/ts-type.js +3 -5
  29. package/dist/analysis/ts-type.js.map +1 -1
  30. package/dist/analysis/type-shape.d.ts +8 -0
  31. package/dist/analysis/type-shape.d.ts.map +1 -0
  32. package/dist/analysis/type-shape.js +12 -0
  33. package/dist/analysis/type-shape.js.map +1 -0
  34. package/dist/compile.d.ts +1 -1
  35. package/dist/compile.d.ts.map +1 -1
  36. package/dist/compile.js +2 -1
  37. package/dist/compile.js.map +1 -1
  38. package/dist/docs/api-reference.d.ts +79 -3
  39. package/dist/docs/api-reference.d.ts.map +1 -1
  40. package/dist/docs/api-reference.js +68 -13
  41. package/dist/docs/api-reference.js.map +1 -1
  42. package/dist/docs/element-page.d.ts +4 -4
  43. package/dist/docs/element-page.d.ts.map +1 -1
  44. package/dist/docs/element-page.js +32 -20
  45. package/dist/docs/element-page.js.map +1 -1
  46. package/dist/docs/handwritten-props.d.ts +9 -0
  47. package/dist/docs/handwritten-props.d.ts.map +1 -0
  48. package/dist/docs/handwritten-props.js +149 -0
  49. package/dist/docs/handwritten-props.js.map +1 -0
  50. package/dist/docs/pipeline.d.ts +4 -4
  51. package/dist/docs/pipeline.d.ts.map +1 -1
  52. package/dist/docs/pipeline.js +6 -6
  53. package/dist/docs/pipeline.js.map +1 -1
  54. package/dist/docs/render.d.ts +25 -5
  55. package/dist/docs/render.d.ts.map +1 -1
  56. package/dist/docs/render.js +90 -28
  57. package/dist/docs/render.js.map +1 -1
  58. package/dist/docs/symbol-page.d.ts +22 -0
  59. package/dist/docs/symbol-page.d.ts.map +1 -1
  60. package/dist/docs/symbol-page.js +129 -44
  61. package/dist/docs/symbol-page.js.map +1 -1
  62. package/dist/fingerprint.d.ts +3 -6
  63. package/dist/fingerprint.d.ts.map +1 -1
  64. package/dist/fingerprint.js +6 -8
  65. package/dist/fingerprint.js.map +1 -1
  66. package/dist/gi.d.ts +3 -11
  67. package/dist/gi.d.ts.map +1 -1
  68. package/dist/gi.js +0 -7
  69. package/dist/gi.js.map +1 -1
  70. package/dist/gir/ancestry.d.ts +2 -2
  71. package/dist/gir/ancestry.d.ts.map +1 -1
  72. package/dist/gir/ancestry.js +11 -1
  73. package/dist/gir/ancestry.js.map +1 -1
  74. package/dist/gir/annotations.d.ts +22 -0
  75. package/dist/gir/annotations.d.ts.map +1 -0
  76. package/dist/gir/annotations.js +15 -0
  77. package/dist/gir/annotations.js.map +1 -0
  78. package/dist/gir/callback.d.ts +1 -0
  79. package/dist/gir/callback.d.ts.map +1 -1
  80. package/dist/gir/callback.js +1 -0
  81. package/dist/gir/callback.js.map +1 -1
  82. package/dist/gir/class.d.ts +32 -1
  83. package/dist/gir/class.d.ts.map +1 -1
  84. package/dist/gir/class.js +8 -3
  85. package/dist/gir/class.js.map +1 -1
  86. package/dist/gir/enum.d.ts +21 -1
  87. package/dist/gir/enum.d.ts.map +1 -1
  88. package/dist/gir/enum.js +9 -9
  89. package/dist/gir/enum.js.map +1 -1
  90. package/dist/gir/field.d.ts +19 -4
  91. package/dist/gir/field.d.ts.map +1 -1
  92. package/dist/gir/field.js +7 -11
  93. package/dist/gir/field.js.map +1 -1
  94. package/dist/gir/function.d.ts +15 -0
  95. package/dist/gir/function.d.ts.map +1 -1
  96. package/dist/gir/function.js.map +1 -1
  97. package/dist/gir/gir-path.d.ts +7 -0
  98. package/dist/gir/gir-path.d.ts.map +1 -1
  99. package/dist/gir/gir-path.js +7 -0
  100. package/dist/gir/gir-path.js.map +1 -1
  101. package/dist/gir/libraries.d.ts +13 -2
  102. package/dist/gir/libraries.d.ts.map +1 -1
  103. package/dist/gir/libraries.js +11 -0
  104. package/dist/gir/libraries.js.map +1 -1
  105. package/dist/gir/library.d.ts +36 -0
  106. package/dist/gir/library.d.ts.map +1 -1
  107. package/dist/gir/library.js +34 -0
  108. package/dist/gir/library.js.map +1 -1
  109. package/dist/gir/namespace.d.ts +38 -0
  110. package/dist/gir/namespace.d.ts.map +1 -1
  111. package/dist/gir/namespace.js +4 -5
  112. package/dist/gir/namespace.js.map +1 -1
  113. package/dist/gir/parameter.d.ts +39 -0
  114. package/dist/gir/parameter.d.ts.map +1 -1
  115. package/dist/gir/parameter.js +7 -7
  116. package/dist/gir/parameter.js.map +1 -1
  117. package/dist/gir/parse.d.ts +3 -1
  118. package/dist/gir/parse.d.ts.map +1 -1
  119. package/dist/gir/parse.js +6 -3
  120. package/dist/gir/parse.js.map +1 -1
  121. package/dist/gir/primitives.d.ts +1 -0
  122. package/dist/gir/primitives.d.ts.map +1 -1
  123. package/dist/gir/primitives.js.map +1 -1
  124. package/dist/gir/property.d.ts +16 -0
  125. package/dist/gir/property.d.ts.map +1 -1
  126. package/dist/gir/property.js +3 -3
  127. package/dist/gir/property.js.map +1 -1
  128. package/dist/gir/record.d.ts +22 -0
  129. package/dist/gir/record.d.ts.map +1 -1
  130. package/dist/gir/record.js +3 -2
  131. package/dist/gir/record.js.map +1 -1
  132. package/dist/gir/size.d.ts +5 -4
  133. package/dist/gir/size.d.ts.map +1 -1
  134. package/dist/gir/size.js +0 -3
  135. package/dist/gir/size.js.map +1 -1
  136. package/dist/gir/type-id.d.ts +36 -1
  137. package/dist/gir/type-id.d.ts.map +1 -1
  138. package/dist/gir/type-id.js +2 -3
  139. package/dist/gir/type-id.js.map +1 -1
  140. package/dist/gir/type-ref.d.ts.map +1 -1
  141. package/dist/gir/type-ref.js +2 -1
  142. package/dist/gir/type-ref.js.map +1 -1
  143. package/dist/gir/type.d.ts +20 -0
  144. package/dist/gir/type.d.ts.map +1 -1
  145. package/dist/gir/type.js.map +1 -1
  146. package/dist/index.d.ts +18 -6
  147. package/dist/index.d.ts.map +1 -1
  148. package/dist/index.js +12 -3
  149. package/dist/index.js.map +1 -1
  150. package/dist/internal.d.ts +3 -0
  151. package/dist/internal.d.ts.map +1 -0
  152. package/dist/internal.js +3 -0
  153. package/dist/internal.js.map +1 -0
  154. package/dist/jsx.d.ts +7 -12
  155. package/dist/jsx.d.ts.map +1 -1
  156. package/dist/jsx.js +18 -19
  157. package/dist/jsx.js.map +1 -1
  158. package/dist/khronos/args.d.ts +7 -6
  159. package/dist/khronos/args.d.ts.map +1 -1
  160. package/dist/khronos/args.js +29 -7
  161. package/dist/khronos/args.js.map +1 -1
  162. package/dist/khronos/doc-context.d.ts +29 -0
  163. package/dist/khronos/doc-context.d.ts.map +1 -0
  164. package/dist/khronos/doc-context.js +29 -0
  165. package/dist/khronos/doc-context.js.map +1 -0
  166. package/dist/khronos/extensions.d.ts +13 -0
  167. package/dist/khronos/extensions.d.ts.map +1 -0
  168. package/dist/khronos/extensions.js +49 -0
  169. package/dist/khronos/extensions.js.map +1 -0
  170. package/dist/khronos/jsdoc.d.ts +17 -11
  171. package/dist/khronos/jsdoc.d.ts.map +1 -1
  172. package/dist/khronos/jsdoc.js +104 -46
  173. package/dist/khronos/jsdoc.js.map +1 -1
  174. package/dist/khronos/model.d.ts +42 -3
  175. package/dist/khronos/model.d.ts.map +1 -1
  176. package/dist/khronos/model.js +218 -63
  177. package/dist/khronos/model.js.map +1 -1
  178. package/dist/khronos/modules.d.ts +9 -6
  179. package/dist/khronos/modules.d.ts.map +1 -1
  180. package/dist/khronos/modules.js +96 -26
  181. package/dist/khronos/modules.js.map +1 -1
  182. package/dist/khronos/notes.d.ts +19 -0
  183. package/dist/khronos/notes.d.ts.map +1 -0
  184. package/dist/khronos/notes.js +35 -0
  185. package/dist/khronos/notes.js.map +1 -0
  186. package/dist/khronos/param-pair.d.ts +1 -1
  187. package/dist/khronos/param-pair.d.ts.map +1 -1
  188. package/dist/khronos/param-pair.js.map +1 -1
  189. package/dist/khronos/pipeline.d.ts +3 -1
  190. package/dist/khronos/pipeline.d.ts.map +1 -1
  191. package/dist/khronos/pipeline.js +59 -28
  192. package/dist/khronos/pipeline.js.map +1 -1
  193. package/dist/khronos/plan.d.ts +5 -5
  194. package/dist/khronos/plan.d.ts.map +1 -1
  195. package/dist/khronos/plan.js +8 -8
  196. package/dist/khronos/plan.js.map +1 -1
  197. package/dist/khronos/render.d.ts +8 -6
  198. package/dist/khronos/render.d.ts.map +1 -1
  199. package/dist/khronos/render.js +35 -26
  200. package/dist/khronos/render.js.map +1 -1
  201. package/dist/khronos/select.d.ts +21 -4
  202. package/dist/khronos/select.d.ts.map +1 -1
  203. package/dist/khronos/select.js +47 -34
  204. package/dist/khronos/select.js.map +1 -1
  205. package/dist/react/element-config.d.ts +16 -10
  206. package/dist/react/element-config.d.ts.map +1 -1
  207. package/dist/react/element-config.js +22 -15
  208. package/dist/react/element-config.js.map +1 -1
  209. package/dist/runner.d.ts +33 -21
  210. package/dist/runner.d.ts.map +1 -1
  211. package/dist/runner.js +19 -20
  212. package/dist/runner.js.map +1 -1
  213. package/dist/store/compile-store.d.ts +2 -3
  214. package/dist/store/compile-store.d.ts.map +1 -1
  215. package/dist/store/compile-store.js +2 -2
  216. package/dist/store/compile-store.js.map +1 -1
  217. package/dist/store/gi/callable-doc.d.ts +11 -0
  218. package/dist/store/gi/callable-doc.d.ts.map +1 -0
  219. package/dist/store/gi/callable-doc.js +62 -0
  220. package/dist/store/gi/callable-doc.js.map +1 -0
  221. package/dist/store/gi/callables.d.ts +3 -1
  222. package/dist/store/gi/callables.d.ts.map +1 -1
  223. package/dist/store/gi/callables.js +16 -16
  224. package/dist/store/gi/callables.js.map +1 -1
  225. package/dist/store/gi/callback.d.ts.map +1 -1
  226. package/dist/store/gi/callback.js +2 -2
  227. package/dist/store/gi/callback.js.map +1 -1
  228. package/dist/store/gi/class.d.ts.map +1 -1
  229. package/dist/store/gi/class.js +5 -3
  230. package/dist/store/gi/class.js.map +1 -1
  231. package/dist/store/gi/closure-invocation.d.ts +4 -0
  232. package/dist/store/gi/closure-invocation.d.ts.map +1 -0
  233. package/dist/store/gi/closure-invocation.js +22 -0
  234. package/dist/store/gi/closure-invocation.js.map +1 -0
  235. package/dist/store/gi/constant.d.ts.map +1 -1
  236. package/dist/store/gi/constant.js +3 -4
  237. package/dist/store/gi/constant.js.map +1 -1
  238. package/dist/store/gi/constructor-props.d.ts.map +1 -1
  239. package/dist/store/gi/constructor-props.js +18 -20
  240. package/dist/store/gi/constructor-props.js.map +1 -1
  241. package/dist/store/gi/doc-spec.d.ts +14 -0
  242. package/dist/store/gi/doc-spec.d.ts.map +1 -0
  243. package/dist/store/gi/doc-spec.js +23 -0
  244. package/dist/store/gi/doc-spec.js.map +1 -0
  245. package/dist/store/gi/enum.d.ts.map +1 -1
  246. package/dist/store/gi/enum.js +29 -16
  247. package/dist/store/gi/enum.js.map +1 -1
  248. package/dist/store/gi/function.d.ts.map +1 -1
  249. package/dist/store/gi/function.js +28 -17
  250. package/dist/store/gi/function.js.map +1 -1
  251. package/dist/store/gi/interface.d.ts.map +1 -1
  252. package/dist/store/gi/interface.js +130 -16
  253. package/dist/store/gi/interface.js.map +1 -1
  254. package/dist/store/gi/item-comparators.d.ts.map +1 -1
  255. package/dist/store/gi/item-comparators.js +3 -5
  256. package/dist/store/gi/item-comparators.js.map +1 -1
  257. package/dist/store/gi/method.d.ts +9 -1
  258. package/dist/store/gi/method.d.ts.map +1 -1
  259. package/dist/store/gi/method.js +92 -47
  260. package/dist/store/gi/method.js.map +1 -1
  261. package/dist/store/gi/param-marshal.d.ts +4 -1
  262. package/dist/store/gi/param-marshal.d.ts.map +1 -1
  263. package/dist/store/gi/param-marshal.js +5 -1
  264. package/dist/store/gi/param-marshal.js.map +1 -1
  265. package/dist/store/gi/pipeline.d.ts.map +1 -1
  266. package/dist/store/gi/pipeline.js +3 -2
  267. package/dist/store/gi/pipeline.js.map +1 -1
  268. package/dist/store/gi/properties.d.ts.map +1 -1
  269. package/dist/store/gi/properties.js +2 -2
  270. package/dist/store/gi/properties.js.map +1 -1
  271. package/dist/store/gi/property-accessor.d.ts +4 -2
  272. package/dist/store/gi/property-accessor.d.ts.map +1 -1
  273. package/dist/store/gi/property-accessor.js +10 -11
  274. package/dist/store/gi/property-accessor.js.map +1 -1
  275. package/dist/store/gi/record-constructor.d.ts.map +1 -1
  276. package/dist/store/gi/record-constructor.js +3 -1
  277. package/dist/store/gi/record-constructor.js.map +1 -1
  278. package/dist/store/gi/record-field-accessor.d.ts +4 -2
  279. package/dist/store/gi/record-field-accessor.d.ts.map +1 -1
  280. package/dist/store/gi/record-field-accessor.js +6 -11
  281. package/dist/store/gi/record-field-accessor.js.map +1 -1
  282. package/dist/store/gi/record-layout.d.ts.map +1 -1
  283. package/dist/store/gi/record-layout.js +1 -5
  284. package/dist/store/gi/record-layout.js.map +1 -1
  285. package/dist/store/gi/record.d.ts.map +1 -1
  286. package/dist/store/gi/record.js +3 -2
  287. package/dist/store/gi/record.js.map +1 -1
  288. package/dist/store/gi/registration.d.ts +1 -1
  289. package/dist/store/gi/registration.js +2 -2
  290. package/dist/store/gi/registration.js.map +1 -1
  291. package/dist/store/gi/return-wrap.d.ts +1 -1
  292. package/dist/store/gi/return-wrap.d.ts.map +1 -1
  293. package/dist/store/gi/return-wrap.js +4 -4
  294. package/dist/store/gi/return-wrap.js.map +1 -1
  295. package/dist/store/gi/runtime-override.d.ts +2 -1
  296. package/dist/store/gi/runtime-override.d.ts.map +1 -1
  297. package/dist/store/gi/runtime-override.js +8 -5
  298. package/dist/store/gi/runtime-override.js.map +1 -1
  299. package/dist/store/gi/signal.d.ts.map +1 -1
  300. package/dist/store/gi/signal.js +27 -31
  301. package/dist/store/gi/signal.js.map +1 -1
  302. package/dist/store/gi/value-marshalable.d.ts +1 -10
  303. package/dist/store/gi/value-marshalable.d.ts.map +1 -1
  304. package/dist/store/gi/value-marshalable.js +1 -10
  305. package/dist/store/gi/value-marshalable.js.map +1 -1
  306. package/dist/store/gi/vtable.d.ts +16 -1
  307. package/dist/store/gi/vtable.d.ts.map +1 -1
  308. package/dist/store/gi/vtable.js +214 -51
  309. package/dist/store/gi/vtable.js.map +1 -1
  310. package/dist/store/gi-store.d.ts +2 -3
  311. package/dist/store/gi-store.d.ts.map +1 -1
  312. package/dist/store/gi-store.js.map +1 -1
  313. package/dist/store/jsx/element-components.d.ts +1 -3
  314. package/dist/store/jsx/element-components.d.ts.map +1 -1
  315. package/dist/store/jsx/element-components.js +6 -8
  316. package/dist/store/jsx/element-components.js.map +1 -1
  317. package/dist/store/jsx/element-prop-imports.d.ts +1 -4
  318. package/dist/store/jsx/element-prop-imports.d.ts.map +1 -1
  319. package/dist/store/jsx/element-prop-imports.js +0 -2
  320. package/dist/store/jsx/element-prop-imports.js.map +1 -1
  321. package/dist/store/jsx/element-prop-types.d.ts +3 -1
  322. package/dist/store/jsx/element-prop-types.d.ts.map +1 -1
  323. package/dist/store/jsx/element-prop-types.js +7 -2
  324. package/dist/store/jsx/element-prop-types.js.map +1 -1
  325. package/dist/store/jsx/generated-elements.d.ts +29 -0
  326. package/dist/store/jsx/generated-elements.d.ts.map +1 -0
  327. package/dist/store/jsx/generated-elements.js +30 -0
  328. package/dist/store/jsx/generated-elements.js.map +1 -0
  329. package/dist/store/jsx/intrinsic-elements.d.ts +4 -0
  330. package/dist/store/jsx/intrinsic-elements.d.ts.map +1 -1
  331. package/dist/store/jsx/intrinsic-elements.js.map +1 -1
  332. package/dist/store/jsx/jsx.d.ts.map +1 -1
  333. package/dist/store/jsx/jsx.js +13 -12
  334. package/dist/store/jsx/jsx.js.map +1 -1
  335. package/dist/store/jsx/metadata.js +9 -9
  336. package/dist/store/jsx/metadata.js.map +1 -1
  337. package/dist/store/jsx/omitted-props.d.ts +2 -4
  338. package/dist/store/jsx/omitted-props.d.ts.map +1 -1
  339. package/dist/store/jsx/omitted-props.js +2 -4
  340. package/dist/store/jsx/omitted-props.js.map +1 -1
  341. package/dist/store/jsx/pipeline.d.ts +4 -2
  342. package/dist/store/jsx/pipeline.d.ts.map +1 -1
  343. package/dist/store/jsx/pipeline.js +3 -2
  344. package/dist/store/jsx/pipeline.js.map +1 -1
  345. package/dist/store/jsx/props.d.ts +1 -7
  346. package/dist/store/jsx/props.d.ts.map +1 -1
  347. package/dist/store/jsx/props.js +16 -8
  348. package/dist/store/jsx/props.js.map +1 -1
  349. package/dist/store/jsx-store.d.ts +2 -3
  350. package/dist/store/jsx-store.d.ts.map +1 -1
  351. package/dist/store/jsx-store.js +3 -3
  352. package/dist/store/jsx-store.js.map +1 -1
  353. package/dist/store/resolve-store.d.ts +28 -0
  354. package/dist/store/resolve-store.d.ts.map +1 -0
  355. package/dist/store/resolve-store.js +65 -0
  356. package/dist/store/resolve-store.js.map +1 -0
  357. package/dist/store/store-fs.d.ts +5 -1
  358. package/dist/store/store-fs.d.ts.map +1 -1
  359. package/dist/store/store-fs.js +6 -4
  360. package/dist/store/store-fs.js.map +1 -1
  361. package/dist/writer/context.d.ts +2 -1
  362. package/dist/writer/context.d.ts.map +1 -1
  363. package/dist/writer/context.js +3 -0
  364. package/dist/writer/context.js.map +1 -1
  365. package/dist/writer/doc-tags.d.ts +21 -0
  366. package/dist/writer/doc-tags.d.ts.map +1 -0
  367. package/dist/writer/doc-tags.js +38 -0
  368. package/dist/writer/doc-tags.js.map +1 -0
  369. package/dist/writer/doc.d.ts +3 -1
  370. package/dist/writer/doc.d.ts.map +1 -1
  371. package/dist/writer/doc.js +19 -6
  372. package/dist/writer/doc.js.map +1 -1
  373. package/dist/writer/gtk-doc.d.ts +1 -1
  374. package/dist/writer/gtk-doc.d.ts.map +1 -1
  375. package/dist/writer/gtk-doc.js +64 -15
  376. package/dist/writer/gtk-doc.js.map +1 -1
  377. package/dist/writer/module.d.ts +8 -2
  378. package/dist/writer/module.d.ts.map +1 -1
  379. package/dist/writer/module.js +13 -1
  380. package/dist/writer/module.js.map +1 -1
  381. package/overrides/gdk/rgba.ts.ejs +26 -0
  382. package/overrides/gobject/object.ts.ejs +56 -11
  383. package/overrides/gobject/value.ts.ejs +7 -0
  384. package/overrides/graphene/structs.ts.ejs +55 -0
  385. package/package.json +7 -11
  386. package/src/analysis/descriptor-render.ts +67 -73
  387. package/src/analysis/descriptor.ts +13 -16
  388. package/src/analysis/inheritance.ts +35 -34
  389. package/src/analysis/nul-terminated-bytes.ts +31 -0
  390. package/src/analysis/param-capability.ts +172 -0
  391. package/src/analysis/param-structure.ts +90 -32
  392. package/src/analysis/ts-type.ts +4 -6
  393. package/src/analysis/type-shape.ts +24 -0
  394. package/src/compile.ts +3 -2
  395. package/src/docs/api-reference.ts +162 -28
  396. package/src/docs/element-page.ts +53 -47
  397. package/src/docs/handwritten-props.ts +230 -0
  398. package/src/docs/pipeline.ts +10 -10
  399. package/src/docs/render.ts +153 -39
  400. package/src/docs/symbol-page.ts +230 -80
  401. package/src/fingerprint.ts +8 -14
  402. package/src/gi.ts +4 -11
  403. package/src/gir/ancestry.ts +15 -1
  404. package/src/gir/annotations.ts +37 -0
  405. package/src/gir/callback.ts +2 -0
  406. package/src/gir/class.ts +42 -4
  407. package/src/gir/enum.ts +30 -10
  408. package/src/gir/field.ts +24 -13
  409. package/src/gir/function.ts +15 -0
  410. package/src/gir/gir-path.ts +7 -0
  411. package/src/gir/libraries.ts +23 -2
  412. package/src/gir/library.ts +51 -2
  413. package/src/gir/namespace.ts +41 -5
  414. package/src/gir/parameter.ts +47 -7
  415. package/src/gir/parse.ts +8 -2
  416. package/src/gir/primitives.ts +1 -0
  417. package/src/gir/property.ts +18 -3
  418. package/src/gir/record.ts +24 -2
  419. package/src/gir/size.ts +8 -6
  420. package/src/gir/type-id.ts +51 -7
  421. package/src/gir/type-ref.ts +2 -1
  422. package/src/gir/type.ts +50 -6
  423. package/src/index.ts +18 -16
  424. package/src/internal.ts +2 -0
  425. package/src/jsx.ts +26 -26
  426. package/src/khronos/args.ts +37 -14
  427. package/src/khronos/doc-context.ts +62 -0
  428. package/src/khronos/extensions.ts +85 -0
  429. package/src/khronos/jsdoc.ts +152 -56
  430. package/src/khronos/model.ts +314 -69
  431. package/src/khronos/modules.ts +134 -40
  432. package/src/khronos/notes.ts +74 -0
  433. package/src/khronos/param-pair.ts +1 -1
  434. package/src/khronos/pipeline.ts +95 -42
  435. package/src/khronos/plan.ts +12 -13
  436. package/src/khronos/render.ts +62 -50
  437. package/src/khronos/select.ts +91 -50
  438. package/src/react/element-config.ts +21 -18
  439. package/src/runner.ts +51 -40
  440. package/src/store/compile-store.ts +4 -5
  441. package/src/store/gi/callable-doc.ts +102 -0
  442. package/src/store/gi/callables.ts +23 -17
  443. package/src/store/gi/callback.ts +3 -2
  444. package/src/store/gi/class.ts +6 -3
  445. package/src/store/gi/closure-invocation.ts +26 -0
  446. package/src/store/gi/constant.ts +3 -6
  447. package/src/store/gi/constructor-props.ts +19 -23
  448. package/src/store/gi/doc-spec.ts +38 -0
  449. package/src/store/gi/enum.ts +55 -20
  450. package/src/store/gi/function.ts +44 -26
  451. package/src/store/gi/interface.ts +214 -26
  452. package/src/store/gi/item-comparators.ts +3 -5
  453. package/src/store/gi/method.ts +126 -68
  454. package/src/store/gi/param-marshal.ts +15 -1
  455. package/src/store/gi/pipeline.ts +7 -2
  456. package/src/store/gi/properties.ts +3 -2
  457. package/src/store/gi/property-accessor.ts +14 -11
  458. package/src/store/gi/record-constructor.ts +6 -1
  459. package/src/store/gi/record-field-accessor.ts +9 -13
  460. package/src/store/gi/record-layout.ts +1 -5
  461. package/src/store/gi/record.ts +8 -2
  462. package/src/store/gi/registration.ts +3 -3
  463. package/src/store/gi/return-wrap.ts +5 -5
  464. package/src/store/gi/runtime-override.ts +13 -6
  465. package/src/store/gi/signal.ts +36 -37
  466. package/src/store/gi/value-marshalable.ts +1 -10
  467. package/src/store/gi/vtable.ts +361 -60
  468. package/src/store/gi-store.ts +2 -4
  469. package/src/store/jsx/element-components.ts +8 -11
  470. package/src/store/jsx/element-prop-imports.ts +6 -5
  471. package/src/store/jsx/element-prop-types.ts +10 -2
  472. package/src/store/jsx/generated-elements.ts +60 -0
  473. package/src/store/jsx/intrinsic-elements.ts +4 -0
  474. package/src/store/jsx/jsx.ts +15 -13
  475. package/src/store/jsx/metadata.ts +10 -10
  476. package/src/store/jsx/omitted-props.ts +2 -4
  477. package/src/store/jsx/pipeline.ts +6 -4
  478. package/src/store/jsx/props.ts +22 -9
  479. package/src/store/jsx-store.ts +5 -7
  480. package/src/store/resolve-store.ts +100 -0
  481. package/src/store/store-fs.ts +12 -5
  482. package/src/writer/context.ts +5 -1
  483. package/src/writer/doc-tags.ts +70 -0
  484. package/src/writer/doc.ts +29 -6
  485. package/src/writer/gtk-doc.ts +82 -15
  486. package/src/writer/module.ts +25 -2
@@ -0,0 +1,60 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import type { GlibNamedClass } from "./intrinsic-elements.js";
4
+ import { namespaceDirectory } from "../../gir/namespace.js";
5
+
6
+ /** One element the `@gtkx/jsx` store binds. */
7
+ type GeneratedElement = {
8
+ /** GIR namespace name, such as `"Gtk"`. */
9
+ namespace: string;
10
+ /** Subexport the element is reachable through, such as `"gtk"` in `@gtkx/jsx/gtk`. */
11
+ directory: string;
12
+ /** GLib type name, which is also the JSX tag name, such as `"GtkButton"`. */
13
+ glibName: string;
14
+ /**
15
+ * Whether the element can be rendered. An abstract GType is bound for its props and metadata but
16
+ * exports no component, because `g_object_new` on one is a fatal GObject error.
17
+ */
18
+ isMountable: boolean;
19
+ };
20
+
21
+ const ELEMENTS_FILENAME = "elements.json";
22
+
23
+ const collectGeneratedElements = (intrinsicElements: GlibNamedClass[]): GeneratedElement[] =>
24
+ intrinsicElements
25
+ .map((entry) => ({
26
+ namespace: entry.namespace.name,
27
+ directory: namespaceDirectory(entry.namespace),
28
+ glibName: entry.glibName,
29
+ isMountable: !entry.klass.isAbstract,
30
+ }))
31
+ .toSorted((a, b) => a.glibName.localeCompare(b.glibName));
32
+
33
+ const renderGeneratedElements = (elements: GeneratedElement[]): string =>
34
+ `${JSON.stringify(elements, null, 2)}\n`;
35
+
36
+ /**
37
+ * Reads the inventory of elements the `@gtkx/jsx` store binds, written into the store by codegen. Answers
38
+ * "what does this project's JSX layer cover" without loading the store, which resolves `virtual:` specifiers
39
+ * that only exist inside a Vite or Vitest build.
40
+ *
41
+ * @param jsxStoreDir The jsx store directory, as given by `resolveStore(projectRoot).jsx.storeDir`.
42
+ * @returns Every bound element, sorted by GLib type name, or an empty array when the store has no inventory.
43
+ */
44
+ const readGeneratedElements = (jsxStoreDir: string): GeneratedElement[] => {
45
+ const path = join(jsxStoreDir, ELEMENTS_FILENAME);
46
+
47
+ if (!existsSync(path)) {
48
+ return [];
49
+ }
50
+
51
+ return JSON.parse(readFileSync(path, "utf8")) as GeneratedElement[];
52
+ };
53
+
54
+ export {
55
+ ELEMENTS_FILENAME,
56
+ collectGeneratedElements,
57
+ readGeneratedElements,
58
+ renderGeneratedElements,
59
+ type GeneratedElement,
60
+ };
@@ -4,9 +4,13 @@ import type { Library } from "../../gir/library.js";
4
4
  import type { GirNamespace } from "../../gir/namespace.js";
5
5
  import { ancestorChain } from "../../gir/ancestry.js";
6
6
 
7
+ /** A GIR class paired with the GLib type name it is bound under. */
7
8
  type GlibNamedClass = {
9
+ /** GLib type name, such as `"GtkButton"`, falling back to the C type when the GIR declares none. */
8
10
  glibName: string;
11
+ /** Parsed class the name belongs to. */
9
12
  klass: GirClass;
13
+ /** Namespace declaring the class. */
10
14
  namespace: GirNamespace;
11
15
  };
12
16
 
@@ -3,8 +3,8 @@ import type { GirClass } from "../../gir/class.js";
3
3
  import type { Library } from "../../gir/library.js";
4
4
  import type { GirNamespace } from "../../gir/namespace.js";
5
5
  import type { ImportsBuilder } from "../../writer/imports.js";
6
- import { renderJsDoc } from "../../writer/doc.js";
7
6
  import { renderBlock } from "../../writer/emit.js";
7
+ import { getDoc } from "../gi/doc-spec.js";
8
8
  import { elementPropTypeFor } from "./element-prop-imports.js";
9
9
  import {
10
10
  collectInterfacePropsClasses,
@@ -97,7 +97,9 @@ const generateJsxSection = (
97
97
  const intrinsicElementConsts = namespaceElements.filter((entry) => !excludeNames.has(entry.glibName));
98
98
 
99
99
  const constLines = intrinsicElementConsts.map(
100
- (entry) => `export const ${entry.glibName} = ${sourceStringLiteral(entry.glibName)} as const;`,
100
+ (entry) =>
101
+ `${getDoc(entry.klass)}export const ${entry.glibName} = ` +
102
+ `${sourceStringLiteral(entry.glibName)} as const;`,
101
103
  );
102
104
 
103
105
  const isIntrinsicElementAncestor = (candidate: GirClass): boolean => {
@@ -109,7 +111,7 @@ const generateJsxSection = (
109
111
  addReactBuiltin(imports, "ReactNode");
110
112
  addReactBuiltin(imports, "Ref");
111
113
  const interfaceResult = renderInterfacePropBlocks(library, targetNamespace.name, options);
112
- let isNeedsReactElement = interfaceResult.needsReactElement;
114
+ let requiresReactElement = interfaceResult.requiresReactElement;
113
115
  const propBlocks: string[] = [...interfaceResult.blocks];
114
116
 
115
117
  const blockContext: RenderPropBlockContext = {
@@ -124,18 +126,18 @@ const generateJsxSection = (
124
126
  const { block, objectPropNames } = renderPropBlock(library, entry, blockContext);
125
127
 
126
128
  if (objectPropNames.length > 0) {
127
- isNeedsReactElement = true;
129
+ requiresReactElement = true;
128
130
  }
129
131
 
130
132
  propBlocks.push(block);
131
133
  }
132
134
 
133
- if (isNeedsReactElement) {
135
+ if (requiresReactElement) {
134
136
  addReactBuiltin(imports, "ReactElement");
135
137
  }
136
138
 
137
139
  const source = [
138
- constLines.join("\n"),
140
+ constLines.join("\n\n"),
139
141
  "",
140
142
  propBlocks.join("\n\n"),
141
143
  "",
@@ -152,11 +154,11 @@ const renderInterfacePropBlocks = (
152
154
  library: Library,
153
155
  targetNamespaceName: string,
154
156
  options: GenerateJsxOptions,
155
- ): { blocks: string[]; needsReactElement: boolean; hasContainerProps: HasContainerProps } => {
157
+ ): { blocks: string[]; requiresReactElement: boolean; hasContainerProps: HasContainerProps } => {
156
158
  const { imports, intrinsicElements } = options;
157
159
  const context: InterfaceBlockContext = { library, targetNamespaceName, imports, hasContainerProps };
158
160
  const blocks: string[] = [];
159
- let isNeedsReactElement = false;
161
+ let requiresReactElement = false;
160
162
 
161
163
  for (const iface of collectInterfacePropsClasses(
162
164
  library,
@@ -173,13 +175,13 @@ const renderInterfacePropBlocks = (
173
175
  const { block, objectPropNames } = renderInterfacePropsBlock(iface, glibName, context);
174
176
 
175
177
  if (objectPropNames.length > 0) {
176
- isNeedsReactElement = true;
178
+ requiresReactElement = true;
177
179
  }
178
180
 
179
181
  blocks.push(block);
180
182
  }
181
183
 
182
- return { blocks, needsReactElement: isNeedsReactElement, hasContainerProps };
184
+ return { blocks, requiresReactElement, hasContainerProps };
183
185
  };
184
186
 
185
187
  const registerCrossNsProps = (
@@ -285,7 +287,7 @@ const renderInterfacePropsBlock = (
285
287
  addGiNamespace(imports, iface.namespace.name, giNamespaceAlias(iface.namespace.name));
286
288
  const selfDefault = `${giNamespaceAlias(iface.namespace.name)}.${iface.klass.name}`;
287
289
  const signature = `export interface ${glib}Props<Self = ${selfDefault}>${extendsClause}`;
288
- const block = `${renderJsDoc(iface.klass.doc)}${renderBlock(signature, ownerLines.join("\n"))}`;
290
+ const block = `${getDoc(iface.klass)}${renderBlock(signature, ownerLines.join("\n"))}`;
289
291
 
290
292
  return { block, objectPropNames };
291
293
  };
@@ -293,7 +295,7 @@ const renderInterfacePropsBlock = (
293
295
  const renderJsxAugmentation = (namespaceElements: GlibNamedClass[]): string => {
294
296
  const elementLines = namespaceElements
295
297
  .filter((entry) => !entry.klass.isAbstract)
296
- .map((entry) => `${entry.glibName}: ${entry.glibName}Props;`)
298
+ .map((entry) => `${getDoc(entry.klass)}${entry.glibName}: ${entry.glibName}Props;`)
297
299
  .join("\n");
298
300
 
299
301
  const intrinsicInterface = renderBlock("interface IntrinsicElements", elementLines);
@@ -324,7 +326,7 @@ const renderPropBlock = (
324
326
  const extendsClause = extendsList.length === 0 ? "" : ` extends ${extendsList.join(", ")}`;
325
327
  const selfDefault = `${giNamespaceAlias(entry.namespace.name)}.${entry.klass.name}`;
326
328
 
327
- const block = `${renderJsDoc(entry.klass.doc)}${renderBlock(
329
+ const block = `${getDoc(entry.klass)}${renderBlock(
328
330
  `export interface ${entry.glibName}Props<Self = ${selfDefault}>${extendsClause}`,
329
331
  ownerLines.join("\n"),
330
332
  )}`;
@@ -23,7 +23,7 @@ type IntrinsicElementEntry = {
23
23
  };
24
24
 
25
25
  type PropNameCollector = {
26
- keep: (property: GirProperty) => boolean;
26
+ shouldKeep: (property: GirProperty) => boolean;
27
27
  seen: Set<string>;
28
28
  names: string[];
29
29
  };
@@ -57,10 +57,10 @@ const generateMetadata = (library: Library): string => {
57
57
  .map(({ glibName, defaults }) => ` "${glibName}": ${renderDefaultsObject(defaults)},`);
58
58
 
59
59
  return `${[
60
- `export const SIGNALS: Record<string, Record<string, string>> = {\n${signalsEntries.join("\n")}\n};`,
61
- `export const CONSTRUCT_ONLY_PROPS: Record<string, Set<string>> = {\n${constructOnlyEntries.join("\n")}\n};`,
62
- `export const CONSTRUCT_PROPS: Record<string, Set<string>> = {\n${constructableEntries.join("\n")}\n};`,
63
- `export const DEFAULT_PROPS: Record<string, Record<string, unknown>> = {\n${defaultsEntries.join("\n")}\n};`,
60
+ `export const signals: Record<string, Record<string, string>> = {\n${signalsEntries.join("\n")}\n};`,
61
+ `export const constructOnlyProps: Record<string, Set<string>> = {\n${constructOnlyEntries.join("\n")}\n};`,
62
+ `export const constructProps: Record<string, Set<string>> = {\n${constructableEntries.join("\n")}\n};`,
63
+ `export const defaultProps: Record<string, Record<string, unknown>> = {\n${defaultsEntries.join("\n")}\n};`,
64
64
  ].join("\n\n")}\n`;
65
65
  };
66
66
 
@@ -114,10 +114,10 @@ const collectSignals = (sources: GirClass[]): [string, string][] => {
114
114
  };
115
115
 
116
116
  const collectPropNamesFromSource = (source: GirClass, collector: PropNameCollector): void => {
117
- const { keep, seen, names } = collector;
117
+ const { shouldKeep, seen, names } = collector;
118
118
 
119
119
  for (const property of source.properties) {
120
- if (!keep(property)) {
120
+ if (!shouldKeep(property)) {
121
121
  continue;
122
122
  }
123
123
 
@@ -133,7 +133,7 @@ const collectPropNamesFromSource = (source: GirClass, collector: PropNameCollect
133
133
  };
134
134
 
135
135
  const collectPropNames = (sources: GirClass[], shouldKeep: (property: GirProperty) => boolean): string[] => {
136
- const collector: PropNameCollector = { keep: shouldKeep, seen: new Set<string>(), names: [] };
136
+ const collector: PropNameCollector = { shouldKeep, seen: new Set<string>(), names: [] };
137
137
 
138
138
  for (const source of sources) {
139
139
  collectPropNamesFromSource(source, collector);
@@ -362,9 +362,9 @@ const primitiveDefaultLiteral = (category: PrimitiveCategory, raw: string): stri
362
362
  };
363
363
 
364
364
  const bigintDefaultLiteral = (raw: string): string | undefined => {
365
- const trimmed = raw.trim();
365
+ const integer = integerDefaultLiteral(raw);
366
366
 
367
- return INTEGER_PATTERN.test(trimmed) ? `${trimmed}n` : undefined;
367
+ return integer === undefined ? undefined : `${integer}n`;
368
368
  };
369
369
 
370
370
  const enumDefaultLiteral = (enumType: GirEnum, raw: string): string | undefined => {
@@ -3,7 +3,6 @@ type OmittedProps = Record<string, string[]>;
3
3
 
4
4
  const omittedProps: Map<string, Set<string>> = new Map();
5
5
 
6
- /** Installs the props each element omits (GLib type name → prop names); set once per run. */
7
6
  const setOmittedProps = (props: OmittedProps): void => {
8
7
  omittedProps.clear();
9
8
 
@@ -12,12 +11,11 @@ const setOmittedProps = (props: OmittedProps): void => {
12
11
  }
13
12
  };
14
13
 
15
- /** Whether the element config declares this prop omitted for the type that declares the property. */
16
14
  const isOmittedProp = (glibName: string | undefined, jsName: string): boolean =>
17
15
  glibName !== undefined && omittedProps.get(glibName)?.has(jsName) === true;
18
16
 
19
17
  /** Merges omitted-prop maps keyed by GLib type name, concatenating the names each map contributes. */
20
- const mergeOmitProps = (...maps: OmittedProps[]): OmittedProps => {
18
+ const mergeOmittedProps = (...maps: OmittedProps[]): OmittedProps => {
21
19
  const merged: OmittedProps = {};
22
20
 
23
21
  for (const map of maps) {
@@ -29,4 +27,4 @@ const mergeOmitProps = (...maps: OmittedProps[]): OmittedProps => {
29
27
  return merged;
30
28
  };
31
29
 
32
- export { setOmittedProps, isOmittedProp, mergeOmitProps, type OmittedProps };
30
+ export { setOmittedProps, isOmittedProp, mergeOmittedProps, type OmittedProps };
@@ -5,6 +5,7 @@ import { ImportsBuilder } from "../../writer/imports.js";
5
5
  import { type ElementComponentOverrides, generateElementComponentsSection } from "./element-components.js";
6
6
  import { type ElementProps, setElementProps } from "./element-prop-imports.js";
7
7
  import { type LazyElementSpec, lazyElementSpecs } from "./element-prop-types.js";
8
+ import { collectGeneratedElements, type GeneratedElement } from "./generated-elements.js";
8
9
  import { buildGirIndex } from "./gir-index.js";
9
10
  import { collectIntrinsicElementClasses, type GlibNamedClass } from "./intrinsic-elements.js";
10
11
  import { generateJsxSection } from "./jsx.js";
@@ -20,13 +21,14 @@ type JsxFiles = {
20
21
  namespaces: JsxNamespaceFile[];
21
22
  metadata: string;
22
23
  intrinsicElementCount: number;
24
+ elements: GeneratedElement[];
23
25
  };
24
26
 
25
27
  type JsxGenerationOptions = {
26
28
  reactSubexports?: string[];
27
29
  components?: ElementComponentOverrides;
28
30
  props?: ElementProps;
29
- omitProps?: OmittedProps;
31
+ omittedProps?: OmittedProps;
30
32
  lazyElements?: string[];
31
33
  };
32
34
 
@@ -49,7 +51,7 @@ type JsxNamespaceContext = {
49
51
 
50
52
  const generateJsxFiles = (library: Library, options: JsxGenerationOptions = {}): JsxFiles => {
51
53
  setElementProps(options.props ?? {});
52
- setOmittedProps(options.omitProps ?? {});
54
+ setOmittedProps(options.omittedProps ?? {});
53
55
  const intrinsicElements = collectIntrinsicElementClasses(library);
54
56
  const intrinsicElementByGlibName = new Map(intrinsicElements.map((entry) => [entry.glibName, entry]));
55
57
  const girIndex = buildGirIndex(library);
@@ -66,7 +68,7 @@ const generateJsxFiles = (library: Library, options: JsxGenerationOptions = {}):
66
68
 
67
69
  const metadata = generateMetadata(library);
68
70
 
69
- return { namespaces, metadata, intrinsicElementCount };
71
+ return { namespaces, metadata, intrinsicElementCount, elements: collectGeneratedElements(intrinsicElements) };
70
72
  };
71
73
 
72
74
  const orderedIntrinsicNamespaces = (intrinsicElements: GlibNamedClass[]): GirNamespace[] => {
@@ -145,4 +147,4 @@ const generateJsxNamespace = (
145
147
  return { source: `${body.join("\n")}\n`, count };
146
148
  };
147
149
 
148
- export { generateJsxFiles, type JsxNamespaceFile, type JsxGenerationOptions };
150
+ export { generateJsxFiles, type JsxNamespaceFile };
@@ -4,11 +4,13 @@ import type { Library } from "../../gir/library.js";
4
4
  import type { GirNamespace } from "../../gir/namespace.js";
5
5
  import type { GirCallable } from "../../gir/parameter.js";
6
6
  import type { TypeId } from "../../gir/type-id.js";
7
+ import type { JsDocSpec } from "../../writer/doc.js";
7
8
  import { forEachAncestor } from "../../analysis/inheritance.js";
8
9
  import { renderHandlerParameters, renderHandlerResultType } from "../../analysis/param-structure.js";
9
10
  import { recordTypeTarget, renderBaseType, type TsTypeTarget } from "../../analysis/ts-type.js";
10
11
  import { type GirProperty, isConstructableProperty } from "../../gir/property.js";
11
12
  import { renderJsDoc } from "../../writer/doc.js";
13
+ import { annotationSpec, selfHandlerSpec } from "../gi/doc-spec.js";
12
14
  import { getGlibName, giNamespaceAlias, isIntrinsicElementClass, signalHandlerName } from "./intrinsic-elements.js";
13
15
  import { isOmittedProp } from "./omitted-props.js";
14
16
 
@@ -67,9 +69,18 @@ type IntrinsicElementMemberWalk = IntrinsicElementScope & {
67
69
  acceptSignal: (signal: GirCallable) => void;
68
70
  };
69
71
 
72
+ const notifyDoc = (property: GirProperty, jsName: string, spec: JsDocSpec): string => {
73
+ const note = `Called with the new value when \`${jsName}\` changes.`;
74
+ const doc = property.doc;
75
+ const text = doc === undefined || doc.length === 0 ? note : `${note}\n\n${doc}`;
76
+
77
+ return renderJsDoc(text, undefined, spec);
78
+ };
79
+
70
80
  const appendPropertyLines = (state: PropCollectorState, property: GirProperty, jsName: string): void => {
71
81
  const tsType = renderReactPropType(state.types, property.type, false);
72
- const doc = renderJsDoc(property.doc);
82
+ const spec = annotationSpec(property.annotations);
83
+ const doc = renderJsDoc(property.doc, undefined, spec);
73
84
 
74
85
  if (isObjectProp(state.owner.library, property)) {
75
86
  state.propLines.push(`${doc}${jsName}?: ${tsType} | ReactElement | null | undefined;`);
@@ -78,14 +89,15 @@ const appendPropertyLines = (state: PropCollectorState, property: GirProperty, j
78
89
  return;
79
90
  }
80
91
 
81
- const isSettable = isConstructableProperty(property);
82
-
83
- if (isSettable) {
92
+ if (isConstructableProperty(property)) {
84
93
  state.propLines.push(`${doc}${jsName}?: ${tsType} | null | undefined;`);
85
94
  }
86
95
 
87
96
  const handlerType = `((value: ${tsType} | null, self: Self) => void) | null | undefined`;
88
- state.propLines.push(`${isSettable ? "" : doc}onNotify${upperFirst(jsName)}?: ${handlerType};`);
97
+
98
+ state.propLines.push(
99
+ `${notifyDoc(property, jsName, spec)}onNotify${upperFirst(jsName)}?: ${handlerType};`,
100
+ );
89
101
  };
90
102
 
91
103
  const acceptCollectorProperty = (state: PropCollectorState, property: GirProperty): void => {
@@ -112,7 +124,8 @@ const acceptCollectorSignal = (state: PropCollectorState, signal: GirCallable):
112
124
 
113
125
  state.seen.add(handlerName);
114
126
  const signature = renderSignalHandler({ types: state.types, signal, selfType: "Self" });
115
- state.propLines.push(`${renderJsDoc(signal.doc)}${handlerName}?: (${signature}) | undefined;`);
127
+ const doc = renderJsDoc(signal.doc, undefined, selfHandlerSpec(signal));
128
+ state.propLines.push(`${doc}${handlerName}?: (${signature}) | undefined;`);
116
129
  };
117
130
 
118
131
  const createPropEntryCollector = (owner: IntrinsicElementScope): PropEntryCollector => {
@@ -231,8 +244,8 @@ const renderSignalHandler = (options: SignalRenderOptions): string => {
231
244
  library: types.library,
232
245
  signal,
233
246
  renderType: (ref, nullable) => renderReactPropType(types, ref, nullable),
234
- includeCallerAllocated: false,
235
- optOut: true,
247
+ shouldIncludeCallerAllocated: false,
248
+ isOptOut: true,
236
249
  });
237
250
 
238
251
  return `(${params.join(", ")}) => ${result}`;
@@ -259,4 +272,4 @@ const renderReactPropType = (context: PropTypeRenderContext, ref: TypeId | undef
259
272
  return isNullable ? `${base} | null` : base;
260
273
  };
261
274
 
262
- export { buildElementPropsEntries, buildInterfacePropsEntries, isObjectProp, reactTarget };
275
+ export { buildElementPropsEntries, buildInterfacePropsEntries, isObjectProp };
@@ -2,13 +2,11 @@ import type { JsxNamespaceFile } from "./jsx/pipeline.js";
2
2
  import type { RawFile } from "./store-fs.js";
3
3
  import { buildManifest, type StoreOptions, subpathExport, writeStore } from "./store-fs.js";
4
4
 
5
- type JsxStoreOptions = StoreOptions;
6
-
7
5
  const writeJsxStore = (
8
- options: JsxStoreOptions,
6
+ options: StoreOptions,
9
7
  namespaces: JsxNamespaceFile[],
10
8
  metadata: string,
11
- fingerprint: RawFile,
9
+ rawFiles: RawFile[],
12
10
  ): void => {
13
11
  const exportsMap: Record<string, unknown> = {
14
12
  "./metadata": subpathExport("metadata"),
@@ -31,9 +29,9 @@ const writeJsxStore = (
31
29
  exports: exportsMap,
32
30
  peerDependencies: { "@gtkx/gi": "*", "@gtkx/react": "*", react: "*" },
33
31
  }),
34
- rawFiles: [fingerprint],
35
- configEnv: true,
32
+ rawFiles,
33
+ requiresEnvReference: true,
36
34
  });
37
35
  };
38
36
 
39
- export { writeJsxStore, type JsxStoreOptions };
37
+ export { writeJsxStore };
@@ -0,0 +1,100 @@
1
+ import { existsSync, readFileSync, realpathSync } from "node:fs";
2
+ import { dirname, join, parse } from "node:path";
3
+ import type { StoreOptions } from "./store-fs.js";
4
+
5
+ /**
6
+ * Where a project's generated stores live, ready to spread into `runCodegen`. `jsx` is null when the
7
+ * project has no `@gtkx/react` installed, in which case only the `@gtkx/gi` store can be generated.
8
+ */
9
+ type ResolvedStore = {
10
+ /** Where the `@gtkx/gi` store goes, versioned by the installed `@gtkx/runtime`. */
11
+ gi: StoreOptions;
12
+ /** Where the `@gtkx/jsx` store goes, versioned by the installed `@gtkx/react`; null when it is absent. */
13
+ jsx: StoreOptions | null;
14
+ /** Subexport names of the installed `@gtkx/react`, empty when it is absent. */
15
+ reactSubexports: string[];
16
+ };
17
+
18
+ type ResolvedPackage = { dir: string; version: string };
19
+
20
+ const STORE_DIR = ".gtkx";
21
+ const SCOPE = "@gtkx";
22
+
23
+ const readManifest = (path: string): { version?: string; exports?: Record<string, unknown> } =>
24
+ JSON.parse(readFileSync(path, "utf8")) as { version?: string; exports?: Record<string, unknown> };
25
+
26
+ const subexportNames = (packageDir: string): string[] =>
27
+ Object.keys(readManifest(join(packageDir, "package.json")).exports ?? {})
28
+ .filter((key) => key.startsWith("./") && key !== "./package.json")
29
+ .map((key) => key.slice(2));
30
+
31
+ const loadPackage = (manifest: string): ResolvedPackage | null => {
32
+ if (!existsSync(manifest)) {
33
+ return null;
34
+ }
35
+
36
+ const real = realpathSync(manifest);
37
+
38
+ return { dir: dirname(real), version: readManifest(real).version ?? "0.0.0" };
39
+ };
40
+
41
+ const nodeModulesChain = function* (projectRoot: string): Generator<string> {
42
+ const { root } = parse(projectRoot);
43
+ let current = projectRoot;
44
+
45
+ while (current !== root) {
46
+ yield join(current, "node_modules");
47
+ current = dirname(current);
48
+ }
49
+
50
+ yield join(root, "node_modules");
51
+ };
52
+
53
+ const resolvePackage = (projectRoot: string, packageName: string): ResolvedPackage | null => {
54
+ for (const nodeModules of nodeModulesChain(projectRoot)) {
55
+ const found = loadPackage(join(nodeModules, packageName, "package.json"));
56
+
57
+ if (found !== null) {
58
+ return found;
59
+ }
60
+ }
61
+
62
+ return loadPackage(join(projectRoot, "packages", packageName.replace(/^@[^/]+\//, ""), "package.json"));
63
+ };
64
+
65
+ const storeOptions = (nodeModules: string, name: string, version: string): StoreOptions => ({
66
+ storeDir: join(nodeModules, STORE_DIR, name),
67
+ linkDir: join(nodeModules, SCOPE, name),
68
+ version,
69
+ });
70
+
71
+ /**
72
+ * Resolves where a project's `@gtkx/gi` and `@gtkx/jsx` stores belong, from the project root alone. The
73
+ * result supplies every `runCodegen` input except `libraries` and `girPath`, so a caller that has
74
+ * already resolved those can spread it straight into the call.
75
+ *
76
+ * Store versions come from the installed `@gtkx/runtime` and `@gtkx/react`, so a dependency upgrade
77
+ * invalidates the stores. Pass explicit `gi` or `jsx` options to `runCodegen` to override any of it.
78
+ *
79
+ * @param projectRoot Directory holding the project's `package.json` and `node_modules`.
80
+ * @returns The store locations and the React subexports that shape the jsx store.
81
+ * @throws If `@gtkx/runtime` cannot be resolved from the project.
82
+ */
83
+ const resolveStore = (projectRoot: string): ResolvedStore => {
84
+ const runtime = resolvePackage(projectRoot, "@gtkx/runtime");
85
+
86
+ if (runtime === null) {
87
+ throw new Error(`Cannot resolve @gtkx/runtime from ${projectRoot}; is it installed?`);
88
+ }
89
+
90
+ const react = resolvePackage(projectRoot, "@gtkx/react");
91
+ const nodeModules = join(projectRoot, "node_modules");
92
+
93
+ return {
94
+ gi: storeOptions(nodeModules, "gi", runtime.version),
95
+ jsx: react === null ? null : storeOptions(nodeModules, "jsx", react.version),
96
+ reactSubexports: react === null ? [] : subexportNames(react.dir),
97
+ };
98
+ };
99
+
100
+ export { resolveStore, type ResolvedStore };
@@ -1,10 +1,14 @@
1
- import { existsSync, mkdirSync, mkdtempSync, renameSync, rmSync, symlinkSync, writeFileSync } from "node:fs";
1
+ import { chmodSync, existsSync, mkdirSync, mkdtempSync, renameSync, rmSync, symlinkSync, writeFileSync } from "node:fs";
2
2
  import { dirname, join, relative } from "node:path";
3
3
  import { compileStore } from "./compile-store.js";
4
4
 
5
+ /** Where one generated store is written and how it is reached. */
5
6
  type StoreOptions = {
7
+ /** Directory the generated package is written to, replaced atomically on each run. */
6
8
  storeDir: string;
9
+ /** Path the store is symlinked at, which is the specifier's resolution target under `node_modules`. */
7
10
  linkDir: string;
11
+ /** Version stamped on the store's `package.json`, taken from the dependency the store is generated for. */
8
12
  version: string;
9
13
  };
10
14
 
@@ -37,9 +41,11 @@ type WriteStoreParams = {
37
41
  files: StoreFile[];
38
42
  manifest: Manifest;
39
43
  rawFiles?: RawFile[];
40
- configEnv?: boolean;
44
+ requiresEnvReference?: boolean;
41
45
  };
42
46
 
47
+ const STORE_DIR_MODE = 0o755;
48
+
43
49
  const subpathExport = (stem: string): { types: string; default: string } => ({
44
50
  types: `./${stem}.d.ts`,
45
51
  default: `./${stem}.js`,
@@ -73,7 +79,7 @@ const writeStore = (params: WriteStoreParams): void => {
73
79
  storeDir: tmp,
74
80
  files: params.files,
75
81
  packageName: params.manifest.name,
76
- ...(params.configEnv !== undefined && { configEnv: params.configEnv }),
82
+ ...(params.requiresEnvReference !== undefined && { requiresEnvReference: params.requiresEnvReference }),
77
83
  });
78
84
 
79
85
  writePackageJson(tmp, params.manifest);
@@ -83,7 +89,6 @@ const writeStore = (params: WriteStoreParams): void => {
83
89
  writeFileSync(join(tmp, raw.relativePath), raw.content);
84
90
  }
85
91
 
86
- symlinkRelative(join(tmp, "node_modules", ...params.manifest.name.split("/")), tmp);
87
92
  swapStore(tmp, params.storeDir, params.linkDir);
88
93
  } finally {
89
94
  rmSync(tmp, { recursive: true, force: true });
@@ -121,8 +126,10 @@ const swapStore = (tmp: string, storeDir: string, visibleLink: string): void =>
121
126
 
122
127
  const createTempStore = (storeDir: string): string => {
123
128
  mkdirSync(dirname(storeDir), { recursive: true });
129
+ const tmp = mkdtempSync(`${storeDir}.tmp-`);
130
+ chmodSync(tmp, STORE_DIR_MODE);
124
131
 
125
- return mkdtempSync(`${storeDir}.tmp-`);
132
+ return tmp;
126
133
  };
127
134
 
128
135
  export { subpathExport, buildManifest, writeStore, type StoreOptions, type RawFile };
@@ -1,6 +1,6 @@
1
1
  import type { Library } from "../gir/library.js";
2
2
  import type { GirNamespace } from "../gir/namespace.js";
3
- import { ModuleBuilder } from "./module.js";
3
+ import { type DeclaredType, ModuleBuilder } from "./module.js";
4
4
 
5
5
  class ModuleContext {
6
6
  public module: ModuleBuilder = new ModuleBuilder();
@@ -55,6 +55,10 @@ class ModuleContext {
55
55
  return namespaceName;
56
56
  }
57
57
 
58
+ declaredType(owner: string, name: string = owner): DeclaredType {
59
+ return { name, owner: `${this.namespace.name}.${owner}` };
60
+ }
61
+
58
62
  qualify(namespaceName: string, typeName: string): string {
59
63
  if (namespaceName === this.namespace.name) {
60
64
  return typeName;