diff --git a/README.md b/README.md index 0e4d7d7..bc62a7e 100644 --- a/README.md +++ b/README.md @@ -119,7 +119,7 @@ lowerFirst("Hello world!"); ### `splitByCase(str, splitters?)` -- Splits string by the splitters provided (default: `['-', '_', '/', '.']`) +- Splits string by the splitters provided (default: `['-', '_', '/', '.', ' ']`) - Splits when case changes from lower to upper or upper to lower - Ignores numbers for case changes - Case is preserved in returned value diff --git a/src/index.ts b/src/index.ts index f1983fd..ebe61f9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -10,7 +10,7 @@ import type { } from "./types"; const NUMBER_CHAR_RE = /\d/; -const STR_SPLITTERS = ["-", "_", "/", "."] as const; +const STR_SPLITTERS_RE = /[\s./_-]/ export function isUppercase(char = ""): boolean | undefined { if (NUMBER_CHAR_RE.test(char)) { @@ -28,7 +28,6 @@ export function splitByCase< T extends string, Separator extends readonly string[], >(str: T, separators?: Separator) { - const splitters = separators ?? STR_SPLITTERS; const parts: string[] = []; if (!str || typeof str !== "string") { @@ -42,7 +41,7 @@ export function splitByCase< for (const char of str) { // Splitter - const isSplitter = (splitters as unknown as string).includes(char); + const isSplitter = Array.isArray(separators) ? separators.includes(char) : STR_SPLITTERS_RE.test(char); if (isSplitter === true) { parts.push(buff); buff = ""; diff --git a/src/types.ts b/src/types.ts index 9e7f1dd..2a294bb 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,4 +1,32 @@ -type Splitter = "-" | "_" | "/" | "."; +type Whitespace = + | "\u{9}" // '\t' + | "\u{A}" // '\n' + | "\u{B}" // '\v' + | "\u{C}" // '\f' + | "\u{D}" // '\r' + | "\u{20}" // ' ' + | "\u{85}" + | "\u{A0}" + | "\u{1680}" + | "\u{2000}" + | "\u{2001}" + | "\u{2002}" + | "\u{2003}" + | "\u{2004}" + | "\u{2005}" + | "\u{2006}" + | "\u{2007}" + | "\u{2008}" + | "\u{2009}" + | "\u{200A}" + | "\u{2028}" + | "\u{2029}" + | "\u{202F}" + | "\u{205F}" + | "\u{3000}" + | "\u{FEFF}"; + +type Splitter = "-" | "_" | "/" | "." | Whitespace; type FirstOfString = S extends `${infer F}${string}` ? F : never; @@ -164,4 +192,4 @@ export type TrainCase< export type FlatCase< T extends string | readonly string[], Joiner extends string = "", -> = JoinByCase; +> = JoinByCase; \ No newline at end of file diff --git a/test/scule.test.ts b/test/scule.test.ts index bd5ec3b..a26e6d1 100644 --- a/test/scule.test.ts +++ b/test/scule.test.ts @@ -19,11 +19,16 @@ describe("splitByCase", () => { ["fooBar", ["foo", "Bar"]], ["FooBarBaz", ["Foo", "Bar", "Baz"]], ["FooBARb", ["Foo", "BA", "Rb"]], - ["foo_bar-baz/qux", ["foo", "bar", "baz", "qux"]], + ["foo_bar-baz/qux quux", ["foo", "bar", "baz", "qux", "quux"]], ["foo--bar-Baz", ["foo", "", "bar", "Baz"]], ["FOO_BAR", ["FOO", "BAR"]], ["foo123-bar", ["foo123", "bar"]], ["FOOBar", ["FOO", "Bar"]], + ["FOO BAR", ["FOO", "BAR"]], + ["foO BAR", ["fo", "O", "BAR"]], + ["Foo BAR", ["Foo", "BAR"]], + ["Foo bAR", ["Foo", "b", "AR"]], + ["FOO Bar", ["FOO", "Bar"]], ["ALink", ["A", "Link"]], // with custom splitters [ diff --git a/test/types.test-d.ts b/test/types.test-d.ts index bd722b1..0d8588d 100644 --- a/test/types.test-d.ts +++ b/test/types.test-d.ts @@ -22,6 +22,11 @@ describe("SplitByCase", () => { assertType>(["FOO", "Bar"]); assertType>(["A", "Link"]); assertType>(["FOO", "BAR"]); + assertType>(["FOO", "BAR"]); + assertType>(["fo", "O", "BAR"]); + assertType>(["Foo", "BAR"]); + assertType>(["Foo", "b", "AR"]); + assertType>(["FOO", "Bar"]); }); test("custom splitters", () => {