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,48 @@
|
|
|
1
|
+
import type {Subtract} from './subtract';
|
|
2
|
+
import type {IsEqual} from './is-equal';
|
|
3
|
+
|
|
4
|
+
type Recursive<T> = ReadonlyArray<Recursive<T>>;
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
Creates a type that represents a multidimensional readonly array that of the given type and dimension.
|
|
8
|
+
|
|
9
|
+
Use-cases:
|
|
10
|
+
- Return a n-dimensional array from functions.
|
|
11
|
+
- Declare a n-dimensional array by defining its dimensions rather than declaring `[]` repetitively.
|
|
12
|
+
- Infer the dimensions of a n-dimensional array automatically from function arguments.
|
|
13
|
+
- Avoid the need to know in advance the dimensions of a n-dimensional array allowing them to be dynamic.
|
|
14
|
+
|
|
15
|
+
@example
|
|
16
|
+
```
|
|
17
|
+
import type {MultidimensionalReadonlyArray} from 'type-fest';
|
|
18
|
+
|
|
19
|
+
function emptyMatrix<T extends number>(dimensions: T): MultidimensionalReadonlyArray<unknown, T> {
|
|
20
|
+
const matrix: unknown[] = [];
|
|
21
|
+
|
|
22
|
+
let subMatrix = matrix;
|
|
23
|
+
for (let dimension = 1; dimension < dimensions; ++dimension) {
|
|
24
|
+
console.log(`Initializing dimension #${dimension}`);
|
|
25
|
+
|
|
26
|
+
subMatrix[0] = [];
|
|
27
|
+
if (dimension < dimensions - 1) {
|
|
28
|
+
subMatrix = subMatrix[0] as unknown[];
|
|
29
|
+
} else {
|
|
30
|
+
subMatrix[0] = 42;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return matrix as MultidimensionalReadonlyArray<unknown, T>;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const matrix = emptyMatrix(3);
|
|
38
|
+
|
|
39
|
+
const answer = matrix[0][0][0]; // 42
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
@category Array
|
|
43
|
+
*/
|
|
44
|
+
export type MultidimensionalReadonlyArray<Element, Dimensions extends number> = number extends Dimensions
|
|
45
|
+
? Recursive<Element>
|
|
46
|
+
: IsEqual<Dimensions, 0> extends true
|
|
47
|
+
? Element
|
|
48
|
+
: ReadonlyArray<MultidimensionalReadonlyArray<Element, Subtract<Dimensions, 1>>>;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type {HasRequiredKeys} from './has-required-keys';
|
|
2
|
+
import type {RequireAtLeastOne} from './require-at-least-one';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
Represents an object with at least 1 non-optional key.
|
|
6
|
+
|
|
7
|
+
This is useful when you need an object where all keys are optional, but there must be at least 1 key.
|
|
8
|
+
|
|
9
|
+
@example
|
|
10
|
+
```
|
|
11
|
+
import type {NonEmptyObject} from 'type-fest';
|
|
12
|
+
|
|
13
|
+
type User = {
|
|
14
|
+
name: string;
|
|
15
|
+
surname: string;
|
|
16
|
+
id: number;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
type UpdateRequest<Entity extends object> = NonEmptyObject<Partial<Entity>>;
|
|
20
|
+
|
|
21
|
+
const update1: UpdateRequest<User> = {
|
|
22
|
+
name: 'Alice',
|
|
23
|
+
surname: 'Acme',
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
// At least 1 key is required, therefore this will report a 2322 error:
|
|
27
|
+
// Type '{}' is not assignable to type 'UpdateRequest<User>'
|
|
28
|
+
const update2: UpdateRequest<User> = {};
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
@see Use `IsEmptyObject` to check whether an object is empty.
|
|
32
|
+
|
|
33
|
+
@category Object
|
|
34
|
+
*/
|
|
35
|
+
export type NonEmptyObject<T extends object> = HasRequiredKeys<T> extends true ? T : RequireAtLeastOne<T, keyof T>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
Matches any non-empty string.
|
|
3
|
+
|
|
4
|
+
This is useful when you need a string that is not empty, for example, as a function parameter.
|
|
5
|
+
|
|
6
|
+
NOTE:
|
|
7
|
+
- This returns `never` not just when instantiated with an empty string, but also when an empty string is a subtype of the instantiated type, like `string` or `Uppercase<string>`.
|
|
8
|
+
|
|
9
|
+
@example
|
|
10
|
+
```
|
|
11
|
+
import type {NonEmptyString} from 'type-fest';
|
|
12
|
+
|
|
13
|
+
declare function foo<T extends string>(string: NonEmptyString<T>): void;
|
|
14
|
+
|
|
15
|
+
foo('a');
|
|
16
|
+
//=> OK
|
|
17
|
+
|
|
18
|
+
foo('');
|
|
19
|
+
//=> Error: Argument of type '""' is not assignable to parameter of type 'never'.
|
|
20
|
+
|
|
21
|
+
declare const someString: string
|
|
22
|
+
foo(someString);
|
|
23
|
+
//=> Error: Argument of type 'string' is not assignable to parameter of type 'never'.
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
@category String
|
|
27
|
+
*/
|
|
28
|
+
export type NonEmptyString<T extends string> = '' extends T ? never : T;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
Matches any non-empty tuple.
|
|
3
|
+
|
|
4
|
+
@example
|
|
5
|
+
```
|
|
6
|
+
import type {NonEmptyTuple} from 'type-fest';
|
|
7
|
+
|
|
8
|
+
const sum = (...numbers: NonEmptyTuple<number>) => numbers.reduce((total, value) => total + value, 0);
|
|
9
|
+
|
|
10
|
+
sum(1, 2, 3);
|
|
11
|
+
//=> 6
|
|
12
|
+
|
|
13
|
+
sum();
|
|
14
|
+
//=> Error: Expected at least 1 arguments, but got 0.
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
@see {@link RequireAtLeastOne} for objects
|
|
18
|
+
|
|
19
|
+
@category Array
|
|
20
|
+
*/
|
|
21
|
+
export type NonEmptyTuple<T = unknown> = readonly [T, ...T[]];
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import type {IsFloat} from './is-float';
|
|
2
|
+
import type {IsInteger} from './is-integer';
|
|
3
|
+
|
|
4
|
+
export type Numeric = number | bigint;
|
|
5
|
+
|
|
6
|
+
export type Zero = 0 | 0n;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
Matches the hidden `Infinity` type.
|
|
10
|
+
|
|
11
|
+
Please upvote [this issue](https://github.com/microsoft/TypeScript/issues/32277) if you want to have this type as a built-in in TypeScript.
|
|
12
|
+
|
|
13
|
+
@see NegativeInfinity
|
|
14
|
+
|
|
15
|
+
@category Numeric
|
|
16
|
+
*/
|
|
17
|
+
// See https://github.com/microsoft/TypeScript/issues/31752
|
|
18
|
+
// eslint-disable-next-line @typescript-eslint/no-loss-of-precision
|
|
19
|
+
export type PositiveInfinity = 1e999;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
Matches the hidden `-Infinity` type.
|
|
23
|
+
|
|
24
|
+
Please upvote [this issue](https://github.com/microsoft/TypeScript/issues/32277) if you want to have this type as a built-in in TypeScript.
|
|
25
|
+
|
|
26
|
+
@see PositiveInfinity
|
|
27
|
+
|
|
28
|
+
@category Numeric
|
|
29
|
+
*/
|
|
30
|
+
// See https://github.com/microsoft/TypeScript/issues/31752
|
|
31
|
+
// eslint-disable-next-line @typescript-eslint/no-loss-of-precision
|
|
32
|
+
export type NegativeInfinity = -1e999;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
A finite `number`.
|
|
36
|
+
You can't pass a `bigint` as they are already guaranteed to be finite.
|
|
37
|
+
|
|
38
|
+
Use-case: Validating and documenting parameters.
|
|
39
|
+
|
|
40
|
+
Note: This can't detect `NaN`, please upvote [this issue](https://github.com/microsoft/TypeScript/issues/28682) if you want to have this type as a built-in in TypeScript.
|
|
41
|
+
|
|
42
|
+
@example
|
|
43
|
+
```
|
|
44
|
+
import type {Finite} from 'type-fest';
|
|
45
|
+
|
|
46
|
+
declare function setScore<T extends number>(length: Finite<T>): void;
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
@category Numeric
|
|
50
|
+
*/
|
|
51
|
+
export type Finite<T extends number> = T extends PositiveInfinity | NegativeInfinity ? never : T;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
A `number` that is an integer.
|
|
55
|
+
|
|
56
|
+
Use-case: Validating and documenting parameters.
|
|
57
|
+
|
|
58
|
+
@example
|
|
59
|
+
```
|
|
60
|
+
type Integer = Integer<1>;
|
|
61
|
+
//=> 1
|
|
62
|
+
|
|
63
|
+
type IntegerWithDecimal = Integer<1.0>;
|
|
64
|
+
//=> 1
|
|
65
|
+
|
|
66
|
+
type NegativeInteger = Integer<-1>;
|
|
67
|
+
//=> -1
|
|
68
|
+
|
|
69
|
+
type Float = Integer<1.5>;
|
|
70
|
+
//=> never
|
|
71
|
+
|
|
72
|
+
// Supports non-decimal numbers
|
|
73
|
+
|
|
74
|
+
type OctalInteger: Integer<0o10>;
|
|
75
|
+
//=> 0o10
|
|
76
|
+
|
|
77
|
+
type BinaryInteger: Integer<0b10>;
|
|
78
|
+
//=> 0b10
|
|
79
|
+
|
|
80
|
+
type HexadecimalInteger: Integer<0x10>;
|
|
81
|
+
//=> 0x10
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
@example
|
|
85
|
+
```
|
|
86
|
+
import type {Integer} from 'type-fest';
|
|
87
|
+
|
|
88
|
+
declare function setYear<T extends number>(length: Integer<T>): void;
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
@see NegativeInteger
|
|
92
|
+
@see NonNegativeInteger
|
|
93
|
+
|
|
94
|
+
@category Numeric
|
|
95
|
+
*/
|
|
96
|
+
// `${bigint}` is a type that matches a valid bigint literal without the `n` (ex. 1, 0b1, 0o1, 0x1)
|
|
97
|
+
// Because T is a number and not a string we can effectively use this to filter out any numbers containing decimal points
|
|
98
|
+
export type Integer<T> =
|
|
99
|
+
T extends unknown // To distributive type
|
|
100
|
+
? IsInteger<T> extends true ? T : never
|
|
101
|
+
: never; // Never happens
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
A `number` that is not an integer.
|
|
105
|
+
|
|
106
|
+
Use-case: Validating and documenting parameters.
|
|
107
|
+
|
|
108
|
+
It does not accept `Infinity`.
|
|
109
|
+
|
|
110
|
+
@example
|
|
111
|
+
```
|
|
112
|
+
import type {Float} from 'type-fest';
|
|
113
|
+
|
|
114
|
+
declare function setPercentage<T extends number>(length: Float<T>): void;
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
@see Integer
|
|
118
|
+
|
|
119
|
+
@category Numeric
|
|
120
|
+
*/
|
|
121
|
+
export type Float<T> =
|
|
122
|
+
T extends unknown // To distributive type
|
|
123
|
+
? IsFloat<T> extends true ? T : never
|
|
124
|
+
: never; // Never happens
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
A negative (`-∞ < x < 0`) `number` that is not an integer.
|
|
128
|
+
Equivalent to `Negative<Float<T>>`.
|
|
129
|
+
|
|
130
|
+
Use-case: Validating and documenting parameters.
|
|
131
|
+
|
|
132
|
+
@see Negative
|
|
133
|
+
@see Float
|
|
134
|
+
|
|
135
|
+
@category Numeric
|
|
136
|
+
*/
|
|
137
|
+
export type NegativeFloat<T extends number> = Negative<Float<T>>;
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
A negative `number`/`bigint` (`-∞ < x < 0`)
|
|
141
|
+
|
|
142
|
+
Use-case: Validating and documenting parameters.
|
|
143
|
+
|
|
144
|
+
@see NegativeInteger
|
|
145
|
+
@see NonNegative
|
|
146
|
+
|
|
147
|
+
@category Numeric
|
|
148
|
+
*/
|
|
149
|
+
export type Negative<T extends Numeric> = T extends Zero ? never : `${T}` extends `-${string}` ? T : never;
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
A negative (`-∞ < x < 0`) `number` that is an integer.
|
|
153
|
+
Equivalent to `Negative<Integer<T>>`.
|
|
154
|
+
|
|
155
|
+
You can't pass a `bigint` as they are already guaranteed to be integers, instead use `Negative<T>`.
|
|
156
|
+
|
|
157
|
+
Use-case: Validating and documenting parameters.
|
|
158
|
+
|
|
159
|
+
@see Negative
|
|
160
|
+
@see Integer
|
|
161
|
+
|
|
162
|
+
@category Numeric
|
|
163
|
+
*/
|
|
164
|
+
export type NegativeInteger<T extends number> = Negative<Integer<T>>;
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
A non-negative `number`/`bigint` (`0 <= x < ∞`).
|
|
168
|
+
|
|
169
|
+
Use-case: Validating and documenting parameters.
|
|
170
|
+
|
|
171
|
+
@see NonNegativeInteger
|
|
172
|
+
@see Negative
|
|
173
|
+
|
|
174
|
+
@example
|
|
175
|
+
```
|
|
176
|
+
import type {NonNegative} from 'type-fest';
|
|
177
|
+
|
|
178
|
+
declare function setLength<T extends number>(length: NonNegative<T>): void;
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
@category Numeric
|
|
182
|
+
*/
|
|
183
|
+
export type NonNegative<T extends Numeric> = T extends Zero ? T : Negative<T> extends never ? T : never;
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
A non-negative (`0 <= x < ∞`) `number` that is an integer.
|
|
187
|
+
Equivalent to `NonNegative<Integer<T>>`.
|
|
188
|
+
|
|
189
|
+
You can't pass a `bigint` as they are already guaranteed to be integers, instead use `NonNegative<T>`.
|
|
190
|
+
|
|
191
|
+
Use-case: Validating and documenting parameters.
|
|
192
|
+
|
|
193
|
+
@see NonNegative
|
|
194
|
+
@see Integer
|
|
195
|
+
|
|
196
|
+
@example
|
|
197
|
+
```
|
|
198
|
+
import type {NonNegativeInteger} from 'type-fest';
|
|
199
|
+
|
|
200
|
+
declare function setLength<T extends number>(length: NonNegativeInteger<T>): void;
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
@category Numeric
|
|
204
|
+
*/
|
|
205
|
+
export type NonNegativeInteger<T extends number> = NonNegative<Integer<T>>;
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
Returns a boolean for whether the given number is a negative number.
|
|
209
|
+
|
|
210
|
+
@see Negative
|
|
211
|
+
|
|
212
|
+
@example
|
|
213
|
+
```
|
|
214
|
+
import type {IsNegative} from 'type-fest';
|
|
215
|
+
|
|
216
|
+
type ShouldBeFalse = IsNegative<1>;
|
|
217
|
+
type ShouldBeTrue = IsNegative<-1>;
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
@category Numeric
|
|
221
|
+
*/
|
|
222
|
+
export type IsNegative<T extends Numeric> = T extends Negative<T> ? true : false;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
declare global {
|
|
2
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-definitions -- It has to be an `interface` so that it can be merged.
|
|
3
|
+
interface SymbolConstructor {
|
|
4
|
+
readonly observable: symbol;
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
@remarks
|
|
10
|
+
The TC39 observable proposal defines a `closed` property, but some implementations (such as xstream) do not as of 10/08/2021.
|
|
11
|
+
As well, some guidance on making an `Observable` to not include `closed` property.
|
|
12
|
+
@see https://github.com/tc39/proposal-observable/blob/master/src/Observable.js#L129-L130
|
|
13
|
+
@see https://github.com/staltz/xstream/blob/6c22580c1d84d69773ee4b0905df44ad464955b3/src/index.ts#L79-L85
|
|
14
|
+
@see https://github.com/benlesh/symbol-observable#making-an-object-observable
|
|
15
|
+
|
|
16
|
+
@category Observable
|
|
17
|
+
*/
|
|
18
|
+
export type Unsubscribable = {
|
|
19
|
+
unsubscribe(): void;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
@category Observable
|
|
24
|
+
*/
|
|
25
|
+
type OnNext<ValueType> = (value: ValueType) => void;
|
|
26
|
+
/**
|
|
27
|
+
@category Observable
|
|
28
|
+
*/
|
|
29
|
+
type OnError = (error: unknown) => void;
|
|
30
|
+
/**
|
|
31
|
+
@category Observable
|
|
32
|
+
*/
|
|
33
|
+
type OnComplete = () => void;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
@category Observable
|
|
37
|
+
*/
|
|
38
|
+
export type Observer<ValueType> = {
|
|
39
|
+
next: OnNext<ValueType>;
|
|
40
|
+
error: OnError;
|
|
41
|
+
complete: OnComplete;
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
Matches a value that is like an [Observable](https://github.com/tc39/proposal-observable).
|
|
46
|
+
|
|
47
|
+
@remarks
|
|
48
|
+
The TC39 Observable proposal defines 2 forms of `subscribe()`:
|
|
49
|
+
1. Three callback arguments: `subscribe(observer: OnNext<ValueType>, onError?: OnError, onComplete?: OnComplete): Unsubscribable;`
|
|
50
|
+
2. A single `observer` argument: (as defined below)
|
|
51
|
+
|
|
52
|
+
But `Observable` implementations have evolved to preferring case 2 and some implementations choose not to implement case 1. Therefore, an `ObservableLike` cannot be trusted to implement the first case. (xstream and hand built observerables often do not implement case 1)
|
|
53
|
+
|
|
54
|
+
@see https://github.com/tc39/proposal-observable#observable
|
|
55
|
+
@see https://github.com/tc39/proposal-observable/blob/master/src/Observable.js#L246-L259
|
|
56
|
+
@see https://benlesh.com/posts/learning-observable-by-building-observable/
|
|
57
|
+
|
|
58
|
+
@category Observable
|
|
59
|
+
*/
|
|
60
|
+
export type ObservableLike<ValueType = unknown> = {
|
|
61
|
+
subscribe(observer?: Partial<Observer<ValueType>>): Unsubscribable;
|
|
62
|
+
[Symbol.observable](): ObservableLike<ValueType>;
|
|
63
|
+
};
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import type {ArraySplice} from './array-splice';
|
|
2
|
+
import type {ExactKey, IsArrayReadonly, NonRecursiveType, SetArrayAccess, ToString} from './internal';
|
|
3
|
+
import type {IsEqual} from './is-equal';
|
|
4
|
+
import type {IsNever} from './is-never';
|
|
5
|
+
import type {LiteralUnion} from './literal-union';
|
|
6
|
+
import type {Paths} from './paths';
|
|
7
|
+
import type {SimplifyDeep} from './simplify-deep';
|
|
8
|
+
import type {UnionToTuple} from './union-to-tuple';
|
|
9
|
+
import type {UnknownArray} from './unknown-array';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
Omit properties from a deeply-nested object.
|
|
13
|
+
|
|
14
|
+
It supports recursing into arrays.
|
|
15
|
+
|
|
16
|
+
It supports removing specific items from an array, replacing each removed item with unknown at the specified index.
|
|
17
|
+
|
|
18
|
+
Use-case: Remove unneeded parts of complex objects.
|
|
19
|
+
|
|
20
|
+
Use [`Omit`](https://www.typescriptlang.org/docs/handbook/utility-types.html#omittype-keys) if you only need one level deep.
|
|
21
|
+
|
|
22
|
+
@example
|
|
23
|
+
```
|
|
24
|
+
import type {OmitDeep} from 'type-fest';
|
|
25
|
+
|
|
26
|
+
type Info = {
|
|
27
|
+
userInfo: {
|
|
28
|
+
name: string;
|
|
29
|
+
uselessInfo: {
|
|
30
|
+
foo: string;
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
type UsefulInfo = OmitDeep<Info, 'userInfo.uselessInfo'>;
|
|
36
|
+
// type UsefulInfo = {
|
|
37
|
+
// userInfo: {
|
|
38
|
+
// name: string;
|
|
39
|
+
// };
|
|
40
|
+
// };
|
|
41
|
+
|
|
42
|
+
// Supports removing multiple paths
|
|
43
|
+
type Info1 = {
|
|
44
|
+
userInfo: {
|
|
45
|
+
name: string;
|
|
46
|
+
uselessField: string;
|
|
47
|
+
uselessInfo: {
|
|
48
|
+
foo: string;
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
type UsefulInfo1 = OmitDeep<Info1, 'userInfo.uselessInfo' | 'userInfo.uselessField'>;
|
|
54
|
+
// type UsefulInfo1 = {
|
|
55
|
+
// userInfo: {
|
|
56
|
+
// name: string;
|
|
57
|
+
// };
|
|
58
|
+
// };
|
|
59
|
+
|
|
60
|
+
// Supports array
|
|
61
|
+
type A = OmitDeep<[1, 'foo', 2], 1>;
|
|
62
|
+
// type A = [1, unknown, 2];
|
|
63
|
+
|
|
64
|
+
// Supports recursing into array
|
|
65
|
+
|
|
66
|
+
type Info1 = {
|
|
67
|
+
address: [
|
|
68
|
+
{
|
|
69
|
+
street: string
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
street2: string,
|
|
73
|
+
foo: string
|
|
74
|
+
};
|
|
75
|
+
];
|
|
76
|
+
}
|
|
77
|
+
type AddressInfo = OmitDeep<Info1, 'address.1.foo'>;
|
|
78
|
+
// type AddressInfo = {
|
|
79
|
+
// address: [
|
|
80
|
+
// {
|
|
81
|
+
// street: string;
|
|
82
|
+
// },
|
|
83
|
+
// {
|
|
84
|
+
// street2: string;
|
|
85
|
+
// };
|
|
86
|
+
// ];
|
|
87
|
+
// };
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
@category Object
|
|
91
|
+
@category Array
|
|
92
|
+
*/
|
|
93
|
+
export type OmitDeep<T, PathUnion extends LiteralUnion<Paths<T>, string>> =
|
|
94
|
+
SimplifyDeep<
|
|
95
|
+
OmitDeepHelper<T, UnionToTuple<PathUnion>>,
|
|
96
|
+
UnknownArray>;
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
Internal helper for {@link OmitDeep}.
|
|
100
|
+
|
|
101
|
+
Recursively transforms `T` by applying {@link OmitDeepWithOnePath} for each path in `PathTuple`.
|
|
102
|
+
*/
|
|
103
|
+
type OmitDeepHelper<T, PathTuple extends UnknownArray> =
|
|
104
|
+
PathTuple extends [infer Path, ...infer RestPaths]
|
|
105
|
+
? OmitDeepHelper<OmitDeepWithOnePath<T, Path & (string | number)>, RestPaths>
|
|
106
|
+
: T;
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
Omit one path from the given object/array.
|
|
110
|
+
*/
|
|
111
|
+
type OmitDeepWithOnePath<T, Path extends string | number> =
|
|
112
|
+
T extends NonRecursiveType
|
|
113
|
+
? T
|
|
114
|
+
: T extends UnknownArray ? SetArrayAccess<OmitDeepArrayWithOnePath<T, Path>, IsArrayReadonly<T>>
|
|
115
|
+
: T extends object ? OmitDeepObjectWithOnePath<T, Path>
|
|
116
|
+
: T;
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
Omit one path from the given object.
|
|
120
|
+
*/
|
|
121
|
+
type OmitDeepObjectWithOnePath<ObjectT extends object, P extends string | number> =
|
|
122
|
+
P extends `${infer RecordKeyInPath}.${infer SubPath}`
|
|
123
|
+
? {
|
|
124
|
+
[Key in keyof ObjectT]:
|
|
125
|
+
IsEqual<RecordKeyInPath, ToString<Key>> extends true
|
|
126
|
+
? ExactKey<ObjectT, Key> extends infer RealKey
|
|
127
|
+
? RealKey extends keyof ObjectT
|
|
128
|
+
? OmitDeepWithOnePath<ObjectT[RealKey], SubPath>
|
|
129
|
+
: ObjectT[Key]
|
|
130
|
+
: ObjectT[Key]
|
|
131
|
+
: ObjectT[Key]
|
|
132
|
+
}
|
|
133
|
+
: ExactKey<ObjectT, P> extends infer Key
|
|
134
|
+
? IsNever<Key> extends true
|
|
135
|
+
? ObjectT
|
|
136
|
+
: Key extends PropertyKey
|
|
137
|
+
? Omit<ObjectT, Key>
|
|
138
|
+
: ObjectT
|
|
139
|
+
: ObjectT;
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
Omit one path from from the given array.
|
|
143
|
+
|
|
144
|
+
It replaces the item to `unknown` at the given index.
|
|
145
|
+
|
|
146
|
+
@example
|
|
147
|
+
```
|
|
148
|
+
type A = OmitDeepArrayWithOnePath<[10, 20, 30, 40], 2>;
|
|
149
|
+
//=> type A = [10, 20, unknown, 40];
|
|
150
|
+
```
|
|
151
|
+
*/
|
|
152
|
+
type OmitDeepArrayWithOnePath<ArrayType extends UnknownArray, P extends string | number> =
|
|
153
|
+
// Handle paths that are `${number}.${string}`
|
|
154
|
+
P extends `${infer ArrayIndex extends number}.${infer SubPath}`
|
|
155
|
+
// If `ArrayIndex` is equal to `number`
|
|
156
|
+
? number extends ArrayIndex
|
|
157
|
+
? Array<OmitDeepWithOnePath<NonNullable<ArrayType[number]>, SubPath>>
|
|
158
|
+
// If `ArrayIndex` is a number literal
|
|
159
|
+
: ArraySplice<ArrayType, ArrayIndex, 1, [OmitDeepWithOnePath<NonNullable<ArrayType[ArrayIndex]>, SubPath>]>
|
|
160
|
+
// If the path is equal to `number`
|
|
161
|
+
: P extends `${infer ArrayIndex extends number}`
|
|
162
|
+
// If `ArrayIndex` is `number`
|
|
163
|
+
? number extends ArrayIndex
|
|
164
|
+
? []
|
|
165
|
+
// If `ArrayIndex` is a number literal
|
|
166
|
+
: ArraySplice<ArrayType, ArrayIndex, 1, [unknown]>
|
|
167
|
+
: ArrayType;
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
Omit any index signatures from the given object type, leaving only explicitly defined properties.
|
|
3
|
+
|
|
4
|
+
This is the counterpart of `PickIndexSignature`.
|
|
5
|
+
|
|
6
|
+
Use-cases:
|
|
7
|
+
- Remove overly permissive signatures from third-party types.
|
|
8
|
+
|
|
9
|
+
This type was taken from this [StackOverflow answer](https://stackoverflow.com/a/68261113/420747).
|
|
10
|
+
|
|
11
|
+
It relies on the fact that an empty object (`{}`) is assignable to an object with just an index signature, like `Record<string, unknown>`, but not to an object with explicitly defined keys, like `Record<'foo' | 'bar', unknown>`.
|
|
12
|
+
|
|
13
|
+
(The actual value type, `unknown`, is irrelevant and could be any type. Only the key type matters.)
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
const indexed: Record<string, unknown> = {}; // Allowed
|
|
17
|
+
|
|
18
|
+
const keyed: Record<'foo', unknown> = {}; // Error
|
|
19
|
+
// => TS2739: Type '{}' is missing the following properties from type 'Record<"foo" | "bar", unknown>': foo, bar
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Instead of causing a type error like the above, you can also use a [conditional type](https://www.typescriptlang.org/docs/handbook/2/conditional-types.html) to test whether a type is assignable to another:
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
type Indexed = {} extends Record<string, unknown>
|
|
26
|
+
? '✅ `{}` is assignable to `Record<string, unknown>`'
|
|
27
|
+
: '❌ `{}` is NOT assignable to `Record<string, unknown>`';
|
|
28
|
+
// => '✅ `{}` is assignable to `Record<string, unknown>`'
|
|
29
|
+
|
|
30
|
+
type Keyed = {} extends Record<'foo' | 'bar', unknown>
|
|
31
|
+
? "✅ `{}` is assignable to `Record<'foo' | 'bar', unknown>`"
|
|
32
|
+
: "❌ `{}` is NOT assignable to `Record<'foo' | 'bar', unknown>`";
|
|
33
|
+
// => "❌ `{}` is NOT assignable to `Record<'foo' | 'bar', unknown>`"
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Using a [mapped type](https://www.typescriptlang.org/docs/handbook/2/mapped-types.html#further-exploration), you can then check for each `KeyType` of `ObjectType`...
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
import type {OmitIndexSignature} from 'type-fest';
|
|
40
|
+
|
|
41
|
+
type OmitIndexSignature<ObjectType> = {
|
|
42
|
+
[KeyType in keyof ObjectType // Map each key of `ObjectType`...
|
|
43
|
+
]: ObjectType[KeyType]; // ...to its original value, i.e. `OmitIndexSignature<Foo> == Foo`.
|
|
44
|
+
};
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
...whether an empty object (`{}`) would be assignable to an object with that `KeyType` (`Record<KeyType, unknown>`)...
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
import type {OmitIndexSignature} from 'type-fest';
|
|
51
|
+
|
|
52
|
+
type OmitIndexSignature<ObjectType> = {
|
|
53
|
+
[KeyType in keyof ObjectType
|
|
54
|
+
// Is `{}` assignable to `Record<KeyType, unknown>`?
|
|
55
|
+
as {} extends Record<KeyType, unknown>
|
|
56
|
+
? ... // ✅ `{}` is assignable to `Record<KeyType, unknown>`
|
|
57
|
+
: ... // ❌ `{}` is NOT assignable to `Record<KeyType, unknown>`
|
|
58
|
+
]: ObjectType[KeyType];
|
|
59
|
+
};
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
If `{}` is assignable, it means that `KeyType` is an index signature and we want to remove it. If it is not assignable, `KeyType` is a "real" key and we want to keep it.
|
|
63
|
+
|
|
64
|
+
@example
|
|
65
|
+
```
|
|
66
|
+
import type {OmitIndexSignature} from 'type-fest';
|
|
67
|
+
|
|
68
|
+
interface Example {
|
|
69
|
+
// These index signatures will be removed.
|
|
70
|
+
[x: string]: any
|
|
71
|
+
[x: number]: any
|
|
72
|
+
[x: symbol]: any
|
|
73
|
+
[x: `head-${string}`]: string
|
|
74
|
+
[x: `${string}-tail`]: string
|
|
75
|
+
[x: `head-${string}-tail`]: string
|
|
76
|
+
[x: `${bigint}`]: string
|
|
77
|
+
[x: `embedded-${number}`]: string
|
|
78
|
+
|
|
79
|
+
// These explicitly defined keys will remain.
|
|
80
|
+
foo: 'bar';
|
|
81
|
+
qux?: 'baz';
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
type ExampleWithoutIndexSignatures = OmitIndexSignature<Example>;
|
|
85
|
+
// => { foo: 'bar'; qux?: 'baz' | undefined; }
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
@see PickIndexSignature
|
|
89
|
+
@category Object
|
|
90
|
+
*/
|
|
91
|
+
export type OmitIndexSignature<ObjectType> = {
|
|
92
|
+
[KeyType in keyof ObjectType as {} extends Record<KeyType, unknown>
|
|
93
|
+
? never
|
|
94
|
+
: KeyType]: ObjectType[KeyType];
|
|
95
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './tagged';
|