@gtkx/codegen 1.0.0-rc.3 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (486) hide show
  1. package/README.md +8 -9
  2. package/dist/analysis/descriptor-render.d.ts +9 -4
  3. package/dist/analysis/descriptor-render.d.ts.map +1 -1
  4. package/dist/analysis/descriptor-render.js +51 -61
  5. package/dist/analysis/descriptor-render.js.map +1 -1
  6. package/dist/analysis/descriptor.d.ts +7 -7
  7. package/dist/analysis/descriptor.d.ts.map +1 -1
  8. package/dist/analysis/descriptor.js +7 -7
  9. package/dist/analysis/descriptor.js.map +1 -1
  10. package/dist/analysis/inheritance.d.ts +1 -2
  11. package/dist/analysis/inheritance.d.ts.map +1 -1
  12. package/dist/analysis/inheritance.js +25 -22
  13. package/dist/analysis/inheritance.js.map +1 -1
  14. package/dist/analysis/nul-terminated-bytes.d.ts +5 -0
  15. package/dist/analysis/nul-terminated-bytes.d.ts.map +1 -0
  16. package/dist/analysis/nul-terminated-bytes.js +18 -0
  17. package/dist/analysis/nul-terminated-bytes.js.map +1 -0
  18. package/dist/analysis/param-capability.d.ts +5 -0
  19. package/dist/analysis/param-capability.d.ts.map +1 -0
  20. package/dist/analysis/param-capability.js +130 -0
  21. package/dist/analysis/param-capability.js.map +1 -0
  22. package/dist/analysis/param-structure.d.ts +13 -6
  23. package/dist/analysis/param-structure.d.ts.map +1 -1
  24. package/dist/analysis/param-structure.js +44 -20
  25. package/dist/analysis/param-structure.js.map +1 -1
  26. package/dist/analysis/ts-type.d.ts +1 -1
  27. package/dist/analysis/ts-type.d.ts.map +1 -1
  28. package/dist/analysis/ts-type.js +3 -5
  29. package/dist/analysis/ts-type.js.map +1 -1
  30. package/dist/analysis/type-shape.d.ts +8 -0
  31. package/dist/analysis/type-shape.d.ts.map +1 -0
  32. package/dist/analysis/type-shape.js +12 -0
  33. package/dist/analysis/type-shape.js.map +1 -0
  34. package/dist/compile.d.ts +1 -1
  35. package/dist/compile.d.ts.map +1 -1
  36. package/dist/compile.js +2 -1
  37. package/dist/compile.js.map +1 -1
  38. package/dist/docs/api-reference.d.ts +79 -3
  39. package/dist/docs/api-reference.d.ts.map +1 -1
  40. package/dist/docs/api-reference.js +68 -13
  41. package/dist/docs/api-reference.js.map +1 -1
  42. package/dist/docs/element-page.d.ts +4 -4
  43. package/dist/docs/element-page.d.ts.map +1 -1
  44. package/dist/docs/element-page.js +32 -20
  45. package/dist/docs/element-page.js.map +1 -1
  46. package/dist/docs/handwritten-props.d.ts +9 -0
  47. package/dist/docs/handwritten-props.d.ts.map +1 -0
  48. package/dist/docs/handwritten-props.js +149 -0
  49. package/dist/docs/handwritten-props.js.map +1 -0
  50. package/dist/docs/pipeline.d.ts +4 -4
  51. package/dist/docs/pipeline.d.ts.map +1 -1
  52. package/dist/docs/pipeline.js +6 -6
  53. package/dist/docs/pipeline.js.map +1 -1
  54. package/dist/docs/render.d.ts +25 -5
  55. package/dist/docs/render.d.ts.map +1 -1
  56. package/dist/docs/render.js +90 -28
  57. package/dist/docs/render.js.map +1 -1
  58. package/dist/docs/symbol-page.d.ts +22 -0
  59. package/dist/docs/symbol-page.d.ts.map +1 -1
  60. package/dist/docs/symbol-page.js +129 -44
  61. package/dist/docs/symbol-page.js.map +1 -1
  62. package/dist/fingerprint.d.ts +3 -6
  63. package/dist/fingerprint.d.ts.map +1 -1
  64. package/dist/fingerprint.js +6 -8
  65. package/dist/fingerprint.js.map +1 -1
  66. package/dist/gi.d.ts +3 -11
  67. package/dist/gi.d.ts.map +1 -1
  68. package/dist/gi.js +0 -7
  69. package/dist/gi.js.map +1 -1
  70. package/dist/gir/ancestry.d.ts +2 -2
  71. package/dist/gir/ancestry.d.ts.map +1 -1
  72. package/dist/gir/ancestry.js +11 -1
  73. package/dist/gir/ancestry.js.map +1 -1
  74. package/dist/gir/annotations.d.ts +22 -0
  75. package/dist/gir/annotations.d.ts.map +1 -0
  76. package/dist/gir/annotations.js +15 -0
  77. package/dist/gir/annotations.js.map +1 -0
  78. package/dist/gir/callback.d.ts +1 -0
  79. package/dist/gir/callback.d.ts.map +1 -1
  80. package/dist/gir/callback.js +1 -0
  81. package/dist/gir/callback.js.map +1 -1
  82. package/dist/gir/class.d.ts +32 -1
  83. package/dist/gir/class.d.ts.map +1 -1
  84. package/dist/gir/class.js +8 -3
  85. package/dist/gir/class.js.map +1 -1
  86. package/dist/gir/enum.d.ts +21 -1
  87. package/dist/gir/enum.d.ts.map +1 -1
  88. package/dist/gir/enum.js +9 -9
  89. package/dist/gir/enum.js.map +1 -1
  90. package/dist/gir/field.d.ts +19 -4
  91. package/dist/gir/field.d.ts.map +1 -1
  92. package/dist/gir/field.js +7 -11
  93. package/dist/gir/field.js.map +1 -1
  94. package/dist/gir/function.d.ts +15 -0
  95. package/dist/gir/function.d.ts.map +1 -1
  96. package/dist/gir/function.js.map +1 -1
  97. package/dist/gir/gir-path.d.ts +7 -0
  98. package/dist/gir/gir-path.d.ts.map +1 -1
  99. package/dist/gir/gir-path.js +7 -0
  100. package/dist/gir/gir-path.js.map +1 -1
  101. package/dist/gir/libraries.d.ts +13 -2
  102. package/dist/gir/libraries.d.ts.map +1 -1
  103. package/dist/gir/libraries.js +11 -0
  104. package/dist/gir/libraries.js.map +1 -1
  105. package/dist/gir/library.d.ts +36 -0
  106. package/dist/gir/library.d.ts.map +1 -1
  107. package/dist/gir/library.js +34 -0
  108. package/dist/gir/library.js.map +1 -1
  109. package/dist/gir/namespace.d.ts +38 -0
  110. package/dist/gir/namespace.d.ts.map +1 -1
  111. package/dist/gir/namespace.js +4 -5
  112. package/dist/gir/namespace.js.map +1 -1
  113. package/dist/gir/parameter.d.ts +39 -0
  114. package/dist/gir/parameter.d.ts.map +1 -1
  115. package/dist/gir/parameter.js +7 -7
  116. package/dist/gir/parameter.js.map +1 -1
  117. package/dist/gir/parse.d.ts +3 -1
  118. package/dist/gir/parse.d.ts.map +1 -1
  119. package/dist/gir/parse.js +6 -3
  120. package/dist/gir/parse.js.map +1 -1
  121. package/dist/gir/primitives.d.ts +1 -0
  122. package/dist/gir/primitives.d.ts.map +1 -1
  123. package/dist/gir/primitives.js.map +1 -1
  124. package/dist/gir/property.d.ts +16 -0
  125. package/dist/gir/property.d.ts.map +1 -1
  126. package/dist/gir/property.js +3 -3
  127. package/dist/gir/property.js.map +1 -1
  128. package/dist/gir/record.d.ts +22 -0
  129. package/dist/gir/record.d.ts.map +1 -1
  130. package/dist/gir/record.js +3 -2
  131. package/dist/gir/record.js.map +1 -1
  132. package/dist/gir/size.d.ts +5 -4
  133. package/dist/gir/size.d.ts.map +1 -1
  134. package/dist/gir/size.js +0 -3
  135. package/dist/gir/size.js.map +1 -1
  136. package/dist/gir/type-id.d.ts +36 -1
  137. package/dist/gir/type-id.d.ts.map +1 -1
  138. package/dist/gir/type-id.js +2 -3
  139. package/dist/gir/type-id.js.map +1 -1
  140. package/dist/gir/type-ref.d.ts.map +1 -1
  141. package/dist/gir/type-ref.js +2 -1
  142. package/dist/gir/type-ref.js.map +1 -1
  143. package/dist/gir/type.d.ts +20 -0
  144. package/dist/gir/type.d.ts.map +1 -1
  145. package/dist/gir/type.js.map +1 -1
  146. package/dist/index.d.ts +18 -6
  147. package/dist/index.d.ts.map +1 -1
  148. package/dist/index.js +12 -3
  149. package/dist/index.js.map +1 -1
  150. package/dist/internal.d.ts +3 -0
  151. package/dist/internal.d.ts.map +1 -0
  152. package/dist/internal.js +3 -0
  153. package/dist/internal.js.map +1 -0
  154. package/dist/jsx.d.ts +7 -12
  155. package/dist/jsx.d.ts.map +1 -1
  156. package/dist/jsx.js +18 -19
  157. package/dist/jsx.js.map +1 -1
  158. package/dist/khronos/args.d.ts +7 -6
  159. package/dist/khronos/args.d.ts.map +1 -1
  160. package/dist/khronos/args.js +29 -7
  161. package/dist/khronos/args.js.map +1 -1
  162. package/dist/khronos/doc-context.d.ts +29 -0
  163. package/dist/khronos/doc-context.d.ts.map +1 -0
  164. package/dist/khronos/doc-context.js +29 -0
  165. package/dist/khronos/doc-context.js.map +1 -0
  166. package/dist/khronos/extensions.d.ts +13 -0
  167. package/dist/khronos/extensions.d.ts.map +1 -0
  168. package/dist/khronos/extensions.js +49 -0
  169. package/dist/khronos/extensions.js.map +1 -0
  170. package/dist/khronos/jsdoc.d.ts +17 -11
  171. package/dist/khronos/jsdoc.d.ts.map +1 -1
  172. package/dist/khronos/jsdoc.js +104 -46
  173. package/dist/khronos/jsdoc.js.map +1 -1
  174. package/dist/khronos/model.d.ts +42 -3
  175. package/dist/khronos/model.d.ts.map +1 -1
  176. package/dist/khronos/model.js +218 -63
  177. package/dist/khronos/model.js.map +1 -1
  178. package/dist/khronos/modules.d.ts +9 -6
  179. package/dist/khronos/modules.d.ts.map +1 -1
  180. package/dist/khronos/modules.js +96 -26
  181. package/dist/khronos/modules.js.map +1 -1
  182. package/dist/khronos/notes.d.ts +19 -0
  183. package/dist/khronos/notes.d.ts.map +1 -0
  184. package/dist/khronos/notes.js +35 -0
  185. package/dist/khronos/notes.js.map +1 -0
  186. package/dist/khronos/param-pair.d.ts +1 -1
  187. package/dist/khronos/param-pair.d.ts.map +1 -1
  188. package/dist/khronos/param-pair.js.map +1 -1
  189. package/dist/khronos/pipeline.d.ts +3 -1
  190. package/dist/khronos/pipeline.d.ts.map +1 -1
  191. package/dist/khronos/pipeline.js +59 -28
  192. package/dist/khronos/pipeline.js.map +1 -1
  193. package/dist/khronos/plan.d.ts +5 -5
  194. package/dist/khronos/plan.d.ts.map +1 -1
  195. package/dist/khronos/plan.js +8 -8
  196. package/dist/khronos/plan.js.map +1 -1
  197. package/dist/khronos/render.d.ts +8 -6
  198. package/dist/khronos/render.d.ts.map +1 -1
  199. package/dist/khronos/render.js +35 -26
  200. package/dist/khronos/render.js.map +1 -1
  201. package/dist/khronos/select.d.ts +21 -4
  202. package/dist/khronos/select.d.ts.map +1 -1
  203. package/dist/khronos/select.js +47 -34
  204. package/dist/khronos/select.js.map +1 -1
  205. package/dist/react/element-config.d.ts +16 -10
  206. package/dist/react/element-config.d.ts.map +1 -1
  207. package/dist/react/element-config.js +22 -15
  208. package/dist/react/element-config.js.map +1 -1
  209. package/dist/runner.d.ts +33 -21
  210. package/dist/runner.d.ts.map +1 -1
  211. package/dist/runner.js +19 -20
  212. package/dist/runner.js.map +1 -1
  213. package/dist/store/compile-store.d.ts +2 -3
  214. package/dist/store/compile-store.d.ts.map +1 -1
  215. package/dist/store/compile-store.js +2 -2
  216. package/dist/store/compile-store.js.map +1 -1
  217. package/dist/store/gi/callable-doc.d.ts +11 -0
  218. package/dist/store/gi/callable-doc.d.ts.map +1 -0
  219. package/dist/store/gi/callable-doc.js +62 -0
  220. package/dist/store/gi/callable-doc.js.map +1 -0
  221. package/dist/store/gi/callables.d.ts +3 -1
  222. package/dist/store/gi/callables.d.ts.map +1 -1
  223. package/dist/store/gi/callables.js +16 -16
  224. package/dist/store/gi/callables.js.map +1 -1
  225. package/dist/store/gi/callback.d.ts.map +1 -1
  226. package/dist/store/gi/callback.js +2 -2
  227. package/dist/store/gi/callback.js.map +1 -1
  228. package/dist/store/gi/class.d.ts.map +1 -1
  229. package/dist/store/gi/class.js +5 -3
  230. package/dist/store/gi/class.js.map +1 -1
  231. package/dist/store/gi/closure-invocation.d.ts +4 -0
  232. package/dist/store/gi/closure-invocation.d.ts.map +1 -0
  233. package/dist/store/gi/closure-invocation.js +22 -0
  234. package/dist/store/gi/closure-invocation.js.map +1 -0
  235. package/dist/store/gi/constant.d.ts.map +1 -1
  236. package/dist/store/gi/constant.js +3 -4
  237. package/dist/store/gi/constant.js.map +1 -1
  238. package/dist/store/gi/constructor-props.d.ts.map +1 -1
  239. package/dist/store/gi/constructor-props.js +18 -20
  240. package/dist/store/gi/constructor-props.js.map +1 -1
  241. package/dist/store/gi/doc-spec.d.ts +14 -0
  242. package/dist/store/gi/doc-spec.d.ts.map +1 -0
  243. package/dist/store/gi/doc-spec.js +23 -0
  244. package/dist/store/gi/doc-spec.js.map +1 -0
  245. package/dist/store/gi/enum.d.ts.map +1 -1
  246. package/dist/store/gi/enum.js +29 -16
  247. package/dist/store/gi/enum.js.map +1 -1
  248. package/dist/store/gi/function.d.ts.map +1 -1
  249. package/dist/store/gi/function.js +28 -17
  250. package/dist/store/gi/function.js.map +1 -1
  251. package/dist/store/gi/interface.d.ts.map +1 -1
  252. package/dist/store/gi/interface.js +130 -16
  253. package/dist/store/gi/interface.js.map +1 -1
  254. package/dist/store/gi/item-comparators.d.ts.map +1 -1
  255. package/dist/store/gi/item-comparators.js +3 -5
  256. package/dist/store/gi/item-comparators.js.map +1 -1
  257. package/dist/store/gi/method.d.ts +9 -1
  258. package/dist/store/gi/method.d.ts.map +1 -1
  259. package/dist/store/gi/method.js +92 -47
  260. package/dist/store/gi/method.js.map +1 -1
  261. package/dist/store/gi/param-marshal.d.ts +4 -1
  262. package/dist/store/gi/param-marshal.d.ts.map +1 -1
  263. package/dist/store/gi/param-marshal.js +5 -1
  264. package/dist/store/gi/param-marshal.js.map +1 -1
  265. package/dist/store/gi/pipeline.d.ts.map +1 -1
  266. package/dist/store/gi/pipeline.js +3 -2
  267. package/dist/store/gi/pipeline.js.map +1 -1
  268. package/dist/store/gi/properties.d.ts.map +1 -1
  269. package/dist/store/gi/properties.js +2 -2
  270. package/dist/store/gi/properties.js.map +1 -1
  271. package/dist/store/gi/property-accessor.d.ts +4 -2
  272. package/dist/store/gi/property-accessor.d.ts.map +1 -1
  273. package/dist/store/gi/property-accessor.js +10 -11
  274. package/dist/store/gi/property-accessor.js.map +1 -1
  275. package/dist/store/gi/record-constructor.d.ts.map +1 -1
  276. package/dist/store/gi/record-constructor.js +3 -1
  277. package/dist/store/gi/record-constructor.js.map +1 -1
  278. package/dist/store/gi/record-field-accessor.d.ts +4 -2
  279. package/dist/store/gi/record-field-accessor.d.ts.map +1 -1
  280. package/dist/store/gi/record-field-accessor.js +6 -11
  281. package/dist/store/gi/record-field-accessor.js.map +1 -1
  282. package/dist/store/gi/record-layout.d.ts.map +1 -1
  283. package/dist/store/gi/record-layout.js +1 -5
  284. package/dist/store/gi/record-layout.js.map +1 -1
  285. package/dist/store/gi/record.d.ts.map +1 -1
  286. package/dist/store/gi/record.js +3 -2
  287. package/dist/store/gi/record.js.map +1 -1
  288. package/dist/store/gi/registration.d.ts +1 -1
  289. package/dist/store/gi/registration.js +2 -2
  290. package/dist/store/gi/registration.js.map +1 -1
  291. package/dist/store/gi/return-wrap.d.ts +1 -1
  292. package/dist/store/gi/return-wrap.d.ts.map +1 -1
  293. package/dist/store/gi/return-wrap.js +4 -4
  294. package/dist/store/gi/return-wrap.js.map +1 -1
  295. package/dist/store/gi/runtime-override.d.ts +2 -1
  296. package/dist/store/gi/runtime-override.d.ts.map +1 -1
  297. package/dist/store/gi/runtime-override.js +8 -5
  298. package/dist/store/gi/runtime-override.js.map +1 -1
  299. package/dist/store/gi/signal.d.ts.map +1 -1
  300. package/dist/store/gi/signal.js +27 -31
  301. package/dist/store/gi/signal.js.map +1 -1
  302. package/dist/store/gi/value-marshalable.d.ts +1 -10
  303. package/dist/store/gi/value-marshalable.d.ts.map +1 -1
  304. package/dist/store/gi/value-marshalable.js +1 -10
  305. package/dist/store/gi/value-marshalable.js.map +1 -1
  306. package/dist/store/gi/vtable.d.ts +16 -1
  307. package/dist/store/gi/vtable.d.ts.map +1 -1
  308. package/dist/store/gi/vtable.js +214 -51
  309. package/dist/store/gi/vtable.js.map +1 -1
  310. package/dist/store/gi-store.d.ts +2 -3
  311. package/dist/store/gi-store.d.ts.map +1 -1
  312. package/dist/store/gi-store.js.map +1 -1
  313. package/dist/store/jsx/element-components.d.ts +1 -3
  314. package/dist/store/jsx/element-components.d.ts.map +1 -1
  315. package/dist/store/jsx/element-components.js +6 -8
  316. package/dist/store/jsx/element-components.js.map +1 -1
  317. package/dist/store/jsx/element-prop-imports.d.ts +1 -4
  318. package/dist/store/jsx/element-prop-imports.d.ts.map +1 -1
  319. package/dist/store/jsx/element-prop-imports.js +0 -2
  320. package/dist/store/jsx/element-prop-imports.js.map +1 -1
  321. package/dist/store/jsx/element-prop-types.d.ts +3 -1
  322. package/dist/store/jsx/element-prop-types.d.ts.map +1 -1
  323. package/dist/store/jsx/element-prop-types.js +7 -2
  324. package/dist/store/jsx/element-prop-types.js.map +1 -1
  325. package/dist/store/jsx/generated-elements.d.ts +29 -0
  326. package/dist/store/jsx/generated-elements.d.ts.map +1 -0
  327. package/dist/store/jsx/generated-elements.js +30 -0
  328. package/dist/store/jsx/generated-elements.js.map +1 -0
  329. package/dist/store/jsx/intrinsic-elements.d.ts +4 -0
  330. package/dist/store/jsx/intrinsic-elements.d.ts.map +1 -1
  331. package/dist/store/jsx/intrinsic-elements.js.map +1 -1
  332. package/dist/store/jsx/jsx.d.ts.map +1 -1
  333. package/dist/store/jsx/jsx.js +13 -12
  334. package/dist/store/jsx/jsx.js.map +1 -1
  335. package/dist/store/jsx/metadata.js +9 -9
  336. package/dist/store/jsx/metadata.js.map +1 -1
  337. package/dist/store/jsx/omitted-props.d.ts +2 -4
  338. package/dist/store/jsx/omitted-props.d.ts.map +1 -1
  339. package/dist/store/jsx/omitted-props.js +2 -4
  340. package/dist/store/jsx/omitted-props.js.map +1 -1
  341. package/dist/store/jsx/pipeline.d.ts +4 -2
  342. package/dist/store/jsx/pipeline.d.ts.map +1 -1
  343. package/dist/store/jsx/pipeline.js +3 -2
  344. package/dist/store/jsx/pipeline.js.map +1 -1
  345. package/dist/store/jsx/props.d.ts +1 -7
  346. package/dist/store/jsx/props.d.ts.map +1 -1
  347. package/dist/store/jsx/props.js +16 -8
  348. package/dist/store/jsx/props.js.map +1 -1
  349. package/dist/store/jsx-store.d.ts +2 -3
  350. package/dist/store/jsx-store.d.ts.map +1 -1
  351. package/dist/store/jsx-store.js +3 -3
  352. package/dist/store/jsx-store.js.map +1 -1
  353. package/dist/store/resolve-store.d.ts +28 -0
  354. package/dist/store/resolve-store.d.ts.map +1 -0
  355. package/dist/store/resolve-store.js +65 -0
  356. package/dist/store/resolve-store.js.map +1 -0
  357. package/dist/store/store-fs.d.ts +5 -1
  358. package/dist/store/store-fs.d.ts.map +1 -1
  359. package/dist/store/store-fs.js +6 -4
  360. package/dist/store/store-fs.js.map +1 -1
  361. package/dist/writer/context.d.ts +2 -1
  362. package/dist/writer/context.d.ts.map +1 -1
  363. package/dist/writer/context.js +3 -0
  364. package/dist/writer/context.js.map +1 -1
  365. package/dist/writer/doc-tags.d.ts +21 -0
  366. package/dist/writer/doc-tags.d.ts.map +1 -0
  367. package/dist/writer/doc-tags.js +38 -0
  368. package/dist/writer/doc-tags.js.map +1 -0
  369. package/dist/writer/doc.d.ts +3 -1
  370. package/dist/writer/doc.d.ts.map +1 -1
  371. package/dist/writer/doc.js +19 -6
  372. package/dist/writer/doc.js.map +1 -1
  373. package/dist/writer/gtk-doc.d.ts +1 -1
  374. package/dist/writer/gtk-doc.d.ts.map +1 -1
  375. package/dist/writer/gtk-doc.js +64 -15
  376. package/dist/writer/gtk-doc.js.map +1 -1
  377. package/dist/writer/module.d.ts +8 -2
  378. package/dist/writer/module.d.ts.map +1 -1
  379. package/dist/writer/module.js +13 -1
  380. package/dist/writer/module.js.map +1 -1
  381. package/overrides/gdk/rgba.ts.ejs +26 -0
  382. package/overrides/gobject/object.ts.ejs +56 -11
  383. package/overrides/gobject/value.ts.ejs +7 -0
  384. package/overrides/graphene/structs.ts.ejs +55 -0
  385. package/package.json +7 -11
  386. package/src/analysis/descriptor-render.ts +67 -73
  387. package/src/analysis/descriptor.ts +13 -16
  388. package/src/analysis/inheritance.ts +35 -34
  389. package/src/analysis/nul-terminated-bytes.ts +31 -0
  390. package/src/analysis/param-capability.ts +172 -0
  391. package/src/analysis/param-structure.ts +90 -32
  392. package/src/analysis/ts-type.ts +4 -6
  393. package/src/analysis/type-shape.ts +24 -0
  394. package/src/compile.ts +3 -2
  395. package/src/docs/api-reference.ts +162 -28
  396. package/src/docs/element-page.ts +53 -47
  397. package/src/docs/handwritten-props.ts +230 -0
  398. package/src/docs/pipeline.ts +10 -10
  399. package/src/docs/render.ts +153 -39
  400. package/src/docs/symbol-page.ts +230 -80
  401. package/src/fingerprint.ts +8 -14
  402. package/src/gi.ts +4 -11
  403. package/src/gir/ancestry.ts +15 -1
  404. package/src/gir/annotations.ts +37 -0
  405. package/src/gir/callback.ts +2 -0
  406. package/src/gir/class.ts +42 -4
  407. package/src/gir/enum.ts +30 -10
  408. package/src/gir/field.ts +24 -13
  409. package/src/gir/function.ts +15 -0
  410. package/src/gir/gir-path.ts +7 -0
  411. package/src/gir/libraries.ts +23 -2
  412. package/src/gir/library.ts +51 -2
  413. package/src/gir/namespace.ts +41 -5
  414. package/src/gir/parameter.ts +47 -7
  415. package/src/gir/parse.ts +8 -2
  416. package/src/gir/primitives.ts +1 -0
  417. package/src/gir/property.ts +18 -3
  418. package/src/gir/record.ts +24 -2
  419. package/src/gir/size.ts +8 -6
  420. package/src/gir/type-id.ts +51 -7
  421. package/src/gir/type-ref.ts +2 -1
  422. package/src/gir/type.ts +50 -6
  423. package/src/index.ts +18 -16
  424. package/src/internal.ts +2 -0
  425. package/src/jsx.ts +26 -26
  426. package/src/khronos/args.ts +37 -14
  427. package/src/khronos/doc-context.ts +62 -0
  428. package/src/khronos/extensions.ts +85 -0
  429. package/src/khronos/jsdoc.ts +152 -56
  430. package/src/khronos/model.ts +314 -69
  431. package/src/khronos/modules.ts +134 -40
  432. package/src/khronos/notes.ts +74 -0
  433. package/src/khronos/param-pair.ts +1 -1
  434. package/src/khronos/pipeline.ts +95 -42
  435. package/src/khronos/plan.ts +12 -13
  436. package/src/khronos/render.ts +62 -50
  437. package/src/khronos/select.ts +91 -50
  438. package/src/react/element-config.ts +21 -18
  439. package/src/runner.ts +51 -40
  440. package/src/store/compile-store.ts +4 -5
  441. package/src/store/gi/callable-doc.ts +102 -0
  442. package/src/store/gi/callables.ts +23 -17
  443. package/src/store/gi/callback.ts +3 -2
  444. package/src/store/gi/class.ts +6 -3
  445. package/src/store/gi/closure-invocation.ts +26 -0
  446. package/src/store/gi/constant.ts +3 -6
  447. package/src/store/gi/constructor-props.ts +19 -23
  448. package/src/store/gi/doc-spec.ts +38 -0
  449. package/src/store/gi/enum.ts +55 -20
  450. package/src/store/gi/function.ts +44 -26
  451. package/src/store/gi/interface.ts +214 -26
  452. package/src/store/gi/item-comparators.ts +3 -5
  453. package/src/store/gi/method.ts +126 -68
  454. package/src/store/gi/param-marshal.ts +15 -1
  455. package/src/store/gi/pipeline.ts +7 -2
  456. package/src/store/gi/properties.ts +3 -2
  457. package/src/store/gi/property-accessor.ts +14 -11
  458. package/src/store/gi/record-constructor.ts +6 -1
  459. package/src/store/gi/record-field-accessor.ts +9 -13
  460. package/src/store/gi/record-layout.ts +1 -5
  461. package/src/store/gi/record.ts +8 -2
  462. package/src/store/gi/registration.ts +3 -3
  463. package/src/store/gi/return-wrap.ts +5 -5
  464. package/src/store/gi/runtime-override.ts +13 -6
  465. package/src/store/gi/signal.ts +36 -37
  466. package/src/store/gi/value-marshalable.ts +1 -10
  467. package/src/store/gi/vtable.ts +361 -60
  468. package/src/store/gi-store.ts +2 -4
  469. package/src/store/jsx/element-components.ts +8 -11
  470. package/src/store/jsx/element-prop-imports.ts +6 -5
  471. package/src/store/jsx/element-prop-types.ts +10 -2
  472. package/src/store/jsx/generated-elements.ts +60 -0
  473. package/src/store/jsx/intrinsic-elements.ts +4 -0
  474. package/src/store/jsx/jsx.ts +15 -13
  475. package/src/store/jsx/metadata.ts +10 -10
  476. package/src/store/jsx/omitted-props.ts +2 -4
  477. package/src/store/jsx/pipeline.ts +6 -4
  478. package/src/store/jsx/props.ts +22 -9
  479. package/src/store/jsx-store.ts +5 -7
  480. package/src/store/resolve-store.ts +100 -0
  481. package/src/store/store-fs.ts +12 -5
  482. package/src/writer/context.ts +5 -1
  483. package/src/writer/doc-tags.ts +70 -0
  484. package/src/writer/doc.ts +29 -6
  485. package/src/writer/gtk-doc.ts +82 -15
  486. package/src/writer/module.ts +25 -2
@@ -0,0 +1,230 @@
1
+ import type { ModuleExport } from "@gtkx/react/config";
2
+ import { fileURLToPath } from "node:url";
3
+ import ts from "typescript";
4
+
5
+ type HandwrittenProp = {
6
+ name: string;
7
+ type: string;
8
+ doc: string;
9
+ };
10
+
11
+ type AliasSite = {
12
+ sourceFile: ts.SourceFile;
13
+ declaration: ts.TypeAliasDeclaration;
14
+ };
15
+
16
+ type NamedBinding = ts.ImportSpecifier | ts.ExportSpecifier;
17
+
18
+ const RESOLUTION_OPTIONS: ts.CompilerOptions = {
19
+ moduleResolution: ts.ModuleResolutionKind.Bundler,
20
+ customConditions: ["source"],
21
+ };
22
+
23
+ const CONTAINING_FILE = fileURLToPath(import.meta.url);
24
+ const WHITESPACE_RUN = /\s+/g;
25
+ const propsByRef: Map<string, HandwrittenProp[]> = new Map();
26
+
27
+ const moduleFileFor = (specifier: string, containingFile: string): string | undefined =>
28
+ ts.resolveModuleName(specifier, containingFile, RESOLUTION_OPTIONS, ts.sys).resolvedModule?.resolvedFileName;
29
+
30
+ const parseModule = (filePath: string): ts.SourceFile =>
31
+ ts.createSourceFile(filePath, ts.sys.readFile(filePath) ?? "", ts.ScriptTarget.Latest, true);
32
+
33
+ const specifierText = (node: ts.Expression | undefined): string | undefined =>
34
+ node !== undefined && ts.isStringLiteral(node) ? node.text : undefined;
35
+
36
+ const boundName = (elements: readonly NamedBinding[], name: string): string | undefined => {
37
+ for (const element of elements) {
38
+ if (element.name.text === name) {
39
+ return (element.propertyName ?? element.name).text;
40
+ }
41
+ }
42
+
43
+ return undefined;
44
+ };
45
+
46
+ const findAliasInModule = (specifier: string, sourceFile: ts.SourceFile, name: string): AliasSite | undefined => {
47
+ const filePath = moduleFileFor(specifier, sourceFile.fileName);
48
+
49
+ return filePath === undefined ? undefined : findAlias(parseModule(filePath), name);
50
+ };
51
+
52
+ const importedAlias = (
53
+ statement: ts.ImportDeclaration,
54
+ sourceFile: ts.SourceFile,
55
+ name: string,
56
+ ): AliasSite | undefined => {
57
+ const bindings = statement.importClause?.namedBindings;
58
+ const specifier = specifierText(statement.moduleSpecifier);
59
+
60
+ if (specifier === undefined || bindings === undefined || !ts.isNamedImports(bindings)) {
61
+ return undefined;
62
+ }
63
+
64
+ const imported = boundName(bindings.elements, name);
65
+
66
+ return imported === undefined ? undefined : findAliasInModule(specifier, sourceFile, imported);
67
+ };
68
+
69
+ const exportedAlias = (
70
+ statement: ts.ExportDeclaration,
71
+ sourceFile: ts.SourceFile,
72
+ name: string,
73
+ ): AliasSite | undefined => {
74
+ const specifier = specifierText(statement.moduleSpecifier);
75
+
76
+ if (specifier === undefined) {
77
+ return undefined;
78
+ }
79
+
80
+ const clause = statement.exportClause;
81
+
82
+ if (clause === undefined) {
83
+ return findAliasInModule(specifier, sourceFile, name);
84
+ }
85
+
86
+ const exported = ts.isNamedExports(clause) ? boundName(clause.elements, name) : undefined;
87
+
88
+ return exported === undefined ? undefined : findAliasInModule(specifier, sourceFile, exported);
89
+ };
90
+
91
+ const statementAlias = (statement: ts.Statement, sourceFile: ts.SourceFile, name: string): AliasSite | undefined => {
92
+ if (ts.isTypeAliasDeclaration(statement)) {
93
+ return statement.name.text === name ? { sourceFile, declaration: statement } : undefined;
94
+ }
95
+
96
+ if (ts.isImportDeclaration(statement)) {
97
+ return importedAlias(statement, sourceFile, name);
98
+ }
99
+
100
+ return ts.isExportDeclaration(statement) ? exportedAlias(statement, sourceFile, name) : undefined;
101
+ };
102
+
103
+ const propType = (type: ts.TypeNode, sourceFile: ts.SourceFile): string => {
104
+ const parts: readonly ts.TypeNode[] = ts.isUnionTypeNode(type) ? type.types : [type];
105
+
106
+ return parts
107
+ .filter((part) => part.kind !== ts.SyntaxKind.UndefinedKeyword)
108
+ .map((part) => part.getText(sourceFile).replaceAll(WHITESPACE_RUN, " "))
109
+ .join(" | ");
110
+ };
111
+
112
+ const propDoc = (member: ts.TypeElement): string => {
113
+ const comments = ts
114
+ .getJSDocCommentsAndTags(member)
115
+ .map((node) => (ts.isJSDoc(node) ? ts.getTextOfJSDocComment(node.comment) : undefined));
116
+
117
+ return comments.filter((text) => text !== undefined).join(" ").replaceAll(WHITESPACE_RUN, " ").trim();
118
+ };
119
+
120
+ const propertyProp = (member: ts.PropertySignature, sourceFile: ts.SourceFile): HandwrittenProp | undefined => {
121
+ const { name, type } = member;
122
+
123
+ if (type === undefined || !(ts.isIdentifier(name) || ts.isStringLiteral(name))) {
124
+ return undefined;
125
+ }
126
+
127
+ return { name: name.text, type: propType(type, sourceFile), doc: propDoc(member) };
128
+ };
129
+
130
+ const indexProp = (member: ts.IndexSignatureDeclaration, sourceFile: ts.SourceFile): HandwrittenProp | undefined => {
131
+ const keyType = member.parameters[0]?.type;
132
+
133
+ if (keyType === undefined) {
134
+ return undefined;
135
+ }
136
+
137
+ return {
138
+ name: keyType.getText(sourceFile).replaceAll("`", ""),
139
+ type: propType(member.type, sourceFile),
140
+ doc: propDoc(member),
141
+ };
142
+ };
143
+
144
+ const memberProp = (member: ts.TypeElement, sourceFile: ts.SourceFile): HandwrittenProp | undefined => {
145
+ if (ts.isPropertySignature(member)) {
146
+ return propertyProp(member, sourceFile);
147
+ }
148
+
149
+ return ts.isIndexSignatureDeclaration(member) ? indexProp(member, sourceFile) : undefined;
150
+ };
151
+
152
+ const literalProps = (type: ts.TypeLiteralNode, sourceFile: ts.SourceFile): HandwrittenProp[] => {
153
+ const props: HandwrittenProp[] = [];
154
+
155
+ for (const member of type.members) {
156
+ const prop = memberProp(member, sourceFile);
157
+
158
+ if (prop !== undefined) {
159
+ props.push(prop);
160
+ }
161
+ }
162
+
163
+ return props;
164
+ };
165
+
166
+ const referenceProps = (type: ts.TypeReferenceNode, sourceFile: ts.SourceFile): HandwrittenProp[] => {
167
+ if (!ts.isIdentifier(type.typeName)) {
168
+ return [];
169
+ }
170
+
171
+ const site = findAlias(sourceFile, type.typeName.text);
172
+
173
+ return site === undefined ? [] : typeNodeProps(site.declaration.type, site.sourceFile);
174
+ };
175
+
176
+ const declaredProps = (ref: ModuleExport): HandwrittenProp[] => {
177
+ const filePath = moduleFileFor(ref.module, CONTAINING_FILE);
178
+
179
+ if (filePath === undefined) {
180
+ throw new Error(`Cannot resolve ${ref.module}, which declares the ${ref.export} element props`);
181
+ }
182
+
183
+ const site = findAlias(parseModule(filePath), ref.export);
184
+
185
+ if (site === undefined) {
186
+ throw new Error(`${ref.module} declares no type named ${ref.export}`);
187
+ }
188
+
189
+ return typeNodeProps(site.declaration.type, site.sourceFile);
190
+ };
191
+
192
+ const handwrittenPropsFor = (ref: ModuleExport): HandwrittenProp[] => {
193
+ const key = `${ref.module}#${ref.export}`;
194
+ const cached = propsByRef.get(key);
195
+
196
+ if (cached !== undefined) {
197
+ return cached;
198
+ }
199
+
200
+ const props = declaredProps(ref);
201
+ propsByRef.set(key, props);
202
+
203
+ return props;
204
+ };
205
+
206
+ function findAlias(sourceFile: ts.SourceFile, name: string): AliasSite | undefined {
207
+ for (const statement of sourceFile.statements) {
208
+ const site = statementAlias(statement, sourceFile, name);
209
+
210
+ if (site !== undefined) {
211
+ return site;
212
+ }
213
+ }
214
+
215
+ return undefined;
216
+ }
217
+
218
+ function typeNodeProps(type: ts.TypeNode, sourceFile: ts.SourceFile): HandwrittenProp[] {
219
+ if (ts.isTypeLiteralNode(type)) {
220
+ return literalProps(type, sourceFile);
221
+ }
222
+
223
+ if (ts.isIntersectionTypeNode(type)) {
224
+ return type.types.flatMap((part) => typeNodeProps(part, sourceFile));
225
+ }
226
+
227
+ return ts.isTypeReferenceNode(type) ? referenceProps(type, sourceFile) : [];
228
+ }
229
+
230
+ export { handwrittenPropsFor, type HandwrittenProp };
@@ -7,7 +7,7 @@ import { namespaceDirectory } from "../gir/namespace.js";
7
7
  import { type ElementProps, setElementProps } from "../store/jsx/element-prop-imports.js";
8
8
  import { collectIntrinsicElementClasses, type GlibNamedClass } from "../store/jsx/intrinsic-elements.js";
9
9
  import { type OmittedProps, setOmittedProps } from "../store/jsx/omitted-props.js";
10
- import { createElementPageContext, type ElementPageContext, renderElementPage } from "./element-page.js";
10
+ import { type ElementPageContext, renderElementPage } from "./element-page.js";
11
11
  import { elementSlug, firstSentence, namespaceOrder } from "./render.js";
12
12
 
13
13
  type DocsElementLink = {
@@ -28,8 +28,8 @@ type DocsOptions = {
28
28
  outDir: string;
29
29
  basePath?: string;
30
30
  props?: ElementProps;
31
- omitProps?: OmittedProps;
32
- force?: boolean;
31
+ omittedProps?: OmittedProps;
32
+ isForced?: boolean;
33
33
  };
34
34
 
35
35
  type DocsManifest = {
@@ -45,7 +45,7 @@ type Page = { path: string; content: string };
45
45
  type NamespacePages = { docs: DocsNamespace; pages: Page[] };
46
46
 
47
47
  type DocsResult = {
48
- regenerated: boolean;
48
+ isRegenerated: boolean;
49
49
  namespaces: DocsNamespace[];
50
50
  };
51
51
 
@@ -175,7 +175,7 @@ const generatePages = (options: DocsOptions, basePath: string, library: Library)
175
175
  const intrinsicElements = collectIntrinsicElementClasses(library);
176
176
  const byNamespace = groupElementsByNamespace(intrinsicElements);
177
177
  const linkByGlibName = buildElementLinks(intrinsicElements, basePath);
178
- const pageContext = createElementPageContext(library, (glibName: string) => linkByGlibName.get(glibName));
178
+ const pageContext: ElementPageContext = { library, linkFor: (glibName) => linkByGlibName.get(glibName) };
179
179
  const pages: Page[] = [];
180
180
  const namespaces: DocsNamespace[] = [];
181
181
  const orderedNames = sortStringsBy(byNamespace.keys(), namespaceOrder);
@@ -193,7 +193,7 @@ const generatePages = (options: DocsOptions, basePath: string, library: Library)
193
193
  };
194
194
 
195
195
  const cachedDocsResult = (options: DocsOptions, manifestPath: string): DocsResult | undefined => {
196
- if (options.force === true || !isGiStoreFresh(options.outDir, options.libraries, options.girPath)) {
196
+ if (options.isForced === true || !isGiStoreFresh(options.outDir, options.libraries, options.girPath)) {
197
197
  return undefined;
198
198
  }
199
199
 
@@ -203,7 +203,7 @@ const cachedDocsResult = (options: DocsOptions, manifestPath: string): DocsResul
203
203
 
204
204
  const manifest = JSON.parse(readFileSync(manifestPath, "utf8")) as DocsManifest;
205
205
 
206
- return { regenerated: false, namespaces: manifest.namespaces };
206
+ return { isRegenerated: false, namespaces: manifest.namespaces };
207
207
  };
208
208
 
209
209
  const writePages = (outDir: string, pages: Page[]): void => {
@@ -216,7 +216,7 @@ const writePages = (outDir: string, pages: Page[]): void => {
216
216
 
217
217
  const writeDocs = (options: DocsOptions): DocsResult => {
218
218
  setElementProps(options.props ?? {});
219
- setOmittedProps(options.omitProps ?? {});
219
+ setOmittedProps(options.omittedProps ?? {});
220
220
  const basePath = options.basePath ?? "/reference";
221
221
  const manifestPath = join(options.outDir, MANIFEST_FILENAME);
222
222
  const cached = cachedDocsResult(options, manifestPath);
@@ -238,7 +238,7 @@ const writeDocs = (options: DocsOptions): DocsResult => {
238
238
  JSON.stringify(computeGiFingerprint(library.girFiles, options.libraries, options.girPath)),
239
239
  );
240
240
 
241
- return { regenerated: true, namespaces };
241
+ return { isRegenerated: true, namespaces };
242
242
  };
243
243
 
244
- export { writeDocs, type DocsElementLink, type DocsNamespace, type DocsOptions, type DocsResult };
244
+ export { writeDocs };
@@ -1,31 +1,57 @@
1
1
  import { pascalCase, sortStringsBy } from "@gtkx/utils";
2
+ import type { GirAnnotations } from "../gir/annotations.js";
2
3
  import type { GirClass } from "../gir/class.js";
3
4
  import type { GirFunction } from "../gir/function.js";
4
5
  import type { Library } from "../gir/library.js";
5
6
  import type { GirNamespace } from "../gir/namespace.js";
6
7
  import type { GirCallable } from "../gir/parameter.js";
8
+ import type { GirProperty } from "../gir/property.js";
7
9
  import type { TypeId } from "../gir/type-id.js";
10
+ import type { JsDocDeprecation, JsDocParam, JsDocSpec } from "../writer/doc-tags.js";
8
11
  import { collectInheritedMethods, conflictRename } from "../analysis/inheritance.js";
9
12
  import { renderHandlerParameters, renderHandlerResultType } from "../analysis/param-structure.js";
10
13
  import { recordTypeTarget, renderBaseType, type TsTypeTarget } from "../analysis/ts-type.js";
11
- import { dedupeCallables, instanceScope, renderInstanceMethodSignature } from "../store/gi/callables.js";
14
+ import {
15
+ dedupeCallables,
16
+ instanceMemberSpec,
17
+ instanceScope,
18
+ renderInstanceMethodSignature,
19
+ } from "../store/gi/callables.js";
20
+ import { annotationSpec, handlerSpec, selfHandlerSpec } from "../store/gi/doc-spec.js";
12
21
  import { methodExportName } from "../store/gi/method.js";
13
22
  import { ModuleContext } from "../writer/context.js";
23
+ import { stripDocMedia } from "../writer/doc-tags.js";
14
24
  import { gtkDocToMarkdown } from "../writer/gtk-doc.js";
15
25
 
16
26
  type SignatureEntry = {
17
27
  name: string;
18
28
  signature: string;
19
29
  doc: string;
30
+ tags?: JsDocSpec | undefined;
20
31
  };
21
32
 
22
33
  type OriginSignatureEntry = SignatureEntry & { origin: string | undefined };
23
34
 
35
+ type MetaDocEntry = {
36
+ name: string;
37
+ meta: string;
38
+ doc: string;
39
+ tags?: JsDocSpec | undefined;
40
+ };
41
+
42
+ type PropertyMetaOptions = {
43
+ type: string;
44
+ property: GirProperty;
45
+ accessNotes: string[];
46
+ origin: string | undefined;
47
+ };
48
+
24
49
  const DOCS_DEFAULT_VALUES: Record<string, string> = { TRUE: "true", FALSE: "false", NULL: "null" };
25
50
  const FENCE_LINE = /^\s*(```|~~~)/;
26
51
  const HEADING_LINE = /^#{1,5}\s/;
27
52
  const LEADING_NAMESPACES = ["Gtk", "Adw"];
28
53
  const DOCS_SIGNATURE_NAMESPACE = "$docs";
54
+ const WHITESPACE_RUN = /\s+/g;
29
55
 
30
56
  const docsTarget = (library: Library): TsTypeTarget =>
31
57
  recordTypeTarget(
@@ -45,8 +71,8 @@ const renderDocsHandlerResultType = (library: Library, signal: GirCallable): str
45
71
  library,
46
72
  signal,
47
73
  renderType: (ref, nullable) => renderDocsType(library, ref, nullable),
48
- includeCallerAllocated: false,
49
- optOut: true,
74
+ shouldIncludeCallerAllocated: false,
75
+ isOptOut: true,
50
76
  });
51
77
 
52
78
  const renderDocsHandlerParameters = (library: Library, signal: GirCallable): string[] =>
@@ -63,22 +89,16 @@ const renderDocsSignalHandlerType = (library: Library, signal: GirCallable): str
63
89
 
64
90
  const docsDefaultValue = (value: string): string => DOCS_DEFAULT_VALUES[value] ?? value;
65
91
 
66
- const stripDocMedia = (markdown: string): string =>
67
- markdown
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 } => {
92
+ const demoteLine = (line: string, isInFence: boolean): { text: string; isInFence: boolean } => {
73
93
  if (FENCE_LINE.test(line)) {
74
- return { text: line, inFence: !isInFence };
94
+ return { text: line, isInFence: !isInFence };
75
95
  }
76
96
 
77
97
  if (isInFence) {
78
- return { text: line, inFence: isInFence };
98
+ return { text: line, isInFence };
79
99
  }
80
100
 
81
- return { text: HEADING_LINE.test(line) ? `#${line}` : line, inFence: isInFence };
101
+ return { text: HEADING_LINE.test(line) ? `#${line}` : line, isInFence };
82
102
  };
83
103
 
84
104
  const demoteHeadings = (markdown: string): string => {
@@ -87,7 +107,7 @@ const demoteHeadings = (markdown: string): string => {
87
107
 
88
108
  for (const line of markdown.split("\n")) {
89
109
  const result = demoteLine(line, isInFence);
90
- isInFence = result.inFence;
110
+ isInFence = result.isInFence;
91
111
  lines.push(result.text);
92
112
  }
93
113
 
@@ -102,12 +122,15 @@ const stripMarkdown = (markdown: string): string =>
102
122
  .replaceAll(/```[\s\S]*?```/g, " ")
103
123
  .replaceAll(/`([^`]*)`/g, "$1")
104
124
  .replaceAll(/\[([^[\]]*)\]\([^)]*\)/g, "$1")
105
- .replaceAll(/[*_#>]/g, "")
106
- .replaceAll(/\s+/g, " ")
125
+ .replaceAll(/[*#>]/g, "")
126
+ .replaceAll(WHITESPACE_RUN, " ")
107
127
  .trim();
108
128
 
129
+ const inlineMarkdown = (doc: string | undefined): string => docMarkdown(doc).replaceAll(WHITESPACE_RUN, " ").trim();
130
+ const plainText = (doc: string | undefined): string => stripMarkdown(docMarkdown(doc));
131
+
109
132
  const firstSentence = (doc: string | undefined): string => {
110
- const text = stripMarkdown(docMarkdown(doc));
133
+ const text = plainText(doc);
111
134
 
112
135
  if (text.length === 0) {
113
136
  return "";
@@ -138,16 +161,102 @@ const implementsLine = (names: string[]): string[] => {
138
161
  const joinSections = (sections: string[]): string =>
139
162
  `${sections.filter((section) => section.length > 0).join("\n\n")}\n`;
140
163
 
141
- const metaBlock = (name: string, meta: string, doc: string): string => {
142
- const lines = [`### \`${name}\``, "", meta];
164
+ const paramNotes = (params: JsDocParam[] | undefined): string[] => {
165
+ const entries = (params ?? [])
166
+ .map((param) => ({ name: param.name, text: inlineMarkdown(param.doc) }))
167
+ .filter((entry) => entry.text.length > 0);
168
+
169
+ if (entries.length === 0) {
170
+ return [];
171
+ }
172
+
173
+ const bullets = entries.map((entry) => `- \`${entry.name}\`: ${entry.text}`);
174
+
175
+ return [["**Parameters**", "", ...bullets].join("\n")];
176
+ };
177
+
178
+ const labelledNote = (label: string, text: string): string[] => (text.length === 0 ? [] : [`${label} ${text}`]);
179
+
180
+ const deprecationNote = (deprecation: JsDocDeprecation | undefined): string[] => {
181
+ if (deprecation === undefined) {
182
+ return [];
183
+ }
184
+
185
+ const since = deprecation.since;
186
+ const heading = since === undefined ? "**Deprecated.**" : `**Deprecated since ${since}.**`;
187
+ const text = inlineMarkdown(deprecation.doc);
188
+ const body = text.length === 0 ? heading : `${heading} ${text}`;
189
+
190
+ return [`> ${body}`];
191
+ };
192
+
193
+ const sinceNote = (since: string | undefined): string[] =>
194
+ since === undefined || since.length === 0 ? [] : [`_Available since ${since}._`];
195
+
196
+ const tagNotes = (spec: JsDocSpec | undefined): string[] => {
197
+ if (spec === undefined) {
198
+ return [];
199
+ }
200
+
201
+ return [
202
+ ...paramNotes(spec.params),
203
+ ...labelledNote("**Returns**", docMarkdown(spec.returns)),
204
+ ...labelledNote("**Throws**", inlineMarkdown(spec.throws)),
205
+ ...deprecationNote(spec.deprecated),
206
+ ...sinceNote(spec.since),
207
+ ];
208
+ };
209
+
210
+ const deprecationMeta = (annotations: GirAnnotations): string[] => {
211
+ if (!annotations.isDeprecated) {
212
+ return [];
213
+ }
214
+
215
+ const since = annotations.deprecatedSince;
216
+
217
+ return [since === undefined ? "deprecated" : `deprecated since ${since}`];
218
+ };
219
+
220
+ const annotationNotes = (annotations: GirAnnotations): string[] => tagNotes(annotationSpec(annotations));
143
221
 
144
- if (doc.length > 0) {
145
- lines.push("", doc);
222
+ const signalTags = (signal: GirCallable, isSelfIncluded: boolean): JsDocSpec =>
223
+ isSelfIncluded ? selfHandlerSpec(signal) : handlerSpec(signal, signal.parameters);
224
+
225
+ const metaBlock = (entry: MetaDocEntry): string => {
226
+ const lines = [`### \`${entry.name}\``, "", entry.meta];
227
+
228
+ for (const note of [entry.doc, ...tagNotes(entry.tags)]) {
229
+ if (note.length > 0) {
230
+ lines.push("", note);
231
+ }
146
232
  }
147
233
 
148
234
  return lines.join("\n");
149
235
  };
150
236
 
237
+ const sortedMetaBlocks = (entries: MetaDocEntry[]): string[] =>
238
+ sortStringsBy(entries, (item) => item.name).map((item) => metaBlock(item));
239
+
240
+ const propertyMetaLine = ({ type, property, accessNotes, origin }: PropertyMetaOptions): string => {
241
+ const meta = [`\`${type}\``];
242
+
243
+ if (property.defaultValue !== undefined) {
244
+ meta.push(`default \`${docsDefaultValue(property.defaultValue)}\``);
245
+ }
246
+
247
+ if (property.constructOnly) {
248
+ meta.push("construct-only");
249
+ }
250
+
251
+ meta.push(...accessNotes, ...deprecationMeta(property.annotations));
252
+
253
+ if (origin !== undefined) {
254
+ meta.push(`from \`${origin}\``);
255
+ }
256
+
257
+ return meta.join(" · ");
258
+ };
259
+
151
260
  const signatureBlock = (name: string, signature: string, notes: string[]): string => {
152
261
  const lines = [`### \`${name}\``, "", `\`\`\`ts\n${signature}\n\`\`\``];
153
262
 
@@ -160,6 +269,9 @@ const signatureBlock = (name: string, signature: string, notes: string[]): strin
160
269
  return lines.join("\n");
161
270
  };
162
271
 
272
+ const signatureEntryBlock = (entry: SignatureEntry, leadingNotes: string[] = []): string =>
273
+ signatureBlock(entry.name, entry.signature, [...leadingNotes, entry.doc, ...tagNotes(entry.tags)]);
274
+
163
275
  const namespaceOrder = (name: string): string => {
164
276
  const index = LEADING_NAMESPACES.indexOf(name);
165
277
 
@@ -171,10 +283,7 @@ const docsSignatureContext = (namespace: GirNamespace, library: Library): Module
171
283
 
172
284
  const originSignatureBlocks = (entries: OriginSignatureEntry[]): string[] =>
173
285
  sortStringsBy(entries, (item) => item.name).map((item) =>
174
- signatureBlock(item.name, item.signature, [
175
- item.origin === undefined ? "" : `From \`${item.origin}\`.`,
176
- item.doc,
177
- ]),
286
+ signatureEntryBlock(item, item.origin === undefined ? [] : [`From \`${item.origin}\`.`]),
178
287
  );
179
288
 
180
289
  const classMethodEntries = (library: Library, namespace: GirNamespace, klass: GirClass): SignatureEntry[] => {
@@ -189,9 +298,7 @@ const classMethodEntries = (library: Library, namespace: GirNamespace, klass: Gi
189
298
  };
190
299
 
191
300
  const methodsSectionBlocks = (entries: SignatureEntry[], intro: string): string[] =>
192
- entries.length === 0
193
- ? []
194
- : ["## Methods", intro, ...entries.map((item) => signatureBlock(item.name, item.signature, [item.doc]))];
301
+ entries.length === 0 ? [] : ["## Methods", intro, ...entries.map((item) => signatureEntryBlock(item))];
195
302
 
196
303
  const instanceMethodEntries = (
197
304
  signatureContext: ModuleContext,
@@ -210,13 +317,7 @@ const instanceMethodEntries = (
210
317
 
211
318
  for (const method of deduped) {
212
319
  const nameOverride = rename(method);
213
-
214
- const rendered = renderInstanceMethodSignature(
215
- signatureContext,
216
- { ...method, doc: undefined },
217
- scope,
218
- nameOverride,
219
- );
320
+ const rendered = renderInstanceMethodSignature(signatureContext, method, scope, nameOverride);
220
321
 
221
322
  if (rendered === undefined) {
222
323
  continue;
@@ -224,32 +325,45 @@ const instanceMethodEntries = (
224
325
 
225
326
  entries.push({
226
327
  name: nameOverride ?? methodExportName(method),
227
- signature: rendered.trim().replace(/;$/, ""),
328
+ signature: signatureText(rendered),
228
329
  doc: docMarkdown(method.doc),
330
+ tags: instanceMemberSpec(signatureContext, method, scope),
229
331
  });
230
332
  }
231
333
 
232
334
  return sortStringsBy(entries, (entry) => entry.name);
233
335
  };
234
336
 
337
+ const signatureText = (rendered: string): string => {
338
+ const start = rendered.startsWith("/**") ? rendered.indexOf("*/") + 2 : 0;
339
+
340
+ return rendered.slice(start).trim().replace(/;$/, "");
341
+ };
342
+
235
343
  export {
236
344
  renderDocsType,
237
345
  renderDocsSignalSignature,
238
346
  renderDocsSignalHandlerType,
239
- docsDefaultValue,
347
+ annotationNotes,
348
+ deprecationMeta,
240
349
  docMarkdown,
241
350
  firstSentence,
242
351
  elementSlug,
243
352
  implementsLine,
244
353
  joinSections,
245
- metaBlock,
354
+ plainText,
355
+ propertyMetaLine,
356
+ signalTags,
246
357
  signatureBlock,
358
+ signatureEntryBlock,
359
+ sortedMetaBlocks,
247
360
  namespaceOrder,
248
361
  docsSignatureContext,
249
362
  originSignatureBlocks,
250
363
  classMethodEntries,
251
364
  methodsSectionBlocks,
252
- instanceMethodEntries,
365
+ tagNotes,
366
+ type MetaDocEntry,
253
367
  type SignatureEntry,
254
368
  type OriginSignatureEntry,
255
369
  };