@reidelsaltres/pureper 0.1.156 → 0.1.160

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 (92) hide show
  1. package/out/foundation/api/Observer.d.ts +30 -0
  2. package/out/foundation/api/Observer.d.ts.map +1 -1
  3. package/out/foundation/api/Observer.js +48 -0
  4. package/out/foundation/api/Observer.js.map +1 -1
  5. package/out/foundation/component_api/Attribute.d.ts.map +1 -1
  6. package/out/foundation/component_api/Attribute.js +1 -0
  7. package/out/foundation/component_api/Attribute.js.map +1 -1
  8. package/out/foundation/engine/BalancedParser.d.ts +58 -0
  9. package/out/foundation/engine/BalancedParser.d.ts.map +1 -0
  10. package/out/foundation/engine/BalancedParser.js +301 -0
  11. package/out/foundation/engine/BalancedParser.js.map +1 -0
  12. package/out/foundation/engine/EscapeHandler.d.ts +27 -0
  13. package/out/foundation/engine/EscapeHandler.d.ts.map +1 -0
  14. package/out/foundation/engine/EscapeHandler.js +47 -0
  15. package/out/foundation/engine/EscapeHandler.js.map +1 -0
  16. package/out/foundation/engine/Expression.d.ts +83 -0
  17. package/out/foundation/engine/Expression.d.ts.map +1 -0
  18. package/out/foundation/engine/Expression.js +256 -0
  19. package/out/foundation/engine/Expression.js.map +1 -0
  20. package/out/foundation/engine/Rule.d.ts +83 -0
  21. package/out/foundation/engine/Rule.d.ts.map +1 -0
  22. package/out/foundation/engine/Rule.js +69 -0
  23. package/out/foundation/engine/Rule.js.map +1 -0
  24. package/out/foundation/engine/Scope.d.ts +57 -0
  25. package/out/foundation/engine/Scope.d.ts.map +1 -0
  26. package/out/foundation/engine/Scope.js +147 -0
  27. package/out/foundation/engine/Scope.js.map +1 -0
  28. package/out/foundation/engine/TemplateEngine.d.ts +79 -0
  29. package/out/foundation/engine/TemplateEngine.d.ts.map +1 -0
  30. package/out/foundation/engine/TemplateEngine.js +187 -0
  31. package/out/foundation/engine/TemplateEngine.js.map +1 -0
  32. package/out/foundation/engine/TemplateInstance.d.ts +121 -0
  33. package/out/foundation/engine/TemplateInstance.d.ts.map +1 -0
  34. package/out/foundation/engine/TemplateInstance.js +255 -0
  35. package/out/foundation/engine/TemplateInstance.js.map +1 -0
  36. package/out/foundation/engine/exceptions/TemplateExceptions.d.ts +21 -0
  37. package/out/foundation/engine/exceptions/TemplateExceptions.d.ts.map +1 -0
  38. package/out/foundation/engine/exceptions/TemplateExceptions.js +26 -0
  39. package/out/foundation/engine/exceptions/TemplateExceptions.js.map +1 -0
  40. package/out/foundation/engine/index.d.ts +18 -0
  41. package/out/foundation/engine/index.d.ts.map +1 -0
  42. package/out/foundation/engine/index.js +19 -0
  43. package/out/foundation/engine/index.js.map +1 -0
  44. package/out/foundation/engine/rules/attribute/EventRule.d.ts +22 -0
  45. package/out/foundation/engine/rules/attribute/EventRule.d.ts.map +1 -0
  46. package/out/foundation/engine/rules/attribute/EventRule.js +129 -0
  47. package/out/foundation/engine/rules/attribute/EventRule.js.map +1 -0
  48. package/out/foundation/engine/rules/attribute/InjectionRule.d.ts +20 -0
  49. package/out/foundation/engine/rules/attribute/InjectionRule.d.ts.map +1 -0
  50. package/out/foundation/engine/rules/attribute/InjectionRule.js +108 -0
  51. package/out/foundation/engine/rules/attribute/InjectionRule.js.map +1 -0
  52. package/out/foundation/engine/rules/attribute/RefRule.d.ts +23 -0
  53. package/out/foundation/engine/rules/attribute/RefRule.d.ts.map +1 -0
  54. package/out/foundation/engine/rules/attribute/RefRule.js +98 -0
  55. package/out/foundation/engine/rules/attribute/RefRule.js.map +1 -0
  56. package/out/foundation/engine/rules/syntax/ExpressionRule.d.ts +19 -0
  57. package/out/foundation/engine/rules/syntax/ExpressionRule.d.ts.map +1 -0
  58. package/out/foundation/engine/rules/syntax/ExpressionRule.js +82 -0
  59. package/out/foundation/engine/rules/syntax/ExpressionRule.js.map +1 -0
  60. package/out/foundation/engine/rules/syntax/ForRule.d.ts +19 -0
  61. package/out/foundation/engine/rules/syntax/ForRule.d.ts.map +1 -0
  62. package/out/foundation/engine/rules/syntax/ForRule.js +226 -0
  63. package/out/foundation/engine/rules/syntax/ForRule.js.map +1 -0
  64. package/out/foundation/engine/rules/syntax/IfRule.d.ts +17 -0
  65. package/out/foundation/engine/rules/syntax/IfRule.d.ts.map +1 -0
  66. package/out/foundation/engine/rules/syntax/IfRule.js +220 -0
  67. package/out/foundation/engine/rules/syntax/IfRule.js.map +1 -0
  68. package/out/foundation/worker/Router.d.ts.map +1 -1
  69. package/out/foundation/worker/Router.js.map +1 -1
  70. package/out/index.d.ts +3 -0
  71. package/out/index.d.ts.map +1 -1
  72. package/out/index.js +3 -0
  73. package/out/index.js.map +1 -1
  74. package/package.json +1 -1
  75. package/src/foundation/api/Observer.ts +60 -0
  76. package/src/foundation/component_api/Attribute.ts +1 -0
  77. package/src/foundation/engine/BalancedParser.ts +353 -0
  78. package/src/foundation/engine/EscapeHandler.ts +54 -0
  79. package/src/foundation/engine/Expression.ts +285 -0
  80. package/src/foundation/engine/Rule.ts +136 -0
  81. package/src/foundation/engine/Scope.ts +166 -0
  82. package/src/foundation/engine/TemplateEngine.ts +243 -0
  83. package/src/foundation/engine/TemplateInstance.ts +355 -0
  84. package/src/foundation/engine/exceptions/TemplateExceptions.ts +27 -0
  85. package/src/foundation/engine/rules/attribute/EventRule.ts +171 -0
  86. package/src/foundation/engine/rules/attribute/InjectionRule.ts +140 -0
  87. package/src/foundation/engine/rules/attribute/RefRule.ts +119 -0
  88. package/src/foundation/engine/rules/syntax/ExpressionRule.ts +102 -0
  89. package/src/foundation/engine/rules/syntax/ForRule.ts +267 -0
  90. package/src/foundation/engine/rules/syntax/IfRule.ts +261 -0
  91. package/src/foundation/worker/Router.ts +1 -1
  92. package/src/index.ts +9 -0
@@ -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"}
@@ -0,0 +1,256 @@
1
+ import { isObservable } from '../api/Observer.js';
2
+ /**
3
+ * Expression - класс для выполнения JS-кода в контексте Scope.
4
+ * Поддерживает:
5
+ * - Простые выражения: value, user.name
6
+ * - Вызовы функций: doSomething()
7
+ * - Сложный JS-код: encodeURIComponent(JSON.stringify(subject))
8
+ * - Код с return: const f = ""; return f;
9
+ * - Async/await: await fetchData()
10
+ *
11
+ * Для Observable автоматически разворачивает значения:
12
+ * user.name -> user.getObject().name (если user - Observable)
13
+ */
14
+ export default class Expression {
15
+ code;
16
+ isAsync;
17
+ hasReturn;
18
+ constructor(code) {
19
+ this.code = code.trim();
20
+ this.isAsync = this.detectAsync(this.code);
21
+ this.hasReturn = this.detectReturn(this.code);
22
+ }
23
+ /**
24
+ * Определить, содержит ли код await
25
+ */
26
+ detectAsync(code) {
27
+ // Simple check for await keyword (not in string)
28
+ return /\bawait\s+/.test(code);
29
+ }
30
+ /**
31
+ * Определить, содержит ли код return
32
+ */
33
+ detectReturn(code) {
34
+ // Check for return keyword followed by space, semicolon, or end
35
+ return /\breturn\s+/.test(code) || /\breturn;/.test(code) || /\breturn$/.test(code);
36
+ }
37
+ /**
38
+ * Получить исходный код выражения
39
+ */
40
+ getCode() {
41
+ return this.code;
42
+ }
43
+ /**
44
+ * Найти все Observable, используемые в выражении.
45
+ * Например, для "user.name + user.age" вернёт [Observable(user)]
46
+ */
47
+ findObservables(scope) {
48
+ const context = scope.getVariables();
49
+ const observables = [];
50
+ const seen = new Set();
51
+ // Извлекаем идентификаторы из выражения
52
+ const identifiers = this.extractIdentifiers(this.code);
53
+ for (const id of identifiers) {
54
+ const value = context[id];
55
+ if (isObservable(value) && !seen.has(value)) {
56
+ seen.add(value);
57
+ observables.push(value);
58
+ }
59
+ }
60
+ return observables;
61
+ }
62
+ /**
63
+ * Извлечь идентификаторы верхнего уровня из выражения.
64
+ * "user.name + count" -> ["user", "count"]
65
+ */
66
+ extractIdentifiers(code) {
67
+ const identifiers = [];
68
+ // Regex для идентификаторов (не после точки)
69
+ const regex = /(?<![.\w])([a-zA-Z_$][a-zA-Z0-9_$]*)/g;
70
+ // Список встроенных глобальных объектов, которые нужно игнорировать
71
+ const builtins = new Set([
72
+ 'true', 'false', 'null', 'undefined', 'NaN', 'Infinity',
73
+ 'Math', 'Date', 'JSON', 'Array', 'Object', 'String', 'Number', 'Boolean',
74
+ 'parseInt', 'parseFloat', 'isNaN', 'isFinite',
75
+ 'encodeURIComponent', 'decodeURIComponent', 'encodeURI', 'decodeURI',
76
+ 'console', 'window', 'document', 'this',
77
+ 'if', 'else', 'for', 'while', 'do', 'switch', 'case', 'break', 'continue',
78
+ 'return', 'function', 'const', 'let', 'var', 'new', 'typeof', 'instanceof',
79
+ 'in', 'of', 'async', 'await', 'try', 'catch', 'finally', 'throw'
80
+ ]);
81
+ let match;
82
+ while ((match = regex.exec(code)) !== null) {
83
+ const id = match[1];
84
+ if (!builtins.has(id) && !identifiers.includes(id)) {
85
+ identifiers.push(id);
86
+ }
87
+ }
88
+ return identifiers;
89
+ }
90
+ /**
91
+ * Трансформировать код, разворачивая Observable.
92
+ * "user.name" -> "user.getObject().name" (если user - Observable)
93
+ */
94
+ transformCode(scope) {
95
+ const context = scope.getVariables();
96
+ let transformedCode = this.code;
97
+ // Находим Observable переменные
98
+ const observableVars = new Set();
99
+ for (const [key, value] of Object.entries(context)) {
100
+ if (isObservable(value)) {
101
+ observableVars.add(key);
102
+ }
103
+ }
104
+ if (observableVars.size === 0) {
105
+ return transformedCode;
106
+ }
107
+ // Трансформируем: user.name -> user.getObject().name
108
+ // и user (само по себе) -> user.getObject()
109
+ for (const varName of observableVars) {
110
+ // user.property -> user.getObject().property
111
+ const propRegex = new RegExp(`\\b${varName}\\.(?!getObject|setObject|subscribe|unsubscribe|getObserver|getMutationObserver|subscribeMutation|unsubscribeMutation)`, 'g');
112
+ transformedCode = transformedCode.replace(propRegex, `${varName}.getObject().`);
113
+ // Если просто user без вызова метода, не трансформируем (может быть намеренно)
114
+ }
115
+ return transformedCode;
116
+ }
117
+ /**
118
+ * Выполнить выражение в контексте Scope.
119
+ * @param scope - Scope с переменными и функциями
120
+ * @param extraVars - дополнительные переменные (например, event для @on)
121
+ * @returns результат выполнения
122
+ */
123
+ execute(scope, extraVars) {
124
+ const context = scope.getVariables();
125
+ if (extraVars) {
126
+ Object.assign(context, extraVars);
127
+ }
128
+ try {
129
+ // Трансформируем код для автоматического разворачивания Observable
130
+ const transformedCode = this.transformCode(scope);
131
+ return this.executeInContext(context, transformedCode);
132
+ }
133
+ catch (error) {
134
+ console.error(`[Expression] Error executing: ${this.code}`);
135
+ console.error(error);
136
+ return undefined;
137
+ }
138
+ }
139
+ /**
140
+ * Выполнить выражение асинхронно
141
+ */
142
+ async executeAsync(scope, extraVars) {
143
+ const context = scope.getVariables();
144
+ if (extraVars) {
145
+ Object.assign(context, extraVars);
146
+ }
147
+ try {
148
+ const transformedCode = this.transformCode(scope);
149
+ return await this.executeInContextAsync(context, transformedCode);
150
+ }
151
+ catch (error) {
152
+ console.error(`[Expression] Error executing async: ${this.code}`);
153
+ console.error(error);
154
+ return undefined;
155
+ }
156
+ }
157
+ /**
158
+ * Выполнить в контексте (синхронно)
159
+ */
160
+ executeInContext(context, codeOverride) {
161
+ const keys = Object.keys(context);
162
+ const values = Object.values(context);
163
+ const codeToExecute = codeOverride ?? this.code;
164
+ let functionBody;
165
+ if (this.hasReturn) {
166
+ // Code contains return, wrap in function directly
167
+ functionBody = codeToExecute;
168
+ }
169
+ else {
170
+ // No return, add implicit return
171
+ functionBody = `return (${codeToExecute})`;
172
+ }
173
+ try {
174
+ // Create function with context variables as parameters
175
+ const fn = new Function(...keys, functionBody);
176
+ return fn.apply(null, values);
177
+ }
178
+ catch (syntaxError) {
179
+ // If implicit return fails, try without it (for statements)
180
+ if (!this.hasReturn) {
181
+ try {
182
+ const fn = new Function(...keys, codeToExecute);
183
+ return fn.apply(null, values);
184
+ }
185
+ catch {
186
+ throw syntaxError;
187
+ }
188
+ }
189
+ throw syntaxError;
190
+ }
191
+ }
192
+ /**
193
+ * Выполнить в контексте (асинхронно)
194
+ */
195
+ async executeInContextAsync(context, codeOverride) {
196
+ const keys = Object.keys(context);
197
+ const values = Object.values(context);
198
+ const codeToExecute = codeOverride ?? this.code;
199
+ let functionBody;
200
+ if (this.hasReturn) {
201
+ functionBody = codeToExecute;
202
+ }
203
+ else {
204
+ functionBody = `return (${codeToExecute})`;
205
+ }
206
+ try {
207
+ // Create async function
208
+ const AsyncFunction = Object.getPrototypeOf(async function () { }).constructor;
209
+ const fn = new AsyncFunction(...keys, functionBody);
210
+ return await fn.apply(null, values);
211
+ }
212
+ catch (syntaxError) {
213
+ if (!this.hasReturn) {
214
+ try {
215
+ const AsyncFunction = Object.getPrototypeOf(async function () { }).constructor;
216
+ const fn = new AsyncFunction(...keys, codeToExecute);
217
+ return await fn.apply(null, values);
218
+ }
219
+ catch {
220
+ throw syntaxError;
221
+ }
222
+ }
223
+ throw syntaxError;
224
+ }
225
+ }
226
+ /**
227
+ * Проверить, является ли выражение асинхронным
228
+ */
229
+ isAsyncExpression() {
230
+ return this.isAsync;
231
+ }
232
+ /**
233
+ * Выполнить выражение (авто-выбор sync/async)
234
+ */
235
+ eval(scope, extraVars) {
236
+ if (this.isAsync) {
237
+ return this.executeAsync(scope, extraVars);
238
+ }
239
+ return this.execute(scope, extraVars);
240
+ }
241
+ /**
242
+ * Статический метод для быстрого выполнения
243
+ */
244
+ static evaluate(code, scope, extraVars) {
245
+ const expr = new Expression(code);
246
+ return expr.eval(scope, extraVars);
247
+ }
248
+ /**
249
+ * Статический метод для асинхронного выполнения
250
+ */
251
+ static async evaluateAsync(code, scope, extraVars) {
252
+ const expr = new Expression(code);
253
+ return await expr.executeAsync(scope, extraVars);
254
+ }
255
+ }
256
+ //# sourceMappingURL=Expression.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Expression.js","sourceRoot":"","sources":["../../../src/foundation/engine/Expression.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ import Scope from './Scope.js';
2
+ /**
3
+ * RuleMatch - результат поиска Rule в шаблоне
4
+ */
5
+ export interface RuleMatch {
6
+ /** Полное совпадение включая синтаксис Rule */
7
+ fullMatch: string;
8
+ /** Начальная позиция в исходной строке */
9
+ start: number;
10
+ /** Конечная позиция в исходной строке */
11
+ end: number;
12
+ /** Дополнительные данные специфичные для Rule */
13
+ data?: Record<string, any>;
14
+ }
15
+ /**
16
+ * RuleResult - результат выполнения Rule
17
+ */
18
+ export interface RuleResult {
19
+ /** HTML-результат для замены */
20
+ output: string;
21
+ /** Использованные Observable для отслеживания */
22
+ observables?: any[];
23
+ /** Дочерние Rule (для вложенных структур) */
24
+ children?: Rule[];
25
+ }
26
+ /**
27
+ * RuleType - тип Rule
28
+ */
29
+ export type RuleType = 'syntax' | 'attribute';
30
+ /**
31
+ * Rule - базовый абстрактный класс для всех правил шаблонизатора.
32
+ */
33
+ export default abstract class Rule {
34
+ /** Уникальное имя правила */
35
+ abstract readonly name: string;
36
+ /** Тип правила: syntax или attribute */
37
+ abstract readonly type: RuleType;
38
+ /** Приоритет выполнения (меньше = раньше) */
39
+ readonly priority: number;
40
+ /**
41
+ * Найти все вхождения этого Rule в шаблоне.
42
+ * @param template - исходный шаблон
43
+ * @returns массив найденных совпадений
44
+ */
45
+ abstract find(template: string): RuleMatch[];
46
+ /**
47
+ * Выполнить Rule и вернуть результат.
48
+ * @param match - найденное совпадение
49
+ * @param scope - текущий Scope
50
+ * @param engine - ссылка на TemplateEngine (для рекурсивной обработки)
51
+ */
52
+ abstract execute(match: RuleMatch, scope: Scope, engine?: any): RuleResult | Promise<RuleResult>;
53
+ /**
54
+ * Проверить, поддерживает ли Rule Observable значения
55
+ */
56
+ supportsObservable(): boolean;
57
+ }
58
+ /**
59
+ * SyntaxRule - базовый класс для синтаксических правил.
60
+ * Синтаксические правила могут быть в любом месте шаблона (кроме атрибутов).
61
+ */
62
+ export declare abstract class SyntaxRule extends Rule {
63
+ readonly type: RuleType;
64
+ }
65
+ /**
66
+ * AttributeRule - базовый класс для атрибутивных правил.
67
+ * Атрибутивные правила работают только внутри HTML-тегов.
68
+ */
69
+ export declare abstract class AttributeRule extends Rule {
70
+ readonly type: RuleType;
71
+ /**
72
+ * Получить элемент, к которому применяется атрибут.
73
+ * @param template - шаблон
74
+ * @param attributePosition - позиция атрибута
75
+ * @returns информация об элементе
76
+ */
77
+ protected findParentElement(template: string, attributePosition: number): {
78
+ tagName: string;
79
+ tagStart: number;
80
+ tagEnd: number;
81
+ } | null;
82
+ }
83
+ //# sourceMappingURL=Rule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Rule.d.ts","sourceRoot":"","sources":["../../../src/foundation/engine/Rule.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,YAAY,CAAC;AAG/B;;GAEG;AACH,MAAM,WAAW,SAAS;IACtB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,iDAAiD;IACjD,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACvB,gCAAgC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,WAAW,CAAC,EAAE,GAAG,EAAE,CAAC;IACpB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;AAE9C;;GAEG;AACH,MAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,IAAI;IAC9B,6BAA6B;IAC7B,kBAAyB,IAAI,EAAE,MAAM,CAAC;IAEtC,wCAAwC;IACxC,kBAAyB,IAAI,EAAE,QAAQ,CAAC;IAExC,6CAA6C;IAC7C,SAAgB,QAAQ,EAAE,MAAM,CAAO;IAEvC;;;;OAIG;aACa,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE;IAEnD;;;;;OAKG;aACa,OAAO,CACnB,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,KAAK,EACZ,MAAM,CAAC,EAAE,GAAG,GACb,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAEnC;;OAEG;IACI,kBAAkB,IAAI,OAAO;CAGvC;AAED;;;GAGG;AACH,8BAAsB,UAAW,SAAQ,IAAI;IACzC,SAAgB,IAAI,EAAE,QAAQ,CAAY;CAC7C;AAED;;;GAGG;AACH,8BAAsB,aAAc,SAAQ,IAAI;IAC5C,SAAgB,IAAI,EAAE,QAAQ,CAAe;IAE7C;;;;;OAKG;IACH,SAAS,CAAC,iBAAiB,CACvB,QAAQ,EAAE,MAAM,EAChB,iBAAiB,EAAE,MAAM,GAC1B;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;CAqClE"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Rule - базовый абстрактный класс для всех правил шаблонизатора.
3
+ */
4
+ export default class Rule {
5
+ /** Приоритет выполнения (меньше = раньше) */
6
+ priority = 100;
7
+ /**
8
+ * Проверить, поддерживает ли Rule Observable значения
9
+ */
10
+ supportsObservable() {
11
+ return true;
12
+ }
13
+ }
14
+ /**
15
+ * SyntaxRule - базовый класс для синтаксических правил.
16
+ * Синтаксические правила могут быть в любом месте шаблона (кроме атрибутов).
17
+ */
18
+ export class SyntaxRule extends Rule {
19
+ type = 'syntax';
20
+ }
21
+ /**
22
+ * AttributeRule - базовый класс для атрибутивных правил.
23
+ * Атрибутивные правила работают только внутри HTML-тегов.
24
+ */
25
+ export class AttributeRule extends Rule {
26
+ type = 'attribute';
27
+ /**
28
+ * Получить элемент, к которому применяется атрибут.
29
+ * @param template - шаблон
30
+ * @param attributePosition - позиция атрибута
31
+ * @returns информация об элементе
32
+ */
33
+ findParentElement(template, attributePosition) {
34
+ // Find opening < before attribute
35
+ let tagStart = attributePosition;
36
+ while (tagStart > 0 && template[tagStart] !== '<') {
37
+ tagStart--;
38
+ }
39
+ if (template[tagStart] !== '<') {
40
+ return null;
41
+ }
42
+ // Extract tag name
43
+ let nameEnd = tagStart + 1;
44
+ while (nameEnd < template.length && /[a-zA-Z0-9_-]/.test(template[nameEnd])) {
45
+ nameEnd++;
46
+ }
47
+ const tagName = template.slice(tagStart + 1, nameEnd);
48
+ // Find closing >
49
+ let tagEnd = attributePosition;
50
+ let inString = false;
51
+ let stringChar = '';
52
+ while (tagEnd < template.length) {
53
+ const ch = template[tagEnd];
54
+ if (!inString && (ch === '"' || ch === "'")) {
55
+ inString = true;
56
+ stringChar = ch;
57
+ }
58
+ else if (inString && ch === stringChar) {
59
+ inString = false;
60
+ }
61
+ else if (!inString && ch === '>') {
62
+ break;
63
+ }
64
+ tagEnd++;
65
+ }
66
+ return { tagName, tagStart, tagEnd: tagEnd + 1 };
67
+ }
68
+ }
69
+ //# sourceMappingURL=Rule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Rule.js","sourceRoot":"","sources":["../../../src/foundation/engine/Rule.ts"],"names":[],"mappings":"AAkCA;;GAEG;AACH,MAAM,CAAC,OAAO,OAAgB,IAAI;IAO9B,6CAA6C;IAC7B,QAAQ,GAAW,GAAG,CAAC;IAqBvC;;OAEG;IACI,kBAAkB;QACrB,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AAED;;;GAGG;AACH,MAAM,OAAgB,UAAW,SAAQ,IAAI;IACzB,IAAI,GAAa,QAAQ,CAAC;CAC7C;AAED;;;GAGG;AACH,MAAM,OAAgB,aAAc,SAAQ,IAAI;IAC5B,IAAI,GAAa,WAAW,CAAC;IAE7C;;;;;OAKG;IACO,iBAAiB,CACvB,QAAgB,EAChB,iBAAyB;QAEzB,kCAAkC;QAClC,IAAI,QAAQ,GAAG,iBAAiB,CAAC;QACjC,OAAO,QAAQ,GAAG,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,GAAG,EAAE,CAAC;YAChD,QAAQ,EAAE,CAAC;QACf,CAAC;QAED,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,GAAG,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,mBAAmB;QACnB,IAAI,OAAO,GAAG,QAAQ,GAAG,CAAC,CAAC;QAC3B,OAAO,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YAC1E,OAAO,EAAE,CAAC;QACd,CAAC;QACD,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;QAEtD,iBAAiB;QACjB,IAAI,MAAM,GAAG,iBAAiB,CAAC;QAC/B,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,UAAU,GAAG,EAAE,CAAC;QACpB,OAAO,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;YAC9B,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC5B,IAAI,CAAC,QAAQ,IAAI,CAAC,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC;gBAC1C,QAAQ,GAAG,IAAI,CAAC;gBAChB,UAAU,GAAG,EAAE,CAAC;YACpB,CAAC;iBAAM,IAAI,QAAQ,IAAI,EAAE,KAAK,UAAU,EAAE,CAAC;gBACvC,QAAQ,GAAG,KAAK,CAAC;YACrB,CAAC;iBAAM,IAAI,CAAC,QAAQ,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;gBACjC,MAAM;YACV,CAAC;YACD,MAAM,EAAE,CAAC;QACb,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;IACrD,CAAC;CACJ"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Scope - класс для работы с контекстом переменных и функций.
3
+ * Поддерживает объединение нескольких Scope, извлечение полей из объектов и классов.
4
+ */
5
+ export default class Scope {
6
+ private variables;
7
+ private readonly debugWarnings;
8
+ constructor(options?: {
9
+ debugWarnings?: boolean;
10
+ });
11
+ /**
12
+ * Получить все переменные Scope как Record
13
+ */
14
+ getVariables(): Record<string, any>;
15
+ /**
16
+ * Установить переменную в Scope
17
+ */
18
+ set(key: string, value: any): void;
19
+ /**
20
+ * Получить переменную из Scope
21
+ */
22
+ get(key: string): any;
23
+ /**
24
+ * Проверить наличие переменной
25
+ */
26
+ has(key: string): boolean;
27
+ /**
28
+ * Удалить переменную из Scope
29
+ */
30
+ delete(key: string): boolean;
31
+ /**
32
+ * Объединить другой Scope или объект в текущий Scope.
33
+ * При конфликте имён выводится предупреждение, последнее значение имеет приоритет.
34
+ */
35
+ merge(source: Scope | Record<string, any> | object): Scope;
36
+ /**
37
+ * Создать дочерний (локальный) Scope на основе текущего.
38
+ * Изменения в дочернем Scope не влияют на родительский.
39
+ */
40
+ createChild(localVariables?: Record<string, any>): Scope;
41
+ /**
42
+ * Извлечь поля и методы из объекта или экземпляра класса.
43
+ * Пропускает нативные DOM/браузерные прототипы.
44
+ */
45
+ extractFromObject(obj: object): Record<string, any>;
46
+ /**
47
+ * Статический метод для создания Scope из объекта
48
+ */
49
+ static from(source: object | Record<string, any>, options?: {
50
+ debugWarnings?: boolean;
51
+ }): Scope;
52
+ /**
53
+ * Статический метод для объединения нескольких Scope/объектов
54
+ */
55
+ static combine(...sources: (Scope | Record<string, any> | object)[]): Scope;
56
+ }
57
+ //# sourceMappingURL=Scope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Scope.d.ts","sourceRoot":"","sources":["../../../src/foundation/engine/Scope.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,KAAK;IACtB,OAAO,CAAC,SAAS,CAA2B;IAC5C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAU;gBAE5B,OAAO,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,OAAO,CAAA;KAAE;IAIjD;;OAEG;IACI,YAAY,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAI1C;;OAEG;IACI,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI;IAOzC;;OAEG;IACI,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG;IAI5B;;OAEG;IACI,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIhC;;OAEG;IACI,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAQnC;;;OAGG;IACI,KAAK,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,GAAG,KAAK;IAejE;;;OAGG;IACI,WAAW,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,KAAK;IAa/D;;;OAGG;IACI,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAoD1D;;OAEG;WACW,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,KAAK;IAMtG;;OAEG;WACW,OAAO,CAAC,GAAG,OAAO,EAAE,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,EAAE,GAAG,KAAK;CAOrF"}