@gtkx/codegen 1.0.0-rc.4 → 1.1.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 (523) hide show
  1. package/README.md +5 -5
  2. package/dist/analysis/descriptor-render.d.ts +13 -9
  3. package/dist/analysis/descriptor-render.d.ts.map +1 -1
  4. package/dist/analysis/descriptor-render.js +80 -50
  5. package/dist/analysis/descriptor-render.js.map +1 -1
  6. package/dist/analysis/descriptor.d.ts +16 -7
  7. package/dist/analysis/descriptor.d.ts.map +1 -1
  8. package/dist/analysis/descriptor.js +15 -3
  9. package/dist/analysis/descriptor.js.map +1 -1
  10. package/dist/analysis/inheritance.d.ts +4 -3
  11. package/dist/analysis/inheritance.d.ts.map +1 -1
  12. package/dist/analysis/inheritance.js +103 -58
  13. package/dist/analysis/inheritance.js.map +1 -1
  14. package/dist/analysis/interface-conflicts.d.ts +23 -0
  15. package/dist/analysis/interface-conflicts.d.ts.map +1 -0
  16. package/dist/analysis/interface-conflicts.js +144 -0
  17. package/dist/analysis/interface-conflicts.js.map +1 -0
  18. package/dist/analysis/nul-terminated-bytes.d.ts +5 -0
  19. package/dist/analysis/nul-terminated-bytes.d.ts.map +1 -0
  20. package/dist/analysis/nul-terminated-bytes.js +18 -0
  21. package/dist/analysis/nul-terminated-bytes.js.map +1 -0
  22. package/dist/analysis/param-capability.d.ts +5 -0
  23. package/dist/analysis/param-capability.d.ts.map +1 -0
  24. package/dist/analysis/param-capability.js +129 -0
  25. package/dist/analysis/param-capability.js.map +1 -0
  26. package/dist/analysis/param-structure.d.ts +11 -4
  27. package/dist/analysis/param-structure.d.ts.map +1 -1
  28. package/dist/analysis/param-structure.js +42 -16
  29. package/dist/analysis/param-structure.js.map +1 -1
  30. package/dist/analysis/ts-type.d.ts.map +1 -1
  31. package/dist/analysis/ts-type.js +10 -17
  32. package/dist/analysis/ts-type.js.map +1 -1
  33. package/dist/analysis/type-key.d.ts +5 -0
  34. package/dist/analysis/type-key.d.ts.map +1 -0
  35. package/dist/analysis/type-key.js +9 -0
  36. package/dist/analysis/type-key.js.map +1 -0
  37. package/dist/analysis/type-shape.d.ts +8 -0
  38. package/dist/analysis/type-shape.d.ts.map +1 -0
  39. package/dist/analysis/type-shape.js +12 -0
  40. package/dist/analysis/type-shape.js.map +1 -0
  41. package/dist/compile.d.ts +12 -3
  42. package/dist/compile.d.ts.map +1 -1
  43. package/dist/compile.js +73 -24
  44. package/dist/compile.js.map +1 -1
  45. package/dist/docs/api-reference.d.ts +2 -2
  46. package/dist/docs/api-reference.d.ts.map +1 -1
  47. package/dist/docs/api-reference.js +17 -23
  48. package/dist/docs/api-reference.js.map +1 -1
  49. package/dist/docs/element-page.d.ts +4 -4
  50. package/dist/docs/element-page.d.ts.map +1 -1
  51. package/dist/docs/element-page.js +36 -22
  52. package/dist/docs/element-page.js.map +1 -1
  53. package/dist/docs/handwritten-props.d.ts +9 -0
  54. package/dist/docs/handwritten-props.d.ts.map +1 -0
  55. package/dist/docs/handwritten-props.js +149 -0
  56. package/dist/docs/handwritten-props.js.map +1 -0
  57. package/dist/docs/pipeline.d.ts.map +1 -1
  58. package/dist/docs/pipeline.js +87 -20
  59. package/dist/docs/pipeline.js.map +1 -1
  60. package/dist/docs/render.d.ts +26 -5
  61. package/dist/docs/render.d.ts.map +1 -1
  62. package/dist/docs/render.js +88 -25
  63. package/dist/docs/render.js.map +1 -1
  64. package/dist/docs/symbol-page.d.ts +17 -0
  65. package/dist/docs/symbol-page.d.ts.map +1 -1
  66. package/dist/docs/symbol-page.js +132 -44
  67. package/dist/docs/symbol-page.js.map +1 -1
  68. package/dist/fingerprint.d.ts +12 -1
  69. package/dist/fingerprint.d.ts.map +1 -1
  70. package/dist/fingerprint.js +44 -28
  71. package/dist/fingerprint.js.map +1 -1
  72. package/dist/gi.d.ts.map +1 -1
  73. package/dist/gi.js +1 -0
  74. package/dist/gi.js.map +1 -1
  75. package/dist/gir/ancestry.d.ts +8 -2
  76. package/dist/gir/ancestry.d.ts.map +1 -1
  77. package/dist/gir/ancestry.js +19 -1
  78. package/dist/gir/ancestry.js.map +1 -1
  79. package/dist/gir/annotations.d.ts +21 -0
  80. package/dist/gir/annotations.d.ts.map +1 -0
  81. package/dist/gir/annotations.js +15 -0
  82. package/dist/gir/annotations.js.map +1 -0
  83. package/dist/gir/callback.d.ts +1 -0
  84. package/dist/gir/callback.d.ts.map +1 -1
  85. package/dist/gir/callback.js +1 -0
  86. package/dist/gir/callback.js.map +1 -1
  87. package/dist/gir/class.d.ts +32 -1
  88. package/dist/gir/class.d.ts.map +1 -1
  89. package/dist/gir/class.js +8 -3
  90. package/dist/gir/class.js.map +1 -1
  91. package/dist/gir/cursor-overrides.d.ts +8 -0
  92. package/dist/gir/cursor-overrides.d.ts.map +1 -0
  93. package/dist/gir/cursor-overrides.js +6 -0
  94. package/dist/gir/cursor-overrides.js.map +1 -0
  95. package/dist/gir/emittable.d.ts +7 -0
  96. package/dist/gir/emittable.d.ts.map +1 -0
  97. package/dist/gir/emittable.js +3 -0
  98. package/dist/gir/emittable.js.map +1 -0
  99. package/dist/gir/enum.d.ts +21 -1
  100. package/dist/gir/enum.d.ts.map +1 -1
  101. package/dist/gir/enum.js +9 -9
  102. package/dist/gir/enum.js.map +1 -1
  103. package/dist/gir/field.d.ts +19 -3
  104. package/dist/gir/field.d.ts.map +1 -1
  105. package/dist/gir/field.js +7 -8
  106. package/dist/gir/field.js.map +1 -1
  107. package/dist/gir/function.d.ts +15 -0
  108. package/dist/gir/function.d.ts.map +1 -1
  109. package/dist/gir/function.js +28 -2
  110. package/dist/gir/function.js.map +1 -1
  111. package/dist/gir/libraries.d.ts +1 -3
  112. package/dist/gir/libraries.d.ts.map +1 -1
  113. package/dist/gir/libraries.js +0 -1
  114. package/dist/gir/libraries.js.map +1 -1
  115. package/dist/gir/library.d.ts +36 -0
  116. package/dist/gir/library.d.ts.map +1 -1
  117. package/dist/gir/library.js +35 -1
  118. package/dist/gir/library.js.map +1 -1
  119. package/dist/gir/namespace.d.ts +43 -1
  120. package/dist/gir/namespace.d.ts.map +1 -1
  121. package/dist/gir/namespace.js +8 -7
  122. package/dist/gir/namespace.js.map +1 -1
  123. package/dist/gir/parameter.d.ts +52 -1
  124. package/dist/gir/parameter.d.ts.map +1 -1
  125. package/dist/gir/parameter.js +8 -3
  126. package/dist/gir/parameter.js.map +1 -1
  127. package/dist/gir/parse.d.ts +3 -1
  128. package/dist/gir/parse.d.ts.map +1 -1
  129. package/dist/gir/parse.js +9 -9
  130. package/dist/gir/parse.js.map +1 -1
  131. package/dist/gir/primitives.d.ts +1 -0
  132. package/dist/gir/primitives.d.ts.map +1 -1
  133. package/dist/gir/primitives.js.map +1 -1
  134. package/dist/gir/property.d.ts +16 -0
  135. package/dist/gir/property.d.ts.map +1 -1
  136. package/dist/gir/property.js +3 -3
  137. package/dist/gir/property.js.map +1 -1
  138. package/dist/gir/record.d.ts +22 -0
  139. package/dist/gir/record.d.ts.map +1 -1
  140. package/dist/gir/record.js +3 -2
  141. package/dist/gir/record.js.map +1 -1
  142. package/dist/gir/size.d.ts +5 -4
  143. package/dist/gir/size.d.ts.map +1 -1
  144. package/dist/gir/size.js.map +1 -1
  145. package/dist/gir/type-id.d.ts +35 -0
  146. package/dist/gir/type-id.d.ts.map +1 -1
  147. package/dist/gir/type-id.js +1 -0
  148. package/dist/gir/type-id.js.map +1 -1
  149. package/dist/gir/type-ref.d.ts.map +1 -1
  150. package/dist/gir/type-ref.js +1 -0
  151. package/dist/gir/type-ref.js.map +1 -1
  152. package/dist/gir/type.d.ts +20 -0
  153. package/dist/gir/type.d.ts.map +1 -1
  154. package/dist/gir/type.js.map +1 -1
  155. package/dist/guards.d.ts +16 -0
  156. package/dist/guards.d.ts.map +1 -0
  157. package/dist/guards.js +11 -0
  158. package/dist/guards.js.map +1 -0
  159. package/dist/internal.d.ts +2 -0
  160. package/dist/internal.d.ts.map +1 -1
  161. package/dist/internal.js +2 -0
  162. package/dist/internal.js.map +1 -1
  163. package/dist/json.d.ts +3 -0
  164. package/dist/json.d.ts.map +1 -0
  165. package/dist/json.js +11 -0
  166. package/dist/json.js.map +1 -0
  167. package/dist/khronos/args.d.ts +7 -6
  168. package/dist/khronos/args.d.ts.map +1 -1
  169. package/dist/khronos/args.js +28 -6
  170. package/dist/khronos/args.js.map +1 -1
  171. package/dist/khronos/doc-context.d.ts +29 -0
  172. package/dist/khronos/doc-context.d.ts.map +1 -0
  173. package/dist/khronos/doc-context.js +29 -0
  174. package/dist/khronos/doc-context.js.map +1 -0
  175. package/dist/khronos/extensions.d.ts +13 -0
  176. package/dist/khronos/extensions.d.ts.map +1 -0
  177. package/dist/khronos/extensions.js +49 -0
  178. package/dist/khronos/extensions.js.map +1 -0
  179. package/dist/khronos/jsdoc.d.ts +17 -11
  180. package/dist/khronos/jsdoc.d.ts.map +1 -1
  181. package/dist/khronos/jsdoc.js +104 -46
  182. package/dist/khronos/jsdoc.js.map +1 -1
  183. package/dist/khronos/model.d.ts +42 -3
  184. package/dist/khronos/model.d.ts.map +1 -1
  185. package/dist/khronos/model.js +218 -63
  186. package/dist/khronos/model.js.map +1 -1
  187. package/dist/khronos/modules.d.ts +9 -6
  188. package/dist/khronos/modules.d.ts.map +1 -1
  189. package/dist/khronos/modules.js +112 -27
  190. package/dist/khronos/modules.js.map +1 -1
  191. package/dist/khronos/notes.d.ts +19 -0
  192. package/dist/khronos/notes.d.ts.map +1 -0
  193. package/dist/khronos/notes.js +35 -0
  194. package/dist/khronos/notes.js.map +1 -0
  195. package/dist/khronos/param-pair.d.ts +1 -1
  196. package/dist/khronos/param-pair.d.ts.map +1 -1
  197. package/dist/khronos/param-pair.js.map +1 -1
  198. package/dist/khronos/parse.d.ts.map +1 -1
  199. package/dist/khronos/parse.js +3 -4
  200. package/dist/khronos/parse.js.map +1 -1
  201. package/dist/khronos/pipeline.d.ts +4 -2
  202. package/dist/khronos/pipeline.d.ts.map +1 -1
  203. package/dist/khronos/pipeline.js +58 -27
  204. package/dist/khronos/pipeline.js.map +1 -1
  205. package/dist/khronos/plan.d.ts +3 -9
  206. package/dist/khronos/plan.d.ts.map +1 -1
  207. package/dist/khronos/plan.js +3 -3
  208. package/dist/khronos/plan.js.map +1 -1
  209. package/dist/khronos/render.d.ts +8 -6
  210. package/dist/khronos/render.d.ts.map +1 -1
  211. package/dist/khronos/render.js +35 -26
  212. package/dist/khronos/render.js.map +1 -1
  213. package/dist/khronos/select.d.ts +21 -4
  214. package/dist/khronos/select.d.ts.map +1 -1
  215. package/dist/khronos/select.js +47 -34
  216. package/dist/khronos/select.js.map +1 -1
  217. package/dist/react/element-config.d.ts +2 -2
  218. package/dist/react/element-config.d.ts.map +1 -1
  219. package/dist/react/element-config.js.map +1 -1
  220. package/dist/runner.d.ts +6 -8
  221. package/dist/runner.d.ts.map +1 -1
  222. package/dist/runner.js +16 -0
  223. package/dist/runner.js.map +1 -1
  224. package/dist/staging.d.ts +5 -0
  225. package/dist/staging.d.ts.map +1 -0
  226. package/dist/staging.js +57 -0
  227. package/dist/staging.js.map +1 -0
  228. package/dist/store/compile-store.d.ts +1 -1
  229. package/dist/store/compile-store.d.ts.map +1 -1
  230. package/dist/store/compile-store.js +4 -2
  231. package/dist/store/compile-store.js.map +1 -1
  232. package/dist/store/gi/callable-doc.d.ts +11 -0
  233. package/dist/store/gi/callable-doc.d.ts.map +1 -0
  234. package/dist/store/gi/callable-doc.js +62 -0
  235. package/dist/store/gi/callable-doc.js.map +1 -0
  236. package/dist/store/gi/callables.d.ts +9 -2
  237. package/dist/store/gi/callables.d.ts.map +1 -1
  238. package/dist/store/gi/callables.js +35 -40
  239. package/dist/store/gi/callables.js.map +1 -1
  240. package/dist/store/gi/callback.d.ts.map +1 -1
  241. package/dist/store/gi/callback.js +10 -6
  242. package/dist/store/gi/callback.js.map +1 -1
  243. package/dist/store/gi/class.d.ts.map +1 -1
  244. package/dist/store/gi/class.js +63 -40
  245. package/dist/store/gi/class.js.map +1 -1
  246. package/dist/store/gi/closure-invocation.d.ts +4 -0
  247. package/dist/store/gi/closure-invocation.d.ts.map +1 -0
  248. package/dist/store/gi/closure-invocation.js +22 -0
  249. package/dist/store/gi/closure-invocation.js.map +1 -0
  250. package/dist/store/gi/companion.d.ts.map +1 -1
  251. package/dist/store/gi/companion.js +6 -6
  252. package/dist/store/gi/companion.js.map +1 -1
  253. package/dist/store/gi/constant.d.ts.map +1 -1
  254. package/dist/store/gi/constant.js +12 -3
  255. package/dist/store/gi/constant.js.map +1 -1
  256. package/dist/store/gi/constructor-props.d.ts.map +1 -1
  257. package/dist/store/gi/constructor-props.js +18 -20
  258. package/dist/store/gi/constructor-props.js.map +1 -1
  259. package/dist/store/gi/doc-spec.d.ts +14 -0
  260. package/dist/store/gi/doc-spec.d.ts.map +1 -0
  261. package/dist/store/gi/doc-spec.js +23 -0
  262. package/dist/store/gi/doc-spec.js.map +1 -0
  263. package/dist/store/gi/enum.d.ts.map +1 -1
  264. package/dist/store/gi/enum.js +52 -19
  265. package/dist/store/gi/enum.js.map +1 -1
  266. package/dist/store/gi/function.d.ts +1 -3
  267. package/dist/store/gi/function.d.ts.map +1 -1
  268. package/dist/store/gi/function.js +50 -29
  269. package/dist/store/gi/function.js.map +1 -1
  270. package/dist/store/gi/gtype-binding.d.ts.map +1 -1
  271. package/dist/store/gi/gtype-binding.js +4 -1
  272. package/dist/store/gi/gtype-binding.js.map +1 -1
  273. package/dist/store/gi/interface.d.ts.map +1 -1
  274. package/dist/store/gi/interface.js +155 -26
  275. package/dist/store/gi/interface.js.map +1 -1
  276. package/dist/store/gi/item-comparators.d.ts.map +1 -1
  277. package/dist/store/gi/item-comparators.js +3 -5
  278. package/dist/store/gi/item-comparators.js.map +1 -1
  279. package/dist/store/gi/method.d.ts +11 -2
  280. package/dist/store/gi/method.d.ts.map +1 -1
  281. package/dist/store/gi/method.js +80 -45
  282. package/dist/store/gi/method.js.map +1 -1
  283. package/dist/store/gi/param-marshal.d.ts +6 -2
  284. package/dist/store/gi/param-marshal.d.ts.map +1 -1
  285. package/dist/store/gi/param-marshal.js +54 -5
  286. package/dist/store/gi/param-marshal.js.map +1 -1
  287. package/dist/store/gi/pipeline.d.ts.map +1 -1
  288. package/dist/store/gi/pipeline.js +23 -11
  289. package/dist/store/gi/pipeline.js.map +1 -1
  290. package/dist/store/gi/properties.d.ts +2 -1
  291. package/dist/store/gi/properties.d.ts.map +1 -1
  292. package/dist/store/gi/properties.js +7 -4
  293. package/dist/store/gi/properties.js.map +1 -1
  294. package/dist/store/gi/property-accessor.d.ts +12 -5
  295. package/dist/store/gi/property-accessor.d.ts.map +1 -1
  296. package/dist/store/gi/property-accessor.js +98 -46
  297. package/dist/store/gi/property-accessor.js.map +1 -1
  298. package/dist/store/gi/record-constructor.d.ts +8 -1
  299. package/dist/store/gi/record-constructor.d.ts.map +1 -1
  300. package/dist/store/gi/record-constructor.js +34 -11
  301. package/dist/store/gi/record-constructor.js.map +1 -1
  302. package/dist/store/gi/record-field-accessor.d.ts +3 -1
  303. package/dist/store/gi/record-field-accessor.d.ts.map +1 -1
  304. package/dist/store/gi/record-field-accessor.js +8 -3
  305. package/dist/store/gi/record-field-accessor.js.map +1 -1
  306. package/dist/store/gi/record-layout.d.ts +6 -1
  307. package/dist/store/gi/record-layout.d.ts.map +1 -1
  308. package/dist/store/gi/record-layout.js +9 -2
  309. package/dist/store/gi/record-layout.js.map +1 -1
  310. package/dist/store/gi/record.d.ts.map +1 -1
  311. package/dist/store/gi/record.js +21 -9
  312. package/dist/store/gi/record.js.map +1 -1
  313. package/dist/store/gi/registration.d.ts +1 -1
  314. package/dist/store/gi/registration.js +4 -4
  315. package/dist/store/gi/registration.js.map +1 -1
  316. package/dist/store/gi/runtime-override.d.ts +2 -1
  317. package/dist/store/gi/runtime-override.d.ts.map +1 -1
  318. package/dist/store/gi/runtime-override.js +8 -5
  319. package/dist/store/gi/runtime-override.js.map +1 -1
  320. package/dist/store/gi/signal.d.ts +2 -1
  321. package/dist/store/gi/signal.d.ts.map +1 -1
  322. package/dist/store/gi/signal.js +42 -37
  323. package/dist/store/gi/signal.js.map +1 -1
  324. package/dist/store/gi/value-marshalable.d.ts +1 -2
  325. package/dist/store/gi/value-marshalable.d.ts.map +1 -1
  326. package/dist/store/gi/value-marshalable.js +3 -2
  327. package/dist/store/gi/value-marshalable.js.map +1 -1
  328. package/dist/store/gi/vtable.d.ts +19 -1
  329. package/dist/store/gi/vtable.d.ts.map +1 -1
  330. package/dist/store/gi/vtable.js +257 -51
  331. package/dist/store/gi/vtable.js.map +1 -1
  332. package/dist/store/gi-store.d.ts +1 -0
  333. package/dist/store/gi-store.d.ts.map +1 -1
  334. package/dist/store/gi-store.js +15 -20
  335. package/dist/store/gi-store.js.map +1 -1
  336. package/dist/store/jsx/element-components.d.ts +1 -1
  337. package/dist/store/jsx/element-components.d.ts.map +1 -1
  338. package/dist/store/jsx/element-components.js +6 -4
  339. package/dist/store/jsx/element-components.js.map +1 -1
  340. package/dist/store/jsx/element-prop-imports.d.ts +1 -3
  341. package/dist/store/jsx/element-prop-imports.d.ts.map +1 -1
  342. package/dist/store/jsx/element-prop-imports.js.map +1 -1
  343. package/dist/store/jsx/element-prop-types.d.ts +3 -0
  344. package/dist/store/jsx/element-prop-types.d.ts.map +1 -1
  345. package/dist/store/jsx/element-prop-types.js +7 -1
  346. package/dist/store/jsx/element-prop-types.js.map +1 -1
  347. package/dist/store/jsx/generated-elements.d.ts +2 -1
  348. package/dist/store/jsx/generated-elements.d.ts.map +1 -1
  349. package/dist/store/jsx/generated-elements.js +13 -7
  350. package/dist/store/jsx/generated-elements.js.map +1 -1
  351. package/dist/store/jsx/intrinsic-elements.d.ts +4 -0
  352. package/dist/store/jsx/intrinsic-elements.d.ts.map +1 -1
  353. package/dist/store/jsx/intrinsic-elements.js.map +1 -1
  354. package/dist/store/jsx/jsx.d.ts.map +1 -1
  355. package/dist/store/jsx/jsx.js +10 -9
  356. package/dist/store/jsx/jsx.js.map +1 -1
  357. package/dist/store/jsx/metadata.d.ts.map +1 -1
  358. package/dist/store/jsx/metadata.js +5 -3
  359. package/dist/store/jsx/metadata.js.map +1 -1
  360. package/dist/store/jsx/pipeline.d.ts +1 -1
  361. package/dist/store/jsx/pipeline.d.ts.map +1 -1
  362. package/dist/store/jsx/pipeline.js.map +1 -1
  363. package/dist/store/jsx/props.d.ts +1 -7
  364. package/dist/store/jsx/props.d.ts.map +1 -1
  365. package/dist/store/jsx/props.js +14 -6
  366. package/dist/store/jsx/props.js.map +1 -1
  367. package/dist/store/jsx-store.d.ts.map +1 -1
  368. package/dist/store/jsx-store.js +3 -3
  369. package/dist/store/jsx-store.js.map +1 -1
  370. package/dist/store/resolve-store.d.ts +14 -3
  371. package/dist/store/resolve-store.d.ts.map +1 -1
  372. package/dist/store/resolve-store.js +98 -15
  373. package/dist/store/resolve-store.js.map +1 -1
  374. package/dist/store/store-fs.d.ts +9 -6
  375. package/dist/store/store-fs.d.ts.map +1 -1
  376. package/dist/store/store-fs.js +59 -25
  377. package/dist/store/store-fs.js.map +1 -1
  378. package/dist/store/store-links.d.ts +3 -0
  379. package/dist/store/store-links.d.ts.map +1 -0
  380. package/dist/store/store-links.js +39 -0
  381. package/dist/store/store-links.js.map +1 -0
  382. package/dist/writer/comparison-context.d.ts +4 -0
  383. package/dist/writer/comparison-context.d.ts.map +1 -0
  384. package/dist/writer/comparison-context.js +13 -0
  385. package/dist/writer/comparison-context.js.map +1 -0
  386. package/dist/writer/context.d.ts +3 -2
  387. package/dist/writer/context.d.ts.map +1 -1
  388. package/dist/writer/context.js +11 -3
  389. package/dist/writer/context.js.map +1 -1
  390. package/dist/writer/doc-tags.d.ts +21 -0
  391. package/dist/writer/doc-tags.d.ts.map +1 -0
  392. package/dist/writer/doc-tags.js +38 -0
  393. package/dist/writer/doc-tags.js.map +1 -0
  394. package/dist/writer/doc.d.ts +3 -1
  395. package/dist/writer/doc.d.ts.map +1 -1
  396. package/dist/writer/doc.js +19 -6
  397. package/dist/writer/doc.js.map +1 -1
  398. package/dist/writer/gtk-doc.d.ts +1 -1
  399. package/dist/writer/gtk-doc.d.ts.map +1 -1
  400. package/dist/writer/gtk-doc.js +64 -15
  401. package/dist/writer/gtk-doc.js.map +1 -1
  402. package/dist/writer/module.d.ts +17 -3
  403. package/dist/writer/module.d.ts.map +1 -1
  404. package/dist/writer/module.js +72 -3
  405. package/dist/writer/module.js.map +1 -1
  406. package/dist/xml.d.ts +7 -1
  407. package/dist/xml.d.ts.map +1 -1
  408. package/dist/xml.js +43 -1
  409. package/dist/xml.js.map +1 -1
  410. package/overrides/gdk/rgba.ts.ejs +26 -0
  411. package/overrides/gobject/object.ts.ejs +48 -3
  412. package/overrides/gobject/value.ts.ejs +7 -0
  413. package/overrides/graphene/structs.ts.ejs +55 -0
  414. package/package.json +15 -4
  415. package/src/analysis/descriptor-render.ts +130 -66
  416. package/src/analysis/descriptor.ts +35 -11
  417. package/src/analysis/inheritance.ts +166 -75
  418. package/src/analysis/interface-conflicts.ts +237 -0
  419. package/src/analysis/nul-terminated-bytes.ts +31 -0
  420. package/src/analysis/param-capability.ts +169 -0
  421. package/src/analysis/param-structure.ts +85 -25
  422. package/src/analysis/ts-type.ts +13 -17
  423. package/src/analysis/type-key.ts +14 -0
  424. package/src/analysis/type-shape.ts +24 -0
  425. package/src/compile.ts +110 -26
  426. package/src/docs/api-reference.ts +46 -34
  427. package/src/docs/element-page.ts +58 -49
  428. package/src/docs/handwritten-props.ts +230 -0
  429. package/src/docs/pipeline.ts +131 -21
  430. package/src/docs/render.ts +153 -35
  431. package/src/docs/symbol-page.ts +230 -80
  432. package/src/fingerprint.ts +86 -32
  433. package/src/gi.ts +1 -0
  434. package/src/gir/ancestry.ts +31 -1
  435. package/src/gir/annotations.ts +37 -0
  436. package/src/gir/callback.ts +2 -0
  437. package/src/gir/class.ts +42 -4
  438. package/src/gir/cursor-overrides.ts +12 -0
  439. package/src/gir/emittable.ts +8 -0
  440. package/src/gir/enum.ts +30 -10
  441. package/src/gir/field.ts +24 -9
  442. package/src/gir/function.ts +60 -9
  443. package/src/gir/libraries.ts +11 -3
  444. package/src/gir/library.ts +52 -3
  445. package/src/gir/namespace.ts +49 -7
  446. package/src/gir/parameter.ts +62 -3
  447. package/src/gir/parse.ts +13 -9
  448. package/src/gir/primitives.ts +1 -0
  449. package/src/gir/property.ts +18 -3
  450. package/src/gir/record.ts +24 -2
  451. package/src/gir/size.ts +8 -3
  452. package/src/gir/type-id.ts +49 -3
  453. package/src/gir/type-ref.ts +1 -0
  454. package/src/gir/type.ts +50 -6
  455. package/src/guards.ts +23 -0
  456. package/src/internal.ts +2 -0
  457. package/src/json.ts +11 -0
  458. package/src/khronos/args.ts +36 -13
  459. package/src/khronos/doc-context.ts +62 -0
  460. package/src/khronos/extensions.ts +85 -0
  461. package/src/khronos/jsdoc.ts +152 -56
  462. package/src/khronos/model.ts +314 -69
  463. package/src/khronos/modules.ts +150 -40
  464. package/src/khronos/notes.ts +74 -0
  465. package/src/khronos/param-pair.ts +1 -1
  466. package/src/khronos/parse.ts +3 -4
  467. package/src/khronos/pipeline.ts +95 -42
  468. package/src/khronos/plan.ts +4 -6
  469. package/src/khronos/render.ts +62 -50
  470. package/src/khronos/select.ts +91 -50
  471. package/src/react/element-config.ts +2 -2
  472. package/src/runner.ts +20 -9
  473. package/src/staging.ts +69 -0
  474. package/src/store/compile-store.ts +7 -5
  475. package/src/store/gi/callable-doc.ts +102 -0
  476. package/src/store/gi/callables.ts +58 -44
  477. package/src/store/gi/callback.ts +10 -9
  478. package/src/store/gi/class.ts +83 -49
  479. package/src/store/gi/closure-invocation.ts +26 -0
  480. package/src/store/gi/companion.ts +7 -6
  481. package/src/store/gi/constant.ts +14 -5
  482. package/src/store/gi/constructor-props.ts +19 -23
  483. package/src/store/gi/doc-spec.ts +38 -0
  484. package/src/store/gi/enum.ts +75 -26
  485. package/src/store/gi/function.ts +72 -44
  486. package/src/store/gi/gtype-binding.ts +7 -2
  487. package/src/store/gi/interface.ts +244 -37
  488. package/src/store/gi/item-comparators.ts +3 -5
  489. package/src/store/gi/method.ts +124 -69
  490. package/src/store/gi/param-marshal.ts +91 -6
  491. package/src/store/gi/pipeline.ts +28 -13
  492. package/src/store/gi/properties.ts +10 -5
  493. package/src/store/gi/property-accessor.ts +163 -75
  494. package/src/store/gi/record-constructor.ts +56 -19
  495. package/src/store/gi/record-field-accessor.ts +13 -4
  496. package/src/store/gi/record-layout.ts +12 -2
  497. package/src/store/gi/record.ts +24 -10
  498. package/src/store/gi/registration.ts +5 -5
  499. package/src/store/gi/runtime-override.ts +13 -6
  500. package/src/store/gi/signal.ts +54 -57
  501. package/src/store/gi/value-marshalable.ts +4 -2
  502. package/src/store/gi/vtable.ts +439 -61
  503. package/src/store/gi-store.ts +26 -31
  504. package/src/store/jsx/element-components.ts +8 -5
  505. package/src/store/jsx/element-prop-imports.ts +1 -3
  506. package/src/store/jsx/element-prop-types.ts +10 -1
  507. package/src/store/jsx/generated-elements.ts +17 -8
  508. package/src/store/jsx/intrinsic-elements.ts +4 -0
  509. package/src/store/jsx/jsx.ts +11 -9
  510. package/src/store/jsx/metadata.ts +6 -3
  511. package/src/store/jsx/pipeline.ts +1 -1
  512. package/src/store/jsx/props.ts +20 -7
  513. package/src/store/jsx-store.ts +3 -3
  514. package/src/store/resolve-store.ts +133 -18
  515. package/src/store/store-fs.ts +87 -34
  516. package/src/store/store-links.ts +49 -0
  517. package/src/writer/comparison-context.ts +18 -0
  518. package/src/writer/context.ts +14 -4
  519. package/src/writer/doc-tags.ts +70 -0
  520. package/src/writer/doc.ts +29 -6
  521. package/src/writer/gtk-doc.ts +82 -15
  522. package/src/writer/module.ts +114 -4
  523. package/src/xml.ts +61 -1
@@ -0,0 +1,169 @@
1
+ import type { GirCallable, GirParameter } from "../gir/parameter.js";
2
+ import type { CArrayType, TypeId } from "../gir/type-id.js";
3
+ import type { GirType } from "../gir/type.js";
4
+ import type { ModuleContext } from "../writer/context.js";
5
+ import { isCallerAllocatedOut, isInoutParameter } from "../gir/parameter.js";
6
+ import { isCollectibleCallerOut, isHandlePassedInPlace, underlyingType } from "../store/gi/param-marshal.js";
7
+ import { recordInlineSize } from "../store/gi/record-layout.js";
8
+ import { isScalarRef } from "./descriptor-render.js";
9
+
10
+ const POINTER_DEPTH = 1;
11
+
12
+ const isPointerType = (context: ModuleContext, type: GirType): boolean => {
13
+ switch (type.kind) {
14
+ case "primitive": {
15
+ return type.category === "string";
16
+ }
17
+ case "record": {
18
+ return recordInlineSize(context, type.value) === undefined;
19
+ }
20
+ case "class":
21
+ case "interface":
22
+ case "carray":
23
+ case "list":
24
+ case "hashtable": {
25
+ return true;
26
+ }
27
+ case "alias":
28
+ case "callback":
29
+ case "enum":
30
+ case "varargs": {
31
+ return false;
32
+ }
33
+ }
34
+ };
35
+
36
+ const isPointerElement = (context: ModuleContext, element: TypeId): boolean => {
37
+ if (isScalarRef(context.library, element)) {
38
+ return false;
39
+ }
40
+
41
+ const type = underlyingType(context, element);
42
+
43
+ return type !== undefined && isPointerType(context, type);
44
+ };
45
+
46
+ const carrayIndirection = (context: ModuleContext, type: CArrayType): number =>
47
+ POINTER_DEPTH + (isPointerElement(context, type.element) ? POINTER_DEPTH : 0);
48
+
49
+ const typeIndirection = (context: ModuleContext, type: GirType): number | undefined => {
50
+ switch (type.kind) {
51
+ case "primitive": {
52
+ return type.category === "string" ? POINTER_DEPTH : undefined;
53
+ }
54
+ case "callback":
55
+ case "class":
56
+ case "hashtable":
57
+ case "interface":
58
+ case "list":
59
+ case "record": {
60
+ return POINTER_DEPTH;
61
+ }
62
+ case "carray": {
63
+ return carrayIndirection(context, type);
64
+ }
65
+ case "alias":
66
+ case "enum":
67
+ case "varargs": {
68
+ return undefined;
69
+ }
70
+ }
71
+ };
72
+
73
+ const baseIndirection = (context: ModuleContext, ref: TypeId | undefined): number | undefined => {
74
+ if (isScalarRef(context.library, ref)) {
75
+ return 0;
76
+ }
77
+
78
+ const type = ref === undefined ? undefined : underlyingType(context, ref);
79
+
80
+ return type === undefined ? undefined : typeIndirection(context, type);
81
+ };
82
+
83
+ const declaredIndirection = (parameter: GirParameter): number | undefined => {
84
+ const cType = parameter.cType;
85
+
86
+ if (cType === undefined) {
87
+ return undefined;
88
+ }
89
+
90
+ return cType.split("*").length - 1;
91
+ };
92
+
93
+ const marshalledIndirection = (context: ModuleContext, parameter: GirParameter): number | undefined => {
94
+ const base = baseIndirection(context, parameter.type);
95
+
96
+ if (base === undefined) {
97
+ return undefined;
98
+ }
99
+
100
+ if (isCallerAllocatedOut(parameter) || isHandlePassedInPlace(context, parameter)) {
101
+ return base;
102
+ }
103
+
104
+ if (isInoutParameter(parameter) && !isScalarRef(context.library, parameter.type)) {
105
+ return base;
106
+ }
107
+
108
+ return base + POINTER_DEPTH;
109
+ };
110
+
111
+ const hasCallerSuppliedLength = (context: ModuleContext, parameter: GirParameter): boolean => {
112
+ const type = parameter.type === undefined ? undefined : underlyingType(context, parameter.type);
113
+
114
+ return type?.kind === "carray" && type.lengthParameterIndex !== undefined;
115
+ };
116
+
117
+ const isUnmarshalableCallerOut = (context: ModuleContext, parameter: GirParameter): boolean => {
118
+ if (hasCallerSuppliedLength(context, parameter)) {
119
+ return true;
120
+ }
121
+
122
+ return !isCollectibleCallerOut(context, parameter) && !parameter.optional;
123
+ };
124
+
125
+ const hasIndirectionMismatch = (context: ModuleContext, parameter: GirParameter): boolean => {
126
+ const declared = declaredIndirection(parameter);
127
+ const marshalled = marshalledIndirection(context, parameter);
128
+
129
+ if (declared === undefined || marshalled === undefined) {
130
+ return false;
131
+ }
132
+
133
+ return declared !== marshalled;
134
+ };
135
+
136
+ const isTypeErasedCallback = (context: ModuleContext, parameter: GirParameter): boolean => {
137
+ if (parameter.closureIndex === undefined) {
138
+ return false;
139
+ }
140
+
141
+ const type = parameter.type === undefined ? undefined : underlyingType(context, parameter.type);
142
+
143
+ return type?.kind === "callback" && type.value.parameters.length === 0;
144
+ };
145
+
146
+ const isUnmarshalableCallParam = (context: ModuleContext, parameter: GirParameter): boolean => {
147
+ if (parameter.isVarargs) {
148
+ return false;
149
+ }
150
+
151
+ if (isTypeErasedCallback(context, parameter)) {
152
+ return true;
153
+ }
154
+
155
+ if (parameter.direction === "in") {
156
+ return false;
157
+ }
158
+
159
+ if (isCallerAllocatedOut(parameter)) {
160
+ return isUnmarshalableCallerOut(context, parameter);
161
+ }
162
+
163
+ return hasIndirectionMismatch(context, parameter);
164
+ };
165
+
166
+ const hasUnmarshalableParam = (context: ModuleContext, callable: GirCallable): boolean =>
167
+ callable.parameters.some((parameter) => isUnmarshalableCallParam(context, parameter));
168
+
169
+ export { hasUnmarshalableParam };
@@ -2,8 +2,9 @@ import { toCamelIdentifier } from "@gtkx/utils";
2
2
  import type { GirFunction } from "../gir/function.js";
3
3
  import type { Library } from "../gir/library.js";
4
4
  import type { TypeId } from "../gir/type-id.js";
5
+ import type { JsDocParam } from "../writer/doc-tags.js";
5
6
  import { type GirCallable, type GirParameter, isCallerAllocatedOut, isOutParameter } from "../gir/parameter.js";
6
- import { isCellInout, shouldOmitPrimaryReturn } from "./descriptor-render.js";
7
+ import { isCellInout, isVoidPrimaryReturn } from "./descriptor-render.js";
7
8
 
8
9
  type InputParameter = {
9
10
  parameter: GirParameter;
@@ -16,6 +17,7 @@ type HandlerResultOptions = {
16
17
  renderType: (ref: TypeId | undefined, isNullable: boolean) => string;
17
18
  shouldIncludeCallerAllocated: boolean;
18
19
  isOptOut: boolean;
20
+ shouldExcludeOut?: (parameter: GirParameter) => boolean;
19
21
  };
20
22
 
21
23
  const isInputParameter = (options: {
@@ -108,7 +110,7 @@ const carrayLengthIndex = (library: Library, ref: TypeId | undefined): number |
108
110
  return type.lengthParameterIndex;
109
111
  };
110
112
 
111
- const arrayLengthSources = (library: Library, fn: GirFunction): Map<number, number> => {
113
+ const arrayLengthSources = (library: Library, fn: GirCallable): Map<number, number> => {
112
114
  const map: Map<number, number> = new Map();
113
115
 
114
116
  for (const [index, parameter] of fn.parameters.entries()) {
@@ -122,19 +124,7 @@ const arrayLengthSources = (library: Library, fn: GirFunction): Map<number, numb
122
124
  return map;
123
125
  };
124
126
 
125
- const hasCallerAllocatedArrayLength = (library: Library, fn: GirFunction): boolean => {
126
- for (const arrayIndex of arrayLengthSources(library, fn).values()) {
127
- const array = fn.parameters[arrayIndex];
128
-
129
- if (array !== undefined && isCallerAllocatedOut(array)) {
130
- return true;
131
- }
132
- }
133
-
134
- return false;
135
- };
136
-
137
- const returnArrayLengthIndices = (library: Library, fn: GirFunction): Set<number> => {
127
+ const returnArrayLengthIndices = (library: Library, fn: GirCallable): Set<number> => {
138
128
  const returnType = fn.returnValue.type === undefined ? undefined : library.typeFor(fn.returnValue.type);
139
129
 
140
130
  if (returnType?.kind !== "carray") {
@@ -150,7 +140,7 @@ const returnArrayLengthIndices = (library: Library, fn: GirFunction): Set<number
150
140
  return new Set([lengthIndex]);
151
141
  };
152
142
 
153
- const foldedLengthIndices = (library: Library, fn: GirFunction): Set<number> => {
143
+ const foldedLengthIndices = (library: Library, fn: GirCallable): Set<number> => {
154
144
  const indices: Set<number> = new Set(arrayLengthSources(library, fn).keys());
155
145
 
156
146
  for (const index of returnArrayLengthIndices(library, fn)) {
@@ -160,6 +150,20 @@ const foldedLengthIndices = (library: Library, fn: GirFunction): Set<number> =>
160
150
  return indices;
161
151
  };
162
152
 
153
+ const foldedLengthParameters = (library: Library, fn: GirCallable): Set<GirParameter> => {
154
+ const folded: Set<GirParameter> = new Set();
155
+
156
+ for (const index of foldedLengthIndices(library, fn)) {
157
+ const parameter = fn.parameters[index];
158
+
159
+ if (parameter !== undefined) {
160
+ folded.add(parameter);
161
+ }
162
+ }
163
+
164
+ return folded;
165
+ };
166
+
163
167
  const parameterIdentifier = (parameter: GirParameter, index: number): string => {
164
168
  if (parameter.name.length === 0) {
165
169
  return `arg${String(index)}`;
@@ -168,17 +172,62 @@ const parameterIdentifier = (parameter: GirParameter, index: number): string =>
168
172
  return toCamelIdentifier(parameter.name);
169
173
  };
170
174
 
175
+ const handlerParameters = (
176
+ parameters: GirParameter[],
177
+ shouldExclude: (parameter: GirParameter) => boolean = () => false,
178
+ ): GirParameter[] =>
179
+ parameters.filter(
180
+ (parameter) => !parameter.isVarargs && !isOutParameter(parameter) && !shouldExclude(parameter),
181
+ );
182
+
183
+ const documentedParameters = (
184
+ library: Library,
185
+ fn: GirFunction,
186
+ shouldSkip: (parameter: GirParameter) => boolean = () => false,
187
+ renames?: Map<string, string>,
188
+ ): JsDocParam[] =>
189
+ inputParameters(library, fn)
190
+ .filter(({ parameter }) => !shouldSkip(parameter))
191
+ .map(({ parameter, index }) => ({
192
+ name: renames?.get(parameter.name) ?? parameterIdentifier(parameter, index),
193
+ doc: parameter.doc ?? "",
194
+ }))
195
+ .filter((entry) => entry.doc.length > 0);
196
+
197
+ const documentedHandlerParameters = (parameters: GirParameter[]): JsDocParam[] =>
198
+ handlerParameters(parameters)
199
+ .map((parameter, index) => ({ name: parameterIdentifier(parameter, index), doc: parameter.doc ?? "" }))
200
+ .filter((entry) => entry.doc.length > 0);
201
+
202
+ const handlerRenames = (parameters: GirParameter[]): Map<string, string> => {
203
+ const renames: Map<string, string> = new Map();
204
+
205
+ for (const [index, parameter] of parameters.entries()) {
206
+ renames.set(parameter.name, parameterIdentifier(parameter, index));
207
+ }
208
+
209
+ return renames;
210
+ };
211
+
212
+ const renamesWithInstance = (parameters: GirParameter[], instance: GirParameter | undefined): Map<string, string> => {
213
+ const renames = handlerRenames(parameters);
214
+
215
+ if (instance !== undefined && instance.name.length > 0) {
216
+ renames.set(instance.name, "this");
217
+ }
218
+
219
+ return renames;
220
+ };
221
+
171
222
  const renderHandlerParameters = (
172
223
  parameters: GirParameter[],
173
224
  renderType: (ref: TypeId | undefined, isNullable: boolean) => string,
174
225
  shouldExclude: (parameter: GirParameter) => boolean = () => false,
175
226
  ): string[] =>
176
- parameters
177
- .filter((parameter) => !parameter.isVarargs && !isOutParameter(parameter) && !shouldExclude(parameter))
178
- .map(
179
- (parameter, index) =>
180
- `${parameterIdentifier(parameter, index)}: ${renderType(parameter.type, parameter.nullable)}`,
181
- );
227
+ handlerParameters(parameters, shouldExclude).map(
228
+ (parameter, index) =>
229
+ `${parameterIdentifier(parameter, index)}: ${renderType(parameter.type, parameter.nullable)}`,
230
+ );
182
231
 
183
232
  const foldOutParamShape = (primary: string | undefined, outTypes: string[]): string => {
184
233
  if (primary !== undefined) {
@@ -226,13 +275,18 @@ const scalarResultType = (primary: string | undefined, isOptOut: boolean): strin
226
275
 
227
276
  const renderHandlerResultType = (options: HandlerResultOptions): string => {
228
277
  const { library, signal, renderType, shouldIncludeCallerAllocated, isOptOut } = options;
278
+ const shouldExcludeOut = options.shouldExcludeOut ?? (() => false);
229
279
 
230
- const primary = shouldOmitPrimaryReturn(library, signal.returnValue)
280
+ const primary = isVoidPrimaryReturn(library, signal.returnValue)
231
281
  ? undefined
232
282
  : renderType(signal.returnValue.type, signal.returnValue.nullable);
233
283
 
234
284
  const outTypes = signal.parameters
235
- .filter((parameter) => isHandlerOutParameter({ library, parameter, shouldIncludeCallerAllocated }))
285
+ .filter(
286
+ (parameter) =>
287
+ isHandlerOutParameter({ library, parameter, shouldIncludeCallerAllocated }) &&
288
+ !shouldExcludeOut(parameter),
289
+ )
236
290
  .map((parameter) => renderType(parameter.type, parameter.nullable));
237
291
 
238
292
  if (outTypes.length === 0) {
@@ -247,10 +301,16 @@ export {
247
301
  inputParameters,
248
302
  closureAndDestroyIndices,
249
303
  arrayLengthSources,
250
- hasCallerAllocatedArrayLength,
251
304
  foldedLengthIndices,
305
+ foldedLengthParameters,
252
306
  parameterIdentifier,
307
+ documentedParameters,
308
+ documentedHandlerParameters,
309
+ handlerRenames,
310
+ renamesWithInstance,
311
+ handlerParameters,
253
312
  renderHandlerParameters,
254
313
  foldOutParamShape,
255
314
  renderHandlerResultType,
315
+ type InputParameter,
256
316
  };
@@ -1,6 +1,8 @@
1
+ import { sanitizeTypeIdentifier } from "@gtkx/utils";
1
2
  import type { Library } from "../gir/library.js";
2
3
  import type { EntityType, GirType } from "../gir/type.js";
3
4
  import type { ModuleContext } from "../writer/context.js";
5
+ import { isEmittableEntity } from "../gir/emittable.js";
4
6
  import { PRIMITIVE_TS_TYPE } from "../gir/primitives.js";
5
7
  import {
6
8
  type CArrayType,
@@ -24,21 +26,14 @@ type TsTypeTarget = {
24
26
  renderGtype: () => string;
25
27
  };
26
28
 
27
- const willEmitEntity = (type: EntityType): boolean => {
28
- switch (type.kind) {
29
- case "callback": {
30
- return type.value.introspectable && type.value.name.length > 0;
31
- }
32
- case "record": {
33
- return type.value.introspectable && type.value.name.length > 0;
34
- }
35
- case "alias":
36
- case "class":
37
- case "enum":
38
- case "interface": {
39
- return true;
40
- }
41
- }
29
+ const willEmitEntity = (type: EntityType): boolean => isEmittableEntity(type.value);
30
+
31
+ const referenceName = (library: Library, ref: TypeId): ReferenceName | undefined => {
32
+ const name = library.nameFor(ref);
33
+
34
+ return name === undefined
35
+ ? undefined
36
+ : { namespaceName: name.namespaceName, typeName: sanitizeTypeIdentifier(name.typeName) };
42
37
  };
43
38
 
44
39
  const renderPrimitiveType = (target: TsTypeTarget, type: Extract<GirType, { kind: "primitive" }>): string =>
@@ -56,12 +51,13 @@ const renderBaseType = (library: Library, target: TsTypeTarget, ref: TypeId | un
56
51
  }
57
52
 
58
53
  const type = library.typeFor(ref);
59
- const name = library.nameFor(ref);
60
54
 
61
55
  if (type === undefined) {
62
- return renderNamedType(target, undefined, name);
56
+ return renderNamedType(target, undefined, undefined);
63
57
  }
64
58
 
59
+ const name = referenceName(library, ref);
60
+
65
61
  switch (type.kind) {
66
62
  case "primitive": {
67
63
  return renderPrimitiveType(target, type);
@@ -0,0 +1,14 @@
1
+ import type { Library } from "../gir/library.js";
2
+ import type { TypeId } from "../gir/type-id.js";
3
+
4
+ const typeKey = (library: Library, ref: TypeId | undefined): string => {
5
+ if (ref === undefined) {
6
+ return "void";
7
+ }
8
+
9
+ const type = library.typeFor(ref);
10
+
11
+ return type?.kind === "primitive" && type.category === "void" ? "void" : `${String(ref.nsId)}.${String(ref.id)}`;
12
+ };
13
+
14
+ export { typeKey };
@@ -0,0 +1,24 @@
1
+ import type { Library } from "../gir/library.js";
2
+ import type { PrimitiveCategory } from "../gir/primitives.js";
3
+ import type { CArrayType, TypeId } from "../gir/type-id.js";
4
+ import type { GirType } from "../gir/type.js";
5
+
6
+ const resolvedTypeFor = (library: Library, ref: TypeId | undefined): GirType | undefined =>
7
+ ref === undefined ? undefined : library.typeFor(ref);
8
+
9
+ const carrayFor = (library: Library, ref: TypeId | undefined): CArrayType | undefined => {
10
+ const type = resolvedTypeFor(library, ref);
11
+
12
+ return type?.kind === "carray" ? type : undefined;
13
+ };
14
+
15
+ const primitiveCategoryFor = (library: Library, ref: TypeId | undefined): PrimitiveCategory | undefined => {
16
+ const type = resolvedTypeFor(library, ref);
17
+
18
+ return type?.kind === "primitive" ? type.category : undefined;
19
+ };
20
+
21
+ const isUnboundedArray = (type: CArrayType): boolean =>
22
+ type.isZeroTerminated && type.lengthParameterIndex === undefined && type.fixedSize === undefined;
23
+
24
+ export { carrayFor, isUnboundedArray, primitiveCategoryFor };
package/src/compile.ts CHANGED
@@ -1,20 +1,37 @@
1
- import { existsSync, mkdirSync, mkdtempSync, rmSync, symlinkSync, writeFileSync } from "node:fs";
1
+ import { errorMessage, normalizeError } from "@gtkx/utils";
2
+ import { existsSync, mkdirSync, renameSync, rmSync, symlinkSync, writeFileSync } from "node:fs";
2
3
  import { dirname, isAbsolute, join, relative } from "node:path";
3
4
  import { fileURLToPath } from "node:url";
4
5
  import ts from "typescript";
6
+ import { createStagingDir, sweepStrandedDirs } from "./staging.js";
5
7
 
6
- type SourceModule = {
8
+ type ProjectFile = {
7
9
  fileName: string;
10
+ origin?: string | undefined;
11
+ };
12
+
13
+ type SourceModule = ProjectFile & {
8
14
  source: string;
9
15
  };
10
16
 
11
17
  type CompileProjectParams = {
12
18
  projectDir: string;
13
- fileNames: string[];
19
+ files: ProjectFile[];
14
20
  compilerOptions: Record<string, unknown>;
15
21
  label: string;
16
22
  };
17
23
 
24
+ type DiagnosedFile = {
25
+ fileName: string;
26
+ text: string;
27
+ };
28
+
29
+ type FailedProjectInput = {
30
+ projectDir: string;
31
+ keepAt: string;
32
+ error: unknown;
33
+ };
34
+
18
35
  const BASE_COMPILER_OPTIONS = {
19
36
  module: "esnext",
20
37
  moduleResolution: "bundler",
@@ -43,6 +60,10 @@ const CHECK_OPTIONS = {
43
60
  noEmit: true,
44
61
  };
45
62
 
63
+ const CHECK_DIR = ".gtkx-check";
64
+ const FAILED_CHECK_DIR = `${CHECK_DIR}.failed`;
65
+ const LEGACY_CHECK_PREFIX = `${CHECK_DIR}-`;
66
+
46
67
  const FORMAT_HOST: ts.FormatDiagnosticsHost = {
47
68
  getCanonicalFileName: (fileName) => fileName,
48
69
  getCurrentDirectory: () => ts.sys.getCurrentDirectory(),
@@ -72,54 +93,107 @@ const linkToolingModules = (projectDir: string): (() => void) => {
72
93
  const isProjectFile = (rel: string): boolean =>
73
94
  !rel.startsWith("..") && !isAbsolute(rel) && !rel.split(/[/\\]/).includes("node_modules");
74
95
 
75
- const projectDiagnosticLine = (diagnostic: ts.Diagnostic, projectDir: string): string | undefined => {
96
+ const projectDiagnosticFile = (diagnostic: ts.Diagnostic, projectDir: string): DiagnosedFile | undefined => {
76
97
  const { file, start } = diagnostic;
77
98
 
78
99
  if (file === undefined || start === undefined) {
79
100
  return undefined;
80
101
  }
81
102
 
82
- const filePath = relative(projectDir, file.fileName);
103
+ const fileName = relative(projectDir, file.fileName);
83
104
 
84
- if (!isProjectFile(filePath)) {
105
+ if (!isProjectFile(fileName)) {
85
106
  return undefined;
86
107
  }
87
108
 
88
109
  const { line, character } = file.getLineAndCharacterOfPosition(start);
89
110
  const message = ts.flattenDiagnosticMessageText(diagnostic.messageText, "\n");
90
111
 
91
- return `${filePath}:${String(line + 1)}:${String(character + 1)} - ${message} (TS${String(diagnostic.code)})`;
112
+ return {
113
+ fileName,
114
+ text: `${fileName}:${String(line + 1)}:${String(character + 1)} - ${message} (TS${String(diagnostic.code)})`,
115
+ };
92
116
  };
93
117
 
94
- const projectDiagnosticLines = (diagnostics: ts.Diagnostic[], projectDir: string): string[] => {
95
- const lines: string[] = [];
118
+ const projectDiagnosticFiles = (diagnostics: ts.Diagnostic[], projectDir: string): DiagnosedFile[] => {
119
+ const diagnosed: DiagnosedFile[] = [];
96
120
 
97
121
  for (const diagnostic of diagnostics) {
98
- const line = projectDiagnosticLine(diagnostic, projectDir);
122
+ const entry = projectDiagnosticFile(diagnostic, projectDir);
123
+
124
+ if (entry !== undefined) {
125
+ diagnosed.push(entry);
126
+ }
127
+ }
128
+
129
+ return diagnosed;
130
+ };
131
+
132
+ const collectOrigins = (files: ProjectFile[]): Map<string, string> => {
133
+ const origins: Map<string, string> = new Map();
134
+
135
+ for (const { fileName, origin } of files) {
136
+ if (origin !== undefined) {
137
+ origins.set(fileName, origin);
138
+ }
139
+ }
99
140
 
100
- if (line !== undefined) {
101
- lines.push(line);
141
+ return origins;
142
+ };
143
+
144
+ const groupByOrigin = (diagnosed: DiagnosedFile[], origins: Map<string, string>): Map<string, Set<string>> => {
145
+ const grouped: Map<string, Set<string>> = new Map();
146
+
147
+ for (const { fileName } of diagnosed) {
148
+ const origin = origins.get(fileName);
149
+
150
+ if (origin !== undefined) {
151
+ grouped.set(origin, (grouped.get(origin) ?? new Set<string>()).add(fileName));
102
152
  }
103
153
  }
104
154
 
105
- return lines;
155
+ return grouped;
106
156
  };
107
157
 
108
- const diagnosticError = (label: string, projectDir: string, diagnostics: ts.Diagnostic[]): Error => {
109
- const lines = projectDiagnosticLines(diagnostics, projectDir);
158
+ const originLines = (diagnosed: DiagnosedFile[], files: ProjectFile[]): string[] =>
159
+ [...groupByOrigin(diagnosed, collectOrigins(files))].map(
160
+ ([origin, generated]) => `Generated from ${origin}: ${[...generated].join(", ")}`,
161
+ );
162
+
163
+ const diagnosticError = (params: CompileProjectParams, diagnostics: ts.Diagnostic[]): Error => {
164
+ const diagnosed = projectDiagnosticFiles(diagnostics, params.projectDir);
165
+ const { label } = params;
110
166
 
111
- if (lines.length > 0) {
112
- return new Error(`Type checking ${label} found ${String(lines.length)} error(s):\n${lines.join("\n")}`);
167
+ if (diagnosed.length === 0) {
168
+ return new Error(`Type checking ${label} failed:\n${ts.formatDiagnostics(diagnostics, FORMAT_HOST).trim()}`);
113
169
  }
114
170
 
115
- return new Error(`Type checking ${label} failed:\n${ts.formatDiagnostics(diagnostics, FORMAT_HOST).trim()}`);
171
+ const lines = [...diagnosed.map((entry) => entry.text), ...originLines(diagnosed, params.files)];
172
+
173
+ return new Error(`Type checking ${label} found ${String(diagnosed.length)} error(s):\n${lines.join("\n")}`);
174
+ };
175
+
176
+ const keepFailedProject = (input: FailedProjectInput): Error => {
177
+ const { projectDir, keepAt, error } = input;
178
+
179
+ if (!existsSync(projectDir)) {
180
+ return normalizeError(error);
181
+ }
182
+
183
+ rmSync(keepAt, { recursive: true, force: true });
184
+ renameSync(projectDir, keepAt);
185
+ const rebased = errorMessage(error).split(projectDir).join(keepAt);
186
+
187
+ return new Error(`${rebased}\nThe generated sources are kept at ${keepAt}, where every path above resolves.`, {
188
+ cause: error,
189
+ });
116
190
  };
117
191
 
118
192
  const runProgram = (params: CompileProjectParams): ts.Diagnostic[] => {
119
193
  const parsed = ts.parseJsonConfigFileContent(
120
194
  {
121
195
  compilerOptions: { ...BASE_COMPILER_OPTIONS, ...params.compilerOptions },
122
- files: params.fileNames.map((name) => `./${name}`),
196
+ files: params.files.map((file) => `./${file.fileName}`),
123
197
  },
124
198
  ts.sys,
125
199
  params.projectDir,
@@ -147,17 +221,24 @@ const compileProject = (params: CompileProjectParams): void => {
147
221
  const diagnostics = runProgram(params);
148
222
 
149
223
  if (diagnostics.length > 0) {
150
- throw diagnosticError(params.label, params.projectDir, diagnostics);
224
+ throw diagnosticError(params, diagnostics);
151
225
  }
152
226
  } finally {
153
227
  unlinkToolingModules();
154
228
  }
155
229
  };
156
230
 
231
+ const stageCheckProject = (checkRoot: string): string => {
232
+ const projectDir = createStagingDir(join(checkRoot, CHECK_DIR));
233
+ sweepStrandedDirs(checkRoot, LEGACY_CHECK_PREFIX);
234
+
235
+ return projectDir;
236
+ };
237
+
157
238
  const checkModules = (params: { modules: SourceModule[]; resolveFrom: string; label: string }): void => {
158
239
  const checkRoot = join(params.resolveFrom, "node_modules");
159
- mkdirSync(checkRoot, { recursive: true });
160
- const projectDir = mkdtempSync(join(checkRoot, ".gtkx-check-"));
240
+ const projectDir = stageCheckProject(checkRoot);
241
+ const keepAt = join(checkRoot, FAILED_CHECK_DIR);
161
242
 
162
243
  try {
163
244
  for (const module of params.modules) {
@@ -168,13 +249,16 @@ const checkModules = (params: { modules: SourceModule[]; resolveFrom: string; la
168
249
 
169
250
  compileProject({
170
251
  projectDir,
171
- fileNames: params.modules.map((module) => module.fileName),
252
+ files: params.modules,
172
253
  compilerOptions: CHECK_OPTIONS,
173
254
  label: params.label,
174
255
  });
175
- } finally {
176
- rmSync(projectDir, { recursive: true, force: true });
256
+ } catch (error) {
257
+ throw keepFailedProject({ projectDir, keepAt, error });
177
258
  }
259
+
260
+ rmSync(projectDir, { recursive: true, force: true });
261
+ rmSync(keepAt, { recursive: true, force: true });
178
262
  };
179
263
 
180
- export { compileProject, checkModules, type SourceModule, type CompileProjectParams };
264
+ export { compileProject, checkModules, keepFailedProject, type ProjectFile, type SourceModule };