pull-request-split-advisor 3.1.2

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 (375) hide show
  1. package/LICENSE +52 -0
  2. package/README.md +168 -0
  3. package/dist/ai/config-wizard.js +282 -0
  4. package/dist/ai/enricher.js +290 -0
  5. package/dist/ai/prompts.js +231 -0
  6. package/dist/ai/provider.js +265 -0
  7. package/dist/cli.js +442 -0
  8. package/dist/config/config.js +315 -0
  9. package/dist/config/default-config.js +223 -0
  10. package/dist/core/blocks.js +145 -0
  11. package/dist/core/commit-planner.js +273 -0
  12. package/dist/core/dependency.js +284 -0
  13. package/dist/core/file-stats.js +341 -0
  14. package/dist/core/history.js +72 -0
  15. package/dist/core/planner.js +25 -0
  16. package/dist/core/scoring.js +166 -0
  17. package/dist/core/strategy.js +486 -0
  18. package/dist/git/branch-naming.js +120 -0
  19. package/dist/git/executor.js +378 -0
  20. package/dist/git/git.js +239 -0
  21. package/dist/output/report-styles.generated.js +10 -0
  22. package/dist/output/report.js +726 -0
  23. package/dist/output/ui.js +417 -0
  24. package/dist/shared/constants.js +59 -0
  25. package/dist/shared/types.js +7 -0
  26. package/dist/shared/utils.js +73 -0
  27. package/node_modules/@colors/colors/LICENSE +26 -0
  28. package/node_modules/@colors/colors/README.md +219 -0
  29. package/node_modules/@colors/colors/examples/normal-usage.js +83 -0
  30. package/node_modules/@colors/colors/examples/safe-string.js +80 -0
  31. package/node_modules/@colors/colors/index.d.ts +136 -0
  32. package/node_modules/@colors/colors/lib/colors.js +211 -0
  33. package/node_modules/@colors/colors/lib/custom/trap.js +46 -0
  34. package/node_modules/@colors/colors/lib/custom/zalgo.js +110 -0
  35. package/node_modules/@colors/colors/lib/extendStringPrototype.js +110 -0
  36. package/node_modules/@colors/colors/lib/index.js +13 -0
  37. package/node_modules/@colors/colors/lib/maps/america.js +10 -0
  38. package/node_modules/@colors/colors/lib/maps/rainbow.js +12 -0
  39. package/node_modules/@colors/colors/lib/maps/random.js +11 -0
  40. package/node_modules/@colors/colors/lib/maps/zebra.js +5 -0
  41. package/node_modules/@colors/colors/lib/styles.js +95 -0
  42. package/node_modules/@colors/colors/lib/system/has-flag.js +35 -0
  43. package/node_modules/@colors/colors/lib/system/supports-colors.js +151 -0
  44. package/node_modules/@colors/colors/package.json +45 -0
  45. package/node_modules/@colors/colors/safe.d.ts +48 -0
  46. package/node_modules/@colors/colors/safe.js +10 -0
  47. package/node_modules/@colors/colors/themes/generic-logging.js +12 -0
  48. package/node_modules/ansi-align/LICENSE +13 -0
  49. package/node_modules/ansi-align/README.md +80 -0
  50. package/node_modules/ansi-align/index.js +61 -0
  51. package/node_modules/ansi-align/node_modules/ansi-regex/index.d.ts +37 -0
  52. package/node_modules/ansi-align/node_modules/ansi-regex/index.js +10 -0
  53. package/node_modules/ansi-align/node_modules/ansi-regex/license +9 -0
  54. package/node_modules/ansi-align/node_modules/ansi-regex/package.json +55 -0
  55. package/node_modules/ansi-align/node_modules/ansi-regex/readme.md +78 -0
  56. package/node_modules/ansi-align/node_modules/emoji-regex/LICENSE-MIT.txt +20 -0
  57. package/node_modules/ansi-align/node_modules/emoji-regex/README.md +73 -0
  58. package/node_modules/ansi-align/node_modules/emoji-regex/es2015/index.js +6 -0
  59. package/node_modules/ansi-align/node_modules/emoji-regex/es2015/text.js +6 -0
  60. package/node_modules/ansi-align/node_modules/emoji-regex/index.d.ts +23 -0
  61. package/node_modules/ansi-align/node_modules/emoji-regex/index.js +6 -0
  62. package/node_modules/ansi-align/node_modules/emoji-regex/package.json +50 -0
  63. package/node_modules/ansi-align/node_modules/emoji-regex/text.js +6 -0
  64. package/node_modules/ansi-align/node_modules/string-width/index.d.ts +29 -0
  65. package/node_modules/ansi-align/node_modules/string-width/index.js +47 -0
  66. package/node_modules/ansi-align/node_modules/string-width/license +9 -0
  67. package/node_modules/ansi-align/node_modules/string-width/package.json +56 -0
  68. package/node_modules/ansi-align/node_modules/string-width/readme.md +50 -0
  69. package/node_modules/ansi-align/node_modules/strip-ansi/index.d.ts +17 -0
  70. package/node_modules/ansi-align/node_modules/strip-ansi/index.js +4 -0
  71. package/node_modules/ansi-align/node_modules/strip-ansi/license +9 -0
  72. package/node_modules/ansi-align/node_modules/strip-ansi/package.json +54 -0
  73. package/node_modules/ansi-align/node_modules/strip-ansi/readme.md +46 -0
  74. package/node_modules/ansi-align/package.json +43 -0
  75. package/node_modules/ansi-regex/index.d.ts +33 -0
  76. package/node_modules/ansi-regex/index.js +14 -0
  77. package/node_modules/ansi-regex/license +9 -0
  78. package/node_modules/ansi-regex/package.json +61 -0
  79. package/node_modules/ansi-regex/readme.md +66 -0
  80. package/node_modules/ansi-styles/index.d.ts +236 -0
  81. package/node_modules/ansi-styles/index.js +223 -0
  82. package/node_modules/ansi-styles/license +9 -0
  83. package/node_modules/ansi-styles/package.json +54 -0
  84. package/node_modules/ansi-styles/readme.md +173 -0
  85. package/node_modules/boxen/index.d.ts +267 -0
  86. package/node_modules/boxen/index.js +376 -0
  87. package/node_modules/boxen/license +9 -0
  88. package/node_modules/boxen/package.json +69 -0
  89. package/node_modules/boxen/readme.md +300 -0
  90. package/node_modules/camelcase/index.d.ts +102 -0
  91. package/node_modules/camelcase/index.js +110 -0
  92. package/node_modules/camelcase/license +9 -0
  93. package/node_modules/camelcase/package.json +47 -0
  94. package/node_modules/camelcase/readme.md +135 -0
  95. package/node_modules/chalk/license +9 -0
  96. package/node_modules/chalk/package.json +83 -0
  97. package/node_modules/chalk/readme.md +297 -0
  98. package/node_modules/chalk/source/index.d.ts +325 -0
  99. package/node_modules/chalk/source/index.js +225 -0
  100. package/node_modules/chalk/source/utilities.js +33 -0
  101. package/node_modules/chalk/source/vendor/ansi-styles/index.d.ts +236 -0
  102. package/node_modules/chalk/source/vendor/ansi-styles/index.js +223 -0
  103. package/node_modules/chalk/source/vendor/supports-color/browser.d.ts +1 -0
  104. package/node_modules/chalk/source/vendor/supports-color/browser.js +34 -0
  105. package/node_modules/chalk/source/vendor/supports-color/index.d.ts +55 -0
  106. package/node_modules/chalk/source/vendor/supports-color/index.js +190 -0
  107. package/node_modules/cli-boxes/boxes.json +82 -0
  108. package/node_modules/cli-boxes/index.d.ts +127 -0
  109. package/node_modules/cli-boxes/index.js +6 -0
  110. package/node_modules/cli-boxes/license +9 -0
  111. package/node_modules/cli-boxes/package.json +42 -0
  112. package/node_modules/cli-boxes/readme.md +115 -0
  113. package/node_modules/cli-table3/LICENSE +21 -0
  114. package/node_modules/cli-table3/README.md +236 -0
  115. package/node_modules/cli-table3/index.d.ts +96 -0
  116. package/node_modules/cli-table3/index.js +1 -0
  117. package/node_modules/cli-table3/node_modules/ansi-regex/index.d.ts +37 -0
  118. package/node_modules/cli-table3/node_modules/ansi-regex/index.js +10 -0
  119. package/node_modules/cli-table3/node_modules/ansi-regex/license +9 -0
  120. package/node_modules/cli-table3/node_modules/ansi-regex/package.json +55 -0
  121. package/node_modules/cli-table3/node_modules/ansi-regex/readme.md +78 -0
  122. package/node_modules/cli-table3/node_modules/emoji-regex/LICENSE-MIT.txt +20 -0
  123. package/node_modules/cli-table3/node_modules/emoji-regex/README.md +73 -0
  124. package/node_modules/cli-table3/node_modules/emoji-regex/es2015/index.js +6 -0
  125. package/node_modules/cli-table3/node_modules/emoji-regex/es2015/text.js +6 -0
  126. package/node_modules/cli-table3/node_modules/emoji-regex/index.d.ts +23 -0
  127. package/node_modules/cli-table3/node_modules/emoji-regex/index.js +6 -0
  128. package/node_modules/cli-table3/node_modules/emoji-regex/package.json +50 -0
  129. package/node_modules/cli-table3/node_modules/emoji-regex/text.js +6 -0
  130. package/node_modules/cli-table3/node_modules/string-width/index.d.ts +29 -0
  131. package/node_modules/cli-table3/node_modules/string-width/index.js +47 -0
  132. package/node_modules/cli-table3/node_modules/string-width/license +9 -0
  133. package/node_modules/cli-table3/node_modules/string-width/package.json +56 -0
  134. package/node_modules/cli-table3/node_modules/string-width/readme.md +50 -0
  135. package/node_modules/cli-table3/node_modules/strip-ansi/index.d.ts +17 -0
  136. package/node_modules/cli-table3/node_modules/strip-ansi/index.js +4 -0
  137. package/node_modules/cli-table3/node_modules/strip-ansi/license +9 -0
  138. package/node_modules/cli-table3/node_modules/strip-ansi/package.json +54 -0
  139. package/node_modules/cli-table3/node_modules/strip-ansi/readme.md +46 -0
  140. package/node_modules/cli-table3/package.json +100 -0
  141. package/node_modules/cli-table3/src/cell.js +409 -0
  142. package/node_modules/cli-table3/src/debug.js +28 -0
  143. package/node_modules/cli-table3/src/layout-manager.js +254 -0
  144. package/node_modules/cli-table3/src/table.js +106 -0
  145. package/node_modules/cli-table3/src/utils.js +344 -0
  146. package/node_modules/commander/LICENSE +22 -0
  147. package/node_modules/commander/Readme.md +1157 -0
  148. package/node_modules/commander/esm.mjs +16 -0
  149. package/node_modules/commander/index.js +24 -0
  150. package/node_modules/commander/lib/argument.js +149 -0
  151. package/node_modules/commander/lib/command.js +2509 -0
  152. package/node_modules/commander/lib/error.js +39 -0
  153. package/node_modules/commander/lib/help.js +520 -0
  154. package/node_modules/commander/lib/option.js +330 -0
  155. package/node_modules/commander/lib/suggestSimilar.js +101 -0
  156. package/node_modules/commander/package-support.json +16 -0
  157. package/node_modules/commander/package.json +84 -0
  158. package/node_modules/commander/typings/esm.d.mts +3 -0
  159. package/node_modules/commander/typings/index.d.ts +969 -0
  160. package/node_modules/emoji-regex/LICENSE-MIT.txt +20 -0
  161. package/node_modules/emoji-regex/README.md +107 -0
  162. package/node_modules/emoji-regex/index.d.ts +3 -0
  163. package/node_modules/emoji-regex/index.js +4 -0
  164. package/node_modules/emoji-regex/index.mjs +4 -0
  165. package/node_modules/emoji-regex/package.json +45 -0
  166. package/node_modules/get-east-asian-width/index.d.ts +60 -0
  167. package/node_modules/get-east-asian-width/index.js +30 -0
  168. package/node_modules/get-east-asian-width/license +9 -0
  169. package/node_modules/get-east-asian-width/lookup-data.js +18 -0
  170. package/node_modules/get-east-asian-width/lookup.js +135 -0
  171. package/node_modules/get-east-asian-width/package.json +71 -0
  172. package/node_modules/get-east-asian-width/readme.md +65 -0
  173. package/node_modules/get-east-asian-width/utilities.js +24 -0
  174. package/node_modules/is-fullwidth-code-point/index.d.ts +17 -0
  175. package/node_modules/is-fullwidth-code-point/index.js +50 -0
  176. package/node_modules/is-fullwidth-code-point/license +9 -0
  177. package/node_modules/is-fullwidth-code-point/package.json +42 -0
  178. package/node_modules/is-fullwidth-code-point/readme.md +39 -0
  179. package/node_modules/isbinaryfile/LICENSE.txt +22 -0
  180. package/node_modules/isbinaryfile/README.md +70 -0
  181. package/node_modules/isbinaryfile/lib/index.d.ts +3 -0
  182. package/node_modules/isbinaryfile/lib/index.js +256 -0
  183. package/node_modules/isbinaryfile/package.json +64 -0
  184. package/node_modules/string-width/index.d.ts +39 -0
  185. package/node_modules/string-width/index.js +82 -0
  186. package/node_modules/string-width/license +9 -0
  187. package/node_modules/string-width/package.json +64 -0
  188. package/node_modules/string-width/readme.md +66 -0
  189. package/node_modules/strip-ansi/index.d.ts +15 -0
  190. package/node_modules/strip-ansi/index.js +19 -0
  191. package/node_modules/strip-ansi/license +9 -0
  192. package/node_modules/strip-ansi/package.json +59 -0
  193. package/node_modules/strip-ansi/readme.md +37 -0
  194. package/node_modules/type-fest/index.d.ts +178 -0
  195. package/node_modules/type-fest/license-cc0 +121 -0
  196. package/node_modules/type-fest/license-mit +9 -0
  197. package/node_modules/type-fest/package.json +91 -0
  198. package/node_modules/type-fest/readme.md +1060 -0
  199. package/node_modules/type-fest/source/all-union-fields.d.ts +88 -0
  200. package/node_modules/type-fest/source/and.d.ts +25 -0
  201. package/node_modules/type-fest/source/array-indices.d.ts +23 -0
  202. package/node_modules/type-fest/source/array-slice.d.ts +109 -0
  203. package/node_modules/type-fest/source/array-splice.d.ts +99 -0
  204. package/node_modules/type-fest/source/array-tail.d.ts +76 -0
  205. package/node_modules/type-fest/source/array-values.d.ts +22 -0
  206. package/node_modules/type-fest/source/arrayable.d.ts +29 -0
  207. package/node_modules/type-fest/source/async-return-type.d.ts +23 -0
  208. package/node_modules/type-fest/source/asyncify.d.ts +32 -0
  209. package/node_modules/type-fest/source/basic.d.ts +68 -0
  210. package/node_modules/type-fest/source/camel-case.d.ts +89 -0
  211. package/node_modules/type-fest/source/camel-cased-properties-deep.d.ts +97 -0
  212. package/node_modules/type-fest/source/camel-cased-properties.d.ts +43 -0
  213. package/node_modules/type-fest/source/conditional-except.d.ts +45 -0
  214. package/node_modules/type-fest/source/conditional-keys.d.ts +47 -0
  215. package/node_modules/type-fest/source/conditional-pick-deep.d.ts +118 -0
  216. package/node_modules/type-fest/source/conditional-pick.d.ts +44 -0
  217. package/node_modules/type-fest/source/conditional-simplify.d.ts +32 -0
  218. package/node_modules/type-fest/source/delimiter-case.d.ts +78 -0
  219. package/node_modules/type-fest/source/delimiter-cased-properties-deep.d.ts +106 -0
  220. package/node_modules/type-fest/source/delimiter-cased-properties.d.ts +46 -0
  221. package/node_modules/type-fest/source/distributed-omit.d.ts +89 -0
  222. package/node_modules/type-fest/source/distributed-pick.d.ts +85 -0
  223. package/node_modules/type-fest/source/empty-object.d.ts +46 -0
  224. package/node_modules/type-fest/source/enforce-optional.d.ts +47 -0
  225. package/node_modules/type-fest/source/entries.d.ts +62 -0
  226. package/node_modules/type-fest/source/entry.d.ts +65 -0
  227. package/node_modules/type-fest/source/exact.d.ts +68 -0
  228. package/node_modules/type-fest/source/except.d.ts +108 -0
  229. package/node_modules/type-fest/source/find-global-type.d.ts +64 -0
  230. package/node_modules/type-fest/source/fixed-length-array.d.ts +43 -0
  231. package/node_modules/type-fest/source/get.d.ts +219 -0
  232. package/node_modules/type-fest/source/global-this.d.ts +21 -0
  233. package/node_modules/type-fest/source/greater-than-or-equal.d.ts +22 -0
  234. package/node_modules/type-fest/source/greater-than.d.ts +56 -0
  235. package/node_modules/type-fest/source/has-optional-keys.d.ts +21 -0
  236. package/node_modules/type-fest/source/has-readonly-keys.d.ts +21 -0
  237. package/node_modules/type-fest/source/has-required-keys.d.ts +59 -0
  238. package/node_modules/type-fest/source/has-writable-keys.d.ts +21 -0
  239. package/node_modules/type-fest/source/if-any.d.ts +24 -0
  240. package/node_modules/type-fest/source/if-empty-object.d.ts +26 -0
  241. package/node_modules/type-fest/source/if-never.d.ts +24 -0
  242. package/node_modules/type-fest/source/if-null.d.ts +24 -0
  243. package/node_modules/type-fest/source/if-unknown.d.ts +24 -0
  244. package/node_modules/type-fest/source/includes.d.ts +22 -0
  245. package/node_modules/type-fest/source/int-closed-range.d.ts +35 -0
  246. package/node_modules/type-fest/source/int-range.d.ts +55 -0
  247. package/node_modules/type-fest/source/internal/array.d.ts +126 -0
  248. package/node_modules/type-fest/source/internal/characters.d.ts +67 -0
  249. package/node_modules/type-fest/source/internal/index.d.ts +8 -0
  250. package/node_modules/type-fest/source/internal/keys.d.ts +97 -0
  251. package/node_modules/type-fest/source/internal/numeric.d.ts +118 -0
  252. package/node_modules/type-fest/source/internal/object.d.ts +236 -0
  253. package/node_modules/type-fest/source/internal/string.d.ts +210 -0
  254. package/node_modules/type-fest/source/internal/tuple.d.ts +90 -0
  255. package/node_modules/type-fest/source/internal/type.d.ts +139 -0
  256. package/node_modules/type-fest/source/invariant-of.d.ts +76 -0
  257. package/node_modules/type-fest/source/is-any.d.ts +33 -0
  258. package/node_modules/type-fest/source/is-equal.d.ts +31 -0
  259. package/node_modules/type-fest/source/is-float.d.ts +41 -0
  260. package/node_modules/type-fest/source/is-integer.d.ts +58 -0
  261. package/node_modules/type-fest/source/is-literal.d.ts +296 -0
  262. package/node_modules/type-fest/source/is-never.d.ts +42 -0
  263. package/node_modules/type-fest/source/is-null.d.ts +20 -0
  264. package/node_modules/type-fest/source/is-tuple.d.ts +89 -0
  265. package/node_modules/type-fest/source/is-unknown.d.ts +52 -0
  266. package/node_modules/type-fest/source/iterable-element.d.ts +64 -0
  267. package/node_modules/type-fest/source/join.d.ts +68 -0
  268. package/node_modules/type-fest/source/jsonifiable.d.ts +37 -0
  269. package/node_modules/type-fest/source/jsonify.d.ts +122 -0
  270. package/node_modules/type-fest/source/kebab-case.d.ts +44 -0
  271. package/node_modules/type-fest/source/kebab-cased-properties-deep.d.ts +63 -0
  272. package/node_modules/type-fest/source/kebab-cased-properties.d.ts +40 -0
  273. package/node_modules/type-fest/source/keys-of-union.d.ts +42 -0
  274. package/node_modules/type-fest/source/last-array-element.d.ts +38 -0
  275. package/node_modules/type-fest/source/less-than-or-equal.d.ts +22 -0
  276. package/node_modules/type-fest/source/less-than.d.ts +26 -0
  277. package/node_modules/type-fest/source/literal-to-primitive-deep.d.ts +36 -0
  278. package/node_modules/type-fest/source/literal-to-primitive.d.ts +36 -0
  279. package/node_modules/type-fest/source/literal-union.d.ts +37 -0
  280. package/node_modules/type-fest/source/merge-deep.d.ts +486 -0
  281. package/node_modules/type-fest/source/merge-exclusive.d.ts +41 -0
  282. package/node_modules/type-fest/source/merge.d.ts +48 -0
  283. package/node_modules/type-fest/source/multidimensional-array.d.ts +44 -0
  284. package/node_modules/type-fest/source/multidimensional-readonly-array.d.ts +48 -0
  285. package/node_modules/type-fest/source/non-empty-object.d.ts +35 -0
  286. package/node_modules/type-fest/source/non-empty-string.d.ts +28 -0
  287. package/node_modules/type-fest/source/non-empty-tuple.d.ts +21 -0
  288. package/node_modules/type-fest/source/numeric.d.ts +222 -0
  289. package/node_modules/type-fest/source/observable-like.d.ts +63 -0
  290. package/node_modules/type-fest/source/omit-deep.d.ts +167 -0
  291. package/node_modules/type-fest/source/omit-index-signature.d.ts +95 -0
  292. package/node_modules/type-fest/source/opaque.d.ts +1 -0
  293. package/node_modules/type-fest/source/optional-keys-of.d.ts +39 -0
  294. package/node_modules/type-fest/source/or.d.ts +25 -0
  295. package/node_modules/type-fest/source/override-properties.d.ts +36 -0
  296. package/node_modules/type-fest/source/package-json.d.ts +676 -0
  297. package/node_modules/type-fest/source/partial-deep.d.ts +151 -0
  298. package/node_modules/type-fest/source/partial-on-undefined-deep.d.ts +78 -0
  299. package/node_modules/type-fest/source/pascal-case.d.ts +42 -0
  300. package/node_modules/type-fest/source/pascal-cased-properties-deep.d.ts +62 -0
  301. package/node_modules/type-fest/source/pascal-cased-properties.d.ts +36 -0
  302. package/node_modules/type-fest/source/paths.d.ts +262 -0
  303. package/node_modules/type-fest/source/pick-deep.d.ts +149 -0
  304. package/node_modules/type-fest/source/pick-index-signature.d.ts +50 -0
  305. package/node_modules/type-fest/source/primitive.d.ts +13 -0
  306. package/node_modules/type-fest/source/promisable.d.ts +25 -0
  307. package/node_modules/type-fest/source/readonly-deep.d.ts +81 -0
  308. package/node_modules/type-fest/source/readonly-keys-of.d.ts +30 -0
  309. package/node_modules/type-fest/source/readonly-tuple.d.ts +41 -0
  310. package/node_modules/type-fest/source/replace.d.ts +85 -0
  311. package/node_modules/type-fest/source/require-all-or-none.d.ts +51 -0
  312. package/node_modules/type-fest/source/require-at-least-one.d.ts +47 -0
  313. package/node_modules/type-fest/source/require-exactly-one.d.ts +45 -0
  314. package/node_modules/type-fest/source/require-one-or-none.d.ts +46 -0
  315. package/node_modules/type-fest/source/required-deep.d.ts +78 -0
  316. package/node_modules/type-fest/source/required-keys-of.d.ts +30 -0
  317. package/node_modules/type-fest/source/schema.d.ts +114 -0
  318. package/node_modules/type-fest/source/screaming-snake-case.d.ts +28 -0
  319. package/node_modules/type-fest/source/set-field-type.d.ts +65 -0
  320. package/node_modules/type-fest/source/set-non-nullable-deep.d.ts +83 -0
  321. package/node_modules/type-fest/source/set-non-nullable.d.ts +39 -0
  322. package/node_modules/type-fest/source/set-optional.d.ts +38 -0
  323. package/node_modules/type-fest/source/set-parameter-type.d.ts +117 -0
  324. package/node_modules/type-fest/source/set-readonly.d.ts +39 -0
  325. package/node_modules/type-fest/source/set-required-deep.d.ts +68 -0
  326. package/node_modules/type-fest/source/set-required.d.ts +70 -0
  327. package/node_modules/type-fest/source/set-return-type.d.ts +29 -0
  328. package/node_modules/type-fest/source/shared-union-fields-deep.d.ts +178 -0
  329. package/node_modules/type-fest/source/shared-union-fields.d.ts +76 -0
  330. package/node_modules/type-fest/source/simplify-deep.d.ts +115 -0
  331. package/node_modules/type-fest/source/simplify.d.ts +58 -0
  332. package/node_modules/type-fest/source/single-key-object.d.ts +29 -0
  333. package/node_modules/type-fest/source/snake-case.d.ts +45 -0
  334. package/node_modules/type-fest/source/snake-cased-properties-deep.d.ts +63 -0
  335. package/node_modules/type-fest/source/snake-cased-properties.d.ts +40 -0
  336. package/node_modules/type-fest/source/split.d.ts +88 -0
  337. package/node_modules/type-fest/source/spread.d.ts +84 -0
  338. package/node_modules/type-fest/source/string-key-of.d.ts +25 -0
  339. package/node_modules/type-fest/source/string-repeat.d.ts +47 -0
  340. package/node_modules/type-fest/source/string-slice.d.ts +37 -0
  341. package/node_modules/type-fest/source/stringified.d.ts +23 -0
  342. package/node_modules/type-fest/source/structured-cloneable.d.ts +92 -0
  343. package/node_modules/type-fest/source/subtract.d.ts +83 -0
  344. package/node_modules/type-fest/source/sum.d.ts +78 -0
  345. package/node_modules/type-fest/source/tagged-union.d.ts +51 -0
  346. package/node_modules/type-fest/source/tagged.d.ts +256 -0
  347. package/node_modules/type-fest/source/trim.d.ts +27 -0
  348. package/node_modules/type-fest/source/tsconfig-json.d.ts +1294 -0
  349. package/node_modules/type-fest/source/tuple-to-object.d.ts +42 -0
  350. package/node_modules/type-fest/source/tuple-to-union.d.ts +51 -0
  351. package/node_modules/type-fest/source/typed-array.d.ts +17 -0
  352. package/node_modules/type-fest/source/undefined-on-partial-deep.d.ts +80 -0
  353. package/node_modules/type-fest/source/union-to-intersection.d.ts +61 -0
  354. package/node_modules/type-fest/source/union-to-tuple.d.ts +56 -0
  355. package/node_modules/type-fest/source/unknown-array.d.ts +25 -0
  356. package/node_modules/type-fest/source/unknown-map.d.ts +24 -0
  357. package/node_modules/type-fest/source/unknown-record.d.ts +31 -0
  358. package/node_modules/type-fest/source/unknown-set.d.ts +24 -0
  359. package/node_modules/type-fest/source/value-of.d.ts +42 -0
  360. package/node_modules/type-fest/source/words.d.ts +118 -0
  361. package/node_modules/type-fest/source/writable-deep.d.ts +83 -0
  362. package/node_modules/type-fest/source/writable-keys-of.d.ts +33 -0
  363. package/node_modules/type-fest/source/writable.d.ts +68 -0
  364. package/node_modules/widest-line/index.d.ts +12 -0
  365. package/node_modules/widest-line/index.js +11 -0
  366. package/node_modules/widest-line/license +9 -0
  367. package/node_modules/widest-line/package.json +60 -0
  368. package/node_modules/widest-line/readme.md +26 -0
  369. package/node_modules/wrap-ansi/index.d.ts +41 -0
  370. package/node_modules/wrap-ansi/index.js +222 -0
  371. package/node_modules/wrap-ansi/license +9 -0
  372. package/node_modules/wrap-ansi/package.json +69 -0
  373. package/node_modules/wrap-ansi/readme.md +75 -0
  374. package/package.json +78 -0
  375. package/scripts/postinstall.cjs +122 -0
@@ -0,0 +1,63 @@
1
+ import type {DefaultDelimiterCaseOptions} from './delimiter-case';
2
+ import type {DelimiterCasedPropertiesDeep} from './delimiter-cased-properties-deep';
3
+ import type {ApplyDefaultOptions} from './internal';
4
+ import type {WordsOptions} from './words';
5
+
6
+ /**
7
+ Convert object properties to snake case recursively.
8
+
9
+ This can be useful when, for example, converting some API types from a different style.
10
+
11
+ @see SnakeCase
12
+ @see SnakeCasedProperties
13
+
14
+ @example
15
+ ```
16
+ import type {SnakeCasedPropertiesDeep} from 'type-fest';
17
+
18
+ interface User {
19
+ userId: number;
20
+ userName: string;
21
+ }
22
+
23
+ interface UserWithFriends {
24
+ userInfo: User;
25
+ userFriends: User[];
26
+ }
27
+
28
+ const result: SnakeCasedPropertiesDeep<UserWithFriends> = {
29
+ user_info: {
30
+ user_id: 1,
31
+ user_name: 'Tom',
32
+ },
33
+ user_friends: [
34
+ {
35
+ user_id: 2,
36
+ user_name: 'Jerry',
37
+ },
38
+ {
39
+ user_id: 3,
40
+ user_name: 'Spike',
41
+ },
42
+ ],
43
+ };
44
+
45
+ const splitOnNumbers: SnakeCasedPropertiesDeep<{line1: { line2: [{ line3: string }] }}, {splitOnNumbers: true}> = {
46
+ line_1: {
47
+ line_2: [
48
+ {
49
+ line_3: 'string',
50
+ },
51
+ ],
52
+ },
53
+ };
54
+ ```
55
+
56
+ @category Change case
57
+ @category Template literal
58
+ @category Object
59
+ */
60
+ export type SnakeCasedPropertiesDeep<
61
+ Value,
62
+ Options extends WordsOptions = {},
63
+ > = DelimiterCasedPropertiesDeep<Value, '_', ApplyDefaultOptions<WordsOptions, DefaultDelimiterCaseOptions, Options>>;
@@ -0,0 +1,40 @@
1
+ import type {DefaultDelimiterCaseOptions} from './delimiter-case';
2
+ import type {DelimiterCasedProperties} from './delimiter-cased-properties';
3
+ import type {ApplyDefaultOptions} from './internal';
4
+ import type {WordsOptions} from './words';
5
+
6
+ /**
7
+ Convert object properties to snake case but not recursively.
8
+
9
+ This can be useful when, for example, converting some API types from a different style.
10
+
11
+ @see SnakeCase
12
+ @see SnakeCasedPropertiesDeep
13
+
14
+ @example
15
+ ```
16
+ import type {SnakeCasedProperties} from 'type-fest';
17
+
18
+ interface User {
19
+ userId: number;
20
+ userName: string;
21
+ }
22
+
23
+ const result: SnakeCasedProperties<User> = {
24
+ user_id: 1,
25
+ user_name: 'Tom',
26
+ };
27
+
28
+ const splitOnNumbers: SnakeCasedProperties<{line1: string}, {splitOnNumbers: true}> = {
29
+ 'line_1': 'string',
30
+ };
31
+ ```
32
+
33
+ @category Change case
34
+ @category Template literal
35
+ @category Object
36
+ */
37
+ export type SnakeCasedProperties<
38
+ Value,
39
+ Options extends WordsOptions = {},
40
+ > = DelimiterCasedProperties<Value, '_', ApplyDefaultOptions<WordsOptions, DefaultDelimiterCaseOptions, Options>>;
@@ -0,0 +1,88 @@
1
+ import type {And} from './and';
2
+ import type {ApplyDefaultOptions, Not} from './internal';
3
+ import type {IsStringLiteral} from './is-literal';
4
+ import type {Or} from './or';
5
+
6
+ /**
7
+ Split options.
8
+
9
+ @see {@link Split}
10
+ */
11
+ type SplitOptions = {
12
+ /**
13
+ When enabled, instantiations with non-literal string types (e.g., `string`, `Uppercase<string>`, `on${string}`) simply return back `string[]` without performing any splitting, as the exact structure cannot be statically determined.
14
+
15
+ Note: In the future, this option might be enabled by default, so if you currently rely on this being disabled, you should consider explicitly enabling it.
16
+
17
+ @default false
18
+
19
+ @example
20
+ ```ts
21
+ type Example1 = Split<`foo.${string}.bar`, '.', {strictLiteralChecks: false}>;
22
+ //=> ['foo', string, 'bar']
23
+
24
+ type Example2 = Split<`foo.${string}`, '.', {strictLiteralChecks: true}>;
25
+ //=> string[]
26
+
27
+ type Example3 = Split<'foobarbaz', `b${string}`, {strictLiteralChecks: false}>;
28
+ //=> ['foo', 'r', 'z']
29
+
30
+ type Example4 = Split<'foobarbaz', `b${string}`, {strictLiteralChecks: true}>;
31
+ //=> string[]
32
+ ```
33
+ */
34
+ strictLiteralChecks?: boolean;
35
+ };
36
+
37
+ type DefaultSplitOptions = {
38
+ strictLiteralChecks: false;
39
+ };
40
+
41
+ /**
42
+ Represents an array of strings split using a given character or character set.
43
+
44
+ Use-case: Defining the return type of a method like `String.prototype.split`.
45
+
46
+ @example
47
+ ```
48
+ import type {Split} from 'type-fest';
49
+
50
+ declare function split<S extends string, D extends string>(string: S, separator: D): Split<S, D>;
51
+
52
+ type Item = 'foo' | 'bar' | 'baz' | 'waldo';
53
+ const items = 'foo,bar,baz,waldo';
54
+ let array: Item[];
55
+
56
+ array = split(items, ',');
57
+ ```
58
+
59
+ @see {@link SplitOptions}
60
+
61
+ @category String
62
+ @category Template literal
63
+ */
64
+ export type Split<
65
+ S extends string,
66
+ Delimiter extends string,
67
+ Options extends SplitOptions = {},
68
+ > =
69
+ SplitHelper<S, Delimiter, ApplyDefaultOptions<SplitOptions, DefaultSplitOptions, Options>>;
70
+
71
+ type SplitHelper<
72
+ S extends string,
73
+ Delimiter extends string,
74
+ Options extends Required<SplitOptions>,
75
+ Accumulator extends string[] = [],
76
+ > = S extends string // For distributing `S`
77
+ ? Delimiter extends string // For distributing `Delimeter`
78
+ // If `strictLiteralChecks` is `false` OR `S` and `Delimiter` both are string literals, then perform the split
79
+ ? Or<Not<Options['strictLiteralChecks']>, And<IsStringLiteral<S>, IsStringLiteral<Delimiter>>> extends true
80
+ ? S extends `${infer Head}${Delimiter}${infer Tail}`
81
+ ? SplitHelper<Tail, Delimiter, Options, [...Accumulator, Head]>
82
+ : Delimiter extends ''
83
+ ? Accumulator
84
+ : [...Accumulator, S]
85
+ // Otherwise, return `string[]`
86
+ : string[]
87
+ : never // Should never happen
88
+ : never; // Should never happen
@@ -0,0 +1,84 @@
1
+ import type {RequiredKeysOf} from './required-keys-of';
2
+ import type {Simplify} from './simplify';
3
+
4
+ type SpreadObject<FirstType extends object, SecondType extends object> = {
5
+ [Key in keyof FirstType]: Key extends keyof SecondType
6
+ ? FirstType[Key] | Required<SecondType>[Key]
7
+ : FirstType[Key];
8
+ } & Pick<
9
+ SecondType,
10
+ RequiredKeysOf<SecondType> | Exclude<keyof SecondType, keyof FirstType>
11
+ >;
12
+
13
+ type TupleOrArray = readonly [...unknown[]];
14
+
15
+ type SpreadTupleOrArray<
16
+ FirstType extends TupleOrArray,
17
+ SecondType extends TupleOrArray,
18
+ > = Array<FirstType[number] | SecondType[number]>;
19
+
20
+ type Spreadable = object | TupleOrArray;
21
+
22
+ /**
23
+ Mimic the type inferred by TypeScript when merging two objects or two arrays/tuples using the spread syntax.
24
+
25
+ @example
26
+ ```
27
+ import type {Spread} from 'type-fest';
28
+
29
+ type Foo = {
30
+ a: number;
31
+ b?: string;
32
+ };
33
+
34
+ type Bar = {
35
+ b?: number;
36
+ c: boolean;
37
+ };
38
+
39
+ const foo = {a: 1, b: '2'};
40
+ const bar = {c: false};
41
+ const fooBar = {...foo, ...bar};
42
+
43
+ type FooBar = Spread<Foo, Bar>;
44
+ // type FooBar = {
45
+ // a: number;
46
+ // b?: string | number | undefined;
47
+ // c: boolean;
48
+ // }
49
+
50
+ const baz = (argument: FooBar) => {
51
+ // Do something
52
+ }
53
+
54
+ baz(fooBar);
55
+ ```
56
+
57
+ @example
58
+ ```
59
+ import type {Spread} from 'type-fest';
60
+
61
+ const foo = [1, 2, 3];
62
+ const bar = ['4', '5', '6'];
63
+
64
+ const fooBar = [...foo, ...bar];
65
+ type FooBar = Spread<typeof foo, typeof bar>;
66
+ // FooBar = (string | number)[]
67
+
68
+ const baz = (argument: FooBar) => {
69
+ // Do something
70
+ };
71
+
72
+ baz(fooBar);
73
+ ```
74
+
75
+ @category Object
76
+ */
77
+ export type Spread<
78
+ FirstType extends Spreadable,
79
+ SecondType extends Spreadable,
80
+ > = FirstType extends TupleOrArray
81
+ ? SecondType extends TupleOrArray
82
+ ? SpreadTupleOrArray<FirstType, SecondType>
83
+ : Simplify<SpreadObject<FirstType, SecondType>>
84
+ : Simplify<SpreadObject<FirstType, SecondType>>;
@@ -0,0 +1,25 @@
1
+ /**
2
+ Get keys of the given type as strings.
3
+
4
+ Number keys are converted to strings.
5
+
6
+ Use-cases:
7
+ - Get string keys from a type which may have number keys.
8
+ - Makes it possible to index using strings retrieved from template types.
9
+
10
+ @example
11
+ ```
12
+ import type {StringKeyOf} from 'type-fest';
13
+
14
+ type Foo = {
15
+ 1: number,
16
+ stringKey: string,
17
+ };
18
+
19
+ type StringKeysOfFoo = StringKeyOf<Foo>;
20
+ //=> '1' | 'stringKey'
21
+ ```
22
+
23
+ @category Object
24
+ */
25
+ export type StringKeyOf<BaseType> = `${Extract<keyof BaseType, string | number>}`;
@@ -0,0 +1,47 @@
1
+ import type {IsNumericLiteral} from './is-literal';
2
+ import type {IsNegative} from './numeric';
3
+
4
+ /**
5
+ Returns a new string which contains the specified number of copies of a given string, just like `String#repeat()`.
6
+
7
+ @example
8
+ ```
9
+ import {StringRepeat} from 'type-fest';
10
+
11
+ declare function stringRepeat<
12
+ Input extends string,
13
+ Count extends number
14
+ >(input: Input, count: Count): StringRepeat<Input, Count>;
15
+
16
+ // The return type is the exact string literal, not just `string`.
17
+
18
+ stringRepeat('foo', 2);
19
+ //=> 'foofoo'
20
+
21
+ stringRepeat('=', 3);
22
+ //=> '==='
23
+ ```
24
+
25
+ @category String
26
+ @category Template literal
27
+ */
28
+ export type StringRepeat<
29
+ Input extends string,
30
+ Count extends number,
31
+ > = StringRepeatHelper<Input, Count>;
32
+
33
+ type StringRepeatHelper<
34
+ Input extends string,
35
+ Count extends number,
36
+ Counter extends never[] = [],
37
+ Accumulator extends string = '',
38
+ > =
39
+ IsNegative<Count> extends true
40
+ ? never
41
+ : Input extends ''
42
+ ? ''
43
+ : Count extends Counter['length']
44
+ ? Accumulator
45
+ : IsNumericLiteral<Count> extends false
46
+ ? string
47
+ : StringRepeatHelper<Input, Count, [...Counter, never], `${Accumulator}${Input}`>;
@@ -0,0 +1,37 @@
1
+ import type {Join} from './join';
2
+ import type {ArraySlice} from './array-slice';
3
+ import type {StringToArray} from './internal';
4
+
5
+ /**
6
+ Returns a string slice of a given range, just like `String#slice()`.
7
+
8
+ @see {ArraySlice}
9
+
10
+ @example
11
+ ```
12
+ import type {StringSlice} from 'type-fest';
13
+
14
+ StringSlice<'abcde', 0, 2>;
15
+ //=> 'ab'
16
+
17
+ StringSlice<'abcde', 1>;
18
+ //=> 'bcde'
19
+
20
+ StringSlice<'abcde', 0, -1>;
21
+ //=> 'abcd'
22
+
23
+ StringSlice<'abcde', -2, -1>;
24
+ //=> 'd'
25
+ ```
26
+
27
+ @category String
28
+ */
29
+ export type StringSlice<
30
+ S extends string,
31
+ Start extends number = 0,
32
+ End extends number = StringToArray<S>['length'],
33
+ > = string extends S
34
+ ? string
35
+ : ArraySlice<StringToArray<S>, Start, End> extends infer R extends readonly string[]
36
+ ? Join<R, ''>
37
+ : never;
@@ -0,0 +1,23 @@
1
+ /**
2
+ Create a type with the keys of the given type changed to `string` type.
3
+
4
+ Use-case: Changing interface values to strings in order to use them in a form model.
5
+
6
+ @example
7
+ ```
8
+ import type {Stringified} from 'type-fest';
9
+
10
+ type Car = {
11
+ model: string;
12
+ speed: number;
13
+ }
14
+
15
+ const carForm: Stringified<Car> = {
16
+ model: 'Foo',
17
+ speed: '101'
18
+ };
19
+ ```
20
+
21
+ @category Object
22
+ */
23
+ export type Stringified<ObjectType> = {[KeyType in keyof ObjectType]: string};
@@ -0,0 +1,92 @@
1
+ import type {TypedArray} from './typed-array';
2
+ import type {FindGlobalInstanceType} from './find-global-type';
3
+
4
+ type StructuredCloneablePrimitive =
5
+ | string
6
+ | number
7
+ | bigint
8
+ | boolean
9
+ | null
10
+ | undefined
11
+ | Boolean
12
+ | Number
13
+ | String;
14
+
15
+ type StructuredCloneableData =
16
+ | ArrayBuffer
17
+ | DataView
18
+ | Date
19
+ | Error
20
+ | RegExp
21
+ | TypedArray
22
+ | FindGlobalInstanceType<
23
+ // DOM or Node types
24
+ | 'Blob'
25
+ | 'File'
26
+ // DOM exclusive types
27
+ | 'AudioData'
28
+ | 'CropTarget'
29
+ | 'CryptoKey'
30
+ | 'DOMException'
31
+ | 'DOMMatrix'
32
+ | 'DOMMatrixReadOnly'
33
+ | 'DOMPoint'
34
+ | 'DOMPointReadOnly'
35
+ | 'DOMQuad'
36
+ | 'DOMRect'
37
+ | 'DOMRectReadOnly'
38
+ | 'FileList'
39
+ | 'FileSystemDirectoryHandle'
40
+ | 'FileSystemFileHandle'
41
+ | 'FileSystemHandle'
42
+ | 'GPUCompilationInfo'
43
+ | 'GPUCompilationMessage'
44
+ | 'ImageBitmap'
45
+ | 'ImageData'
46
+ | 'RTCCertificate'
47
+ | 'VideoFrame'
48
+ >;
49
+
50
+ type StructuredCloneableCollection =
51
+ | readonly StructuredCloneable[]
52
+ | {readonly [key: string]: StructuredCloneable; readonly [key: number]: StructuredCloneable}
53
+ | ReadonlyMap<StructuredCloneable, StructuredCloneable>
54
+ | ReadonlySet<StructuredCloneable>;
55
+
56
+ /**
57
+ Matches a value that can be losslessly cloned using `structuredClone`.
58
+
59
+ Note:
60
+ - Custom error types will be cloned as the base `Error` type
61
+
62
+ @see https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm
63
+
64
+ @example
65
+ ```
66
+ import type {StructuredCloneable} from 'type-fest';
67
+
68
+ class CustomClass {}
69
+
70
+ // @ts-expect-error
71
+ const error: StructuredCloneable = {
72
+ custom: new CustomClass(),
73
+ };
74
+
75
+ structuredClone(error);
76
+ //=> {custom: {}}
77
+
78
+ const good: StructuredCloneable = {
79
+ number: 3,
80
+ date: new Date(),
81
+ map: new Map<string, number>(),
82
+ }
83
+
84
+ good.map.set('key', 1);
85
+
86
+ structuredClone(good);
87
+ //=> {number: 3, date: Date(2022-10-17 22:22:35.920), map: Map {'key' -> 1}}
88
+ ```
89
+
90
+ @category Structured clone
91
+ */
92
+ export type StructuredCloneable = StructuredCloneablePrimitive | StructuredCloneableData | StructuredCloneableCollection;
@@ -0,0 +1,83 @@
1
+ import type {NumberAbsolute, BuildTuple, ReverseSign} from './internal';
2
+ import type {PositiveInfinity, NegativeInfinity, IsNegative} from './numeric';
3
+ import type {LessThan} from './less-than';
4
+
5
+ /**
6
+ Returns the difference between two numbers.
7
+
8
+ Note:
9
+ - A or B can only support `-999` ~ `999`.
10
+
11
+ @example
12
+ ```
13
+ import type {Subtract} from 'type-fest';
14
+
15
+ Subtract<333, 222>;
16
+ //=> 111
17
+
18
+ Subtract<111, -222>;
19
+ //=> 333
20
+
21
+ Subtract<-111, 222>;
22
+ //=> -333
23
+
24
+ Subtract<18, 96>;
25
+ //=> -78
26
+
27
+ Subtract<PositiveInfinity, 9999>;
28
+ //=> PositiveInfinity
29
+
30
+ Subtract<PositiveInfinity, PositiveInfinity>;
31
+ //=> number
32
+ ```
33
+
34
+ @category Numeric
35
+ */
36
+ // TODO: Support big integer.
37
+ export type Subtract<A extends number, B extends number> =
38
+ // Handle cases when A or B is the actual "number" type
39
+ number extends A | B ? number
40
+ // Handle cases when A and B are both +/- infinity
41
+ : A extends B & (PositiveInfinity | NegativeInfinity) ? number
42
+ // Handle cases when A is - infinity or B is + infinity
43
+ : A extends NegativeInfinity ? NegativeInfinity : B extends PositiveInfinity ? NegativeInfinity
44
+ // Handle cases when A is + infinity or B is - infinity
45
+ : A extends PositiveInfinity ? PositiveInfinity : B extends NegativeInfinity ? PositiveInfinity
46
+ // Handle case when numbers are equal to each other
47
+ : A extends B ? 0
48
+ // Handle cases when A or B is 0
49
+ : A extends 0 ? ReverseSign<B> : B extends 0 ? A
50
+ // Handle remaining regular cases
51
+ : SubtractPostChecks<A, B>;
52
+
53
+ /**
54
+ Subtracts two numbers A and B, such that they are not equal and neither of them are 0, +/- infinity or the `number` type
55
+ */
56
+ type SubtractPostChecks<A extends number, B extends number, AreNegative = [IsNegative<A>, IsNegative<B>]> =
57
+ AreNegative extends [false, false]
58
+ ? SubtractPositives<A, B>
59
+ : AreNegative extends [true, true]
60
+ // When both numbers are negative we subtract the absolute values and then reverse the sign
61
+ ? ReverseSign<SubtractPositives<NumberAbsolute<A>, NumberAbsolute<B>>>
62
+ // When the signs are different we can add the absolute values and then reverse the sign if A < B
63
+ : [...BuildTuple<NumberAbsolute<A>>, ...BuildTuple<NumberAbsolute<B>>] extends infer R extends unknown[]
64
+ ? LessThan<A, B> extends true ? ReverseSign<R['length']> : R['length']
65
+ : never;
66
+
67
+ /**
68
+ Subtracts two positive numbers.
69
+ */
70
+ type SubtractPositives<A extends number, B extends number> =
71
+ LessThan<A, B> extends true
72
+ // When A < B we can reverse the result of B - A
73
+ ? ReverseSign<SubtractIfAGreaterThanB<B, A>>
74
+ : SubtractIfAGreaterThanB<A, B>;
75
+
76
+ /**
77
+ Subtracts two positive numbers A and B such that A > B.
78
+ */
79
+ type SubtractIfAGreaterThanB<A extends number, B extends number> =
80
+ // This is where we always want to end up and do the actual subtraction
81
+ BuildTuple<A> extends [...BuildTuple<B>, ...infer R]
82
+ ? R['length']
83
+ : never;
@@ -0,0 +1,78 @@
1
+ import type {NumberAbsolute, BuildTuple, TupleMax, ReverseSign} from './internal';
2
+ import type {PositiveInfinity, NegativeInfinity, IsNegative} from './numeric';
3
+ import type {Subtract} from './subtract';
4
+
5
+ /**
6
+ Returns the sum of two numbers.
7
+
8
+ Note:
9
+ - A or B can only support `-999` ~ `999`.
10
+
11
+ @example
12
+ ```
13
+ import type {Sum} from 'type-fest';
14
+
15
+ Sum<111, 222>;
16
+ //=> 333
17
+
18
+ Sum<-111, 222>;
19
+ //=> 111
20
+
21
+ Sum<111, -222>;
22
+ //=> -111
23
+
24
+ Sum<PositiveInfinity, -9999>;
25
+ //=> PositiveInfinity
26
+
27
+ Sum<PositiveInfinity, NegativeInfinity>;
28
+ //=> number
29
+ ```
30
+
31
+ @category Numeric
32
+ */
33
+ // TODO: Support big integer.
34
+ export type Sum<A extends number, B extends number> =
35
+ // Handle cases when A or B is the actual "number" type
36
+ number extends A | B ? number
37
+ // Handle cases when A and B are both +/- infinity
38
+ : A extends B & (PositiveInfinity | NegativeInfinity) ? A // A or B could be used here as they are equal
39
+ // Handle cases when A and B are opposite infinities
40
+ : A | B extends PositiveInfinity | NegativeInfinity ? number
41
+ // Handle cases when A is +/- infinity
42
+ : A extends PositiveInfinity | NegativeInfinity ? A
43
+ // Handle cases when B is +/- infinity
44
+ : B extends PositiveInfinity | NegativeInfinity ? B
45
+ // Handle cases when A or B is 0 or it's the same number with different signs
46
+ : A extends 0 ? B : B extends 0 ? A : A extends ReverseSign<B> ? 0
47
+ // Handle remaining regular cases
48
+ : SumPostChecks<A, B>;
49
+
50
+ /**
51
+ Adds two numbers A and B, such that they are not equal with different signs and neither of them are 0, +/- infinity or the `number` type
52
+ */
53
+ type SumPostChecks<A extends number, B extends number, AreNegative = [IsNegative<A>, IsNegative<B>]> =
54
+ AreNegative extends [false, false]
55
+ // When both numbers are positive we can add them together
56
+ ? SumPositives<A, B>
57
+ : AreNegative extends [true, true]
58
+ // When both numbers are negative we add the absolute values and then reverse the sign
59
+ ? ReverseSign<SumPositives<NumberAbsolute<A>, NumberAbsolute<B>>>
60
+ // When the signs are different we can subtract the absolute values, remove the sign
61
+ // and then reverse the sign if the larger absolute value is negative
62
+ : NumberAbsolute<Subtract<NumberAbsolute<A>, NumberAbsolute<B>>> extends infer Result extends number
63
+ ? TupleMax<[NumberAbsolute<A>, NumberAbsolute<B>]> extends infer Max_ extends number
64
+ ? Max_ extends A | B
65
+ // The larger absolute value is positive, so the result is positive
66
+ ? Result
67
+ // The larger absolute value is negative, so the result is negative
68
+ : ReverseSign<Result>
69
+ : never
70
+ : never;
71
+
72
+ /**
73
+ Adds two positive numbers.
74
+ */
75
+ type SumPositives<A extends number, B extends number> =
76
+ [...BuildTuple<A>, ...BuildTuple<B>]['length'] extends infer Result extends number
77
+ ? Result
78
+ : never;