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,149 @@
1
+ import type {BuildObject, BuildTuple, NonRecursiveType, ObjectValue} from './internal';
2
+ import type {IsNever} from './is-never';
3
+ import type {Paths} from './paths';
4
+ import type {Simplify} from './simplify.d';
5
+ import type {UnionToIntersection} from './union-to-intersection.d';
6
+ import type {UnknownArray} from './unknown-array';
7
+
8
+ /**
9
+ Pick properties from a deeply-nested object.
10
+
11
+ It supports recursing into arrays.
12
+
13
+ Use-case: Distill complex objects down to the components you need to target.
14
+
15
+ @example
16
+ ```
17
+ import type {PickDeep, PartialDeep} from 'type-fest';
18
+
19
+ type Configuration = {
20
+ userConfig: {
21
+ name: string;
22
+ age: number;
23
+ address: [
24
+ {
25
+ city1: string;
26
+ street1: string;
27
+ },
28
+ {
29
+ city2: string;
30
+ street2: string;
31
+ }
32
+ ]
33
+ };
34
+ otherConfig: any;
35
+ };
36
+
37
+ type NameConfig = PickDeep<Configuration, 'userConfig.name'>;
38
+ // type NameConfig = {
39
+ // userConfig: {
40
+ // name: string;
41
+ // }
42
+ // };
43
+
44
+ // Supports optional properties
45
+ type User = PickDeep<PartialDeep<Configuration>, 'userConfig.name' | 'userConfig.age'>;
46
+ // type User = {
47
+ // userConfig?: {
48
+ // name?: string;
49
+ // age?: number;
50
+ // };
51
+ // };
52
+
53
+ // Supports array
54
+ type AddressConfig = PickDeep<Configuration, 'userConfig.address.0'>;
55
+ // type AddressConfig = {
56
+ // userConfig: {
57
+ // address: [{
58
+ // city1: string;
59
+ // street1: string;
60
+ // }];
61
+ // };
62
+ // }
63
+
64
+ // Supports recurse into array
65
+ type Street = PickDeep<Configuration, 'userConfig.address.1.street2'>;
66
+ // type Street = {
67
+ // userConfig: {
68
+ // address: [
69
+ // unknown,
70
+ // {street2: string}
71
+ // ];
72
+ // };
73
+ // }
74
+ ```
75
+
76
+ @category Object
77
+ @category Array
78
+ */
79
+ export type PickDeep<T, PathUnion extends Paths<T>> =
80
+ T extends NonRecursiveType
81
+ ? never
82
+ : T extends UnknownArray
83
+ ? UnionToIntersection<{
84
+ [P in PathUnion]: InternalPickDeep<T, P>;
85
+ }[PathUnion]
86
+ >
87
+ : T extends object
88
+ ? Simplify<UnionToIntersection<{
89
+ [P in PathUnion]: InternalPickDeep<T, P>;
90
+ }[PathUnion]>>
91
+ : never;
92
+
93
+ /**
94
+ Pick an object/array from the given object/array by one path.
95
+ */
96
+ type InternalPickDeep<T, Path extends string | number> =
97
+ T extends NonRecursiveType
98
+ ? never
99
+ : T extends UnknownArray ? PickDeepArray<T, Path>
100
+ : T extends object ? Simplify<PickDeepObject<T, Path>>
101
+ : never;
102
+
103
+ /**
104
+ Pick an object from the given object by one path.
105
+ */
106
+ type PickDeepObject<RecordType extends object, P extends string | number> =
107
+ P extends `${infer RecordKeyInPath}.${infer SubPath}`
108
+ ? ObjectValue<RecordType, RecordKeyInPath> extends infer ObjectV
109
+ ? IsNever<ObjectV> extends false
110
+ ? BuildObject<RecordKeyInPath, InternalPickDeep<NonNullable<ObjectV>, SubPath>, RecordType>
111
+ : never
112
+ : never
113
+ : ObjectValue<RecordType, P> extends infer ObjectV
114
+ ? IsNever<ObjectV> extends false
115
+ ? BuildObject<P, ObjectV, RecordType>
116
+ : never
117
+ : never;
118
+
119
+ /**
120
+ Pick an array from the given array by one path.
121
+ */
122
+ type PickDeepArray<ArrayType extends UnknownArray, P extends string | number> =
123
+ // Handle paths that are `${number}.${string}`
124
+ P extends `${infer ArrayIndex extends number}.${infer SubPath}`
125
+ // When `ArrayIndex` is equal to `number`
126
+ ? number extends ArrayIndex
127
+ ? ArrayType extends unknown[]
128
+ ? Array<InternalPickDeep<NonNullable<ArrayType[number]>, SubPath>>
129
+ : ArrayType extends readonly unknown[]
130
+ ? ReadonlyArray<InternalPickDeep<NonNullable<ArrayType[number]>, SubPath>>
131
+ : never
132
+ // When `ArrayIndex` is a number literal
133
+ : ArrayType extends unknown[]
134
+ ? [...BuildTuple<ArrayIndex>, InternalPickDeep<NonNullable<ArrayType[ArrayIndex]>, SubPath>]
135
+ : ArrayType extends readonly unknown[]
136
+ ? readonly [...BuildTuple<ArrayIndex>, InternalPickDeep<NonNullable<ArrayType[ArrayIndex]>, SubPath>]
137
+ : never
138
+ // When the path is equal to `number`
139
+ : P extends `${infer ArrayIndex extends number}`
140
+ // When `ArrayIndex` is `number`
141
+ ? number extends ArrayIndex
142
+ ? ArrayType
143
+ // When `ArrayIndex` is a number literal
144
+ : ArrayType extends unknown[]
145
+ ? [...BuildTuple<ArrayIndex>, ArrayType[ArrayIndex]]
146
+ : ArrayType extends readonly unknown[]
147
+ ? readonly [...BuildTuple<ArrayIndex>, ArrayType[ArrayIndex]]
148
+ : never
149
+ : never;
@@ -0,0 +1,50 @@
1
+ /**
2
+ Pick only index signatures from the given object type, leaving out all explicitly defined properties.
3
+
4
+ This is the counterpart of `OmitIndexSignature`.
5
+
6
+ @example
7
+ ```
8
+ import type {PickIndexSignature} from 'type-fest';
9
+
10
+ declare const symbolKey: unique symbol;
11
+
12
+ type Example = {
13
+ // These index signatures will remain.
14
+ [x: string]: unknown;
15
+ [x: number]: unknown;
16
+ [x: symbol]: unknown;
17
+ [x: `head-${string}`]: string;
18
+ [x: `${string}-tail`]: string;
19
+ [x: `head-${string}-tail`]: string;
20
+ [x: `${bigint}`]: string;
21
+ [x: `embedded-${number}`]: string;
22
+
23
+ // These explicitly defined keys will be removed.
24
+ ['kebab-case-key']: string;
25
+ [symbolKey]: string;
26
+ foo: 'bar';
27
+ qux?: 'baz';
28
+ };
29
+
30
+ type ExampleIndexSignature = PickIndexSignature<Example>;
31
+ // {
32
+ // [x: string]: unknown;
33
+ // [x: number]: unknown;
34
+ // [x: symbol]: unknown;
35
+ // [x: `head-${string}`]: string;
36
+ // [x: `${string}-tail`]: string;
37
+ // [x: `head-${string}-tail`]: string;
38
+ // [x: `${bigint}`]: string;
39
+ // [x: `embedded-${number}`]: string;
40
+ // }
41
+ ```
42
+
43
+ @see OmitIndexSignature
44
+ @category Object
45
+ */
46
+ export type PickIndexSignature<ObjectType> = {
47
+ [KeyType in keyof ObjectType as {} extends Record<KeyType, unknown>
48
+ ? KeyType
49
+ : never]: ObjectType[KeyType];
50
+ };
@@ -0,0 +1,13 @@
1
+ /**
2
+ Matches any [primitive value](https://developer.mozilla.org/en-US/docs/Glossary/Primitive).
3
+
4
+ @category Type
5
+ */
6
+ export type Primitive =
7
+ | null
8
+ | undefined
9
+ | string
10
+ | number
11
+ | boolean
12
+ | symbol
13
+ | bigint;
@@ -0,0 +1,25 @@
1
+ /**
2
+ Create a type that represents either the value or the value wrapped in `PromiseLike`.
3
+
4
+ Use-cases:
5
+ - A function accepts a callback that may either return a value synchronously or may return a promised value.
6
+ - This type could be the return type of `Promise#then()`, `Promise#catch()`, and `Promise#finally()` callbacks.
7
+
8
+ Please upvote [this issue](https://github.com/microsoft/TypeScript/issues/31394) if you want to have this type as a built-in in TypeScript.
9
+
10
+ @example
11
+ ```
12
+ import type {Promisable} from 'type-fest';
13
+
14
+ async function logger(getLogEntry: () => Promisable<string>): Promise<void> {
15
+ const entry = await getLogEntry();
16
+ console.log(entry);
17
+ }
18
+
19
+ logger(() => 'foo');
20
+ logger(() => Promise.resolve('bar'));
21
+ ```
22
+
23
+ @category Async
24
+ */
25
+ export type Promisable<T> = T | PromiseLike<T>;
@@ -0,0 +1,81 @@
1
+ import type {BuiltIns, HasMultipleCallSignatures} from './internal';
2
+
3
+ /**
4
+ Convert `object`s, `Map`s, `Set`s, and `Array`s and all of their keys/elements into immutable structures recursively.
5
+
6
+ This is useful when a deeply nested structure needs to be exposed as completely immutable, for example, an imported JSON module or when receiving an API response that is passed around.
7
+
8
+ Please upvote [this issue](https://github.com/microsoft/TypeScript/issues/13923) if you want to have this type as a built-in in TypeScript.
9
+
10
+ @example
11
+ ```
12
+ // data.json
13
+ {
14
+ "foo": ["bar"]
15
+ }
16
+
17
+ // main.ts
18
+ import type {ReadonlyDeep} from 'type-fest';
19
+ import dataJson = require('./data.json');
20
+
21
+ const data: ReadonlyDeep<typeof dataJson> = dataJson;
22
+
23
+ export default data;
24
+
25
+ // test.ts
26
+ import data from './main';
27
+
28
+ data.foo.push('bar');
29
+ //=> error TS2339: Property 'push' does not exist on type 'readonly string[]'
30
+ ```
31
+
32
+ Note that types containing overloaded functions are not made deeply readonly due to a [TypeScript limitation](https://github.com/microsoft/TypeScript/issues/29732).
33
+
34
+ @category Object
35
+ @category Array
36
+ @category Set
37
+ @category Map
38
+ */
39
+ export type ReadonlyDeep<T> = T extends BuiltIns
40
+ ? T
41
+ : T extends new (...arguments_: any[]) => unknown
42
+ ? T // Skip class constructors
43
+ : T extends (...arguments_: any[]) => unknown
44
+ ? {} extends ReadonlyObjectDeep<T>
45
+ ? T
46
+ : HasMultipleCallSignatures<T> extends true
47
+ ? T
48
+ : ((...arguments_: Parameters<T>) => ReturnType<T>) & ReadonlyObjectDeep<T>
49
+ : T extends Readonly<ReadonlyMap<infer KeyType, infer ValueType>>
50
+ ? ReadonlyMapDeep<KeyType, ValueType>
51
+ : T extends Readonly<ReadonlySet<infer ItemType>>
52
+ ? ReadonlySetDeep<ItemType>
53
+ : // Identify tuples to avoid converting them to arrays inadvertently; special case `readonly [...never[]]`, as it emerges undesirably from recursive invocations of ReadonlyDeep below.
54
+ T extends readonly [] | readonly [...never[]]
55
+ ? readonly []
56
+ : T extends readonly [infer U, ...infer V]
57
+ ? readonly [ReadonlyDeep<U>, ...ReadonlyDeep<V>]
58
+ : T extends readonly [...infer U, infer V]
59
+ ? readonly [...ReadonlyDeep<U>, ReadonlyDeep<V>]
60
+ : T extends ReadonlyArray<infer ItemType>
61
+ ? ReadonlyArray<ReadonlyDeep<ItemType>>
62
+ : T extends object
63
+ ? ReadonlyObjectDeep<T>
64
+ : unknown;
65
+
66
+ /**
67
+ Same as `ReadonlyDeep`, but accepts only `ReadonlyMap`s as inputs. Internal helper for `ReadonlyDeep`.
68
+ */
69
+ type ReadonlyMapDeep<KeyType, ValueType> = {} & Readonly<ReadonlyMap<ReadonlyDeep<KeyType>, ReadonlyDeep<ValueType>>>;
70
+
71
+ /**
72
+ Same as `ReadonlyDeep`, but accepts only `ReadonlySet`s as inputs. Internal helper for `ReadonlyDeep`.
73
+ */
74
+ type ReadonlySetDeep<ItemType> = {} & Readonly<ReadonlySet<ReadonlyDeep<ItemType>>>;
75
+
76
+ /**
77
+ Same as `ReadonlyDeep`, but accepts only `object`s as inputs. Internal helper for `ReadonlyDeep`.
78
+ */
79
+ type ReadonlyObjectDeep<ObjectType extends object> = {
80
+ readonly [KeyType in keyof ObjectType]: ReadonlyDeep<ObjectType[KeyType]>
81
+ };
@@ -0,0 +1,30 @@
1
+ import type {WritableKeysOf} from './writable-keys-of';
2
+
3
+ /**
4
+ Extract all readonly keys from the given type.
5
+
6
+ This is useful when you want to create a new type that contains readonly keys only.
7
+
8
+ @example
9
+ ```
10
+ import type {ReadonlyKeysOf} from 'type-fest';
11
+
12
+ interface User {
13
+ name: string;
14
+ surname: string;
15
+ readonly id: number;
16
+ }
17
+
18
+ type UpdateResponse<Entity extends object> = Pick<Entity, ReadonlyKeysOf<Entity>>;
19
+
20
+ const update1: UpdateResponse<User> = {
21
+ id: 123,
22
+ };
23
+ ```
24
+
25
+ @category Utilities
26
+ */
27
+ export type ReadonlyKeysOf<T> =
28
+ T extends unknown // For distributing `T`
29
+ ? Exclude<keyof T, WritableKeysOf<T>>
30
+ : never; // Should never happen
@@ -0,0 +1,41 @@
1
+ /**
2
+ Creates a read-only tuple of type `Element` and with the length of `Length`.
3
+
4
+ @private
5
+ @see `ReadonlyTuple` which is safer because it tests if `Length` is a specific finite number.
6
+ */
7
+ type BuildTupleHelper<Element, Length extends number, Rest extends Element[]> =
8
+ Rest['length'] extends Length ?
9
+ readonly [...Rest] : // Terminate with readonly array (aka tuple)
10
+ BuildTupleHelper<Element, Length, [Element, ...Rest]>;
11
+
12
+ /**
13
+ Create a type that represents a read-only tuple of the given type and length.
14
+
15
+ Use-cases:
16
+ - Declaring fixed-length tuples with a large number of items.
17
+ - Creating a range union (for example, `0 | 1 | 2 | 3 | 4` from the keys of such a type) without having to resort to recursive types.
18
+ - Creating a tuple of coordinates with a static length, for example, length of 3 for a 3D vector.
19
+
20
+ @example
21
+ ```
22
+ import {ReadonlyTuple} from 'type-fest';
23
+
24
+ type FencingTeam = ReadonlyTuple<string, 3>;
25
+
26
+ const guestFencingTeam: FencingTeam = ['Josh', 'Michael', 'Robert'];
27
+
28
+ const homeFencingTeam: FencingTeam = ['George', 'John'];
29
+ //=> error TS2322: Type string[] is not assignable to type 'FencingTeam'
30
+
31
+ guestFencingTeam.push('Sam');
32
+ //=> error TS2339: Property 'push' does not exist on type 'FencingTeam'
33
+ ```
34
+
35
+ @category Utilities
36
+ */
37
+ export type ReadonlyTuple<Element, Length extends number> =
38
+ number extends Length
39
+ // Because `Length extends number` and `number extends Length`, then `Length` is not a specific finite number.
40
+ ? readonly Element[] // It's not fixed length.
41
+ : BuildTupleHelper<Element, Length, []>; // Otherwise it is a fixed length tuple.
@@ -0,0 +1,85 @@
1
+ import type {ApplyDefaultOptions} from './internal';
2
+
3
+ type ReplaceOptions = {
4
+ all?: boolean;
5
+ };
6
+
7
+ type DefaultReplaceOptions = {
8
+ all: false;
9
+ };
10
+
11
+ /**
12
+ Represents a string with some or all matches replaced by a replacement.
13
+
14
+ Use-case:
15
+ - `kebab-case-path` to `dotted.path.notation`
16
+ - Changing date/time format: `01-08-2042` → `01/08/2042`
17
+ - Manipulation of type properties, for example, removal of prefixes
18
+
19
+ @example
20
+ ```
21
+ import {Replace} from 'type-fest';
22
+
23
+ declare function replace<
24
+ Input extends string,
25
+ Search extends string,
26
+ Replacement extends string
27
+ >(
28
+ input: Input,
29
+ search: Search,
30
+ replacement: Replacement
31
+ ): Replace<Input, Search, Replacement>;
32
+
33
+ declare function replaceAll<
34
+ Input extends string,
35
+ Search extends string,
36
+ Replacement extends string
37
+ >(
38
+ input: Input,
39
+ search: Search,
40
+ replacement: Replacement
41
+ ): Replace<Input, Search, Replacement, {all: true}>;
42
+
43
+ // The return type is the exact string literal, not just `string`.
44
+
45
+ replace('hello ?', '?', '🦄');
46
+ //=> 'hello 🦄'
47
+
48
+ replace('hello ??', '?', '❓');
49
+ //=> 'hello ❓?'
50
+
51
+ replaceAll('10:42:00', ':', '-');
52
+ //=> '10-42-00'
53
+
54
+ replaceAll('__userName__', '__', '');
55
+ //=> 'userName'
56
+
57
+ replaceAll('My Cool Title', ' ', '');
58
+ //=> 'MyCoolTitle'
59
+ ```
60
+
61
+ @category String
62
+ @category Template literal
63
+ */
64
+ export type Replace<
65
+ Input extends string,
66
+ Search extends string,
67
+ Replacement extends string,
68
+ Options extends ReplaceOptions = {},
69
+ > = _Replace<Input, Search, Replacement, ApplyDefaultOptions<ReplaceOptions, DefaultReplaceOptions, Options>>;
70
+
71
+ type _Replace<
72
+ Input extends string,
73
+ Search extends string,
74
+ Replacement extends string,
75
+ Options extends Required<ReplaceOptions>,
76
+ Accumulator extends string = '',
77
+ > = Search extends string // For distributing `Search`
78
+ ? Replacement extends string // For distributing `Replacement`
79
+ ? Input extends `${infer Head}${Search}${infer Tail}`
80
+ ? Options['all'] extends true
81
+ ? _Replace<Tail, Search, Replacement, Options, `${Accumulator}${Head}${Replacement}`>
82
+ : `${Head}${Replacement}${Tail}`
83
+ : `${Accumulator}${Input}`
84
+ : never
85
+ : never;
@@ -0,0 +1,51 @@
1
+ import type {IfAny} from './if-any';
2
+ import type {IfNever} from './if-never';
3
+ import type {IfNotAnyOrNever, RequireNone} from './internal';
4
+
5
+ /**
6
+ Requires all of the keys in the given object.
7
+ */
8
+ type RequireAll<ObjectType, KeysType extends keyof ObjectType> = Required<Pick<ObjectType, KeysType>>;
9
+
10
+ /**
11
+ Create a type that requires all of the given keys or none of the given keys. The remaining keys are kept as is.
12
+
13
+ Use-cases:
14
+ - Creating interfaces for components with mutually-inclusive keys.
15
+
16
+ The caveat with `RequireAllOrNone` is that TypeScript doesn't always know at compile time every key that will exist at runtime. Therefore `RequireAllOrNone` can't do anything to prevent extra keys it doesn't know about.
17
+
18
+ @example
19
+ ```
20
+ import type {RequireAllOrNone} from 'type-fest';
21
+
22
+ type Responder = {
23
+ text?: () => string;
24
+ json?: () => string;
25
+ secure: boolean;
26
+ };
27
+
28
+ const responder1: RequireAllOrNone<Responder, 'text' | 'json'> = {
29
+ secure: true
30
+ };
31
+
32
+ const responder2: RequireAllOrNone<Responder, 'text' | 'json'> = {
33
+ text: () => '{"message": "hi"}',
34
+ json: () => '{"message": "ok"}',
35
+ secure: true
36
+ };
37
+ ```
38
+
39
+ @category Object
40
+ */
41
+ export type RequireAllOrNone<ObjectType, KeysType extends keyof ObjectType = keyof ObjectType> =
42
+ IfNotAnyOrNever<ObjectType,
43
+ IfNever<KeysType,
44
+ ObjectType,
45
+ _RequireAllOrNone<ObjectType, IfAny<KeysType, keyof ObjectType, KeysType>>
46
+ >>;
47
+
48
+ type _RequireAllOrNone<ObjectType, KeysType extends keyof ObjectType> = (
49
+ | RequireAll<ObjectType, KeysType>
50
+ | RequireNone<KeysType>
51
+ ) & Omit<ObjectType, KeysType>; // The rest of the keys.
@@ -0,0 +1,47 @@
1
+ import type {Except} from './except';
2
+ import type {IfAny} from './if-any';
3
+ import type {IfNever} from './if-never';
4
+ import type {IfNotAnyOrNever} from './internal';
5
+
6
+ /**
7
+ Create a type that requires at least one of the given keys. The remaining keys are kept as is.
8
+
9
+ @example
10
+ ```
11
+ import type {RequireAtLeastOne} from 'type-fest';
12
+
13
+ type Responder = {
14
+ text?: () => string;
15
+ json?: () => string;
16
+ secure?: boolean;
17
+ };
18
+
19
+ const responder: RequireAtLeastOne<Responder, 'text' | 'json'> = {
20
+ json: () => '{"message": "ok"}',
21
+ secure: true
22
+ };
23
+ ```
24
+
25
+ @category Object
26
+ */
27
+ export type RequireAtLeastOne<
28
+ ObjectType,
29
+ KeysType extends keyof ObjectType = keyof ObjectType,
30
+ > =
31
+ IfNotAnyOrNever<ObjectType,
32
+ IfNever<KeysType,
33
+ never,
34
+ _RequireAtLeastOne<ObjectType, IfAny<KeysType, keyof ObjectType, KeysType>>
35
+ >>;
36
+
37
+ type _RequireAtLeastOne<
38
+ ObjectType,
39
+ KeysType extends keyof ObjectType,
40
+ > = {
41
+ // For each `Key` in `KeysType` make a mapped type:
42
+ [Key in KeysType]-?: Required<Pick<ObjectType, Key>> & // 1. Make `Key`'s type required
43
+ // 2. Make all other keys in `KeysType` optional
44
+ Partial<Pick<ObjectType, Exclude<KeysType, Key>>>;
45
+ }[KeysType] &
46
+ // 3. Add the remaining keys not in `KeysType`
47
+ Except<ObjectType, KeysType>;
@@ -0,0 +1,45 @@
1
+ import type {IfAny} from './if-any';
2
+ import type {IfNever} from './if-never';
3
+ import type {IfNotAnyOrNever} from './internal';
4
+
5
+ /**
6
+ Create a type that requires exactly one of the given keys and disallows more. The remaining keys are kept as is.
7
+
8
+ Use-cases:
9
+ - Creating interfaces for components that only need one of the keys to display properly.
10
+ - Declaring generic keys in a single place for a single use-case that gets narrowed down via `RequireExactlyOne`.
11
+
12
+ The caveat with `RequireExactlyOne` is that TypeScript doesn't always know at compile time every key that will exist at runtime. Therefore `RequireExactlyOne` can't do anything to prevent extra keys it doesn't know about.
13
+
14
+ @example
15
+ ```
16
+ import type {RequireExactlyOne} from 'type-fest';
17
+
18
+ type Responder = {
19
+ text: () => string;
20
+ json: () => string;
21
+ secure: boolean;
22
+ };
23
+
24
+ const responder: RequireExactlyOne<Responder, 'text' | 'json'> = {
25
+ // Adding a `text` key here would cause a compile error.
26
+
27
+ json: () => '{"message": "ok"}',
28
+ secure: true
29
+ };
30
+ ```
31
+
32
+ @category Object
33
+ */
34
+ export type RequireExactlyOne<ObjectType, KeysType extends keyof ObjectType = keyof ObjectType> =
35
+ IfNotAnyOrNever<ObjectType,
36
+ IfNever<KeysType,
37
+ never,
38
+ _RequireExactlyOne<ObjectType, IfAny<KeysType, keyof ObjectType, KeysType>>
39
+ >>;
40
+
41
+ type _RequireExactlyOne<ObjectType, KeysType extends keyof ObjectType> =
42
+ {[Key in KeysType]: (
43
+ Required<Pick<ObjectType, Key>> &
44
+ Partial<Record<Exclude<KeysType, Key>, never>>
45
+ )}[KeysType] & Omit<ObjectType, KeysType>;
@@ -0,0 +1,46 @@
1
+ import type {RequireExactlyOne} from './require-exactly-one';
2
+ import type {IfNotAnyOrNever, RequireNone} from './internal';
3
+ import type {IfNever} from './if-never';
4
+ import type {IfAny} from './if-any';
5
+
6
+ /**
7
+ Create a type that requires exactly one of the given keys and disallows more, or none of the given keys. The remaining keys are kept as is.
8
+
9
+ @example
10
+ ```
11
+ import type {RequireOneOrNone} from 'type-fest';
12
+
13
+ type Responder = RequireOneOrNone<{
14
+ text: () => string;
15
+ json: () => string;
16
+ secure: boolean;
17
+ }, 'text' | 'json'>;
18
+
19
+ const responder1: Responder = {
20
+ secure: true
21
+ };
22
+
23
+ const responder2: Responder = {
24
+ text: () => '{"message": "hi"}',
25
+ secure: true
26
+ };
27
+
28
+ const responder3: Responder = {
29
+ json: () => '{"message": "ok"}',
30
+ secure: true
31
+ };
32
+ ```
33
+
34
+ @category Object
35
+ */
36
+ export type RequireOneOrNone<ObjectType, KeysType extends keyof ObjectType = keyof ObjectType> =
37
+ IfNotAnyOrNever<ObjectType,
38
+ IfNever<KeysType,
39
+ ObjectType,
40
+ _RequireOneOrNone<ObjectType, IfAny<KeysType, keyof ObjectType, KeysType>>
41
+ >>;
42
+
43
+ type _RequireOneOrNone<ObjectType, KeysType extends keyof ObjectType> = (
44
+ | RequireExactlyOne<ObjectType, KeysType>
45
+ | RequireNone<KeysType>
46
+ ) & Omit<ObjectType, KeysType>; // Ignore unspecified keys.