@bedard/types
Advanced tools
Comparing version 0.6.0 to 0.7.0
# Changelog | ||
## 0.7.0 | ||
- [`CamelCaseKeys`](https://github.com/scottbedard/types#camelcasekeyst) | ||
- [`CamelCaseKeysDeep`](https://github.com/scottbedard/types#camelcasekeysdeept) | ||
- [`KebabCaseKeys`](https://github.com/scottbedard/types#kebabcasekeyst) | ||
- [`KebabCaseKeysDeep`](https://github.com/scottbedard/types#kebabcasekeysdeept) | ||
- [`MapUppercase<T>`](https://github.com/scottbedard/types#mapuppercaset) | ||
- [`PascalCaseKeys`](https://github.com/scottbedard/types#pascalcasekeyst) | ||
- [`PascalCaseKeysDeep`](https://github.com/scottbedard/types#pascalcasekeysdeept) | ||
- [`ScreamingSnakeCase<T>`](https://github.com/scottbedard/types#screamingsnakecaset) | ||
- [`ScreamingSnakeCaseKeys`](https://github.com/scottbedard/types#screamingsnakecasekeyst) | ||
- [`ScreamingSnakeCaseKeysDeep`](https://github.com/scottbedard/types#screamingsnakecasekeysdeept) | ||
- [`SnakeCaseKeys`](https://github.com/scottbedard/types#snakecasekeyst) | ||
- [`SnakeCaseKeysDeep`](https://github.com/scottbedard/types#snakecasekeysdeept) | ||
## 0.6.0 | ||
@@ -4,0 +19,0 @@ |
import { Alphabet } from './utils' | ||
import { Equal } from './Equal' | ||
import { Last } from './Last' | ||
import { Split } from './Split' | ||
@@ -27,15 +28,28 @@ | ||
// break words by case | ||
// break word by casing change | ||
type BreakCase< | ||
T extends string, | ||
> = T extends Uppercase<T> | ||
? [T] | ||
: T extends Lowercase<T> | ||
? [T] | ||
: BreakCaseMixed<T> | ||
// break mixed case words by casing change | ||
type BreakCaseMixed< | ||
T extends string, | ||
CurrentWord extends string = '', | ||
Words extends string[] = [], | ||
> = Equal<CurrentWord, ''> extends true | ||
? T extends `${infer First}${infer Rest}` | ||
? BreakCase<Rest, First, Words> | ||
: never | ||
: T extends `${infer First}${infer Rest}` | ||
? First extends Alphabet | ||
? BreakCase<Rest, `${CurrentWord}${First}`, Words> | ||
: BreakCase<T, '', [...Words, CurrentWord]> | ||
: [...Words, CurrentWord] | ||
> = T extends `${infer CurrentChar}${infer RestChars}` | ||
? CurrentWord extends '' | ||
? BreakCaseMixed<RestChars, CurrentChar, Words> | ||
: SameWord<CurrentChar, Last<CurrentWord>> extends true | ||
? BreakCaseMixed<RestChars, `${CurrentWord}${CurrentChar}`, Words> | ||
: BreakCaseMixed<RestChars, CurrentChar, [...Words, CurrentWord]> | ||
: [...Words, CurrentWord] | ||
type SameWord<A, B> = A extends Lowercase<A> | ||
? true | ||
: B extends Uppercase<B> | ||
? true | ||
: false |
@@ -5,6 +5,8 @@ /** | ||
type Alphabet = "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" | "j" | "k" | "l" | "m" | "n" | "o" | "p" | "q" | "r" | "s" | "t" | "u" | "v" | "w" | "x" | "y" | "z"; | ||
declare const version = "0.6.0"; | ||
declare const version = "0.7.0"; | ||
export { AllEqual } from './AllEqual'; | ||
export { BreakWords } from './BreakWords'; | ||
export { CamelCase } from './CamelCase'; | ||
export { CamelCaseKeys } from './CamelCaseKeys'; | ||
export { CamelCaseKeysDeep } from './CamelCaseKeysDeep'; | ||
export { Difference } from './Difference'; | ||
@@ -18,5 +20,8 @@ export { Equal } from './Equal'; | ||
export { KebabCase } from './KebabCase'; | ||
export { KebabCaseKeys } from './KebabCaseKeys'; | ||
export { KebabCaseKeysDeep } from './KebabCaseKeysDeep'; | ||
export { Last } from './Last'; | ||
export { MapCapitalize } from './MapCapitalize'; | ||
export { MapLowercase } from './MapLowercase'; | ||
export { MapUppercase } from './MapUppercase'; | ||
export { Not } from './Not'; | ||
@@ -26,5 +31,12 @@ export { NotEqual } from './NotEqual'; | ||
export { PascalCase } from './PascalCase'; | ||
export { PascalCaseKeys } from './PascalCaseKeys'; | ||
export { PascalCaseKeysDeep } from './PascalCaseKeysDeep'; | ||
export { Pop } from './Pop'; | ||
export { ScreamingSnakeCase } from './ScreamingSnakeCase'; | ||
export { ScreamingSnakeCaseKeys } from './ScreamingSnakeCaseKeys'; | ||
export { ScreamingSnakeCaseKeysDeep } from './ScreamingSnakeCaseKeysDeep'; | ||
export { Shift } from './Shift'; | ||
export { SnakeCase } from './SnakeCase'; | ||
export { SnakeCaseKeys } from './SnakeCaseKeys'; | ||
export { SnakeCaseKeysDeep } from './SnakeCaseKeysDeep'; | ||
export { Split } from './Split'; | ||
@@ -31,0 +43,0 @@ export { SymmetricDifference } from './SymetricDifference'; |
@@ -5,6 +5,8 @@ /** | ||
type Alphabet = "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" | "j" | "k" | "l" | "m" | "n" | "o" | "p" | "q" | "r" | "s" | "t" | "u" | "v" | "w" | "x" | "y" | "z"; | ||
declare const version = "0.6.0"; | ||
declare const version = "0.7.0"; | ||
export { AllEqual } from './AllEqual'; | ||
export { BreakWords } from './BreakWords'; | ||
export { CamelCase } from './CamelCase'; | ||
export { CamelCaseKeys } from './CamelCaseKeys'; | ||
export { CamelCaseKeysDeep } from './CamelCaseKeysDeep'; | ||
export { Difference } from './Difference'; | ||
@@ -18,5 +20,8 @@ export { Equal } from './Equal'; | ||
export { KebabCase } from './KebabCase'; | ||
export { KebabCaseKeys } from './KebabCaseKeys'; | ||
export { KebabCaseKeysDeep } from './KebabCaseKeysDeep'; | ||
export { Last } from './Last'; | ||
export { MapCapitalize } from './MapCapitalize'; | ||
export { MapLowercase } from './MapLowercase'; | ||
export { MapUppercase } from './MapUppercase'; | ||
export { Not } from './Not'; | ||
@@ -26,5 +31,12 @@ export { NotEqual } from './NotEqual'; | ||
export { PascalCase } from './PascalCase'; | ||
export { PascalCaseKeys } from './PascalCaseKeys'; | ||
export { PascalCaseKeysDeep } from './PascalCaseKeysDeep'; | ||
export { Pop } from './Pop'; | ||
export { ScreamingSnakeCase } from './ScreamingSnakeCase'; | ||
export { ScreamingSnakeCaseKeys } from './ScreamingSnakeCaseKeys'; | ||
export { ScreamingSnakeCaseKeysDeep } from './ScreamingSnakeCaseKeysDeep'; | ||
export { Shift } from './Shift'; | ||
export { SnakeCase } from './SnakeCase'; | ||
export { SnakeCaseKeys } from './SnakeCaseKeys'; | ||
export { SnakeCaseKeysDeep } from './SnakeCaseKeysDeep'; | ||
export { Split } from './Split'; | ||
@@ -31,0 +43,0 @@ export { SymmetricDifference } from './SymetricDifference'; |
@@ -1,3 +0,3 @@ | ||
const version = '0.6.0'; | ||
const version = '0.7.0'; | ||
export { version }; |
@@ -5,4 +5,4 @@ 'use strict'; | ||
const version = '0.6.0'; | ||
const version = '0.7.0'; | ||
exports.version = version; |
@@ -7,7 +7,7 @@ /** | ||
*/ | ||
export type MapCapitalize< | ||
T extends string[], | ||
Acc extends string[] = [], | ||
export type MapCapitalize< | ||
T extends string[], | ||
Acc extends string[] = [], | ||
> = T extends [infer Head, ...infer Tail] | ||
? MapCapitalize<Tail, [...Acc, Capitalize<Head>]> | ||
: Acc | ||
? MapCapitalize<Tail, [...Acc, Capitalize<Head>]> | ||
: Acc |
@@ -12,2 +12,2 @@ import { BreakWords } from './BreakWords' | ||
*/ | ||
export type PascalCase<T extends string> = Capitalize<Join<MapCapitalize<MapLowercase<BreakWords<T>>>>> | ||
export type PascalCase<T extends string> = Join<MapCapitalize<MapLowercase<BreakWords<T>>>> |
import { BreakWords } from './BreakWords' | ||
import { Join } from './Join' | ||
import { MapLowercase } from './MapLowercase' | ||
@@ -11,2 +10,2 @@ /** | ||
*/ | ||
export type SnakeCase<T extends string> = Join<MapLowercase<BreakWords<T>>, '_'> | ||
export type SnakeCase<T extends string> = Lowercase<Join<BreakWords<T>, '_'>> |
@@ -0,1 +1,3 @@ | ||
import { Equal } from './Equal' | ||
/** | ||
@@ -19,7 +21,8 @@ * Split `Source` by `Delimeter`. | ||
Delimeter extends string = '', | ||
Parts extends string[] = [], | ||
> = Source extends `${infer Head}${Delimeter}${infer Tail}` | ||
? [Head, ...WalkString<Tail, Delimeter>] | ||
: Source extends Delimeter | ||
? [] | ||
: [Source] | ||
? WalkString<Tail, Delimeter, [...Parts, Head]> | ||
: Equal<Source, ''> extends true | ||
? Parts | ||
: [...Parts, Source] | ||
@@ -26,0 +29,0 @@ // walk over strings and split each by delimeter |
@@ -35,3 +35,3 @@ { | ||
}, | ||
"version": "0.6.0" | ||
"version": "0.7.0" | ||
} |
136
README.md
@@ -24,2 +24,4 @@ # `@bedard/types` | ||
- [`CamelCase<T>`](#camelcaset) | ||
- [`CamelCaseKeys<T>`](#camelcasekeyst) | ||
- [`CamelCaseKeysDeep<T>`](#camelcasekeysdeept) | ||
- [`Difference<A, B>`](#differencea-b) | ||
@@ -33,5 +35,8 @@ - [`Equal<A, B>`](#equala-b) | ||
- [`KebabCase<T>`](#kebabcaset) | ||
- [`KebabCaseKeys<T>`](#kebabcasekeyst) | ||
- [`KebabCaseKeysDeep<T>`](#kebabcasekeysdeept) | ||
- [`Last<T>`](#lastt) | ||
- [`MapCapitalize<T>`](#mapcapitalizet) | ||
- [`MapLowercase<T>`](#maplowercaset) | ||
- [`MapUppercase<T>`](#mapuppercaset) | ||
- [`Not<T>`](#nott) | ||
@@ -41,5 +46,12 @@ - [`NotEqual<A, B>`](#notequala-b) | ||
- [`PascalCase<T>`](#pascalcaset) | ||
- [`PascalCaseKeys<T>`](#pascalcasekeyst) | ||
- [`PascalCaseKeysDeep<T>`](#pascalcasekeysdeept) | ||
- [`Pop<T>`](#popt) | ||
- [`ScreamingSnakeCase<T>`](#screamingsnakecaset) | ||
- [`ScreamingSnakeCaseKeys<T>`](#screamingsnakecasekeyst) | ||
- [`ScreamingSnakeCaseKeysDeep<T>`](#screamingsnakecasekeysdeept) | ||
- [`Shift<T>`](#shiftt) | ||
- [`SnakeCase<T>`](#snakecaset) | ||
- [`SnakeCaseKeys<T>`](#snakecasekeyst) | ||
- [`SnakeCaseKeysDeep<T>`](#snakecasekeysdeept) | ||
- [`Split<Source, Delimeter>`](#splitsource-delimeter) | ||
@@ -64,3 +76,3 @@ - [`SymmetricDifference<A, B>`](#symmetricdifferencea-b) | ||
Explode a string by common word breaks. This currently includes spaces, hyphens, underscores, and camel casing. | ||
Explode a string by common word breaks. This currently includes spaces, hyphens, underscores, and casing changes. | ||
@@ -70,3 +82,3 @@ ```ts | ||
type Words = BreakWords<'one two-three_fourFive'> // ['one', 'two', 'three', 'four', 'Five'] | ||
type Words = BreakWords<'one twoThree-four'> // ['one', 'two', 'Three', 'four'] | ||
``` | ||
@@ -84,2 +96,22 @@ | ||
### `CamelCaseKeys<T>` | ||
Camel case object keys. | ||
```ts | ||
import { CamelCaseKeys } from '@bedard/types' | ||
type Obj = CamelCaseKeys<{ foo_bar: any }> // { fooBar: any } | ||
``` | ||
### `CamelCaseKeysDeep<T>` | ||
Deeply camel case object keys. | ||
```ts | ||
import { CamelCaseKeysDeep } from '@bedard/types' | ||
type Obj = CamelCaseKeysDeep<{ foo_bar: { one_two: any }}> // { fooBar: { oneTwo: any }} | ||
``` | ||
### `Difference<A, B>` | ||
@@ -168,2 +200,22 @@ | ||
### `KebabCaseKeys<T>` | ||
Kebab case object keys. | ||
```ts | ||
import { KebabCaseKeys } from '@bedard/types' | ||
type Obj = KebabCaseKeys<{ foo_bar: any }> // { 'foo-bar': any } | ||
``` | ||
### `KebabCaseKeysDeep<T>` | ||
Deeply kebab case object keys. | ||
```ts | ||
import { KebabCaseKeysDeep } from '@bedard/types' | ||
type Obj = KebabCaseKeysDeep<{ foo_bar: { one_two: any }}> // { 'foo-bar': { 'one-two': any }} | ||
``` | ||
### `Last<T>` | ||
@@ -200,2 +252,12 @@ | ||
### `MapUppercase<T>` | ||
Map strings to uppercase. | ||
```ts | ||
import { MapUppercase } from '@bedard/types' | ||
type Upper = MapUppercase<['a', 'b']> // ['A', 'B'] | ||
``` | ||
### `Not<T>` | ||
@@ -243,2 +305,22 @@ | ||
### `PascalCaseKeys<T>` | ||
Kebab case object keys. | ||
```ts | ||
import { PascalCaseKeys } from '@bedard/types' | ||
type Obj = PascalCaseKeys<{ foo_bar: any }> // { 'foo-bar': any } | ||
``` | ||
### `PascalCaseKeysDeep<T>` | ||
Deeply pascal case object keys. | ||
```ts | ||
import { PascalCaseKeysDeep } from '@bedard/types' | ||
type Obj = PascalCaseKeysDeep<{ foo_bar: { one_two: any }}> // { FooBar: { OneTwo: any }} | ||
``` | ||
### `Pop<T>` | ||
@@ -254,2 +336,32 @@ | ||
### `ScreamingSnakeCase<T>` | ||
Convert a string to screaming snake case. | ||
```ts | ||
import { ScreamingSnakeCase } from '@bedard/types' | ||
type Str = ScreamingSnakeCase<'fooBar'> // 'FOO_BAR' | ||
``` | ||
### `ScreamingSnakeCaseKeys<T>` | ||
Screaming snake case object keys. | ||
```ts | ||
import { ScreamingSnakeCaseKeys } from '@bedard/types' | ||
type Obj = ScreamingSnakeCaseKeys<{ foo_bar: any }> // { FOO_BAR: any } | ||
``` | ||
### `ScreamingSnakeCaseKeysDeep<T>` | ||
Deeply screaming snake case object keys. | ||
```ts | ||
import { ScreamingSnakeCaseKeysDeep } from '@bedard/types' | ||
type Obj = ScreamingSnakeCaseKeysDeep<{ foo_bar: { one_two: any }}> // { FOO_BAR: { ONE_TWO: any }} | ||
``` | ||
### `Shift<T>` | ||
@@ -275,2 +387,22 @@ | ||
### `SnakeCaseKeys<T>` | ||
Snake case object keys. | ||
```ts | ||
import { SnakeCaseKeys } from '@bedard/types' | ||
type Obj = SnakeCaseKeys<{ fooBar: any }> // { foo_bar: any } | ||
``` | ||
### `SnakeCaseKeysDeep<T>` | ||
Deeply snake case object keys. | ||
```ts | ||
import { SnakeCaseKeysDeep } from '@bedard/types' | ||
type Obj = SnakeCaseKeysDeep<{ fooBar: { oneTwo: any }}> // { foo_bar: { one_two: any }} | ||
``` | ||
### `Split<Source, Delimeter>` | ||
@@ -277,0 +409,0 @@ |
import { Alphabet } from './utils' | ||
import { Equal } from './Equal' | ||
import { Last } from './Last' | ||
import { Split } from './Split' | ||
@@ -27,15 +28,28 @@ | ||
// break words by case | ||
// break word by casing change | ||
type BreakCase< | ||
T extends string, | ||
> = T extends Uppercase<T> | ||
? [T] | ||
: T extends Lowercase<T> | ||
? [T] | ||
: BreakCaseMixed<T> | ||
// break mixed case words by casing change | ||
type BreakCaseMixed< | ||
T extends string, | ||
CurrentWord extends string = '', | ||
Words extends string[] = [], | ||
> = Equal<CurrentWord, ''> extends true | ||
? T extends `${infer First}${infer Rest}` | ||
? BreakCase<Rest, First, Words> | ||
: never | ||
: T extends `${infer First}${infer Rest}` | ||
? First extends Alphabet | ||
? BreakCase<Rest, `${CurrentWord}${First}`, Words> | ||
: BreakCase<T, '', [...Words, CurrentWord]> | ||
: [...Words, CurrentWord] | ||
> = T extends `${infer CurrentChar}${infer RestChars}` | ||
? CurrentWord extends '' | ||
? BreakCaseMixed<RestChars, CurrentChar, Words> | ||
: SameWord<CurrentChar, Last<CurrentWord>> extends true | ||
? BreakCaseMixed<RestChars, `${CurrentWord}${CurrentChar}`, Words> | ||
: BreakCaseMixed<RestChars, CurrentChar, [...Words, CurrentWord]> | ||
: [...Words, CurrentWord] | ||
type SameWord<A, B> = A extends Lowercase<A> | ||
? true | ||
: B extends Uppercase<B> | ||
? true | ||
: false |
@@ -9,4 +9,4 @@ import { | ||
it('explodes a string into parts', () => { | ||
type Test = Expect<Equal<['one', 'two', 'three', 'four', 'Five'], BreakWords<'one two-three_fourFive'>>> | ||
type Test = Expect<Equal<['one', 'two', 'three', 'four', 'Five', 'SIX', 'SEVEN'], BreakWords<'one two-three_fourFiveSIX_SEVEN'>>> | ||
}) | ||
}) |
@@ -8,8 +8,21 @@ import { | ||
describe('CamelCase', () => { | ||
it('converts string to camel case', () => { | ||
type FromCamel = Expect<Equal<'fooBarBaz', CamelCase<'fooBarBaz'>>> | ||
type FromKebab = Expect<Equal<'fooBarBaz', CamelCase<'foo-bar-baz'>>> | ||
type FromPascal = Expect<Equal<'fooBarBaz', CamelCase<'fooBarBaz'>>> | ||
type FromSnake = Expect<Equal<'fooBarBaz', CamelCase<'foo_bar_baz'>>> | ||
it('from camel', () => { | ||
type Test = Expect<Equal<'fooBarBaz', CamelCase<'fooBarBaz'>>> | ||
}) | ||
it('from kebab', () => { | ||
type Test = Expect<Equal<'fooBarBaz', CamelCase<'foo-bar-baz'>>> | ||
}) | ||
it('from pascal', () => { | ||
type Test = Expect<Equal<'fooBarBaz', CamelCase<'fooBarBaz'>>> | ||
}) | ||
it('from screaming snake', () => { | ||
type Test = Expect<Equal<'fooBarBaz', CamelCase<'FOO_BAR_BAZ'>>> | ||
}) | ||
it('from snake', () => { | ||
type Test = Expect<Equal<'fooBarBaz', CamelCase<'foo_bar_baz'>>> | ||
}) | ||
}) |
export { AllEqual } from './AllEqual' | ||
export { BreakWords } from './BreakWords' | ||
export { CamelCase } from './CamelCase' | ||
export { CamelCaseKeys } from './CamelCaseKeys' | ||
export { CamelCaseKeysDeep } from './CamelCaseKeysDeep' | ||
export { Difference } from './Difference' | ||
@@ -12,5 +14,8 @@ export { Equal } from './Equal' | ||
export { KebabCase } from './KebabCase' | ||
export { KebabCaseKeys } from './KebabCaseKeys' | ||
export { KebabCaseKeysDeep } from './KebabCaseKeysDeep' | ||
export { Last } from './Last' | ||
export { MapCapitalize } from './MapCapitalize' | ||
export { MapLowercase } from './MapLowercase' | ||
export { MapUppercase } from './MapUppercase' | ||
export { Not } from './Not' | ||
@@ -20,5 +25,12 @@ export { NotEqual } from './NotEqual' | ||
export { PascalCase } from './PascalCase' | ||
export { PascalCaseKeys } from './PascalCaseKeys' | ||
export { PascalCaseKeysDeep } from './PascalCaseKeysDeep' | ||
export { Pop } from './Pop' | ||
export { ScreamingSnakeCase } from './ScreamingSnakeCase' | ||
export { ScreamingSnakeCaseKeys } from './ScreamingSnakeCaseKeys' | ||
export { ScreamingSnakeCaseKeysDeep } from './ScreamingSnakeCaseKeysDeep' | ||
export { Shift } from './Shift' | ||
export { SnakeCase } from './SnakeCase' | ||
export { SnakeCaseKeys } from './SnakeCaseKeys' | ||
export { SnakeCaseKeysDeep } from './SnakeCaseKeysDeep' | ||
export { Split } from './Split' | ||
@@ -31,2 +43,2 @@ export { SymmetricDifference } from './SymetricDifference' | ||
export const version = '0.6.0' | ||
export const version = '0.7.0' |
@@ -8,8 +8,21 @@ import { | ||
describe('KebabCase', () => { | ||
it('converts string to kebab case', () => { | ||
type FromCamel = Expect<Equal<'foo-bar-baz', KebabCase<'fooBarBaz'>>> | ||
type FromKebab = Expect<Equal<'foo-bar-baz', KebabCase<'foo-bar-baz'>>> | ||
type FromPascal = Expect<Equal<'foo-bar-baz', KebabCase<'fooBarBaz'>>> | ||
type FromSnake = Expect<Equal<'foo-bar-baz', KebabCase<'foo_bar_baz'>>> | ||
it('from camel', () => { | ||
type Test = Expect<Equal<'foo-bar-baz', KebabCase<'fooBarBaz'>>> | ||
}) | ||
it('from kebab', () => { | ||
type Test = Expect<Equal<'foo-bar-baz', KebabCase<'foo-bar-baz'>>> | ||
}) | ||
it('from pascal', () => { | ||
type Test = Expect<Equal<'foo-bar-baz', KebabCase<'fooBarBaz'>>> | ||
}) | ||
it('from screaming snake', () => { | ||
type Test = Expect<Equal<'foo-bar-baz', KebabCase<'FOO_BAR_BAZ'>>> | ||
}) | ||
it('from snake', () => { | ||
type Test = Expect<Equal<'foo-bar-baz', KebabCase<'foo_bar_baz'>>> | ||
}) | ||
}) |
@@ -7,7 +7,7 @@ /** | ||
*/ | ||
export type MapCapitalize< | ||
T extends string[], | ||
Acc extends string[] = [], | ||
export type MapCapitalize< | ||
T extends string[], | ||
Acc extends string[] = [], | ||
> = T extends [infer Head, ...infer Tail] | ||
? MapCapitalize<Tail, [...Acc, Capitalize<Head>]> | ||
: Acc | ||
? MapCapitalize<Tail, [...Acc, Capitalize<Head>]> | ||
: Acc |
@@ -12,2 +12,2 @@ import { BreakWords } from './BreakWords' | ||
*/ | ||
export type PascalCase<T extends string> = Capitalize<Join<MapCapitalize<MapLowercase<BreakWords<T>>>>> | ||
export type PascalCase<T extends string> = Join<MapCapitalize<MapLowercase<BreakWords<T>>>> |
@@ -8,8 +8,21 @@ import { | ||
describe('PascalCase', () => { | ||
it('converts string to pascal case', () => { | ||
type FromCamel = Expect<Equal<'FooBarBaz', PascalCase<'fooBarBaz'>>> | ||
type FromKebab = Expect<Equal<'FooBarBaz', PascalCase<'foo-bar-baz'>>> | ||
type FromPascal = Expect<Equal<'FooBarBaz', PascalCase<'fooBarBaz'>>> | ||
type FromSnake = Expect<Equal<'FooBarBaz', PascalCase<'foo_bar_baz'>>> | ||
it('from camel', () => { | ||
type Test = Expect<Equal<'FooBarBaz', PascalCase<'fooBarBaz'>>> | ||
}) | ||
it('from kebab', () => { | ||
type Test = Expect<Equal<'FooBarBaz', PascalCase<'foo-bar-baz'>>> | ||
}) | ||
it('from pascal', () => { | ||
type Test = Expect<Equal<'FooBarBaz', PascalCase<'fooBarBaz'>>> | ||
}) | ||
it('from screaming snake', () => { | ||
type Test = Expect<Equal<'FooBarBaz', PascalCase<'FOO_BAR_BAZ'>>> | ||
}) | ||
it('from snake', () => { | ||
type Test = Expect<Equal<'FooBarBaz', PascalCase<'foo_bar_baz'>>> | ||
}) | ||
}) |
import { BreakWords } from './BreakWords' | ||
import { Join } from './Join' | ||
import { MapLowercase } from './MapLowercase' | ||
@@ -11,2 +10,2 @@ /** | ||
*/ | ||
export type SnakeCase<T extends string> = Join<MapLowercase<BreakWords<T>>, '_'> | ||
export type SnakeCase<T extends string> = Lowercase<Join<BreakWords<T>, '_'>> |
@@ -8,8 +8,21 @@ import { | ||
describe('SnakeCase', () => { | ||
it('converts string to snake case', () => { | ||
type FromCamel = Expect<Equal<'foo_bar_baz', SnakeCase<'fooBarBaz'>>> | ||
type FromKebab = Expect<Equal<'foo_bar_baz', SnakeCase<'foo-bar-baz'>>> | ||
type FromPascal = Expect<Equal<'foo_bar_baz', SnakeCase<'fooBarBaz'>>> | ||
type FromSnake = Expect<Equal<'foo_bar_baz', SnakeCase<'foo_bar_baz'>>> | ||
it('from camel', () => { | ||
type Test = Expect<Equal<'foo_bar_baz', SnakeCase<'fooBarBaz'>>> | ||
}) | ||
it('from kebab', () => { | ||
type Test = Expect<Equal<'foo_bar_baz', SnakeCase<'foo-bar-baz'>>> | ||
}) | ||
it('from pascal', () => { | ||
type Test = Expect<Equal<'foo_bar_baz', SnakeCase<'fooBarBaz'>>> | ||
}) | ||
it('from screaming snake', () => { | ||
type Test = Expect<Equal<'foo_bar_baz', SnakeCase<'FOO_BAR_BAZ'>>> | ||
}) | ||
it('from snake', () => { | ||
type Test = Expect<Equal<'foo_bar_baz', SnakeCase<'foo_bar_baz'>>> | ||
}) | ||
}) |
@@ -0,1 +1,3 @@ | ||
import { Equal } from './Equal' | ||
/** | ||
@@ -19,7 +21,8 @@ * Split `Source` by `Delimeter`. | ||
Delimeter extends string = '', | ||
Parts extends string[] = [], | ||
> = Source extends `${infer Head}${Delimeter}${infer Tail}` | ||
? [Head, ...WalkString<Tail, Delimeter>] | ||
: Source extends Delimeter | ||
? [] | ||
: [Source] | ||
? WalkString<Tail, Delimeter, [...Parts, Head]> | ||
: Equal<Source, ''> extends true | ||
? Parts | ||
: [...Parts, Source] | ||
@@ -26,0 +29,0 @@ // walk over strings and split each by delimeter |
66621
130
1765
460