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,151 @@
|
|
|
1
|
+
import type {ApplyDefaultOptions, BuiltIns} from './internal';
|
|
2
|
+
import type {IsNever} from './is-never';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
@see {@link PartialDeep}
|
|
6
|
+
*/
|
|
7
|
+
export type PartialDeepOptions = {
|
|
8
|
+
/**
|
|
9
|
+
Whether to affect the individual elements of arrays and tuples.
|
|
10
|
+
|
|
11
|
+
@default false
|
|
12
|
+
*/
|
|
13
|
+
readonly recurseIntoArrays?: boolean;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
Allows `undefined` values in non-tuple arrays.
|
|
17
|
+
|
|
18
|
+
- When set to `true`, elements of non-tuple arrays can be `undefined`.
|
|
19
|
+
- When set to `false`, only explicitly defined elements are allowed in non-tuple arrays, ensuring stricter type checking.
|
|
20
|
+
|
|
21
|
+
@default true
|
|
22
|
+
|
|
23
|
+
@example
|
|
24
|
+
You can prevent `undefined` values in non-tuple arrays by passing `{recurseIntoArrays: true; allowUndefinedInNonTupleArrays: false}` as the second type argument:
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
import type {PartialDeep} from 'type-fest';
|
|
28
|
+
|
|
29
|
+
type Settings = {
|
|
30
|
+
languages: string[];
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
declare const partialSettings: PartialDeep<Settings, {recurseIntoArrays: true; allowUndefinedInNonTupleArrays: false}>;
|
|
34
|
+
|
|
35
|
+
partialSettings.languages = [undefined]; // Error
|
|
36
|
+
partialSettings.languages = []; // Ok
|
|
37
|
+
```
|
|
38
|
+
*/
|
|
39
|
+
readonly allowUndefinedInNonTupleArrays?: boolean;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
type DefaultPartialDeepOptions = {
|
|
43
|
+
recurseIntoArrays: false;
|
|
44
|
+
allowUndefinedInNonTupleArrays: true;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
Create a type from another type with all keys and nested keys set to optional.
|
|
49
|
+
|
|
50
|
+
Use-cases:
|
|
51
|
+
- Merging a default settings/config object with another object, the second object would be a deep partial of the default object.
|
|
52
|
+
- Mocking and testing complex entities, where populating an entire object with its keys would be redundant in terms of the mock or test.
|
|
53
|
+
|
|
54
|
+
@example
|
|
55
|
+
```
|
|
56
|
+
import type {PartialDeep} from 'type-fest';
|
|
57
|
+
|
|
58
|
+
const settings: Settings = {
|
|
59
|
+
textEditor: {
|
|
60
|
+
fontSize: 14,
|
|
61
|
+
fontColor: '#000000',
|
|
62
|
+
fontWeight: 400
|
|
63
|
+
},
|
|
64
|
+
autocomplete: false,
|
|
65
|
+
autosave: true
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
const applySavedSettings = (savedSettings: PartialDeep<Settings>) => {
|
|
69
|
+
return {...settings, ...savedSettings};
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
settings = applySavedSettings({textEditor: {fontWeight: 500}});
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
By default, this does not affect elements in array and tuple types. You can change this by passing `{recurseIntoArrays: true}` as the second type argument:
|
|
76
|
+
|
|
77
|
+
```
|
|
78
|
+
import type {PartialDeep} from 'type-fest';
|
|
79
|
+
|
|
80
|
+
type Settings = {
|
|
81
|
+
languages: string[];
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const partialSettings: PartialDeep<Settings, {recurseIntoArrays: true}> = {
|
|
85
|
+
languages: [undefined]
|
|
86
|
+
};
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
@see {@link PartialDeepOptions}
|
|
90
|
+
|
|
91
|
+
@category Object
|
|
92
|
+
@category Array
|
|
93
|
+
@category Set
|
|
94
|
+
@category Map
|
|
95
|
+
*/
|
|
96
|
+
export type PartialDeep<T, Options extends PartialDeepOptions = {}> =
|
|
97
|
+
_PartialDeep<T, ApplyDefaultOptions<PartialDeepOptions, DefaultPartialDeepOptions, Options>>;
|
|
98
|
+
|
|
99
|
+
type _PartialDeep<T, Options extends Required<PartialDeepOptions>> = T extends BuiltIns | ((new (...arguments_: any[]) => unknown))
|
|
100
|
+
? T
|
|
101
|
+
: IsNever<keyof T> extends true // For functions with no properties
|
|
102
|
+
? T
|
|
103
|
+
: T extends Map<infer KeyType, infer ValueType>
|
|
104
|
+
? PartialMapDeep<KeyType, ValueType, Options>
|
|
105
|
+
: T extends Set<infer ItemType>
|
|
106
|
+
? PartialSetDeep<ItemType, Options>
|
|
107
|
+
: T extends ReadonlyMap<infer KeyType, infer ValueType>
|
|
108
|
+
? PartialReadonlyMapDeep<KeyType, ValueType, Options>
|
|
109
|
+
: T extends ReadonlySet<infer ItemType>
|
|
110
|
+
? PartialReadonlySetDeep<ItemType, Options>
|
|
111
|
+
: T extends object
|
|
112
|
+
? T extends ReadonlyArray<infer ItemType> // Test for arrays/tuples, per https://github.com/microsoft/TypeScript/issues/35156
|
|
113
|
+
? Options['recurseIntoArrays'] extends true
|
|
114
|
+
? ItemType[] extends T // Test for arrays (non-tuples) specifically
|
|
115
|
+
? readonly ItemType[] extends T // Differentiate readonly and mutable arrays
|
|
116
|
+
? ReadonlyArray<_PartialDeep<Options['allowUndefinedInNonTupleArrays'] extends false ? ItemType : ItemType | undefined, Options>>
|
|
117
|
+
: Array<_PartialDeep<Options['allowUndefinedInNonTupleArrays'] extends false ? ItemType : ItemType | undefined, Options>>
|
|
118
|
+
: PartialObjectDeep<T, Options> // Tuples behave properly
|
|
119
|
+
: T // If they don't opt into array testing, just use the original type
|
|
120
|
+
: PartialObjectDeep<T, Options>
|
|
121
|
+
: unknown;
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
Same as `PartialDeep`, but accepts only `Map`s and as inputs. Internal helper for `PartialDeep`.
|
|
125
|
+
*/
|
|
126
|
+
type PartialMapDeep<KeyType, ValueType, Options extends Required<PartialDeepOptions>> = {} & Map<_PartialDeep<KeyType, Options>, _PartialDeep<ValueType, Options>>;
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
Same as `PartialDeep`, but accepts only `Set`s as inputs. Internal helper for `PartialDeep`.
|
|
130
|
+
*/
|
|
131
|
+
type PartialSetDeep<T, Options extends Required<PartialDeepOptions>> = {} & Set<_PartialDeep<T, Options>>;
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
Same as `PartialDeep`, but accepts only `ReadonlyMap`s as inputs. Internal helper for `PartialDeep`.
|
|
135
|
+
*/
|
|
136
|
+
type PartialReadonlyMapDeep<KeyType, ValueType, Options extends Required<PartialDeepOptions>> = {} & ReadonlyMap<_PartialDeep<KeyType, Options>, _PartialDeep<ValueType, Options>>;
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
Same as `PartialDeep`, but accepts only `ReadonlySet`s as inputs. Internal helper for `PartialDeep`.
|
|
140
|
+
*/
|
|
141
|
+
type PartialReadonlySetDeep<T, Options extends Required<PartialDeepOptions>> = {} & ReadonlySet<_PartialDeep<T, Options>>;
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
Same as `PartialDeep`, but accepts only `object`s as inputs. Internal helper for `PartialDeep`.
|
|
145
|
+
*/
|
|
146
|
+
type PartialObjectDeep<ObjectType extends object, Options extends Required<PartialDeepOptions>> =
|
|
147
|
+
(ObjectType extends (...arguments_: any) => unknown
|
|
148
|
+
? (...arguments_: Parameters<ObjectType>) => ReturnType<ObjectType>
|
|
149
|
+
: {}) & ({
|
|
150
|
+
[KeyType in keyof ObjectType]?: _PartialDeep<ObjectType[KeyType], Options>
|
|
151
|
+
});
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type {IfUnknown} from './if-unknown';
|
|
2
|
+
import type {ApplyDefaultOptions, BuiltIns, LiteralKeyOf} from './internal';
|
|
3
|
+
import type {Merge} from './merge';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
@see PartialOnUndefinedDeep
|
|
7
|
+
*/
|
|
8
|
+
export type PartialOnUndefinedDeepOptions = {
|
|
9
|
+
/**
|
|
10
|
+
Whether to affect the individual elements of arrays and tuples.
|
|
11
|
+
|
|
12
|
+
@default false
|
|
13
|
+
*/
|
|
14
|
+
readonly recurseIntoArrays?: boolean;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
type DefaultPartialOnUndefinedDeepOptions = {
|
|
18
|
+
recurseIntoArrays: false;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
Create a deep version of another type where all keys accepting `undefined` type are set to optional.
|
|
23
|
+
|
|
24
|
+
This utility type is recursive, transforming at any level deep. By default, it does not affect arrays and tuples items unless you explicitly pass `{recurseIntoArrays: true}` as the second type argument.
|
|
25
|
+
|
|
26
|
+
Use-cases:
|
|
27
|
+
- Make all properties of a type that can be undefined optional to not have to specify keys with undefined value.
|
|
28
|
+
|
|
29
|
+
@example
|
|
30
|
+
```
|
|
31
|
+
import type {PartialOnUndefinedDeep} from 'type-fest';
|
|
32
|
+
|
|
33
|
+
interface Settings {
|
|
34
|
+
optionA: string;
|
|
35
|
+
optionB: number | undefined;
|
|
36
|
+
subOption: {
|
|
37
|
+
subOptionA: boolean;
|
|
38
|
+
subOptionB: boolean | undefined;
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
const testSettings: PartialOnUndefinedDeep<Settings> = {
|
|
43
|
+
optionA: 'foo',
|
|
44
|
+
// 👉 optionB is now optional and can be omitted
|
|
45
|
+
subOption: {
|
|
46
|
+
subOptionA: true,
|
|
47
|
+
// 👉 subOptionB is now optional as well and can be omitted
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
@category Object
|
|
53
|
+
*/
|
|
54
|
+
export type PartialOnUndefinedDeep<T, Options extends PartialOnUndefinedDeepOptions = {}> =
|
|
55
|
+
_PartialOnUndefinedDeep<T, ApplyDefaultOptions<PartialOnUndefinedDeepOptions, DefaultPartialOnUndefinedDeepOptions, Options>>;
|
|
56
|
+
|
|
57
|
+
type _PartialOnUndefinedDeep<T, Options extends Required<PartialOnUndefinedDeepOptions>> = T extends Record<any, any> | undefined
|
|
58
|
+
? {[KeyType in keyof T as undefined extends T[KeyType] ? IfUnknown<T[KeyType], never, KeyType> : never]?: PartialOnUndefinedDeepValue<T[KeyType], Options>} extends infer U // Make a partial type with all value types accepting undefined (and set them optional)
|
|
59
|
+
? Merge<{[KeyType in keyof T as KeyType extends LiteralKeyOf<U> ? never : KeyType]: PartialOnUndefinedDeepValue<T[KeyType], Options>}, U> // Join all remaining keys not treated in U
|
|
60
|
+
: never // Should not happen
|
|
61
|
+
: T;
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
Utility type to get the value type by key and recursively call `PartialOnUndefinedDeep` to transform sub-objects.
|
|
65
|
+
*/
|
|
66
|
+
type PartialOnUndefinedDeepValue<T, Options extends Required<PartialOnUndefinedDeepOptions>> = T extends BuiltIns | ((...arguments_: any[]) => unknown)
|
|
67
|
+
? T
|
|
68
|
+
: T extends ReadonlyArray<infer U> // Test if type is array or tuple
|
|
69
|
+
? Options['recurseIntoArrays'] extends true // Check if option is activated
|
|
70
|
+
? U[] extends T // Check if array not tuple
|
|
71
|
+
? readonly U[] extends T
|
|
72
|
+
? ReadonlyArray<_PartialOnUndefinedDeep<U, Options>> // Readonly array treatment
|
|
73
|
+
: Array<_PartialOnUndefinedDeep<U, Options>> // Mutable array treatment
|
|
74
|
+
: _PartialOnUndefinedDeep<{[Key in keyof T]: _PartialOnUndefinedDeep<T[Key], Options>}, Options> // Tuple treatment
|
|
75
|
+
: T
|
|
76
|
+
: T extends Record<any, any> | undefined
|
|
77
|
+
? _PartialOnUndefinedDeep<T, Options>
|
|
78
|
+
: unknown;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type {CamelCase, CamelCaseOptions, DefaultCamelCaseOptions} from './camel-case';
|
|
2
|
+
import type {ApplyDefaultOptions} from './internal';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
Converts a string literal to pascal-case.
|
|
6
|
+
|
|
7
|
+
@example
|
|
8
|
+
```
|
|
9
|
+
import type {PascalCase} from 'type-fest';
|
|
10
|
+
|
|
11
|
+
// Simple
|
|
12
|
+
|
|
13
|
+
const someVariable: PascalCase<'foo-bar'> = 'FooBar';
|
|
14
|
+
|
|
15
|
+
// Advanced
|
|
16
|
+
|
|
17
|
+
type PascalCaseProps<T> = {
|
|
18
|
+
[K in keyof T as PascalCase<K>]: T[K]
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
interface RawOptions {
|
|
22
|
+
'dry-run': boolean;
|
|
23
|
+
'full_family_name': string;
|
|
24
|
+
foo: number;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const dbResult: CamelCasedProperties<ModelProps> = {
|
|
28
|
+
DryRun: true,
|
|
29
|
+
FullFamilyName: 'bar.js',
|
|
30
|
+
Foo: 123
|
|
31
|
+
};
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
@category Change case
|
|
35
|
+
@category Template literal
|
|
36
|
+
*/
|
|
37
|
+
export type PascalCase<Value, Options extends CamelCaseOptions = {}> =
|
|
38
|
+
_PascalCase<Value, ApplyDefaultOptions<CamelCaseOptions, DefaultCamelCaseOptions, Options>>;
|
|
39
|
+
|
|
40
|
+
type _PascalCase<Value, Options extends Required<CamelCaseOptions>> = CamelCase<Value, Options> extends string
|
|
41
|
+
? Capitalize<CamelCase<Value, Options>>
|
|
42
|
+
: CamelCase<Value, Options>;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type {CamelCaseOptions, DefaultCamelCaseOptions} from './camel-case';
|
|
2
|
+
import type {ApplyDefaultOptions} from './internal';
|
|
3
|
+
import type {PascalCase} from './pascal-case';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
Convert object properties to pascal case recursively.
|
|
7
|
+
|
|
8
|
+
This can be useful when, for example, converting some API types from a different style.
|
|
9
|
+
|
|
10
|
+
@see PascalCase
|
|
11
|
+
@see PascalCasedProperties
|
|
12
|
+
|
|
13
|
+
@example
|
|
14
|
+
```
|
|
15
|
+
import type {PascalCasedPropertiesDeep} from 'type-fest';
|
|
16
|
+
|
|
17
|
+
interface User {
|
|
18
|
+
userId: number;
|
|
19
|
+
userName: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
interface UserWithFriends {
|
|
23
|
+
userInfo: User;
|
|
24
|
+
userFriends: User[];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const result: PascalCasedPropertiesDeep<UserWithFriends> = {
|
|
28
|
+
UserInfo: {
|
|
29
|
+
UserId: 1,
|
|
30
|
+
UserName: 'Tom',
|
|
31
|
+
},
|
|
32
|
+
UserFriends: [
|
|
33
|
+
{
|
|
34
|
+
UserId: 2,
|
|
35
|
+
UserName: 'Jerry',
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
UserId: 3,
|
|
39
|
+
UserName: 'Spike',
|
|
40
|
+
},
|
|
41
|
+
],
|
|
42
|
+
};
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
@category Change case
|
|
46
|
+
@category Template literal
|
|
47
|
+
@category Object
|
|
48
|
+
*/
|
|
49
|
+
export type PascalCasedPropertiesDeep<Value, Options extends CamelCaseOptions = {}> =
|
|
50
|
+
_PascalCasedPropertiesDeep<Value, ApplyDefaultOptions<CamelCaseOptions, DefaultCamelCaseOptions, Options>>;
|
|
51
|
+
|
|
52
|
+
type _PascalCasedPropertiesDeep<Value, Options extends Required<CamelCaseOptions>> = Value extends Function | Date | RegExp
|
|
53
|
+
? Value
|
|
54
|
+
: Value extends Array<infer U>
|
|
55
|
+
? Array<_PascalCasedPropertiesDeep<U, Options>>
|
|
56
|
+
: Value extends Set<infer U>
|
|
57
|
+
? Set<_PascalCasedPropertiesDeep<U, Options>>
|
|
58
|
+
: Value extends object
|
|
59
|
+
? {
|
|
60
|
+
[K in keyof Value as PascalCase<K, Options>]: _PascalCasedPropertiesDeep<Value[K], Options>;
|
|
61
|
+
}
|
|
62
|
+
: Value;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type {CamelCaseOptions, DefaultCamelCaseOptions} from './camel-case';
|
|
2
|
+
import type {ApplyDefaultOptions} from './internal';
|
|
3
|
+
import type {PascalCase} from './pascal-case';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
Convert object properties to pascal case but not recursively.
|
|
7
|
+
|
|
8
|
+
This can be useful when, for example, converting some API types from a different style.
|
|
9
|
+
|
|
10
|
+
@see PascalCase
|
|
11
|
+
@see PascalCasedPropertiesDeep
|
|
12
|
+
|
|
13
|
+
@example
|
|
14
|
+
```
|
|
15
|
+
import type {PascalCasedProperties} from 'type-fest';
|
|
16
|
+
|
|
17
|
+
interface User {
|
|
18
|
+
userId: number;
|
|
19
|
+
userName: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const result: PascalCasedProperties<User> = {
|
|
23
|
+
UserId: 1,
|
|
24
|
+
UserName: 'Tom',
|
|
25
|
+
};
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
@category Change case
|
|
29
|
+
@category Template literal
|
|
30
|
+
@category Object
|
|
31
|
+
*/
|
|
32
|
+
export type PascalCasedProperties<Value, Options extends CamelCaseOptions = {}> = Value extends Function
|
|
33
|
+
? Value
|
|
34
|
+
: Value extends Array<infer U>
|
|
35
|
+
? Value
|
|
36
|
+
: {[K in keyof Value as PascalCase<K, ApplyDefaultOptions<CamelCaseOptions, DefaultCamelCaseOptions, Options>>]: Value[K]};
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import type {StaticPartOfArray, VariablePartOfArray, NonRecursiveType, ToString, IsNumberLike, ApplyDefaultOptions} from './internal';
|
|
2
|
+
import type {EmptyObject} from './empty-object';
|
|
3
|
+
import type {IsAny} from './is-any';
|
|
4
|
+
import type {UnknownArray} from './unknown-array';
|
|
5
|
+
import type {Subtract} from './subtract';
|
|
6
|
+
import type {GreaterThan} from './greater-than';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
Paths options.
|
|
10
|
+
|
|
11
|
+
@see {@link Paths}
|
|
12
|
+
*/
|
|
13
|
+
export type PathsOptions = {
|
|
14
|
+
/**
|
|
15
|
+
The maximum depth to recurse when searching for paths.
|
|
16
|
+
|
|
17
|
+
@default 10
|
|
18
|
+
*/
|
|
19
|
+
maxRecursionDepth?: number;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
Use bracket notation for array indices and numeric object keys.
|
|
23
|
+
|
|
24
|
+
@default false
|
|
25
|
+
|
|
26
|
+
@example
|
|
27
|
+
```
|
|
28
|
+
type ArrayExample = {
|
|
29
|
+
array: ['foo'];
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
type A = Paths<ArrayExample, {bracketNotation: false}>;
|
|
33
|
+
//=> 'array' | 'array.0'
|
|
34
|
+
|
|
35
|
+
type B = Paths<ArrayExample, {bracketNotation: true}>;
|
|
36
|
+
//=> 'array' | 'array[0]'
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
@example
|
|
40
|
+
```
|
|
41
|
+
type NumberKeyExample = {
|
|
42
|
+
1: ['foo'];
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
type A = Paths<NumberKeyExample, {bracketNotation: false}>;
|
|
46
|
+
//=> 1 | '1' | '1.0'
|
|
47
|
+
|
|
48
|
+
type B = Paths<NumberKeyExample, {bracketNotation: true}>;
|
|
49
|
+
//=> '[1]' | '[1][0]'
|
|
50
|
+
```
|
|
51
|
+
*/
|
|
52
|
+
bracketNotation?: boolean;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
Only include leaf paths in the output.
|
|
56
|
+
|
|
57
|
+
@default false
|
|
58
|
+
|
|
59
|
+
@example
|
|
60
|
+
```
|
|
61
|
+
type Post = {
|
|
62
|
+
id: number;
|
|
63
|
+
author: {
|
|
64
|
+
id: number;
|
|
65
|
+
name: {
|
|
66
|
+
first: string;
|
|
67
|
+
last: string;
|
|
68
|
+
};
|
|
69
|
+
};
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
type AllPaths = Paths<Post, {leavesOnly: false}>;
|
|
73
|
+
//=> 'id' | 'author' | 'author.id' | 'author.name' | 'author.name.first' | 'author.name.last'
|
|
74
|
+
|
|
75
|
+
type LeafPaths = Paths<Post, {leavesOnly: true}>;
|
|
76
|
+
//=> 'id' | 'author.id' | 'author.name.first' | 'author.name.last'
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
@example
|
|
80
|
+
```
|
|
81
|
+
type ArrayExample = {
|
|
82
|
+
array: Array<{foo: string}>;
|
|
83
|
+
tuple: [string, {bar: string}];
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
type AllPaths = Paths<ArrayExample, {leavesOnly: false}>;
|
|
87
|
+
//=> 'array' | `array.${number}` | `array.${number}.foo` | 'tuple' | 'tuple.0' | 'tuple.1' | 'tuple.1.bar'
|
|
88
|
+
|
|
89
|
+
type LeafPaths = Paths<ArrayExample, {leavesOnly: true}>;
|
|
90
|
+
//=> `array.${number}.foo` | 'tuple.0' | 'tuple.1.bar'
|
|
91
|
+
```
|
|
92
|
+
*/
|
|
93
|
+
leavesOnly?: boolean;
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
Only include paths at the specified depth. By default all paths up to {@link PathsOptions.maxRecursionDepth | `maxRecursionDepth`} are included.
|
|
97
|
+
|
|
98
|
+
Note: Depth starts at `0` for root properties.
|
|
99
|
+
|
|
100
|
+
@default number
|
|
101
|
+
|
|
102
|
+
@example
|
|
103
|
+
```
|
|
104
|
+
type Post = {
|
|
105
|
+
id: number;
|
|
106
|
+
author: {
|
|
107
|
+
id: number;
|
|
108
|
+
name: {
|
|
109
|
+
first: string;
|
|
110
|
+
last: string;
|
|
111
|
+
};
|
|
112
|
+
};
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
type DepthZero = Paths<Post, {depth: 0}>;
|
|
116
|
+
//=> 'id' | 'author'
|
|
117
|
+
|
|
118
|
+
type DepthOne = Paths<Post, {depth: 1}>;
|
|
119
|
+
//=> 'author.id' | 'author.name'
|
|
120
|
+
|
|
121
|
+
type DepthTwo = Paths<Post, {depth: 2}>;
|
|
122
|
+
//=> 'author.name.first' | 'author.name.last'
|
|
123
|
+
|
|
124
|
+
type LeavesAtDepthOne = Paths<Post, {leavesOnly: true; depth: 1}>;
|
|
125
|
+
//=> 'author.id'
|
|
126
|
+
```
|
|
127
|
+
*/
|
|
128
|
+
depth?: number;
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
type DefaultPathsOptions = {
|
|
132
|
+
maxRecursionDepth: 10;
|
|
133
|
+
bracketNotation: false;
|
|
134
|
+
leavesOnly: false;
|
|
135
|
+
depth: number;
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
Generate a union of all possible paths to properties in the given object.
|
|
140
|
+
|
|
141
|
+
It also works with arrays.
|
|
142
|
+
|
|
143
|
+
Use-case: You want a type-safe way to access deeply nested properties in an object.
|
|
144
|
+
|
|
145
|
+
@example
|
|
146
|
+
```
|
|
147
|
+
import type {Paths} from 'type-fest';
|
|
148
|
+
|
|
149
|
+
type Project = {
|
|
150
|
+
filename: string;
|
|
151
|
+
listA: string[];
|
|
152
|
+
listB: [{filename: string}];
|
|
153
|
+
folder: {
|
|
154
|
+
subfolder: {
|
|
155
|
+
filename: string;
|
|
156
|
+
};
|
|
157
|
+
};
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
type ProjectPaths = Paths<Project>;
|
|
161
|
+
//=> 'filename' | 'listA' | 'listB' | 'folder' | `listA.${number}` | 'listB.0' | 'listB.0.filename' | 'folder.subfolder' | 'folder.subfolder.filename'
|
|
162
|
+
|
|
163
|
+
declare function open<Path extends ProjectPaths>(path: Path): void;
|
|
164
|
+
|
|
165
|
+
open('filename'); // Pass
|
|
166
|
+
open('folder.subfolder'); // Pass
|
|
167
|
+
open('folder.subfolder.filename'); // Pass
|
|
168
|
+
open('foo'); // TypeError
|
|
169
|
+
|
|
170
|
+
// Also works with arrays
|
|
171
|
+
open('listA.1'); // Pass
|
|
172
|
+
open('listB.0'); // Pass
|
|
173
|
+
open('listB.1'); // TypeError. Because listB only has one element.
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
@category Object
|
|
177
|
+
@category Array
|
|
178
|
+
*/
|
|
179
|
+
export type Paths<T, Options extends PathsOptions = {}> = _Paths<T, ApplyDefaultOptions<PathsOptions, DefaultPathsOptions, Options>>;
|
|
180
|
+
|
|
181
|
+
type _Paths<T, Options extends Required<PathsOptions>> =
|
|
182
|
+
T extends NonRecursiveType | ReadonlyMap<unknown, unknown> | ReadonlySet<unknown>
|
|
183
|
+
? never
|
|
184
|
+
: IsAny<T> extends true
|
|
185
|
+
? never
|
|
186
|
+
: T extends UnknownArray
|
|
187
|
+
? number extends T['length']
|
|
188
|
+
// We need to handle the fixed and non-fixed index part of the array separately.
|
|
189
|
+
? InternalPaths<StaticPartOfArray<T>, Options>
|
|
190
|
+
| InternalPaths<Array<VariablePartOfArray<T>[number]>, Options>
|
|
191
|
+
: InternalPaths<T, Options>
|
|
192
|
+
: T extends object
|
|
193
|
+
? InternalPaths<T, Options>
|
|
194
|
+
: never;
|
|
195
|
+
|
|
196
|
+
type InternalPaths<T, Options extends Required<PathsOptions>> =
|
|
197
|
+
Options['maxRecursionDepth'] extends infer MaxDepth extends number
|
|
198
|
+
? Required<T> extends infer T
|
|
199
|
+
? T extends EmptyObject | readonly []
|
|
200
|
+
? never
|
|
201
|
+
: {
|
|
202
|
+
[Key in keyof T]:
|
|
203
|
+
Key extends string | number // Limit `Key` to string or number.
|
|
204
|
+
? (
|
|
205
|
+
Options['bracketNotation'] extends true
|
|
206
|
+
? IsNumberLike<Key> extends true
|
|
207
|
+
? `[${Key}]`
|
|
208
|
+
: (Key | ToString<Key>)
|
|
209
|
+
: never
|
|
210
|
+
|
|
|
211
|
+
Options['bracketNotation'] extends false
|
|
212
|
+
// If `Key` is a number, return `Key | `${Key}``, because both `array[0]` and `array['0']` work.
|
|
213
|
+
? (Key | ToString<Key>)
|
|
214
|
+
: never
|
|
215
|
+
) extends infer TranformedKey extends string | number ?
|
|
216
|
+
// 1. If style is 'a[0].b' and 'Key' is a numberlike value like 3 or '3', transform 'Key' to `[${Key}]`, else to `${Key}` | Key
|
|
217
|
+
// 2. If style is 'a.0.b', transform 'Key' to `${Key}` | Key
|
|
218
|
+
| ((Options['leavesOnly'] extends true
|
|
219
|
+
? MaxDepth extends 0
|
|
220
|
+
? TranformedKey
|
|
221
|
+
: T[Key] extends EmptyObject | readonly [] | NonRecursiveType | ReadonlyMap<unknown, unknown> | ReadonlySet<unknown>
|
|
222
|
+
? TranformedKey
|
|
223
|
+
: never
|
|
224
|
+
: TranformedKey
|
|
225
|
+
) extends infer _TransformedKey
|
|
226
|
+
// If `depth` is provided, the condition becomes truthy only when it reaches `0`.
|
|
227
|
+
// Otherwise, since `depth` defaults to `number`, the condition is always truthy, returning paths at all depths.
|
|
228
|
+
? 0 extends Options['depth']
|
|
229
|
+
? _TransformedKey
|
|
230
|
+
: never
|
|
231
|
+
: never)
|
|
232
|
+
| (
|
|
233
|
+
// Recursively generate paths for the current key
|
|
234
|
+
GreaterThan<MaxDepth, 0> extends true // Limit the depth to prevent infinite recursion
|
|
235
|
+
? _Paths<T[Key],
|
|
236
|
+
{
|
|
237
|
+
bracketNotation: Options['bracketNotation'];
|
|
238
|
+
maxRecursionDepth: Subtract<MaxDepth, 1>;
|
|
239
|
+
leavesOnly: Options['leavesOnly'];
|
|
240
|
+
depth: Subtract<Options['depth'], 1>;
|
|
241
|
+
}> extends infer SubPath
|
|
242
|
+
? SubPath extends string | number
|
|
243
|
+
? (
|
|
244
|
+
Options['bracketNotation'] extends true
|
|
245
|
+
? SubPath extends `[${any}]` | `[${any}]${string}`
|
|
246
|
+
? `${TranformedKey}${SubPath}` // If next node is number key like `[3]`, no need to add `.` before it.
|
|
247
|
+
: `${TranformedKey}.${SubPath}`
|
|
248
|
+
: never
|
|
249
|
+
) | (
|
|
250
|
+
Options['bracketNotation'] extends false
|
|
251
|
+
? `${TranformedKey}.${SubPath}`
|
|
252
|
+
: never
|
|
253
|
+
)
|
|
254
|
+
: never
|
|
255
|
+
: never
|
|
256
|
+
: never
|
|
257
|
+
)
|
|
258
|
+
: never
|
|
259
|
+
: never
|
|
260
|
+
}[keyof T & (T extends UnknownArray ? number : unknown)]
|
|
261
|
+
: never
|
|
262
|
+
: never;
|