@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,32 +1,32 @@
1
+ import { sortStringsBy } from "@gtkx/utils";
1
2
  import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
2
3
  import { dirname, join } from "node:path";
3
- import type { ElementProp } from "@gtkx/config";
4
- import { sortStringsBy } from "@gtkx/utils";
5
- import { computeFingerprint, FINGERPRINT_FILENAME, isStoreFresh } from "../fingerprint.js";
4
+ import { computeGiFingerprint, FINGERPRINT_FILENAME, isGiStoreFresh } from "../fingerprint.js";
6
5
  import { Library } from "../gir/library.js";
7
6
  import { namespaceDirectory } from "../gir/namespace.js";
8
- import { collectIntrinsicElementClasses, type GlibNamedClass } from "../store/react/intrinsic-elements.js";
9
- import { createElementPageContext, renderElementPage } from "./element-page.js";
7
+ import { type ElementProps, setElementProps } from "../store/jsx/element-prop-imports.js";
8
+ import { collectIntrinsicElementClasses, type GlibNamedClass } from "../store/jsx/intrinsic-elements.js";
9
+ import { createElementPageContext, type ElementPageContext, renderElementPage } from "./element-page.js";
10
10
  import { elementSlug, firstSentence, namespaceOrder } from "./render.js";
11
11
 
12
- export type DocsElementLink = {
12
+ type DocsElementLink = {
13
13
  text: string;
14
14
  link: string;
15
15
  };
16
16
 
17
- export type DocsNamespace = {
17
+ type DocsNamespace = {
18
18
  name: string;
19
19
  directory: string;
20
20
  link: string;
21
21
  elements: DocsElementLink[];
22
22
  };
23
23
 
24
- export type DocsOptions = {
24
+ type DocsOptions = {
25
25
  libraries: string[];
26
26
  girPath: string[];
27
27
  outDir: string;
28
28
  basePath?: string;
29
- elementProps?: Record<string, ElementProp[]>;
29
+ props?: ElementProps;
30
30
  force?: boolean;
31
31
  };
32
32
 
@@ -34,22 +34,42 @@ type DocsManifest = {
34
34
  namespaces: DocsNamespace[];
35
35
  };
36
36
 
37
+ type GeneratedDocs = {
38
+ pages: { path: string; content: string }[];
39
+ namespaces: DocsNamespace[];
40
+ };
41
+
42
+ type Page = { path: string; content: string };
43
+ type NamespacePages = { docs: DocsNamespace; pages: Page[] };
44
+
45
+ type DocsResult = {
46
+ regenerated: boolean;
47
+ namespaces: DocsNamespace[];
48
+ };
49
+
37
50
  const MANIFEST_FILENAME = "manifest.json";
38
51
 
39
52
  const namespaceIndexPage = (namespace: DocsNamespace, elements: GlibNamedClass[]): string => {
40
53
  const rows = elements.map((entry, index) => {
41
54
  const link = namespace.elements[index]?.link ?? "";
42
- const description = firstSentence(entry.klass.doc).replaceAll("|", "\\|");
55
+ const description = firstSentence(entry.klass.doc).replaceAll("|", String.raw`\|`);
56
+
43
57
  return `| [${entry.glibName}](${link}) | ${description} |`;
44
58
  });
59
+
60
+ const description =
61
+ `Reference pages for the ${String(namespace.elements.length)} JSX elements in ` +
62
+ `the ${namespace.name} namespace.`;
63
+
45
64
  return [
46
65
  "---",
47
- `description: ${JSON.stringify(`Reference pages for the ${namespace.elements.length} JSX elements in the ${namespace.name} namespace.`)}`,
66
+ `description: ${JSON.stringify(description)}`,
48
67
  "---",
49
68
  "",
50
69
  `# ${namespace.name} elements`,
51
70
  "",
52
- `Elements in this namespace are imported from \`@gtkx/jsx/${namespace.directory}\`; the matching classes, enums, and functions are imported from \`@gtkx/gi/${namespace.directory}\`.`,
71
+ `Elements in this namespace are imported from \`@gtkx/jsx/${namespace.directory}\`; the matching ` +
72
+ `classes, enums, and functions are imported from \`@gtkx/gi/${namespace.directory}\`.`,
53
73
  "",
54
74
  "| Element | Description |",
55
75
  "| --- | --- |",
@@ -60,21 +80,27 @@ const namespaceIndexPage = (namespace: DocsNamespace, elements: GlibNamedClass[]
60
80
 
61
81
  const rootIndexPage = (namespaces: DocsNamespace[], libraries: string[]): string => {
62
82
  const rows = namespaces.map(
63
- (ns) => `| [${ns.name}](${ns.link}) | \`@gtkx/jsx/${ns.directory}\` | ${ns.elements.length} |`,
83
+ (ns) => `| [${ns.name}](${ns.link}) | \`@gtkx/jsx/${ns.directory}\` | ${String(ns.elements.length)} |`,
64
84
  );
85
+
65
86
  const librariesList = libraries.map((library) => `\`${library}\``).join(", ");
87
+
66
88
  return [
67
89
  "---",
68
- `description: "Generated reference documentation for every JSX element in this project's GIR libraries."`,
90
+ "description: \"Generated reference documentation for every JSX element in this project's GIR libraries.\"",
69
91
  "---",
70
92
  "",
71
93
  "# Element Reference",
72
94
  "",
73
- `This reference documents every JSX element generated from the GObject-Introspection data for ${librariesList}, together with the namespaces they pull in. It is produced by \`gtkx docs\` using the same pipeline that generates the \`@gtkx/jsx\` and \`@gtkx/gi\` bindings, so every page matches the types your editor sees.`,
95
+ "This reference documents every JSX element generated from the GObject-Introspection data for " +
96
+ `${librariesList}, together with the namespaces they pull in. It is produced by \`gtkx docs\` ` +
97
+ "using the same pipeline that generates the `@gtkx/jsx` and `@gtkx/gi` bindings, so every page " +
98
+ "matches the types your editor sees.",
74
99
  "",
75
100
  "Each element page lists:",
76
101
  "",
77
- "- **Props** derived from GObject properties, plus the element props GTKX adds (such as `children` and named slots), with types, defaults, and upstream documentation.",
102
+ "- **Props** derived from GObject properties, plus the element props GTKX adds (such as `children` " +
103
+ "and named slots), with types, defaults, and upstream documentation.",
78
104
  "- **Signals** as `on<Signal>` handler props with their exact handler signatures.",
79
105
  "- **Methods** available on the underlying instance through the `ref` prop.",
80
106
  "",
@@ -87,96 +113,129 @@ const rootIndexPage = (namespaces: DocsNamespace[], libraries: string[]): string
87
113
  ].join("\n");
88
114
  };
89
115
 
90
- type GeneratedDocs = {
91
- pages: { path: string; content: string }[];
92
- namespaces: DocsNamespace[];
93
- };
94
-
95
- const generatePages = (options: DocsOptions, basePath: string, library: Library): GeneratedDocs => {
96
- const intrinsicElements = collectIntrinsicElementClasses(library);
116
+ const groupElementsByNamespace = (elements: GlibNamedClass[]): Map<string, GlibNamedClass[]> => {
117
+ const byNamespace: Map<string, GlibNamedClass[]> = new Map();
97
118
 
98
- const byNamespace = new Map<string, GlibNamedClass[]>();
99
- for (const entry of intrinsicElements) {
119
+ for (const entry of elements) {
100
120
  const list = byNamespace.get(entry.namespace.name) ?? [];
101
121
  list.push(entry);
102
122
  byNamespace.set(entry.namespace.name, list);
103
123
  }
104
124
 
105
- const linkByGlibName = new Map<string, string>();
106
- for (const entry of intrinsicElements) {
125
+ return byNamespace;
126
+ };
127
+
128
+ const buildElementLinks = (elements: GlibNamedClass[], basePath: string): Map<string, string> => {
129
+ const linkByGlibName: Map<string, string> = new Map();
130
+
131
+ for (const entry of elements) {
107
132
  const directory = namespaceDirectory(entry.namespace);
108
- const slug = elementSlug(entry.klass.name);
109
- const link = `${basePath}/${directory}/${slug}`;
110
- const existing = [...linkByGlibName.values()].includes(link);
111
- if (existing) throw new Error(`Docs page slug collision for ${entry.glibName} at ${link}`);
133
+ const link = `${basePath}/${directory}/${elementSlug(entry.klass.name)}`;
134
+
135
+ if (linkByGlibName.values().some((existing) => existing === link)) {
136
+ throw new Error(`Docs page slug collision for ${entry.glibName} at ${link}`);
137
+ }
138
+
112
139
  linkByGlibName.set(entry.glibName, link);
113
140
  }
114
141
 
115
- const pageContext = createElementPageContext(library, options.elementProps ?? {}, (glibName) =>
116
- linkByGlibName.get(glibName),
117
- );
142
+ return linkByGlibName;
143
+ };
118
144
 
119
- const pages: { path: string; content: string }[] = [];
145
+ const namespacePages = (input: {
146
+ name: string;
147
+ elements: GlibNamedClass[];
148
+ basePath: string;
149
+ linkByGlibName: Map<string, string>;
150
+ pageContext: ElementPageContext;
151
+ }): NamespacePages => {
152
+ const { name, elements, basePath, linkByGlibName, pageContext } = input;
153
+ const directory = name.toLowerCase();
154
+
155
+ const docs: DocsNamespace = {
156
+ name,
157
+ directory,
158
+ link: `${basePath}/${directory}/`,
159
+ elements: elements.map((entry) => ({ text: entry.glibName, link: linkByGlibName.get(entry.glibName) ?? "" })),
160
+ };
161
+
162
+ const pages: Page[] = elements.map((entry) => ({
163
+ path: `${directory}/${elementSlug(entry.klass.name)}.md`,
164
+ content: renderElementPage(entry, pageContext),
165
+ }));
166
+
167
+ pages.push({ path: `${directory}/index.md`, content: namespaceIndexPage(docs, elements) });
168
+
169
+ return { docs, pages };
170
+ };
171
+
172
+ const generatePages = (options: DocsOptions, basePath: string, library: Library): GeneratedDocs => {
173
+ const intrinsicElements = collectIntrinsicElementClasses(library);
174
+ const byNamespace = groupElementsByNamespace(intrinsicElements);
175
+ const linkByGlibName = buildElementLinks(intrinsicElements, basePath);
176
+ const pageContext = createElementPageContext(library, (glibName: string) => linkByGlibName.get(glibName));
177
+ const pages: Page[] = [];
120
178
  const namespaces: DocsNamespace[] = [];
121
- const orderedNames = sortStringsBy([...byNamespace.keys()], namespaceOrder);
179
+ const orderedNames = sortStringsBy(byNamespace.keys(), namespaceOrder);
180
+
122
181
  for (const name of orderedNames) {
123
182
  const elements = sortStringsBy(byNamespace.get(name) ?? [], (entry) => entry.glibName);
124
- const directory = name.toLowerCase();
125
- const namespaceDocs: DocsNamespace = {
126
- name,
127
- directory,
128
- link: `${basePath}/${directory}/`,
129
- elements: elements.map((entry) => ({
130
- text: entry.glibName,
131
- link: linkByGlibName.get(entry.glibName) ?? "",
132
- })),
133
- };
134
- for (const entry of elements) {
135
- const slug = elementSlug(entry.klass.name);
136
- pages.push({ path: `${directory}/${slug}.md`, content: renderElementPage(entry, pageContext) });
137
- }
138
- pages.push({ path: `${directory}/index.md`, content: namespaceIndexPage(namespaceDocs, elements) });
139
- namespaces.push(namespaceDocs);
183
+ const result = namespacePages({ name, elements, basePath, linkByGlibName, pageContext });
184
+ pages.push(...result.pages);
185
+ namespaces.push(result.docs);
140
186
  }
187
+
141
188
  pages.push({ path: "index.md", content: rootIndexPage(namespaces, options.libraries) });
189
+
142
190
  return { pages, namespaces };
143
191
  };
144
192
 
145
- export type DocsResult = {
146
- regenerated: boolean;
147
- namespaces: DocsNamespace[];
193
+ const cachedDocsResult = (options: DocsOptions, manifestPath: string): DocsResult | undefined => {
194
+ if (options.force === true || !isGiStoreFresh(options.outDir, options.libraries, options.girPath)) {
195
+ return undefined;
196
+ }
197
+
198
+ if (!existsSync(manifestPath)) {
199
+ return undefined;
200
+ }
201
+
202
+ const manifest = JSON.parse(readFileSync(manifestPath, "utf8")) as DocsManifest;
203
+
204
+ return { regenerated: false, namespaces: manifest.namespaces };
148
205
  };
149
206
 
150
- export const writeDocs = (options: DocsOptions): DocsResult => {
207
+ const writePages = (outDir: string, pages: Page[]): void => {
208
+ for (const page of pages) {
209
+ const target = join(outDir, page.path);
210
+ mkdirSync(dirname(target), { recursive: true });
211
+ writeFileSync(target, page.content);
212
+ }
213
+ };
214
+
215
+ const writeDocs = (options: DocsOptions): DocsResult => {
216
+ setElementProps(options.props ?? {});
151
217
  const basePath = options.basePath ?? "/reference";
152
- const elementProps = options.elementProps ?? {};
153
218
  const manifestPath = join(options.outDir, MANIFEST_FILENAME);
154
- if (options.force !== true && isStoreFresh(options.outDir, options.libraries, elementProps)) {
155
- if (existsSync(manifestPath)) {
156
- const manifest = JSON.parse(readFileSync(manifestPath, "utf8")) as DocsManifest;
157
- return { regenerated: false, namespaces: manifest.namespaces };
158
- }
219
+ const cached = cachedDocsResult(options, manifestPath);
220
+
221
+ if (cached !== undefined) {
222
+ return cached;
159
223
  }
160
224
 
161
225
  const library = Library.load(options.libraries, options.girPath);
162
226
  const { pages, namespaces } = generatePages(options, basePath, library);
163
-
164
227
  rmSync(options.outDir, { recursive: true, force: true });
165
228
  mkdirSync(options.outDir, { recursive: true });
166
- for (const page of pages) {
167
- const target = join(options.outDir, page.path);
168
- mkdirSync(dirname(target), { recursive: true });
169
- writeFileSync(target, page.content);
170
- }
229
+ writePages(options.outDir, pages);
171
230
  const manifest: DocsManifest = { namespaces };
172
231
  writeFileSync(manifestPath, JSON.stringify(manifest));
232
+
173
233
  writeFileSync(
174
234
  join(options.outDir, FINGERPRINT_FILENAME),
175
- JSON.stringify({
176
- value: computeFingerprint(library.girFiles, options.libraries, elementProps),
177
- girFiles: library.girFiles,
178
- libraries: options.libraries,
179
- }),
235
+ JSON.stringify(computeGiFingerprint(library.girFiles, options.libraries, options.girPath)),
180
236
  );
237
+
181
238
  return { regenerated: true, namespaces };
182
239
  };
240
+
241
+ export { writeDocs, type DocsElementLink, type DocsNamespace, type DocsOptions, type DocsResult };
@@ -1,39 +1,46 @@
1
- import { sortStringsBy, toPascalCase } from "@gtkx/utils";
2
- import { collectInheritedMethods, conflictRename } from "../analysis/inheritance.js";
3
- import { renderHandlerParameters, renderHandlerResultType } from "../analysis/param-structure.js";
4
- import { renderBaseTypeFor, type TsTypeTarget } from "../analysis/ts-type.js";
1
+ import { pascalCase, sortStringsBy } from "@gtkx/utils";
5
2
  import type { GirClass } from "../gir/class.js";
6
3
  import type { GirFunction } from "../gir/function.js";
7
4
  import type { Library } from "../gir/library.js";
8
5
  import type { GirNamespace } from "../gir/namespace.js";
9
- import type { GirSignal } from "../gir/parameter.js";
6
+ import type { GirCallable } from "../gir/parameter.js";
10
7
  import type { TypeId } from "../gir/type-id.js";
11
- import { dedupeCallables, indexMethodsByName, renderInstanceMethodSignature } from "../store/gi/callables.js";
8
+ import { collectInheritedMethods, conflictRename } from "../analysis/inheritance.js";
9
+ import { renderHandlerParameters, renderHandlerResultType } from "../analysis/param-structure.js";
10
+ import { recordTypeTarget, renderBaseType, type TsTypeTarget } from "../analysis/ts-type.js";
11
+ import { dedupeCallables, instanceScope, renderInstanceMethodSignature } from "../store/gi/callables.js";
12
12
  import { methodExportName } from "../store/gi/method.js";
13
13
  import { ModuleContext } from "../writer/context.js";
14
14
  import { gtkDocToMarkdown } from "../writer/gtk-doc.js";
15
15
 
16
- const docsTarget = (library: Library): TsTypeTarget => ({
17
- containerStyle: "record",
18
- callbackType: "((...args: unknown[]) => unknown)",
19
- byteArrayAsNumber: false,
20
- renderNamed: (resolved, name) => {
21
- if (resolved?.kind === "alias") {
22
- return resolved.value.target === undefined
23
- ? "number"
24
- : renderBaseTypeFor(library, docsTarget(library), resolved.value.target);
25
- }
26
- return `${name.namespaceName}.${name.typeName}`;
27
- },
28
- renderGtype: () => "GObject.Type",
29
- });
16
+ type SignatureEntry = {
17
+ name: string;
18
+ signature: string;
19
+ doc: string;
20
+ };
21
+
22
+ type OriginSignatureEntry = SignatureEntry & { origin: string | undefined };
23
+
24
+ const DOCS_DEFAULT_VALUES: Record<string, string> = { TRUE: "true", FALSE: "false", NULL: "null" };
25
+ const FENCE_LINE = /^\s*(```|~~~)/;
26
+ const HEADING_LINE = /^#{1,5}\s/;
27
+ const LEADING_NAMESPACES = ["Gtk", "Adw"];
28
+ const DOCS_SIGNATURE_NAMESPACE = "$docs";
29
+
30
+ const docsTarget = (library: Library): TsTypeTarget =>
31
+ recordTypeTarget(
32
+ library,
33
+ (name) => `${name.namespaceName}.${name.typeName}`,
34
+ () => "GObject.Type",
35
+ );
36
+
37
+ const renderDocsType = (library: Library, ref: TypeId | undefined, isNullable: boolean): string => {
38
+ const base = renderBaseType(library, docsTarget(library), ref);
30
39
 
31
- export const renderDocsType = (library: Library, ref: TypeId | undefined, isNullable: boolean): string => {
32
- const base = renderBaseTypeFor(library, docsTarget(library), ref);
33
40
  return isNullable ? `${base} | null` : base;
34
41
  };
35
42
 
36
- const renderDocsHandlerResultType = (library: Library, signal: GirSignal): string =>
43
+ const renderDocsHandlerResultType = (library: Library, signal: GirCallable): string =>
37
44
  renderHandlerResultType({
38
45
  library,
39
46
  signal,
@@ -42,106 +49,127 @@ const renderDocsHandlerResultType = (library: Library, signal: GirSignal): strin
42
49
  optOut: true,
43
50
  });
44
51
 
45
- const renderDocsHandlerParameters = (library: Library, signal: GirSignal): string[] =>
52
+ const renderDocsHandlerParameters = (library: Library, signal: GirCallable): string[] =>
46
53
  renderHandlerParameters(signal.parameters, (ref, nullable) => renderDocsType(library, ref, nullable));
47
54
 
48
- export const renderDocsSignalSignature = (library: Library, signal: GirSignal, selfType: string): string => {
55
+ const renderDocsSignalSignature = (library: Library, signal: GirCallable, selfType: string): string => {
49
56
  const params = [...renderDocsHandlerParameters(library, signal), `self: ${selfType}`];
57
+
50
58
  return `(${params.join(", ")}) => ${renderDocsHandlerResultType(library, signal)}`;
51
59
  };
52
60
 
53
- export const renderDocsSignalHandlerType = (library: Library, signal: GirSignal): string =>
61
+ const renderDocsSignalHandlerType = (library: Library, signal: GirCallable): string =>
54
62
  `(${renderDocsHandlerParameters(library, signal).join(", ")}) => ${renderDocsHandlerResultType(library, signal)}`;
55
63
 
56
- const DOCS_DEFAULT_VALUES: Record<string, string> = { TRUE: "true", FALSE: "false", NULL: "null" };
57
-
58
- export const docsDefaultValue = (value: string): string => DOCS_DEFAULT_VALUES[value] ?? value;
64
+ const docsDefaultValue = (value: string): string => DOCS_DEFAULT_VALUES[value] ?? value;
59
65
 
60
66
  const stripDocMedia = (markdown: string): string =>
61
67
  markdown
62
- .replace(/<picture[\s\S]*?<\/picture>/g, "")
63
- .replace(/<video[\s\S]*?(?:<\/video>|\/>)/g, "")
64
- .replace(/<img[^>]*>/g, "");
68
+ .replaceAll(/<picture[\s\S]*?<\/picture>/g, "")
69
+ .replaceAll(/<video[\s\S]*?(?:<\/video>|\/>)/g, "")
70
+ .replaceAll(/<img[^>]*>/g, "");
71
+
72
+ const demoteLine = (line: string, isInFence: boolean): { text: string; inFence: boolean } => {
73
+ if (FENCE_LINE.test(line)) {
74
+ return { text: line, inFence: !isInFence };
75
+ }
76
+
77
+ if (isInFence) {
78
+ return { text: line, inFence: isInFence };
79
+ }
80
+
81
+ return { text: HEADING_LINE.test(line) ? `#${line}` : line, inFence: isInFence };
82
+ };
65
83
 
66
84
  const demoteHeadings = (markdown: string): string => {
67
- let inFence = false;
68
- return markdown
69
- .split("\n")
70
- .map((line) => {
71
- if (/^\s*(```|~~~)/.test(line)) {
72
- inFence = !inFence;
73
- return line;
74
- }
75
- if (inFence) return line;
76
- return /^#{1,5}\s/.test(line) ? `#${line}` : line;
77
- })
78
- .join("\n");
85
+ let isInFence = false;
86
+ const lines: string[] = [];
87
+
88
+ for (const line of markdown.split("\n")) {
89
+ const result = demoteLine(line, isInFence);
90
+ isInFence = result.inFence;
91
+ lines.push(result.text);
92
+ }
93
+
94
+ return lines.join("\n");
79
95
  };
80
96
 
81
- export const docMarkdown = (doc: string | undefined): string =>
97
+ const docMarkdown = (doc: string | undefined): string =>
82
98
  doc === undefined || doc.length === 0 ? "" : demoteHeadings(stripDocMedia(gtkDocToMarkdown(doc))).trim();
83
99
 
84
100
  const stripMarkdown = (markdown: string): string =>
85
101
  markdown
86
- .replace(/```[\s\S]*?```/g, " ")
87
- .replace(/`([^`]*)`/g, "$1")
88
- .replace(/\[([^\]]*)\]\([^)]*\)/g, "$1")
89
- .replace(/[*_#>]/g, "")
90
- .replace(/\s+/g, " ")
102
+ .replaceAll(/```[\s\S]*?```/g, " ")
103
+ .replaceAll(/`([^`]*)`/g, "$1")
104
+ .replaceAll(/\[([^[\]]*)\]\([^)]*\)/g, "$1")
105
+ .replaceAll(/[*_#>]/g, "")
106
+ .replaceAll(/\s+/g, " ")
91
107
  .trim();
92
108
 
93
- export const firstSentence = (doc: string | undefined): string => {
109
+ const firstSentence = (doc: string | undefined): string => {
94
110
  const text = stripMarkdown(docMarkdown(doc));
95
- if (text.length === 0) return "";
96
- const match = text.match(/^.*?[.!?](?=\s|$)/);
111
+
112
+ if (text.length === 0) {
113
+ return "";
114
+ }
115
+
116
+ const match = /^.*?[.!?](?=\s|$)/.exec(text);
97
117
  const sentence = match?.[0] ?? text;
118
+
98
119
  return sentence.length > 220 ? `${sentence.slice(0, 217)}...` : sentence;
99
120
  };
100
121
 
101
- export const elementSlug = (className: string): string =>
122
+ const elementSlug = (className: string): string =>
102
123
  className
103
- .replace(/([a-z0-9])([A-Z])/g, "$1-$2")
104
- .replace(/([A-Z]+)([A-Z][a-z])/g, "$1-$2")
124
+ .replaceAll(/([a-z0-9])([A-Z])/g, "$1-$2")
125
+ .replaceAll(/([A-Z])(?=[A-Z][a-z])/g, "$1-")
105
126
  .toLowerCase();
106
127
 
107
- export const joinSections = (sections: string[]): string =>
128
+ const implementsLine = (names: string[]): string[] => {
129
+ if (names.length === 0) {
130
+ return [];
131
+ }
132
+
133
+ const quotedNames = names.map((name) => `\`${name}\``).join(", ");
134
+
135
+ return [`Implements ${quotedNames}.`];
136
+ };
137
+
138
+ const joinSections = (sections: string[]): string =>
108
139
  `${sections.filter((section) => section.length > 0).join("\n\n")}\n`;
109
140
 
110
- export const metaBlock = (name: string, meta: string, doc: string): string => {
141
+ const metaBlock = (name: string, meta: string, doc: string): string => {
111
142
  const lines = [`### \`${name}\``, "", meta];
112
- if (doc.length > 0) lines.push("", doc);
143
+
144
+ if (doc.length > 0) {
145
+ lines.push("", doc);
146
+ }
147
+
113
148
  return lines.join("\n");
114
149
  };
115
150
 
116
- export const signatureBlock = (name: string, signature: string, notes: string[]): string => {
151
+ const signatureBlock = (name: string, signature: string, notes: string[]): string => {
117
152
  const lines = [`### \`${name}\``, "", `\`\`\`ts\n${signature}\n\`\`\``];
153
+
118
154
  for (const note of notes) {
119
- if (note.length > 0) lines.push("", note);
155
+ if (note.length > 0) {
156
+ lines.push("", note);
157
+ }
120
158
  }
159
+
121
160
  return lines.join("\n");
122
161
  };
123
162
 
124
- const LEADING_NAMESPACES = ["Gtk", "Adw"];
125
-
126
- export const namespaceOrder = (name: string): string => {
163
+ const namespaceOrder = (name: string): string => {
127
164
  const index = LEADING_NAMESPACES.indexOf(name);
128
- return index === -1 ? `1${name}` : `0${index}`;
129
- };
130
-
131
- const DOCS_SIGNATURE_NAMESPACE = "$docs";
132
-
133
- export const docsSignatureContext = (namespace: GirNamespace, library: Library): ModuleContext =>
134
- new ModuleContext({ ...namespace, name: DOCS_SIGNATURE_NAMESPACE }, library);
135
165
 
136
- export type SignatureEntry = {
137
- name: string;
138
- signature: string;
139
- doc: string;
166
+ return index === -1 ? `1${name}` : `0${String(index)}`;
140
167
  };
141
168
 
142
- export type OriginSignatureEntry = SignatureEntry & { origin: string | undefined };
169
+ const docsSignatureContext = (namespace: GirNamespace, library: Library): ModuleContext =>
170
+ new ModuleContext({ ...namespace, name: DOCS_SIGNATURE_NAMESPACE }, library);
143
171
 
144
- export const originSignatureBlocks = (entries: OriginSignatureEntry[]): string[] =>
172
+ const originSignatureBlocks = (entries: OriginSignatureEntry[]): string[] =>
145
173
  sortStringsBy(entries, (item) => item.name).map((item) =>
146
174
  signatureBlock(item.name, item.signature, [
147
175
  item.origin === undefined ? "" : `From \`${item.origin}\`.`,
@@ -149,43 +177,79 @@ export const originSignatureBlocks = (entries: OriginSignatureEntry[]): string[]
149
177
  ]),
150
178
  );
151
179
 
152
- export const classMethodEntries = (library: Library, namespace: GirNamespace, klass: GirClass): SignatureEntry[] => {
180
+ const classMethodEntries = (library: Library, namespace: GirNamespace, klass: GirClass): SignatureEntry[] => {
153
181
  const realContext = new ModuleContext(namespace, library);
154
182
  const signatureContext = docsSignatureContext(namespace, library);
155
- const className = toPascalCase(klass.name);
183
+ const className = pascalCase(klass.name);
156
184
  const inherited = collectInheritedMethods(realContext, klass);
157
- return instanceMethodEntries(signatureContext, klass.methods, (method) =>
185
+
186
+ return instanceMethodEntries(signatureContext, klass, (method) =>
158
187
  conflictRename(realContext, method, inherited, className),
159
188
  );
160
189
  };
161
190
 
162
- export const methodsSectionBlocks = (entries: SignatureEntry[], intro: string): string[] =>
191
+ const methodsSectionBlocks = (entries: SignatureEntry[], intro: string): string[] =>
163
192
  entries.length === 0
164
193
  ? []
165
194
  : ["## Methods", intro, ...entries.map((item) => signatureBlock(item.name, item.signature, [item.doc]))];
166
195
 
167
- export const instanceMethodEntries = (
196
+ const instanceMethodEntries = (
168
197
  signatureContext: ModuleContext,
169
- methods: GirFunction[],
198
+ klass: GirClass,
170
199
  rename: (fn: GirFunction) => string | undefined,
171
200
  ): SignatureEntry[] => {
172
- const deduped = dedupeCallables(methods);
173
- const siblings = indexMethodsByName(deduped);
201
+ const deduped = dedupeCallables(klass.methods);
202
+
203
+ const scope = instanceScope(pascalCase(klass.name), {
204
+ constructors: dedupeCallables(klass.constructors),
205
+ functions: dedupeCallables(klass.functions),
206
+ methods: deduped,
207
+ });
208
+
174
209
  const entries: SignatureEntry[] = [];
210
+
175
211
  for (const method of deduped) {
176
212
  const nameOverride = rename(method);
213
+
177
214
  const rendered = renderInstanceMethodSignature(
178
215
  signatureContext,
179
216
  { ...method, doc: undefined },
180
- siblings,
217
+ scope,
181
218
  nameOverride,
182
219
  );
183
- if (rendered === undefined) continue;
220
+
221
+ if (rendered === undefined) {
222
+ continue;
223
+ }
224
+
184
225
  entries.push({
185
226
  name: nameOverride ?? methodExportName(method),
186
227
  signature: rendered.trim().replace(/;$/, ""),
187
228
  doc: docMarkdown(method.doc),
188
229
  });
189
230
  }
231
+
190
232
  return sortStringsBy(entries, (entry) => entry.name);
191
233
  };
234
+
235
+ export {
236
+ renderDocsType,
237
+ renderDocsSignalSignature,
238
+ renderDocsSignalHandlerType,
239
+ docsDefaultValue,
240
+ docMarkdown,
241
+ firstSentence,
242
+ elementSlug,
243
+ implementsLine,
244
+ joinSections,
245
+ metaBlock,
246
+ signatureBlock,
247
+ namespaceOrder,
248
+ docsSignatureContext,
249
+ originSignatureBlocks,
250
+ classMethodEntries,
251
+ methodsSectionBlocks,
252
+ instanceMethodEntries,
253
+ type SignatureEntry,
254
+ type OriginSignatureEntry,
255
+ };