Software zum Installieren eines Smart-Mirror Frameworks , zum Nutzen von hochschulrelevanten Informationen, auf einem Raspberry-Pi.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

delimiter-case.d.ts 2.8KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import {UpperCaseCharacters, WordSeparators} from '../source/utilities';
  2. /**
  3. Unlike 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.
  4. */
  5. export type SplitIncludingDelimiters<Source extends string, Delimiter extends string> =
  6. Source extends '' ? [] :
  7. Source extends `${infer FirstPart}${Delimiter}${infer SecondPart}` ?
  8. (
  9. Source extends `${FirstPart}${infer UsedDelimiter}${SecondPart}`
  10. ? UsedDelimiter extends Delimiter
  11. ? Source extends `${infer FirstPart}${UsedDelimiter}${infer SecondPart}`
  12. ? [...SplitIncludingDelimiters<FirstPart, Delimiter>, UsedDelimiter, ...SplitIncludingDelimiters<SecondPart, Delimiter>]
  13. : never
  14. : never
  15. : never
  16. ) :
  17. [Source];
  18. /**
  19. Format a specific part of the splitted string literal that `StringArrayToDelimiterCase<>` fuses together, ensuring desired casing.
  20. @see StringArrayToDelimiterCase
  21. */
  22. type StringPartToDelimiterCase<StringPart extends string, UsedWordSeparators extends string, UsedUpperCaseCharacters extends string, Delimiter extends string> =
  23. StringPart extends UsedWordSeparators ? Delimiter :
  24. StringPart extends UsedUpperCaseCharacters ? `${Delimiter}${Lowercase<StringPart>}` :
  25. StringPart;
  26. /**
  27. Takes the result of a splitted string literal and recursively concatenates it together into the desired casing.
  28. It receives `UsedWordSeparators` and `UsedUpperCaseCharacters` as input to ensure it's fully encapsulated.
  29. @see SplitIncludingDelimiters
  30. */
  31. type StringArrayToDelimiterCase<Parts extends any[], UsedWordSeparators extends string, UsedUpperCaseCharacters extends string, Delimiter extends string> =
  32. Parts extends [`${infer FirstPart}`, ...infer RemainingParts]
  33. ? `${StringPartToDelimiterCase<FirstPart, UsedWordSeparators, UsedUpperCaseCharacters, Delimiter>}${StringArrayToDelimiterCase<RemainingParts, UsedWordSeparators, UsedUpperCaseCharacters, Delimiter>}`
  34. : '';
  35. /**
  36. Convert a string literal to a custom string delimiter casing.
  37. This can be useful when, for example, converting a camel-cased object property to an oddly cased one.
  38. @see KebabCase
  39. @see SnakeCase
  40. @example
  41. ```
  42. import {DelimiterCase} from 'type-fest';
  43. // Simple
  44. const someVariable: DelimiterCase<'fooBar', '#'> = 'foo#bar';
  45. // Advanced
  46. type OddlyCasedProps<T> = {
  47. [K in keyof T as DelimiterCase<K, '#'>]: T[K]
  48. };
  49. interface SomeOptions {
  50. dryRun: boolean;
  51. includeFile: string;
  52. foo: number;
  53. }
  54. const rawCliOptions: OddlyCasedProps<SomeOptions> = {
  55. 'dry#run': true,
  56. 'include#file': 'bar.js',
  57. foo: 123
  58. };
  59. ```
  60. */
  61. export type DelimiterCase<Value, Delimiter extends string> = Value extends string
  62. ? StringArrayToDelimiterCase<
  63. SplitIncludingDelimiters<Value, WordSeparators | UpperCaseCharacters>,
  64. WordSeparators,
  65. UpperCaseCharacters,
  66. Delimiter
  67. >
  68. : Value;