@reidelsaltres/pureper 0.1.157 → 0.1.162

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 (107) hide show
  1. package/out/foundation/Triplet.d.ts.map +1 -1
  2. package/out/foundation/Triplet.js +4 -5
  3. package/out/foundation/Triplet.js.map +1 -1
  4. package/out/foundation/api/Observer.d.ts +30 -0
  5. package/out/foundation/api/Observer.d.ts.map +1 -1
  6. package/out/foundation/api/Observer.js +48 -0
  7. package/out/foundation/api/Observer.js.map +1 -1
  8. package/out/foundation/component_api/Component.d.ts +2 -2
  9. package/out/foundation/component_api/Component.d.ts.map +1 -1
  10. package/out/foundation/component_api/Component.js.map +1 -1
  11. package/out/foundation/component_api/UniHtml.d.ts +4 -10
  12. package/out/foundation/component_api/UniHtml.d.ts.map +1 -1
  13. package/out/foundation/component_api/UniHtml.js +7 -15
  14. package/out/foundation/component_api/UniHtml.js.map +1 -1
  15. package/out/foundation/engine/BalancedParser.d.ts +58 -0
  16. package/out/foundation/engine/BalancedParser.d.ts.map +1 -0
  17. package/out/foundation/engine/BalancedParser.js +301 -0
  18. package/out/foundation/engine/BalancedParser.js.map +1 -0
  19. package/out/foundation/engine/EscapeHandler.d.ts +27 -0
  20. package/out/foundation/engine/EscapeHandler.d.ts.map +1 -0
  21. package/out/foundation/engine/EscapeHandler.js +47 -0
  22. package/out/foundation/engine/EscapeHandler.js.map +1 -0
  23. package/out/foundation/engine/Expression.d.ts +83 -0
  24. package/out/foundation/engine/Expression.d.ts.map +1 -0
  25. package/out/foundation/engine/Expression.js +256 -0
  26. package/out/foundation/engine/Expression.js.map +1 -0
  27. package/out/foundation/engine/Rule.d.ts +85 -0
  28. package/out/foundation/engine/Rule.d.ts.map +1 -0
  29. package/out/foundation/engine/Rule.js +69 -0
  30. package/out/foundation/engine/Rule.js.map +1 -0
  31. package/out/foundation/engine/Scope.d.ts +61 -0
  32. package/out/foundation/engine/Scope.d.ts.map +1 -0
  33. package/out/foundation/engine/Scope.js +156 -0
  34. package/out/foundation/engine/Scope.js.map +1 -0
  35. package/out/foundation/engine/TemplateEngine.d.ts +96 -0
  36. package/out/foundation/engine/TemplateEngine.d.ts.map +1 -0
  37. package/out/foundation/engine/TemplateEngine.js +235 -0
  38. package/out/foundation/engine/TemplateEngine.js.map +1 -0
  39. package/out/foundation/engine/TemplateInstance.d.ts +241 -0
  40. package/out/foundation/engine/TemplateInstance.d.ts.map +1 -0
  41. package/out/foundation/engine/TemplateInstance.js +637 -0
  42. package/out/foundation/engine/TemplateInstance.js.map +1 -0
  43. package/out/foundation/engine/TemplateInstance.old.d.ts +219 -0
  44. package/out/foundation/engine/TemplateInstance.old.d.ts.map +1 -0
  45. package/out/foundation/engine/TemplateInstance.old.js +487 -0
  46. package/out/foundation/engine/TemplateInstance.old.js.map +1 -0
  47. package/out/foundation/engine/exceptions/TemplateExceptions.d.ts +21 -0
  48. package/out/foundation/engine/exceptions/TemplateExceptions.d.ts.map +1 -0
  49. package/out/foundation/engine/exceptions/TemplateExceptions.js +26 -0
  50. package/out/foundation/engine/exceptions/TemplateExceptions.js.map +1 -0
  51. package/out/foundation/engine/index.d.ts +18 -0
  52. package/out/foundation/engine/index.d.ts.map +1 -0
  53. package/out/foundation/engine/index.js +19 -0
  54. package/out/foundation/engine/index.js.map +1 -0
  55. package/out/foundation/engine/rules/attribute/EventRule.d.ts +22 -0
  56. package/out/foundation/engine/rules/attribute/EventRule.d.ts.map +1 -0
  57. package/out/foundation/engine/rules/attribute/EventRule.js +129 -0
  58. package/out/foundation/engine/rules/attribute/EventRule.js.map +1 -0
  59. package/out/foundation/engine/rules/attribute/InjectionRule.d.ts +20 -0
  60. package/out/foundation/engine/rules/attribute/InjectionRule.d.ts.map +1 -0
  61. package/out/foundation/engine/rules/attribute/InjectionRule.js +108 -0
  62. package/out/foundation/engine/rules/attribute/InjectionRule.js.map +1 -0
  63. package/out/foundation/engine/rules/attribute/RefRule.d.ts +23 -0
  64. package/out/foundation/engine/rules/attribute/RefRule.d.ts.map +1 -0
  65. package/out/foundation/engine/rules/attribute/RefRule.js +104 -0
  66. package/out/foundation/engine/rules/attribute/RefRule.js.map +1 -0
  67. package/out/foundation/engine/rules/syntax/ExpressionRule.d.ts +19 -0
  68. package/out/foundation/engine/rules/syntax/ExpressionRule.d.ts.map +1 -0
  69. package/out/foundation/engine/rules/syntax/ExpressionRule.js +82 -0
  70. package/out/foundation/engine/rules/syntax/ExpressionRule.js.map +1 -0
  71. package/out/foundation/engine/rules/syntax/ForRule.d.ts +19 -0
  72. package/out/foundation/engine/rules/syntax/ForRule.d.ts.map +1 -0
  73. package/out/foundation/engine/rules/syntax/ForRule.js +226 -0
  74. package/out/foundation/engine/rules/syntax/ForRule.js.map +1 -0
  75. package/out/foundation/engine/rules/syntax/IfRule.d.ts +17 -0
  76. package/out/foundation/engine/rules/syntax/IfRule.d.ts.map +1 -0
  77. package/out/foundation/engine/rules/syntax/IfRule.js +220 -0
  78. package/out/foundation/engine/rules/syntax/IfRule.js.map +1 -0
  79. package/out/foundation/worker/Router.d.ts.map +1 -1
  80. package/out/foundation/worker/Router.js.map +1 -1
  81. package/out/index.d.ts +2 -0
  82. package/out/index.d.ts.map +1 -1
  83. package/out/index.js +2 -0
  84. package/out/index.js.map +1 -1
  85. package/package.json +1 -1
  86. package/src/foundation/Triplet.ts +6 -6
  87. package/src/foundation/api/Observer.ts +60 -0
  88. package/src/foundation/component_api/Component.ts +2 -1
  89. package/src/foundation/component_api/UniHtml.ts +12 -22
  90. package/src/foundation/engine/BalancedParser.ts +353 -0
  91. package/src/foundation/engine/EscapeHandler.ts +54 -0
  92. package/src/foundation/engine/Expression.ts +285 -0
  93. package/src/foundation/engine/Rule.ts +138 -0
  94. package/src/foundation/engine/Scope.ts +176 -0
  95. package/src/foundation/engine/TemplateEngine.ts +318 -0
  96. package/src/foundation/engine/TemplateInstance.md +110 -0
  97. package/src/foundation/engine/TemplateInstance.old.ts +673 -0
  98. package/src/foundation/engine/TemplateInstance.ts +843 -0
  99. package/src/foundation/engine/exceptions/TemplateExceptions.ts +27 -0
  100. package/src/foundation/engine/rules/attribute/EventRule.ts +171 -0
  101. package/src/foundation/engine/rules/attribute/InjectionRule.ts +140 -0
  102. package/src/foundation/engine/rules/attribute/RefRule.ts +126 -0
  103. package/src/foundation/engine/rules/syntax/ExpressionRule.ts +102 -0
  104. package/src/foundation/engine/rules/syntax/ForRule.ts +267 -0
  105. package/src/foundation/engine/rules/syntax/IfRule.ts +261 -0
  106. package/src/foundation/worker/Router.ts +1 -1
  107. package/src/index.ts +8 -0
@@ -0,0 +1,301 @@
1
+ /**
2
+ * BalancedParser - утилита для парсинга сбалансированных скобок (), {}.
3
+ * Корректно обрабатывает строки и комментарии.
4
+ */
5
+ export default class BalancedParser {
6
+ /**
7
+ * Найти все сбалансированные выражения с заданным opener.
8
+ * @param input - входная строка
9
+ * @param opener - открывающая последовательность, например '@(' или '@for('
10
+ * @returns массив объектов с content и позициями
11
+ */
12
+ static parseBalanced(input, opener, closerChar = ')') {
13
+ const results = [];
14
+ const openerChar = closerChar === ')' ? '(' : '{';
15
+ let i = 0;
16
+ while (i < input.length) {
17
+ const idx = input.indexOf(opener, i);
18
+ if (idx === -1)
19
+ break;
20
+ const contentStart = idx + opener.length;
21
+ let pos = contentStart;
22
+ let depth = 1;
23
+ while (pos < input.length && depth > 0) {
24
+ const ch = input[pos];
25
+ // Skip string literals
26
+ if (ch === '"' || ch === "'" || ch === '`') {
27
+ pos = this.skipString(input, pos, ch);
28
+ continue;
29
+ }
30
+ // Skip single-line comments
31
+ if (ch === '/' && input[pos + 1] === '/') {
32
+ pos = this.skipLineComment(input, pos);
33
+ continue;
34
+ }
35
+ // Skip multi-line comments
36
+ if (ch === '/' && input[pos + 1] === '*') {
37
+ pos = this.skipBlockComment(input, pos);
38
+ continue;
39
+ }
40
+ if (ch === openerChar)
41
+ depth++;
42
+ else if (ch === closerChar)
43
+ depth--;
44
+ pos++;
45
+ }
46
+ if (depth === 0) {
47
+ results.push({
48
+ content: input.slice(contentStart, pos - 1),
49
+ start: idx,
50
+ end: pos
51
+ });
52
+ i = pos;
53
+ }
54
+ else {
55
+ // Unbalanced, skip this opener and continue
56
+ i = idx + 1;
57
+ }
58
+ }
59
+ return results;
60
+ }
61
+ /**
62
+ * Парсить блочные Rule типа @for(...) { ... }
63
+ * @returns объект с condition (содержимое скобок) и block (содержимое фигурных скобок)
64
+ */
65
+ static parseBlockRule(input, opener // например '@for', '@if'
66
+ ) {
67
+ const results = [];
68
+ const openerLower = opener.toLowerCase();
69
+ let i = 0;
70
+ while (i < input.length) {
71
+ // Case-insensitive search
72
+ const lowerInput = input.toLowerCase();
73
+ let idx = lowerInput.indexOf(openerLower, i);
74
+ if (idx === -1)
75
+ break;
76
+ // Check for @@ escape
77
+ if (idx > 0 && input[idx - 1] === '@') {
78
+ i = idx + 1;
79
+ continue;
80
+ }
81
+ // Find opening parenthesis
82
+ let parenStart = idx + opener.length;
83
+ while (parenStart < input.length && /\s/.test(input[parenStart])) {
84
+ parenStart++;
85
+ }
86
+ if (input[parenStart] !== '(') {
87
+ i = idx + 1;
88
+ continue;
89
+ }
90
+ // Parse balanced parentheses for condition
91
+ let pos = parenStart + 1;
92
+ let depth = 1;
93
+ while (pos < input.length && depth > 0) {
94
+ const ch = input[pos];
95
+ if (ch === '"' || ch === "'" || ch === '`') {
96
+ pos = this.skipString(input, pos, ch);
97
+ continue;
98
+ }
99
+ if (ch === '/' && input[pos + 1] === '/') {
100
+ pos = this.skipLineComment(input, pos);
101
+ continue;
102
+ }
103
+ if (ch === '/' && input[pos + 1] === '*') {
104
+ pos = this.skipBlockComment(input, pos);
105
+ continue;
106
+ }
107
+ if (ch === '(')
108
+ depth++;
109
+ else if (ch === ')')
110
+ depth--;
111
+ pos++;
112
+ }
113
+ if (depth !== 0) {
114
+ i = idx + 1;
115
+ continue;
116
+ }
117
+ const condition = input.slice(parenStart + 1, pos - 1);
118
+ const conditionEnd = pos;
119
+ // Find opening brace for block
120
+ let braceStart = conditionEnd;
121
+ while (braceStart < input.length && /\s/.test(input[braceStart])) {
122
+ braceStart++;
123
+ }
124
+ if (input[braceStart] !== '{') {
125
+ i = idx + 1;
126
+ continue;
127
+ }
128
+ // Parse balanced braces for block
129
+ pos = braceStart + 1;
130
+ depth = 1;
131
+ while (pos < input.length && depth > 0) {
132
+ const ch = input[pos];
133
+ if (ch === '"' || ch === "'" || ch === '`') {
134
+ pos = this.skipString(input, pos, ch);
135
+ continue;
136
+ }
137
+ if (ch === '/' && input[pos + 1] === '/') {
138
+ pos = this.skipLineComment(input, pos);
139
+ continue;
140
+ }
141
+ if (ch === '/' && input[pos + 1] === '*') {
142
+ pos = this.skipBlockComment(input, pos);
143
+ continue;
144
+ }
145
+ if (ch === '{')
146
+ depth++;
147
+ else if (ch === '}')
148
+ depth--;
149
+ pos++;
150
+ }
151
+ if (depth !== 0) {
152
+ i = idx + 1;
153
+ continue;
154
+ }
155
+ const block = input.slice(braceStart + 1, pos - 1);
156
+ results.push({
157
+ condition,
158
+ block,
159
+ start: idx,
160
+ end: pos
161
+ });
162
+ i = pos;
163
+ }
164
+ return results;
165
+ }
166
+ /**
167
+ * Парсить @if/@elseif/@else цепочки
168
+ */
169
+ static parseIfChain(input) {
170
+ const results = [];
171
+ // Find @if first
172
+ const ifMatches = this.parseBlockRule(input, '@if');
173
+ for (const ifMatch of ifMatches) {
174
+ results.push({
175
+ type: 'if',
176
+ condition: ifMatch.condition,
177
+ block: ifMatch.block,
178
+ start: ifMatch.start,
179
+ end: ifMatch.end
180
+ });
181
+ // Look for @elseif/@else after this @if
182
+ let searchPos = ifMatch.end;
183
+ while (searchPos < input.length) {
184
+ // Skip whitespace
185
+ while (searchPos < input.length && /\s/.test(input[searchPos])) {
186
+ searchPos++;
187
+ }
188
+ const remaining = input.slice(searchPos).toLowerCase();
189
+ if (remaining.startsWith('@elseif')) {
190
+ const elseifMatches = this.parseBlockRule(input.slice(searchPos), '@elseif');
191
+ if (elseifMatches.length > 0) {
192
+ const m = elseifMatches[0];
193
+ results.push({
194
+ type: 'elseif',
195
+ condition: m.condition,
196
+ block: m.block,
197
+ start: searchPos + m.start,
198
+ end: searchPos + m.end
199
+ });
200
+ searchPos = searchPos + m.end;
201
+ continue;
202
+ }
203
+ }
204
+ else if (remaining.startsWith('@else')) {
205
+ // @else without condition
206
+ let pos = searchPos + 5; // length of '@else'
207
+ while (pos < input.length && /\s/.test(input[pos])) {
208
+ pos++;
209
+ }
210
+ if (input[pos] === '{') {
211
+ let bracePos = pos + 1;
212
+ let depth = 1;
213
+ while (bracePos < input.length && depth > 0) {
214
+ const ch = input[bracePos];
215
+ if (ch === '"' || ch === "'" || ch === '`') {
216
+ bracePos = this.skipString(input, bracePos, ch);
217
+ continue;
218
+ }
219
+ if (ch === '{')
220
+ depth++;
221
+ else if (ch === '}')
222
+ depth--;
223
+ bracePos++;
224
+ }
225
+ if (depth === 0) {
226
+ results.push({
227
+ type: 'else',
228
+ block: input.slice(pos + 1, bracePos - 1),
229
+ start: searchPos,
230
+ end: bracePos
231
+ });
232
+ searchPos = bracePos;
233
+ continue;
234
+ }
235
+ }
236
+ }
237
+ break; // No more @elseif/@else found
238
+ }
239
+ }
240
+ return results;
241
+ }
242
+ /**
243
+ * Skip over a string literal (handles escape sequences)
244
+ */
245
+ static skipString(input, pos, quote) {
246
+ pos++; // skip opening quote
247
+ while (pos < input.length) {
248
+ if (input[pos] === '\\') {
249
+ pos += 2; // skip escape sequence
250
+ continue;
251
+ }
252
+ if (input[pos] === quote) {
253
+ return pos + 1;
254
+ }
255
+ // Handle template literal ${...}
256
+ if (quote === '`' && input[pos] === '$' && input[pos + 1] === '{') {
257
+ pos += 2;
258
+ let depth = 1;
259
+ while (pos < input.length && depth > 0) {
260
+ if (input[pos] === '{')
261
+ depth++;
262
+ else if (input[pos] === '}')
263
+ depth--;
264
+ pos++;
265
+ }
266
+ continue;
267
+ }
268
+ pos++;
269
+ }
270
+ return pos;
271
+ }
272
+ /**
273
+ * Skip single-line comment
274
+ */
275
+ static skipLineComment(input, pos) {
276
+ while (pos < input.length && input[pos] !== '\n') {
277
+ pos++;
278
+ }
279
+ return pos + 1;
280
+ }
281
+ /**
282
+ * Skip block comment
283
+ */
284
+ static skipBlockComment(input, pos) {
285
+ pos += 2; // skip /*
286
+ while (pos < input.length - 1) {
287
+ if (input[pos] === '*' && input[pos + 1] === '/') {
288
+ return pos + 2;
289
+ }
290
+ pos++;
291
+ }
292
+ return pos;
293
+ }
294
+ /**
295
+ * Извлечь простые @(expression) без блоков
296
+ */
297
+ static parseExpressions(input) {
298
+ return this.parseBalanced(input, '@(', ')');
299
+ }
300
+ }
301
+ //# sourceMappingURL=BalancedParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BalancedParser.js","sourceRoot":"","sources":["../../../src/foundation/engine/BalancedParser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * EscapeHandler - обработка escape-последовательностей.
3
+ * @@ -> @
4
+ * @@@@ -> @@
5
+ */
6
+ export default class EscapeHandler {
7
+ /**
8
+ * Заменить @@ на специальный placeholder перед парсингом
9
+ */
10
+ static escapeDoubleAt(input: string): {
11
+ result: string;
12
+ placeholder: string;
13
+ };
14
+ /**
15
+ * Восстановить @ из placeholder после парсинга
16
+ */
17
+ static restoreEscapes(input: string, placeholder: string): string;
18
+ /**
19
+ * Полный цикл: escape -> process -> restore
20
+ */
21
+ static process(input: string, processor: (escaped: string) => string): string;
22
+ /**
23
+ * Проверить, является ли позиция escaped (предшествует @@)
24
+ */
25
+ static isEscaped(input: string, position: number): boolean;
26
+ }
27
+ //# sourceMappingURL=EscapeHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EscapeHandler.d.ts","sourceRoot":"","sources":["../../../src/foundation/engine/EscapeHandler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,OAAO,OAAO,aAAa;IAE9B;;OAEG;WACW,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE;IAOpF;;OAEG;WACW,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM;IAIxE;;OAEG;WACW,OAAO,CACjB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GACvC,MAAM;IAMT;;OAEG;WACW,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;CAcpE"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * EscapeHandler - обработка escape-последовательностей.
3
+ * @@ -> @
4
+ * @@@@ -> @@
5
+ */
6
+ export default class EscapeHandler {
7
+ /**
8
+ * Заменить @@ на специальный placeholder перед парсингом
9
+ */
10
+ static escapeDoubleAt(input) {
11
+ // Use a unique placeholder that won't appear in normal code
12
+ const placeholder = '\x00AT_ESCAPE\x00';
13
+ const result = input.replace(/@@/g, placeholder);
14
+ return { result, placeholder };
15
+ }
16
+ /**
17
+ * Восстановить @ из placeholder после парсинга
18
+ */
19
+ static restoreEscapes(input, placeholder) {
20
+ return input.replace(new RegExp(placeholder.replace(/\x00/g, '\\x00'), 'g'), '@');
21
+ }
22
+ /**
23
+ * Полный цикл: escape -> process -> restore
24
+ */
25
+ static process(input, processor) {
26
+ const { result: escaped, placeholder } = this.escapeDoubleAt(input);
27
+ const processed = processor(escaped);
28
+ return this.restoreEscapes(processed, placeholder);
29
+ }
30
+ /**
31
+ * Проверить, является ли позиция escaped (предшествует @@)
32
+ */
33
+ static isEscaped(input, position) {
34
+ if (position === 0)
35
+ return false;
36
+ // Count consecutive @ before this position
37
+ let count = 0;
38
+ let i = position - 1;
39
+ while (i >= 0 && input[i] === '@') {
40
+ count++;
41
+ i--;
42
+ }
43
+ // If odd number of @ before, this @ is escaped
44
+ return count % 2 === 1;
45
+ }
46
+ }
47
+ //# sourceMappingURL=EscapeHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EscapeHandler.js","sourceRoot":"","sources":["../../../src/foundation/engine/EscapeHandler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,OAAO,OAAO,aAAa;IAE9B;;OAEG;IACI,MAAM,CAAC,cAAc,CAAC,KAAa;QACtC,4DAA4D;QAC5D,MAAM,WAAW,GAAG,mBAAmB,CAAC;QACxC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QACjD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACnC,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,cAAc,CAAC,KAAa,EAAE,WAAmB;QAC3D,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IACtF,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,OAAO,CACjB,KAAa,EACb,SAAsC;QAEtC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QACpE,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACvD,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,SAAS,CAAC,KAAa,EAAE,QAAgB;QACnD,IAAI,QAAQ,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAEjC,2CAA2C;QAC3C,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YAChC,KAAK,EAAE,CAAC;YACR,CAAC,EAAE,CAAC;QACR,CAAC;QAED,+CAA+C;QAC/C,OAAO,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;CACJ"}
@@ -0,0 +1,83 @@
1
+ import Scope from './Scope.js';
2
+ import Observable from '../api/Observer.js';
3
+ /**
4
+ * Expression - класс для выполнения JS-кода в контексте Scope.
5
+ * Поддерживает:
6
+ * - Простые выражения: value, user.name
7
+ * - Вызовы функций: doSomething()
8
+ * - Сложный JS-код: encodeURIComponent(JSON.stringify(subject))
9
+ * - Код с return: const f = ""; return f;
10
+ * - Async/await: await fetchData()
11
+ *
12
+ * Для Observable автоматически разворачивает значения:
13
+ * user.name -> user.getObject().name (если user - Observable)
14
+ */
15
+ export default class Expression {
16
+ private readonly code;
17
+ private readonly isAsync;
18
+ private readonly hasReturn;
19
+ constructor(code: string);
20
+ /**
21
+ * Определить, содержит ли код await
22
+ */
23
+ private detectAsync;
24
+ /**
25
+ * Определить, содержит ли код return
26
+ */
27
+ private detectReturn;
28
+ /**
29
+ * Получить исходный код выражения
30
+ */
31
+ getCode(): string;
32
+ /**
33
+ * Найти все Observable, используемые в выражении.
34
+ * Например, для "user.name + user.age" вернёт [Observable(user)]
35
+ */
36
+ findObservables(scope: Scope): Observable<any>[];
37
+ /**
38
+ * Извлечь идентификаторы верхнего уровня из выражения.
39
+ * "user.name + count" -> ["user", "count"]
40
+ */
41
+ private extractIdentifiers;
42
+ /**
43
+ * Трансформировать код, разворачивая Observable.
44
+ * "user.name" -> "user.getObject().name" (если user - Observable)
45
+ */
46
+ transformCode(scope: Scope): string;
47
+ /**
48
+ * Выполнить выражение в контексте Scope.
49
+ * @param scope - Scope с переменными и функциями
50
+ * @param extraVars - дополнительные переменные (например, event для @on)
51
+ * @returns результат выполнения
52
+ */
53
+ execute(scope: Scope, extraVars?: Record<string, any>): any;
54
+ /**
55
+ * Выполнить выражение асинхронно
56
+ */
57
+ executeAsync(scope: Scope, extraVars?: Record<string, any>): Promise<any>;
58
+ /**
59
+ * Выполнить в контексте (синхронно)
60
+ */
61
+ private executeInContext;
62
+ /**
63
+ * Выполнить в контексте (асинхронно)
64
+ */
65
+ private executeInContextAsync;
66
+ /**
67
+ * Проверить, является ли выражение асинхронным
68
+ */
69
+ isAsyncExpression(): boolean;
70
+ /**
71
+ * Выполнить выражение (авто-выбор sync/async)
72
+ */
73
+ eval(scope: Scope, extraVars?: Record<string, any>): any | Promise<any>;
74
+ /**
75
+ * Статический метод для быстрого выполнения
76
+ */
77
+ static evaluate(code: string, scope: Scope, extraVars?: Record<string, any>): any;
78
+ /**
79
+ * Статический метод для асинхронного выполнения
80
+ */
81
+ static evaluateAsync(code: string, scope: Scope, extraVars?: Record<string, any>): Promise<any>;
82
+ }
83
+ //# sourceMappingURL=Expression.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Expression.d.ts","sourceRoot":"","sources":["../../../src/foundation/engine/Expression.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,UAA4B,MAAM,oBAAoB,CAAC;AAE9D;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,OAAO,OAAO,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAU;gBAExB,IAAI,EAAE,MAAM;IAMxB;;OAEG;IACH,OAAO,CAAC,WAAW;IAKnB;;OAEG;IACH,OAAO,CAAC,YAAY;IAKpB;;OAEG;IACI,OAAO,IAAI,MAAM;IAIxB;;;OAGG;IACI,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE;IAmBvD;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IA4B1B;;;OAGG;IACI,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM;IA6B1C;;;;;OAKG;IACI,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG;IAkBlE;;OAEG;IACU,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC;IAiBtF;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAiCxB;;OAEG;YACW,qBAAqB;IAgCnC;;OAEG;IACI,iBAAiB,IAAI,OAAO;IAInC;;OAEG;IACI,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAO9E;;OAEG;WACW,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG;IAKxF;;OAEG;WACiB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC;CAI/G"}