@reidelsaltres/pureper 0.1.157 → 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 (88) 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/engine/BalancedParser.d.ts +58 -0
  6. package/out/foundation/engine/BalancedParser.d.ts.map +1 -0
  7. package/out/foundation/engine/BalancedParser.js +301 -0
  8. package/out/foundation/engine/BalancedParser.js.map +1 -0
  9. package/out/foundation/engine/EscapeHandler.d.ts +27 -0
  10. package/out/foundation/engine/EscapeHandler.d.ts.map +1 -0
  11. package/out/foundation/engine/EscapeHandler.js +47 -0
  12. package/out/foundation/engine/EscapeHandler.js.map +1 -0
  13. package/out/foundation/engine/Expression.d.ts +83 -0
  14. package/out/foundation/engine/Expression.d.ts.map +1 -0
  15. package/out/foundation/engine/Expression.js +256 -0
  16. package/out/foundation/engine/Expression.js.map +1 -0
  17. package/out/foundation/engine/Rule.d.ts +83 -0
  18. package/out/foundation/engine/Rule.d.ts.map +1 -0
  19. package/out/foundation/engine/Rule.js +69 -0
  20. package/out/foundation/engine/Rule.js.map +1 -0
  21. package/out/foundation/engine/Scope.d.ts +57 -0
  22. package/out/foundation/engine/Scope.d.ts.map +1 -0
  23. package/out/foundation/engine/Scope.js +147 -0
  24. package/out/foundation/engine/Scope.js.map +1 -0
  25. package/out/foundation/engine/TemplateEngine.d.ts +79 -0
  26. package/out/foundation/engine/TemplateEngine.d.ts.map +1 -0
  27. package/out/foundation/engine/TemplateEngine.js +187 -0
  28. package/out/foundation/engine/TemplateEngine.js.map +1 -0
  29. package/out/foundation/engine/TemplateInstance.d.ts +121 -0
  30. package/out/foundation/engine/TemplateInstance.d.ts.map +1 -0
  31. package/out/foundation/engine/TemplateInstance.js +255 -0
  32. package/out/foundation/engine/TemplateInstance.js.map +1 -0
  33. package/out/foundation/engine/exceptions/TemplateExceptions.d.ts +21 -0
  34. package/out/foundation/engine/exceptions/TemplateExceptions.d.ts.map +1 -0
  35. package/out/foundation/engine/exceptions/TemplateExceptions.js +26 -0
  36. package/out/foundation/engine/exceptions/TemplateExceptions.js.map +1 -0
  37. package/out/foundation/engine/index.d.ts +18 -0
  38. package/out/foundation/engine/index.d.ts.map +1 -0
  39. package/out/foundation/engine/index.js +19 -0
  40. package/out/foundation/engine/index.js.map +1 -0
  41. package/out/foundation/engine/rules/attribute/EventRule.d.ts +22 -0
  42. package/out/foundation/engine/rules/attribute/EventRule.d.ts.map +1 -0
  43. package/out/foundation/engine/rules/attribute/EventRule.js +129 -0
  44. package/out/foundation/engine/rules/attribute/EventRule.js.map +1 -0
  45. package/out/foundation/engine/rules/attribute/InjectionRule.d.ts +20 -0
  46. package/out/foundation/engine/rules/attribute/InjectionRule.d.ts.map +1 -0
  47. package/out/foundation/engine/rules/attribute/InjectionRule.js +108 -0
  48. package/out/foundation/engine/rules/attribute/InjectionRule.js.map +1 -0
  49. package/out/foundation/engine/rules/attribute/RefRule.d.ts +23 -0
  50. package/out/foundation/engine/rules/attribute/RefRule.d.ts.map +1 -0
  51. package/out/foundation/engine/rules/attribute/RefRule.js +98 -0
  52. package/out/foundation/engine/rules/attribute/RefRule.js.map +1 -0
  53. package/out/foundation/engine/rules/syntax/ExpressionRule.d.ts +19 -0
  54. package/out/foundation/engine/rules/syntax/ExpressionRule.d.ts.map +1 -0
  55. package/out/foundation/engine/rules/syntax/ExpressionRule.js +82 -0
  56. package/out/foundation/engine/rules/syntax/ExpressionRule.js.map +1 -0
  57. package/out/foundation/engine/rules/syntax/ForRule.d.ts +19 -0
  58. package/out/foundation/engine/rules/syntax/ForRule.d.ts.map +1 -0
  59. package/out/foundation/engine/rules/syntax/ForRule.js +226 -0
  60. package/out/foundation/engine/rules/syntax/ForRule.js.map +1 -0
  61. package/out/foundation/engine/rules/syntax/IfRule.d.ts +17 -0
  62. package/out/foundation/engine/rules/syntax/IfRule.d.ts.map +1 -0
  63. package/out/foundation/engine/rules/syntax/IfRule.js +220 -0
  64. package/out/foundation/engine/rules/syntax/IfRule.js.map +1 -0
  65. package/out/foundation/worker/Router.d.ts.map +1 -1
  66. package/out/foundation/worker/Router.js.map +1 -1
  67. package/out/index.d.ts +3 -0
  68. package/out/index.d.ts.map +1 -1
  69. package/out/index.js +3 -0
  70. package/out/index.js.map +1 -1
  71. package/package.json +1 -1
  72. package/src/foundation/api/Observer.ts +60 -0
  73. package/src/foundation/engine/BalancedParser.ts +353 -0
  74. package/src/foundation/engine/EscapeHandler.ts +54 -0
  75. package/src/foundation/engine/Expression.ts +285 -0
  76. package/src/foundation/engine/Rule.ts +136 -0
  77. package/src/foundation/engine/Scope.ts +166 -0
  78. package/src/foundation/engine/TemplateEngine.ts +243 -0
  79. package/src/foundation/engine/TemplateInstance.ts +355 -0
  80. package/src/foundation/engine/exceptions/TemplateExceptions.ts +27 -0
  81. package/src/foundation/engine/rules/attribute/EventRule.ts +171 -0
  82. package/src/foundation/engine/rules/attribute/InjectionRule.ts +140 -0
  83. package/src/foundation/engine/rules/attribute/RefRule.ts +119 -0
  84. package/src/foundation/engine/rules/syntax/ExpressionRule.ts +102 -0
  85. package/src/foundation/engine/rules/syntax/ForRule.ts +267 -0
  86. package/src/foundation/engine/rules/syntax/IfRule.ts +261 -0
  87. package/src/foundation/worker/Router.ts +1 -1
  88. package/src/index.ts +9 -0
@@ -0,0 +1,147 @@
1
+ /**
2
+ * Scope - класс для работы с контекстом переменных и функций.
3
+ * Поддерживает объединение нескольких Scope, извлечение полей из объектов и классов.
4
+ */
5
+ export default class Scope {
6
+ variables = {};
7
+ debugWarnings;
8
+ constructor(options) {
9
+ this.debugWarnings = options?.debugWarnings ?? true;
10
+ }
11
+ /**
12
+ * Получить все переменные Scope как Record
13
+ */
14
+ getVariables() {
15
+ return { ...this.variables };
16
+ }
17
+ /**
18
+ * Установить переменную в Scope
19
+ */
20
+ set(key, value) {
21
+ if (this.debugWarnings && key in this.variables) {
22
+ console.warn(`[Scope] Warning: Variable "${key}" is being overwritten`);
23
+ }
24
+ this.variables[key] = value;
25
+ }
26
+ /**
27
+ * Получить переменную из Scope
28
+ */
29
+ get(key) {
30
+ return this.variables[key];
31
+ }
32
+ /**
33
+ * Проверить наличие переменной
34
+ */
35
+ has(key) {
36
+ return key in this.variables;
37
+ }
38
+ /**
39
+ * Удалить переменную из Scope
40
+ */
41
+ delete(key) {
42
+ if (key in this.variables) {
43
+ delete this.variables[key];
44
+ return true;
45
+ }
46
+ return false;
47
+ }
48
+ /**
49
+ * Объединить другой Scope или объект в текущий Scope.
50
+ * При конфликте имён выводится предупреждение, последнее значение имеет приоритет.
51
+ */
52
+ merge(source) {
53
+ const sourceVars = source instanceof Scope
54
+ ? source.getVariables()
55
+ : this.extractFromObject(source);
56
+ for (const [key, value] of Object.entries(sourceVars)) {
57
+ if (this.debugWarnings && key in this.variables) {
58
+ console.warn(`[Scope] Warning: Variable "${key}" conflict during merge, using new value`);
59
+ }
60
+ this.variables[key] = value;
61
+ }
62
+ return this;
63
+ }
64
+ /**
65
+ * Создать дочерний (локальный) Scope на основе текущего.
66
+ * Изменения в дочернем Scope не влияют на родительский.
67
+ */
68
+ createChild(localVariables) {
69
+ const child = new Scope({ debugWarnings: this.debugWarnings });
70
+ child.variables = { ...this.variables };
71
+ if (localVariables) {
72
+ for (const [key, value] of Object.entries(localVariables)) {
73
+ child.variables[key] = value;
74
+ }
75
+ }
76
+ return child;
77
+ }
78
+ /**
79
+ * Извлечь поля и методы из объекта или экземпляра класса.
80
+ * Пропускает нативные DOM/браузерные прототипы.
81
+ */
82
+ extractFromObject(obj) {
83
+ const ctx = {};
84
+ if (!obj || typeof obj !== 'object') {
85
+ return ctx;
86
+ }
87
+ // Copy own properties
88
+ for (const key of Object.keys(obj)) {
89
+ ctx[key] = obj[key];
90
+ }
91
+ // Copy prototype methods (for class instances)
92
+ let proto = Object.getPrototypeOf(obj);
93
+ while (proto && proto !== Object.prototype) {
94
+ // Avoid copying host (DOM/native) prototype methods which may throw
95
+ const ctorName = proto?.constructor
96
+ ? String(proto.constructor.name ?? '')
97
+ : '';
98
+ if (/HTMLElement|Element|Node|EventTarget|Window|GlobalThis/i.test(ctorName)) {
99
+ proto = Object.getPrototypeOf(proto);
100
+ continue;
101
+ }
102
+ for (const key of Object.getOwnPropertyNames(proto)) {
103
+ if (key === 'constructor' || key in ctx)
104
+ continue;
105
+ let desc;
106
+ try {
107
+ desc = Object.getOwnPropertyDescriptor(proto, key);
108
+ }
109
+ catch {
110
+ continue;
111
+ }
112
+ if (!desc)
113
+ continue;
114
+ // Only bind plain function values — don't copy getters/setters
115
+ if (typeof desc.value === 'function') {
116
+ try {
117
+ ctx[key] = desc.value.bind(obj);
118
+ }
119
+ catch {
120
+ continue;
121
+ }
122
+ }
123
+ }
124
+ proto = Object.getPrototypeOf(proto);
125
+ }
126
+ return ctx;
127
+ }
128
+ /**
129
+ * Статический метод для создания Scope из объекта
130
+ */
131
+ static from(source, options) {
132
+ const scope = new Scope(options);
133
+ scope.merge(source);
134
+ return scope;
135
+ }
136
+ /**
137
+ * Статический метод для объединения нескольких Scope/объектов
138
+ */
139
+ static combine(...sources) {
140
+ const scope = new Scope();
141
+ for (const source of sources) {
142
+ scope.merge(source);
143
+ }
144
+ return scope;
145
+ }
146
+ }
147
+ //# sourceMappingURL=Scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Scope.js","sourceRoot":"","sources":["../../../src/foundation/engine/Scope.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ import Scope from './Scope.js';
2
+ import Expression from './Expression.js';
3
+ import TemplateInstance, { TemplateSection } from './TemplateInstance.js';
4
+ import Rule, { SyntaxRule, AttributeRule } from './Rule.js';
5
+ import Observable from '../api/Observer.js';
6
+ import ExpressionRule from './rules/syntax/ExpressionRule.js';
7
+ import IfRule from './rules/syntax/IfRule.js';
8
+ import ForRule from './rules/syntax/ForRule.js';
9
+ import RefRule from './rules/attribute/RefRule.js';
10
+ import EventRule from './rules/attribute/EventRule.js';
11
+ import InjectionRule from './rules/attribute/InjectionRule.js';
12
+ /**
13
+ * TemplateEngineOptions - настройки TemplateEngine
14
+ */
15
+ export interface TemplateEngineOptions {
16
+ /** Оставлять синтаксис атрибутивных Rule в финальном HTML */
17
+ showAttributeRule?: boolean;
18
+ /** Включить предупреждения отладки */
19
+ debugWarnings?: boolean;
20
+ }
21
+ /**
22
+ * ProcessResult - результат обработки шаблона
23
+ */
24
+ export interface ProcessResult {
25
+ output: string;
26
+ observables: Observable<any>[];
27
+ sections: TemplateSection[];
28
+ }
29
+ /**
30
+ * TemplateEngine - главный класс шаблонизатора.
31
+ * Обрабатывает HTML-шаблон с Rule и создаёт TemplateInstance.
32
+ */
33
+ export default class TemplateEngine {
34
+ private readonly scope;
35
+ private readonly options;
36
+ private readonly syntaxRules;
37
+ private readonly attributeRules;
38
+ constructor(scope: Scope | object, options?: TemplateEngineOptions);
39
+ /**
40
+ * Зарегистрировать стандартные правила
41
+ */
42
+ private registerDefaultRules;
43
+ /**
44
+ * Добавить пользовательское правило
45
+ */
46
+ addRule(rule: Rule): void;
47
+ /**
48
+ * Получить Scope
49
+ */
50
+ getScope(): Scope;
51
+ /**
52
+ * Обработать шаблон и вернуть TemplateInstance
53
+ */
54
+ parse(template: string): TemplateInstance;
55
+ /**
56
+ * Обработать шаблон (внутренний метод, используется Rule для рекурсии)
57
+ */
58
+ processTemplate(template: string, scope: Scope): ProcessResult;
59
+ /**
60
+ * Обработать одно правило
61
+ */
62
+ private processRule;
63
+ /**
64
+ * Удалить синтаксис атрибутивных Rule из финального HTML
65
+ */
66
+ private removeAttributeSyntax;
67
+ /**
68
+ * Статический метод для быстрой обработки
69
+ */
70
+ static process(template: string, scope: object, options?: TemplateEngineOptions): string;
71
+ /**
72
+ * Создать TemplateInstance из шаблона
73
+ */
74
+ static create(template: string, scope: object, options?: TemplateEngineOptions): TemplateInstance;
75
+ }
76
+ export { Scope, Expression, TemplateInstance, Rule, SyntaxRule, AttributeRule };
77
+ export { ExpressionRule, IfRule, ForRule, RefRule, EventRule, InjectionRule };
78
+ export * from './exceptions/TemplateExceptions.js';
79
+ //# sourceMappingURL=TemplateEngine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TemplateEngine.d.ts","sourceRoot":"","sources":["../../../src/foundation/engine/TemplateEngine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,UAAU,MAAM,iBAAiB,CAAC;AAEzC,OAAO,gBAAgB,EAAE,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,IAAI,EAAE,EAAyB,UAAU,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACnF,OAAO,UAAU,MAAM,oBAAoB,CAAC;AAG5C,OAAO,cAAc,MAAM,kCAAkC,CAAC;AAC9D,OAAO,MAAM,MAAM,0BAA0B,CAAC;AAC9C,OAAO,OAAO,MAAM,2BAA2B,CAAC;AAChD,OAAO,OAAO,MAAM,8BAA8B,CAAC;AACnD,OAAO,SAAS,MAAM,gCAAgC,CAAC;AACvD,OAAO,aAAa,MAAM,oCAAoC,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,qBAAqB;IAClC,6DAA6D;IAC7D,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,sCAAsC;IACtC,aAAa,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;IAC/B,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC/B;AAED;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoB;IAChD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAuB;gBAE1C,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB;IAYlE;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAgB5B;;OAEG;IACI,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAUhC;;OAEG;IACI,QAAQ,IAAI,KAAK;IAIxB;;OAEG;IACI,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB;IAmBhD;;OAEG;IACI,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,aAAa;IAyCrE;;OAEG;IACH,OAAO,CAAC,WAAW;IA8CnB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAQ7B;;OAEG;WACW,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,MAAM;IAM/F;;OAEG;WACW,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,gBAAgB;CAI3G;AAGD,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC;AAChF,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;AAC9E,cAAc,oCAAoC,CAAC"}
@@ -0,0 +1,187 @@
1
+ import Scope from './Scope.js';
2
+ import Expression from './Expression.js';
3
+ import EscapeHandler from './EscapeHandler.js';
4
+ import TemplateInstance from './TemplateInstance.js';
5
+ import Rule, { SyntaxRule, AttributeRule } from './Rule.js';
6
+ // Import rules
7
+ import ExpressionRule from './rules/syntax/ExpressionRule.js';
8
+ import IfRule from './rules/syntax/IfRule.js';
9
+ import ForRule from './rules/syntax/ForRule.js';
10
+ import RefRule from './rules/attribute/RefRule.js';
11
+ import EventRule from './rules/attribute/EventRule.js';
12
+ import InjectionRule from './rules/attribute/InjectionRule.js';
13
+ /**
14
+ * TemplateEngine - главный класс шаблонизатора.
15
+ * Обрабатывает HTML-шаблон с Rule и создаёт TemplateInstance.
16
+ */
17
+ export default class TemplateEngine {
18
+ scope;
19
+ options;
20
+ syntaxRules = [];
21
+ attributeRules = [];
22
+ constructor(scope, options) {
23
+ this.scope = scope instanceof Scope ? scope : Scope.from(scope);
24
+ this.options = {
25
+ showAttributeRule: false,
26
+ debugWarnings: true,
27
+ ...options
28
+ };
29
+ // Register default rules (sorted by priority)
30
+ this.registerDefaultRules();
31
+ }
32
+ /**
33
+ * Зарегистрировать стандартные правила
34
+ */
35
+ registerDefaultRules() {
36
+ // Syntax rules
37
+ this.syntaxRules.push(new ForRule());
38
+ this.syntaxRules.push(new IfRule());
39
+ this.syntaxRules.push(new ExpressionRule());
40
+ // Attribute rules
41
+ this.attributeRules.push(new RefRule());
42
+ this.attributeRules.push(new EventRule());
43
+ this.attributeRules.push(new InjectionRule());
44
+ // Sort by priority
45
+ this.syntaxRules.sort((a, b) => a.priority - b.priority);
46
+ this.attributeRules.sort((a, b) => a.priority - b.priority);
47
+ }
48
+ /**
49
+ * Добавить пользовательское правило
50
+ */
51
+ addRule(rule) {
52
+ if (rule.type === 'syntax') {
53
+ this.syntaxRules.push(rule);
54
+ this.syntaxRules.sort((a, b) => a.priority - b.priority);
55
+ }
56
+ else {
57
+ this.attributeRules.push(rule);
58
+ this.attributeRules.sort((a, b) => a.priority - b.priority);
59
+ }
60
+ }
61
+ /**
62
+ * Получить Scope
63
+ */
64
+ getScope() {
65
+ return this.scope;
66
+ }
67
+ /**
68
+ * Обработать шаблон и вернуть TemplateInstance
69
+ */
70
+ parse(template) {
71
+ const result = this.processTemplate(template, this.scope);
72
+ const templateInstance = new TemplateInstance(result.output, this.scope);
73
+ // Add sections
74
+ for (const section of result.sections) {
75
+ templateInstance.addSection(section);
76
+ // Track observables
77
+ for (const observable of section.result.observables || []) {
78
+ templateInstance.trackObservable(observable, section, (s) => {
79
+ return this.processTemplate(s.sourceTemplate, this.scope);
80
+ });
81
+ }
82
+ }
83
+ return templateInstance;
84
+ }
85
+ /**
86
+ * Обработать шаблон (внутренний метод, используется Rule для рекурсии)
87
+ */
88
+ processTemplate(template, scope) {
89
+ const allObservables = [];
90
+ const allSections = [];
91
+ // Step 1: Handle @@ escape sequences
92
+ let processed = EscapeHandler.process(template, (escaped) => {
93
+ let result = escaped;
94
+ // Step 2: Process syntax rules (in priority order)
95
+ for (const rule of this.syntaxRules) {
96
+ result = this.processRule(rule, result, scope, allObservables, allSections);
97
+ }
98
+ // Step 3: Process attribute rules
99
+ for (const rule of this.attributeRules) {
100
+ // Skip injection - processed last
101
+ if (rule.name === 'injection')
102
+ continue;
103
+ result = this.processRule(rule, result, scope, allObservables, allSections);
104
+ }
105
+ return result;
106
+ });
107
+ // Step 4: Process injection rules last
108
+ const injectionRule = this.attributeRules.find(r => r.name === 'injection');
109
+ if (injectionRule) {
110
+ processed = this.processRule(injectionRule, processed, scope, allObservables, allSections);
111
+ }
112
+ // Step 5: Handle showAttributeRule option
113
+ if (!this.options.showAttributeRule) {
114
+ processed = this.removeAttributeSyntax(processed);
115
+ }
116
+ return {
117
+ output: processed,
118
+ observables: allObservables,
119
+ sections: allSections
120
+ };
121
+ }
122
+ /**
123
+ * Обработать одно правило
124
+ */
125
+ processRule(rule, template, scope, observables, sections) {
126
+ const matches = rule.find(template);
127
+ // Sort matches by position (reverse to process from end)
128
+ matches.sort((a, b) => b.start - a.start);
129
+ let result = template;
130
+ for (const match of matches) {
131
+ try {
132
+ const ruleResult = rule.execute(match, scope, this);
133
+ // Track observables
134
+ if (ruleResult.observables) {
135
+ observables.push(...ruleResult.observables);
136
+ }
137
+ // Create section
138
+ const section = {
139
+ rule,
140
+ match,
141
+ result: ruleResult,
142
+ sourceTemplate: match.fullMatch,
143
+ children: [],
144
+ subscriptions: []
145
+ };
146
+ sections.push(section);
147
+ // Replace in template
148
+ result = result.slice(0, match.start) + ruleResult.output + result.slice(match.end);
149
+ }
150
+ catch (error) {
151
+ console.error(`[TemplateEngine] Error processing rule "${rule.name}":`, error);
152
+ // Continue processing other rules
153
+ }
154
+ }
155
+ return result;
156
+ }
157
+ /**
158
+ * Удалить синтаксис атрибутивных Rule из финального HTML
159
+ */
160
+ removeAttributeSyntax(template) {
161
+ // Remove @[ref], @on[...], @injection[...] patterns that weren't processed
162
+ return template
163
+ .replace(/@\[ref\]\s*=\s*["'][^"']*["']/gi, '')
164
+ .replace(/@on\[[a-zA-Z]+\]\s*=\s*["'][^"']*["']/gi, '')
165
+ .replace(/@injection\[(head|tail)\]\s*=\s*["'][^"']*["']/gi, '');
166
+ }
167
+ /**
168
+ * Статический метод для быстрой обработки
169
+ */
170
+ static process(template, scope, options) {
171
+ const engine = new TemplateEngine(scope, options);
172
+ const TemplateInstance = engine.parse(template);
173
+ return TemplateInstance.getTemplate();
174
+ }
175
+ /**
176
+ * Создать TemplateInstance из шаблона
177
+ */
178
+ static create(template, scope, options) {
179
+ const engine = new TemplateEngine(scope, options);
180
+ return engine.parse(template);
181
+ }
182
+ }
183
+ // Re-export useful types
184
+ export { Scope, Expression, TemplateInstance, Rule, SyntaxRule, AttributeRule };
185
+ export { ExpressionRule, IfRule, ForRule, RefRule, EventRule, InjectionRule };
186
+ export * from './exceptions/TemplateExceptions.js';
187
+ //# sourceMappingURL=TemplateEngine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TemplateEngine.js","sourceRoot":"","sources":["../../../src/foundation/engine/TemplateEngine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,121 @@
1
+ import Scope from './Scope.js';
2
+ import Observable from '../api/Observer.js';
3
+ import Rule, { RuleMatch, RuleResult } from './Rule.js';
4
+ /**
5
+ * TemplateChangeEvent - событие изменения шаблона
6
+ */
7
+ export interface TemplateChangeEvent {
8
+ oldValue: any;
9
+ newValue: any;
10
+ oldTemplate: string;
11
+ newTemplate: string;
12
+ }
13
+ /**
14
+ * TemplateSection - секция шаблона, связанная с Rule
15
+ */
16
+ export interface TemplateSection {
17
+ /** Rule который создал эту секцию */
18
+ rule: Rule;
19
+ /** Оригинальный match */
20
+ match: RuleMatch;
21
+ /** Текущий результат */
22
+ result: RuleResult;
23
+ /** Исходный шаблон секции (для пересоздания) */
24
+ sourceTemplate: string;
25
+ /** Дочерние секции */
26
+ children: TemplateSection[];
27
+ /** Observable подписки для отслеживания */
28
+ subscriptions: Array<{
29
+ observable: Observable<any>;
30
+ unsubscribe: () => void;
31
+ }>;
32
+ }
33
+ /**
34
+ * PageTemplate - динамический шаблон страницы.
35
+ * Хранит обработанные Rule и поддерживает реактивное обновление.
36
+ *
37
+ * При изменении Observable все зависимые секции обновляются
38
+ * одновременно в одном событии onTemplateChange.
39
+ */
40
+ export default class TemplateInstance {
41
+ private template;
42
+ private scope;
43
+ private sections;
44
+ private fragment;
45
+ /** Observers for template changes */
46
+ private changeObserver;
47
+ /** Группировка секций по Observable */
48
+ private observableTrackings;
49
+ constructor(template: string, scope: Scope);
50
+ /**
51
+ * Получить текущий шаблон
52
+ */
53
+ getTemplate(): string;
54
+ /**
55
+ * Установить новый шаблон (вызывает событие изменения)
56
+ */
57
+ setTemplate(newTemplate: string): void;
58
+ /**
59
+ * Получить Scope
60
+ */
61
+ getScope(): Scope;
62
+ /**
63
+ * Подписаться на изменения шаблона
64
+ */
65
+ onTemplateChange(listener: (oldValue: any, newValue: any, oldTemplate: string, newTemplate: string) => void): () => void;
66
+ /**
67
+ * Добавить секцию шаблона
68
+ */
69
+ addSection(section: TemplateSection): void;
70
+ /**
71
+ * Получить все секции
72
+ */
73
+ getSections(): TemplateSection[];
74
+ /**
75
+ * Подписаться на Observable и автоматически пересоздавать секцию.
76
+ * Все секции, зависящие от одного Observable, обновляются разом.
77
+ */
78
+ trackObservable(observable: Observable<any>, section: TemplateSection, rebuild: (section: TemplateSection) => RuleResult): () => void;
79
+ /**
80
+ * Перестроить все секции, зависящие от Observable, за один раз
81
+ */
82
+ private rebuildAllSectionsForObservable;
83
+ /**
84
+ * Отписаться от вложенных Observable в секции (но не от главного)
85
+ */
86
+ private unsubscribeSectionNested;
87
+ /**
88
+ * Отписаться от всех Observable в секции
89
+ */
90
+ private unsubscribeSection;
91
+ /**
92
+ * Создать DocumentFragment из текущего шаблона
93
+ */
94
+ createFragment(): DocumentFragment;
95
+ /**
96
+ * Получить кэшированный DocumentFragment
97
+ */
98
+ getFragment(): DocumentFragment | null;
99
+ /**
100
+ * Пересоздать fragment
101
+ */
102
+ rebuildFragment(): DocumentFragment;
103
+ /**
104
+ * Очистить все подписки
105
+ */
106
+ dispose(): void;
107
+ /**
108
+ * Привязать refs после вставки в DOM
109
+ */
110
+ bindRefs(root: Element | DocumentFragment): void;
111
+ /**
112
+ * Обработать инжекции (@injection[head/tail])
113
+ * Должен вызываться после bindRefs
114
+ */
115
+ processInjections(root: Element | DocumentFragment): void;
116
+ /**
117
+ * Отвязать refs (установить null)
118
+ */
119
+ unbindRefs(): void;
120
+ }
121
+ //# sourceMappingURL=TemplateInstance.d.ts.map
@@ -0,0 +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;AAExD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC,QAAQ,EAAE,GAAG,CAAC;IACd,QAAQ,EAAE,GAAG,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC5B,qCAAqC;IACrC,IAAI,EAAE,IAAI,CAAC;IACX,yBAAyB;IACzB,KAAK,EAAE,SAAS,CAAC;IACjB,wBAAwB;IACxB,MAAM,EAAE,UAAU,CAAC;IACnB,gDAAgD;IAChD,cAAc,EAAE,MAAM,CAAC;IACvB,sBAAsB;IACtB,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,2CAA2C;IAC3C,aAAa,EAAE,KAAK,CAAC;QAAE,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC;QAAC,WAAW,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC,CAAC;CAClF;AAcD;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,OAAO,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,QAAQ,CAAiC;IAEjD,qCAAqC;IACrC,OAAO,CAAC,cAAc,CAA+C;IAErE,uCAAuC;IACvC,OAAO,CAAC,mBAAmB,CAAkD;gBAEjE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK;IAK1C;;OAEG;IACI,WAAW,IAAI,MAAM;IAI5B;;OAEG;IACI,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAU7C;;OAEG;IACI,QAAQ,IAAI,KAAK;IAIxB;;OAEG;IACI,gBAAgB,CACnB,QAAQ,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,GAC3F,MAAM,IAAI;IAQb;;OAEG;IACI,UAAU,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAIjD;;OAEG;IACI,WAAW,IAAI,eAAe,EAAE;IAIvC;;;OAGG;IACI,eAAe,CAClB,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,EAC3B,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,UAAU,GAClD,MAAM,IAAI;IAsCb;;OAEG;IACH,OAAO,CAAC,+BAA+B;IA0CvC;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAahC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAY1B;;OAEG;IACI,cAAc,IAAI,gBAAgB;IAYzC;;OAEG;IACI,WAAW,IAAI,gBAAgB,GAAG,IAAI;IAI7C;;OAEG;IACI,eAAe,IAAI,gBAAgB;IAK1C;;OAEG;IACI,OAAO,IAAI,IAAI;IAetB;;OAEG;IACI,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,gBAAgB,GAAG,IAAI;IAWvD;;;OAGG;IACI,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,gBAAgB,GAAG,IAAI;IA+BhE;;OAEG;IACI,UAAU,IAAI,IAAI;CAU5B"}