@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
package/src/compile.ts CHANGED
@@ -29,8 +29,10 @@ const BASE_COMPILER_OPTIONS = {
29
29
  noImplicitReturns: true,
30
30
  noFallthroughCasesInSwitch: true,
31
31
  allowUnreachableCode: false,
32
+ allowImportingTsExtensions: true,
32
33
  forceConsistentCasingInFileNames: true,
33
34
  resolveJsonModule: true,
35
+ rewriteRelativeImportExtensions: true,
34
36
  skipLibCheck: true,
35
37
  types: ["node"],
36
38
  };
@@ -47,7 +49,6 @@ const FORMAT_HOST: ts.FormatDiagnosticsHost = {
47
49
  getNewLine: () => "\n",
48
50
  };
49
51
 
50
- /** `@gtkx/codegen`'s own `node_modules`, which has `@types/node` plus the `@gtkx/*` deps the store typecheck needs. */
51
52
  const codegenModules = (): string => {
52
53
  const sourceDir = dirname(fileURLToPath(import.meta.url));
53
54
 
@@ -176,4 +177,4 @@ const checkModules = (params: { modules: SourceModule[]; resolveFrom: string; la
176
177
  }
177
178
  };
178
179
 
179
- export { compileProject, checkModules, type SourceModule, type CompileProjectParams };
180
+ export { compileProject, checkModules, type SourceModule };
@@ -6,55 +6,128 @@ import { Library } from "../gir/library.js";
6
6
  import { type GirNamespace, namespaceDirectory } from "../gir/namespace.js";
7
7
  import { dedupeCallables, isEmittableCallable } from "../store/gi/callables.js";
8
8
  import { namespaceFunctionExportName } from "../store/gi/function.js";
9
+ import { type ElementProps, setElementProps } from "../store/jsx/element-prop-imports.js";
9
10
  import { collectIntrinsicElementClasses, type GlibNamedClass } from "../store/jsx/intrinsic-elements.js";
10
- import { createElementPageContext, type ElementPageContext, renderElementPage } from "./element-page.js";
11
+ import { type OmittedProps, setOmittedProps } from "../store/jsx/omitted-props.js";
12
+ import { type ElementPageContext, renderElementPage } from "./element-page.js";
11
13
  import { docsSignatureContext, firstSentence, namespaceOrder } from "./render.js";
12
14
  import { type GiSymbolEntry, renderSymbolPage, type SymbolPageOptions } from "./symbol-page.js";
13
15
 
16
+ /** What to index and the element config the rendered pages reflect. */
14
17
  type ApiReferenceOptions = {
18
+ /** GIR library identifiers to load, such as `"Gtk-4.0"`; their dependencies are pulled in too. */
15
19
  libraries: string[];
20
+ /** Directories to search for `.gir` files. */
16
21
  girPath: string[];
22
+ /** Base props interfaces per element, as read by `readBuiltinElements`; without it pages miss them. */
23
+ props?: ElementProps;
24
+ /** GObject properties the project omits from generated props; without it pages show props that do not exist. */
25
+ omittedProps?: OmittedProps;
17
26
  };
18
27
 
19
- type ApiSymbolKind = GiSymbolEntry["kind"] | "element";
28
+ /** Narrows an `ApiReference.symbols` enumeration. */
29
+ type ApiSymbolQuery = {
30
+ /** GIR namespace to keep, matched case-insensitively; every namespace when omitted. */
31
+ namespace?: string;
32
+ /** Symbol kinds to keep; every kind when omitted. */
33
+ kinds?: ApiSymbolKind[];
34
+ };
20
35
 
36
+ /** What an indexed symbol is: one of the GIR symbol kinds, or a JSX element. */
37
+ type ApiSymbolKind =
38
+ "alias" |
39
+ "callback" |
40
+ "class" |
41
+ "constant" |
42
+ "element" |
43
+ "enum" |
44
+ "function" |
45
+ "interface" |
46
+ "record";
47
+
48
+ /** An indexed symbol, without its reference page. */
21
49
  type ApiSymbol = {
50
+ /** GIR namespace declaring the symbol, such as `"Gtk"`. */
22
51
  namespace: string;
52
+ /** Name within the namespace, which for an element is its GLib type name. */
23
53
  name: string;
54
+ /** Kind the reference groups and filters the symbol by, `"element"` for a JSX tag. */
24
55
  kind: ApiSymbolKind;
56
+ /** First sentence of the symbol's GIR documentation, elided past 220 characters and empty when it has none. */
25
57
  summary: string;
26
58
  };
27
59
 
60
+ /** How much of one namespace the reference indexes. */
28
61
  type ApiNamespaceSummary = {
62
+ /** GIR namespace name, such as `"Gtk"`. */
29
63
  name: string;
64
+ /** The `@gtkx/gi` subpath the namespace's symbols are imported from. */
30
65
  importPath: string;
66
+ /** How many symbols other than JSX elements the namespace contributes. */
31
67
  symbols: number;
68
+ /** How many JSX elements the namespace contributes. */
32
69
  elements: number;
33
70
  };
34
71
 
72
+ /** What an `ApiReference.lookup` found: a rendered page, several candidates for the name, or nothing. */
35
73
  type ApiLookupResult =
36
- | { outcome: "page"; symbol: ApiSymbol; markdown: string } |
37
- { outcome: "ambiguous"; candidates: ApiSymbol[] } |
38
- { outcome: "notFound" };
39
-
74
+ | {
75
+ /** Discriminant selecting the variant. */
76
+ outcome: "page";
77
+ /** Index entry for the symbol the query resolved to. */
78
+ symbol: ApiSymbol;
79
+ /** The symbol's complete reference page, rendered as Markdown. */
80
+ markdown: string;
81
+ } |
82
+ {
83
+ /** Discriminant selecting the variant. */
84
+ outcome: "ambiguous";
85
+ /** Every symbol the name answers to, to be narrowed by namespace or kind. */
86
+ candidates: ApiSymbol[];
87
+ } |
88
+ {
89
+ /** Discriminant selecting the variant. */
90
+ outcome: "notFound";
91
+ };
92
+
93
+ /** A fuzzy search over indexed symbol names. */
40
94
  type ApiSearchOptions = {
95
+ /** Text matched case-insensitively against each symbol's name and its qualified `Namespace.Name` form. */
41
96
  query: string;
97
+ /** GIR namespace to keep, matched case-insensitively; every namespace when omitted. */
42
98
  namespace?: string;
99
+ /** Symbol kinds to keep; every kind when omitted. */
43
100
  kinds?: ApiSymbolKind[];
101
+ /** Maximum number of results, 20 by default. */
44
102
  limit?: number;
45
103
  };
46
104
 
105
+ /** An indexed JSX element, carrying the widget class its page renders from. */
47
106
  type ElementEntry = {
107
+ /** Discriminant marking the entry as a JSX element rather than a GIR symbol. */
48
108
  kind: "element";
109
+ /** GIR namespace declaring the widget class. */
49
110
  namespace: GirNamespace;
111
+ /** Element name, which is the class's GLib type name such as `GtkButton`. */
50
112
  name: string;
113
+ /** Documentation text carried by the widget class's GIR node. */
51
114
  doc: string | undefined;
115
+ /** The widget class the element is generated from. */
52
116
  element: GlibNamedClass;
53
117
  };
54
118
 
119
+ /** Anything the index holds: a GIR symbol or a JSX element. */
55
120
  type SymbolEntry = GiSymbolEntry | ElementEntry;
56
- type ScoredEntry = { score: number; entry: SymbolEntry };
57
121
 
122
+ /** A search hit: an indexed entry and how well its name answered the query. */
123
+ type ScoredEntry = {
124
+ /** Match strength, ranked best first: an exact name, then a prefix, then a substring. */
125
+ score: number;
126
+ /** The entry that matched. */
127
+ entry: SymbolEntry;
128
+ };
129
+
130
+ /** Every kind the reference indexes, in the order a namespace overview groups its symbols. */
58
131
  const API_SYMBOL_KINDS: ApiSymbolKind[] = [
59
132
  "element",
60
133
  "class",
@@ -89,6 +162,35 @@ const compareNames = (a: string, b: string): number => {
89
162
  return a > b ? 1 : 0;
90
163
  };
91
164
 
165
+ const symbolKindSet = (kinds: ApiSymbolKind[] | undefined): Set<ApiSymbolKind> | undefined =>
166
+ kinds === undefined ? undefined : new Set(kinds);
167
+
168
+ const isQueriedEntry = (
169
+ entry: SymbolEntry,
170
+ namespaceFilter: string | undefined,
171
+ kinds: Set<ApiSymbolKind> | undefined,
172
+ ): boolean => {
173
+ if (namespaceFilter !== undefined && entry.namespace.name.toLowerCase() !== namespaceFilter) {
174
+ return false;
175
+ }
176
+
177
+ return kinds === undefined || kinds.has(entry.kind);
178
+ };
179
+
180
+ const compareApiSymbols = (a: ApiSymbol, b: ApiSymbol): number => {
181
+ const byNamespace = namespaceOrder(a.namespace).localeCompare(namespaceOrder(b.namespace));
182
+
183
+ return byNamespace === 0 ? a.name.localeCompare(b.name) : byNamespace;
184
+ };
185
+
186
+ /**
187
+ * Loads the GIR data for the given libraries and indexes every symbol and JSX element in it. The result is
188
+ * a read-only view: it generates no store and needs none, so a tool can explore the bindings a project would
189
+ * get without running codegen.
190
+ *
191
+ * @param options Which libraries to index, where to find them, and the project's element config.
192
+ * @returns The indexed reference.
193
+ */
92
194
  const loadApiReference = (options: ApiReferenceOptions): ApiReference => new ApiReference(options);
93
195
 
94
196
  const functionEntry = (
@@ -204,29 +306,13 @@ const narrowToExactMatches = (candidates: SymbolEntry[], trimmed: string, isQual
204
306
  return exact.length > 0 ? exact : candidates;
205
307
  };
206
308
 
207
- const isSearchFilterMatch = (
208
- entry: SymbolEntry,
209
- namespaceFilter: string | undefined,
210
- kinds: ApiSymbolKind[] | undefined,
211
- ): boolean => {
212
- if (namespaceFilter !== undefined && entry.namespace.name.toLowerCase() !== namespaceFilter) {
213
- return false;
214
- }
215
-
216
- if (kinds !== undefined && !kinds.includes(entry.kind)) {
217
- return false;
218
- }
219
-
220
- return true;
221
- };
222
-
223
309
  const getScoredEntry = (
224
310
  entry: SymbolEntry,
225
311
  query: string,
226
312
  namespaceFilter: string | undefined,
227
- kinds: ApiSymbolKind[] | undefined,
313
+ kinds: Set<ApiSymbolKind> | undefined,
228
314
  ): ScoredEntry | undefined => {
229
- if (!isSearchFilterMatch(entry, namespaceFilter, kinds)) {
315
+ if (!isQueriedEntry(entry, namespaceFilter, kinds)) {
230
316
  return undefined;
231
317
  }
232
318
 
@@ -265,6 +351,7 @@ const searchScore = (entry: SymbolEntry, query: string): number => {
265
351
  return 0;
266
352
  };
267
353
 
354
+ /** An index over the GIR data a project's bindings are generated from, queryable and renderable as Markdown. */
268
355
  class ApiReference {
269
356
  private library: Library;
270
357
  private libraries: string[];
@@ -275,13 +362,24 @@ class ApiReference {
275
362
  private byNamespace: Map<string, SymbolEntry[]> = new Map();
276
363
  private elementsByClass: Map<string, string> = new Map();
277
364
 
365
+ private props: ElementProps;
366
+ private omittedProps: OmittedProps;
367
+
368
+ /** Indexes every symbol and JSX element in the GIR data the options point at. */
278
369
  constructor(options: ApiReferenceOptions) {
279
370
  this.libraries = options.libraries;
371
+ this.props = options.props ?? {};
372
+ this.omittedProps = options.omittedProps ?? {};
280
373
  this.library = Library.load(options.libraries, options.girPath);
281
- this.elementContext = createElementPageContext(this.library, (): string | undefined => undefined);
374
+ this.elementContext = { library: this.library, linkFor: (): string | undefined => undefined };
282
375
  this.buildIndex();
283
376
  }
284
377
 
378
+ private applyElementConfig(): void {
379
+ setElementProps(this.props);
380
+ setOmittedProps(this.omittedProps);
381
+ }
382
+
285
383
  private add(entry: SymbolEntry): void {
286
384
  this.entries.push(entry);
287
385
 
@@ -362,6 +460,8 @@ class ApiReference {
362
460
 
363
461
  private renderPage(entry: SymbolEntry): string {
364
462
  if (entry.kind === "element") {
463
+ this.applyElementConfig();
464
+
365
465
  return renderElementPage(entry.element, this.elementContext);
366
466
  }
367
467
 
@@ -395,7 +495,7 @@ class ApiReference {
395
495
  private scoreEntries(
396
496
  query: string,
397
497
  namespaceFilter: string | undefined,
398
- kinds: ApiSymbolKind[] | undefined,
498
+ kinds: Set<ApiSymbolKind> | undefined,
399
499
  ): ScoredEntry[] {
400
500
  const scored: ScoredEntry[] = [];
401
501
 
@@ -410,10 +510,18 @@ class ApiReference {
410
510
  return scored;
411
511
  }
412
512
 
513
+ /** Paths of the `.gir` files the index was built from, including the ones pulled in as dependencies. */
413
514
  get girFiles(): string[] {
414
515
  return this.library.girFiles;
415
516
  }
416
517
 
518
+ /**
519
+ * Resolves a name to a single symbol and renders its reference page. The name may be bare (`Button`) or
520
+ * qualified (`Gtk.Button`), and is matched case-insensitively; a name several symbols answer to is
521
+ * reported as ambiguous rather than picked between.
522
+ *
523
+ * @param kind Restricts the match to one kind, which is how a class and its JSX element are told apart.
524
+ */
417
525
  lookup(query: string, kind?: ApiSymbolKind): ApiLookupResult {
418
526
  const trimmed = query.trim();
419
527
 
@@ -435,6 +543,21 @@ class ApiReference {
435
543
  return { outcome: "page", symbol: this.toApiSymbol(entry), markdown: this.renderPage(entry) };
436
544
  }
437
545
 
546
+ /** Every indexed symbol the query keeps, ordered by namespace (Gtk, then Adw, then alphabetically) and name. */
547
+ symbols(query: ApiSymbolQuery = {}): ApiSymbol[] {
548
+ const namespaceFilter = query.namespace?.toLowerCase();
549
+ const kinds = symbolKindSet(query.kinds);
550
+
551
+ return this.entries
552
+ .filter((entry) => isQueriedEntry(entry, namespaceFilter, kinds))
553
+ .map((entry) => this.toApiSymbol(entry))
554
+ .toSorted(compareApiSymbols);
555
+ }
556
+
557
+ /**
558
+ * Symbols whose name matches the query, best first: an exact name beats a prefix, which beats a
559
+ * substring, and shorter names win ties. An empty query matches nothing.
560
+ */
438
561
  search(options: ApiSearchOptions): ApiSymbol[] {
439
562
  const query = options.query.trim().toLowerCase();
440
563
 
@@ -444,12 +567,13 @@ class ApiReference {
444
567
 
445
568
  const limit = Math.max(1, Math.floor(options.limit ?? DEFAULT_SEARCH_LIMIT));
446
569
  const namespaceFilter = options.namespace?.toLowerCase();
447
- const scored = this.scoreEntries(query, namespaceFilter, options.kinds);
570
+ const scored = this.scoreEntries(query, namespaceFilter, symbolKindSet(options.kinds));
448
571
  scored.sort(compareScoredEntries);
449
572
 
450
573
  return scored.slice(0, limit).map((item) => this.toApiSymbol(item.entry));
451
574
  }
452
575
 
576
+ /** A summary of every indexed namespace, ordered Gtk, Adw, then alphabetically. */
453
577
  namespaces(): ApiNamespaceSummary[] {
454
578
  const summaries = [...this.byNamespace].map(([name, entries]) => ({
455
579
  name,
@@ -461,6 +585,10 @@ class ApiReference {
461
585
  return sortStringsBy(summaries, (summary) => namespaceOrder(summary.name));
462
586
  }
463
587
 
588
+ /**
589
+ * Sorted names of everything a namespace contributes, JSX elements included. The namespace is matched
590
+ * case-insensitively, and an unindexed one yields an empty array.
591
+ */
464
592
  symbolNames(namespaceName: string): string[] {
465
593
  const namespace = this.findNamespace(namespaceName);
466
594
 
@@ -473,6 +601,7 @@ class ApiReference {
473
601
  return sortStrings(entries.map((entry) => entry.name));
474
602
  }
475
603
 
604
+ /** Renders the reference's Markdown landing page: every namespace, its import path, and its totals. */
476
605
  overview(): string {
477
606
  const rows = this.namespaces().map(
478
607
  (summary) =>
@@ -500,6 +629,10 @@ class ApiReference {
500
629
  ].join("\n");
501
630
  }
502
631
 
632
+ /**
633
+ * Renders one namespace's Markdown page: its import line and its symbol names grouped by kind. The
634
+ * namespace is matched case-insensitively, and an unindexed one yields undefined.
635
+ */
503
636
  namespaceOverview(name: string): string | undefined {
504
637
  const namespace = this.findNamespace(name);
505
638
 
@@ -549,4 +682,5 @@ export {
549
682
  type ApiNamespaceSummary,
550
683
  type ApiLookupResult,
551
684
  type ApiSearchOptions,
685
+ type ApiSymbolQuery,
552
686
  };
@@ -1,11 +1,12 @@
1
- import { sortStringsBy, toCamelIdentifier, upperFirst } from "@gtkx/utils";
1
+ import { toCamelIdentifier, upperFirst } from "@gtkx/utils";
2
2
  import type { GirClass } from "../gir/class.js";
3
3
  import type { Library } from "../gir/library.js";
4
+ import type { HandwrittenProp } from "./handwritten-props.js";
4
5
  import { ancestorChain } from "../gir/ancestry.js";
5
6
  import { type GirNamespace, namespaceDirectory } from "../gir/namespace.js";
6
7
  import { type GirProperty, isConstructableProperty } from "../gir/property.js";
8
+ import { annotationSpec } from "../store/gi/doc-spec.js";
7
9
  import { elementPropTypeFor } from "../store/jsx/element-prop-imports.js";
8
- import { buildGirIndex, type GirIndex } from "../store/jsx/gir-index.js";
9
10
  import {
10
11
  getGlibName,
11
12
  type GlibNamedClass,
@@ -15,23 +16,30 @@ import {
15
16
  } from "../store/jsx/intrinsic-elements.js";
16
17
  import { isOmittedProp } from "../store/jsx/omitted-props.js";
17
18
  import { isObjectProp } from "../store/jsx/props.js";
19
+ import { handwrittenPropsFor } from "./handwritten-props.js";
18
20
  import {
21
+ annotationNotes,
19
22
  classMethodEntries,
20
23
  docMarkdown,
21
- docsDefaultValue,
22
24
  firstSentence,
23
25
  implementsLine,
24
26
  joinSections,
25
- metaBlock,
27
+ type MetaDocEntry,
26
28
  methodsSectionBlocks,
27
29
  originSignatureBlocks,
30
+ type OriginSignatureEntry,
31
+ propertyMetaLine,
28
32
  renderDocsSignalSignature,
29
33
  renderDocsType,
34
+ signalTags,
35
+ sortedMetaBlocks,
30
36
  } from "./render.js";
31
37
 
38
+ /** Shared state an element's reference page renders from. */
32
39
  type ElementPageContext = {
40
+ /** Parsed GIR the element, its ancestors, and the interfaces it implements are read from. */
33
41
  library: Library;
34
- girIndex: GirIndex;
42
+ /** Resolves a GLib type name to the URL of its page, undefined when it has none. */
35
43
  linkFor: (glibName: string) => string | undefined;
36
44
  };
37
45
 
@@ -42,24 +50,6 @@ type MemberOwner = {
42
50
  glibName: string | undefined;
43
51
  };
44
52
 
45
- type PropEntry = {
46
- name: string;
47
- meta: string;
48
- doc: string;
49
- };
50
-
51
- type SignalEntry = {
52
- name: string;
53
- signature: string;
54
- doc: string;
55
- origin: string | undefined;
56
- };
57
-
58
- const createElementPageContext = (
59
- library: Library,
60
- linkFor: (glibName: string) => string | undefined,
61
- ): ElementPageContext => ({ library, girIndex: buildGirIndex(library), linkFor });
62
-
63
53
  const frontmatter = (entry: GlibNamedClass): string => {
64
54
  const sentence = firstSentence(entry.klass.doc);
65
55
  const description = sentence.length > 0 ? sentence : `API reference for the ${entry.glibName} element.`;
@@ -120,29 +110,45 @@ const propertyEntry = (
120
110
  owner: MemberOwner,
121
111
  property: GirProperty,
122
112
  jsName: string,
123
- ): PropEntry => {
113
+ ): MetaDocEntry => {
124
114
  const isObject = isObjectProp(context.library, property);
125
115
  const baseType = renderDocsType(context.library, property.type, false);
126
116
  const type = isObject ? `${baseType} | ReactElement` : baseType;
127
- const meta: string[] = [`\`${type}\``];
128
117
 
129
- if (property.defaultValue !== undefined) {
130
- meta.push(`default \`${docsDefaultValue(property.defaultValue)}\``);
131
- }
118
+ const accessNotes = isConstructableProperty(property)
119
+ ? []
120
+ : [`read-only, observe with \`onNotify${upperFirst(jsName)}\``];
132
121
 
133
- if (property.constructOnly) {
134
- meta.push("construct-only");
135
- }
122
+ return {
123
+ name: jsName,
124
+ meta: propertyMetaLine({ type, property, accessNotes, origin: owner.origin }),
125
+ doc: docMarkdown(property.doc),
126
+ tags: annotationSpec(property.annotations),
127
+ };
128
+ };
136
129
 
137
- if (!isConstructableProperty(property)) {
138
- meta.push(`read-only, observe with \`onNotify${upperFirst(jsName)}\``);
130
+ const handwrittenPropMeta = (prop: HandwrittenProp, owner: MemberOwner): string =>
131
+ [`\`${prop.type}\``, ...(owner.origin === undefined ? [] : [`from \`${owner.origin}\``])].join(" · ");
132
+
133
+ const handwrittenPropEntries = (owner: MemberOwner, seen: Set<string>): MetaDocEntry[] => {
134
+ const declared = owner.glibName === undefined ? undefined : elementPropTypeFor(owner.glibName);
135
+
136
+ if (declared === undefined) {
137
+ return [];
139
138
  }
140
139
 
141
- if (owner.origin !== undefined) {
142
- meta.push(`from \`${owner.origin}\``);
140
+ const entries: MetaDocEntry[] = [];
141
+
142
+ for (const prop of handwrittenPropsFor(declared)) {
143
+ if (seen.has(prop.name)) {
144
+ continue;
145
+ }
146
+
147
+ seen.add(prop.name);
148
+ entries.push({ name: prop.name, meta: handwrittenPropMeta(prop, owner), doc: prop.doc });
143
149
  }
144
150
 
145
- return { name: jsName, meta: meta.join(" · "), doc: docMarkdown(property.doc) };
151
+ return entries;
146
152
  };
147
153
 
148
154
  const propJsName = (property: GirProperty, owner: MemberOwner, seen: Set<string>): string | undefined => {
@@ -161,8 +167,8 @@ const propJsName = (property: GirProperty, owner: MemberOwner, seen: Set<string>
161
167
  return jsName;
162
168
  };
163
169
 
164
- const ownerPropEntries = (context: ElementPageContext, owner: MemberOwner, seen: Set<string>): PropEntry[] => {
165
- const entries: PropEntry[] = [];
170
+ const ownerPropEntries = (context: ElementPageContext, owner: MemberOwner, seen: Set<string>): MetaDocEntry[] => {
171
+ const entries: MetaDocEntry[] = [...handwrittenPropEntries(owner, seen)];
166
172
 
167
173
  for (const property of owner.klass.properties) {
168
174
  const jsName = propJsName(property, owner, seen);
@@ -175,8 +181,8 @@ const ownerPropEntries = (context: ElementPageContext, owner: MemberOwner, seen:
175
181
  return entries;
176
182
  };
177
183
 
178
- const propertyEntries = (entry: GlibNamedClass, context: ElementPageContext, seen: Set<string>): PropEntry[] => {
179
- const entries: PropEntry[] = [];
184
+ const propertyEntries = (entry: GlibNamedClass, context: ElementPageContext, seen: Set<string>): MetaDocEntry[] => {
185
+ const entries: MetaDocEntry[] = [];
180
186
 
181
187
  for (const owner of memberOwners(entry, context)) {
182
188
  entries.push(...ownerPropEntries(context, owner, seen));
@@ -200,9 +206,7 @@ const propsSection = (entry: GlibNamedClass, context: ElementPageContext, selfTy
200
206
  return ["## Props", intro];
201
207
  }
202
208
 
203
- const sorted = sortStringsBy(entries, (item) => item.name);
204
-
205
- return ["## Props", intro, ...sorted.map((item) => metaBlock(item.name, item.meta, item.doc))];
209
+ return ["## Props", intro, ...sortedMetaBlocks(entries)];
206
210
  };
207
211
 
208
212
  const ownerSignalEntries = (
@@ -210,8 +214,8 @@ const ownerSignalEntries = (
210
214
  owner: MemberOwner,
211
215
  selfType: string,
212
216
  seen: Set<string>,
213
- ): SignalEntry[] => {
214
- const entries: SignalEntry[] = [];
217
+ ): OriginSignatureEntry[] => {
218
+ const entries: OriginSignatureEntry[] = [];
215
219
 
216
220
  for (const signal of owner.klass.signals) {
217
221
  const name = signalHandlerName(signal.name);
@@ -226,6 +230,7 @@ const ownerSignalEntries = (
226
230
  name,
227
231
  signature: renderDocsSignalSignature(context.library, signal, selfType),
228
232
  doc: docMarkdown(signal.doc),
233
+ tags: signalTags(signal, true),
229
234
  origin: owner.origin,
230
235
  });
231
236
  }
@@ -235,7 +240,7 @@ const ownerSignalEntries = (
235
240
 
236
241
  const signalsSection = (entry: GlibNamedClass, context: ElementPageContext, selfType: string): string[] => {
237
242
  const seen: Set<string> = new Set();
238
- const entries: SignalEntry[] = [];
243
+ const entries: OriginSignatureEntry[] = [];
239
244
 
240
245
  for (const owner of memberOwners(entry, context)) {
241
246
  entries.push(...ownerSignalEntries(context, owner, selfType, seen));
@@ -266,6 +271,7 @@ const renderElementPage = (entry: GlibNamedClass, context: ElementPageContext):
266
271
  frontmatter(entry),
267
272
  `# ${entry.glibName}`,
268
273
  docMarkdown(entry.klass.doc),
274
+ ...annotationNotes(entry.klass.annotations),
269
275
  importBlock(entry),
270
276
  ...hierarchySection(entry, context),
271
277
  ...propsSection(entry, context, selfType),
@@ -274,4 +280,4 @@ const renderElementPage = (entry: GlibNamedClass, context: ElementPageContext):
274
280
  ]);
275
281
  };
276
282
 
277
- export { createElementPageContext, renderElementPage, type ElementPageContext };
283
+ export { renderElementPage, type ElementPageContext };