@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,637 @@
1
+ import { MutationObserver } from '../api/Observer.js';
2
+ import Expression from './Expression.js';
3
+ /**
4
+ * TemplateInstance - динамический шаблон страницы.
5
+ *
6
+ * Поддерживает:
7
+ * - Множество мелких фрагментов, каждый обновляется независимо
8
+ * - Множество container bindings
9
+ * - Автоматическое обновление DOM при изменении Observable
10
+ * - bind/unbind для refs и events
11
+ */
12
+ export default class TemplateInstance {
13
+ scope;
14
+ sections = [];
15
+ /** Все фрагменты шаблона */
16
+ fragments = new Map();
17
+ /** ID корневого фрагмента */
18
+ rootFragmentId = null;
19
+ /** Счётчик для генерации ID фрагментов */
20
+ fragmentIdCounter = 0;
21
+ /** Observers for fragment changes */
22
+ fragmentChangeObserver = new MutationObserver();
23
+ /** Группировка секций по Observable */
24
+ observableTrackings = new Map();
25
+ /** Привязки к контейнерам */
26
+ containerBindings = new Map();
27
+ constructor(scope) {
28
+ this.scope = scope;
29
+ }
30
+ // ========================================
31
+ // Public API - Getters
32
+ // ========================================
33
+ /**
34
+ * Получить Scope
35
+ */
36
+ getScope() {
37
+ return this.scope;
38
+ }
39
+ /**
40
+ * Получить все секции
41
+ */
42
+ getSections() {
43
+ return this.sections;
44
+ }
45
+ /**
46
+ * Получить все фрагменты
47
+ */
48
+ getAllFragments() {
49
+ return this.fragments;
50
+ }
51
+ /**
52
+ * Получить фрагмент по ID
53
+ */
54
+ getFragmentBinding(id) {
55
+ return this.fragments.get(id);
56
+ }
57
+ /**
58
+ * Получить финальный HTML (собранный из всех фрагментов)
59
+ */
60
+ getTemplate() {
61
+ if (!this.rootFragmentId)
62
+ return '';
63
+ return this.buildHtmlFromFragment(this.rootFragmentId);
64
+ }
65
+ // ========================================
66
+ // Public API - Fragment Management
67
+ // ========================================
68
+ /**
69
+ * Создать новый фрагмент и вернуть его ID
70
+ */
71
+ createFragment(html, sourceTemplate, sections = [], parentId = null) {
72
+ const id = `f${this.fragmentIdCounter++}`;
73
+ const binding = {
74
+ id,
75
+ html,
76
+ sourceTemplate,
77
+ sections,
78
+ observables: new Set(),
79
+ parentId,
80
+ childIds: []
81
+ };
82
+ // Привязываем секции к фрагменту
83
+ for (const section of sections) {
84
+ section.fragmentId = id;
85
+ }
86
+ this.fragments.set(id, binding);
87
+ // Если нет корневого фрагмента, это первый
88
+ if (this.rootFragmentId === null) {
89
+ this.rootFragmentId = id;
90
+ }
91
+ // Добавляем в дочерние родителя
92
+ if (parentId) {
93
+ const parent = this.fragments.get(parentId);
94
+ if (parent) {
95
+ parent.childIds.push(id);
96
+ }
97
+ }
98
+ return id;
99
+ }
100
+ /**
101
+ * Установить корневой фрагмент
102
+ */
103
+ setRootFragment(id) {
104
+ this.rootFragmentId = id;
105
+ }
106
+ /**
107
+ * Добавить секцию шаблона
108
+ */
109
+ addSection(section) {
110
+ this.sections.push(section);
111
+ }
112
+ /**
113
+ * Вставить добавленный фрагмент во все привязанные контейнеры.
114
+ * Вызывается после appendTemplate.
115
+ */
116
+ insertAppendedFragment(fragmentId) {
117
+ const fragment = this.fragments.get(fragmentId);
118
+ if (!fragment)
119
+ return;
120
+ for (const [container, binding] of this.containerBindings) {
121
+ // Вставляем фрагмент в конец контейнера
122
+ this.insertFragmentRecursive(fragmentId, container, binding);
123
+ // Привязываем refs, events и injections для новых элементов
124
+ this.bindRefsForContainer(container);
125
+ this.processInjectionsForContainer(container);
126
+ this.bindEventsForNewFragment(fragmentId, binding);
127
+ }
128
+ }
129
+ /**
130
+ * Привязать события только для нового фрагмента
131
+ */
132
+ bindEventsForNewFragment(fragmentId, binding) {
133
+ const markerInfo = binding.markers.get(fragmentId);
134
+ if (!markerInfo)
135
+ return;
136
+ for (const node of markerInfo.nodes) {
137
+ if (node instanceof Element) {
138
+ const unbinders = this.bindEventsToElement(node);
139
+ binding.eventUnbinders.push(...unbinders);
140
+ const children = node.querySelectorAll('*');
141
+ for (const child of Array.from(children)) {
142
+ const childUnbinders = this.bindEventsToElement(child);
143
+ binding.eventUnbinders.push(...childUnbinders);
144
+ }
145
+ }
146
+ }
147
+ }
148
+ // ========================================
149
+ // Public API - Events
150
+ // ========================================
151
+ /**
152
+ * Подписаться на изменения фрагментов
153
+ */
154
+ onFragmentChange(listener) {
155
+ const wrapper = (_oldEvent, newEvent) => {
156
+ listener(newEvent);
157
+ };
158
+ this.fragmentChangeObserver.subscribe(wrapper);
159
+ return () => this.fragmentChangeObserver.unsubscribe(wrapper);
160
+ }
161
+ // ========================================
162
+ // Public API - Observable Tracking
163
+ // ========================================
164
+ /**
165
+ * Подписаться на Observable и автоматически пересоздавать секцию
166
+ */
167
+ trackObservable(observable, section, rebuild) {
168
+ let tracking = this.observableTrackings.get(observable);
169
+ if (!tracking) {
170
+ const listener = (_newValue) => {
171
+ this.rebuildFragmentsForObservable(observable);
172
+ };
173
+ observable.subscribe(listener);
174
+ tracking = {
175
+ observable,
176
+ sections: [],
177
+ fragmentIds: new Set(),
178
+ unsubscribe: () => observable.unsubscribe(listener)
179
+ };
180
+ this.observableTrackings.set(observable, tracking);
181
+ }
182
+ tracking.sections.push({ section, rebuild });
183
+ if (section.fragmentId) {
184
+ tracking.fragmentIds.add(section.fragmentId);
185
+ const binding = this.fragments.get(section.fragmentId);
186
+ if (binding) {
187
+ binding.observables.add(observable);
188
+ }
189
+ }
190
+ return () => {
191
+ if (tracking) {
192
+ tracking.sections = tracking.sections.filter(s => s.section !== section);
193
+ if (tracking.sections.length === 0) {
194
+ tracking.unsubscribe();
195
+ this.observableTrackings.delete(observable);
196
+ }
197
+ }
198
+ };
199
+ }
200
+ // ========================================
201
+ // Public API - Container Binding
202
+ // ========================================
203
+ /**
204
+ * Привязать к контейнеру.
205
+ * Вставляет DOM, вызывает bindRefs, processInjections и bindEvents.
206
+ */
207
+ bind(container) {
208
+ if (this.containerBindings.has(container)) {
209
+ console.warn('[TemplateInstance] Container already bound');
210
+ return;
211
+ }
212
+ const binding = {
213
+ container,
214
+ markers: new Map(),
215
+ eventUnbinders: []
216
+ };
217
+ this.containerBindings.set(container, binding);
218
+ // Вставляем DOM с маркерами
219
+ this.insertFragmentsIntoContainer(container, binding);
220
+ // Привязываем refs, обрабатываем injections, привязываем events
221
+ this.bindRefsForContainer(container);
222
+ this.processInjectionsForContainer(container);
223
+ this.bindEventsForContainer(container, binding);
224
+ }
225
+ /**
226
+ * Отвязать от контейнера.
227
+ * Отвязывает refs и events, но оставляет DOM.
228
+ */
229
+ unbind(container) {
230
+ const binding = this.containerBindings.get(container);
231
+ if (!binding) {
232
+ console.warn('[TemplateInstance] Container not bound');
233
+ return;
234
+ }
235
+ // Отвязываем события для этого контейнера
236
+ for (const unbind of binding.eventUnbinders) {
237
+ unbind();
238
+ }
239
+ binding.eventUnbinders = [];
240
+ // Отвязываем refs
241
+ this.unbindRefsForContainer(container);
242
+ // Удаляем binding
243
+ this.containerBindings.delete(container);
244
+ }
245
+ /**
246
+ * Привязать refs к элементам.
247
+ * Если есть контейнеры - привязывает для них.
248
+ * Если нет - создаёт временный DocumentFragment и привязывает refs из него.
249
+ */
250
+ bindRefs() {
251
+ if (this.containerBindings.size > 0) {
252
+ for (const [container] of this.containerBindings) {
253
+ this.bindRefsForContainer(container);
254
+ }
255
+ }
256
+ else {
257
+ // Нет контейнеров - создаём временный fragment
258
+ const fragment = this.createDOMFragment();
259
+ this.bindRefsForFragment(fragment);
260
+ }
261
+ }
262
+ /**
263
+ * Привязать refs из DocumentFragment (без контейнера)
264
+ */
265
+ bindRefsForFragment(fragment) {
266
+ const refElements = fragment.querySelectorAll('[data-ref]');
267
+ for (const element of Array.from(refElements)) {
268
+ const refName = element.getAttribute('data-ref');
269
+ if (refName) {
270
+ this.scope.set(refName, element);
271
+ }
272
+ }
273
+ }
274
+ /**
275
+ * Отвязать refs (для всех контейнеров)
276
+ */
277
+ unbindRefs() {
278
+ for (const section of this.sections) {
279
+ if (section.rule.name === 'ref' && section.result.data?.refName) {
280
+ const refName = section.result.data.refName;
281
+ if (this.scope.has(refName)) {
282
+ this.scope.set(refName, null);
283
+ }
284
+ }
285
+ }
286
+ }
287
+ /**
288
+ * Привязать события (для всех контейнеров)
289
+ */
290
+ bindEvents() {
291
+ for (const [container, binding] of this.containerBindings) {
292
+ this.bindEventsForContainer(container, binding);
293
+ }
294
+ }
295
+ /**
296
+ * Отвязать события (для всех контейнеров)
297
+ */
298
+ unbindEvents() {
299
+ for (const [_, binding] of this.containerBindings) {
300
+ for (const unbind of binding.eventUnbinders) {
301
+ unbind();
302
+ }
303
+ binding.eventUnbinders = [];
304
+ }
305
+ }
306
+ /**
307
+ * Очистить все подписки и bindings
308
+ */
309
+ dispose() {
310
+ // Отвязываем все контейнеры
311
+ for (const [container] of this.containerBindings) {
312
+ this.unbind(container);
313
+ }
314
+ // Отписываемся от всех Observable
315
+ for (const tracking of this.observableTrackings.values()) {
316
+ tracking.unsubscribe();
317
+ }
318
+ this.observableTrackings.clear();
319
+ // Очищаем секции
320
+ for (const section of this.sections) {
321
+ this.unsubscribeSection(section);
322
+ }
323
+ this.sections = [];
324
+ // Очищаем фрагменты
325
+ this.fragments.clear();
326
+ this.rootFragmentId = null;
327
+ }
328
+ // ========================================
329
+ // Private - DOM Operations
330
+ // ========================================
331
+ /**
332
+ * Вставить все фрагменты в контейнер с маркерами
333
+ */
334
+ insertFragmentsIntoContainer(container, binding) {
335
+ if (!this.rootFragmentId)
336
+ return;
337
+ // Рекурсивно вставляем фрагменты
338
+ this.insertFragmentRecursive(this.rootFragmentId, container, binding);
339
+ }
340
+ /**
341
+ * Рекурсивно вставить фрагмент и его дочерние
342
+ */
343
+ insertFragmentRecursive(fragmentId, parent, containerBinding) {
344
+ const fragment = this.fragments.get(fragmentId);
345
+ if (!fragment)
346
+ return;
347
+ // Создаём маркеры
348
+ const startMarker = document.createComment(`fragment:${fragmentId}`);
349
+ const endMarker = document.createComment(`/fragment:${fragmentId}`);
350
+ parent.appendChild(startMarker);
351
+ // Парсим HTML и вставляем, заменяя placeholder-ы на дочерние фрагменты
352
+ const nodes = this.createNodesFromHtml(fragment.html);
353
+ const insertedNodes = [];
354
+ // Node.COMMENT_NODE = 8
355
+ const COMMENT_NODE = 8;
356
+ for (const node of nodes) {
357
+ // Проверяем на placeholder комментарии
358
+ if (node.nodeType === COMMENT_NODE) {
359
+ const comment = node;
360
+ const match = comment.data.match(/^placeholder:(.+)$/);
361
+ if (match) {
362
+ const childId = match[1];
363
+ // Рекурсивно вставляем дочерний фрагмент
364
+ this.insertFragmentRecursive(childId, parent, containerBinding);
365
+ continue;
366
+ }
367
+ }
368
+ parent.appendChild(node);
369
+ insertedNodes.push(node);
370
+ }
371
+ parent.appendChild(endMarker);
372
+ // Сохраняем маркеры
373
+ containerBinding.markers.set(fragmentId, {
374
+ startMarker,
375
+ endMarker,
376
+ nodes: insertedNodes
377
+ });
378
+ }
379
+ /**
380
+ * Создать ноды из HTML строки
381
+ */
382
+ createNodesFromHtml(html) {
383
+ const template = document.createElement('template');
384
+ template.innerHTML = html;
385
+ return Array.from(template.content.childNodes);
386
+ }
387
+ /**
388
+ * Собрать HTML из фрагмента (рекурсивно заменяя placeholder-ы)
389
+ */
390
+ buildHtmlFromFragment(fragmentId) {
391
+ const fragment = this.fragments.get(fragmentId);
392
+ if (!fragment)
393
+ return '';
394
+ let html = fragment.html;
395
+ // Заменяем placeholder-ы на контент дочерних фрагментов
396
+ for (const childId of fragment.childIds) {
397
+ const placeholder = `<!--placeholder:${childId}-->`;
398
+ const childHtml = this.buildHtmlFromFragment(childId);
399
+ html = html.replace(placeholder, childHtml);
400
+ }
401
+ return html;
402
+ }
403
+ /**
404
+ * Привязать refs для конкретного контейнера
405
+ */
406
+ bindRefsForContainer(container) {
407
+ const refElements = container.querySelectorAll('[data-ref]');
408
+ for (const element of Array.from(refElements)) {
409
+ const refName = element.getAttribute('data-ref');
410
+ if (refName) {
411
+ this.scope.set(refName, element);
412
+ }
413
+ }
414
+ }
415
+ /**
416
+ * Обработать инжекции для конкретного контейнера.
417
+ * Находит элементы с data-injection-* атрибутами и перемещает их в целевые элементы.
418
+ */
419
+ processInjectionsForContainer(container) {
420
+ const injectElements = container.querySelectorAll('[data-injection-type][data-injection-target]');
421
+ for (const element of Array.from(injectElements)) {
422
+ const type = element.getAttribute('data-injection-type');
423
+ const targetRefName = decodeURIComponent(element.getAttribute('data-injection-target') || '');
424
+ if (!targetRefName) {
425
+ // Нет target - удаляем элемент из DOM
426
+ element.remove();
427
+ continue;
428
+ }
429
+ // Получаем целевой элемент из scope
430
+ const targetElement = this.scope.get(targetRefName);
431
+ if (!targetElement || !(targetElement instanceof Element)) {
432
+ // Target не найден - удаляем элемент из DOM
433
+ element.remove();
434
+ continue;
435
+ }
436
+ // Удаляем атрибуты инжекции
437
+ element.removeAttribute('data-injection-type');
438
+ element.removeAttribute('data-injection-target');
439
+ // Выполняем инжекцию
440
+ if (type === 'head') {
441
+ targetElement.prepend(element);
442
+ }
443
+ else {
444
+ targetElement.append(element);
445
+ }
446
+ }
447
+ }
448
+ /**
449
+ * Отвязать refs для конкретного контейнера
450
+ */
451
+ unbindRefsForContainer(_container) {
452
+ // Устанавливаем все refs в null
453
+ for (const section of this.sections) {
454
+ if (section.rule.name === 'ref' && section.result.data?.refName) {
455
+ const refName = section.result.data.refName;
456
+ if (this.scope.has(refName)) {
457
+ this.scope.set(refName, null);
458
+ }
459
+ }
460
+ }
461
+ }
462
+ /**
463
+ * Привязать события для конкретного контейнера
464
+ */
465
+ bindEventsForContainer(container, binding) {
466
+ const allElements = container.querySelectorAll('*');
467
+ for (const element of Array.from(allElements)) {
468
+ const unbinders = this.bindEventsToElement(element);
469
+ binding.eventUnbinders.push(...unbinders);
470
+ }
471
+ }
472
+ /**
473
+ * Привязать события к одному элементу
474
+ */
475
+ bindEventsToElement(element) {
476
+ const unbinders = [];
477
+ const attributes = Array.from(element.attributes);
478
+ for (const attr of attributes) {
479
+ if (attr.name.startsWith('data-event-')) {
480
+ const eventName = attr.name.slice('data-event-'.length);
481
+ const exprCode = decodeURIComponent(attr.value);
482
+ const handler = (event) => {
483
+ const localScope = this.scope.createChild({ event });
484
+ const expr = new Expression(exprCode);
485
+ try {
486
+ expr.execute(localScope);
487
+ }
488
+ catch (error) {
489
+ console.error(`[TemplateInstance] Error executing handler for ${eventName}:`, error);
490
+ }
491
+ };
492
+ element.addEventListener(eventName, handler);
493
+ unbinders.push(() => element.removeEventListener(eventName, handler));
494
+ }
495
+ }
496
+ return unbinders;
497
+ }
498
+ // ========================================
499
+ // Private - Observable Rebuild
500
+ // ========================================
501
+ /**
502
+ * Перестроить фрагменты при изменении Observable
503
+ */
504
+ rebuildFragmentsForObservable(observable) {
505
+ const tracking = this.observableTrackings.get(observable);
506
+ if (!tracking || tracking.sections.length === 0)
507
+ return;
508
+ // Собираем затронутые фрагменты
509
+ const affectedFragmentIds = new Set();
510
+ // Перестраиваем секции и обновляем результаты
511
+ for (const { section, rebuild } of tracking.sections) {
512
+ this.unsubscribeSectionNested(section);
513
+ const newResult = rebuild(section);
514
+ section.result = newResult;
515
+ if (section.fragmentId) {
516
+ affectedFragmentIds.add(section.fragmentId);
517
+ }
518
+ }
519
+ // Перестраиваем HTML затронутых фрагментов
520
+ for (const fragmentId of affectedFragmentIds) {
521
+ const fragment = this.fragments.get(fragmentId);
522
+ if (!fragment)
523
+ continue;
524
+ // Собираем новый HTML из результатов всех секций фрагмента
525
+ let newHtml = fragment.sourceTemplate;
526
+ for (const section of fragment.sections) {
527
+ // Заменяем исходный match на новый output
528
+ newHtml = newHtml.replace(section.match.fullMatch, section.result.output);
529
+ }
530
+ fragment.html = newHtml;
531
+ }
532
+ // Обновляем DOM во всех контейнерах
533
+ for (const fragmentId of affectedFragmentIds) {
534
+ this.updateFragmentInAllContainers(fragmentId, observable);
535
+ }
536
+ }
537
+ /**
538
+ * Обновить фрагмент во всех контейнерах
539
+ */
540
+ updateFragmentInAllContainers(fragmentId, observable) {
541
+ const fragment = this.fragments.get(fragmentId);
542
+ if (!fragment)
543
+ return;
544
+ for (const [container, binding] of this.containerBindings) {
545
+ const markerInfo = binding.markers.get(fragmentId);
546
+ if (!markerInfo)
547
+ continue;
548
+ const { startMarker, endMarker, nodes: oldNodes } = markerInfo;
549
+ const parent = startMarker.parentNode;
550
+ if (!parent)
551
+ continue;
552
+ // Отвязываем события от старых элементов
553
+ this.unbindEventsFromNodes(oldNodes, binding);
554
+ // Удаляем старые ноды (проверяем что node всё ещё child, т.к. injection мог переместить)
555
+ for (const node of oldNodes) {
556
+ if (node.parentNode === parent) {
557
+ parent.removeChild(node);
558
+ }
559
+ }
560
+ // Создаём новые ноды
561
+ const newNodes = this.createNodesFromHtml(fragment.html);
562
+ const insertedNodes = [];
563
+ for (const node of newNodes) {
564
+ parent.insertBefore(node, endMarker);
565
+ insertedNodes.push(node);
566
+ }
567
+ // Сохраняем новые ноды
568
+ markerInfo.nodes = insertedNodes;
569
+ // Привязываем refs, обрабатываем injections и events к новым элементам
570
+ this.bindRefsForContainer(container);
571
+ this.processInjectionsForContainer(container);
572
+ for (const node of insertedNodes) {
573
+ if (node instanceof Element) {
574
+ const unbinders = this.bindEventsToElement(node);
575
+ binding.eventUnbinders.push(...unbinders);
576
+ // И для всех дочерних
577
+ const children = node.querySelectorAll('*');
578
+ for (const child of Array.from(children)) {
579
+ const childUnbinders = this.bindEventsToElement(child);
580
+ binding.eventUnbinders.push(...childUnbinders);
581
+ }
582
+ }
583
+ }
584
+ // Уведомляем об изменении
585
+ this.fragmentChangeObserver.notify({ fragmentId, oldNodes, newNodes: insertedNodes, affectedObservables: [observable] }, { fragmentId, oldNodes, newNodes: insertedNodes, affectedObservables: [observable] });
586
+ }
587
+ }
588
+ /**
589
+ * Отвязать события от нод
590
+ */
591
+ unbindEventsFromNodes(nodes, binding) {
592
+ // Простая реализация: очищаем все unbinders
593
+ // В идеале нужно отслеживать какие unbinders к каким элементам относятся
594
+ // Но для простоты пока так
595
+ for (const unbind of binding.eventUnbinders) {
596
+ unbind();
597
+ }
598
+ binding.eventUnbinders = [];
599
+ }
600
+ /**
601
+ * Отписаться от вложенных Observable в секции
602
+ */
603
+ unsubscribeSectionNested(section) {
604
+ for (const sub of section.subscriptions) {
605
+ sub.unsubscribe();
606
+ }
607
+ section.subscriptions = [];
608
+ for (const child of section.children) {
609
+ this.unsubscribeSectionNested(child);
610
+ }
611
+ }
612
+ /**
613
+ * Отписаться от всех Observable в секции
614
+ */
615
+ unsubscribeSection(section) {
616
+ for (const sub of section.subscriptions) {
617
+ sub.unsubscribe();
618
+ }
619
+ section.subscriptions = [];
620
+ for (const child of section.children) {
621
+ this.unsubscribeSection(child);
622
+ }
623
+ }
624
+ // ========================================
625
+ // Legacy API (для обратной совместимости)
626
+ // ========================================
627
+ /**
628
+ * @deprecated Используйте bind(container)
629
+ */
630
+ createDOMFragment() {
631
+ const html = this.getTemplate();
632
+ const template = document.createElement('template');
633
+ template.innerHTML = html;
634
+ return template.content;
635
+ }
636
+ }
637
+ //# sourceMappingURL=TemplateInstance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TemplateInstance.js","sourceRoot":"","sources":["../../../src/foundation/engine/TemplateInstance.ts"],"names":[],"mappings":"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"}