source: trip-planner-front/node_modules/type-fest/ts41/delimiter-case.d.ts@ 8d391a1

Last change on this file since 8d391a1 was 6a3a178, checked in by Ema <ema_spirova@…>, 3 years ago

initial commit

  • Property mode set to 100644
File size: 2.8 KB
Line 
1import {UpperCaseCharacters, WordSeparators} from '../source/utilities';
2
3/**
4Unlike a simpler split, this one includes the delimiter splitted on in the resulting array literal. This is to enable splitting on, for example, upper-case characters.
5*/
6export type SplitIncludingDelimiters<Source extends string, Delimiter extends string> =
7 Source extends '' ? [] :
8 Source extends `${infer FirstPart}${Delimiter}${infer SecondPart}` ?
9 (
10 Source extends `${FirstPart}${infer UsedDelimiter}${SecondPart}`
11 ? UsedDelimiter extends Delimiter
12 ? Source extends `${infer FirstPart}${UsedDelimiter}${infer SecondPart}`
13 ? [...SplitIncludingDelimiters<FirstPart, Delimiter>, UsedDelimiter, ...SplitIncludingDelimiters<SecondPart, Delimiter>]
14 : never
15 : never
16 : never
17 ) :
18 [Source];
19
20/**
21Format a specific part of the splitted string literal that `StringArrayToDelimiterCase<>` fuses together, ensuring desired casing.
22
23@see StringArrayToDelimiterCase
24*/
25type StringPartToDelimiterCase<StringPart extends string, UsedWordSeparators extends string, UsedUpperCaseCharacters extends string, Delimiter extends string> =
26 StringPart extends UsedWordSeparators ? Delimiter :
27 StringPart extends UsedUpperCaseCharacters ? `${Delimiter}${Lowercase<StringPart>}` :
28 StringPart;
29
30/**
31Takes the result of a splitted string literal and recursively concatenates it together into the desired casing.
32
33It receives `UsedWordSeparators` and `UsedUpperCaseCharacters` as input to ensure it's fully encapsulated.
34
35@see SplitIncludingDelimiters
36*/
37type StringArrayToDelimiterCase<Parts extends any[], UsedWordSeparators extends string, UsedUpperCaseCharacters extends string, Delimiter extends string> =
38 Parts extends [`${infer FirstPart}`, ...infer RemainingParts]
39 ? `${StringPartToDelimiterCase<FirstPart, UsedWordSeparators, UsedUpperCaseCharacters, Delimiter>}${StringArrayToDelimiterCase<RemainingParts, UsedWordSeparators, UsedUpperCaseCharacters, Delimiter>}`
40 : '';
41
42/**
43Convert a string literal to a custom string delimiter casing.
44
45This can be useful when, for example, converting a camel-cased object property to an oddly cased one.
46
47@see KebabCase
48@see SnakeCase
49
50@example
51```
52import {DelimiterCase} from 'type-fest';
53
54// Simple
55
56const someVariable: DelimiterCase<'fooBar', '#'> = 'foo#bar';
57
58// Advanced
59
60type OddlyCasedProps<T> = {
61 [K in keyof T as DelimiterCase<K, '#'>]: T[K]
62};
63
64interface SomeOptions {
65 dryRun: boolean;
66 includeFile: string;
67 foo: number;
68}
69
70const rawCliOptions: OddlyCasedProps<SomeOptions> = {
71 'dry#run': true,
72 'include#file': 'bar.js',
73 foo: 123
74};
75```
76*/
77
78export type DelimiterCase<Value, Delimiter extends string> = Value extends string
79 ? StringArrayToDelimiterCase<
80 SplitIncludingDelimiters<Value, WordSeparators | UpperCaseCharacters>,
81 WordSeparators,
82 UpperCaseCharacters,
83 Delimiter
84 >
85 : Value;
Note: See TracBrowser for help on using the repository browser.