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,36 @@
1
+ /**
2
+ Given a [literal type](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#literal-types) return the {@link Primitive | primitive type} it belongs to, or `never` if it's not a primitive.
3
+
4
+ Use-case: Working with generic types that may be literal types.
5
+
6
+ @example
7
+ ```
8
+ import type {LiteralToPrimitive} from 'type-fest';
9
+
10
+ // No overloads needed to get the correct return type
11
+ function plus<T extends number | bigint | string>(x: T, y: T): LiteralToPrimitive<T> {
12
+ return x + (y as any);
13
+ }
14
+
15
+ plus('a', 'b'); // string
16
+ plus(1, 2); // number
17
+ plus(1n, 2n); // bigint
18
+ ```
19
+
20
+ @category Type
21
+ */
22
+ export type LiteralToPrimitive<T> = T extends number
23
+ ? number
24
+ : T extends bigint
25
+ ? bigint
26
+ : T extends string
27
+ ? string
28
+ : T extends boolean
29
+ ? boolean
30
+ : T extends symbol
31
+ ? symbol
32
+ : T extends null
33
+ ? null
34
+ : T extends undefined
35
+ ? undefined
36
+ : never;
@@ -0,0 +1,37 @@
1
+ import type {Primitive} from './primitive';
2
+
3
+ export type LiteralStringUnion<T> = LiteralUnion<T, string>;
4
+
5
+ /**
6
+ Allows creating a union type by combining primitive types and literal types without sacrificing auto-completion in IDEs for the literal type part of the union.
7
+
8
+ Currently, when a union type of a primitive type is combined with literal types, TypeScript loses all information about the combined literals. Thus, when such type is used in an IDE with autocompletion, no suggestions are made for the declared literals.
9
+
10
+ This type is a workaround for [Microsoft/TypeScript#29729](https://github.com/Microsoft/TypeScript/issues/29729). It will be removed as soon as it's not needed anymore.
11
+
12
+ @example
13
+ ```
14
+ import type {LiteralUnion} from 'type-fest';
15
+
16
+ // Before
17
+
18
+ type Pet = 'dog' | 'cat' | string;
19
+
20
+ const pet: Pet = '';
21
+ // Start typing in your TypeScript-enabled IDE.
22
+ // You **will not** get auto-completion for `dog` and `cat` literals.
23
+
24
+ // After
25
+
26
+ type Pet2 = LiteralUnion<'dog' | 'cat', string>;
27
+
28
+ const pet: Pet2 = '';
29
+ // You **will** get auto-completion for `dog` and `cat` literals.
30
+ ```
31
+
32
+ @category Type
33
+ */
34
+ export type LiteralUnion<
35
+ LiteralType,
36
+ BaseType extends Primitive,
37
+ > = LiteralType | (BaseType & Record<never, never>);
@@ -0,0 +1,486 @@
1
+ import type {ConditionalSimplifyDeep} from './conditional-simplify';
2
+ import type {OmitIndexSignature} from './omit-index-signature';
3
+ import type {PickIndexSignature} from './pick-index-signature';
4
+ import type {Merge} from './merge';
5
+ import type {
6
+ FirstArrayElement,
7
+ IsBothExtends,
8
+ UnknownArrayOrTuple,
9
+ } from './internal';
10
+ import type {NonEmptyTuple} from './non-empty-tuple';
11
+ import type {ArrayTail} from './array-tail';
12
+ import type {UnknownRecord} from './unknown-record';
13
+ import type {EnforceOptional} from './enforce-optional';
14
+ import type {SimplifyDeep} from './simplify-deep';
15
+ import type {UnknownArray} from './unknown-array';
16
+
17
+ type SimplifyDeepExcludeArray<T> = SimplifyDeep<T, UnknownArray>;
18
+
19
+ /**
20
+ Try to merge two record properties or return the source property value, preserving `undefined` properties values in both cases.
21
+ */
22
+ type MergeDeepRecordProperty<
23
+ Destination,
24
+ Source,
25
+ Options extends MergeDeepInternalOptions,
26
+ > = undefined extends Source
27
+ ? MergeDeepOrReturn<Source, Exclude<Destination, undefined>, Exclude<Source, undefined>, Options> | undefined
28
+ : MergeDeepOrReturn<Source, Destination, Source, Options>;
29
+
30
+ /**
31
+ Walk through the union of the keys of the two objects and test in which object the properties are defined.
32
+ Rules:
33
+ 1. If the source does not contain the key, the value of the destination is returned.
34
+ 2. If the source contains the key and the destination does not contain the key, the value of the source is returned.
35
+ 3. If both contain the key, try to merge according to the chosen {@link MergeDeepOptions options} or return the source if unable to merge.
36
+ */
37
+ type DoMergeDeepRecord<
38
+ Destination extends UnknownRecord,
39
+ Source extends UnknownRecord,
40
+ Options extends MergeDeepInternalOptions,
41
+ > =
42
+ // Case in rule 1: The destination contains the key but the source doesn't.
43
+ {
44
+ [Key in keyof Destination as Key extends keyof Source ? never : Key]: Destination[Key];
45
+ }
46
+ // Case in rule 2: The source contains the key but the destination doesn't.
47
+ & {
48
+ [Key in keyof Source as Key extends keyof Destination ? never : Key]: Source[Key];
49
+ }
50
+ // Case in rule 3: Both the source and the destination contain the key.
51
+ & {
52
+ [Key in keyof Source as Key extends keyof Destination ? Key : never]: MergeDeepRecordProperty<Destination[Key], Source[Key], Options>;
53
+ };
54
+
55
+ /**
56
+ Wrapper around {@link DoMergeDeepRecord} which preserves index signatures.
57
+ */
58
+ type MergeDeepRecord<
59
+ Destination extends UnknownRecord,
60
+ Source extends UnknownRecord,
61
+ Options extends MergeDeepInternalOptions,
62
+ > = DoMergeDeepRecord<OmitIndexSignature<Destination>, OmitIndexSignature<Source>, Options>
63
+ & Merge<PickIndexSignature<Destination>, PickIndexSignature<Source>>;
64
+
65
+ // Helper to avoid computing ArrayTail twice.
66
+ type PickRestTypeHelper<Tail extends UnknownArrayOrTuple, Type> = Tail extends [] ? Type : PickRestType<Tail>;
67
+
68
+ /**
69
+ Pick the rest type.
70
+
71
+ @example
72
+ ```
73
+ type Rest1 = PickRestType<[]>; // => []
74
+ type Rest2 = PickRestType<[string]>; // => []
75
+ type Rest3 = PickRestType<[...number[]]>; // => number[]
76
+ type Rest4 = PickRestType<[string, ...number[]]>; // => number[]
77
+ type Rest5 = PickRestType<string[]>; // => string[]
78
+ ```
79
+ */
80
+ type PickRestType<Type extends UnknownArrayOrTuple> = number extends Type['length']
81
+ ? PickRestTypeHelper<ArrayTail<Type>, Type>
82
+ : [];
83
+
84
+ // Helper to avoid computing ArrayTail twice.
85
+ type OmitRestTypeHelper<
86
+ Tail extends UnknownArrayOrTuple,
87
+ Type extends UnknownArrayOrTuple,
88
+ Result extends UnknownArrayOrTuple = [],
89
+ > = Tail extends []
90
+ ? Result
91
+ : OmitRestType<Tail, [...Result, FirstArrayElement<Type>]>;
92
+
93
+ /**
94
+ Omit the rest type.
95
+
96
+ @example
97
+ ```
98
+ type Tuple1 = OmitRestType<[]>; // => []
99
+ type Tuple2 = OmitRestType<[string]>; // => [string]
100
+ type Tuple3 = OmitRestType<[...number[]]>; // => []
101
+ type Tuple4 = OmitRestType<[string, ...number[]]>; // => [string]
102
+ type Tuple5 = OmitRestType<[string, boolean[], ...number[]]>; // => [string, boolean[]]
103
+ type Tuple6 = OmitRestType<string[]>; // => []
104
+ ```
105
+ */
106
+ type OmitRestType<Type extends UnknownArrayOrTuple, Result extends UnknownArrayOrTuple = []> = number extends Type['length']
107
+ ? OmitRestTypeHelper<ArrayTail<Type>, Type, Result>
108
+ : Type;
109
+
110
+ // Utility to avoid picking two times the type.
111
+ type TypeNumberOrType<Type extends UnknownArrayOrTuple> = Type[number] extends never ? Type : Type[number];
112
+
113
+ // Pick the rest type (array) and try to get the intrinsic type or return the provided type.
114
+ type PickRestTypeFlat<Type extends UnknownArrayOrTuple> = TypeNumberOrType<PickRestType<Type>>;
115
+
116
+ /**
117
+ Try to merge two array/tuple elements or return the source element if the end of the destination is reached or vis-versa.
118
+ */
119
+ type MergeDeepArrayOrTupleElements<
120
+ Destination,
121
+ Source,
122
+ Options extends MergeDeepInternalOptions,
123
+ > = Source extends []
124
+ ? Destination
125
+ : Destination extends []
126
+ ? Source
127
+ : MergeDeepOrReturn<Source, Destination, Source, Options>;
128
+
129
+ /**
130
+ Merge two tuples recursively.
131
+ */
132
+ type DoMergeDeepTupleAndTupleRecursive<
133
+ Destination extends UnknownArrayOrTuple,
134
+ Source extends UnknownArrayOrTuple,
135
+ DestinationRestType,
136
+ SourceRestType,
137
+ Options extends MergeDeepInternalOptions,
138
+ > = Destination extends []
139
+ ? Source extends []
140
+ ? []
141
+ : MergeArrayTypeAndTuple<DestinationRestType, Source, Options>
142
+ : Source extends []
143
+ ? MergeTupleAndArrayType<Destination, SourceRestType, Options>
144
+ : [
145
+ MergeDeepArrayOrTupleElements<FirstArrayElement<Destination>, FirstArrayElement<Source>, Options>,
146
+ ...DoMergeDeepTupleAndTupleRecursive<ArrayTail<Destination>, ArrayTail<Source>, DestinationRestType, SourceRestType, Options>,
147
+ ];
148
+
149
+ /**
150
+ Merge two tuples recursively taking into account a possible rest element.
151
+ */
152
+ type MergeDeepTupleAndTupleRecursive<
153
+ Destination extends UnknownArrayOrTuple,
154
+ Source extends UnknownArrayOrTuple,
155
+ Options extends MergeDeepInternalOptions,
156
+ > = [
157
+ ...DoMergeDeepTupleAndTupleRecursive<OmitRestType<Destination>, OmitRestType<Source>, PickRestTypeFlat<Destination>, PickRestTypeFlat<Source>, Options>,
158
+ ...MergeDeepArrayOrTupleElements<PickRestType<Destination>, PickRestType<Source>, Options>,
159
+ ];
160
+
161
+ /**
162
+ Merge an array type with a tuple recursively.
163
+ */
164
+ type MergeTupleAndArrayType<
165
+ Tuple extends UnknownArrayOrTuple,
166
+ ArrayType,
167
+ Options extends MergeDeepInternalOptions,
168
+ > = Tuple extends []
169
+ ? Tuple
170
+ : [
171
+ MergeDeepArrayOrTupleElements<FirstArrayElement<Tuple>, ArrayType, Options>,
172
+ ...MergeTupleAndArrayType<ArrayTail<Tuple>, ArrayType, Options>,
173
+ ];
174
+
175
+ /**
176
+ Merge an array into a tuple recursively taking into account a possible rest element.
177
+ */
178
+ type MergeDeepTupleAndArrayRecursive<
179
+ Destination extends UnknownArrayOrTuple,
180
+ Source extends UnknownArrayOrTuple,
181
+ Options extends MergeDeepInternalOptions,
182
+ > = [
183
+ ...MergeTupleAndArrayType<OmitRestType<Destination>, Source[number], Options>,
184
+ ...MergeDeepArrayOrTupleElements<PickRestType<Destination>, PickRestType<Source>, Options>,
185
+ ];
186
+
187
+ /**
188
+ Merge a tuple with an array type recursively.
189
+ */
190
+ type MergeArrayTypeAndTuple<
191
+ ArrayType,
192
+ Tuple extends UnknownArrayOrTuple,
193
+ Options extends MergeDeepInternalOptions,
194
+ > = Tuple extends []
195
+ ? Tuple
196
+ : [
197
+ MergeDeepArrayOrTupleElements<ArrayType, FirstArrayElement<Tuple>, Options>,
198
+ ...MergeArrayTypeAndTuple<ArrayType, ArrayTail<Tuple>, Options>,
199
+ ];
200
+
201
+ /**
202
+ Merge a tuple into an array recursively taking into account a possible rest element.
203
+ */
204
+ type MergeDeepArrayAndTupleRecursive<
205
+ Destination extends UnknownArrayOrTuple,
206
+ Source extends UnknownArrayOrTuple,
207
+ Options extends MergeDeepInternalOptions,
208
+ > = [
209
+ ...MergeArrayTypeAndTuple<Destination[number], OmitRestType<Source>, Options>,
210
+ ...MergeDeepArrayOrTupleElements<PickRestType<Destination>, PickRestType<Source>, Options>,
211
+ ];
212
+
213
+ /**
214
+ Merge mode for array/tuple elements.
215
+ */
216
+ type ArrayMergeMode = 'spread' | 'replace';
217
+
218
+ /**
219
+ Test if it should spread top-level arrays.
220
+ */
221
+ type ShouldSpread<Options extends MergeDeepInternalOptions> = Options['spreadTopLevelArrays'] extends false
222
+ ? Options['arrayMergeMode'] extends 'spread' ? true : false
223
+ : true;
224
+
225
+ /**
226
+ Merge two arrays/tuples according to the chosen {@link MergeDeepOptions.arrayMergeMode arrayMergeMode} option.
227
+ */
228
+ type DoMergeArrayOrTuple<
229
+ Destination extends UnknownArrayOrTuple,
230
+ Source extends UnknownArrayOrTuple,
231
+ Options extends MergeDeepInternalOptions,
232
+ > = ShouldSpread<Options> extends true
233
+ ? Array<Exclude<Destination, undefined>[number] | Exclude<Source, undefined>[number]>
234
+ : Source; // 'replace'
235
+
236
+ /**
237
+ Merge two arrays recursively.
238
+
239
+ If the two arrays are multi-level, we merge deeply, otherwise we merge the first level only.
240
+
241
+ Note: The `[number]` accessor is used to test the type of the second level.
242
+ */
243
+ type MergeDeepArrayRecursive<
244
+ Destination extends UnknownArrayOrTuple,
245
+ Source extends UnknownArrayOrTuple,
246
+ Options extends MergeDeepInternalOptions,
247
+ > = Destination[number] extends UnknownArrayOrTuple
248
+ ? Source[number] extends UnknownArrayOrTuple
249
+ ? Array<MergeDeepArrayOrTupleRecursive<Destination[number], Source[number], Options>>
250
+ : DoMergeArrayOrTuple<Destination, Source, Options>
251
+ : Destination[number] extends UnknownRecord
252
+ ? Source[number] extends UnknownRecord
253
+ ? Array<SimplifyDeepExcludeArray<MergeDeepRecord<Destination[number], Source[number], Options>>>
254
+ : DoMergeArrayOrTuple<Destination, Source, Options>
255
+ : DoMergeArrayOrTuple<Destination, Source, Options>;
256
+
257
+ /**
258
+ Merge two array/tuple recursively by selecting one of the four strategies according to the type of inputs.
259
+
260
+ - tuple/tuple
261
+ - tuple/array
262
+ - array/tuple
263
+ - array/array
264
+ */
265
+ type MergeDeepArrayOrTupleRecursive<
266
+ Destination extends UnknownArrayOrTuple,
267
+ Source extends UnknownArrayOrTuple,
268
+ Options extends MergeDeepInternalOptions,
269
+ > = IsBothExtends<NonEmptyTuple, Destination, Source> extends true
270
+ ? MergeDeepTupleAndTupleRecursive<Destination, Source, Options>
271
+ : Destination extends NonEmptyTuple
272
+ ? MergeDeepTupleAndArrayRecursive<Destination, Source, Options>
273
+ : Source extends NonEmptyTuple
274
+ ? MergeDeepArrayAndTupleRecursive<Destination, Source, Options>
275
+ : MergeDeepArrayRecursive<Destination, Source, Options>;
276
+
277
+ /**
278
+ Merge two array/tuple according to {@link MergeDeepOptions.recurseIntoArrays recurseIntoArrays} option.
279
+ */
280
+ type MergeDeepArrayOrTuple<
281
+ Destination extends UnknownArrayOrTuple,
282
+ Source extends UnknownArrayOrTuple,
283
+ Options extends MergeDeepInternalOptions,
284
+ > = Options['recurseIntoArrays'] extends true
285
+ ? MergeDeepArrayOrTupleRecursive<Destination, Source, Options>
286
+ : DoMergeArrayOrTuple<Destination, Source, Options>;
287
+
288
+ /**
289
+ Try to merge two objects or two arrays/tuples recursively into a new type or return the default value.
290
+ */
291
+ type MergeDeepOrReturn<
292
+ DefaultType,
293
+ Destination,
294
+ Source,
295
+ Options extends MergeDeepInternalOptions,
296
+ > = SimplifyDeepExcludeArray<[undefined] extends [Destination | Source]
297
+ ? DefaultType
298
+ : Destination extends UnknownRecord
299
+ ? Source extends UnknownRecord
300
+ ? MergeDeepRecord<Destination, Source, Options>
301
+ : DefaultType
302
+ : Destination extends UnknownArrayOrTuple
303
+ ? Source extends UnknownArrayOrTuple
304
+ ? MergeDeepArrayOrTuple<Destination, Source, EnforceOptional<Merge<Options, {spreadTopLevelArrays: false}>>>
305
+ : DefaultType
306
+ : DefaultType>;
307
+
308
+ /**
309
+ MergeDeep options.
310
+
311
+ @see {@link MergeDeep}
312
+ */
313
+ export type MergeDeepOptions = {
314
+ /**
315
+ Merge mode for array and tuple.
316
+
317
+ When we walk through the properties of the objects and the same key is found and both are array or tuple, a merge mode must be chosen:
318
+ - `replace`: Replaces the destination value by the source value. This is the default mode.
319
+ - `spread`: Spreads the destination and the source values.
320
+
321
+ See {@link MergeDeep} for usages and examples.
322
+
323
+ Note: Top-level arrays and tuples are always spread.
324
+
325
+ @default 'replace'
326
+ */
327
+ arrayMergeMode?: ArrayMergeMode;
328
+
329
+ /**
330
+ Whether to affect the individual elements of arrays and tuples.
331
+
332
+ If this option is set to `true` the following rules are applied:
333
+ - If the source does not contain the key, the value of the destination is returned.
334
+ - If the source contains the key and the destination does not contain the key, the value of the source is returned.
335
+ - If both contain the key, try to merge according to the chosen {@link MergeDeepOptions.arrayMergeMode arrayMergeMode} or return the source if unable to merge.
336
+
337
+ @default false
338
+ */
339
+ recurseIntoArrays?: boolean;
340
+ };
341
+
342
+ /**
343
+ Internal options.
344
+ */
345
+ type MergeDeepInternalOptions = Merge<MergeDeepOptions, {spreadTopLevelArrays?: boolean}>;
346
+
347
+ /**
348
+ Merge default and internal options with user provided options.
349
+ */
350
+ type DefaultMergeDeepOptions<Options extends MergeDeepOptions> = Merge<{
351
+ arrayMergeMode: 'replace';
352
+ recurseIntoArrays: false;
353
+ spreadTopLevelArrays: true;
354
+ }, Options>;
355
+
356
+ /**
357
+ This utility selects the correct entry point with the corresponding default options. This avoids re-merging the options at each iteration.
358
+ */
359
+ type MergeDeepWithDefaultOptions<Destination, Source, Options extends MergeDeepOptions> = SimplifyDeepExcludeArray<
360
+ [undefined] extends [Destination | Source]
361
+ ? never
362
+ : Destination extends UnknownRecord
363
+ ? Source extends UnknownRecord
364
+ ? MergeDeepRecord<Destination, Source, DefaultMergeDeepOptions<Options>>
365
+ : never
366
+ : Destination extends UnknownArrayOrTuple
367
+ ? Source extends UnknownArrayOrTuple
368
+ ? MergeDeepArrayOrTuple<Destination, Source, DefaultMergeDeepOptions<Options>>
369
+ : never
370
+ : never
371
+ >;
372
+
373
+ /**
374
+ Merge two objects or two arrays/tuples recursively into a new type.
375
+
376
+ - Properties that only exist in one object are copied into the new object.
377
+ - Properties that exist in both objects are merged if possible or replaced by the one of the source if not.
378
+ - Top-level arrays and tuples are always spread.
379
+ - By default, inner arrays and tuples are replaced. See {@link MergeDeepOptions.arrayMergeMode arrayMergeMode} option to change this behaviour.
380
+ - By default, individual array/tuple elements are not affected. See {@link MergeDeepOptions.recurseIntoArrays recurseIntoArrays} option to change this behaviour.
381
+
382
+ @example
383
+ ```
384
+ import type {MergeDeep} from 'type-fest';
385
+
386
+ type Foo = {
387
+ life: number;
388
+ items: string[];
389
+ a: {b: string; c: boolean; d: number[]};
390
+ };
391
+
392
+ interface Bar {
393
+ name: string;
394
+ items: number[];
395
+ a: {b: number; d: boolean[]};
396
+ }
397
+
398
+ type FooBar = MergeDeep<Foo, Bar>;
399
+ // {
400
+ // life: number;
401
+ // name: string;
402
+ // items: number[];
403
+ // a: {b: number; c: boolean; d: boolean[]};
404
+ // }
405
+
406
+ type FooBar = MergeDeep<Foo, Bar, {arrayMergeMode: 'spread'}>;
407
+ // {
408
+ // life: number;
409
+ // name: string;
410
+ // items: (string | number)[];
411
+ // a: {b: number; c: boolean; d: (number | boolean)[]};
412
+ // }
413
+ ```
414
+
415
+ @example
416
+ ```
417
+ import type {MergeDeep} from 'type-fest';
418
+
419
+ // Merge two arrays
420
+ type ArrayMerge = MergeDeep<string[], number[]>; // => (string | number)[]
421
+
422
+ // Merge two tuples
423
+ type TupleMerge = MergeDeep<[1, 2, 3], ['a', 'b']>; // => (1 | 2 | 3 | 'a' | 'b')[]
424
+
425
+ // Merge an array into a tuple
426
+ type TupleArrayMerge = MergeDeep<[1, 2, 3], string[]>; // => (string | 1 | 2 | 3)[]
427
+
428
+ // Merge a tuple into an array
429
+ type ArrayTupleMerge = MergeDeep<number[], ['a', 'b']>; // => (number | 'b' | 'a')[]
430
+ ```
431
+
432
+ @example
433
+ ```
434
+ import type {MergeDeep, MergeDeepOptions} from 'type-fest';
435
+
436
+ type Foo = {foo: 'foo'; fooBar: string[]};
437
+ type Bar = {bar: 'bar'; fooBar: number[]};
438
+
439
+ type FooBar = MergeDeep<Foo, Bar>;
440
+ // { foo: "foo"; bar: "bar"; fooBar: number[]}
441
+
442
+ type FooBarSpread = MergeDeep<Foo, Bar, {arrayMergeMode: 'spread'}>;
443
+ // { foo: "foo"; bar: "bar"; fooBar: (string | number)[]}
444
+
445
+ type FooBarArray = MergeDeep<Foo[], Bar[]>;
446
+ // (Foo | Bar)[]
447
+
448
+ type FooBarArrayDeep = MergeDeep<Foo[], Bar[], {recurseIntoArrays: true}>;
449
+ // FooBar[]
450
+
451
+ type FooBarArraySpreadDeep = MergeDeep<Foo[], Bar[], {recurseIntoArrays: true; arrayMergeMode: 'spread'}>;
452
+ // FooBarSpread[]
453
+
454
+ type FooBarTupleDeep = MergeDeep<[Foo, true, 42], [Bar, 'life'], {recurseIntoArrays: true}>;
455
+ // [FooBar, 'life', 42]
456
+
457
+ type FooBarTupleWithArrayDeep = MergeDeep<[Foo[], true], [Bar[], 'life', 42], {recurseIntoArrays: true}>;
458
+ // [FooBar[], 'life', 42]
459
+ ```
460
+
461
+ @example
462
+ ```
463
+ import type {MergeDeep, MergeDeepOptions} from 'type-fest';
464
+
465
+ function mergeDeep<Destination, Source, Options extends MergeDeepOptions = {}>(
466
+ destination: Destination,
467
+ source: Source,
468
+ options?: Options,
469
+ ): MergeDeep<Destination, Source, Options> {
470
+ // Make your implementation ...
471
+ }
472
+ ```
473
+
474
+ @experimental This type is marked as experimental because it depends on {@link ConditionalSimplifyDeep} which itself is experimental.
475
+
476
+ @see {@link MergeDeepOptions}
477
+
478
+ @category Array
479
+ @category Object
480
+ @category Utilities
481
+ */
482
+ export type MergeDeep<Destination, Source, Options extends MergeDeepOptions = {}> = MergeDeepWithDefaultOptions<
483
+ SimplifyDeepExcludeArray<Destination>,
484
+ SimplifyDeepExcludeArray<Source>,
485
+ Options
486
+ >;
@@ -0,0 +1,41 @@
1
+ // Helper type. Not useful on its own.
2
+ type Without<FirstType, SecondType> = {[KeyType in Exclude<keyof FirstType, keyof SecondType>]?: never};
3
+
4
+ /**
5
+ Create a type that has mutually exclusive keys.
6
+
7
+ This type was inspired by [this comment](https://github.com/Microsoft/TypeScript/issues/14094#issuecomment-373782604).
8
+
9
+ This type works with a helper type, called `Without`. `Without<FirstType, SecondType>` produces a type that has only keys from `FirstType` which are not present on `SecondType` and sets the value type for these keys to `never`. This helper type is then used in `MergeExclusive` to remove keys from either `FirstType` or `SecondType`.
10
+
11
+ @example
12
+ ```
13
+ import type {MergeExclusive} from 'type-fest';
14
+
15
+ interface ExclusiveVariation1 {
16
+ exclusive1: boolean;
17
+ }
18
+
19
+ interface ExclusiveVariation2 {
20
+ exclusive2: string;
21
+ }
22
+
23
+ type ExclusiveOptions = MergeExclusive<ExclusiveVariation1, ExclusiveVariation2>;
24
+
25
+ let exclusiveOptions: ExclusiveOptions;
26
+
27
+ exclusiveOptions = {exclusive1: true};
28
+ //=> Works
29
+ exclusiveOptions = {exclusive2: 'hi'};
30
+ //=> Works
31
+ exclusiveOptions = {exclusive1: true, exclusive2: 'hi'};
32
+ //=> Error
33
+ ```
34
+
35
+ @category Object
36
+ */
37
+ export type MergeExclusive<FirstType, SecondType> =
38
+ (FirstType | SecondType) extends object ?
39
+ (Without<FirstType, SecondType> & SecondType) | (Without<SecondType, FirstType> & FirstType) :
40
+ FirstType | SecondType;
41
+
@@ -0,0 +1,48 @@
1
+ import type {OmitIndexSignature} from './omit-index-signature';
2
+ import type {PickIndexSignature} from './pick-index-signature';
3
+ import type {Simplify} from './simplify';
4
+
5
+ // Merges two objects without worrying about index signatures.
6
+ type SimpleMerge<Destination, Source> = {
7
+ [Key in keyof Destination as Key extends keyof Source ? never : Key]: Destination[Key];
8
+ } & Source;
9
+
10
+ /**
11
+ Merge two types into a new type. Keys of the second type overrides keys of the first type.
12
+
13
+ @example
14
+ ```
15
+ import type {Merge} from 'type-fest';
16
+
17
+ interface Foo {
18
+ [x: string]: unknown;
19
+ [x: number]: unknown;
20
+ foo: string;
21
+ bar: symbol;
22
+ }
23
+
24
+ type Bar = {
25
+ [x: number]: number;
26
+ [x: symbol]: unknown;
27
+ bar: Date;
28
+ baz: boolean;
29
+ };
30
+
31
+ export type FooBar = Merge<Foo, Bar>;
32
+ // => {
33
+ // [x: string]: unknown;
34
+ // [x: number]: number;
35
+ // [x: symbol]: unknown;
36
+ // foo: string;
37
+ // bar: Date;
38
+ // baz: boolean;
39
+ // }
40
+ ```
41
+
42
+ @category Object
43
+ */
44
+ export type Merge<Destination, Source> =
45
+ Simplify<
46
+ SimpleMerge<PickIndexSignature<Destination>, PickIndexSignature<Source>>
47
+ & SimpleMerge<OmitIndexSignature<Destination>, OmitIndexSignature<Source>>
48
+ >;
@@ -0,0 +1,44 @@
1
+ import type {Subtract} from './subtract';
2
+ import type {IsEqual} from './is-equal';
3
+
4
+ type Recursive<T> = Array<Recursive<T>>;
5
+
6
+ /**
7
+ Creates a type that represents a multidimensional array of the given type and dimension.
8
+
9
+ Use-cases:
10
+ - Return a n-dimensional array from functions.
11
+ - Declare a n-dimensional array by defining its dimensions rather than declaring `[]` repetitively.
12
+ - Infer the dimensions of a n-dimensional array automatically from function arguments.
13
+ - Avoid the need to know in advance the dimensions of a n-dimensional array allowing them to be dynamic.
14
+
15
+ @example
16
+ ```
17
+ import type {MultidimensionalArray} from 'type-fest';
18
+
19
+ function emptyMatrix<T extends number>(dimensions: T): MultidimensionalArray<unknown, T> {
20
+ const matrix: unknown[] = [];
21
+
22
+ let subMatrix = matrix;
23
+ for (let dimension = 1; dimension < dimensions; ++dimension) {
24
+ console.log(`Initializing dimension #${dimension}`);
25
+
26
+ subMatrix[0] = [];
27
+ subMatrix = subMatrix[0] as unknown[];
28
+ }
29
+
30
+ return matrix as MultidimensionalArray<unknown, T>;
31
+ }
32
+
33
+ const matrix = emptyMatrix(3);
34
+
35
+ matrix[0][0][0] = 42;
36
+ ```
37
+
38
+ @category Array
39
+ */
40
+ export type MultidimensionalArray<Element, Dimensions extends number> = number extends Dimensions
41
+ ? Recursive<Element>
42
+ : IsEqual<Dimensions, 0> extends true
43
+ ? Element
44
+ : Array<MultidimensionalArray<Element, Subtract<Dimensions, 1>>>;