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.
- package/LICENSE +52 -0
- package/README.md +168 -0
- package/dist/ai/config-wizard.js +282 -0
- package/dist/ai/enricher.js +290 -0
- package/dist/ai/prompts.js +231 -0
- package/dist/ai/provider.js +265 -0
- package/dist/cli.js +442 -0
- package/dist/config/config.js +315 -0
- package/dist/config/default-config.js +223 -0
- package/dist/core/blocks.js +145 -0
- package/dist/core/commit-planner.js +273 -0
- package/dist/core/dependency.js +284 -0
- package/dist/core/file-stats.js +341 -0
- package/dist/core/history.js +72 -0
- package/dist/core/planner.js +25 -0
- package/dist/core/scoring.js +166 -0
- package/dist/core/strategy.js +486 -0
- package/dist/git/branch-naming.js +120 -0
- package/dist/git/executor.js +378 -0
- package/dist/git/git.js +239 -0
- package/dist/output/report-styles.generated.js +10 -0
- package/dist/output/report.js +726 -0
- package/dist/output/ui.js +417 -0
- package/dist/shared/constants.js +59 -0
- package/dist/shared/types.js +7 -0
- package/dist/shared/utils.js +73 -0
- package/node_modules/@colors/colors/LICENSE +26 -0
- package/node_modules/@colors/colors/README.md +219 -0
- package/node_modules/@colors/colors/examples/normal-usage.js +83 -0
- package/node_modules/@colors/colors/examples/safe-string.js +80 -0
- package/node_modules/@colors/colors/index.d.ts +136 -0
- package/node_modules/@colors/colors/lib/colors.js +211 -0
- package/node_modules/@colors/colors/lib/custom/trap.js +46 -0
- package/node_modules/@colors/colors/lib/custom/zalgo.js +110 -0
- package/node_modules/@colors/colors/lib/extendStringPrototype.js +110 -0
- package/node_modules/@colors/colors/lib/index.js +13 -0
- package/node_modules/@colors/colors/lib/maps/america.js +10 -0
- package/node_modules/@colors/colors/lib/maps/rainbow.js +12 -0
- package/node_modules/@colors/colors/lib/maps/random.js +11 -0
- package/node_modules/@colors/colors/lib/maps/zebra.js +5 -0
- package/node_modules/@colors/colors/lib/styles.js +95 -0
- package/node_modules/@colors/colors/lib/system/has-flag.js +35 -0
- package/node_modules/@colors/colors/lib/system/supports-colors.js +151 -0
- package/node_modules/@colors/colors/package.json +45 -0
- package/node_modules/@colors/colors/safe.d.ts +48 -0
- package/node_modules/@colors/colors/safe.js +10 -0
- package/node_modules/@colors/colors/themes/generic-logging.js +12 -0
- package/node_modules/ansi-align/LICENSE +13 -0
- package/node_modules/ansi-align/README.md +80 -0
- package/node_modules/ansi-align/index.js +61 -0
- package/node_modules/ansi-align/node_modules/ansi-regex/index.d.ts +37 -0
- package/node_modules/ansi-align/node_modules/ansi-regex/index.js +10 -0
- package/node_modules/ansi-align/node_modules/ansi-regex/license +9 -0
- package/node_modules/ansi-align/node_modules/ansi-regex/package.json +55 -0
- package/node_modules/ansi-align/node_modules/ansi-regex/readme.md +78 -0
- package/node_modules/ansi-align/node_modules/emoji-regex/LICENSE-MIT.txt +20 -0
- package/node_modules/ansi-align/node_modules/emoji-regex/README.md +73 -0
- package/node_modules/ansi-align/node_modules/emoji-regex/es2015/index.js +6 -0
- package/node_modules/ansi-align/node_modules/emoji-regex/es2015/text.js +6 -0
- package/node_modules/ansi-align/node_modules/emoji-regex/index.d.ts +23 -0
- package/node_modules/ansi-align/node_modules/emoji-regex/index.js +6 -0
- package/node_modules/ansi-align/node_modules/emoji-regex/package.json +50 -0
- package/node_modules/ansi-align/node_modules/emoji-regex/text.js +6 -0
- package/node_modules/ansi-align/node_modules/string-width/index.d.ts +29 -0
- package/node_modules/ansi-align/node_modules/string-width/index.js +47 -0
- package/node_modules/ansi-align/node_modules/string-width/license +9 -0
- package/node_modules/ansi-align/node_modules/string-width/package.json +56 -0
- package/node_modules/ansi-align/node_modules/string-width/readme.md +50 -0
- package/node_modules/ansi-align/node_modules/strip-ansi/index.d.ts +17 -0
- package/node_modules/ansi-align/node_modules/strip-ansi/index.js +4 -0
- package/node_modules/ansi-align/node_modules/strip-ansi/license +9 -0
- package/node_modules/ansi-align/node_modules/strip-ansi/package.json +54 -0
- package/node_modules/ansi-align/node_modules/strip-ansi/readme.md +46 -0
- package/node_modules/ansi-align/package.json +43 -0
- package/node_modules/ansi-regex/index.d.ts +33 -0
- package/node_modules/ansi-regex/index.js +14 -0
- package/node_modules/ansi-regex/license +9 -0
- package/node_modules/ansi-regex/package.json +61 -0
- package/node_modules/ansi-regex/readme.md +66 -0
- package/node_modules/ansi-styles/index.d.ts +236 -0
- package/node_modules/ansi-styles/index.js +223 -0
- package/node_modules/ansi-styles/license +9 -0
- package/node_modules/ansi-styles/package.json +54 -0
- package/node_modules/ansi-styles/readme.md +173 -0
- package/node_modules/boxen/index.d.ts +267 -0
- package/node_modules/boxen/index.js +376 -0
- package/node_modules/boxen/license +9 -0
- package/node_modules/boxen/package.json +69 -0
- package/node_modules/boxen/readme.md +300 -0
- package/node_modules/camelcase/index.d.ts +102 -0
- package/node_modules/camelcase/index.js +110 -0
- package/node_modules/camelcase/license +9 -0
- package/node_modules/camelcase/package.json +47 -0
- package/node_modules/camelcase/readme.md +135 -0
- package/node_modules/chalk/license +9 -0
- package/node_modules/chalk/package.json +83 -0
- package/node_modules/chalk/readme.md +297 -0
- package/node_modules/chalk/source/index.d.ts +325 -0
- package/node_modules/chalk/source/index.js +225 -0
- package/node_modules/chalk/source/utilities.js +33 -0
- package/node_modules/chalk/source/vendor/ansi-styles/index.d.ts +236 -0
- package/node_modules/chalk/source/vendor/ansi-styles/index.js +223 -0
- package/node_modules/chalk/source/vendor/supports-color/browser.d.ts +1 -0
- package/node_modules/chalk/source/vendor/supports-color/browser.js +34 -0
- package/node_modules/chalk/source/vendor/supports-color/index.d.ts +55 -0
- package/node_modules/chalk/source/vendor/supports-color/index.js +190 -0
- package/node_modules/cli-boxes/boxes.json +82 -0
- package/node_modules/cli-boxes/index.d.ts +127 -0
- package/node_modules/cli-boxes/index.js +6 -0
- package/node_modules/cli-boxes/license +9 -0
- package/node_modules/cli-boxes/package.json +42 -0
- package/node_modules/cli-boxes/readme.md +115 -0
- package/node_modules/cli-table3/LICENSE +21 -0
- package/node_modules/cli-table3/README.md +236 -0
- package/node_modules/cli-table3/index.d.ts +96 -0
- package/node_modules/cli-table3/index.js +1 -0
- package/node_modules/cli-table3/node_modules/ansi-regex/index.d.ts +37 -0
- package/node_modules/cli-table3/node_modules/ansi-regex/index.js +10 -0
- package/node_modules/cli-table3/node_modules/ansi-regex/license +9 -0
- package/node_modules/cli-table3/node_modules/ansi-regex/package.json +55 -0
- package/node_modules/cli-table3/node_modules/ansi-regex/readme.md +78 -0
- package/node_modules/cli-table3/node_modules/emoji-regex/LICENSE-MIT.txt +20 -0
- package/node_modules/cli-table3/node_modules/emoji-regex/README.md +73 -0
- package/node_modules/cli-table3/node_modules/emoji-regex/es2015/index.js +6 -0
- package/node_modules/cli-table3/node_modules/emoji-regex/es2015/text.js +6 -0
- package/node_modules/cli-table3/node_modules/emoji-regex/index.d.ts +23 -0
- package/node_modules/cli-table3/node_modules/emoji-regex/index.js +6 -0
- package/node_modules/cli-table3/node_modules/emoji-regex/package.json +50 -0
- package/node_modules/cli-table3/node_modules/emoji-regex/text.js +6 -0
- package/node_modules/cli-table3/node_modules/string-width/index.d.ts +29 -0
- package/node_modules/cli-table3/node_modules/string-width/index.js +47 -0
- package/node_modules/cli-table3/node_modules/string-width/license +9 -0
- package/node_modules/cli-table3/node_modules/string-width/package.json +56 -0
- package/node_modules/cli-table3/node_modules/string-width/readme.md +50 -0
- package/node_modules/cli-table3/node_modules/strip-ansi/index.d.ts +17 -0
- package/node_modules/cli-table3/node_modules/strip-ansi/index.js +4 -0
- package/node_modules/cli-table3/node_modules/strip-ansi/license +9 -0
- package/node_modules/cli-table3/node_modules/strip-ansi/package.json +54 -0
- package/node_modules/cli-table3/node_modules/strip-ansi/readme.md +46 -0
- package/node_modules/cli-table3/package.json +100 -0
- package/node_modules/cli-table3/src/cell.js +409 -0
- package/node_modules/cli-table3/src/debug.js +28 -0
- package/node_modules/cli-table3/src/layout-manager.js +254 -0
- package/node_modules/cli-table3/src/table.js +106 -0
- package/node_modules/cli-table3/src/utils.js +344 -0
- package/node_modules/commander/LICENSE +22 -0
- package/node_modules/commander/Readme.md +1157 -0
- package/node_modules/commander/esm.mjs +16 -0
- package/node_modules/commander/index.js +24 -0
- package/node_modules/commander/lib/argument.js +149 -0
- package/node_modules/commander/lib/command.js +2509 -0
- package/node_modules/commander/lib/error.js +39 -0
- package/node_modules/commander/lib/help.js +520 -0
- package/node_modules/commander/lib/option.js +330 -0
- package/node_modules/commander/lib/suggestSimilar.js +101 -0
- package/node_modules/commander/package-support.json +16 -0
- package/node_modules/commander/package.json +84 -0
- package/node_modules/commander/typings/esm.d.mts +3 -0
- package/node_modules/commander/typings/index.d.ts +969 -0
- package/node_modules/emoji-regex/LICENSE-MIT.txt +20 -0
- package/node_modules/emoji-regex/README.md +107 -0
- package/node_modules/emoji-regex/index.d.ts +3 -0
- package/node_modules/emoji-regex/index.js +4 -0
- package/node_modules/emoji-regex/index.mjs +4 -0
- package/node_modules/emoji-regex/package.json +45 -0
- package/node_modules/get-east-asian-width/index.d.ts +60 -0
- package/node_modules/get-east-asian-width/index.js +30 -0
- package/node_modules/get-east-asian-width/license +9 -0
- package/node_modules/get-east-asian-width/lookup-data.js +18 -0
- package/node_modules/get-east-asian-width/lookup.js +135 -0
- package/node_modules/get-east-asian-width/package.json +71 -0
- package/node_modules/get-east-asian-width/readme.md +65 -0
- package/node_modules/get-east-asian-width/utilities.js +24 -0
- package/node_modules/is-fullwidth-code-point/index.d.ts +17 -0
- package/node_modules/is-fullwidth-code-point/index.js +50 -0
- package/node_modules/is-fullwidth-code-point/license +9 -0
- package/node_modules/is-fullwidth-code-point/package.json +42 -0
- package/node_modules/is-fullwidth-code-point/readme.md +39 -0
- package/node_modules/isbinaryfile/LICENSE.txt +22 -0
- package/node_modules/isbinaryfile/README.md +70 -0
- package/node_modules/isbinaryfile/lib/index.d.ts +3 -0
- package/node_modules/isbinaryfile/lib/index.js +256 -0
- package/node_modules/isbinaryfile/package.json +64 -0
- package/node_modules/string-width/index.d.ts +39 -0
- package/node_modules/string-width/index.js +82 -0
- package/node_modules/string-width/license +9 -0
- package/node_modules/string-width/package.json +64 -0
- package/node_modules/string-width/readme.md +66 -0
- package/node_modules/strip-ansi/index.d.ts +15 -0
- package/node_modules/strip-ansi/index.js +19 -0
- package/node_modules/strip-ansi/license +9 -0
- package/node_modules/strip-ansi/package.json +59 -0
- package/node_modules/strip-ansi/readme.md +37 -0
- package/node_modules/type-fest/index.d.ts +178 -0
- package/node_modules/type-fest/license-cc0 +121 -0
- package/node_modules/type-fest/license-mit +9 -0
- package/node_modules/type-fest/package.json +91 -0
- package/node_modules/type-fest/readme.md +1060 -0
- package/node_modules/type-fest/source/all-union-fields.d.ts +88 -0
- package/node_modules/type-fest/source/and.d.ts +25 -0
- package/node_modules/type-fest/source/array-indices.d.ts +23 -0
- package/node_modules/type-fest/source/array-slice.d.ts +109 -0
- package/node_modules/type-fest/source/array-splice.d.ts +99 -0
- package/node_modules/type-fest/source/array-tail.d.ts +76 -0
- package/node_modules/type-fest/source/array-values.d.ts +22 -0
- package/node_modules/type-fest/source/arrayable.d.ts +29 -0
- package/node_modules/type-fest/source/async-return-type.d.ts +23 -0
- package/node_modules/type-fest/source/asyncify.d.ts +32 -0
- package/node_modules/type-fest/source/basic.d.ts +68 -0
- package/node_modules/type-fest/source/camel-case.d.ts +89 -0
- package/node_modules/type-fest/source/camel-cased-properties-deep.d.ts +97 -0
- package/node_modules/type-fest/source/camel-cased-properties.d.ts +43 -0
- package/node_modules/type-fest/source/conditional-except.d.ts +45 -0
- package/node_modules/type-fest/source/conditional-keys.d.ts +47 -0
- package/node_modules/type-fest/source/conditional-pick-deep.d.ts +118 -0
- package/node_modules/type-fest/source/conditional-pick.d.ts +44 -0
- package/node_modules/type-fest/source/conditional-simplify.d.ts +32 -0
- package/node_modules/type-fest/source/delimiter-case.d.ts +78 -0
- package/node_modules/type-fest/source/delimiter-cased-properties-deep.d.ts +106 -0
- package/node_modules/type-fest/source/delimiter-cased-properties.d.ts +46 -0
- package/node_modules/type-fest/source/distributed-omit.d.ts +89 -0
- package/node_modules/type-fest/source/distributed-pick.d.ts +85 -0
- package/node_modules/type-fest/source/empty-object.d.ts +46 -0
- package/node_modules/type-fest/source/enforce-optional.d.ts +47 -0
- package/node_modules/type-fest/source/entries.d.ts +62 -0
- package/node_modules/type-fest/source/entry.d.ts +65 -0
- package/node_modules/type-fest/source/exact.d.ts +68 -0
- package/node_modules/type-fest/source/except.d.ts +108 -0
- package/node_modules/type-fest/source/find-global-type.d.ts +64 -0
- package/node_modules/type-fest/source/fixed-length-array.d.ts +43 -0
- package/node_modules/type-fest/source/get.d.ts +219 -0
- package/node_modules/type-fest/source/global-this.d.ts +21 -0
- package/node_modules/type-fest/source/greater-than-or-equal.d.ts +22 -0
- package/node_modules/type-fest/source/greater-than.d.ts +56 -0
- package/node_modules/type-fest/source/has-optional-keys.d.ts +21 -0
- package/node_modules/type-fest/source/has-readonly-keys.d.ts +21 -0
- package/node_modules/type-fest/source/has-required-keys.d.ts +59 -0
- package/node_modules/type-fest/source/has-writable-keys.d.ts +21 -0
- package/node_modules/type-fest/source/if-any.d.ts +24 -0
- package/node_modules/type-fest/source/if-empty-object.d.ts +26 -0
- package/node_modules/type-fest/source/if-never.d.ts +24 -0
- package/node_modules/type-fest/source/if-null.d.ts +24 -0
- package/node_modules/type-fest/source/if-unknown.d.ts +24 -0
- package/node_modules/type-fest/source/includes.d.ts +22 -0
- package/node_modules/type-fest/source/int-closed-range.d.ts +35 -0
- package/node_modules/type-fest/source/int-range.d.ts +55 -0
- package/node_modules/type-fest/source/internal/array.d.ts +126 -0
- package/node_modules/type-fest/source/internal/characters.d.ts +67 -0
- package/node_modules/type-fest/source/internal/index.d.ts +8 -0
- package/node_modules/type-fest/source/internal/keys.d.ts +97 -0
- package/node_modules/type-fest/source/internal/numeric.d.ts +118 -0
- package/node_modules/type-fest/source/internal/object.d.ts +236 -0
- package/node_modules/type-fest/source/internal/string.d.ts +210 -0
- package/node_modules/type-fest/source/internal/tuple.d.ts +90 -0
- package/node_modules/type-fest/source/internal/type.d.ts +139 -0
- package/node_modules/type-fest/source/invariant-of.d.ts +76 -0
- package/node_modules/type-fest/source/is-any.d.ts +33 -0
- package/node_modules/type-fest/source/is-equal.d.ts +31 -0
- package/node_modules/type-fest/source/is-float.d.ts +41 -0
- package/node_modules/type-fest/source/is-integer.d.ts +58 -0
- package/node_modules/type-fest/source/is-literal.d.ts +296 -0
- package/node_modules/type-fest/source/is-never.d.ts +42 -0
- package/node_modules/type-fest/source/is-null.d.ts +20 -0
- package/node_modules/type-fest/source/is-tuple.d.ts +89 -0
- package/node_modules/type-fest/source/is-unknown.d.ts +52 -0
- package/node_modules/type-fest/source/iterable-element.d.ts +64 -0
- package/node_modules/type-fest/source/join.d.ts +68 -0
- package/node_modules/type-fest/source/jsonifiable.d.ts +37 -0
- package/node_modules/type-fest/source/jsonify.d.ts +122 -0
- package/node_modules/type-fest/source/kebab-case.d.ts +44 -0
- package/node_modules/type-fest/source/kebab-cased-properties-deep.d.ts +63 -0
- package/node_modules/type-fest/source/kebab-cased-properties.d.ts +40 -0
- package/node_modules/type-fest/source/keys-of-union.d.ts +42 -0
- package/node_modules/type-fest/source/last-array-element.d.ts +38 -0
- package/node_modules/type-fest/source/less-than-or-equal.d.ts +22 -0
- package/node_modules/type-fest/source/less-than.d.ts +26 -0
- package/node_modules/type-fest/source/literal-to-primitive-deep.d.ts +36 -0
- package/node_modules/type-fest/source/literal-to-primitive.d.ts +36 -0
- package/node_modules/type-fest/source/literal-union.d.ts +37 -0
- package/node_modules/type-fest/source/merge-deep.d.ts +486 -0
- package/node_modules/type-fest/source/merge-exclusive.d.ts +41 -0
- package/node_modules/type-fest/source/merge.d.ts +48 -0
- package/node_modules/type-fest/source/multidimensional-array.d.ts +44 -0
- package/node_modules/type-fest/source/multidimensional-readonly-array.d.ts +48 -0
- package/node_modules/type-fest/source/non-empty-object.d.ts +35 -0
- package/node_modules/type-fest/source/non-empty-string.d.ts +28 -0
- package/node_modules/type-fest/source/non-empty-tuple.d.ts +21 -0
- package/node_modules/type-fest/source/numeric.d.ts +222 -0
- package/node_modules/type-fest/source/observable-like.d.ts +63 -0
- package/node_modules/type-fest/source/omit-deep.d.ts +167 -0
- package/node_modules/type-fest/source/omit-index-signature.d.ts +95 -0
- package/node_modules/type-fest/source/opaque.d.ts +1 -0
- package/node_modules/type-fest/source/optional-keys-of.d.ts +39 -0
- package/node_modules/type-fest/source/or.d.ts +25 -0
- package/node_modules/type-fest/source/override-properties.d.ts +36 -0
- package/node_modules/type-fest/source/package-json.d.ts +676 -0
- package/node_modules/type-fest/source/partial-deep.d.ts +151 -0
- package/node_modules/type-fest/source/partial-on-undefined-deep.d.ts +78 -0
- package/node_modules/type-fest/source/pascal-case.d.ts +42 -0
- package/node_modules/type-fest/source/pascal-cased-properties-deep.d.ts +62 -0
- package/node_modules/type-fest/source/pascal-cased-properties.d.ts +36 -0
- package/node_modules/type-fest/source/paths.d.ts +262 -0
- package/node_modules/type-fest/source/pick-deep.d.ts +149 -0
- package/node_modules/type-fest/source/pick-index-signature.d.ts +50 -0
- package/node_modules/type-fest/source/primitive.d.ts +13 -0
- package/node_modules/type-fest/source/promisable.d.ts +25 -0
- package/node_modules/type-fest/source/readonly-deep.d.ts +81 -0
- package/node_modules/type-fest/source/readonly-keys-of.d.ts +30 -0
- package/node_modules/type-fest/source/readonly-tuple.d.ts +41 -0
- package/node_modules/type-fest/source/replace.d.ts +85 -0
- package/node_modules/type-fest/source/require-all-or-none.d.ts +51 -0
- package/node_modules/type-fest/source/require-at-least-one.d.ts +47 -0
- package/node_modules/type-fest/source/require-exactly-one.d.ts +45 -0
- package/node_modules/type-fest/source/require-one-or-none.d.ts +46 -0
- package/node_modules/type-fest/source/required-deep.d.ts +78 -0
- package/node_modules/type-fest/source/required-keys-of.d.ts +30 -0
- package/node_modules/type-fest/source/schema.d.ts +114 -0
- package/node_modules/type-fest/source/screaming-snake-case.d.ts +28 -0
- package/node_modules/type-fest/source/set-field-type.d.ts +65 -0
- package/node_modules/type-fest/source/set-non-nullable-deep.d.ts +83 -0
- package/node_modules/type-fest/source/set-non-nullable.d.ts +39 -0
- package/node_modules/type-fest/source/set-optional.d.ts +38 -0
- package/node_modules/type-fest/source/set-parameter-type.d.ts +117 -0
- package/node_modules/type-fest/source/set-readonly.d.ts +39 -0
- package/node_modules/type-fest/source/set-required-deep.d.ts +68 -0
- package/node_modules/type-fest/source/set-required.d.ts +70 -0
- package/node_modules/type-fest/source/set-return-type.d.ts +29 -0
- package/node_modules/type-fest/source/shared-union-fields-deep.d.ts +178 -0
- package/node_modules/type-fest/source/shared-union-fields.d.ts +76 -0
- package/node_modules/type-fest/source/simplify-deep.d.ts +115 -0
- package/node_modules/type-fest/source/simplify.d.ts +58 -0
- package/node_modules/type-fest/source/single-key-object.d.ts +29 -0
- package/node_modules/type-fest/source/snake-case.d.ts +45 -0
- package/node_modules/type-fest/source/snake-cased-properties-deep.d.ts +63 -0
- package/node_modules/type-fest/source/snake-cased-properties.d.ts +40 -0
- package/node_modules/type-fest/source/split.d.ts +88 -0
- package/node_modules/type-fest/source/spread.d.ts +84 -0
- package/node_modules/type-fest/source/string-key-of.d.ts +25 -0
- package/node_modules/type-fest/source/string-repeat.d.ts +47 -0
- package/node_modules/type-fest/source/string-slice.d.ts +37 -0
- package/node_modules/type-fest/source/stringified.d.ts +23 -0
- package/node_modules/type-fest/source/structured-cloneable.d.ts +92 -0
- package/node_modules/type-fest/source/subtract.d.ts +83 -0
- package/node_modules/type-fest/source/sum.d.ts +78 -0
- package/node_modules/type-fest/source/tagged-union.d.ts +51 -0
- package/node_modules/type-fest/source/tagged.d.ts +256 -0
- package/node_modules/type-fest/source/trim.d.ts +27 -0
- package/node_modules/type-fest/source/tsconfig-json.d.ts +1294 -0
- package/node_modules/type-fest/source/tuple-to-object.d.ts +42 -0
- package/node_modules/type-fest/source/tuple-to-union.d.ts +51 -0
- package/node_modules/type-fest/source/typed-array.d.ts +17 -0
- package/node_modules/type-fest/source/undefined-on-partial-deep.d.ts +80 -0
- package/node_modules/type-fest/source/union-to-intersection.d.ts +61 -0
- package/node_modules/type-fest/source/union-to-tuple.d.ts +56 -0
- package/node_modules/type-fest/source/unknown-array.d.ts +25 -0
- package/node_modules/type-fest/source/unknown-map.d.ts +24 -0
- package/node_modules/type-fest/source/unknown-record.d.ts +31 -0
- package/node_modules/type-fest/source/unknown-set.d.ts +24 -0
- package/node_modules/type-fest/source/value-of.d.ts +42 -0
- package/node_modules/type-fest/source/words.d.ts +118 -0
- package/node_modules/type-fest/source/writable-deep.d.ts +83 -0
- package/node_modules/type-fest/source/writable-keys-of.d.ts +33 -0
- package/node_modules/type-fest/source/writable.d.ts +68 -0
- package/node_modules/widest-line/index.d.ts +12 -0
- package/node_modules/widest-line/index.js +11 -0
- package/node_modules/widest-line/license +9 -0
- package/node_modules/widest-line/package.json +60 -0
- package/node_modules/widest-line/readme.md +26 -0
- package/node_modules/wrap-ansi/index.d.ts +41 -0
- package/node_modules/wrap-ansi/index.js +222 -0
- package/node_modules/wrap-ansi/license +9 -0
- package/node_modules/wrap-ansi/package.json +69 -0
- package/node_modules/wrap-ansi/readme.md +75 -0
- package/package.json +78 -0
- 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,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.
|