@visulima/string 1.0.5 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/case/identify-case.cjs +47 -8
- package/dist/case/identify-case.mjs +47 -8
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
## @visulima/string [1.1.0](https://github.com/visulima/visulima/compare/@visulima/string@1.0.5...@visulima/string@1.1.0) (2025-05-04)
|
|
2
|
+
|
|
3
|
+
### Features
|
|
4
|
+
|
|
5
|
+
* **string:** enhance identifyCase function to support additional cases ([#501](https://github.com/visulima/visulima/issues/501)) ([8f8ecee](https://github.com/visulima/visulima/commit/8f8eceefef3f4ce332eb702979291a4db010256c))
|
|
6
|
+
|
|
1
7
|
## @visulima/string [1.0.5](https://github.com/visulima/visulima/compare/@visulima/string@1.0.4...@visulima/string@1.0.5) (2025-05-02)
|
|
2
8
|
|
|
3
9
|
### Bug Fixes
|
|
@@ -2,28 +2,67 @@
|
|
|
2
2
|
|
|
3
3
|
var __defProp = Object.defineProperty;
|
|
4
4
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
5
|
+
const IS_PASCAL_CASE = /^([A-Z][a-z]*)+$/;
|
|
6
|
+
const CONTAINS_LETTER_CASE_INSENSITIVE = /[a-z]/i;
|
|
7
|
+
const IS_UPPER_SNAKE_CASE = /^[A-Z0-9_]+$/;
|
|
8
|
+
const IS_LOWER_SNAKE_CASE = /^[a-z0-9_]+$/;
|
|
9
|
+
const IS_KEBAB_CASE = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;
|
|
10
|
+
const IS_LOWERCASE_WITH_SPACE = /^[a-z ]+$/;
|
|
11
|
+
const IS_UPPERCASE = /^[A-Z][A-Z0-9]*$/;
|
|
12
|
+
const WHITESPACE_REGEX = /\s+/;
|
|
13
|
+
const IS_NUMERIC = /^\d+$/;
|
|
14
|
+
const IS_CAMEL_CASE_LIKE = /^[a-z][a-z0-9]*(?:[A-Z][a-z0-9]*)+$/;
|
|
15
|
+
const CONTAINS_PUNCTUATION_MID_WORD = /[.!?;:,](?!\s|$)/;
|
|
5
16
|
const identifyCase = /* @__PURE__ */ __name((value) => {
|
|
6
|
-
if (typeof value !== "string"
|
|
7
|
-
|
|
17
|
+
if (typeof value !== "string") {
|
|
18
|
+
throw new TypeError("Expected input to be a string");
|
|
19
|
+
}
|
|
20
|
+
if (!value) {
|
|
21
|
+
return "unknown";
|
|
22
|
+
}
|
|
23
|
+
if (!CONTAINS_LETTER_CASE_INSENSITIVE.test(value)) {
|
|
24
|
+
return "unknown";
|
|
8
25
|
}
|
|
9
|
-
if (value
|
|
10
|
-
if (
|
|
26
|
+
if (value.includes("_")) {
|
|
27
|
+
if (IS_UPPER_SNAKE_CASE.test(value)) {
|
|
28
|
+
return "upper_snake";
|
|
29
|
+
}
|
|
30
|
+
if (IS_LOWER_SNAKE_CASE.test(value)) {
|
|
11
31
|
return "snake";
|
|
12
32
|
}
|
|
13
|
-
|
|
33
|
+
return "mixed";
|
|
34
|
+
}
|
|
35
|
+
if (value.includes("-")) {
|
|
36
|
+
if (IS_KEBAB_CASE.test(value)) {
|
|
14
37
|
return "kebab";
|
|
15
38
|
}
|
|
39
|
+
return "mixed";
|
|
40
|
+
}
|
|
41
|
+
if (IS_LOWERCASE_WITH_SPACE.test(value)) {
|
|
16
42
|
return "lower";
|
|
17
43
|
}
|
|
18
|
-
if (
|
|
44
|
+
if (IS_UPPERCASE.test(value)) {
|
|
19
45
|
return "upper";
|
|
20
46
|
}
|
|
21
|
-
|
|
47
|
+
const words = value.split(WHITESPACE_REGEX);
|
|
48
|
+
if (words.length > 1 && words.every((word) => IS_PASCAL_CASE.test(word))) {
|
|
49
|
+
return "title";
|
|
50
|
+
}
|
|
51
|
+
if (words.length > 1 && IS_NUMERIC.test(words[0]) && IS_PASCAL_CASE.test(words[1])) {
|
|
52
|
+
return "title";
|
|
53
|
+
}
|
|
54
|
+
if (words.length > 1 && IS_PASCAL_CASE.test(words[0]) && /^[a-z]/.test(words[1])) {
|
|
55
|
+
return "sentence";
|
|
56
|
+
}
|
|
57
|
+
if (IS_PASCAL_CASE.test(value)) {
|
|
22
58
|
return "pascal";
|
|
23
59
|
}
|
|
24
|
-
if (
|
|
60
|
+
if (IS_CAMEL_CASE_LIKE.test(value)) {
|
|
25
61
|
return "camel";
|
|
26
62
|
}
|
|
63
|
+
if (CONTAINS_PUNCTUATION_MID_WORD.test(value)) {
|
|
64
|
+
return "unknown";
|
|
65
|
+
}
|
|
27
66
|
return "mixed";
|
|
28
67
|
}, "identifyCase");
|
|
29
68
|
|
|
@@ -1,27 +1,66 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
2
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
const IS_PASCAL_CASE = /^([A-Z][a-z]*)+$/;
|
|
4
|
+
const CONTAINS_LETTER_CASE_INSENSITIVE = /[a-z]/i;
|
|
5
|
+
const IS_UPPER_SNAKE_CASE = /^[A-Z0-9_]+$/;
|
|
6
|
+
const IS_LOWER_SNAKE_CASE = /^[a-z0-9_]+$/;
|
|
7
|
+
const IS_KEBAB_CASE = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;
|
|
8
|
+
const IS_LOWERCASE_WITH_SPACE = /^[a-z ]+$/;
|
|
9
|
+
const IS_UPPERCASE = /^[A-Z][A-Z0-9]*$/;
|
|
10
|
+
const WHITESPACE_REGEX = /\s+/;
|
|
11
|
+
const IS_NUMERIC = /^\d+$/;
|
|
12
|
+
const IS_CAMEL_CASE_LIKE = /^[a-z][a-z0-9]*(?:[A-Z][a-z0-9]*)+$/;
|
|
13
|
+
const CONTAINS_PUNCTUATION_MID_WORD = /[.!?;:,](?!\s|$)/;
|
|
3
14
|
const identifyCase = /* @__PURE__ */ __name((value) => {
|
|
4
|
-
if (typeof value !== "string"
|
|
5
|
-
|
|
15
|
+
if (typeof value !== "string") {
|
|
16
|
+
throw new TypeError("Expected input to be a string");
|
|
17
|
+
}
|
|
18
|
+
if (!value) {
|
|
19
|
+
return "unknown";
|
|
20
|
+
}
|
|
21
|
+
if (!CONTAINS_LETTER_CASE_INSENSITIVE.test(value)) {
|
|
22
|
+
return "unknown";
|
|
6
23
|
}
|
|
7
|
-
if (value
|
|
8
|
-
if (
|
|
24
|
+
if (value.includes("_")) {
|
|
25
|
+
if (IS_UPPER_SNAKE_CASE.test(value)) {
|
|
26
|
+
return "upper_snake";
|
|
27
|
+
}
|
|
28
|
+
if (IS_LOWER_SNAKE_CASE.test(value)) {
|
|
9
29
|
return "snake";
|
|
10
30
|
}
|
|
11
|
-
|
|
31
|
+
return "mixed";
|
|
32
|
+
}
|
|
33
|
+
if (value.includes("-")) {
|
|
34
|
+
if (IS_KEBAB_CASE.test(value)) {
|
|
12
35
|
return "kebab";
|
|
13
36
|
}
|
|
37
|
+
return "mixed";
|
|
38
|
+
}
|
|
39
|
+
if (IS_LOWERCASE_WITH_SPACE.test(value)) {
|
|
14
40
|
return "lower";
|
|
15
41
|
}
|
|
16
|
-
if (
|
|
42
|
+
if (IS_UPPERCASE.test(value)) {
|
|
17
43
|
return "upper";
|
|
18
44
|
}
|
|
19
|
-
|
|
45
|
+
const words = value.split(WHITESPACE_REGEX);
|
|
46
|
+
if (words.length > 1 && words.every((word) => IS_PASCAL_CASE.test(word))) {
|
|
47
|
+
return "title";
|
|
48
|
+
}
|
|
49
|
+
if (words.length > 1 && IS_NUMERIC.test(words[0]) && IS_PASCAL_CASE.test(words[1])) {
|
|
50
|
+
return "title";
|
|
51
|
+
}
|
|
52
|
+
if (words.length > 1 && IS_PASCAL_CASE.test(words[0]) && /^[a-z]/.test(words[1])) {
|
|
53
|
+
return "sentence";
|
|
54
|
+
}
|
|
55
|
+
if (IS_PASCAL_CASE.test(value)) {
|
|
20
56
|
return "pascal";
|
|
21
57
|
}
|
|
22
|
-
if (
|
|
58
|
+
if (IS_CAMEL_CASE_LIKE.test(value)) {
|
|
23
59
|
return "camel";
|
|
24
60
|
}
|
|
61
|
+
if (CONTAINS_PUNCTUATION_MID_WORD.test(value)) {
|
|
62
|
+
return "unknown";
|
|
63
|
+
}
|
|
25
64
|
return "mixed";
|
|
26
65
|
}, "identifyCase");
|
|
27
66
|
|