Skip to content

Commit ba39ce6

Browse files
committedNov 15, 2023
style: lint and format with prettier v3
1 parent 3a5f1a6 commit ba39ce6

File tree

3 files changed

+98
-94
lines changed

3 files changed

+98
-94
lines changed
 

‎README.md

+9-8
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@ Import:
1919

2020
```js
2121
// CommonJS
22-
const { pascalCase } = require('scule')
22+
const { pascalCase } = require("scule");
2323

2424
// ESM
25-
import { pascalCase } from 'scule'
25+
import { pascalCase } from "scule";
2626
```
2727

2828
**Notice:** You may need to transpile package for legacy environments.
@@ -34,7 +34,7 @@ import { pascalCase } from 'scule'
3434
Splits string and joins by PascalCase convention:
3535

3636
```ts
37-
pascalCase('foo-bar_baz')
37+
pascalCase("foo-bar_baz");
3838
// FooBarBaz
3939
```
4040

@@ -45,7 +45,7 @@ pascalCase('foo-bar_baz')
4545
Splits string and joins by camelCase convention:
4646

4747
```ts
48-
camelCase('foo-bar_baz')
48+
camelCase("foo-bar_baz");
4949
// fooBarBaz
5050
```
5151

@@ -54,7 +54,7 @@ camelCase('foo-bar_baz')
5454
Splits string and joins by kebab-case convention:
5555

5656
```ts
57-
kebabCase('fooBar_Baz')
57+
kebabCase("fooBar_Baz");
5858
// foo-bar-baz
5959
```
6060

@@ -65,7 +65,7 @@ kebabCase('fooBar_Baz')
6565
Splits string and joins by snake_case convention:
6666

6767
```ts
68-
snakeCase('foo-barBaz')
68+
snakeCase("foo-barBaz");
6969
// foo_bar_baz
7070
```
7171

@@ -74,7 +74,7 @@ snakeCase('foo-barBaz')
7474
Converts first character to upper case:
7575

7676
```ts
77-
upperFirst('hello world!')
77+
upperFirst("hello world!");
7878
// Hello world!
7979
```
8080

@@ -83,7 +83,7 @@ upperFirst('hello world!')
8383
Converts first character to lower case:
8484

8585
```ts
86-
lowerFirst('Hello world!')
86+
lowerFirst("Hello world!");
8787
// hello world!
8888
```
8989

@@ -108,6 +108,7 @@ lowerFirst('Hello world!')
108108
[MIT](./LICENSE)
109109

110110
<!-- Badges -->
111+
111112
[npm-version-src]: https://img.shields.io/npm/v/scule?style=flat&colorA=18181B&colorB=F0DB4F
112113
[npm-version-href]: https://npmjs.com/package/scule
113114
[npm-downloads-src]: https://img.shields.io/npm/dm/scule?style=flat&colorA=18181B&colorB=F0DB4F

‎src/index.ts

+19-19
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@ export function isUppercase(char = ""): boolean | undefined {
1313
export function splitByCase<T extends string>(string_: T): SplitByCase<T>;
1414
export function splitByCase<
1515
T extends string,
16-
Separator extends readonly string[]
16+
Separator extends readonly string[],
1717
>(string_: T, separators: Separator): SplitByCase<T, Separator[number]>;
1818
export function splitByCase<
1919
T extends string,
20-
Separator extends readonly string[]
20+
Separator extends readonly string[],
2121
>(string_: T, separators?: Separator) {
2222
const splitters = separators ?? STR_SPLITTERS;
2323
const parts: string[] = [];
@@ -52,7 +52,7 @@ export function splitByCase<
5252
}
5353
// Case falling edge
5454
if (previousUpper === true && isUpper === false && buff.length > 1) {
55-
const lastChar = buff[buff.length - 1];
55+
const lastChar = buff.at(-1);
5656
parts.push(buff.slice(0, Math.max(0, buff.length - 1)));
5757
buff = lastChar + char;
5858
previousUpper = isUpper;
@@ -73,58 +73,58 @@ export function splitByCase<
7373

7474
export function upperFirst<S extends string>(string_: S): Capitalize<S> {
7575
return (
76-
!string_ ? "" : string_[0].toUpperCase() + string_.slice(1)
76+
string_ ? string_[0].toUpperCase() + string_.slice(1) : ""
7777
) as Capitalize<S>;
7878
}
7979

8080
export function lowerFirst<S extends string>(string_: S): Uncapitalize<S> {
8181
return (
82-
!string_ ? "" : string_[0].toLowerCase() + string_.slice(1)
82+
string_ ? string_[0].toLowerCase() + string_.slice(1) : ""
8383
) as Uncapitalize<S>;
8484
}
8585

8686
export function pascalCase(): "";
8787
export function pascalCase<T extends string | readonly string[]>(
88-
string_: T
88+
string_: T,
8989
): PascalCase<T>;
9090
export function pascalCase<T extends string | readonly string[]>(string_?: T) {
91-
return !string_
92-
? ""
93-
: ((Array.isArray(string_) ? string_ : splitByCase(string_ as string))
91+
return string_
92+
? ((Array.isArray(string_) ? string_ : splitByCase(string_ as string))
9493
.map((p) => upperFirst(p))
95-
.join("") as PascalCase<T>);
94+
.join("") as PascalCase<T>)
95+
: "";
9696
}
9797

9898
export function camelCase(): "";
9999
export function camelCase<T extends string | readonly string[]>(
100-
string_: T
100+
string_: T,
101101
): CamelCase<T>;
102102
export function camelCase<T extends string | readonly string[]>(string_?: T) {
103103
return lowerFirst(pascalCase(string_ || "")) as CamelCase<T>;
104104
}
105105

106106
export function kebabCase(): "";
107107
export function kebabCase<T extends string | readonly string[]>(
108-
string_: T
108+
string_: T,
109109
): JoinByCase<T, "-">;
110110
export function kebabCase<
111111
T extends string | readonly string[],
112-
Joiner extends string
112+
Joiner extends string,
113113
>(string_: T, joiner: Joiner): JoinByCase<T, Joiner>;
114114
export function kebabCase<
115115
T extends string | readonly string[],
116-
Joiner extends string
116+
Joiner extends string,
117117
>(string_?: T, joiner?: Joiner) {
118-
return !string_
119-
? ""
120-
: ((Array.isArray(string_) ? string_ : splitByCase(string_ as string))
118+
return string_
119+
? ((Array.isArray(string_) ? string_ : splitByCase(string_ as string))
121120
.map((p) => p.toLowerCase())
122-
.join(joiner ?? "-") as JoinByCase<T, Joiner>);
121+
.join(joiner ?? "-") as JoinByCase<T, Joiner>)
122+
: "";
123123
}
124124

125125
export function snakeCase(): "";
126126
export function snakeCase<T extends string | readonly string[]>(
127-
string_: T
127+
string_: T,
128128
): JoinByCase<T, "_">;
129129
export function snakeCase<T extends string | readonly string[]>(string_?: T) {
130130
return kebabCase(string_ || "", "_") as JoinByCase<T, "_">;

‎src/types.ts

+70-67
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,22 @@ type IsUpper<S extends string> = S extends Uppercase<S> ? true : false;
1616
type IsLower<S extends string> = S extends Lowercase<S> ? true : false;
1717
type SameLetterCase<
1818
X extends string,
19-
Y extends string
19+
Y extends string,
2020
> = IsUpper<X> extends IsUpper<Y>
2121
? true
2222
: IsLower<X> extends IsLower<Y>
23-
? true
24-
: false;
23+
? true
24+
: false;
2525
type CapitalizedWords<
2626
T extends readonly string[],
27-
Accumulator extends string = ""
27+
Accumulator extends string = "",
2828
> = T extends readonly [infer F extends string, ...infer R extends string[]]
2929
? CapitalizedWords<R, `${Accumulator}${Capitalize<F>}`>
3030
: Accumulator;
3131
type JoinLowercaseWords<
3232
T extends readonly string[],
3333
Joiner extends string,
34-
Accumulator extends string = ""
34+
Accumulator extends string = "",
3535
> = T extends readonly [infer F extends string, ...infer R extends string[]]
3636
? Accumulator extends ""
3737
? JoinLowercaseWords<R, Joiner, `${Accumulator}${Lowercase<F>}`>
@@ -46,85 +46,88 @@ type RemoveLastOfArray<T extends any[]> = T extends [...infer F, any]
4646
export type SplitByCase<
4747
T,
4848
Separator extends string = Splitter,
49-
Accumulator extends unknown[] = []
49+
Accumulator extends unknown[] = [],
5050
> = string extends Separator
5151
? string[]
5252
: T extends `${infer F}${infer R}`
53-
? [LastOfArray<Accumulator>] extends [never]
54-
? SplitByCase<R, Separator, [F]>
55-
: LastOfArray<Accumulator> extends string
56-
? R extends ""
57-
? SplitByCase<
58-
R,
59-
Separator,
60-
[...RemoveLastOfArray<Accumulator>, `${LastOfArray<Accumulator>}${F}`]
61-
>
62-
: SameLetterCase<F, FirstOfString<R>> extends true
63-
? F extends Separator
64-
? FirstOfString<R> extends Separator
65-
? SplitByCase<R, Separator, [...Accumulator, ""]>
66-
: IsUpper<FirstOfString<R>> extends true
53+
? [LastOfArray<Accumulator>] extends [never]
54+
? SplitByCase<R, Separator, [F]>
55+
: LastOfArray<Accumulator> extends string
56+
? R extends ""
6757
? SplitByCase<
68-
RemoveFirstOfString<R>,
58+
R,
6959
Separator,
70-
[...Accumulator, FirstOfString<R>]
60+
[
61+
...RemoveLastOfArray<Accumulator>,
62+
`${LastOfArray<Accumulator>}${F}`,
63+
]
7164
>
72-
: SplitByCase<R, Separator, [...Accumulator, ""]>
73-
: SplitByCase<
74-
R,
75-
Separator,
76-
[
77-
...RemoveLastOfArray<Accumulator>,
78-
`${LastOfArray<Accumulator>}${F}`
79-
]
80-
>
81-
: IsLower<F> extends true
82-
? SplitByCase<
83-
RemoveFirstOfString<R>,
84-
Separator,
85-
[
86-
...RemoveLastOfArray<Accumulator>,
87-
`${LastOfArray<Accumulator>}${F}`,
88-
FirstOfString<R>
89-
]
90-
>
91-
: SplitByCase<R, Separator, [...Accumulator, F]>
92-
: never
93-
: Accumulator extends []
94-
? T extends ""
95-
? []
96-
: string[]
97-
: Accumulator;
65+
: SameLetterCase<F, FirstOfString<R>> extends true
66+
? F extends Separator
67+
? FirstOfString<R> extends Separator
68+
? SplitByCase<R, Separator, [...Accumulator, ""]>
69+
: IsUpper<FirstOfString<R>> extends true
70+
? SplitByCase<
71+
RemoveFirstOfString<R>,
72+
Separator,
73+
[...Accumulator, FirstOfString<R>]
74+
>
75+
: SplitByCase<R, Separator, [...Accumulator, ""]>
76+
: SplitByCase<
77+
R,
78+
Separator,
79+
[
80+
...RemoveLastOfArray<Accumulator>,
81+
`${LastOfArray<Accumulator>}${F}`,
82+
]
83+
>
84+
: IsLower<F> extends true
85+
? SplitByCase<
86+
RemoveFirstOfString<R>,
87+
Separator,
88+
[
89+
...RemoveLastOfArray<Accumulator>,
90+
`${LastOfArray<Accumulator>}${F}`,
91+
FirstOfString<R>,
92+
]
93+
>
94+
: SplitByCase<R, Separator, [...Accumulator, F]>
95+
: never
96+
: Accumulator extends []
97+
? T extends ""
98+
? []
99+
: string[]
100+
: Accumulator;
98101

99102
export type PascalCase<T> = string extends T
100103
? string
101104
: string[] extends T
102-
? string
103-
: T extends string
104-
? SplitByCase<T> extends readonly string[]
105-
? CapitalizedWords<SplitByCase<T>>
106-
: never
107-
: T extends readonly string[]
108-
? CapitalizedWords<T>
109-
: never;
105+
? string
106+
: T extends string
107+
? SplitByCase<T> extends readonly string[]
108+
? CapitalizedWords<SplitByCase<T>>
109+
: never
110+
: T extends readonly string[]
111+
? CapitalizedWords<T>
112+
: never;
110113

111114
export type CamelCase<T> = string extends T
112115
? string
113116
: string[] extends T
114-
? string
115-
: Uncapitalize<PascalCase<T>>;
117+
? string
118+
: Uncapitalize<PascalCase<T>>;
116119

117120
export type JoinByCase<T, Joiner extends string> = string extends T
118121
? string
119122
: string[] extends T
120-
? string
121-
: T extends string
122-
? SplitByCase<T> extends readonly string[]
123-
? JoinLowercaseWords<SplitByCase<T>, Joiner>
124-
: never
125-
: T extends readonly string[]
126-
? JoinLowercaseWords<T, Joiner>
127-
: never;
123+
? string
124+
: T extends string
125+
? SplitByCase<T> extends readonly string[]
126+
? JoinLowercaseWords<SplitByCase<T>, Joiner>
127+
: never
128+
: T extends readonly string[]
129+
? JoinLowercaseWords<T, Joiner>
130+
: never;
128131

129132
// eslint-disable-next-line @typescript-eslint/no-unused-vars
130133
type __tests = [
@@ -184,6 +187,6 @@ type __tests = [
184187
Assert<Equal<JoinByCase<"FooBARb", "-">, "foo-ba-rb">>,
185188
Assert<Equal<JoinByCase<"foo_bar-baz/qux", "-">, "foo-bar-baz-qux">>,
186189
// array
187-
Assert<Equal<JoinByCase<["Foo", "Bar"], "-">, "foo-bar">>
190+
Assert<Equal<JoinByCase<["Foo", "Bar"], "-">, "foo-bar">>,
188191
];
189192
/* eslint-enable @typescript-eslint/no-unused-vars */

0 commit comments

Comments
 (0)
Please sign in to comment.