@bitbeater/ecma-utils 2.8.0 → 2.9.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/dist/strings.d.ts CHANGED
@@ -12,6 +12,7 @@ export declare function isJson(str: string): boolean;
12
12
  * @returns
13
13
  */
14
14
  export declare function templateToString(template: TemplateStringsArray, ...expressions: TemplateExpression[]): string;
15
+ type SplitTuple = [delimiterRun: string, token: string];
15
16
  /**
16
17
  * Separates text into an array of [whitespace, word] tuples, preserving the whitespace.
17
18
  * @example
@@ -27,8 +28,47 @@ export declare function templateToString(template: TemplateStringsArray, ...expr
27
28
  * @param text
28
29
  * @returns [[whitespace, word], ...]
29
30
  */
30
- export declare function spacedWords(text: string): [string, string][];
31
- export declare const isWhitespace: (char: string) => boolean;
31
+ export declare function spacedWords(text: string): SplitTuple[];
32
+ /**
33
+ * Splits a string into pairs of `[delimiterRun, token]`, preserving contiguous
34
+ * delimiter runs.
35
+ *
36
+ * @param {string} text - The input string to split.
37
+ * @param {(char: string, index: number, text: string) => boolean} isDelimiter
38
+ * Predicate to determine whether a character is a delimiter.
39
+ * @returns {[string, string][]} Array of tuples: `[delimiterRun, token]`.
40
+ *
41
+ * @example
42
+ * ```ts
43
+ * // Split on spaces and punctuation
44
+ * const isDelim = (ch) => ch === ' ' || ch === '-' || ch === '!';
45
+ *
46
+ * splitRuns('hello world', isDelim);
47
+ * [
48
+ * ["", "hello"],
49
+ * [" ", "world"],
50
+ * ]
51
+ *
52
+ * splitRuns('hello world!', isDelim);
53
+ * [
54
+ * ["", "hello"],
55
+ * [" ", "world"],
56
+ * ["!", ""]
57
+ * ]
58
+ *
59
+ * splitRuns('- hello world!', isDelim);
60
+ * [
61
+ * ["- ", "hello"],
62
+ * [" ", "world"],
63
+ * ["!", ""]
64
+ * ]
65
+ * ```
66
+ * */
67
+ export declare function splitRuns(text: string, isDelimiter: (char: string, index?: number, text?: string) => boolean): SplitTuple[];
32
68
  export declare function isUpperCase(str: string): boolean;
69
+ export declare const isWhitespace: (char: string) => boolean;
70
+ export declare function isPunctuation(char: string): boolean;
71
+ export declare function isNumber(char: string): boolean;
33
72
  export type TemplateExpression = string | number | Array<string | number>;
73
+ export {};
34
74
  //# sourceMappingURL=strings.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"strings.d.ts","sourceRoot":"","sources":["../src/strings.ts"],"names":[],"mappings":"AAAA,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAO3C;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,oBAAoB,EAAE,GAAG,WAAW,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAS7G;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAyB5D;AAED,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,KAAG,OAE3C,CAAC;AAEF,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEhD;AAED,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC"}
1
+ {"version":3,"file":"strings.d.ts","sourceRoot":"","sources":["../src/strings.ts"],"names":[],"mappings":"AAAA,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAO3C;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,oBAAoB,EAAE,GAAG,WAAW,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAS7G;AAED,KAAK,UAAU,GAAG,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AAExD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CAEtD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAkCK;AAEL,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,OAAO,GAAG,UAAU,EAAE,CAgC3H;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEhD;AAED,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,KAAG,OAE3C,CAAC;AAEF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE9C;AAED,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC"}
package/dist/strings.js CHANGED
@@ -4,7 +4,10 @@ exports.isWhitespace = void 0;
4
4
  exports.isJson = isJson;
5
5
  exports.templateToString = templateToString;
6
6
  exports.spacedWords = spacedWords;
7
+ exports.splitRuns = splitRuns;
7
8
  exports.isUpperCase = isUpperCase;
9
+ exports.isPunctuation = isPunctuation;
10
+ exports.isNumber = isNumber;
8
11
  function isJson(str) {
9
12
  try {
10
13
  JSON.parse(str);
@@ -50,31 +53,83 @@ function templateToString(template, ...expressions) {
50
53
  * @returns [[whitespace, word], ...]
51
54
  */
52
55
  function spacedWords(text) {
53
- const _spacedWords = [];
54
- let isPreviousCharWhitespace = null;
55
- let [whitespaces, currentWord] = ['', ''];
56
- for (const char of text) {
57
- if ((0, exports.isWhitespace)(char)) {
58
- if (isPreviousCharWhitespace === false) {
59
- _spacedWords.push([whitespaces, currentWord]);
60
- currentWord = '';
61
- whitespaces = '';
62
- }
63
- const whiteSpace = char;
64
- whitespaces += whiteSpace;
65
- isPreviousCharWhitespace = true;
56
+ return splitRuns(text, exports.isWhitespace);
57
+ }
58
+ /**
59
+ * Splits a string into pairs of `[delimiterRun, token]`, preserving contiguous
60
+ * delimiter runs.
61
+ *
62
+ * @param {string} text - The input string to split.
63
+ * @param {(char: string, index: number, text: string) => boolean} isDelimiter
64
+ * Predicate to determine whether a character is a delimiter.
65
+ * @returns {[string, string][]} Array of tuples: `[delimiterRun, token]`.
66
+ *
67
+ * @example
68
+ * ```ts
69
+ * // Split on spaces and punctuation
70
+ * const isDelim = (ch) => ch === ' ' || ch === '-' || ch === '!';
71
+ *
72
+ * splitRuns('hello world', isDelim);
73
+ * [
74
+ * ["", "hello"],
75
+ * [" ", "world"],
76
+ * ]
77
+ *
78
+ * splitRuns('hello world!', isDelim);
79
+ * [
80
+ * ["", "hello"],
81
+ * [" ", "world"],
82
+ * ["!", ""]
83
+ * ]
84
+ *
85
+ * splitRuns('- hello world!', isDelim);
86
+ * [
87
+ * ["- ", "hello"],
88
+ * [" ", "world"],
89
+ * ["!", ""]
90
+ * ]
91
+ * ```
92
+ * */
93
+ function splitRuns(text, isDelimiter) {
94
+ const result = [];
95
+ if (!text)
96
+ return result;
97
+ let inDelimiter = null;
98
+ const delimiterBuf = [];
99
+ const wordBuf = [];
100
+ const flush = () => {
101
+ result.push([delimiterBuf.join(''), wordBuf.join('')]);
102
+ delimiterBuf.length = 0;
103
+ wordBuf.length = 0;
104
+ };
105
+ for (let i = 0; i < text.length; i++) {
106
+ const ch = text[i];
107
+ if (isDelimiter(ch, i, text)) {
108
+ // entering a delimiter run after a word => flush the word+match pair
109
+ if (inDelimiter === false)
110
+ flush();
111
+ delimiterBuf.push(ch);
112
+ inDelimiter = true;
66
113
  continue;
67
114
  }
68
- currentWord += char;
69
- isPreviousCharWhitespace = false;
115
+ wordBuf.push(ch);
116
+ inDelimiter = false;
70
117
  }
71
- return _spacedWords.concat([[whitespaces, currentWord]]);
118
+ // flush trailing tuple (captures trailing delimiter run or last word)
119
+ flush();
120
+ return result;
121
+ }
122
+ function isUpperCase(str) {
123
+ return str === str.toUpperCase();
72
124
  }
73
125
  const isWhitespace = (char) => {
74
126
  return /\s/.test(char);
75
127
  };
76
128
  exports.isWhitespace = isWhitespace;
77
- function isUpperCase(str) {
78
- return str === str.toUpperCase();
129
+ function isPunctuation(char) {
130
+ return /[.,\/#!$%\^&\*;:{}=\-_`~()]/.test(char);
131
+ }
132
+ function isNumber(char) {
133
+ return /[0-9]/.test(char);
79
134
  }
80
135
  //# sourceMappingURL=strings.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"strings.js","sourceRoot":"","sources":["../src/strings.ts"],"names":[],"mappings":";;;AAAA,wBAOC;AAcD,4CASC;AAiBD,kCAyBC;AAMD,kCAEC;AAhFD,SAAgB,MAAM,CAAC,GAAW;IACjC,IAAI,CAAC;QACJ,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,OAAO,KAAK,CAAC;IACd,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAgB,gBAAgB,CAAC,QAA8B,EAAE,GAAG,WAAiC;IACpG,MAAM,MAAM,GAAG,EAAE,CAAC;IAElB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,SAAgB,WAAW,CAAC,IAAY;IACvC,MAAM,YAAY,GAAuB,EAAE,CAAC;IAE5C,IAAI,wBAAwB,GAAG,IAAI,CAAC;IACpC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAE1C,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACzB,IAAI,IAAA,oBAAY,EAAC,IAAI,CAAC,EAAE,CAAC;YACxB,IAAI,wBAAwB,KAAK,KAAK,EAAE,CAAC;gBACxC,YAAY,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;gBAC9C,WAAW,GAAG,EAAE,CAAC;gBACjB,WAAW,GAAG,EAAE,CAAC;YAClB,CAAC;YAED,MAAM,UAAU,GAAG,IAAI,CAAC;YACxB,WAAW,IAAI,UAAU,CAAC;YAC1B,wBAAwB,GAAG,IAAI,CAAC;YAChC,SAAS;QACV,CAAC;QAED,WAAW,IAAI,IAAI,CAAC;QACpB,wBAAwB,GAAG,KAAK,CAAC;IAClC,CAAC;IAED,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;AAC1D,CAAC;AAEM,MAAM,YAAY,GAAG,CAAC,IAAY,EAAW,EAAE;IACrD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC,CAAC;AAFW,QAAA,YAAY,gBAEvB;AAEF,SAAgB,WAAW,CAAC,GAAW;IACtC,OAAO,GAAG,KAAK,GAAG,CAAC,WAAW,EAAE,CAAC;AAClC,CAAC"}
1
+ {"version":3,"file":"strings.js","sourceRoot":"","sources":["../src/strings.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bitbeater/ecma-utils",
3
- "version": "2.8.0",
3
+ "version": "2.9.0",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "sideEffects": false,