@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,487 @@
1
+ import { MutationObserver } from '../api/Observer.js';
2
+ import Expression from './Expression.js';
3
+ /**
4
+ * PageTemplate - динамический шаблон страницы.
5
+ * Хранит обработанные Rule и поддерживает реактивное обновление.
6
+ *
7
+ * При изменении Observable обновляются только те фрагменты,
8
+ * которые зависят от изменённого Observable.
9
+ */
10
+ export default class TemplateInstance {
11
+ template;
12
+ scope;
13
+ sections = [];
14
+ /** Фрагменты шаблона (каждый обновляется независимо) */
15
+ fragments = new Map();
16
+ /** Счётчик для генерации ID фрагментов */
17
+ fragmentIdCounter = 0;
18
+ /** Observers for template changes */
19
+ changeObserver = new MutationObserver();
20
+ /** Observers for fragment changes */
21
+ fragmentChangeObserver = new MutationObserver();
22
+ /** Группировка секций по Observable */
23
+ observableTrackings = new Map();
24
+ /** Функции отписки от событий */
25
+ eventUnbinders = [];
26
+ /** Кэшированный главный фрагмент */
27
+ cachedFragment = null;
28
+ constructor(template, scope) {
29
+ this.template = template;
30
+ this.scope = scope;
31
+ }
32
+ /**
33
+ * Получить текущий шаблон
34
+ */
35
+ getTemplate() {
36
+ return this.template;
37
+ }
38
+ /**
39
+ * Установить новый шаблон (вызывает событие изменения)
40
+ */
41
+ setTemplate(newTemplate) {
42
+ const oldTemplate = this.template;
43
+ this.template = newTemplate;
44
+ this.changeObserver.notify({ oldValue: null, newValue: null, oldTemplate, newTemplate }, { oldValue: null, newValue: null, oldTemplate, newTemplate });
45
+ }
46
+ /**
47
+ * Получить Scope
48
+ */
49
+ getScope() {
50
+ return this.scope;
51
+ }
52
+ /**
53
+ * Подписаться на изменения шаблона
54
+ */
55
+ onTemplateChange(listener) {
56
+ const wrapper = (oldEvent, newEvent) => {
57
+ listener(newEvent.oldValue, newEvent.newValue, newEvent.oldTemplate, newEvent.newTemplate);
58
+ };
59
+ this.changeObserver.subscribe(wrapper);
60
+ return () => this.changeObserver.unsubscribe(wrapper);
61
+ }
62
+ /**
63
+ * Подписаться на изменения фрагментов
64
+ */
65
+ onFragmentChange(listener) {
66
+ const wrapper = (_oldEvent, newEvent) => {
67
+ listener(newEvent);
68
+ };
69
+ this.fragmentChangeObserver.subscribe(wrapper);
70
+ return () => this.fragmentChangeObserver.unsubscribe(wrapper);
71
+ }
72
+ /**
73
+ * Добавить секцию шаблона
74
+ */
75
+ addSection(section) {
76
+ this.sections.push(section);
77
+ }
78
+ /**
79
+ * Получить все секции
80
+ */
81
+ getSections() {
82
+ return this.sections;
83
+ }
84
+ /**
85
+ * Создать новый фрагмент и вернуть его ID
86
+ */
87
+ createFragmentBinding(html, sections = []) {
88
+ const id = `fragment-${this.fragmentIdCounter++}`;
89
+ const binding = {
90
+ id,
91
+ html,
92
+ fragment: null,
93
+ sections,
94
+ observables: new Set(),
95
+ nodes: []
96
+ };
97
+ // Привязываем секции к фрагменту
98
+ for (const section of sections) {
99
+ section.fragmentId = id;
100
+ }
101
+ this.fragments.set(id, binding);
102
+ return id;
103
+ }
104
+ /**
105
+ * Получить привязку фрагмента по ID
106
+ */
107
+ getFragmentBinding(id) {
108
+ return this.fragments.get(id);
109
+ }
110
+ /**
111
+ * Получить все фрагменты
112
+ */
113
+ getAllFragments() {
114
+ return this.fragments;
115
+ }
116
+ /**
117
+ * Подписаться на Observable и автоматически пересоздавать секцию.
118
+ * Обновляются только фрагменты, зависящие от изменённого Observable.
119
+ */
120
+ trackObservable(observable, section, rebuild) {
121
+ // Проверяем, есть ли уже отслеживание для этого Observable
122
+ let tracking = this.observableTrackings.get(observable);
123
+ if (!tracking) {
124
+ // Создаём новое отслеживание
125
+ const listener = (newValue) => {
126
+ this.rebuildFragmentsForObservable(observable, newValue);
127
+ };
128
+ observable.subscribe(listener);
129
+ tracking = {
130
+ observable,
131
+ sections: [],
132
+ fragmentIds: new Set(),
133
+ unsubscribe: () => observable.unsubscribe(listener)
134
+ };
135
+ this.observableTrackings.set(observable, tracking);
136
+ }
137
+ // Добавляем секцию в отслеживание
138
+ tracking.sections.push({ section, rebuild });
139
+ // Связываем Observable с фрагментом секции
140
+ if (section.fragmentId) {
141
+ tracking.fragmentIds.add(section.fragmentId);
142
+ const binding = this.fragments.get(section.fragmentId);
143
+ if (binding) {
144
+ binding.observables.add(observable);
145
+ }
146
+ }
147
+ // Возвращаем функцию отписки для этой конкретной секции
148
+ return () => {
149
+ if (tracking) {
150
+ tracking.sections = tracking.sections.filter(s => s.section !== section);
151
+ // Если больше нет секций, отписываемся от Observable
152
+ if (tracking.sections.length === 0) {
153
+ tracking.unsubscribe();
154
+ this.observableTrackings.delete(observable);
155
+ }
156
+ }
157
+ };
158
+ }
159
+ /**
160
+ * Перестроить только те фрагменты, которые зависят от Observable
161
+ */
162
+ rebuildFragmentsForObservable(observable, newValue) {
163
+ const tracking = this.observableTrackings.get(observable);
164
+ if (!tracking || tracking.sections.length === 0)
165
+ return;
166
+ const oldTemplate = this.template;
167
+ let currentTemplate = this.template;
168
+ // Собираем все замены: старый output -> новый output
169
+ const replacements = [];
170
+ for (const { section, rebuild } of tracking.sections) {
171
+ // Unsubscribe old nested observables
172
+ this.unsubscribeSectionNested(section);
173
+ // Rebuild section
174
+ const newResult = rebuild(section);
175
+ const oldOutput = section.result.output;
176
+ replacements.push({
177
+ oldOutput,
178
+ newOutput: newResult.output,
179
+ section
180
+ });
181
+ section.result = newResult;
182
+ }
183
+ // Применяем все замены к шаблону
184
+ for (const { oldOutput, newOutput } of replacements) {
185
+ currentTemplate = currentTemplate.replace(oldOutput, newOutput);
186
+ }
187
+ this.template = currentTemplate;
188
+ // Обновляем только затронутые фрагменты
189
+ const affectedFragmentIds = new Set();
190
+ for (const { section } of tracking.sections) {
191
+ if (section.fragmentId) {
192
+ affectedFragmentIds.add(section.fragmentId);
193
+ }
194
+ }
195
+ // Пересоздаём только затронутые фрагменты
196
+ for (const fragmentId of affectedFragmentIds) {
197
+ const binding = this.fragments.get(fragmentId);
198
+ if (!binding)
199
+ continue;
200
+ // Обновляем HTML фрагмента на основе секций
201
+ let newHtml = binding.html;
202
+ for (const { oldOutput, newOutput, section } of replacements) {
203
+ if (section.fragmentId === fragmentId) {
204
+ newHtml = newHtml.replace(oldOutput, newOutput);
205
+ }
206
+ }
207
+ const oldFragment = binding.fragment;
208
+ binding.html = newHtml;
209
+ binding.fragment = null; // Инвалидируем кэш
210
+ // Создаём новый фрагмент
211
+ const newFragment = this.createFragmentFromHtml(newHtml);
212
+ binding.fragment = newFragment;
213
+ // Обновляем DOM если фрагмент вставлен
214
+ if (binding.startMarker && binding.endMarker) {
215
+ this.replaceFragmentInDOM(binding, newFragment);
216
+ }
217
+ // Уведомляем об изменении фрагмента
218
+ this.fragmentChangeObserver.notify({ fragmentId, oldFragment, newFragment, affectedObservables: [observable] }, { fragmentId, oldFragment, newFragment, affectedObservables: [observable] });
219
+ }
220
+ // Одно событие для всех изменений шаблона
221
+ this.changeObserver.notify({ oldValue: null, newValue, oldTemplate, newTemplate: this.template }, { oldValue: null, newValue, oldTemplate, newTemplate: this.template });
222
+ }
223
+ /**
224
+ * Заменить фрагмент в DOM между маркерами
225
+ */
226
+ replaceFragmentInDOM(binding, newFragment) {
227
+ if (!binding.startMarker || !binding.endMarker)
228
+ return;
229
+ const parent = binding.startMarker.parentNode;
230
+ if (!parent)
231
+ return;
232
+ // Удаляем старые ноды между маркерами
233
+ for (const node of binding.nodes) {
234
+ parent.removeChild(node);
235
+ }
236
+ // Вставляем новые ноды
237
+ const newNodes = [];
238
+ const childNodes = Array.from(newFragment.childNodes);
239
+ for (const node of childNodes) {
240
+ newNodes.push(node);
241
+ parent.insertBefore(node, binding.endMarker);
242
+ }
243
+ binding.nodes = newNodes;
244
+ }
245
+ /**
246
+ * Создать DocumentFragment из HTML строки
247
+ */
248
+ createFragmentFromHtml(html) {
249
+ if (typeof document === 'undefined') {
250
+ throw new Error('createFragmentFromHtml requires DOM environment');
251
+ }
252
+ const template = document.createElement('template');
253
+ template.innerHTML = html;
254
+ return template.content.cloneNode(true);
255
+ }
256
+ /**
257
+ * Отписаться от вложенных Observable в секции (но не от главного)
258
+ */
259
+ unsubscribeSectionNested(section) {
260
+ // Отписываемся только от подписок, сохранённых непосредственно в секции
261
+ for (const sub of section.subscriptions) {
262
+ sub.unsubscribe();
263
+ }
264
+ section.subscriptions = [];
265
+ // Recursively unsubscribe children
266
+ for (const child of section.children) {
267
+ this.unsubscribeSectionNested(child);
268
+ }
269
+ }
270
+ /**
271
+ * Отписаться от всех Observable в секции
272
+ */
273
+ unsubscribeSection(section) {
274
+ for (const sub of section.subscriptions) {
275
+ sub.unsubscribe();
276
+ }
277
+ section.subscriptions = [];
278
+ // Recursively unsubscribe children
279
+ for (const child of section.children) {
280
+ this.unsubscribeSection(child);
281
+ }
282
+ }
283
+ /**
284
+ * Создать DocumentFragment из текущего шаблона (весь шаблон).
285
+ * Кэширует фрагмент - повторные вызовы возвращают тот же фрагмент.
286
+ * После appendChild фрагмент будет пустым, но ссылки на элементы остаются валидными.
287
+ */
288
+ createFragment() {
289
+ if (!this.cachedFragment) {
290
+ this.cachedFragment = this.createFragmentFromHtml(this.template);
291
+ }
292
+ return this.cachedFragment;
293
+ }
294
+ /**
295
+ * Инвалидировать кэш фрагмента (для пересоздания)
296
+ */
297
+ invalidateFragment() {
298
+ this.cachedFragment = null;
299
+ }
300
+ /**
301
+ * Создать и вставить все фрагменты в контейнер с маркерами
302
+ */
303
+ createAllFragmentsWithMarkers(container) {
304
+ for (const [id, binding] of this.fragments) {
305
+ const startMarker = document.createComment(`fragment-start:${id}`);
306
+ const endMarker = document.createComment(`fragment-end:${id}`);
307
+ container.appendChild(startMarker);
308
+ const fragment = this.createFragmentFromHtml(binding.html);
309
+ binding.fragment = fragment;
310
+ // Сохраняем ноды
311
+ const nodes = [];
312
+ const childNodes = Array.from(fragment.childNodes);
313
+ for (const node of childNodes) {
314
+ nodes.push(node);
315
+ container.appendChild(node);
316
+ }
317
+ container.appendChild(endMarker);
318
+ binding.startMarker = startMarker;
319
+ binding.endMarker = endMarker;
320
+ binding.nodes = nodes;
321
+ }
322
+ }
323
+ /**
324
+ * Получить DocumentFragment для конкретного фрагмента
325
+ */
326
+ getFragmentById(id) {
327
+ const binding = this.fragments.get(id);
328
+ if (!binding)
329
+ return null;
330
+ if (!binding.fragment) {
331
+ binding.fragment = this.createFragmentFromHtml(binding.html);
332
+ }
333
+ return binding.fragment;
334
+ }
335
+ /**
336
+ * Получить кэшированный DocumentFragment (deprecated)
337
+ * @deprecated Используйте getFragmentById
338
+ */
339
+ getFragment() {
340
+ // Возвращаем первый фрагмент для обратной совместимости
341
+ const firstBinding = this.fragments.values().next().value;
342
+ return firstBinding?.fragment || null;
343
+ }
344
+ /**
345
+ * Пересоздать все фрагменты
346
+ */
347
+ rebuildAllFragments() {
348
+ for (const [_id, binding] of this.fragments) {
349
+ binding.fragment = null;
350
+ binding.fragment = this.createFragmentFromHtml(binding.html);
351
+ }
352
+ }
353
+ /**
354
+ * Пересоздать fragment (deprecated)
355
+ * @deprecated Используйте rebuildAllFragments или конкретный фрагмент
356
+ */
357
+ rebuildFragment() {
358
+ this.rebuildAllFragments();
359
+ return this.createFragment();
360
+ }
361
+ /**
362
+ * Очистить все подписки
363
+ */
364
+ dispose() {
365
+ // Отписываемся от всех Observable
366
+ for (const tracking of this.observableTrackings.values()) {
367
+ tracking.unsubscribe();
368
+ }
369
+ this.observableTrackings.clear();
370
+ // Отвязываем события
371
+ this.unbindEvents();
372
+ // Очищаем секции
373
+ for (const section of this.sections) {
374
+ this.unsubscribeSection(section);
375
+ }
376
+ this.sections = [];
377
+ // Очищаем фрагменты
378
+ this.fragments.clear();
379
+ }
380
+ /**
381
+ * Привязать refs к элементам
382
+ * @param root - DOM элемент для поиска refs. Если не указан, создаётся фрагмент из шаблона
383
+ */
384
+ bindRefs() {
385
+ // Если root не передан, создаём фрагмент из шаблона
386
+ const targetRoot = this.createFragment();
387
+ const refElements = targetRoot.querySelectorAll('[data-ref]');
388
+ for (const element of Array.from(refElements)) {
389
+ const refName = element.getAttribute('data-ref');
390
+ if (refName) {
391
+ this.scope.set(refName, element);
392
+ }
393
+ }
394
+ }
395
+ /**
396
+ * Обработать инжекции (@injection[head/tail])
397
+ * Должен вызываться после bindRefs
398
+ */
399
+ processInjections(root) {
400
+ // Find all elements with injection attributes
401
+ const injectElements = root.querySelectorAll('[data-injection-type][data-injection-target]');
402
+ for (const element of Array.from(injectElements)) {
403
+ const type = element.getAttribute('data-injection-type');
404
+ const targetRefName = decodeURIComponent(element.getAttribute('data-injection-target') || '');
405
+ if (!targetRefName)
406
+ continue;
407
+ // Get target element from scope
408
+ const targetElement = this.scope.get(targetRefName);
409
+ if (!targetElement || !(targetElement instanceof Element)) {
410
+ console.warn(`[PageTemplate] Injection target "${targetRefName}" not found in scope or is not an Element`);
411
+ continue;
412
+ }
413
+ // Remove injection attributes
414
+ element.removeAttribute('data-injection-type');
415
+ element.removeAttribute('data-injection-target');
416
+ // Perform injection
417
+ if (type === 'head') {
418
+ targetElement.prepend(element);
419
+ }
420
+ else {
421
+ targetElement.append(element);
422
+ }
423
+ }
424
+ }
425
+ /**
426
+ * Привязать события к элементам из кэшированного фрагмента
427
+ */
428
+ bindEvents() {
429
+ // Используем кэшированный фрагмент (тот же что и для bindRefs)
430
+ const fragment = this.createFragment();
431
+ // Собираем все элементы из фрагмента
432
+ const allElements = fragment.querySelectorAll('*');
433
+ for (const element of Array.from(allElements)) {
434
+ const unbinders = this.bindEventsToElement(element);
435
+ this.eventUnbinders.push(...unbinders);
436
+ }
437
+ }
438
+ /**
439
+ * Привязать события к одному элементу
440
+ */
441
+ bindEventsToElement(element) {
442
+ const unbinders = [];
443
+ const attributes = Array.from(element.attributes);
444
+ for (const attr of attributes) {
445
+ if (attr.name.startsWith('data-event-')) {
446
+ const eventName = attr.name.slice('data-event-'.length);
447
+ const exprCode = decodeURIComponent(attr.value);
448
+ const handler = (event) => {
449
+ const localScope = this.scope.createChild({ event });
450
+ const expr = new Expression(exprCode);
451
+ try {
452
+ expr.execute(localScope);
453
+ }
454
+ catch (error) {
455
+ console.error(`[TemplateInstance] Error executing handler for ${eventName}:`, error);
456
+ }
457
+ };
458
+ element.addEventListener(eventName, handler);
459
+ unbinders.push(() => element.removeEventListener(eventName, handler));
460
+ }
461
+ }
462
+ return unbinders;
463
+ }
464
+ /**
465
+ * Отвязать все события
466
+ */
467
+ unbindEvents() {
468
+ for (const unbind of this.eventUnbinders) {
469
+ unbind();
470
+ }
471
+ this.eventUnbinders = [];
472
+ }
473
+ /**
474
+ * Отвязать refs (установить null)
475
+ */
476
+ unbindRefs() {
477
+ for (const section of this.sections) {
478
+ if (section.rule.name === 'ref' && section.match.data?.expression) {
479
+ const refName = section.match.data.expression;
480
+ if (this.scope.has(refName)) {
481
+ this.scope.set(refName, null);
482
+ }
483
+ }
484
+ }
485
+ }
486
+ }
487
+ //# sourceMappingURL=TemplateInstance.old.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TemplateInstance.old.js","sourceRoot":"","sources":["../../../src/foundation/engine/TemplateInstance.old.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * InvalidDynamicRuleUsage - исключение при использовании Observable
3
+ * в правилах, которые не поддерживают динамическое обновление.
4
+ * Например: @[ref], @injection
5
+ */
6
+ export declare class InvalidDynamicRuleUsage extends Error {
7
+ constructor(ruleName: string, message?: string);
8
+ }
9
+ /**
10
+ * InvalidTemplateEngineSyntaxException - исключение при синтаксических ошибках
11
+ * в шаблоне. Например: @if без boolean, @for с неверным типом.
12
+ */
13
+ export declare class InvalidTemplateEngineSyntaxException extends Error {
14
+ readonly line?: number;
15
+ readonly column?: number;
16
+ constructor(message: string, options?: {
17
+ line?: number;
18
+ column?: number;
19
+ });
20
+ }
21
+ //# sourceMappingURL=TemplateExceptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TemplateExceptions.d.ts","sourceRoot":"","sources":["../../../../src/foundation/engine/exceptions/TemplateExceptions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,uBAAwB,SAAQ,KAAK;gBAClC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;CAIjD;AAED;;;GAGG;AACH,qBAAa,oCAAqC,SAAQ,KAAK;IAC3D,SAAgB,IAAI,CAAC,EAAE,MAAM,CAAC;IAC9B,SAAgB,MAAM,CAAC,EAAE,MAAM,CAAC;gBAEpB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;CAM5E"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * InvalidDynamicRuleUsage - исключение при использовании Observable
3
+ * в правилах, которые не поддерживают динамическое обновление.
4
+ * Например: @[ref], @injection
5
+ */
6
+ export class InvalidDynamicRuleUsage extends Error {
7
+ constructor(ruleName, message) {
8
+ super(message ?? `Rule "${ruleName}" does not support Observable values. Use a static value instead.`);
9
+ this.name = 'InvalidDynamicRuleUsage';
10
+ }
11
+ }
12
+ /**
13
+ * InvalidTemplateEngineSyntaxException - исключение при синтаксических ошибках
14
+ * в шаблоне. Например: @if без boolean, @for с неверным типом.
15
+ */
16
+ export class InvalidTemplateEngineSyntaxException extends Error {
17
+ line;
18
+ column;
19
+ constructor(message, options) {
20
+ super(message);
21
+ this.name = 'InvalidTemplateEngineSyntaxException';
22
+ this.line = options?.line;
23
+ this.column = options?.column;
24
+ }
25
+ }
26
+ //# sourceMappingURL=TemplateExceptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TemplateExceptions.js","sourceRoot":"","sources":["../../../../src/foundation/engine/exceptions/TemplateExceptions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IAC9C,YAAY,QAAgB,EAAE,OAAgB;QAC1C,KAAK,CAAC,OAAO,IAAI,SAAS,QAAQ,mEAAmE,CAAC,CAAC;QACvG,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IAC1C,CAAC;CACJ;AAED;;;GAGG;AACH,MAAM,OAAO,oCAAqC,SAAQ,KAAK;IAC3C,IAAI,CAAU;IACd,MAAM,CAAU;IAEhC,YAAY,OAAe,EAAE,OAA4C;QACrE,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,sCAAsC,CAAC;QACnD,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE,IAAI,CAAC;QAC1B,IAAI,CAAC,MAAM,GAAG,OAAO,EAAE,MAAM,CAAC;IAClC,CAAC;CACJ"}
@@ -0,0 +1,18 @@
1
+ export { default as TemplateEngine } from './TemplateEngine.js';
2
+ export { default as Scope } from './Scope.js';
3
+ export { default as Expression } from './Expression.js';
4
+ export { default as PageTemplate } from './PageTemplate.js';
5
+ export { default as BalancedParser } from './BalancedParser.js';
6
+ export { default as EscapeHandler } from './EscapeHandler.js';
7
+ export { default as Rule, SyntaxRule, AttributeRule } from './Rule.js';
8
+ export type { RuleMatch, RuleResult, RuleType } from './Rule.js';
9
+ export { default as ExpressionRule } from './rules/syntax/ExpressionRule.js';
10
+ export { default as IfRule } from './rules/syntax/IfRule.js';
11
+ export { default as ForRule } from './rules/syntax/ForRule.js';
12
+ export { default as RefRule } from './rules/attribute/RefRule.js';
13
+ export { default as EventRule } from './rules/attribute/EventRule.js';
14
+ export { default as InjectionRule } from './rules/attribute/InjectionRule.js';
15
+ export { InvalidDynamicRuleUsage, InvalidTemplateEngineSyntaxException } from './exceptions/TemplateExceptions.js';
16
+ export type { TemplateEngineOptions, ProcessResult } from './TemplateEngine.js';
17
+ export type { TemplateSection, TemplateChangeEvent } from './PageTemplate.js';
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/foundation/engine/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAG9D,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACvE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAGjE,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAC7E,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAG9E,OAAO,EACH,uBAAuB,EACvB,oCAAoC,EACvC,MAAM,oCAAoC,CAAC;AAG5C,YAAY,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAChF,YAAY,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,19 @@
1
+ // Export all engine components
2
+ export { default as TemplateEngine } from './TemplateEngine.js';
3
+ export { default as Scope } from './Scope.js';
4
+ export { default as Expression } from './Expression.js';
5
+ export { default as PageTemplate } from './PageTemplate.js';
6
+ export { default as BalancedParser } from './BalancedParser.js';
7
+ export { default as EscapeHandler } from './EscapeHandler.js';
8
+ // Export Rule system
9
+ export { default as Rule, SyntaxRule, AttributeRule } from './Rule.js';
10
+ // Export concrete rules
11
+ export { default as ExpressionRule } from './rules/syntax/ExpressionRule.js';
12
+ export { default as IfRule } from './rules/syntax/IfRule.js';
13
+ export { default as ForRule } from './rules/syntax/ForRule.js';
14
+ export { default as RefRule } from './rules/attribute/RefRule.js';
15
+ export { default as EventRule } from './rules/attribute/EventRule.js';
16
+ export { default as InjectionRule } from './rules/attribute/InjectionRule.js';
17
+ // Export exceptions
18
+ export { InvalidDynamicRuleUsage, InvalidTemplateEngineSyntaxException } from './exceptions/TemplateExceptions.js';
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/foundation/engine/index.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAE9D,qBAAqB;AACrB,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAGvE,wBAAwB;AACxB,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAC7E,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAE9E,oBAAoB;AACpB,OAAO,EACH,uBAAuB,EACvB,oCAAoC,EACvC,MAAM,oCAAoC,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { AttributeRule } from '../../Rule.js';
2
+ import type { RuleMatch, RuleResult } from '../../Rule.js';
3
+ import Scope from '../../Scope.js';
4
+ /**
5
+ * EventRule - обработка @on[eventName]="expression"
6
+ * Подписывает элемент на событие.
7
+ */
8
+ export default class EventRule extends AttributeRule {
9
+ readonly name = "event";
10
+ readonly priority = 30;
11
+ find(template: string): RuleMatch[];
12
+ execute(match: RuleMatch, scope: Scope): RuleResult;
13
+ /**
14
+ * Постобработка: привязать события к элементам
15
+ */
16
+ static bindEvents(element: Element, scope: Scope): (() => void)[];
17
+ /**
18
+ * Привязать событие с поддержкой Observable
19
+ */
20
+ static bindEventWithObservable(element: Element, eventName: string, exprCode: string, scope: Scope): () => void;
21
+ }
22
+ //# sourceMappingURL=EventRule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventRule.d.ts","sourceRoot":"","sources":["../../../../../src/foundation/engine/rules/attribute/EventRule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,KAAK,MAAM,gBAAgB,CAAC;AAWnC;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,aAAa;IAChD,SAAgB,IAAI,WAAW;IAC/B,SAAgB,QAAQ,MAAM;IAEvB,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE;IAsDnC,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,GAAG,UAAU;IAa1D;;OAEG;WACW,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE;IAkCxE;;OAEG;WACW,uBAAuB,CACjC,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,KAAK,GACb,MAAM,IAAI;CAqChB"}