@ts-for-gir/lib 4.0.0-beta.4 → 4.0.0-beta.41

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 (541) hide show
  1. package/README.md +13 -1
  2. package/package.json +18 -31
  3. package/src/constants.ts +152 -0
  4. package/src/dependency-manager.ts +445 -0
  5. package/src/formatters/default.ts +7 -0
  6. package/src/formatters/formatter.ts +3 -0
  7. package/src/formatters/index.ts +3 -0
  8. package/src/formatters/json.ts +7 -0
  9. package/src/generators/generator.ts +65 -0
  10. package/src/generators/index.ts +2 -0
  11. package/src/generics/clutter.ts +80 -0
  12. package/src/generics/generify.ts +101 -0
  13. package/src/generics/gio.ts +91 -0
  14. package/src/generics/glib.ts +31 -0
  15. package/src/generics/gtk.ts +99 -0
  16. package/src/generics/meta.ts +50 -0
  17. package/src/generics/st.ts +206 -0
  18. package/src/generics/visitor.ts +484 -0
  19. package/src/gir/alias.ts +73 -0
  20. package/src/gir/callback.ts +79 -0
  21. package/src/gir/const.ts +73 -0
  22. package/src/gir/constructor.ts +91 -0
  23. package/src/gir/data.ts +12 -0
  24. package/src/gir/dependency-resolver.ts +81 -0
  25. package/src/gir/direct-allocation-constructor.ts +65 -0
  26. package/src/gir/enum-member.ts +51 -0
  27. package/src/gir/enum.ts +129 -0
  28. package/src/gir/error.ts +89 -0
  29. package/src/gir/function.ts +296 -0
  30. package/src/gir/generics.ts +66 -0
  31. package/src/gir/gir-complex-record.ts +7 -0
  32. package/src/gir/index.ts +25 -0
  33. package/src/gir/introspected-base.ts +104 -0
  34. package/src/gir/introspected-class-member.ts +15 -0
  35. package/src/gir/introspected-classes.ts +1484 -0
  36. package/src/gir/introspected-namespace-member.ts +24 -0
  37. package/src/gir/namespace.ts +76 -0
  38. package/src/gir/parameter.ts +199 -0
  39. package/src/gir/promisify.ts +209 -0
  40. package/src/gir/property.ts +203 -0
  41. package/src/gir/record.ts +488 -0
  42. package/src/gir/registry.ts +183 -0
  43. package/src/gir/signal.ts +278 -0
  44. package/src/gir-module.ts +719 -0
  45. package/src/gir.ts +869 -0
  46. package/src/index.ts +16 -0
  47. package/src/injections/gee08.ts +89 -0
  48. package/src/injections/gee1.ts +35 -0
  49. package/src/injections/gio.ts +720 -0
  50. package/src/injections/glib.ts +280 -0
  51. package/src/injections/gobject.ts +906 -0
  52. package/src/injections/gtk4.ts +23 -0
  53. package/src/injections/inject.ts +49 -0
  54. package/src/injections/shell.ts +49 -0
  55. package/src/injections/tracker1.ts +42 -0
  56. package/src/library-version.ts +50 -0
  57. package/src/logger.ts +104 -0
  58. package/src/messages.ts +57 -0
  59. package/src/templates/index.ts +1 -0
  60. package/src/templates/template-engine.ts +178 -0
  61. package/src/types/answer-version.ts +4 -0
  62. package/src/types/any-introspected-type.ts +5 -0
  63. package/src/types/class-function-types.ts +57 -0
  64. package/src/types/class-member.ts +5 -0
  65. package/src/types/class-parent.ts +14 -0
  66. package/src/types/class.ts +43 -0
  67. package/src/types/config-flags.ts +5 -0
  68. package/src/types/construct-name.ts +13 -0
  69. package/src/types/dependency-map.ts +4 -0
  70. package/src/types/dependency.ts +49 -0
  71. package/src/types/file-info.ts +14 -0
  72. package/src/types/format.ts +1 -0
  73. package/src/types/generator-constructor.ts +7 -0
  74. package/src/types/generics-config.ts +90 -0
  75. package/src/types/gir-any-element.ts +35 -0
  76. package/src/types/gir-module-interface.ts +22 -0
  77. package/src/types/gir-module-resolved.ts +32 -0
  78. package/src/types/gir-type-name.ts +20 -0
  79. package/src/types/index.ts +92 -0
  80. package/{lib/types/inheritance-table.d.ts → src/types/inheritance-table.ts} +1 -1
  81. package/src/types/introspected.ts +18 -0
  82. package/src/types/local-name-check.ts +5 -0
  83. package/src/types/local-name-type.ts +1 -0
  84. package/src/types/local-name.ts +8 -0
  85. package/src/types/local-names.ts +5 -0
  86. package/src/types/metadata.ts +6 -0
  87. package/src/types/ns-loader.ts +6 -0
  88. package/src/types/options-base.ts +8 -0
  89. package/src/types/options-generation.ts +65 -0
  90. package/src/types/options-load.ts +6 -0
  91. package/src/types/options-transform.ts +5 -0
  92. package/src/types/output-format.ts +1 -0
  93. package/src/types/package-data-parsed.ts +28 -0
  94. package/src/types/package-data.ts +24 -0
  95. package/src/types/package-section-parsed.ts +9 -0
  96. package/src/types/parsed-gir.ts +5 -0
  97. package/src/types/parsed-package-data.ts +7 -0
  98. package/src/types/property-case.ts +1 -0
  99. package/src/types/resolve-type.ts +4 -0
  100. package/src/types/template-data.ts +8 -0
  101. package/src/types/template-options.ts +33 -0
  102. package/src/types/transformation-case.ts +9 -0
  103. package/src/types/transformations.ts +5 -0
  104. package/{lib/types/ts-doc-tag.d.ts → src/types/ts-doc-tag.ts} +14 -12
  105. package/src/types/ts-doc.ts +18 -0
  106. package/{lib/types/type-gir-alias.d.ts → src/types/type-gir-alias.ts} +1 -1
  107. package/src/types/type-gir-class.ts +2 -0
  108. package/src/types/type-gir-element.ts +25 -0
  109. package/src/types/type-gir-enumeration-member.ts +2 -0
  110. package/{lib/types/type-gir-enumeration.d.ts → src/types/type-gir-enumeration.ts} +1 -1
  111. package/src/types/type-gir-function.ts +8 -0
  112. package/{lib/types/type-gir-interface.d.ts → src/types/type-gir-interface.ts} +1 -1
  113. package/src/types/type-gir-method.ts +2 -0
  114. package/src/types/type-gir-parameter.ts +1 -0
  115. package/{lib/types/type-gir-property.d.ts → src/types/type-gir-property.ts} +1 -1
  116. package/src/types/type-gir-variable.ts +1 -0
  117. package/src/types/type-ts-element.ts +13 -0
  118. package/{lib/types/type-ts-enumeration-member.d.ts → src/types/type-ts-enumeration-member.ts} +1 -1
  119. package/src/types/type-ts-function.ts +1 -0
  120. package/src/types/type-ts-property.ts +1 -0
  121. package/src/types/user-config-load-result.ts +6 -0
  122. package/src/types/user-config.ts +70 -0
  123. package/src/util.ts +84 -0
  124. package/src/utils/conflicts/conflict-resolver.ts +122 -0
  125. package/src/utils/conflicts/function-conflict-detector.ts +139 -0
  126. package/src/utils/conflicts/index.ts +2 -0
  127. package/src/utils/conflicts.ts +593 -0
  128. package/src/utils/documentation.ts +471 -0
  129. package/src/utils/files.ts +71 -0
  130. package/src/utils/function-type-guards.ts +61 -0
  131. package/src/utils/generation.ts +69 -0
  132. package/src/utils/gir-parsing.ts +262 -0
  133. package/src/utils/girs.ts +113 -0
  134. package/src/utils/index.ts +14 -0
  135. package/src/utils/naming.ts +188 -0
  136. package/src/utils/numbers.ts +8 -0
  137. package/src/utils/objects.ts +129 -0
  138. package/src/utils/path.ts +7 -0
  139. package/src/utils/registry.ts +5 -0
  140. package/src/utils/strings.ts +134 -0
  141. package/src/utils/type-resolution.ts +116 -0
  142. package/src/utils/types.ts +249 -0
  143. package/src/validators/class.ts +324 -0
  144. package/src/validators/function-parameters.ts +52 -0
  145. package/src/validators/interface.ts +20 -0
  146. package/src/visitor.ts +58 -0
  147. package/lib/constants.d.ts +0 -26
  148. package/lib/constants.js +0 -28
  149. package/lib/constants.js.map +0 -1
  150. package/lib/dependency-manager.d.ts +0 -183
  151. package/lib/dependency-manager.js +0 -401
  152. package/lib/dependency-manager.js.map +0 -1
  153. package/lib/formatters/default.d.ts +0 -4
  154. package/lib/formatters/default.js +0 -7
  155. package/lib/formatters/default.js.map +0 -1
  156. package/lib/formatters/formatter.d.ts +0 -3
  157. package/lib/formatters/formatter.js +0 -3
  158. package/lib/formatters/formatter.js.map +0 -1
  159. package/lib/formatters/json.d.ts +0 -4
  160. package/lib/formatters/json.js +0 -7
  161. package/lib/formatters/json.js.map +0 -1
  162. package/lib/generators/dts/glib.d.ts +0 -2
  163. package/lib/generators/dts/glib.js +0 -514
  164. package/lib/generators/dts/glib.js.map +0 -1
  165. package/lib/generators/dts/gobject.d.ts +0 -2
  166. package/lib/generators/dts/gobject.js +0 -117
  167. package/lib/generators/dts/gobject.js.map +0 -1
  168. package/lib/generators/dts-inline.d.ts +0 -8
  169. package/lib/generators/dts-inline.js +0 -59
  170. package/lib/generators/dts-inline.js.map +0 -1
  171. package/lib/generators/dts-modules.d.ts +0 -8
  172. package/lib/generators/dts-modules.js +0 -100
  173. package/lib/generators/dts-modules.js.map +0 -1
  174. package/lib/generators/dts.d.ts +0 -45
  175. package/lib/generators/dts.js +0 -682
  176. package/lib/generators/dts.js.map +0 -1
  177. package/lib/generators/generator.d.ts +0 -45
  178. package/lib/generators/generator.js +0 -9
  179. package/lib/generators/generator.js.map +0 -1
  180. package/lib/generators/index.d.ts +0 -5
  181. package/lib/generators/index.js +0 -6
  182. package/lib/generators/index.js.map +0 -1
  183. package/lib/generators/json.d.ts +0 -256
  184. package/lib/generators/json.js +0 -869
  185. package/lib/generators/json.js.map +0 -1
  186. package/lib/generics/clutter.d.ts +0 -26
  187. package/lib/generics/clutter.js +0 -49
  188. package/lib/generics/clutter.js.map +0 -1
  189. package/lib/generics/generify.d.ts +0 -2
  190. package/lib/generics/generify.js +0 -39
  191. package/lib/generics/generify.js.map +0 -1
  192. package/lib/generics/gio.d.ts +0 -7
  193. package/lib/generics/gio.js +0 -51
  194. package/lib/generics/gio.js.map +0 -1
  195. package/lib/generics/glib.d.ts +0 -7
  196. package/lib/generics/glib.js +0 -18
  197. package/lib/generics/glib.js.map +0 -1
  198. package/lib/generics/meta.d.ts +0 -21
  199. package/lib/generics/meta.js +0 -26
  200. package/lib/generics/meta.js.map +0 -1
  201. package/lib/generics/st.d.ts +0 -16
  202. package/lib/generics/st.js +0 -92
  203. package/lib/generics/st.js.map +0 -1
  204. package/lib/generics/visitor.d.ts +0 -20
  205. package/lib/generics/visitor.js +0 -255
  206. package/lib/generics/visitor.js.map +0 -1
  207. package/lib/gir/alias.d.ts +0 -24
  208. package/lib/gir/alias.js +0 -43
  209. package/lib/gir/alias.js.map +0 -1
  210. package/lib/gir/base.d.ts +0 -62
  211. package/lib/gir/base.js +0 -95
  212. package/lib/gir/base.js.map +0 -1
  213. package/lib/gir/class.d.ts +0 -189
  214. package/lib/gir/class.js +0 -1131
  215. package/lib/gir/class.js.map +0 -1
  216. package/lib/gir/const.d.ts +0 -25
  217. package/lib/gir/const.js +0 -43
  218. package/lib/gir/const.js.map +0 -1
  219. package/lib/gir/enum.d.ts +0 -45
  220. package/lib/gir/enum.js +0 -164
  221. package/lib/gir/enum.js.map +0 -1
  222. package/lib/gir/function.d.ts +0 -199
  223. package/lib/gir/function.js +0 -683
  224. package/lib/gir/function.js.map +0 -1
  225. package/lib/gir/generics.d.ts +0 -5
  226. package/lib/gir/generics.js +0 -57
  227. package/lib/gir/generics.js.map +0 -1
  228. package/lib/gir/namespace.d.ts +0 -21
  229. package/lib/gir/namespace.js +0 -57
  230. package/lib/gir/namespace.js.map +0 -1
  231. package/lib/gir/nodes.d.ts +0 -11
  232. package/lib/gir/nodes.js +0 -12
  233. package/lib/gir/nodes.js.map +0 -1
  234. package/lib/gir/property.d.ts +0 -60
  235. package/lib/gir/property.js +0 -128
  236. package/lib/gir/property.js.map +0 -1
  237. package/lib/gir/registry.d.ts +0 -51
  238. package/lib/gir/registry.js +0 -144
  239. package/lib/gir/registry.js.map +0 -1
  240. package/lib/gir/signal.d.ts +0 -33
  241. package/lib/gir/signal.js +0 -165
  242. package/lib/gir/signal.js.map +0 -1
  243. package/lib/gir/util.d.ts +0 -49
  244. package/lib/gir/util.js +0 -559
  245. package/lib/gir/util.js.map +0 -1
  246. package/lib/gir-module.d.ts +0 -112
  247. package/lib/gir-module.js +0 -570
  248. package/lib/gir-module.js.map +0 -1
  249. package/lib/gir.d.ts +0 -253
  250. package/lib/gir.js +0 -642
  251. package/lib/gir.js.map +0 -1
  252. package/lib/index.d.ts +0 -14
  253. package/lib/index.js +0 -17
  254. package/lib/index.js.map +0 -1
  255. package/lib/injections/gee08.d.ts +0 -7
  256. package/lib/injections/gee08.js +0 -68
  257. package/lib/injections/gee08.js.map +0 -1
  258. package/lib/injections/gee1.d.ts +0 -7
  259. package/lib/injections/gee1.js +0 -28
  260. package/lib/injections/gee1.js.map +0 -1
  261. package/lib/injections/gio.d.ts +0 -7
  262. package/lib/injections/gio.js +0 -431
  263. package/lib/injections/gio.js.map +0 -1
  264. package/lib/injections/glib.d.ts +0 -7
  265. package/lib/injections/glib.js +0 -204
  266. package/lib/injections/glib.js.map +0 -1
  267. package/lib/injections/gobject.d.ts +0 -7
  268. package/lib/injections/gobject.js +0 -479
  269. package/lib/injections/gobject.js.map +0 -1
  270. package/lib/injections/inject.d.ts +0 -4
  271. package/lib/injections/inject.js +0 -28
  272. package/lib/injections/inject.js.map +0 -1
  273. package/lib/injections/tracker1.d.ts +0 -7
  274. package/lib/injections/tracker1.js +0 -30
  275. package/lib/injections/tracker1.js.map +0 -1
  276. package/lib/library-version.d.ts +0 -10
  277. package/lib/library-version.js +0 -45
  278. package/lib/library-version.js.map +0 -1
  279. package/lib/logger.d.ts +0 -36
  280. package/lib/logger.js +0 -134
  281. package/lib/logger.js.map +0 -1
  282. package/lib/messages.d.ts +0 -26
  283. package/lib/messages.js +0 -42
  284. package/lib/messages.js.map +0 -1
  285. package/lib/registry.d.ts +0 -8
  286. package/lib/registry.js +0 -12
  287. package/lib/registry.js.map +0 -1
  288. package/lib/transformation.d.ts +0 -181
  289. package/lib/transformation.js +0 -480
  290. package/lib/transformation.js.map +0 -1
  291. package/lib/types/answer-version.d.ts +0 -4
  292. package/lib/types/answer-version.js +0 -2
  293. package/lib/types/answer-version.js.map +0 -1
  294. package/lib/types/class-parent.d.ts +0 -13
  295. package/lib/types/class-parent.js +0 -2
  296. package/lib/types/class-parent.js.map +0 -1
  297. package/lib/types/config-flags.d.ts +0 -4
  298. package/lib/types/config-flags.js +0 -2
  299. package/lib/types/config-flags.js.map +0 -1
  300. package/lib/types/construct-name.d.ts +0 -1
  301. package/lib/types/construct-name.js +0 -2
  302. package/lib/types/construct-name.js.map +0 -1
  303. package/lib/types/dependency-map.d.ts +0 -4
  304. package/lib/types/dependency-map.js +0 -2
  305. package/lib/types/dependency-map.js.map +0 -1
  306. package/lib/types/dependency.d.ts +0 -42
  307. package/lib/types/dependency.js +0 -2
  308. package/lib/types/dependency.js.map +0 -1
  309. package/lib/types/file-info.d.ts +0 -14
  310. package/lib/types/file-info.js +0 -2
  311. package/lib/types/file-info.js.map +0 -1
  312. package/lib/types/format.d.ts +0 -1
  313. package/lib/types/format.js +0 -2
  314. package/lib/types/format.js.map +0 -1
  315. package/lib/types/gir-alias-element.d.ts +0 -4
  316. package/lib/types/gir-alias-element.js +0 -2
  317. package/lib/types/gir-alias-element.js.map +0 -1
  318. package/lib/types/gir-annotation.d.ts +0 -9
  319. package/lib/types/gir-annotation.js +0 -2
  320. package/lib/types/gir-annotation.js.map +0 -1
  321. package/lib/types/gir-any-element.d.ts +0 -2
  322. package/lib/types/gir-any-element.js +0 -2
  323. package/lib/types/gir-any-element.js.map +0 -1
  324. package/lib/types/gir-bitfield-element.d.ts +0 -6
  325. package/lib/types/gir-bitfield-element.js +0 -2
  326. package/lib/types/gir-bitfield-element.js.map +0 -1
  327. package/lib/types/gir-callable-param-element.d.ts +0 -4
  328. package/lib/types/gir-callable-param-element.js +0 -2
  329. package/lib/types/gir-callable-param-element.js.map +0 -1
  330. package/lib/types/gir-callable-params.d.ts +0 -7
  331. package/lib/types/gir-callable-params.js +0 -2
  332. package/lib/types/gir-callable-params.js.map +0 -1
  333. package/lib/types/gir-callable-return.d.ts +0 -5
  334. package/lib/types/gir-callable-return.js +0 -2
  335. package/lib/types/gir-callable-return.js.map +0 -1
  336. package/lib/types/gir-callback-element.d.ts +0 -6
  337. package/lib/types/gir-callback-element.js +0 -2
  338. package/lib/types/gir-callback-element.js.map +0 -1
  339. package/lib/types/gir-class-element.d.ts +0 -17
  340. package/lib/types/gir-class-element.js +0 -2
  341. package/lib/types/gir-class-element.js.map +0 -1
  342. package/lib/types/gir-constant-element.d.ts +0 -4
  343. package/lib/types/gir-constant-element.js +0 -2
  344. package/lib/types/gir-constant-element.js.map +0 -1
  345. package/lib/types/gir-constructor-element.d.ts +0 -6
  346. package/lib/types/gir-constructor-element.js +0 -2
  347. package/lib/types/gir-constructor-element.js.map +0 -1
  348. package/lib/types/gir-enum-element.d.ts +0 -6
  349. package/lib/types/gir-enum-element.js +0 -2
  350. package/lib/types/gir-enum-element.js.map +0 -1
  351. package/lib/types/gir-field-element.d.ts +0 -5
  352. package/lib/types/gir-field-element.js +0 -2
  353. package/lib/types/gir-field-element.js.map +0 -1
  354. package/lib/types/gir-function-element.d.ts +0 -6
  355. package/lib/types/gir-function-element.js +0 -2
  356. package/lib/types/gir-function-element.js.map +0 -1
  357. package/lib/types/gir-instance-parameter.d.ts +0 -8
  358. package/lib/types/gir-instance-parameter.js +0 -2
  359. package/lib/types/gir-instance-parameter.js.map +0 -1
  360. package/lib/types/gir-interface-element.d.ts +0 -16
  361. package/lib/types/gir-interface-element.js +0 -2
  362. package/lib/types/gir-interface-element.js.map +0 -1
  363. package/lib/types/gir-member-element.d.ts +0 -5
  364. package/lib/types/gir-member-element.js +0 -2
  365. package/lib/types/gir-member-element.js.map +0 -1
  366. package/lib/types/gir-method-element.d.ts +0 -7
  367. package/lib/types/gir-method-element.js +0 -2
  368. package/lib/types/gir-method-element.js.map +0 -1
  369. package/lib/types/gir-module-resolved-by.d.ts +0 -15
  370. package/lib/types/gir-module-resolved-by.js +0 -2
  371. package/lib/types/gir-module-resolved-by.js.map +0 -1
  372. package/lib/types/gir-modules-grouped-map.d.ts +0 -4
  373. package/lib/types/gir-modules-grouped-map.js +0 -2
  374. package/lib/types/gir-modules-grouped-map.js.map +0 -1
  375. package/lib/types/gir-modules-grouped.d.ts +0 -12
  376. package/lib/types/gir-modules-grouped.js +0 -2
  377. package/lib/types/gir-modules-grouped.js.map +0 -1
  378. package/lib/types/gir-namespace.d.ts +0 -27
  379. package/lib/types/gir-namespace.js +0 -2
  380. package/lib/types/gir-namespace.js.map +0 -1
  381. package/lib/types/gir-property-element.d.ts +0 -4
  382. package/lib/types/gir-property-element.js +0 -2
  383. package/lib/types/gir-property-element.js.map +0 -1
  384. package/lib/types/gir-record-element.d.ts +0 -10
  385. package/lib/types/gir-record-element.js +0 -2
  386. package/lib/types/gir-record-element.js.map +0 -1
  387. package/lib/types/gir-repository.d.ts +0 -5
  388. package/lib/types/gir-repository.js +0 -2
  389. package/lib/types/gir-repository.js.map +0 -1
  390. package/lib/types/gir-signal.d.ts +0 -10
  391. package/lib/types/gir-signal.js +0 -2
  392. package/lib/types/gir-signal.js.map +0 -1
  393. package/lib/types/gir-type-name.d.ts +0 -2
  394. package/lib/types/gir-type-name.js +0 -2
  395. package/lib/types/gir-type-name.js.map +0 -1
  396. package/lib/types/gir-union-element.d.ts +0 -9
  397. package/lib/types/gir-union-element.js +0 -2
  398. package/lib/types/gir-union-element.js.map +0 -1
  399. package/lib/types/gir-unparsed-number.d.ts +0 -2
  400. package/lib/types/gir-unparsed-number.js +0 -2
  401. package/lib/types/gir-unparsed-number.js.map +0 -1
  402. package/lib/types/gir-virtual-method.d.ts +0 -6
  403. package/lib/types/gir-virtual-method.js +0 -2
  404. package/lib/types/gir-virtual-method.js.map +0 -1
  405. package/lib/types/index.d.ts +0 -79
  406. package/lib/types/index.js +0 -80
  407. package/lib/types/index.js.map +0 -1
  408. package/lib/types/inheritance-table.js +0 -2
  409. package/lib/types/inheritance-table.js.map +0 -1
  410. package/lib/types/local-name-check.d.ts +0 -4
  411. package/lib/types/local-name-check.js +0 -2
  412. package/lib/types/local-name-check.js.map +0 -1
  413. package/lib/types/local-name-type.d.ts +0 -1
  414. package/lib/types/local-name-type.js +0 -2
  415. package/lib/types/local-name-type.js.map +0 -1
  416. package/lib/types/local-name.d.ts +0 -7
  417. package/lib/types/local-name.js +0 -2
  418. package/lib/types/local-name.js.map +0 -1
  419. package/lib/types/local-names.d.ts +0 -4
  420. package/lib/types/local-names.js +0 -2
  421. package/lib/types/local-names.js.map +0 -1
  422. package/lib/types/metadata.d.ts +0 -8
  423. package/lib/types/metadata.js +0 -2
  424. package/lib/types/metadata.js.map +0 -1
  425. package/lib/types/options-base.d.ts +0 -4
  426. package/lib/types/options-base.js +0 -2
  427. package/lib/types/options-base.js.map +0 -1
  428. package/lib/types/options-generation.d.ts +0 -33
  429. package/lib/types/options-generation.js +0 -2
  430. package/lib/types/options-generation.js.map +0 -1
  431. package/lib/types/options-load.d.ts +0 -5
  432. package/lib/types/options-load.js +0 -2
  433. package/lib/types/options-load.js.map +0 -1
  434. package/lib/types/options-transform.d.ts +0 -4
  435. package/lib/types/options-transform.js +0 -2
  436. package/lib/types/options-transform.js.map +0 -1
  437. package/lib/types/output-format.d.ts +0 -1
  438. package/lib/types/output-format.js +0 -2
  439. package/lib/types/output-format.js.map +0 -1
  440. package/lib/types/package-data-parsed.d.ts +0 -28
  441. package/lib/types/package-data-parsed.js +0 -2
  442. package/lib/types/package-data-parsed.js.map +0 -1
  443. package/lib/types/package-data.d.ts +0 -23
  444. package/lib/types/package-data.js +0 -2
  445. package/lib/types/package-data.js.map +0 -1
  446. package/lib/types/package-section-parsed.d.ts +0 -8
  447. package/lib/types/package-section-parsed.js +0 -2
  448. package/lib/types/package-section-parsed.js.map +0 -1
  449. package/lib/types/parsed-gir.d.ts +0 -5
  450. package/lib/types/parsed-gir.js +0 -2
  451. package/lib/types/parsed-gir.js.map +0 -1
  452. package/lib/types/parsed-package-data.d.ts +0 -6
  453. package/lib/types/parsed-package-data.js +0 -2
  454. package/lib/types/parsed-package-data.js.map +0 -1
  455. package/lib/types/part-of-class.d.ts +0 -7
  456. package/lib/types/part-of-class.js +0 -2
  457. package/lib/types/part-of-class.js.map +0 -1
  458. package/lib/types/part-of-module.d.ts +0 -6
  459. package/lib/types/part-of-module.js +0 -2
  460. package/lib/types/part-of-module.js.map +0 -1
  461. package/lib/types/property-case.d.ts +0 -1
  462. package/lib/types/property-case.js +0 -2
  463. package/lib/types/property-case.js.map +0 -1
  464. package/lib/types/resolve-type.d.ts +0 -4
  465. package/lib/types/resolve-type.js +0 -6
  466. package/lib/types/resolve-type.js.map +0 -1
  467. package/lib/types/template-data.d.ts +0 -7
  468. package/lib/types/template-data.js +0 -2
  469. package/lib/types/template-data.js.map +0 -1
  470. package/lib/types/transformation-case.d.ts +0 -1
  471. package/lib/types/transformation-case.js +0 -2
  472. package/lib/types/transformation-case.js.map +0 -1
  473. package/lib/types/transformations.d.ts +0 -4
  474. package/lib/types/transformations.js +0 -2
  475. package/lib/types/transformations.js.map +0 -1
  476. package/lib/types/ts-doc-tag.js +0 -2
  477. package/lib/types/ts-doc-tag.js.map +0 -1
  478. package/lib/types/ts-doc.d.ts +0 -16
  479. package/lib/types/ts-doc.js +0 -2
  480. package/lib/types/ts-doc.js.map +0 -1
  481. package/lib/types/type-gir-alias.js +0 -2
  482. package/lib/types/type-gir-alias.js.map +0 -1
  483. package/lib/types/type-gir-class.d.ts +0 -2
  484. package/lib/types/type-gir-class.js +0 -2
  485. package/lib/types/type-gir-class.js.map +0 -1
  486. package/lib/types/type-gir-element.d.ts +0 -3
  487. package/lib/types/type-gir-element.js +0 -2
  488. package/lib/types/type-gir-element.js.map +0 -1
  489. package/lib/types/type-gir-enumeration-member.d.ts +0 -2
  490. package/lib/types/type-gir-enumeration-member.js +0 -2
  491. package/lib/types/type-gir-enumeration-member.js.map +0 -1
  492. package/lib/types/type-gir-enumeration.js +0 -2
  493. package/lib/types/type-gir-enumeration.js.map +0 -1
  494. package/lib/types/type-gir-function.d.ts +0 -1
  495. package/lib/types/type-gir-function.js +0 -2
  496. package/lib/types/type-gir-function.js.map +0 -1
  497. package/lib/types/type-gir-interface.js +0 -2
  498. package/lib/types/type-gir-interface.js.map +0 -1
  499. package/lib/types/type-gir-method.d.ts +0 -2
  500. package/lib/types/type-gir-method.js +0 -2
  501. package/lib/types/type-gir-method.js.map +0 -1
  502. package/lib/types/type-gir-parameter.d.ts +0 -1
  503. package/lib/types/type-gir-parameter.js +0 -2
  504. package/lib/types/type-gir-parameter.js.map +0 -1
  505. package/lib/types/type-gir-property.js +0 -2
  506. package/lib/types/type-gir-property.js.map +0 -1
  507. package/lib/types/type-gir-variable.d.ts +0 -1
  508. package/lib/types/type-gir-variable.js +0 -2
  509. package/lib/types/type-gir-variable.js.map +0 -1
  510. package/lib/types/type-ts-element.d.ts +0 -3
  511. package/lib/types/type-ts-element.js +0 -2
  512. package/lib/types/type-ts-element.js.map +0 -1
  513. package/lib/types/type-ts-enumeration-member.js +0 -2
  514. package/lib/types/type-ts-enumeration-member.js.map +0 -1
  515. package/lib/types/type-ts-function.d.ts +0 -1
  516. package/lib/types/type-ts-function.js +0 -2
  517. package/lib/types/type-ts-function.js.map +0 -1
  518. package/lib/types/type-ts-property.d.ts +0 -1
  519. package/lib/types/type-ts-property.js +0 -2
  520. package/lib/types/type-ts-property.js.map +0 -1
  521. package/lib/types/user-config-load-result.d.ts +0 -6
  522. package/lib/types/user-config-load-result.js +0 -2
  523. package/lib/types/user-config-load-result.js.map +0 -1
  524. package/lib/types/user-config.d.ts +0 -35
  525. package/lib/types/user-config.js +0 -2
  526. package/lib/types/user-config.js.map +0 -1
  527. package/lib/util.d.ts +0 -20
  528. package/lib/util.js +0 -67
  529. package/lib/util.js.map +0 -1
  530. package/lib/utils.d.ts +0 -268
  531. package/lib/utils.js +0 -417
  532. package/lib/utils.js.map +0 -1
  533. package/lib/validators/class.d.ts +0 -7
  534. package/lib/validators/class.js +0 -217
  535. package/lib/validators/class.js.map +0 -1
  536. package/lib/validators/interface.d.ts +0 -5
  537. package/lib/validators/interface.js +0 -16
  538. package/lib/validators/interface.js.map +0 -1
  539. package/lib/visitor.d.ts +0 -35
  540. package/lib/visitor.js +0 -29
  541. package/lib/visitor.js.map +0 -1
@@ -0,0 +1,488 @@
1
+ import { ConsoleReporter } from "@ts-for-gir/reporter";
2
+ import type { FormatGenerator } from "../generators/generator.ts";
3
+ import { ArrayType, ClassStructTypeIdentifier, NativeType, type TypeExpression, TypeIdentifier } from "../gir.ts";
4
+ import type { GirRecordElement, GirUnionElement, OptionsLoad, RecordResolution } from "../types/index.ts";
5
+ import { parseDoc, parseMetadata } from "../utils/gir-parsing.ts";
6
+ import { sanitizeIdentifierName } from "../utils/naming.ts";
7
+ import { resolveTypeIdentifier } from "../utils/type-resolution.ts";
8
+ import { parseTypeIdentifier } from "../utils/types.ts";
9
+ import type { GirVisitor } from "../visitor.ts";
10
+ import { IntrospectedConstructor } from "./constructor.ts";
11
+ import {
12
+ IntrospectedBaseClass,
13
+ type IntrospectedClassCallback,
14
+ IntrospectedClassFunction,
15
+ IntrospectedStaticClassFunction,
16
+ } from "./introspected-classes.ts";
17
+ import type { IntrospectedNamespace } from "./namespace.ts";
18
+ import { IntrospectedField, type IntrospectedProperty } from "./property.ts";
19
+ import type { IntrospectedSignal } from "./signal.ts";
20
+
21
+ const log = new ConsoleReporter(true, "gir/class", true);
22
+
23
+ export class IntrospectedRecord extends IntrospectedBaseClass {
24
+ private _isForeign: boolean = false;
25
+ private _structFor: ClassStructTypeIdentifier | null = null;
26
+ private _isSimple: boolean | null = null;
27
+ private _isSimpleWithoutPointers: string | null = null;
28
+ private _overriddenGType: string | null = null;
29
+
30
+ /**
31
+ * Returns all signals for this record (records typically don't have signals)
32
+ */
33
+ getAllSignals(): Array<{
34
+ name: string;
35
+ signal?: IntrospectedSignal;
36
+ isNotifySignal?: boolean;
37
+ isDetailSignal?: boolean;
38
+ parameterTypes?: string[];
39
+ returnType?: string;
40
+ }> {
41
+ // Records typically don't have signals, but we provide a consistent API
42
+ return [];
43
+ }
44
+
45
+ isForeign(): boolean {
46
+ return this._isForeign;
47
+ }
48
+
49
+ get structFor() {
50
+ return this._structFor;
51
+ }
52
+
53
+ get gtype() {
54
+ return this._overriddenGType ?? this.name;
55
+ }
56
+
57
+ overrideGType(gtype: string) {
58
+ this._overriddenGType = gtype;
59
+ }
60
+
61
+ getType(): TypeIdentifier {
62
+ if (this._structFor) {
63
+ return this._structFor;
64
+ }
65
+
66
+ return new TypeIdentifier(this.name, this.namespace.namespace);
67
+ }
68
+
69
+ someParent(predicate: (p: IntrospectedRecord) => boolean): boolean {
70
+ const resolution = this.resolveParents();
71
+ const parent = resolution.extends();
72
+
73
+ return !!parent && (predicate(parent.node) || parent.node.someParent(predicate));
74
+ }
75
+
76
+ findParent(predicate: (p: IntrospectedRecord) => boolean): IntrospectedRecord | undefined {
77
+ const resolution = this.resolveParents();
78
+
79
+ const parent = resolution.extends();
80
+
81
+ if (parent) {
82
+ if (predicate(parent.node)) return parent.node;
83
+
84
+ const found = parent.node.findParent(predicate);
85
+
86
+ if (found) return found;
87
+ }
88
+
89
+ return undefined;
90
+ }
91
+
92
+ findParentMap<K>(predicate: (p: IntrospectedRecord) => K | undefined): K | undefined {
93
+ const resolution = this.resolveParents();
94
+
95
+ const parent = resolution.extends();
96
+
97
+ if (parent) {
98
+ const result = predicate(parent.node);
99
+
100
+ if (result !== undefined) return result;
101
+
102
+ return parent.node.findParentMap(predicate);
103
+ }
104
+
105
+ return undefined;
106
+ }
107
+
108
+ accept(visitor: GirVisitor): IntrospectedRecord {
109
+ const node = this.copy({
110
+ constructors: this.constructors.map((c) => c.accept(visitor)),
111
+ members: this.members.map((m) => m.accept(visitor)),
112
+ props: this.props.map((p) => p.accept(visitor)),
113
+ fields: this.fields.map((f) => f.accept(visitor)),
114
+ callbacks: this.callbacks.map((c) => c.accept(visitor)),
115
+ });
116
+
117
+ return visitor.visitRecord?.(node) ?? node;
118
+ }
119
+
120
+ resolveParents(): RecordResolution {
121
+ const { namespace, superType } = this;
122
+
123
+ return {
124
+ *[Symbol.iterator]() {
125
+ let current = this.extends();
126
+
127
+ while (current !== undefined) {
128
+ yield current;
129
+ current = current.extends();
130
+ }
131
+ },
132
+ extends() {
133
+ const resolved_parent = superType ? resolveTypeIdentifier(namespace, superType) : undefined;
134
+ if (resolved_parent instanceof IntrospectedRecord) return resolved_parent.resolveParents();
135
+
136
+ return undefined;
137
+ },
138
+ node: this,
139
+ identifier: this.getType(),
140
+ };
141
+ }
142
+
143
+ copy(
144
+ options: {
145
+ parent?: undefined;
146
+ constructors?: IntrospectedConstructor[];
147
+ members?: IntrospectedClassFunction[];
148
+ props?: IntrospectedProperty[];
149
+ fields?: IntrospectedField[];
150
+ callbacks?: IntrospectedClassCallback[];
151
+ } = {},
152
+ ): IntrospectedRecord {
153
+ const {
154
+ name,
155
+ namespace,
156
+ superType,
157
+ members,
158
+ constructors,
159
+ _isForeign,
160
+ _structFor,
161
+ _overriddenGType,
162
+ props,
163
+ fields,
164
+ callbacks,
165
+ generics,
166
+ mainConstructor,
167
+ } = this;
168
+
169
+ const clazz = new IntrospectedRecord({ name, namespace });
170
+
171
+ clazz._copyBaseProperties(this);
172
+
173
+ if (superType) {
174
+ clazz.superType = superType;
175
+ }
176
+
177
+ clazz._structFor = _structFor;
178
+ clazz._isForeign = _isForeign;
179
+ clazz._overriddenGType = _overriddenGType;
180
+ clazz.props = (options.props ?? props).map((p) => p.copy({ parent: clazz }));
181
+ clazz.fields = (options.fields ?? fields).map((f) => f.copy({ parent: clazz }));
182
+ clazz.callbacks = (options.callbacks ?? callbacks).map((c) => c.copy({ parent: clazz }));
183
+ clazz.mainConstructor = mainConstructor?.copy({ parent: clazz }) ?? null;
184
+ clazz.constructors = (options.constructors ?? constructors).map((c) => c.copy({ parent: clazz }));
185
+ clazz.members = (options.members ?? members).map((m) => m.copy({ parent: clazz }));
186
+ clazz.generics = [...generics];
187
+
188
+ return clazz;
189
+ }
190
+
191
+ static foreign(name: string, namespace: IntrospectedNamespace): IntrospectedRecord {
192
+ const foreignRecord = new IntrospectedRecord({ name, namespace });
193
+ foreignRecord._isForeign = true;
194
+ return foreignRecord;
195
+ }
196
+
197
+ static fromXML(
198
+ element: GirRecordElement | GirUnionElement,
199
+ namespace: IntrospectedNamespace,
200
+ options: OptionsLoad,
201
+ ): IntrospectedRecord {
202
+ if (!element.$.name) {
203
+ throw new Error("Invalid GIR File: No name provided for union.");
204
+ }
205
+
206
+ const name = sanitizeIdentifierName(namespace.namespace, element.$.name);
207
+
208
+ if (options.verbose) {
209
+ log.debug(` >> GirRecord: Parsing definition ${element.$.name} (${name})...`);
210
+ }
211
+
212
+ const clazz = new IntrospectedRecord({ name, namespace });
213
+
214
+ IntrospectedRecord.configureRecordProperties(element, clazz);
215
+ IntrospectedRecord.setupTypeStructOrResolveNames(element, clazz, namespace, name);
216
+ IntrospectedRecord.parseRecordDocumentation(element, clazz, options);
217
+ IntrospectedRecord.parseRecordMembers(element, clazz, options);
218
+
219
+ return clazz;
220
+ }
221
+
222
+ private static configureRecordProperties(
223
+ element: GirRecordElement | GirUnionElement,
224
+ clazz: IntrospectedRecord,
225
+ ): void {
226
+ const isPrivate = IntrospectedRecord.isRecordPrivate(element);
227
+ clazz.setPrivate(isPrivate);
228
+
229
+ const isForeign = "foreign" in element.$ && element.$.foreign === "1";
230
+ clazz._isForeign = isForeign;
231
+ }
232
+
233
+ private static isRecordPrivate(element: GirRecordElement | GirUnionElement): boolean {
234
+ if (!element.$.name) {
235
+ return false;
236
+ }
237
+
238
+ return (
239
+ element.$.name.startsWith("_") ||
240
+ ("disguised" in element.$ && element.$.disguised === "1") ||
241
+ ("opaque" in element.$ && element.$.opaque === "1")
242
+ );
243
+ }
244
+
245
+ private static setupTypeStructOrResolveNames(
246
+ element: GirRecordElement | GirUnionElement,
247
+ clazz: IntrospectedRecord,
248
+ namespace: IntrospectedNamespace,
249
+ name: string,
250
+ ): void {
251
+ const gtypeStructFor = "glib:is-gtype-struct-for" in element.$ ? element.$["glib:is-gtype-struct-for"] : undefined;
252
+
253
+ if (typeof gtypeStructFor === "string" && gtypeStructFor) {
254
+ const structFor = parseTypeIdentifier(namespace.namespace, gtypeStructFor);
255
+ clazz._structFor = new ClassStructTypeIdentifier(structFor.name, structFor.namespace);
256
+ } else {
257
+ IntrospectedRecord.registerResolveNames(element, clazz, namespace, name);
258
+ }
259
+ }
260
+
261
+ private static registerResolveNames(
262
+ element: GirRecordElement | GirUnionElement,
263
+ clazz: IntrospectedRecord,
264
+ namespace: IntrospectedNamespace,
265
+ name: string,
266
+ ): void {
267
+ if (element.$["glib:type-name"]) {
268
+ clazz.resolve_names.push(element.$["glib:type-name"]);
269
+ namespace.registerResolveName(element.$["glib:type-name"], namespace.namespace, name);
270
+ }
271
+
272
+ if (element.$["c:type"]) {
273
+ clazz.resolve_names.push(element.$["c:type"]);
274
+ namespace.registerResolveName(element.$["c:type"], namespace.namespace, name);
275
+ }
276
+ }
277
+
278
+ private static parseRecordDocumentation(
279
+ element: GirRecordElement | GirUnionElement,
280
+ clazz: IntrospectedRecord,
281
+ options: OptionsLoad,
282
+ ): void {
283
+ if (options.loadDocs) {
284
+ clazz.doc = parseDoc(element);
285
+ clazz.metadata = parseMetadata(element);
286
+ }
287
+ }
288
+
289
+ private static parseRecordMembers(
290
+ element: GirRecordElement | GirUnionElement,
291
+ clazz: IntrospectedRecord,
292
+ options: OptionsLoad,
293
+ ): void {
294
+ try {
295
+ IntrospectedRecord.parseRecordMethods(element, clazz, options);
296
+ IntrospectedRecord.parseRecordConstructors(element, clazz, options);
297
+ IntrospectedRecord.parseRecordStaticMethods(element, clazz, options);
298
+ IntrospectedRecord.parseRecordFields(element, clazz);
299
+ } catch (e) {
300
+ log.reportParsingFailure(clazz.name, "record", clazz.namespace.namespace, e as Error);
301
+ }
302
+ }
303
+
304
+ private static parseRecordMethods(
305
+ element: GirRecordElement | GirUnionElement,
306
+ clazz: IntrospectedRecord,
307
+ options: OptionsLoad,
308
+ ): void {
309
+ if (element.method) {
310
+ clazz.members.push(...element.method.map((method) => IntrospectedClassFunction.fromXML(method, clazz, options)));
311
+ }
312
+ }
313
+
314
+ private static parseRecordConstructors(
315
+ element: GirRecordElement | GirUnionElement,
316
+ clazz: IntrospectedRecord,
317
+ options: OptionsLoad,
318
+ ): void {
319
+ if (Array.isArray(element.constructor)) {
320
+ element.constructor.forEach((ctor) => {
321
+ const c = IntrospectedConstructor.fromXML(ctor, clazz, options);
322
+ clazz.constructors.push(c);
323
+ });
324
+ }
325
+ }
326
+
327
+ private static parseRecordStaticMethods(
328
+ element: GirRecordElement | GirUnionElement,
329
+ clazz: IntrospectedRecord,
330
+ options: OptionsLoad,
331
+ ): void {
332
+ if (element.function) {
333
+ clazz.members.push(
334
+ ...element.function.map((func) => IntrospectedStaticClassFunction.fromXML(func, clazz, options)),
335
+ );
336
+ }
337
+ }
338
+
339
+ private static parseRecordFields(element: GirRecordElement | GirUnionElement, clazz: IntrospectedRecord): void {
340
+ if (element.field) {
341
+ clazz.fields.push(
342
+ ...element.field
343
+ .filter((field) => !("callback" in field))
344
+ .map((field) => IntrospectedField.fromXML(field, clazz)),
345
+ );
346
+ }
347
+ }
348
+
349
+ /**
350
+ * Calculate if a type expression is "simple" without pointers
351
+ */
352
+ isSimpleTypeWithoutPointers(typeContainer: TypeExpression): boolean {
353
+ if (!this.isSimpleType(typeContainer)) {
354
+ return false;
355
+ }
356
+
357
+ if (typeContainer.isPointer) {
358
+ return false;
359
+ }
360
+
361
+ // Primitive types can be directly allocated.
362
+ if (typeContainer instanceof NativeType) {
363
+ return true;
364
+ }
365
+
366
+ if (typeContainer instanceof ArrayType) {
367
+ if (typeContainer.type.equals(this.getType())) {
368
+ return true;
369
+ }
370
+
371
+ return this.isSimpleTypeWithoutPointers(typeContainer.type);
372
+ }
373
+
374
+ if (typeContainer instanceof TypeIdentifier) {
375
+ const type = typeContainer;
376
+
377
+ const child_ns = this.namespace.assertInstalledImport(type.namespace);
378
+
379
+ const alias = child_ns.getAlias(type.name);
380
+ if (alias) {
381
+ return this.isSimpleTypeWithoutPointers(alias.type);
382
+ }
383
+
384
+ const child = child_ns.getClass(type.name);
385
+ if (child === this) {
386
+ return false;
387
+ }
388
+
389
+ if (child instanceof IntrospectedRecord) {
390
+ return child.isSimpleWithoutPointers() !== null;
391
+ }
392
+ }
393
+
394
+ return false;
395
+ }
396
+
397
+ /**
398
+ * Calculate if a type expression is "simple"
399
+ */
400
+ isSimpleType(typeContainer: TypeExpression): boolean {
401
+ // Primitive types can be directly allocated.
402
+ if (typeContainer instanceof NativeType) {
403
+ return true;
404
+ }
405
+
406
+ if (typeContainer instanceof ArrayType) {
407
+ if (typeContainer.type.equals(this.getType())) {
408
+ return true;
409
+ }
410
+
411
+ return this.isSimpleType(typeContainer.type);
412
+ }
413
+
414
+ if (typeContainer instanceof TypeIdentifier) {
415
+ const type = typeContainer;
416
+
417
+ const child_ns = this.namespace.assertInstalledImport(type.namespace);
418
+
419
+ const alias = child_ns.getAlias(type.name);
420
+ if (alias) {
421
+ return this.isSimpleType(alias.type);
422
+ }
423
+
424
+ const child = child_ns.getClass(type.name);
425
+ if (child === this) {
426
+ return false;
427
+ }
428
+
429
+ if (child instanceof IntrospectedRecord) {
430
+ return child.isSimple();
431
+ }
432
+ }
433
+
434
+ return false;
435
+ }
436
+
437
+ /**
438
+ * Check if a record is "simple" and can be constructed by GJS
439
+ */
440
+ isSimple() {
441
+ // Records with no fields are not
442
+ // constructable.
443
+ if (this.fields.length === 0) {
444
+ return false;
445
+ }
446
+
447
+ // Because we may have to recursively check
448
+ // if types are instantiable we cache whether
449
+ // or not a given Record is simple.
450
+ if (this._isSimple !== null) {
451
+ return this._isSimple;
452
+ }
453
+
454
+ const isSimple = this.fields.every((f) => this.isSimpleType(f.type));
455
+
456
+ this._isSimple = isSimple;
457
+
458
+ return isSimple;
459
+ }
460
+
461
+ isSimpleWithoutPointers() {
462
+ // Records which are "simple without pointers" is a subset of
463
+ // "simple" records.
464
+ if (!this.isSimple()) {
465
+ return null;
466
+ }
467
+
468
+ // Because we may have to recursively check
469
+ // if types are instantiable we cache whether
470
+ // or not a given Record is simple.
471
+ if (this._isSimpleWithoutPointers !== null) {
472
+ return this._isSimpleWithoutPointers;
473
+ }
474
+
475
+ const isSimpleWithoutPointers = this.fields.find((f) => {
476
+ return !this.isSimpleTypeWithoutPointers(f.type);
477
+ });
478
+
479
+ if (!isSimpleWithoutPointers) this._isSimpleWithoutPointers = "all fields good";
480
+ else this._isSimpleWithoutPointers = null;
481
+
482
+ return this._isSimpleWithoutPointers;
483
+ }
484
+
485
+ asString<T extends FormatGenerator<unknown>>(generator: T): ReturnType<T["generateRecord"]> {
486
+ return generator.generateRecord(this) as ReturnType<T["generateRecord"]>;
487
+ }
488
+ }
@@ -0,0 +1,183 @@
1
+ import { DefaultFormatter } from "../formatters/default.ts";
2
+ import type { Formatter } from "../formatters/formatter.ts";
3
+ import { JSONFormatter } from "../formatters/json.ts";
4
+ import type { FormatGenerator } from "../generators/generator.ts";
5
+ import { generify } from "../generics/generify.ts";
6
+ import type { GirModule } from "../index.ts";
7
+ import { inject } from "../injections/inject.ts";
8
+ import type { GeneratorConstructor, OptionsGeneration, OptionsTransform } from "../types/index.ts";
9
+ import { TwoKeyMap } from "../util.ts";
10
+ import { ClassVisitor } from "../validators/class.ts";
11
+ import { FunctionParametersVisitor } from "../validators/function-parameters.ts";
12
+ import { InterfaceVisitor } from "../validators/interface.ts";
13
+ import type { GirVisitor } from "../visitor.ts";
14
+ import type { IntrospectedNamespace } from "./namespace.ts";
15
+
16
+ export class NSRegistry {
17
+ mapping: TwoKeyMap<string, string, IntrospectedNamespace> = new TwoKeyMap();
18
+ private formatters: Map<string, Formatter> = new Map();
19
+ private generators: Map<string, GeneratorConstructor<unknown>> = new Map();
20
+ c_mapping: Map<string, { version: string; name: string }[]> = new Map();
21
+ transformations: GirVisitor[] = [];
22
+ subtypes = new TwoKeyMap<string, string, TwoKeyMap<string, string, boolean>>();
23
+
24
+ constructor() {
25
+ this.formatters.set("json", new JSONFormatter());
26
+ }
27
+
28
+ registerTransformation(visitor: GirVisitor) {
29
+ this.transformations.push(visitor);
30
+
31
+ // Apply transformations to already built namespaces.
32
+ this.mapping.forEach((n) => {
33
+ n.accept(visitor);
34
+ });
35
+ }
36
+
37
+ registerFormatter(output: string, formatter: Formatter) {
38
+ this.formatters.set(output, formatter);
39
+ }
40
+
41
+ getFormatter(output: string) {
42
+ return this.formatters.get(output) ?? new DefaultFormatter();
43
+ }
44
+
45
+ registerGenerator<T>(
46
+ output: string,
47
+ generator: { new (namespace: IntrospectedNamespace, options: OptionsGeneration): FormatGenerator<T> },
48
+ ) {
49
+ this.generators.set(output, generator);
50
+ }
51
+
52
+ async getGenerator<T>(output: string): Promise<GeneratorConstructor<T> | undefined> {
53
+ // Handle loading external generators...
54
+ if (!this.generators.has(output)) {
55
+ let Generator: { default: GeneratorConstructor<unknown> };
56
+ try {
57
+ Generator = (await import(`@gi.ts/generator-${output}`)) as { default: GeneratorConstructor<unknown> };
58
+
59
+ if (Generator) {
60
+ console.log(`Loading generator "@gi.ts/generator-${output}"...`);
61
+ this.generators.set(output, Generator.default);
62
+ return Generator.default as GeneratorConstructor<T>;
63
+ }
64
+ } catch {
65
+ try {
66
+ Generator = (await import(`gi-ts-generator-${output}`)) as {
67
+ default: GeneratorConstructor<unknown>;
68
+ };
69
+
70
+ console.log(`Loading generator "gi-ts-generator-${output}"...`);
71
+ this.generators.set(output, Generator.default);
72
+ return Generator.default as GeneratorConstructor<T>;
73
+ } catch {
74
+ try {
75
+ Generator = (await import(`${output}`)) as { default: GeneratorConstructor<unknown> };
76
+
77
+ console.log(`Loading generator "${output}"...`);
78
+ this.generators.set(output, Generator.default);
79
+ return Generator.default as GeneratorConstructor<T>;
80
+ } catch {}
81
+ }
82
+ }
83
+ }
84
+
85
+ return this.generators.get(output) as GeneratorConstructor<T> | undefined;
86
+ }
87
+
88
+ private _transformNamespace(namespace: IntrospectedNamespace) {
89
+ this.transformations.forEach((t) => {
90
+ namespace.accept(t);
91
+ });
92
+ }
93
+
94
+ namespace(name: string, version: string): IntrospectedNamespace | null {
95
+ const namespace = this.mapping.get(name, version);
96
+
97
+ return namespace ?? null;
98
+ }
99
+
100
+ namespacesForPrefix(c_prefix: string): IntrospectedNamespace[] {
101
+ return (this.c_mapping.get(c_prefix) ?? []).map((c_mapping) =>
102
+ this.assertNamespace(c_mapping.name, c_mapping.version),
103
+ );
104
+ }
105
+
106
+ transform(options: OptionsTransform) {
107
+ const GLib = this.assertNamespace("GLib", "2.0");
108
+ const Gio = this.assertNamespace("Gio", "2.0");
109
+ const GObject = this.assertNamespace("GObject", "2.0");
110
+
111
+ // These follow the GLib version.
112
+ Gio.package_version = [...GLib.package_version];
113
+ GObject.package_version = [...GLib.package_version];
114
+
115
+ const interfaceVisitor = new InterfaceVisitor();
116
+ this.registerTransformation(interfaceVisitor);
117
+
118
+ const classVisitor = new ClassVisitor();
119
+ this.registerTransformation(classVisitor);
120
+
121
+ const enumParamsVisitor = new FunctionParametersVisitor();
122
+ this.registerTransformation(enumParamsVisitor);
123
+
124
+ console.log("Adding generics...");
125
+ generify(this, options.inferGenerics);
126
+
127
+ console.log("Injecting types...");
128
+ inject(this);
129
+ }
130
+
131
+ defaultVersionOf(name: string): string | null {
132
+ // GJS has a hard dependency on these versions.
133
+ if (name === "GLib" || name === "Gio" || name === "GObject") {
134
+ return "2.0";
135
+ }
136
+
137
+ const meta = this.mapping.getIfOnly(name);
138
+
139
+ if (meta) {
140
+ return meta[0];
141
+ }
142
+
143
+ return null;
144
+ }
145
+
146
+ assertDefaultVersionOf(name: string): string {
147
+ const version = this.defaultVersionOf(name);
148
+
149
+ if (version) {
150
+ return version;
151
+ }
152
+
153
+ // This mirrors GJS' and GI's default behavior.
154
+ // If we can't find a single version of an unspecified dependency, we throw an error.
155
+ throw new Error(`No single version found for unspecified dependency: ${JSON.stringify(name)}.`);
156
+ }
157
+
158
+ assertNamespace(name: string, version: string): IntrospectedNamespace {
159
+ const namespace = this.mapping.get(name, version) ?? null;
160
+
161
+ if (!namespace) {
162
+ throw new Error(`Namespace '${name}' not found.`);
163
+ }
164
+
165
+ return namespace;
166
+ }
167
+
168
+ register(namespace: GirModule): IntrospectedNamespace {
169
+ this.mapping.set(namespace.namespace, namespace.version, namespace);
170
+
171
+ namespace.c_prefixes.forEach((c_prefix) => {
172
+ const c_map = this.c_mapping.get(c_prefix) || [];
173
+
174
+ c_map.push({ name: namespace.namespace, version: namespace.version });
175
+
176
+ this.c_mapping.set(c_prefix, c_map);
177
+ });
178
+
179
+ this._transformNamespace(namespace);
180
+
181
+ return namespace;
182
+ }
183
+ }