@mionjs/run-types 0.8.7 → 0.8.10

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 (396) hide show
  1. package/.dist/cjs/index.d.ts +1 -0
  2. package/.dist/cjs/index.d.ts.map +1 -0
  3. package/.dist/cjs/src/constants.d.ts +1 -0
  4. package/.dist/cjs/src/constants.d.ts.map +1 -0
  5. package/.dist/cjs/src/constants.functions.d.ts +1 -0
  6. package/.dist/cjs/src/constants.functions.d.ts.map +1 -0
  7. package/.dist/cjs/src/constants.kind.d.ts +1 -0
  8. package/.dist/cjs/src/constants.kind.d.ts.map +1 -0
  9. package/.dist/cjs/src/createRunType.cjs +3 -1
  10. package/.dist/cjs/src/createRunType.cjs.map +1 -1
  11. package/.dist/cjs/src/createRunType.d.ts +1 -0
  12. package/.dist/cjs/src/createRunType.d.ts.map +1 -0
  13. package/.dist/cjs/src/createRunTypeFunctions.d.ts +1 -0
  14. package/.dist/cjs/src/createRunTypeFunctions.d.ts.map +1 -0
  15. package/.dist/cjs/src/formats.runtype.d.ts +1 -0
  16. package/.dist/cjs/src/formats.runtype.d.ts.map +1 -0
  17. package/.dist/cjs/src/jitCompilers/binary/binarySpec/binaryHelpers.d.ts +1 -0
  18. package/.dist/cjs/src/jitCompilers/binary/binarySpec/binaryHelpers.d.ts.map +1 -0
  19. package/.dist/cjs/src/jitCompilers/binary/fromBinary.cjs +1 -1
  20. package/.dist/cjs/src/jitCompilers/binary/fromBinary.cjs.map +1 -1
  21. package/.dist/cjs/src/jitCompilers/binary/fromBinary.d.ts +1 -0
  22. package/.dist/cjs/src/jitCompilers/binary/fromBinary.d.ts.map +1 -0
  23. package/.dist/cjs/src/jitCompilers/binary/toBinary.cjs +1 -1
  24. package/.dist/cjs/src/jitCompilers/binary/toBinary.cjs.map +1 -1
  25. package/.dist/cjs/src/jitCompilers/binary/toBinary.d.ts +1 -0
  26. package/.dist/cjs/src/jitCompilers/binary/toBinary.d.ts.map +1 -0
  27. package/.dist/cjs/src/jitCompilers/equalsHelpers.d.ts +1 -0
  28. package/.dist/cjs/src/jitCompilers/equalsHelpers.d.ts.map +1 -0
  29. package/.dist/cjs/src/jitCompilers/json/jsonSpec/jsonHelpers.d.ts +1 -0
  30. package/.dist/cjs/src/jitCompilers/json/jsonSpec/jsonHelpers.d.ts.map +1 -0
  31. package/.dist/cjs/src/jitCompilers/json/stringifyJson.cjs +1 -1
  32. package/.dist/cjs/src/jitCompilers/json/stringifyJson.cjs.map +1 -1
  33. package/.dist/cjs/src/jitCompilers/json/stringifyJson.d.ts +1 -0
  34. package/.dist/cjs/src/jitCompilers/json/stringifyJson.d.ts.map +1 -0
  35. package/.dist/cjs/src/jitCompilers/json/stringifySpec/stringifyHelpers.d.ts +1 -0
  36. package/.dist/cjs/src/jitCompilers/json/stringifySpec/stringifyHelpers.d.ts.map +1 -0
  37. package/.dist/cjs/src/jitCompilers/json/toJsCode.d.ts +1 -0
  38. package/.dist/cjs/src/jitCompilers/json/toJsCode.d.ts.map +1 -0
  39. package/.dist/cjs/src/lib/baseRunTypeFormat.d.ts +1 -0
  40. package/.dist/cjs/src/lib/baseRunTypeFormat.d.ts.map +1 -0
  41. package/.dist/cjs/src/lib/baseRunTypes.d.ts +1 -0
  42. package/.dist/cjs/src/lib/baseRunTypes.d.ts.map +1 -0
  43. package/.dist/cjs/src/lib/createJitFunction.d.ts +1 -0
  44. package/.dist/cjs/src/lib/createJitFunction.d.ts.map +1 -0
  45. package/.dist/cjs/src/lib/dkProxy.d.ts +1 -0
  46. package/.dist/cjs/src/lib/dkProxy.d.ts.map +1 -0
  47. package/.dist/cjs/src/lib/formats.d.ts +1 -0
  48. package/.dist/cjs/src/lib/formats.d.ts.map +1 -0
  49. package/.dist/cjs/src/lib/guards.d.ts +1 -0
  50. package/.dist/cjs/src/lib/guards.d.ts.map +1 -0
  51. package/.dist/cjs/src/lib/jitFnCompiler.d.ts +1 -0
  52. package/.dist/cjs/src/lib/jitFnCompiler.d.ts.map +1 -0
  53. package/.dist/cjs/src/lib/jitFnsRegistry.d.ts +1 -0
  54. package/.dist/cjs/src/lib/jitFnsRegistry.d.ts.map +1 -0
  55. package/.dist/cjs/src/lib/typeId.d.ts +1 -0
  56. package/.dist/cjs/src/lib/typeId.d.ts.map +1 -0
  57. package/.dist/cjs/src/lib/utils.d.ts +1 -0
  58. package/.dist/cjs/src/lib/utils.d.ts.map +1 -0
  59. package/.dist/cjs/src/mocking/constants.mock.d.ts +1 -0
  60. package/.dist/cjs/src/mocking/constants.mock.d.ts.map +1 -0
  61. package/.dist/cjs/src/mocking/mockRegistry.d.ts +1 -0
  62. package/.dist/cjs/src/mocking/mockRegistry.d.ts.map +1 -0
  63. package/.dist/cjs/src/mocking/mockType.cjs +46 -1
  64. package/.dist/cjs/src/mocking/mockType.cjs.map +1 -1
  65. package/.dist/cjs/src/mocking/mockType.d.ts +1 -0
  66. package/.dist/cjs/src/mocking/mockType.d.ts.map +1 -0
  67. package/.dist/cjs/src/mocking/mockUtils.d.ts +1 -0
  68. package/.dist/cjs/src/mocking/mockUtils.d.ts.map +1 -0
  69. package/.dist/cjs/src/nodes/atomic/any.d.ts +1 -0
  70. package/.dist/cjs/src/nodes/atomic/any.d.ts.map +1 -0
  71. package/.dist/cjs/src/nodes/atomic/bigInt.d.ts +1 -0
  72. package/.dist/cjs/src/nodes/atomic/bigInt.d.ts.map +1 -0
  73. package/.dist/cjs/src/nodes/atomic/boolean.d.ts +1 -0
  74. package/.dist/cjs/src/nodes/atomic/boolean.d.ts.map +1 -0
  75. package/.dist/cjs/src/nodes/atomic/date.d.ts +1 -0
  76. package/.dist/cjs/src/nodes/atomic/date.d.ts.map +1 -0
  77. package/.dist/cjs/src/nodes/atomic/enum.d.ts +1 -0
  78. package/.dist/cjs/src/nodes/atomic/enum.d.ts.map +1 -0
  79. package/.dist/cjs/src/nodes/atomic/enumMember.d.ts +1 -0
  80. package/.dist/cjs/src/nodes/atomic/enumMember.d.ts.map +1 -0
  81. package/.dist/cjs/src/nodes/atomic/literal.d.ts +1 -0
  82. package/.dist/cjs/src/nodes/atomic/literal.d.ts.map +1 -0
  83. package/.dist/cjs/src/nodes/atomic/never.d.ts +1 -0
  84. package/.dist/cjs/src/nodes/atomic/never.d.ts.map +1 -0
  85. package/.dist/cjs/src/nodes/atomic/null.d.ts +1 -0
  86. package/.dist/cjs/src/nodes/atomic/null.d.ts.map +1 -0
  87. package/.dist/cjs/src/nodes/atomic/number.d.ts +1 -0
  88. package/.dist/cjs/src/nodes/atomic/number.d.ts.map +1 -0
  89. package/.dist/cjs/src/nodes/atomic/object.d.ts +1 -0
  90. package/.dist/cjs/src/nodes/atomic/object.d.ts.map +1 -0
  91. package/.dist/cjs/src/nodes/atomic/regexp.d.ts +1 -0
  92. package/.dist/cjs/src/nodes/atomic/regexp.d.ts.map +1 -0
  93. package/.dist/cjs/src/nodes/atomic/string.d.ts +1 -0
  94. package/.dist/cjs/src/nodes/atomic/string.d.ts.map +1 -0
  95. package/.dist/cjs/src/nodes/atomic/symbol.d.ts +1 -0
  96. package/.dist/cjs/src/nodes/atomic/symbol.d.ts.map +1 -0
  97. package/.dist/cjs/src/nodes/atomic/undefined.d.ts +1 -0
  98. package/.dist/cjs/src/nodes/atomic/undefined.d.ts.map +1 -0
  99. package/.dist/cjs/src/nodes/atomic/unknown.d.ts +1 -0
  100. package/.dist/cjs/src/nodes/atomic/unknown.d.ts.map +1 -0
  101. package/.dist/cjs/src/nodes/atomic/void.d.ts +1 -0
  102. package/.dist/cjs/src/nodes/atomic/void.d.ts.map +1 -0
  103. package/.dist/cjs/src/nodes/collection/class.d.ts +1 -0
  104. package/.dist/cjs/src/nodes/collection/class.d.ts.map +1 -0
  105. package/.dist/cjs/src/nodes/collection/functionParams.d.ts +1 -0
  106. package/.dist/cjs/src/nodes/collection/functionParams.d.ts.map +1 -0
  107. package/.dist/cjs/src/nodes/collection/interface.d.ts +1 -0
  108. package/.dist/cjs/src/nodes/collection/interface.d.ts.map +1 -0
  109. package/.dist/cjs/src/nodes/collection/intersection.d.ts +1 -0
  110. package/.dist/cjs/src/nodes/collection/intersection.d.ts.map +1 -0
  111. package/.dist/cjs/src/nodes/collection/templateLiteral.cjs +73 -0
  112. package/.dist/cjs/src/nodes/collection/templateLiteral.cjs.map +1 -0
  113. package/.dist/cjs/src/nodes/collection/templateLiteral.d.ts +16 -0
  114. package/.dist/cjs/src/nodes/collection/templateLiteral.d.ts.map +1 -0
  115. package/.dist/cjs/src/nodes/collection/tuple.d.ts +1 -0
  116. package/.dist/cjs/src/nodes/collection/tuple.d.ts.map +1 -0
  117. package/.dist/cjs/src/nodes/collection/union.d.ts +1 -0
  118. package/.dist/cjs/src/nodes/collection/union.d.ts.map +1 -0
  119. package/.dist/cjs/src/nodes/collection/unionDiscriminator.d.ts +1 -0
  120. package/.dist/cjs/src/nodes/collection/unionDiscriminator.d.ts.map +1 -0
  121. package/.dist/cjs/src/nodes/function/function.d.ts +1 -0
  122. package/.dist/cjs/src/nodes/function/function.d.ts.map +1 -0
  123. package/.dist/cjs/src/nodes/member/array.d.ts +1 -0
  124. package/.dist/cjs/src/nodes/member/array.d.ts.map +1 -0
  125. package/.dist/cjs/src/nodes/member/callSignature.d.ts +1 -0
  126. package/.dist/cjs/src/nodes/member/callSignature.d.ts.map +1 -0
  127. package/.dist/cjs/src/nodes/member/genericMember.d.ts +1 -0
  128. package/.dist/cjs/src/nodes/member/genericMember.d.ts.map +1 -0
  129. package/.dist/cjs/src/nodes/member/indexProperty.cjs +69 -22
  130. package/.dist/cjs/src/nodes/member/indexProperty.cjs.map +1 -1
  131. package/.dist/cjs/src/nodes/member/indexProperty.d.ts +2 -0
  132. package/.dist/cjs/src/nodes/member/indexProperty.d.ts.map +1 -0
  133. package/.dist/cjs/src/nodes/member/method.d.ts +1 -0
  134. package/.dist/cjs/src/nodes/member/method.d.ts.map +1 -0
  135. package/.dist/cjs/src/nodes/member/methodSignature.d.ts +1 -0
  136. package/.dist/cjs/src/nodes/member/methodSignature.d.ts.map +1 -0
  137. package/.dist/cjs/src/nodes/member/param.d.ts +1 -0
  138. package/.dist/cjs/src/nodes/member/param.d.ts.map +1 -0
  139. package/.dist/cjs/src/nodes/member/property.d.ts +1 -0
  140. package/.dist/cjs/src/nodes/member/property.d.ts.map +1 -0
  141. package/.dist/cjs/src/nodes/member/restParams.d.ts +1 -0
  142. package/.dist/cjs/src/nodes/member/restParams.d.ts.map +1 -0
  143. package/.dist/cjs/src/nodes/member/tupleMember.d.ts +1 -0
  144. package/.dist/cjs/src/nodes/member/tupleMember.d.ts.map +1 -0
  145. package/.dist/cjs/src/nodes/native/Iterable.d.ts +1 -0
  146. package/.dist/cjs/src/nodes/native/Iterable.d.ts.map +1 -0
  147. package/.dist/cjs/src/nodes/native/map.d.ts +1 -0
  148. package/.dist/cjs/src/nodes/native/map.d.ts.map +1 -0
  149. package/.dist/cjs/src/nodes/native/nonSerializable.d.ts +1 -0
  150. package/.dist/cjs/src/nodes/native/nonSerializable.d.ts.map +1 -0
  151. package/.dist/cjs/src/nodes/native/promise.d.ts +1 -0
  152. package/.dist/cjs/src/nodes/native/promise.d.ts.map +1 -0
  153. package/.dist/cjs/src/nodes/native/set.d.ts +1 -0
  154. package/.dist/cjs/src/nodes/native/set.d.ts.map +1 -0
  155. package/.dist/cjs/src/run-types-pure-fns.d.ts +1 -0
  156. package/.dist/cjs/src/run-types-pure-fns.d.ts.map +1 -0
  157. package/.dist/cjs/src/types.d.ts +1 -0
  158. package/.dist/cjs/src/types.d.ts.map +1 -0
  159. package/.dist/esm/index.d.ts +1 -0
  160. package/.dist/esm/index.d.ts.map +1 -0
  161. package/.dist/esm/src/constants.d.ts +1 -0
  162. package/.dist/esm/src/constants.d.ts.map +1 -0
  163. package/.dist/esm/src/constants.functions.d.ts +1 -0
  164. package/.dist/esm/src/constants.functions.d.ts.map +1 -0
  165. package/.dist/esm/src/constants.kind.d.ts +1 -0
  166. package/.dist/esm/src/constants.kind.d.ts.map +1 -0
  167. package/.dist/esm/src/createRunType.d.ts +1 -0
  168. package/.dist/esm/src/createRunType.d.ts.map +1 -0
  169. package/.dist/esm/src/createRunType.js +3 -1
  170. package/.dist/esm/src/createRunType.js.map +1 -1
  171. package/.dist/esm/src/createRunTypeFunctions.d.ts +1 -0
  172. package/.dist/esm/src/createRunTypeFunctions.d.ts.map +1 -0
  173. package/.dist/esm/src/formats.runtype.d.ts +1 -0
  174. package/.dist/esm/src/formats.runtype.d.ts.map +1 -0
  175. package/.dist/esm/src/jitCompilers/binary/binarySpec/binaryHelpers.d.ts +1 -0
  176. package/.dist/esm/src/jitCompilers/binary/binarySpec/binaryHelpers.d.ts.map +1 -0
  177. package/.dist/esm/src/jitCompilers/binary/fromBinary.d.ts +1 -0
  178. package/.dist/esm/src/jitCompilers/binary/fromBinary.d.ts.map +1 -0
  179. package/.dist/esm/src/jitCompilers/binary/fromBinary.js +1 -1
  180. package/.dist/esm/src/jitCompilers/binary/fromBinary.js.map +1 -1
  181. package/.dist/esm/src/jitCompilers/binary/toBinary.d.ts +1 -0
  182. package/.dist/esm/src/jitCompilers/binary/toBinary.d.ts.map +1 -0
  183. package/.dist/esm/src/jitCompilers/binary/toBinary.js +1 -1
  184. package/.dist/esm/src/jitCompilers/binary/toBinary.js.map +1 -1
  185. package/.dist/esm/src/jitCompilers/equalsHelpers.d.ts +1 -0
  186. package/.dist/esm/src/jitCompilers/equalsHelpers.d.ts.map +1 -0
  187. package/.dist/esm/src/jitCompilers/json/jsonSpec/jsonHelpers.d.ts +1 -0
  188. package/.dist/esm/src/jitCompilers/json/jsonSpec/jsonHelpers.d.ts.map +1 -0
  189. package/.dist/esm/src/jitCompilers/json/stringifyJson.d.ts +1 -0
  190. package/.dist/esm/src/jitCompilers/json/stringifyJson.d.ts.map +1 -0
  191. package/.dist/esm/src/jitCompilers/json/stringifyJson.js +1 -1
  192. package/.dist/esm/src/jitCompilers/json/stringifyJson.js.map +1 -1
  193. package/.dist/esm/src/jitCompilers/json/stringifySpec/stringifyHelpers.d.ts +1 -0
  194. package/.dist/esm/src/jitCompilers/json/stringifySpec/stringifyHelpers.d.ts.map +1 -0
  195. package/.dist/esm/src/jitCompilers/json/toJsCode.d.ts +1 -0
  196. package/.dist/esm/src/jitCompilers/json/toJsCode.d.ts.map +1 -0
  197. package/.dist/esm/src/lib/baseRunTypeFormat.d.ts +1 -0
  198. package/.dist/esm/src/lib/baseRunTypeFormat.d.ts.map +1 -0
  199. package/.dist/esm/src/lib/baseRunTypes.d.ts +1 -0
  200. package/.dist/esm/src/lib/baseRunTypes.d.ts.map +1 -0
  201. package/.dist/esm/src/lib/createJitFunction.d.ts +1 -0
  202. package/.dist/esm/src/lib/createJitFunction.d.ts.map +1 -0
  203. package/.dist/esm/src/lib/dkProxy.d.ts +1 -0
  204. package/.dist/esm/src/lib/dkProxy.d.ts.map +1 -0
  205. package/.dist/esm/src/lib/formats.d.ts +1 -0
  206. package/.dist/esm/src/lib/formats.d.ts.map +1 -0
  207. package/.dist/esm/src/lib/guards.d.ts +1 -0
  208. package/.dist/esm/src/lib/guards.d.ts.map +1 -0
  209. package/.dist/esm/src/lib/jitFnCompiler.d.ts +1 -0
  210. package/.dist/esm/src/lib/jitFnCompiler.d.ts.map +1 -0
  211. package/.dist/esm/src/lib/jitFnsRegistry.d.ts +1 -0
  212. package/.dist/esm/src/lib/jitFnsRegistry.d.ts.map +1 -0
  213. package/.dist/esm/src/lib/typeId.d.ts +1 -0
  214. package/.dist/esm/src/lib/typeId.d.ts.map +1 -0
  215. package/.dist/esm/src/lib/utils.d.ts +1 -0
  216. package/.dist/esm/src/lib/utils.d.ts.map +1 -0
  217. package/.dist/esm/src/mocking/constants.mock.d.ts +1 -0
  218. package/.dist/esm/src/mocking/constants.mock.d.ts.map +1 -0
  219. package/.dist/esm/src/mocking/mockRegistry.d.ts +1 -0
  220. package/.dist/esm/src/mocking/mockRegistry.d.ts.map +1 -0
  221. package/.dist/esm/src/mocking/mockType.d.ts +1 -0
  222. package/.dist/esm/src/mocking/mockType.d.ts.map +1 -0
  223. package/.dist/esm/src/mocking/mockType.js +47 -2
  224. package/.dist/esm/src/mocking/mockType.js.map +1 -1
  225. package/.dist/esm/src/mocking/mockUtils.d.ts +1 -0
  226. package/.dist/esm/src/mocking/mockUtils.d.ts.map +1 -0
  227. package/.dist/esm/src/mocking/mockUtils.js +1 -1
  228. package/.dist/esm/src/nodes/atomic/any.d.ts +1 -0
  229. package/.dist/esm/src/nodes/atomic/any.d.ts.map +1 -0
  230. package/.dist/esm/src/nodes/atomic/bigInt.d.ts +1 -0
  231. package/.dist/esm/src/nodes/atomic/bigInt.d.ts.map +1 -0
  232. package/.dist/esm/src/nodes/atomic/boolean.d.ts +1 -0
  233. package/.dist/esm/src/nodes/atomic/boolean.d.ts.map +1 -0
  234. package/.dist/esm/src/nodes/atomic/date.d.ts +1 -0
  235. package/.dist/esm/src/nodes/atomic/date.d.ts.map +1 -0
  236. package/.dist/esm/src/nodes/atomic/enum.d.ts +1 -0
  237. package/.dist/esm/src/nodes/atomic/enum.d.ts.map +1 -0
  238. package/.dist/esm/src/nodes/atomic/enumMember.d.ts +1 -0
  239. package/.dist/esm/src/nodes/atomic/enumMember.d.ts.map +1 -0
  240. package/.dist/esm/src/nodes/atomic/literal.d.ts +1 -0
  241. package/.dist/esm/src/nodes/atomic/literal.d.ts.map +1 -0
  242. package/.dist/esm/src/nodes/atomic/never.d.ts +1 -0
  243. package/.dist/esm/src/nodes/atomic/never.d.ts.map +1 -0
  244. package/.dist/esm/src/nodes/atomic/null.d.ts +1 -0
  245. package/.dist/esm/src/nodes/atomic/null.d.ts.map +1 -0
  246. package/.dist/esm/src/nodes/atomic/number.d.ts +1 -0
  247. package/.dist/esm/src/nodes/atomic/number.d.ts.map +1 -0
  248. package/.dist/esm/src/nodes/atomic/object.d.ts +1 -0
  249. package/.dist/esm/src/nodes/atomic/object.d.ts.map +1 -0
  250. package/.dist/esm/src/nodes/atomic/regexp.d.ts +1 -0
  251. package/.dist/esm/src/nodes/atomic/regexp.d.ts.map +1 -0
  252. package/.dist/esm/src/nodes/atomic/string.d.ts +1 -0
  253. package/.dist/esm/src/nodes/atomic/string.d.ts.map +1 -0
  254. package/.dist/esm/src/nodes/atomic/symbol.d.ts +1 -0
  255. package/.dist/esm/src/nodes/atomic/symbol.d.ts.map +1 -0
  256. package/.dist/esm/src/nodes/atomic/undefined.d.ts +1 -0
  257. package/.dist/esm/src/nodes/atomic/undefined.d.ts.map +1 -0
  258. package/.dist/esm/src/nodes/atomic/unknown.d.ts +1 -0
  259. package/.dist/esm/src/nodes/atomic/unknown.d.ts.map +1 -0
  260. package/.dist/esm/src/nodes/atomic/void.d.ts +1 -0
  261. package/.dist/esm/src/nodes/atomic/void.d.ts.map +1 -0
  262. package/.dist/esm/src/nodes/collection/class.d.ts +1 -0
  263. package/.dist/esm/src/nodes/collection/class.d.ts.map +1 -0
  264. package/.dist/esm/src/nodes/collection/functionParams.d.ts +1 -0
  265. package/.dist/esm/src/nodes/collection/functionParams.d.ts.map +1 -0
  266. package/.dist/esm/src/nodes/collection/interface.d.ts +1 -0
  267. package/.dist/esm/src/nodes/collection/interface.d.ts.map +1 -0
  268. package/.dist/esm/src/nodes/collection/intersection.d.ts +1 -0
  269. package/.dist/esm/src/nodes/collection/intersection.d.ts.map +1 -0
  270. package/.dist/esm/src/nodes/collection/templateLiteral.d.ts +16 -0
  271. package/.dist/esm/src/nodes/collection/templateLiteral.d.ts.map +1 -0
  272. package/.dist/esm/src/nodes/collection/templateLiteral.js +73 -0
  273. package/.dist/esm/src/nodes/collection/templateLiteral.js.map +1 -0
  274. package/.dist/esm/src/nodes/collection/tuple.d.ts +1 -0
  275. package/.dist/esm/src/nodes/collection/tuple.d.ts.map +1 -0
  276. package/.dist/esm/src/nodes/collection/union.d.ts +1 -0
  277. package/.dist/esm/src/nodes/collection/union.d.ts.map +1 -0
  278. package/.dist/esm/src/nodes/collection/unionDiscriminator.d.ts +1 -0
  279. package/.dist/esm/src/nodes/collection/unionDiscriminator.d.ts.map +1 -0
  280. package/.dist/esm/src/nodes/function/function.d.ts +1 -0
  281. package/.dist/esm/src/nodes/function/function.d.ts.map +1 -0
  282. package/.dist/esm/src/nodes/member/array.d.ts +1 -0
  283. package/.dist/esm/src/nodes/member/array.d.ts.map +1 -0
  284. package/.dist/esm/src/nodes/member/callSignature.d.ts +1 -0
  285. package/.dist/esm/src/nodes/member/callSignature.d.ts.map +1 -0
  286. package/.dist/esm/src/nodes/member/genericMember.d.ts +1 -0
  287. package/.dist/esm/src/nodes/member/genericMember.d.ts.map +1 -0
  288. package/.dist/esm/src/nodes/member/indexProperty.d.ts +2 -0
  289. package/.dist/esm/src/nodes/member/indexProperty.d.ts.map +1 -0
  290. package/.dist/esm/src/nodes/member/indexProperty.js +70 -23
  291. package/.dist/esm/src/nodes/member/indexProperty.js.map +1 -1
  292. package/.dist/esm/src/nodes/member/method.d.ts +1 -0
  293. package/.dist/esm/src/nodes/member/method.d.ts.map +1 -0
  294. package/.dist/esm/src/nodes/member/methodSignature.d.ts +1 -0
  295. package/.dist/esm/src/nodes/member/methodSignature.d.ts.map +1 -0
  296. package/.dist/esm/src/nodes/member/param.d.ts +1 -0
  297. package/.dist/esm/src/nodes/member/param.d.ts.map +1 -0
  298. package/.dist/esm/src/nodes/member/property.d.ts +1 -0
  299. package/.dist/esm/src/nodes/member/property.d.ts.map +1 -0
  300. package/.dist/esm/src/nodes/member/restParams.d.ts +1 -0
  301. package/.dist/esm/src/nodes/member/restParams.d.ts.map +1 -0
  302. package/.dist/esm/src/nodes/member/tupleMember.d.ts +1 -0
  303. package/.dist/esm/src/nodes/member/tupleMember.d.ts.map +1 -0
  304. package/.dist/esm/src/nodes/native/Iterable.d.ts +1 -0
  305. package/.dist/esm/src/nodes/native/Iterable.d.ts.map +1 -0
  306. package/.dist/esm/src/nodes/native/map.d.ts +1 -0
  307. package/.dist/esm/src/nodes/native/map.d.ts.map +1 -0
  308. package/.dist/esm/src/nodes/native/nonSerializable.d.ts +1 -0
  309. package/.dist/esm/src/nodes/native/nonSerializable.d.ts.map +1 -0
  310. package/.dist/esm/src/nodes/native/promise.d.ts +1 -0
  311. package/.dist/esm/src/nodes/native/promise.d.ts.map +1 -0
  312. package/.dist/esm/src/nodes/native/set.d.ts +1 -0
  313. package/.dist/esm/src/nodes/native/set.d.ts.map +1 -0
  314. package/.dist/esm/src/run-types-pure-fns.d.ts +1 -0
  315. package/.dist/esm/src/run-types-pure-fns.d.ts.map +1 -0
  316. package/.dist/esm/src/types.d.ts +1 -0
  317. package/.dist/esm/src/types.d.ts.map +1 -0
  318. package/index.ts +70 -0
  319. package/package.json +8 -4
  320. package/src/constants.functions.ts +196 -0
  321. package/src/constants.kind.ts +76 -0
  322. package/src/constants.ts +85 -0
  323. package/src/createRunType.ts +322 -0
  324. package/src/createRunTypeFunctions.ts +93 -0
  325. package/src/formats.runtype.ts +35 -0
  326. package/src/jitCompilers/binary/binarySPEC.md +138 -0
  327. package/src/jitCompilers/binary/binarySpec/binaryHelpers.ts +118 -0
  328. package/src/jitCompilers/binary/fromBinary.ts +493 -0
  329. package/src/jitCompilers/binary/toBinary.ts +436 -0
  330. package/src/jitCompilers/equalsHelpers.ts +62 -0
  331. package/src/jitCompilers/json/jsonSpec/jsonHelpers.ts +64 -0
  332. package/src/jitCompilers/json/stringifyJson.ts +476 -0
  333. package/src/jitCompilers/json/stringifySpec/stringifyHelpers.ts +59 -0
  334. package/src/jitCompilers/json/toJsCode.ts +182 -0
  335. package/src/jitCompilers/serialization-suite.ts +1689 -0
  336. package/src/jitCompilers/xyz-Template/fromXYZ.ts +212 -0
  337. package/src/jitCompilers/xyz-Template/toXYZ.ts +217 -0
  338. package/src/jitCompilers/xyz-Template/xyzReadme.md +6 -0
  339. package/src/jitCompilers/xyz-Template/xyzSpec/xyzHelpers.ts +66 -0
  340. package/src/lib/baseRunTypeFormat.ts +320 -0
  341. package/src/lib/baseRunTypes.ts +367 -0
  342. package/src/lib/createJitFunction.ts +87 -0
  343. package/src/lib/dkProxy.ts +47 -0
  344. package/src/lib/formats.ts +144 -0
  345. package/src/lib/guards.ts +290 -0
  346. package/src/lib/jitFnCompiler.ts +783 -0
  347. package/src/lib/jitFnsRegistry.ts +53 -0
  348. package/src/lib/typeId.ts +225 -0
  349. package/src/lib/utils.ts +402 -0
  350. package/src/mocking/constants.mock.ts +87 -0
  351. package/src/mocking/mockRegistry.ts +20 -0
  352. package/src/mocking/mockType.ts +409 -0
  353. package/src/mocking/mockUtils.ts +82 -0
  354. package/src/nodes/atomic/any.ts +22 -0
  355. package/src/nodes/atomic/bigInt.ts +26 -0
  356. package/src/nodes/atomic/boolean.ts +26 -0
  357. package/src/nodes/atomic/date.ts +26 -0
  358. package/src/nodes/atomic/enum.ts +23 -0
  359. package/src/nodes/atomic/enumMember.ts +29 -0
  360. package/src/nodes/atomic/literal.ts +125 -0
  361. package/src/nodes/atomic/never.ts +26 -0
  362. package/src/nodes/atomic/null.ts +26 -0
  363. package/src/nodes/atomic/number.ts +26 -0
  364. package/src/nodes/atomic/object.ts +20 -0
  365. package/src/nodes/atomic/regexp.ts +29 -0
  366. package/src/nodes/atomic/string.ts +20 -0
  367. package/src/nodes/atomic/symbol.ts +31 -0
  368. package/src/nodes/atomic/undefined.ts +23 -0
  369. package/src/nodes/atomic/unknown.ts +10 -0
  370. package/src/nodes/atomic/void.ts +26 -0
  371. package/src/nodes/collection/class.ts +36 -0
  372. package/src/nodes/collection/functionParams.ts +42 -0
  373. package/src/nodes/collection/interface.ts +300 -0
  374. package/src/nodes/collection/intersection.ts +30 -0
  375. package/src/nodes/collection/templateLiteral.ts +87 -0
  376. package/src/nodes/collection/tuple.ts +80 -0
  377. package/src/nodes/collection/union.ts +205 -0
  378. package/src/nodes/collection/unionDiscriminator.ts +259 -0
  379. package/src/nodes/function/function.ts +166 -0
  380. package/src/nodes/member/array.ts +150 -0
  381. package/src/nodes/member/callSignature.ts +34 -0
  382. package/src/nodes/member/genericMember.ts +63 -0
  383. package/src/nodes/member/indexProperty.ts +174 -0
  384. package/src/nodes/member/method.ts +30 -0
  385. package/src/nodes/member/methodSignature.ts +31 -0
  386. package/src/nodes/member/param.ts +22 -0
  387. package/src/nodes/member/property.ts +75 -0
  388. package/src/nodes/member/restParams.ts +22 -0
  389. package/src/nodes/member/tupleMember.ts +93 -0
  390. package/src/nodes/native/Iterable.ts +153 -0
  391. package/src/nodes/native/map.ts +91 -0
  392. package/src/nodes/native/nonSerializable.ts +42 -0
  393. package/src/nodes/native/promise.ts +43 -0
  394. package/src/nodes/native/set.ts +56 -0
  395. package/src/run-types-pure-fns.ts +116 -0
  396. package/src/types.ts +206 -0
@@ -0,0 +1,205 @@
1
+ /* ########
2
+ * 2024 mion
3
+ * Author: Ma-jerez
4
+ * License: MIT
5
+ * The software is provided "as is", without warranty of any kind.
6
+ * ######## */
7
+
8
+ import {ReflectionKind, type TypeUnion} from '@deepkit/type';
9
+ import type {JitFnCompiler, JitErrorsFnCompiler} from '../../lib/jitFnCompiler.ts';
10
+ import type {JitCode} from '../../types.ts';
11
+ import {BaseRunType, CollectionRunType} from '../../lib/baseRunTypes.ts';
12
+ import {childIsExpression, createIfElseFn, toLiteral} from '../../lib/utils.ts';
13
+ import {isClassRunType, isInterfaceRunType, isIntersectionRunType, isObjectLiteralRunType} from '../../lib/guards.ts';
14
+ import {markDiscriminators, splitUnionItems, SplitUnionResult} from './unionDiscriminator.ts';
15
+ import type {PropertyRunType} from '../member/property.ts';
16
+
17
+ /**
18
+ * Unions get encoded into an array where arr[0] is the discriminator and arr[1] is the value.
19
+ * this is because some times we can't distinguish the type of an union.
20
+ * ie: bigint gets encoded into an string, so if we have an union 'type U = string | bigint' we can't distinguish between the when encoding/decoding the json.
21
+ * to solve this issue the index of the type is used as a discriminator.
22
+ * So [0, "123n"] is interpreted as a string and [1, "123n"] is interpreted as a bigint.
23
+ * */
24
+ export class UnionRunType extends CollectionRunType<TypeUnion> {
25
+ hasDiscriminators: boolean | undefined = undefined;
26
+ hasObjectTypes: boolean | undefined = undefined;
27
+
28
+ isTypeWithProperties(rt: BaseRunType) {
29
+ return (
30
+ rt.getFamily() === 'C' &&
31
+ (isInterfaceRunType(rt) || isClassRunType(rt) || isObjectLiteralRunType(rt) || isIntersectionRunType(rt))
32
+ );
33
+ }
34
+
35
+ getUnionChildren(comp: JitFnCompiler): SplitUnionResult {
36
+ const children = this.getJitChildren(comp);
37
+ markDiscriminators(comp, this, children);
38
+ return splitUnionItems(comp, this, children);
39
+ }
40
+
41
+ getUnionItemIndex(comp: JitFnCompiler, unionItem: BaseRunType): number {
42
+ const children = this.getJitChildren(comp);
43
+ const index = children.findIndex((child) => child === unionItem);
44
+ if (index === -1) throw new Error(`Item ${unionItem.getTypeName()} not found in union ${this.getTypeName()}`);
45
+ return index;
46
+ }
47
+
48
+ /**
49
+ * Returns isType check for a union child with loose matching.
50
+ * Uses first-match strategy: returns first matching type in declaration order.
51
+ * For all-optional types (weak types), ensures at least one property matches or is empty object.
52
+ * Note: Use ESLint rules @mionjs/no-unreachable-union-types and @mionjs/no-mixed-union-properties
53
+ * to detect overlapping union types at compile time.
54
+ * @see union.spec.ts 'Union Obj' and 'Union Mixed' test suites for examples.
55
+ */
56
+ getChildIsTypeWithLooseCheck(rt: BaseRunType, comp: JitFnCompiler): string {
57
+ const isTypeCode = comp.compileIsType(rt, 'E').code || '';
58
+ const isTypeWithProperties =
59
+ isInterfaceRunType(rt) || isClassRunType(rt) || isObjectLiteralRunType(rt) || isIntersectionRunType(rt);
60
+ if (!isTypeWithProperties || rt.getFamily() !== 'C') return isTypeCode;
61
+ const props = rt.getJitChildren(comp);
62
+ const hasIndexProperty = props.some((prop) => prop.src.kind === ReflectionKind.indexSignature);
63
+ if (hasIndexProperty) return isTypeCode;
64
+ const isAllOptional = rt.areAllChildrenOptional(props);
65
+ // For all-optional types (weak types), TypeScript requires at least one matching property
66
+ // or an empty object. This prevents {c: 'hello'} from matching {a?: string; b?: string}
67
+ if (isAllOptional && props.length > 0) {
68
+ // Must have at least one of this type's own props OR be empty
69
+ const hasOwnPropCheck = props.map((p) => {
70
+ const name = (p as PropertyRunType).getPropertyName();
71
+ return `(${toLiteral(name)} in ${comp.vλl})`;
72
+ });
73
+ hasOwnPropCheck.push(`Object.keys(${comp.vλl}).length === 0`);
74
+ const weakTypeCheck = `(${hasOwnPropCheck.join(' || ')})`;
75
+ return `(${isTypeCode} && ${weakTypeCheck})`;
76
+ }
77
+ return isTypeCode;
78
+ }
79
+
80
+ /**
81
+ * Loose union matching: returns first matching type in declaration order.
82
+ * Objects with properties from multiple union types will match the first compatible type.
83
+ * Use ESLint rules to detect overlapping types at compile time.
84
+ */
85
+ emitIsType(comp: JitFnCompiler): JitCode {
86
+ this.checkAllowedChildren(comp);
87
+ const {simpleItems, objectTypes, anyItem} = this.getUnionChildren(comp);
88
+ // Simple items (atomic types) don't need null guard
89
+ const simpleChecks = simpleItems.map((rt) => this.getChildIsTypeWithLooseCheck(rt, comp)).filter(Boolean);
90
+ // Object types need null guard to prevent accessing properties on null
91
+ const objChecks = objectTypes.map((rt) => this.getChildIsTypeWithLooseCheck(rt, comp)).filter(Boolean);
92
+ const objCode = objChecks.length
93
+ ? `(typeof ${comp.vλl} === 'object' && ${comp.vλl} !== null && (${objChecks.join(' || ')}))`
94
+ : '';
95
+ // any/unknown checked last as fallback
96
+ const anyCheck = anyItem ? this.getChildIsTypeWithLooseCheck(anyItem, comp) : '';
97
+ const allChecks = [...simpleChecks, objCode, anyCheck].filter(Boolean);
98
+ return {code: `(${allChecks.join(' || ')})`, type: 'E'};
99
+ }
100
+
101
+ emitTypeErrors(comp: JitErrorsFnCompiler): JitCode {
102
+ this.checkAllowedChildren(comp);
103
+ const isType = comp.compileIsType(this, 'E').code;
104
+ const code = `if (!${isType}) ${comp.callJitErr(this)};`;
105
+ return {code, type: 'S'};
106
+ }
107
+
108
+ /**
109
+ * When a union is encodes to json is encode into and array with two elements: [unionDiscriminator, encoded Value]
110
+ * the first element is the index of the type in the union.
111
+ * the second element is the encoded value of the type.
112
+ * ie: type union = string | number | bigint; var v1: union = 123n; v1 is encoded as [2, "123n"]
113
+ */
114
+ emitPrepareForJson(comp: JitFnCompiler): JitCode {
115
+ this.checkAllowedChildren(comp);
116
+ const {simpleItems, objectTypes, anyItem} = this.getUnionChildren(comp);
117
+ const errName = comp.getLocalVarName('uErr', this);
118
+ const fail = `throw new Error(${errName});`;
119
+ comp.setContextItem(errName, `const ${errName} = "Can not json encode union: item does not belong to the union"`);
120
+
121
+ const ifElse = createIfElseFn();
122
+
123
+ // Helper to generate encode code for a union item
124
+ const getEncodeCode = (childRt: BaseRunType) => {
125
+ const toJit = comp.compilePrepareForJson(childRt, 'S');
126
+ const fromJit = comp.compileRestoreFromJson(childRt, 'S');
127
+ const needsTupleEncoding = !!toJit.code || !!fromJit.code;
128
+ const isExpression = childIsExpression(toJit, childRt);
129
+ const encodeCode = isExpression && toJit.code ? `${comp.vλl} = ${toJit.code};` : toJit.code || '';
130
+ const index = this.getUnionItemIndex(comp, childRt);
131
+ const tupleEncode = needsTupleEncoding ? `${comp.vλl} = [${index}, ${comp.vλl}]` : '/*noop*/';
132
+ return `${encodeCode} ${tupleEncode}`;
133
+ };
134
+
135
+ // Generate code for simple items (atomic types)
136
+ const simpleCode = simpleItems.map((rt) => {
137
+ const isTypeCode = this.getChildIsTypeWithLooseCheck(rt, comp);
138
+ return `${ifElse()} (${isTypeCode}) {${getEncodeCode(rt)}}`;
139
+ });
140
+
141
+ // Generate code for object types (need null guard)
142
+ const objCode = objectTypes.length
143
+ ? objectTypes.map((rt) => {
144
+ const isTypeCode = this.getChildIsTypeWithLooseCheck(rt, comp);
145
+ return `${ifElse()} (typeof ${comp.vλl} === 'object' && ${comp.vλl} !== null && ${isTypeCode}) {${getEncodeCode(rt)}}`;
146
+ })
147
+ : [];
148
+
149
+ // Generate code for anyItem (always matches, checked last as fallback)
150
+ const anyCode = anyItem ? `${ifElse(true)} {${getEncodeCode(anyItem)}}` : `${ifElse(true)} {${fail}}`;
151
+
152
+ return {code: [...simpleCode, ...objCode, anyCode].join(''), type: 'S'};
153
+ }
154
+
155
+ /**
156
+ * When a union is decoded from json it expects de two elements array format: [unionDiscriminator, Value to decode]
157
+ * the first element is the index of the type in the union.
158
+ * the second element is the encoded value of the type.
159
+ * ie: type union = string | number | bigint; var v1: union = 123n; v1 is encoded as [2, "123n"]
160
+ */
161
+ emitRestoreFromJson(comp: JitFnCompiler): JitCode {
162
+ this.checkAllowedChildren(comp);
163
+ const decVar = comp.getLocalVarName('dec', this);
164
+ const errVarName = comp.getLocalVarName('uErr', this);
165
+ comp.setContextItem(errVarName, `const ${errVarName} = "Can not json decode union: invalid union index"`);
166
+ const children = this.getJitChildren(comp);
167
+ const ifElse = createIfElseFn();
168
+ const itemsCode = children
169
+ .map((unionItem) => {
170
+ const childJit = comp.compileRestoreFromJson(unionItem, 'S');
171
+ const isExpression = childIsExpression(childJit, unionItem);
172
+ const code =
173
+ isExpression && childJit.code && childJit.code !== comp.vλl
174
+ ? `${comp.vλl} = ${childJit.code}`
175
+ : childJit.code || '';
176
+ // item is decoded before being extracted from the array
177
+ const index = this.getUnionItemIndex(comp, unionItem);
178
+ return `${ifElse()} (${decVar} === ${index}) {${code || '/*noop*/'}}`;
179
+ })
180
+ .filter(Boolean);
181
+ const childrenCode = itemsCode.join('');
182
+ const failCode = childrenCode ? `else {throw new Error(${errVarName})}` : '';
183
+ const code = `
184
+ if (${comp.vλl}?.length === 2 && Array.isArray(${comp.vλl}) && typeof ${comp.vλl}[0] === 'number') {
185
+ const ${decVar} = ${comp.vλl}[0]; ${comp.vλl} = ${comp.vλl}[1];
186
+ ${childrenCode}
187
+ ${failCode}
188
+ }
189
+ `;
190
+ return {code, type: 'S'};
191
+ }
192
+
193
+ getUnionTypeNames(): string {
194
+ return this.getChildRunTypes()
195
+ .map((rt) => rt.getTypeName())
196
+ .join(' | ');
197
+ }
198
+
199
+ checkAllowedChildren(comp: JitFnCompiler) {
200
+ const allChildren = this.getChildRunTypes();
201
+ const toSkip = allChildren.filter((rt) => rt.skipJit(comp));
202
+ if (toSkip.length)
203
+ throw new Error(`Union can not have non serializable types, ie: Symbol, Function, etc. \nType: ${this.stringify()}`);
204
+ }
205
+ }
@@ -0,0 +1,259 @@
1
+ import type {BaseRunType, CollectionRunType, MemberRunType} from '../../lib/baseRunTypes.ts';
2
+ import type {JitFnCompiler} from '../../lib/jitFnCompiler.ts';
3
+ import type {UnionRunType} from './union.ts';
4
+ import type {PropertyRunType} from '../member/property.ts';
5
+ import {getTotalComplexity, sortRunTypeByComplexity} from '../../lib/utils.ts';
6
+ import {isAnyRunType, isUnknownRunType} from '../../lib/guards.ts';
7
+
8
+ export type FlattenedProp = {
9
+ /** union item, parent of the property */
10
+ unionItem: CollectionRunType<any>;
11
+ /** index of the union item in the union */
12
+ unionIndex: string | number;
13
+ /** one property of the union item */
14
+ prop: PropertyRunType;
15
+ /** typeID of the property */
16
+ typeID: string | number;
17
+ /** name of the property as it should be used in the code */
18
+ compiledName: string;
19
+ };
20
+
21
+ export type SplitUnionResult = {
22
+ simpleItems: BaseRunType[];
23
+ objectTypes: CollectionRunType<any>[];
24
+ /** any or unknown type if present in the union, should be checked last */
25
+ anyItem?: BaseRunType;
26
+ };
27
+
28
+ /**
29
+ * Split the union types in two groups: interface types and simple types
30
+ * interface types are types that have properties, simple types are the rest (atomic types, tuples, etc)
31
+ * If any or unknown types are present, they are extracted and returned separately as anyItem
32
+ * so they can be checked last (any/unknown would match anything, so must be last resort)
33
+ */
34
+ export function splitUnionItems(comp: JitFnCompiler, urt: UnionRunType, unionChildren?: BaseRunType[]): SplitUnionResult {
35
+ const unionItems = unionChildren || urt.getJitChildren(comp);
36
+ const objectTypes: CollectionRunType<any>[] = [];
37
+ const simpleItems: BaseRunType[] = [];
38
+ let anyItem: BaseRunType | undefined;
39
+
40
+ unionItems.forEach((unionItem) => {
41
+ // Extract any/unknown types to be checked last
42
+ if (isAnyRunType(unionItem) || isUnknownRunType(unionItem)) {
43
+ // Only keep the first any/unknown type (having multiple is redundant)
44
+ if (!anyItem) anyItem = unionItem;
45
+ return;
46
+ }
47
+ const isObj = urt.isTypeWithProperties(unionItem);
48
+ if (!isObj) return simpleItems.push(unionItem);
49
+ return objectTypes.push(unionItem as CollectionRunType<any>);
50
+ });
51
+
52
+ // Sort object types to prevent unreachable types (objects with more props should come first when they share same prop types)
53
+ const sortedObjectTypes = sortUnreachableTypes(comp, objectTypes);
54
+
55
+ return {simpleItems, objectTypes: sortedObjectTypes, anyItem};
56
+ }
57
+
58
+ /**
59
+ * Sorts object types to prevent unreachable union types.
60
+ * When two objects share the same properties (by typeID), the one with more properties must come first.
61
+ * This ensures that at runtime, the more specific type is checked before the less specific one.
62
+ * Objects that don't share properties with others maintain their relative order.
63
+ */
64
+ export function sortUnreachableTypes(comp: JitFnCompiler, objectTypes: CollectionRunType<any>[]): CollectionRunType<any>[] {
65
+ if (objectTypes.length <= 1) return objectTypes;
66
+
67
+ // Get property typeIDs for each object type
68
+ const typePropsMap = new Map<CollectionRunType<any>, Set<string | number>>();
69
+ objectTypes.forEach((objType) => {
70
+ const props = objType.getJitChildren(comp) as PropertyRunType[];
71
+ const propTypeIDs = new Set<string | number>();
72
+ props.forEach((prop) => propTypeIDs.add(prop.getTypeID()));
73
+ typePropsMap.set(objType, propTypeIDs);
74
+ });
75
+
76
+ // Check if one object's props are a subset of another's (all props have same typeIDs)
77
+ const isSubsetOf = (smaller: CollectionRunType<any>, larger: CollectionRunType<any>): boolean => {
78
+ const smallerProps = typePropsMap.get(smaller)!;
79
+ const largerProps = typePropsMap.get(larger)!;
80
+ if (smallerProps.size >= largerProps.size) return false;
81
+ for (const typeID of smallerProps) {
82
+ if (!largerProps.has(typeID)) return false;
83
+ }
84
+ return true;
85
+ };
86
+
87
+ // Find groups of objects that share properties (one is subset of another)
88
+ const processed = new Set<CollectionRunType<any>>();
89
+ const result: CollectionRunType<any>[] = [];
90
+
91
+ for (let i = 0; i < objectTypes.length; i++) {
92
+ const current = objectTypes[i];
93
+ if (processed.has(current)) continue;
94
+
95
+ // Find all objects that are related (subset/superset) to current
96
+ const relatedGroup: CollectionRunType<any>[] = [current];
97
+ processed.add(current);
98
+
99
+ for (let j = 0; j < objectTypes.length; j++) {
100
+ if (i === j) continue;
101
+ const other = objectTypes[j];
102
+ if (processed.has(other)) continue;
103
+
104
+ // Check if current and other are related (one is subset of the other)
105
+ if (isSubsetOf(current, other) || isSubsetOf(other, current)) {
106
+ relatedGroup.push(other);
107
+ processed.add(other);
108
+ }
109
+ }
110
+
111
+ // Sort related group by number of properties (more props first)
112
+ if (relatedGroup.length > 1) {
113
+ relatedGroup.sort((a, b) => {
114
+ const aSize = typePropsMap.get(a)!.size;
115
+ const bSize = typePropsMap.get(b)!.size;
116
+ return bSize - aSize; // descending order (more props first)
117
+ });
118
+ }
119
+
120
+ result.push(...relatedGroup);
121
+ }
122
+
123
+ return result;
124
+ }
125
+
126
+ /**
127
+ * Mark discriminator properties so they can be sorted and validate union more efficiently.
128
+ * @param comp
129
+ * @param urt
130
+ */
131
+ export function markDiscriminators(comp: JitFnCompiler, urt: UnionRunType, unionItems: BaseRunType[]) {
132
+ if (urt.hasDiscriminators !== undefined && urt.hasObjectTypes !== undefined) return;
133
+ const objectTypes = unionItems.filter((item) => urt.isTypeWithProperties(item)) as CollectionRunType<any>[];
134
+ const namedDiscriminators = getDiscriminatorProperties(comp, urt, objectTypes, initGetCompiledName());
135
+ const uniqueDiscriminators = getUniqueDiscriminatorProperties(comp, urt, objectTypes, initGetCompiledName());
136
+ urt.hasObjectTypes = !!objectTypes.length;
137
+ urt.hasDiscriminators = !!namedDiscriminators.length || !!uniqueDiscriminators.length;
138
+ }
139
+
140
+ type PropUnionItemPair = {prop: PropertyRunType; unionItem: CollectionRunType<any>};
141
+
142
+ /**
143
+ * Find a property with the same name in all the types of the union and that has different types.
144
+ * It also marks those properties as discriminator properties so can be sorted later
145
+ */
146
+ function getDiscriminatorProperties(
147
+ comp: JitFnCompiler,
148
+ urt: UnionRunType,
149
+ unionTypes: CollectionRunType<any>[],
150
+ getCompiledName: (comp: JitFnCompiler, urt: UnionRunType, propTypeID: string | number) => string
151
+ ): FlattenedProp[] {
152
+ if (!unionTypes.length) return [];
153
+ const propByName = new Map<string | number, PropUnionItemPair[]>();
154
+ unionTypes.forEach((unionItem) => {
155
+ const props = unionItem.getJitChildren(comp) as PropertyRunType[];
156
+ props.forEach((prop) => {
157
+ const name = prop.getChildVarName(comp);
158
+ const existing = propByName.get(name) || [];
159
+ // index no needed now
160
+ propByName.set(name, [...existing, {prop, unionItem}]);
161
+ });
162
+ });
163
+ const propsOnAllTypes = Array.from(propByName.entries())
164
+ // filter all properties that are in all types
165
+ .filter(([, props]) => props.length === unionTypes.length)
166
+ // calculate complexity and check if all types are different in all props
167
+ .map(([key, props]) => ({
168
+ name: key,
169
+ props,
170
+ complexity: props.reduce((acc, item) => acc + getTotalComplexity(comp, item.prop), 0),
171
+ isUniqueType: props.every((item) => {
172
+ const child = item;
173
+ const typeID = child.prop.getTypeID();
174
+ const isDiff = props.every((otherItem) => child.prop === otherItem.prop || otherItem.prop.getTypeID() !== typeID);
175
+ return isDiff;
176
+ }),
177
+ }))
178
+ .filter((item) => item.isUniqueType);
179
+ const lessComplexProps = propsOnAllTypes.toSorted((a, b) => a.complexity - b.complexity);
180
+ const lessComplex = lessComplexProps[0];
181
+ if (!lessComplex) return [];
182
+ // we need to marks the property as discriminator so they can be sorted and checked first later
183
+ return lessComplex.props.map((item) => {
184
+ item.prop.isUnionDiscriminator = true;
185
+ const unionIndex = urt.getUnionItemIndex(comp, item.unionItem);
186
+ const typeID = item.prop.getTypeID();
187
+ return {
188
+ unionItem: item.unionItem,
189
+ unionIndex,
190
+ prop: item.prop,
191
+ typeID,
192
+ compiledName: getCompiledName(comp, urt, typeID),
193
+ };
194
+ });
195
+ }
196
+
197
+ /**
198
+ * Get unique properties in the union as discriminators.
199
+ * These properties can be of different name but are unique in the union so can act as discriminators.
200
+ * It also marks those properties as discriminator properties so can be sorted later.
201
+ * */
202
+ function getUniqueDiscriminatorProperties(
203
+ comp: JitFnCompiler,
204
+ urt: UnionRunType,
205
+ unionTypes: CollectionRunType<any>[],
206
+ getCompiledName: (comp: JitFnCompiler, urt: UnionRunType, propTypeID: string | number) => string
207
+ ): FlattenedProp[] {
208
+ if (!unionTypes.length) return [];
209
+ const uniquePropByUnionItem = new Map<CollectionRunType<any>, PropUnionItemPair>();
210
+ unionTypes.forEach((unionItem) => {
211
+ const props = unionItem.getJitChildren(comp) as PropertyRunType[];
212
+ props.forEach((prop) => {
213
+ const typeID = prop.getTypeID();
214
+ const isUnique = unionTypes.every((otherUnionItem) => {
215
+ if (otherUnionItem === unionItem) return true;
216
+ const otherProps = otherUnionItem.getJitChildren(comp) as MemberRunType<any>[];
217
+ return otherProps.every((otherProp) => otherProp.getTypeID() !== typeID);
218
+ });
219
+ if (isUnique) {
220
+ const existing = uniquePropByUnionItem.get(unionItem);
221
+ if (!existing) {
222
+ uniquePropByUnionItem.set(unionItem, {
223
+ prop,
224
+ unionItem,
225
+ });
226
+ return;
227
+ }
228
+ const newItem = {prop, unionItem};
229
+ const lessComplex = [newItem, existing].toSorted((a, b) => sortRunTypeByComplexity(comp, a.prop, b.prop))[0];
230
+ uniquePropByUnionItem.set(unionItem, lessComplex);
231
+ }
232
+ });
233
+ });
234
+ if (!uniquePropByUnionItem.size) return [];
235
+ const uniqueProps = Array.from(uniquePropByUnionItem.values());
236
+ return uniqueProps.map((item) => {
237
+ item.prop.isUnionDiscriminator = true;
238
+ const unionIndex = urt.getUnionItemIndex(comp, item.unionItem);
239
+ const typeID = item.prop.getTypeID();
240
+ return {
241
+ unionItem: item.unionItem,
242
+ unionIndex,
243
+ prop: item.prop,
244
+ typeID,
245
+ compiledName: getCompiledName(comp, urt, typeID),
246
+ };
247
+ });
248
+ }
249
+
250
+ function initGetCompiledName() {
251
+ const typeIDs = new Map<string | number, number>();
252
+ return function getCompiledName(comp: JitFnCompiler, urt: UnionRunType, typeID: string | number): string {
253
+ const existingIndex = typeIDs.get(typeID);
254
+ if (existingIndex) return comp.getLocalVarName('prop', urt) + `_${existingIndex}`;
255
+ const newIndex = typeIDs.size;
256
+ typeIDs.set(typeID, newIndex);
257
+ return comp.getLocalVarName('prop', urt) + `_${newIndex}`;
258
+ };
259
+ }
@@ -0,0 +1,166 @@
1
+ /* ########
2
+ * 2024 mion
3
+ * Author: Ma-jerez
4
+ * License: MIT
5
+ * The software is provided "as is", without warranty of any kind.
6
+ * ######## */
7
+ import type {AnyFunction, SrcType, JitFn, JitCode, RunTypeOptions} from '../../types.ts';
8
+ import {ReflectionKind, TypeFunction} from '@deepkit/type';
9
+ import {BaseRunType} from '../../lib/baseRunTypes.ts';
10
+ import {isAnyFunctionRunType, isFunctionRunType, isPromiseRunType} from '../../lib/guards.ts';
11
+ import {JitFnCompiler, JitErrorsFnCompiler} from '../../lib/jitFnCompiler.ts';
12
+ import {PromiseRunType} from '../native/promise.ts';
13
+ import {ReflectionSubKind} from '../../constants.kind.ts';
14
+ import {FunctionParamsRunType} from '../collection/functionParams.ts';
15
+ import {JitCompiledFn} from '@mionjs/core';
16
+ import {registerJitFunctionCompiler} from '../../lib/jitFnsRegistry.ts';
17
+ import {JitFunctions} from '../../constants.functions.ts';
18
+
19
+ export class FunctionRunType<CallType extends AnyFunction = TypeFunction> extends BaseRunType<CallType> {
20
+ // parameterRunTypes.src must be set after FunctionRunType creation
21
+ parameterRunTypes: FunctionParamsRunType = new FunctionParamsRunType();
22
+ skipJit(comp: JitFnCompiler): boolean {
23
+ if (!comp) return true;
24
+ return comp.fnID !== JitFunctions.toJSCode.id;
25
+ }
26
+ onCreated(deepkitType: SrcType): void {
27
+ // here we are mapping parameters from TypeParameter[] to TypeTuple as TupleRunType() is the same functionality as ParameterRunType[]
28
+ super.onCreated(deepkitType);
29
+ // Create a synthetic type for parameters with its own subKind
30
+ // Explicitly exclude _typeId and _formatId so the params type gets its own cached IDs
31
+ const paramsType = {...deepkitType, subKind: ReflectionSubKind.params} as any;
32
+ delete paramsType._typeId;
33
+ delete paramsType._formatId;
34
+ this.parameterRunTypes.onCreated(paramsType);
35
+ }
36
+ getFamily(): 'F' {
37
+ return 'F';
38
+ }
39
+ getFnName(): string | number {
40
+ const name = (this.src as TypeFunction).name;
41
+ if (!name) return '';
42
+ if (typeof name === 'symbol') return name.toString();
43
+ return name;
44
+ }
45
+ createJitParamsFunction(jitFn: JitFn, opts?: RunTypeOptions): (...args: any[]) => any {
46
+ return this.createJitCompiledParamsFunction(jitFn, opts).fn;
47
+ }
48
+ createJitCompiledParamsFunction(jitFn: JitFn, opts?: RunTypeOptions): JitCompiledFn {
49
+ const start = opts?.paramsSlice?.start;
50
+ const end = opts?.paramsSlice?.end;
51
+ if (start && end) {
52
+ if (start < 0 || end > this.parameterRunTypes.getChildRunTypes().length)
53
+ throw new Error(`Invalid paramsSlice, start: ${start}, end: ${end}.`);
54
+ if (end <= start) throw new Error(`Invalid paramsSlice, start: ${start}, end: ${end}`);
55
+ }
56
+ return this.parameterRunTypes.createJitCompiledFunction(jitFn.id, undefined, opts);
57
+ }
58
+ createJitReturnFunction(jitFn: JitFn): (...args: any[]) => any {
59
+ return this.createJitCompiledReturnFunction(jitFn).fn;
60
+ }
61
+
62
+ createJitCompiledReturnFunction(jitFn: JitFn, opts?: RunTypeOptions): JitCompiledFn {
63
+ return this.getResolvedReturnType().createJitCompiledFunction(jitFn.id, undefined, opts);
64
+ }
65
+
66
+ // ######## JIT functions (all throw error) ########
67
+
68
+ // can't know the types of the run type function parameters, neither the return type, so only compare function name and length
69
+ emitIsType(comp: JitFnCompiler): JitCode {
70
+ const minLength = this.parameterRunTypes.totalRequiredParams(comp);
71
+ const totalParams = this.parameterRunTypes.getParamRunTypes(comp).length;
72
+ const hasOptional = totalParams > minLength;
73
+ const maxLength =
74
+ this.parameterRunTypes.hasRestParameter(comp) || !hasOptional ? '' : ` && ${comp.vλl}.length <= ${totalParams}`;
75
+ return {code: `(typeof ${comp.vλl} === 'function' && ${comp.vλl}.length >= ${minLength} ${maxLength})`, type: 'E'};
76
+ }
77
+ emitTypeErrors(comp: JitErrorsFnCompiler): JitCode {
78
+ return {code: `if (!(${this.emitIsType(comp).code})) ${comp.callJitErr(this)};`, type: 'S'};
79
+ }
80
+ /**
81
+ * json encode a function
82
+ */
83
+ emitPrepareForJson(): JitCode {
84
+ throw new Error(`Compile function PrepareForJson not supported, call compileParams or compileReturn instead.`);
85
+ }
86
+ emitRestoreFromJson(): JitCode {
87
+ throw new Error(`Compile function RestoreFromJson not supported, call compileParams or compileReturn instead.`);
88
+ }
89
+ emitHasUnknownKeys(): JitCode {
90
+ return {code: '', type: 'E'};
91
+ }
92
+ emitUnknownKeyErrors(): JitCode {
93
+ return {code: '', type: 'S'};
94
+ }
95
+ emitStripUnknownKeys(): JitCode {
96
+ return {code: '', type: 'S'};
97
+ }
98
+ emitUnknownKeysToUndefined(): JitCode {
99
+ return {code: '', type: 'S'};
100
+ }
101
+
102
+ // TODO: paramsSlice has been removed as options are not jet passed when building the run type. maybe we can pass it to the JitCompileOperation instead
103
+ // constructor() {
104
+ // const start = opts?.paramsSlice?.start;
105
+ // const end = opts?.paramsSlice?.end;
106
+ // parameterRunTypes = src.parameters.slice(start, end).map((p) => visitor(p, parents, opts)) as ParameterRunType[];
107
+ // }
108
+ getReturnType(): BaseRunType {
109
+ return (this.src.return as SrcType)._rt as BaseRunType;
110
+ }
111
+ /** returns the inner run-type when the handler returns Promise<T> (or nested Promise/function-return chains), or the plain return type otherwise */
112
+ getResolvedReturnType(): BaseRunType {
113
+ let currentType: PromiseRunType | FunctionRunType<any> = this; // eslint-disable-line @typescript-eslint/no-this-alias
114
+ // eslint-disable-next-line no-constant-condition
115
+ while (true) {
116
+ if (isAnyFunctionRunType(currentType)) {
117
+ const returnType = currentType.getReturnType();
118
+ if (isPromiseRunType(returnType) || isFunctionRunType(returnType)) {
119
+ currentType = returnType;
120
+ continue;
121
+ }
122
+ return returnType;
123
+ }
124
+ const memberType = currentType.getMemberType();
125
+ if (isPromiseRunType(memberType) || isFunctionRunType(memberType)) {
126
+ currentType = memberType;
127
+ continue;
128
+ }
129
+ return memberType;
130
+ }
131
+ }
132
+ getParameters(): FunctionParamsRunType {
133
+ return this.parameterRunTypes;
134
+ }
135
+ getParameterNames(opts?: RunTypeOptions): string[] {
136
+ const start = opts?.paramsSlice?.start;
137
+ const end = opts?.paramsSlice?.end;
138
+ if (start || end) {
139
+ return this.src.parameters.slice(start, end).map((p) => p.name);
140
+ }
141
+ return this.src.parameters.map((p) => p.name);
142
+ }
143
+ hasReturnData(): boolean {
144
+ const returnKind = this.getReturnType().src.kind;
145
+ return (
146
+ returnKind !== ReflectionKind.void && returnKind !== ReflectionKind.never && returnKind !== ReflectionKind.undefined
147
+ );
148
+ }
149
+ isAsync(): boolean {
150
+ const returnKind = this.getReturnType().src.kind;
151
+ return (
152
+ returnKind === ReflectionKind.promise || returnKind === ReflectionKind.any || returnKind === ReflectionKind.unknown
153
+ );
154
+ }
155
+ returnIsPromise(): boolean {
156
+ return isPromiseRunType(this.getReturnType());
157
+ }
158
+ async mockReturn(ctx?: RunTypeOptions): Promise<any> {
159
+ await registerJitFunctionCompiler(JitFunctions.mock);
160
+ return this.getReturnType().mockType(ctx);
161
+ }
162
+ async mockParams(ctx?: RunTypeOptions): Promise<any[]> {
163
+ await registerJitFunctionCompiler(JitFunctions.mock);
164
+ return this.parameterRunTypes.mockType(ctx);
165
+ }
166
+ }