@goodscript/core 0.13.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/README.md +46 -0
- package/dist/array-ext-gs.d.ts +62 -0
- package/dist/array-ext-gs.d.ts.map +1 -0
- package/dist/array-ext-gs.js +162 -0
- package/dist/array-ext-gs.js.map +1 -0
- package/dist/array-tools-gs.d.ts +62 -0
- package/dist/array-tools-gs.d.ts.map +1 -0
- package/dist/array-tools-gs.js +162 -0
- package/dist/array-tools-gs.js.map +1 -0
- package/dist/index-gs.d.ts +17 -0
- package/dist/index-gs.d.ts.map +1 -0
- package/dist/index-gs.js +17 -0
- package/dist/index-gs.js.map +1 -0
- package/dist/map-ext-gs.d.ts +46 -0
- package/dist/map-ext-gs.d.ts.map +1 -0
- package/dist/map-ext-gs.js +88 -0
- package/dist/map-ext-gs.js.map +1 -0
- package/dist/map-tools-gs.d.ts +46 -0
- package/dist/map-tools-gs.d.ts.map +1 -0
- package/dist/map-tools-gs.js +88 -0
- package/dist/map-tools-gs.js.map +1 -0
- package/dist/set-ext-gs.d.ts +50 -0
- package/dist/set-ext-gs.d.ts.map +1 -0
- package/dist/set-ext-gs.js +119 -0
- package/dist/set-ext-gs.js.map +1 -0
- package/dist/set-tools-gs.d.ts +50 -0
- package/dist/set-tools-gs.d.ts.map +1 -0
- package/dist/set-tools-gs.js +119 -0
- package/dist/set-tools-gs.js.map +1 -0
- package/dist/string-ext-gs.d.ts +78 -0
- package/dist/string-ext-gs.d.ts.map +1 -0
- package/dist/string-ext-gs.js +145 -0
- package/dist/string-ext-gs.js.map +1 -0
- package/dist/string-tools-gs.d.ts +78 -0
- package/dist/string-tools-gs.d.ts.map +1 -0
- package/dist/string-tools-gs.js +145 -0
- package/dist/string-tools-gs.js.map +1 -0
- package/package.json +45 -0
- package/src/array-tools-gs.ts +172 -0
- package/src/index-gs.ts +17 -0
- package/src/map-tools-gs.ts +96 -0
- package/src/set-tools-gs.ts +128 -0
- package/src/string-tools-gs.ts +166 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string-ext-gs.d.ts","sourceRoot":"","sources":["../src/string-ext-gs.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,SAAS;IACpB;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAQlC;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAmB5C;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAQpC;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAc9C;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO;IAItD;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAIrD;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAInD;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;IAO/C;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAIjC;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAE,MAAY,GAAG,MAAM;IAI3E;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAE,MAAY,GAAG,MAAM;IAI5E;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAIzD;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,SAAS,GAAE,MAAW,GAAG,MAAM;IAIjE;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAIrC;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAIrC;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAI9B;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAIlC;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;CAGpC"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* String parsing utilities with dual error handling pattern.
|
|
3
|
+
*/
|
|
4
|
+
export class StringExt {
|
|
5
|
+
/**
|
|
6
|
+
* Parse integer from string. Throws on invalid input.
|
|
7
|
+
*/
|
|
8
|
+
static parseInt(s) {
|
|
9
|
+
const result = StringExt.tryParseInt(s);
|
|
10
|
+
if (result === null) {
|
|
11
|
+
throw new Error(`Invalid integer: "${s}"`);
|
|
12
|
+
}
|
|
13
|
+
return result;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Parse integer from string. Returns null on invalid input.
|
|
17
|
+
*/
|
|
18
|
+
static tryParseInt(s) {
|
|
19
|
+
const trimmed = s.trim();
|
|
20
|
+
if (trimmed === '') {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
const parsed = Number.parseInt(trimmed, 10);
|
|
24
|
+
if (Number.isNaN(parsed)) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
// Ensure the entire string was consumed (no trailing garbage)
|
|
28
|
+
if (!/^-?\d+$/.test(trimmed)) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
return parsed;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Parse float from string. Throws on invalid input.
|
|
35
|
+
*/
|
|
36
|
+
static parseFloat(s) {
|
|
37
|
+
const result = StringExt.tryParseFloat(s);
|
|
38
|
+
if (result === null) {
|
|
39
|
+
throw new Error(`Invalid number: "${s}"`);
|
|
40
|
+
}
|
|
41
|
+
return result;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Parse float from string. Returns null on invalid input.
|
|
45
|
+
*/
|
|
46
|
+
static tryParseFloat(s) {
|
|
47
|
+
const trimmed = s.trim();
|
|
48
|
+
if (trimmed === '') {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
const parsed = Number.parseFloat(trimmed);
|
|
52
|
+
if (Number.isNaN(parsed)) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
return parsed;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Check if string contains substring.
|
|
59
|
+
*/
|
|
60
|
+
static contains(s, substring) {
|
|
61
|
+
return s.includes(substring);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Check if string starts with prefix.
|
|
65
|
+
*/
|
|
66
|
+
static startsWith(s, prefix) {
|
|
67
|
+
return s.startsWith(prefix);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Check if string ends with suffix.
|
|
71
|
+
*/
|
|
72
|
+
static endsWith(s, suffix) {
|
|
73
|
+
return s.endsWith(suffix);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Repeat string n times.
|
|
77
|
+
*/
|
|
78
|
+
static repeat(s, count) {
|
|
79
|
+
if (count < 0) {
|
|
80
|
+
throw new Error(`Repeat count must be non-negative: ${count}`);
|
|
81
|
+
}
|
|
82
|
+
return s.repeat(count);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Reverse string.
|
|
86
|
+
*/
|
|
87
|
+
static reverse(s) {
|
|
88
|
+
return s.split('').reverse().join('');
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Pad string to length on left with fillString.
|
|
92
|
+
*/
|
|
93
|
+
static padLeft(s, length, fillString = ' ') {
|
|
94
|
+
return s.padStart(length, fillString);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Pad string to length on right with fillString.
|
|
98
|
+
*/
|
|
99
|
+
static padRight(s, length, fillString = ' ') {
|
|
100
|
+
return s.padEnd(length, fillString);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Split string by separator.
|
|
104
|
+
*/
|
|
105
|
+
static split(s, separator) {
|
|
106
|
+
return s.split(separator);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Join array of strings with separator.
|
|
110
|
+
*/
|
|
111
|
+
static join(parts, separator = '') {
|
|
112
|
+
return parts.join(separator);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Convert string to uppercase.
|
|
116
|
+
*/
|
|
117
|
+
static toUpperCase(s) {
|
|
118
|
+
return s.toUpperCase();
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Convert string to lowercase.
|
|
122
|
+
*/
|
|
123
|
+
static toLowerCase(s) {
|
|
124
|
+
return s.toLowerCase();
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Trim whitespace from both ends.
|
|
128
|
+
*/
|
|
129
|
+
static trim(s) {
|
|
130
|
+
return s.trim();
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Trim whitespace from left end.
|
|
134
|
+
*/
|
|
135
|
+
static trimLeft(s) {
|
|
136
|
+
return s.trimStart();
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Trim whitespace from right end.
|
|
140
|
+
*/
|
|
141
|
+
static trimRight(s) {
|
|
142
|
+
return s.trimEnd();
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=string-ext-gs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string-ext-gs.js","sourceRoot":"","sources":["../src/string-ext-gs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* String parsing utilities with dual error handling pattern.
|
|
3
|
+
*/
|
|
4
|
+
export declare class StringTools {
|
|
5
|
+
/**
|
|
6
|
+
* Parse integer from string. Throws on invalid input.
|
|
7
|
+
*/
|
|
8
|
+
static parseInt(s: string): number;
|
|
9
|
+
/**
|
|
10
|
+
* Parse integer from string. Returns null on invalid input.
|
|
11
|
+
*/
|
|
12
|
+
static tryParseInt(s: string): number | null;
|
|
13
|
+
/**
|
|
14
|
+
* Parse float from string. Throws on invalid input.
|
|
15
|
+
*/
|
|
16
|
+
static parseFloat(s: string): number;
|
|
17
|
+
/**
|
|
18
|
+
* Parse float from string. Returns null on invalid input.
|
|
19
|
+
*/
|
|
20
|
+
static tryParseFloat(s: string): number | null;
|
|
21
|
+
/**
|
|
22
|
+
* Check if string contains substring.
|
|
23
|
+
*/
|
|
24
|
+
static contains(s: string, substring: string): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Check if string starts with prefix.
|
|
27
|
+
*/
|
|
28
|
+
static startsWith(s: string, prefix: string): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Check if string ends with suffix.
|
|
31
|
+
*/
|
|
32
|
+
static endsWith(s: string, suffix: string): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Repeat string n times.
|
|
35
|
+
*/
|
|
36
|
+
static repeat(s: string, count: number): string;
|
|
37
|
+
/**
|
|
38
|
+
* Reverse string.
|
|
39
|
+
*/
|
|
40
|
+
static reverse(s: string): string;
|
|
41
|
+
/**
|
|
42
|
+
* Pad string to length on left with fillString.
|
|
43
|
+
*/
|
|
44
|
+
static padLeft(s: string, length: number, fillString?: string): string;
|
|
45
|
+
/**
|
|
46
|
+
* Pad string to length on right with fillString.
|
|
47
|
+
*/
|
|
48
|
+
static padRight(s: string, length: number, fillString?: string): string;
|
|
49
|
+
/**
|
|
50
|
+
* Split string by separator.
|
|
51
|
+
*/
|
|
52
|
+
static split(s: string, separator: string): Array<string>;
|
|
53
|
+
/**
|
|
54
|
+
* Join array of strings with separator.
|
|
55
|
+
*/
|
|
56
|
+
static join(parts: Array<string>, separator?: string): string;
|
|
57
|
+
/**
|
|
58
|
+
* Convert string to uppercase.
|
|
59
|
+
*/
|
|
60
|
+
static toUpperCase(s: string): string;
|
|
61
|
+
/**
|
|
62
|
+
* Convert string to lowercase.
|
|
63
|
+
*/
|
|
64
|
+
static toLowerCase(s: string): string;
|
|
65
|
+
/**
|
|
66
|
+
* Trim whitespace from both ends.
|
|
67
|
+
*/
|
|
68
|
+
static trim(s: string): string;
|
|
69
|
+
/**
|
|
70
|
+
* Trim whitespace from left end.
|
|
71
|
+
*/
|
|
72
|
+
static trimLeft(s: string): string;
|
|
73
|
+
/**
|
|
74
|
+
* Trim whitespace from right end.
|
|
75
|
+
*/
|
|
76
|
+
static trimRight(s: string): string;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=string-tools-gs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string-tools-gs.d.ts","sourceRoot":"","sources":["../src/string-tools-gs.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,WAAW;IACtB;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAQlC;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAmB5C;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAQpC;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAc9C;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO;IAItD;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAIrD;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAInD;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;IAO/C;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAIjC;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAE,MAAY,GAAG,MAAM;IAI3E;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAE,MAAY,GAAG,MAAM;IAI5E;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAIzD;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,SAAS,GAAE,MAAW,GAAG,MAAM;IAIjE;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAIrC;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAIrC;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAI9B;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAIlC;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;CAGpC"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* String parsing utilities with dual error handling pattern.
|
|
3
|
+
*/
|
|
4
|
+
export class StringTools {
|
|
5
|
+
/**
|
|
6
|
+
* Parse integer from string. Throws on invalid input.
|
|
7
|
+
*/
|
|
8
|
+
static parseInt(s) {
|
|
9
|
+
const result = StringTools.tryParseInt(s);
|
|
10
|
+
if (result === null) {
|
|
11
|
+
throw new Error(`Invalid integer: "${s}"`);
|
|
12
|
+
}
|
|
13
|
+
return result;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Parse integer from string. Returns null on invalid input.
|
|
17
|
+
*/
|
|
18
|
+
static tryParseInt(s) {
|
|
19
|
+
const trimmed = s.trim();
|
|
20
|
+
if (trimmed === '') {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
const parsed = Number.parseInt(trimmed, 10);
|
|
24
|
+
if (Number.isNaN(parsed)) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
// Ensure the entire string was consumed (no trailing garbage)
|
|
28
|
+
if (!/^-?\d+$/.test(trimmed)) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
return parsed;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Parse float from string. Throws on invalid input.
|
|
35
|
+
*/
|
|
36
|
+
static parseFloat(s) {
|
|
37
|
+
const result = StringTools.tryParseFloat(s);
|
|
38
|
+
if (result === null) {
|
|
39
|
+
throw new Error(`Invalid number: "${s}"`);
|
|
40
|
+
}
|
|
41
|
+
return result;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Parse float from string. Returns null on invalid input.
|
|
45
|
+
*/
|
|
46
|
+
static tryParseFloat(s) {
|
|
47
|
+
const trimmed = s.trim();
|
|
48
|
+
if (trimmed === '') {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
const parsed = Number.parseFloat(trimmed);
|
|
52
|
+
if (Number.isNaN(parsed)) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
return parsed;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Check if string contains substring.
|
|
59
|
+
*/
|
|
60
|
+
static contains(s, substring) {
|
|
61
|
+
return s.includes(substring);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Check if string starts with prefix.
|
|
65
|
+
*/
|
|
66
|
+
static startsWith(s, prefix) {
|
|
67
|
+
return s.startsWith(prefix);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Check if string ends with suffix.
|
|
71
|
+
*/
|
|
72
|
+
static endsWith(s, suffix) {
|
|
73
|
+
return s.endsWith(suffix);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Repeat string n times.
|
|
77
|
+
*/
|
|
78
|
+
static repeat(s, count) {
|
|
79
|
+
if (count < 0) {
|
|
80
|
+
throw new Error(`Repeat count must be non-negative: ${count}`);
|
|
81
|
+
}
|
|
82
|
+
return s.repeat(count);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Reverse string.
|
|
86
|
+
*/
|
|
87
|
+
static reverse(s) {
|
|
88
|
+
return s.split('').reverse().join('');
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Pad string to length on left with fillString.
|
|
92
|
+
*/
|
|
93
|
+
static padLeft(s, length, fillString = ' ') {
|
|
94
|
+
return s.padStart(length, fillString);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Pad string to length on right with fillString.
|
|
98
|
+
*/
|
|
99
|
+
static padRight(s, length, fillString = ' ') {
|
|
100
|
+
return s.padEnd(length, fillString);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Split string by separator.
|
|
104
|
+
*/
|
|
105
|
+
static split(s, separator) {
|
|
106
|
+
return s.split(separator);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Join array of strings with separator.
|
|
110
|
+
*/
|
|
111
|
+
static join(parts, separator = '') {
|
|
112
|
+
return parts.join(separator);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Convert string to uppercase.
|
|
116
|
+
*/
|
|
117
|
+
static toUpperCase(s) {
|
|
118
|
+
return s.toUpperCase();
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Convert string to lowercase.
|
|
122
|
+
*/
|
|
123
|
+
static toLowerCase(s) {
|
|
124
|
+
return s.toLowerCase();
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Trim whitespace from both ends.
|
|
128
|
+
*/
|
|
129
|
+
static trim(s) {
|
|
130
|
+
return s.trim();
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Trim whitespace from left end.
|
|
134
|
+
*/
|
|
135
|
+
static trimLeft(s) {
|
|
136
|
+
return s.trimStart();
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Trim whitespace from right end.
|
|
140
|
+
*/
|
|
141
|
+
static trimRight(s) {
|
|
142
|
+
return s.trimEnd();
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=string-tools-gs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string-tools-gs.js","sourceRoot":"","sources":["../src/string-tools-gs.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@goodscript/core",
|
|
3
|
+
"version": "0.13.0",
|
|
4
|
+
"description": "GoodScript core types and collections",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist",
|
|
10
|
+
"src",
|
|
11
|
+
"README.md",
|
|
12
|
+
"LICENSE-MIT",
|
|
13
|
+
"LICENSE-APACHE"
|
|
14
|
+
],
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "tsc",
|
|
17
|
+
"test": "vitest run",
|
|
18
|
+
"test:watch": "vitest",
|
|
19
|
+
"prepublishOnly": "pnpm build && pnpm test"
|
|
20
|
+
},
|
|
21
|
+
"repository": {
|
|
22
|
+
"type": "git",
|
|
23
|
+
"url": "https://github.com/fcapolini/goodscript.git",
|
|
24
|
+
"directory": "stdlib/core"
|
|
25
|
+
},
|
|
26
|
+
"bugs": {
|
|
27
|
+
"url": "https://github.com/fcapolini/goodscript/issues"
|
|
28
|
+
},
|
|
29
|
+
"homepage": "https://github.com/fcapolini/goodscript/tree/main/stdlib/core#readme",
|
|
30
|
+
"keywords": [
|
|
31
|
+
"goodscript",
|
|
32
|
+
"stdlib",
|
|
33
|
+
"collections",
|
|
34
|
+
"array",
|
|
35
|
+
"map",
|
|
36
|
+
"set",
|
|
37
|
+
"string"
|
|
38
|
+
],
|
|
39
|
+
"author": "GoodScript Contributors",
|
|
40
|
+
"license": "MIT OR Apache-2.0",
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"typescript": "^5.6.0",
|
|
43
|
+
"vitest": "^2.1.0"
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Array utilities with dual error handling pattern.
|
|
3
|
+
*
|
|
4
|
+
* All fallible operations provide:
|
|
5
|
+
* - `operation()` - throws Error on failure
|
|
6
|
+
* - `tryOperation()` - returns null on failure
|
|
7
|
+
*/
|
|
8
|
+
export class ArrayTools {
|
|
9
|
+
/**
|
|
10
|
+
* Get element at index. Throws if index is out of bounds.
|
|
11
|
+
*/
|
|
12
|
+
static at<T>(arr: Array<T>, index: number): T {
|
|
13
|
+
const result = ArrayTools.tryAt(arr, index);
|
|
14
|
+
if (result === null) {
|
|
15
|
+
throw new Error(`Array index out of bounds: ${index} (length: ${arr.length})`);
|
|
16
|
+
}
|
|
17
|
+
return result;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Get element at index. Returns null if index is out of bounds.
|
|
22
|
+
*/
|
|
23
|
+
static tryAt<T>(arr: Array<T>, index: number): T | null {
|
|
24
|
+
// Support negative indexing
|
|
25
|
+
const actualIndex = index < 0 ? arr.length + index : index;
|
|
26
|
+
if (actualIndex < 0 || actualIndex >= arr.length) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
return arr[actualIndex];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Get first element. Throws if array is empty.
|
|
34
|
+
*/
|
|
35
|
+
static first<T>(arr: Array<T>): T {
|
|
36
|
+
const result = ArrayTools.tryFirst(arr);
|
|
37
|
+
if (result === null) {
|
|
38
|
+
throw new Error('Cannot get first element of empty array');
|
|
39
|
+
}
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Get first element. Returns null if array is empty.
|
|
45
|
+
*/
|
|
46
|
+
static tryFirst<T>(arr: Array<T>): T | null {
|
|
47
|
+
if (arr.length === 0) {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
return arr[0];
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Get last element. Throws if array is empty.
|
|
55
|
+
*/
|
|
56
|
+
static last<T>(arr: Array<T>): T {
|
|
57
|
+
const result = ArrayTools.tryLast(arr);
|
|
58
|
+
if (result === null) {
|
|
59
|
+
throw new Error('Cannot get last element of empty array');
|
|
60
|
+
}
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Get last element. Returns null if array is empty.
|
|
66
|
+
*/
|
|
67
|
+
static tryLast<T>(arr: Array<T>): T | null {
|
|
68
|
+
if (arr.length === 0) {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
return arr[arr.length - 1];
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Split array into chunks of specified size.
|
|
76
|
+
* Last chunk may be smaller if array length is not evenly divisible.
|
|
77
|
+
*/
|
|
78
|
+
static chunk<T>(arr: Array<T>, size: number): Array<Array<T>> {
|
|
79
|
+
if (size <= 0) {
|
|
80
|
+
throw new Error(`Chunk size must be positive, got: ${size}`);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const result: Array<Array<T>> = [];
|
|
84
|
+
for (let i = 0; i < arr.length; i += size) {
|
|
85
|
+
result.push(arr.slice(i, i + size));
|
|
86
|
+
}
|
|
87
|
+
return result;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Zip two arrays together into array of tuples.
|
|
92
|
+
* Result length is minimum of input lengths.
|
|
93
|
+
*/
|
|
94
|
+
static zip<T, U>(a: Array<T>, b: Array<U>): Array<[T, U]> {
|
|
95
|
+
const length = Math.min(a.length, b.length);
|
|
96
|
+
const result: Array<[T, U]> = [];
|
|
97
|
+
for (let i = 0; i < length; i++) {
|
|
98
|
+
result.push([a[i], b[i]]);
|
|
99
|
+
}
|
|
100
|
+
return result;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Create range of integers [start, end).
|
|
105
|
+
*/
|
|
106
|
+
static range(start: number, end: number, step: number = 1): Array<number> {
|
|
107
|
+
if (step === 0) {
|
|
108
|
+
throw new Error('Step cannot be zero');
|
|
109
|
+
}
|
|
110
|
+
if ((end - start) / step < 0) {
|
|
111
|
+
throw new Error('Invalid range: step direction does not match start/end');
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const result: Array<number> = [];
|
|
115
|
+
if (step > 0) {
|
|
116
|
+
for (let i = start; i < end; i += step) {
|
|
117
|
+
result.push(i);
|
|
118
|
+
}
|
|
119
|
+
} else {
|
|
120
|
+
for (let i = start; i > end; i += step) {
|
|
121
|
+
result.push(i);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return result;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Flatten nested array one level deep.
|
|
129
|
+
*/
|
|
130
|
+
static flatten<T>(arr: Array<Array<T>>): Array<T> {
|
|
131
|
+
const result: Array<T> = [];
|
|
132
|
+
for (const subArray of arr) {
|
|
133
|
+
for (const item of subArray) {
|
|
134
|
+
result.push(item);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return result;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Remove duplicate values from array.
|
|
142
|
+
* Preserves first occurrence order.
|
|
143
|
+
*/
|
|
144
|
+
static unique<T>(arr: Array<T>): Array<T> {
|
|
145
|
+
const seen = new Set<T>();
|
|
146
|
+
const result: Array<T> = [];
|
|
147
|
+
for (const item of arr) {
|
|
148
|
+
if (!seen.has(item)) {
|
|
149
|
+
seen.add(item);
|
|
150
|
+
result.push(item);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return result;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Partition array into two arrays based on predicate.
|
|
158
|
+
* Returns [truthy, falsy] tuple.
|
|
159
|
+
*/
|
|
160
|
+
static partition<T>(arr: Array<T>, predicate: (item: T) => boolean): [Array<T>, Array<T>] {
|
|
161
|
+
const truthy: Array<T> = [];
|
|
162
|
+
const falsy: Array<T> = [];
|
|
163
|
+
for (const item of arr) {
|
|
164
|
+
if (predicate(item)) {
|
|
165
|
+
truthy.push(item);
|
|
166
|
+
} else {
|
|
167
|
+
falsy.push(item);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return [truthy, falsy];
|
|
171
|
+
}
|
|
172
|
+
}
|
package/src/index-gs.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @goodscript/core - Core Types & Collections
|
|
3
|
+
*
|
|
4
|
+
* GoodScript standard library module providing utilities for:
|
|
5
|
+
* - Array operations with dual error handling
|
|
6
|
+
* - Map and Set utilities
|
|
7
|
+
* - String parsing with fallible operations
|
|
8
|
+
*
|
|
9
|
+
* All fallible operations follow the dual-API pattern:
|
|
10
|
+
* - `operation()` throws on error
|
|
11
|
+
* - `tryOperation()` returns null on error
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
export { ArrayTools } from './array-tools-gs.js';
|
|
15
|
+
export { MapTools } from './map-tools-gs.js';
|
|
16
|
+
export { SetTools } from './set-tools-gs.js';
|
|
17
|
+
export { StringTools } from './string-tools-gs.js';
|