@reidelsaltres/pureper 0.1.160 → 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.
- package/out/foundation/Triplet.d.ts.map +1 -1
- package/out/foundation/Triplet.js +4 -5
- package/out/foundation/Triplet.js.map +1 -1
- package/out/foundation/component_api/Component.d.ts +2 -2
- package/out/foundation/component_api/Component.d.ts.map +1 -1
- package/out/foundation/component_api/Component.js.map +1 -1
- package/out/foundation/component_api/UniHtml.d.ts +4 -10
- package/out/foundation/component_api/UniHtml.d.ts.map +1 -1
- package/out/foundation/component_api/UniHtml.js +7 -15
- package/out/foundation/component_api/UniHtml.js.map +1 -1
- package/out/foundation/engine/Rule.d.ts +2 -0
- package/out/foundation/engine/Rule.d.ts.map +1 -1
- package/out/foundation/engine/Rule.js.map +1 -1
- package/out/foundation/engine/Scope.d.ts +5 -1
- package/out/foundation/engine/Scope.d.ts.map +1 -1
- package/out/foundation/engine/Scope.js +12 -3
- package/out/foundation/engine/Scope.js.map +1 -1
- package/out/foundation/engine/TemplateEngine.d.ts +17 -0
- package/out/foundation/engine/TemplateEngine.d.ts.map +1 -1
- package/out/foundation/engine/TemplateEngine.js +51 -3
- package/out/foundation/engine/TemplateEngine.js.map +1 -1
- package/out/foundation/engine/TemplateInstance.d.ts +167 -47
- package/out/foundation/engine/TemplateInstance.d.ts.map +1 -1
- package/out/foundation/engine/TemplateInstance.js +500 -118
- package/out/foundation/engine/TemplateInstance.js.map +1 -1
- package/out/foundation/engine/TemplateInstance.old.d.ts +219 -0
- package/out/foundation/engine/TemplateInstance.old.d.ts.map +1 -0
- package/out/foundation/engine/TemplateInstance.old.js +487 -0
- package/out/foundation/engine/TemplateInstance.old.js.map +1 -0
- package/out/foundation/engine/rules/attribute/RefRule.d.ts.map +1 -1
- package/out/foundation/engine/rules/attribute/RefRule.js +7 -1
- package/out/foundation/engine/rules/attribute/RefRule.js.map +1 -1
- package/out/index.d.ts +0 -1
- package/out/index.d.ts.map +1 -1
- package/out/index.js +0 -1
- package/out/index.js.map +1 -1
- package/package.json +1 -1
- package/src/foundation/Triplet.ts +6 -6
- package/src/foundation/component_api/Component.ts +2 -1
- package/src/foundation/component_api/UniHtml.ts +12 -22
- package/src/foundation/engine/Rule.ts +2 -0
- package/src/foundation/engine/Scope.ts +13 -3
- package/src/foundation/engine/TemplateEngine.ts +79 -4
- package/src/foundation/engine/TemplateInstance.md +110 -0
- package/src/foundation/engine/TemplateInstance.old.ts +673 -0
- package/src/foundation/engine/TemplateInstance.ts +635 -147
- package/src/foundation/engine/rules/attribute/RefRule.ts +8 -1
- package/src/index.ts +0 -1
|
@@ -2,13 +2,13 @@ import Scope from './Scope.js';
|
|
|
2
2
|
import Observable from '../api/Observer.js';
|
|
3
3
|
import Rule, { RuleMatch, RuleResult } from './Rule.js';
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
5
|
+
* FragmentChangeEvent - событие изменения конкретного фрагмента
|
|
6
6
|
*/
|
|
7
|
-
export interface
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
export interface FragmentChangeEvent {
|
|
8
|
+
fragmentId: string;
|
|
9
|
+
oldNodes: Node[];
|
|
10
|
+
newNodes: Node[];
|
|
11
|
+
affectedObservables: Observable<any>[];
|
|
12
12
|
}
|
|
13
13
|
/**
|
|
14
14
|
* TemplateSection - секция шаблона, связанная с Rule
|
|
@@ -29,93 +29,213 @@ export interface TemplateSection {
|
|
|
29
29
|
observable: Observable<any>;
|
|
30
30
|
unsubscribe: () => void;
|
|
31
31
|
}>;
|
|
32
|
+
/** ID фрагмента, к которому принадлежит секция */
|
|
33
|
+
fragmentId?: string;
|
|
32
34
|
}
|
|
33
35
|
/**
|
|
34
|
-
*
|
|
35
|
-
|
|
36
|
+
* FragmentBinding - привязка фрагмента
|
|
37
|
+
*/
|
|
38
|
+
export interface FragmentBinding {
|
|
39
|
+
/** Уникальный ID фрагмента */
|
|
40
|
+
id: string;
|
|
41
|
+
/** Текущий HTML контент фрагмента (с placeholder-ами для дочерних) */
|
|
42
|
+
html: string;
|
|
43
|
+
/** Исходный шаблон (до обработки) */
|
|
44
|
+
sourceTemplate: string;
|
|
45
|
+
/** Секции, входящие в этот фрагмент */
|
|
46
|
+
sections: TemplateSection[];
|
|
47
|
+
/** Observable, от которых зависит фрагмент */
|
|
48
|
+
observables: Set<Observable<any>>;
|
|
49
|
+
/** ID родительского фрагмента (null для корневого) */
|
|
50
|
+
parentId: string | null;
|
|
51
|
+
/** ID дочерних фрагментов (placeholder-ы) */
|
|
52
|
+
childIds: string[];
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* ContainerBinding - привязка к DOM-контейнеру
|
|
56
|
+
*/
|
|
57
|
+
export interface ContainerBinding {
|
|
58
|
+
/** DOM-контейнер */
|
|
59
|
+
container: Element;
|
|
60
|
+
/** Маркеры фрагментов в этом контейнере: fragmentId -> { start, end, nodes } */
|
|
61
|
+
markers: Map<string, {
|
|
62
|
+
startMarker: Comment;
|
|
63
|
+
endMarker: Comment;
|
|
64
|
+
nodes: Node[];
|
|
65
|
+
}>;
|
|
66
|
+
/** Функции отписки событий для этого контейнера */
|
|
67
|
+
eventUnbinders: Array<() => void>;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* TemplateInstance - динамический шаблон страницы.
|
|
36
71
|
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
72
|
+
* Поддерживает:
|
|
73
|
+
* - Множество мелких фрагментов, каждый обновляется независимо
|
|
74
|
+
* - Множество container bindings
|
|
75
|
+
* - Автоматическое обновление DOM при изменении Observable
|
|
76
|
+
* - bind/unbind для refs и events
|
|
39
77
|
*/
|
|
40
78
|
export default class TemplateInstance {
|
|
41
|
-
private template;
|
|
42
79
|
private scope;
|
|
43
80
|
private sections;
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
81
|
+
/** Все фрагменты шаблона */
|
|
82
|
+
private fragments;
|
|
83
|
+
/** ID корневого фрагмента */
|
|
84
|
+
private rootFragmentId;
|
|
85
|
+
/** Счётчик для генерации ID фрагментов */
|
|
86
|
+
private fragmentIdCounter;
|
|
87
|
+
/** Observers for fragment changes */
|
|
88
|
+
private fragmentChangeObserver;
|
|
47
89
|
/** Группировка секций по Observable */
|
|
48
90
|
private observableTrackings;
|
|
49
|
-
|
|
91
|
+
/** Привязки к контейнерам */
|
|
92
|
+
private containerBindings;
|
|
93
|
+
constructor(scope: Scope);
|
|
50
94
|
/**
|
|
51
|
-
* Получить
|
|
95
|
+
* Получить Scope
|
|
52
96
|
*/
|
|
53
|
-
|
|
97
|
+
getScope(): Scope;
|
|
54
98
|
/**
|
|
55
|
-
*
|
|
99
|
+
* Получить все секции
|
|
56
100
|
*/
|
|
57
|
-
|
|
101
|
+
getSections(): TemplateSection[];
|
|
58
102
|
/**
|
|
59
|
-
* Получить
|
|
103
|
+
* Получить все фрагменты
|
|
60
104
|
*/
|
|
61
|
-
|
|
105
|
+
getAllFragments(): Map<string, FragmentBinding>;
|
|
62
106
|
/**
|
|
63
|
-
*
|
|
107
|
+
* Получить фрагмент по ID
|
|
64
108
|
*/
|
|
65
|
-
|
|
109
|
+
getFragmentBinding(id: string): FragmentBinding | undefined;
|
|
110
|
+
/**
|
|
111
|
+
* Получить финальный HTML (собранный из всех фрагментов)
|
|
112
|
+
*/
|
|
113
|
+
getTemplate(): string;
|
|
114
|
+
/**
|
|
115
|
+
* Создать новый фрагмент и вернуть его ID
|
|
116
|
+
*/
|
|
117
|
+
createFragment(html: string, sourceTemplate: string, sections?: TemplateSection[], parentId?: string | null): string;
|
|
118
|
+
/**
|
|
119
|
+
* Установить корневой фрагмент
|
|
120
|
+
*/
|
|
121
|
+
setRootFragment(id: string): void;
|
|
66
122
|
/**
|
|
67
123
|
* Добавить секцию шаблона
|
|
68
124
|
*/
|
|
69
125
|
addSection(section: TemplateSection): void;
|
|
70
126
|
/**
|
|
71
|
-
*
|
|
127
|
+
* Вставить добавленный фрагмент во все привязанные контейнеры.
|
|
128
|
+
* Вызывается после appendTemplate.
|
|
72
129
|
*/
|
|
73
|
-
|
|
130
|
+
insertAppendedFragment(fragmentId: string): void;
|
|
74
131
|
/**
|
|
75
|
-
*
|
|
76
|
-
|
|
132
|
+
* Привязать события только для нового фрагмента
|
|
133
|
+
*/
|
|
134
|
+
private bindEventsForNewFragment;
|
|
135
|
+
/**
|
|
136
|
+
* Подписаться на изменения фрагментов
|
|
137
|
+
*/
|
|
138
|
+
onFragmentChange(listener: (event: FragmentChangeEvent) => void): () => void;
|
|
139
|
+
/**
|
|
140
|
+
* Подписаться на Observable и автоматически пересоздавать секцию
|
|
77
141
|
*/
|
|
78
142
|
trackObservable(observable: Observable<any>, section: TemplateSection, rebuild: (section: TemplateSection) => RuleResult): () => void;
|
|
79
143
|
/**
|
|
80
|
-
*
|
|
144
|
+
* Привязать к контейнеру.
|
|
145
|
+
* Вставляет DOM, вызывает bindRefs, processInjections и bindEvents.
|
|
81
146
|
*/
|
|
82
|
-
|
|
147
|
+
bind(container: Element): void;
|
|
83
148
|
/**
|
|
84
|
-
*
|
|
149
|
+
* Отвязать от контейнера.
|
|
150
|
+
* Отвязывает refs и events, но оставляет DOM.
|
|
85
151
|
*/
|
|
86
|
-
|
|
152
|
+
unbind(container: Element): void;
|
|
87
153
|
/**
|
|
88
|
-
*
|
|
154
|
+
* Привязать refs к элементам.
|
|
155
|
+
* Если есть контейнеры - привязывает для них.
|
|
156
|
+
* Если нет - создаёт временный DocumentFragment и привязывает refs из него.
|
|
89
157
|
*/
|
|
90
|
-
|
|
158
|
+
bindRefs(): void;
|
|
91
159
|
/**
|
|
92
|
-
*
|
|
160
|
+
* Привязать refs из DocumentFragment (без контейнера)
|
|
93
161
|
*/
|
|
94
|
-
|
|
162
|
+
private bindRefsForFragment;
|
|
95
163
|
/**
|
|
96
|
-
*
|
|
164
|
+
* Отвязать refs (для всех контейнеров)
|
|
97
165
|
*/
|
|
98
|
-
|
|
166
|
+
unbindRefs(): void;
|
|
167
|
+
/**
|
|
168
|
+
* Привязать события (для всех контейнеров)
|
|
169
|
+
*/
|
|
170
|
+
bindEvents(): void;
|
|
99
171
|
/**
|
|
100
|
-
*
|
|
172
|
+
* Отвязать события (для всех контейнеров)
|
|
101
173
|
*/
|
|
102
|
-
|
|
174
|
+
unbindEvents(): void;
|
|
103
175
|
/**
|
|
104
|
-
* Очистить все подписки
|
|
176
|
+
* Очистить все подписки и bindings
|
|
105
177
|
*/
|
|
106
178
|
dispose(): void;
|
|
107
179
|
/**
|
|
108
|
-
*
|
|
180
|
+
* Вставить все фрагменты в контейнер с маркерами
|
|
109
181
|
*/
|
|
110
|
-
|
|
182
|
+
private insertFragmentsIntoContainer;
|
|
111
183
|
/**
|
|
112
|
-
*
|
|
113
|
-
* Должен вызываться после bindRefs
|
|
184
|
+
* Рекурсивно вставить фрагмент и его дочерние
|
|
114
185
|
*/
|
|
115
|
-
|
|
186
|
+
private insertFragmentRecursive;
|
|
116
187
|
/**
|
|
117
|
-
*
|
|
188
|
+
* Создать ноды из HTML строки
|
|
118
189
|
*/
|
|
119
|
-
|
|
190
|
+
private createNodesFromHtml;
|
|
191
|
+
/**
|
|
192
|
+
* Собрать HTML из фрагмента (рекурсивно заменяя placeholder-ы)
|
|
193
|
+
*/
|
|
194
|
+
private buildHtmlFromFragment;
|
|
195
|
+
/**
|
|
196
|
+
* Привязать refs для конкретного контейнера
|
|
197
|
+
*/
|
|
198
|
+
private bindRefsForContainer;
|
|
199
|
+
/**
|
|
200
|
+
* Обработать инжекции для конкретного контейнера.
|
|
201
|
+
* Находит элементы с data-injection-* атрибутами и перемещает их в целевые элементы.
|
|
202
|
+
*/
|
|
203
|
+
private processInjectionsForContainer;
|
|
204
|
+
/**
|
|
205
|
+
* Отвязать refs для конкретного контейнера
|
|
206
|
+
*/
|
|
207
|
+
private unbindRefsForContainer;
|
|
208
|
+
/**
|
|
209
|
+
* Привязать события для конкретного контейнера
|
|
210
|
+
*/
|
|
211
|
+
private bindEventsForContainer;
|
|
212
|
+
/**
|
|
213
|
+
* Привязать события к одному элементу
|
|
214
|
+
*/
|
|
215
|
+
private bindEventsToElement;
|
|
216
|
+
/**
|
|
217
|
+
* Перестроить фрагменты при изменении Observable
|
|
218
|
+
*/
|
|
219
|
+
private rebuildFragmentsForObservable;
|
|
220
|
+
/**
|
|
221
|
+
* Обновить фрагмент во всех контейнерах
|
|
222
|
+
*/
|
|
223
|
+
private updateFragmentInAllContainers;
|
|
224
|
+
/**
|
|
225
|
+
* Отвязать события от нод
|
|
226
|
+
*/
|
|
227
|
+
private unbindEventsFromNodes;
|
|
228
|
+
/**
|
|
229
|
+
* Отписаться от вложенных Observable в секции
|
|
230
|
+
*/
|
|
231
|
+
private unsubscribeSectionNested;
|
|
232
|
+
/**
|
|
233
|
+
* Отписаться от всех Observable в секции
|
|
234
|
+
*/
|
|
235
|
+
private unsubscribeSection;
|
|
236
|
+
/**
|
|
237
|
+
* @deprecated Используйте bind(container)
|
|
238
|
+
*/
|
|
239
|
+
createDOMFragment(): DocumentFragment;
|
|
120
240
|
}
|
|
121
241
|
//# sourceMappingURL=TemplateInstance.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TemplateInstance.d.ts","sourceRoot":"","sources":["../../../src/foundation/engine/TemplateInstance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,UAAgC,MAAM,oBAAoB,CAAC;AAClE,OAAO,IAAI,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"TemplateInstance.d.ts","sourceRoot":"","sources":["../../../src/foundation/engine/TemplateInstance.ts"],"names":[],"mappings":"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"}
|