@ts-for-gir/lib 4.0.0-beta.25 → 4.0.0-beta.26

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 (567) hide show
  1. package/package.json +12 -26
  2. package/src/constants.ts +154 -0
  3. package/src/dependency-manager.ts +427 -0
  4. package/src/formatters/default.ts +7 -0
  5. package/src/formatters/formatter.ts +3 -0
  6. package/src/formatters/index.ts +3 -0
  7. package/src/formatters/json.ts +7 -0
  8. package/src/generators/generator.ts +65 -0
  9. package/src/generators/index.ts +2 -0
  10. package/src/generics/clutter.ts +71 -0
  11. package/src/generics/generify.ts +74 -0
  12. package/src/generics/gio.ts +91 -0
  13. package/src/generics/glib.ts +31 -0
  14. package/src/generics/gtk.ts +99 -0
  15. package/src/generics/meta.ts +41 -0
  16. package/src/generics/st.ts +197 -0
  17. package/src/generics/visitor.ts +484 -0
  18. package/src/gir/alias.ts +73 -0
  19. package/src/gir/callback.ts +79 -0
  20. package/src/gir/const.ts +73 -0
  21. package/src/gir/constructor.ts +91 -0
  22. package/src/gir/data.ts +12 -0
  23. package/src/gir/dependency-resolver.ts +81 -0
  24. package/src/gir/direct-allocation-constructor.ts +65 -0
  25. package/src/gir/enum-member.ts +51 -0
  26. package/src/gir/enum.ts +126 -0
  27. package/src/gir/error.ts +82 -0
  28. package/src/gir/function.ts +296 -0
  29. package/src/gir/generics.ts +66 -0
  30. package/src/gir/gir-complex-record.ts +7 -0
  31. package/src/gir/index.ts +25 -0
  32. package/src/gir/introspected-base.ts +104 -0
  33. package/src/gir/introspected-class-member.ts +15 -0
  34. package/src/gir/introspected-classes.ts +1517 -0
  35. package/src/gir/introspected-namespace-member.ts +24 -0
  36. package/src/gir/namespace.ts +76 -0
  37. package/src/gir/parameter.ts +199 -0
  38. package/src/gir/promisify.ts +209 -0
  39. package/src/gir/property.ts +203 -0
  40. package/src/gir/record.ts +477 -0
  41. package/src/gir/registry.ts +184 -0
  42. package/src/gir/signal.ts +246 -0
  43. package/src/gir-module.ts +703 -0
  44. package/src/gir.ts +892 -0
  45. package/src/index.ts +16 -0
  46. package/src/injections/gee08.ts +89 -0
  47. package/src/injections/gee1.ts +35 -0
  48. package/src/injections/gio.ts +707 -0
  49. package/src/injections/glib.ts +275 -0
  50. package/src/injections/gobject.ts +901 -0
  51. package/src/injections/gtk4.ts +23 -0
  52. package/src/injections/inject.ts +43 -0
  53. package/src/injections/shell.ts +45 -0
  54. package/src/injections/tracker1.ts +42 -0
  55. package/src/library-version.ts +50 -0
  56. package/src/logger.ts +104 -0
  57. package/src/messages.ts +57 -0
  58. package/src/templates/index.ts +1 -0
  59. package/src/templates/template-engine.ts +178 -0
  60. package/src/types/answer-version.ts +4 -0
  61. package/src/types/any-introspected-type.ts +3 -0
  62. package/src/types/class-function-types.ts +49 -0
  63. package/src/types/class-member.ts +5 -0
  64. package/src/types/class-parent.ts +14 -0
  65. package/src/types/class.ts +45 -0
  66. package/src/types/config-flags.ts +5 -0
  67. package/src/types/construct-name.ts +13 -0
  68. package/src/types/dependency-map.ts +4 -0
  69. package/{lib/types/dependency.d.ts → src/types/dependency.ts} +17 -15
  70. package/{lib/types/file-info.d.ts → src/types/file-info.ts} +3 -3
  71. package/src/types/format.ts +1 -0
  72. package/src/types/generator-constructor.ts +7 -0
  73. package/src/types/generics-config.ts +90 -0
  74. package/src/types/gir-any-element.ts +35 -0
  75. package/src/types/gir-module-interface.ts +22 -0
  76. package/src/types/gir-module-resolved.ts +32 -0
  77. package/src/types/gir-type-name.ts +20 -0
  78. package/src/types/index.ts +94 -0
  79. package/{lib/types/inheritance-table.d.ts → src/types/inheritance-table.ts} +1 -1
  80. package/src/types/introspected.ts +18 -0
  81. package/src/types/local-name-check.ts +5 -0
  82. package/src/types/local-name-type.ts +1 -0
  83. package/src/types/local-name.ts +8 -0
  84. package/src/types/local-names.ts +5 -0
  85. package/src/types/metadata.ts +6 -0
  86. package/src/types/ns-loader.ts +7 -0
  87. package/src/types/options-base.ts +8 -0
  88. package/{lib/types/options-generation.d.ts → src/types/options-generation.ts} +22 -13
  89. package/src/types/options-load.ts +6 -0
  90. package/src/types/options-transform.ts +5 -0
  91. package/src/types/output-format.ts +1 -0
  92. package/{lib/types/package-data-parsed.d.ts → src/types/package-data-parsed.ts} +13 -13
  93. package/{lib/types/package-data.d.ts → src/types/package-data.ts} +12 -11
  94. package/src/types/package-section-parsed.ts +9 -0
  95. package/src/types/parsed-gir.ts +5 -0
  96. package/src/types/parsed-package-data.ts +7 -0
  97. package/src/types/property-case.ts +1 -0
  98. package/src/types/resolve-type.ts +4 -0
  99. package/src/types/template-data.ts +8 -0
  100. package/src/types/template-options.ts +33 -0
  101. package/src/types/transformation-case.ts +9 -0
  102. package/src/types/transformations.ts +5 -0
  103. package/{lib/types/ts-doc-tag.d.ts → src/types/ts-doc-tag.ts} +5 -3
  104. package/{lib/types/ts-doc.d.ts → src/types/ts-doc.ts} +5 -3
  105. package/{lib/types/type-gir-alias.d.ts → src/types/type-gir-alias.ts} +1 -1
  106. package/{lib/types/type-gir-class.d.ts → src/types/type-gir-class.ts} +1 -1
  107. package/src/types/type-gir-element.ts +25 -0
  108. package/{lib/types/type-gir-enumeration-member.d.ts → src/types/type-gir-enumeration-member.ts} +1 -1
  109. package/{lib/types/type-ts-enumeration-member.d.ts → src/types/type-gir-enumeration.ts} +1 -1
  110. package/src/types/type-gir-function.ts +8 -0
  111. package/{lib/types/type-gir-interface.d.ts → src/types/type-gir-interface.ts} +1 -1
  112. package/{lib/types/type-gir-method.d.ts → src/types/type-gir-method.ts} +1 -1
  113. package/src/types/type-gir-parameter.ts +1 -0
  114. package/{lib/types/type-gir-property.d.ts → src/types/type-gir-property.ts} +1 -1
  115. package/src/types/type-gir-variable.ts +1 -0
  116. package/src/types/type-ts-element.ts +13 -0
  117. package/{lib/types/type-gir-enumeration.d.ts → src/types/type-ts-enumeration-member.ts} +1 -1
  118. package/{lib/types/type-ts-function.d.ts → src/types/type-ts-function.ts} +1 -1
  119. package/{lib/types/type-ts-property.d.ts → src/types/type-ts-property.ts} +1 -1
  120. package/src/types/user-config-load-result.ts +6 -0
  121. package/{lib/types/user-config.d.ts → src/types/user-config.ts} +25 -17
  122. package/src/util.ts +84 -0
  123. package/src/utils/conflicts/conflict-resolver.ts +122 -0
  124. package/src/utils/conflicts/function-conflict-detector.ts +139 -0
  125. package/src/utils/conflicts/index.ts +2 -0
  126. package/src/utils/conflicts.ts +490 -0
  127. package/{lib/utils/documentation.js → src/utils/documentation.ts} +25 -22
  128. package/src/utils/files.ts +71 -0
  129. package/src/utils/function-type-guards.ts +61 -0
  130. package/src/utils/generation.ts +69 -0
  131. package/src/utils/gir-parsing.ts +243 -0
  132. package/src/utils/girs.ts +113 -0
  133. package/src/utils/index.ts +14 -0
  134. package/src/utils/naming.ts +188 -0
  135. package/{lib/utils/numbers.d.ts → src/utils/numbers.ts} +3 -1
  136. package/{lib/utils/objects.js → src/utils/objects.ts} +15 -7
  137. package/src/utils/path.ts +7 -0
  138. package/src/utils/registry.ts +5 -0
  139. package/src/utils/strings.ts +134 -0
  140. package/src/utils/type-resolution.ts +116 -0
  141. package/src/utils/types.ts +247 -0
  142. package/src/validators/class.ts +324 -0
  143. package/src/validators/function-parameters.ts +52 -0
  144. package/src/validators/interface.ts +20 -0
  145. package/src/visitor.ts +58 -0
  146. package/lib/constants.d.ts +0 -25
  147. package/lib/constants.js +0 -93
  148. package/lib/constants.js.map +0 -1
  149. package/lib/dependency-manager.d.ts +0 -151
  150. package/lib/dependency-manager.js +0 -340
  151. package/lib/dependency-manager.js.map +0 -1
  152. package/lib/formatters/default.d.ts +0 -4
  153. package/lib/formatters/default.js +0 -7
  154. package/lib/formatters/default.js.map +0 -1
  155. package/lib/formatters/formatter.d.ts +0 -3
  156. package/lib/formatters/formatter.js +0 -3
  157. package/lib/formatters/formatter.js.map +0 -1
  158. package/lib/formatters/json.d.ts +0 -4
  159. package/lib/formatters/json.js +0 -7
  160. package/lib/formatters/json.js.map +0 -1
  161. package/lib/generators/dts/glib.d.ts +0 -2
  162. package/lib/generators/dts/glib.js +0 -514
  163. package/lib/generators/dts/glib.js.map +0 -1
  164. package/lib/generators/dts/gobject.d.ts +0 -2
  165. package/lib/generators/dts/gobject.js +0 -117
  166. package/lib/generators/dts/gobject.js.map +0 -1
  167. package/lib/generators/dts-inline.d.ts +0 -10
  168. package/lib/generators/dts-inline.js +0 -57
  169. package/lib/generators/dts-inline.js.map +0 -1
  170. package/lib/generators/dts-modules.d.ts +0 -10
  171. package/lib/generators/dts-modules.js +0 -98
  172. package/lib/generators/dts-modules.js.map +0 -1
  173. package/lib/generators/dts.d.ts +0 -45
  174. package/lib/generators/dts.js +0 -683
  175. package/lib/generators/dts.js.map +0 -1
  176. package/lib/generators/generator.d.ts +0 -45
  177. package/lib/generators/generator.js +0 -9
  178. package/lib/generators/generator.js.map +0 -1
  179. package/lib/generators/index.d.ts +0 -5
  180. package/lib/generators/index.js +0 -6
  181. package/lib/generators/index.js.map +0 -1
  182. package/lib/generators/json.d.ts +0 -257
  183. package/lib/generators/json.js +0 -866
  184. package/lib/generators/json.js.map +0 -1
  185. package/lib/generics/clutter.d.ts +0 -41
  186. package/lib/generics/clutter.js +0 -52
  187. package/lib/generics/clutter.js.map +0 -1
  188. package/lib/generics/generify.d.ts +0 -2
  189. package/lib/generics/generify.js +0 -47
  190. package/lib/generics/generify.js.map +0 -1
  191. package/lib/generics/gio.d.ts +0 -7
  192. package/lib/generics/gio.js +0 -51
  193. package/lib/generics/gio.js.map +0 -1
  194. package/lib/generics/glib.d.ts +0 -7
  195. package/lib/generics/glib.js +0 -18
  196. package/lib/generics/glib.js.map +0 -1
  197. package/lib/generics/gtk.d.ts +0 -7
  198. package/lib/generics/gtk.js +0 -56
  199. package/lib/generics/gtk.js.map +0 -1
  200. package/lib/generics/meta.d.ts +0 -36
  201. package/lib/generics/meta.js +0 -29
  202. package/lib/generics/meta.js.map +0 -1
  203. package/lib/generics/st.d.ts +0 -31
  204. package/lib/generics/st.js +0 -98
  205. package/lib/generics/st.js.map +0 -1
  206. package/lib/generics/visitor.d.ts +0 -20
  207. package/lib/generics/visitor.js +0 -255
  208. package/lib/generics/visitor.js.map +0 -1
  209. package/lib/gir/alias.d.ts +0 -24
  210. package/lib/gir/alias.js +0 -43
  211. package/lib/gir/alias.js.map +0 -1
  212. package/lib/gir/base.d.ts +0 -62
  213. package/lib/gir/base.js +0 -83
  214. package/lib/gir/base.js.map +0 -1
  215. package/lib/gir/class.d.ts +0 -228
  216. package/lib/gir/class.js +0 -1151
  217. package/lib/gir/class.js.map +0 -1
  218. package/lib/gir/const.d.ts +0 -25
  219. package/lib/gir/const.js +0 -43
  220. package/lib/gir/const.js.map +0 -1
  221. package/lib/gir/enum.d.ts +0 -45
  222. package/lib/gir/enum.js +0 -164
  223. package/lib/gir/enum.js.map +0 -1
  224. package/lib/gir/function.d.ts +0 -200
  225. package/lib/gir/function.js +0 -683
  226. package/lib/gir/function.js.map +0 -1
  227. package/lib/gir/generics.d.ts +0 -5
  228. package/lib/gir/generics.js +0 -57
  229. package/lib/gir/generics.js.map +0 -1
  230. package/lib/gir/index.d.ts +0 -14
  231. package/lib/gir/index.js +0 -15
  232. package/lib/gir/index.js.map +0 -1
  233. package/lib/gir/namespace.d.ts +0 -21
  234. package/lib/gir/namespace.js +0 -57
  235. package/lib/gir/namespace.js.map +0 -1
  236. package/lib/gir/nodes.d.ts +0 -11
  237. package/lib/gir/nodes.js +0 -12
  238. package/lib/gir/nodes.js.map +0 -1
  239. package/lib/gir/promisify.d.ts +0 -5
  240. package/lib/gir/promisify.js +0 -158
  241. package/lib/gir/promisify.js.map +0 -1
  242. package/lib/gir/property.d.ts +0 -60
  243. package/lib/gir/property.js +0 -128
  244. package/lib/gir/property.js.map +0 -1
  245. package/lib/gir/registry.d.ts +0 -51
  246. package/lib/gir/registry.js +0 -147
  247. package/lib/gir/registry.js.map +0 -1
  248. package/lib/gir/signal.d.ts +0 -36
  249. package/lib/gir/signal.js +0 -169
  250. package/lib/gir/signal.js.map +0 -1
  251. package/lib/gir/util.d.ts +0 -49
  252. package/lib/gir/util.js +0 -561
  253. package/lib/gir/util.js.map +0 -1
  254. package/lib/gir-module.d.ts +0 -104
  255. package/lib/gir-module.js +0 -584
  256. package/lib/gir-module.js.map +0 -1
  257. package/lib/gir.d.ts +0 -254
  258. package/lib/gir.js +0 -639
  259. package/lib/gir.js.map +0 -1
  260. package/lib/index.d.ts +0 -13
  261. package/lib/index.js +0 -16
  262. package/lib/index.js.map +0 -1
  263. package/lib/injections/gee08.d.ts +0 -7
  264. package/lib/injections/gee08.js +0 -68
  265. package/lib/injections/gee08.js.map +0 -1
  266. package/lib/injections/gee1.d.ts +0 -7
  267. package/lib/injections/gee1.js +0 -28
  268. package/lib/injections/gee1.js.map +0 -1
  269. package/lib/injections/gio.d.ts +0 -7
  270. package/lib/injections/gio.js +0 -563
  271. package/lib/injections/gio.js.map +0 -1
  272. package/lib/injections/glib.d.ts +0 -7
  273. package/lib/injections/glib.js +0 -210
  274. package/lib/injections/glib.js.map +0 -1
  275. package/lib/injections/gobject.d.ts +0 -7
  276. package/lib/injections/gobject.js +0 -594
  277. package/lib/injections/gobject.js.map +0 -1
  278. package/lib/injections/gtk4.d.ts +0 -7
  279. package/lib/injections/gtk4.js +0 -19
  280. package/lib/injections/gtk4.js.map +0 -1
  281. package/lib/injections/inject.d.ts +0 -4
  282. package/lib/injections/inject.js +0 -33
  283. package/lib/injections/inject.js.map +0 -1
  284. package/lib/injections/shell.d.ts +0 -20
  285. package/lib/injections/shell.js +0 -34
  286. package/lib/injections/shell.js.map +0 -1
  287. package/lib/injections/tracker1.d.ts +0 -7
  288. package/lib/injections/tracker1.js +0 -30
  289. package/lib/injections/tracker1.js.map +0 -1
  290. package/lib/library-version.d.ts +0 -10
  291. package/lib/library-version.js +0 -45
  292. package/lib/library-version.js.map +0 -1
  293. package/lib/logger.d.ts +0 -36
  294. package/lib/logger.js +0 -134
  295. package/lib/logger.js.map +0 -1
  296. package/lib/messages.d.ts +0 -23
  297. package/lib/messages.js +0 -39
  298. package/lib/messages.js.map +0 -1
  299. package/lib/registry.d.ts +0 -8
  300. package/lib/registry.js +0 -12
  301. package/lib/registry.js.map +0 -1
  302. package/lib/transformation.d.ts +0 -169
  303. package/lib/transformation.js +0 -393
  304. package/lib/transformation.js.map +0 -1
  305. package/lib/types/answer-version.d.ts +0 -4
  306. package/lib/types/answer-version.js +0 -2
  307. package/lib/types/answer-version.js.map +0 -1
  308. package/lib/types/class-parent.d.ts +0 -13
  309. package/lib/types/class-parent.js +0 -2
  310. package/lib/types/class-parent.js.map +0 -1
  311. package/lib/types/config-flags.d.ts +0 -4
  312. package/lib/types/config-flags.js +0 -2
  313. package/lib/types/config-flags.js.map +0 -1
  314. package/lib/types/construct-name.d.ts +0 -1
  315. package/lib/types/construct-name.js +0 -2
  316. package/lib/types/construct-name.js.map +0 -1
  317. package/lib/types/dependency-map.d.ts +0 -4
  318. package/lib/types/dependency-map.js +0 -2
  319. package/lib/types/dependency-map.js.map +0 -1
  320. package/lib/types/dependency.js +0 -2
  321. package/lib/types/dependency.js.map +0 -1
  322. package/lib/types/file-info.js +0 -2
  323. package/lib/types/file-info.js.map +0 -1
  324. package/lib/types/format.d.ts +0 -1
  325. package/lib/types/format.js +0 -2
  326. package/lib/types/format.js.map +0 -1
  327. package/lib/types/gir-alias-element.d.ts +0 -4
  328. package/lib/types/gir-alias-element.js +0 -2
  329. package/lib/types/gir-alias-element.js.map +0 -1
  330. package/lib/types/gir-annotation.d.ts +0 -9
  331. package/lib/types/gir-annotation.js +0 -2
  332. package/lib/types/gir-annotation.js.map +0 -1
  333. package/lib/types/gir-any-element.d.ts +0 -2
  334. package/lib/types/gir-any-element.js +0 -2
  335. package/lib/types/gir-any-element.js.map +0 -1
  336. package/lib/types/gir-bitfield-element.d.ts +0 -6
  337. package/lib/types/gir-bitfield-element.js +0 -2
  338. package/lib/types/gir-bitfield-element.js.map +0 -1
  339. package/lib/types/gir-callable-param-element.d.ts +0 -4
  340. package/lib/types/gir-callable-param-element.js +0 -2
  341. package/lib/types/gir-callable-param-element.js.map +0 -1
  342. package/lib/types/gir-callable-params.d.ts +0 -7
  343. package/lib/types/gir-callable-params.js +0 -2
  344. package/lib/types/gir-callable-params.js.map +0 -1
  345. package/lib/types/gir-callable-return.d.ts +0 -5
  346. package/lib/types/gir-callable-return.js +0 -2
  347. package/lib/types/gir-callable-return.js.map +0 -1
  348. package/lib/types/gir-callback-element.d.ts +0 -6
  349. package/lib/types/gir-callback-element.js +0 -2
  350. package/lib/types/gir-callback-element.js.map +0 -1
  351. package/lib/types/gir-class-element.d.ts +0 -17
  352. package/lib/types/gir-class-element.js +0 -2
  353. package/lib/types/gir-class-element.js.map +0 -1
  354. package/lib/types/gir-constant-element.d.ts +0 -4
  355. package/lib/types/gir-constant-element.js +0 -2
  356. package/lib/types/gir-constant-element.js.map +0 -1
  357. package/lib/types/gir-constructor-element.d.ts +0 -6
  358. package/lib/types/gir-constructor-element.js +0 -2
  359. package/lib/types/gir-constructor-element.js.map +0 -1
  360. package/lib/types/gir-enum-element.d.ts +0 -6
  361. package/lib/types/gir-enum-element.js +0 -2
  362. package/lib/types/gir-enum-element.js.map +0 -1
  363. package/lib/types/gir-field-element.d.ts +0 -5
  364. package/lib/types/gir-field-element.js +0 -2
  365. package/lib/types/gir-field-element.js.map +0 -1
  366. package/lib/types/gir-function-element.d.ts +0 -6
  367. package/lib/types/gir-function-element.js +0 -2
  368. package/lib/types/gir-function-element.js.map +0 -1
  369. package/lib/types/gir-instance-parameter.d.ts +0 -7
  370. package/lib/types/gir-instance-parameter.js +0 -2
  371. package/lib/types/gir-instance-parameter.js.map +0 -1
  372. package/lib/types/gir-interface-element.d.ts +0 -16
  373. package/lib/types/gir-interface-element.js +0 -2
  374. package/lib/types/gir-interface-element.js.map +0 -1
  375. package/lib/types/gir-member-element.d.ts +0 -5
  376. package/lib/types/gir-member-element.js +0 -2
  377. package/lib/types/gir-member-element.js.map +0 -1
  378. package/lib/types/gir-method-element.d.ts +0 -7
  379. package/lib/types/gir-method-element.js +0 -2
  380. package/lib/types/gir-method-element.js.map +0 -1
  381. package/lib/types/gir-module-resolved-by.d.ts +0 -15
  382. package/lib/types/gir-module-resolved-by.js +0 -2
  383. package/lib/types/gir-module-resolved-by.js.map +0 -1
  384. package/lib/types/gir-modules-grouped-map.d.ts +0 -4
  385. package/lib/types/gir-modules-grouped-map.js +0 -2
  386. package/lib/types/gir-modules-grouped-map.js.map +0 -1
  387. package/lib/types/gir-modules-grouped.d.ts +0 -12
  388. package/lib/types/gir-modules-grouped.js +0 -2
  389. package/lib/types/gir-modules-grouped.js.map +0 -1
  390. package/lib/types/gir-namespace.d.ts +0 -27
  391. package/lib/types/gir-namespace.js +0 -2
  392. package/lib/types/gir-namespace.js.map +0 -1
  393. package/lib/types/gir-property-element.d.ts +0 -4
  394. package/lib/types/gir-property-element.js +0 -2
  395. package/lib/types/gir-property-element.js.map +0 -1
  396. package/lib/types/gir-record-element.d.ts +0 -10
  397. package/lib/types/gir-record-element.js +0 -2
  398. package/lib/types/gir-record-element.js.map +0 -1
  399. package/lib/types/gir-repository.d.ts +0 -5
  400. package/lib/types/gir-repository.js +0 -2
  401. package/lib/types/gir-repository.js.map +0 -1
  402. package/lib/types/gir-signal.d.ts +0 -10
  403. package/lib/types/gir-signal.js +0 -2
  404. package/lib/types/gir-signal.js.map +0 -1
  405. package/lib/types/gir-type-name.d.ts +0 -2
  406. package/lib/types/gir-type-name.js +0 -2
  407. package/lib/types/gir-type-name.js.map +0 -1
  408. package/lib/types/gir-union-element.d.ts +0 -9
  409. package/lib/types/gir-union-element.js +0 -2
  410. package/lib/types/gir-union-element.js.map +0 -1
  411. package/lib/types/gir-unparsed-number.d.ts +0 -2
  412. package/lib/types/gir-unparsed-number.js +0 -2
  413. package/lib/types/gir-unparsed-number.js.map +0 -1
  414. package/lib/types/gir-virtual-method.d.ts +0 -6
  415. package/lib/types/gir-virtual-method.js +0 -2
  416. package/lib/types/gir-virtual-method.js.map +0 -1
  417. package/lib/types/index.d.ts +0 -79
  418. package/lib/types/index.js +0 -80
  419. package/lib/types/index.js.map +0 -1
  420. package/lib/types/inheritance-table.js +0 -2
  421. package/lib/types/inheritance-table.js.map +0 -1
  422. package/lib/types/local-name-check.d.ts +0 -4
  423. package/lib/types/local-name-check.js +0 -2
  424. package/lib/types/local-name-check.js.map +0 -1
  425. package/lib/types/local-name-type.d.ts +0 -1
  426. package/lib/types/local-name-type.js +0 -2
  427. package/lib/types/local-name-type.js.map +0 -1
  428. package/lib/types/local-name.d.ts +0 -7
  429. package/lib/types/local-name.js +0 -2
  430. package/lib/types/local-name.js.map +0 -1
  431. package/lib/types/local-names.d.ts +0 -4
  432. package/lib/types/local-names.js +0 -2
  433. package/lib/types/local-names.js.map +0 -1
  434. package/lib/types/metadata.d.ts +0 -8
  435. package/lib/types/metadata.js +0 -2
  436. package/lib/types/metadata.js.map +0 -1
  437. package/lib/types/options-base.d.ts +0 -4
  438. package/lib/types/options-base.js +0 -2
  439. package/lib/types/options-base.js.map +0 -1
  440. package/lib/types/options-generation.js +0 -2
  441. package/lib/types/options-generation.js.map +0 -1
  442. package/lib/types/options-load.d.ts +0 -5
  443. package/lib/types/options-load.js +0 -2
  444. package/lib/types/options-load.js.map +0 -1
  445. package/lib/types/options-transform.d.ts +0 -4
  446. package/lib/types/options-transform.js +0 -2
  447. package/lib/types/options-transform.js.map +0 -1
  448. package/lib/types/output-format.d.ts +0 -1
  449. package/lib/types/output-format.js +0 -2
  450. package/lib/types/output-format.js.map +0 -1
  451. package/lib/types/package-data-parsed.js +0 -2
  452. package/lib/types/package-data-parsed.js.map +0 -1
  453. package/lib/types/package-data.js +0 -2
  454. package/lib/types/package-data.js.map +0 -1
  455. package/lib/types/package-section-parsed.d.ts +0 -8
  456. package/lib/types/package-section-parsed.js +0 -2
  457. package/lib/types/package-section-parsed.js.map +0 -1
  458. package/lib/types/parsed-gir.d.ts +0 -5
  459. package/lib/types/parsed-gir.js +0 -2
  460. package/lib/types/parsed-gir.js.map +0 -1
  461. package/lib/types/parsed-package-data.d.ts +0 -6
  462. package/lib/types/parsed-package-data.js +0 -2
  463. package/lib/types/parsed-package-data.js.map +0 -1
  464. package/lib/types/part-of-class.d.ts +0 -7
  465. package/lib/types/part-of-class.js +0 -2
  466. package/lib/types/part-of-class.js.map +0 -1
  467. package/lib/types/part-of-module.d.ts +0 -6
  468. package/lib/types/part-of-module.js +0 -2
  469. package/lib/types/part-of-module.js.map +0 -1
  470. package/lib/types/property-case.d.ts +0 -1
  471. package/lib/types/property-case.js +0 -2
  472. package/lib/types/property-case.js.map +0 -1
  473. package/lib/types/resolve-type.d.ts +0 -4
  474. package/lib/types/resolve-type.js +0 -6
  475. package/lib/types/resolve-type.js.map +0 -1
  476. package/lib/types/template-data.d.ts +0 -7
  477. package/lib/types/template-data.js +0 -2
  478. package/lib/types/template-data.js.map +0 -1
  479. package/lib/types/transformation-case.d.ts +0 -1
  480. package/lib/types/transformation-case.js +0 -2
  481. package/lib/types/transformation-case.js.map +0 -1
  482. package/lib/types/transformations.d.ts +0 -4
  483. package/lib/types/transformations.js +0 -2
  484. package/lib/types/transformations.js.map +0 -1
  485. package/lib/types/ts-doc-tag.js +0 -2
  486. package/lib/types/ts-doc-tag.js.map +0 -1
  487. package/lib/types/ts-doc.js +0 -2
  488. package/lib/types/ts-doc.js.map +0 -1
  489. package/lib/types/type-gir-alias.js +0 -2
  490. package/lib/types/type-gir-alias.js.map +0 -1
  491. package/lib/types/type-gir-class.js +0 -2
  492. package/lib/types/type-gir-class.js.map +0 -1
  493. package/lib/types/type-gir-element.d.ts +0 -3
  494. package/lib/types/type-gir-element.js +0 -2
  495. package/lib/types/type-gir-element.js.map +0 -1
  496. package/lib/types/type-gir-enumeration-member.js +0 -2
  497. package/lib/types/type-gir-enumeration-member.js.map +0 -1
  498. package/lib/types/type-gir-enumeration.js +0 -2
  499. package/lib/types/type-gir-enumeration.js.map +0 -1
  500. package/lib/types/type-gir-function.d.ts +0 -1
  501. package/lib/types/type-gir-function.js +0 -2
  502. package/lib/types/type-gir-function.js.map +0 -1
  503. package/lib/types/type-gir-interface.js +0 -2
  504. package/lib/types/type-gir-interface.js.map +0 -1
  505. package/lib/types/type-gir-method.js +0 -2
  506. package/lib/types/type-gir-method.js.map +0 -1
  507. package/lib/types/type-gir-parameter.d.ts +0 -1
  508. package/lib/types/type-gir-parameter.js +0 -2
  509. package/lib/types/type-gir-parameter.js.map +0 -1
  510. package/lib/types/type-gir-property.js +0 -2
  511. package/lib/types/type-gir-property.js.map +0 -1
  512. package/lib/types/type-gir-variable.d.ts +0 -1
  513. package/lib/types/type-gir-variable.js +0 -2
  514. package/lib/types/type-gir-variable.js.map +0 -1
  515. package/lib/types/type-ts-element.d.ts +0 -3
  516. package/lib/types/type-ts-element.js +0 -2
  517. package/lib/types/type-ts-element.js.map +0 -1
  518. package/lib/types/type-ts-enumeration-member.js +0 -2
  519. package/lib/types/type-ts-enumeration-member.js.map +0 -1
  520. package/lib/types/type-ts-function.js +0 -2
  521. package/lib/types/type-ts-function.js.map +0 -1
  522. package/lib/types/type-ts-property.js +0 -2
  523. package/lib/types/type-ts-property.js.map +0 -1
  524. package/lib/types/user-config-load-result.d.ts +0 -6
  525. package/lib/types/user-config-load-result.js +0 -2
  526. package/lib/types/user-config-load-result.js.map +0 -1
  527. package/lib/types/user-config.js +0 -2
  528. package/lib/types/user-config.js.map +0 -1
  529. package/lib/util.d.ts +0 -20
  530. package/lib/util.js +0 -67
  531. package/lib/util.js.map +0 -1
  532. package/lib/utils/documentation.d.ts +0 -13
  533. package/lib/utils/documentation.js.map +0 -1
  534. package/lib/utils/files.d.ts +0 -21
  535. package/lib/utils/files.js +0 -62
  536. package/lib/utils/files.js.map +0 -1
  537. package/lib/utils/girs.d.ts +0 -45
  538. package/lib/utils/girs.js +0 -101
  539. package/lib/utils/girs.js.map +0 -1
  540. package/lib/utils/index.d.ts +0 -8
  541. package/lib/utils/index.js +0 -9
  542. package/lib/utils/index.js.map +0 -1
  543. package/lib/utils/naming.d.ts +0 -13
  544. package/lib/utils/naming.js +0 -40
  545. package/lib/utils/naming.js.map +0 -1
  546. package/lib/utils/numbers.js +0 -9
  547. package/lib/utils/numbers.js.map +0 -1
  548. package/lib/utils/objects.d.ts +0 -136
  549. package/lib/utils/objects.js.map +0 -1
  550. package/lib/utils/path.d.ts +0 -1
  551. package/lib/utils/path.js +0 -7
  552. package/lib/utils/path.js.map +0 -1
  553. package/lib/utils/strings.d.ts +0 -74
  554. package/lib/utils/strings.js +0 -121
  555. package/lib/utils/strings.js.map +0 -1
  556. package/lib/validators/class.d.ts +0 -7
  557. package/lib/validators/class.js +0 -217
  558. package/lib/validators/class.js.map +0 -1
  559. package/lib/validators/function-parameters.d.ts +0 -14
  560. package/lib/validators/function-parameters.js +0 -31
  561. package/lib/validators/function-parameters.js.map +0 -1
  562. package/lib/validators/interface.d.ts +0 -5
  563. package/lib/validators/interface.js +0 -16
  564. package/lib/validators/interface.js.map +0 -1
  565. package/lib/visitor.d.ts +0 -35
  566. package/lib/visitor.js +0 -29
  567. package/lib/visitor.js.map +0 -1
package/src/gir.ts ADDED
@@ -0,0 +1,892 @@
1
+ import type { IntrospectedNamespace } from "./gir/namespace.ts";
2
+
3
+ /**
4
+ * A list of possible type conflicts.
5
+ *
6
+ * The format is CHILD_PARENT_CONFLICT so
7
+ * ACCESSOR_PROPERTY_CONFLICT means there
8
+ * is an accessor on a child class and a
9
+ * property on the parent class, which is a
10
+ * conflict.
11
+ *
12
+ * Starts at '1' because the value is often
13
+ * used as truthy.
14
+ */
15
+ export enum ConflictType {
16
+ PROPERTY_NAME_CONFLICT = 1,
17
+ FIELD_NAME_CONFLICT,
18
+ FUNCTION_NAME_CONFLICT,
19
+ ACCESSOR_PROPERTY_CONFLICT,
20
+ PROPERTY_ACCESSOR_CONFLICT,
21
+ }
22
+
23
+ import { ConsoleReporter, ReporterService } from "@ts-for-gir/reporter";
24
+ import type { IntrospectedField, IntrospectedProperty } from "./gir/property.ts";
25
+ import type { OptionsBase } from "./types/index.ts";
26
+ import { isInvalid, sanitizeIdentifierName, sanitizeNamespace } from "./utils/naming.ts";
27
+
28
+ export abstract class TypeExpression {
29
+ isPointer = false;
30
+
31
+ abstract equals(type: TypeExpression): boolean;
32
+ abstract unwrap(): TypeExpression;
33
+
34
+ deepUnwrap(): TypeExpression {
35
+ return this.unwrap();
36
+ }
37
+
38
+ abstract rewrap(type: TypeExpression): TypeExpression;
39
+ abstract resolve(namespace: IntrospectedNamespace, options: OptionsBase): TypeExpression;
40
+
41
+ abstract print(namespace: IntrospectedNamespace, options: OptionsBase): string;
42
+ rootPrint(namespace: IntrospectedNamespace, options: OptionsBase): string {
43
+ return this.print(namespace, options);
44
+ }
45
+ }
46
+
47
+ export class TypeIdentifier extends TypeExpression {
48
+ readonly name: string;
49
+ readonly namespace: string;
50
+
51
+ // Global reporter configuration and instance
52
+ private static reporterConfig: { enabled: boolean; output: string } = {
53
+ enabled: false,
54
+ output: "ts-for-gir-report.json",
55
+ };
56
+ private static globalReporter: ConsoleReporter | null = null;
57
+
58
+ static configureReporter(enabled: boolean, output: string = "ts-for-gir-report.json") {
59
+ TypeIdentifier.reporterConfig = { enabled, output };
60
+
61
+ // Reset global reporter to force recreation with new config
62
+ if (TypeIdentifier.globalReporter) {
63
+ TypeIdentifier.globalReporter = null;
64
+ }
65
+
66
+ // Create and register the global reporter if enabled
67
+ if (enabled) {
68
+ TypeIdentifier.globalReporter = new ConsoleReporter(true, "TypeIdentifier", enabled, output);
69
+ const reporterService = ReporterService.getInstance();
70
+ reporterService.registerReporter("TypeIdentifier", TypeIdentifier.globalReporter);
71
+ }
72
+ }
73
+
74
+ private static getReporter(): ConsoleReporter {
75
+ if (!TypeIdentifier.globalReporter) {
76
+ const config = TypeIdentifier.reporterConfig;
77
+ TypeIdentifier.globalReporter = new ConsoleReporter(true, "TypeIdentifier", config.enabled, config.output);
78
+
79
+ if (config.enabled) {
80
+ const reporterService = ReporterService.getInstance();
81
+ reporterService.registerReporter("TypeIdentifier", TypeIdentifier.globalReporter);
82
+ }
83
+ }
84
+ return TypeIdentifier.globalReporter;
85
+ }
86
+
87
+ get log(): ConsoleReporter {
88
+ return TypeIdentifier.getReporter();
89
+ }
90
+
91
+ constructor(name: string, namespace: string) {
92
+ super();
93
+ this.name = name;
94
+ this.namespace = namespace;
95
+ }
96
+
97
+ equals(type: TypeExpression): boolean {
98
+ return type instanceof TypeIdentifier && type.name === this.name && type.namespace === this.namespace;
99
+ }
100
+
101
+ is(namespace: string, name: string) {
102
+ return this.namespace === namespace && this.name === name;
103
+ }
104
+
105
+ unwrap() {
106
+ return this;
107
+ }
108
+
109
+ rewrap(type: TypeExpression): TypeExpression {
110
+ return type;
111
+ }
112
+
113
+ /**
114
+ * TODO: gi.ts didn't deal with sanitizing types but probably should have to avoid
115
+ * invalid names such as "3gppProfile"
116
+ */
117
+ sanitize() {
118
+ return new TypeIdentifier(sanitizeIdentifierName(this.namespace, this.name), sanitizeNamespace(this.namespace));
119
+ }
120
+
121
+ protected _resolve(namespace: IntrospectedNamespace, options: OptionsBase): TypeIdentifier | null {
122
+ const name: string = sanitizeIdentifierName(null, this.name);
123
+ const unresolvedNamespaceName = this.namespace;
124
+
125
+ const ns = namespace.assertInstalledImport(unresolvedNamespaceName);
126
+
127
+ if (ns.hasSymbol(name)) {
128
+ const c = ns.getClass(name);
129
+
130
+ // Some records are structs for other class types.
131
+ // GirRecord.prototype.getType resolves this relationship.
132
+ if (c) return c.getType();
133
+
134
+ return new TypeIdentifier(name, ns.namespace);
135
+ }
136
+
137
+ // Handle "class callback" types (they're in a definition-merged module)
138
+ let [cb, corrected_name] = ns.findClassCallback(name);
139
+ let resolved_name: string | null = null;
140
+
141
+ if (!cb) {
142
+ resolved_name = ns.resolveSymbolFromTypeName(name);
143
+ }
144
+
145
+ let c_resolved_name: string | null = null;
146
+
147
+ if (!c_resolved_name) {
148
+ c_resolved_name = ns.resolveSymbolFromTypeName(`${unresolvedNamespaceName}${name}`);
149
+ }
150
+
151
+ if (!c_resolved_name) {
152
+ c_resolved_name = ns.resolveSymbolFromTypeName(`${ns.namespace}${name}`);
153
+ }
154
+
155
+ if (!cb && !resolved_name && !c_resolved_name) {
156
+ // Don't warn if a missing import is at fault, this will be dealt with later.
157
+ if (namespace.namespace === ns.namespace) {
158
+ this.log.reportTypeResolutionWarning(
159
+ this.name,
160
+ this.namespace,
161
+ `Attempting to fall back on c:type inference for ${ns.namespace}.${name}`,
162
+ `Fallback to c:type inference attempted`,
163
+ );
164
+ }
165
+
166
+ [cb, corrected_name] = ns.findClassCallback(`${ns.namespace}${name}`);
167
+
168
+ if (cb) {
169
+ this.log.reportTypeResolutionWarning(
170
+ this.name,
171
+ this.namespace,
172
+ `Falling back on c:type inference for ${ns.namespace}.${name} and found ${ns.namespace}.${corrected_name}`,
173
+ `Successfully resolved using c:type fallback`,
174
+ );
175
+ }
176
+ }
177
+
178
+ if (cb) {
179
+ if (options.verbose) {
180
+ this.log.debug(`Callback found: ${cb}.${corrected_name}`);
181
+ }
182
+
183
+ return new ModuleTypeIdentifier(corrected_name, cb, ns.namespace);
184
+ } else if (resolved_name) {
185
+ return new TypeIdentifier(resolved_name, ns.namespace);
186
+ } else if (c_resolved_name) {
187
+ this.log.reportTypeResolutionWarning(
188
+ this.name,
189
+ this.namespace,
190
+ `Fall back on c:type inference for ${ns.namespace}.${name} and found ${ns.namespace}.${corrected_name}`,
191
+ `Using c:type as fallback for type resolution`,
192
+ );
193
+
194
+ return new TypeIdentifier(c_resolved_name, ns.namespace);
195
+ } else if (namespace.namespace === ns.namespace) {
196
+ this.log.reportTypeResolutionError(
197
+ this.name,
198
+ ns.namespace,
199
+ `Unable to resolve type ${this.name} in same namespace ${ns.namespace}!`,
200
+ `Type resolution failed within the same namespace`,
201
+ );
202
+ return null;
203
+ }
204
+
205
+ this.log.reportTypeResolutionError(
206
+ this.name,
207
+ this.namespace,
208
+ `Type ${this.name} could not be resolved in ${namespace.namespace} ${namespace.version}`,
209
+ `Failed to resolve type during namespace processing`,
210
+ );
211
+ return null;
212
+ }
213
+
214
+ resolveIdentifier(namespace: IntrospectedNamespace, options: OptionsBase): TypeIdentifier | null {
215
+ return this._resolve(namespace, options);
216
+ }
217
+
218
+ resolve(namespace: IntrospectedNamespace, options: OptionsBase): TypeExpression {
219
+ const resolved = this._resolve(namespace, options);
220
+
221
+ // Generally if we can't resolve a type it is not introspectable,
222
+ // thus we annotate it as "never".
223
+ return resolved ?? NeverType;
224
+ }
225
+
226
+ static new({ name, namespace }: { name: string; namespace: string }) {
227
+ return new TypeIdentifier(name, namespace);
228
+ }
229
+
230
+ print(namespace: IntrospectedNamespace, _options: OptionsBase): string {
231
+ if (namespace.hasSymbol(this.namespace) && this.namespace !== namespace.namespace) {
232
+ // TODO: Move to TypeScript generator...
233
+ // Libraries like zbar have classes named things like "Gtk"
234
+ return `${this.namespace}__.${this.name}`;
235
+ }
236
+
237
+ if (namespace.namespace === this.namespace) {
238
+ return `${this.name}`;
239
+ } else {
240
+ return `${this.namespace}.${this.name}`;
241
+ }
242
+ }
243
+ }
244
+
245
+ export class ModuleTypeIdentifier extends TypeIdentifier {
246
+ readonly moduleName: string;
247
+ declare readonly namespace: string;
248
+
249
+ constructor(name: string, moduleName: string, namespace: string) {
250
+ super(name, namespace);
251
+ this.moduleName = moduleName;
252
+ this.namespace = namespace;
253
+ }
254
+
255
+ equals(type: TypeExpression): boolean {
256
+ return super.equals(type) && type instanceof ModuleTypeIdentifier && this.moduleName === type.moduleName;
257
+ }
258
+
259
+ is(namespace: string, moduleName: string, name?: string) {
260
+ return this.namespace === namespace && this.moduleName === moduleName && this.name === name && name !== undefined;
261
+ }
262
+
263
+ unwrap() {
264
+ return this;
265
+ }
266
+
267
+ rewrap(type: TypeExpression): TypeExpression {
268
+ return type;
269
+ }
270
+
271
+ sanitize() {
272
+ return new ModuleTypeIdentifier(
273
+ sanitizeIdentifierName(this.namespace, this.name),
274
+ sanitizeIdentifierName(this.namespace, this.moduleName),
275
+ sanitizeNamespace(this.namespace),
276
+ );
277
+ }
278
+
279
+ protected _resolve(_namespace: IntrospectedNamespace, _options: OptionsBase): ModuleTypeIdentifier | null {
280
+ return this;
281
+ }
282
+
283
+ print(namespace: IntrospectedNamespace, _options: OptionsBase): string {
284
+ if (namespace.namespace === this.namespace) {
285
+ return `${this.moduleName}.${this.name}`;
286
+ } else {
287
+ return `${this.namespace}.${this.moduleName}.${this.name}`;
288
+ }
289
+ }
290
+ }
291
+
292
+ /**
293
+ * This class overrides the default printing for types
294
+ */
295
+ export class ClassStructTypeIdentifier extends TypeIdentifier {
296
+ equals(type: TypeExpression): boolean {
297
+ return type instanceof ClassStructTypeIdentifier && super.equals(type);
298
+ }
299
+
300
+ print(namespace: IntrospectedNamespace, _options: OptionsBase): string {
301
+ if (namespace.namespace === this.namespace) {
302
+ // TODO: Mapping to invalid names should happen at the generator level...
303
+ return `typeof ${isInvalid(this.name) ? `__${this.name}` : this.name}`;
304
+ } else {
305
+ return `typeof ${this.namespace}.${isInvalid(this.name) ? `__${this.name}` : this.name}`;
306
+ }
307
+ }
308
+ }
309
+
310
+ export class GenerifiedTypeIdentifier extends TypeIdentifier {
311
+ generics: TypeExpression[];
312
+
313
+ constructor(name: string, namespace: string, generics: TypeExpression[] = []) {
314
+ super(name, namespace);
315
+ this.generics = generics;
316
+ }
317
+
318
+ print(namespace: IntrospectedNamespace, options: OptionsBase): string {
319
+ const Generics = this.generics.map((generic) => generic.print(namespace, options)).join(", ");
320
+
321
+ if (namespace.namespace === this.namespace) {
322
+ return `${this.name}${this.generics.length > 0 ? `<${Generics}>` : ""}`;
323
+ } else {
324
+ return `${this.namespace}.${this.name}${this.generics.length > 0 ? `<${Generics}>` : ""}`;
325
+ }
326
+ }
327
+
328
+ _resolve(namespace: IntrospectedNamespace, options: OptionsBase): TypeIdentifier | null {
329
+ const iden = super._resolve(namespace, options);
330
+
331
+ if (iden) {
332
+ return new GenerifiedTypeIdentifier(iden.name, iden.namespace, [...this.generics]);
333
+ }
334
+
335
+ return iden;
336
+ }
337
+ }
338
+
339
+ export class NativeType extends TypeExpression {
340
+ readonly expression: (options?: OptionsBase) => string;
341
+
342
+ constructor(expression: ((options?: OptionsBase) => string) | string) {
343
+ super();
344
+ this.expression = typeof expression === "string" ? () => expression : expression;
345
+ }
346
+
347
+ rewrap(type: TypeExpression): TypeExpression {
348
+ return type;
349
+ }
350
+
351
+ resolve(): TypeExpression {
352
+ return this;
353
+ }
354
+
355
+ print(_namespace: IntrospectedNamespace, options: OptionsBase): string {
356
+ return this.expression(options);
357
+ }
358
+
359
+ equals(type: TypeExpression, options?: OptionsBase): boolean {
360
+ return type instanceof NativeType && this.expression(options) === type.expression(options);
361
+ }
362
+
363
+ unwrap(): TypeExpression {
364
+ return this;
365
+ }
366
+
367
+ static withGenerator(generator: (options?: OptionsBase) => string): TypeExpression {
368
+ return new NativeType(generator);
369
+ }
370
+
371
+ static of(nativeType: string): NativeType {
372
+ return new NativeType(nativeType);
373
+ }
374
+ }
375
+
376
+ export class OrType extends TypeExpression {
377
+ readonly types: ReadonlyArray<TypeExpression>;
378
+
379
+ constructor(type: TypeExpression, ...types: TypeExpression[]) {
380
+ super();
381
+ this.types = [type, ...types];
382
+ }
383
+
384
+ rewrap(type: TypeExpression): TypeExpression {
385
+ return type;
386
+ }
387
+
388
+ unwrap(): TypeExpression {
389
+ return this;
390
+ }
391
+
392
+ resolve(namespace: IntrospectedNamespace, options: OptionsBase): TypeExpression {
393
+ const [type, ...types] = this.types;
394
+
395
+ return new OrType(type.resolve(namespace, options), ...types.map((t) => t.resolve(namespace, options)));
396
+ }
397
+
398
+ print(namespace: IntrospectedNamespace, options: OptionsBase): string {
399
+ return `(${this.types.map((t) => t.print(namespace, options)).join(" | ")})`;
400
+ }
401
+
402
+ rootPrint(namespace: IntrospectedNamespace, options: OptionsBase): string {
403
+ return `${this.types.map((t) => t.print(namespace, options)).join(" | ")}`;
404
+ }
405
+
406
+ equals(type: TypeExpression) {
407
+ if (type instanceof OrType) {
408
+ return this.types.every((t) => type.types.some((type) => type.equals(t)));
409
+ } else {
410
+ return false;
411
+ }
412
+ }
413
+ }
414
+
415
+ export class TupleType extends OrType {
416
+ print(namespace: IntrospectedNamespace, options: OptionsBase): string {
417
+ return `[${this.types.map((t) => t.print(namespace, options)).join(", ")}]`;
418
+ }
419
+
420
+ rootPrint(namespace: IntrospectedNamespace, options: OptionsBase): string {
421
+ return this.print(namespace, options);
422
+ }
423
+
424
+ resolve(namespace: IntrospectedNamespace, options: OptionsBase): TypeExpression {
425
+ const [type, ...types] = this.types;
426
+
427
+ return new TupleType(type.resolve(namespace, options), ...types.map((t) => t.resolve(namespace, options)));
428
+ }
429
+
430
+ equals(type: TypeExpression) {
431
+ if (type instanceof TupleType) {
432
+ return this.types.length === type.types.length && this.types.every((t, i) => type.types[i].equals(t));
433
+ } else {
434
+ return false;
435
+ }
436
+ }
437
+ }
438
+
439
+ export class BinaryType extends OrType {
440
+ unwrap(): TypeExpression {
441
+ return this;
442
+ }
443
+
444
+ resolve(namespace: IntrospectedNamespace, options: OptionsBase) {
445
+ return new BinaryType(this.a.resolve(namespace, options), this.b.resolve(namespace, options));
446
+ }
447
+
448
+ is() {
449
+ return false;
450
+ }
451
+
452
+ get a() {
453
+ return this.types[0];
454
+ }
455
+
456
+ get b() {
457
+ return this.types[1];
458
+ }
459
+ }
460
+
461
+ export class FunctionType extends TypeExpression {
462
+ parameterTypes: { [name: string]: TypeExpression };
463
+ returnType: TypeExpression;
464
+
465
+ constructor(parameters: { [name: string]: TypeExpression }, returnType: TypeExpression) {
466
+ super();
467
+
468
+ this.parameterTypes = parameters;
469
+ this.returnType = returnType;
470
+ }
471
+
472
+ equals(type: TypeExpression): boolean {
473
+ if (type instanceof FunctionType) {
474
+ return (
475
+ Object.values(this.parameterTypes).every((t) =>
476
+ Object.values(type.parameterTypes).some((tp) => t.equals(tp)),
477
+ ) &&
478
+ Object.values(type.parameterTypes).every((t) =>
479
+ Object.values(this.parameterTypes).some((tp) => t.equals(tp)),
480
+ ) &&
481
+ this.returnType.equals(type.returnType)
482
+ );
483
+ }
484
+
485
+ return false;
486
+ }
487
+
488
+ rewrap(type: TypeExpression): TypeExpression {
489
+ return type;
490
+ }
491
+
492
+ unwrap(): TypeExpression {
493
+ return this;
494
+ }
495
+
496
+ resolve(namespace: IntrospectedNamespace, options: OptionsBase): TypeExpression {
497
+ return new FunctionType(
498
+ Object.fromEntries(
499
+ Object.entries(this.parameterTypes).map(([k, p]) => {
500
+ return [k, p.resolve(namespace, options)];
501
+ }),
502
+ ),
503
+ this.returnType.resolve(namespace, options),
504
+ );
505
+ }
506
+
507
+ rootPrint(namespace: IntrospectedNamespace, options: OptionsBase): string {
508
+ const Parameters = Object.entries(this.parameterTypes)
509
+ .map(([k, v]) => {
510
+ return `${k}: ${v.rootPrint(namespace, options)}`;
511
+ })
512
+ .join(", ");
513
+
514
+ return `(${Parameters}) => ${this.returnType.print(namespace, options)}`;
515
+ }
516
+
517
+ print(namespace: IntrospectedNamespace, options: OptionsBase): string {
518
+ return `(${this.rootPrint(namespace, options)})`;
519
+ }
520
+ }
521
+
522
+ export class Generic {
523
+ private _deriveFrom: TypeIdentifier | null;
524
+ private _genericType: GenericType;
525
+ private _defaultType: TypeExpression | null;
526
+ private _constraint: TypeExpression | null;
527
+ private _propagate: boolean;
528
+
529
+ constructor(
530
+ genericType: GenericType,
531
+ defaultType?: TypeExpression,
532
+ deriveFrom?: TypeIdentifier,
533
+ constraint?: TypeExpression,
534
+ propagate = true,
535
+ ) {
536
+ this._deriveFrom = deriveFrom ?? null;
537
+ this._genericType = genericType;
538
+ this._defaultType = defaultType ?? null;
539
+ this._constraint = constraint ?? null;
540
+ this._propagate = propagate;
541
+ }
542
+
543
+ unwrap() {
544
+ return this._genericType;
545
+ }
546
+
547
+ get propagate() {
548
+ return this._propagate;
549
+ }
550
+
551
+ get type() {
552
+ return this._genericType;
553
+ }
554
+
555
+ get defaultType() {
556
+ return this._defaultType;
557
+ }
558
+
559
+ get constraint() {
560
+ return this._constraint;
561
+ }
562
+
563
+ get parent() {
564
+ return this._deriveFrom;
565
+ }
566
+ }
567
+
568
+ export class GenerifiedType extends TypeExpression {
569
+ type: TypeExpression;
570
+ generic: GenericType;
571
+
572
+ constructor(type: TypeExpression, generic: GenericType) {
573
+ super();
574
+
575
+ this.type = type;
576
+ this.generic = generic;
577
+ }
578
+
579
+ resolve(namespace: IntrospectedNamespace, options: OptionsBase) {
580
+ return new GenerifiedType(this.type.resolve(namespace, options), this.generic);
581
+ }
582
+
583
+ unwrap() {
584
+ return this.type;
585
+ }
586
+
587
+ rootPrint(namespace: IntrospectedNamespace, options: OptionsBase) {
588
+ return this.type.rootPrint(namespace, options);
589
+ }
590
+
591
+ print(namespace: IntrospectedNamespace, options: OptionsBase) {
592
+ return `${this.type.print(namespace, options)}<${this.generic.print()}>`;
593
+ }
594
+
595
+ equals(type: TypeExpression): boolean {
596
+ if (type instanceof GenerifiedType) {
597
+ return this.type.equals(type.type) && this.generic.equals(type.generic);
598
+ }
599
+
600
+ return this.type.equals(type);
601
+ }
602
+
603
+ rewrap(type: TypeExpression): TypeExpression {
604
+ return new GenerifiedType(this.type.rewrap(type), this.generic);
605
+ }
606
+ }
607
+
608
+ export class GenericType extends TypeExpression {
609
+ identifier: string;
610
+ replacedType?: TypeExpression;
611
+
612
+ constructor(identifier: string, replacedType?: TypeExpression) {
613
+ super();
614
+
615
+ this.identifier = identifier;
616
+ this.replacedType = replacedType;
617
+ }
618
+
619
+ equals(type: TypeExpression): boolean {
620
+ if (type instanceof GenericType) {
621
+ const genericType = type;
622
+ return this.identifier === genericType.identifier;
623
+ }
624
+
625
+ return false;
626
+ }
627
+
628
+ unwrap(): TypeExpression {
629
+ return this;
630
+ }
631
+
632
+ rewrap(type: TypeExpression): TypeExpression {
633
+ return type;
634
+ }
635
+
636
+ resolve(): GenericType {
637
+ return this;
638
+ }
639
+
640
+ print(): string {
641
+ return this.identifier;
642
+ }
643
+ }
644
+
645
+ export class NullableType extends BinaryType {
646
+ constructor(type: TypeExpression) {
647
+ super(type, NullType);
648
+ }
649
+
650
+ unwrap() {
651
+ return this.a;
652
+ }
653
+
654
+ rewrap(type: TypeExpression): TypeExpression {
655
+ return new NullableType(this.a.rewrap(type));
656
+ }
657
+
658
+ get type() {
659
+ return this.a;
660
+ }
661
+ }
662
+
663
+ export class PromiseType extends TypeExpression {
664
+ type: TypeExpression;
665
+
666
+ constructor(type: TypeExpression) {
667
+ super();
668
+ this.type = type;
669
+ }
670
+
671
+ equals(type: TypeExpression): boolean {
672
+ return type instanceof PromiseType && type.type.equals(this.type);
673
+ }
674
+
675
+ unwrap() {
676
+ return this;
677
+ }
678
+
679
+ rewrap(type: TypeExpression): TypeExpression {
680
+ return new PromiseType(this.type.rewrap(type));
681
+ }
682
+
683
+ resolve(namespace: IntrospectedNamespace, options: OptionsBase): TypeExpression {
684
+ return new PromiseType(this.type.resolve(namespace, options));
685
+ }
686
+
687
+ print(namespace: IntrospectedNamespace, options: OptionsBase): string {
688
+ if (this.type.equals(VoidType)) {
689
+ return "globalThis.Promise<void>";
690
+ }
691
+
692
+ return `globalThis.Promise<${this.type.print(namespace, options)}>`;
693
+ }
694
+
695
+ rootPrint(namespace: IntrospectedNamespace, options: OptionsBase): string {
696
+ return this.print(namespace, options);
697
+ }
698
+ }
699
+
700
+ /**
701
+ * This is one of the more interesting usages of our type
702
+ * system. To handle type conflicts we wrap conflicting types
703
+ * in this class with a ConflictType to denote why they are a
704
+ * conflict.
705
+ *
706
+ * TypeConflict will throw if it is printed or resolved, so generators
707
+ * must unwrap it and "resolve" the conflict. Some generators like JSON
708
+ * just disregard this info, other generators like DTS attempt to
709
+ * resolve the conflicts so the typing stays sound.
710
+ */
711
+ export class TypeConflict extends TypeExpression {
712
+ readonly conflictType: ConflictType;
713
+ readonly type: TypeExpression;
714
+
715
+ constructor(type: TypeExpression, conflictType: ConflictType) {
716
+ super();
717
+ this.type = type;
718
+ this.conflictType = conflictType;
719
+ }
720
+
721
+ rewrap(type: TypeExpression): TypeConflict {
722
+ return new TypeConflict(this.type.rewrap(type), this.conflictType);
723
+ }
724
+
725
+ unwrap(): TypeExpression {
726
+ return this.type;
727
+ }
728
+
729
+ // TODO: This constant "true" is a remnant of the Anyified type.
730
+ equals(): boolean {
731
+ return true;
732
+ }
733
+
734
+ resolve(namespace: IntrospectedNamespace, options: OptionsBase): TypeExpression {
735
+ const resolvedType = this.type.resolve(namespace, options);
736
+ const typeString = resolvedType.print(namespace, options);
737
+ throw new Error(`Type conflict was not resolved for ${typeString} in ${namespace.namespace}`);
738
+ }
739
+
740
+ print(namespace: IntrospectedNamespace, options: OptionsBase): string {
741
+ const resolvedType = this.type.resolve(namespace, options);
742
+ const typeString = resolvedType.print(namespace, options);
743
+ throw new Error(`Type conflict was not resolved for ${typeString} in ${namespace.namespace}`);
744
+ }
745
+ }
746
+
747
+ export class ClosureType extends TypeExpression {
748
+ type: TypeExpression;
749
+ user_data: number | null = null;
750
+
751
+ constructor(type: TypeExpression) {
752
+ super();
753
+ this.type = type;
754
+ }
755
+
756
+ equals(type: TypeExpression): boolean {
757
+ if (type instanceof ClosureType) {
758
+ const closureType = type;
759
+ return this.type.equals(closureType.type);
760
+ }
761
+
762
+ return false;
763
+ }
764
+
765
+ deepUnwrap(): TypeExpression {
766
+ return this.type;
767
+ }
768
+
769
+ rewrap(type: TypeExpression): TypeExpression {
770
+ const closure = new ClosureType(this.type.rewrap(type));
771
+
772
+ closure.user_data = this.user_data;
773
+
774
+ return closure;
775
+ }
776
+
777
+ unwrap(): TypeExpression {
778
+ return this;
779
+ }
780
+
781
+ resolve(namespace: IntrospectedNamespace, options: OptionsBase) {
782
+ const { user_data, type } = this;
783
+
784
+ return ClosureType.new({
785
+ user_data,
786
+ type: type.resolve(namespace, options),
787
+ });
788
+ }
789
+
790
+ print(namespace: IntrospectedNamespace, options: OptionsBase): string {
791
+ return this.type.print(namespace, options);
792
+ }
793
+
794
+ static new({ type, user_data = null }: { type: TypeExpression; user_data?: number | null }) {
795
+ const vt = new ClosureType(type);
796
+ vt.user_data = user_data;
797
+ return vt;
798
+ }
799
+ }
800
+
801
+ export class ArrayType extends TypeExpression {
802
+ type: TypeExpression;
803
+ arrayDepth: number = 1;
804
+ length: number | null = null;
805
+
806
+ constructor(type: TypeExpression) {
807
+ super();
808
+ this.type = type;
809
+ }
810
+
811
+ deepUnwrap(): TypeExpression {
812
+ return this.type;
813
+ }
814
+
815
+ unwrap(): TypeExpression {
816
+ return this;
817
+ }
818
+
819
+ rewrap(type: TypeExpression): TypeExpression {
820
+ const array = new ArrayType(this.type.rewrap(type));
821
+
822
+ array.arrayDepth = this.arrayDepth;
823
+ array.length = this.length;
824
+
825
+ return array;
826
+ }
827
+
828
+ equals(type: TypeExpression) {
829
+ if (type instanceof ArrayType) {
830
+ const arrayType: ArrayType = type;
831
+
832
+ return arrayType.type.equals(this.type) && type.arrayDepth === this.arrayDepth;
833
+ }
834
+
835
+ return false;
836
+ }
837
+
838
+ resolve(namespace: IntrospectedNamespace, options: OptionsBase): TypeExpression {
839
+ const { type, arrayDepth, length } = this;
840
+ return ArrayType.new({
841
+ type: type.resolve(namespace, options),
842
+ arrayDepth,
843
+ length,
844
+ });
845
+ }
846
+
847
+ print(namespace: IntrospectedNamespace, options: OptionsBase): string {
848
+ const depth = this.arrayDepth;
849
+ let typeSuffix: string = "";
850
+
851
+ if (depth === 0) {
852
+ typeSuffix = "";
853
+ } else if (depth === 1) {
854
+ typeSuffix = "[]";
855
+ } else {
856
+ typeSuffix = "".padStart(2 * depth, "[]");
857
+ }
858
+
859
+ return `${this.type.print(namespace, options)}${typeSuffix}`;
860
+ }
861
+
862
+ static new({
863
+ type,
864
+ arrayDepth = 1,
865
+ length = null,
866
+ }: {
867
+ type: TypeExpression;
868
+ length?: number | null;
869
+ arrayDepth?: number;
870
+ }) {
871
+ const vt = new ArrayType(type);
872
+ vt.length = length;
873
+ vt.arrayDepth = arrayDepth;
874
+ return vt;
875
+ }
876
+ }
877
+
878
+ // Common native types as constants
879
+ export const ThisType = new NativeType("this");
880
+ export const ObjectType = new NativeType("object");
881
+ export const AnyType = new NativeType("any");
882
+ export const NeverType = new NativeType("never");
883
+ export const Uint8ArrayType = new NativeType("Uint8Array");
884
+ export const BooleanType = new NativeType("boolean");
885
+ export const StringType = new NativeType("string");
886
+ export const NumberType = new NativeType("number");
887
+ export const NullType = new NativeType("null");
888
+ export const VoidType = new NativeType("void");
889
+ export const UnknownType = new NativeType("unknown");
890
+ export const AnyFunctionType = new NativeType("(...args: any[]) => any");
891
+
892
+ export type GirClassField = IntrospectedProperty | IntrospectedField;