flowquery 1.0.0 → 1.0.2

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.
Files changed (178) hide show
  1. package/.github/workflows/npm-publish.yml +2 -0
  2. package/.github/workflows/release.yml +24 -9
  3. package/dist/compute/runner.js +75 -0
  4. package/dist/compute/runner.js.map +1 -0
  5. package/dist/flowquery.min.js +1 -0
  6. package/dist/index.browser.js +119 -0
  7. package/dist/index.browser.js.map +1 -0
  8. package/dist/index.js +16 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/index.node.js +123 -0
  11. package/dist/index.node.js.map +1 -0
  12. package/dist/io/command_line.js +102 -0
  13. package/dist/io/command_line.js.map +1 -0
  14. package/dist/parsing/alias.js +23 -0
  15. package/dist/parsing/alias.js.map +1 -0
  16. package/dist/parsing/alias_option.js +11 -0
  17. package/dist/parsing/alias_option.js.map +1 -0
  18. package/dist/parsing/ast_node.js +145 -0
  19. package/dist/parsing/ast_node.js.map +1 -0
  20. package/dist/parsing/base_parser.js +92 -0
  21. package/dist/parsing/base_parser.js.map +1 -0
  22. package/dist/parsing/components/csv.js +13 -0
  23. package/dist/parsing/components/csv.js.map +1 -0
  24. package/dist/parsing/components/from.js +16 -0
  25. package/dist/parsing/components/from.js.map +1 -0
  26. package/dist/parsing/components/headers.js +16 -0
  27. package/dist/parsing/components/headers.js.map +1 -0
  28. package/dist/parsing/components/json.js +13 -0
  29. package/dist/parsing/components/json.js.map +1 -0
  30. package/dist/parsing/components/null.js +13 -0
  31. package/dist/parsing/components/null.js.map +1 -0
  32. package/dist/parsing/components/post.js +13 -0
  33. package/dist/parsing/components/post.js.map +1 -0
  34. package/dist/parsing/components/text.js +13 -0
  35. package/dist/parsing/components/text.js.map +1 -0
  36. package/dist/parsing/context.js +47 -0
  37. package/dist/parsing/context.js.map +1 -0
  38. package/dist/parsing/data_structures/associative_array.js +45 -0
  39. package/dist/parsing/data_structures/associative_array.js.map +1 -0
  40. package/dist/parsing/data_structures/json_array.js +35 -0
  41. package/dist/parsing/data_structures/json_array.js.map +1 -0
  42. package/dist/parsing/data_structures/key_value_pair.js +41 -0
  43. package/dist/parsing/data_structures/key_value_pair.js.map +1 -0
  44. package/dist/parsing/data_structures/lookup.js +44 -0
  45. package/dist/parsing/data_structures/lookup.js.map +1 -0
  46. package/dist/parsing/data_structures/range_lookup.js +40 -0
  47. package/dist/parsing/data_structures/range_lookup.js.map +1 -0
  48. package/dist/parsing/expressions/expression.js +142 -0
  49. package/dist/parsing/expressions/expression.js.map +1 -0
  50. package/dist/parsing/expressions/f_string.js +29 -0
  51. package/dist/parsing/expressions/f_string.js.map +1 -0
  52. package/dist/parsing/expressions/identifier.js +26 -0
  53. package/dist/parsing/expressions/identifier.js.map +1 -0
  54. package/dist/parsing/expressions/number.js +41 -0
  55. package/dist/parsing/expressions/number.js.map +1 -0
  56. package/dist/parsing/expressions/operator.js +180 -0
  57. package/dist/parsing/expressions/operator.js.map +1 -0
  58. package/dist/parsing/expressions/reference.js +45 -0
  59. package/dist/parsing/expressions/reference.js.map +1 -0
  60. package/dist/parsing/expressions/string.js +34 -0
  61. package/dist/parsing/expressions/string.js.map +1 -0
  62. package/dist/parsing/functions/aggregate_function.js +58 -0
  63. package/dist/parsing/functions/aggregate_function.js.map +1 -0
  64. package/dist/parsing/functions/async_function.js +119 -0
  65. package/dist/parsing/functions/async_function.js.map +1 -0
  66. package/dist/parsing/functions/avg.js +43 -0
  67. package/dist/parsing/functions/avg.js.map +1 -0
  68. package/dist/parsing/functions/collect.js +52 -0
  69. package/dist/parsing/functions/collect.js.map +1 -0
  70. package/dist/parsing/functions/function.js +59 -0
  71. package/dist/parsing/functions/function.js.map +1 -0
  72. package/dist/parsing/functions/function_factory.js +259 -0
  73. package/dist/parsing/functions/function_factory.js.map +1 -0
  74. package/dist/parsing/functions/function_metadata.js +159 -0
  75. package/dist/parsing/functions/function_metadata.js.map +1 -0
  76. package/dist/parsing/functions/functions.js +47 -0
  77. package/dist/parsing/functions/functions.js.map +1 -0
  78. package/dist/parsing/functions/join.js +29 -0
  79. package/dist/parsing/functions/join.js.map +1 -0
  80. package/dist/parsing/functions/predicate_function.js +37 -0
  81. package/dist/parsing/functions/predicate_function.js.map +1 -0
  82. package/dist/parsing/functions/predicate_function_factory.js +19 -0
  83. package/dist/parsing/functions/predicate_function_factory.js.map +1 -0
  84. package/dist/parsing/functions/predicate_sum.js +33 -0
  85. package/dist/parsing/functions/predicate_sum.js.map +1 -0
  86. package/dist/parsing/functions/rand.js +17 -0
  87. package/dist/parsing/functions/rand.js.map +1 -0
  88. package/dist/parsing/functions/range.js +22 -0
  89. package/dist/parsing/functions/range.js.map +1 -0
  90. package/dist/parsing/functions/reducer_element.js +12 -0
  91. package/dist/parsing/functions/reducer_element.js.map +1 -0
  92. package/dist/parsing/functions/replace.js +23 -0
  93. package/dist/parsing/functions/replace.js.map +1 -0
  94. package/dist/parsing/functions/round.js +21 -0
  95. package/dist/parsing/functions/round.js.map +1 -0
  96. package/dist/parsing/functions/size.js +21 -0
  97. package/dist/parsing/functions/size.js.map +1 -0
  98. package/dist/parsing/functions/split.js +29 -0
  99. package/dist/parsing/functions/split.js.map +1 -0
  100. package/dist/parsing/functions/stringify.js +29 -0
  101. package/dist/parsing/functions/stringify.js.map +1 -0
  102. package/dist/parsing/functions/sum.js +38 -0
  103. package/dist/parsing/functions/sum.js.map +1 -0
  104. package/dist/parsing/functions/to_json.js +21 -0
  105. package/dist/parsing/functions/to_json.js.map +1 -0
  106. package/dist/parsing/functions/value_holder.js +16 -0
  107. package/dist/parsing/functions/value_holder.js.map +1 -0
  108. package/dist/parsing/logic/case.js +27 -0
  109. package/dist/parsing/logic/case.js.map +1 -0
  110. package/dist/parsing/logic/else.js +16 -0
  111. package/dist/parsing/logic/else.js.map +1 -0
  112. package/dist/parsing/logic/end.js +13 -0
  113. package/dist/parsing/logic/end.js.map +1 -0
  114. package/dist/parsing/logic/then.js +16 -0
  115. package/dist/parsing/logic/then.js.map +1 -0
  116. package/dist/parsing/logic/when.js +16 -0
  117. package/dist/parsing/logic/when.js.map +1 -0
  118. package/dist/parsing/operations/aggregated_return.js +35 -0
  119. package/dist/parsing/operations/aggregated_return.js.map +1 -0
  120. package/dist/parsing/operations/aggregated_with.js +41 -0
  121. package/dist/parsing/operations/aggregated_with.js.map +1 -0
  122. package/dist/parsing/operations/group_by.js +139 -0
  123. package/dist/parsing/operations/group_by.js.map +1 -0
  124. package/dist/parsing/operations/limit.js +38 -0
  125. package/dist/parsing/operations/limit.js.map +1 -0
  126. package/dist/parsing/operations/load.js +174 -0
  127. package/dist/parsing/operations/load.js.map +1 -0
  128. package/dist/parsing/operations/operation.js +81 -0
  129. package/dist/parsing/operations/operation.js.map +1 -0
  130. package/dist/parsing/operations/projection.js +21 -0
  131. package/dist/parsing/operations/projection.js.map +1 -0
  132. package/dist/parsing/operations/return.js +60 -0
  133. package/dist/parsing/operations/return.js.map +1 -0
  134. package/dist/parsing/operations/unwind.js +46 -0
  135. package/dist/parsing/operations/unwind.js.map +1 -0
  136. package/dist/parsing/operations/where.js +53 -0
  137. package/dist/parsing/operations/where.js.map +1 -0
  138. package/dist/parsing/operations/with.js +36 -0
  139. package/dist/parsing/operations/with.js.map +1 -0
  140. package/dist/parsing/parser.js +812 -0
  141. package/dist/parsing/parser.js.map +1 -0
  142. package/dist/parsing/token_to_node.js +121 -0
  143. package/dist/parsing/token_to_node.js.map +1 -0
  144. package/dist/tokenization/keyword.js +46 -0
  145. package/dist/tokenization/keyword.js.map +1 -0
  146. package/dist/tokenization/operator.js +28 -0
  147. package/dist/tokenization/operator.js.map +1 -0
  148. package/dist/tokenization/string_walker.js +165 -0
  149. package/dist/tokenization/string_walker.js.map +1 -0
  150. package/dist/tokenization/symbol.js +18 -0
  151. package/dist/tokenization/symbol.js.map +1 -0
  152. package/dist/tokenization/token.js +484 -0
  153. package/dist/tokenization/token.js.map +1 -0
  154. package/dist/tokenization/token_mapper.js +55 -0
  155. package/dist/tokenization/token_mapper.js.map +1 -0
  156. package/dist/tokenization/token_type.js +19 -0
  157. package/dist/tokenization/token_type.js.map +1 -0
  158. package/dist/tokenization/tokenizer.js +220 -0
  159. package/dist/tokenization/tokenizer.js.map +1 -0
  160. package/dist/tokenization/trie.js +111 -0
  161. package/dist/tokenization/trie.js.map +1 -0
  162. package/dist/utils/object_utils.js +19 -0
  163. package/dist/utils/object_utils.js.map +1 -0
  164. package/dist/utils/string_utils.js +110 -0
  165. package/dist/utils/string_utils.js.map +1 -0
  166. package/docs/flowquery.min.js +1 -1
  167. package/flowquery-vscode/flowQueryEngine/flowquery.min.js +1 -1
  168. package/package.json +22 -4
  169. package/src/compute/runner.ts +45 -0
  170. package/src/index.browser.ts +118 -0
  171. package/src/index.node.ts +141 -0
  172. package/src/parsing/functions/async_function.ts +95 -0
  173. package/src/parsing/functions/function_factory.ts +230 -1
  174. package/src/parsing/functions/function_metadata.ts +238 -0
  175. package/src/parsing/functions/functions.ts +43 -0
  176. package/src/parsing/operations/load.ts +51 -2
  177. package/src/parsing/parser.ts +45 -4
  178. package/tests/parsing/function_plugins.test.ts +369 -0
@@ -0,0 +1,220 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const keyword_1 = __importDefault(require("./keyword"));
7
+ const token_1 = __importDefault(require("./token"));
8
+ const string_walker_1 = __importDefault(require("./string_walker"));
9
+ const string_utils_1 = __importDefault(require("../utils/string_utils"));
10
+ const symbol_1 = __importDefault(require("./symbol"));
11
+ const operator_1 = __importDefault(require("./operator"));
12
+ const token_mapper_1 = __importDefault(require("./token_mapper"));
13
+ /**
14
+ * Tokenizes FlowQuery input strings into a sequence of tokens.
15
+ *
16
+ * The tokenizer performs lexical analysis, breaking down the input text into
17
+ * meaningful tokens such as keywords, identifiers, operators, strings, numbers,
18
+ * and symbols. It handles comments, whitespace, and f-strings.
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * const tokenizer = new Tokenizer("WITH x = 1 RETURN x");
23
+ * const tokens = tokenizer.tokenize();
24
+ * ```
25
+ */
26
+ class Tokenizer {
27
+ /**
28
+ * Creates a new Tokenizer instance for the given input.
29
+ *
30
+ * @param input - The FlowQuery input string to tokenize
31
+ */
32
+ constructor(input) {
33
+ this.keywords = new token_mapper_1.default(keyword_1.default);
34
+ this.symbols = new token_mapper_1.default(symbol_1.default);
35
+ this.operators = new token_mapper_1.default(operator_1.default);
36
+ this.walker = new string_walker_1.default(input);
37
+ }
38
+ /**
39
+ * Tokenizes the input string into an array of tokens.
40
+ *
41
+ * @returns An array of Token objects representing the tokenized input
42
+ * @throws {Error} If an unrecognized token is encountered
43
+ */
44
+ tokenize() {
45
+ const tokens = [];
46
+ let last = null;
47
+ while (!this.walker.isAtEnd) {
48
+ tokens.push(...this.f_string());
49
+ last = this.getLastNonWhitespaceOrNonCommentToken(tokens) || last;
50
+ const token = this.getNextToken(last);
51
+ if (token === null) {
52
+ throw new Error(`Unrecognized token at position ${this.walker.position}`);
53
+ }
54
+ token.position = this.walker.position;
55
+ tokens.push(token);
56
+ }
57
+ return tokens;
58
+ }
59
+ getLastNonWhitespaceOrNonCommentToken(tokens) {
60
+ if (tokens.length === 0) {
61
+ return null;
62
+ }
63
+ if (!tokens[tokens.length - 1].isWhitespaceOrComment()) {
64
+ return tokens[tokens.length - 1];
65
+ }
66
+ return null;
67
+ }
68
+ getNextToken(last = null) {
69
+ if (this.walker.isAtEnd) {
70
+ return token_1.default.EOF;
71
+ }
72
+ return (this.comment() ||
73
+ this.whitespace() ||
74
+ this.lookup(this.keywords) ||
75
+ this.lookup(this.operators, last, this.skipMinus) ||
76
+ this.identifier() ||
77
+ this.string() ||
78
+ this.number() ||
79
+ this.lookup(this.symbols));
80
+ }
81
+ comment() {
82
+ const startPosition = this.walker.position;
83
+ if (this.walker.checkForSingleComment() || this.walker.checkForMultiLineComment()) {
84
+ const uncommented = string_utils_1.default.uncomment(this.walker.getString(startPosition));
85
+ return token_1.default.COMMENT(uncommented);
86
+ }
87
+ return null;
88
+ }
89
+ identifier() {
90
+ const startPosition = this.walker.position;
91
+ if (this.walker.checkForUnderScore() || this.walker.checkForLetter()) {
92
+ while (!this.walker.isAtEnd && (this.walker.checkForLetter() || this.walker.checkForDigit() || this.walker.checkForUnderScore())) {
93
+ ;
94
+ }
95
+ return token_1.default.IDENTIFIER(this.walker.getString(startPosition));
96
+ }
97
+ return null;
98
+ }
99
+ string() {
100
+ const startPosition = this.walker.position;
101
+ const quoteChar = this.walker.checkForQuote();
102
+ if (quoteChar === null) {
103
+ return null;
104
+ }
105
+ while (!this.walker.isAtEnd) {
106
+ if (this.walker.escaped(quoteChar)) {
107
+ this.walker.moveNext();
108
+ this.walker.moveNext();
109
+ continue;
110
+ }
111
+ if (this.walker.checkForString(quoteChar)) {
112
+ const value = this.walker.getString(startPosition);
113
+ if (quoteChar === symbol_1.default.BACKTICK) {
114
+ return token_1.default.BACKTICK_STRING(value, quoteChar);
115
+ }
116
+ return token_1.default.STRING(value, quoteChar);
117
+ }
118
+ this.walker.moveNext();
119
+ }
120
+ throw new Error(`Unterminated string at position ${startPosition}`);
121
+ }
122
+ *f_string() {
123
+ if (!this.walker.checkForFStringStart()) {
124
+ return;
125
+ }
126
+ this.walker.moveNext(); // skip the f
127
+ let position = this.walker.position;
128
+ const quoteChar = this.walker.checkForQuote();
129
+ if (quoteChar === null) {
130
+ return;
131
+ }
132
+ while (!this.walker.isAtEnd) {
133
+ if (this.walker.escaped(quoteChar) || this.walker.escapedBrace()) {
134
+ this.walker.moveNext();
135
+ this.walker.moveNext();
136
+ continue;
137
+ }
138
+ if (this.walker.openingBrace()) {
139
+ yield token_1.default.F_STRING(this.walker.getString(position), quoteChar);
140
+ position = this.walker.position;
141
+ yield token_1.default.OPENING_BRACE;
142
+ this.walker.moveNext(); // skip the opening brace
143
+ position = this.walker.position;
144
+ while (!this.walker.isAtEnd && !this.walker.closingBrace()) {
145
+ const token = this.getNextToken();
146
+ if (token !== null) {
147
+ yield token;
148
+ }
149
+ else {
150
+ break;
151
+ }
152
+ if (this.walker.closingBrace()) {
153
+ yield token_1.default.CLOSING_BRACE;
154
+ this.walker.moveNext(); // skip the closing brace
155
+ position = this.walker.position;
156
+ break;
157
+ }
158
+ }
159
+ }
160
+ if (this.walker.checkForString(quoteChar)) {
161
+ yield token_1.default.F_STRING(this.walker.getString(position), quoteChar);
162
+ return;
163
+ }
164
+ ;
165
+ this.walker.moveNext();
166
+ }
167
+ }
168
+ whitespace() {
169
+ let foundWhitespace = false;
170
+ while (!this.walker.isAtEnd && this.walker.checkForWhitespace()) {
171
+ this.walker.moveNext();
172
+ foundWhitespace = true;
173
+ }
174
+ return foundWhitespace ? token_1.default.WHITESPACE : null;
175
+ }
176
+ number() {
177
+ const startPosition = this.walker.position;
178
+ if (this.walker.checkForString('-') || this.walker.checkForDigit()) {
179
+ while (!this.walker.isAtEnd && this.walker.checkForDigit()) {
180
+ ;
181
+ }
182
+ if (this.walker.checkForString(symbol_1.default.DOT)) {
183
+ while (!this.walker.isAtEnd && this.walker.checkForDigit()) {
184
+ ;
185
+ }
186
+ }
187
+ const _number = this.walker.getString(startPosition);
188
+ return token_1.default.NUMBER(_number);
189
+ }
190
+ return null;
191
+ }
192
+ lookup(mapper, last = null, skip) {
193
+ const token = mapper.map(this.walker.getRemainingString());
194
+ if (token !== undefined && token.value !== null) {
195
+ if (token.can_be_identifier && this.walker.word_continuation(token.value)) {
196
+ return null;
197
+ }
198
+ if (skip && last && skip(last, token)) {
199
+ return null;
200
+ }
201
+ this.walker.moveBy(token.value.length);
202
+ if (mapper.last_found !== null) {
203
+ token.case_sensitive_value = mapper.last_found;
204
+ }
205
+ return token;
206
+ }
207
+ return null;
208
+ }
209
+ skipMinus(last, current) {
210
+ if (last === null) {
211
+ return false;
212
+ }
213
+ if ((last.isKeyword() || last.isComma() || last.isColon()) && current.isNegation()) {
214
+ return true;
215
+ }
216
+ return false;
217
+ }
218
+ }
219
+ exports.default = Tokenizer;
220
+ //# sourceMappingURL=tokenizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../../src/tokenization/tokenizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /**
4
+ * Represents a node in a Trie data structure.
5
+ *
6
+ * Each node can have children nodes (one per character) and may contain a token
7
+ * if the path to this node represents a complete word.
8
+ */
9
+ class Node {
10
+ constructor() {
11
+ this._children = new Map();
12
+ this._token = undefined;
13
+ }
14
+ map(char) {
15
+ return this._children.get(char) || this._children.set(char, new Node()).get(char);
16
+ }
17
+ retrieve(char) {
18
+ return this._children.get(char);
19
+ }
20
+ set token(token) {
21
+ this._token = token;
22
+ }
23
+ get token() {
24
+ return this._token;
25
+ }
26
+ is_end_of_word() {
27
+ return this._token !== undefined;
28
+ }
29
+ no_children() {
30
+ return this._children.size === 0;
31
+ }
32
+ }
33
+ /**
34
+ * Trie (prefix tree) data structure for efficient keyword and operator lookup.
35
+ *
36
+ * Used during tokenization to quickly match input strings against known keywords
37
+ * and operators. Supports case-insensitive matching and tracks the longest match found.
38
+ *
39
+ * @example
40
+ * ```typescript
41
+ * const trie = new Trie();
42
+ * trie.insert(Token.WITH);
43
+ * const found = trie.find("WITH");
44
+ * ```
45
+ */
46
+ class Trie {
47
+ constructor() {
48
+ this._root = new Node();
49
+ this._max_length = 0;
50
+ this._last_found = null;
51
+ }
52
+ /**
53
+ * Inserts a token into the trie.
54
+ *
55
+ * @param token - The token to insert
56
+ * @throws {Error} If the token value is null or empty
57
+ */
58
+ insert(token) {
59
+ if (token.value === null || token.value.length === 0) {
60
+ throw new Error("Token value cannot be null or empty");
61
+ }
62
+ let currentNode = this._root;
63
+ for (const char of token.value) {
64
+ currentNode = currentNode.map(char.toLowerCase());
65
+ }
66
+ if (token.value.length > this._max_length) {
67
+ this._max_length = token.value.length;
68
+ }
69
+ currentNode.token = token;
70
+ }
71
+ /**
72
+ * Finds a token by searching for the longest matching prefix in the trie.
73
+ *
74
+ * @param value - The string value to search for
75
+ * @returns The token if found, undefined otherwise
76
+ */
77
+ find(value) {
78
+ if (value.length === 0) {
79
+ return undefined;
80
+ }
81
+ let index = 0;
82
+ let current = undefined;
83
+ let found = undefined;
84
+ this._last_found = null;
85
+ while ((current = (current || this._root).retrieve(value[index].toLowerCase())) !== undefined) {
86
+ if (current.is_end_of_word()) {
87
+ found = current.token;
88
+ this._last_found = value.substring(0, index + 1);
89
+ }
90
+ index++;
91
+ if (index === value.length || index > this._max_length) {
92
+ break;
93
+ }
94
+ }
95
+ if (current === null || current === void 0 ? void 0 : current.is_end_of_word()) {
96
+ found = current.token;
97
+ this._last_found = value.substring(0, index);
98
+ }
99
+ return found;
100
+ }
101
+ /**
102
+ * Gets the last matched string from the most recent find operation.
103
+ *
104
+ * @returns The last found string, or null if no match was found
105
+ */
106
+ get last_found() {
107
+ return this._last_found;
108
+ }
109
+ }
110
+ exports.default = Trie;
111
+ //# sourceMappingURL=trie.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trie.js","sourceRoot":"","sources":["../../src/tokenization/trie.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /**
4
+ * Utility class for object-related operations.
5
+ */
6
+ class ObjectUtils {
7
+ /**
8
+ * Checks if an object is an instance of any of the provided classes.
9
+ *
10
+ * @param obj - The object to check
11
+ * @param classes - Array of class constructors to test against
12
+ * @returns True if the object is an instance of any class, false otherwise
13
+ */
14
+ static isInstanceOfAny(obj, classes) {
15
+ return classes.some(cls => obj instanceof cls);
16
+ }
17
+ }
18
+ exports.default = ObjectUtils;
19
+ //# sourceMappingURL=object_utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object_utils.js","sourceRoot":"","sources":["../../src/utils/object_utils.ts"],"names":[],"mappings":";;AAAA;;GAEG;AACH,MAAM,WAAW;IACb;;;;;;OAMG;IACH,MAAM,CAAC,eAAe,CAAC,GAAQ,EAAE,OAAc;QAC3C,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,GAAG,CAAC,CAAC;IACnD,CAAC;CACJ;AAED,kBAAe,WAAW,CAAC"}
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /**
4
+ * Utility class for string manipulation and validation.
5
+ *
6
+ * Provides methods for handling quoted strings, comments, escape sequences,
7
+ * and identifier validation.
8
+ */
9
+ class StringUtils {
10
+ /**
11
+ * Removes surrounding quotes from a string.
12
+ *
13
+ * @param str - The string to unquote
14
+ * @returns The unquoted string
15
+ */
16
+ static unquote(str) {
17
+ if (str.length === 0) {
18
+ return str;
19
+ }
20
+ if (str.length === 1 && StringUtils.quotes.includes(str)) {
21
+ return '';
22
+ }
23
+ const first = str[0];
24
+ const last = str[str.length - 1];
25
+ if (StringUtils.quotes.includes(first) && first === last) {
26
+ return str.substring(1, str.length - 1);
27
+ }
28
+ if (StringUtils.quotes.includes(last) && first !== last) {
29
+ return str.substring(0, str.length - 1);
30
+ }
31
+ if (StringUtils.quotes.includes(first) && first !== last) {
32
+ return str.substring(1);
33
+ }
34
+ return str;
35
+ }
36
+ /**
37
+ * Removes comment markers from a string.
38
+ *
39
+ * @param str - The comment string
40
+ * @returns The string without comment markers
41
+ */
42
+ static uncomment(str) {
43
+ if (str.length < 2) {
44
+ return str;
45
+ }
46
+ if (str[0] === '/' && str[1] === '/') {
47
+ return str.substring(2);
48
+ }
49
+ if (str[0] === '/' && str[1] === '*' && str[str.length - 2] === '*' && str[str.length - 1] === '/') {
50
+ return str.substring(2, str.length - 2);
51
+ }
52
+ return str;
53
+ }
54
+ /**
55
+ * Removes escape sequences before quotes in a string.
56
+ *
57
+ * @param str - The string to process
58
+ * @param quoteChar - The quote character that was escaped
59
+ * @returns The string with escape sequences removed
60
+ */
61
+ static removeEscapedQuotes(str, quoteChar) {
62
+ let unescaped = '';
63
+ for (let i = 0; i < str.length; i++) {
64
+ if (str[i] === '\\' && str[i + 1] === quoteChar) {
65
+ i++;
66
+ }
67
+ unescaped += str[i];
68
+ }
69
+ return unescaped;
70
+ }
71
+ /**
72
+ * Removes escaped braces ({{ and }}) from f-strings.
73
+ *
74
+ * @param str - The string to process
75
+ * @returns The string with escaped braces resolved
76
+ */
77
+ static removeEscapedBraces(str) {
78
+ let unescaped = '';
79
+ for (let i = 0; i < str.length; i++) {
80
+ if ((str[i] === '{' && str[i + 1] === '{') || (str[i] === '}' && str[i + 1] === '}')) {
81
+ i++;
82
+ }
83
+ unescaped += str[i];
84
+ }
85
+ return unescaped;
86
+ }
87
+ /**
88
+ * Checks if a string is a valid identifier.
89
+ *
90
+ * @param str - The string to validate
91
+ * @returns True if the string can be used as an identifier, false otherwise
92
+ */
93
+ static can_be_identifier(str) {
94
+ const lower = str.toLowerCase();
95
+ if (lower.length === 0) {
96
+ return false;
97
+ }
98
+ if (!StringUtils.letters.includes(lower[0]) && lower[0] !== '_') {
99
+ return false;
100
+ }
101
+ return lower.split('').every((char) => StringUtils.word_valid_chars.includes(char));
102
+ }
103
+ }
104
+ StringUtils.quotes = ['"', "'", '`'];
105
+ StringUtils.letters = 'abcdefghijklmnopqrstuvwxyz';
106
+ StringUtils.digits = '0123456789';
107
+ StringUtils.whitespace = ' \t\n\r';
108
+ StringUtils.word_valid_chars = StringUtils.letters + StringUtils.digits + '_';
109
+ exports.default = StringUtils;
110
+ //# sourceMappingURL=string_utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"string_utils.js","sourceRoot":"","sources":["../../src/utils/string_utils.ts"],"names":[],"mappings":"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"}